From e610572456cdcbc9e731663e508006d0485fdbeb Mon Sep 17 00:00:00 2001 From: Ryan Waits Date: Wed, 30 Apr 2025 11:49:39 -0500 Subject: [PATCH 01/21] update api references --- .../ordinals/api/brc20/get-brc20-activity.mdx | 219 +- .../ordinals/api/brc20/get-brc20-balances.mdx | 162 +- .../api/brc20/get-brc20-token-details.mdx | 176 +- .../api/brc20/get-brc20-token-holders.mdx | 173 +- .../ordinals/api/brc20/get-brc20-tokens.mdx | 169 +- .../docs/bitcoin/ordinals/api/brc20/index.mdx | 2 +- .../docs/bitcoin/ordinals/api/info/index.mdx | 2 +- .../docs/bitcoin/ordinals/api/info/status.mdx | 112 +- .../inscriptions/get-inscription-content.mdx | 137 +- .../get-inscription-transfers.mdx | 190 +- .../api/inscriptions/get-inscription.mdx | 189 +- .../api/inscriptions/get-inscriptions.mdx | 373 +-- .../inscriptions/get-transfers-per-block.mdx | 219 +- .../ordinals/api/inscriptions/index.mdx | 2 +- .../api/satoshis/get-satoshi-inscriptions.mdx | 224 +- .../ordinals/api/satoshis/get-satoshi.mdx | 163 +- .../bitcoin/ordinals/api/satoshis/index.mdx | 2 +- .../get-stats-inscription-count.mdx | 165 +- .../bitcoin/ordinals/api/statistics/index.mdx | 2 +- .../bitcoin/runes/api/activities/activity.mdx | 215 +- .../runes/api/activities/for-address.mdx | 221 +- .../runes/api/activities/for-block.mdx | 243 +- .../runes/api/activities/for-transaction.mdx | 246 +- .../bitcoin/runes/api/activities/index.mdx | 2 +- .../bitcoin/runes/api/balances/address.mdx | 182 +- .../runes/api/balances/holder-balance.mdx | 156 +- .../bitcoin/runes/api/balances/holders.mdx | 153 +- .../docs/bitcoin/runes/api/balances/index.mdx | 2 +- .../runes/api/etchings/get-etching.mdx | 330 +-- .../runes/api/etchings/get-etchings.mdx | 327 +-- .../docs/bitcoin/runes/api/etchings/index.mdx | 2 +- content/docs/bitcoin/runes/api/info/index.mdx | 2 +- .../docs/bitcoin/runes/api/info/status.mdx | 108 +- content/docs/stacks/api/accounts/assets.mdx | 287 --- content/docs/stacks/api/accounts/balances.mdx | 292 --- .../api/accounts/inbound-stx-transfers.mdx | 232 -- content/docs/stacks/api/accounts/index.mdx | 6 - .../docs/stacks/api/accounts/latest-nonce.mdx | 183 -- .../api/accounts/principal-ft-balance.mdx | 147 -- .../api/accounts/principal-ft-balances.mdx | 179 -- .../api/accounts/principal-stx-balance.mdx | 199 -- .../docs/stacks/api/accounts/stx-balances.mdx | 250 -- .../accounts/transaction-with-transfers.mdx | 2220 ---------------- .../accounts/transactions-with-transfers.mdx | 2267 ----------------- .../docs/stacks/api/accounts/transactions.mdx | 2180 ---------------- content/docs/stacks/api/authentication.mdx | 20 + .../docs/stacks/api/blocks/average-times.mdx | 126 - .../api/blocks/block-by-burn-block-hash.mdx | 237 -- .../api/blocks/block-by-burn-block-height.mdx | 237 -- .../docs/stacks/api/blocks/block-by-hash.mdx | 237 -- .../stacks/api/blocks/block-by-height.mdx | 238 -- content/docs/stacks/api/blocks/get-block.mdx | 209 -- .../api/blocks/get-blocks-by-burn-block.mdx | 252 -- content/docs/stacks/api/blocks/get-blocks.mdx | 245 -- .../docs/stacks/api/blocks/recent-blocks.mdx | 283 -- .../stacks/api/burn-blocks/get-burn-block.mdx | 150 -- .../api/burn-blocks/get-burn-blocks.mdx | 189 -- .../stacks/api/client/accounts/get-assets.mdx | 234 -- content/docs/stacks/api/client/index.mdx | 35 - content/docs/stacks/api/faucets/stx.mdx | 135 - content/docs/stacks/api/fees/fee-rate.mdx | 123 - content/docs/stacks/api/getting-started.mdx | 20 + content/docs/stacks/api/index.mdx | 106 +- .../circulating-stx-supply-in-plain-text.mdx | 104 - .../legacy-total-and-unlocked-stx-supply.mdx | 150 -- .../stacks/api/info/network-block-time.mdx | 117 - .../api/info/network-given-block-time.mdx | 116 - content/docs/stacks/api/info/status.mdx | 160 -- .../info/total-and-unlocked-stx-supply.mdx | 141 - .../info/total-stx-supply-in-plain-text.mdx | 108 - .../mempool/transaction-fee-priorities.mdx | 155 -- content/docs/stacks/api/meta.json | 30 +- content/docs/stacks/api/microblocks/index.mdx | 6 - content/docs/stacks/api/microblocks/meta.json | 5 - .../stacks/api/names/historical-zonefile.mdx | 197 -- .../docs/stacks/api/names/name-details.mdx | 201 -- .../docs/stacks/api/names/name-subdomains.mdx | 115 - .../docs/stacks/api/names/name-zonefile.mdx | 189 -- content/docs/stacks/api/names/names.mdx | 150 -- .../docs/stacks/api/names/namespace-names.mdx | 193 -- content/docs/stacks/api/names/namespaces.mdx | 110 - .../stacks/api/names/owned-by-address.mdx | 161 -- .../api/non-fungible-tokens/history.mdx | 688 ----- .../api/non-fungible-tokens/holdings.mdx | 711 ------ .../stacks/api/non-fungible-tokens/mints.mdx | 702 ----- .../api/{concepts => }/nonce-handling.mdx | 0 .../stacks/api/{concepts => }/pagination.mdx | 0 .../stacks/api/proof-of-transfer/cycle.mdx | 122 - .../stacks/api/proof-of-transfer/cycles.mdx | 160 -- .../api/proof-of-transfer/signer-in-cycle.mdx | 143 -- .../proof-of-transfer/signers-in-cycle.mdx | 162 -- .../stackers-for-signer-in-cycle.mdx | 153 -- .../api/{concepts => }/requesting-proofs.mdx | 0 .../docs/stacks/api/search/search-by-id.mdx | 999 -------- .../stacks/api/smart-contracts/by-trait.mdx | 157 -- .../stacks/api/smart-contracts/events.mdx | 224 -- .../docs/stacks/api/smart-contracts/info.mdx | 119 - .../stacks/api/smart-contracts/status.mdx | 164 -- .../docs/stacks/api/stacking-pool/members.mdx | 204 -- .../recent-burnchain-reward-recipient.mdx | 185 -- .../recent-burnchain-reward-recipients.mdx | 180 -- .../recent-reward-slot-holder-entries.mdx | 180 -- .../recent-reward-slot-holders.mdx | 175 -- .../total-burnchain-rewards-for-recipient.mdx | 125 - .../api/stacks-blockchain/accounts/assets.mdx | 11 + .../stacks-blockchain/accounts/balances.mdx | 11 + .../accounts/inbound-stx-transfers.mdx | 11 + .../accounts/latest-nonce.mdx | 11 + .../accounts/meta.json | 3 - .../stacks-blockchain/accounts/nft-events.mdx | 11 + .../accounts/stx-balances.mdx | 11 + .../accounts/transaction-with-transfers.mdx | 11 + .../accounts/transactions-with-transfers.mdx | 11 + .../accounts/transactions.mdx | 11 + .../blocks/average-times.mdx | 11 + .../blocks/block-by-burn-block-hash.mdx | 11 + .../blocks/block-by-burn-block-height.mdx | 11 + .../blocks/block-by-hash.mdx | 11 + .../blocks/block-by-height.mdx | 11 + .../stacks-blockchain/blocks/get-block.mdx | 11 + .../blocks/get-blocks-by-burn-block.mdx | 11 + .../stacks-blockchain/blocks/get-blocks.mdx | 11 + .../{ => stacks-blockchain}/blocks/index.mdx | 2 +- .../{ => stacks-blockchain}/blocks/meta.json | 0 .../blocks/recent-blocks.mdx | 11 + .../burn-blocks/get-burn-block.mdx | 11 + .../burn-blocks/get-burn-blocks.mdx | 11 + .../burn-blocks/index.mdx | 2 +- .../burn-blocks/meta.json | 0 .../{ => stacks-blockchain}/faucets/index.mdx | 2 +- .../{ => stacks-blockchain}/faucets/meta.json | 0 .../api/stacks-blockchain/faucets/stx.mdx | 11 + .../api/stacks-blockchain/fees/fee-rate.mdx | 11 + .../{ => stacks-blockchain}/fees/index.mdx | 2 +- .../{ => stacks-blockchain}/fees/meta.json | 0 .../circulating-stx-supply-in-plain-text.mdx | 11 + .../{ => stacks-blockchain}/info/index.mdx | 2 +- .../legacy-total-and-unlocked-stx-supply.mdx | 11 + .../{ => stacks-blockchain}/info/meta.json | 0 .../info/network-block-time.mdx | 11 + .../info/network-given-block-time.mdx | 11 + .../api/stacks-blockchain/info/status.mdx | 11 + .../info/total-and-unlocked-stx-supply.mdx | 11 + .../info/total-stx-supply-in-plain-text.mdx | 11 + .../{ => stacks-blockchain}/mempool/index.mdx | 2 +- .../{ => stacks-blockchain}/mempool/meta.json | 0 .../mempool/transaction-fee-priorities.mdx | 11 + .../names/historical-zonefile.mdx | 11 + .../{ => stacks-blockchain}/names/index.mdx | 2 +- .../{ => stacks-blockchain}/names/meta.json | 0 .../stacks-blockchain/names/name-details.mdx | 11 + .../names/name-subdomains.mdx | 11 + .../stacks-blockchain/names/name-zonefile.mdx | 11 + .../api/stacks-blockchain/names/names.mdx | 11 + .../names/namespace-names.mdx | 11 + .../stacks-blockchain/names/namespaces.mdx | 11 + .../names/owned-by-address.mdx | 11 + .../non-fungible-tokens/history.mdx | 11 + .../non-fungible-tokens/holdings.mdx | 11 + .../non-fungible-tokens/index.mdx | 2 +- .../non-fungible-tokens/meta.json | 0 .../non-fungible-tokens/mints.mdx | 11 + .../proof-of-transfer/cycle.mdx | 11 + .../proof-of-transfer/cycles.mdx | 11 + .../proof-of-transfer/index.mdx | 2 +- .../proof-of-transfer/meta.json | 0 .../proof-of-transfer/signer-in-cycle.mdx | 11 + .../proof-of-transfer/signers-in-cycle.mdx | 11 + .../stackers-for-signer-in-cycle.mdx | 11 + .../{ => stacks-blockchain}/search/index.mdx | 2 +- .../{ => stacks-blockchain}/search/meta.json | 0 .../stacks-blockchain/search/search-by-id.mdx | 11 + .../smart-contracts/by-trait.mdx | 11 + .../smart-contracts/events.mdx | 11 + .../smart-contracts/index.mdx | 2 +- .../smart-contracts/info.mdx | 11 + .../smart-contracts/meta.json | 0 .../smart-contracts/status.mdx | 11 + .../stacking-pool/index.mdx | 2 +- .../stacking-pool/members.mdx | 11 + .../stacking-pool/meta.json | 0 .../stacking-rewards/index.mdx | 2 +- .../stacking-rewards/meta.json | 0 .../recent-burnchain-reward-recipient.mdx | 11 + .../recent-burnchain-reward-recipients.mdx | 11 + .../recent-reward-slot-holder-entries.mdx | 11 + .../recent-reward-slot-holders.mdx | 11 + .../total-burnchain-rewards-for-recipient.mdx | 11 + .../api/stacks-blockchain/tokens/holders.mdx | 11 + .../{ => stacks-blockchain}/tokens/index.mdx | 2 +- .../{ => stacks-blockchain}/tokens/meta.json | 0 .../transactions/address-transactions.mdx | 11 + .../transactions/details-for-transactions.mdx | 11 + .../dropped-mempool-transactions.mdx | 11 + .../events-for-an-address-transaction.mdx | 11 + .../transactions/get-raw-transaction.mdx | 11 + .../transactions/get-transaction.mdx | 11 + .../transactions/index.mdx | 2 +- .../transactions/mempool-transactions.mdx | 11 + .../transactions/meta.json | 0 .../transactions/recent-transactions.mdx | 11 + .../statistics-for-mempool-transactions.mdx | 12 + .../transactions/transaction-events.mdx | 11 + .../transactions/transactions-by-block.mdx | 11 + .../transactions/transactions-for-address.mdx | 11 + .../stacks/api/token-metadata/info/index.mdx | 6 + .../stacks/api/token-metadata/info/meta.json | 7 + .../stacks/api/token-metadata/info/status.mdx | 11 + .../tokens/fungible-token-metadata.mdx | 11 + .../token-metadata/tokens/fungible-tokens.mdx | 11 + .../api/token-metadata/tokens/index.mdx | 7 + .../api/token-metadata/tokens/meta.json | 10 + .../tokens/non-fungible-token-metadata.mdx | 11 + .../tokens/semi-fungible-token-metadata.mdx | 11 + content/docs/stacks/api/tokens/holders.mdx | 145 -- .../api/transactions/address-transactions.mdx | 740 ------ .../transactions/details-for-transactions.mdx | 722 ------ .../dropped-mempool-transactions.mdx | 475 ---- .../events-for-an-address-transaction.mdx | 233 -- .../api/transactions/get-raw-transaction.mdx | 113 - .../api/transactions/get-transaction.mdx | 656 ----- .../api/transactions/mempool-transactions.mdx | 524 ---- .../api/transactions/recent-transactions.mdx | 788 ------ .../statistics-for-mempool-transactions.mdx | 289 --- .../api/transactions/transaction-events.mdx | 245 -- .../transactions/transactions-by-block.mdx | 676 ----- .../transactions/transactions-for-address.mdx | 486 ---- content/docs/stacks/api/txs.mdx | 596 ----- content/docs/stacks/api/usage.mdx | 54 - .../stacks/platform-api/chainhooks/create.mdx | 155 +- .../stacks/platform-api/chainhooks/delete.mdx | 124 +- .../stacks/platform-api/chainhooks/get.mdx | 154 +- .../stacks/platform-api/chainhooks/index.mdx | 2 +- .../stacks/platform-api/chainhooks/list.mdx | 106 +- .../stacks/platform-api/chainhooks/status.mdx | 173 +- .../stacks/platform-api/chainhooks/update.mdx | 197 +- .../platform-api/devnet/bitcoin-node.mdx | 218 +- .../docs/stacks/platform-api/devnet/index.mdx | 2 +- .../devnet/stacks-blockchain-api.mdx | 218 +- .../docs/stacks/platform-api/devnet/start.mdx | 136 +- .../docs/stacks/platform-api/devnet/stop.mdx | 108 +- .../docs/stacks/rpc-api/accounts/index.mdx | 2 +- content/docs/stacks/rpc-api/accounts/info.mdx | 146 +- .../stacks/rpc-api/blocks/block-proposal.mdx | 155 +- content/docs/stacks/rpc-api/blocks/index.mdx | 2 +- .../rpc-api/burn-ops/get-burn-operations.mdx | 86 +- .../docs/stacks/rpc-api/burn-ops/index.mdx | 2 +- content/docs/stacks/rpc-api/fees/estimate.mdx | 214 +- content/docs/stacks/rpc-api/fees/index.mdx | 2 +- .../stacks/rpc-api/fees/transfer-estimate.mdx | 105 +- content/docs/stacks/rpc-api/info/core-api.mdx | 172 +- content/docs/stacks/rpc-api/info/index.mdx | 2 +- content/docs/stacks/rpc-api/names/index.mdx | 2 +- .../docs/stacks/rpc-api/names/name-price.mdx | 120 +- .../stacks/rpc-api/names/namespace-price.mdx | 120 +- content/docs/stacks/rpc-api/pox/index.mdx | 2 +- .../docs/stacks/rpc-api/pox/pox-details.mdx | 283 +- .../docs/stacks/rpc-api/pox/stacker-set.mdx | 84 +- .../rpc-api/smart-contracts/constants.mdx | 143 +- .../stacks/rpc-api/smart-contracts/index.mdx | 2 +- .../rpc-api/smart-contracts/interface.mdx | 142 +- .../rpc-api/smart-contracts/map-entry.mdx | 166 +- .../rpc-api/smart-contracts/read-only.mdx | 167 +- .../stacks/rpc-api/smart-contracts/source.mdx | 113 +- .../stacks/rpc-api/smart-contracts/traits.mdx | 109 +- .../rpc-api/smart-contracts/variables.mdx | 145 -- .../transactions/broadcast-transaction.mdx | 161 +- .../stacks/rpc-api/transactions/index.mdx | 2 +- content/docs/stacks/rpc-api/v3/index.mdx | 2 +- .../docs/stacks/rpc-api/v3/nakamoto-block.mdx | 109 +- .../docs/stacks/rpc-api/v3/tenure-blocks.mdx | 100 +- .../stacks/rpc-api/v3/tenure-metadata.mdx | 72 +- .../block-proposals/index.mdx | 2 +- .../signer-information-for-a-block.mdx | 255 +- ...mation-for-most-recent-block-proposals.mdx | 255 +- ...regated-signer-information-for-a-block.mdx | 183 +- ...ner-information-for-most-recent-blocks.mdx | 207 +- .../signer-metrics-api/blocks/index.mdx | 2 +- .../stacks/signer-metrics-api/info/index.mdx | 2 +- .../stacks/signer-metrics-api/info/status.mdx | 98 +- .../signer-metrics-api/prometheus/index.mdx | 2 +- .../signer-metrics-api/prometheus/metrics.mdx | 86 +- .../signer-metrics-api/signers/index.mdx | 2 +- .../signers/pox-cycle-signer.mdx | 196 +- .../signers/pox-cycle-signers.mdx | 200 +- .../token-metadata-api/client/index.mdx | 2 +- .../client/tokens/get-ft-metadata.mdx | 6 +- .../client/tokens/index.mdx | 2 +- .../stacks/token-metadata-api/info/index.mdx | 2 +- .../stacks/token-metadata-api/info/status.mdx | 141 +- .../tokens/fungible-token-metadata.mdx | 282 +- .../tokens/fungible-tokens.mdx | 189 +- .../token-metadata-api/tokens/index.mdx | 2 +- .../tokens/non-fungible-token-metadata.mdx | 268 +- .../tokens/semi-fungible-token-metadata.mdx | 272 +- 295 files changed, 1428 insertions(+), 37733 deletions(-) delete mode 100644 content/docs/stacks/api/accounts/assets.mdx delete mode 100644 content/docs/stacks/api/accounts/balances.mdx delete mode 100644 content/docs/stacks/api/accounts/inbound-stx-transfers.mdx delete mode 100644 content/docs/stacks/api/accounts/index.mdx delete mode 100644 content/docs/stacks/api/accounts/latest-nonce.mdx delete mode 100644 content/docs/stacks/api/accounts/principal-ft-balance.mdx delete mode 100644 content/docs/stacks/api/accounts/principal-ft-balances.mdx delete mode 100644 content/docs/stacks/api/accounts/principal-stx-balance.mdx delete mode 100644 content/docs/stacks/api/accounts/stx-balances.mdx delete mode 100644 content/docs/stacks/api/accounts/transaction-with-transfers.mdx delete mode 100644 content/docs/stacks/api/accounts/transactions-with-transfers.mdx delete mode 100644 content/docs/stacks/api/accounts/transactions.mdx create mode 100644 content/docs/stacks/api/authentication.mdx delete mode 100644 content/docs/stacks/api/blocks/average-times.mdx delete mode 100644 content/docs/stacks/api/blocks/block-by-burn-block-hash.mdx delete mode 100644 content/docs/stacks/api/blocks/block-by-burn-block-height.mdx delete mode 100644 content/docs/stacks/api/blocks/block-by-hash.mdx delete mode 100644 content/docs/stacks/api/blocks/block-by-height.mdx delete mode 100644 content/docs/stacks/api/blocks/get-block.mdx delete mode 100644 content/docs/stacks/api/blocks/get-blocks-by-burn-block.mdx delete mode 100644 content/docs/stacks/api/blocks/get-blocks.mdx delete mode 100644 content/docs/stacks/api/blocks/recent-blocks.mdx delete mode 100644 content/docs/stacks/api/burn-blocks/get-burn-block.mdx delete mode 100644 content/docs/stacks/api/burn-blocks/get-burn-blocks.mdx delete mode 100644 content/docs/stacks/api/client/accounts/get-assets.mdx delete mode 100644 content/docs/stacks/api/client/index.mdx delete mode 100644 content/docs/stacks/api/faucets/stx.mdx delete mode 100644 content/docs/stacks/api/fees/fee-rate.mdx create mode 100644 content/docs/stacks/api/getting-started.mdx delete mode 100644 content/docs/stacks/api/info/circulating-stx-supply-in-plain-text.mdx delete mode 100644 content/docs/stacks/api/info/legacy-total-and-unlocked-stx-supply.mdx delete mode 100644 content/docs/stacks/api/info/network-block-time.mdx delete mode 100644 content/docs/stacks/api/info/network-given-block-time.mdx delete mode 100644 content/docs/stacks/api/info/status.mdx delete mode 100644 content/docs/stacks/api/info/total-and-unlocked-stx-supply.mdx delete mode 100644 content/docs/stacks/api/info/total-stx-supply-in-plain-text.mdx delete mode 100644 content/docs/stacks/api/mempool/transaction-fee-priorities.mdx delete mode 100644 content/docs/stacks/api/microblocks/index.mdx delete mode 100644 content/docs/stacks/api/microblocks/meta.json delete mode 100644 content/docs/stacks/api/names/historical-zonefile.mdx delete mode 100644 content/docs/stacks/api/names/name-details.mdx delete mode 100644 content/docs/stacks/api/names/name-subdomains.mdx delete mode 100644 content/docs/stacks/api/names/name-zonefile.mdx delete mode 100644 content/docs/stacks/api/names/names.mdx delete mode 100644 content/docs/stacks/api/names/namespace-names.mdx delete mode 100644 content/docs/stacks/api/names/namespaces.mdx delete mode 100644 content/docs/stacks/api/names/owned-by-address.mdx delete mode 100644 content/docs/stacks/api/non-fungible-tokens/history.mdx delete mode 100644 content/docs/stacks/api/non-fungible-tokens/holdings.mdx delete mode 100644 content/docs/stacks/api/non-fungible-tokens/mints.mdx rename content/docs/stacks/api/{concepts => }/nonce-handling.mdx (100%) rename content/docs/stacks/api/{concepts => }/pagination.mdx (100%) delete mode 100644 content/docs/stacks/api/proof-of-transfer/cycle.mdx delete mode 100644 content/docs/stacks/api/proof-of-transfer/cycles.mdx delete mode 100644 content/docs/stacks/api/proof-of-transfer/signer-in-cycle.mdx delete mode 100644 content/docs/stacks/api/proof-of-transfer/signers-in-cycle.mdx delete mode 100644 content/docs/stacks/api/proof-of-transfer/stackers-for-signer-in-cycle.mdx rename content/docs/stacks/api/{concepts => }/requesting-proofs.mdx (100%) delete mode 100644 content/docs/stacks/api/search/search-by-id.mdx delete mode 100644 content/docs/stacks/api/smart-contracts/by-trait.mdx delete mode 100644 content/docs/stacks/api/smart-contracts/events.mdx delete mode 100644 content/docs/stacks/api/smart-contracts/info.mdx delete mode 100644 content/docs/stacks/api/smart-contracts/status.mdx delete mode 100644 content/docs/stacks/api/stacking-pool/members.mdx delete mode 100644 content/docs/stacks/api/stacking-rewards/recent-burnchain-reward-recipient.mdx delete mode 100644 content/docs/stacks/api/stacking-rewards/recent-burnchain-reward-recipients.mdx delete mode 100644 content/docs/stacks/api/stacking-rewards/recent-reward-slot-holder-entries.mdx delete mode 100644 content/docs/stacks/api/stacking-rewards/recent-reward-slot-holders.mdx delete mode 100644 content/docs/stacks/api/stacking-rewards/total-burnchain-rewards-for-recipient.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/accounts/assets.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/accounts/balances.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/accounts/inbound-stx-transfers.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/accounts/latest-nonce.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/accounts/meta.json (76%) create mode 100644 content/docs/stacks/api/stacks-blockchain/accounts/nft-events.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/accounts/stx-balances.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/accounts/transaction-with-transfers.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/accounts/transactions-with-transfers.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/accounts/transactions.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/blocks/average-times.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-height.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/blocks/block-by-hash.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/blocks/block-by-height.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/blocks/get-block.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/blocks/get-blocks.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/blocks/index.mdx (91%) rename content/docs/stacks/api/{ => stacks-blockchain}/blocks/meta.json (100%) create mode 100644 content/docs/stacks/api/stacks-blockchain/blocks/recent-blocks.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-block.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/burn-blocks/index.mdx (90%) rename content/docs/stacks/api/{ => stacks-blockchain}/burn-blocks/meta.json (100%) rename content/docs/stacks/api/{ => stacks-blockchain}/faucets/index.mdx (89%) rename content/docs/stacks/api/{ => stacks-blockchain}/faucets/meta.json (100%) create mode 100644 content/docs/stacks/api/stacks-blockchain/faucets/stx.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/fees/fee-rate.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/fees/index.mdx (91%) rename content/docs/stacks/api/{ => stacks-blockchain}/fees/meta.json (100%) create mode 100644 content/docs/stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/info/index.mdx (90%) create mode 100644 content/docs/stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/info/meta.json (100%) create mode 100644 content/docs/stacks/api/stacks-blockchain/info/network-block-time.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/info/network-given-block-time.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/info/status.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/mempool/index.mdx (91%) rename content/docs/stacks/api/{ => stacks-blockchain}/mempool/meta.json (100%) create mode 100644 content/docs/stacks/api/stacks-blockchain/mempool/transaction-fee-priorities.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/names/historical-zonefile.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/names/index.mdx (92%) rename content/docs/stacks/api/{ => stacks-blockchain}/names/meta.json (100%) create mode 100644 content/docs/stacks/api/stacks-blockchain/names/name-details.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/names/name-subdomains.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/names/name-zonefile.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/names/names.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/names/namespace-names.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/names/namespaces.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/names/owned-by-address.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/history.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/holdings.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/non-fungible-tokens/index.mdx (91%) rename content/docs/stacks/api/{ => stacks-blockchain}/non-fungible-tokens/meta.json (100%) create mode 100644 content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/mints.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycle.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycles.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/proof-of-transfer/index.mdx (91%) rename content/docs/stacks/api/{ => stacks-blockchain}/proof-of-transfer/meta.json (100%) create mode 100644 content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/search/index.mdx (87%) rename content/docs/stacks/api/{ => stacks-blockchain}/search/meta.json (100%) create mode 100644 content/docs/stacks/api/stacks-blockchain/search/search-by-id.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/smart-contracts/by-trait.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/smart-contracts/events.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/smart-contracts/index.mdx (91%) create mode 100644 content/docs/stacks/api/stacks-blockchain/smart-contracts/info.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/smart-contracts/meta.json (100%) create mode 100644 content/docs/stacks/api/stacks-blockchain/smart-contracts/status.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/stacking-pool/index.mdx (92%) create mode 100644 content/docs/stacks/api/stacks-blockchain/stacking-pool/members.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/stacking-pool/meta.json (100%) rename content/docs/stacks/api/{ => stacks-blockchain}/stacking-rewards/index.mdx (92%) rename content/docs/stacks/api/{ => stacks-blockchain}/stacking-rewards/meta.json (100%) create mode 100644 content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/tokens/holders.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/tokens/index.mdx (89%) rename content/docs/stacks/api/{ => stacks-blockchain}/tokens/meta.json (100%) create mode 100644 content/docs/stacks/api/stacks-blockchain/transactions/address-transactions.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/transactions/details-for-transactions.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/transactions/get-raw-transaction.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/transactions/get-transaction.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/transactions/index.mdx (91%) create mode 100644 content/docs/stacks/api/stacks-blockchain/transactions/mempool-transactions.mdx rename content/docs/stacks/api/{ => stacks-blockchain}/transactions/meta.json (100%) create mode 100644 content/docs/stacks/api/stacks-blockchain/transactions/recent-transactions.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/transactions/transaction-events.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/transactions/transactions-by-block.mdx create mode 100644 content/docs/stacks/api/stacks-blockchain/transactions/transactions-for-address.mdx create mode 100644 content/docs/stacks/api/token-metadata/info/index.mdx create mode 100644 content/docs/stacks/api/token-metadata/info/meta.json create mode 100644 content/docs/stacks/api/token-metadata/info/status.mdx create mode 100644 content/docs/stacks/api/token-metadata/tokens/fungible-token-metadata.mdx create mode 100644 content/docs/stacks/api/token-metadata/tokens/fungible-tokens.mdx create mode 100644 content/docs/stacks/api/token-metadata/tokens/index.mdx create mode 100644 content/docs/stacks/api/token-metadata/tokens/meta.json create mode 100644 content/docs/stacks/api/token-metadata/tokens/non-fungible-token-metadata.mdx create mode 100644 content/docs/stacks/api/token-metadata/tokens/semi-fungible-token-metadata.mdx delete mode 100644 content/docs/stacks/api/tokens/holders.mdx delete mode 100644 content/docs/stacks/api/transactions/address-transactions.mdx delete mode 100644 content/docs/stacks/api/transactions/details-for-transactions.mdx delete mode 100644 content/docs/stacks/api/transactions/dropped-mempool-transactions.mdx delete mode 100644 content/docs/stacks/api/transactions/events-for-an-address-transaction.mdx delete mode 100644 content/docs/stacks/api/transactions/get-raw-transaction.mdx delete mode 100644 content/docs/stacks/api/transactions/get-transaction.mdx delete mode 100644 content/docs/stacks/api/transactions/mempool-transactions.mdx delete mode 100644 content/docs/stacks/api/transactions/recent-transactions.mdx delete mode 100644 content/docs/stacks/api/transactions/statistics-for-mempool-transactions.mdx delete mode 100644 content/docs/stacks/api/transactions/transaction-events.mdx delete mode 100644 content/docs/stacks/api/transactions/transactions-by-block.mdx delete mode 100644 content/docs/stacks/api/transactions/transactions-for-address.mdx delete mode 100644 content/docs/stacks/api/txs.mdx delete mode 100644 content/docs/stacks/api/usage.mdx delete mode 100644 content/docs/stacks/rpc-api/smart-contracts/variables.mdx diff --git a/content/docs/bitcoin/ordinals/api/brc20/get-brc20-activity.mdx b/content/docs/bitcoin/ordinals/api/brc20/get-brc20-activity.mdx index 835be2513..f4bbba54b 100644 --- a/content/docs/bitcoin/ordinals/api/brc20/get-brc20-activity.mdx +++ b/content/docs/bitcoin/ordinals/api/brc20/get-brc20-activity.mdx @@ -1,218 +1,11 @@ --- title: Get BRC-20 activity description: Retrieves BRC-20 activity filtered by ticker, address, operation, or block height. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - ObjectCollapsible, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## BRC-20 Activity - -Retrieves BRC-20 activity filtered by ticker, address, operation, or at a specific block height - -### Query Parameters - -"} required={false} deprecated={false}> - - - - - -Bitcoin block height - -Pattern: `"^[0-9]+$"` - - - -"} required={false} deprecated={false}> - - - - - -BRC-20 token operation. Note that a BRC-20 transfer is a two step process `transfer` (creating the inscription, which makes funds transferrable) and `transfer_send` (sending the inscription to a recipient, which moves the funds) - - - - - - - - - -Bitcoin address - - - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/ordinals/v1/brc-20/activity?ticker=%5B%0A++%22string%22%0A%5D&block_height=string&operation=%5B%0A++%22deploy%22%0A%5D&address=string&offset=0&limit=1" -``` - - - - - -```js -fetch("https://api.hiro.so/ordinals/v1/brc-20/activity?ticker=%5B%0A++%22string%22%0A%5D&block_height=string&operation=%5B%0A++%22deploy%22%0A%5D&address=string&offset=0&limit=1", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "operation": "deploy", - "ticker": "PEPE", - "inscription_id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218i0", - "block_height": 778921, - "block_hash": "0000000000000000000452773967cdd62297137cdaf79950c5e8bb0c62075133", - "tx_id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218", - "location": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218:0:0", - "address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8", - "timestamp": 1677733170000, - "mint": { - "amount": "1000000" - }, - "deploy": { - "max_supply": "21000000", - "mint_limit": "100000", - "decimals": 18 - }, - "transfer": { - "amount": "1000000", - "from_address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8" - }, - "transfer_send": { - "amount": "1000000", - "from_address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8", - "to_address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8" - } - } - ] -} -``` - - - - - -```ts -export interface PaginatedBRC20ActivityResponse { - limit: number; - offset: number; - total: number; - results: { - operation: "deploy" | "mint" | "transfer" | "transfer_send"; - ticker: string; - inscription_id: string; - block_height: number; - block_hash: string; - tx_id: string; - location: string; - address: string; - timestamp: number; - mint?: { - amount: string | null; - }; - deploy?: { - max_supply: string; - mint_limit: string | null; - decimals: number; - }; - transfer?: { - amount: string; - from_address: string; - }; - transfer_send?: { - amount: string; - from_address: string; - to_address: string; - }; - }[]; -} -``` - - - - - - - - - - - - - - + diff --git a/content/docs/bitcoin/ordinals/api/brc20/get-brc20-balances.mdx b/content/docs/bitcoin/ordinals/api/brc20/get-brc20-balances.mdx index d4fe92a75..019363e4a 100644 --- a/content/docs/bitcoin/ordinals/api/brc20/get-brc20-balances.mdx +++ b/content/docs/bitcoin/ordinals/api/brc20/get-brc20-balances.mdx @@ -1,161 +1,11 @@ --- title: Get BRC-20 balances description: Retrieves BRC-20 token balances for a Bitcoin address. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## BRC-20 Balances - -Retrieves BRC-20 token balances for a Bitcoin address - -### Query Parameters - -"} required={false} deprecated={false}> - - - - - -Bitcoin block height - -Pattern: `"^[0-9]+$"` - - - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - -### Path Parameters - - - -Bitcoin address - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/ordinals/v1/brc-20/balances/string?ticker=%5B%0A++%22string%22%0A%5D&block_height=string&offset=0&limit=1" -``` - - - - - -```js -fetch("https://api.hiro.so/ordinals/v1/brc-20/balances/string?ticker=%5B%0A++%22string%22%0A%5D&block_height=string&offset=0&limit=1", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "ticker": "PEPE", - "available_balance": "1500.00000", - "transferrable_balance": "500.00000", - "overall_balance": "2000.00000" - } - ] -} -``` - - - - - -```ts -export interface PaginatedBRC20BalanceResponse { - limit: number; - offset: number; - total: number; - results: { - ticker: string; - available_balance: string; - transferrable_balance: string; - overall_balance: string; - }[]; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-details.mdx b/content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-details.mdx index 6da99a263..6425598bf 100644 --- a/content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-details.mdx +++ b/content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-details.mdx @@ -1,175 +1,11 @@ --- title: Get BRC-20 token details description: Retrieves information for a BRC-20 token, including supply and holders. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## BRC-20 Token Details - -Retrieves information for a BRC-20 token including supply and holders - -### Path Parameters - - - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | -| `404` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/ordinals/v1/brc-20/tokens/string" -``` - - - - - -```js -fetch("https://api.hiro.so/ordinals/v1/brc-20/tokens/string", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "token": { - "id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218i0", - "number": 248751, - "block_height": 752860, - "tx_id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218", - "address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8", - "ticker": "PEPE", - "max_supply": "21000000", - "mint_limit": "100000", - "decimals": 18, - "deploy_timestamp": 1677733170000, - "minted_supply": "1000000", - "tx_count": 300000 - }, - "supply": { - "max_supply": "21000000", - "minted_supply": "1000000", - "holders": 240 - } -} -``` - - - - - -```ts -export interface BRC20TokenDetailsResponse { - token: BRC20TokenResponse; - supply: { - max_supply: string; - minted_supply: string; - holders: number; - }; -} -export interface BRC20TokenResponse { - id: string; - number: number; - block_height: number; - tx_id: string; - address: string; - ticker: string; - max_supply: string; - mint_limit: string | null; - decimals: number; - deploy_timestamp: number; - minted_supply: string; - tx_count: number; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Not found" -} -``` - - - - - -```ts -export interface NotFoundResponse { - error: "Not found"; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-holders.mdx b/content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-holders.mdx index 103ea1057..b0048cacc 100644 --- a/content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-holders.mdx +++ b/content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-holders.mdx @@ -1,172 +1,11 @@ --- title: Get BRC-20 token holders description: Retrieves a list of holders and their balances for a particular BRC-20 token. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## BRC-20 Token Holders - -Retrieves a list of holders and their balances for a BRC-20 token - -### Query Parameters - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - -### Path Parameters - - - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | -| `404` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/ordinals/v1/brc-20/tokens/string/holders?offset=0&limit=1" -``` - - - - - -```js -fetch("https://api.hiro.so/ordinals/v1/brc-20/tokens/string/holders?offset=0&limit=1", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8", - "overall_balance": "2000.00000" - } - ] -} -``` - - - - - -```ts -export interface PaginatedBRC20HoldersResponse { - limit: number; - offset: number; - total: number; - results: { - address: string; - overall_balance: string; - }[]; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Not found" -} -``` - - - - - -```ts -export interface NotFoundResponse { - error: "Not found"; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/ordinals/api/brc20/get-brc20-tokens.mdx b/content/docs/bitcoin/ordinals/api/brc20/get-brc20-tokens.mdx index 1be281dbe..edd29f3d9 100644 --- a/content/docs/bitcoin/ordinals/api/brc20/get-brc20-tokens.mdx +++ b/content/docs/bitcoin/ordinals/api/brc20/get-brc20-tokens.mdx @@ -1,168 +1,11 @@ --- title: Get BRC-20 tokens description: Retrieves information for BRC-20 tokens. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## BRC-20 Tokens - -Retrieves information for BRC-20 tokens - -### Query Parameters - -"} required={false} deprecated={false}> - - - - - -Parameter to order results by - - - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/ordinals/v1/brc-20/tokens?ticker=%5B%0A++%22string%22%0A%5D&order_by=tx_count&offset=0&limit=1" -``` - - - - - -```js -fetch("https://api.hiro.so/ordinals/v1/brc-20/tokens?ticker=%5B%0A++%22string%22%0A%5D&order_by=tx_count&offset=0&limit=1", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218i0", - "number": 248751, - "block_height": 752860, - "tx_id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218", - "address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8", - "ticker": "PEPE", - "max_supply": "21000000", - "mint_limit": "100000", - "decimals": 18, - "deploy_timestamp": 1677733170000, - "minted_supply": "1000000", - "tx_count": 300000 - } - ] -} -``` - - - - - -```ts -export interface PaginatedBRC20TokenResponse { - limit: number; - offset: number; - total: number; - results: BRC20TokenResponse[]; -} -export interface BRC20TokenResponse { - id: string; - number: number; - block_height: number; - tx_id: string; - address: string; - ticker: string; - max_supply: string; - mint_limit: string | null; - decimals: number; - deploy_timestamp: number; - minted_supply: string; - tx_count: number; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/ordinals/api/brc20/index.mdx b/content/docs/bitcoin/ordinals/api/brc20/index.mdx index 6f080d8da..bb0d24b2a 100644 --- a/content/docs/bitcoin/ordinals/api/brc20/index.mdx +++ b/content/docs/bitcoin/ordinals/api/brc20/index.mdx @@ -1,6 +1,6 @@ --- title: BRC-20 index: true -toc: false +full: true description: Retrieves information about BRC-20 tokens. --- diff --git a/content/docs/bitcoin/ordinals/api/info/index.mdx b/content/docs/bitcoin/ordinals/api/info/index.mdx index a9ce0c187..3062e329e 100644 --- a/content/docs/bitcoin/ordinals/api/info/index.mdx +++ b/content/docs/bitcoin/ordinals/api/info/index.mdx @@ -1,6 +1,6 @@ --- title: Status index: true -toc: false +full: true description: Retrieves information about the Ordinals API status, including the server version. --- diff --git a/content/docs/bitcoin/ordinals/api/info/status.mdx b/content/docs/bitcoin/ordinals/api/info/status.mdx index 780e4b239..73696e143 100644 --- a/content/docs/bitcoin/ordinals/api/info/status.mdx +++ b/content/docs/bitcoin/ordinals/api/info/status.mdx @@ -1,111 +1,11 @@ --- title: Get API status description: Retrieves the running status of the Ordinals API. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## API Status - -Displays the status of the API - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/ordinals/v1/" -``` - - - - - -```js -fetch("https://api.hiro.so/ordinals/v1/", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "server_version": "", - "status": "string", - "block_height": 0, - "max_inscription_number": 0, - "max_cursed_inscription_number": 0 -} -``` - - - - - -```ts -export interface ApiStatusResponse { - server_version: string; - status: string; - block_height?: number; - max_inscription_number?: number; - max_cursed_inscription_number?: number; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-content.mdx b/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-content.mdx index 901d0815e..1a561fb0a 100644 --- a/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-content.mdx +++ b/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-content.mdx @@ -1,136 +1,11 @@ --- title: Get inscription content description: Retrieves the content of a single inscription. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Inscription content - -Retrieves the contents of a single inscription - -### Path Parameters - - - -Inscription unique identifier (number or ID) - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | -| `404` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/ordinals/v1/inscriptions/38c46a8bf7ec90bc7f6b797e7dc84baa97f4e5fd4286b92fe1b50176d03b18dci0/content" -``` - - - - - -```js -fetch("https://api.hiro.so/ordinals/v1/inscriptions/38c46a8bf7ec90bc7f6b797e7dc84baa97f4e5fd4286b92fe1b50176d03b18dci0/content", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{} -``` - - - - - -```ts -export interface Response {} -``` - - - - - - - - - - - - - -```json -{ - "error": "Not found" -} -``` - - - - - -```ts -export interface NotFoundResponse { - error: "Not found"; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-transfers.mdx b/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-transfers.mdx index 2dee370a1..36d01db7c 100644 --- a/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-transfers.mdx +++ b/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-transfers.mdx @@ -1,189 +1,11 @@ --- title: Get inscription transfers description: Retrieves all transfers for a single inscription. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Inscription transfers - -Retrieves all transfers for a single inscription - -### Query Parameters - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - -### Path Parameters - - - -Inscription unique identifier (number or ID) - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | -| `404` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/ordinals/v1/inscriptions/38c46a8bf7ec90bc7f6b797e7dc84baa97f4e5fd4286b92fe1b50176d03b18dci0/transfers?offset=0&limit=1" -``` - - - - - -```js -fetch("https://api.hiro.so/ordinals/v1/inscriptions/38c46a8bf7ec90bc7f6b797e7dc84baa97f4e5fd4286b92fe1b50176d03b18dci0/transfers?offset=0&limit=1", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "block_height": 778921, - "block_hash": "0000000000000000000452773967cdd62297137cdaf79950c5e8bb0c62075133", - "address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8", - "tx_id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218", - "location": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218:0:0", - "output": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218:0", - "value": "546", - "offset": "0", - "timestamp": 1677733170000 - } - ] -} -``` - - - - - -```ts -export interface PaginatedInscriptionLocationsResponse { - limit: number; - offset: number; - total: number; - results: InscriptionLocationResponse[]; -} -export interface InscriptionLocationResponse { - block_height: number; - block_hash: string; - address: string | null; - tx_id: string; - location: string; - output: string; - value: string | null; - offset: string | null; - timestamp: number; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Not found" -} -``` - - - - - -```ts -export interface NotFoundResponse { - error: "Not found"; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription.mdx b/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription.mdx index ee582a52c..b58eeb652 100644 --- a/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription.mdx +++ b/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription.mdx @@ -1,188 +1,11 @@ --- title: Get inscription description: Retrieves a single inscription. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Specific Inscription - -Retrieves a single inscription - -### Path Parameters - - - -Inscription unique identifier (number or ID) - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | -| `404` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/ordinals/v1/inscriptions/38c46a8bf7ec90bc7f6b797e7dc84baa97f4e5fd4286b92fe1b50176d03b18dci0" -``` - - - - - -```js -fetch("https://api.hiro.so/ordinals/v1/inscriptions/38c46a8bf7ec90bc7f6b797e7dc84baa97f4e5fd4286b92fe1b50176d03b18dci0", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218i0", - "number": 248751, - "address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8", - "genesis_address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8", - "genesis_block_height": 778921, - "genesis_block_hash": "0000000000000000000452773967cdd62297137cdaf79950c5e8bb0c62075133", - "genesis_tx_id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218", - "genesis_fee": "3179", - "genesis_timestamp": 0, - "tx_id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218", - "location": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218:0:0", - "output": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218:0", - "value": "546", - "offset": "0", - "sat_ordinal": "1232735286933201", - "sat_rarity": "common", - "sat_coinbase_height": 430521, - "mime_type": "text/plain", - "content_type": "text/plain;charset=utf-8", - "content_length": 59, - "timestamp": 1677733170000, - "curse_type": "p2wsh", - "recursive": true, - "recursion_refs": [ - "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218i0" - ] -} -``` - - - - - -```ts -export interface InscriptionResponse { - id: string; - number: number; - address: string | null; - genesis_address: string | null; - genesis_block_height: number; - genesis_block_hash: string; - genesis_tx_id: string; - genesis_fee: string; - genesis_timestamp: number; - tx_id: string; - location: string; - output: string; - value: string | null; - offset: string | null; - sat_ordinal: string; - sat_rarity: string; - sat_coinbase_height: number; - mime_type: string; - content_type: string; - content_length: number; - timestamp: number; - curse_type: string | null; - recursive: boolean; - recursion_refs: string[] | null; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Not found" -} -``` - - - - - -```ts -export interface NotFoundResponse { - error: "Not found"; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/ordinals/api/inscriptions/get-inscriptions.mdx b/content/docs/bitcoin/ordinals/api/inscriptions/get-inscriptions.mdx index db54e3e62..0a56fb4db 100644 --- a/content/docs/bitcoin/ordinals/api/inscriptions/get-inscriptions.mdx +++ b/content/docs/bitcoin/ordinals/api/inscriptions/get-inscriptions.mdx @@ -1,372 +1,11 @@ --- title: Get inscriptions description: Retrieves a list of inscriptions with options to filter and sort results. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - ObjectCollapsible, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## List of Inscriptions - -Retrieves a list of inscriptions with options to filter and sort results - -### Query Parameters - - - -Bitcoin block identifier (height or hash) - - - - - -Bitcoin block height - -Pattern: `"^[0-9]+$"` - - - - - -Bitcoin block height - -Pattern: `"^[0-9]+$"` - - - - - -Block UNIX epoch timestamp (milliseconds) - - - - - -Block UNIX epoch timestamp (milliseconds) - - - - - -Ordinal number that uniquely identifies a satoshi - -Minimum: `0` - - - - - -Ordinal number that uniquely identifies a satoshi - -Minimum: `0` - - - - - -Bitcoin block height - -Pattern: `"^[0-9]+$"` - - - - - -Bitcoin block height - -Pattern: `"^[0-9]+$"` - - - - - -Inscription number - - - - - -Inscription number - - - - - -Array of inscription IDs - -Example: `"/ordinals/v1/inscriptions?id={inscription_id}&id={inscription_id2}"` - - - - - -Array of inscription numbers - - - - - -An UTXO for a Bitcoin transaction - -Pattern: `"^[a-fA-F0-9]{64}:[0-9]+$"` - - - - - -Array of Bitcoin addresses - - - - - -Array of Bitcoin addresses - - - - - -Array of inscription MIME types - - - - - -Array of satoshi rarity values - - - - - -Rarity of a single satoshi according to Ordinal Theory - - - - - - - - - -Whether or not the inscription is recursive - - - - - -Whether or not the inscription is cursed - - - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - - - -Parameter to order results by - - - - - -Results order - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | -| `404` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/ordinals/v1/inscriptions?genesis_block=0000000000000000000452773967cdd62297137cdaf79950c5e8bb0c62075133&from_genesis_block_height=string&to_genesis_block_height=string&from_genesis_timestamp=0&to_genesis_timestamp=0&from_sat_ordinal=2099999997689999&to_sat_ordinal=2099999997689999&from_sat_coinbase_height=string&to_sat_coinbase_height=string&from_number=0&to_number=0&id=%5B%0A++%2238c46a8bf7ec90bc7f6b797e7dc84baa97f4e5fd4286b92fe1b50176d03b18dci0%22%0A%5D&number=%5B%0A++%2210500%22%0A%5D&output=string&address=%5B%0A++%22bc1p8aq8s3z9xl87e74twfk93mljxq6alv4a79yheadx33t9np4g2wkqqt8kc5%22%0A%5D&genesis_address=%5B%0A++%22bc1p8aq8s3z9xl87e74twfk93mljxq6alv4a79yheadx33t9np4g2wkqqt8kc5%22%0A%5D&mime_type=%5B%0A++%22image%2Fpng%22%0A%5D&rarity=%5B%0A++%22uncommon%22%0A%5D&recursive=true&cursed=true&offset=0&limit=1&order_by=number&order=asc" -``` - - - - - -```js -fetch("https://api.hiro.so/ordinals/v1/inscriptions?genesis_block=0000000000000000000452773967cdd62297137cdaf79950c5e8bb0c62075133&from_genesis_block_height=string&to_genesis_block_height=string&from_genesis_timestamp=0&to_genesis_timestamp=0&from_sat_ordinal=2099999997689999&to_sat_ordinal=2099999997689999&from_sat_coinbase_height=string&to_sat_coinbase_height=string&from_number=0&to_number=0&id=%5B%0A++%2238c46a8bf7ec90bc7f6b797e7dc84baa97f4e5fd4286b92fe1b50176d03b18dci0%22%0A%5D&number=%5B%0A++%2210500%22%0A%5D&output=string&address=%5B%0A++%22bc1p8aq8s3z9xl87e74twfk93mljxq6alv4a79yheadx33t9np4g2wkqqt8kc5%22%0A%5D&genesis_address=%5B%0A++%22bc1p8aq8s3z9xl87e74twfk93mljxq6alv4a79yheadx33t9np4g2wkqqt8kc5%22%0A%5D&mime_type=%5B%0A++%22image%2Fpng%22%0A%5D&rarity=%5B%0A++%22uncommon%22%0A%5D&recursive=true&cursed=true&offset=0&limit=1&order_by=number&order=asc", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218i0", - "number": 248751, - "address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8", - "genesis_address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8", - "genesis_block_height": 778921, - "genesis_block_hash": "0000000000000000000452773967cdd62297137cdaf79950c5e8bb0c62075133", - "genesis_tx_id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218", - "genesis_fee": "3179", - "genesis_timestamp": 0, - "tx_id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218", - "location": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218:0:0", - "output": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218:0", - "value": "546", - "offset": "0", - "sat_ordinal": "1232735286933201", - "sat_rarity": "common", - "sat_coinbase_height": 430521, - "mime_type": "text/plain", - "content_type": "text/plain;charset=utf-8", - "content_length": 59, - "timestamp": 1677733170000, - "curse_type": "p2wsh", - "recursive": true, - "recursion_refs": [ - "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218i0" - ] - } - ] -} -``` - - - - - -```ts -export interface PaginatedInscriptionsResponse { - limit: number; - offset: number; - total: number; - results: InscriptionResponse[]; -} -export interface InscriptionResponse { - id: string; - number: number; - address: string | null; - genesis_address: string | null; - genesis_block_height: number; - genesis_block_hash: string; - genesis_tx_id: string; - genesis_fee: string; - genesis_timestamp: number; - tx_id: string; - location: string; - output: string; - value: string | null; - offset: string | null; - sat_ordinal: string; - sat_rarity: string; - sat_coinbase_height: number; - mime_type: string; - content_type: string; - content_length: number; - timestamp: number; - curse_type: string | null; - recursive: boolean; - recursion_refs: string[] | null; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Not found" -} -``` - - - - - -```ts -export interface NotFoundResponse { - error: "Not found"; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/ordinals/api/inscriptions/get-transfers-per-block.mdx b/content/docs/bitcoin/ordinals/api/inscriptions/get-transfers-per-block.mdx index 1432ccb81..a3c94274f 100644 --- a/content/docs/bitcoin/ordinals/api/inscriptions/get-transfers-per-block.mdx +++ b/content/docs/bitcoin/ordinals/api/inscriptions/get-transfers-per-block.mdx @@ -1,218 +1,11 @@ --- title: Get transfers per block description: Retrieves a list of inscription transfers that ocurred at a specific Bitcoin block. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Transfers per block - -Retrieves a list of inscription transfers that ocurred at a specific Bitcoin block - -### Query Parameters - - - -Bitcoin block identifier (height or hash) - - - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | -| `404` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/ordinals/v1/inscriptions/transfers?block=0000000000000000000452773967cdd62297137cdaf79950c5e8bb0c62075133&offset=0&limit=1" -``` - - - - - -```js -fetch("https://api.hiro.so/ordinals/v1/inscriptions/transfers?block=0000000000000000000452773967cdd62297137cdaf79950c5e8bb0c62075133&offset=0&limit=1", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218i0", - "number": 248751, - "from": { - "block_height": 778921, - "block_hash": "0000000000000000000452773967cdd62297137cdaf79950c5e8bb0c62075133", - "address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8", - "tx_id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218", - "location": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218:0:0", - "output": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218:0", - "value": "546", - "offset": "0", - "timestamp": 1677733170000 - }, - "to": { - "block_height": 778921, - "block_hash": "0000000000000000000452773967cdd62297137cdaf79950c5e8bb0c62075133", - "address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8", - "tx_id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218", - "location": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218:0:0", - "output": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218:0", - "value": "546", - "offset": "0", - "timestamp": 1677733170000 - } - } - ] -} -``` - - - - - -```ts -export interface PaginatedBlockTransfersResponse { - limit: number; - offset: number; - total: number; - results: { - id: string; - number: number; - from: InscriptionLocationResponse; - to: InscriptionLocationResponse1; - }[]; -} -export interface InscriptionLocationResponse { - block_height: number; - block_hash: string; - address: string | null; - tx_id: string; - location: string; - output: string; - value: string | null; - offset: string | null; - timestamp: number; -} -export interface InscriptionLocationResponse1 { - block_height: number; - block_hash: string; - address: string | null; - tx_id: string; - location: string; - output: string; - value: string | null; - offset: string | null; - timestamp: number; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Not found" -} -``` - - - - - -```ts -export interface NotFoundResponse { - error: "Not found"; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/ordinals/api/inscriptions/index.mdx b/content/docs/bitcoin/ordinals/api/inscriptions/index.mdx index 83971be5f..0d9f50aec 100644 --- a/content/docs/bitcoin/ordinals/api/inscriptions/index.mdx +++ b/content/docs/bitcoin/ordinals/api/inscriptions/index.mdx @@ -1,6 +1,6 @@ --- title: Inscriptions index: true -toc: false +full: true description: Retrieves information about Ordinals inscriptions. --- diff --git a/content/docs/bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions.mdx b/content/docs/bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions.mdx index a3ba20055..9e7fb32d2 100644 --- a/content/docs/bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions.mdx +++ b/content/docs/bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions.mdx @@ -1,223 +1,11 @@ --- title: Get satoshi inscriptions description: Retrieves all inscriptions associated with a single satoshi. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Satoshi Inscriptions - -Retrieves all inscriptions associated with a single satoshi - -### Query Parameters - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - -### Path Parameters - - - -Ordinal number that uniquely identifies a satoshi - -Minimum: `0` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | -| `400` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/ordinals/v1/sats/2099999997689999/inscriptions?offset=0&limit=1" -``` - - - - - -```js -fetch("https://api.hiro.so/ordinals/v1/sats/2099999997689999/inscriptions?offset=0&limit=1", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218i0", - "number": 248751, - "address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8", - "genesis_address": "bc1pvwh2dl6h388x65rqq47qjzdmsqgkatpt4hye6daf7yxvl0z3xjgq247aq8", - "genesis_block_height": 778921, - "genesis_block_hash": "0000000000000000000452773967cdd62297137cdaf79950c5e8bb0c62075133", - "genesis_tx_id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218", - "genesis_fee": "3179", - "genesis_timestamp": 0, - "tx_id": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218", - "location": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218:0:0", - "output": "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218:0", - "value": "546", - "offset": "0", - "sat_ordinal": "1232735286933201", - "sat_rarity": "common", - "sat_coinbase_height": 430521, - "mime_type": "text/plain", - "content_type": "text/plain;charset=utf-8", - "content_length": 59, - "timestamp": 1677733170000, - "curse_type": "p2wsh", - "recursive": true, - "recursion_refs": [ - "1463d48e9248159084929294f64bda04487503d30ce7ab58365df1dc6fd58218i0" - ] - } - ] -} -``` - - - - - -```ts -export interface PaginatedSatoshiInscriptionsResponse { - limit: number; - offset: number; - total: number; - results: InscriptionResponse[]; -} -export interface InscriptionResponse { - id: string; - number: number; - address: string | null; - genesis_address: string | null; - genesis_block_height: number; - genesis_block_hash: string; - genesis_tx_id: string; - genesis_fee: string; - genesis_timestamp: number; - tx_id: string; - location: string; - output: string; - value: string | null; - offset: string | null; - sat_ordinal: string; - sat_rarity: string; - sat_coinbase_height: number; - mime_type: string; - content_type: string; - content_length: number; - timestamp: number; - curse_type: string | null; - recursive: boolean; - recursion_refs: string[] | null; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Invalid satoshi ordinal number" -} -``` - - - - - -```ts -export interface InvalidSatoshiNumberResponse { - error: "Invalid satoshi ordinal number"; -} -``` - - - - - - - - - - - - - - + diff --git a/content/docs/bitcoin/ordinals/api/satoshis/get-satoshi.mdx b/content/docs/bitcoin/ordinals/api/satoshis/get-satoshi.mdx index 695c450f7..f07b47a3a 100644 --- a/content/docs/bitcoin/ordinals/api/satoshis/get-satoshi.mdx +++ b/content/docs/bitcoin/ordinals/api/satoshis/get-satoshi.mdx @@ -1,162 +1,11 @@ --- title: Get satoshi ordinal description: Retrieves ordinal information for a single satoshi. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Satoshi Ordinal - -Retrieves ordinal information for a single satoshi - -### Path Parameters - - - -Ordinal number that uniquely identifies a satoshi - -Minimum: `0` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | -| `400` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/ordinals/v1/sats/2099999997689999" -``` - - - - - -```js -fetch("https://api.hiro.so/ordinals/v1/sats/2099999997689999", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "coinbase_height": 752860, - "cycle": 0, - "decimal": "752860.20444193", - "degree": "0°122860′892″20444193‴", - "inscription_id": "ff4503ab9048d6d0ff4e23def81b614d5270d341ce993992e93902ceb0d4ed79i0", - "epoch": 3, - "name": "ahehcbywzae", - "offset": 20444193, - "percentile": "91.15654869285287%", - "period": 373, - "rarity": "common" -} -``` - - - - - -```ts -export interface SatoshiResponse { - coinbase_height: number; - cycle: number; - decimal: string; - degree: string; - inscription_id?: string; - epoch: number; - name: string; - offset: number; - percentile: string; - period: number; - rarity: "common" | "uncommon" | "rare" | "epic" | "legendary" | "mythic"; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Invalid satoshi ordinal number" -} -``` - - - - - -```ts -export interface InvalidSatoshiNumberResponse { - error: "Invalid satoshi ordinal number"; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/ordinals/api/satoshis/index.mdx b/content/docs/bitcoin/ordinals/api/satoshis/index.mdx index 5ff4ced9b..d1053cf27 100644 --- a/content/docs/bitcoin/ordinals/api/satoshis/index.mdx +++ b/content/docs/bitcoin/ordinals/api/satoshis/index.mdx @@ -1,6 +1,6 @@ --- title: Satoshis index: true -toc: false +full: true description: Retrieves ordinal information for satoshis. --- diff --git a/content/docs/bitcoin/ordinals/api/statistics/get-stats-inscription-count.mdx b/content/docs/bitcoin/ordinals/api/statistics/get-stats-inscription-count.mdx index 51a418fe6..bf177dcec 100644 --- a/content/docs/bitcoin/ordinals/api/statistics/get-stats-inscription-count.mdx +++ b/content/docs/bitcoin/ordinals/api/statistics/get-stats-inscription-count.mdx @@ -1,164 +1,11 @@ --- title: Get inscription count per block description: Retrieves statistics on the number of inscriptions revealed per block. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Inscription Count per Block - -Retrieves statistics on the number of inscriptions revealed per block - -### Query Parameters - - - -Bitcoin block height - -Pattern: `"^[0-9]+$"` - - - - - -Bitcoin block height - -Pattern: `"^[0-9]+$"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | -| `404` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/ordinals/v1/stats/inscriptions?from_block_height=string&to_block_height=string" -``` - - - - - -```js -fetch("https://api.hiro.so/ordinals/v1/stats/inscriptions?from_block_height=string&to_block_height=string", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "results": [ - { - "block_height": "778921", - "block_hash": "0000000000000000000452773967cdd62297137cdaf79950c5e8bb0c62075133", - "inscription_count": "100", - "inscription_count_accum": "3100", - "timestamp": 1677733170000 - } - ] -} -``` - - - - - -```ts -export interface Response { - results: { - block_height: string; - block_hash: string; - inscription_count: string; - inscription_count_accum: string; - timestamp: number; - }[]; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Not found" -} -``` - - - - - -```ts -export interface NotFoundResponse { - error: "Not found"; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/ordinals/api/statistics/index.mdx b/content/docs/bitcoin/ordinals/api/statistics/index.mdx index 68cd35ded..11a0a94e4 100644 --- a/content/docs/bitcoin/ordinals/api/statistics/index.mdx +++ b/content/docs/bitcoin/ordinals/api/statistics/index.mdx @@ -1,6 +1,6 @@ --- title: Statistics index: true -toc: false +full: true description: Retrieves stats on the number of inscriptions per block. --- diff --git a/content/docs/bitcoin/runes/api/activities/activity.mdx b/content/docs/bitcoin/runes/api/activities/activity.mdx index 943d9e953..7f6513f78 100644 --- a/content/docs/bitcoin/runes/api/activities/activity.mdx +++ b/content/docs/bitcoin/runes/api/activities/activity.mdx @@ -1,214 +1,11 @@ --- title: Get all activity description: Retrieves all activity for a Rune. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Rune activity - -Retrieves all activity for a Rune - -### Query Parameters - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - -### Path Parameters - - - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/runes/v1/etchings/string/activity?offset=0&limit=1" -``` - - - - - -```js -fetch("https://api.hiro.so/runes/v1/etchings/string/activity?offset=0&limit=1", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "address": "bc1q7jd477wc5s88hsvenr0ddtatsw282hfjzg59wz", - "receiver_address": "bc1pgdrveee2v4ez95szaakw5gkd8eennv2dddf9rjdrlt6ch56lzrrsxgvazt", - "amount": "11000000000", - "operation": "etching", - "location": { - "block_hash": "00000000000000000000c9787573a1f1775a2b56b403a2d0c7957e9a5bc754bb", - "block_height": 840000, - "tx_id": "2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e", - "tx_index": 1, - "vout": 100, - "output": "2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e:100", - "timestamp": 1713571767 - } - } - ] -} -``` - - - - - -```ts -/** - * Bitcoin address which initiated this activity - */ -export type Address = string; -/** - * Bitcoin address which is receiving rune balance - */ -export type ReceiverAddress = string; -/** - * Rune amount relevat to this activity - */ -export type Amount = string; -/** - * Type of operation described in this activity - */ -export type Operation = "etching" | "mint" | "burn" | "send" | "receive"; -/** - * Bitcoin block hash - */ -export type BlockHash = string; -/** - * Bitcoin block height - */ -export type BlockHeight = number; -/** - * Bitcoin transaction ID - */ -export type TransactionID = string; -/** - * Index of this transaction in its Bitcoin block - */ -export type TransactionIndex = number; -/** - * Bitcoin transaction output number - */ -export type OutputNumber = number; -/** - * Bitcoin transaction output - */ -export type TransactionOutput = string; -/** - * Bitcoin transaction timestamp - */ -export type Timestamp = number; - -export interface PaginatedActivityResponse { - limit: number; - offset: number; - total: number; - results: { - address?: Address; - receiver_address?: ReceiverAddress; - amount?: Amount; - operation: Operation; - location: TransactionLocation; - }[]; -} -/** - * Location of the transaction which confirmed this operation - */ -export interface TransactionLocation { - block_hash: BlockHash; - block_height: BlockHeight; - tx_id: TransactionID; - tx_index: TransactionIndex; - vout?: OutputNumber; - output?: TransactionOutput; - timestamp: Timestamp; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/runes/api/activities/for-address.mdx b/content/docs/bitcoin/runes/api/activities/for-address.mdx index 8d61afe6e..d9d4b1d73 100644 --- a/content/docs/bitcoin/runes/api/activities/for-address.mdx +++ b/content/docs/bitcoin/runes/api/activities/for-address.mdx @@ -1,220 +1,11 @@ --- title: Get activity for an address description: Retrieves all Rune activity for a Bitcoin address. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Rune activity for address - -Retrieves all activity for a Rune address - -### Query Parameters - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - -### Path Parameters - - - - - - - -Bitcoin address - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/runes/v1/etchings/string/activity/string?offset=0&limit=1" -``` - - - - - -```js -fetch("https://api.hiro.so/runes/v1/etchings/string/activity/string?offset=0&limit=1", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "address": "bc1q7jd477wc5s88hsvenr0ddtatsw282hfjzg59wz", - "receiver_address": "bc1pgdrveee2v4ez95szaakw5gkd8eennv2dddf9rjdrlt6ch56lzrrsxgvazt", - "amount": "11000000000", - "operation": "etching", - "location": { - "block_hash": "00000000000000000000c9787573a1f1775a2b56b403a2d0c7957e9a5bc754bb", - "block_height": 840000, - "tx_id": "2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e", - "tx_index": 1, - "vout": 100, - "output": "2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e:100", - "timestamp": 1713571767 - } - } - ] -} -``` - - - - - -```ts -/** - * Bitcoin address which initiated this activity - */ -export type Address = string; -/** - * Bitcoin address which is receiving rune balance - */ -export type ReceiverAddress = string; -/** - * Rune amount relevat to this activity - */ -export type Amount = string; -/** - * Type of operation described in this activity - */ -export type Operation = "etching" | "mint" | "burn" | "send" | "receive"; -/** - * Bitcoin block hash - */ -export type BlockHash = string; -/** - * Bitcoin block height - */ -export type BlockHeight = number; -/** - * Bitcoin transaction ID - */ -export type TransactionID = string; -/** - * Index of this transaction in its Bitcoin block - */ -export type TransactionIndex = number; -/** - * Bitcoin transaction output number - */ -export type OutputNumber = number; -/** - * Bitcoin transaction output - */ -export type TransactionOutput = string; -/** - * Bitcoin transaction timestamp - */ -export type Timestamp = number; - -export interface PaginatedActivityResponse { - limit: number; - offset: number; - total: number; - results: { - address?: Address; - receiver_address?: ReceiverAddress; - amount?: Amount; - operation: Operation; - location: TransactionLocation; - }[]; -} -/** - * Location of the transaction which confirmed this operation - */ -export interface TransactionLocation { - block_hash: BlockHash; - block_height: BlockHeight; - tx_id: TransactionID; - tx_index: TransactionIndex; - vout?: OutputNumber; - output?: TransactionOutput; - timestamp: Timestamp; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/runes/api/activities/for-block.mdx b/content/docs/bitcoin/runes/api/activities/for-block.mdx index e7c4dcb85..0473ff214 100644 --- a/content/docs/bitcoin/runes/api/activities/for-block.mdx +++ b/content/docs/bitcoin/runes/api/activities/for-block.mdx @@ -1,242 +1,11 @@ --- title: Get activity for a block description: Retrieves a paginated list of rune activity for a block. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - ObjectCollapsible, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Block activity - -Retrieves a paginated list of rune activity for a block - -### Query Parameters - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - -### Path Parameters - - - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/runes/v1/blocks/777678/activity?offset=0&limit=1" -``` - - - - - -```js -fetch("https://api.hiro.so/runes/v1/blocks/777678/activity?offset=0&limit=1", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "rune": { - "id": "840000:1", - "name": "ZZZZZFEHUZZZZZ", - "spaced_name": "Z•Z•Z•Z•Z•FEHU•Z•Z•Z•Z•Z" - }, - "address": "bc1q7jd477wc5s88hsvenr0ddtatsw282hfjzg59wz", - "receiver_address": "bc1pgdrveee2v4ez95szaakw5gkd8eennv2dddf9rjdrlt6ch56lzrrsxgvazt", - "amount": "11000000000", - "operation": "etching", - "location": { - "block_hash": "00000000000000000000c9787573a1f1775a2b56b403a2d0c7957e9a5bc754bb", - "block_height": 840000, - "tx_id": "2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e", - "tx_index": 1, - "vout": 100, - "output": "2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e:100", - "timestamp": 1713571767 - } - } - ] -} -``` - - - - - -```ts -/** - * Rune ID - */ -export type ID = string; -/** - * Rune name - */ -export type Name = string; -/** - * Rune name with spacers - */ -export type SpacedName = string; -/** - * Bitcoin address which initiated this activity - */ -export type Address = string; -/** - * Bitcoin address which is receiving rune balance - */ -export type ReceiverAddress = string; -/** - * Rune amount relevat to this activity - */ -export type Amount = string; -/** - * Type of operation described in this activity - */ -export type Operation = "etching" | "mint" | "burn" | "send" | "receive"; -/** - * Bitcoin block hash - */ -export type BlockHash = string; -/** - * Bitcoin block height - */ -export type BlockHeight = number; -/** - * Bitcoin transaction ID - */ -export type TransactionID = string; -/** - * Index of this transaction in its Bitcoin block - */ -export type TransactionIndex = number; -/** - * Bitcoin transaction output number - */ -export type OutputNumber = number; -/** - * Bitcoin transaction output - */ -export type TransactionOutput = string; -/** - * Bitcoin transaction timestamp - */ -export type Timestamp = number; - -export interface PaginatedActivityResponse { - limit: number; - offset: number; - total: number; - results: ({ - rune: RuneDetail; - } & { - address?: Address; - receiver_address?: ReceiverAddress; - amount?: Amount; - operation: Operation; - location: TransactionLocation; - })[]; -} -/** - * Details of the rune affected by this activity - */ -export interface RuneDetail { - id: ID; - name: Name; - spaced_name: SpacedName; -} -/** - * Location of the transaction which confirmed this operation - */ -export interface TransactionLocation { - block_hash: BlockHash; - block_height: BlockHeight; - tx_id: TransactionID; - tx_index: TransactionIndex; - vout?: OutputNumber; - output?: TransactionOutput; - timestamp: Timestamp; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/runes/api/activities/for-transaction.mdx b/content/docs/bitcoin/runes/api/activities/for-transaction.mdx index 8e2d9e750..3b3b9c1e2 100644 --- a/content/docs/bitcoin/runes/api/activities/for-transaction.mdx +++ b/content/docs/bitcoin/runes/api/activities/for-transaction.mdx @@ -1,245 +1,11 @@ --- title: Get activity for a transaction description: Retrieves a paginated list of rune activity for a transaction. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Transaction activity - -Retrieves a paginated list of rune activity for a transaction - -### Query Parameters - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - -### Path Parameters - - - -A transaction ID - -Pattern: `"^[a-fA-F0-9]{64}$"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/runes/v1/transactions/string/activity?offset=0&limit=1" -``` - - - - - -```js -fetch("https://api.hiro.so/runes/v1/transactions/string/activity?offset=0&limit=1", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "rune": { - "id": "840000:1", - "name": "ZZZZZFEHUZZZZZ", - "spaced_name": "Z•Z•Z•Z•Z•FEHU•Z•Z•Z•Z•Z" - }, - "address": "bc1q7jd477wc5s88hsvenr0ddtatsw282hfjzg59wz", - "receiver_address": "bc1pgdrveee2v4ez95szaakw5gkd8eennv2dddf9rjdrlt6ch56lzrrsxgvazt", - "amount": "11000000000", - "operation": "etching", - "location": { - "block_hash": "00000000000000000000c9787573a1f1775a2b56b403a2d0c7957e9a5bc754bb", - "block_height": 840000, - "tx_id": "2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e", - "tx_index": 1, - "vout": 100, - "output": "2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e:100", - "timestamp": 1713571767 - } - } - ] -} -``` - - - - - -```ts -/** - * Rune ID - */ -export type ID = string; -/** - * Rune name - */ -export type Name = string; -/** - * Rune name with spacers - */ -export type SpacedName = string; -/** - * Bitcoin address which initiated this activity - */ -export type Address = string; -/** - * Bitcoin address which is receiving rune balance - */ -export type ReceiverAddress = string; -/** - * Rune amount relevat to this activity - */ -export type Amount = string; -/** - * Type of operation described in this activity - */ -export type Operation = "etching" | "mint" | "burn" | "send" | "receive"; -/** - * Bitcoin block hash - */ -export type BlockHash = string; -/** - * Bitcoin block height - */ -export type BlockHeight = number; -/** - * Bitcoin transaction ID - */ -export type TransactionID = string; -/** - * Index of this transaction in its Bitcoin block - */ -export type TransactionIndex = number; -/** - * Bitcoin transaction output number - */ -export type OutputNumber = number; -/** - * Bitcoin transaction output - */ -export type TransactionOutput = string; -/** - * Bitcoin transaction timestamp - */ -export type Timestamp = number; - -export interface PaginatedActivityResponse { - limit: number; - offset: number; - total: number; - results: ({ - rune: RuneDetail; - } & { - address?: Address; - receiver_address?: ReceiverAddress; - amount?: Amount; - operation: Operation; - location: TransactionLocation; - })[]; -} -/** - * Details of the rune affected by this activity - */ -export interface RuneDetail { - id: ID; - name: Name; - spaced_name: SpacedName; -} -/** - * Location of the transaction which confirmed this operation - */ -export interface TransactionLocation { - block_hash: BlockHash; - block_height: BlockHeight; - tx_id: TransactionID; - tx_index: TransactionIndex; - vout?: OutputNumber; - output?: TransactionOutput; - timestamp: Timestamp; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/runes/api/activities/index.mdx b/content/docs/bitcoin/runes/api/activities/index.mdx index 5e217ad15..bfdc06ca7 100644 --- a/content/docs/bitcoin/runes/api/activities/index.mdx +++ b/content/docs/bitcoin/runes/api/activities/index.mdx @@ -1,6 +1,6 @@ --- title: Activities index: true -toc: false +full: true description: Retrieves information about Rune activities. --- diff --git a/content/docs/bitcoin/runes/api/balances/address.mdx b/content/docs/bitcoin/runes/api/balances/address.mdx index f5d6f6f84..ee832f6e3 100644 --- a/content/docs/bitcoin/runes/api/balances/address.mdx +++ b/content/docs/bitcoin/runes/api/balances/address.mdx @@ -1,181 +1,11 @@ --- title: Get address balances description: Retrieves a paginated list of address balances. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Address balances - -Retrieves a paginated list of address balances - -### Query Parameters - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - -### Path Parameters - - - -Bitcoin address - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/runes/v1/addresses/string/balances?offset=0&limit=1" -``` - - - - - -```js -fetch("https://api.hiro.so/runes/v1/addresses/string/balances?offset=0&limit=1", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "rune": { - "id": "840000:1", - "name": "ZZZZZFEHUZZZZZ", - "spaced_name": "Z•Z•Z•Z•Z•FEHU•Z•Z•Z•Z•Z" - }, - "address": "bc1q7jd477wc5s88hsvenr0ddtatsw282hfjzg59wz", - "balance": "11000000000" - } - ] -} -``` - - - - - -```ts -/** - * Rune ID - */ -export type ID = string; -/** - * Rune name - */ -export type Name = string; -/** - * Rune name with spacers - */ -export type SpacedName = string; -/** - * Bitcoin address which holds this balance - */ -export type Address = string; -/** - * Rune balance - */ -export type Balance = string; - -export interface PaginatedBalancesResponse { - limit: number; - offset: number; - total: number; - results: ({ - rune: RuneDetail; - } & { - address?: Address; - balance: Balance; - })[]; -} -/** - * Details of the rune affected by this activity - */ -export interface RuneDetail { - id: ID; - name: Name; - spaced_name: SpacedName; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/runes/api/balances/holder-balance.mdx b/content/docs/bitcoin/runes/api/balances/holder-balance.mdx index 6ad56dc49..d046deefd 100644 --- a/content/docs/bitcoin/runes/api/balances/holder-balance.mdx +++ b/content/docs/bitcoin/runes/api/balances/holder-balance.mdx @@ -1,155 +1,11 @@ --- title: Get holder balance description: Retrieves holder balance for a specific Rune. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Rune holder balance - -Retrieves holder balance for a specific Rune - -### Path Parameters - - - - - - - -Bitcoin address - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | -| `404` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/runes/v1/etchings/string/holders/string" -``` - - - - - -```js -fetch("https://api.hiro.so/runes/v1/etchings/string/holders/string", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "address": "bc1q7jd477wc5s88hsvenr0ddtatsw282hfjzg59wz", - "balance": "11000000000" -} -``` - - - - - -```ts -/** - * Bitcoin address which holds this balance - */ -export type Address = string; -/** - * Rune balance - */ -export type Balance = string; - -export interface Response { - address?: Address; - balance: Balance; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Not found" -} -``` - - - - - -```ts -export interface NotFoundResponse { - error: "Not found"; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/runes/api/balances/holders.mdx b/content/docs/bitcoin/runes/api/balances/holders.mdx index 409aae0ff..6a807cc79 100644 --- a/content/docs/bitcoin/runes/api/balances/holders.mdx +++ b/content/docs/bitcoin/runes/api/balances/holders.mdx @@ -1,152 +1,11 @@ --- title: Get rune holders description: Retrieves a paginated list of holders for a Rune. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Rune holders - -Retrieves a paginated list of holders for a Rune - -### Query Parameters - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - -### Path Parameters - - - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/runes/v1/etchings/string/holders?offset=0&limit=1" -``` - - - - - -```js -fetch("https://api.hiro.so/runes/v1/etchings/string/holders?offset=0&limit=1", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "address": "bc1q7jd477wc5s88hsvenr0ddtatsw282hfjzg59wz", - "balance": "11000000000" - } - ] -} -``` - - - - - -```ts -/** - * Bitcoin address which holds this balance - */ -export type Address = string; -/** - * Rune balance - */ -export type Balance = string; - -export interface PaginatedHoldersResponse { - limit: number; - offset: number; - total: number; - results: { - address?: Address; - balance: Balance; - }[]; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/runes/api/balances/index.mdx b/content/docs/bitcoin/runes/api/balances/index.mdx index f9f893b4b..bb73ce112 100644 --- a/content/docs/bitcoin/runes/api/balances/index.mdx +++ b/content/docs/bitcoin/runes/api/balances/index.mdx @@ -1,6 +1,6 @@ --- title: Balances index: true -toc: false +full: true description: Retrieves information about Rune balances. --- diff --git a/content/docs/bitcoin/runes/api/etchings/get-etching.mdx b/content/docs/bitcoin/runes/api/etchings/get-etching.mdx index 66e133aac..95c4d2526 100644 --- a/content/docs/bitcoin/runes/api/etchings/get-etching.mdx +++ b/content/docs/bitcoin/runes/api/etchings/get-etching.mdx @@ -1,329 +1,11 @@ --- title: Get etching description: Retrieves information for a Rune etching. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Rune etching - -Retrieves information for a Rune etching - -### Path Parameters - - - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | -| `404` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/runes/v1/etchings/string" -``` - - - - - -```js -fetch("https://api.hiro.so/runes/v1/etchings/string", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "id": "840000:1", - "name": "ZZZZZFEHUZZZZZ", - "spaced_name": "Z•Z•Z•Z•Z•FEHU•Z•Z•Z•Z•Z", - "number": 1, - "divisibility": 2, - "symbol": "ᚠ", - "turbo": false, - "mint_terms": { - "amount": "100", - "cap": "1111111", - "height_start": 840000, - "height_end": 1050000, - "offset_start": 0, - "offset_end": 200 - }, - "supply": { - "current": "11274916350", - "minted": "274916100", - "total_mints": "250", - "mint_percentage": "59.4567", - "mintable": true, - "burned": "5100", - "total_burns": "17", - "premine": "11000000000" - }, - "location": { - "block_hash": "00000000000000000000c9787573a1f1775a2b56b403a2d0c7957e9a5bc754bb", - "block_height": 840000, - "tx_id": "2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e", - "tx_index": 1, - "vout": 100, - "output": "2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e:100", - "timestamp": 1713571767 - } -} -``` - - - - - -```ts -/** - * Rune ID - */ -export type ID = string; -/** - * Rune name - */ -export type Name = string; -/** - * Rune name with spacers - */ -export type SpacedName = string; -/** - * Rune number - */ -export type Number = number; -/** - * Rune decimal places - */ -export type Divisibility = number; -/** - * Rune symbol - */ -export type Symbol = string; -/** - * Rune upgradeability - */ -export type Turbo = boolean; -/** - * Amount awarded per mint - */ -export type MintAmount = string; -/** - * Maximum number of mints allowed - */ -export type MintCap = string; -/** - * Block height at which the mint period opens - */ -export type MintBlockHeightStart = number; -/** - * Block height at which the mint period closes - */ -export type MintBlockHeightEnd = number; -/** - * Block height etching offset at which the mint period opens - */ -export type MintBlockHeightOffsetStart = number; -/** - * Block height etching offset at which the mint period closes - */ -export type MintBlockHeightOffsetEnd = number; -/** - * Circulating supply including mints, burns and premine - */ -export type CurrentSupply = string; -/** - * Total minted amount - */ -export type MintedAmount = string; -/** - * Number of mints for this rune - */ -export type TotalMints = string; -/** - * Percentage of mints that have been claimed - */ -export type MintPercentage = string; -/** - * Whether or not this rune is mintable at this time - */ -export type Mintable = boolean; -/** - * Total burned amount - */ -export type BurnedAmount = string; -/** - * Number of burns for this rune - */ -export type TotalBurns = string; -/** - * Amount premined for this rune - */ -export type PremineAmount = string; -/** - * Bitcoin block hash - */ -export type BlockHash = string; -/** - * Bitcoin block height - */ -export type BlockHeight = number; -/** - * Bitcoin transaction ID - */ -export type TransactionID = string; -/** - * Index of this transaction in its Bitcoin block - */ -export type TransactionIndex = number; -/** - * Bitcoin transaction output number - */ -export type OutputNumber = number; -/** - * Bitcoin transaction output - */ -export type TransactionOutput = string; -/** - * Bitcoin transaction timestamp - */ -export type Timestamp = number; - -export interface Response { - id: ID; - name: Name; - spaced_name: SpacedName; - number: Number; - divisibility: Divisibility; - symbol: Symbol; - turbo: Turbo; - mint_terms: MintTerms; - supply: SupplyInformation; - location: TransactionLocation; -} -/** - * Rune mint terms - */ -export interface MintTerms { - amount: MintAmount | null; - cap: MintCap | null; - height_start: MintBlockHeightStart | null; - height_end: MintBlockHeightEnd | null; - offset_start: MintBlockHeightOffsetStart | null; - offset_end: MintBlockHeightOffsetEnd | null; -} -/** - * Rune supply information - */ -export interface SupplyInformation { - current: CurrentSupply; - minted: MintedAmount; - total_mints: TotalMints; - mint_percentage: MintPercentage; - mintable: Mintable; - burned: BurnedAmount; - total_burns: TotalBurns; - premine: PremineAmount; -} -/** - * Location of the transaction which confirmed this operation - */ -export interface TransactionLocation { - block_hash: BlockHash; - block_height: BlockHeight; - tx_id: TransactionID; - tx_index: TransactionIndex; - vout?: OutputNumber; - output?: TransactionOutput; - timestamp: Timestamp; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Not found" -} -``` - - - - - -```ts -export interface NotFoundResponse { - error: "Not found"; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/runes/api/etchings/get-etchings.mdx b/content/docs/bitcoin/runes/api/etchings/get-etchings.mdx index bdf5b60d4..ecb2311e1 100644 --- a/content/docs/bitcoin/runes/api/etchings/get-etchings.mdx +++ b/content/docs/bitcoin/runes/api/etchings/get-etchings.mdx @@ -1,326 +1,11 @@ --- title: Get etchings description: Retrieves a paginated list of rune etchings. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Rune etchings - -Retrieves a paginated list of rune etchings - -### Query Parameters - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/runes/v1/etchings?offset=0&limit=1" -``` - - - - - -```js -fetch("https://api.hiro.so/runes/v1/etchings?offset=0&limit=1", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "id": "840000:1", - "name": "ZZZZZFEHUZZZZZ", - "spaced_name": "Z•Z•Z•Z•Z•FEHU•Z•Z•Z•Z•Z", - "number": 1, - "divisibility": 2, - "symbol": "ᚠ", - "turbo": false, - "mint_terms": { - "amount": "100", - "cap": "1111111", - "height_start": 840000, - "height_end": 1050000, - "offset_start": 0, - "offset_end": 200 - }, - "supply": { - "current": "11274916350", - "minted": "274916100", - "total_mints": "250", - "mint_percentage": "59.4567", - "mintable": true, - "burned": "5100", - "total_burns": "17", - "premine": "11000000000" - }, - "location": { - "block_hash": "00000000000000000000c9787573a1f1775a2b56b403a2d0c7957e9a5bc754bb", - "block_height": 840000, - "tx_id": "2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e", - "tx_index": 1, - "vout": 100, - "output": "2bb85f4b004be6da54f766c17c1e855187327112c231ef2ff35ebad0ea67c69e:100", - "timestamp": 1713571767 - } - } - ] -} -``` - - - - - -```ts -/** - * Rune ID - */ -export type ID = string; -/** - * Rune name - */ -export type Name = string; -/** - * Rune name with spacers - */ -export type SpacedName = string; -/** - * Rune number - */ -export type Number = number; -/** - * Rune decimal places - */ -export type Divisibility = number; -/** - * Rune symbol - */ -export type Symbol = string; -/** - * Rune upgradeability - */ -export type Turbo = boolean; -/** - * Amount awarded per mint - */ -export type MintAmount = string; -/** - * Maximum number of mints allowed - */ -export type MintCap = string; -/** - * Block height at which the mint period opens - */ -export type MintBlockHeightStart = number; -/** - * Block height at which the mint period closes - */ -export type MintBlockHeightEnd = number; -/** - * Block height etching offset at which the mint period opens - */ -export type MintBlockHeightOffsetStart = number; -/** - * Block height etching offset at which the mint period closes - */ -export type MintBlockHeightOffsetEnd = number; -/** - * Circulating supply including mints, burns and premine - */ -export type CurrentSupply = string; -/** - * Total minted amount - */ -export type MintedAmount = string; -/** - * Number of mints for this rune - */ -export type TotalMints = string; -/** - * Percentage of mints that have been claimed - */ -export type MintPercentage = string; -/** - * Whether or not this rune is mintable at this time - */ -export type Mintable = boolean; -/** - * Total burned amount - */ -export type BurnedAmount = string; -/** - * Number of burns for this rune - */ -export type TotalBurns = string; -/** - * Amount premined for this rune - */ -export type PremineAmount = string; -/** - * Bitcoin block hash - */ -export type BlockHash = string; -/** - * Bitcoin block height - */ -export type BlockHeight = number; -/** - * Bitcoin transaction ID - */ -export type TransactionID = string; -/** - * Index of this transaction in its Bitcoin block - */ -export type TransactionIndex = number; -/** - * Bitcoin transaction output number - */ -export type OutputNumber = number; -/** - * Bitcoin transaction output - */ -export type TransactionOutput = string; -/** - * Bitcoin transaction timestamp - */ -export type Timestamp = number; - -export interface PaginatedEtchingsResponse { - limit: number; - offset: number; - total: number; - results: { - id: ID; - name: Name; - spaced_name: SpacedName; - number: Number; - divisibility: Divisibility; - symbol: Symbol; - turbo: Turbo; - mint_terms: MintTerms; - supply: SupplyInformation; - location: TransactionLocation; - }[]; -} -/** - * Rune mint terms - */ -export interface MintTerms { - amount: MintAmount | null; - cap: MintCap | null; - height_start: MintBlockHeightStart | null; - height_end: MintBlockHeightEnd | null; - offset_start: MintBlockHeightOffsetStart | null; - offset_end: MintBlockHeightOffsetEnd | null; -} -/** - * Rune supply information - */ -export interface SupplyInformation { - current: CurrentSupply; - minted: MintedAmount; - total_mints: TotalMints; - mint_percentage: MintPercentage; - mintable: Mintable; - burned: BurnedAmount; - total_burns: TotalBurns; - premine: PremineAmount; -} -/** - * Location of the transaction which confirmed this operation - */ -export interface TransactionLocation { - block_hash: BlockHash; - block_height: BlockHeight; - tx_id: TransactionID; - tx_index: TransactionIndex; - vout?: OutputNumber; - output?: TransactionOutput; - timestamp: Timestamp; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/bitcoin/runes/api/etchings/index.mdx b/content/docs/bitcoin/runes/api/etchings/index.mdx index 794b099d9..b967d8712 100644 --- a/content/docs/bitcoin/runes/api/etchings/index.mdx +++ b/content/docs/bitcoin/runes/api/etchings/index.mdx @@ -1,6 +1,6 @@ --- title: Etchings index: true -toc: false +full: true description: Retrieves information about Rune etchings. --- diff --git a/content/docs/bitcoin/runes/api/info/index.mdx b/content/docs/bitcoin/runes/api/info/index.mdx index fcce4b16d..294c0490a 100644 --- a/content/docs/bitcoin/runes/api/info/index.mdx +++ b/content/docs/bitcoin/runes/api/info/index.mdx @@ -1,6 +1,6 @@ --- title: Status index: true -toc: false +full: true description: Retrieves information about the Rune API status. --- diff --git a/content/docs/bitcoin/runes/api/info/status.mdx b/content/docs/bitcoin/runes/api/info/status.mdx index 7abc0108c..fe42ff81f 100644 --- a/content/docs/bitcoin/runes/api/info/status.mdx +++ b/content/docs/bitcoin/runes/api/info/status.mdx @@ -1,107 +1,11 @@ --- title: Get API Status description: Retrieves the status of the API. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## API Status - -Displays the status of the API - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/runes/v1/" -``` - - - - - -```js -fetch("https://api.hiro.so/runes/v1/", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "server_version": "", - "status": "string", - "block_height": 0 -} -``` - - - - - -```ts -export interface ApiStatusResponse { - server_version: string; - status: string; - block_height?: number; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/api/accounts/assets.mdx b/content/docs/stacks/api/accounts/assets.mdx deleted file mode 100644 index 6abfbee24..000000000 --- a/content/docs/stacks/api/accounts/assets.mdx +++ /dev/null @@ -1,287 +0,0 @@ ---- -title: Get account assets -description: Retrieves a list of all asset events associated with an account or a contract identifier. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get account assets - -Retrieves a list of all assets events associated with an account or a Contract Identifier. This includes Transfers, Mints. - -### Query Parameters - - - -Results per page - -Default: `20` - -Minimum: `0` - -Maximum: `100` - - - - - -Result offset - -Default: `0` - -Minimum: `0` - - - - - -Include data from unanchored (i.e. unconfirmed) microblocks - -Default: `false` - - - - - -Block hash or block height. Return data representing the state up until that point in time, rather than the current block. Note - Use either of the query parameters but not both at a time. - - - -### Path Parameters - - - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Default Response | -| `4XX` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/assets?limit=20&offset=0&unanchored=false&until_block=string" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/assets?limit=20&offset=0&unanchored=false&until_block=string", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "event_index": 0, - "event_type": "smart_contract_log", - "tx_id": "string", - "contract_log": { - "contract_id": "string", - "topic": "string", - "value": { - "hex": "string", - "repr": "string" - } - } - } - ] -} -``` - - - - - -```ts -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent = AbstractTransactionEvent & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent = AbstractTransactionEvent1 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent = AbstractTransactionEvent2 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent = AbstractTransactionEvent3 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent = AbstractTransactionEvent4 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; - -export interface AddressAssetsListResponse { - limit: number; - offset: number; - total: number; - results: ( - | SmartContractLogTransactionEvent - | StxLockTransactionEvent - | StxAssetTransactionEvent - | FungibleTokenAssetTransactionEvent - | NonFungibleTokenAssetTransactionEvent - )[]; -} -export interface AbstractTransactionEvent { - event_index: number; -} -export interface AbstractTransactionEvent1 { - event_index: number; -} -export interface AbstractTransactionEvent2 { - event_index: number; -} -export interface AbstractTransactionEvent3 { - event_index: number; -} -export interface AbstractTransactionEvent4 { - event_index: number; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "string", - "message": "string" -} -``` - - - - - -```ts -export interface ErrorResponse { - error: string; - message?: string; - [k: string]: unknown; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/accounts/balances.mdx b/content/docs/stacks/api/accounts/balances.mdx deleted file mode 100644 index 978ed7eec..000000000 --- a/content/docs/stacks/api/accounts/balances.mdx +++ /dev/null @@ -1,292 +0,0 @@ ---- -title: Get user balances -description: Retrieves account balance information, including STX, fungible, and non-fungible tokens. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get account balances - -**NOTE:** This endpoint is deprecated in favor of [Get address FT balances](/stacks/api/accounts/principal-ft-balances). - - Retrieves total account balance information for a given Address or Contract Identifier. This includes the balances of STX Tokens, Fungible Tokens and Non-Fungible Tokens for the account. - -### Query Parameters - - - -Include data from unanchored (i.e. unconfirmed) microblocks - -Default: `false` - - - - - -Block hash or block height. Return data representing the state up until that point in time, rather than the current block. Note - Use either of the query parameters but not both at a time. - - - -### Path Parameters - - - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | GET request that returns address balances | -| `4XX` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/balances?unanchored=false&until_block=string" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/balances?unanchored=false&until_block=string", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns address balances - - - - - -```json -{ - "stx": { - "balance": "string", - "estimated_balance": "string", - "pending_balance_inbound": "string", - "pending_balance_outbound": "string", - "total_sent": "string", - "total_received": "string", - "total_fees_sent": "string", - "total_miner_rewards_received": "string", - "lock_tx_id": "string", - "locked": "string", - "lock_height": 0, - "burnchain_lock_height": 0, - "burnchain_unlock_height": 0 - }, - "fungible_tokens": { - "property1": { - "balance": "string", - "total_sent": "string", - "total_received": "string" - }, - "property2": { - "balance": "string", - "total_sent": "string", - "total_received": "string" - } - }, - "non_fungible_tokens": { - "property1": { - "count": "string", - "total_sent": "string", - "total_received": "string" - }, - "property2": { - "count": "string", - "total_sent": "string", - "total_received": "string" - } - }, - "token_offering_locked": { - "total_locked": "string", - "total_unlocked": "string", - "unlock_schedule": [ - { - "amount": "string", - "block_height": 0 - } - ] - } -} -``` - - - - - -```ts -/** - * GET request that returns address balances - */ -export interface AddressBalanceResponse { - stx: StxBalance; - fungible_tokens: { - [k: string]: FtBalance; - }; - non_fungible_tokens: { - [k: string]: NftBalance; - }; - token_offering_locked?: AddressTokenOfferingLocked; -} -export interface StxBalance { - balance: string; - /** - * Total STX balance considering pending mempool transactions - */ - estimated_balance?: string; - /** - * Inbound STX balance from pending mempool transactions - */ - pending_balance_inbound?: string; - /** - * Outbound STX balance from pending mempool transactions - */ - pending_balance_outbound?: string; - total_sent?: string; - total_received?: string; - total_fees_sent?: string; - total_miner_rewards_received: string; - /** - * The transaction where the lock event occurred. Empty if no tokens are locked. - */ - lock_tx_id: string; - /** - * The amount of locked STX, as string quoted micro-STX. Zero if no tokens are locked. - */ - locked: string; - /** - * The STX chain block height of when the lock event occurred. Zero if no tokens are locked. - */ - lock_height: number; - /** - * The burnchain block height of when the lock event occurred. Zero if no tokens are locked. - */ - burnchain_lock_height: number; - /** - * The burnchain block height of when the tokens unlock. Zero if no tokens are locked. - */ - burnchain_unlock_height: number; -} -export interface FtBalance { - balance: string; - total_sent: string; - total_received: string; -} -export interface NftBalance { - count: string; - total_sent: string; - total_received: string; -} -/** - * Token Offering Locked - */ -export interface AddressTokenOfferingLocked { - /** - * Micro-STX amount still locked at current block height. - */ - total_locked: string; - /** - * Micro-STX amount unlocked at current block height. - */ - total_unlocked: string; - unlock_schedule: AddressUnlockSchedule[]; -} -/** - * Unlock schedule amount and block height - */ -export interface AddressUnlockSchedule { - /** - * Micro-STX amount locked at this block height. - */ - amount: string; - block_height: number; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "string", - "message": "string" -} -``` - - - - - -```ts -export interface ErrorResponse { - error: string; - message?: string; - [k: string]: unknown; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/accounts/inbound-stx-transfers.mdx b/content/docs/stacks/api/accounts/inbound-stx-transfers.mdx deleted file mode 100644 index bdf74d141..000000000 --- a/content/docs/stacks/api/accounts/inbound-stx-transfers.mdx +++ /dev/null @@ -1,232 +0,0 @@ ---- -title: Get inbound STX transfers -description: Retrieves a list of STX transfers with memos to the given principal. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get inbound STX transfers - -Retrieves a list of STX transfers with memos to the given principal. This includes regular transfers from a stx-transfer transaction type, - and transfers from contract-call transactions a the `send-many-memo` bulk sending contract. - -### Query Parameters - - - -Results per page - -Default: `20` - -Minimum: `0` - -Maximum: `50` - - - - - -Result offset - -Default: `0` - -Minimum: `0` - - - - - -Filter for transactions only at this given block height - - - - - -Include data from unanchored (i.e. unconfirmed) microblocks - -Default: `false` - - - - - -Block hash or block height. Return data representing the state up until that point in time, rather than the current block. Note - Use either of the query parameters but not both at a time. - - - -### Path Parameters - - - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Default Response | -| `4XX` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/stx_inbound?limit=20&offset=0&height=0&unanchored=false&until_block=string" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/stx_inbound?limit=20&offset=0&height=0&unanchored=false&until_block=string", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "sender": "string", - "amount": "string", - "memo": "string", - "block_height": 0, - "tx_id": "string", - "transfer_type": "bulk-send", - "tx_index": 0 - } - ] -} -``` - - - - - -```ts -export interface AddressStxInboundListResponse { - limit: number; - offset: number; - total: number; - results: InboundStxTransfer[]; -} -export interface InboundStxTransfer { - /** - * Principal that sent this transfer - */ - sender: string; - /** - * Transfer amount in micro-STX as integer string - */ - amount: string; - /** - * Hex encoded memo bytes associated with the transfer - */ - memo: string; - /** - * Block height at which this transfer occurred - */ - block_height: number; - /** - * The transaction ID in which this transfer occurred - */ - tx_id: string; - /** - * Indicates if the transfer is from a stx-transfer transaction or a contract-call transaction - */ - transfer_type: "bulk-send" | "stx-transfer" | "stx-transfer-memo"; - /** - * Index of the transaction within a block - */ - tx_index: number; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "string", - "message": "string" -} -``` - - - - - -```ts -export interface ErrorResponse { - error: string; - message?: string; - [k: string]: unknown; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/accounts/index.mdx b/content/docs/stacks/api/accounts/index.mdx deleted file mode 100644 index 3473a5c39..000000000 --- a/content/docs/stacks/api/accounts/index.mdx +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Accounts -index: true -toc: false -description: Manage account balances, transactions, nonces, assets, and related information. ---- \ No newline at end of file diff --git a/content/docs/stacks/api/accounts/latest-nonce.mdx b/content/docs/stacks/api/accounts/latest-nonce.mdx deleted file mode 100644 index fcae1fb94..000000000 --- a/content/docs/stacks/api/accounts/latest-nonce.mdx +++ /dev/null @@ -1,183 +0,0 @@ ---- -title: Get the latest nonce -description: Retrieves the latest nonce values used by an account by inspecting the mempool and anchored transactions. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get the latest nonce used by an account - -Retrieves the latest nonce values used by an account by inspecting the mempool, microblock transactions, and anchored transactions. - -### Query Parameters - - - -Optionally get the nonce at a given block height. - -Minimum: `1` - - - - - -Optionally get the nonce at a given block hash. Note - Use either of the query parameters but not both at a time. - - - -### Path Parameters - - - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | The latest nonce values used by an account by inspecting the mempool, microblock transactions, and anchored transactions | -| `4XX` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/nonces?block_height=1&block_hash=string" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/nonces?block_height=1&block_hash=string", { - method: "GET" -}); -``` - - - - - - - - - -The latest nonce values used by an account by inspecting the mempool, microblock transactions, and anchored transactions - - - - - -```json -{ - "last_mempool_tx_nonce": 0, - "last_executed_tx_nonce": 0, - "possible_next_nonce": 0, - "detected_missing_nonces": [ - 0 - ], - "detected_mempool_nonces": [ - 0 - ] -} -``` - - - - - -```ts -/** - * The latest nonce values used by an account by inspecting the mempool, microblock transactions, and anchored transactions - */ -export interface AddressNonces { - last_mempool_tx_nonce: number | null; - last_executed_tx_nonce: number | null; - /** - * The likely nonce required for creating the next transaction, based on the last nonces seen by the API. This can be incorrect if the API's mempool or transactions aren't fully synchronized, even by a small amount, or if a previous transaction is still propagating through the Stacks blockchain network when this endpoint is called. - */ - possible_next_nonce: number; - /** - * Nonces that appear to be missing and likely causing a mempool transaction to be stuck. - */ - detected_missing_nonces: number[]; - /** - * Nonces currently in mempool for this address. - */ - detected_mempool_nonces: number[]; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "string", - "message": "string" -} -``` - - - - - -```ts -export interface ErrorResponse { - error: string; - message?: string; - [k: string]: unknown; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/accounts/principal-ft-balance.mdx b/content/docs/stacks/api/accounts/principal-ft-balance.mdx deleted file mode 100644 index c1c6a2e87..000000000 --- a/content/docs/stacks/api/accounts/principal-ft-balance.mdx +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: Get principal FT balance -description: Retrieves a specific fungible-token balance for a given principal. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get principal FT balance - -Retrieves a specific fungible-token balance for a given principal. - -### Path Parameters - - - - - - - -fungible token identifier - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Default Response | -| `4XX` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/extended/v2/addresses/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/balances/ft/string" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/addresses/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/balances/ft/string", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "balance": "string" -} -``` - - - - - -```ts -export interface Response { - balance: string; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "string", - "message": "string" -} -``` - - - - - -```ts -export interface ErrorResponse { - error: string; - message?: string; - [k: string]: unknown; -} -``` - - - - - - - - - - - - - - \ No newline at end of file diff --git a/content/docs/stacks/api/accounts/principal-ft-balances.mdx b/content/docs/stacks/api/accounts/principal-ft-balances.mdx deleted file mode 100644 index 474fd1e8f..000000000 --- a/content/docs/stacks/api/accounts/principal-ft-balances.mdx +++ /dev/null @@ -1,179 +0,0 @@ ---- -title: Get principal FT balances -description: Retrieves Fungible-token account balance information for a given Address or Contract Identifier. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get principal FT balances - -Retrieves Fungible-token account balance information for a given Address or Contract Identifier. - -### Query Parameters - - - -Results per page - -Default: `100` - -Minimum: `0` - -Maximum: `200` - - - - - -Result offset - -Default: `0` - -Minimum: `0` - - - -### Path Parameters - - - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Default Response | -| `4XX` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/extended/v2/addresses/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/balances/ft?limit=100&offset=0" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/addresses/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/balances/ft?limit=100&offset=0", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "token": "string", - "balance": "string" - } - ] -} -``` - - - - - -```ts -export interface Response { - limit: number; - offset: number; - total: number; - results: { - token: string; - balance: string; - }[]; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "string", - "message": "string" -} -``` - - - - - -```ts -export interface ErrorResponse { - error: string; - message?: string; - [k: string]: unknown; -} -``` - - - - - - - - - - - - - - \ No newline at end of file diff --git a/content/docs/stacks/api/accounts/principal-stx-balance.mdx b/content/docs/stacks/api/accounts/principal-stx-balance.mdx deleted file mode 100644 index 53d1ad63c..000000000 --- a/content/docs/stacks/api/accounts/principal-stx-balance.mdx +++ /dev/null @@ -1,199 +0,0 @@ ---- -title: Get principal STX balance -description: Retrieves STX account balance information for a given Address or Contract Identifier. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get principal STX balance - -Retrieves STX account balance information for a given Address or Contract Identifier. - -### Query Parameters - - - -Include pending mempool transactions in the balance calculation - -Default: `false` - - - -### Path Parameters - - - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Default Response | -| `4XX` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/extended/v2/addresses/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/balances/stx?include_mempool=false" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/addresses/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/balances/stx?include_mempool=false", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "balance": "string", - "estimated_balance": "string", - "pending_balance_inbound": "string", - "pending_balance_outbound": "string", - "total_sent": "string", - "total_received": "string", - "total_fees_sent": "string", - "total_miner_rewards_received": "string", - "lock_tx_id": "string", - "locked": "string", - "lock_height": 0, - "burnchain_lock_height": 0, - "burnchain_unlock_height": 0 -} -``` - - - - - -```ts -export interface StxBalance { - balance: string; - /** - * Total STX balance considering pending mempool transactions - */ - estimated_balance?: string; - /** - * Inbound STX balance from pending mempool transactions - */ - pending_balance_inbound?: string; - /** - * Outbound STX balance from pending mempool transactions - */ - pending_balance_outbound?: string; - total_sent?: string; - total_received?: string; - total_fees_sent?: string; - total_miner_rewards_received: string; - /** - * The transaction where the lock event occurred. Empty if no tokens are locked. - */ - lock_tx_id: string; - /** - * The amount of locked STX, as string quoted micro-STX. Zero if no tokens are locked. - */ - locked: string; - /** - * The STX chain block height of when the lock event occurred. Zero if no tokens are locked. - */ - lock_height: number; - /** - * The burnchain block height of when the lock event occurred. Zero if no tokens are locked. - */ - burnchain_lock_height: number; - /** - * The burnchain block height of when the tokens unlock. Zero if no tokens are locked. - */ - burnchain_unlock_height: number; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "string", - "message": "string" -} -``` - - - - - -```ts -export interface ErrorResponse { - error: string; - message?: string; - [k: string]: unknown; -} -``` - - - - - - - - - - - - - - \ No newline at end of file diff --git a/content/docs/stacks/api/accounts/stx-balances.mdx b/content/docs/stacks/api/accounts/stx-balances.mdx deleted file mode 100644 index 72e4c160f..000000000 --- a/content/docs/stacks/api/accounts/stx-balances.mdx +++ /dev/null @@ -1,250 +0,0 @@ ---- -title: Get account STX balance -description: Retrieves the STX token balance for a specified address or contract identifier. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get account STX balance - -**NOTE:** This endpoint is deprecated in favor of [Get address STX balance](/stacks/api/accounts/principal-stx-balance). - -Retrieves STX token balance for a given Address or Contract Identifier. - -### Query Parameters - - - -Include data from unanchored (i.e. unconfirmed) microblocks - -Default: `false` - - - - - -Block hash or block height. Return data representing the state up until that point in time, rather than the current block. Note - Use either of the query parameters but not both at a time. - - - -### Path Parameters - - - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | GET request that returns address balances | -| `4XX` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/stx?unanchored=false&until_block=string" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/stx?unanchored=false&until_block=string", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns address balances - - - - - -```json -{ - "balance": "string", - "estimated_balance": "string", - "pending_balance_inbound": "string", - "pending_balance_outbound": "string", - "total_sent": "string", - "total_received": "string", - "total_fees_sent": "string", - "total_miner_rewards_received": "string", - "lock_tx_id": "string", - "locked": "string", - "lock_height": 0, - "burnchain_lock_height": 0, - "burnchain_unlock_height": 0, - "token_offering_locked": { - "total_locked": "string", - "total_unlocked": "string", - "unlock_schedule": [ - { - "amount": "string", - "block_height": 0 - } - ] - } -} -``` - - - - - -```ts -/** - * GET request that returns address balances - */ -export type AddressStxBalance = StxBalance & { - token_offering_locked?: AddressTokenOfferingLocked; -}; - -export interface StxBalance { - balance: string; - /** - * Total STX balance considering pending mempool transactions - */ - estimated_balance?: string; - /** - * Inbound STX balance from pending mempool transactions - */ - pending_balance_inbound?: string; - /** - * Outbound STX balance from pending mempool transactions - */ - pending_balance_outbound?: string; - total_sent?: string; - total_received?: string; - total_fees_sent?: string; - total_miner_rewards_received: string; - /** - * The transaction where the lock event occurred. Empty if no tokens are locked. - */ - lock_tx_id: string; - /** - * The amount of locked STX, as string quoted micro-STX. Zero if no tokens are locked. - */ - locked: string; - /** - * The STX chain block height of when the lock event occurred. Zero if no tokens are locked. - */ - lock_height: number; - /** - * The burnchain block height of when the lock event occurred. Zero if no tokens are locked. - */ - burnchain_lock_height: number; - /** - * The burnchain block height of when the tokens unlock. Zero if no tokens are locked. - */ - burnchain_unlock_height: number; -} -/** - * Token Offering Locked - */ -export interface AddressTokenOfferingLocked { - /** - * Micro-STX amount still locked at current block height. - */ - total_locked: string; - /** - * Micro-STX amount unlocked at current block height. - */ - total_unlocked: string; - unlock_schedule: AddressUnlockSchedule[]; -} -/** - * Unlock schedule amount and block height - */ -export interface AddressUnlockSchedule { - /** - * Micro-STX amount locked at this block height. - */ - amount: string; - block_height: number; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "string", - "message": "string" -} -``` - - - - - -```ts -export interface ErrorResponse { - error: string; - message?: string; - [k: string]: unknown; -} -``` - - - - - - - - - - - - - - \ No newline at end of file diff --git a/content/docs/stacks/api/accounts/transaction-with-transfers.mdx b/content/docs/stacks/api/accounts/transaction-with-transfers.mdx deleted file mode 100644 index f252bd9d5..000000000 --- a/content/docs/stacks/api/accounts/transaction-with-transfers.mdx +++ /dev/null @@ -1,2220 +0,0 @@ ---- -title: Get account transaction with transfers -description: Retrieves transaction details for a specific transaction including STX transfers for each transaction. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get account transaction information for specific transaction - -**NOTE:** This endpoint is deprecated in favor of [Get events for an address transaction](/api/get-address-transaction-events). - - Retrieves transaction details for a given Transaction Id `tx_id`, for a given account or contract Identifier. - -### Path Parameters - - - - - - - -Transaction ID - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Transaction with STX transfers for a given address | -| `4XX` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/string/with_transfers" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/string/with_transfers", { - method: "GET" -}); -``` - - - - - - - - - -Transaction with STX transfers for a given address - - - - - -```json -{ - "tx": { - "tx_id": "string", - "nonce": 0, - "fee_rate": "string", - "sender_address": "string", - "sponsor_nonce": 0, - "sponsored": true, - "sponsor_address": "string", - "post_condition_mode": "allow", - "post_conditions": [ - { - "principal": { - "type_id": "principal_origin" - }, - "condition_code": "sent_equal_to", - "amount": "string", - "type": "stx" - } - ], - "anchor_mode": "on_chain_only", - "block_hash": "string", - "block_height": 0, - "block_time": 0, - "block_time_iso": "string", - "burn_block_time": 0, - "burn_block_height": 0, - "burn_block_time_iso": "string", - "parent_burn_block_time": 0, - "parent_burn_block_time_iso": "string", - "canonical": true, - "tx_index": 0, - "tx_status": "success", - "tx_result": { - "hex": "string", - "repr": "string" - }, - "event_count": 0, - "parent_block_hash": "string", - "is_unanchored": true, - "microblock_hash": "string", - "microblock_sequence": 0, - "microblock_canonical": true, - "execution_cost_read_count": 0, - "execution_cost_read_length": 0, - "execution_cost_runtime": 0, - "execution_cost_write_count": 0, - "execution_cost_write_length": 0, - "events": [ - { - "event_index": 0, - "event_type": "smart_contract_log", - "tx_id": "string", - "contract_log": { - "contract_id": "string", - "topic": "string", - "value": { - "hex": "string", - "repr": "string" - } - } - } - ], - "tx_type": "token_transfer", - "token_transfer": { - "recipient_address": "string", - "amount": "string", - "memo": "string" - } - }, - "stx_sent": "string", - "stx_received": "string", - "stx_transfers": [ - { - "amount": "string", - "sender": "string", - "recipient": "string" - } - ], - "ft_transfers": [ - { - "amount": "string", - "asset_identifier": "string", - "sender": "string", - "recipient": "string" - } - ], - "nft_transfers": [ - { - "value": { - "hex": "string", - "repr": "string" - }, - "asset_identifier": "string", - "sender": "string", - "recipient": "string" - } - ] -} -``` - - - - - -```ts -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent = AbstractTransactionEvent & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent = AbstractTransactionEvent1 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent = AbstractTransactionEvent2 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent = AbstractTransactionEvent3 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent = AbstractTransactionEvent4 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent1 = AbstractTransactionEvent5 & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent1 = AbstractTransactionEvent6 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent1 = AbstractTransactionEvent7 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent1 = AbstractTransactionEvent8 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent1 = AbstractTransactionEvent9 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent2 = AbstractTransactionEvent10 & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent2 = AbstractTransactionEvent11 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent2 = AbstractTransactionEvent12 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent2 = AbstractTransactionEvent13 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent2 = AbstractTransactionEvent14 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent3 = AbstractTransactionEvent15 & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent3 = AbstractTransactionEvent16 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent3 = AbstractTransactionEvent17 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent3 = AbstractTransactionEvent18 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent3 = AbstractTransactionEvent19 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent4 = AbstractTransactionEvent20 & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent4 = AbstractTransactionEvent21 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent4 = AbstractTransactionEvent22 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent4 = AbstractTransactionEvent23 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent4 = AbstractTransactionEvent24 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent5 = AbstractTransactionEvent25 & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent5 = AbstractTransactionEvent26 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent5 = AbstractTransactionEvent27 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent5 = AbstractTransactionEvent28 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent5 = AbstractTransactionEvent29 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; - -/** - * Transaction with STX transfers for a given address - */ -export interface AddressTransactionWithTransfers { - tx: - | TokenTransferTransaction - | SmartContractTransaction - | ContractCallTransaction - | PoisonMicroblockTransaction - | CoinbaseTransaction - | TenureChangeTransaction; - /** - * Total sent from the given address, including the tx fee, in micro-STX as an integer string. - */ - stx_sent: string; - /** - * Total received by the given address in micro-STX as an integer string. - */ - stx_received: string; - stx_transfers: { - /** - * Amount transferred in micro-STX as an integer string. - */ - amount: string; - /** - * Principal that sent STX. This is unspecified if the STX were minted. - */ - sender?: string; - /** - * Principal that received STX. This is unspecified if the STX were burned. - */ - recipient?: string; - }[]; - ft_transfers?: { - /** - * Amount transferred as an integer string. This balance does not factor in possible SIP-010 decimals. - */ - amount: string; - /** - * Fungible Token asset identifier. - */ - asset_identifier: string; - /** - * Principal that sent the asset. - */ - sender?: string; - /** - * Principal that received the asset. - */ - recipient?: string; - }[]; - nft_transfers?: { - /** - * Non Fungible Token asset value. - */ - value: { - hex: string; - repr: string; - }; - /** - * Non Fungible Token asset identifier. - */ - asset_identifier: string; - /** - * Principal that sent the asset. - */ - sender?: string; - /** - * Principal that received the asset. - */ - recipient?: string; - }[]; -} -export interface TokenTransferTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent - | StxLockTransactionEvent - | StxAssetTransactionEvent - | FungibleTokenAssetTransactionEvent - | NonFungibleTokenAssetTransactionEvent - )[]; - tx_type: "token_transfer"; - token_transfer: { - recipient_address: string; - /** - * Transfer amount as Integer string (64-bit unsigned integer) - */ - amount: string; - /** - * Hex encoded arbitrary message, up to 34 bytes length (should try decoding to an ASCII string) - */ - memo: string; - }; -} -export interface AbstractTransactionEvent { - event_index: number; -} -export interface AbstractTransactionEvent1 { - event_index: number; -} -export interface AbstractTransactionEvent2 { - event_index: number; -} -export interface AbstractTransactionEvent3 { - event_index: number; -} -export interface AbstractTransactionEvent4 { - event_index: number; -} -export interface SmartContractTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent1 - | StxLockTransactionEvent1 - | StxAssetTransactionEvent1 - | FungibleTokenAssetTransactionEvent1 - | NonFungibleTokenAssetTransactionEvent1 - )[]; - tx_type: "smart_contract"; - smart_contract: { - clarity_version: number | null; - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Clarity code of the smart contract being deployed - */ - source_code: string; - }; -} -export interface AbstractTransactionEvent5 { - event_index: number; -} -export interface AbstractTransactionEvent6 { - event_index: number; -} -export interface AbstractTransactionEvent7 { - event_index: number; -} -export interface AbstractTransactionEvent8 { - event_index: number; -} -export interface AbstractTransactionEvent9 { - event_index: number; -} -export interface ContractCallTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent2 - | StxLockTransactionEvent2 - | StxAssetTransactionEvent2 - | FungibleTokenAssetTransactionEvent2 - | NonFungibleTokenAssetTransactionEvent2 - )[]; - tx_type: "contract_call"; - contract_call: { - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Name of the Clarity function to be invoked - */ - function_name: string; - /** - * Function definition, including function name and type as well as parameter names and types - */ - function_signature: string; - function_args?: { - hex: string; - repr: string; - name: string; - type: string; - }[]; - }; -} -export interface AbstractTransactionEvent10 { - event_index: number; -} -export interface AbstractTransactionEvent11 { - event_index: number; -} -export interface AbstractTransactionEvent12 { - event_index: number; -} -export interface AbstractTransactionEvent13 { - event_index: number; -} -export interface AbstractTransactionEvent14 { - event_index: number; -} -export interface PoisonMicroblockTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent3 - | StxLockTransactionEvent3 - | StxAssetTransactionEvent3 - | FungibleTokenAssetTransactionEvent3 - | NonFungibleTokenAssetTransactionEvent3 - )[]; - tx_type: "poison_microblock"; - poison_microblock: { - /** - * Hex encoded microblock header - */ - microblock_header_1: string; - /** - * Hex encoded microblock header - */ - microblock_header_2: string; - }; -} -export interface AbstractTransactionEvent15 { - event_index: number; -} -export interface AbstractTransactionEvent16 { - event_index: number; -} -export interface AbstractTransactionEvent17 { - event_index: number; -} -export interface AbstractTransactionEvent18 { - event_index: number; -} -export interface AbstractTransactionEvent19 { - event_index: number; -} -export interface CoinbaseTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent4 - | StxLockTransactionEvent4 - | StxAssetTransactionEvent4 - | FungibleTokenAssetTransactionEvent4 - | NonFungibleTokenAssetTransactionEvent4 - )[]; - tx_type: "coinbase"; - coinbase_payload: { - /** - * Hex encoded 32-byte scratch space for block leader's use - */ - data: string; - alt_recipient?: string | null; - vrf_proof?: string | null; - }; -} -export interface AbstractTransactionEvent20 { - event_index: number; -} -export interface AbstractTransactionEvent21 { - event_index: number; -} -export interface AbstractTransactionEvent22 { - event_index: number; -} -export interface AbstractTransactionEvent23 { - event_index: number; -} -export interface AbstractTransactionEvent24 { - event_index: number; -} -export interface TenureChangeTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent5 - | StxLockTransactionEvent5 - | StxAssetTransactionEvent5 - | FungibleTokenAssetTransactionEvent5 - | NonFungibleTokenAssetTransactionEvent5 - )[]; - tx_type: "tenure_change"; - tenure_change_payload: { - /** - * Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. - */ - tenure_consensus_hash: string; - /** - * Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. - */ - prev_tenure_consensus_hash: string; - /** - * Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. - */ - burn_view_consensus_hash: string; - /** - * (Hex string) Stacks Block hash - */ - previous_tenure_end: string; - /** - * The number of blocks produced in the previous tenure. - */ - previous_tenure_blocks: number; - /** - * Cause of change in mining tenure. Depending on cause, tenure can be ended or extended. - */ - cause: "block_found" | "extended"; - /** - * (Hex string) The ECDSA public key hash of the current tenure. - */ - pubkey_hash: string; - }; -} -export interface AbstractTransactionEvent25 { - event_index: number; -} -export interface AbstractTransactionEvent26 { - event_index: number; -} -export interface AbstractTransactionEvent27 { - event_index: number; -} -export interface AbstractTransactionEvent28 { - event_index: number; -} -export interface AbstractTransactionEvent29 { - event_index: number; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "string", - "message": "string" -} -``` - - - - - -```ts -export interface ErrorResponse { - error: string; - message?: string; - [k: string]: unknown; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/accounts/transactions-with-transfers.mdx b/content/docs/stacks/api/accounts/transactions-with-transfers.mdx deleted file mode 100644 index 00c7c70c3..000000000 --- a/content/docs/stacks/api/accounts/transactions-with-transfers.mdx +++ /dev/null @@ -1,2267 +0,0 @@ ---- -title: Get account transactions with transfers -description: Retrieves transactions for a specific account including STX transfers for each transaction. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get account transactions including STX transfers for each transaction. - -Retrieve all transactions for an account or contract identifier including STX transfers for each transaction. - -### Query Parameters - - - -Results per page - -Default: `20` - -Minimum: `0` - -Maximum: `50` - - - - - -Result offset - -Default: `0` - -Minimum: `0` - - - - - -Filter for transactions only at this given block height - - - - - -Include data from unanchored (i.e. unconfirmed) microblocks - -Default: `false` - - - - - -Block hash or block height. Return data representing the state up until that point in time, rather than the current block. Note - Use either of the query parameters but not both at a time. - - - -### Path Parameters - - - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Default Response | -| `4XX` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/transactions_with_transfers?limit=20&offset=0&height=0&unanchored=false&until_block=string" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/transactions_with_transfers?limit=20&offset=0&height=0&unanchored=false&until_block=string", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "tx": { - "tx_id": "string", - "nonce": 0, - "fee_rate": "string", - "sender_address": "string", - "sponsor_nonce": 0, - "sponsored": true, - "sponsor_address": "string", - "post_condition_mode": "allow", - "post_conditions": [ - { - "principal": { - "type_id": "principal_origin" - }, - "condition_code": "sent_equal_to", - "amount": "string", - "type": "stx" - } - ], - "anchor_mode": "on_chain_only", - "block_hash": "string", - "block_height": 0, - "block_time": 0, - "block_time_iso": "string", - "burn_block_time": 0, - "burn_block_height": 0, - "burn_block_time_iso": "string", - "parent_burn_block_time": 0, - "parent_burn_block_time_iso": "string", - "canonical": true, - "tx_index": 0, - "tx_status": "success", - "tx_result": { - "hex": "string", - "repr": "string" - }, - "event_count": 0, - "parent_block_hash": "string", - "is_unanchored": true, - "microblock_hash": "string", - "microblock_sequence": 0, - "microblock_canonical": true, - "execution_cost_read_count": 0, - "execution_cost_read_length": 0, - "execution_cost_runtime": 0, - "execution_cost_write_count": 0, - "execution_cost_write_length": 0, - "events": [ - { - "event_index": 0, - "event_type": "smart_contract_log", - "tx_id": "string", - "contract_log": { - "contract_id": "string", - "topic": "string", - "value": { - "hex": "string", - "repr": "string" - } - } - } - ], - "tx_type": "token_transfer", - "token_transfer": { - "recipient_address": "string", - "amount": "string", - "memo": "string" - } - }, - "stx_sent": "string", - "stx_received": "string", - "stx_transfers": [ - { - "amount": "string", - "sender": "string", - "recipient": "string" - } - ], - "ft_transfers": [ - { - "amount": "string", - "asset_identifier": "string", - "sender": "string", - "recipient": "string" - } - ], - "nft_transfers": [ - { - "value": { - "hex": "string", - "repr": "string" - }, - "asset_identifier": "string", - "sender": "string", - "recipient": "string" - } - ] - } - ] -} -``` - - - - - -```ts -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent = AbstractTransactionEvent & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent = AbstractTransactionEvent1 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent = AbstractTransactionEvent2 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent = AbstractTransactionEvent3 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent = AbstractTransactionEvent4 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent1 = AbstractTransactionEvent5 & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent1 = AbstractTransactionEvent6 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent1 = AbstractTransactionEvent7 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent1 = AbstractTransactionEvent8 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent1 = AbstractTransactionEvent9 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent2 = AbstractTransactionEvent10 & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent2 = AbstractTransactionEvent11 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent2 = AbstractTransactionEvent12 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent2 = AbstractTransactionEvent13 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent2 = AbstractTransactionEvent14 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent3 = AbstractTransactionEvent15 & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent3 = AbstractTransactionEvent16 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent3 = AbstractTransactionEvent17 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent3 = AbstractTransactionEvent18 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent3 = AbstractTransactionEvent19 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent4 = AbstractTransactionEvent20 & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent4 = AbstractTransactionEvent21 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent4 = AbstractTransactionEvent22 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent4 = AbstractTransactionEvent23 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent4 = AbstractTransactionEvent24 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent5 = AbstractTransactionEvent25 & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent5 = AbstractTransactionEvent26 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent5 = AbstractTransactionEvent27 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent5 = AbstractTransactionEvent28 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent5 = AbstractTransactionEvent29 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; - -export interface AddressTransactionsWithTransfersListResponse { - limit: number; - offset: number; - total: number; - results: AddressTransactionWithTransfers[]; -} -/** - * Transaction with STX transfers for a given address - */ -export interface AddressTransactionWithTransfers { - tx: - | TokenTransferTransaction - | SmartContractTransaction - | ContractCallTransaction - | PoisonMicroblockTransaction - | CoinbaseTransaction - | TenureChangeTransaction; - /** - * Total sent from the given address, including the tx fee, in micro-STX as an integer string. - */ - stx_sent: string; - /** - * Total received by the given address in micro-STX as an integer string. - */ - stx_received: string; - stx_transfers: { - /** - * Amount transferred in micro-STX as an integer string. - */ - amount: string; - /** - * Principal that sent STX. This is unspecified if the STX were minted. - */ - sender?: string; - /** - * Principal that received STX. This is unspecified if the STX were burned. - */ - recipient?: string; - }[]; - ft_transfers?: { - /** - * Amount transferred as an integer string. This balance does not factor in possible SIP-010 decimals. - */ - amount: string; - /** - * Fungible Token asset identifier. - */ - asset_identifier: string; - /** - * Principal that sent the asset. - */ - sender?: string; - /** - * Principal that received the asset. - */ - recipient?: string; - }[]; - nft_transfers?: { - /** - * Non Fungible Token asset value. - */ - value: { - hex: string; - repr: string; - }; - /** - * Non Fungible Token asset identifier. - */ - asset_identifier: string; - /** - * Principal that sent the asset. - */ - sender?: string; - /** - * Principal that received the asset. - */ - recipient?: string; - }[]; -} -export interface TokenTransferTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent - | StxLockTransactionEvent - | StxAssetTransactionEvent - | FungibleTokenAssetTransactionEvent - | NonFungibleTokenAssetTransactionEvent - )[]; - tx_type: "token_transfer"; - token_transfer: { - recipient_address: string; - /** - * Transfer amount as Integer string (64-bit unsigned integer) - */ - amount: string; - /** - * Hex encoded arbitrary message, up to 34 bytes length (should try decoding to an ASCII string) - */ - memo: string; - }; -} -export interface AbstractTransactionEvent { - event_index: number; -} -export interface AbstractTransactionEvent1 { - event_index: number; -} -export interface AbstractTransactionEvent2 { - event_index: number; -} -export interface AbstractTransactionEvent3 { - event_index: number; -} -export interface AbstractTransactionEvent4 { - event_index: number; -} -export interface SmartContractTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent1 - | StxLockTransactionEvent1 - | StxAssetTransactionEvent1 - | FungibleTokenAssetTransactionEvent1 - | NonFungibleTokenAssetTransactionEvent1 - )[]; - tx_type: "smart_contract"; - smart_contract: { - clarity_version: number | null; - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Clarity code of the smart contract being deployed - */ - source_code: string; - }; -} -export interface AbstractTransactionEvent5 { - event_index: number; -} -export interface AbstractTransactionEvent6 { - event_index: number; -} -export interface AbstractTransactionEvent7 { - event_index: number; -} -export interface AbstractTransactionEvent8 { - event_index: number; -} -export interface AbstractTransactionEvent9 { - event_index: number; -} -export interface ContractCallTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent2 - | StxLockTransactionEvent2 - | StxAssetTransactionEvent2 - | FungibleTokenAssetTransactionEvent2 - | NonFungibleTokenAssetTransactionEvent2 - )[]; - tx_type: "contract_call"; - contract_call: { - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Name of the Clarity function to be invoked - */ - function_name: string; - /** - * Function definition, including function name and type as well as parameter names and types - */ - function_signature: string; - function_args?: { - hex: string; - repr: string; - name: string; - type: string; - }[]; - }; -} -export interface AbstractTransactionEvent10 { - event_index: number; -} -export interface AbstractTransactionEvent11 { - event_index: number; -} -export interface AbstractTransactionEvent12 { - event_index: number; -} -export interface AbstractTransactionEvent13 { - event_index: number; -} -export interface AbstractTransactionEvent14 { - event_index: number; -} -export interface PoisonMicroblockTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent3 - | StxLockTransactionEvent3 - | StxAssetTransactionEvent3 - | FungibleTokenAssetTransactionEvent3 - | NonFungibleTokenAssetTransactionEvent3 - )[]; - tx_type: "poison_microblock"; - poison_microblock: { - /** - * Hex encoded microblock header - */ - microblock_header_1: string; - /** - * Hex encoded microblock header - */ - microblock_header_2: string; - }; -} -export interface AbstractTransactionEvent15 { - event_index: number; -} -export interface AbstractTransactionEvent16 { - event_index: number; -} -export interface AbstractTransactionEvent17 { - event_index: number; -} -export interface AbstractTransactionEvent18 { - event_index: number; -} -export interface AbstractTransactionEvent19 { - event_index: number; -} -export interface CoinbaseTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent4 - | StxLockTransactionEvent4 - | StxAssetTransactionEvent4 - | FungibleTokenAssetTransactionEvent4 - | NonFungibleTokenAssetTransactionEvent4 - )[]; - tx_type: "coinbase"; - coinbase_payload: { - /** - * Hex encoded 32-byte scratch space for block leader's use - */ - data: string; - alt_recipient?: string | null; - vrf_proof?: string | null; - }; -} -export interface AbstractTransactionEvent20 { - event_index: number; -} -export interface AbstractTransactionEvent21 { - event_index: number; -} -export interface AbstractTransactionEvent22 { - event_index: number; -} -export interface AbstractTransactionEvent23 { - event_index: number; -} -export interface AbstractTransactionEvent24 { - event_index: number; -} -export interface TenureChangeTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent5 - | StxLockTransactionEvent5 - | StxAssetTransactionEvent5 - | FungibleTokenAssetTransactionEvent5 - | NonFungibleTokenAssetTransactionEvent5 - )[]; - tx_type: "tenure_change"; - tenure_change_payload: { - /** - * Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. - */ - tenure_consensus_hash: string; - /** - * Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. - */ - prev_tenure_consensus_hash: string; - /** - * Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. - */ - burn_view_consensus_hash: string; - /** - * (Hex string) Stacks Block hash - */ - previous_tenure_end: string; - /** - * The number of blocks produced in the previous tenure. - */ - previous_tenure_blocks: number; - /** - * Cause of change in mining tenure. Depending on cause, tenure can be ended or extended. - */ - cause: "block_found" | "extended"; - /** - * (Hex string) The ECDSA public key hash of the current tenure. - */ - pubkey_hash: string; - }; -} -export interface AbstractTransactionEvent25 { - event_index: number; -} -export interface AbstractTransactionEvent26 { - event_index: number; -} -export interface AbstractTransactionEvent27 { - event_index: number; -} -export interface AbstractTransactionEvent28 { - event_index: number; -} -export interface AbstractTransactionEvent29 { - event_index: number; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "string", - "message": "string" -} -``` - - - - - -```ts -export interface ErrorResponse { - error: string; - message?: string; - [k: string]: unknown; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/accounts/transactions.mdx b/content/docs/stacks/api/accounts/transactions.mdx deleted file mode 100644 index 5766bb46d..000000000 --- a/content/docs/stacks/api/accounts/transactions.mdx +++ /dev/null @@ -1,2180 +0,0 @@ ---- -title: Get account transactions -description: Retrieves transactions for a specific account. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get account transactions - -**NOTE:** This endpoint is deprecated in favor of [Get address transactions](/api/get-address-transactions). - - Retrieves a list of all Transactions for a given Address or Contract Identifier. More information on Transaction types can be found [here](https://docs.stacks.co/understand-stacks/transactions#types). - - If you need to actively monitor new transactions for an address or contract id, we highly recommend subscribing to [WebSockets or Socket.io](https://github.com/hirosystems/stacks-blockchain-api/tree/master/client) for real-time updates. - -### Query Parameters - - - -Results per page - -Default: `20` - -Minimum: `0` - -Maximum: `50` - - - - - -Result offset - -Default: `0` - -Minimum: `0` - - - - - -Filter for transactions only at this given block height - - - - - -Include data from unanchored (i.e. unconfirmed) microblocks - -Default: `false` - - - - - -Block hash or block height. Return data representing the state up until that point in time, rather than the current block. Note - Use either of the query parameters but not both at a time. - - - -### Path Parameters - - - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | GET request that returns account transactions | -| `4XX` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/transactions?limit=20&offset=0&height=0&unanchored=false&until_block=string" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/address/SP318Q55DEKHRXJK696033DQN5C54D9K2EE6DHRWP/transactions?limit=20&offset=0&height=0&unanchored=false&until_block=string", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns account transactions - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "tx_id": "string", - "nonce": 0, - "fee_rate": "string", - "sender_address": "string", - "sponsor_nonce": 0, - "sponsored": true, - "sponsor_address": "string", - "post_condition_mode": "allow", - "post_conditions": [ - { - "principal": { - "type_id": "principal_origin" - }, - "condition_code": "sent_equal_to", - "amount": "string", - "type": "stx" - } - ], - "anchor_mode": "on_chain_only", - "block_hash": "string", - "block_height": 0, - "block_time": 0, - "block_time_iso": "string", - "burn_block_time": 0, - "burn_block_height": 0, - "burn_block_time_iso": "string", - "parent_burn_block_time": 0, - "parent_burn_block_time_iso": "string", - "canonical": true, - "tx_index": 0, - "tx_status": "success", - "tx_result": { - "hex": "string", - "repr": "string" - }, - "event_count": 0, - "parent_block_hash": "string", - "is_unanchored": true, - "microblock_hash": "string", - "microblock_sequence": 0, - "microblock_canonical": true, - "execution_cost_read_count": 0, - "execution_cost_read_length": 0, - "execution_cost_runtime": 0, - "execution_cost_write_count": 0, - "execution_cost_write_length": 0, - "events": [ - { - "event_index": 0, - "event_type": "smart_contract_log", - "tx_id": "string", - "contract_log": { - "contract_id": "string", - "topic": "string", - "value": { - "hex": "string", - "repr": "string" - } - } - } - ], - "tx_type": "token_transfer", - "token_transfer": { - "recipient_address": "string", - "amount": "string", - "memo": "string" - } - } - ] -} -``` - - - - - -```ts -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent = AbstractTransactionEvent & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent = AbstractTransactionEvent1 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent = AbstractTransactionEvent2 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent = AbstractTransactionEvent3 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent = AbstractTransactionEvent4 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent1 = AbstractTransactionEvent5 & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent1 = AbstractTransactionEvent6 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent1 = AbstractTransactionEvent7 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent1 = AbstractTransactionEvent8 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent1 = AbstractTransactionEvent9 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent2 = AbstractTransactionEvent10 & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent2 = AbstractTransactionEvent11 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent2 = AbstractTransactionEvent12 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent2 = AbstractTransactionEvent13 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent2 = AbstractTransactionEvent14 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent3 = AbstractTransactionEvent15 & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent3 = AbstractTransactionEvent16 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent3 = AbstractTransactionEvent17 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent3 = AbstractTransactionEvent18 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent3 = AbstractTransactionEvent19 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent4 = AbstractTransactionEvent20 & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent4 = AbstractTransactionEvent21 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent4 = AbstractTransactionEvent22 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent4 = AbstractTransactionEvent23 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent4 = AbstractTransactionEvent24 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type SmartContractLogTransactionEvent5 = AbstractTransactionEvent25 & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxLockTransactionEvent5 = AbstractTransactionEvent26 & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type StxAssetTransactionEvent5 = AbstractTransactionEvent27 & { - event_type: "stx_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - sender: string; - recipient: string; - amount: string; - memo?: string; - }; -}; -export type FungibleTokenAssetTransactionEvent5 = AbstractTransactionEvent28 & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type NonFungibleTokenAssetTransactionEvent5 = AbstractTransactionEvent29 & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: "transfer" | "mint" | "burn"; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; - -/** - * GET request that returns account transactions - */ -export interface AddressTransactionsListResponse { - limit: number; - offset: number; - total: number; - results: ( - | TokenTransferTransaction - | SmartContractTransaction - | ContractCallTransaction - | PoisonMicroblockTransaction - | CoinbaseTransaction - | TenureChangeTransaction - )[]; -} -export interface TokenTransferTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent - | StxLockTransactionEvent - | StxAssetTransactionEvent - | FungibleTokenAssetTransactionEvent - | NonFungibleTokenAssetTransactionEvent - )[]; - tx_type: "token_transfer"; - token_transfer: { - recipient_address: string; - /** - * Transfer amount as Integer string (64-bit unsigned integer) - */ - amount: string; - /** - * Hex encoded arbitrary message, up to 34 bytes length (should try decoding to an ASCII string) - */ - memo: string; - }; -} -export interface AbstractTransactionEvent { - event_index: number; -} -export interface AbstractTransactionEvent1 { - event_index: number; -} -export interface AbstractTransactionEvent2 { - event_index: number; -} -export interface AbstractTransactionEvent3 { - event_index: number; -} -export interface AbstractTransactionEvent4 { - event_index: number; -} -export interface SmartContractTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent1 - | StxLockTransactionEvent1 - | StxAssetTransactionEvent1 - | FungibleTokenAssetTransactionEvent1 - | NonFungibleTokenAssetTransactionEvent1 - )[]; - tx_type: "smart_contract"; - smart_contract: { - clarity_version: number | null; - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Clarity code of the smart contract being deployed - */ - source_code: string; - }; -} -export interface AbstractTransactionEvent5 { - event_index: number; -} -export interface AbstractTransactionEvent6 { - event_index: number; -} -export interface AbstractTransactionEvent7 { - event_index: number; -} -export interface AbstractTransactionEvent8 { - event_index: number; -} -export interface AbstractTransactionEvent9 { - event_index: number; -} -export interface ContractCallTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent2 - | StxLockTransactionEvent2 - | StxAssetTransactionEvent2 - | FungibleTokenAssetTransactionEvent2 - | NonFungibleTokenAssetTransactionEvent2 - )[]; - tx_type: "contract_call"; - contract_call: { - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Name of the Clarity function to be invoked - */ - function_name: string; - /** - * Function definition, including function name and type as well as parameter names and types - */ - function_signature: string; - function_args?: { - hex: string; - repr: string; - name: string; - type: string; - }[]; - }; -} -export interface AbstractTransactionEvent10 { - event_index: number; -} -export interface AbstractTransactionEvent11 { - event_index: number; -} -export interface AbstractTransactionEvent12 { - event_index: number; -} -export interface AbstractTransactionEvent13 { - event_index: number; -} -export interface AbstractTransactionEvent14 { - event_index: number; -} -export interface PoisonMicroblockTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent3 - | StxLockTransactionEvent3 - | StxAssetTransactionEvent3 - | FungibleTokenAssetTransactionEvent3 - | NonFungibleTokenAssetTransactionEvent3 - )[]; - tx_type: "poison_microblock"; - poison_microblock: { - /** - * Hex encoded microblock header - */ - microblock_header_1: string; - /** - * Hex encoded microblock header - */ - microblock_header_2: string; - }; -} -export interface AbstractTransactionEvent15 { - event_index: number; -} -export interface AbstractTransactionEvent16 { - event_index: number; -} -export interface AbstractTransactionEvent17 { - event_index: number; -} -export interface AbstractTransactionEvent18 { - event_index: number; -} -export interface AbstractTransactionEvent19 { - event_index: number; -} -export interface CoinbaseTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent4 - | StxLockTransactionEvent4 - | StxAssetTransactionEvent4 - | FungibleTokenAssetTransactionEvent4 - | NonFungibleTokenAssetTransactionEvent4 - )[]; - tx_type: "coinbase"; - coinbase_payload: { - /** - * Hex encoded 32-byte scratch space for block leader's use - */ - data: string; - alt_recipient?: string | null; - vrf_proof?: string | null; - }; -} -export interface AbstractTransactionEvent20 { - event_index: number; -} -export interface AbstractTransactionEvent21 { - event_index: number; -} -export interface AbstractTransactionEvent22 { - event_index: number; -} -export interface AbstractTransactionEvent23 { - event_index: number; -} -export interface AbstractTransactionEvent24 { - event_index: number; -} -export interface TenureChangeTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: "allow" | "deny"; - post_conditions: ( - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "stx"; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; - amount: string; - type: "fungible"; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - | { - principal: - | { - type_id: "principal_origin"; - } - | { - type_id: "principal_standard"; - address: string; - } - | { - type_id: "principal_contract"; - address: string; - contract_name: string; - }; - condition_code: "sent" | "not_sent"; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; - } - )[]; - /** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ - anchor_mode: "on_chain_only" | "off_chain_only" | "any"; - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - /** - * Status of the transaction - */ - tx_status: "success" | "abort_by_response" | "abort_by_post_condition"; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - events: ( - | SmartContractLogTransactionEvent5 - | StxLockTransactionEvent5 - | StxAssetTransactionEvent5 - | FungibleTokenAssetTransactionEvent5 - | NonFungibleTokenAssetTransactionEvent5 - )[]; - tx_type: "tenure_change"; - tenure_change_payload: { - /** - * Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. - */ - tenure_consensus_hash: string; - /** - * Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. - */ - prev_tenure_consensus_hash: string; - /** - * Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. - */ - burn_view_consensus_hash: string; - /** - * (Hex string) Stacks Block hash - */ - previous_tenure_end: string; - /** - * The number of blocks produced in the previous tenure. - */ - previous_tenure_blocks: number; - /** - * Cause of change in mining tenure. Depending on cause, tenure can be ended or extended. - */ - cause: "block_found" | "extended"; - /** - * (Hex string) The ECDSA public key hash of the current tenure. - */ - pubkey_hash: string; - }; -} -export interface AbstractTransactionEvent25 { - event_index: number; -} -export interface AbstractTransactionEvent26 { - event_index: number; -} -export interface AbstractTransactionEvent27 { - event_index: number; -} -export interface AbstractTransactionEvent28 { - event_index: number; -} -export interface AbstractTransactionEvent29 { - event_index: number; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "string", - "message": "string" -} -``` - - - - - -```ts -export interface ErrorResponse { - error: string; - message?: string; - [k: string]: unknown; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/authentication.mdx b/content/docs/stacks/api/authentication.mdx new file mode 100644 index 000000000..22899191b --- /dev/null +++ b/content/docs/stacks/api/authentication.mdx @@ -0,0 +1,20 @@ +--- +title: Authentication +description: Authenticate with the Stacks Blockchain API. +--- + +import { SecondaryCard } from '@/components/card'; + +The Stacks Blockchain API expands the intentionally minimal RPC endpoints available in Stacks nodes and indexes, cleans, and enriches on-chain data to put everything you need at your fingertips. Who knew getting reliable blockchain data could be this easy? + +## Popular endpoints + + +If you're looking for direct access to the Stacks node, including the ability to broadcast transactions and interact with smart contracts, check out our [Stacks Node RPC](/stacks/rpc-api) documentation. + + + +Reach out to us on the #api channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET. + + + diff --git a/content/docs/stacks/api/blocks/average-times.mdx b/content/docs/stacks/api/blocks/average-times.mdx deleted file mode 100644 index b0a665b78..000000000 --- a/content/docs/stacks/api/blocks/average-times.mdx +++ /dev/null @@ -1,126 +0,0 @@ ---- -title: Get average block times -description: Retrieves average block times. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get average block times - -Retrieves average block times (in seconds) - -| Status code | Description | -| :------ | :------ | -| `200` | Average block times (in seconds) | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/blocks/average-times" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/blocks/average-times", { - method: "GET" -}); -``` - - - - - - - - - -Request to fetch average block times (in seconds) - - - - - -```json -{ - "last_1h": 0, - "last_24h": 0, - "last_7d": 0, - "last_30d": 0 -} -``` - - - - - -```ts -/** - * Request to fetch average block times (in seconds) - */ -export interface AverageBlockTimesResponse { - /** - * Average block times over the last hour (in seconds) - */ - last_1h: number; - /** - * Average block times over the last 24 hours (in seconds) - */ - last_24h: number; - /** - * Average block times over the last 7 days (in seconds) - */ - last_7d: number; - /** - * Average block times over the last 30 days (in seconds) - */ - last_30d: number; -} -``` - - - - - - - - - - - - - - \ No newline at end of file diff --git a/content/docs/stacks/api/blocks/block-by-burn-block-hash.mdx b/content/docs/stacks/api/blocks/block-by-burn-block-hash.mdx deleted file mode 100644 index f131a8d3a..000000000 --- a/content/docs/stacks/api/blocks/block-by-burn-block-hash.mdx +++ /dev/null @@ -1,237 +0,0 @@ ---- -title: Get block by burnchain block hash -description: Retrieves block details of a specific block for a given burnchain block hash. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get block by burnchain block hash - - -This endpoint is deprecated in favor of [Get blocks](/stacks/api/blocks/get-blocks). - - -Retrieves block details of a specific block for a given burnchain block hash - -| Status code | Description | -| :------ | :------ | -| `200` | Block | -| `404` | Cannot find block with given height | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/block/by_burn_block_hash/%7Bburn_block_hash%7D" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/block/by_burn_block_hash/%7Bburn_block_hash%7D", { - method: "GET" -}); -``` - - - - - - - - - -A block - - - - - -```json -{ - "canonical": true, - "height": 0, - "hash": "string", - "block_time": 0, - "block_time_iso": "string", - "index_block_hash": "string", - "parent_block_hash": "string", - "burn_block_time": 0, - "burn_block_time_iso": "string", - "burn_block_hash": "string", - "burn_block_height": 0, - "miner_txid": "string", - "parent_microblock_hash": "string", - "parent_microblock_sequence": 0, - "txs": [ - "string" - ], - "microblocks_accepted": [ - "string" - ], - "microblocks_streamed": [ - "string" - ], - "execution_cost_read_count": 0, - "execution_cost_read_length": 0, - "execution_cost_runtime": 0, - "execution_cost_write_count": 0, - "execution_cost_write_length": 0, - "microblock_tx_count": { - "property1": 0, - "property2": 0 - } -} -``` - - - - - -```ts -/** - * A block - */ -export interface Block { - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Height of the block - */ - height: number; - /** - * Hash representing the block - */ - hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * The only hash that can uniquely identify an anchored block or an unconfirmed state trie - */ - index_block_hash: string; - /** - * Hash of the parent block - */ - parent_block_hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Hash of the anchor chain block - */ - burn_block_hash: string; - /** - * Height of the anchor chain block - */ - burn_block_height: number; - /** - * Anchor chain transaction ID - */ - miner_txid: string; - /** - * The hash of the last streamed block that precedes this block to which this block is to be appended. Not every anchored block will have a parent microblock stream. An anchored block that does not have a parent microblock stream has the parent microblock hash set to an empty string, and the parent microblock sequence number set to -1. - */ - parent_microblock_hash: string; - /** - * The hash of the last streamed block that precedes this block to which this block is to be appended. Not every anchored block will have a parent microblock stream. An anchored block that does not have a parent microblock stream has the parent microblock hash set to an empty string, and the parent microblock sequence number set to -1. - */ - parent_microblock_sequence: number; - /** - * List of transactions included in the block - */ - txs: string[]; - /** - * List of microblocks that were accepted in this anchor block. Not every anchored block will have a accepted all (or any) of the previously streamed microblocks. Microblocks that were orphaned are not included in this list. - */ - microblocks_accepted: string[]; - /** - * List of microblocks that were streamed/produced by this anchor block's miner. This list only includes microblocks that were accepted in the following anchor block. Microblocks that were orphaned are not included in this list. - */ - microblocks_streamed: string[]; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - /** - * List of txs counts in each accepted microblock - */ - microblock_tx_count: { - [k: string]: number; - }; -} -``` - - - - - - - - - - - - - - \ No newline at end of file diff --git a/content/docs/stacks/api/blocks/block-by-burn-block-height.mdx b/content/docs/stacks/api/blocks/block-by-burn-block-height.mdx deleted file mode 100644 index f99b40d54..000000000 --- a/content/docs/stacks/api/blocks/block-by-burn-block-height.mdx +++ /dev/null @@ -1,237 +0,0 @@ ---- -title: Get block by burnchain block height -description: Retrieves block details of a specific block for a given burnchain block height. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get block by burnchain height - - -This endpoint is deprecated in favor of [Get blocks](/stacks/api/blocks/get-blocks). - - -Retrieves block details of a specific block for a given burn chain height - -| Status code | Description | -| :------ | :------ | -| `200` | Block | -| `404` | Cannot find block with given height | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/block/by_burn_block_height/%7Bburn_block_height%7D" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/block/by_burn_block_height/%7Bburn_block_height%7D", { - method: "GET" -}); -``` - - - - - - - - - -A block - - - - - -```json -{ - "canonical": true, - "height": 0, - "hash": "string", - "block_time": 0, - "block_time_iso": "string", - "index_block_hash": "string", - "parent_block_hash": "string", - "burn_block_time": 0, - "burn_block_time_iso": "string", - "burn_block_hash": "string", - "burn_block_height": 0, - "miner_txid": "string", - "parent_microblock_hash": "string", - "parent_microblock_sequence": 0, - "txs": [ - "string" - ], - "microblocks_accepted": [ - "string" - ], - "microblocks_streamed": [ - "string" - ], - "execution_cost_read_count": 0, - "execution_cost_read_length": 0, - "execution_cost_runtime": 0, - "execution_cost_write_count": 0, - "execution_cost_write_length": 0, - "microblock_tx_count": { - "property1": 0, - "property2": 0 - } -} -``` - - - - - -```ts -/** - * A block - */ -export interface Block { - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Height of the block - */ - height: number; - /** - * Hash representing the block - */ - hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * The only hash that can uniquely identify an anchored block or an unconfirmed state trie - */ - index_block_hash: string; - /** - * Hash of the parent block - */ - parent_block_hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Hash of the anchor chain block - */ - burn_block_hash: string; - /** - * Height of the anchor chain block - */ - burn_block_height: number; - /** - * Anchor chain transaction ID - */ - miner_txid: string; - /** - * The hash of the last streamed block that precedes this block to which this block is to be appended. Not every anchored block will have a parent microblock stream. An anchored block that does not have a parent microblock stream has the parent microblock hash set to an empty string, and the parent microblock sequence number set to -1. - */ - parent_microblock_hash: string; - /** - * The hash of the last streamed block that precedes this block to which this block is to be appended. Not every anchored block will have a parent microblock stream. An anchored block that does not have a parent microblock stream has the parent microblock hash set to an empty string, and the parent microblock sequence number set to -1. - */ - parent_microblock_sequence: number; - /** - * List of transactions included in the block - */ - txs: string[]; - /** - * List of microblocks that were accepted in this anchor block. Not every anchored block will have a accepted all (or any) of the previously streamed microblocks. Microblocks that were orphaned are not included in this list. - */ - microblocks_accepted: string[]; - /** - * List of microblocks that were streamed/produced by this anchor block's miner. This list only includes microblocks that were accepted in the following anchor block. Microblocks that were orphaned are not included in this list. - */ - microblocks_streamed: string[]; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - /** - * List of txs counts in each accepted microblock - */ - microblock_tx_count: { - [k: string]: number; - }; -} -``` - - - - - - - - - - - - - - \ No newline at end of file diff --git a/content/docs/stacks/api/blocks/block-by-hash.mdx b/content/docs/stacks/api/blocks/block-by-hash.mdx deleted file mode 100644 index 8f34541f5..000000000 --- a/content/docs/stacks/api/blocks/block-by-hash.mdx +++ /dev/null @@ -1,237 +0,0 @@ ---- -title: Get block by hash -description: Retrieves block details of a specific block for a given chain height. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get block by hash - - -This endpoint is deprecated in favor of [Get blocks](/stacks/api/blocks/get-blocks). - - -Retrieves block details of a specific block for a given chain height. You can use the hash from your latest block ('get_block_list' API) to get your block details. - -| Status code | Description | -| :------ | :------ | -| `200` | Block | -| `404` | Cannot find block with given ID | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/block/%7Bhash%7D" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/block/%7Bhash%7D", { - method: "GET" -}); -``` - - - - - - - - - -A block - - - - - -```json -{ - "canonical": true, - "height": 0, - "hash": "string", - "block_time": 0, - "block_time_iso": "string", - "index_block_hash": "string", - "parent_block_hash": "string", - "burn_block_time": 0, - "burn_block_time_iso": "string", - "burn_block_hash": "string", - "burn_block_height": 0, - "miner_txid": "string", - "parent_microblock_hash": "string", - "parent_microblock_sequence": 0, - "txs": [ - "string" - ], - "microblocks_accepted": [ - "string" - ], - "microblocks_streamed": [ - "string" - ], - "execution_cost_read_count": 0, - "execution_cost_read_length": 0, - "execution_cost_runtime": 0, - "execution_cost_write_count": 0, - "execution_cost_write_length": 0, - "microblock_tx_count": { - "property1": 0, - "property2": 0 - } -} -``` - - - - - -```ts -/** - * A block - */ -export interface Block { - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Height of the block - */ - height: number; - /** - * Hash representing the block - */ - hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * The only hash that can uniquely identify an anchored block or an unconfirmed state trie - */ - index_block_hash: string; - /** - * Hash of the parent block - */ - parent_block_hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Hash of the anchor chain block - */ - burn_block_hash: string; - /** - * Height of the anchor chain block - */ - burn_block_height: number; - /** - * Anchor chain transaction ID - */ - miner_txid: string; - /** - * The hash of the last streamed block that precedes this block to which this block is to be appended. Not every anchored block will have a parent microblock stream. An anchored block that does not have a parent microblock stream has the parent microblock hash set to an empty string, and the parent microblock sequence number set to -1. - */ - parent_microblock_hash: string; - /** - * The hash of the last streamed block that precedes this block to which this block is to be appended. Not every anchored block will have a parent microblock stream. An anchored block that does not have a parent microblock stream has the parent microblock hash set to an empty string, and the parent microblock sequence number set to -1. - */ - parent_microblock_sequence: number; - /** - * List of transactions included in the block - */ - txs: string[]; - /** - * List of microblocks that were accepted in this anchor block. Not every anchored block will have a accepted all (or any) of the previously streamed microblocks. Microblocks that were orphaned are not included in this list. - */ - microblocks_accepted: string[]; - /** - * List of microblocks that were streamed/produced by this anchor block's miner. This list only includes microblocks that were accepted in the following anchor block. Microblocks that were orphaned are not included in this list. - */ - microblocks_streamed: string[]; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - /** - * List of txs counts in each accepted microblock - */ - microblock_tx_count: { - [k: string]: number; - }; -} -``` - - - - - - - - - - - - - - \ No newline at end of file diff --git a/content/docs/stacks/api/blocks/block-by-height.mdx b/content/docs/stacks/api/blocks/block-by-height.mdx deleted file mode 100644 index ac3678840..000000000 --- a/content/docs/stacks/api/blocks/block-by-height.mdx +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Get block by height -description: Retrieves block details of a specific block for a given chain height. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get block by height - - -This endpoint is deprecated in favor of [Get blocks](/stacks/api/blocks/get-block). - - -Retrieves block details of a specific block at a given block height - - -| Status code | Description | -| :------ | :------ | -| `200` | Block | -| `404` | Cannot find block with given height | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/block/by_height/%7Bheight%7D" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/block/by_height/%7Bheight%7D", { - method: "GET" -}); -``` - - - - - - - - - -A block - - - - - -```json -{ - "canonical": true, - "height": 0, - "hash": "string", - "block_time": 0, - "block_time_iso": "string", - "index_block_hash": "string", - "parent_block_hash": "string", - "burn_block_time": 0, - "burn_block_time_iso": "string", - "burn_block_hash": "string", - "burn_block_height": 0, - "miner_txid": "string", - "parent_microblock_hash": "string", - "parent_microblock_sequence": 0, - "txs": [ - "string" - ], - "microblocks_accepted": [ - "string" - ], - "microblocks_streamed": [ - "string" - ], - "execution_cost_read_count": 0, - "execution_cost_read_length": 0, - "execution_cost_runtime": 0, - "execution_cost_write_count": 0, - "execution_cost_write_length": 0, - "microblock_tx_count": { - "property1": 0, - "property2": 0 - } -} -``` - - - - - -```ts -/** - * A block - */ -export interface Block { - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Height of the block - */ - height: number; - /** - * Hash representing the block - */ - hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * The only hash that can uniquely identify an anchored block or an unconfirmed state trie - */ - index_block_hash: string; - /** - * Hash of the parent block - */ - parent_block_hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Hash of the anchor chain block - */ - burn_block_hash: string; - /** - * Height of the anchor chain block - */ - burn_block_height: number; - /** - * Anchor chain transaction ID - */ - miner_txid: string; - /** - * The hash of the last streamed block that precedes this block to which this block is to be appended. Not every anchored block will have a parent microblock stream. An anchored block that does not have a parent microblock stream has the parent microblock hash set to an empty string, and the parent microblock sequence number set to -1. - */ - parent_microblock_hash: string; - /** - * The hash of the last streamed block that precedes this block to which this block is to be appended. Not every anchored block will have a parent microblock stream. An anchored block that does not have a parent microblock stream has the parent microblock hash set to an empty string, and the parent microblock sequence number set to -1. - */ - parent_microblock_sequence: number; - /** - * List of transactions included in the block - */ - txs: string[]; - /** - * List of microblocks that were accepted in this anchor block. Not every anchored block will have a accepted all (or any) of the previously streamed microblocks. Microblocks that were orphaned are not included in this list. - */ - microblocks_accepted: string[]; - /** - * List of microblocks that were streamed/produced by this anchor block's miner. This list only includes microblocks that were accepted in the following anchor block. Microblocks that were orphaned are not included in this list. - */ - microblocks_streamed: string[]; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - /** - * List of txs counts in each accepted microblock - */ - microblock_tx_count: { - [k: string]: number; - }; -} -``` - - - - - - - - - - - - - - \ No newline at end of file diff --git a/content/docs/stacks/api/blocks/get-block.mdx b/content/docs/stacks/api/blocks/get-block.mdx deleted file mode 100644 index 6035dcb24..000000000 --- a/content/docs/stacks/api/blocks/get-block.mdx +++ /dev/null @@ -1,209 +0,0 @@ ---- -title: Get block -description: Retrieves a single block. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get block - -Retrieves a single block - -### Path Parameters - - - -filter by block height, hash, index block hash or the constant `latest` to filter for the most recent block - - - -| Status code | Description | -| :------ | :------ | -| `200` | Block | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/blocks/42000" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/blocks/42000", { - method: "GET" -}); -``` - - - - - - - - - -A block - - - - - -```json -{ - "canonical": true, - "height": 0, - "hash": "string", - "block_time": 0, - "block_time_iso": "string", - "index_block_hash": "string", - "parent_block_hash": "string", - "parent_index_block_hash": "string", - "burn_block_time": 0, - "burn_block_time_iso": "string", - "burn_block_hash": "string", - "burn_block_height": 0, - "miner_txid": "string", - "tx_count": 0, - "execution_cost_read_count": 0, - "execution_cost_read_length": 0, - "execution_cost_runtime": 0, - "execution_cost_write_count": 0, - "execution_cost_write_length": 0 -} -``` - - - - - -```ts -/** - * A block - */ -export interface NakamotoBlock { - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Height of the block - */ - height: number; - /** - * Hash representing the block - */ - hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * The only hash that can uniquely identify an anchored block or an unconfirmed state trie - */ - index_block_hash: string; - /** - * Hash of the parent block - */ - parent_block_hash: string; - /** - * Index block hash of the parent block - */ - parent_index_block_hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Hash of the anchor chain block - */ - burn_block_hash: string; - /** - * Height of the anchor chain block - */ - burn_block_height: number; - /** - * Anchor chain transaction ID - */ - miner_txid: string; - /** - * Number of transactions included in the block - */ - tx_count: number; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/blocks/get-blocks-by-burn-block.mdx b/content/docs/stacks/api/blocks/get-blocks-by-burn-block.mdx deleted file mode 100644 index 43dad5dc9..000000000 --- a/content/docs/stacks/api/blocks/get-blocks-by-burn-block.mdx +++ /dev/null @@ -1,252 +0,0 @@ ---- -title: Get blocks by burn block -description: Retrieves a list of blocks confirmed by a specific burn block. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get blocks by burn block - -Retrieves a list of blocks confirmed by a specific burn block - -### Path Parameters - - - -filter by burn block height, hash, or the constant `latest` to filter for the most recent burn block - - - -### Query Parameters - - - -max number of blocks to fetch - -Example: `20` - - - - - -index of first burn block to fetch - -Example: `0` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of blocks | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/burn-blocks/42000/blocks?limit=20&offset=0" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/burn-blocks/42000/blocks?limit=20&offset=0", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns blocks - - - - - -```json -{ - "limit": 30, - "offset": 0, - "total": 0, - "results": [ - { - "canonical": true, - "height": 0, - "hash": "string", - "block_time": 0, - "block_time_iso": "string", - "index_block_hash": "string", - "parent_block_hash": "string", - "parent_index_block_hash": "string", - "burn_block_time": 0, - "burn_block_time_iso": "string", - "burn_block_hash": "string", - "burn_block_height": 0, - "miner_txid": "string", - "tx_count": 0, - "execution_cost_read_count": 0, - "execution_cost_read_length": 0, - "execution_cost_runtime": 0, - "execution_cost_write_count": 0, - "execution_cost_write_length": 0 - } - ] -} -``` - - - - - -```ts -/** - * GET request that returns blocks - */ -export interface NakamotoBlockListResponse { - /** - * The number of blocks to return - */ - limit: number; - /** - * The number to blocks to skip (starting at `0`) - */ - offset: number; - /** - * The number of blocks available - */ - total: number; - results: NakamotoBlock[]; -} -/** - * A block - */ -export interface NakamotoBlock { - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Height of the block - */ - height: number; - /** - * Hash representing the block - */ - hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * The only hash that can uniquely identify an anchored block or an unconfirmed state trie - */ - index_block_hash: string; - /** - * Hash of the parent block - */ - parent_block_hash: string; - /** - * Index block hash of the parent block - */ - parent_index_block_hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Hash of the anchor chain block - */ - burn_block_hash: string; - /** - * Height of the anchor chain block - */ - burn_block_height: number; - /** - * Anchor chain transaction ID - */ - miner_txid: string; - /** - * Number of transactions included in the block - */ - tx_count: number; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/blocks/get-blocks.mdx b/content/docs/stacks/api/blocks/get-blocks.mdx deleted file mode 100644 index c49bd756b..000000000 --- a/content/docs/stacks/api/blocks/get-blocks.mdx +++ /dev/null @@ -1,245 +0,0 @@ ---- -title: Get blocks -description: Retrieves a list of recently mined blocks. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get blocks - -Retrieves a list of recently mined blocks - - -### Query Parameters - - - -max number of blocks to fetch - -Example: `20` - - - - - -index of first burn block to fetch - -Example: `0` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of blocks | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/blocks?limit=20&offset=0" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/blocks?limit=20&offset=0", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns blocks - - - - - -```json -{ - "limit": 30, - "offset": 0, - "total": 0, - "results": [ - { - "canonical": true, - "height": 0, - "hash": "string", - "block_time": 0, - "block_time_iso": "string", - "index_block_hash": "string", - "parent_block_hash": "string", - "parent_index_block_hash": "string", - "burn_block_time": 0, - "burn_block_time_iso": "string", - "burn_block_hash": "string", - "burn_block_height": 0, - "miner_txid": "string", - "tx_count": 0, - "execution_cost_read_count": 0, - "execution_cost_read_length": 0, - "execution_cost_runtime": 0, - "execution_cost_write_count": 0, - "execution_cost_write_length": 0 - } - ] -} -``` - - - - - -```ts -/** - * GET request that returns blocks - */ -export interface NakamotoBlockListResponse { - /** - * The number of blocks to return - */ - limit: number; - /** - * The number to blocks to skip (starting at `0`) - */ - offset: number; - /** - * The number of blocks available - */ - total: number; - results: NakamotoBlock[]; -} -/** - * A block - */ -export interface NakamotoBlock { - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Height of the block - */ - height: number; - /** - * Hash representing the block - */ - hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * The only hash that can uniquely identify an anchored block or an unconfirmed state trie - */ - index_block_hash: string; - /** - * Hash of the parent block - */ - parent_block_hash: string; - /** - * Index block hash of the parent block - */ - parent_index_block_hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Hash of the anchor chain block - */ - burn_block_hash: string; - /** - * Height of the anchor chain block - */ - burn_block_height: number; - /** - * Anchor chain transaction ID - */ - miner_txid: string; - /** - * Number of transactions included in the block - */ - tx_count: number; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/blocks/recent-blocks.mdx b/content/docs/stacks/api/blocks/recent-blocks.mdx deleted file mode 100644 index 0941b0f23..000000000 --- a/content/docs/stacks/api/blocks/recent-blocks.mdx +++ /dev/null @@ -1,283 +0,0 @@ ---- -title: Get recent blocks -description: Retrieves a list of recently mined blocks. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get recent blocks - - -This endpoint is deprecated in favor of [Get blocks](/stacks/api/blocks/get-blocks). - - -Retrieves a list of recently mined blocks - -If you need to actively monitor new blocks, we highly recommend subscribing to [WebSockets or Socket.io](https://github.com/hirosystems/stacks-blockchain-api/tree/master/client) for real-time updates. - -### Query Parameters - - - -max number of blocks to fetch - -Default: `20` - -Maximum: `30` - - - - - -index of first block to fetch - -Example: `42000` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of blocks | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/block?limit=20&offset=42000" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/block?limit=20&offset=42000", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns blocks - - - - - -```json -{ - "limit": 30, - "offset": 0, - "total": 0, - "results": [ - { - "canonical": true, - "height": 0, - "hash": "string", - "block_time": 0, - "block_time_iso": "string", - "index_block_hash": "string", - "parent_block_hash": "string", - "burn_block_time": 0, - "burn_block_time_iso": "string", - "burn_block_hash": "string", - "burn_block_height": 0, - "miner_txid": "string", - "parent_microblock_hash": "string", - "parent_microblock_sequence": 0, - "txs": [ - "string" - ], - "microblocks_accepted": [ - "string" - ], - "microblocks_streamed": [ - "string" - ], - "execution_cost_read_count": 0, - "execution_cost_read_length": 0, - "execution_cost_runtime": 0, - "execution_cost_write_count": 0, - "execution_cost_write_length": 0, - "microblock_tx_count": { - "property1": 0, - "property2": 0 - } - } - ] -} -``` - - - - - -```ts -/** - * GET request that returns blocks - */ -export interface BlockListResponse { - /** - * The number of blocks to return - */ - limit: number; - /** - * The number to blocks to skip (starting at `0`) - */ - offset: number; - /** - * The number of blocks available - */ - total: number; - results: Block[]; -} -/** - * A block - */ -export interface Block { - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Height of the block - */ - height: number; - /** - * Hash representing the block - */ - hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * The only hash that can uniquely identify an anchored block or an unconfirmed state trie - */ - index_block_hash: string; - /** - * Hash of the parent block - */ - parent_block_hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Hash of the anchor chain block - */ - burn_block_hash: string; - /** - * Height of the anchor chain block - */ - burn_block_height: number; - /** - * Anchor chain transaction ID - */ - miner_txid: string; - /** - * The hash of the last streamed block that precedes this block to which this block is to be appended. Not every anchored block will have a parent microblock stream. An anchored block that does not have a parent microblock stream has the parent microblock hash set to an empty string, and the parent microblock sequence number set to -1. - */ - parent_microblock_hash: string; - /** - * The hash of the last streamed block that precedes this block to which this block is to be appended. Not every anchored block will have a parent microblock stream. An anchored block that does not have a parent microblock stream has the parent microblock hash set to an empty string, and the parent microblock sequence number set to -1. - */ - parent_microblock_sequence: number; - /** - * List of transactions included in the block - */ - txs: string[]; - /** - * List of microblocks that were accepted in this anchor block. Not every anchored block will have a accepted all (or any) of the previously streamed microblocks. Microblocks that were orphaned are not included in this list. - */ - microblocks_accepted: string[]; - /** - * List of microblocks that were streamed/produced by this anchor block's miner. This list only includes microblocks that were accepted in the following anchor block. Microblocks that were orphaned are not included in this list. - */ - microblocks_streamed: string[]; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - /** - * List of txs counts in each accepted microblock - */ - microblock_tx_count: { - [k: string]: number; - }; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/burn-blocks/get-burn-block.mdx b/content/docs/stacks/api/burn-blocks/get-burn-block.mdx deleted file mode 100644 index 015a02f03..000000000 --- a/content/docs/stacks/api/burn-blocks/get-burn-block.mdx +++ /dev/null @@ -1,150 +0,0 @@ ---- -title: Get burn block -description: Retrieves a single burn block. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get burn block - -Retrieves a single burn block -### Path Parameters - - - -filter by burn block height, hash, or the constant `latest` to filter for the most recent burn block - - - -| Status code | Description | -| :------ | :------ | -| `200` | Burn block | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/burn-blocks/42000" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/burn-blocks/42000", { - method: "GET" -}); -``` - - - - - - - - - -A burn block - - - - - -```json -{ - "burn_block_time": 0, - "burn_block_time_iso": "string", - "burn_block_hash": "string", - "burn_block_height": 0, - "stacks_blocks": [ - "string" - ], - "avg_block_time": 0, - "total_tx_count": 0 -} -``` - - - - - -```ts -/** - * A burn block - */ -export interface BurnBlock { - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Hash of the anchor chain block - */ - burn_block_hash: string; - /** - * Height of the anchor chain block - */ - burn_block_height: number; - /** - * Hashes of the Stacks blocks included in the burn block - */ - stacks_blocks: string[]; - /** - * Average time between blocks in seconds. Returns 0 if there is only one block in the burn block. - */ - avg_block_time: number; - /** - * Total number of transactions in the Stacks blocks associated with this burn block - */ - total_tx_count: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/burn-blocks/get-burn-blocks.mdx b/content/docs/stacks/api/burn-blocks/get-burn-blocks.mdx deleted file mode 100644 index 3865e7534..000000000 --- a/content/docs/stacks/api/burn-blocks/get-burn-blocks.mdx +++ /dev/null @@ -1,189 +0,0 @@ ---- -title: Get burn blocks -description: Retrieves a list of recent burn blocks. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get burn blocks - -Retrieves a list of recent burn blocks - - -### Query Parameters - - - -max number of burn blocks to fetch - -Default: `20` - -Maximum: `30` - - - - - -index of first burn block to fetch - -Example: `42000` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of burn blocks | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/burn-blocks?limit=20&offset=42000" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/burn-blocks?limit=20&offset=42000", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns burn blocks - - - - - -```json -{ - "limit": 30, - "offset": 0, - "total": 0, - "results": [ - { - "burn_block_time": 0, - "burn_block_time_iso": "string", - "burn_block_hash": "string", - "burn_block_height": 0, - "stacks_blocks": [ - "string" - ], - "avg_block_time": 0, - "total_tx_count": 0 - } - ] -} -``` - - - - - -```ts -/** - * GET request that returns burn blocks - */ -export interface BurnBlockListResponse { - /** - * The number of burn blocks to return - */ - limit: number; - /** - * The number to burn blocks to skip (starting at `0`) - */ - offset: number; - /** - * The number of burn blocks available (regardless of filter parameters) - */ - total: number; - results: BurnBlock[]; -} -/** - * A burn block - */ -export interface BurnBlock { - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Hash of the anchor chain block - */ - burn_block_hash: string; - /** - * Height of the anchor chain block - */ - burn_block_height: number; - /** - * Hashes of the Stacks blocks included in the burn block - */ - stacks_blocks: string[]; - /** - * Average time between blocks in seconds. Returns 0 if there is only one block in the burn block. - */ - avg_block_time: number; - /** - * Total number of transactions in the Stacks blocks associated with this burn block - */ - total_tx_count: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/client/accounts/get-assets.mdx b/content/docs/stacks/api/client/accounts/get-assets.mdx deleted file mode 100644 index 53453e14e..000000000 --- a/content/docs/stacks/api/client/accounts/get-assets.mdx +++ /dev/null @@ -1,234 +0,0 @@ ---- -title: Assets -description: Retrieves a list of all assets events associated with an account or a contract identifier. -toc: false ---- - -import { Root, API, APIExample } from '@/components/layout'; -import { Property } from 'fumadocs-openapi/ui' -import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; - -import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; -import { Badge } from '@/components/ui/badge'; - - - - - -
- -

`getAccountAssets`

- -This API endpoint retrieves a comprehensive list of asset events associated with a specific account or contract identifier, including asset transfers and mints. It is essential for tracking asset movements and changes in ownership within the Stacks blockchain. - -### Parameters - - -The account address or contract identifier whose asset events are to be retrieved. - - - -Optional overrides for the request initialization settings. - - -
- - - - - - - Retrieve Account Assets - - - - ```ts - import { Configuration, AccountsApi } from '@stacks/blockchain-api-client'; - - const apiConfig = new Configuration({ - basePath: 'https://api.testnet.hiro.so', - }); - - const accountsApi = new AccountsApi(apiConfig); - const principal = 'ST000000000000000000002AMW42H'; - // Retrieve all asset events for the specified account or contract identifier - const assets = await accountsApi.getAccountAssets({ - principal: principal, - }); - ``` - - - - - ```ts - import { - UserSession, - makeAuthRequest, - AppConfig - } from '@stacks/auth'; - - const appDomain = 'https://www.myapp.com'; - - const appConfig = new AppConfig(['store_write'], appDomain); - const userSession = new UserSession({ appConfig }); - - // The authentication payloads are encrypted during transit, the encryption key generated below provides this - const transitKey = userSession.generateAndStoreTransitKey(); - - // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload. - const redirectUri = 'https://www.myapp.com/auth'; - - // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication. - const manifestUri = 'https://www.myapp.com/manifest.json'; - - // Generate the authentication request payload - const authRequest = userSession.makeAuthRequest( - transitKey, - redirectUri, - manifestUri - ); - - ``` - - - - - - - - -
- - - -
- -

`UserSession`

- -The Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a `UserSession` to manage user data. - -### Functions - - - -Determines if there is an incoming authentication response. - - - - - -Processes the response and provides a `userData` object containing the user's identity, BNS username and profile information. - - - - - -Checks if the user is already authenticated. - - - - - -Retrieves the user's profile data if the user is already authenticated. - - - - - -Encrypts user data for secure storage. - - - - - -Decrypts user data for secure storage. - - - -
- - - - - - Handle incoming authentication response - - - Check if a user is signed in - - - Load data for signed in user - - - Signing out a user - - - Encrypting user data - - - Decrypting user data - - - - ```ts - const isPending = userSession.isSignInPending(); - - if (isPending) { - userSession.handlePendingSignIn().then(userData => { - // Do something with userData - }); - } - ``` - - - ```ts - const isSignedIn = userSession.isUserSignedIn(); - ``` - - - ```ts - const isSignedIn = userSession.isUserSignedIn(); - - if (isSignedIn) { - // Do something with the signed in user - const userData = userSession.loadUserData(); - } - ``` - - - ```ts - function logout() { - userSession.signUserOut(); - } - ``` - - - ```ts - const message = 'My secret message'; - - const cipherText = await userSession.encryptContent(message); - ``` - - - ```ts - const message = 'My secret message'; - - const cipherText = await userSession.encryptContent(message); - const plainText = await userSession.decryptContent(cipherText); - ``` - - - - - - - Note that encryption here uses the user's private key associated with your app only. If you need to share this data with another app or other users, you should use the equivalent methods from `@stacks/encryption` and provide a custom private key. - - - - - - -
- -
diff --git a/content/docs/stacks/api/client/index.mdx b/content/docs/stacks/api/client/index.mdx deleted file mode 100644 index 2d8fc25c8..000000000 --- a/content/docs/stacks/api/client/index.mdx +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Overview -description: Interact with the Stacks blockchain using a JavaScript client library. -toc: false ---- - -import { Accordion, Accordions } from "fumadocs-ui/components/accordion"; -import { Blocks, Braces, CircleUserRound } from 'lucide-react'; -import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; - -The `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints. - -The client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming. - -```ts -import { AccountsApi } from '@stacks/blockchain-api-client'; - -const accounts = new AccountsApi(apiConfig); - -await accounts.getAccountTransactions({ - principal: 'ST000000000000000000002AMW42H', -}); -``` - -### Using WebSockets - -```ts -import { connectWebSocketClient } from '@stacks/blockchain-api-client'; -const client = await connectWebSocketClient('ws://api.hiro.so/'); -const sub = await client.subscribeAddressTransactions(contractCall.txId, event => { - console.log(event); -}); - -await sub.unsubscribe(); -``` diff --git a/content/docs/stacks/api/faucets/stx.mdx b/content/docs/stacks/api/faucets/stx.mdx deleted file mode 100644 index 8ea882f36..000000000 --- a/content/docs/stacks/api/faucets/stx.mdx +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: STX Testnet tokens -description: Delivers testnet STX tokens to a specified address. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get STX testnet tokens - -Add 500 STX tokens to the specified testnet address. Testnet STX addresses begin with `ST`. If the `stacking` -parameter is set to `true`, the faucet will add the required number of tokens for individual stacking to the -specified testnet address. - -The endpoint returns the transaction ID, which you can use to view the transaction in the -[Stacks Explorer](https://explorer.hiro.so/?chain=testnet). The tokens are delivered once the transaction has -been included in an anchor block. - -A common reason for failed faucet transactions is that the faucet has run out of tokens. If you are experiencing -failed faucet transactions to a testnet address, you can get help in [Discord](https://stacks.chat). - - -This is a testnet only endpoint. This endpoint will not work on the mainnet. - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | -| `500` | Faucet call failed | - - - - - - - - - - - - - -```terminal -$ curl -X POST "https://api.testnet.hiro.so/extended/v1/faucets/stx" -``` - - - - - -```js -fetch("https://api.testnet.hiro.so/extended/v1/faucets/stx", { - method: "POST" -}); -``` - - - - - - - - - -POST request that initiates a transfer of tokens to a specified testnet address - - - - - -```json -{ - "success": true, - "txId": "string", - "txRaw": "string" -} -``` - - - - - -```ts -/** - * POST request that initiates a transfer of tokens to a specified testnet address - */ -export interface RunFaucetResponse { - /** - * Indicates if the faucet call was successful - */ - success: boolean; - /** - * The transaction ID for the faucet call - */ - txId?: string; - /** - * Raw transaction in hex string representation - */ - txRaw?: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/fees/fee-rate.mdx b/content/docs/stacks/api/fees/fee-rate.mdx deleted file mode 100644 index 18adec385..000000000 --- a/content/docs/stacks/api/fees/fee-rate.mdx +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: Get fee rate -description: Retrieves an estimated fee rate for transactions. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Fetch fee rate - - -This endpoint is deprecated in favor of [Get fee estimate](/stacks/api/fees/estimate). - - -Retrieves estimated fee rate. - -### Request Body - - - -A serialized transaction - - - -| Status code | Description | -| :------ | :------ | -| `200` | Transaction fee rate | - - - - - - - - - - - - - -```terminal -$ curl -X POST "https://api.hiro.so/extended/v1/fee_rate" \ - -d '{ - "transaction": "string" -}' -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/fee_rate", { - method: "POST" -}); -``` - - - - - - - - - -Get fee rate information. - - - - - -```json -{ - "fee_rate": 0 -} -``` - - - - - -```ts -/** - * Get fee rate information. - */ -export interface FeeRate { - fee_rate: number; -} -``` - - - - - - - - - - - - - - \ No newline at end of file diff --git a/content/docs/stacks/api/getting-started.mdx b/content/docs/stacks/api/getting-started.mdx new file mode 100644 index 000000000..39c1a999f --- /dev/null +++ b/content/docs/stacks/api/getting-started.mdx @@ -0,0 +1,20 @@ +--- +title: Getting started +description: Get started with Hiro APIs. +--- + +import { SecondaryCard } from '@/components/card'; + +The Stacks Blockchain API expands the intentionally minimal RPC endpoints available in Stacks nodes and indexes, cleans, and enriches on-chain data to put everything you need at your fingertips. Who knew getting reliable blockchain data could be this easy? + +## Popular endpoints + + +If you're looking for direct access to the Stacks node, including the ability to broadcast transactions and interact with smart contracts, check out our [Stacks Node RPC](/stacks/rpc-api) documentation. + + + +Reach out to us on the #api channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET. + + + diff --git a/content/docs/stacks/api/index.mdx b/content/docs/stacks/api/index.mdx index 7419a2333..d71c7ef72 100644 --- a/content/docs/stacks/api/index.mdx +++ b/content/docs/stacks/api/index.mdx @@ -1,46 +1,96 @@ --- -title: Overview -description: Query the Stacks blockchain with the Stacks Blockchain API. +title: APIs +description: The following guides cover ways to use Hiro tools to build apps on Stacks. +icon: API +full: true --- -import { SecondaryCard } from '@/components/card'; +import { Database, Ticket } from 'lucide-react'; +import { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon'; +import { SecondaryCard, SmallCard } from '@/components/card'; -The Stacks Blockchain API expands the intentionally minimal RPC endpoints available in Stacks nodes and indexes, cleans, and enriches on-chain data to put everything you need at your fingertips. Who knew getting reliable blockchain data could be this easy? +
-## Popular endpoints + + } + href="/stacks/chainhook/quickstart" + title="Stream custom blockchain events" + description="Use Chainhook to filter & stream for contract deployments." + tag='Chainhook' + /> + - -If you're looking for direct access to the Stacks node, including the ability to broadcast transactions and interact with smart contracts, check out our [Stacks Node RPC](/stacks/rpc-api) documentation. - +
+ +

+ Learn by example +

+ +--- - } + href="/guides/build-an-nft-marketplace" + title="Build an NFT Marketplace" + description="Learn how to create and deploy your own NFT marketplace." /> - } + href="/stacks/clarinet" + title="Launch a Decentralized Autonomous Organization (DAO)" + description="Discover the steps to creating your own DAO." + /> */} + } + href="/guides/no-loss-lottery" + title="Create a no-loss lottery pool" + description="Build a no-loss lottery pool that leverages stacking yield." /> - } + href="/guides/build-a-decentralized-kickstarter" + title="Build a decentralized Kickstarter" + description="Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party." /> -## Related tools +
-- **[Stacks Node RPC](/stacks/rpc-api)**: Fetch data and broadcast transactions from the Stacks Node RPC API. -- **[Token Metadata API](/stacks/token-metadata-api)**: Fetch fungible and non-fungible token data on the Stacks blockchain. -- **[Stacks Explorer](https://explorer.hiro.so)**: Looking for a front end to verify activity on the Stacks blockchain? Try the Stacks Explorer. +
-
+

+ Installation guides +

- -Reach out to us on the #api channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET. - +--- + + + } + href="/guides/sync-a-bitcoin-node" + title="Sync a Bitcoin node" + description="Set up and run a Bitcoin node to run tools like Chainhook as a service." + /> + } + href="/guides/sync-a-stacks-node" + title="Sync a Stacks node" + description="Set up and run a Stacks node to use tools like Chainhook or spin up your own API." + /> + } + href="/guides/installing-docker" + title="Install and run Docker on your machine" + description="Essential for running a local development with Clarinet" + /> + +
+ + +For more, check out our [guides](/guides) section. + +
diff --git a/content/docs/stacks/api/info/circulating-stx-supply-in-plain-text.mdx b/content/docs/stacks/api/info/circulating-stx-supply-in-plain-text.mdx deleted file mode 100644 index fee827a27..000000000 --- a/content/docs/stacks/api/info/circulating-stx-supply-in-plain-text.mdx +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: Get circulating STX supply in plain text format -description: Retrieves the circulating STX supply as plain text. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get circulating STX supply in plain text format - -Retrieves the STX tokens currently in circulation that have been unlocked as plain text. - -| Status code | Description | -| :------ | :------ | -| `200` | success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/stx_supply/circulating/plain" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/stx_supply/circulating/plain", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns network target block times - - - - - -```json -"string" -``` - - - - - -```ts -/** - * GET request that returns network target block times - */ -export type GetStxCirculatingSupplyPlainResponse = string; -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/info/legacy-total-and-unlocked-stx-supply.mdx b/content/docs/stacks/api/info/legacy-total-and-unlocked-stx-supply.mdx deleted file mode 100644 index 223228c4e..000000000 --- a/content/docs/stacks/api/info/legacy-total-and-unlocked-stx-supply.mdx +++ /dev/null @@ -1,150 +0,0 @@ ---- -title: Get total and unlocked STX supply (legacy) -description: Retrieves the total and unlocked STX supply in legacy format 1.0 API. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get total and unlocked STX supply (results formatted the same as the legacy 1.0 API) - -Retrieves total supply of STX tokens including those currently in circulation that have been unlocked. - - -This uses the estimated future total supply for the year 2050. - - -### Query Parameters - - - -Supply details are queried from specified block height. If the block height is not specified, the latest block height is taken as default value. - -Example: `200` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/stx_supply/legacy_format?height=200" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/stx_supply/legacy_format?height=200", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns network target block times - - - - - -```json -{ - "unlockedPercent": "string", - "totalStacks": "string", - "totalStacksFormatted": "string", - "unlockedSupply": "string", - "unlockedSupplyFormatted": "string", - "blockHeight": "string" -} -``` - - - - - -```ts -/** - * GET request that returns network target block times - */ -export interface GetStxSupplyLegacyFormatResponse { - /** - * String quoted decimal number of the percentage of STX that have unlocked - */ - unlockedPercent: string; - /** - * String quoted decimal number of the total possible number of STX - */ - totalStacks: string; - /** - * Same as `totalStacks` but formatted with comma thousands separators - */ - totalStacksFormatted: string; - /** - * String quoted decimal number of the STX that have been mined or unlocked - */ - unlockedSupply: string; - /** - * Same as `unlockedSupply` but formatted with comma thousands separators - */ - unlockedSupplyFormatted: string; - /** - * The block height at which this information was queried - */ - blockHeight: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/info/network-block-time.mdx b/content/docs/stacks/api/info/network-block-time.mdx deleted file mode 100644 index 4a37c5c0f..000000000 --- a/content/docs/stacks/api/info/network-block-time.mdx +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: Get the network target block time -description: Retrieves the target block times for mainnet and testnet. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get the network target block time - -Retrieves the target block times for mainnet and testnet. The block time is hardcoded and will change throughout the implementation phases of the testnet. - -| Status code | Description | -| :------ | :------ | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/info/network_block_times" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/info/network_block_times", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns network target block times - - - - - -```json -{ - "mainnet": { - "target_block_time": 0 - }, - "testnet": { - "target_block_time": 0 - } -} -``` - - - - - -```ts -/** - * GET request that returns network target block times - */ -export interface NetworkBlockTimesResponse { - mainnet: TargetBlockTime; - testnet: TargetBlockTime; -} -export interface TargetBlockTime { - target_block_time: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/info/network-given-block-time.mdx b/content/docs/stacks/api/info/network-given-block-time.mdx deleted file mode 100644 index 297578c02..000000000 --- a/content/docs/stacks/api/info/network-given-block-time.mdx +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: Get a given network's target block time -description: Retrieves the target block time for a given network. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get a given network's target block time - -Retrieves the target block time for a given network. The network can be mainnet or testnet. The block time is hardcoded and will change throughout the implementation phases of the testnet. -### Path Parameters - - - -the target block time for a given network (testnet, mainnet). - -Example: `"mainnet"` - -Value in: `"testnet" | "mainnet"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/info/network_block_time/mainnet" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/info/network_block_time/mainnet", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "target_block_time": 0 -} -``` - - - - - -```ts -export interface TargetBlockTime { - target_block_time: number; -} -``` - - - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/info/status.mdx b/content/docs/stacks/api/info/status.mdx deleted file mode 100644 index 2cdb7e737..000000000 --- a/content/docs/stacks/api/info/status.mdx +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Get API status -description: Retrieves the running status of the Stacks Blockchain API. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## API status - -Retrieves the running status of the Stacks Blockchain API, including the server version and current chain tip information. - -| Status code | Description | -| :------ | :------ | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended" -``` - - - - - -```js -fetch("https://api.hiro.so/extended", { - method: "GET" -}); -``` - - - - - - - - - -GET blockchain API status - - - - - -```json -{ - "server_version": "string", - "status": "string", - "pox_v1_unlock_height": 0, - "pox_v2_unlock_height": 0, - "pox_v3_unlock_height": 0, - "chain_tip": { - "block_height": 0, - "block_hash": "string", - "index_block_hash": "string", - "microblock_hash": "string", - "microblock_sequence": 0, - "burn_block_height": 0 - } -} -``` - - - - - -```ts -/** - * GET blockchain API status - */ -export interface ServerStatusResponse { - /** - * the server version that is currently running - */ - server_version?: string; - /** - * the current server status - */ - status: string; - pox_v1_unlock_height?: number; - pox_v2_unlock_height?: number; - pox_v3_unlock_height?: number; - chain_tip?: ChainTip; -} -/** - * Current chain tip information - */ -export interface ChainTip { - /** - * the current block height - */ - block_height: number; - /** - * the current block hash - */ - block_hash: string; - /** - * the current index block hash - */ - index_block_hash: string; - /** - * the current microblock hash - */ - microblock_hash?: string; - /** - * the current microblock sequence number - */ - microblock_sequence?: number; - /** - * the current burn chain block height - */ - burn_block_height: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/info/total-and-unlocked-stx-supply.mdx b/content/docs/stacks/api/info/total-and-unlocked-stx-supply.mdx deleted file mode 100644 index f2ad807e8..000000000 --- a/content/docs/stacks/api/info/total-and-unlocked-stx-supply.mdx +++ /dev/null @@ -1,141 +0,0 @@ ---- -title: Get total and unlocked STX supply -description: Retrieves the total and unlocked STX supply. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get total and unlocked STX supply - -Retrieves the total and unlocked STX supply. - -### Query Parameters - - - -Supply details are queried from specified block height. If the block height is not specified, the latest block height is taken as default value. Note that the `block height` is referred to the stacks blockchain. - -Minimum: `0` - - - -| Status code | Description | -| :----------- | :----------- | -| `200` | GET request that returns total and unlocked STX supply | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/stx_supply" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/stx_supply", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns network target block times - - - - - -```json -{ - "unlocked_percent": "string", - "total_stx": "string", - "total_stx_year_2050": "string", - "unlocked_stx": "string", - "block_height": 0 -} -``` - - - - - -```ts -/** - * GET request that returns network target block times - */ -export interface GetStxSupplyResponse { - /** - * String quoted decimal number of the percentage of STX that have unlocked - */ - unlocked_percent: string; - /** - * String quoted decimal number of the total circulating number of STX (at the input block height if provided, otherwise the current block height) - */ - total_stx: string; - /** - * String quoted decimal number of total circulating STX supply in year 2050. STX supply grows approx 0.3% annually thereafter in perpetuity. - */ - total_stx_year_2050: string; - /** - * String quoted decimal number of the STX that have been mined or unlocked - */ - unlocked_stx: string; - /** - * The block height at which this information was queried - */ - block_height: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/info/total-stx-supply-in-plain-text.mdx b/content/docs/stacks/api/info/total-stx-supply-in-plain-text.mdx deleted file mode 100644 index c43e3f576..000000000 --- a/content/docs/stacks/api/info/total-stx-supply-in-plain-text.mdx +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: Get total STX supply in plain text format -description: Retrieves the total STX supply as plain text. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get total STX supply in plain text format - -Retrieves the total supply for STX tokens as plain text. - - -This uses the estimated future total supply for the year 2050. - - -| Status code | Description | -| :------ | :------ | -| `200` | success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/stx_supply/total/plain" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/stx_supply/total/plain", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns network target block times - - - - - -```json -"string" -``` - - - - - -```ts -/** - * GET request that returns network target block times - */ -export type GetStxTotalSupplyPlainResponse = string; -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/mempool/transaction-fee-priorities.mdx b/content/docs/stacks/api/mempool/transaction-fee-priorities.mdx deleted file mode 100644 index 1e04567b8..000000000 --- a/content/docs/stacks/api/mempool/transaction-fee-priorities.mdx +++ /dev/null @@ -1,155 +0,0 @@ ---- -title: Get transaction fee priorities -description: Retrieves estimated fee priorities (in micro-STX) for all transactions that are currently in the mempool. Also returns priorities separated by transaction type. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get mempool transaction fee priorities - -Returns estimated fee priorities (in micro-STX) for all transactions that are currently in the mempool. Also returns priorities separated by transaction type. - - -| Status code | Description | -| :------ | :------ | -| `200` | Mempool fee priorities | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/mempool/fees" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/mempool/fees", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns fee priorities from mempool transactions - - - - - -```json -{ - "all": { - "no_priority": 0, - "low_priority": 0, - "medium_priority": 0, - "high_priority": 0 - }, - "token_transfer": { - "no_priority": 0, - "low_priority": 0, - "medium_priority": 0, - "high_priority": 0 - }, - "smart_contract": { - "no_priority": 0, - "low_priority": 0, - "medium_priority": 0, - "high_priority": 0 - }, - "contract_call": { - "no_priority": 0, - "low_priority": 0, - "medium_priority": 0, - "high_priority": 0 - } -} -``` - - - - - -```ts -/** - * GET request that returns fee priorities from mempool transactions - */ -export interface MempoolFeePriorities { - all: { - no_priority: number; - low_priority: number; - medium_priority: number; - high_priority: number; - }; - token_transfer?: { - no_priority: number; - low_priority: number; - medium_priority: number; - high_priority: number; - }; - smart_contract?: { - no_priority: number; - low_priority: number; - medium_priority: number; - high_priority: number; - }; - contract_call?: { - no_priority: number; - low_priority: number; - medium_priority: number; - high_priority: number; - }; -} -``` - - - - - - - - - - - - - - \ No newline at end of file diff --git a/content/docs/stacks/api/meta.json b/content/docs/stacks/api/meta.json index 402e9e0d4..3f47b5773 100644 --- a/content/docs/stacks/api/meta.json +++ b/content/docs/stacks/api/meta.json @@ -1,32 +1,10 @@ { - "title": "Stacks API", + "title": "APIs", "root": true, "pages": [ "---Stacks Blockchain API---", - "index", - "usage", - "architecture", - "txs", - "---Concepts---", - "concepts/pagination", - "concepts/requesting-proofs", - "concepts/nonce-handling", - "---API Reference---", - "accounts", - "transactions", - "fees", - "faucets", - "blocks", - "burn-blocks", - "mempool", - "smart-contracts", - "proof-of-transfer", - "names", - "tokens", - "non-fungible-tokens", - "stacking-pool", - "stacking-rewards", - "search", - "info" + "...stacks-blockchain", + "---Token Metadata API---", + "...token-metadata" ] } diff --git a/content/docs/stacks/api/microblocks/index.mdx b/content/docs/stacks/api/microblocks/index.mdx deleted file mode 100644 index 0a8e4894b..000000000 --- a/content/docs/stacks/api/microblocks/index.mdx +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Microblocks -index: true -toc: false -description: Retrieve and manage recent microblocks and their associated transactions. ---- \ No newline at end of file diff --git a/content/docs/stacks/api/microblocks/meta.json b/content/docs/stacks/api/microblocks/meta.json deleted file mode 100644 index 3be5388b9..000000000 --- a/content/docs/stacks/api/microblocks/meta.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "title": "Microblocks", - "pages": ["..."], - "defaultOpen": false -} \ No newline at end of file diff --git a/content/docs/stacks/api/names/historical-zonefile.mdx b/content/docs/stacks/api/names/historical-zonefile.mdx deleted file mode 100644 index f2e5f812b..000000000 --- a/content/docs/stacks/api/names/historical-zonefile.mdx +++ /dev/null @@ -1,197 +0,0 @@ ---- -title: Get historical zone file -description: Retrieves the historical zone file for a specific name. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get historical zone file - -Retrieves the historical zonefile specified by the username and zone hash. -### Path Parameters - - - -fully-qualified name - -Example: `"muneeb.id"` - - - - - -zone file hash - -Example: `"b100a68235244b012854a95f9114695679002af9"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | -| `400` | Error | -| `404` | Error | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/v1/names/muneeb.id/zonefile/b100a68235244b012854a95f9114695679002af9" -``` - - - - - -```js -fetch("https://api.hiro.so/v1/names/muneeb.id/zonefile/b100a68235244b012854a95f9114695679002af9", { - method: "GET" -}); -``` - - - - - - - - - -Fetches the historical zonefile specified by the username and zone hash. - - - - - -```json -{ - "zonefile": "string" -} -``` - - - - - -```ts -/** - * Fetches the historical zonefile specified by the username and zone hash. - */ -export type BnsFetchHistoricalZoneFileResponse = - | { - zonefile?: string; - } - | { - error?: string; - }; -``` - - - - - - - - - -Error - - - - - -```json -{ - "error": "string" -} -``` - - - - - -```ts -/** - * Error - */ -export interface BnsError { - error?: string; -} -``` - - - - - - - - - -Error - - - - - -```json -{ - "error": "string" -} -``` - - - - - -```ts -/** - * Error - */ -export interface BnsError { - error?: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/names/name-details.mdx b/content/docs/stacks/api/names/name-details.mdx deleted file mode 100644 index 456a2805c..000000000 --- a/content/docs/stacks/api/names/name-details.mdx +++ /dev/null @@ -1,201 +0,0 @@ ---- -title: Get name details -description: Retrieves details of a given name including the address, status and last transaction ID. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get name details - -Retrieves details of a given name including the `address`, `status` and last transaction id - `last_txid`. -### Path Parameters - - - -fully-qualified name - -Example: `"muneeb.id"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | -| `400` | Error | -| `404` | Error | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/v1/names/muneeb.id" -``` - - - - - -```js -fetch("https://api.hiro.so/v1/names/muneeb.id", { - method: "GET" -}); -``` - - - - - - - - - -Get name details - - - - - -```json -{ - "address": "string", - "blockchain": "string", - "expire_block": 0, - "grace_period": 0, - "last_txid": "string", - "resolver": "string", - "status": "string", - "zonefile": "string", - "zonefile_hash": "string" -} -``` - - - - - -```ts -/** - * Get name details - */ -export interface BnsGetNameInfoResponse { - address: string; - blockchain: string; - expire_block?: number; - grace_period?: number; - last_txid: string; - resolver?: string; - status: string; - zonefile: string; - zonefile_hash: string; -} -``` - - - - - - - - - -Error - - - - - -```json -{ - "error": "string" -} -``` - - - - - -```ts -/** - * Error - */ -export interface BnsError { - error?: string; -} -``` - - - - - - - - - -Error - - - - - -```json -{ - "error": "string" -} -``` - - - - - -```ts -/** - * Error - */ -export interface BnsError { - error?: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/names/name-subdomains.mdx b/content/docs/stacks/api/names/name-subdomains.mdx deleted file mode 100644 index ee76f0ad5..000000000 --- a/content/docs/stacks/api/names/name-subdomains.mdx +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: Get name subdomains -description: Retrieves the list of subdomains for a specific name. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get name subdomains - -Retrieves the list of subdomains for a specific name -### Path Parameters - - - -fully-qualified name - -Example: `"id.blockstack"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/v1/names/id.blockstack/subdomains" -``` - - - - - -```js -fetch("https://api.hiro.so/v1/names/id.blockstack/subdomains", { - method: "GET" -}); -``` - - - - - - - - - -Fetch a list of subdomains in a name. - - - - - -```json -[ - "string" -] -``` - - - - - -```ts -/** - * Fetch a list of subdomains in a name. - */ -export type GetAllSubdomainsInName = string[]; -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/names/name-zonefile.mdx b/content/docs/stacks/api/names/name-zonefile.mdx deleted file mode 100644 index d365f796b..000000000 --- a/content/docs/stacks/api/names/name-zonefile.mdx +++ /dev/null @@ -1,189 +0,0 @@ ---- -title: Get name zone file -description: Retrieves the zone file for a specific name. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get name zone file - -Retrieves a user’s raw zone file. This only works for RFC-compliant zone files. This method returns an error for names that have non-standard zone files. -### Path Parameters - - - -fully-qualified name - -Example: `"bar.test"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | -| `400` | Error | -| `404` | Error | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/v1/names/bar.test/zonefile" -``` - - - - - -```js -fetch("https://api.hiro.so/v1/names/bar.test/zonefile", { - method: "GET" -}); -``` - - - - - - - - - -Fetch a user's raw zone file. This only works for RFC-compliant zone files. This method returns an error for names that have non-standard zone files. - - - - - -```json -{ - "zonefile": "string" -} -``` - - - - - -```ts -/** - * Fetch a user's raw zone file. This only works for RFC-compliant zone files. This method returns an error for names that have non-standard zone files. - */ -export type BnsFetchFileZoneResponse = - | { - zonefile?: string; - } - | { - error?: string; - }; -``` - - - - - - - - - -Error - - - - - -```json -{ - "error": "string" -} -``` - - - - - -```ts -/** - * Error - */ -export interface BnsError { - error?: string; -} -``` - - - - - - - - - -Error - - - - - -```json -{ - "error": "string" -} -``` - - - - - -```ts -/** - * Error - */ -export interface BnsError { - error?: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/names/names.mdx b/content/docs/stacks/api/names/names.mdx deleted file mode 100644 index 29e4e3cd3..000000000 --- a/content/docs/stacks/api/names/names.mdx +++ /dev/null @@ -1,150 +0,0 @@ ---- -title: Get all names -description: Retrieves a list of all names known to the node. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get all names - -Retrieves a list of all names known to the node. - -### Query Parameters - - - -names are defaulted to page 1 with 100 results. You can query specific page results by using the 'page' query parameter. - -Example: `22` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | -| `400` | Error | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/v1/names?page=22" -``` - - - - - -```js -fetch("https://api.hiro.so/v1/names?page=22", { - method: "GET" -}); -``` - - - - - - - - - -Fetch a list of all names known to the node. - - - - - -```json -[ - "string" -] -``` - - - - - -```ts -/** - * Fetch a list of all names known to the node. - */ -export type BnsGetAllNamesResponse = string[]; -``` - - - - - - - - - -Error - - - - - -```json -{ - "error": "string" -} -``` - - - - - -```ts -/** - * Error - */ -export interface BnsError { - error?: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/names/namespace-names.mdx b/content/docs/stacks/api/names/namespace-names.mdx deleted file mode 100644 index d089c684b..000000000 --- a/content/docs/stacks/api/names/namespace-names.mdx +++ /dev/null @@ -1,193 +0,0 @@ ---- -title: Get namespace names -description: Retrieves a list of names within a given namespace. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get namespace names - -Retrieves a list of names within a given namespace. -### Path Parameters - - - -the namespace to fetch names from. - -Example: `"id"` - - - -### Query Parameters - - - -namespace values are defaulted to page 1 with 100 results. You can query specific page results by using the 'page' query parameter. - -Example: `22` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | -| `400` | Error | -| `404` | Error | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/v1/namespaces/id/names?page=22" -``` - - - - - -```js -fetch("https://api.hiro.so/v1/namespaces/id/names?page=22", { - method: "GET" -}); -``` - - - - - - - - - -Fetch a list of names from the namespace. - - - - - -```json -[ - "string" -] -``` - - - - - -```ts -/** - * Fetch a list of names from the namespace. - */ -export type BnsGetAllNamespacesNamesResponse = string[]; -``` - - - - - - - - - -Error - - - - - -```json -{ - "error": "string" -} -``` - - - - - -```ts -/** - * Error - */ -export interface BnsError { - error?: string; -} -``` - - - - - - - - - -Error - - - - - -```json -{ - "error": "string" -} -``` - - - - - -```ts -/** - * Error - */ -export interface BnsError { - error?: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/names/namespaces.mdx b/content/docs/stacks/api/names/namespaces.mdx deleted file mode 100644 index ca9fe2bfa..000000000 --- a/content/docs/stacks/api/names/namespaces.mdx +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: Get all namespaces -description: Retrieves a list of all namespaces known to the node. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get all namespaces - -Retrieves a list of all namespaces known to the node. - -| Status code | Description | -| :------ | :------ | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/v1/namespaces" -``` - - - - - -```js -fetch("https://api.hiro.so/v1/namespaces", { - method: "GET" -}); -``` - - - - - - - - - -Fetch a list of all namespaces known to the node. - - - - - -```json -{ - "namespaces": [ - "string" - ] -} -``` - - - - - -```ts -/** - * Fetch a list of all namespaces known to the node. - */ -export interface BnsGetAllNamespacesResponse { - namespaces: string[]; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/names/owned-by-address.mdx b/content/docs/stacks/api/names/owned-by-address.mdx deleted file mode 100644 index 09610a239..000000000 --- a/content/docs/stacks/api/names/owned-by-address.mdx +++ /dev/null @@ -1,161 +0,0 @@ ---- -title: Get names owned by address -description: Retrieves the list of names owned by a specific address. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get names owned by address - -Retrieves a list of names owned by the address provided. -### Path Parameters - - - -the layer-1 blockchain for the address - -Example: `"bitcoin"` - - - - - -the address to lookup - -Example: `"1QJQxDas5JhdiXhEbNS14iNjr8auFT96GP"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | -| `404` | Error | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/v1/addresses/bitcoin/1QJQxDas5JhdiXhEbNS14iNjr8auFT96GP" -``` - - - - - -```js -fetch("https://api.hiro.so/v1/addresses/bitcoin/1QJQxDas5JhdiXhEbNS14iNjr8auFT96GP", { - method: "GET" -}); -``` - - - - - - - - - -Retrieves a list of names owned by the address provided. - - - - - -```json -{ - "names": [ - "string" - ] -} -``` - - - - - -```ts -/** - * Retrieves a list of names owned by the address provided. - */ -export interface BnsNamesOwnByAddressResponse { - names: string[]; -} -``` - - - - - - - - - -Error - - - - - -```json -{ - "error": "string" -} -``` - - - - - -```ts -/** - * Error - */ -export interface BnsError { - error?: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/non-fungible-tokens/history.mdx b/content/docs/stacks/api/non-fungible-tokens/history.mdx deleted file mode 100644 index 4f1c5fdd8..000000000 --- a/content/docs/stacks/api/non-fungible-tokens/history.mdx +++ /dev/null @@ -1,688 +0,0 @@ ---- -title: Get non-fungible token history -description: Retrieves the history of a non-fungible token. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Non-Fungible Token history - -Retrieves all events relevant to a Non-Fungible Token. Useful to determine the ownership history of a particular asset. - -More information on Non-Fungible Tokens on the Stacks blockchain can be found [here](https://docs.stacks.co/write-smart-contracts/tokens#non-fungible-tokens-nfts). - -### Query Parameters - - - -token asset class identifier - -Example: `"SP2X0TZ59D5SZ8ACQ6YMCHHNR2ZN51Z32E2CJ173.the-explorer-guild::The-Explorer-Guild"` - - - - - -hex representation of the token's unique value - -Example: `"0x0100000000000000000000000000000803"` - - - - - -max number of events to fetch - -Default: `50` - - - - - -index of first event to fetch - -Example: `42000` - -Default: `0` - - - - - -whether or not to include events from unconfirmed transactions - -Example: `true` - -Default: `false` - - - - - -whether or not to include the complete transaction metadata instead of just `tx_id`. Enabling this option can affect performance and response times. - -Default: `false` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Non-Fungible Token event history | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/tokens/nft/history?asset_identifier=SP2X0TZ59D5SZ8ACQ6YMCHHNR2ZN51Z32E2CJ173.the-explorer-guild%3A%3AThe-Explorer-Guild&value=0x0100000000000000000000000000000803&limit=50&offset=42000&unanchored=true&tx_metadata=false" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/tokens/nft/history?asset_identifier=SP2X0TZ59D5SZ8ACQ6YMCHHNR2ZN51Z32E2CJ173.the-explorer-guild%3A%3AThe-Explorer-Guild&value=0x0100000000000000000000000000000803&limit=50&offset=42000&unanchored=true&tx_metadata=false", { - method: "GET" -}); -``` - - - - - - - - - -List of Non-Fungible Token history events - - - - - -```json -{ - "limit": 200, - "offset": 0, - "total": 0, - "results": [ - { - "sender": "string", - "recipient": "string", - "event_index": 0, - "asset_event_type": "string", - "tx_id": "string" - } - ] -} -``` - - - - - -```ts -/** - * Describes an event from the history of a Non-Fungible Token - */ -export type NonFungibleTokenHistoryEvent = - | NonFungibleTokenHistoryEventWithTxId - | NonFungibleTokenHistoryEventWithTxMetadata; -/** - * Describes all transaction types on Stacks 2.0 blockchain - */ -export type Transaction = - | TokenTransferTransaction - | SmartContractTransaction - | ContractCallTransaction - | PoisonMicroblockTransaction - | CoinbaseTransaction - | TenureChangeTransaction; -/** - * Describes representation of a Type-0 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-0-transferring-an-asset - */ -export type TokenTransferTransaction = AbstractTransaction & TokenTransferTransactionMetadata; -/** - * Anchored transaction metadata. All mined/anchored Stacks transactions have these properties. - */ -export type AbstractTransaction = BaseTransaction & { - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - tx_status: TransactionStatus; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - /** - * List of transaction events - */ - events: TransactionEvent[]; -}; -export type PostConditionMode = "allow" | "deny"; -/** - * Post-conditionscan limit the damage done to a user's assets - */ -export type PostCondition = PostConditionStx | PostConditionFungible | PostConditionNonFungible; -export type PostConditionStx = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - amount: string; - type: "stx"; -}; -export type PostConditionPrincipal = - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_origin"; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_standard"; - address: string; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_contract"; - address: string; - contract_name: string; - }; -/** - * A fungible condition code encodes a statement being made for either STX or a fungible token, with respect to the originating account. - */ -export type PostConditionFungibleConditionCode = - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; -export type PostConditionFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - type: "fungible"; - amount: string; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -export type PostConditionNonFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionNonFungibleConditionCode; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -/** - * A non-fungible condition code encodes a statement being made about a non-fungible token, with respect to whether or not the particular non-fungible token is owned by the account. - */ -export type PostConditionNonFungibleConditionCode = "sent" | "not_sent"; -/** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ -export type TransactionAnchorModeType = "on_chain_only" | "off_chain_only" | "any"; -/** - * Status of the transaction - */ -export type TransactionStatus = "success" | "abort_by_response" | "abort_by_post_condition"; -export type TransactionEvent = - | TransactionEventSmartContractLog - | TransactionEventStxLock - | TransactionEventStxAsset - | TransactionEventFungibleAsset - | TransactionEventNonFungibleAsset; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventSmartContractLog = AbstractTransactionEvent & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxLock = AbstractTransactionEvent & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxAsset = AbstractTransactionEvent & { - event_type: "stx_asset"; - tx_id: string; - asset: TransactionEventAsset; -}; -export type TransactionEventAssetType = "transfer" | "mint" | "burn"; -export type TransactionEventFungibleAsset = AbstractTransactionEvent & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type TransactionEventNonFungibleAsset = AbstractTransactionEvent & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Describes representation of a Type-1 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export type SmartContractTransaction = AbstractTransaction & SmartContractTransactionMetadata; -/** - * Describes representation of a Type 2 Stacks 2.0 transaction: Contract Call - */ -export type ContractCallTransaction = AbstractTransaction & ContractCallTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type PoisonMicroblockTransaction = AbstractTransaction & PoisonMicroblockTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type CoinbaseTransaction = AbstractTransaction & CoinbaseTransactionMetadata; -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export type TenureChangeTransaction = AbstractTransaction & TenureChangeTransactionMetadata; - -/** - * List of Non-Fungible Token history events - */ -export interface NonFungibleTokenHistoryEventList { - /** - * The number of events to return - */ - limit: number; - /** - * The number to events to skip (starting at `0`) - */ - offset: number; - /** - * The number of events available - */ - total: number; - results: NonFungibleTokenHistoryEvent[]; -} -/** - * Non-Fungible Token history event with transaction id - */ -export interface NonFungibleTokenHistoryEventWithTxId { - sender?: string; - recipient?: string; - event_index: number; - asset_event_type: string; - tx_id: string; -} -/** - * Non-Fungible Token history event with transaction metadata - */ -export interface NonFungibleTokenHistoryEventWithTxMetadata { - sender?: string; - recipient?: string; - event_index: number; - asset_event_type: string; - tx: Transaction; -} -/** - * Transaction properties that are available from a raw serialized transactions. These are available for transactions in the mempool as well as mined transactions. - */ -export interface BaseTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: PostConditionMode; - post_conditions: PostCondition[]; - anchor_mode: TransactionAnchorModeType; -} -export interface AbstractTransactionEvent { - event_index: number; -} -export interface TransactionEventAsset { - asset_event_type?: TransactionEventAssetType; - asset_id?: string; - sender?: string; - recipient?: string; - amount?: string; - value?: string; - memo?: string; -} -/** - * Metadata associated with token-transfer type transactions - */ -export interface TokenTransferTransactionMetadata { - tx_type: "token_transfer"; - token_transfer: { - recipient_address: string; - /** - * Transfer amount as Integer string (64-bit unsigned integer) - */ - amount: string; - /** - * Hex encoded arbitrary message, up to 34 bytes length (should try decoding to an ASCII string) - */ - memo: string; - }; -} -/** - * Metadata associated with a contract-deploy type transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export interface SmartContractTransactionMetadata { - tx_type: "smart_contract"; - smart_contract: { - /** - * The Clarity version of the contract, only specified for versioned contract transactions, otherwise null - */ - clarity_version?: number; - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Clarity code of the smart contract being deployed - */ - source_code: string; - }; -} -/** - * Metadata associated with a contract-call type transaction - */ -export interface ContractCallTransactionMetadata { - tx_type: "contract_call"; - contract_call: { - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Name of the Clarity function to be invoked - */ - function_name: string; - /** - * Function definition, including function name and type as well as parameter names and types - */ - function_signature: string; - /** - * List of arguments used to invoke the function - */ - function_args?: { - hex: string; - repr: string; - name: string; - type: string; - }[]; - }; -} -/** - * Metadata associated with a poison-microblock type transaction - */ -export interface PoisonMicroblockTransactionMetadata { - tx_type: "poison_microblock"; - poison_microblock: { - /** - * Hex encoded microblock header - */ - microblock_header_1: string; - /** - * Hex encoded microblock header - */ - microblock_header_2: string; - }; -} -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export interface CoinbaseTransactionMetadata { - tx_type: "coinbase"; - coinbase_payload: { - /** - * Hex encoded 32-byte scratch space for block leader's use - */ - data: string; - /** - * A principal that will receive the miner rewards for this coinbase transaction. Can be either a standard principal or contract principal. Only specified for `coinbase-to-alt-recipient` transaction types, otherwise null. - */ - alt_recipient?: string; - /** - * Hex encoded 80-byte VRF proof - */ - vrf_proof?: string; - }; -} -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export interface TenureChangeTransactionMetadata { - tx_type: "tenure_change"; - tenure_change_payload?: { - /** - * Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. - */ - tenure_consensus_hash: string; - /** - * Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. - */ - prev_tenure_consensus_hash: string; - /** - * Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. - */ - burn_view_consensus_hash: string; - /** - * (Hex string) Stacks Block hash - */ - previous_tenure_end: string; - /** - * The number of blocks produced in the previous tenure. - */ - previous_tenure_blocks: number; - /** - * Cause of change in mining tenure. Depending on cause, tenure can be ended or extended. - */ - cause: "block_found" | "extended"; - /** - * (Hex string) The ECDSA public key hash of the current tenure. - */ - pubkey_hash: string; - }; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/non-fungible-tokens/holdings.mdx b/content/docs/stacks/api/non-fungible-tokens/holdings.mdx deleted file mode 100644 index 0fe127495..000000000 --- a/content/docs/stacks/api/non-fungible-tokens/holdings.mdx +++ /dev/null @@ -1,711 +0,0 @@ ---- -title: Get non-fungible token holdings -description: Retrieves a list of non-fungible tokens owned by the given principal (STX address or smart contract ID). -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Non-Fungible Token holdings - -Retrieves the list of Non-Fungible Tokens owned by the given principal (STX address or Smart Contract ID). -Results can be filtered by one or more asset identifiers and can include metadata about the transaction that made the principal own each token. - -More information on Non-Fungible Tokens on the Stacks blockchain can be found [here](https://docs.stacks.co/write-smart-contracts/tokens#non-fungible-tokens-nfts). - -### Query Parameters - - - -token owner's STX address or Smart Contract ID - -Example: `"SPNWZ5V2TPWGQGVDR6T7B6RQ4XMGZ4PXTEE0VQ0S.marketplace-v3"` - - - -"} required={false} deprecated={false}> - -identifiers of the token asset classes to filter for - -Example: `"SPQZF23W7SEYBFG5JQ496NMY0G7379SRYEDREMSV.Candy::candy"` - - - - - -max number of tokens to fetch - -Default: `50` - - - - - -index of first tokens to fetch - -Example: `42000` - -Default: `0` - - - - - -whether or not to include tokens from unconfirmed transactions - -Example: `true` - -Default: `false` - - - - - -whether or not to include the complete transaction metadata instead of just `tx_id`. Enabling this option can affect performance and response times. - -Default: `false` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of Non-Fungible Token holdings | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/tokens/nft/holdings?principal=SPNWZ5V2TPWGQGVDR6T7B6RQ4XMGZ4PXTEE0VQ0S.marketplace-v3&asset_identifiers=SPQZF23W7SEYBFG5JQ496NMY0G7379SRYEDREMSV.Candy%3A%3Acandy&limit=50&offset=42000&unanchored=true&tx_metadata=false" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/tokens/nft/holdings?principal=SPNWZ5V2TPWGQGVDR6T7B6RQ4XMGZ4PXTEE0VQ0S.marketplace-v3&asset_identifiers=SPQZF23W7SEYBFG5JQ496NMY0G7379SRYEDREMSV.Candy%3A%3Acandy&limit=50&offset=42000&unanchored=true&tx_metadata=false", { - method: "GET" -}); -``` - - - - - - - - - -List of Non-Fungible Token holdings - - - - - -```json -{ - "limit": 200, - "offset": 0, - "total": 0, - "results": [ - { - "asset_identifier": "string", - "value": { - "hex": "string", - "repr": "string" - }, - "block_height": 0, - "tx_id": "string" - } - ] -} -``` - - - - - -```ts -/** - * Describes the ownership of a Non-Fungible Token - */ -export type NonFungibleTokenHolding = NonFungibleTokenHoldingWithTxId | NonFungibleTokenHoldingWithTxMetadata; -/** - * Describes all transaction types on Stacks 2.0 blockchain - */ -export type Transaction = - | TokenTransferTransaction - | SmartContractTransaction - | ContractCallTransaction - | PoisonMicroblockTransaction - | CoinbaseTransaction - | TenureChangeTransaction; -/** - * Describes representation of a Type-0 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-0-transferring-an-asset - */ -export type TokenTransferTransaction = AbstractTransaction & TokenTransferTransactionMetadata; -/** - * Anchored transaction metadata. All mined/anchored Stacks transactions have these properties. - */ -export type AbstractTransaction = BaseTransaction & { - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - tx_status: TransactionStatus; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - /** - * List of transaction events - */ - events: TransactionEvent[]; -}; -export type PostConditionMode = "allow" | "deny"; -/** - * Post-conditionscan limit the damage done to a user's assets - */ -export type PostCondition = PostConditionStx | PostConditionFungible | PostConditionNonFungible; -export type PostConditionStx = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - amount: string; - type: "stx"; -}; -export type PostConditionPrincipal = - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_origin"; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_standard"; - address: string; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_contract"; - address: string; - contract_name: string; - }; -/** - * A fungible condition code encodes a statement being made for either STX or a fungible token, with respect to the originating account. - */ -export type PostConditionFungibleConditionCode = - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; -export type PostConditionFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - type: "fungible"; - amount: string; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -export type PostConditionNonFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionNonFungibleConditionCode; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -/** - * A non-fungible condition code encodes a statement being made about a non-fungible token, with respect to whether or not the particular non-fungible token is owned by the account. - */ -export type PostConditionNonFungibleConditionCode = "sent" | "not_sent"; -/** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ -export type TransactionAnchorModeType = "on_chain_only" | "off_chain_only" | "any"; -/** - * Status of the transaction - */ -export type TransactionStatus = "success" | "abort_by_response" | "abort_by_post_condition"; -export type TransactionEvent = - | TransactionEventSmartContractLog - | TransactionEventStxLock - | TransactionEventStxAsset - | TransactionEventFungibleAsset - | TransactionEventNonFungibleAsset; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventSmartContractLog = AbstractTransactionEvent & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxLock = AbstractTransactionEvent & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxAsset = AbstractTransactionEvent & { - event_type: "stx_asset"; - tx_id: string; - asset: TransactionEventAsset; -}; -export type TransactionEventAssetType = "transfer" | "mint" | "burn"; -export type TransactionEventFungibleAsset = AbstractTransactionEvent & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type TransactionEventNonFungibleAsset = AbstractTransactionEvent & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Describes representation of a Type-1 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export type SmartContractTransaction = AbstractTransaction & SmartContractTransactionMetadata; -/** - * Describes representation of a Type 2 Stacks 2.0 transaction: Contract Call - */ -export type ContractCallTransaction = AbstractTransaction & ContractCallTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type PoisonMicroblockTransaction = AbstractTransaction & PoisonMicroblockTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type CoinbaseTransaction = AbstractTransaction & CoinbaseTransactionMetadata; -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export type TenureChangeTransaction = AbstractTransaction & TenureChangeTransactionMetadata; - -/** - * List of Non-Fungible Token holdings - */ -export interface NonFungibleTokenHoldingsList { - /** - * The number of Non-Fungible Token holdings to return - */ - limit: number; - /** - * The number to Non-Fungible Token holdings to skip (starting at `0`) - */ - offset: number; - /** - * The number of Non-Fungible Token holdings available - */ - total: number; - results: NonFungibleTokenHolding[]; -} -/** - * Ownership of a Non-Fungible Token - */ -export interface NonFungibleTokenHoldingWithTxId { - asset_identifier: string; - /** - * Non-Fungible Token value - */ - value: { - /** - * Hex string representing the identifier of the Non-Fungible Token - */ - hex: string; - /** - * Readable string of the Non-Fungible Token identifier - */ - repr: string; - }; - block_height: number; - tx_id: string; -} -/** - * Ownership of a Non-Fungible Token with transaction metadata - */ -export interface NonFungibleTokenHoldingWithTxMetadata { - asset_identifier: string; - /** - * Non-Fungible Token value - */ - value: { - /** - * Hex string representing the identifier of the Non-Fungible Token - */ - hex: string; - /** - * Readable string of the Non-Fungible Token identifier - */ - repr: string; - }; - block_height: number; - tx: Transaction; -} -/** - * Transaction properties that are available from a raw serialized transactions. These are available for transactions in the mempool as well as mined transactions. - */ -export interface BaseTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: PostConditionMode; - post_conditions: PostCondition[]; - anchor_mode: TransactionAnchorModeType; -} -export interface AbstractTransactionEvent { - event_index: number; -} -export interface TransactionEventAsset { - asset_event_type?: TransactionEventAssetType; - asset_id?: string; - sender?: string; - recipient?: string; - amount?: string; - value?: string; - memo?: string; -} -/** - * Metadata associated with token-transfer type transactions - */ -export interface TokenTransferTransactionMetadata { - tx_type: "token_transfer"; - token_transfer: { - recipient_address: string; - /** - * Transfer amount as Integer string (64-bit unsigned integer) - */ - amount: string; - /** - * Hex encoded arbitrary message, up to 34 bytes length (should try decoding to an ASCII string) - */ - memo: string; - }; -} -/** - * Metadata associated with a contract-deploy type transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export interface SmartContractTransactionMetadata { - tx_type: "smart_contract"; - smart_contract: { - /** - * The Clarity version of the contract, only specified for versioned contract transactions, otherwise null - */ - clarity_version?: number; - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Clarity code of the smart contract being deployed - */ - source_code: string; - }; -} -/** - * Metadata associated with a contract-call type transaction - */ -export interface ContractCallTransactionMetadata { - tx_type: "contract_call"; - contract_call: { - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Name of the Clarity function to be invoked - */ - function_name: string; - /** - * Function definition, including function name and type as well as parameter names and types - */ - function_signature: string; - /** - * List of arguments used to invoke the function - */ - function_args?: { - hex: string; - repr: string; - name: string; - type: string; - }[]; - }; -} -/** - * Metadata associated with a poison-microblock type transaction - */ -export interface PoisonMicroblockTransactionMetadata { - tx_type: "poison_microblock"; - poison_microblock: { - /** - * Hex encoded microblock header - */ - microblock_header_1: string; - /** - * Hex encoded microblock header - */ - microblock_header_2: string; - }; -} -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export interface CoinbaseTransactionMetadata { - tx_type: "coinbase"; - coinbase_payload: { - /** - * Hex encoded 32-byte scratch space for block leader's use - */ - data: string; - /** - * A principal that will receive the miner rewards for this coinbase transaction. Can be either a standard principal or contract principal. Only specified for `coinbase-to-alt-recipient` transaction types, otherwise null. - */ - alt_recipient?: string; - /** - * Hex encoded 80-byte VRF proof - */ - vrf_proof?: string; - }; -} -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export interface TenureChangeTransactionMetadata { - tx_type: "tenure_change"; - tenure_change_payload?: { - /** - * Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. - */ - tenure_consensus_hash: string; - /** - * Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. - */ - prev_tenure_consensus_hash: string; - /** - * Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. - */ - burn_view_consensus_hash: string; - /** - * (Hex string) Stacks Block hash - */ - previous_tenure_end: string; - /** - * The number of blocks produced in the previous tenure. - */ - previous_tenure_blocks: number; - /** - * Cause of change in mining tenure. Depending on cause, tenure can be ended or extended. - */ - cause: "block_found" | "extended"; - /** - * (Hex string) The ECDSA public key hash of the current tenure. - */ - pubkey_hash: string; - }; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/non-fungible-tokens/mints.mdx b/content/docs/stacks/api/non-fungible-tokens/mints.mdx deleted file mode 100644 index 1f9d209df..000000000 --- a/content/docs/stacks/api/non-fungible-tokens/mints.mdx +++ /dev/null @@ -1,702 +0,0 @@ ---- -title: Get non-fungible token mints -description: Retrieves a list of non-fungible token mints for a given asset identifier. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Non-Fungible Token mints - -Retrieves all mint events for a Non-Fungible Token asset class. Useful to determine which NFTs of a particular collection have been claimed. - -More information on Non-Fungible Tokens on the Stacks blockchain can be found [here](https://docs.stacks.co/write-smart-contracts/tokens#non-fungible-tokens-nfts). - -### Query Parameters - - - -token asset class identifier - -Example: `"SP2X0TZ59D5SZ8ACQ6YMCHHNR2ZN51Z32E2CJ173.the-explorer-guild::The-Explorer-Guild"` - - - - - -max number of events to fetch - -Default: `50` - - - - - -index of first event to fetch - -Example: `42000` - -Default: `0` - - - - - -whether or not to include events from unconfirmed transactions - -Example: `true` - -Default: `false` - - - - - -whether or not to include the complete transaction metadata instead of just `tx_id`. Enabling this option can affect performance and response times. - -Default: `false` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Non-Fungible Token mints | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/tokens/nft/mints?asset_identifier=SP2X0TZ59D5SZ8ACQ6YMCHHNR2ZN51Z32E2CJ173.the-explorer-guild%3A%3AThe-Explorer-Guild&limit=50&offset=42000&unanchored=true&tx_metadata=false" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/tokens/nft/mints?asset_identifier=SP2X0TZ59D5SZ8ACQ6YMCHHNR2ZN51Z32E2CJ173.the-explorer-guild%3A%3AThe-Explorer-Guild&limit=50&offset=42000&unanchored=true&tx_metadata=false", { - method: "GET" -}); -``` - - - - - - - - - -List of Non-Fungible Token mint events for an asset identifier - - - - - -```json -{ - "limit": 200, - "offset": 0, - "total": 0, - "results": [ - { - "recipient": "string", - "event_index": 0, - "value": { - "hex": "string", - "repr": "string" - }, - "tx_id": "string" - } - ] -} -``` - - - - - -```ts -/** - * Describes the minting of a Non-Fungible Token - */ -export type NonFungibleTokenMint = NonFungibleTokenMintWithTxId | NonFungibleTokenMintWithTxMetadata; -/** - * Describes all transaction types on Stacks 2.0 blockchain - */ -export type Transaction = - | TokenTransferTransaction - | SmartContractTransaction - | ContractCallTransaction - | PoisonMicroblockTransaction - | CoinbaseTransaction - | TenureChangeTransaction; -/** - * Describes representation of a Type-0 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-0-transferring-an-asset - */ -export type TokenTransferTransaction = AbstractTransaction & TokenTransferTransactionMetadata; -/** - * Anchored transaction metadata. All mined/anchored Stacks transactions have these properties. - */ -export type AbstractTransaction = BaseTransaction & { - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - tx_status: TransactionStatus; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - /** - * List of transaction events - */ - events: TransactionEvent[]; -}; -export type PostConditionMode = "allow" | "deny"; -/** - * Post-conditionscan limit the damage done to a user's assets - */ -export type PostCondition = PostConditionStx | PostConditionFungible | PostConditionNonFungible; -export type PostConditionStx = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - amount: string; - type: "stx"; -}; -export type PostConditionPrincipal = - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_origin"; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_standard"; - address: string; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_contract"; - address: string; - contract_name: string; - }; -/** - * A fungible condition code encodes a statement being made for either STX or a fungible token, with respect to the originating account. - */ -export type PostConditionFungibleConditionCode = - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; -export type PostConditionFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - type: "fungible"; - amount: string; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -export type PostConditionNonFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionNonFungibleConditionCode; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -/** - * A non-fungible condition code encodes a statement being made about a non-fungible token, with respect to whether or not the particular non-fungible token is owned by the account. - */ -export type PostConditionNonFungibleConditionCode = "sent" | "not_sent"; -/** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ -export type TransactionAnchorModeType = "on_chain_only" | "off_chain_only" | "any"; -/** - * Status of the transaction - */ -export type TransactionStatus = "success" | "abort_by_response" | "abort_by_post_condition"; -export type TransactionEvent = - | TransactionEventSmartContractLog - | TransactionEventStxLock - | TransactionEventStxAsset - | TransactionEventFungibleAsset - | TransactionEventNonFungibleAsset; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventSmartContractLog = AbstractTransactionEvent & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxLock = AbstractTransactionEvent & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxAsset = AbstractTransactionEvent & { - event_type: "stx_asset"; - tx_id: string; - asset: TransactionEventAsset; -}; -export type TransactionEventAssetType = "transfer" | "mint" | "burn"; -export type TransactionEventFungibleAsset = AbstractTransactionEvent & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type TransactionEventNonFungibleAsset = AbstractTransactionEvent & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Describes representation of a Type-1 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export type SmartContractTransaction = AbstractTransaction & SmartContractTransactionMetadata; -/** - * Describes representation of a Type 2 Stacks 2.0 transaction: Contract Call - */ -export type ContractCallTransaction = AbstractTransaction & ContractCallTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type PoisonMicroblockTransaction = AbstractTransaction & PoisonMicroblockTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type CoinbaseTransaction = AbstractTransaction & CoinbaseTransactionMetadata; -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export type TenureChangeTransaction = AbstractTransaction & TenureChangeTransactionMetadata; - -/** - * List of Non-Fungible Token mint events for an asset identifier - */ -export interface NonFungibleTokenMintList { - /** - * The number of mint events to return - */ - limit: number; - /** - * The number to mint events to skip (starting at `0`) - */ - offset: number; - /** - * The number of mint events available - */ - total: number; - results: NonFungibleTokenMint[]; -} -/** - * Non-Fungible Token mint event with transaction id - */ -export interface NonFungibleTokenMintWithTxId { - recipient?: string; - event_index: number; - /** - * Non-Fungible Token value - */ - value: { - /** - * Hex string representing the identifier of the Non-Fungible Token - */ - hex: string; - /** - * Readable string of the Non-Fungible Token identifier - */ - repr: string; - }; - tx_id: string; -} -/** - * Non-Fungible Token mint event with transaction metadata - */ -export interface NonFungibleTokenMintWithTxMetadata { - recipient?: string; - event_index: number; - /** - * Non-Fungible Token value - */ - value: { - /** - * Hex string representing the identifier of the Non-Fungible Token - */ - hex: string; - /** - * Readable string of the Non-Fungible Token identifier - */ - repr: string; - }; - tx: Transaction; -} -/** - * Transaction properties that are available from a raw serialized transactions. These are available for transactions in the mempool as well as mined transactions. - */ -export interface BaseTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: PostConditionMode; - post_conditions: PostCondition[]; - anchor_mode: TransactionAnchorModeType; -} -export interface AbstractTransactionEvent { - event_index: number; -} -export interface TransactionEventAsset { - asset_event_type?: TransactionEventAssetType; - asset_id?: string; - sender?: string; - recipient?: string; - amount?: string; - value?: string; - memo?: string; -} -/** - * Metadata associated with token-transfer type transactions - */ -export interface TokenTransferTransactionMetadata { - tx_type: "token_transfer"; - token_transfer: { - recipient_address: string; - /** - * Transfer amount as Integer string (64-bit unsigned integer) - */ - amount: string; - /** - * Hex encoded arbitrary message, up to 34 bytes length (should try decoding to an ASCII string) - */ - memo: string; - }; -} -/** - * Metadata associated with a contract-deploy type transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export interface SmartContractTransactionMetadata { - tx_type: "smart_contract"; - smart_contract: { - /** - * The Clarity version of the contract, only specified for versioned contract transactions, otherwise null - */ - clarity_version?: number; - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Clarity code of the smart contract being deployed - */ - source_code: string; - }; -} -/** - * Metadata associated with a contract-call type transaction - */ -export interface ContractCallTransactionMetadata { - tx_type: "contract_call"; - contract_call: { - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Name of the Clarity function to be invoked - */ - function_name: string; - /** - * Function definition, including function name and type as well as parameter names and types - */ - function_signature: string; - /** - * List of arguments used to invoke the function - */ - function_args?: { - hex: string; - repr: string; - name: string; - type: string; - }[]; - }; -} -/** - * Metadata associated with a poison-microblock type transaction - */ -export interface PoisonMicroblockTransactionMetadata { - tx_type: "poison_microblock"; - poison_microblock: { - /** - * Hex encoded microblock header - */ - microblock_header_1: string; - /** - * Hex encoded microblock header - */ - microblock_header_2: string; - }; -} -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export interface CoinbaseTransactionMetadata { - tx_type: "coinbase"; - coinbase_payload: { - /** - * Hex encoded 32-byte scratch space for block leader's use - */ - data: string; - /** - * A principal that will receive the miner rewards for this coinbase transaction. Can be either a standard principal or contract principal. Only specified for `coinbase-to-alt-recipient` transaction types, otherwise null. - */ - alt_recipient?: string; - /** - * Hex encoded 80-byte VRF proof - */ - vrf_proof?: string; - }; -} -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export interface TenureChangeTransactionMetadata { - tx_type: "tenure_change"; - tenure_change_payload?: { - /** - * Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. - */ - tenure_consensus_hash: string; - /** - * Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. - */ - prev_tenure_consensus_hash: string; - /** - * Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. - */ - burn_view_consensus_hash: string; - /** - * (Hex string) Stacks Block hash - */ - previous_tenure_end: string; - /** - * The number of blocks produced in the previous tenure. - */ - previous_tenure_blocks: number; - /** - * Cause of change in mining tenure. Depending on cause, tenure can be ended or extended. - */ - cause: "block_found" | "extended"; - /** - * (Hex string) The ECDSA public key hash of the current tenure. - */ - pubkey_hash: string; - }; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/concepts/nonce-handling.mdx b/content/docs/stacks/api/nonce-handling.mdx similarity index 100% rename from content/docs/stacks/api/concepts/nonce-handling.mdx rename to content/docs/stacks/api/nonce-handling.mdx diff --git a/content/docs/stacks/api/concepts/pagination.mdx b/content/docs/stacks/api/pagination.mdx similarity index 100% rename from content/docs/stacks/api/concepts/pagination.mdx rename to content/docs/stacks/api/pagination.mdx diff --git a/content/docs/stacks/api/proof-of-transfer/cycle.mdx b/content/docs/stacks/api/proof-of-transfer/cycle.mdx deleted file mode 100644 index d471cd8f4..000000000 --- a/content/docs/stacks/api/proof-of-transfer/cycle.mdx +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: Get PoX cycle -description: Retrieves details for a PoX cycle. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get PoX cycle - -Retrieves details for a PoX cycle -### Path Parameters - - - -PoX cycle number - -Example: `56` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Details for cycle | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/pox/cycles/56" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/pox/cycles/56", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "block_height": 0, - "index_block_hash": "string", - "cycle_number": 0, - "total_weight": 0, - "total_stacked_amount": "string", - "total_signers": 0 -} -``` - - - - - -```ts -export interface PoxCycle { - block_height: number; - index_block_hash: string; - cycle_number: number; - total_weight: number; - total_stacked_amount: string; - total_signers: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/proof-of-transfer/cycles.mdx b/content/docs/stacks/api/proof-of-transfer/cycles.mdx deleted file mode 100644 index 88c874747..000000000 --- a/content/docs/stacks/api/proof-of-transfer/cycles.mdx +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Get PoX cycles -description: Retrieves a list of PoX cycles. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get PoX cycles - -Retrieves a list of PoX cycles - -### Query Parameters - - - -max number of cycles to fetch - -Default: `20` - -Maximum: `60` - - - - - -index of first cycle to fetch - -Example: `20` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of cycles | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/pox/cycles?limit=20&offset=20" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/pox/cycles?limit=20&offset=20", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns PoX cycles - - - - - -```json -{ - "limit": 200, - "offset": 0, - "total": 0, - "results": [ - { - "block_height": 0, - "index_block_hash": "string", - "cycle_number": 0, - "total_weight": 0, - "total_stacked_amount": "string", - "total_signers": 0 - } - ] -} -``` - - - - - -```ts -/** - * GET request that returns PoX cycles - */ -export interface PoxCycleListResponse { - /** - * The number of cycles to return - */ - limit: number; - /** - * The number to cycles to skip (starting at `0`) - */ - offset: number; - /** - * The total number of cycles - */ - total: number; - results: PoxCycle[]; -} -export interface PoxCycle { - block_height: number; - index_block_hash: string; - cycle_number: number; - total_weight: number; - total_stacked_amount: string; - total_signers: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/proof-of-transfer/signer-in-cycle.mdx b/content/docs/stacks/api/proof-of-transfer/signer-in-cycle.mdx deleted file mode 100644 index e5ca9ce59..000000000 --- a/content/docs/stacks/api/proof-of-transfer/signer-in-cycle.mdx +++ /dev/null @@ -1,143 +0,0 @@ ---- -title: Get signer in PoX cycle -description: Retrieves details for a signer in a PoX cycle. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get signer in PoX cycle - -Retrieves details for a signer in a PoX cycle -### Path Parameters - - - -PoX cycle number - -Example: `56` - - - - - -Signer key - -Example: `"0x038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Details for PoX signer | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/pox/cycles/56/signers/0x038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/pox/cycles/56/signers/0x038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "signing_key": "string", - "signer_address": "string", - "weight": 0, - "stacked_amount": "string", - "weight_percent": 0, - "stacked_amount_percent": 0, - "solo_stacker_count": 0, - "pooled_stacker_count": 0 -} -``` - - - - - -```ts -export interface PoxSigner { - signing_key: string; - /** - * The Stacks address derived from the signing_key. - */ - signer_address: string; - weight: number; - stacked_amount: string; - weight_percent: number; - stacked_amount_percent: number; - /** - * The number of solo stackers associated with this signer. - */ - solo_stacker_count: number; - /** - * The number of pooled stackers associated with this signer. - */ - pooled_stacker_count: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/proof-of-transfer/signers-in-cycle.mdx b/content/docs/stacks/api/proof-of-transfer/signers-in-cycle.mdx deleted file mode 100644 index 4bb6f888c..000000000 --- a/content/docs/stacks/api/proof-of-transfer/signers-in-cycle.mdx +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: Get signers in PoX cycle -description: Retrieves a list of signers in a PoX cycle. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get signers in PoX cycle - -Retrieves a list of signers in a PoX cycle -### Path Parameters - - - -PoX cycle number - -Example: `56` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of signers for cycle | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/pox/cycles/56/signers" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/pox/cycles/56/signers", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns signers for a PoX cycle - - - - - -```json -{ - "limit": 200, - "offset": 0, - "total": 0, - "results": [ - { - "signing_key": "string", - "signer_address": "string", - "weight": 0, - "stacked_amount": "string", - "weight_percent": 0, - "stacked_amount_percent": 0, - "solo_stacker_count": 0, - "pooled_stacker_count": 0 - } - ] -} -``` - - - - - -```ts -/** - * GET request that returns signers for a PoX cycle - */ -export interface PoxCycleSignersListResponse { - /** - * The number of signers to return - */ - limit: number; - /** - * The number to signers to skip (starting at `0`) - */ - offset: number; - /** - * The total number of signers - */ - total: number; - results: PoxSigner[]; -} -export interface PoxSigner { - signing_key: string; - /** - * The Stacks address derived from the signing_key. - */ - signer_address: string; - weight: number; - stacked_amount: string; - weight_percent: number; - stacked_amount_percent: number; - /** - * The number of solo stackers associated with this signer. - */ - solo_stacker_count: number; - /** - * The number of pooled stackers associated with this signer. - */ - pooled_stacker_count: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/proof-of-transfer/stackers-for-signer-in-cycle.mdx b/content/docs/stacks/api/proof-of-transfer/stackers-for-signer-in-cycle.mdx deleted file mode 100644 index 55b2e08ed..000000000 --- a/content/docs/stacks/api/proof-of-transfer/stackers-for-signer-in-cycle.mdx +++ /dev/null @@ -1,153 +0,0 @@ ---- -title: Get stackers for signer in PoX cycle -description: Retrieves a list of stackers for a signer in a PoX cycle. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get stackers for signer in PoX cycle - -Retrieves a list of stackers for a signer in a PoX cycle -### Path Parameters - - - -PoX cycle number - -Example: `56` - - - - - -Signer key - -Example: `"0x038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of stackers | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/pox/cycles/56/signers/0x038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d/stackers" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/pox/cycles/56/signers/0x038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d/stackers", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns stackers for a signer in a PoX cycle - - - - - -```json -{ - "limit": 200, - "offset": 0, - "total": 0, - "results": [ - { - "stacker_address": "string", - "stacked_amount": "string", - "pox_address": "string", - "stacker_type": "solo" - } - ] -} -``` - - - - - -```ts -/** - * GET request that returns stackers for a signer in a PoX cycle - */ -export interface PoxCycleSignerStackersListResponse { - /** - * The number of stackers to return - */ - limit: number; - /** - * The number to stackers to skip (starting at `0`) - */ - offset: number; - /** - * The total number of stackers - */ - total: number; - results: PoxStacker[]; -} -export interface PoxStacker { - stacker_address: string; - stacked_amount: string; - pox_address: string; - stacker_type: "solo" | "pooled"; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/concepts/requesting-proofs.mdx b/content/docs/stacks/api/requesting-proofs.mdx similarity index 100% rename from content/docs/stacks/api/concepts/requesting-proofs.mdx rename to content/docs/stacks/api/requesting-proofs.mdx diff --git a/content/docs/stacks/api/search/search-by-id.mdx b/content/docs/stacks/api/search/search-by-id.mdx deleted file mode 100644 index 6973534d9..000000000 --- a/content/docs/stacks/api/search/search-by-id.mdx +++ /dev/null @@ -1,999 +0,0 @@ ---- -title: Search by ID -description: Search blocks, transactions, contracts, or accounts by hash/ID. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Search - -Search blocks, transactions, contracts, or accounts by hash/ID -### Path Parameters - - - -The hex hash string for a block or transaction, account address, or contract address - -Example: `"0xcf8b233f19f6c07d2dc1963302d2436efd36e9afac127bf6582824a13961c06d"` - - -### Query Parameters - - - -This includes the detailed data for purticular hash in the response - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | -| `404` | Not found | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/search/0xcf8b233f19f6c07d2dc1963302d2436efd36e9afac127bf6582824a13961c06d?include_metadata=true" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/search/0xcf8b233f19f6c07d2dc1963302d2436efd36e9afac127bf6582824a13961c06d?include_metadata=true", { - method: "GET" -}); -``` - - - - - - - - - -complete search result for terms - - - - - -```json -{ - "found": false, - "result": { - "entity_type": "standard_address" - }, - "error": "string" -} -``` - - - - - -```ts -/** - * complete search result for terms - */ -export type SearchResult = SearchErrorResult | SearchSuccessResult; -/** - * Search success result - */ -export type SearchSuccessResult = - | AddressSearchResult - | BlockSearchResult - | ContractSearchResult - | MempoolTxSearchResult - | TxSearchResult; -/** - * GET request that returns address balances - */ -export type AddressStxBalanceResponse = StxBalance & { - token_offering_locked?: AddressTokenOfferingLocked; -}; -/** - * Describes all transaction types on Stacks 2.0 blockchain - */ -export type MempoolTransaction = - | MempoolTokenTransferTransaction - | MempoolSmartContractTransaction - | MempoolContractCallTransaction - | MempoolPoisonMicroblockTransaction - | MempoolCoinbaseTransaction - | MempoolTenureChangeTransaction; -/** - * Describes representation of a Type-0 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-0-transferring-an-asset - */ -export type MempoolTokenTransferTransaction = AbstractMempoolTransaction & TokenTransferTransactionMetadata; -/** - * Abstract transaction. This schema makes up all properties common between all Stacks 2.0 transaction types - */ -export type AbstractMempoolTransaction = BaseTransaction & { - tx_status: MempoolTransactionStatus; - /** - * A unix timestamp (in seconds) indicating when the transaction broadcast was received by the node. - */ - receipt_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when the transaction broadcast was received by the node. - */ - receipt_time_iso: string; -}; -export type PostConditionMode = "allow" | "deny"; -/** - * Post-conditionscan limit the damage done to a user's assets - */ -export type PostCondition = PostConditionStx | PostConditionFungible | PostConditionNonFungible; -export type PostConditionStx = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - amount: string; - type: "stx"; -}; -export type PostConditionPrincipal = - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_origin"; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_standard"; - address: string; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_contract"; - address: string; - contract_name: string; - }; -/** - * A fungible condition code encodes a statement being made for either STX or a fungible token, with respect to the originating account. - */ -export type PostConditionFungibleConditionCode = - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; -export type PostConditionFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - type: "fungible"; - amount: string; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -export type PostConditionNonFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionNonFungibleConditionCode; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -/** - * A non-fungible condition code encodes a statement being made about a non-fungible token, with respect to whether or not the particular non-fungible token is owned by the account. - */ -export type PostConditionNonFungibleConditionCode = "sent" | "not_sent"; -/** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ -export type TransactionAnchorModeType = "on_chain_only" | "off_chain_only" | "any"; -/** - * Status of the transaction - */ -export type MempoolTransactionStatus = - | "pending" - | "dropped_replace_by_fee" - | "dropped_replace_across_fork" - | "dropped_too_expensive" - | "dropped_stale_garbage_collect" - | "dropped_problematic"; -/** - * Describes representation of a Type-1 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export type MempoolSmartContractTransaction = AbstractMempoolTransaction & SmartContractTransactionMetadata; -/** - * Describes representation of a Type 2 Stacks 2.0 transaction: Contract Call - */ -export type MempoolContractCallTransaction = AbstractMempoolTransaction & ContractCallTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type MempoolPoisonMicroblockTransaction = AbstractMempoolTransaction & PoisonMicroblockTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type MempoolCoinbaseTransaction = AbstractMempoolTransaction & CoinbaseTransactionMetadata; -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export type MempoolTenureChangeTransaction = AbstractMempoolTransaction & TenureChangeTransactionMetadata; -/** - * Describes all transaction types on Stacks 2.0 blockchain - */ -export type Transaction = - | TokenTransferTransaction - | SmartContractTransaction - | ContractCallTransaction - | PoisonMicroblockTransaction - | CoinbaseTransaction - | TenureChangeTransaction; -/** - * Describes representation of a Type-0 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-0-transferring-an-asset - */ -export type TokenTransferTransaction = AbstractTransaction & TokenTransferTransactionMetadata; -/** - * Anchored transaction metadata. All mined/anchored Stacks transactions have these properties. - */ -export type AbstractTransaction = BaseTransaction & { - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - tx_status: TransactionStatus; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - /** - * List of transaction events - */ - events: TransactionEvent[]; -}; -/** - * Status of the transaction - */ -export type TransactionStatus = "success" | "abort_by_response" | "abort_by_post_condition"; -export type TransactionEvent = - | TransactionEventSmartContractLog - | TransactionEventStxLock - | TransactionEventStxAsset - | TransactionEventFungibleAsset - | TransactionEventNonFungibleAsset; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventSmartContractLog = AbstractTransactionEvent & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxLock = AbstractTransactionEvent & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxAsset = AbstractTransactionEvent & { - event_type: "stx_asset"; - tx_id: string; - asset: TransactionEventAsset; -}; -export type TransactionEventAssetType = "transfer" | "mint" | "burn"; -export type TransactionEventFungibleAsset = AbstractTransactionEvent & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type TransactionEventNonFungibleAsset = AbstractTransactionEvent & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Describes representation of a Type-1 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export type SmartContractTransaction = AbstractTransaction & SmartContractTransactionMetadata; -/** - * Describes representation of a Type 2 Stacks 2.0 transaction: Contract Call - */ -export type ContractCallTransaction = AbstractTransaction & ContractCallTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type PoisonMicroblockTransaction = AbstractTransaction & PoisonMicroblockTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type CoinbaseTransaction = AbstractTransaction & CoinbaseTransactionMetadata; -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export type TenureChangeTransaction = AbstractTransaction & TenureChangeTransactionMetadata; - -/** - * Error search result - */ -export interface SearchErrorResult { - /** - * Indicates if the requested object was found or not - */ - found: boolean; - result: { - /** - * Shows the currenty category of entity it is searched in. - */ - entity_type: "standard_address" | "unknown_hash" | "contract_address" | "invalid_term"; - }; - error: string; -} -/** - * Address search result - */ -export interface AddressSearchResult { - /** - * Indicates if the requested object was found or not - */ - found: boolean; - /** - * This object carries the search result - */ - result: { - /** - * The id used to search this query. - */ - entity_id: string; - entity_type: "standard_address"; - metadata?: AddressStxBalanceResponse; - }; -} -export interface StxBalance { - balance: string; - total_sent: string; - total_received: string; - total_fees_sent: string; - total_miner_rewards_received: string; - /** - * The transaction where the lock event occurred. Empty if no tokens are locked. - */ - lock_tx_id: string; - /** - * The amount of locked STX, as string quoted micro-STX. Zero if no tokens are locked. - */ - locked: string; - /** - * The STX chain block height of when the lock event occurred. Zero if no tokens are locked. - */ - lock_height: number; - /** - * The burnchain block height of when the lock event occurred. Zero if no tokens are locked. - */ - burnchain_lock_height: number; - /** - * The burnchain block height of when the tokens unlock. Zero if no tokens are locked. - */ - burnchain_unlock_height: number; -} -/** - * Token Offering Locked - */ -export interface AddressTokenOfferingLocked { - /** - * Micro-STX amount still locked at current block height. - */ - total_locked: string; - /** - * Micro-STX amount unlocked at current block height. - */ - total_unlocked: string; - unlock_schedule: AddressUnlockSchedule[]; -} -/** - * Unlock schedule amount and block height - */ -export interface AddressUnlockSchedule { - /** - * Micro-STX amount locked at this block height. - */ - amount: string; - block_height: number; -} -/** - * Block search result - */ -export interface BlockSearchResult { - /** - * Indicates if the requested object was found or not - */ - found: boolean; - /** - * This object carries the search result - */ - result: { - /** - * The id used to search this query. - */ - entity_id: string; - entity_type: "block_hash"; - /** - * Returns basic search result information about the requested id - */ - block_data: { - /** - * If the block lies within the canonical chain - */ - canonical: boolean; - /** - * Refers to the hash of the block - */ - hash: string; - parent_block_hash: string; - burn_block_time: number; - height: number; - }; - metadata?: Block; - }; -} -/** - * A block - */ -export interface Block { - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Height of the block - */ - height: number; - /** - * Hash representing the block - */ - hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * The only hash that can uniquely identify an anchored block or an unconfirmed state trie - */ - index_block_hash: string; - /** - * Hash of the parent block - */ - parent_block_hash: string; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Hash of the anchor chain block - */ - burn_block_hash: string; - /** - * Height of the anchor chain block - */ - burn_block_height: number; - /** - * Anchor chain transaction ID - */ - miner_txid: string; - /** - * The hash of the last streamed block that precedes this block to which this block is to be appended. Not every anchored block will have a parent microblock stream. An anchored block that does not have a parent microblock stream has the parent microblock hash set to an empty string, and the parent microblock sequence number set to -1. - */ - parent_microblock_hash: string; - /** - * The hash of the last streamed block that precedes this block to which this block is to be appended. Not every anchored block will have a parent microblock stream. An anchored block that does not have a parent microblock stream has the parent microblock hash set to an empty string, and the parent microblock sequence number set to -1. - */ - parent_microblock_sequence: number; - /** - * List of transactions included in the block - */ - txs: string[]; - /** - * List of microblocks that were accepted in this anchor block. Not every anchored block will have a accepted all (or any) of the previously streamed microblocks. Microblocks that were orphaned are not included in this list. - */ - microblocks_accepted: string[]; - /** - * List of microblocks that were streamed/produced by this anchor block's miner. This list only includes microblocks that were accepted in the following anchor block. Microblocks that were orphaned are not included in this list. - */ - microblocks_streamed: string[]; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - /** - * List of txs counts in each accepted microblock - */ - microblock_tx_count: { - [k: string]: number; - }; -} -/** - * Contract search result - */ -export interface ContractSearchResult { - /** - * Indicates if the requested object was found or not - */ - found: boolean; - /** - * This object carries the search result - */ - result: { - /** - * The id used to search this query. - */ - entity_id: string; - entity_type: "contract_address"; - /** - * Returns basic search result information about the requested id - */ - tx_data?: { - /** - * If the transaction lies within the canonical chain - */ - canonical?: boolean; - /** - * Refers to the hash of the block for searched transaction - */ - block_hash?: string; - burn_block_time?: number; - block_height?: number; - tx_type?: string; - /** - * Corresponding tx_id for smart_contract - */ - tx_id?: string; - }; - metadata?: MempoolTransaction | Transaction; - }; -} -/** - * Transaction properties that are available from a raw serialized transactions. These are available for transactions in the mempool as well as mined transactions. - */ -export interface BaseTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: PostConditionMode; - post_conditions: PostCondition[]; - anchor_mode: TransactionAnchorModeType; -} -/** - * Metadata associated with token-transfer type transactions - */ -export interface TokenTransferTransactionMetadata { - tx_type: "token_transfer"; - token_transfer: { - recipient_address: string; - /** - * Transfer amount as Integer string (64-bit unsigned integer) - */ - amount: string; - /** - * Hex encoded arbitrary message, up to 34 bytes length (should try decoding to an ASCII string) - */ - memo: string; - }; -} -/** - * Metadata associated with a contract-deploy type transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export interface SmartContractTransactionMetadata { - tx_type: "smart_contract"; - smart_contract: { - /** - * The Clarity version of the contract, only specified for versioned contract transactions, otherwise null - */ - clarity_version?: number; - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Clarity code of the smart contract being deployed - */ - source_code: string; - }; -} -/** - * Metadata associated with a contract-call type transaction - */ -export interface ContractCallTransactionMetadata { - tx_type: "contract_call"; - contract_call: { - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Name of the Clarity function to be invoked - */ - function_name: string; - /** - * Function definition, including function name and type as well as parameter names and types - */ - function_signature: string; - /** - * List of arguments used to invoke the function - */ - function_args?: { - hex: string; - repr: string; - name: string; - type: string; - }[]; - }; -} -/** - * Metadata associated with a poison-microblock type transaction - */ -export interface PoisonMicroblockTransactionMetadata { - tx_type: "poison_microblock"; - poison_microblock: { - /** - * Hex encoded microblock header - */ - microblock_header_1: string; - /** - * Hex encoded microblock header - */ - microblock_header_2: string; - }; -} -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export interface CoinbaseTransactionMetadata { - tx_type: "coinbase"; - coinbase_payload: { - /** - * Hex encoded 32-byte scratch space for block leader's use - */ - data: string; - /** - * A principal that will receive the miner rewards for this coinbase transaction. Can be either a standard principal or contract principal. Only specified for `coinbase-to-alt-recipient` transaction types, otherwise null. - */ - alt_recipient?: string; - /** - * Hex encoded 80-byte VRF proof - */ - vrf_proof?: string; - }; -} -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export interface TenureChangeTransactionMetadata { - tx_type: "tenure_change"; - tenure_change_payload?: { - /** - * Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. - */ - tenure_consensus_hash: string; - /** - * Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. - */ - prev_tenure_consensus_hash: string; - /** - * Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. - */ - burn_view_consensus_hash: string; - /** - * (Hex string) Stacks Block hash - */ - previous_tenure_end: string; - /** - * The number of blocks produced in the previous tenure. - */ - previous_tenure_blocks: number; - /** - * Cause of change in mining tenure. Depending on cause, tenure can be ended or extended. - */ - cause: "block_found" | "extended"; - /** - * (Hex string) The ECDSA public key hash of the current tenure. - */ - pubkey_hash: string; - }; -} -export interface AbstractTransactionEvent { - event_index: number; -} -export interface TransactionEventAsset { - asset_event_type?: TransactionEventAssetType; - asset_id?: string; - sender?: string; - recipient?: string; - amount?: string; - value?: string; - memo?: string; -} -/** - * Contract search result - */ -export interface MempoolTxSearchResult { - /** - * Indicates if the requested object was found or not - */ - found: boolean; - /** - * This object carries the search result - */ - result: { - /** - * The id used to search this query. - */ - entity_id: string; - entity_type: "mempool_tx_id"; - /** - * Returns basic search result information about the requested id - */ - tx_data: { - tx_type: string; - }; - metadata?: MempoolTransaction; - }; -} -/** - * Transaction search result - */ -export interface TxSearchResult { - /** - * Indicates if the requested object was found or not - */ - found: boolean; - /** - * This object carries the search result - */ - result: { - /** - * The id used to search this query. - */ - entity_id: string; - entity_type: "tx_id"; - /** - * Returns basic search result information about the requested id - */ - tx_data: { - /** - * If the transaction lies within the canonical chain - */ - canonical: boolean; - /** - * Refers to the hash of the block for searched transaction - */ - block_hash: string; - burn_block_time: number; - block_height: number; - tx_type: string; - }; - metadata?: Transaction; - }; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/smart-contracts/by-trait.mdx b/content/docs/stacks/api/smart-contracts/by-trait.mdx deleted file mode 100644 index 10ed114a5..000000000 --- a/content/docs/stacks/api/smart-contracts/by-trait.mdx +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: Get contracts by trait -description: Retrieves a list of contracts based on the following traits listed in JSON format - functions, variables, maps, fungible tokens and non-fungible tokens. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get contracts by trait - -Retrieves a list of contracts based on the following traits listed in JSON format - functions, variables, maps, fungible tokens and non-fungible tokens -### Query Parameters - - - -JSON abi of the trait. - - - - - -max number of contracts fetch - - - - - -index of first contract event to fetch - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of contracts implement given trait | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/contract/by_trait?trait_abi=string&limit=0&offset=0" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/contract/by_trait?trait_abi=string&limit=0&offset=0", { - method: "GET" -}); -``` - - - - - - - - - -GET list of contracts - - - - - -```json -{ - "limit": 0, - "offset": 0, - "results": [ - { - "tx_id": "string", - "canonical": true, - "contract_id": "string", - "block_height": 0, - "source_code": "string", - "abi": "string" - } - ] -} -``` - - - - - -```ts -/** - * GET list of contracts - */ -export interface ContractListResponse { - /** - * The number of contracts to return - */ - limit: number; - /** - * The number to contracts to skip (starting at `0`) - */ - offset: number; - results: SmartContract[]; -} -/** - * A Smart Contract Detail - */ -export interface SmartContract { - tx_id: string; - canonical: boolean; - contract_id: string; - block_height: number; - source_code: string; - abi: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/smart-contracts/events.mdx b/content/docs/stacks/api/smart-contracts/events.mdx deleted file mode 100644 index f6261e146..000000000 --- a/content/docs/stacks/api/smart-contracts/events.mdx +++ /dev/null @@ -1,224 +0,0 @@ ---- -title: Get contract events -description: Retrieves a list of events that have been triggered by a given smart contract. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get contract events - -Retrieves a list of events that have been triggered by a given `contract_id` -### Path Parameters - - - -Contract identifier formatted as `\.` - -Example: `"SP6P4EJF0VG8V0RB3TQQKJBHDQKEF6NVRD1KZE3C.satoshibles"` - - -### Query Parameters - - - -max number of contract events to fetch - - - - - -index of first contract event to fetch - -Example: `42000` - - - - - -Include transaction data from unanchored (i.e. unconfirmed) microblocks - -Example: `true` - -Default: `false` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of events | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/contract/SP6P4EJF0VG8V0RB3TQQKJBHDQKEF6NVRD1KZE3C.satoshibles/events?limit=0&offset=42000&unanchored=true" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/contract/SP6P4EJF0VG8V0RB3TQQKJBHDQKEF6NVRD1KZE3C.satoshibles/events?limit=0&offset=42000&unanchored=true", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "event_index": 0, - "event_type": "smart_contract_log", - "tx_id": "string", - "contract_log": { - "contract_id": "string", - "topic": "string", - "value": { - "hex": "string", - "repr": "string" - } - } -} -``` - - - - - -```ts -export type TransactionEvent = - | TransactionEventSmartContractLog - | TransactionEventStxLock - | TransactionEventStxAsset - | TransactionEventFungibleAsset - | TransactionEventNonFungibleAsset; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventSmartContractLog = AbstractTransactionEvent & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxLock = AbstractTransactionEvent & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxAsset = AbstractTransactionEvent & { - event_type: "stx_asset"; - tx_id: string; - asset: TransactionEventAsset; -}; -export type TransactionEventAssetType = "transfer" | "mint" | "burn"; -export type TransactionEventFungibleAsset = AbstractTransactionEvent & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type TransactionEventNonFungibleAsset = AbstractTransactionEvent & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; - -export interface AbstractTransactionEvent { - event_index: number; -} -export interface TransactionEventAsset { - asset_event_type?: TransactionEventAssetType; - asset_id?: string; - sender?: string; - recipient?: string; - amount?: string; - value?: string; - memo?: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/smart-contracts/info.mdx b/content/docs/stacks/api/smart-contracts/info.mdx deleted file mode 100644 index b2fe5f2b3..000000000 --- a/content/docs/stacks/api/smart-contracts/info.mdx +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: Get contract info -description: Retrieves details for a specific smart contract. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get contract info - -Retrieves details of a contract with a given `contract_id` - -| Status code | Description | -| :------ | :------ | -| `200` | Contract found | -| `404` | Cannot find contract of given ID | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/contract/%7Bcontract_id%7D" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/contract/%7Bcontract_id%7D", { - method: "GET" -}); -``` - - - - - - - - - -A Smart Contract Detail - - - - - -```json -{ - "tx_id": "string", - "canonical": true, - "contract_id": "string", - "block_height": 0, - "source_code": "string", - "abi": "string" -} -``` - - - - - -```ts -/** - * A Smart Contract Detail - */ -export interface SmartContract { - tx_id: string; - canonical: boolean; - contract_id: string; - block_height: number; - source_code: string; - abi: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/smart-contracts/status.mdx b/content/docs/stacks/api/smart-contracts/status.mdx deleted file mode 100644 index fed279814..000000000 --- a/content/docs/stacks/api/smart-contracts/status.mdx +++ /dev/null @@ -1,164 +0,0 @@ ---- -title: Get contracts status -description: Retrieves the deployment status of multiple smart contracts. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get smart contracts status - -Retrieves the deployment status of multiple smart contracts. - - -### Query Parameters - -"} required={true} deprecated={false}> - -contract ids to fetch status for - -Example: `"SPQZF23W7SEYBFG5JQ496NMY0G7379SRYEDREMSV.Candy"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of smart contract status | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/smart-contracts/status?contract_id=SPQZF23W7SEYBFG5JQ496NMY0G7379SRYEDREMSV.Candy" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/smart-contracts/status?contract_id=SPQZF23W7SEYBFG5JQ496NMY0G7379SRYEDREMSV.Candy", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns the deployment status of multiple smart contracts - - - - - -```json -{ - "property1": { - "found": true, - "result": { - "status": "string", - "tx_id": "string", - "contract_id": "string", - "block_height": 0 - } - }, - "property2": { - "found": true, - "result": { - "status": "string", - "tx_id": "string", - "contract_id": "string", - "block_height": 0 - } - } -} -``` - - - - - -```ts -/** - * GET request that returns the deployment status of multiple smart contracts - */ -export interface SmartContractsStatusResponse { - [k: string]: SmartContractFound | SmartContractNotFound; -} -export interface SmartContractFound { - found: true; - result: SmartContractStatus; -} -/** - * Deployment status of a smart contract - */ -export interface SmartContractStatus { - /** - * Smart contract deployment transaction status - */ - status: string; - /** - * Deployment transaction ID - */ - tx_id: string; - /** - * Smart contract ID - */ - contract_id: string; - /** - * Height of the transaction confirmation block - */ - block_height?: number; -} -export interface SmartContractNotFound { - found: false; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/stacking-pool/members.mdx b/content/docs/stacks/api/stacking-pool/members.mdx deleted file mode 100644 index 9b33cb578..000000000 --- a/content/docs/stacks/api/stacking-pool/members.mdx +++ /dev/null @@ -1,204 +0,0 @@ ---- -title: Get stacking pool members -description: Retrieves the list of stacking pool members for a given delegator principal. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Stacking pool members - -Retrieves the list of stacking pool members for a given delegator principal. -### Path Parameters - - - -Address principal of the stacking pool delegator - - -### Query Parameters - - - -If specified, only delegation events after the given block will be included - - - - - -whether or not to include Stackers from unconfirmed transactions - -Example: `true` - -Default: `false` - - - - - -number of items to return - -Example: `100` - -Default: `100` - -Maximum: `200` - - - - - -number of items to skip - -Example: `300` - -Default: `0` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/pox4/SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP/delegations?unanchored=false&limit=5" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/pox4/SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP/delegations?after_block=0&unanchored=true&limit=100&offset=300", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns stacking pool member details for a given pool (delegator) principal - - - - - -```json -{ - "limit": 200, - "offset": 0, - "total": 0, - "results": [ - { - "stacker": "string", - "pox_addr": "string", - "amount_ustx": "string", - "burn_block_unlock_height": 0, - "block_height": 0, - "tx_id": "string" - } - ] -} -``` - - - - - -```ts -/** - * GET request that returns stacking pool member details for a given pool (delegator) principal - */ -export interface PoolDelegationsResponse { - /** - * The number of Stackers to return - */ - limit: number; - /** - * The number to Stackers to skip (starting at `0`) - */ - offset: number; - /** - * The total number of Stackers - */ - total: number; - results: PoolDelegation[]; -} -export interface PoolDelegation { - /** - * The principal of the pool member that issued the delegation - */ - stacker: string; - /** - * The pox-addr value specified by the stacker in the delegation operation - */ - pox_addr?: string; - /** - * The amount of uSTX delegated by the stacker - */ - amount_ustx: string; - /** - * The optional burnchain block unlock height that the stacker may have specified - */ - burn_block_unlock_height?: number; - /** - * The block height at which the stacker delegation transaction was mined at - */ - block_height: number; - /** - * The tx_id of the stacker delegation operation - */ - tx_id: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/stacking-rewards/recent-burnchain-reward-recipient.mdx b/content/docs/stacks/api/stacking-rewards/recent-burnchain-reward-recipient.mdx deleted file mode 100644 index b8235e8ef..000000000 --- a/content/docs/stacks/api/stacking-rewards/recent-burnchain-reward-recipient.mdx +++ /dev/null @@ -1,185 +0,0 @@ ---- -title: Get recent burnchain reward for the given recipient -description: Retrieves a list of recent burnchain (e.g. Bitcoin) rewards for the given recipient with the associated amounts and block info. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get recent burnchain reward for the given recipient - -Retrieves a list of recent burnchain (e.g. Bitcoin) rewards for the given recipient with the associated amounts and block info -### Path Parameters - - - -Reward recipient address. Should either be in the native burnchain's format (e.g. B58 for Bitcoin), or if a STX principal address is provided it will be encoded as into the equivalent burnchain format - -Example: `"36hQtSEXBMevo5chpxhfAGiCTSC34QKgda"` - - -### Query Parameters - - - -max number of rewards to fetch - - - - - -index of first rewards to fetch - -Example: `42000` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of burnchain reward recipients and amounts | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/burnchain/rewards/36hQtSEXBMevo5chpxhfAGiCTSC34QKgda?limit=0&offset=42000" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/burnchain/rewards/36hQtSEXBMevo5chpxhfAGiCTSC34QKgda?limit=0&offset=42000", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns blocks - - - - - -```json -{ - "limit": 30, - "offset": 0, - "results": [ - { - "canonical": true, - "burn_block_hash": "string", - "burn_block_height": 0, - "burn_amount": "string", - "reward_recipient": "string", - "reward_amount": "string", - "reward_index": 0 - } - ] -} -``` - - - - - -```ts -/** - * GET request that returns blocks - */ -export interface BurnchainRewardListResponse { - /** - * The number of burnchain rewards to return - */ - limit: number; - /** - * The number to burnchain rewards to skip (starting at `0`) - */ - offset: number; - results: BurnchainReward[]; -} -/** - * Reward payment made on the burnchain - */ -export interface BurnchainReward { - /** - * Set to `true` if block corresponds to the canonical burchchain tip - */ - canonical: boolean; - /** - * The hash representing the burnchain block - */ - burn_block_hash: string; - /** - * Height of the burnchain block - */ - burn_block_height: number; - /** - * The total amount of burnchain tokens burned for this burnchain block, in the smallest unit (e.g. satoshis for Bitcoin) - */ - burn_amount: string; - /** - * The recipient address that received the burnchain rewards, in the format native to the burnchain (e.g. B58 encoded for Bitcoin) - */ - reward_recipient: string; - /** - * The amount of burnchain tokens rewarded to the recipient, in the smallest unit (e.g. satoshis for Bitcoin) - */ - reward_amount: string; - /** - * The index position of the reward entry, useful for ordering when there's more than one recipient per burnchain block - */ - reward_index: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/stacking-rewards/recent-burnchain-reward-recipients.mdx b/content/docs/stacks/api/stacking-rewards/recent-burnchain-reward-recipients.mdx deleted file mode 100644 index 764f6b51f..000000000 --- a/content/docs/stacks/api/stacking-rewards/recent-burnchain-reward-recipients.mdx +++ /dev/null @@ -1,180 +0,0 @@ ---- -title: Get recent burnchain reward recipients -description: Retrieves a list of recent burnchain (e.g. Bitcoin) reward recipients with the associated amounts and block info. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get recent burnchain reward recipients - -Retrieves a list of recent burnchain (e.g. Bitcoin) reward recipients with the associated amounts and block info -### Query Parameters - - - -max number of rewards to fetch - -Default: `96` - -Maximum: `250` - - - - - -index of first rewards to fetch - -Example: `42000` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of burnchain reward recipients and amounts | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/burnchain/rewards?limit=96&offset=42000" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/burnchain/rewards?limit=96&offset=42000", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns blocks - - - - - -```json -{ - "limit": 30, - "offset": 0, - "results": [ - { - "canonical": true, - "burn_block_hash": "string", - "burn_block_height": 0, - "burn_amount": "string", - "reward_recipient": "string", - "reward_amount": "string", - "reward_index": 0 - } - ] -} -``` - - - - - -```ts -/** - * GET request that returns blocks - */ -export interface BurnchainRewardListResponse { - /** - * The number of burnchain rewards to return - */ - limit: number; - /** - * The number to burnchain rewards to skip (starting at `0`) - */ - offset: number; - results: BurnchainReward[]; -} -/** - * Reward payment made on the burnchain - */ -export interface BurnchainReward { - /** - * Set to `true` if block corresponds to the canonical burchchain tip - */ - canonical: boolean; - /** - * The hash representing the burnchain block - */ - burn_block_hash: string; - /** - * Height of the burnchain block - */ - burn_block_height: number; - /** - * The total amount of burnchain tokens burned for this burnchain block, in the smallest unit (e.g. satoshis for Bitcoin) - */ - burn_amount: string; - /** - * The recipient address that received the burnchain rewards, in the format native to the burnchain (e.g. B58 encoded for Bitcoin) - */ - reward_recipient: string; - /** - * The amount of burnchain tokens rewarded to the recipient, in the smallest unit (e.g. satoshis for Bitcoin) - */ - reward_amount: string; - /** - * The index position of the reward entry, useful for ordering when there's more than one recipient per burnchain block - */ - reward_index: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/stacking-rewards/recent-reward-slot-holder-entries.mdx b/content/docs/stacks/api/stacking-rewards/recent-reward-slot-holder-entries.mdx deleted file mode 100644 index bbc009f8a..000000000 --- a/content/docs/stacks/api/stacking-rewards/recent-reward-slot-holder-entries.mdx +++ /dev/null @@ -1,180 +0,0 @@ ---- -title: Get recent reward slot holder entries -description: Retrieves a list of the Bitcoin addresses that would validly receive Proof-of-Transfer commitments for a given reward slot holder recipient address. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get recent reward slot holder entries for the given address - -Retrieves a list of the Bitcoin addresses that would validly receive Proof-of-Transfer commitments for a given reward slot holder recipient address. -### Path Parameters - - - -Reward slot holder recipient address. Should either be in the native burnchain's format (e.g. B58 for Bitcoin), or if a STX principal address is provided it will be encoded as into the equivalent burnchain format - -Example: `"36hQtSEXBMevo5chpxhfAGiCTSC34QKgda"` - - -### Query Parameters - - - -max number of items to fetch - - - - - -index of the first items to fetch - -Example: `42000` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of burnchain reward recipients and amounts | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/burnchain/reward_slot_holders/36hQtSEXBMevo5chpxhfAGiCTSC34QKgda?limit=0&offset=42000" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/burnchain/reward_slot_holders/36hQtSEXBMevo5chpxhfAGiCTSC34QKgda?limit=0&offset=42000", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns reward slot holders - - - - - -```json -{ - "limit": 30, - "offset": 0, - "total": 0, - "results": [ - { - "canonical": true, - "burn_block_hash": "string", - "burn_block_height": 0, - "address": "string", - "slot_index": 0 - } - ] -} -``` - - - - - -```ts -/** - * GET request that returns reward slot holders - */ -export interface BurnchainRewardSlotHolderListResponse { - /** - * The number of items to return - */ - limit: number; - /** - * The number of items to skip (starting at `0`) - */ - offset: number; - /** - * Total number of available items - */ - total: number; - results: BurnchainRewardSlotHolder[]; -} -/** - * Reward slot holder on the burnchain - */ -export interface BurnchainRewardSlotHolder { - /** - * Set to `true` if block corresponds to the canonical burchchain tip - */ - canonical: boolean; - /** - * The hash representing the burnchain block - */ - burn_block_hash: string; - /** - * Height of the burnchain block - */ - burn_block_height: number; - /** - * The recipient address that validly received PoX commitments, in the format native to the burnchain (e.g. B58 encoded for Bitcoin) - */ - address: string; - /** - * The index position of the reward entry, useful for ordering when there's more than one slot per burnchain block - */ - slot_index: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/stacking-rewards/recent-reward-slot-holders.mdx b/content/docs/stacks/api/stacking-rewards/recent-reward-slot-holders.mdx deleted file mode 100644 index 32fc8f5ac..000000000 --- a/content/docs/stacks/api/stacking-rewards/recent-reward-slot-holders.mdx +++ /dev/null @@ -1,175 +0,0 @@ ---- -title: Get recent reward slot holders -description: Retrieves a list of the Bitcoin addresses that would validly receive Proof-of-Transfer commitments. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get recent reward slot holders - -Retrieves a list of the Bitcoin addresses that would validly receive Proof-of-Transfer commitments. -### Query Parameters - - - -max number of items to fetch - -Default: `96` - -Maximum: `250` - - - - - -index of the first items to fetch - -Example: `42000` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of burnchain reward recipients and amounts | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/burnchain/reward_slot_holders?limit=96&offset=42000" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/burnchain/reward_slot_holders?limit=96&offset=42000", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns reward slot holders - - - - - -```json -{ - "limit": 30, - "offset": 0, - "total": 0, - "results": [ - { - "canonical": true, - "burn_block_hash": "string", - "burn_block_height": 0, - "address": "string", - "slot_index": 0 - } - ] -} -``` - - - - - -```ts -/** - * GET request that returns reward slot holders - */ -export interface BurnchainRewardSlotHolderListResponse { - /** - * The number of items to return - */ - limit: number; - /** - * The number of items to skip (starting at `0`) - */ - offset: number; - /** - * Total number of available items - */ - total: number; - results: BurnchainRewardSlotHolder[]; -} -/** - * Reward slot holder on the burnchain - */ -export interface BurnchainRewardSlotHolder { - /** - * Set to `true` if block corresponds to the canonical burchchain tip - */ - canonical: boolean; - /** - * The hash representing the burnchain block - */ - burn_block_hash: string; - /** - * Height of the burnchain block - */ - burn_block_height: number; - /** - * The recipient address that validly received PoX commitments, in the format native to the burnchain (e.g. B58 encoded for Bitcoin) - */ - address: string; - /** - * The index position of the reward entry, useful for ordering when there's more than one slot per burnchain block - */ - slot_index: number; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/stacking-rewards/total-burnchain-rewards-for-recipient.mdx b/content/docs/stacks/api/stacking-rewards/total-burnchain-rewards-for-recipient.mdx deleted file mode 100644 index 4295d5182..000000000 --- a/content/docs/stacks/api/stacking-rewards/total-burnchain-rewards-for-recipient.mdx +++ /dev/null @@ -1,125 +0,0 @@ ---- -title: Get total burnchain rewards for the given recipient -description: Retrieves the total burnchain (e.g. Bitcoin) rewards for a given recipient address. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get total burnchain rewards for the given recipient - -Retrieves the total burnchain (e.g. Bitcoin) rewards for a given recipient `address` -### Path Parameters - - - -Reward recipient address. Should either be in the native burnchain's format (e.g. B58 for Bitcoin), or if a STX principal address is provided it will be encoded as into the equivalent burnchain format - -Example: `"36hQtSEXBMevo5chpxhfAGiCTSC34QKgda"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of burnchain reward recipients and amounts | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/burnchain/rewards/36hQtSEXBMevo5chpxhfAGiCTSC34QKgda/total" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/burnchain/rewards/36hQtSEXBMevo5chpxhfAGiCTSC34QKgda/total", { - method: "GET" -}); -``` - - - - - - - - - -Total burnchain rewards made to a recipient - - - - - -```json -{ - "reward_recipient": "string", - "reward_amount": "string" -} -``` - - - - - -```ts -/** - * Total burnchain rewards made to a recipient - */ -export interface BurnchainRewardsTotal { - /** - * The recipient address that received the burnchain rewards, in the format native to the burnchain (e.g. B58 encoded for Bitcoin) - */ - reward_recipient: string; - /** - * The total amount of burnchain tokens rewarded to the recipient, in the smallest unit (e.g. satoshis for Bitcoin) - */ - reward_amount: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/stacks-blockchain/accounts/assets.mdx b/content/docs/stacks/api/stacks-blockchain/accounts/assets.mdx new file mode 100644 index 000000000..9169ecfcc --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/accounts/assets.mdx @@ -0,0 +1,11 @@ +--- +title: Get account assets +description: Retrieves a list of all asset events associated with an account or a contract identifier. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/stacks-blockchain/accounts/balances.mdx b/content/docs/stacks/api/stacks-blockchain/accounts/balances.mdx new file mode 100644 index 000000000..39f3368d7 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/accounts/balances.mdx @@ -0,0 +1,11 @@ +--- +title: Get user balances +description: Retrieves account balance information, including STX, fungible, and non-fungible tokens. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/accounts/inbound-stx-transfers.mdx b/content/docs/stacks/api/stacks-blockchain/accounts/inbound-stx-transfers.mdx new file mode 100644 index 000000000..fbeeefeb6 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/accounts/inbound-stx-transfers.mdx @@ -0,0 +1,11 @@ +--- +title: Get inbound STX transfers +description: Retrieves a list of STX transfers with memos to the given principal. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/accounts/latest-nonce.mdx b/content/docs/stacks/api/stacks-blockchain/accounts/latest-nonce.mdx new file mode 100644 index 000000000..bebee7a59 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/accounts/latest-nonce.mdx @@ -0,0 +1,11 @@ +--- +title: Get the latest nonce +description: Retrieves the latest nonce values used by an account by inspecting the mempool and anchored transactions. +full: true +--- + + diff --git a/content/docs/stacks/api/accounts/meta.json b/content/docs/stacks/api/stacks-blockchain/accounts/meta.json similarity index 76% rename from content/docs/stacks/api/accounts/meta.json rename to content/docs/stacks/api/stacks-blockchain/accounts/meta.json index cdedb61f1..c361f191c 100644 --- a/content/docs/stacks/api/accounts/meta.json +++ b/content/docs/stacks/api/stacks-blockchain/accounts/meta.json @@ -5,9 +5,6 @@ "assets", "balances", "stx-balances", - "principal-stx-balance", - "principal-ft-balances", - "principal-ft-balance", "inbound-stx-transfers", "transactions", "transactions-with-transfers", diff --git a/content/docs/stacks/api/stacks-blockchain/accounts/nft-events.mdx b/content/docs/stacks/api/stacks-blockchain/accounts/nft-events.mdx new file mode 100644 index 000000000..cee72a66d --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/accounts/nft-events.mdx @@ -0,0 +1,11 @@ +--- +title: Get nft events +description: Retrieves a list of all nft events associated with an account or a contract identifier. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/accounts/stx-balances.mdx b/content/docs/stacks/api/stacks-blockchain/accounts/stx-balances.mdx new file mode 100644 index 000000000..821b36a62 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/accounts/stx-balances.mdx @@ -0,0 +1,11 @@ +--- +title: Get account STX balance +description: Retrieves the STX token balance for a specified address or contract identifier. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/accounts/transaction-with-transfers.mdx b/content/docs/stacks/api/stacks-blockchain/accounts/transaction-with-transfers.mdx new file mode 100644 index 000000000..e4b5e6363 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/accounts/transaction-with-transfers.mdx @@ -0,0 +1,11 @@ +--- +title: Get account transaction with transfers +description: Retrieves transaction details for a specific transaction including STX transfers for each transaction. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/accounts/transactions-with-transfers.mdx b/content/docs/stacks/api/stacks-blockchain/accounts/transactions-with-transfers.mdx new file mode 100644 index 000000000..e315f2721 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/accounts/transactions-with-transfers.mdx @@ -0,0 +1,11 @@ +--- +title: Get account transactions with transfers +description: Retrieves transactions for a specific account including STX transfers for each transaction. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/accounts/transactions.mdx b/content/docs/stacks/api/stacks-blockchain/accounts/transactions.mdx new file mode 100644 index 000000000..6fdc5ce7d --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/accounts/transactions.mdx @@ -0,0 +1,11 @@ +--- +title: Get account transactions +description: Retrieves transactions for a specific account. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/blocks/average-times.mdx b/content/docs/stacks/api/stacks-blockchain/blocks/average-times.mdx new file mode 100644 index 000000000..80c5b8228 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/blocks/average-times.mdx @@ -0,0 +1,11 @@ +--- +title: Get average block times +description: Retrieves average block times. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash.mdx b/content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash.mdx new file mode 100644 index 000000000..5ec4edf95 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash.mdx @@ -0,0 +1,11 @@ +--- +title: Get block by burnchain block hash +description: Retrieves block details of a specific block for a given burnchain block hash. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-height.mdx b/content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-height.mdx new file mode 100644 index 000000000..bd8bb7abf --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-height.mdx @@ -0,0 +1,11 @@ +--- +title: Get block by burnchain block height +description: Retrieves block details of a specific block for a given burnchain block height. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/stacks-blockchain/blocks/block-by-hash.mdx b/content/docs/stacks/api/stacks-blockchain/blocks/block-by-hash.mdx new file mode 100644 index 000000000..014eca8ff --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/blocks/block-by-hash.mdx @@ -0,0 +1,11 @@ +--- +title: Get block by hash +description: Retrieves block details of a specific block for a given chain height. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/stacks-blockchain/blocks/block-by-height.mdx b/content/docs/stacks/api/stacks-blockchain/blocks/block-by-height.mdx new file mode 100644 index 000000000..56e45eb1b --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/blocks/block-by-height.mdx @@ -0,0 +1,11 @@ +--- +title: Get block by height +description: Retrieves block details of a specific block for a given chain height. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/stacks-blockchain/blocks/get-block.mdx b/content/docs/stacks/api/stacks-blockchain/blocks/get-block.mdx new file mode 100644 index 000000000..8e16c04fb --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/blocks/get-block.mdx @@ -0,0 +1,11 @@ +--- +title: Get block +description: Retrieves a single block. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block.mdx b/content/docs/stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block.mdx new file mode 100644 index 000000000..7d667bd1f --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block.mdx @@ -0,0 +1,11 @@ +--- +title: Get blocks by burn block +description: Retrieves a list of blocks confirmed by a specific burn block. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/blocks/get-blocks.mdx b/content/docs/stacks/api/stacks-blockchain/blocks/get-blocks.mdx new file mode 100644 index 000000000..f903adafb --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/blocks/get-blocks.mdx @@ -0,0 +1,11 @@ +--- +title: Get blocks +description: Retrieves a list of recently mined blocks. +full: true +--- + + diff --git a/content/docs/stacks/api/blocks/index.mdx b/content/docs/stacks/api/stacks-blockchain/blocks/index.mdx similarity index 91% rename from content/docs/stacks/api/blocks/index.mdx rename to content/docs/stacks/api/stacks-blockchain/blocks/index.mdx index 535232ea4..18659db42 100644 --- a/content/docs/stacks/api/blocks/index.mdx +++ b/content/docs/stacks/api/stacks-blockchain/blocks/index.mdx @@ -1,6 +1,6 @@ --- title: Blocks index: true -toc: false +full: true description: Handle the retrieval and management of block data using various identifiers. --- \ No newline at end of file diff --git a/content/docs/stacks/api/blocks/meta.json b/content/docs/stacks/api/stacks-blockchain/blocks/meta.json similarity index 100% rename from content/docs/stacks/api/blocks/meta.json rename to content/docs/stacks/api/stacks-blockchain/blocks/meta.json diff --git a/content/docs/stacks/api/stacks-blockchain/blocks/recent-blocks.mdx b/content/docs/stacks/api/stacks-blockchain/blocks/recent-blocks.mdx new file mode 100644 index 000000000..01e62120a --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/blocks/recent-blocks.mdx @@ -0,0 +1,11 @@ +--- +title: Get recent blocks +description: Retrieves a list of recently mined blocks. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-block.mdx b/content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-block.mdx new file mode 100644 index 000000000..dabd9f30b --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-block.mdx @@ -0,0 +1,11 @@ +--- +title: Get burn block +description: Retrieves a single burn block. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks.mdx b/content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks.mdx new file mode 100644 index 000000000..7d73a813b --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks.mdx @@ -0,0 +1,11 @@ +--- +title: Get burn blocks +description: Retrieves a list of recent burn blocks. +full: true +--- + + diff --git a/content/docs/stacks/api/burn-blocks/index.mdx b/content/docs/stacks/api/stacks-blockchain/burn-blocks/index.mdx similarity index 90% rename from content/docs/stacks/api/burn-blocks/index.mdx rename to content/docs/stacks/api/stacks-blockchain/burn-blocks/index.mdx index 2e92e607b..36da978ca 100644 --- a/content/docs/stacks/api/burn-blocks/index.mdx +++ b/content/docs/stacks/api/stacks-blockchain/burn-blocks/index.mdx @@ -1,6 +1,6 @@ --- title: Burn blocks index: true -toc: false +full: true description: Retrieve information about specific burned blocks. --- diff --git a/content/docs/stacks/api/burn-blocks/meta.json b/content/docs/stacks/api/stacks-blockchain/burn-blocks/meta.json similarity index 100% rename from content/docs/stacks/api/burn-blocks/meta.json rename to content/docs/stacks/api/stacks-blockchain/burn-blocks/meta.json diff --git a/content/docs/stacks/api/faucets/index.mdx b/content/docs/stacks/api/stacks-blockchain/faucets/index.mdx similarity index 89% rename from content/docs/stacks/api/faucets/index.mdx rename to content/docs/stacks/api/stacks-blockchain/faucets/index.mdx index e633c72b4..98edc2daf 100644 --- a/content/docs/stacks/api/faucets/index.mdx +++ b/content/docs/stacks/api/stacks-blockchain/faucets/index.mdx @@ -1,6 +1,6 @@ --- title: Faucets index: true -toc: false +full: true description: Distribute testnet tokens to specified addresses. --- \ No newline at end of file diff --git a/content/docs/stacks/api/faucets/meta.json b/content/docs/stacks/api/stacks-blockchain/faucets/meta.json similarity index 100% rename from content/docs/stacks/api/faucets/meta.json rename to content/docs/stacks/api/stacks-blockchain/faucets/meta.json diff --git a/content/docs/stacks/api/stacks-blockchain/faucets/stx.mdx b/content/docs/stacks/api/stacks-blockchain/faucets/stx.mdx new file mode 100644 index 000000000..3cc030991 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/faucets/stx.mdx @@ -0,0 +1,11 @@ +--- +title: STX Testnet tokens +description: Delivers testnet STX tokens to a specified address. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/fees/fee-rate.mdx b/content/docs/stacks/api/stacks-blockchain/fees/fee-rate.mdx new file mode 100644 index 000000000..1a6bf7ad8 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/fees/fee-rate.mdx @@ -0,0 +1,11 @@ +--- +title: Get fee rate +description: Retrieves an estimated fee rate for transactions. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/fees/index.mdx b/content/docs/stacks/api/stacks-blockchain/fees/index.mdx similarity index 91% rename from content/docs/stacks/api/fees/index.mdx rename to content/docs/stacks/api/stacks-blockchain/fees/index.mdx index 33c4d61fe..20ee409de 100644 --- a/content/docs/stacks/api/fees/index.mdx +++ b/content/docs/stacks/api/stacks-blockchain/fees/index.mdx @@ -1,6 +1,6 @@ --- title: Fees index: true -toc: false +full: true description: Provide estimates, rates, and approximate calculations for transaction costs. --- \ No newline at end of file diff --git a/content/docs/stacks/api/fees/meta.json b/content/docs/stacks/api/stacks-blockchain/fees/meta.json similarity index 100% rename from content/docs/stacks/api/fees/meta.json rename to content/docs/stacks/api/stacks-blockchain/fees/meta.json diff --git a/content/docs/stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text.mdx b/content/docs/stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text.mdx new file mode 100644 index 000000000..e02f5db6b --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text.mdx @@ -0,0 +1,11 @@ +--- +title: Get circulating STX supply in plain text format +description: Retrieves the circulating STX supply as plain text. +full: true +--- + + diff --git a/content/docs/stacks/api/info/index.mdx b/content/docs/stacks/api/stacks-blockchain/info/index.mdx similarity index 90% rename from content/docs/stacks/api/info/index.mdx rename to content/docs/stacks/api/stacks-blockchain/info/index.mdx index 4106173a5..3989df839 100644 --- a/content/docs/stacks/api/info/index.mdx +++ b/content/docs/stacks/api/stacks-blockchain/info/index.mdx @@ -1,6 +1,6 @@ --- title: Info index: true -toc: false +full: true description: Retrieves information about the Core API and the Stacks network. --- diff --git a/content/docs/stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply.mdx b/content/docs/stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply.mdx new file mode 100644 index 000000000..5f1996bed --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply.mdx @@ -0,0 +1,11 @@ +--- +title: Get total and unlocked STX supply (legacy) +description: Retrieves the total and unlocked STX supply in legacy format 1.0 API. +full: true +--- + + diff --git a/content/docs/stacks/api/info/meta.json b/content/docs/stacks/api/stacks-blockchain/info/meta.json similarity index 100% rename from content/docs/stacks/api/info/meta.json rename to content/docs/stacks/api/stacks-blockchain/info/meta.json diff --git a/content/docs/stacks/api/stacks-blockchain/info/network-block-time.mdx b/content/docs/stacks/api/stacks-blockchain/info/network-block-time.mdx new file mode 100644 index 000000000..ec6f47955 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/info/network-block-time.mdx @@ -0,0 +1,11 @@ +--- +title: Get the network target block time +description: Retrieves the target block times for mainnet and testnet. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/info/network-given-block-time.mdx b/content/docs/stacks/api/stacks-blockchain/info/network-given-block-time.mdx new file mode 100644 index 000000000..f4c71d8cc --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/info/network-given-block-time.mdx @@ -0,0 +1,11 @@ +--- +title: Get a given network's target block time +description: Retrieves the target block time for a given network. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/info/status.mdx b/content/docs/stacks/api/stacks-blockchain/info/status.mdx new file mode 100644 index 000000000..f8abed16f --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/info/status.mdx @@ -0,0 +1,11 @@ +--- +title: Get API status +description: Retrieves the running status of the Stacks Blockchain API. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply.mdx b/content/docs/stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply.mdx new file mode 100644 index 000000000..a10cbd226 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply.mdx @@ -0,0 +1,11 @@ +--- +title: Get total and unlocked STX supply +description: Retrieves the total and unlocked STX supply. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text.mdx b/content/docs/stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text.mdx new file mode 100644 index 000000000..7f846fb93 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text.mdx @@ -0,0 +1,11 @@ +--- +title: Get total STX supply in plain text format +description: Retrieves the total STX supply as plain text. +full: true +--- + + diff --git a/content/docs/stacks/api/mempool/index.mdx b/content/docs/stacks/api/stacks-blockchain/mempool/index.mdx similarity index 91% rename from content/docs/stacks/api/mempool/index.mdx rename to content/docs/stacks/api/stacks-blockchain/mempool/index.mdx index a0c83717c..2c8bf5872 100644 --- a/content/docs/stacks/api/mempool/index.mdx +++ b/content/docs/stacks/api/stacks-blockchain/mempool/index.mdx @@ -1,5 +1,5 @@ --- title: Mempool index: true -toc: false +full: true description: Retrieve information around transaction fees and priorities in the mempool. diff --git a/content/docs/stacks/api/mempool/meta.json b/content/docs/stacks/api/stacks-blockchain/mempool/meta.json similarity index 100% rename from content/docs/stacks/api/mempool/meta.json rename to content/docs/stacks/api/stacks-blockchain/mempool/meta.json diff --git a/content/docs/stacks/api/stacks-blockchain/mempool/transaction-fee-priorities.mdx b/content/docs/stacks/api/stacks-blockchain/mempool/transaction-fee-priorities.mdx new file mode 100644 index 000000000..42662e0a8 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/mempool/transaction-fee-priorities.mdx @@ -0,0 +1,11 @@ +--- +title: Get transaction fee priorities +description: Retrieves estimated fee priorities (in micro-STX) for all transactions that are currently in the mempool. Also returns priorities separated by transaction type. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/stacks-blockchain/names/historical-zonefile.mdx b/content/docs/stacks/api/stacks-blockchain/names/historical-zonefile.mdx new file mode 100644 index 000000000..ab96441bf --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/names/historical-zonefile.mdx @@ -0,0 +1,11 @@ +--- +title: Get historical zone file +description: Retrieves the historical zone file for a specific name. +full: true +--- + + diff --git a/content/docs/stacks/api/names/index.mdx b/content/docs/stacks/api/stacks-blockchain/names/index.mdx similarity index 92% rename from content/docs/stacks/api/names/index.mdx rename to content/docs/stacks/api/stacks-blockchain/names/index.mdx index b1e2ce35f..da0c711a5 100644 --- a/content/docs/stacks/api/names/index.mdx +++ b/content/docs/stacks/api/stacks-blockchain/names/index.mdx @@ -1,6 +1,6 @@ --- title: Names index: true -toc: false +full: true description: Manages and retrieve information on blockchain namespaces, names, and related details. --- \ No newline at end of file diff --git a/content/docs/stacks/api/names/meta.json b/content/docs/stacks/api/stacks-blockchain/names/meta.json similarity index 100% rename from content/docs/stacks/api/names/meta.json rename to content/docs/stacks/api/stacks-blockchain/names/meta.json diff --git a/content/docs/stacks/api/stacks-blockchain/names/name-details.mdx b/content/docs/stacks/api/stacks-blockchain/names/name-details.mdx new file mode 100644 index 000000000..5c6014255 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/names/name-details.mdx @@ -0,0 +1,11 @@ +--- +title: Get name details +description: Retrieves details of a given name including the address, status and last transaction ID. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/names/name-subdomains.mdx b/content/docs/stacks/api/stacks-blockchain/names/name-subdomains.mdx new file mode 100644 index 000000000..908800c56 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/names/name-subdomains.mdx @@ -0,0 +1,11 @@ +--- +title: Get name subdomains +description: Retrieves the list of subdomains for a specific name. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/names/name-zonefile.mdx b/content/docs/stacks/api/stacks-blockchain/names/name-zonefile.mdx new file mode 100644 index 000000000..b9e78f840 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/names/name-zonefile.mdx @@ -0,0 +1,11 @@ +--- +title: Get name zone file +description: Retrieves the zone file for a specific name. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/names/names.mdx b/content/docs/stacks/api/stacks-blockchain/names/names.mdx new file mode 100644 index 000000000..831965ed6 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/names/names.mdx @@ -0,0 +1,11 @@ +--- +title: Get all names +description: Retrieves a list of all names known to the node. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/names/namespace-names.mdx b/content/docs/stacks/api/stacks-blockchain/names/namespace-names.mdx new file mode 100644 index 000000000..0faf24730 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/names/namespace-names.mdx @@ -0,0 +1,11 @@ +--- +title: Get namespace names +description: Retrieves a list of names within a given namespace. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/names/namespaces.mdx b/content/docs/stacks/api/stacks-blockchain/names/namespaces.mdx new file mode 100644 index 000000000..fca209a52 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/names/namespaces.mdx @@ -0,0 +1,11 @@ +--- +title: Get all namespaces +description: Retrieves a list of all namespaces known to the node. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/names/owned-by-address.mdx b/content/docs/stacks/api/stacks-blockchain/names/owned-by-address.mdx new file mode 100644 index 000000000..f1af10eca --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/names/owned-by-address.mdx @@ -0,0 +1,11 @@ +--- +title: Get names owned by address +description: Retrieves the list of names owned by a specific address. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/history.mdx b/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/history.mdx new file mode 100644 index 000000000..cba34ea6f --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/history.mdx @@ -0,0 +1,11 @@ +--- +title: Get non-fungible token history +description: Retrieves the history of a non-fungible token. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/holdings.mdx b/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/holdings.mdx new file mode 100644 index 000000000..d8cd8d487 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/holdings.mdx @@ -0,0 +1,11 @@ +--- +title: Get non-fungible token holdings +description: Retrieves a list of non-fungible tokens owned by the given principal (STX address or smart contract ID). +full: true +--- + + diff --git a/content/docs/stacks/api/non-fungible-tokens/index.mdx b/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/index.mdx similarity index 91% rename from content/docs/stacks/api/non-fungible-tokens/index.mdx rename to content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/index.mdx index 14ac1c364..fef5efe73 100644 --- a/content/docs/stacks/api/non-fungible-tokens/index.mdx +++ b/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/index.mdx @@ -1,6 +1,6 @@ --- title: Non-fungible tokens index: true -toc: false +full: true description: Read-only endpoints to obtain non-fungible token details. --- diff --git a/content/docs/stacks/api/non-fungible-tokens/meta.json b/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/meta.json similarity index 100% rename from content/docs/stacks/api/non-fungible-tokens/meta.json rename to content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/meta.json diff --git a/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/mints.mdx b/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/mints.mdx new file mode 100644 index 000000000..c3ffb7608 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/mints.mdx @@ -0,0 +1,11 @@ +--- +title: Get non-fungible token mints +description: Retrieves a list of non-fungible token mints for a given asset identifier. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycle.mdx b/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycle.mdx new file mode 100644 index 000000000..4dc1f123b --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycle.mdx @@ -0,0 +1,11 @@ +--- +title: Get PoX cycle +description: Retrieves details for a PoX cycle. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycles.mdx b/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycles.mdx new file mode 100644 index 000000000..494921cf1 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycles.mdx @@ -0,0 +1,11 @@ +--- +title: Get PoX cycles +description: Retrieves a list of PoX cycles. +full: true +--- + + diff --git a/content/docs/stacks/api/proof-of-transfer/index.mdx b/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/index.mdx similarity index 91% rename from content/docs/stacks/api/proof-of-transfer/index.mdx rename to content/docs/stacks/api/stacks-blockchain/proof-of-transfer/index.mdx index ffd2bc813..e53b59c1a 100644 --- a/content/docs/stacks/api/proof-of-transfer/index.mdx +++ b/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/index.mdx @@ -1,7 +1,7 @@ --- title: Proof of Transfer index: true -toc: false +full: true description: Retrieve information on PoX cycles, signers, and stackers. --- diff --git a/content/docs/stacks/api/proof-of-transfer/meta.json b/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/meta.json similarity index 100% rename from content/docs/stacks/api/proof-of-transfer/meta.json rename to content/docs/stacks/api/stacks-blockchain/proof-of-transfer/meta.json diff --git a/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle.mdx b/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle.mdx new file mode 100644 index 000000000..616f8d153 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle.mdx @@ -0,0 +1,11 @@ +--- +title: Get signer in PoX cycle +description: Retrieves details for a signer in a PoX cycle. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle.mdx b/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle.mdx new file mode 100644 index 000000000..fcdd534a3 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle.mdx @@ -0,0 +1,11 @@ +--- +title: Get signers in PoX cycle +description: Retrieves a list of signers in a PoX cycle. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle.mdx b/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle.mdx new file mode 100644 index 000000000..9c923aa68 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle.mdx @@ -0,0 +1,11 @@ +--- +title: Get stackers for signer in PoX cycle +description: Retrieves a list of stackers for a signer in a PoX cycle. +full: true +--- + + diff --git a/content/docs/stacks/api/search/index.mdx b/content/docs/stacks/api/stacks-blockchain/search/index.mdx similarity index 87% rename from content/docs/stacks/api/search/index.mdx rename to content/docs/stacks/api/stacks-blockchain/search/index.mdx index e3684bf00..2eccacd41 100644 --- a/content/docs/stacks/api/search/index.mdx +++ b/content/docs/stacks/api/stacks-blockchain/search/index.mdx @@ -1,7 +1,7 @@ --- title: Search index: true -toc: false +full: true description: Search for a principal by ID. --- diff --git a/content/docs/stacks/api/search/meta.json b/content/docs/stacks/api/stacks-blockchain/search/meta.json similarity index 100% rename from content/docs/stacks/api/search/meta.json rename to content/docs/stacks/api/stacks-blockchain/search/meta.json diff --git a/content/docs/stacks/api/stacks-blockchain/search/search-by-id.mdx b/content/docs/stacks/api/stacks-blockchain/search/search-by-id.mdx new file mode 100644 index 000000000..41fa8f45d --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/search/search-by-id.mdx @@ -0,0 +1,11 @@ +--- +title: Search by ID +description: Search blocks, transactions, contracts, or accounts by hash/ID. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/smart-contracts/by-trait.mdx b/content/docs/stacks/api/stacks-blockchain/smart-contracts/by-trait.mdx new file mode 100644 index 000000000..5ca67cdbc --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/smart-contracts/by-trait.mdx @@ -0,0 +1,11 @@ +--- +title: Get contracts by trait +description: Retrieves a list of contracts based on the following traits listed in JSON format - functions, variables, maps, fungible tokens and non-fungible tokens. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/smart-contracts/events.mdx b/content/docs/stacks/api/stacks-blockchain/smart-contracts/events.mdx new file mode 100644 index 000000000..0a96d64c2 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/smart-contracts/events.mdx @@ -0,0 +1,11 @@ +--- +title: Get contract events +description: Retrieves a list of events that have been triggered by a given smart contract. +full: true +--- + + diff --git a/content/docs/stacks/api/smart-contracts/index.mdx b/content/docs/stacks/api/stacks-blockchain/smart-contracts/index.mdx similarity index 91% rename from content/docs/stacks/api/smart-contracts/index.mdx rename to content/docs/stacks/api/stacks-blockchain/smart-contracts/index.mdx index 32e39b1ac..5559d6350 100644 --- a/content/docs/stacks/api/smart-contracts/index.mdx +++ b/content/docs/stacks/api/stacks-blockchain/smart-contracts/index.mdx @@ -1,6 +1,6 @@ --- title: Smart contracts index: true -toc: false +full: true description: Provide information and facilitate interactions with smart contracts. --- diff --git a/content/docs/stacks/api/stacks-blockchain/smart-contracts/info.mdx b/content/docs/stacks/api/stacks-blockchain/smart-contracts/info.mdx new file mode 100644 index 000000000..2bfd84105 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/smart-contracts/info.mdx @@ -0,0 +1,11 @@ +--- +title: Get contract info +description: Retrieves details for a specific smart contract. +full: true +--- + + diff --git a/content/docs/stacks/api/smart-contracts/meta.json b/content/docs/stacks/api/stacks-blockchain/smart-contracts/meta.json similarity index 100% rename from content/docs/stacks/api/smart-contracts/meta.json rename to content/docs/stacks/api/stacks-blockchain/smart-contracts/meta.json diff --git a/content/docs/stacks/api/stacks-blockchain/smart-contracts/status.mdx b/content/docs/stacks/api/stacks-blockchain/smart-contracts/status.mdx new file mode 100644 index 000000000..b24bd6b86 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/smart-contracts/status.mdx @@ -0,0 +1,11 @@ +--- +title: Get contracts status +description: Retrieves the deployment status of multiple smart contracts. +full: true +--- + + diff --git a/content/docs/stacks/api/stacking-pool/index.mdx b/content/docs/stacks/api/stacks-blockchain/stacking-pool/index.mdx similarity index 92% rename from content/docs/stacks/api/stacking-pool/index.mdx rename to content/docs/stacks/api/stacks-blockchain/stacking-pool/index.mdx index 9dd34271f..3ec1a13ee 100644 --- a/content/docs/stacks/api/stacking-pool/index.mdx +++ b/content/docs/stacks/api/stacks-blockchain/stacking-pool/index.mdx @@ -1,6 +1,6 @@ --- title: Stacking pool index: true -toc: false +full: true description: Retrieve the list of stacking pool members for a given delegator principal. --- diff --git a/content/docs/stacks/api/stacks-blockchain/stacking-pool/members.mdx b/content/docs/stacks/api/stacks-blockchain/stacking-pool/members.mdx new file mode 100644 index 000000000..eeae12614 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/stacking-pool/members.mdx @@ -0,0 +1,11 @@ +--- +title: Get stacking pool members +description: Retrieves the list of stacking pool members for a given delegator principal. +full: true +--- + + diff --git a/content/docs/stacks/api/stacking-pool/meta.json b/content/docs/stacks/api/stacks-blockchain/stacking-pool/meta.json similarity index 100% rename from content/docs/stacks/api/stacking-pool/meta.json rename to content/docs/stacks/api/stacks-blockchain/stacking-pool/meta.json diff --git a/content/docs/stacks/api/stacking-rewards/index.mdx b/content/docs/stacks/api/stacks-blockchain/stacking-rewards/index.mdx similarity index 92% rename from content/docs/stacks/api/stacking-rewards/index.mdx rename to content/docs/stacks/api/stacks-blockchain/stacking-rewards/index.mdx index 072a558af..964e5f731 100644 --- a/content/docs/stacks/api/stacking-rewards/index.mdx +++ b/content/docs/stacks/api/stacks-blockchain/stacking-rewards/index.mdx @@ -1,6 +1,6 @@ --- title: Stacking rewards index: true -toc: false +full: true description: Provides information on recent rewards, recipients, and total earned amounts. --- diff --git a/content/docs/stacks/api/stacking-rewards/meta.json b/content/docs/stacks/api/stacks-blockchain/stacking-rewards/meta.json similarity index 100% rename from content/docs/stacks/api/stacking-rewards/meta.json rename to content/docs/stacks/api/stacks-blockchain/stacking-rewards/meta.json diff --git a/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient.mdx b/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient.mdx new file mode 100644 index 000000000..628b6d212 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient.mdx @@ -0,0 +1,11 @@ +--- +title: Get recent burnchain reward for the given recipient +description: Retrieves a list of recent burnchain (e.g. Bitcoin) rewards for the given recipient with the associated amounts and block info. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients.mdx b/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients.mdx new file mode 100644 index 000000000..cdae7242b --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients.mdx @@ -0,0 +1,11 @@ +--- +title: Get recent burnchain reward recipients +description: Retrieves a list of recent burnchain (e.g. Bitcoin) reward recipients with the associated amounts and block info. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries.mdx b/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries.mdx new file mode 100644 index 000000000..01334c943 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries.mdx @@ -0,0 +1,11 @@ +--- +title: Get recent reward slot holder entries +description: Retrieves a list of the Bitcoin addresses that would validly receive Proof-of-Transfer commitments for a given reward slot holder recipient address. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders.mdx b/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders.mdx new file mode 100644 index 000000000..7b8a063b6 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders.mdx @@ -0,0 +1,11 @@ +--- +title: Get recent reward slot holders +description: Retrieves a list of the Bitcoin addresses that would validly receive Proof-of-Transfer commitments. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient.mdx b/content/docs/stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient.mdx new file mode 100644 index 000000000..fe5f5357a --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient.mdx @@ -0,0 +1,11 @@ +--- +title: Get total burnchain rewards for the given recipient +description: Retrieves the total burnchain (e.g. Bitcoin) rewards for a given recipient address. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/tokens/holders.mdx b/content/docs/stacks/api/stacks-blockchain/tokens/holders.mdx new file mode 100644 index 000000000..e03b9aff5 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/tokens/holders.mdx @@ -0,0 +1,11 @@ +--- +title: Get fungible token holders +description: Retrieves the list of fungible token holders for a given token ID. +full: true +--- + + diff --git a/content/docs/stacks/api/tokens/index.mdx b/content/docs/stacks/api/stacks-blockchain/tokens/index.mdx similarity index 89% rename from content/docs/stacks/api/tokens/index.mdx rename to content/docs/stacks/api/stacks-blockchain/tokens/index.mdx index 65eb71bfd..4bc0049fb 100644 --- a/content/docs/stacks/api/tokens/index.mdx +++ b/content/docs/stacks/api/stacks-blockchain/tokens/index.mdx @@ -1,6 +1,6 @@ --- title: Tokens index: true -toc: false +full: true description: Read-only endpoints to obtain token details. --- diff --git a/content/docs/stacks/api/tokens/meta.json b/content/docs/stacks/api/stacks-blockchain/tokens/meta.json similarity index 100% rename from content/docs/stacks/api/tokens/meta.json rename to content/docs/stacks/api/stacks-blockchain/tokens/meta.json diff --git a/content/docs/stacks/api/stacks-blockchain/transactions/address-transactions.mdx b/content/docs/stacks/api/stacks-blockchain/transactions/address-transactions.mdx new file mode 100644 index 000000000..d25fbce8b --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/transactions/address-transactions.mdx @@ -0,0 +1,11 @@ +--- +title: Get address transactions +description: Retrieves transactions sent or received by a STX address or smart contract ID. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/transactions/details-for-transactions.mdx b/content/docs/stacks/api/stacks-blockchain/transactions/details-for-transactions.mdx new file mode 100644 index 000000000..a10fcb001 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/transactions/details-for-transactions.mdx @@ -0,0 +1,11 @@ +--- +title: Get details for transactions +description: Retrieves details for a list of transactions. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions.mdx b/content/docs/stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions.mdx new file mode 100644 index 000000000..2a63a80f0 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions.mdx @@ -0,0 +1,11 @@ +--- +title: Get dropped mempool transactions +description: Retrieves all recently-broadcast transactions that have been dropped from the mempool. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction.mdx b/content/docs/stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction.mdx new file mode 100644 index 000000000..bc5ba0756 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction.mdx @@ -0,0 +1,11 @@ +--- +title: Get events for an address transaction +description: Retrieves events for a specific transaction. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/transactions/get-raw-transaction.mdx b/content/docs/stacks/api/stacks-blockchain/transactions/get-raw-transaction.mdx new file mode 100644 index 000000000..f97a71699 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/transactions/get-raw-transaction.mdx @@ -0,0 +1,11 @@ +--- +title: Get raw transaction +description: Retrieves a hex encoded serialized transaction for a given ID. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/transactions/get-transaction.mdx b/content/docs/stacks/api/stacks-blockchain/transactions/get-transaction.mdx new file mode 100644 index 000000000..ec278485d --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/transactions/get-transaction.mdx @@ -0,0 +1,11 @@ +--- +title: Get transaction +description: Retrieves details for a specific transaction. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/transactions/index.mdx b/content/docs/stacks/api/stacks-blockchain/transactions/index.mdx similarity index 91% rename from content/docs/stacks/api/transactions/index.mdx rename to content/docs/stacks/api/stacks-blockchain/transactions/index.mdx index c6098a6e7..1ea12c484 100644 --- a/content/docs/stacks/api/transactions/index.mdx +++ b/content/docs/stacks/api/stacks-blockchain/transactions/index.mdx @@ -1,6 +1,6 @@ --- title: Transactions index: true -toc: false +full: true description: Manage, retrieve, and broadcast transaction data on the blockchain. --- \ No newline at end of file diff --git a/content/docs/stacks/api/stacks-blockchain/transactions/mempool-transactions.mdx b/content/docs/stacks/api/stacks-blockchain/transactions/mempool-transactions.mdx new file mode 100644 index 000000000..166a9d144 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/transactions/mempool-transactions.mdx @@ -0,0 +1,11 @@ +--- +title: Get mempool transactions +description: Retrieves all transactions that have been recently broadcast to the mempool. These are pending transactions awaiting confirmation. +full: true +--- + + diff --git a/content/docs/stacks/api/transactions/meta.json b/content/docs/stacks/api/stacks-blockchain/transactions/meta.json similarity index 100% rename from content/docs/stacks/api/transactions/meta.json rename to content/docs/stacks/api/stacks-blockchain/transactions/meta.json diff --git a/content/docs/stacks/api/stacks-blockchain/transactions/recent-transactions.mdx b/content/docs/stacks/api/stacks-blockchain/transactions/recent-transactions.mdx new file mode 100644 index 000000000..4e7c822b4 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/transactions/recent-transactions.mdx @@ -0,0 +1,11 @@ +--- +title: Get recent transactions +description: Retrieves all recently mined transactions. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions.mdx b/content/docs/stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions.mdx new file mode 100644 index 000000000..3524599a0 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions.mdx @@ -0,0 +1,12 @@ +--- +title: Get statistics for mempool transactions +description: Retrieves statistics for transactions in the mempool, such as counts, ages, and fees. +full: true +--- + + + diff --git a/content/docs/stacks/api/stacks-blockchain/transactions/transaction-events.mdx b/content/docs/stacks/api/stacks-blockchain/transactions/transaction-events.mdx new file mode 100644 index 000000000..17081e0c5 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/transactions/transaction-events.mdx @@ -0,0 +1,11 @@ +--- +title: Get transaction events +description: Retrieves events for a specific transaction. +full: true +--- + + diff --git a/content/docs/stacks/api/stacks-blockchain/transactions/transactions-by-block.mdx b/content/docs/stacks/api/stacks-blockchain/transactions/transactions-by-block.mdx new file mode 100644 index 000000000..cfcb825ff --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/transactions/transactions-by-block.mdx @@ -0,0 +1,11 @@ +--- +title: Get transactions by block +description: Retrieves transactions confirmed in a single block. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/stacks-blockchain/transactions/transactions-for-address.mdx b/content/docs/stacks/api/stacks-blockchain/transactions/transactions-for-address.mdx new file mode 100644 index 000000000..84cf17818 --- /dev/null +++ b/content/docs/stacks/api/stacks-blockchain/transactions/transactions-for-address.mdx @@ -0,0 +1,11 @@ +--- +title: Get transactions for address +description: Retrieves transactions for a specific address. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/token-metadata/info/index.mdx b/content/docs/stacks/api/token-metadata/info/index.mdx new file mode 100644 index 000000000..5bf7b0e10 --- /dev/null +++ b/content/docs/stacks/api/token-metadata/info/index.mdx @@ -0,0 +1,6 @@ +--- +title: Info +index: true +full: true +description: Retrieves information about the Token Metadata API, including the server version. +--- diff --git a/content/docs/stacks/api/token-metadata/info/meta.json b/content/docs/stacks/api/token-metadata/info/meta.json new file mode 100644 index 000000000..07115548d --- /dev/null +++ b/content/docs/stacks/api/token-metadata/info/meta.json @@ -0,0 +1,7 @@ +{ + "title": "Info", + "pages": [ + "status" + ], + "defaultOpen": false +} \ No newline at end of file diff --git a/content/docs/stacks/api/token-metadata/info/status.mdx b/content/docs/stacks/api/token-metadata/info/status.mdx new file mode 100644 index 000000000..697b4a92f --- /dev/null +++ b/content/docs/stacks/api/token-metadata/info/status.mdx @@ -0,0 +1,11 @@ +--- +title: Get status +description: Retrieves information about the Token Metadata API, including the server version. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/token-metadata/tokens/fungible-token-metadata.mdx b/content/docs/stacks/api/token-metadata/tokens/fungible-token-metadata.mdx new file mode 100644 index 000000000..0f02fb7a5 --- /dev/null +++ b/content/docs/stacks/api/token-metadata/tokens/fungible-token-metadata.mdx @@ -0,0 +1,11 @@ +--- +title: Get fungible token metadata +description: Retrieves metadata for a SIP-010 fungible token. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/token-metadata/tokens/fungible-tokens.mdx b/content/docs/stacks/api/token-metadata/tokens/fungible-tokens.mdx new file mode 100644 index 000000000..33adde668 --- /dev/null +++ b/content/docs/stacks/api/token-metadata/tokens/fungible-tokens.mdx @@ -0,0 +1,11 @@ +--- +title: Get fungible tokens +description: Retrieves information about fungible tokens. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/token-metadata/tokens/index.mdx b/content/docs/stacks/api/token-metadata/tokens/index.mdx new file mode 100644 index 000000000..bd12ca078 --- /dev/null +++ b/content/docs/stacks/api/token-metadata/tokens/index.mdx @@ -0,0 +1,7 @@ +--- +title: Tokens +index: true +full: true +description: Retrieves information about tokens on the Stacks blockchain. +--- + diff --git a/content/docs/stacks/api/token-metadata/tokens/meta.json b/content/docs/stacks/api/token-metadata/tokens/meta.json new file mode 100644 index 000000000..34c7e5f11 --- /dev/null +++ b/content/docs/stacks/api/token-metadata/tokens/meta.json @@ -0,0 +1,10 @@ +{ + "title": "Tokens", + "pages": [ + "fungible-tokens", + "fungible-token-metadata", + "non-fungible-token-metadata", + "semi-fungible-token-metadata" + ], + "defaultOpen": false +} \ No newline at end of file diff --git a/content/docs/stacks/api/token-metadata/tokens/non-fungible-token-metadata.mdx b/content/docs/stacks/api/token-metadata/tokens/non-fungible-token-metadata.mdx new file mode 100644 index 000000000..fd5181e78 --- /dev/null +++ b/content/docs/stacks/api/token-metadata/tokens/non-fungible-token-metadata.mdx @@ -0,0 +1,11 @@ +--- +title: Get non-fungible token metadata +description: Retrieves metadata for a SIP-009 non-fungible token. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/token-metadata/tokens/semi-fungible-token-metadata.mdx b/content/docs/stacks/api/token-metadata/tokens/semi-fungible-token-metadata.mdx new file mode 100644 index 000000000..8b5893646 --- /dev/null +++ b/content/docs/stacks/api/token-metadata/tokens/semi-fungible-token-metadata.mdx @@ -0,0 +1,11 @@ +--- +title: Get semi-fungible token metadata +description: Retrieves information about semi-fungible tokens. +full: true +--- + + \ No newline at end of file diff --git a/content/docs/stacks/api/tokens/holders.mdx b/content/docs/stacks/api/tokens/holders.mdx deleted file mode 100644 index 3ac6aa743..000000000 --- a/content/docs/stacks/api/tokens/holders.mdx +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: Get fungible token holders -description: Retrieves the list of fungible token holders for a given token ID. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Fungible token holders - -Retrieves the list of fungible token holders for a given token ID. Specify `stx` for the `token` parameter to get the list of STX holders. - -### Path Parameters - - - -fungible token identifier - - - -| Status code | Description | -| :------ | :------ | -| `200` | Fungible token holders | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/tokens/ft/string/holders" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/tokens/ft/string/holders", { - method: "GET" -}); -``` - - - - - - - - - -List of fungible token holders - - - - - -```json -{ - "limit": 200, - "offset": 0, - "total": 0, - "total_supply": "string", - "results": [ - { - "address": "string", - "balance": "string" - } - ] -} -``` - - - - - -```ts -/** - * List of fungible token holders - */ -export interface FungibleTokenHolderList { - /** - * The number of holders to return - */ - limit: number; - /** - * The number to holders to skip (starting at `0`) - */ - offset: number; - /** - * The number of holders available - */ - total: number; - /** - * The total supply of the token (the sum of all balances) - */ - total_supply: string; - results: FtHolderEntry[]; -} -export interface FtHolderEntry { - address: string; - balance: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/transactions/address-transactions.mdx b/content/docs/stacks/api/transactions/address-transactions.mdx deleted file mode 100644 index 5933e33fa..000000000 --- a/content/docs/stacks/api/transactions/address-transactions.mdx +++ /dev/null @@ -1,740 +0,0 @@ ---- -title: Get address transactions -description: Retrieves transactions sent or received by a STX address or smart contract ID. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get address transactions - -Retrieves a paginated list of confirmed transactions sent or received by a STX address or Smart Contract ID, alongside the total amount of STX sent or received and the number of STX, FT and NFT transfers contained within each transaction. - -More information on Transaction types can be found [here](https://docs.stacks.co/understand-stacks/transactions#types). - -### Path Parameters - - - -STX address or Smart Contract ID - -Example: `"SP31DA6FTSJX2WGTZ69SFY11BH51NZMB0ZW97B5P0"` - - -### Query Parameters - - - -Number of transactions to fetch - -Example: `20` - - - - - -Index of first transaction to fetch - -Example: `10` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/addresses/SP31DA6FTSJX2WGTZ69SFY11BH51NZMB0ZW97B5P0/transactions?limit=20&offset=10" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/addresses/SP31DA6FTSJX2WGTZ69SFY11BH51NZMB0ZW97B5P0/transactions?limit=20&offset=10", { - method: "GET" -}); -``` - - - - - - - - - -GET Address Transactions - - - - - -```json -{ - "limit": 30, - "offset": 0, - "total": 0, - "results": [ - { - "tx": { - "tx_id": "string", - "nonce": 0, - "fee_rate": "string", - "sender_address": "string", - "sponsor_nonce": 0, - "sponsored": true, - "sponsor_address": "string", - "post_condition_mode": "allow", - "post_conditions": [ - { - "principal": { - "type_id": "principal_origin" - }, - "condition_code": "sent_equal_to", - "amount": "string", - "type": "stx" - } - ], - "anchor_mode": "on_chain_only", - "block_hash": "string", - "block_height": 0, - "block_time": 0, - "block_time_iso": "string", - "burn_block_height": 0, - "burn_block_time": 0, - "burn_block_time_iso": "string", - "parent_burn_block_time": 0, - "parent_burn_block_time_iso": "string", - "canonical": true, - "tx_index": 0, - "tx_status": "success", - "tx_result": { - "hex": "string", - "repr": "string" - }, - "event_count": 0, - "parent_block_hash": "string", - "is_unanchored": true, - "microblock_hash": "string", - "microblock_sequence": 0, - "microblock_canonical": true, - "execution_cost_read_count": 0, - "execution_cost_read_length": 0, - "execution_cost_runtime": 0, - "execution_cost_write_count": 0, - "execution_cost_write_length": 0, - "events": [ - { - "event_index": 0, - "event_type": "smart_contract_log", - "tx_id": "string", - "contract_log": { - "contract_id": "string", - "topic": "string", - "value": { - "hex": "string", - "repr": "string" - } - } - } - ], - "tx_type": "token_transfer", - "token_transfer": { - "recipient_address": "string", - "amount": "string", - "memo": "string" - } - }, - "stx_sent": "string", - "stx_received": "string", - "events": { - "stx": { - "transfer": 0, - "mint": 0, - "burn": 0 - }, - "ft": { - "transfer": 0, - "mint": 0, - "burn": 0 - }, - "nft": { - "transfer": 0, - "mint": 0, - "burn": 0 - } - } - } - ] -} -``` - - - - - -```ts -/** - * Describes all transaction types on Stacks 2.0 blockchain - */ -export type Transaction = - | TokenTransferTransaction - | SmartContractTransaction - | ContractCallTransaction - | PoisonMicroblockTransaction - | CoinbaseTransaction - | TenureChangeTransaction; -/** - * Describes representation of a Type-0 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-0-transferring-an-asset - */ -export type TokenTransferTransaction = AbstractTransaction & TokenTransferTransactionMetadata; -/** - * Anchored transaction metadata. All mined/anchored Stacks transactions have these properties. - */ -export type AbstractTransaction = BaseTransaction & { - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - tx_status: TransactionStatus; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - /** - * List of transaction events - */ - events: TransactionEvent[]; -}; -export type PostConditionMode = "allow" | "deny"; -/** - * Post-conditionscan limit the damage done to a user's assets - */ -export type PostCondition = PostConditionStx | PostConditionFungible | PostConditionNonFungible; -export type PostConditionStx = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - amount: string; - type: "stx"; -}; -export type PostConditionPrincipal = - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_origin"; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_standard"; - address: string; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_contract"; - address: string; - contract_name: string; - }; -/** - * A fungible condition code encodes a statement being made for either STX or a fungible token, with respect to the originating account. - */ -export type PostConditionFungibleConditionCode = - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; -export type PostConditionFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - type: "fungible"; - amount: string; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -export type PostConditionNonFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionNonFungibleConditionCode; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -/** - * A non-fungible condition code encodes a statement being made about a non-fungible token, with respect to whether or not the particular non-fungible token is owned by the account. - */ -export type PostConditionNonFungibleConditionCode = "sent" | "not_sent"; -/** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ -export type TransactionAnchorModeType = "on_chain_only" | "off_chain_only" | "any"; -/** - * Status of the transaction - */ -export type TransactionStatus = "success" | "abort_by_response" | "abort_by_post_condition"; -export type TransactionEvent = - | TransactionEventSmartContractLog - | TransactionEventStxLock - | TransactionEventStxAsset - | TransactionEventFungibleAsset - | TransactionEventNonFungibleAsset; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventSmartContractLog = AbstractTransactionEvent & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxLock = AbstractTransactionEvent & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxAsset = AbstractTransactionEvent & { - event_type: "stx_asset"; - tx_id: string; - asset: TransactionEventAsset; -}; -export type TransactionEventAssetType = "transfer" | "mint" | "burn"; -export type TransactionEventFungibleAsset = AbstractTransactionEvent & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type TransactionEventNonFungibleAsset = AbstractTransactionEvent & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Describes representation of a Type-1 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export type SmartContractTransaction = AbstractTransaction & SmartContractTransactionMetadata; -/** - * Describes representation of a Type 2 Stacks 2.0 transaction: Contract Call - */ -export type ContractCallTransaction = AbstractTransaction & ContractCallTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type PoisonMicroblockTransaction = AbstractTransaction & PoisonMicroblockTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type CoinbaseTransaction = AbstractTransaction & CoinbaseTransactionMetadata; -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export type TenureChangeTransaction = AbstractTransaction & TenureChangeTransactionMetadata; - -/** - * GET Address Transactions - */ -export interface AddressTransactionsV2ListResponse { - limit: number; - offset: number; - total: number; - results: AddressTransaction[]; -} -/** - * Address transaction with STX, FT and NFT transfer summaries - */ -export interface AddressTransaction { - tx: Transaction; - /** - * Total sent from the given address, including the tx fee, in micro-STX as an integer string. - */ - stx_sent: string; - /** - * Total received by the given address in micro-STX as an integer string. - */ - stx_received: string; - events?: { - stx: { - transfer: number; - mint: number; - burn: number; - }; - ft: { - transfer: number; - mint: number; - burn: number; - }; - nft: { - transfer: number; - mint: number; - burn: number; - }; - }; -} -/** - * Transaction properties that are available from a raw serialized transactions. These are available for transactions in the mempool as well as mined transactions. - */ -export interface BaseTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: PostConditionMode; - post_conditions: PostCondition[]; - anchor_mode: TransactionAnchorModeType; -} -export interface AbstractTransactionEvent { - event_index: number; -} -export interface TransactionEventAsset { - asset_event_type?: TransactionEventAssetType; - asset_id?: string; - sender?: string; - recipient?: string; - amount?: string; - value?: string; - memo?: string; -} -/** - * Metadata associated with token-transfer type transactions - */ -export interface TokenTransferTransactionMetadata { - tx_type: "token_transfer"; - token_transfer: { - recipient_address: string; - /** - * Transfer amount as Integer string (64-bit unsigned integer) - */ - amount: string; - /** - * Hex encoded arbitrary message, up to 34 bytes length (should try decoding to an ASCII string) - */ - memo: string; - }; -} -/** - * Metadata associated with a contract-deploy type transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export interface SmartContractTransactionMetadata { - tx_type: "smart_contract"; - smart_contract: { - /** - * The Clarity version of the contract, only specified for versioned contract transactions, otherwise null - */ - clarity_version?: number; - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Clarity code of the smart contract being deployed - */ - source_code: string; - }; -} -/** - * Metadata associated with a contract-call type transaction - */ -export interface ContractCallTransactionMetadata { - tx_type: "contract_call"; - contract_call: { - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Name of the Clarity function to be invoked - */ - function_name: string; - /** - * Function definition, including function name and type as well as parameter names and types - */ - function_signature: string; - /** - * List of arguments used to invoke the function - */ - function_args?: { - hex: string; - repr: string; - name: string; - type: string; - }[]; - }; -} -/** - * Metadata associated with a poison-microblock type transaction - */ -export interface PoisonMicroblockTransactionMetadata { - tx_type: "poison_microblock"; - poison_microblock: { - /** - * Hex encoded microblock header - */ - microblock_header_1: string; - /** - * Hex encoded microblock header - */ - microblock_header_2: string; - }; -} -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export interface CoinbaseTransactionMetadata { - tx_type: "coinbase"; - coinbase_payload: { - /** - * Hex encoded 32-byte scratch space for block leader's use - */ - data: string; - /** - * A principal that will receive the miner rewards for this coinbase transaction. Can be either a standard principal or contract principal. Only specified for `coinbase-to-alt-recipient` transaction types, otherwise null. - */ - alt_recipient?: string; - /** - * Hex encoded 80-byte VRF proof - */ - vrf_proof?: string; - }; -} -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export interface TenureChangeTransactionMetadata { - tx_type: "tenure_change"; - tenure_change_payload?: { - /** - * Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. - */ - tenure_consensus_hash: string; - /** - * Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. - */ - prev_tenure_consensus_hash: string; - /** - * Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. - */ - burn_view_consensus_hash: string; - /** - * (Hex string) Stacks Block hash - */ - previous_tenure_end: string; - /** - * The number of blocks produced in the previous tenure. - */ - previous_tenure_blocks: number; - /** - * Cause of change in mining tenure. Depending on cause, tenure can be ended or extended. - */ - cause: "block_found" | "extended"; - /** - * (Hex string) The ECDSA public key hash of the current tenure. - */ - pubkey_hash: string; - }; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/transactions/details-for-transactions.mdx b/content/docs/stacks/api/transactions/details-for-transactions.mdx deleted file mode 100644 index 110f026c0..000000000 --- a/content/docs/stacks/api/transactions/details-for-transactions.mdx +++ /dev/null @@ -1,722 +0,0 @@ ---- -title: Get details for transactions -description: Retrieves details for a list of transactions. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get list of details for transactions - -Retrieves a list of transactions for a given list of transaction IDs - -If using TypeScript, import typings for this response from our types package: - -`import type { Transaction } from '@stacks/stacks-blockchain-api-types';` - -| Status code | Description | -| :------ | :------ | -| `200` | Returns list of transactions with their details for corresponding requested tx_ids. | -| `404` | Could not find any transaction by ID | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/tx/multiple" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/tx/multiple", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "property1": { - "found": true, - "result": { - "tx_id": "string", - "nonce": 0, - "fee_rate": "string", - "sender_address": "string", - "sponsor_nonce": 0, - "sponsored": true, - "sponsor_address": "string", - "post_condition_mode": "allow", - "post_conditions": [ - { - "principal": { - "type_id": "principal_origin" - }, - "condition_code": "sent_equal_to", - "amount": "string", - "type": "stx" - } - ], - "anchor_mode": "on_chain_only", - "tx_status": "pending", - "receipt_time": 0, - "receipt_time_iso": "string", - "tx_type": "token_transfer", - "token_transfer": { - "recipient_address": "string", - "amount": "string", - "memo": "string" - } - } - }, - "property2": { - "found": true, - "result": { - "tx_id": "string", - "nonce": 0, - "fee_rate": "string", - "sender_address": "string", - "sponsor_nonce": 0, - "sponsored": true, - "sponsor_address": "string", - "post_condition_mode": "allow", - "post_conditions": [ - { - "principal": { - "type_id": "principal_origin" - }, - "condition_code": "sent_equal_to", - "amount": "string", - "type": "stx" - } - ], - "anchor_mode": "on_chain_only", - "tx_status": "pending", - "receipt_time": 0, - "receipt_time_iso": "string", - "tx_type": "token_transfer", - "token_transfer": { - "recipient_address": "string", - "amount": "string", - "memo": "string" - } - } - } -} -``` - - - - - -```ts -/** - * Describes all transaction types on Stacks 2.0 blockchain - */ -export type MempoolTransaction = - | MempoolTokenTransferTransaction - | MempoolSmartContractTransaction - | MempoolContractCallTransaction - | MempoolPoisonMicroblockTransaction - | MempoolCoinbaseTransaction - | MempoolTenureChangeTransaction; -/** - * Describes representation of a Type-0 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-0-transferring-an-asset - */ -export type MempoolTokenTransferTransaction = AbstractMempoolTransaction & TokenTransferTransactionMetadata; -/** - * Abstract transaction. This schema makes up all properties common between all Stacks 2.0 transaction types - */ -export type AbstractMempoolTransaction = BaseTransaction & { - tx_status: MempoolTransactionStatus; - /** - * A unix timestamp (in seconds) indicating when the transaction broadcast was received by the node. - */ - receipt_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when the transaction broadcast was received by the node. - */ - receipt_time_iso: string; -}; -export type PostConditionMode = "allow" | "deny"; -/** - * Post-conditionscan limit the damage done to a user's assets - */ -export type PostCondition = PostConditionStx | PostConditionFungible | PostConditionNonFungible; -export type PostConditionStx = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - amount: string; - type: "stx"; -}; -export type PostConditionPrincipal = - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_origin"; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_standard"; - address: string; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_contract"; - address: string; - contract_name: string; - }; -/** - * A fungible condition code encodes a statement being made for either STX or a fungible token, with respect to the originating account. - */ -export type PostConditionFungibleConditionCode = - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; -export type PostConditionFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - type: "fungible"; - amount: string; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -export type PostConditionNonFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionNonFungibleConditionCode; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -/** - * A non-fungible condition code encodes a statement being made about a non-fungible token, with respect to whether or not the particular non-fungible token is owned by the account. - */ -export type PostConditionNonFungibleConditionCode = "sent" | "not_sent"; -/** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ -export type TransactionAnchorModeType = "on_chain_only" | "off_chain_only" | "any"; -/** - * Status of the transaction - */ -export type MempoolTransactionStatus = - | "pending" - | "dropped_replace_by_fee" - | "dropped_replace_across_fork" - | "dropped_too_expensive" - | "dropped_stale_garbage_collect" - | "dropped_problematic"; -/** - * Describes representation of a Type-1 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export type MempoolSmartContractTransaction = AbstractMempoolTransaction & SmartContractTransactionMetadata; -/** - * Describes representation of a Type 2 Stacks 2.0 transaction: Contract Call - */ -export type MempoolContractCallTransaction = AbstractMempoolTransaction & ContractCallTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type MempoolPoisonMicroblockTransaction = AbstractMempoolTransaction & PoisonMicroblockTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type MempoolCoinbaseTransaction = AbstractMempoolTransaction & CoinbaseTransactionMetadata; -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export type MempoolTenureChangeTransaction = AbstractMempoolTransaction & TenureChangeTransactionMetadata; -/** - * Describes all transaction types on Stacks 2.0 blockchain - */ -export type Transaction = - | TokenTransferTransaction - | SmartContractTransaction - | ContractCallTransaction - | PoisonMicroblockTransaction - | CoinbaseTransaction - | TenureChangeTransaction; -/** - * Describes representation of a Type-0 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-0-transferring-an-asset - */ -export type TokenTransferTransaction = AbstractTransaction & TokenTransferTransactionMetadata; -/** - * Anchored transaction metadata. All mined/anchored Stacks transactions have these properties. - */ -export type AbstractTransaction = BaseTransaction & { - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - tx_status: TransactionStatus; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - /** - * List of transaction events - */ - events: TransactionEvent[]; -}; -/** - * Status of the transaction - */ -export type TransactionStatus = "success" | "abort_by_response" | "abort_by_post_condition"; -export type TransactionEvent = - | TransactionEventSmartContractLog - | TransactionEventStxLock - | TransactionEventStxAsset - | TransactionEventFungibleAsset - | TransactionEventNonFungibleAsset; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventSmartContractLog = AbstractTransactionEvent & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxLock = AbstractTransactionEvent & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxAsset = AbstractTransactionEvent & { - event_type: "stx_asset"; - tx_id: string; - asset: TransactionEventAsset; -}; -export type TransactionEventAssetType = "transfer" | "mint" | "burn"; -export type TransactionEventFungibleAsset = AbstractTransactionEvent & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type TransactionEventNonFungibleAsset = AbstractTransactionEvent & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Describes representation of a Type-1 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export type SmartContractTransaction = AbstractTransaction & SmartContractTransactionMetadata; -/** - * Describes representation of a Type 2 Stacks 2.0 transaction: Contract Call - */ -export type ContractCallTransaction = AbstractTransaction & ContractCallTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type PoisonMicroblockTransaction = AbstractTransaction & PoisonMicroblockTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type CoinbaseTransaction = AbstractTransaction & CoinbaseTransactionMetadata; -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export type TenureChangeTransaction = AbstractTransaction & TenureChangeTransactionMetadata; - -export interface TransactionList { - [k: string]: TransactionFound | TransactionNotFound; -} -/** - * This object returns transaction for found true - */ -export interface TransactionFound { - found: true; - result: MempoolTransaction | Transaction; -} -/** - * Transaction properties that are available from a raw serialized transactions. These are available for transactions in the mempool as well as mined transactions. - */ -export interface BaseTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: PostConditionMode; - post_conditions: PostCondition[]; - anchor_mode: TransactionAnchorModeType; -} -/** - * Metadata associated with token-transfer type transactions - */ -export interface TokenTransferTransactionMetadata { - tx_type: "token_transfer"; - token_transfer: { - recipient_address: string; - /** - * Transfer amount as Integer string (64-bit unsigned integer) - */ - amount: string; - /** - * Hex encoded arbitrary message, up to 34 bytes length (should try decoding to an ASCII string) - */ - memo: string; - }; -} -/** - * Metadata associated with a contract-deploy type transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export interface SmartContractTransactionMetadata { - tx_type: "smart_contract"; - smart_contract: { - /** - * The Clarity version of the contract, only specified for versioned contract transactions, otherwise null - */ - clarity_version?: number; - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Clarity code of the smart contract being deployed - */ - source_code: string; - }; -} -/** - * Metadata associated with a contract-call type transaction - */ -export interface ContractCallTransactionMetadata { - tx_type: "contract_call"; - contract_call: { - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Name of the Clarity function to be invoked - */ - function_name: string; - /** - * Function definition, including function name and type as well as parameter names and types - */ - function_signature: string; - /** - * List of arguments used to invoke the function - */ - function_args?: { - hex: string; - repr: string; - name: string; - type: string; - }[]; - }; -} -/** - * Metadata associated with a poison-microblock type transaction - */ -export interface PoisonMicroblockTransactionMetadata { - tx_type: "poison_microblock"; - poison_microblock: { - /** - * Hex encoded microblock header - */ - microblock_header_1: string; - /** - * Hex encoded microblock header - */ - microblock_header_2: string; - }; -} -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export interface CoinbaseTransactionMetadata { - tx_type: "coinbase"; - coinbase_payload: { - /** - * Hex encoded 32-byte scratch space for block leader's use - */ - data: string; - /** - * A principal that will receive the miner rewards for this coinbase transaction. Can be either a standard principal or contract principal. Only specified for `coinbase-to-alt-recipient` transaction types, otherwise null. - */ - alt_recipient?: string; - /** - * Hex encoded 80-byte VRF proof - */ - vrf_proof?: string; - }; -} -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export interface TenureChangeTransactionMetadata { - tx_type: "tenure_change"; - tenure_change_payload?: { - /** - * Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. - */ - tenure_consensus_hash: string; - /** - * Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. - */ - prev_tenure_consensus_hash: string; - /** - * Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. - */ - burn_view_consensus_hash: string; - /** - * (Hex string) Stacks Block hash - */ - previous_tenure_end: string; - /** - * The number of blocks produced in the previous tenure. - */ - previous_tenure_blocks: number; - /** - * Cause of change in mining tenure. Depending on cause, tenure can be ended or extended. - */ - cause: "block_found" | "extended"; - /** - * (Hex string) The ECDSA public key hash of the current tenure. - */ - pubkey_hash: string; - }; -} -export interface AbstractTransactionEvent { - event_index: number; -} -export interface TransactionEventAsset { - asset_event_type?: TransactionEventAssetType; - asset_id?: string; - sender?: string; - recipient?: string; - amount?: string; - value?: string; - memo?: string; -} -/** - * This object returns the id for not found transaction - */ -export interface TransactionNotFound { - found: false; - result: { - tx_id: string; - }; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/transactions/dropped-mempool-transactions.mdx b/content/docs/stacks/api/transactions/dropped-mempool-transactions.mdx deleted file mode 100644 index 34766c500..000000000 --- a/content/docs/stacks/api/transactions/dropped-mempool-transactions.mdx +++ /dev/null @@ -1,475 +0,0 @@ ---- -title: Get dropped mempool transactions -description: Retrieves all recently-broadcast transactions that have been dropped from the mempool. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get dropped mempool transactions - -Retrieves all recently-broadcast transactions that have been dropped from the mempool. - -Transactions are dropped from the mempool if: - * they were stale and awaiting garbage collection or, - * were expensive, or - * were replaced with a new fee - -### Query Parameters - - - -max number of mempool transactions to fetch - -Default: `96` - -Maximum: `200` - - - - - -index of first mempool transaction to fetch - -Example: `42000` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of dropped mempool transactions | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/tx/mempool/dropped?limit=96&offset=42000" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/tx/mempool/dropped?limit=96&offset=42000", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns transactions - - - - - -```json -{ - "limit": 0, - "offset": 0, - "total": 0, - "results": [ - { - "tx_id": "string", - "nonce": 0, - "fee_rate": "string", - "sender_address": "string", - "sponsor_nonce": 0, - "sponsored": true, - "sponsor_address": "string", - "post_condition_mode": "allow", - "post_conditions": [ - { - "principal": { - "type_id": "principal_origin" - }, - "condition_code": "sent_equal_to", - "amount": "string", - "type": "stx" - } - ], - "anchor_mode": "on_chain_only", - "tx_status": "pending", - "receipt_time": 0, - "receipt_time_iso": "string", - "tx_type": "token_transfer", - "token_transfer": { - "recipient_address": "string", - "amount": "string", - "memo": "string" - } - } - ] -} -``` - - - - - -```ts -/** - * Describes all transaction types on Stacks 2.0 blockchain - */ -export type MempoolTransaction = - | MempoolTokenTransferTransaction - | MempoolSmartContractTransaction - | MempoolContractCallTransaction - | MempoolPoisonMicroblockTransaction - | MempoolCoinbaseTransaction - | MempoolTenureChangeTransaction; -/** - * Describes representation of a Type-0 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-0-transferring-an-asset - */ -export type MempoolTokenTransferTransaction = AbstractMempoolTransaction & TokenTransferTransactionMetadata; -/** - * Abstract transaction. This schema makes up all properties common between all Stacks 2.0 transaction types - */ -export type AbstractMempoolTransaction = BaseTransaction & { - tx_status: MempoolTransactionStatus; - /** - * A unix timestamp (in seconds) indicating when the transaction broadcast was received by the node. - */ - receipt_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when the transaction broadcast was received by the node. - */ - receipt_time_iso: string; -}; -export type PostConditionMode = "allow" | "deny"; -/** - * Post-conditionscan limit the damage done to a user's assets - */ -export type PostCondition = PostConditionStx | PostConditionFungible | PostConditionNonFungible; -export type PostConditionStx = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - amount: string; - type: "stx"; -}; -export type PostConditionPrincipal = - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_origin"; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_standard"; - address: string; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_contract"; - address: string; - contract_name: string; - }; -/** - * A fungible condition code encodes a statement being made for either STX or a fungible token, with respect to the originating account. - */ -export type PostConditionFungibleConditionCode = - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; -export type PostConditionFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - type: "fungible"; - amount: string; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -export type PostConditionNonFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionNonFungibleConditionCode; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -/** - * A non-fungible condition code encodes a statement being made about a non-fungible token, with respect to whether or not the particular non-fungible token is owned by the account. - */ -export type PostConditionNonFungibleConditionCode = "sent" | "not_sent"; -/** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ -export type TransactionAnchorModeType = "on_chain_only" | "off_chain_only" | "any"; -/** - * Status of the transaction - */ -export type MempoolTransactionStatus = - | "pending" - | "dropped_replace_by_fee" - | "dropped_replace_across_fork" - | "dropped_too_expensive" - | "dropped_stale_garbage_collect" - | "dropped_problematic"; -/** - * Describes representation of a Type-1 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export type MempoolSmartContractTransaction = AbstractMempoolTransaction & SmartContractTransactionMetadata; -/** - * Describes representation of a Type 2 Stacks 2.0 transaction: Contract Call - */ -export type MempoolContractCallTransaction = AbstractMempoolTransaction & ContractCallTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type MempoolPoisonMicroblockTransaction = AbstractMempoolTransaction & PoisonMicroblockTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type MempoolCoinbaseTransaction = AbstractMempoolTransaction & CoinbaseTransactionMetadata; -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export type MempoolTenureChangeTransaction = AbstractMempoolTransaction & TenureChangeTransactionMetadata; - -/** - * GET request that returns transactions - */ -export interface MempoolTransactionListResponse { - limit: number; - offset: number; - total: number; - results: MempoolTransaction[]; -} -/** - * Transaction properties that are available from a raw serialized transactions. These are available for transactions in the mempool as well as mined transactions. - */ -export interface BaseTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: PostConditionMode; - post_conditions: PostCondition[]; - anchor_mode: TransactionAnchorModeType; -} -/** - * Metadata associated with token-transfer type transactions - */ -export interface TokenTransferTransactionMetadata { - tx_type: "token_transfer"; - token_transfer: { - recipient_address: string; - /** - * Transfer amount as Integer string (64-bit unsigned integer) - */ - amount: string; - /** - * Hex encoded arbitrary message, up to 34 bytes length (should try decoding to an ASCII string) - */ - memo: string; - }; -} -/** - * Metadata associated with a contract-deploy type transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export interface SmartContractTransactionMetadata { - tx_type: "smart_contract"; - smart_contract: { - /** - * The Clarity version of the contract, only specified for versioned contract transactions, otherwise null - */ - clarity_version?: number; - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Clarity code of the smart contract being deployed - */ - source_code: string; - }; -} -/** - * Metadata associated with a contract-call type transaction - */ -export interface ContractCallTransactionMetadata { - tx_type: "contract_call"; - contract_call: { - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Name of the Clarity function to be invoked - */ - function_name: string; - /** - * Function definition, including function name and type as well as parameter names and types - */ - function_signature: string; - /** - * List of arguments used to invoke the function - */ - function_args?: { - hex: string; - repr: string; - name: string; - type: string; - }[]; - }; -} -/** - * Metadata associated with a poison-microblock type transaction - */ -export interface PoisonMicroblockTransactionMetadata { - tx_type: "poison_microblock"; - poison_microblock: { - /** - * Hex encoded microblock header - */ - microblock_header_1: string; - /** - * Hex encoded microblock header - */ - microblock_header_2: string; - }; -} -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export interface CoinbaseTransactionMetadata { - tx_type: "coinbase"; - coinbase_payload: { - /** - * Hex encoded 32-byte scratch space for block leader's use - */ - data: string; - /** - * A principal that will receive the miner rewards for this coinbase transaction. Can be either a standard principal or contract principal. Only specified for `coinbase-to-alt-recipient` transaction types, otherwise null. - */ - alt_recipient?: string; - /** - * Hex encoded 80-byte VRF proof - */ - vrf_proof?: string; - }; -} -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export interface TenureChangeTransactionMetadata { - tx_type: "tenure_change"; - tenure_change_payload?: { - /** - * Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. - */ - tenure_consensus_hash: string; - /** - * Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. - */ - prev_tenure_consensus_hash: string; - /** - * Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. - */ - burn_view_consensus_hash: string; - /** - * (Hex string) Stacks Block hash - */ - previous_tenure_end: string; - /** - * The number of blocks produced in the previous tenure. - */ - previous_tenure_blocks: number; - /** - * Cause of change in mining tenure. Depending on cause, tenure can be ended or extended. - */ - cause: "block_found" | "extended"; - /** - * (Hex string) The ECDSA public key hash of the current tenure. - */ - pubkey_hash: string; - }; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/transactions/events-for-an-address-transaction.mdx b/content/docs/stacks/api/transactions/events-for-an-address-transaction.mdx deleted file mode 100644 index 4d575981e..000000000 --- a/content/docs/stacks/api/transactions/events-for-an-address-transaction.mdx +++ /dev/null @@ -1,233 +0,0 @@ ---- -title: Get events for an address transaction -description: Retrieves events for a specific transaction. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get events for an address transaction - -Retrieves a paginated list of all STX, FT and NFT events concerning a STX address or Smart Contract ID within a specific transaction. - -### Path Parameters - - - -STX address or Smart Contract ID - -Example: `"SP31DA6FTSJX2WGTZ69SFY11BH51NZMB0ZW97B5P0"` - - - - - -Transaction ID - -Example: `"0x0a411719e3bfde95f9e227a2d7f8fac3d6c646b1e6cc186db0e2838a2c6cd9c0"` - - -### Query Parameters - - - -Number of events to fetch - -Example: `20` - - - - - -Index of first event to fetch - -Example: `10` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/addresses/SP31DA6FTSJX2WGTZ69SFY11BH51NZMB0ZW97B5P0/transactions/0x0a411719e3bfde95f9e227a2d7f8fac3d6c646b1e6cc186db0e2838a2c6cd9c0/events?limit=20&offset=10" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/addresses/SP31DA6FTSJX2WGTZ69SFY11BH51NZMB0ZW97B5P0/transactions/0x0a411719e3bfde95f9e227a2d7f8fac3d6c646b1e6cc186db0e2838a2c6cd9c0/events?limit=20&offset=10", { - method: "GET" -}); -``` - - - - - - - - - -GET Address Transaction Events - - - - - -```json -{ - "limit": 30, - "offset": 0, - "total": 0, - "results": [ - { - "type": "stx", - "event_index": 0, - "data": { - "type": "transfer", - "amount": "string", - "sender": "string", - "recipient": "string" - } - } - ] -} -``` - - - - - -```ts -/** - * Address Transaction Event - */ -export type AddressTransactionEvent = - | { - type: "stx"; - event_index: number; - data: { - type: "transfer" | "mint" | "burn"; - /** - * Amount transferred in micro-STX as an integer string. - */ - amount: string; - /** - * Principal that sent STX. This is unspecified if the STX were minted. - */ - sender?: string; - /** - * Principal that received STX. This is unspecified if the STX were burned. - */ - recipient?: string; - }; - } - | { - type: "ft"; - event_index: number; - data: { - type: "transfer" | "mint" | "burn"; - /** - * Fungible Token asset identifier. - */ - asset_identifier: string; - /** - * Amount transferred as an integer string. This balance does not factor in possible SIP-010 decimals. - */ - amount: string; - /** - * Principal that sent the asset. - */ - sender?: string; - /** - * Principal that received the asset. - */ - recipient?: string; - }; - } - | { - type: "nft"; - event_index: number; - data: { - type: "transfer" | "mint" | "burn"; - /** - * Non Fungible Token asset identifier. - */ - asset_identifier: string; - /** - * Non Fungible Token asset value. - */ - value: { - hex: string; - repr: string; - }; - /** - * Principal that sent the asset. - */ - sender?: string; - /** - * Principal that received the asset. - */ - recipient?: string; - }; - }; - -/** - * GET Address Transaction Events - */ -export interface AddressTransactionEventListResponse { - limit: number; - offset: number; - total: number; - results: AddressTransactionEvent[]; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/transactions/get-raw-transaction.mdx b/content/docs/stacks/api/transactions/get-raw-transaction.mdx deleted file mode 100644 index b37a25071..000000000 --- a/content/docs/stacks/api/transactions/get-raw-transaction.mdx +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: Get raw transaction -description: Retrieves a hex encoded serialized transaction for a given ID. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get Raw Transaction - -Retrieves a hex encoded serialized transaction for a given ID - - -| Status code | Description | -| :------ | :------ | -| `200` | Hex encoded serialized transaction | -| `404` | Cannot find transaction for given ID | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/tx/%7Btx_id%7D/raw" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/tx/%7Btx_id%7D/raw", { - method: "GET" -}); -``` - - - - - - - - - -GET raw transaction - - - - - -```json -{ - "raw_tx": "string" -} -``` - - - - - -```ts -/** - * GET raw transaction - */ -export interface GetRawTransactionResult { - /** - * A hex encoded serialized transaction - */ - raw_tx: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/transactions/get-transaction.mdx b/content/docs/stacks/api/transactions/get-transaction.mdx deleted file mode 100644 index 8350835b0..000000000 --- a/content/docs/stacks/api/transactions/get-transaction.mdx +++ /dev/null @@ -1,656 +0,0 @@ ---- -title: Get transaction -description: Retrieves details for a specific transaction. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get transaction - -Retrieves transaction details for a given transaction ID - -`import type { Transaction } from '@stacks/stacks-blockchain-api-types';` - -### Path Parameters - - - -Transaction ID - -Example: `"0xe0cc8444f6303fabef13e1fea00fcddb3db6b9519ce808f3f812fafec42fae5b"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Transaction | -| `404` | Cannot find transaction for given ID | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/tx/{tx_id}" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/tx/{tx_id}", { - method: "GET" -}); -``` - - - - - - - - - -Fetches transaction details for a given transaction ID - - - - - -```json -{ - "tx_id": "string", - "nonce": 0, - "fee_rate": "string", - "sender_address": "string", - "sponsor_nonce": 0, - "sponsored": true, - "sponsor_address": "string", - "post_condition_mode": "allow", - "post_conditions": [ - { - "principal": { - "type_id": "principal_origin" - }, - "condition_code": "sent_equal_to", - "amount": "string", - "type": "stx" - } - ], - "anchor_mode": "on_chain_only", - "block_hash": "string", - "block_height": 0, - "block_time": 0, - "block_time_iso": "string", - "burn_block_height": 0, - "burn_block_time": 0, - "burn_block_time_iso": "string", - "parent_burn_block_time": 0, - "parent_burn_block_time_iso": "string", - "canonical": true, - "tx_index": 0, - "tx_status": "success", - "tx_result": { - "hex": "string", - "repr": "string" - }, - "event_count": 0, - "parent_block_hash": "string", - "is_unanchored": true, - "microblock_hash": "string", - "microblock_sequence": 0, - "microblock_canonical": true, - "execution_cost_read_count": 0, - "execution_cost_read_length": 0, - "execution_cost_runtime": 0, - "execution_cost_write_count": 0, - "execution_cost_write_length": 0, - "events": [ - { - "event_index": 0, - "event_type": "smart_contract_log", - "tx_id": "string", - "contract_log": { - "contract_id": "string", - "topic": "string", - "value": { - "hex": "string", - "repr": "string" - } - } - } - ], - "tx_type": "token_transfer", - "token_transfer": { - "recipient_address": "string", - "amount": "string", - "memo": "string" - } -} -``` - - - - - -```ts -/** - * Describes all transaction types on Stacks 2.0 blockchain - */ -export type Transaction = - | TokenTransferTransaction - | SmartContractTransaction - | ContractCallTransaction - | PoisonMicroblockTransaction - | CoinbaseTransaction - | TenureChangeTransaction; -/** - * Describes representation of a Type-0 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-0-transferring-an-asset - */ -export type TokenTransferTransaction = AbstractTransaction & TokenTransferTransactionMetadata; -/** - * Anchored transaction metadata. All mined/anchored Stacks transactions have these properties. - */ -export type AbstractTransaction = BaseTransaction & { - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - tx_status: TransactionStatus; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - /** - * List of transaction events - */ - events: TransactionEvent[]; -}; -export type PostConditionMode = "allow" | "deny"; -/** - * Post-conditionscan limit the damage done to a user's assets - */ -export type PostCondition = PostConditionStx | PostConditionFungible | PostConditionNonFungible; -export type PostConditionStx = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - amount: string; - type: "stx"; -}; -export type PostConditionPrincipal = - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_origin"; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_standard"; - address: string; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_contract"; - address: string; - contract_name: string; - }; -/** - * A fungible condition code encodes a statement being made for either STX or a fungible token, with respect to the originating account. - */ -export type PostConditionFungibleConditionCode = - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; -export type PostConditionFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - type: "fungible"; - amount: string; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -export type PostConditionNonFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionNonFungibleConditionCode; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -/** - * A non-fungible condition code encodes a statement being made about a non-fungible token, with respect to whether or not the particular non-fungible token is owned by the account. - */ -export type PostConditionNonFungibleConditionCode = "sent" | "not_sent"; -/** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ -export type TransactionAnchorModeType = "on_chain_only" | "off_chain_only" | "any"; -/** - * Status of the transaction - */ -export type TransactionStatus = "success" | "abort_by_response" | "abort_by_post_condition"; -export type TransactionEvent = - | TransactionEventSmartContractLog - | TransactionEventStxLock - | TransactionEventStxAsset - | TransactionEventFungibleAsset - | TransactionEventNonFungibleAsset; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventSmartContractLog = AbstractTransactionEvent & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxLock = AbstractTransactionEvent & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxAsset = AbstractTransactionEvent & { - event_type: "stx_asset"; - tx_id: string; - asset: TransactionEventAsset; -}; -export type TransactionEventAssetType = "transfer" | "mint" | "burn"; -export type TransactionEventFungibleAsset = AbstractTransactionEvent & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type TransactionEventNonFungibleAsset = AbstractTransactionEvent & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Describes representation of a Type-1 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export type SmartContractTransaction = AbstractTransaction & SmartContractTransactionMetadata; -/** - * Describes representation of a Type 2 Stacks 2.0 transaction: Contract Call - */ -export type ContractCallTransaction = AbstractTransaction & ContractCallTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type PoisonMicroblockTransaction = AbstractTransaction & PoisonMicroblockTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type CoinbaseTransaction = AbstractTransaction & CoinbaseTransactionMetadata; -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export type TenureChangeTransaction = AbstractTransaction & TenureChangeTransactionMetadata; - -/** - * Transaction properties that are available from a raw serialized transactions. These are available for transactions in the mempool as well as mined transactions. - */ -export interface BaseTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: PostConditionMode; - post_conditions: PostCondition[]; - anchor_mode: TransactionAnchorModeType; -} -export interface AbstractTransactionEvent { - event_index: number; -} -export interface TransactionEventAsset { - asset_event_type?: TransactionEventAssetType; - asset_id?: string; - sender?: string; - recipient?: string; - amount?: string; - value?: string; - memo?: string; -} -/** - * Metadata associated with token-transfer type transactions - */ -export interface TokenTransferTransactionMetadata { - tx_type: "token_transfer"; - token_transfer: { - recipient_address: string; - /** - * Transfer amount as Integer string (64-bit unsigned integer) - */ - amount: string; - /** - * Hex encoded arbitrary message, up to 34 bytes length (should try decoding to an ASCII string) - */ - memo: string; - }; -} -/** - * Metadata associated with a contract-deploy type transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export interface SmartContractTransactionMetadata { - tx_type: "smart_contract"; - smart_contract: { - /** - * The Clarity version of the contract, only specified for versioned contract transactions, otherwise null - */ - clarity_version?: number; - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Clarity code of the smart contract being deployed - */ - source_code: string; - }; -} -/** - * Metadata associated with a contract-call type transaction - */ -export interface ContractCallTransactionMetadata { - tx_type: "contract_call"; - contract_call: { - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Name of the Clarity function to be invoked - */ - function_name: string; - /** - * Function definition, including function name and type as well as parameter names and types - */ - function_signature: string; - /** - * List of arguments used to invoke the function - */ - function_args?: { - hex: string; - repr: string; - name: string; - type: string; - }[]; - }; -} -/** - * Metadata associated with a poison-microblock type transaction - */ -export interface PoisonMicroblockTransactionMetadata { - tx_type: "poison_microblock"; - poison_microblock: { - /** - * Hex encoded microblock header - */ - microblock_header_1: string; - /** - * Hex encoded microblock header - */ - microblock_header_2: string; - }; -} -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export interface CoinbaseTransactionMetadata { - tx_type: "coinbase"; - coinbase_payload: { - /** - * Hex encoded 32-byte scratch space for block leader's use - */ - data: string; - /** - * A principal that will receive the miner rewards for this coinbase transaction. Can be either a standard principal or contract principal. Only specified for `coinbase-to-alt-recipient` transaction types, otherwise null. - */ - alt_recipient?: string; - /** - * Hex encoded 80-byte VRF proof - */ - vrf_proof?: string; - }; -} -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export interface TenureChangeTransactionMetadata { - tx_type: "tenure_change"; - tenure_change_payload?: { - /** - * Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. - */ - tenure_consensus_hash: string; - /** - * Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. - */ - prev_tenure_consensus_hash: string; - /** - * Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. - */ - burn_view_consensus_hash: string; - /** - * (Hex string) Stacks Block hash - */ - previous_tenure_end: string; - /** - * The number of blocks produced in the previous tenure. - */ - previous_tenure_blocks: number; - /** - * Cause of change in mining tenure. Depending on cause, tenure can be ended or extended. - */ - cause: "block_found" | "extended"; - /** - * (Hex string) The ECDSA public key hash of the current tenure. - */ - pubkey_hash: string; - }; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/transactions/mempool-transactions.mdx b/content/docs/stacks/api/transactions/mempool-transactions.mdx deleted file mode 100644 index 197cc61cd..000000000 --- a/content/docs/stacks/api/transactions/mempool-transactions.mdx +++ /dev/null @@ -1,524 +0,0 @@ ---- -title: Get mempool transactions -description: Retrieves all transactions that have been recently broadcast to the mempool. These are pending transactions awaiting confirmation. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get mempool transactions - -Retrieves all transactions that have been recently broadcast to the mempool. These are pending transactions awaiting confirmation. - -If you need to monitor new transactions, we highly recommend subscribing to [WebSockets or Socket.io](https://github.com/hirosystems/stacks-blockchain-api/tree/master/client) for real-time updates. - -### Query Parameters - - - -Filter to only return transactions with this sender address. - -Example: `"SP1GPBP8NBRXDRJBFQBV7KMAZX1Z7W2RFWJEH0V10"` - - - - - -Filter to only return transactions with this recipient address (only applicable for STX transfer tx types). - - - - - -Filter to only return transactions with this address as the sender or recipient (recipient only applicable for STX transfer tx types). - - - - - -Option to sort results by transaction age, size, or fee rate. - -Example: `"fee"` - -Value in: `"age" | "size" | "fee"` - - - - - -Option to sort results in ascending or descending order. - -Example: `"asc"` - -Value in: `"asc" | "desc"` - - - - - -max number of mempool transactions to fetch - -Example: `20` - -Default: `20` - -Maximum: `50` - - - - - -index of first mempool transaction to fetch - -Example: `42000` - - - - - -Include transaction data from unanchored (i.e. unconfirmed) microblocks - -Example: `true` - -Default: `false` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of mempool transactions | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/tx/mempool?sender_address=SP1GPBP8NBRXDRJBFQBV7KMAZX1Z7W2RFWJEH0V10&recipient_address=string&address=string&order_by=fee&order=asc&limit=20&offset=42000&unanchored=true" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/tx/mempool?sender_address=SP1GPBP8NBRXDRJBFQBV7KMAZX1Z7W2RFWJEH0V10&recipient_address=string&address=string&order_by=fee&order=asc&limit=20&offset=42000&unanchored=true", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns transactions - - - - - -```json -{ - "limit": 0, - "offset": 0, - "total": 0, - "results": [ - { - "tx_id": "string", - "nonce": 0, - "fee_rate": "string", - "sender_address": "string", - "sponsor_nonce": 0, - "sponsored": true, - "sponsor_address": "string", - "post_condition_mode": "allow", - "post_conditions": [ - { - "principal": { - "type_id": "principal_origin" - }, - "condition_code": "sent_equal_to", - "amount": "string", - "type": "stx" - } - ], - "anchor_mode": "on_chain_only", - "tx_status": "pending", - "receipt_time": 0, - "receipt_time_iso": "string", - "tx_type": "token_transfer", - "token_transfer": { - "recipient_address": "string", - "amount": "string", - "memo": "string" - } - } - ] -} -``` - - - - - -```ts -/** - * Describes all transaction types on Stacks 2.0 blockchain - */ -export type MempoolTransaction = - | MempoolTokenTransferTransaction - | MempoolSmartContractTransaction - | MempoolContractCallTransaction - | MempoolPoisonMicroblockTransaction - | MempoolCoinbaseTransaction - | MempoolTenureChangeTransaction; -/** - * Describes representation of a Type-0 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-0-transferring-an-asset - */ -export type MempoolTokenTransferTransaction = AbstractMempoolTransaction & TokenTransferTransactionMetadata; -/** - * Abstract transaction. This schema makes up all properties common between all Stacks 2.0 transaction types - */ -export type AbstractMempoolTransaction = BaseTransaction & { - tx_status: MempoolTransactionStatus; - /** - * A unix timestamp (in seconds) indicating when the transaction broadcast was received by the node. - */ - receipt_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when the transaction broadcast was received by the node. - */ - receipt_time_iso: string; -}; -export type PostConditionMode = "allow" | "deny"; -/** - * Post-conditionscan limit the damage done to a user's assets - */ -export type PostCondition = PostConditionStx | PostConditionFungible | PostConditionNonFungible; -export type PostConditionStx = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - amount: string; - type: "stx"; -}; -export type PostConditionPrincipal = - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_origin"; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_standard"; - address: string; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_contract"; - address: string; - contract_name: string; - }; -/** - * A fungible condition code encodes a statement being made for either STX or a fungible token, with respect to the originating account. - */ -export type PostConditionFungibleConditionCode = - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; -export type PostConditionFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - type: "fungible"; - amount: string; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -export type PostConditionNonFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionNonFungibleConditionCode; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -/** - * A non-fungible condition code encodes a statement being made about a non-fungible token, with respect to whether or not the particular non-fungible token is owned by the account. - */ -export type PostConditionNonFungibleConditionCode = "sent" | "not_sent"; -/** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ -export type TransactionAnchorModeType = "on_chain_only" | "off_chain_only" | "any"; -/** - * Status of the transaction - */ -export type MempoolTransactionStatus = - | "pending" - | "dropped_replace_by_fee" - | "dropped_replace_across_fork" - | "dropped_too_expensive" - | "dropped_stale_garbage_collect" - | "dropped_problematic"; -/** - * Describes representation of a Type-1 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export type MempoolSmartContractTransaction = AbstractMempoolTransaction & SmartContractTransactionMetadata; -/** - * Describes representation of a Type 2 Stacks 2.0 transaction: Contract Call - */ -export type MempoolContractCallTransaction = AbstractMempoolTransaction & ContractCallTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type MempoolPoisonMicroblockTransaction = AbstractMempoolTransaction & PoisonMicroblockTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type MempoolCoinbaseTransaction = AbstractMempoolTransaction & CoinbaseTransactionMetadata; -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export type MempoolTenureChangeTransaction = AbstractMempoolTransaction & TenureChangeTransactionMetadata; - -/** - * GET request that returns transactions - */ -export interface MempoolTransactionListResponse { - limit: number; - offset: number; - total: number; - results: MempoolTransaction[]; -} -/** - * Transaction properties that are available from a raw serialized transactions. These are available for transactions in the mempool as well as mined transactions. - */ -export interface BaseTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: PostConditionMode; - post_conditions: PostCondition[]; - anchor_mode: TransactionAnchorModeType; -} -/** - * Metadata associated with token-transfer type transactions - */ -export interface TokenTransferTransactionMetadata { - tx_type: "token_transfer"; - token_transfer: { - recipient_address: string; - /** - * Transfer amount as Integer string (64-bit unsigned integer) - */ - amount: string; - /** - * Hex encoded arbitrary message, up to 34 bytes length (should try decoding to an ASCII string) - */ - memo: string; - }; -} -/** - * Metadata associated with a contract-deploy type transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export interface SmartContractTransactionMetadata { - tx_type: "smart_contract"; - smart_contract: { - /** - * The Clarity version of the contract, only specified for versioned contract transactions, otherwise null - */ - clarity_version?: number; - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Clarity code of the smart contract being deployed - */ - source_code: string; - }; -} -/** - * Metadata associated with a contract-call type transaction - */ -export interface ContractCallTransactionMetadata { - tx_type: "contract_call"; - contract_call: { - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Name of the Clarity function to be invoked - */ - function_name: string; - /** - * Function definition, including function name and type as well as parameter names and types - */ - function_signature: string; - /** - * List of arguments used to invoke the function - */ - function_args?: { - hex: string; - repr: string; - name: string; - type: string; - }[]; - }; -} -/** - * Metadata associated with a poison-microblock type transaction - */ -export interface PoisonMicroblockTransactionMetadata { - tx_type: "poison_microblock"; - poison_microblock: { - /** - * Hex encoded microblock header - */ - microblock_header_1: string; - /** - * Hex encoded microblock header - */ - microblock_header_2: string; - }; -} -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export interface CoinbaseTransactionMetadata { - tx_type: "coinbase"; - coinbase_payload: { - /** - * Hex encoded 32-byte scratch space for block leader's use - */ - data: string; - /** - * A principal that will receive the miner rewards for this coinbase transaction. Can be either a standard principal or contract principal. Only specified for `coinbase-to-alt-recipient` transaction types, otherwise null. - */ - alt_recipient?: string; - /** - * Hex encoded 80-byte VRF proof - */ - vrf_proof?: string; - }; -} -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export interface TenureChangeTransactionMetadata { - tx_type: "tenure_change"; - tenure_change_payload?: { - /** - * Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. - */ - tenure_consensus_hash: string; - /** - * Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. - */ - prev_tenure_consensus_hash: string; - /** - * Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. - */ - burn_view_consensus_hash: string; - /** - * (Hex string) Stacks Block hash - */ - previous_tenure_end: string; - /** - * The number of blocks produced in the previous tenure. - */ - previous_tenure_blocks: number; - /** - * Cause of change in mining tenure. Depending on cause, tenure can be ended or extended. - */ - cause: "block_found" | "extended"; - /** - * (Hex string) The ECDSA public key hash of the current tenure. - */ - pubkey_hash: string; - }; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/transactions/recent-transactions.mdx b/content/docs/stacks/api/transactions/recent-transactions.mdx deleted file mode 100644 index 5a1e71223..000000000 --- a/content/docs/stacks/api/transactions/recent-transactions.mdx +++ /dev/null @@ -1,788 +0,0 @@ ---- -title: Get recent transactions -description: Retrieves all recently mined transactions. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get recent transactions - -Retrieves all recently mined transactions - -If using TypeScript, import typings for this response from our types package: - -`import type { TransactionResults } from '@stacks/stacks-blockchain-api-types';` - -### Query Parameters - - - -max number of transactions to fetch - -Example: `100` - -Default: `96` - -Maximum: `200` - - - - - -index of first transaction to fetch - -Example: `42000` - - - -"} required={false} deprecated={false}> - -Filter by transaction type - -Example: `"coinbase"` - - - - - -Option to filter results by sender address - - - - - -Option to filter results by recipient address - - - - - -Option to sort results by block height, timestamp, or fee - -Example: `"burn_block_time"` - -Default: `"block_height"` - -Value in: `"block_height" | "burn_block_time" | "fee"` - - - - - -Filter by transactions after this timestamp (unix timestamp in seconds) - -Example: `1704067200` - - - - - -Filter by transactions before this timestamp (unix timestamp in seconds) - -Example: `1706745599` - - - - - -Filter by contract call transactions involving this contract ID - -Example: `"SP000000000000000000002Q6VF78.pox-4"` - - - - - -Filter by contract call transactions involving this function name - -Example: `"delegate-stx"` - - - - - -Filter by transactions with this nonce - -Example: `123` - - - - - -Option to sort results in ascending or descending order - -Example: `"desc"` - -Default: `"desc"` - -Value in: `"asc" | "desc"` - - - - - -Include transaction data from unanchored (i.e. unconfirmed) microblocks - -Example: `true` - -Default: `false` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of transactions | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/tx?limit=100&offset=42000&type=coinbase&from_address=string&to_address=string&sort_by=burn_block_time&start_time=1704067200&end_time=1706745599&contract_id=SP000000000000000000002Q6VF78.pox-4&function_name=delegate-stx&nonce=123&order=desc&unanchored=true" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/tx?limit=100&offset=42000&type=coinbase&from_address=string&to_address=string&sort_by=burn_block_time&start_time=1704067200&end_time=1706745599&contract_id=SP000000000000000000002Q6VF78.pox-4&function_name=delegate-stx&nonce=123&order=desc&unanchored=true", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns transactions - - - - - -```json -{ - "limit": 200, - "offset": 0, - "total": 0, - "results": [ - { - "tx_id": "string", - "nonce": 0, - "fee_rate": "string", - "sender_address": "string", - "sponsor_nonce": 0, - "sponsored": true, - "sponsor_address": "string", - "post_condition_mode": "allow", - "post_conditions": [ - { - "principal": { - "type_id": "principal_origin" - }, - "condition_code": "sent_equal_to", - "amount": "string", - "type": "stx" - } - ], - "anchor_mode": "on_chain_only", - "block_hash": "string", - "block_height": 0, - "block_time": 0, - "block_time_iso": "string", - "burn_block_height": 0, - "burn_block_time": 0, - "burn_block_time_iso": "string", - "parent_burn_block_time": 0, - "parent_burn_block_time_iso": "string", - "canonical": true, - "tx_index": 0, - "tx_status": "success", - "tx_result": { - "hex": "string", - "repr": "string" - }, - "event_count": 0, - "parent_block_hash": "string", - "is_unanchored": true, - "microblock_hash": "string", - "microblock_sequence": 0, - "microblock_canonical": true, - "execution_cost_read_count": 0, - "execution_cost_read_length": 0, - "execution_cost_runtime": 0, - "execution_cost_write_count": 0, - "execution_cost_write_length": 0, - "events": [ - { - "event_index": 0, - "event_type": "smart_contract_log", - "tx_id": "string", - "contract_log": { - "contract_id": "string", - "topic": "string", - "value": { - "hex": "string", - "repr": "string" - } - } - } - ], - "tx_type": "token_transfer", - "token_transfer": { - "recipient_address": "string", - "amount": "string", - "memo": "string" - } - } - ] -} -``` - - - - - -```ts -/** - * Describes all transaction types on Stacks 2.0 blockchain - */ -export type Transaction = - | TokenTransferTransaction - | SmartContractTransaction - | ContractCallTransaction - | PoisonMicroblockTransaction - | CoinbaseTransaction - | TenureChangeTransaction; -/** - * Describes representation of a Type-0 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-0-transferring-an-asset - */ -export type TokenTransferTransaction = AbstractTransaction & TokenTransferTransactionMetadata; -/** - * Anchored transaction metadata. All mined/anchored Stacks transactions have these properties. - */ -export type AbstractTransaction = BaseTransaction & { - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - tx_status: TransactionStatus; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - /** - * List of transaction events - */ - events: TransactionEvent[]; -}; -export type PostConditionMode = "allow" | "deny"; -/** - * Post-conditionscan limit the damage done to a user's assets - */ -export type PostCondition = PostConditionStx | PostConditionFungible | PostConditionNonFungible; -export type PostConditionStx = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - amount: string; - type: "stx"; -}; -export type PostConditionPrincipal = - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_origin"; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_standard"; - address: string; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_contract"; - address: string; - contract_name: string; - }; -/** - * A fungible condition code encodes a statement being made for either STX or a fungible token, with respect to the originating account. - */ -export type PostConditionFungibleConditionCode = - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; -export type PostConditionFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - type: "fungible"; - amount: string; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -export type PostConditionNonFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionNonFungibleConditionCode; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -/** - * A non-fungible condition code encodes a statement being made about a non-fungible token, with respect to whether or not the particular non-fungible token is owned by the account. - */ -export type PostConditionNonFungibleConditionCode = "sent" | "not_sent"; -/** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ -export type TransactionAnchorModeType = "on_chain_only" | "off_chain_only" | "any"; -/** - * Status of the transaction - */ -export type TransactionStatus = "success" | "abort_by_response" | "abort_by_post_condition"; -export type TransactionEvent = - | TransactionEventSmartContractLog - | TransactionEventStxLock - | TransactionEventStxAsset - | TransactionEventFungibleAsset - | TransactionEventNonFungibleAsset; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventSmartContractLog = AbstractTransactionEvent & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxLock = AbstractTransactionEvent & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxAsset = AbstractTransactionEvent & { - event_type: "stx_asset"; - tx_id: string; - asset: TransactionEventAsset; -}; -export type TransactionEventAssetType = "transfer" | "mint" | "burn"; -export type TransactionEventFungibleAsset = AbstractTransactionEvent & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type TransactionEventNonFungibleAsset = AbstractTransactionEvent & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Describes representation of a Type-1 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export type SmartContractTransaction = AbstractTransaction & SmartContractTransactionMetadata; -/** - * Describes representation of a Type 2 Stacks 2.0 transaction: Contract Call - */ -export type ContractCallTransaction = AbstractTransaction & ContractCallTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type PoisonMicroblockTransaction = AbstractTransaction & PoisonMicroblockTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type CoinbaseTransaction = AbstractTransaction & CoinbaseTransactionMetadata; -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export type TenureChangeTransaction = AbstractTransaction & TenureChangeTransactionMetadata; - -/** - * GET request that returns transactions - */ -export interface TransactionResults { - /** - * The number of transactions to return - */ - limit: number; - /** - * The number to transactions to skip (starting at `0`) - */ - offset: number; - /** - * The number of transactions available - */ - total: number; - results: Transaction[]; -} -/** - * Transaction properties that are available from a raw serialized transactions. These are available for transactions in the mempool as well as mined transactions. - */ -export interface BaseTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: PostConditionMode; - post_conditions: PostCondition[]; - anchor_mode: TransactionAnchorModeType; -} -export interface AbstractTransactionEvent { - event_index: number; -} -export interface TransactionEventAsset { - asset_event_type?: TransactionEventAssetType; - asset_id?: string; - sender?: string; - recipient?: string; - amount?: string; - value?: string; - memo?: string; -} -/** - * Metadata associated with token-transfer type transactions - */ -export interface TokenTransferTransactionMetadata { - tx_type: "token_transfer"; - token_transfer: { - recipient_address: string; - /** - * Transfer amount as Integer string (64-bit unsigned integer) - */ - amount: string; - /** - * Hex encoded arbitrary message, up to 34 bytes length (should try decoding to an ASCII string) - */ - memo: string; - }; -} -/** - * Metadata associated with a contract-deploy type transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export interface SmartContractTransactionMetadata { - tx_type: "smart_contract"; - smart_contract: { - /** - * The Clarity version of the contract, only specified for versioned contract transactions, otherwise null - */ - clarity_version?: number; - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Clarity code of the smart contract being deployed - */ - source_code: string; - }; -} -/** - * Metadata associated with a contract-call type transaction - */ -export interface ContractCallTransactionMetadata { - tx_type: "contract_call"; - contract_call: { - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Name of the Clarity function to be invoked - */ - function_name: string; - /** - * Function definition, including function name and type as well as parameter names and types - */ - function_signature: string; - /** - * List of arguments used to invoke the function - */ - function_args?: { - hex: string; - repr: string; - name: string; - type: string; - }[]; - }; -} -/** - * Metadata associated with a poison-microblock type transaction - */ -export interface PoisonMicroblockTransactionMetadata { - tx_type: "poison_microblock"; - poison_microblock: { - /** - * Hex encoded microblock header - */ - microblock_header_1: string; - /** - * Hex encoded microblock header - */ - microblock_header_2: string; - }; -} -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export interface CoinbaseTransactionMetadata { - tx_type: "coinbase"; - coinbase_payload: { - /** - * Hex encoded 32-byte scratch space for block leader's use - */ - data: string; - /** - * A principal that will receive the miner rewards for this coinbase transaction. Can be either a standard principal or contract principal. Only specified for `coinbase-to-alt-recipient` transaction types, otherwise null. - */ - alt_recipient?: string; - /** - * Hex encoded 80-byte VRF proof - */ - vrf_proof?: string; - }; -} -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export interface TenureChangeTransactionMetadata { - tx_type: "tenure_change"; - tenure_change_payload?: { - /** - * Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. - */ - tenure_consensus_hash: string; - /** - * Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. - */ - prev_tenure_consensus_hash: string; - /** - * Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. - */ - burn_view_consensus_hash: string; - /** - * (Hex string) Stacks Block hash - */ - previous_tenure_end: string; - /** - * The number of blocks produced in the previous tenure. - */ - previous_tenure_blocks: number; - /** - * Cause of change in mining tenure. Depending on cause, tenure can be ended or extended. - */ - cause: "block_found" | "extended"; - /** - * (Hex string) The ECDSA public key hash of the current tenure. - */ - pubkey_hash: string; - }; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/transactions/statistics-for-mempool-transactions.mdx b/content/docs/stacks/api/transactions/statistics-for-mempool-transactions.mdx deleted file mode 100644 index c22306e75..000000000 --- a/content/docs/stacks/api/transactions/statistics-for-mempool-transactions.mdx +++ /dev/null @@ -1,289 +0,0 @@ ---- -title: Get statistics for mempool transactions -description: Retrieves statistics for transactions in the mempool, such as counts, ages, and fees. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get statistics for mempool transactions - -Queries for transactions counts, age (by block height), fees (simple average), and size. -All results broken down by transaction type and percentiles (p25, p50, p75, p95). - - -| Status code | Description | -| :------ | :------ | -| `200` | Statistics for mempool transactions | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/tx/mempool/stats" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/tx/mempool/stats", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns stats on mempool transactions - - - - - -```json -{ - "tx_type_counts": { - "token_transfer": 0, - "smart_contract": 0, - "contract_call": 0, - "poison_microblock": 0 - }, - "tx_simple_fee_averages": { - "token_transfer": { - "p25": 0, - "p50": 0, - "p75": 0, - "p95": 0 - }, - "smart_contract": { - "p25": 0, - "p50": 0, - "p75": 0, - "p95": 0 - }, - "contract_call": { - "p25": 0, - "p50": 0, - "p75": 0, - "p95": 0 - }, - "poison_microblock": { - "p25": 0, - "p50": 0, - "p75": 0, - "p95": 0 - } - }, - "tx_ages": { - "token_transfer": { - "p25": 0, - "p50": 0, - "p75": 0, - "p95": 0 - }, - "smart_contract": { - "p25": 0, - "p50": 0, - "p75": 0, - "p95": 0 - }, - "contract_call": { - "p25": 0, - "p50": 0, - "p75": 0, - "p95": 0 - }, - "poison_microblock": { - "p25": 0, - "p50": 0, - "p75": 0, - "p95": 0 - } - }, - "tx_byte_sizes": { - "token_transfer": { - "p25": 0, - "p50": 0, - "p75": 0, - "p95": 0 - }, - "smart_contract": { - "p25": 0, - "p50": 0, - "p75": 0, - "p95": 0 - }, - "contract_call": { - "p25": 0, - "p50": 0, - "p75": 0, - "p95": 0 - }, - "poison_microblock": { - "p25": 0, - "p50": 0, - "p75": 0, - "p95": 0 - } - } -} -``` - - - - - -```ts -/** - * GET request that returns stats on mempool transactions - */ -export interface MempoolTransactionStatsResponse { - /** - * Number of tranasction in the mempool, broken down by transaction type. - */ - tx_type_counts: { - token_transfer: number; - smart_contract: number; - contract_call: number; - poison_microblock: number; - }; - /** - * The simple mean (average) transaction fee, broken down by transaction type. Note that this does not factor in actual execution costs. The average fee is not a reliable metric for calculating a fee for a new transaction. - */ - tx_simple_fee_averages: { - token_transfer: { - p25: number; - p50: number; - p75: number; - p95: number; - }; - smart_contract: { - p25: number; - p50: number; - p75: number; - p95: number; - }; - contract_call: { - p25: number; - p50: number; - p75: number; - p95: number; - }; - poison_microblock: { - p25: number; - p50: number; - p75: number; - p95: number; - }; - }; - /** - * The average time (in blocks) that transactions have lived in the mempool. The start block height is simply the current chain-tip of when the attached Stacks node receives the transaction. This timing can be different across Stacks nodes / API instances due to propagation timing differences in the p2p network. - */ - tx_ages: { - token_transfer: { - p25: number; - p50: number; - p75: number; - p95: number; - }; - smart_contract: { - p25: number; - p50: number; - p75: number; - p95: number; - }; - contract_call: { - p25: number; - p50: number; - p75: number; - p95: number; - }; - poison_microblock: { - p25: number; - p50: number; - p75: number; - p95: number; - }; - }; - /** - * The average byte size of transactions in the mempool, broken down by transaction type. - */ - tx_byte_sizes: { - token_transfer: { - p25: number; - p50: number; - p75: number; - p95: number; - }; - smart_contract: { - p25: number; - p50: number; - p75: number; - p95: number; - }; - contract_call: { - p25: number; - p50: number; - p75: number; - p95: number; - }; - poison_microblock: { - p25: number; - p50: number; - p75: number; - p95: number; - }; - }; -} -``` - - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/transactions/transaction-events.mdx b/content/docs/stacks/api/transactions/transaction-events.mdx deleted file mode 100644 index 16c09d990..000000000 --- a/content/docs/stacks/api/transactions/transaction-events.mdx +++ /dev/null @@ -1,245 +0,0 @@ ---- -title: Get transaction events -description: Retrieves events for a specific transaction. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Transaction Events - -Retrieves the list of events filtered by principal (STX address or Smart Contract ID), transaction id or event types. The list of event types is ('smart_contract_log', 'stx_lock', 'stx_asset', 'fungible_token_asset', 'non_fungible_token_asset'). -### Query Parameters - - - -Hash of transaction - - - - - -Stacks address or a Contract identifier - -Example: `"ST1HB64MAJ1MBV4CQ80GF01DZS4T1DSMX20ADCRA4"` - - - - - -number of items to return - -Example: `100` - - - - - -number of items to skip - -Example: `42000` - - - -"} required={false} deprecated={false}> - -Filter the events on event type - -Example: `"stx_lock"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/tx/events?tx_id=string&address=ST1HB64MAJ1MBV4CQ80GF01DZS4T1DSMX20ADCRA4&limit=100&offset=42000&type=stx_lock" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/tx/events?tx_id=string&address=ST1HB64MAJ1MBV4CQ80GF01DZS4T1DSMX20ADCRA4&limit=100&offset=42000&type=stx_lock", { - method: "GET" -}); -``` - - - - - - - - - -GET event for the given transaction - - - - - -```json -{ - "limit": 0, - "offset": 0, - "results": [ - { - "event_index": 0, - "event_type": "smart_contract_log", - "tx_id": "string", - "contract_log": { - "contract_id": "string", - "topic": "string", - "value": { - "hex": "string", - "repr": "string" - } - } - } - ] -} -``` - - - - - -```ts -export type TransactionEvent = - | TransactionEventSmartContractLog - | TransactionEventStxLock - | TransactionEventStxAsset - | TransactionEventFungibleAsset - | TransactionEventNonFungibleAsset; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventSmartContractLog = AbstractTransactionEvent & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxLock = AbstractTransactionEvent & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxAsset = AbstractTransactionEvent & { - event_type: "stx_asset"; - tx_id: string; - asset: TransactionEventAsset; -}; -export type TransactionEventAssetType = "transfer" | "mint" | "burn"; -export type TransactionEventFungibleAsset = AbstractTransactionEvent & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type TransactionEventNonFungibleAsset = AbstractTransactionEvent & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; - -/** - * GET event for the given transaction - */ -export interface TransactionEventsResponse { - limit: number; - offset: number; - results: TransactionEvent[]; -} -export interface AbstractTransactionEvent { - event_index: number; -} -export interface TransactionEventAsset { - asset_event_type?: TransactionEventAssetType; - asset_id?: string; - sender?: string; - recipient?: string; - amount?: string; - value?: string; - memo?: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/transactions/transactions-by-block.mdx b/content/docs/stacks/api/transactions/transactions-by-block.mdx deleted file mode 100644 index a97518193..000000000 --- a/content/docs/stacks/api/transactions/transactions-by-block.mdx +++ /dev/null @@ -1,676 +0,0 @@ ---- -title: Get transactions by block -description: Retrieves transactions confirmed in a single block. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get transactions by block - -Retrieves transactions confirmed in a single block - -### Path Parameters - - - -filter by block height, hash, index block hash or the constant `latest` to filter for the most recent block - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of transactions | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v2/blocks/42000/transactions" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v2/blocks/42000/transactions", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns transactions - - - - - -```json -{ - "limit": 200, - "offset": 0, - "total": 0, - "results": [ - { - "tx_id": "string", - "nonce": 0, - "fee_rate": "string", - "sender_address": "string", - "sponsor_nonce": 0, - "sponsored": true, - "sponsor_address": "string", - "post_condition_mode": "allow", - "post_conditions": [ - { - "principal": { - "type_id": "principal_origin" - }, - "condition_code": "sent_equal_to", - "amount": "string", - "type": "stx" - } - ], - "anchor_mode": "on_chain_only", - "block_hash": "string", - "block_height": 0, - "block_time": 0, - "block_time_iso": "string", - "burn_block_height": 0, - "burn_block_time": 0, - "burn_block_time_iso": "string", - "parent_burn_block_time": 0, - "parent_burn_block_time_iso": "string", - "canonical": true, - "tx_index": 0, - "tx_status": "success", - "tx_result": { - "hex": "string", - "repr": "string" - }, - "event_count": 0, - "parent_block_hash": "string", - "is_unanchored": true, - "microblock_hash": "string", - "microblock_sequence": 0, - "microblock_canonical": true, - "execution_cost_read_count": 0, - "execution_cost_read_length": 0, - "execution_cost_runtime": 0, - "execution_cost_write_count": 0, - "execution_cost_write_length": 0, - "events": [ - { - "event_index": 0, - "event_type": "smart_contract_log", - "tx_id": "string", - "contract_log": { - "contract_id": "string", - "topic": "string", - "value": { - "hex": "string", - "repr": "string" - } - } - } - ], - "tx_type": "token_transfer", - "token_transfer": { - "recipient_address": "string", - "amount": "string", - "memo": "string" - } - } - ] -} -``` - - - - - -```ts -/** - * Describes all transaction types on Stacks 2.0 blockchain - */ -export type Transaction = - | TokenTransferTransaction - | SmartContractTransaction - | ContractCallTransaction - | PoisonMicroblockTransaction - | CoinbaseTransaction - | TenureChangeTransaction; -/** - * Describes representation of a Type-0 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-0-transferring-an-asset - */ -export type TokenTransferTransaction = AbstractTransaction & TokenTransferTransactionMetadata; -/** - * Anchored transaction metadata. All mined/anchored Stacks transactions have these properties. - */ -export type AbstractTransaction = BaseTransaction & { - /** - * Hash of the blocked this transactions was associated with - */ - block_hash: string; - /** - * Height of the block this transactions was associated with - */ - block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined. - */ - block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) indicating when this block was mined. - */ - block_time_iso: string; - /** - * Height of the anchor burn block. - */ - burn_block_height: number; - /** - * Unix timestamp (in seconds) indicating when this block was mined - */ - burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this block was mined. - */ - burn_block_time_iso: string; - /** - * Unix timestamp (in seconds) indicating when this parent block was mined - */ - parent_burn_block_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when this parent block was mined. - */ - parent_burn_block_time_iso: string; - /** - * Set to `true` if block corresponds to the canonical chain tip - */ - canonical: boolean; - /** - * Index of the transaction, indicating the order. Starts at `0` and increases with each transaction - */ - tx_index: number; - tx_status: TransactionStatus; - /** - * Result of the transaction. For contract calls, this will show the value returned by the call. For other transaction types, this will return a boolean indicating the success of the transaction. - */ - tx_result: { - /** - * Hex string representing the value fo the transaction result - */ - hex: string; - /** - * Readable string of the transaction result - */ - repr: string; - }; - /** - * Number of transaction events - */ - event_count: number; - /** - * Hash of the previous block. - */ - parent_block_hash: string; - /** - * True if the transaction is included in a microblock that has not been confirmed by an anchor block. - */ - is_unanchored: boolean; - /** - * The microblock hash that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be an empty string. - */ - microblock_hash: string; - /** - * The microblock sequence number that this transaction was streamed in. If the transaction was batched in an anchor block (not included within a microblock) then this value will be 2147483647 (0x7fffffff, the max int32 value), this value preserves logical transaction ordering on (block_height, microblock_sequence, tx_index). - */ - microblock_sequence: number; - /** - * Set to `true` if microblock is anchored in the canonical chain tip, `false` if the transaction was orphaned in a micro-fork. - */ - microblock_canonical: boolean; - /** - * Execution cost read count. - */ - execution_cost_read_count: number; - /** - * Execution cost read length. - */ - execution_cost_read_length: number; - /** - * Execution cost runtime. - */ - execution_cost_runtime: number; - /** - * Execution cost write count. - */ - execution_cost_write_count: number; - /** - * Execution cost write length. - */ - execution_cost_write_length: number; - /** - * List of transaction events - */ - events: TransactionEvent[]; -}; -export type PostConditionMode = "allow" | "deny"; -/** - * Post-conditionscan limit the damage done to a user's assets - */ -export type PostCondition = PostConditionStx | PostConditionFungible | PostConditionNonFungible; -export type PostConditionStx = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - amount: string; - type: "stx"; -}; -export type PostConditionPrincipal = - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_origin"; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_standard"; - address: string; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_contract"; - address: string; - contract_name: string; - }; -/** - * A fungible condition code encodes a statement being made for either STX or a fungible token, with respect to the originating account. - */ -export type PostConditionFungibleConditionCode = - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; -export type PostConditionFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - type: "fungible"; - amount: string; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -export type PostConditionNonFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionNonFungibleConditionCode; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -/** - * A non-fungible condition code encodes a statement being made about a non-fungible token, with respect to whether or not the particular non-fungible token is owned by the account. - */ -export type PostConditionNonFungibleConditionCode = "sent" | "not_sent"; -/** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ -export type TransactionAnchorModeType = "on_chain_only" | "off_chain_only" | "any"; -/** - * Status of the transaction - */ -export type TransactionStatus = "success" | "abort_by_response" | "abort_by_post_condition"; -export type TransactionEvent = - | TransactionEventSmartContractLog - | TransactionEventStxLock - | TransactionEventStxAsset - | TransactionEventFungibleAsset - | TransactionEventNonFungibleAsset; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventSmartContractLog = AbstractTransactionEvent & { - event_type: "smart_contract_log"; - tx_id: string; - contract_log: { - contract_id: string; - topic: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxLock = AbstractTransactionEvent & { - event_type: "stx_lock"; - tx_id: string; - stx_lock_event: { - locked_amount: string; - unlock_height: number; - locked_address: string; - }; -}; -/** - * Only present in `smart_contract` and `contract_call` tx types. - */ -export type TransactionEventStxAsset = AbstractTransactionEvent & { - event_type: "stx_asset"; - tx_id: string; - asset: TransactionEventAsset; -}; -export type TransactionEventAssetType = "transfer" | "mint" | "burn"; -export type TransactionEventFungibleAsset = AbstractTransactionEvent & { - event_type: "fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - amount: string; - }; -}; -export type TransactionEventNonFungibleAsset = AbstractTransactionEvent & { - event_type: "non_fungible_token_asset"; - tx_id: string; - asset: { - asset_event_type: string; - asset_id: string; - sender: string; - recipient: string; - value: { - hex: string; - repr: string; - }; - }; -}; -/** - * Describes representation of a Type-1 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export type SmartContractTransaction = AbstractTransaction & SmartContractTransactionMetadata; -/** - * Describes representation of a Type 2 Stacks 2.0 transaction: Contract Call - */ -export type ContractCallTransaction = AbstractTransaction & ContractCallTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type PoisonMicroblockTransaction = AbstractTransaction & PoisonMicroblockTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type CoinbaseTransaction = AbstractTransaction & CoinbaseTransactionMetadata; -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export type TenureChangeTransaction = AbstractTransaction & TenureChangeTransactionMetadata; - -/** - * GET request that returns transactions - */ -export interface TransactionResults { - /** - * The number of transactions to return - */ - limit: number; - /** - * The number to transactions to skip (starting at `0`) - */ - offset: number; - /** - * The number of transactions available - */ - total: number; - results: Transaction[]; -} -/** - * Transaction properties that are available from a raw serialized transactions. These are available for transactions in the mempool as well as mined transactions. - */ -export interface BaseTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: PostConditionMode; - post_conditions: PostCondition[]; - anchor_mode: TransactionAnchorModeType; -} -export interface AbstractTransactionEvent { - event_index: number; -} -export interface TransactionEventAsset { - asset_event_type?: TransactionEventAssetType; - asset_id?: string; - sender?: string; - recipient?: string; - amount?: string; - value?: string; - memo?: string; -} -/** - * Metadata associated with token-transfer type transactions - */ -export interface TokenTransferTransactionMetadata { - tx_type: "token_transfer"; - token_transfer: { - recipient_address: string; - /** - * Transfer amount as Integer string (64-bit unsigned integer) - */ - amount: string; - /** - * Hex encoded arbitrary message, up to 34 bytes length (should try decoding to an ASCII string) - */ - memo: string; - }; -} -/** - * Metadata associated with a contract-deploy type transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export interface SmartContractTransactionMetadata { - tx_type: "smart_contract"; - smart_contract: { - /** - * The Clarity version of the contract, only specified for versioned contract transactions, otherwise null - */ - clarity_version?: number; - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Clarity code of the smart contract being deployed - */ - source_code: string; - }; -} -/** - * Metadata associated with a contract-call type transaction - */ -export interface ContractCallTransactionMetadata { - tx_type: "contract_call"; - contract_call: { - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Name of the Clarity function to be invoked - */ - function_name: string; - /** - * Function definition, including function name and type as well as parameter names and types - */ - function_signature: string; - /** - * List of arguments used to invoke the function - */ - function_args?: { - hex: string; - repr: string; - name: string; - type: string; - }[]; - }; -} -/** - * Metadata associated with a poison-microblock type transaction - */ -export interface PoisonMicroblockTransactionMetadata { - tx_type: "poison_microblock"; - poison_microblock: { - /** - * Hex encoded microblock header - */ - microblock_header_1: string; - /** - * Hex encoded microblock header - */ - microblock_header_2: string; - }; -} -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export interface CoinbaseTransactionMetadata { - tx_type: "coinbase"; - coinbase_payload: { - /** - * Hex encoded 32-byte scratch space for block leader's use - */ - data: string; - /** - * A principal that will receive the miner rewards for this coinbase transaction. Can be either a standard principal or contract principal. Only specified for `coinbase-to-alt-recipient` transaction types, otherwise null. - */ - alt_recipient?: string; - /** - * Hex encoded 80-byte VRF proof - */ - vrf_proof?: string; - }; -} -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export interface TenureChangeTransactionMetadata { - tx_type: "tenure_change"; - tenure_change_payload?: { - /** - * Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. - */ - tenure_consensus_hash: string; - /** - * Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. - */ - prev_tenure_consensus_hash: string; - /** - * Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. - */ - burn_view_consensus_hash: string; - /** - * (Hex string) Stacks Block hash - */ - previous_tenure_end: string; - /** - * The number of blocks produced in the previous tenure. - */ - previous_tenure_blocks: number; - /** - * Cause of change in mining tenure. Depending on cause, tenure can be ended or extended. - */ - cause: "block_found" | "extended"; - /** - * (Hex string) The ECDSA public key hash of the current tenure. - */ - pubkey_hash: string; - }; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/transactions/transactions-for-address.mdx b/content/docs/stacks/api/transactions/transactions-for-address.mdx deleted file mode 100644 index c394b180f..000000000 --- a/content/docs/stacks/api/transactions/transactions-for-address.mdx +++ /dev/null @@ -1,486 +0,0 @@ ---- -title: Get transactions for address -description: Retrieves transactions for a specific address. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Transactions for address - -Retrieves all transactions for a given address that are currently in mempool -### Path Parameters - - - -Transactions for the address - -Example: `"SP197DVH8KTJGX4STM61QN0WJV8Y9QJWXV83ZGNR9"` - - -### Query Parameters - - - -max number of transactions to fetch - -Example: `90` - - - - - -index of first transaction to fetch - -Example: `42000` - - - - - -Include transaction data from unanchored (i.e. unconfirmed) microblocks - -Example: `true` - -Default: `false` - - - -| Status code | Description | -| :------ | :------ | -| `200` | List of Transactions | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/extended/v1/address/SP197DVH8KTJGX4STM61QN0WJV8Y9QJWXV83ZGNR9/mempool?limit=90&offset=42000&unanchored=true" -``` - - - - - -```js -fetch("https://api.hiro.so/extended/v1/address/SP197DVH8KTJGX4STM61QN0WJV8Y9QJWXV83ZGNR9/mempool?limit=90&offset=42000&unanchored=true", { - method: "GET" -}); -``` - - - - - - - - - -GET request that returns transactions - - - - - -```json -{ - "limit": 0, - "offset": 0, - "total": 0, - "results": [ - { - "tx_id": "string", - "nonce": 0, - "fee_rate": "string", - "sender_address": "string", - "sponsor_nonce": 0, - "sponsored": true, - "sponsor_address": "string", - "post_condition_mode": "allow", - "post_conditions": [ - { - "principal": { - "type_id": "principal_origin" - }, - "condition_code": "sent_equal_to", - "amount": "string", - "type": "stx" - } - ], - "anchor_mode": "on_chain_only", - "tx_status": "pending", - "receipt_time": 0, - "receipt_time_iso": "string", - "tx_type": "token_transfer", - "token_transfer": { - "recipient_address": "string", - "amount": "string", - "memo": "string" - } - } - ] -} -``` - - - - - -```ts -/** - * Describes all transaction types on Stacks 2.0 blockchain - */ -export type MempoolTransaction = - | MempoolTokenTransferTransaction - | MempoolSmartContractTransaction - | MempoolContractCallTransaction - | MempoolPoisonMicroblockTransaction - | MempoolCoinbaseTransaction - | MempoolTenureChangeTransaction; -/** - * Describes representation of a Type-0 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-0-transferring-an-asset - */ -export type MempoolTokenTransferTransaction = AbstractMempoolTransaction & TokenTransferTransactionMetadata; -/** - * Abstract transaction. This schema makes up all properties common between all Stacks 2.0 transaction types - */ -export type AbstractMempoolTransaction = BaseTransaction & { - tx_status: MempoolTransactionStatus; - /** - * A unix timestamp (in seconds) indicating when the transaction broadcast was received by the node. - */ - receipt_time: number; - /** - * An ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ) timestamp indicating when the transaction broadcast was received by the node. - */ - receipt_time_iso: string; -}; -export type PostConditionMode = "allow" | "deny"; -/** - * Post-conditionscan limit the damage done to a user's assets - */ -export type PostCondition = PostConditionStx | PostConditionFungible | PostConditionNonFungible; -export type PostConditionStx = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - amount: string; - type: "stx"; -}; -export type PostConditionPrincipal = - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_origin"; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_standard"; - address: string; - } - | { - /** - * String literal of type `PostConditionPrincipalType` - */ - type_id: "principal_contract"; - address: string; - contract_name: string; - }; -/** - * A fungible condition code encodes a statement being made for either STX or a fungible token, with respect to the originating account. - */ -export type PostConditionFungibleConditionCode = - | "sent_equal_to" - | "sent_greater_than" - | "sent_greater_than_or_equal_to" - | "sent_less_than" - | "sent_less_than_or_equal_to"; -export type PostConditionFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionFungibleConditionCode; - type: "fungible"; - amount: string; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -export type PostConditionNonFungible = { - principal: PostConditionPrincipal; -} & { - condition_code: PostConditionNonFungibleConditionCode; - type: "non_fungible"; - asset_value: { - hex: string; - repr: string; - }; - asset: { - asset_name: string; - contract_address: string; - contract_name: string; - }; -}; -/** - * A non-fungible condition code encodes a statement being made about a non-fungible token, with respect to whether or not the particular non-fungible token is owned by the account. - */ -export type PostConditionNonFungibleConditionCode = "sent" | "not_sent"; -/** - * `on_chain_only`: the transaction MUST be included in an anchored block, `off_chain_only`: the transaction MUST be included in a microblock, `any`: the leader can choose where to include the transaction. - */ -export type TransactionAnchorModeType = "on_chain_only" | "off_chain_only" | "any"; -/** - * Status of the transaction - */ -export type MempoolTransactionStatus = - | "pending" - | "dropped_replace_by_fee" - | "dropped_replace_across_fork" - | "dropped_too_expensive" - | "dropped_stale_garbage_collect" - | "dropped_problematic"; -/** - * Describes representation of a Type-1 Stacks 2.0 transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export type MempoolSmartContractTransaction = AbstractMempoolTransaction & SmartContractTransactionMetadata; -/** - * Describes representation of a Type 2 Stacks 2.0 transaction: Contract Call - */ -export type MempoolContractCallTransaction = AbstractMempoolTransaction & ContractCallTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type MempoolPoisonMicroblockTransaction = AbstractMempoolTransaction & PoisonMicroblockTransactionMetadata; -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export type MempoolCoinbaseTransaction = AbstractMempoolTransaction & CoinbaseTransactionMetadata; -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export type MempoolTenureChangeTransaction = AbstractMempoolTransaction & TenureChangeTransactionMetadata; - -/** - * GET request that returns transactions - */ -export interface MempoolTransactionListResponse { - limit: number; - offset: number; - total: number; - results: MempoolTransaction[]; -} -/** - * Transaction properties that are available from a raw serialized transactions. These are available for transactions in the mempool as well as mined transactions. - */ -export interface BaseTransaction { - /** - * Transaction ID - */ - tx_id: string; - /** - * Used for ordering the transactions originating from and paying from an account. The nonce ensures that a transaction is processed at most once. The nonce counts the number of times an account's owner(s) have authorized a transaction. The first transaction from an account will have a nonce value equal to 0, the second will have a nonce value equal to 1, and so on. - */ - nonce: number; - /** - * Transaction fee as Integer string (64-bit unsigned integer). - */ - fee_rate: string; - /** - * Address of the transaction initiator - */ - sender_address: string; - sponsor_nonce?: number; - /** - * Denotes whether the originating account is the same as the paying account - */ - sponsored: boolean; - sponsor_address?: string; - post_condition_mode: PostConditionMode; - post_conditions: PostCondition[]; - anchor_mode: TransactionAnchorModeType; -} -/** - * Metadata associated with token-transfer type transactions - */ -export interface TokenTransferTransactionMetadata { - tx_type: "token_transfer"; - token_transfer: { - recipient_address: string; - /** - * Transfer amount as Integer string (64-bit unsigned integer) - */ - amount: string; - /** - * Hex encoded arbitrary message, up to 34 bytes length (should try decoding to an ASCII string) - */ - memo: string; - }; -} -/** - * Metadata associated with a contract-deploy type transaction. https://github.com/blockstack/stacks-blockchain/blob/master/sip/sip-005-blocks-and-transactions.md#type-1-instantiating-a-smart-contract - */ -export interface SmartContractTransactionMetadata { - tx_type: "smart_contract"; - smart_contract: { - /** - * The Clarity version of the contract, only specified for versioned contract transactions, otherwise null - */ - clarity_version?: number; - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Clarity code of the smart contract being deployed - */ - source_code: string; - }; -} -/** - * Metadata associated with a contract-call type transaction - */ -export interface ContractCallTransactionMetadata { - tx_type: "contract_call"; - contract_call: { - /** - * Contract identifier formatted as `.` - */ - contract_id: string; - /** - * Name of the Clarity function to be invoked - */ - function_name: string; - /** - * Function definition, including function name and type as well as parameter names and types - */ - function_signature: string; - /** - * List of arguments used to invoke the function - */ - function_args?: { - hex: string; - repr: string; - name: string; - type: string; - }[]; - }; -} -/** - * Metadata associated with a poison-microblock type transaction - */ -export interface PoisonMicroblockTransactionMetadata { - tx_type: "poison_microblock"; - poison_microblock: { - /** - * Hex encoded microblock header - */ - microblock_header_1: string; - /** - * Hex encoded microblock header - */ - microblock_header_2: string; - }; -} -/** - * Describes representation of a Type 3 Stacks 2.0 transaction: Poison Microblock - */ -export interface CoinbaseTransactionMetadata { - tx_type: "coinbase"; - coinbase_payload: { - /** - * Hex encoded 32-byte scratch space for block leader's use - */ - data: string; - /** - * A principal that will receive the miner rewards for this coinbase transaction. Can be either a standard principal or contract principal. Only specified for `coinbase-to-alt-recipient` transaction types, otherwise null. - */ - alt_recipient?: string; - /** - * Hex encoded 80-byte VRF proof - */ - vrf_proof?: string; - }; -} -/** - * Describes representation of a Type 7 Stacks transaction: Tenure Change - */ -export interface TenureChangeTransactionMetadata { - tx_type: "tenure_change"; - tenure_change_payload?: { - /** - * Consensus hash of this tenure. Corresponds to the sortition in which the miner of this block was chosen. - */ - tenure_consensus_hash: string; - /** - * Consensus hash of the previous tenure. Corresponds to the sortition of the previous winning block-commit. - */ - prev_tenure_consensus_hash: string; - /** - * Current consensus hash on the underlying burnchain. Corresponds to the last-seen sortition. - */ - burn_view_consensus_hash: string; - /** - * (Hex string) Stacks Block hash - */ - previous_tenure_end: string; - /** - * The number of blocks produced in the previous tenure. - */ - previous_tenure_blocks: number; - /** - * Cause of change in mining tenure. Depending on cause, tenure can be ended or extended. - */ - cause: "block_found" | "extended"; - /** - * (Hex string) The ECDSA public key hash of the current tenure. - */ - pubkey_hash: string; - }; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/api/txs.mdx b/content/docs/stacks/api/txs.mdx deleted file mode 100644 index 8c61e7a3c..000000000 --- a/content/docs/stacks/api/txs.mdx +++ /dev/null @@ -1,596 +0,0 @@ ---- -title: Transactions -description: Learn about transactions on the Stacks blockchain. ---- - -Transactions are the fundamental unit of execution in the Stacks blockchain. Each transaction is originated from a [Stacks account](https://docs.stacks.co/stacks-101/accounts), and is retained in the Stacks blockchain. This guide helps you understand Stacks transactions. - -### Lifecycle - -Transactions go through phases before being finally confirmed and propagated on the Stacks network. - -- **Generate**: Transactions are assembled according to the encoding specification. -- **Validate and sign**: Transactions are validated to confirm they are well-formed. Required signatures are filled in. -- **Broadcast**: Transactions are sent to a node. -- **Register**: A miner receives transactions, verifies, and adds them to the ["mempool"](https://academy.binance.com/en/glossary/mempool), a holding area for all the pending transactions. -- **Process**: Miners review the mempool and select transactions to be included in the next block. Depending on the transaction type, different actions can happen during this step. For example, post-conditions could be verified for a token transfer, tokens defined in a smart contract could be minted, or an attempt to call an existing smart contract method could be made. -- **Confirm**: Miners successfully mine blocks, with each block containing a set of transactions. The transactions inside each new block are successfully propagated to the network. - - -A transaction can have one of three states once it is registered: `pending`, `success`, or `failed`. - - -### Types - -Stacks supports a set of different transaction types: - -| **Type** | **Value** | **Description** | -| :----------------- | :------------------- | :--------------- | -| Coinbase | _json`"coinbase"`_ | The first transaction in a new block. | -| Token transfer | _json`"token_transfer"`_ | Asset transfer from a sender to a recipient. | -| Contract deploy | _json`"smart_contract"`_ | Contract instantiation. | -| Contract call | _json`"contract_call"`_ | Contract call for a public, non read-only function. | - -A sample of each transaction type can be found in the [Stacks Blockchain API response definition for transactions](https://docs.hiro.so/api#operation/get_transaction_by_id). - - -Read-only contract call calls do **not** require transactions. Read more about it in the [network guide](https://docs.stacks.co/stacks-101/network#read-only-function-calls). - - -### Anchor mode - - -Microblocks are being deprecated with the Nakamoto upgrade. - - -Transactions can be mined either in an anchor block or in a [microblock](https://docs.stacks.co/stacks-101/mining#microblocks). If microblocks -are selected, the transaction can be confirmed with a lower latency than the anchor block time. - -The anchor mode enum has three options: - -- `OnChainOnly` The transaction must be included in an anchored block. -- `OffChainOnly`: The transaction must be included in a microblock. -- `Any`: The leader can choose where to include the transaction. - -Here is an example where the transaction must be included in a microblock: - -```js -import { AnchorMode, makeSTXTokenTransfer } from '@stacks/transactions'; -import { StacksTestnet, StacksMainnet } from '@stacks/network'; - -const BigNum = require('bn.js'); - -const txOptions = { - recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', - amount: new BigNum(12345), - senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01', - network: new StacksTestnet(), // for mainnet, use `StacksMainnet()` - anchorMode: AnchorMode.OffChainOnly, // must be included in a microblock -}; - -const transaction = await makeSTXTokenTransfer(txOptions); -``` - -### Post-conditions - -Transaction post-conditions are a feature meant to limit the damage malicious smart contract developers and smart contract bugs can do in terms of destroying (or taking) a user's assets. Post-conditions are executed whenever a contract is deployed or a public method of an existing contract is executed. Whenever a post-condition fails, the transaction is forced to abort. - -Post-conditions are meant to be added by the user (or by the user's wallet software) at the moment they sign a transaction. For example, a user may append a post-condition saying that upon successful execution, their account's Stacks (STX) balance should have decreased by no more than 1 STX. If this is not the case, then the transaction would abort, and the account would only pay the transaction fee of processing it. - - -Read more about post-conditions [here](/stacks/stacks.js/concepts/post-conditions). - - -### Attributes - -Each transaction includes a field that describes zero or more post-conditions that must all be true when the transaction finishes running. The post-condition describes only properties of the owner of the asset before the transaction happened. For a transfer transaction, the post-condition is about the sender, for a burn transaction, the post-condition is about the previous owner. - -A post-condition includes the following information: - -| **Attribute** | **Sample** | **Description** | -| ------------------------------------------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------ | -| Principal | `SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE` | Original owner of the asset, can be a Stacks address or a smart contract | -| Asset id | `STX` | Asset to apply conditions to (could be STX, fungible, or non-fungible tokens) | -| Comparator | `>=` | Compare operation to be applied (could define "how much" or "whether or not the asset is owned") | -| Literal | `1000000` | Use a number or true/false value to check if the asset meets the condition | - -### Evaluation modes - -The Stacks blockchain supports an `allow` or `deny` mode for evaluating post-conditions: - -- **Allow**: Other asset transfers not covered by post-conditions are permitted. -- **Deny**: No other asset transfers are permitted besides those named in post-conditions. - -### Authorization - -Transactions can be authorized in two ways: _standard_ and _sponsored_. Authorization determines whether or not the originating account is also the paying account. In a transaction with a standard authorization, the origin and paying accounts are the same. In a transaction with a sponsored authorization, the origin and paying accounts are distinct, and both accounts must sign the transaction for it to be valid (first the origin, then the spender). - -**Sponsored transactions** enable developers and/or infrastructure operators to pay for users to call into their smart contracts, even if users do not have the Stacks (STX) to do so. - -In a sponsored transaction, the user first signs the transaction with their origin account and with the intent of it being sponsored (that is, the user must explicitly allow a sponsor to sign), and then the sponsor signs the transaction with their paying account to pay for the user's transaction fee. - -### Encoding - -A transaction includes the following information. Multiple-byte fields are encoded as big-endian. - -| **Type** | **Description** | -| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Version number | Network version: `0x80` for testnet, `0x0` for mainnet | -| Chain ID | Chain instance ID: `0x80000000` for testnet, `0x00000001` for mainnet | -| Authorization | Type of authorization: (`0x04` for standard, `0x05` for sponsored) and [spending conditions](https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-authorization) | -| Post-conditions | List of post-conditions, each including a [type ID and variable-length condition body](https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-post-conditions-1) | -| Payload | Transaction type and variable-length [payload](https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-payloads-1) | - -### Construction - -The easiest way to construct well-formed transactions is by [using the Stacks.js Transactions library](/stacks/stacks.js/packages/transactions). With that library, you can construct the following transaction types: - -- Stacks token transfer -- Smart contract deploy -- Smart contract function call - -When constructing transactions, it is required to set the network the transaction is intended for. This can be either mainnet or testnet. - - -Transactions can be constructed and serialized offline. However, it is required to know the nonce and estimated fees ahead of time. Once internet access is available, the transaction can be broadcast to the network. Keep in mind that the nonce and fee might change during offline activity, making the transaction invalid. - - -### Stacks token transfer - -```js -import { makeSTXTokenTransfer } from '@stacks/transactions'; -import { StacksTestnet, StacksMainnet } from '@stacks/network'; - -const BigNum = require('bn.js'); - -const txOptions = { - recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', - amount: new BigNum(12345), - senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01', - network: new StacksTestnet(), // for mainnet, use `StacksMainnet()` - memo: 'test memo', - nonce: new BigNum(0), // set a nonce manually if you don't want builder to fetch from a Stacks node - fee: new BigNum(200), // set a tx fee if you don't want the builder to estimate -}; - -const transaction = await makeSTXTokenTransfer(txOptions); -``` - - -Read more about [nonces](https://docs.stacks.co/stacks-101/network#nonces) in the network guide. - - -#### Smart contract deployment - -```js -import { makeContractDeploy } from '@stacks/transactions'; -import { StacksTestnet, StacksMainnet } from '@stacks/network'; -const BigNum = require('bn.js'); - -const txOptions = { - contractName: 'contract_name', - codeBody: fs.readFileSync('/path/to/contract.clar').toString(), - senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01', - network: new StacksTestnet(), // for mainnet, use `StacksMainnet()` -}; - -const transaction = await makeContractDeploy(txOptions); -``` - -#### Smart contract function call - -```js -import { makeContractCall, BufferCV } from '@stacks/transactions'; -import { StacksTestnet, StacksMainnet } from '@stacks/network'; - -const BigNum = require('bn.js'); - -const txOptions = { - contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X', - contractName: 'contract_name', - functionName: 'contract_function', - functionArgs: [bufferCVFromString('foo')], - senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01', - // attempt to fetch this contract's interface and validate the provided functionArgs - validateWithAbi: true, - network: new StacksTestnet(), // for mainnet, use `StacksMainnet()` -}; - -const transaction = await makeContractCall(txOptions); -``` - -### Clarity value types - -Building transactions that call functions in deployed Clarity contracts requires you to construct valid Clarity values to pass to the function as arguments. The [Clarity type system](https://github.com/stacksgov/sips/blob/main/sips/sip-002/sip-002-smart-contract-language.md#clarity-type-system) contains the following types: - -| Type | Declaration | Description | -| ---------------- | ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Tuple | `(tuple (key-name-0 key-type-0) ...)` | Typed tuple with named fields | -| List | `(list max-len entry-type)` | List of maximum length `max-len`, with entries of type entry-type | -| Response | `(response ok-type err-type)` | Object used by public functions to commit their changes or abort. May be returned or used by other functions as well, however, only public functions have the commit/abort behavior | -| Optional | `(optional some-type)` | Option type for objects that can either be (some value) or none | -| Buffer | `(buff max-len)` | Byte buffer with maximum length `max-len` | -| Principal | `principal` | Object representing a principal (whether a contract principal or standard principal) | -| Boolean | `bool` | Boolean value ('true or 'false) | -| Signed Integer | `int` | Signed 128-bit integer | -| Unsigned Integer | `uint` | Unsigned 128-bit integer | -| ASCII String | `(define-data-var my-str (string-ascii 11) "hello world")` | String value encoded in ASCII | -| UTF-8 String | `(define-data-var my-str (string-utf8 7) u"hello \u{1234}")` | String value encoded in UTF-8 | - -The [Stacks.js Transactions library](/stacks/stacks.js/packages/transactions) contains TypeScript types and classes that map to the Clarity types, in order to make it easy to construct well-typed Clarity values in JavaScript. These types all extend the abstract class `ClarityValue`. - -Here are samples for Clarity value constructions using this library: - -```js -// construct boolean Clarity values -const t = trueCV(); -const f = falseCV(); - -// construct optional Clarity values -const nothing = noneCV(); -const something = someCV(t); - -// construct a buffer Clarity value from an existing buffer -const buffer = Buffer.from('foo'); -const bufCV = bufferCV(buffer); - -// construct signed and unsigned integer Clarity values -const i = intCV(-10); -const u = uintCV(10); - -// construct principal Clarity values -const address = 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B'; -const contractName = 'contract-name'; -const spCV = standardPrincipalCV(address); -const cpCV = contractPrincipalCV(address, contractName); - -// construct response Clarity values -const errCV = responseErrorCV(trueCV()); -const okCV = responseOkCV(falseCV()); - -// construct tuple Clarity values -const tupCV = tupleCV({ - a: intCV(1), - b: trueCV(), - c: falseCV(), -}); - -// construct list Clarity values -const l = listCV([trueCV(), falseCV()]); -``` - -If you develop in TypeScript, the type checker can help prevent you from creating wrongly-typed Clarity values. For example, the following code won't compile since lists are homogeneous in Clarity (meaning they can only contain values of a single type). It is important to include the type variable `BooleanCV` in this example; otherwise the TypeScript type checker won't know which type the list is of and won't enforce homogeneity. - -```js -const l = listCV < BooleanCV > [trueCV(), intCV(1)]; -``` - -#### Setting post-conditions - -The Stacks.js Transactions library supports the construction of post-conditions. - -Here is an example of a post-condition that ensures an account's balance will only decrease by no more than 1 STX: - -```js -const account = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE'; -const comparator = FungibleConditionCode.GreaterEqual; -// assuming the Stacks (STX) balance before the transaction is 12346 -const amount = new BigNum(12345); - -const standardSTXPostCondition = makeStandardSTXPostCondition( - account, - comparator, - amount -); - -const txOptions = { - ..., // other transaction options - postConditions: [standardSTXPostCondition] -} - -const transaction = await makeContractCall(txOptions); -``` - -### Serialization - -A well-formed transaction construct is encoded in [Recursive Length Prefix ("RLP")](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp). RLP encoding results in a variable-sized byte array. - -In order to broadcast transactions to and between nodes on the network, RLP data is represented in hexadecimal string (also called the **raw format**). - - -To support an API-friendly and human-readable representation, the Stacks Blockchain API converts transactions into a JSON format. - - -[The Stacks.js Transactions library](/stacks/stacks.js/packages/transactions) supports serialization of transactions. - -#### Raw format - -Broadcasting transactions directly to the Stacks Blockchain API or Node RPC API requires the transaction to be serialized and in hexadecimal representation. - -```js -// to see the raw serialized tx -const serializedTx = transaction.serialize().toString('hex'); - -console.log(serializedTx); -``` - -The preceding method returns the following string: - -```terminal -$ 8080000000040015c31b8c1c11c515e244b75806bac48d1399c77500000000000000000000000000000000000127e88a68dce8689fc94ff4c186bf8966f8d544c5129ff84d95a2459b5e8e7c39430388f6c8f85cce8c9ce5e6ec1e157116ca4a67d65ab53768b25d5fb5831939030200000000000516df0ba3e79792be7be5e50a370289accfc8c9e03200000000000f424068656c6c6f20776f726c640000000000000000000000000000000000000000000000 -``` - -Transaction IDs are generated by hashing the raw transaction with [sha512/256](https://eprint.iacr.org/2010/548.pdf) - -#### JSON format - -When called the Stacks Blockchain API or Node RPC API, transactions returned will be serialized in a JSON format. Here is a token transfer transaction: - -```js -{ - "tx_id": "0x77cb1bf0804f09ad24b4c494a6c00d5b10bb0afbb94a0d646fa9640eff338e37", - "nonce": 5893, - "fee_rate": "180", - "sender_address": "STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6", - "sponsored": false, - "post_condition_mode": "deny", - "post_conditions": [], - "anchor_mode": "any", - "block_hash": "0xf1e54a3acd04232f1362c09d5096b095363158348303396ea5fc5092e1d8788f", - "parent_block_hash": "0x3de356eb5afa5d7b781f6a925d31d69d218b772ec995930b4e15d92bd15443f9", - "block_height": 13984, - "burn_block_time": 1622678407, - "burn_block_time_iso": "2021-06-03T00:00:07.000Z", - "canonical": true, - "tx_index": 2, - "tx_status": "success", - "tx_result": { - "hex": "0x0703", - "repr": "(ok true)" - }, - "microblock_hash": "", - "microblock_sequence": 2147483647, - "microblock_canonical": true, - "event_count": 1, - "events": [], - "tx_type": "token_transfer", - "token_transfer": { - "recipient_address": "STZ4C5RT4WH4JGRQA5E0ZF5PPSQCVY1WRB6E2CGW", - "amount": "500000000", - "memo": "0x46617563657400000000000000000000000000000000000000000000000000000000" - } -} -``` - -#### Deserializing - -Serialized, raw transactions can be deserialized without access to the internet using [the Stacks.js Transactions library](/stacks/stacks.js/packages/transactions): - -```js -import { BufferReader, deserializeTransaction } from '@stacks/transactions'; - -// receive raw transaction -const serializedTx = '808000000...'; - -const bufferReader = new BufferReader(Buffer.from(serializedTx)); -const deserializedTx = deserializeTransaction(bufferReader); - -// print memo -console.log(deserializedTx.payload.memo.content); -``` - -### Signature and verification - -Every transaction contains verifiable signatures that certify its authenticity. These signatures are generated by signing the transaction hash with the origin's private key. The Elliptic Curve Digital Signature Algorithm (ECDSA) is used for signing, with the curve set to secp256k1. The internal structure that encapsulates the signature is the spending condition. Spending conditions include several parameters, such as the public key hash, nonce, fee rate and the recoverable ECDSA signature. - -When constructing a transaction using Stacks.js, you can supply the private key and signing will be completed automatically. If you would like to sign the transaction manually, use the `TransactionSigner` class. - -Below are the steps taken to generate the signature internal to the transaction library. - -#### Signing steps - -1. Generate a transaction hash for signing. This is the SHA512/256 digest of the serialized transaction before a signature is added. -2. Append the authorization type, fee amount and nonce to the transaction hash to create the signature hash. -3. Generate the SHA512/256 hash of the resulting string from the previous step. -4. Sign the hash using ECDSA and the origin private key. -5. Add the resulting recoverable ECDSA signature to the transaction spending condition. - -#### Single signature transactions - -As the name implies, a single signature transaction contains 1 signature from the origin account that authorizes a token spend or smart contract deploy/execution. - -#### Multi-signature transactions - -For multi-sig accounts, multiple keys must sign the transaction for it to be valid. - -#### Sponsored transactions - -A sponsored transaction is one where a second signer sets and pays the transaction fees. The origin must sign the transaction first before the sponsor signs. - -### Broadcast - -With a serialized transaction in the [raw format](#raw-format), it can be broadcast to the network using the [`POST /v2/transactions`](/stacks/api/transactions/broadcast-transaction) endpoint: - -```terminal -$ curl --location --request POST 'https://api.testnet.hiro.so/v2/transactions' \ ---header 'Content-Type: application/octet-stream' \ ---data-raw '' -``` - -The API will respond with a `HTTP 200 - OK` if the transaction was successfully added to the mempool. - -There is no explicit time constraint between the construction of a valid signed transaction and when it can be broadcast. There are, however, some constraints to be aware of. The following reasons can deem a transaction invalid after some period: - -- **Token transfer**: Nonce changed in-between construction and broadcast -- **Contract call or deploy**: Block height is evaluated (with [`at-block`](https://docs.stacks.co/clarity/functions#at-block)) and changed in-between construction and broadcast - -### Mempool - -Once a transaction has been successfully broadcast to the network, the transaction is added to the mempool of the node -that received the broadcast. From the [Bitcoin wiki][]: "a node's memory pool contains all 0-confirmation transactions -across the entire network that that particular node knows about." - -So, the set of transactions in the mempool might be -different for each node in the network. For example, when you query the mempool endpoints on -`api.mainnet.hiro.so`, the response reflects the set of unconfirmed transactions known to the nodes that -service that API. - -Miners can employ different heuristics and strategies for deciding which transactions to admit into the mempool and -which transactions to include from the mempool when mining a block. Some transactions may be rejected outright (for -example, if there are insufficient funds at an address) while others might be accepted into the mempool, but not mined -into a block indefinitely (for example, if the transaction fees are too low). - -Transactions that are admitted in the mempool but not yet -mined are said to be "pending." The current implementation of [stacks-blockchain](https://github.com/stacks-network/stacks-core) discards pending mempool -transactions after [256 blocks][]. - -#### Best practices - -- **Nonce**: It's crucial that transactions use the correct nonce. Using an incorrect nonce makes it less likely that - the transaction is mined in a timely manner. To determine the correct nonce, query the [`accounts`][] endpoint of - the node you intend to broadcast your transaction to. The value of the `nonce` field in the response is the next nonce - that the node expects to consume for that account. Nonce starts at `0`, so the first transaction from an account should - be set to `nonce=0`. -- **Transaction chaining**: Even when using the correct nonce, transactions might arrive at a node out-of-order. For - instance, a transaction with `nonce=1` may arrive in the mempool before a `nonce=0` transaction. Stacks nodes admit - such out-of-order transactions in the mempool, but only up to a limit ([25 in the current implementation][]). So, you - should limit any chain of unconfirmed transactions from a single account to less than 25. Making this limit higher has - downsides, discussed in [this issue](https://github.com/blockstack/stacks-blockchain/issues/2384). If you need to send - more than 25 transactions per block, consider using multiple accounts or a smart-contract based approach. See - [this tool](https://www.npmjs.com/package/@stacks/send-many-stx-cli), for example, that allows up to 200 token - transfers in a single transaction. - -### Querying - -Transactions on the Stacks network can be queried using the Stacks Blockchain API. The API exposes two interfaces, a RESTful JSON API and a WebSockets API. - - -The API can be easily consumed using a generated [JS client library](https://hirosystems.github.io/stacks-blockchain-api/client/index.html). The generator uses an OpenAPI specification and supports other languages and frameworks. - - -#### Get recent transactions - -Recent transactions can be obtained through the [`GET /extended/v1/tx`](/stacks/api/transactions/recent-transactions) endpoint: - -```terminal -$ curl 'https://api.testnet.hiro.so/extended/v1/tx' -``` - -Sample response: - -```js -{ - "limit": 10, - "offset": 0, - "total": 101922, - "results": [ - { - "tx_id": "0x5e9f3933e358df6a73fec0d47ce3e1062c20812c129f5294e6f37a8d27c051d9", - "tx_status": "success", - "tx_type": "coinbase", - "fee_rate": "0", - "sender_address": "ST3WCQ6S0DFT7YHF53M8JPKGDS1N1GSSR91677XF1", - "sponsored": false, - "post_condition_mode": "deny", - "block_hash": "0x58412b50266debd0c35b1a20348ad9c0f17e5525fb155a97033256c83c9e2491", - "block_height": 3231, - "burn_block_time": 1594230455, - "canonical": true, - "tx_index": 0, - "coinbase_payload": { - "data": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - } - ] -} -``` - -#### Get mempool transactions - -Mempool (registered, but not processed) transactions can be obtained using the [`GET /extended/v1/tx/mempool`](/stacks/api/transactions/mempool-transactions) endpoint: - -```terminal -$ curl 'https://api.testnet.hiro.so/extended/v1/tx/mempool' -``` - -Sample response: - -```js -{ - "limit": 96, - "offset": 0, - "total": 5, - "results": [ - { - "tx_id": "0xb31df5a363dad31723324cb5e0eefa04d491519fd30827a521cbc830114aa50c", - "tx_status": "pending", - "tx_type": "token_transfer", - "receipt_time": 1598288370, - "receipt_time_iso": "2020-08-24T16:59:30.000Z", - "fee_rate": "180", - "sender_address": "STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6", - "sponsored": false, - "post_condition_mode": "deny", - "token_transfer": { - "recipient_address": "ST1GY25DM8RZV4X15X07THRZ2C5NMWPGQWKFGV87F", - "amount": "500000", - "memo": "0x46617563657400000000000000000000000000000000000000000000000000000000" - } - } - ] -} -``` - -The `memo` field is represented as a hexadecimal string of a byte buffer - -##### Filter by type - -Recent transactions can be filtered by [transaction type](#types) using the `type` query parameter: - -```terminal -$ curl 'https://api.testnet.hiro.so/extended/v1/tx/?type=contract_call' -``` - -#### Get transaction by ID - -A specific transaction can be obtained using the [`GET /extended/v1/tx/`](/stacks/api/transactions/get-transaction) endpoint: - -```terminal -$ curl 'https://api.testnet.hiro.so/extended/v1/tx/' -``` - -Sample response: - -```js -{ - "limit": 96, - "offset": 0, - "total": 5, - "results": [ - { - "tx_id": "0xb31df5a363dad31723324cb5e0eefa04d491519fd30827a521cbc830114aa50c", - "tx_status": "pending", - "tx_type": "token_transfer", - "receipt_time": 1598288370, - "receipt_time_iso": "2020-08-24T16:59:30.000Z", - "fee_rate": "180", - "sender_address": "STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6", - "sponsored": false, - "post_condition_mode": "deny", - "token_transfer": { - "recipient_address": "ST1GY25DM8RZV4X15X07THRZ2C5NMWPGQWKFGV87F", - "amount": "500000", - "memo": "0x46617563657400000000000000000000000000000000000000000000000000000000" - } - } - ] -} -``` - -### Garbage collection - -Broadcast transactions stay in the mempool for 256 blocks (~42 hours). If a transaction is not confirmed within that time, it is removed from the mempool. - -Most transactions stay in the mempool due to nonce issues. If you see a transaction pending for an unusual time, review the nonce of the account and the transaction. - -If a transaction is removed from the mempool, the transaction was not processed, and no changes were made to the blockchain state. diff --git a/content/docs/stacks/api/usage.mdx b/content/docs/stacks/api/usage.mdx deleted file mode 100644 index 968df1a11..000000000 --- a/content/docs/stacks/api/usage.mdx +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Usage -description: Understand general concepts, response codes, and authentication strategies. ---- - -### Base URL - -The Stacks API is built on REST principles, enforcing HTTPS for all requests to ensure data security, integrity, and privacy. The base URL for all API requests is: - -```plaintext -https://api.mainnet.hiro.so -``` - -### Making requests - -To make a request to the Stacks API, you can paste the `curl` command below in your terminal. - -```terminal -$ curl -L 'https://api.hiro.so/extended' \ --H 'Accept: application/json' -``` - -### Authentication - -If you are using an `api-key`, you will need to replace `$HIRO_API_KEY` with your secret API key. - -```terminal -$ curl -L 'https://api.hiro.so/extended' \ - -H 'Accept: application/json' \ - -H 'X-API-Key: $HIRO_API_KEY' -``` - -### Response codes - -The Stacks API uses standard HTTP response codes to indicate the success or failure of an API request: - -- **`200`**: Successful request -- **`400`**: Check that the parameters were correct -- **`401`**: Missing API key -- **`403`**: Invalid API key -- **`404`**: Resource not found -- **`429`**: Rate limit exceeded -- **`5xx`**: Server errors - -### Rate limits - -| API key | Rate limit | -|:--------|:----------------------------------| -| No | 50 requests per minute (RPM) per client IP, for unauthenticated traffic | -| Yes | 500 requests per minute (RPM) regardless of origin IP, with an authenticated API key | - - - For more information on rate limiting, you can check out the [rate limiting documentation](/stacks/rate-limiting). - diff --git a/content/docs/stacks/platform-api/chainhooks/create.mdx b/content/docs/stacks/platform-api/chainhooks/create.mdx index 3e6eb6f4d..56c5dcc60 100644 --- a/content/docs/stacks/platform-api/chainhooks/create.mdx +++ b/content/docs/stacks/platform-api/chainhooks/create.mdx @@ -1,154 +1,11 @@ --- title: Create a chainhook description: Create a chainhook through the Hiro Platform. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - ObjectCollapsible, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Create a chainhook - -### Request Body - - - -Chainhook predicate configuration - - - -```json -{ - "name": "platform-api", - "uuid": "aa3626dc-2090-49cd-8f1e-8f9994393aed", - "chain": "stacks", - "version": 1, - "networks": { - "mainnet": { - "if_this": { - "scope": "block_height", - "higher_than": 161620 - }, - "end_block": null, - "then_that": { - "http_post": { - "url": "https://webhook.site", - "authorization_header": "12345" - } - }, - "start_block": 161620, - "decode_clarity_values": true, - "expire_after_occurrence": null - } - } -} -``` - - - - - -### Path Parameters - - - -Hiro API key - -Pattern: `"0941f307fd270ace19a5bfed67fbd3bc"` - - - -| Status code | Description | -| :----------- | :----------- | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X POST "https://api.platform.hiro.so/v1/ext/{apiKey}/chainhooks" \ - -d '{chainhookPredicate}' -``` - - - - - -```js -fetch("https://api.platform.hiro.so/v1/ext/{apiKey}/chainhooks", { - method: "POST" -}); -``` - - - - - - - - - - - - - -```json -{ - "status": "string", - "chainhookUuid": "string" -} -``` - - - - - -```ts -export interface Response { - status: string; - chainhookUuid: string; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/platform-api/chainhooks/delete.mdx b/content/docs/stacks/platform-api/chainhooks/delete.mdx index 3e37ef0aa..bfd8f6659 100644 --- a/content/docs/stacks/platform-api/chainhooks/delete.mdx +++ b/content/docs/stacks/platform-api/chainhooks/delete.mdx @@ -1,123 +1,11 @@ --- title: Delete a chainhook description: Delete a chainhook through the Hiro Platform. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Delete a chainhook - -### Path Parameters - - - -Hiro API key - -Pattern: `"0941f307fd270ace19a5bfed67fbd3bc"` - - - - - -Chainhook UUID - -Pattern: `"aa3626dc-2090-49cd-8f1e-8f9994393aed"` - - - -| Status code | Description | -| :----------- | :----------- | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X DELETE "https://api.platform.hiro.so/v1/ext/{apiKey}/chainhooks/{chainhookUuid}" -``` - - - - - -```js -fetch("https://api.platform.hiro.so/v1/ext/{apiKey}/chainhooks/{chainhookUuid}", { - method: "DELETE" -}); -``` - - - - - - - - - - - - - -```json -{ - "status": "string", - "chainhookUuid": "string", - "message": "string" -} -``` - - - - - -```ts -export interface Response { - status: string; - chainhookUuid: string; - message?: string; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/platform-api/chainhooks/get.mdx b/content/docs/stacks/platform-api/chainhooks/get.mdx index 4ab3ae2a5..d584651c1 100644 --- a/content/docs/stacks/platform-api/chainhooks/get.mdx +++ b/content/docs/stacks/platform-api/chainhooks/get.mdx @@ -1,153 +1,11 @@ --- title: Get a specific chainhook description: Get a specific chainhook through the Hiro Platform. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Retrieve a chainhook - -### Path Parameters - - - -Hiro API key - -Pattern: `"0941f307fd270ace19a5bfed67fbd3bc"` - - - - - -Chainhook UUID - -Pattern: `"aa3626dc-2090-49cd-8f1e-8f9994393aed"` - - - -| Status code | Description | -| :----------- | :----------- | -| `200` | Default Response | -| `404` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.platform.hiro.so/v1/ext/{apiKey}/chainhooks/{chainhookUuid}" -``` - - - - - -```js -fetch("https://api.platform.hiro.so/v1/ext/{apiKey}/chainhooks/{chainhookUuid}", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "property1": null, - "property2": null -} -``` - - - - - -```ts -export interface Response { - [k: string]: unknown; -} -``` - - - - - - - - - - - - - -```json -{ - "status": "string", - "message": "string", - "error": null -} -``` - - - - - -```ts -export interface Response { - status: string; - message?: string; - error?: unknown; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/platform-api/chainhooks/index.mdx b/content/docs/stacks/platform-api/chainhooks/index.mdx index cb864e0d6..a677a9792 100644 --- a/content/docs/stacks/platform-api/chainhooks/index.mdx +++ b/content/docs/stacks/platform-api/chainhooks/index.mdx @@ -1,6 +1,6 @@ --- title: Chainhooks index: true -toc: false +full: true description: Retrieves information about the Platform Chainhooks API. --- diff --git a/content/docs/stacks/platform-api/chainhooks/list.mdx b/content/docs/stacks/platform-api/chainhooks/list.mdx index a4850ae2a..ab42669f2 100644 --- a/content/docs/stacks/platform-api/chainhooks/list.mdx +++ b/content/docs/stacks/platform-api/chainhooks/list.mdx @@ -1,105 +1,11 @@ --- title: Get all chainhooks description: Get all of your chainhooks through the Hiro Platform. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## List all chainhooks - -### Path Parameters - - - - - -| Status code | Description | -| :----------- | :----------- | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.platform.hiro.so/v1/ext/{apiKey}/chainhooks" -``` - - - - - -```js -fetch("https://api.platform.hiro.so/v1/ext/{apiKey}/chainhooks", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -[ - null -] -``` - - - - - -```ts -export type Response = unknown[]; -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/platform-api/chainhooks/status.mdx b/content/docs/stacks/platform-api/chainhooks/status.mdx index 59098382c..a7178b7f9 100644 --- a/content/docs/stacks/platform-api/chainhooks/status.mdx +++ b/content/docs/stacks/platform-api/chainhooks/status.mdx @@ -1,172 +1,11 @@ --- title: Get a chainhook status description: Retrieve the status of a specific chainhook through the Hiro Platform. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Retrieve a chainhook status - -### Path Parameters - - - -Hiro API key - -Pattern: `"0941f307fd270ace19a5bfed67fbd3bc"` - - - - - -Chainhook UUID - -Pattern: `"aa3626dc-2090-49cd-8f1e-8f9994393aed"` - - - -| Status code | Description | -| :----------- | :----------- | -| `200` | Successfully retrieved chainhook status | -| `404` | Chainhook not found | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.platform.hiro.so/v1/ext/{apiKey}/chainhooks/{chainhookUuid}/status" -``` - - - - - -```js -fetch("https://api.platform.hiro.so/v1/ext/{apiKey}/chainhooks/{chainhookUuid}/status", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "status": { - "info": { - "expired_at_block_height": 162515, - "last_evaluated_block_height": 162515, - "last_occurrence": 1724075618, - "number_of_blocks_evaluated": 4, - "number_of_times_triggered": 3 - }, - "type": "confirmed_expiration" - }, - "enabled": false -} -``` - - - - - -```ts -export interface Response { - status: { - info: { - expired_at_block_height: number; - last_evaluated_block_height: number; - last_occurrence: number; - number_of_blocks_evaluated: number; - number_of_times_triggered: number; - }; - type: string; - }; - enabled: boolean; -} -``` - - - - - - - - - - - - - -```json -{ - "status": "string", - "message": "string", - "error": null -} -``` - - - - - -```ts -export interface Response { - status: string; - message?: string; - error?: unknown; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/platform-api/chainhooks/update.mdx b/content/docs/stacks/platform-api/chainhooks/update.mdx index 903f68933..b5b0183be 100644 --- a/content/docs/stacks/platform-api/chainhooks/update.mdx +++ b/content/docs/stacks/platform-api/chainhooks/update.mdx @@ -1,196 +1,11 @@ --- title: Update a chainhook description: Update a chainhook through the Hiro Platform. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Update a chainhook - -### Request Body - - - -Chainhook predicate configuration - - - -### Path Parameters - - - -Hiro API key - -Pattern: `"0941f307fd270ace19a5bfed67fbd3bc"` - - - - - -Chainhook UUID - -Pattern: `"aa3626dc-2090-49cd-8f1e-8f9994393aed"` - - - -| Status code | Description | -| :----------- | :----------- | -| `200` | Default Response | -| `404` | Default Response | -| `500` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X PUT "https://api.platform.hiro.so/v1/ext/{apiKey}/chainhooks/{chainhookUuid}" \ - -d 'string' -``` - - - - - -```js -fetch("https://api.platform.hiro.so/v1/ext/{apiKey}/chainhooks/{chainhookUuid}", { - method: "PUT" -}); -``` - - - - - - - - - - - - - -```json -{ - "status": "string", - "chainhookUuid": "string" -} -``` - - - - - -```ts -export interface Response { - status: string; - chainhookUuid: string; -} -``` - - - - - - - - - - - - - -```json -{ - "status": "string", - "message": "string", - "error": null -} -``` - - - - - -```ts -export interface Response { - status: string; - message?: string; - error?: unknown; -} -``` - - - - - - - - - - - - - -```json -{ - "status": "string", - "message": "string", - "error": null -} -``` - - - - - -```ts -export interface Response { - status: string; - message?: string; - error?: unknown; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/platform-api/devnet/bitcoin-node.mdx b/content/docs/stacks/platform-api/devnet/bitcoin-node.mdx index 253be449f..be17ba710 100644 --- a/content/docs/stacks/platform-api/devnet/bitcoin-node.mdx +++ b/content/docs/stacks/platform-api/devnet/bitcoin-node.mdx @@ -1,217 +1,11 @@ --- title: Bitcoin node description: Proxy for the Bitcoin node on a development network (devnet). -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Bitcoin node - -This endpoint is designed to proxy requests to the Bitcoin node on a development network (devnet). - -It is accessible only with an API key and supports various HTTP methods (GET, POST, PUT, DELETE, PATCH, OPTIONS). - -### Path parameters - - - -Hiro API key - -Pattern: `"0941f307fd270ace19a5bfed67fbd3bc"` - - - - - -The path (endpoint) for the Bitcoin node RPC - -Pattern: `"rest/chaininfo"` - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.platform.hiro.so/v1/ext/{apiKey}/bitcoin-node/extended/v1/tx" -``` - - - - - -```js -fetch("https://api.platform.hiro.so/v1/ext/{apiKey}/bitcoin-node/extended/v1/tx", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{} -``` - - - - - -```ts -export interface Response { - [k: string]: unknown; -} -``` - - - - - - - - - - - - - - - - - -## Bitcoin node - -This endpoint is designed to proxy requests to the Bitcoin node on a development network (devnet). - -It is accessible only with an API key and supports various HTTP methods (GET, POST, PUT, DELETE, PATCH, OPTIONS). - -### Path parameters - - - -Hiro API key - -Pattern: `"0941f307fd270ace19a5bfed67fbd3bc"` - - - - - -The path (endpoint) for the Bitcoin node RPC - -Pattern: `"rest/chaininfo"` - - - -| Status code | Description | -| :----------- | :----------- | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X POST "https://api.platform.hiro.so/v1/ext/{apiKey}/bitcoin-node/rest/chaininfo" -``` - - - - - -```js -fetch("https://api.platform.hiro.so/v1/ext/{apiKey}/bitcoin-node/rest/chaininfo", { - method: "POST" -}); -``` - - - - - - - - - - - - - -```json -{} -``` - - - - - -```ts -export interface Response { - [k: string]: unknown; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/platform-api/devnet/index.mdx b/content/docs/stacks/platform-api/devnet/index.mdx index 221ed9d46..76b0f2fec 100644 --- a/content/docs/stacks/platform-api/devnet/index.mdx +++ b/content/docs/stacks/platform-api/devnet/index.mdx @@ -1,6 +1,6 @@ --- title: Devnet index: true -toc: false +full: true description: Retrieves information about the Platform Devnet services such as Stacks Blockchain API, Bitcoin node, and more. --- diff --git a/content/docs/stacks/platform-api/devnet/stacks-blockchain-api.mdx b/content/docs/stacks/platform-api/devnet/stacks-blockchain-api.mdx index 46488207b..cea406380 100644 --- a/content/docs/stacks/platform-api/devnet/stacks-blockchain-api.mdx +++ b/content/docs/stacks/platform-api/devnet/stacks-blockchain-api.mdx @@ -1,217 +1,11 @@ --- title: Stacks Blockchain API description: Proxy for the Stacks Blockchain API on a development network (devnet). -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Stacks Blockchain API - -This endpoint is designed to proxy requests to the Stacks blockchain API on a development network (devnet). - -It is accessible only with an API key and supports various HTTP methods (GET, POST, PUT, DELETE, PATCH, OPTIONS). - -### Path Parameters - - - -Hiro API key - -Pattern: `"0941f307fd270ace19a5bfed67fbd3bc"` - - - - - -The path (endpoint) for the Stacks Blockchain API - -Pattern: `"extended/v1/tx"` - - - -| Status code | Description | -| :----------- | :----------- | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.platform.hiro.so/v1/ext/{apiKey}/stacks-blockchain-api/extended/v1/tx" -``` - - - - - -```js -fetch("https://api.platform.hiro.so/v1/ext/{apiKey}/stacks-blockchain-api/extended/v1/tx", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{} -``` - - - - - -```ts -export interface Response { - [k: string]: unknown; -} -``` - - - - - - - - - - - - - - - - - -## Stacks Blockchain API - -This endpoint is designed to proxy requests to the Stacks blockchain API on a development network (devnet). - -It is accessible only with an API key and supports various HTTP methods (GET, POST, PUT, DELETE, PATCH, OPTIONS). - -### Path Parameters - - - -Hiro API key - -Pattern: `"0941f307fd270ace19a5bfed67fbd3bc"` - - - - - -The path (endpoint) for the Stacks Blockchain API - -Pattern: `"extended/v1/tx"` - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X POST "https://api.platform.hiro.so/v1/ext/{apiKey}/stacks-blockchain-api/v2/transactions" -``` - - - - - -```js -fetch("https://api.platform.hiro.so/v1/ext/{apiKey}/stacks-blockchain-api/v2/transactions", { - method: "POST" -}); -``` - - - - - - - - - - - - - -```json -{} -``` - - - - - -```ts -export interface Response { - [k: string]: unknown; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/platform-api/devnet/start.mdx b/content/docs/stacks/platform-api/devnet/start.mdx index 6119895c5..dd9380307 100644 --- a/content/docs/stacks/platform-api/devnet/start.mdx +++ b/content/docs/stacks/platform-api/devnet/start.mdx @@ -1,135 +1,11 @@ --- title: Start devnet description: Start a development network (devnet). -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Start devnet - -This endpoint starts a devnet service. - -### Request Body - - - -JSON file containing the devnet plan. The file can be created using `clarinet devnet package`. - -Example: `@default.devnet-plan.json` - - - -### Path Parameters - - - -Hiro API key - -Pattern: `"0941f307fd270ace19a5bfed67fbd3bc"` - - - - - -Project name - -Pattern: `"clarity-bitcoin-197s"` - - - -| Status code | Description | -| :----------- | :----------- | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X PUT -F "file=@default.devnet-plan.json" "https://api.platform.hiro.so/v1/ext/{apiKey}/devnet/{projectName}" -``` - - - - - -```js -const devnetPlan = { - // Your devnet plan object here -}; - -fetch("https://api.platform.hiro.so/v1/ext/{apiKey}/devnet/{projectName}", { - method: "PUT", - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(devnetPlan) -}); -``` - - - - - - - - - - - - - -```json -{} -``` - - - - - -```ts -export interface Response {} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/platform-api/devnet/stop.mdx b/content/docs/stacks/platform-api/devnet/stop.mdx index e67da7cc4..d9e21a33d 100644 --- a/content/docs/stacks/platform-api/devnet/stop.mdx +++ b/content/docs/stacks/platform-api/devnet/stop.mdx @@ -1,107 +1,11 @@ --- title: Stop devnet description: Stop a development network (devnet). -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Stop devnet - -### Path Parameters - - - -Hiro API key - -Pattern: `"0941f307fd270ace19a5bfed67fbd3bc"` - - - -| Status code | Description | -| :----------- | :----------- | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X DELETE "https://api.platform.hiro.so/v1/ext/{apiKey}/devnet" -``` - - - - - -```js -fetch("https://api.platform.hiro.so/v1/ext/{apiKey}/devnet", { - method: "DELETE" -}); -``` - - - - - - - - - - - - - -```json -Ok -``` - - - - - -```ts -export interface Response {} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/accounts/index.mdx b/content/docs/stacks/rpc-api/accounts/index.mdx index bfd9e48f5..f3757a94f 100644 --- a/content/docs/stacks/rpc-api/accounts/index.mdx +++ b/content/docs/stacks/rpc-api/accounts/index.mdx @@ -1,6 +1,6 @@ --- title: Accounts index: true -toc: false +full: true description: Get account information. --- \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/accounts/info.mdx b/content/docs/stacks/rpc-api/accounts/info.mdx index 11525e77f..53a210b1f 100644 --- a/content/docs/stacks/rpc-api/accounts/info.mdx +++ b/content/docs/stacks/rpc-api/accounts/info.mdx @@ -1,145 +1,11 @@ --- title: Get account info description: Retrieves the account data for a given account or contract identifier. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get account info - -Get the account data for the provided principal - -Where balance is the hex encoding of a unsigned 128-bit integer (big-endian), nonce is a unsigned 64-bit integer, and the proofs are provided as hex strings. - -For non-existent accounts, this does not 404, rather it returns an object with balance and nonce of 0. - - -### Path Parameters - - - -Stacks address or a Contract identifier (e.g. `SP31DA6FTSJX2WGTZ69SFY11BH51NZMB0ZW97B5P0.get-info`) - - - -### Query Parameters - - - -Returns object without the proof field if set to 0 - - - - - -The Stacks chain tip to query from. If tip == latest, the query will be run from the latest known tip (includes unconfirmed state). - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "http://localhost:20443/v2/accounts/string?proof=0&tip=string" -``` - - - - - -```js -fetch("http://localhost:20443/v2/accounts/string?proof=0&tip=string", { - method: "GET" -}); -``` - - - - - - - - - -GET request for account data - - - - - -```json -{ - "balance": "string", - "locked": "string", - "unlock_height": 0, - "nonce": 0, - "balance_proof": "string", - "nonce_proof": "string" -} -``` - - - - - -```ts -/** - * GET request for account data - */ -export interface AccountDataResponse { - balance: string; - locked: string; - unlock_height: number; - nonce: number; - balance_proof: string; - nonce_proof: string; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/blocks/block-proposal.mdx b/content/docs/stacks/rpc-api/blocks/block-proposal.mdx index 4ae7a3157..6c1715cb8 100644 --- a/content/docs/stacks/rpc-api/blocks/block-proposal.mdx +++ b/content/docs/stacks/rpc-api/blocks/block-proposal.mdx @@ -1,154 +1,11 @@ --- title: Validate proposed block description: Validate a proposed Stacks block. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Validate a proposed Stacks block - -Used by stackers to validate a proposed Stacks block from a miner. - -**This API endpoint requires a basic Authorization header.** - - -### Request Body (Optional) - - - - - - - - - -| Status code | Description | -| ----------- | ----------- | -| `202` | Block proposal has been accepted for processing. The result will be returned via the event observer. | -| `403` | Request not over loopback interface | -| `429` | There is an ongoing proposal validation being processed, the new request cannot be accepted until the prior request has been processed. | - - - - - - - - - - - - - -```terminal -$ curl -X POST "http://localhost:20443/v2/block_proposal" \ - -d '{ - "block": "string", - "chain_id": 0 -}' -``` - - - - - -```js -fetch("http://localhost:20443/v2/block_proposal", { - method: "POST" -}); -``` - - - - - - - - - - - - - -```json -{ - "message": "string", - "result": "string" -} -``` - - - - - -```ts -export interface Response { - message?: string; - result?: string; -} -``` - - - - - - - - - - - - - -```json -{ - "message": "string", - "result": "string" -} -``` - - - - - -```ts -export interface Response { - message?: string; - result?: string; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/blocks/index.mdx b/content/docs/stacks/rpc-api/blocks/index.mdx index 12bb3f083..7ddaf976d 100644 --- a/content/docs/stacks/rpc-api/blocks/index.mdx +++ b/content/docs/stacks/rpc-api/blocks/index.mdx @@ -1,6 +1,6 @@ --- title: Blocks index: true -toc: false +full: true description: Get block proposal information. --- \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/burn-ops/get-burn-operations.mdx b/content/docs/stacks/rpc-api/burn-ops/get-burn-operations.mdx index 2d324008e..96bb3598d 100644 --- a/content/docs/stacks/rpc-api/burn-ops/get-burn-operations.mdx +++ b/content/docs/stacks/rpc-api/burn-ops/get-burn-operations.mdx @@ -1,85 +1,11 @@ --- title: Get burn operations description: Get all burn operations of type `op_type` successfully read at `burn_height`. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get burn operations - -Get all burn operations of type `op_type` successfully read at `burn_height`. Valid `op_type`s are `peg_in`, `peg_out_request` and `peg_out_fulfill`. - -### Path Parameters - - - -height of the burnchain (Bitcoin) - - - - - -name of the burnchain operation type - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Burn operations list | - - - - - - - - - - - - - -```terminal -$ curl -X GET "http://localhost:20443/v2/burn_ops/0/string" -``` - - - - - -```js -fetch("http://localhost:20443/v2/burn_ops/0/string", { - method: "GET" -}); -``` - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/burn-ops/index.mdx b/content/docs/stacks/rpc-api/burn-ops/index.mdx index 5ec824da9..a8b0e536b 100644 --- a/content/docs/stacks/rpc-api/burn-ops/index.mdx +++ b/content/docs/stacks/rpc-api/burn-ops/index.mdx @@ -1,6 +1,6 @@ --- title: Burn operations index: true -toc: false +full: true description: Get burn operations of type `op_type` successfully read at `burn_height`. --- \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/fees/estimate.mdx b/content/docs/stacks/rpc-api/fees/estimate.mdx index c6fcf5699..6dcab4d7b 100644 --- a/content/docs/stacks/rpc-api/fees/estimate.mdx +++ b/content/docs/stacks/rpc-api/fees/estimate.mdx @@ -1,213 +1,11 @@ --- title: Get approximate fees for the given transaction description: Get an estimated fee for the supplied transaction. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get approximate fees for the given transaction - -Get an estimated fee for the supplied transaction. This -estimates the execution cost of the transaction, the current -fee rate of the network, and returns estimates for fee -amounts. - -* `transaction_payload` is a hex-encoded serialization of - the TransactionPayload for the transaction. -* `estimated_len` is an optional argument that provides the - endpoint with an estimation of the final length (in bytes) - of the transaction, including any post-conditions and - signatures - -If the node cannot provide an estimate for the transaction -(e.g., if the node has never seen a contract-call for the -given contract and function) or if estimation is not -configured on this node, a 400 response is returned. -The 400 response will be a JSON error containing a `reason` -field which can be one of the following: - -* `DatabaseError` - this Stacks node has had an internal - database error while trying to estimate the costs of the - supplied transaction. -* `NoEstimateAvailable` - this Stacks node has not seen this - kind of contract-call before, and it cannot provide an - estimate yet. -* `CostEstimationDisabled` - this Stacks node does not perform - fee or cost estimation, and it cannot respond on this - endpoint. - -The 200 response contains the following data: - -* `estimated_cost` - the estimated multi-dimensional cost of - executing the Clarity VM on the provided transaction. -* `estimated_cost_scalar` - a unitless integer that the Stacks - node uses to compare how much of the block limit is consumed - by different transactions. This value incorporates the - estimated length of the transaction and the estimated - execution cost of the transaction. The range of this integer - may vary between different Stacks nodes. In order to compute - an estimate of total fee amount for the transaction, this - value is multiplied by the same Stacks node's estimated fee - rate. -* `cost_scalar_change_by_byte` - a float value that indicates how - much the `estimated_cost_scalar` value would increase for every - additional byte in the final transaction. -* `estimations` - an array of estimated fee rates and total fees to - pay in microSTX for the transaction. This array provides a range of - estimates (default: 3) that may be used. Each element of the array - contains the following fields: - * `fee_rate` - the estimated value for the current fee - rates in the network - * `fee` - the estimated value for the total fee in - microSTX that the given transaction should pay. These - values are the result of computing: - `fee_rate` x `estimated_cost_scalar`. - If the estimated fees are less than the minimum relay - fee `(1 ustx x estimated_len)`, then that minimum relay - fee will be returned here instead. - - -Note: If the final transaction's byte size is larger than -supplied to `estimated_len`, then applications should increase -this fee amount by: - - `fee_rate` x `cost_scalar_change_by_byte` x (`final_size` - `estimated_size`) - - -### Request Body (Optional) - - - - - - - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Estimated fees for the transaction | - - - - - - - - - - - - - -```terminal -$ curl -X POST "http://localhost:20443/v2/fees/transaction" \ - -d '{ - "transaction_payload": "string", - "estimated_len": 0 -}' -``` - - - - - -```js -fetch("http://localhost:20443/v2/fees/transaction", { - method: "POST" -}); -``` - - - - - - - - - -POST response for estimated fee - - - - - -```json -{ - "estimated_cost_scalar": 0, - "cost_scalar_change_by_byte": 0, - "estimated_cost": { - "read_count": 0, - "read_length": 0, - "runtime": 0, - "write_count": 0, - "write_length": 0 - }, - "estimations": [ - { - "fee_rate": 0, - "fee": 0 - } - ] -} -``` - - - - - -```ts -/** - * POST response for estimated fee - */ -export interface TransactionFeeEstimateResponse { - estimated_cost_scalar: number; - cost_scalar_change_by_byte?: number; - estimated_cost: { - read_count: number; - read_length: number; - runtime: number; - write_count: number; - write_length: number; - }; - estimations?: { - fee_rate?: number; - fee?: number; - }[]; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/fees/index.mdx b/content/docs/stacks/rpc-api/fees/index.mdx index 33c4d61fe..20ee409de 100644 --- a/content/docs/stacks/rpc-api/fees/index.mdx +++ b/content/docs/stacks/rpc-api/fees/index.mdx @@ -1,6 +1,6 @@ --- title: Fees index: true -toc: false +full: true description: Provide estimates, rates, and approximate calculations for transaction costs. --- \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/fees/transfer-estimate.mdx b/content/docs/stacks/rpc-api/fees/transfer-estimate.mdx index c9dc84332..119cf6e69 100644 --- a/content/docs/stacks/rpc-api/fees/transfer-estimate.mdx +++ b/content/docs/stacks/rpc-api/fees/transfer-estimate.mdx @@ -1,104 +1,11 @@ --- title: Get transfer fee estimate description: Retrieves an estimated fee rate for STX transfer transactions. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get estimated fee - -Get an estimated fee rate for STX transfer transactions. This a a fee rate / byte, and is returned as a JSON integer - -| Status code | Description | -| ----------- | ----------- | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "http://localhost:20443/v2/fees/transfer" -``` - - - - - -```js -fetch("http://localhost:20443/v2/fees/transfer", { - method: "GET" -}); -``` - - - - - - - - - -GET fee estimates - - - - - -```json -"string" -``` - - - - - -```ts -/** - * GET fee estimates - */ -export type CoreNodeFeeResponse = string; -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/info/core-api.mdx b/content/docs/stacks/rpc-api/info/core-api.mdx index 6bd346d8d..78c5fc0e2 100644 --- a/content/docs/stacks/rpc-api/info/core-api.mdx +++ b/content/docs/stacks/rpc-api/info/core-api.mdx @@ -1,171 +1,11 @@ --- title: Get core API info description: Retrieves information about the Core API, including the server version. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get Core API info - -Get Core API information - -| Status code | Description | -| ----------- | ----------- | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "http://localhost:20443/v2/info" -``` - - - - - -```js -fetch("http://localhost:20443/v2/info", { - method: "GET" -}); -``` - - - - - - - - - -GET request that core node information - - - - - -```json -{ - "peer_version": 0, - "pox_consensus": "string", - "burn_block_height": 0, - "stable_pox_consensus": "string", - "stable_burn_block_height": 0, - "server_version": "string", - "network_id": 0, - "parent_network_id": 0, - "stacks_tip_height": 0, - "stacks_tip": "string", - "stacks_tip_consensus_hash": "string", - "unanchored_tip": "string", - "exit_at_block_height": 0 -} -``` - - - - - -```ts -/** - * GET request that core node information - */ -export interface CoreNodeInfoResponse { - /** - * identifies the version number for the networking communication, this should not change while a node is running, and will only change if there's an upgrade - */ - peer_version: number; - /** - * is a hash used to identify the burnchain view for a node. it incorporates bitcoin chain information and PoX information. nodes that disagree on this value will appear to each other as forks. this value will change after every block - */ - pox_consensus: string; - /** - * latest bitcoin chain height - */ - burn_block_height: number; - /** - * same as burn_consensus, but evaluated at stable_burn_block_height - */ - stable_pox_consensus: string; - /** - * leftover from stacks 1.0, basically always burn_block_height - 1 - */ - stable_burn_block_height: number; - /** - * is a version descriptor - */ - server_version: string; - /** - * is similar to peer_version and will be used to differentiate between different testnets. this value will be different between mainnet and testnet. once launched, this value will not change - */ - network_id: number; - /** - * same as network_id, but for bitcoin - */ - parent_network_id: number; - /** - * the latest Stacks chain height. Stacks forks can occur independent of the Bitcoin chain, that height doesn't increase 1-to-1 with the Bitcoin height - */ - stacks_tip_height: number; - /** - * the best known block hash for the Stack chain (not including any pending microblocks) - */ - stacks_tip: string; - /** - * the burn chain (i.e., bitcoin) consensus hash at the time that stacks_tip was mined - */ - stacks_tip_consensus_hash: string; - /** - * the latest microblock hash if any microblocks were processed. if no microblock has been processed for the current block, a 000.., hex array is returned - */ - unanchored_tip: string; - /** - * the block height at which the testnet network will be reset. not applicable for mainnet - */ - exit_at_block_height: number; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/info/index.mdx b/content/docs/stacks/rpc-api/info/index.mdx index 4106173a5..3989df839 100644 --- a/content/docs/stacks/rpc-api/info/index.mdx +++ b/content/docs/stacks/rpc-api/info/index.mdx @@ -1,6 +1,6 @@ --- title: Info index: true -toc: false +full: true description: Retrieves information about the Core API and the Stacks network. --- diff --git a/content/docs/stacks/rpc-api/names/index.mdx b/content/docs/stacks/rpc-api/names/index.mdx index b1e2ce35f..da0c711a5 100644 --- a/content/docs/stacks/rpc-api/names/index.mdx +++ b/content/docs/stacks/rpc-api/names/index.mdx @@ -1,6 +1,6 @@ --- title: Names index: true -toc: false +full: true description: Manages and retrieve information on blockchain namespaces, names, and related details. --- \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/names/name-price.mdx b/content/docs/stacks/rpc-api/names/name-price.mdx index 43cbf5612..6f861de62 100644 --- a/content/docs/stacks/rpc-api/names/name-price.mdx +++ b/content/docs/stacks/rpc-api/names/name-price.mdx @@ -1,119 +1,11 @@ --- title: Get name price description: Retrieves the price of a name. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get name price - -Retrieves the price of a name. The `amount` given will be in the smallest possible units of the currency. -### Path Parameters - - - -the name to query price information for - -Example: `"muneeb.id"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/v2/prices/names/muneeb.id" -``` - - - - - -```js -fetch("https://api.hiro.so/v2/prices/names/muneeb.id", { - method: "GET" -}); -``` - - - - - - - - - -Fetch price for name. - - - - - -```json -{ - "units": "string", - "amount": "string" -} -``` - - - - - -```ts -/** - * Fetch price for name. - */ -export interface BnsGetNamePriceResponse { - units: string; - amount: string; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/names/namespace-price.mdx b/content/docs/stacks/rpc-api/names/namespace-price.mdx index 9e6311ec3..c10ccd42d 100644 --- a/content/docs/stacks/rpc-api/names/namespace-price.mdx +++ b/content/docs/stacks/rpc-api/names/namespace-price.mdx @@ -1,119 +1,11 @@ --- title: Get namespace price description: Retrieves the price of a namespace. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get Namespace Price - -Retrieves the price of a namespace. The `amount` given will be in the smallest possible units of the currency. -### Path Parameters - - - -the namespace to fetch price for - -Example: `"id"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/v2/prices/namespaces/id" -``` - - - - - -```js -fetch("https://api.hiro.so/v2/prices/namespaces/id", { - method: "GET" -}); -``` - - - - - - - - - -Fetch price for namespace. - - - - - -```json -{ - "units": "string", - "amount": "string" -} -``` - - - - - -```ts -/** - * Fetch price for namespace. - */ -export interface BnsGetNamespacePriceResponse { - units: string; - amount: string; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/pox/index.mdx b/content/docs/stacks/rpc-api/pox/index.mdx index 58aff34b7..571ed2ff3 100644 --- a/content/docs/stacks/rpc-api/pox/index.mdx +++ b/content/docs/stacks/rpc-api/pox/index.mdx @@ -1,6 +1,6 @@ --- title: Proof of Transfer index: true -toc: false +full: true description: Retrieves Proof-of-Transfer (PoX) information. --- diff --git a/content/docs/stacks/rpc-api/pox/pox-details.mdx b/content/docs/stacks/rpc-api/pox/pox-details.mdx index 0b48d5c3e..3ebfcdcf0 100644 --- a/content/docs/stacks/rpc-api/pox/pox-details.mdx +++ b/content/docs/stacks/rpc-api/pox/pox-details.mdx @@ -1,282 +1,11 @@ --- title: Get Proof-of-Transfer details description: Retrieves Proof-of-Transfer (PoX) information. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get PoX details - -Get Proof of Transfer (PoX) information. Can be used for Stacking. - -### Query Parameters - - - -The Stacks chain tip to query from. If tip == latest, the query will be run from the latest known tip (includes unconfirmed state). - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "http://localhost:20443/v2/pox?tip=string" -``` - - - - - -```js -fetch("http://localhost:20443/v2/pox?tip=string", { - method: "GET" -}); -``` - - - - - - - - - -Get Proof of Transfer (PoX) information - - - - - -```json -{ - "contract_id": "string", - "first_burnchain_block_height": 0, - "current_burnchain_block_height": 0, - "pox_activation_threshold_ustx": 0, - "rejection_fraction": 0, - "reward_phase_block_length": 0, - "prepare_phase_block_length": 0, - "reward_slots": 0, - "total_liquid_supply_ustx": 0, - "reward_cycle_length": 0, - "current_cycle": { - "id": 0, - "min_threshold_ustx": 0, - "stacked_ustx": 0, - "is_pox_active": true - }, - "next_cycle": { - "id": 0, - "min_threshold_ustx": 0, - "stacked_ustx": 0, - "min_increment_ustx": 0, - "prepare_phase_start_block_height": 0, - "blocks_until_prepare_phase": 0, - "reward_phase_start_block_height": 0, - "blocks_until_reward_phase": 0, - "ustx_until_pox_rejection": 0 - }, - "reward_cycle_id": 0, - "min_amount_ustx": 0, - "prepare_cycle_length": 0, - "rejection_votes_left_required": 0, - "contract_versions": [ - { - "contract_id": "string", - "activation_burnchain_block_height": 0, - "first_reward_cycle_id": 0 - } - ] -} -``` - - - - - -```ts -/** - * Get Proof of Transfer (PoX) information - */ -export interface CoreNodePoxResponse { - /** - * The contract identifier for the PoX contract - */ - contract_id: string; - /** - * The first burn block evaluated in this Stacks chain - */ - first_burnchain_block_height: number; - /** - * The latest Bitcoin chain block height - */ - current_burnchain_block_height: number; - /** - * The threshold of stacking participation that must be reached for PoX to activate in any cycle - */ - pox_activation_threshold_ustx: number; - /** - * The fraction of liquid STX that must vote to reject PoX in order to prevent the next reward cycle from activating. - */ - rejection_fraction: number; - /** - * The length in burn blocks of the reward phase - */ - reward_phase_block_length: number; - /** - * The length in burn blocks of the prepare phase - */ - prepare_phase_block_length: number; - /** - * The number of reward slots in a reward cycle - */ - reward_slots: number; - /** - * The current total amount of liquid microstacks. - */ - total_liquid_supply_ustx: number; - /** - * The length in burn blocks of a whole PoX cycle (reward phase and prepare phase) - */ - reward_cycle_length: number; - current_cycle: { - /** - * The reward cycle number - */ - id: number; - /** - * The threshold amount for obtaining a slot in this reward cycle. - */ - min_threshold_ustx: number; - /** - * The total amount of stacked microstacks in this reward cycle. - */ - stacked_ustx: number; - /** - * Whether or not PoX is active during this reward cycle. - */ - is_pox_active: boolean; - }; - next_cycle: { - /** - * The reward cycle number - */ - id: number; - /** - * The threshold amount for obtaining a slot in this reward cycle. - */ - min_threshold_ustx: number; - /** - * The total amount of stacked microstacks in this reward cycle. - */ - stacked_ustx: number; - /** - * The minimum amount that can be used to submit a `stack-stx` call. - */ - min_increment_ustx: number; - /** - * The burn block height when the prepare phase for this cycle begins. Any eligible stacks must be stacked before this block. - */ - prepare_phase_start_block_height: number; - /** - * The number of burn blocks until the prepare phase for this cycle starts. If the prepare phase for this cycle already started, this value will be negative. - */ - blocks_until_prepare_phase: number; - /** - * The burn block height when the reward phase for this cycle begins. Any eligible stacks must be stacked before this block. - */ - reward_phase_start_block_height: number; - /** - * The number of burn blocks until this reward phase starts. - */ - blocks_until_reward_phase: number; - /** - * The remaining amount of liquid STX that must vote to reject the next reward cycle to prevent the next reward cycle from activating. - */ - ustx_until_pox_rejection: number; - }; - /** - * @deprecated - * The active reward cycle number - */ - reward_cycle_id: number; - /** - * @deprecated - */ - min_amount_ustx: number; - /** - * @deprecated - */ - prepare_cycle_length: number; - /** - * @deprecated - */ - rejection_votes_left_required: number; - /** - * Versions of each PoX - */ - contract_versions: { - /** - * The contract identifier for the PoX contract - */ - contract_id: string; - /** - * The burn block height at which this version of PoX is activated - */ - activation_burnchain_block_height: number; - /** - * The first reward cycle number that uses this version of PoX - */ - first_reward_cycle_id: number; - }[]; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/pox/stacker-set.mdx b/content/docs/stacks/rpc-api/pox/stacker-set.mdx index f519f1771..00cb5ca3d 100644 --- a/content/docs/stacks/rpc-api/pox/stacker-set.mdx +++ b/content/docs/stacks/rpc-api/pox/stacker-set.mdx @@ -1,83 +1,11 @@ --- title: Get stacker and signer set information description: Retrieves stacker and signer set information for a given cycle. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Fetch the stacker and signer set information for a given cycle. - -Used to get stacker and signer set information for a given cycle. - -This will only return information for cycles started in Epoch-2.5 where PoX-4 was active and subsequent cycles. - - -### Path Parameters - - - -reward cycle number - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Information for the given reward cycle | -| `400` | Could not fetch the given reward set | - - - - - - - - - - - - - -```terminal -$ curl -X GET "http://localhost:20443/v2/stacker_set/0" -``` - - - - - -```js -fetch("http://localhost:20443/v2/stacker_set/0", { - method: "GET" -}); -``` - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/smart-contracts/constants.mdx b/content/docs/stacks/rpc-api/smart-contracts/constants.mdx index 372d571fe..21ea65807 100644 --- a/content/docs/stacks/rpc-api/smart-contracts/constants.mdx +++ b/content/docs/stacks/rpc-api/smart-contracts/constants.mdx @@ -1,142 +1,11 @@ --- title: Get constant value description: Get the value of a constant inside a contract. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get the value of a constant inside a contract - -Attempt to fetch the value of a constant inside a contract. The contract is identified with [Stacks Address] and [Contract Name] in the URL path. The constant is identified with [Constant Name]. - -In the response, `data` is the hex serialization of the constant value. - -### Path Parameters - - - -Stacks address - - - - - -Contract name - - - - - -Constant name - - - -### Query Parameters - - - -The Stacks chain tip to query from. If tip == latest, the query will be run from the latest known tip (includes unconfirmed state). - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Success | -| `400` | Failed to retrieve constant value from contract | - - - - - - - - - - - - - -```terminal -$ curl -X POST "http://localhost:20443/v2/constant_val/string/string/string?tip=string" -``` - - - - - -```js -fetch("http://localhost:20443/v2/constant_val/string/string/string?tip=string", { - method: "POST" -}); -``` - - - - - - - - - -Response of get constant val request - - - - - -```json -{ - "data": "string" -} -``` - - - - - -```ts -/** - * Response of get constant val request - */ -export interface ConstantValResponse { - /** - * Hex-encoded string of clarity value. - */ - data: string; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/smart-contracts/index.mdx b/content/docs/stacks/rpc-api/smart-contracts/index.mdx index 32e39b1ac..5559d6350 100644 --- a/content/docs/stacks/rpc-api/smart-contracts/index.mdx +++ b/content/docs/stacks/rpc-api/smart-contracts/index.mdx @@ -1,6 +1,6 @@ --- title: Smart contracts index: true -toc: false +full: true description: Provide information and facilitate interactions with smart contracts. --- diff --git a/content/docs/stacks/rpc-api/smart-contracts/interface.mdx b/content/docs/stacks/rpc-api/smart-contracts/interface.mdx index 68155e077..96aae930d 100644 --- a/content/docs/stacks/rpc-api/smart-contracts/interface.mdx +++ b/content/docs/stacks/rpc-api/smart-contracts/interface.mdx @@ -1,141 +1,11 @@ --- title: Get contract interface description: Retrieves a list of functions, variables, maps, fungible tokens and non-fungible tokens for a given smart contract. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get contract interface - -Get contract interface using a `contract_address` and `contract name` - -| Status code | Description | -| ----------- | ----------- | -| `200` | Contract interface | - - - - - - - - - - - - - -```terminal -$ curl -X GET "http://localhost:20443/v2/contracts/interface/%7Bcontract_address%7D/%7Bcontract_name%7D" -``` - - - - - -```js -fetch("http://localhost:20443/v2/contracts/interface/%7Bcontract_address%7D/%7Bcontract_name%7D", { - method: "GET" -}); -``` - - - - - - - - - -GET request to get contract interface - - - - - -```json -{ - "functions": [ - {} - ], - "variables": [ - {} - ], - "maps": [ - {} - ], - "fungible_tokens": [ - {} - ], - "non_fungible_tokens": [ - {} - ] -} -``` - - - - - -```ts -/** - * GET request to get contract interface - */ -export interface ContractInterfaceResponse { - /** - * List of defined methods - */ - functions: {}[]; - /** - * List of defined variables - */ - variables: {}[]; - /** - * List of defined data-maps - */ - maps: {}[]; - /** - * List of fungible tokens in the contract - */ - fungible_tokens: {}[]; - /** - * List of non-fungible tokens in the contract - */ - non_fungible_tokens: {}[]; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/smart-contracts/map-entry.mdx b/content/docs/stacks/rpc-api/smart-contracts/map-entry.mdx index 52a35dc6b..0e7367e27 100644 --- a/content/docs/stacks/rpc-api/smart-contracts/map-entry.mdx +++ b/content/docs/stacks/rpc-api/smart-contracts/map-entry.mdx @@ -1,165 +1,11 @@ --- title: Get contract map entry description: Retrieves a specific entry from a contract data map. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get specific data-map inside a contract - -Attempt to fetch data from a contract data map. The contract is identified with [Stacks Address] and [Contract Name] in the URL path. The map is identified with [Map Name]. - -The key to lookup in the map is supplied via the POST body. This should be supplied as the hex string serialization of the key (which should be a Clarity value). Note, this is a JSON string atom. - -In the response, `data` is the hex serialization of the map response. Note that map responses are Clarity option types, for non-existent values, this is a serialized none, and for all other responses, it is a serialized (some ...) object. - - -### Request Body - -Hex string serialization of the lookup key (which should be a Clarity value) - - - - - -### Path Parameters - - - -Stacks address - - - - - -Contract name - - - - - -Map name - - - -### Query Parameters - - - -Returns object without the proof field when set to 0 - - - - - -The Stacks chain tip to query from. If tip == latest, the query will be run from the latest known tip (includes unconfirmed state). - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Success | -| `400` | Failed loading data map | - - - - - - - - - - - - - -```terminal -$ curl -X POST "http://localhost:20443/v2/map_entry/string/string/string?proof=0&tip=string" \ - -d 'string' -``` - - - - - -```js -fetch("http://localhost:20443/v2/map_entry/string/string/string?proof=0&tip=string", { - method: "POST" -}); -``` - - - - - - - - - -Response of get data map entry request - - - - - -```json -{ - "data": "string", - "proof": "string" -} -``` - - - - - -```ts -/** - * Response of get data map entry request - */ -export interface MapEntryResponse { - /** - * Hex-encoded string of clarity value. It is always an optional tuple. - */ - data: string; - /** - * Hex-encoded string of the MARF proof for the data - */ - proof?: string; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/smart-contracts/read-only.mdx b/content/docs/stacks/rpc-api/smart-contracts/read-only.mdx index 70de2e41b..924633e46 100644 --- a/content/docs/stacks/rpc-api/smart-contracts/read-only.mdx +++ b/content/docs/stacks/rpc-api/smart-contracts/read-only.mdx @@ -1,166 +1,11 @@ --- title: Call read-only function description: Calls a read-only public function on a given smart contract. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Call read-only function - -Call a read-only public function on a given smart contract. - -The smart contract and function are specified using the URL path. The arguments and the simulated tx-sender are supplied via the POST body in the following JSON format: - - -### Request Body - -map of arguments and the simulated tx-sender where sender is either a Contract identifier or a normal Stacks address, and arguments is an array of hex serialized Clarity values. - - - -The simulated tx-sender - - - -"} required={true} deprecated={undefined}> - -An array of hex serialized Clarity values - - - -### Path Parameters - - - -Stacks address - - - - - -Contract name - - - - - -Function name - - - -### Query Parameters - - - -The Stacks chain tip to query from. If tip == latest, the query will be run from the latest known tip (includes unconfirmed state). - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X POST "http://localhost:20443/v2/contracts/call-read/string/string/string?tip=string" \ - -d '{ - "sender": "SP31DA6FTSJX2WGTZ69SFY11BH51NZMB0ZW97B5P0.get-info", - "arguments": [ - "0x0011...", - "0x00231..." - ] -}' -``` - - - - - -```js -fetch("http://localhost:20443/v2/contracts/call-read/string/string/string?tip=string", { - method: "POST" -}); -``` - - - - - - - - - -GET request to get contract source - - - - - -```json -{ - "okay": true, - "result": "string", - "cause": "string" -} -``` - - - - - -```ts -/** - * GET request to get contract source - */ -export interface ReadOnlyFunctionSuccessResponse { - okay: boolean; - result?: string; - cause?: string; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/smart-contracts/source.mdx b/content/docs/stacks/rpc-api/smart-contracts/source.mdx index 5b2906aaa..898a3202a 100644 --- a/content/docs/stacks/rpc-api/smart-contracts/source.mdx +++ b/content/docs/stacks/rpc-api/smart-contracts/source.mdx @@ -1,112 +1,11 @@ --- title: Get contract source description: Retrieves the Clarity source code of a given contract, along with the block height it was published in, and the MARF proof for the data. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get contract source - -Returns the Clarity source code of a given contract, along with the block height it was published in, and the MARF proof for the data - -| Status code | Description | -| ----------- | ----------- | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "http://localhost:20443/v2/contracts/source/%7Bcontract_address%7D/%7Bcontract_name%7D" -``` - - - - - -```js -fetch("http://localhost:20443/v2/contracts/source/%7Bcontract_address%7D/%7Bcontract_name%7D", { - method: "GET" -}); -``` - - - - - - - - - -GET request to get contract source - - - - - -```json -{ - "source": "string", - "publish_height": 0, - "proof": "string" -} -``` - - - - - -```ts -/** - * GET request to get contract source - */ -export interface ContractSourceResponse { - source: string; - publish_height: number; - proof: string; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/smart-contracts/traits.mdx b/content/docs/stacks/rpc-api/smart-contracts/traits.mdx index 4d8b9dd09..12943e2d4 100644 --- a/content/docs/stacks/rpc-api/smart-contracts/traits.mdx +++ b/content/docs/stacks/rpc-api/smart-contracts/traits.mdx @@ -1,108 +1,11 @@ --- title: Get trait implementation details description: Determine whether or not a specified trait is implemented (either explicitly or implicitly) within a given contract. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get trait implementation details - -Determine whether or not a specified trait is implemented (either explicitly or implicitly) within a given contract. - -| Status code | Description | -| ----------- | ----------- | -| `200` | Success | - - - - - - - - - - - - - -```terminal -$ curl -X GET "http://localhost:20443/v2/traits/%7Bcontract_address%7D/%7Bcontract_name%7D/%7Btrait_contract_address%7D/%7Btrait_contract_name%7D/%7Btrait_name%7D" -``` - - - - - -```js -fetch("http://localhost:20443/v2/traits/%7Bcontract_address%7D/%7Bcontract_name%7D/%7Btrait_contract_address%7D/%7Btrait_contract_name%7D/%7Btrait_name%7D", { - method: "GET" -}); -``` - - - - - - - - - -GET request to get trait implementation information - - - - - -```json -{ - "is_implemented": true -} -``` - - - - - -```ts -/** - * GET request to get trait implementation information - */ -export interface IsTraitImplementedSuccessResponse { - is_implemented: boolean; -} -``` - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/smart-contracts/variables.mdx b/content/docs/stacks/rpc-api/smart-contracts/variables.mdx deleted file mode 100644 index 5ce13db30..000000000 --- a/content/docs/stacks/rpc-api/smart-contracts/variables.mdx +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: Get data variable value -description: Get the value of a data variable inside a contract. -toc: false ---- - -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Get the value of a data variable inside a contract - -Attempt to vetch a data var from a contract. The contract is identified with [Stacks Address] and -[Contract Name] in the URL path. The variable is identified with [Var Name]. - -In the response, `data` is the hex serialization of the data variable value. - -### Path Parameters - - - -Stacks address - - - - - -Contract name - - - - - -Data variable name - - - -### Query Parameters - - - -When supplied `0`, will return the JSON object _without_ the `proof` field. - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Success | -| `400` | Failed to retrieve data variable value from contract | - - - - - - - - - - - - - -```terminal -$ curl -X GET "http://localhost:20443/v2/data_var/string/string/string" -``` - - - - - -```js -fetch("http://localhost:20443/v2/constant_val/string/string/string", { - method: "POST" -}); -``` - - - - - - - - - -Response of get constant val request - - - - - -```json -{ - "data": "string", - "proof": "string", -} -``` - - - - - -```ts -/** - * Response of get constant val request - */ -export interface ConstantValResponse { - /** - * Hex-encoded string of clarity value. - */ - data: string; - proof: string; -} -``` - - - - - - - - - - - - - - diff --git a/content/docs/stacks/rpc-api/transactions/broadcast-transaction.mdx b/content/docs/stacks/rpc-api/transactions/broadcast-transaction.mdx index 09a02725f..ea8d71c19 100644 --- a/content/docs/stacks/rpc-api/transactions/broadcast-transaction.mdx +++ b/content/docs/stacks/rpc-api/transactions/broadcast-transaction.mdx @@ -1,160 +1,11 @@ --- title: Broadcast transaction description: Broadcasts raw transactions on the network. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Broadcast raw transaction - -Broadcast raw transactions on the network. You can use the [@stacks/transactions](https://github.com/blockstack/stacks.js) project to generate a raw transaction payload. - -### Request Body (Optional) - - - -Format: `"binary"` - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Transaction id of successful post of a raw tx to the node's mempool | -| `400` | Rejections result in a 400 error | - - - - - - - - - - - - - -```terminal -$ curl -X POST "http://localhost:20443/v2/transactions" \ - -d 'string' -``` - - - - - -```js -fetch("http://localhost:20443/v2/transactions", { - method: "POST" -}); -``` - - - - - - - - - - - - - -```json -"e161978626f216b2141b156ade10501207ae535fa365a13ef5d7a7c9310a09f2" -``` - - - - - -```ts -export type Response = string; -``` - - - - - - - - - -GET request that returns transactions - - - - - -```json -{ - "error": "string", - "reason": "string", - "reason_data": {}, - "txid": "string" -} -``` - - - - - -```ts -/** - * GET request that returns transactions - */ -export interface PostCoreNodeTransactionsError { - /** - * The error - */ - error: string; - /** - * The reason for the error - */ - reason: string; - /** - * More details about the reason - */ - reason_data: {}; - /** - * The relevant transaction id - */ - txid: string; -} -``` - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/transactions/index.mdx b/content/docs/stacks/rpc-api/transactions/index.mdx index c6098a6e7..1ea12c484 100644 --- a/content/docs/stacks/rpc-api/transactions/index.mdx +++ b/content/docs/stacks/rpc-api/transactions/index.mdx @@ -1,6 +1,6 @@ --- title: Transactions index: true -toc: false +full: true description: Manage, retrieve, and broadcast transaction data on the blockchain. --- \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/v3/index.mdx b/content/docs/stacks/rpc-api/v3/index.mdx index f6c28b331..3e2510cc1 100644 --- a/content/docs/stacks/rpc-api/v3/index.mdx +++ b/content/docs/stacks/rpc-api/v3/index.mdx @@ -1,6 +1,6 @@ --- title: v3 index: true -toc: false +full: true description: Version 3 of the RPC API. --- \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/v3/nakamoto-block.mdx b/content/docs/stacks/rpc-api/v3/nakamoto-block.mdx index ac195c5a9..16a84c347 100644 --- a/content/docs/stacks/rpc-api/v3/nakamoto-block.mdx +++ b/content/docs/stacks/rpc-api/v3/nakamoto-block.mdx @@ -1,108 +1,11 @@ --- title: Get Nakamoto block description: Fetch a Nakamoto block by its index block hash. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Fetch a Nakamoto block - -Fetch a Nakamoto block by its index block hash. - -### Path Parameters - - - -The block's ID hash - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | The raw SIP-003-encoded block will be returned. | -| `404` | The block could not be found | - - - - - - - - - - - - - -```terminal -$ curl -X GET "http://localhost:20443/v3/blocks/string" -``` - - - - - -```js -fetch("http://localhost:20443/v3/blocks/string", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -"string" -``` - - - - - -```ts -export type Response = string; -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/v3/tenure-blocks.mdx b/content/docs/stacks/rpc-api/v3/tenure-blocks.mdx index edfeb621f..5698bcb07 100644 --- a/content/docs/stacks/rpc-api/v3/tenure-blocks.mdx +++ b/content/docs/stacks/rpc-api/v3/tenure-blocks.mdx @@ -1,99 +1,11 @@ --- title: Get Nakamoto tenure blocks description: Fetch a sequence of Nakamoto blocks in a tenure. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Fetch a sequence of Nakamoto blocks in a tenure - -Fetch a sequence of Nakamoto blocks in a tenure. The blocks will be served in order from highest to lowest. The blocks will be encoded in their SIP-003 wire format, and concatenated together. - -| Status code | Description | -| ----------- | ----------- | -| `200` | SIP-003-encoded Nakamoto blocks, concatenated together | - - - - - - - - - - - - - -```terminal -$ curl -X GET "http://localhost:20443/v3/tenures/%7Bblock_id%7D" -``` - - - - - -```js -fetch("http://localhost:20443/v3/tenures/%7Bblock_id%7D", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -"string" -``` - - - - - -```ts -export type Response = string; -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/rpc-api/v3/tenure-metadata.mdx b/content/docs/stacks/rpc-api/v3/tenure-metadata.mdx index 5eaf9d430..13a3de020 100644 --- a/content/docs/stacks/rpc-api/v3/tenure-metadata.mdx +++ b/content/docs/stacks/rpc-api/v3/tenure-metadata.mdx @@ -1,71 +1,11 @@ --- title: Get Nakamoto tenure metadata description: Fetch metadata about the ongoing Nakamoto tenure. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Fetch metadata about the ongoing Nakamoto tenure - -Fetch metadata about the ongoing Nakamoto tenure. This information is sufficient to obtain and authenticate the highest complete tenure, as well as obtain new tenure blocks. - -| Status code | Description | -| ----------- | ----------- | -| `200` | Metadata about the ongoing tenure | - - - - - - - - - - - - - -```terminal -$ curl -X GET "http://localhost:20443/v3/tenures/info" -``` - - - - - -```js -fetch("http://localhost:20443/v3/tenures/info", { - method: "GET" -}); -``` - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/signer-metrics-api/block-proposals/index.mdx b/content/docs/stacks/signer-metrics-api/block-proposals/index.mdx index 05677c64e..d0c95e1e7 100644 --- a/content/docs/stacks/signer-metrics-api/block-proposals/index.mdx +++ b/content/docs/stacks/signer-metrics-api/block-proposals/index.mdx @@ -1,6 +1,6 @@ --- title: Block proposals description: Get information about block proposals. -toc: false +full: true index: true --- \ No newline at end of file diff --git a/content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-a-block.mdx b/content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-a-block.mdx index b41ef1aa2..1b324e8bc 100644 --- a/content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-a-block.mdx +++ b/content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-a-block.mdx @@ -1,254 +1,11 @@ --- title: Signer information for a block description: Get signer information for a specific block. -toc: false +full: true --- -import { Root, API, APIInfo, APIExample, Responses, Response, ResponseTypes, ExampleResponse, TypeScriptResponse, Property, ObjectCollapsible, Requests, Request, APIPlayground } from "fumadocs-openapi/ui"; - - - - - - - -## Signer information for a block proposal - -Signer information for a block proposal - -### Query Parameters - - - -Number of results to return - -Default: `25` - -Minimum: `1` - -Maximum: `50` - - - - - -Number of results to skip - -Default: `0` - - - -### Path Parameters - - - -Block hash - -Pattern: `"^(0x)?[a-fA-F0-9]{64}$"` - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/signer-metrics/v1/block_proposals/string?limit=25&offset=0" -``` - - - - - -```js -fetch("https://api.hiro.so/signer-metrics/v1/block_proposals/string?limit=25&offset=0", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "received_at": "string", - "block_height": 0, - "block_hash": "string", - "index_block_hash": "string", - "burn_block_height": 0, - "block_time": 0, - "cycle_number": 0, - "status": "pending", - "push_time_ms": {}, - "total_signer_count": 0, - "total_signer_weight": 0, - "total_signer_stacked_amount": "string", - "accepted_count": 0, - "rejected_count": 0, - "missing_count": 0, - "accepted_weight": 0, - "rejected_weight": 0, - "missing_weight": 0, - "signer_data": [ - { - "signer_key": "string", - "slot_index": 0, - "response": "accepted", - "weight": 0, - "weight_percentage": 0, - "stacked_amount": "string", - "version": "string", - "received_at": "string", - "response_time_ms": 0, - "reason_string": "string", - "reason_code": "string", - "reject_code": "string" - } - ] -} -``` - - - - - -```ts -export interface Response { - /** - * ISO timestamp of when this block proposal was received - */ - received_at: string; - block_height: number; - block_hash: string; - index_block_hash: string; - burn_block_height: number; - /** - * Unix timestamp in seconds of when the block was mined - */ - block_time: number; - cycle_number: number; - /** - * Status of the block proposal - */ - status: "pending" | "accepted" | "rejected"; - /** - * Time duration (in milliseconds) taken between when the block was proposed and when it was pushed - */ - push_time_ms: null | number; - /** - * Total number of signers expected for this proposal - */ - total_signer_count: number; - /** - * Total voting weight of signers expected for this proposal - */ - total_signer_weight: number; - /** - * Total STX stacked of signers expected for this proposal - */ - total_signer_stacked_amount: string; - /** - * Number of signers that submitted an approval for this proposal - */ - accepted_count: number; - /** - * Number of signers that submitted a rejection for this proposal - */ - rejected_count: number; - /** - * Number of signers that failed to submit any response/vote for this proposal - */ - missing_count: number; - /** - * Sum of voting weight of signers who approved the proposal - */ - accepted_weight: number; - /** - * Sum of voting weight of signers who rejected the proposal - */ - rejected_weight: number; - /** - * Sum of voting weight of missing signers - */ - missing_weight: number; - signer_data: { - signer_key: string; - /** - * Index of the signer in the stacker set - */ - slot_index: number; - response: "accepted" | "rejected" | "missing"; - /** - * Voting weight of this signer (based on slots allocated which is proportional to stacked amount) - */ - weight: number; - /** - * Voting weight percent (weight / total_weight) - */ - weight_percentage: number; - /** - * Total STX stacked associated with this signer (string quoted integer) - */ - stacked_amount: string; - /** - * The signer binary version reported by this signer for this proposal response (null if response missing) - */ - version: string | null; - /** - * ISO timestamp of when this response was received (null if response missing - */ - received_at: string | null; - /** - * Time duration (in milliseconds) taken to submit this response (tracked best effort, null if response missing) - */ - response_time_ms: number | null; - /** - * (For rejection responses) reason string for rejection - */ - reason_string: string | null; - /** - * (For rejection responses) reason code for rejection - */ - reason_code: string | null; - /** - * (For rejection responses) reject code for rejection - */ - reject_code: string | null; - }[]; -} -``` - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals.mdx b/content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals.mdx index c9f715928..fe33307b3 100644 --- a/content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals.mdx +++ b/content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals.mdx @@ -1,254 +1,11 @@ --- title: Signer information for most recent block proposals description: Get signer information for most recent block proposals. -toc: false +full: true --- -import { Root, API, APIInfo, APIExample, Responses, Response, ResponseTypes, ExampleResponse, TypeScriptResponse, Property, ObjectCollapsible, Requests, Request, APIPlayground } from "fumadocs-openapi/ui"; - - - - - - - -## Signer information for most recent block proposals - -Signer information for most recent block proposals - -### Query Parameters - - - -Number of results to return - -Default: `25` - -Minimum: `1` - -Maximum: `50` - - - - - -Number of results to skip - -Default: `0` - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/signer-metrics/v1/block_proposals?limit=25&offset=0" -``` - - - - - -```js -fetch("https://api.hiro.so/signer-metrics/v1/block_proposals?limit=25&offset=0", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 0, - "offset": 0, - "results": [ - { - "received_at": "string", - "block_height": 0, - "block_hash": "string", - "index_block_hash": "string", - "burn_block_height": 0, - "block_time": 0, - "cycle_number": 0, - "status": "pending", - "push_time_ms": {}, - "total_signer_count": 0, - "total_signer_weight": 0, - "total_signer_stacked_amount": "string", - "accepted_count": 0, - "rejected_count": 0, - "missing_count": 0, - "accepted_weight": 0, - "rejected_weight": 0, - "missing_weight": 0, - "signer_data": [ - { - "signer_key": "string", - "slot_index": 0, - "response": "accepted", - "weight": 0, - "weight_percentage": 0, - "stacked_amount": "string", - "version": "string", - "received_at": "string", - "response_time_ms": 0, - "reason_string": "string", - "reason_code": "string", - "reject_code": "string" - } - ] - } - ] -} -``` - - - - - -```ts -export interface Response { - limit: number; - offset: number; - results: { - /** - * ISO timestamp of when this block proposal was received - */ - received_at: string; - block_height: number; - block_hash: string; - index_block_hash: string; - burn_block_height: number; - /** - * Unix timestamp in seconds of when the block was mined - */ - block_time: number; - cycle_number: number; - /** - * Status of the block proposal - */ - status: "pending" | "accepted" | "rejected"; - /** - * Time duration (in milliseconds) taken between when the block was proposed and when it was pushed - */ - push_time_ms: null | number; - /** - * Total number of signers expected for this proposal - */ - total_signer_count: number; - /** - * Total voting weight of signers expected for this proposal - */ - total_signer_weight: number; - /** - * Total STX stacked of signers expected for this proposal - */ - total_signer_stacked_amount: string; - /** - * Number of signers that submitted an approval for this proposal - */ - accepted_count: number; - /** - * Number of signers that submitted a rejection for this proposal - */ - rejected_count: number; - /** - * Number of signers that failed to submit any response/vote for this proposal - */ - missing_count: number; - /** - * Sum of voting weight of signers who approved the proposal - */ - accepted_weight: number; - /** - * Sum of voting weight of signers who rejected the proposal - */ - rejected_weight: number; - /** - * Sum of voting weight of missing signers - */ - missing_weight: number; - signer_data: { - signer_key: string; - /** - * Index of the signer in the stacker set - */ - slot_index: number; - response: "accepted" | "rejected" | "missing"; - /** - * Voting weight of this signer (based on slots allocated which is proportional to stacked amount) - */ - weight: number; - /** - * Voting weight percent (weight / total_weight) - */ - weight_percentage: number; - /** - * Total STX stacked associated with this signer (string quoted integer) - */ - stacked_amount: string; - /** - * The signer binary version reported by this signer for this proposal response (null if response missing) - */ - version: string | null; - /** - * ISO timestamp of when this response was received (null if response missing - */ - received_at: string | null; - /** - * Time duration (in milliseconds) taken to submit this response (tracked best effort, null if response missing) - */ - response_time_ms: number | null; - /** - * (For rejection responses) reason string for rejection - */ - reason_string: string | null; - /** - * (For rejection responses) reason code for rejection - */ - reason_code: string | null; - /** - * (For rejection responses) reject code for rejection - */ - reject_code: string | null; - }[]; - }[]; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block.mdx b/content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block.mdx index deee661f1..c8770988e 100644 --- a/content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block.mdx +++ b/content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block.mdx @@ -1,182 +1,11 @@ --- title: Aggregated signer information for a block description: Get aggregated signer information for a specific block. -toc: false +full: true --- -import { Root, API, APIInfo, APIExample, Responses, Response, ResponseTypes, ExampleResponse, TypeScriptResponse, Property, ObjectCollapsible, Requests, Request, APIPlayground } from "fumadocs-openapi/ui"; - - - - - - - -## Aggregated signer information for a block - -Aggregated signer information for a block - -### Path Parameters - - - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/signer-metrics/v1/blocks/latest" -``` - - - - - -```js -fetch("https://api.hiro.so/signer-metrics/v1/blocks/latest", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "block_height": 0, - "block_hash": "string", - "block_time": 0, - "index_block_hash": "string", - "burn_block_height": 0, - "tenure_height": 0, - "signer_data": { - "cycle_number": 0, - "total_signer_count": 0, - "accepted_count": 0, - "rejected_count": 0, - "missing_count": 0, - "accepted_excluded_count": 0, - "average_response_time_ms": 0, - "block_proposal_time_ms": 0, - "accepted_stacked_amount": "string", - "rejected_stacked_amount": "string", - "missing_stacked_amount": "string", - "accepted_weight": 0, - "rejected_weight": 0, - "missing_weight": 0 - } -} -``` - - - - - -```ts -export interface Response { - block_height: number; - block_hash: string; - /** - * Unix timestamp in seconds of when the block was mined - */ - block_time: number; - index_block_hash: string; - burn_block_height: number; - tenure_height: number; - /** - * Signer data can by null if it was not detected by the metrics service - */ - signer_data: { - cycle_number: number; - /** - * Total number of signers expected for this block - */ - total_signer_count: number; - /** - * Number of signers that submitted an approval for this block - */ - accepted_count: number; - /** - * Number of signers that submitted a rejection for this block - */ - rejected_count: number; - /** - * Number of signers that failed to submit any response/vote for this block - */ - missing_count: number; - /** - * Number of signers that submitted an approval but where not included in time by the miner (this is a subset of the accepted_count) - */ - accepted_excluded_count: number; - /** - * Average time duration (in milliseconds) taken by signers to submit a response for this block (tracked best effort) - */ - average_response_time_ms: number; - /** - * Unix timestamp in milliseconds of when the block was first proposed (tracked best effort) - */ - block_proposal_time_ms: number; - /** - * Sum of total STX stacked of signers who approved the block - */ - accepted_stacked_amount: string; - /** - * Sum of total STX stacked of signers who rejected the block - */ - rejected_stacked_amount: string; - /** - * Sum of total STX stacked of missing signers - */ - missing_stacked_amount: string; - /** - * Sum of voting weight of signers who approved the block (based on slots allocated to each signer proportional to stacked amount) - */ - accepted_weight: number; - /** - * Sum of voting weight of signers who rejected the block - */ - rejected_weight: number; - /** - * Sum of voting weight of missing signers - */ - missing_weight: number; - } | null; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks.mdx b/content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks.mdx index 697d6cfb8..8666e542d 100644 --- a/content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks.mdx +++ b/content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks.mdx @@ -1,206 +1,11 @@ --- title: Aggregated signer information for most recent blocks description: Get aggregated signer information for most recent blocks. -toc: false +full: true --- -import { Root, API, APIInfo, APIExample, Responses, Response, ResponseTypes, ExampleResponse, TypeScriptResponse, Property, ObjectCollapsible, Requests, Request, APIPlayground } from "fumadocs-openapi/ui"; - - - - - - - -## Aggregated signer information for most recent blocks - -Aggregated signer information for most recent blocks - -### Query Parameters - - - -Number of results to return - -Default: `100` - - - - - -Number of results to skip - -Default: `0` - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/signer-metrics/v1/blocks?limit=100&offset=0" -``` - - - - - -```js -fetch("https://api.hiro.so/signer-metrics/v1/blocks?limit=100&offset=0", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "total": 0, - "limit": 0, - "offset": 0, - "results": [ - { - "block_height": 0, - "block_hash": "string", - "block_time": 0, - "index_block_hash": "string", - "burn_block_height": 0, - "tenure_height": 0, - "signer_data": { - "cycle_number": 0, - "total_signer_count": 0, - "accepted_count": 0, - "rejected_count": 0, - "missing_count": 0, - "accepted_excluded_count": 0, - "average_response_time_ms": 0, - "block_proposal_time_ms": 0, - "accepted_stacked_amount": "string", - "rejected_stacked_amount": "string", - "missing_stacked_amount": "string", - "accepted_weight": 0, - "rejected_weight": 0, - "missing_weight": 0 - } - } - ] -} -``` - - - - - -```ts -export interface Response { - total: number; - limit: number; - offset: number; - results: { - block_height: number; - block_hash: string; - /** - * Unix timestamp in seconds of when the block was mined - */ - block_time: number; - index_block_hash: string; - burn_block_height: number; - tenure_height: number; - /** - * Signer data can by null if it was not detected by the metrics service - */ - signer_data: { - cycle_number: number; - /** - * Total number of signers expected for this block - */ - total_signer_count: number; - /** - * Number of signers that submitted an approval for this block - */ - accepted_count: number; - /** - * Number of signers that submitted a rejection for this block - */ - rejected_count: number; - /** - * Number of signers that failed to submit any response/vote for this block - */ - missing_count: number; - /** - * Number of signers that submitted an approval but where not included in time by the miner (this is a subset of the accepted_count) - */ - accepted_excluded_count: number; - /** - * Average time duration (in milliseconds) taken by signers to submit a response for this block (tracked best effort) - */ - average_response_time_ms: number; - /** - * Unix timestamp in milliseconds of when the block was first proposed (tracked best effort) - */ - block_proposal_time_ms: number; - /** - * Sum of total STX stacked of signers who approved the block - */ - accepted_stacked_amount: string; - /** - * Sum of total STX stacked of signers who rejected the block - */ - rejected_stacked_amount: string; - /** - * Sum of total STX stacked of missing signers - */ - missing_stacked_amount: string; - /** - * Sum of voting weight of signers who approved the block (based on slots allocated to each signer proportional to stacked amount) - */ - accepted_weight: number; - /** - * Sum of voting weight of signers who rejected the block - */ - rejected_weight: number; - /** - * Sum of voting weight of missing signers - */ - missing_weight: number; - } | null; - }[]; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/signer-metrics-api/blocks/index.mdx b/content/docs/stacks/signer-metrics-api/blocks/index.mdx index c11f8a6e3..56fa1e4d4 100644 --- a/content/docs/stacks/signer-metrics-api/blocks/index.mdx +++ b/content/docs/stacks/signer-metrics-api/blocks/index.mdx @@ -1,6 +1,6 @@ --- title: Blocks description: Get aggregated signer information for blocks. -toc: false +full: true index: true --- \ No newline at end of file diff --git a/content/docs/stacks/signer-metrics-api/info/index.mdx b/content/docs/stacks/signer-metrics-api/info/index.mdx index 7ab2124bf..c5f921e75 100644 --- a/content/docs/stacks/signer-metrics-api/info/index.mdx +++ b/content/docs/stacks/signer-metrics-api/info/index.mdx @@ -1,6 +1,6 @@ --- title: Info description: Service status endpoints -toc: false +full: true index: true --- \ No newline at end of file diff --git a/content/docs/stacks/signer-metrics-api/info/status.mdx b/content/docs/stacks/signer-metrics-api/info/status.mdx index fed7fbed3..72f24fcb4 100644 --- a/content/docs/stacks/signer-metrics-api/info/status.mdx +++ b/content/docs/stacks/signer-metrics-api/info/status.mdx @@ -1,97 +1,11 @@ --- title: API Status description: Displays the status of the API and its current workload. -toc: false +full: true --- -import { Root, API, APIInfo, APIExample, Responses, Response, ResponseTypes, ExampleResponse, TypeScriptResponse, Property, ObjectCollapsible, Requests, Request, APIPlayground } from "fumadocs-openapi/ui"; - - - - - - - -## API Status - -Displays the status of the API and its current workload - -| Status code | Description | -| ----------- | ----------- | -| `200` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/signer-metrics/" -``` - - - - - -```js -fetch("https://api.hiro.so/signer-metrics/", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "server_version": "signer-metrics-api v0.0.1 (master:a1b2c3)", - "status": "ready", - "chain_tip": { - "block_height": 163541 - } -} -``` - - - - - -```ts -export interface ApiStatusResponse { - server_version: string; - status: string; - chain_tip: { - block_height: number; - }; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/signer-metrics-api/prometheus/index.mdx b/content/docs/stacks/signer-metrics-api/prometheus/index.mdx index c47e7b6b9..fa2176e40 100644 --- a/content/docs/stacks/signer-metrics-api/prometheus/index.mdx +++ b/content/docs/stacks/signer-metrics-api/prometheus/index.mdx @@ -1,6 +1,6 @@ --- title: Prometheus Metrics description: Get Prometheus metrics for the Signer Metrics API. -toc: false +full: true index: true --- \ No newline at end of file diff --git a/content/docs/stacks/signer-metrics-api/prometheus/metrics.mdx b/content/docs/stacks/signer-metrics-api/prometheus/metrics.mdx index 08b5610b1..659dfa6cc 100644 --- a/content/docs/stacks/signer-metrics-api/prometheus/metrics.mdx +++ b/content/docs/stacks/signer-metrics-api/prometheus/metrics.mdx @@ -1,85 +1,11 @@ --- title: Prometheus Metrics description: Get Prometheus metrics for the Signer Metrics API. -toc: false +full: true --- -import { Root, API, APIInfo, APIExample, Responses, Response, ResponseTypes, ExampleResponse, TypeScriptResponse, Property, ObjectCollapsible, Requests, Request, APIPlayground } from "fumadocs-openapi/ui"; - - - - - - - -## API Signer Prometheus Metrics - -Retreives the Prometheus metrics signer and block proposal related data - -| Status code | Description | -| ----------- | ----------- | -| `200` | Prometheus metrics in plain text format | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/signer-metrics/metrics" -``` - - - - - -```js -fetch("https://api.hiro.so/signer-metrics/metrics", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -"string" -``` - - - - - -```ts -export type Response = string; -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/signer-metrics-api/signers/index.mdx b/content/docs/stacks/signer-metrics-api/signers/index.mdx index 40196a10d..e8ce390b9 100644 --- a/content/docs/stacks/signer-metrics-api/signers/index.mdx +++ b/content/docs/stacks/signer-metrics-api/signers/index.mdx @@ -1,6 +1,6 @@ --- title: Signers description: Get information about signers on the Stacks blockchain. -toc: false +full: true index: true --- \ No newline at end of file diff --git a/content/docs/stacks/signer-metrics-api/signers/pox-cycle-signer.mdx b/content/docs/stacks/signer-metrics-api/signers/pox-cycle-signer.mdx index c6a6d513f..a1c6e8a19 100644 --- a/content/docs/stacks/signer-metrics-api/signers/pox-cycle-signer.mdx +++ b/content/docs/stacks/signer-metrics-api/signers/pox-cycle-signer.mdx @@ -1,195 +1,11 @@ --- title: PoX Cycle Signer description: Get stats for a specific signer in a given PoX cycle. -toc: false +full: true --- -import { Root, API, APIInfo, APIExample, Responses, Response, ResponseTypes, ExampleResponse, TypeScriptResponse, Property, ObjectCollapsible, Requests, Request, APIPlayground } from "fumadocs-openapi/ui"; - - - - - - - -## PoX Cycle Signer - -Get stats for a specific signer in a given PoX cycle - -### Path Parameters - - - -PoX cycle number - - - - - -Signer public key (hex encoded) - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Default Response | -| `404` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/signer-metrics/v1/cycles/0/signers/string" -``` - - - - - -```js -fetch("https://api.hiro.so/signer-metrics/v1/cycles/0/signers/string", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "signer_key": "string", - "slot_index": 0, - "weight": 0, - "weight_percentage": 0, - "stacked_amount": "string", - "stacked_amount_percent": 0, - "stacked_amount_rank": 0, - "proposals_accepted_count": 0, - "proposals_rejected_count": 0, - "proposals_missed_count": 0, - "average_response_time_ms": 0, - "last_seen": "string", - "version": "string" -} -``` - - - - - -```ts -export interface Response { - signer_key: string; - /** - * Index of the signer in the stacker set - */ - slot_index: number; - /** - * Voting weight of this signer (based on slots allocated which is proportional to stacked amount) - */ - weight: number; - /** - * Voting weight percent (weight / total_weight) - */ - weight_percentage: number; - /** - * Total STX stacked associated with this signer (string quoted integer) - */ - stacked_amount: string; - /** - * Stacked amount percent (stacked_amount / total_stacked_amount) - */ - stacked_amount_percent: number; - /** - * This signer's rank in the list of all signers (for this cycle) ordered by stacked amount - */ - stacked_amount_rank: number; - /** - * Number of block proposals accepted by this signer - */ - proposals_accepted_count: number; - /** - * Number of block proposals rejected by this signer - */ - proposals_rejected_count: number; - /** - * Number of block proposals missed by this signer - */ - proposals_missed_count: number; - /** - * Time duration (in milliseconds) taken to submit responses to block proposals (tracked best effort) - */ - average_response_time_ms: number; - /** - * ISO timestamp of the last time a message from this signer was seen - */ - last_seen: string | null; - /** - * The last seen signer binary version reported by this signer - */ - version: string | null; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "string" -} -``` - - - - - -```ts -export interface Response { - /** - * Error message when signer is not found - */ - error: string; -} -``` - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/content/docs/stacks/signer-metrics-api/signers/pox-cycle-signers.mdx b/content/docs/stacks/signer-metrics-api/signers/pox-cycle-signers.mdx index deb45b1ae..ee62f1d6b 100644 --- a/content/docs/stacks/signer-metrics-api/signers/pox-cycle-signers.mdx +++ b/content/docs/stacks/signer-metrics-api/signers/pox-cycle-signers.mdx @@ -1,199 +1,11 @@ --- title: PoX Cycle Signers description: Get a list of signers in a given PoX cycle. -toc: false +full: true --- -import { Root, API, APIInfo, APIExample, Responses, Response, ResponseTypes, ExampleResponse, TypeScriptResponse, Property, ObjectCollapsible, Requests, Request, APIPlayground } from "fumadocs-openapi/ui"; - - - - - - - -## PoX Cycle Signers - -List of signers for a given PoX cycle - -### Query Parameters - - - -Start of time range (e.g., now-2h or ISO timestamp) - - - - - -End of time range (e.g., now or ISO timestamp) - - - - - -Number of results to return (default: 100) - -Default: `100` - - - - - -Number of results to skip (default: 0) - -Default: `0` - - - -### Path Parameters - - - -PoX cycle number - - - -| Status code | Description | -| ----------- | ----------- | -| `200` | Default Response | - - - - - - - - - - - - - -```bash -curl -X GET "https://api.hiro.so/signer-metrics/v1/cycles/0/signers?from=string&to=string&limit=100&offset=0" -``` - - - - - -```js -fetch("https://api.hiro.so/signer-metrics/v1/cycles/0/signers?from=string&to=string&limit=100&offset=0", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "total": 0, - "limit": 0, - "offset": 0, - "results": [ - { - "signer_key": "string", - "slot_index": 0, - "weight": 0, - "weight_percentage": 0, - "stacked_amount": "string", - "stacked_amount_percent": 0, - "stacked_amount_rank": 0, - "proposals_accepted_count": 0, - "proposals_rejected_count": 0, - "proposals_missed_count": 0, - "average_response_time_ms": 0, - "last_seen": "string", - "version": "string" - } - ] -} -``` - - - - - -```ts -export interface Response { - total: number; - limit: number; - offset: number; - results: { - signer_key: string; - /** - * Index of the signer in the stacker set - */ - slot_index: number; - /** - * Voting weight of this signer (based on slots allocated which is proportional to stacked amount) - */ - weight: number; - /** - * Voting weight percent (weight / total_weight) - */ - weight_percentage: number; - /** - * Total STX stacked associated with this signer (string quoted integer) - */ - stacked_amount: string; - /** - * Stacked amount percent (stacked_amount / total_stacked_amount) - */ - stacked_amount_percent: number; - /** - * This signer's rank in the list of all signers (for this cycle) ordered by stacked amount - */ - stacked_amount_rank: number; - /** - * Number of block proposals accepted by this signer - */ - proposals_accepted_count: number; - /** - * Number of block proposals rejected by this signer - */ - proposals_rejected_count: number; - /** - * Number of block proposals missed by this signer - */ - proposals_missed_count: number; - /** - * Time duration (in milliseconds) taken to submit responses to block proposals (tracked best effort) - */ - average_response_time_ms: number; - /** - * ISO timestamp of the last time a message from this signer was seen - */ - last_seen: string | null; - /** - * The last seen signer binary version reported by this signer - */ - version: string | null; - }[]; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/token-metadata-api/client/index.mdx b/content/docs/stacks/token-metadata-api/client/index.mdx index 79190e2b9..361b3790d 100644 --- a/content/docs/stacks/token-metadata-api/client/index.mdx +++ b/content/docs/stacks/token-metadata-api/client/index.mdx @@ -1,7 +1,7 @@ --- title: Overview description: Interact with the Stacks blockchain using a Javascript client library. -toc: false +full: true --- import { Accordion, Accordions } from "fumadocs-ui/components/accordion"; diff --git a/content/docs/stacks/token-metadata-api/client/tokens/get-ft-metadata.mdx b/content/docs/stacks/token-metadata-api/client/tokens/get-ft-metadata.mdx index f059f0b91..5781b29f3 100644 --- a/content/docs/stacks/token-metadata-api/client/tokens/get-ft-metadata.mdx +++ b/content/docs/stacks/token-metadata-api/client/tokens/get-ft-metadata.mdx @@ -1,17 +1,17 @@ --- title: Get Fungible Token Metadata description: Retrieves a list of all assets events associated with an account or a Contract Identifier. -toc: false +full: true --- -import { Root, API, APIExample } from '@/components/layout'; +import { Root, API, APIExample } from 'fumadocs-openapi/ui'; import { Property } from 'fumadocs-openapi/ui' import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Badge } from '@/components/ui/badge'; - + diff --git a/content/docs/stacks/token-metadata-api/client/tokens/index.mdx b/content/docs/stacks/token-metadata-api/client/tokens/index.mdx index 0022bb25f..ba8ed2a2b 100644 --- a/content/docs/stacks/token-metadata-api/client/tokens/index.mdx +++ b/content/docs/stacks/token-metadata-api/client/tokens/index.mdx @@ -1,6 +1,6 @@ --- title: Tokens index: true -toc: false +full: true description: Manage token metadata, including token IDs, token URIs, and token traits. --- \ No newline at end of file diff --git a/content/docs/stacks/token-metadata-api/info/index.mdx b/content/docs/stacks/token-metadata-api/info/index.mdx index b9ce3d011..5bf7b0e10 100644 --- a/content/docs/stacks/token-metadata-api/info/index.mdx +++ b/content/docs/stacks/token-metadata-api/info/index.mdx @@ -1,6 +1,6 @@ --- title: Info index: true -toc: false +full: true description: Retrieves information about the Token Metadata API, including the server version. --- diff --git a/content/docs/stacks/token-metadata-api/info/status.mdx b/content/docs/stacks/token-metadata-api/info/status.mdx index e8f8c9153..697b4a92f 100644 --- a/content/docs/stacks/token-metadata-api/info/status.mdx +++ b/content/docs/stacks/token-metadata-api/info/status.mdx @@ -1,140 +1,11 @@ --- title: Get status description: Retrieves information about the Token Metadata API, including the server version. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## API Status - -Displays the status of the API and its current workload - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/metadata/v1/" -``` - - - - - -```js -fetch("https://api.hiro.so/metadata/v1/", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "server_version": "token-metadata-api v0.0.1 (master:a1b2c3)", - "status": "ready", - "tokens": { - "ft": 512, - "nft": 493452, - "sft": 44 - }, - "token_contracts": { - "sip-009": 3101, - "sip-010": 512, - "sip-013": 11 - }, - "job_queue": { - "pending": 430562, - "queued": 512, - "done": 12532, - "failed": 11 - } -} -``` - - - - - -```ts -export interface ApiStatusResponse { - server_version: string; - status: string; - tokens?: ApiTokenCount; - token_contracts?: ApiTokenContractCount; - job_queue?: ApiJobCount; -} -export interface ApiTokenCount { - ft?: number; - nft?: number; - sft?: number; -} -export interface ApiTokenContractCount { - "sip-009"?: number; - "sip-010"?: number; - "sip-013"?: number; -} -export interface ApiJobCount { - pending?: number; - queued?: number; - done?: number; - failed?: number; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/token-metadata-api/tokens/fungible-token-metadata.mdx b/content/docs/stacks/token-metadata-api/tokens/fungible-token-metadata.mdx index 7096972b6..0f02fb7a5 100644 --- a/content/docs/stacks/token-metadata-api/tokens/fungible-token-metadata.mdx +++ b/content/docs/stacks/token-metadata-api/tokens/fungible-token-metadata.mdx @@ -1,281 +1,11 @@ --- title: Get fungible token metadata description: Retrieves metadata for a SIP-010 fungible token. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Fungible Token Metadata - -Retrieves metadata for a SIP-010 Fungible Token - -### Query Parameters - - - -Metadata localization to retrieve - - - -### Path Parameters - - - -Principal for the contract which owns the SIP-010 token - -Example: `"SP32XCD69XPS3GKDEXAQ29PJRDSD5AR643GNEEBXZ.fari-token"` - -Pattern: `"^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{28,41}\\.[a-zA-Z]([a-zA-Z0-9]|[-_]){0,39}$"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | -| `404` | Default Response | -| `422` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/metadata/v1/ft/SP32XCD69XPS3GKDEXAQ29PJRDSD5AR643GNEEBXZ.fari-token?locale=string" -``` - - - - - -```js -fetch("https://api.hiro.so/metadata/v1/ft/SP32XCD69XPS3GKDEXAQ29PJRDSD5AR643GNEEBXZ.fari-token?locale=string", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "name": "Wrapped USD", - "symbol": "xUSD", - "decimals": 8, - "total_supply": "9999980000000", - "token_uri": "ipfs://ipfs/Qmf9yDYuPTrp8NRUFf8xxDd5Ud24Dx9uYMwMn8o8G2cWPW/12200.json", - "description": "Heavy hitters, all-stars and legends of the game join forces to create a collection of unique varsity jackets", - "image_uri": "https://ipfs.io/ipfs/QmZMqhh2ztwuZ3Y8PyEp2z5auyH3TCm3nnr5ZfjjgDjd5q/12199.png", - "image_thumbnail_uri": "https://ipfs.io/ipfs/QmZMqhh2ztwuZ3Y8PyEp2z5auyH3TCm3nnr5ZfjjgDjd5q/12199.png", - "image_canonical_uri": "ipfs://ipfs/QmZMqhh2ztwuZ3Y8PyEp2z5auyH3TCm3nnr5ZfjjgDjd5q/12199.png", - "tx_id": "0x5642ca7d68976b6b2a2055689d9a57de26d67f0dd8b016d1b0d94cb634454cdd", - "sender_address": "SPZA22A4D15RKH5G8XDGQ7BPC20Q5JNMH0VQKSR6", - "asset_identifier": "SPZA22A4D15RKH5G8XDGQ7BPC20Q5JNMH0VQKSR6.token-ststx-earn-v1::stSTXearn", - "metadata": { - "sip": 16, - "name": "Satoshi's Team #12200", - "description": "Heavy hitters, all-stars and legends of the game join forces to create a collection of unique varsity jackets", - "image": "ipfs://ipfs/QmZMqhh2ztwuZ3Y8PyEp2z5auyH3TCm3nnr5ZfjjgDjd5q/12199.png", - "cached_image": "https://ipfs.io/ipfs/QmZMqhh2ztwuZ3Y8PyEp2z5auyH3TCm3nnr5ZfjjgDjd5q/12199.png", - "cached_thumbnail_image": "https://ipfs.io/ipfs/QmZMqhh2ztwuZ3Y8PyEp2z5auyH3TCm3nnr5ZfjjgDjd5q/12199.png", - "attributes": [ - { - "trait_type": "Background", - "display_type": "string", - "value": "value" - } - ], - "properties": { - "collection": "Foo Collection", - "total_supply": "10000" - }, - "localization": { - "uri": "http://token.com/metadata?hl={locale}", - "default": "en", - "locales": [ - "en", - "jp" - ] - } - } -} -``` - - - - - -```ts -export interface FtMetadataResponse { - name?: string; - symbol?: string; - decimals?: number; - total_supply?: string; - token_uri?: string; - description?: string; - image_uri?: string; - image_thumbnail_uri?: string; - image_canonical_uri?: string; - tx_id: string; - sender_address: string; - asset_identifier: string; - metadata?: Metadata; -} -export interface Metadata { - sip: number; - name?: string; - description?: string; - image?: string; - cached_image?: string; - cached_thumbnail_image?: string; - attributes?: MetadataAttribute[]; - properties?: MetadataProperties; - localization?: MetadataLocalization; -} -export interface MetadataAttribute { - trait_type: string; - display_type?: string; - value: MetadataValue; -} -export interface MetadataValue { - [k: string]: unknown; -} -export interface MetadataProperties { - [k: string]: MetadataValue1; -} -export interface MetadataValue1 { - [k: string]: unknown; -} -export interface MetadataLocalization { - uri: string; - default: string; - locales: string[]; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Token not found" -} -``` - - - - - -```ts -export type NotFoundErrorResponse = TokenNotFoundResponse | ContractNotFoundResponse; - -export interface TokenNotFoundResponse { - error: "Token not found"; -} -export interface ContractNotFoundResponse { - error: "Contract not found"; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Token metadata fetch in progress" -} -``` - - - - - -```ts -export type ErrorResponse = - | TokenMetadataFetchInProgressResponse - | LocaleNotFoundResponse - | InvalidTokenContractResponse - | InvalidTokenMetadataResponse; - -export interface TokenMetadataFetchInProgressResponse { - error: "Token metadata fetch in progress"; -} -export interface LocaleNotFoundResponse { - error: "Locale not found"; -} -export interface InvalidTokenContractResponse { - error: "Token contract is invalid or does not conform to its token standard"; -} -export interface InvalidTokenMetadataResponse { - error: "Token metadata is unreachable or does not conform to SIP-016"; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/token-metadata-api/tokens/fungible-tokens.mdx b/content/docs/stacks/token-metadata-api/tokens/fungible-tokens.mdx index 70f803879..33adde668 100644 --- a/content/docs/stacks/token-metadata-api/tokens/fungible-tokens.mdx +++ b/content/docs/stacks/token-metadata-api/tokens/fungible-tokens.mdx @@ -1,188 +1,11 @@ --- title: Get fungible tokens description: Retrieves information about fungible tokens. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Fungible Tokens - -Retrieves a list of Fungible Tokens - -### Query Parameters - - - - - - - - - - - -Stacks Address - -Example: `"SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9"` - -Pattern: `"^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{28,41}"` - - - - - -Result offset - -Minimum: `0` - - - - - -Results per page - -Minimum: `1` - -Maximum: `60` - - - - - -Parameter to order results by - - - - - -Results order - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/metadata/v1/ft?name=string&symbol=string&address=SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9&offset=0&limit=1&order_by=name&order=asc" -``` - - - - - -```js -fetch("https://api.hiro.so/metadata/v1/ft?name=string&symbol=string&address=SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9&offset=0&limit=1&order_by=name&order=asc", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "limit": 20, - "offset": 0, - "total": 1, - "results": [ - { - "name": "Wrapped USD", - "symbol": "xUSD", - "decimals": 8, - "total_supply": "9999980000000", - "token_uri": "ipfs://ipfs/Qmf9yDYuPTrp8NRUFf8xxDd5Ud24Dx9uYMwMn8o8G2cWPW/12200.json", - "description": "Heavy hitters, all-stars and legends of the game join forces to create a collection of unique varsity jackets", - "image_uri": "https://ipfs.io/ipfs/QmZMqhh2ztwuZ3Y8PyEp2z5auyH3TCm3nnr5ZfjjgDjd5q/12199.png", - "image_thumbnail_uri": "https://ipfs.io/ipfs/QmZMqhh2ztwuZ3Y8PyEp2z5auyH3TCm3nnr5ZfjjgDjd5q/12199.png", - "image_canonical_uri": "ipfs://ipfs/QmZMqhh2ztwuZ3Y8PyEp2z5auyH3TCm3nnr5ZfjjgDjd5q/12199.png", - "tx_id": "0xef2ac1126e16f46843228b1dk4830e19eb7599129e4jf392cab9e65ae83a45c0", - "sender_address": "ST399W7Z9WS0GMSNQGJGME5JAENKN56D65VGMGKGA", - "contract_principal": "SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2" - } - ] -} -``` - - - - - -```ts -export interface PaginatedFtBasicMetadataResponse { - limit: number; - offset: number; - total: number; - results: FtBasicMetadataResponse[]; -} -export interface FtBasicMetadataResponse { - name?: string; - symbol?: string; - decimals?: number; - total_supply?: string; - token_uri?: string; - description?: string; - image_uri?: string; - image_thumbnail_uri?: string; - image_canonical_uri?: string; - tx_id: string; - sender_address: string; - contract_principal: string; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/token-metadata-api/tokens/index.mdx b/content/docs/stacks/token-metadata-api/tokens/index.mdx index 99b64292a..bd12ca078 100644 --- a/content/docs/stacks/token-metadata-api/tokens/index.mdx +++ b/content/docs/stacks/token-metadata-api/tokens/index.mdx @@ -1,7 +1,7 @@ --- title: Tokens index: true -toc: false +full: true description: Retrieves information about tokens on the Stacks blockchain. --- diff --git a/content/docs/stacks/token-metadata-api/tokens/non-fungible-token-metadata.mdx b/content/docs/stacks/token-metadata-api/tokens/non-fungible-token-metadata.mdx index 4089ca51d..fd5181e78 100644 --- a/content/docs/stacks/token-metadata-api/tokens/non-fungible-token-metadata.mdx +++ b/content/docs/stacks/token-metadata-api/tokens/non-fungible-token-metadata.mdx @@ -1,267 +1,11 @@ --- title: Get non-fungible token metadata description: Retrieves metadata for a SIP-009 non-fungible token. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Non-Fungible Token Metadata - -Retrieves metadata for a SIP-009 Non-Fungible Token - -### Query Parameters - - - -Metadata localization to retrieve - - - -### Path Parameters - - - -SIP-009 compliant smart contract principal - -Example: `"SP497E7RX3233ATBS2AB9G4WTHB63X5PBSP5VGAQ.boomboxes-cycle-12"` - -Pattern: `"^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{28,41}\\.[a-zA-Z]([a-zA-Z0-9]|[-_]){0,39}$"` - - - - - -Token ID to retrieve - -Example: `"35"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | -| `404` | Default Response | -| `422` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/metadata/v1/nft/SP497E7RX3233ATBS2AB9G4WTHB63X5PBSP5VGAQ.boomboxes-cycle-12/35?locale=string" -``` - - - - - -```js -fetch("https://api.hiro.so/metadata/v1/nft/SP497E7RX3233ATBS2AB9G4WTHB63X5PBSP5VGAQ.boomboxes-cycle-12/35?locale=string", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "token_uri": "ipfs://ipfs/Qmf9yDYuPTrp8NRUFf8xxDd5Ud24Dx9uYMwMn8o8G2cWPW/12200.json", - "metadata": { - "sip": 16, - "name": "Satoshi's Team #12200", - "description": "Heavy hitters, all-stars and legends of the game join forces to create a collection of unique varsity jackets", - "image": "ipfs://ipfs/QmZMqhh2ztwuZ3Y8PyEp2z5auyH3TCm3nnr5ZfjjgDjd5q/12199.png", - "cached_image": "https://ipfs.io/ipfs/QmZMqhh2ztwuZ3Y8PyEp2z5auyH3TCm3nnr5ZfjjgDjd5q/12199.png", - "cached_thumbnail_image": "https://ipfs.io/ipfs/QmZMqhh2ztwuZ3Y8PyEp2z5auyH3TCm3nnr5ZfjjgDjd5q/12199.png", - "attributes": [ - { - "trait_type": "Background", - "display_type": "string", - "value": "value" - } - ], - "properties": { - "collection": "Foo Collection", - "total_supply": "10000" - }, - "localization": { - "uri": "http://token.com/metadata?hl={locale}", - "default": "en", - "locales": [ - "en", - "jp" - ] - } - } -} -``` - - - - - -```ts -export interface NftMetadataResponse { - token_uri?: string; - metadata?: Metadata; -} -export interface Metadata { - sip: number; - name?: string; - description?: string; - image?: string; - cached_image?: string; - cached_thumbnail_image?: string; - attributes?: MetadataAttribute[]; - properties?: MetadataProperties; - localization?: MetadataLocalization; -} -export interface MetadataAttribute { - trait_type: string; - display_type?: string; - value: MetadataValue; -} -export interface MetadataValue { - [k: string]: unknown; -} -export interface MetadataProperties { - [k: string]: MetadataValue1; -} -export interface MetadataValue1 { - [k: string]: unknown; -} -export interface MetadataLocalization { - uri: string; - default: string; - locales: string[]; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Token not found" -} -``` - - - - - -```ts -export type NotFoundErrorResponse = TokenNotFoundResponse | ContractNotFoundResponse; - -export interface TokenNotFoundResponse { - error: "Token not found"; -} -export interface ContractNotFoundResponse { - error: "Contract not found"; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Token metadata fetch in progress" -} -``` - - - - - -```ts -export type ErrorResponse = - | TokenMetadataFetchInProgressResponse - | LocaleNotFoundResponse - | InvalidTokenContractResponse - | InvalidTokenMetadataResponse; - -export interface TokenMetadataFetchInProgressResponse { - error: "Token metadata fetch in progress"; -} -export interface LocaleNotFoundResponse { - error: "Locale not found"; -} -export interface InvalidTokenContractResponse { - error: "Token contract is invalid or does not conform to its token standard"; -} -export interface InvalidTokenMetadataResponse { - error: "Token metadata is unreachable or does not conform to SIP-016"; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/content/docs/stacks/token-metadata-api/tokens/semi-fungible-token-metadata.mdx b/content/docs/stacks/token-metadata-api/tokens/semi-fungible-token-metadata.mdx index 0016d1d1c..8b5893646 100644 --- a/content/docs/stacks/token-metadata-api/tokens/semi-fungible-token-metadata.mdx +++ b/content/docs/stacks/token-metadata-api/tokens/semi-fungible-token-metadata.mdx @@ -1,271 +1,11 @@ --- title: Get semi-fungible token metadata description: Retrieves information about semi-fungible tokens. -toc: false +full: true --- -import { - API, - APIExample, - APIInfo, - APIPlayground, - ExampleResponse, - Property, - Request, - Requests, - Response, - Responses, - ResponseTypes, - Root, - TypeScriptResponse -} from 'fumadocs-openapi/ui'; - - - - - - - -## Semi-Fungible Token Metadata - -Retrieves metadata for a SIP-013 Semi-Fungible Token - -### Query Parameters - - - -Metadata localization to retrieve - - - -### Path Parameters - - - -SIP-013 compliant smart contract principal - -Example: `"SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.key-alex-autoalex-v1"` - -Pattern: `"^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{28,41}\\.[a-zA-Z]([a-zA-Z0-9]|[-_]){0,39}$"` - - - - - -Token ID to retrieve - -Example: `"35"` - - - -| Status code | Description | -| :------ | :------ | -| `200` | Default Response | -| `404` | Default Response | -| `422` | Default Response | - - - - - - - - - - - - - -```terminal -$ curl -X GET "https://api.hiro.so/metadata/v1/sft/SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.key-alex-autoalex-v1/35?locale=string" -``` - - - - - -```js -fetch("https://api.hiro.so/metadata/v1/sft/SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.key-alex-autoalex-v1/35?locale=string", { - method: "GET" -}); -``` - - - - - - - - - - - - - -```json -{ - "token_uri": "ipfs://ipfs/Qmf9yDYuPTrp8NRUFf8xxDd5Ud24Dx9uYMwMn8o8G2cWPW/12200.json", - "decimals": 6, - "total_supply": "250", - "metadata": { - "sip": 16, - "name": "Satoshi's Team #12200", - "description": "Heavy hitters, all-stars and legends of the game join forces to create a collection of unique varsity jackets", - "image": "ipfs://ipfs/QmZMqhh2ztwuZ3Y8PyEp2z5auyH3TCm3nnr5ZfjjgDjd5q/12199.png", - "cached_image": "https://ipfs.io/ipfs/QmZMqhh2ztwuZ3Y8PyEp2z5auyH3TCm3nnr5ZfjjgDjd5q/12199.png", - "cached_thumbnail_image": "https://ipfs.io/ipfs/QmZMqhh2ztwuZ3Y8PyEp2z5auyH3TCm3nnr5ZfjjgDjd5q/12199.png", - "attributes": [ - { - "trait_type": "Background", - "display_type": "string", - "value": "value" - } - ], - "properties": { - "collection": "Foo Collection", - "total_supply": "10000" - }, - "localization": { - "uri": "http://token.com/metadata?hl={locale}", - "default": "en", - "locales": [ - "en", - "jp" - ] - } - } -} -``` - - - - - -```ts -export interface SftMetadataResponse { - token_uri?: string; - decimals?: number; - total_supply?: string; - metadata?: Metadata; -} -export interface Metadata { - sip: number; - name?: string; - description?: string; - image?: string; - cached_image?: string; - cached_thumbnail_image?: string; - attributes?: MetadataAttribute[]; - properties?: MetadataProperties; - localization?: MetadataLocalization; -} -export interface MetadataAttribute { - trait_type: string; - display_type?: string; - value: MetadataValue; -} -export interface MetadataValue { - [k: string]: unknown; -} -export interface MetadataProperties { - [k: string]: MetadataValue1; -} -export interface MetadataValue1 { - [k: string]: unknown; -} -export interface MetadataLocalization { - uri: string; - default: string; - locales: string[]; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Token not found" -} -``` - - - - - -```ts -export type NotFoundErrorResponse = TokenNotFoundResponse | ContractNotFoundResponse; - -export interface TokenNotFoundResponse { - error: "Token not found"; -} -export interface ContractNotFoundResponse { - error: "Contract not found"; -} -``` - - - - - - - - - - - - - -```json -{ - "error": "Token metadata fetch in progress" -} -``` - - - - - -```ts -export type ErrorResponse = - | TokenMetadataFetchInProgressResponse - | LocaleNotFoundResponse - | InvalidTokenContractResponse - | InvalidTokenMetadataResponse; - -export interface TokenMetadataFetchInProgressResponse { - error: "Token metadata fetch in progress"; -} -export interface LocaleNotFoundResponse { - error: "Locale not found"; -} -export interface InvalidTokenContractResponse { - error: "Token contract is invalid or does not conform to its token standard"; -} -export interface InvalidTokenMetadataResponse { - error: "Token metadata is unreachable or does not conform to SIP-016"; -} -``` - - - - - - - - - - - - - - + \ No newline at end of file From 20784ebbd54ea7b00cf12b1cf75869ab5a75c2d1 Mon Sep 17 00:00:00 2001 From: Ryan Waits Date: Wed, 30 Apr 2025 11:50:07 -0500 Subject: [PATCH 02/21] rename utils -> lib --- {utils => lib}/all-guides.json | 0 lib/hooks/use-is-mobile.tsx | 21 +++ lib/hooks/use-keyboard-shortcuts.tsx | 75 ++++++++ lib/hooks/use-search.tsx | 51 ++++++ lib/is-active.ts | 10 ++ {utils => lib}/loader.ts | 4 +- {utils => lib}/metadata.ts | 0 {utils => lib}/modes.ts | 2 - lib/openapi.ts | 29 +++ lib/source.ts | 255 +++++++++++++++++++++++++++ utils/data.ts | 30 ---- utils/source.ts | 81 --------- 12 files changed, 443 insertions(+), 115 deletions(-) rename {utils => lib}/all-guides.json (100%) create mode 100644 lib/hooks/use-is-mobile.tsx create mode 100644 lib/hooks/use-keyboard-shortcuts.tsx create mode 100644 lib/hooks/use-search.tsx create mode 100644 lib/is-active.ts rename {utils => lib}/loader.ts (96%) rename {utils => lib}/metadata.ts (100%) rename {utils => lib}/modes.ts (74%) create mode 100644 lib/openapi.ts create mode 100644 lib/source.ts delete mode 100644 utils/data.ts delete mode 100644 utils/source.ts diff --git a/utils/all-guides.json b/lib/all-guides.json similarity index 100% rename from utils/all-guides.json rename to lib/all-guides.json diff --git a/lib/hooks/use-is-mobile.tsx b/lib/hooks/use-is-mobile.tsx new file mode 100644 index 000000000..48fab93c0 --- /dev/null +++ b/lib/hooks/use-is-mobile.tsx @@ -0,0 +1,21 @@ +import * as React from "react"; + +const MOBILE_BREAKPOINT = 768; + +export function useIsMobile() { + const [isMobile, setIsMobile] = React.useState( + undefined + ); + + React.useEffect(() => { + const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`); + const onChange = () => { + setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); + }; + mql.addEventListener("change", onChange); + setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); + return () => mql.removeEventListener("change", onChange); + }, []); + + return !!isMobile; +} diff --git a/lib/hooks/use-keyboard-shortcuts.tsx b/lib/hooks/use-keyboard-shortcuts.tsx new file mode 100644 index 000000000..0c39dc3ce --- /dev/null +++ b/lib/hooks/use-keyboard-shortcuts.tsx @@ -0,0 +1,75 @@ +"use client"; + +import * as React from "react"; + +interface ShortcutHandler { + key: string; + callback: () => void; + metaKey?: boolean; + ctrlKey?: boolean; + preventDefault?: boolean; +} + +interface KeyboardShortcutsProviderProps { + children: React.ReactNode; +} + +const KeyboardShortcutsContext = React.createContext<{ + registerShortcut: (shortcut: ShortcutHandler) => () => void; +} | null>(null); + +export function KeyboardShortcutsProvider({ + children, +}: KeyboardShortcutsProviderProps) { + const shortcutsRef = React.useRef([]); + + React.useEffect(() => { + const handler = (e: KeyboardEvent) => { + // Ignore if user is typing in an input + if ( + e.target instanceof HTMLElement && + (e.target.isContentEditable || + e.target instanceof HTMLInputElement || + e.target instanceof HTMLTextAreaElement || + e.target instanceof HTMLSelectElement) + ) + return; + + shortcutsRef.current.forEach((shortcut) => { + if ( + e.key.toLowerCase() === shortcut.key.toLowerCase() && + (!shortcut.metaKey || e.metaKey) && + (!shortcut.ctrlKey || e.ctrlKey) + ) { + if (shortcut.preventDefault) e.preventDefault(); + shortcut.callback(); + } + }); + }; + + document.addEventListener("keydown", handler); + return () => document.removeEventListener("keydown", handler); + }, []); + + const registerShortcut = React.useCallback((shortcut: ShortcutHandler) => { + shortcutsRef.current.push(shortcut); + return () => { + shortcutsRef.current = shortcutsRef.current.filter((s) => s !== shortcut); + }; + }, []); + + return ( + + {children} + + ); +} + +export function useKeyboardShortcuts() { + const context = React.useContext(KeyboardShortcutsContext); + if (!context) + throw new Error( + "useKeyboardShortcuts must be used within KeyboardShortcutsProvider" + ); + return context; +} diff --git a/lib/hooks/use-search.tsx b/lib/hooks/use-search.tsx new file mode 100644 index 000000000..624c26a42 --- /dev/null +++ b/lib/hooks/use-search.tsx @@ -0,0 +1,51 @@ +"use client"; + +import * as React from "react"; + +interface SearchContextType { + open: boolean; + setOpen: (open: boolean) => void; +} + +const SearchContext = React.createContext( + undefined +); + +export function SearchProvider({ children }: { children: React.ReactNode }) { + const [open, setOpen] = React.useState(false); + + // Handle ⌘K shortcut + React.useEffect(() => { + const down = (e: KeyboardEvent) => { + if ((e.key === "k" && (e.metaKey || e.ctrlKey)) || e.key === "/") { + if ( + (e.target instanceof HTMLElement && e.target.isContentEditable) || + e.target instanceof HTMLInputElement || + e.target instanceof HTMLTextAreaElement || + e.target instanceof HTMLSelectElement + ) { + return; + } + e.preventDefault(); + setOpen((open) => !open); + } + }; + + document.addEventListener("keydown", down); + return () => document.removeEventListener("keydown", down); + }, []); + + return ( + + {children} + + ); +} + +export function useSearch() { + const context = React.useContext(SearchContext); + if (context === undefined) { + throw new Error("useSearch must be used within a SearchProvider"); + } + return context; +} diff --git a/lib/is-active.ts b/lib/is-active.ts new file mode 100644 index 000000000..ba6f3f2c5 --- /dev/null +++ b/lib/is-active.ts @@ -0,0 +1,10 @@ +export function isActive( + url: string, + pathname: string, + nested = true, +): boolean { + if (url.endsWith('/')) url = url.slice(0, -1); + if (pathname.endsWith('/')) pathname = pathname.slice(0, -1); + + return url === pathname || (nested && pathname.startsWith(`${url}/`)); +} diff --git a/utils/loader.ts b/lib/loader.ts similarity index 96% rename from utils/loader.ts rename to lib/loader.ts index bca6df695..1ca649521 100644 --- a/utils/loader.ts +++ b/lib/loader.ts @@ -1,11 +1,11 @@ import fs from "fs/promises"; import matter from "gray-matter"; import path from "path"; -import { Recipe } from "@/types/recipes"; +import { Recipe } from "@/types"; function extractCodeAndContent(content: string) { // Match code blocks with their language - const codeBlockRegex = /```(\w+)\n([\s\S]*?)```/; + const codeBlockRegex = /```(\w+)\r?\n([\s\S]*?)```/; const match = content.match(codeBlockRegex); if (!match) { diff --git a/utils/metadata.ts b/lib/metadata.ts similarity index 100% rename from utils/metadata.ts rename to lib/metadata.ts diff --git a/utils/modes.ts b/lib/modes.ts similarity index 74% rename from utils/modes.ts rename to lib/modes.ts index 763401239..29e77e143 100644 --- a/utils/modes.ts +++ b/lib/modes.ts @@ -1,5 +1,3 @@ -/* eslint-disable import/no-relative-packages -- required */ -import { LayoutIcon, LibraryIcon, type LucideIcon } from "lucide-react"; import { StacksIcon, BitcoinIcon } from "@/components/ui/icon"; export interface Mode { diff --git a/lib/openapi.ts b/lib/openapi.ts new file mode 100644 index 000000000..cb5b8eb47 --- /dev/null +++ b/lib/openapi.ts @@ -0,0 +1,29 @@ +import SwaggerParser from "@apidevtools/swagger-parser"; +import * as fs from "fs/promises"; + +async function generateOpenAPI() { + const url = + "https://raw.githubusercontent.com/stacks-network/stacks-core/master/docs/rpc/openapi.yaml"; + + try { + // Validate the OpenAPI spec (optional but recommended) + // await SwaggerParser.validate(url); + // console.log("OpenAPI spec is valid."); + + // Dereference the spec, resolving all $ref pointers + const api = await SwaggerParser.dereference(url); + + // Convert to JSON with pretty formatting + const json = JSON.stringify(api, null, 2); + + // Save to a file (adjust the path as needed) + await fs.writeFile("./openapi/stacks-node-rpc-api.json", json); + console.log("OpenAPI JSON generated successfully."); + } catch (err) { + console.error("Error generating OpenAPI JSON:", err); + process.exit(1); // Exit with error code to signal CI failure + } +} + +// Run the function +generateOpenAPI(); diff --git a/lib/source.ts b/lib/source.ts new file mode 100644 index 000000000..37771f37a --- /dev/null +++ b/lib/source.ts @@ -0,0 +1,255 @@ +import { docs } from "@/.source"; +import { loader } from "fumadocs-core/source"; +import { createOpenAPI } from "fumadocs-openapi/server"; +import type { ThemeRegistrationResolved } from "shiki"; +import { icons as lucideIcons } from "lucide-react"; +import { + API, + BitcoinIcon, + Clarity, + create, + Hiro, + StacksIcon, +} from "@/components/ui/icon"; + +const customIcons = { + API, + BitcoinIcon, + Clarity, + StacksIcon, + Hiro, +}; + +const icons = { ...lucideIcons, ...customIcons } as any; + +export function icon(iconName: string) { + if (iconName in icons) { + return create({ icon: icons[iconName as keyof typeof icons] }); + } +} + +// Create the Sequoia Monochrome theme +const sequoiaMonochromeTheme: ThemeRegistrationResolved = { + name: "sequoia-monochrome", + displayName: "Sequoia Monochrome", + type: "dark", + fg: "#868690", + bg: "#0F1014", + settings: [ + { + settings: { + foreground: "#868690", + background: "#0F1014", + }, + }, + { + scope: ["comment"], + settings: { + foreground: "#43444D", + fontStyle: "italic", + }, + }, + { + scope: ["constant"], + settings: { + foreground: "#626983", + }, + }, + { + scope: [ + "constant.numeric", + "constant.language", + "constant.charcter.escape", + ], + settings: { + foreground: "#B6BAC8", + }, + }, + { + scope: ["entity.name"], + settings: { + foreground: "#B6BAC8", + }, + }, + { + scope: [ + "entity.name.section", + "entity.name.tag", + "entity.name.namespace", + "entity.name.type", + ], + settings: { + foreground: "#7C829D", + }, + }, + { + scope: ["entity.other.attribute-name", "entity.other.inherited-class"], + settings: { + foreground: "#E2E4ED", + fontStyle: "italic", + }, + }, + { + scope: ["invalid"], + settings: { + foreground: "#999EB2", + }, + }, + { + scope: ["invalid.deprecated"], + settings: { + foreground: "#575861", + }, + }, + { + scope: ["keyword"], + settings: { + foreground: "#626983", + }, + }, + { + scope: ["meta.tag", "meta.brace"], + settings: { + foreground: "#868690", + }, + }, + { + scope: ["meta.import", "meta.export"], + settings: { + foreground: "#626983", + }, + }, + { + scope: ["punctuation"], + settings: { + foreground: "#575861", + }, + }, + { + scope: ["punctuation.accessor"], + settings: { + foreground: "#626983", + }, + }, + { + scope: ["punctuation.definition.string"], + settings: { + foreground: "#D3D5DE", + }, + }, + { + scope: ["storage.type", "storage.modifier"], + settings: { + foreground: "#626983", + }, + }, + { + scope: ["string"], + settings: { + foreground: "#D3D5DE", + }, + }, + { + scope: ["support"], + settings: { + foreground: "#7C829D", + }, + }, + { + scope: ["support.constant"], + settings: { + foreground: "#D3D5DE", + }, + }, + { + scope: ["support.function"], + settings: { + foreground: "#999EB2", + fontStyle: "italic", + }, + }, + { + scope: ["variable"], + settings: { + foreground: "#B6BAC8", + fontStyle: "italic", + }, + }, + { + scope: [ + "variable.other", + "variable.language", + "variable.function", + "variable.argument", + ], + settings: { + foreground: "#868690", + }, + }, + { + scope: ["variable.parameter"], + settings: { + foreground: "#E2E4ED", + }, + }, + ], + colors: { + "editor.background": "#0F1014", + "editor.foreground": "#868690", + "editorCursor.foreground": "#7C829D", + "editorIndentGuide.background": "#817c9c4d", + "editorIndentGuide.activeBackground": "#43444D", + "editor.lineHighlightBackground": "#817c9c14", + "editor.selectionBackground": "#817c9c26", + "editorBracketMatch.border": "#575861", + "editorError.foreground": "#999EB2", + "editorWarning.foreground": "#D3D5DE", + "editorInfo.foreground": "#7C829D", + "editorHint.foreground": "#575861", + }, +}; + +// Create a light version of the theme +const sequoiaMonochromeThemeLight: ThemeRegistrationResolved = { + ...sequoiaMonochromeTheme, + name: "sequoia-monochrome-light", + displayName: "Sequoia Monochrome Light", + type: "light", + fg: "#333333", + bg: "#FFFFFF", + settings: [ + { + settings: { + foreground: "#333333", + background: "#FFFFFF", + }, + }, + ...sequoiaMonochromeTheme.settings.slice(1), + ], + colors: { + ...sequoiaMonochromeTheme.colors, + "editor.background": "#FFFFFF", + "editor.foreground": "#333333", + }, +}; + +// `loader()` also assign a URL to your pages +// See https://fumadocs.vercel.app/docs/headless/source-api for more info +export const source = loader({ + baseUrl: "/", + source: docs.toFumadocsSource(), + icon(icon) { + if (icon && icon in icons) + return create({ icon: icons[icon as keyof typeof icons] }); + }, +}); + +export const openapi = createOpenAPI({ + // proxyUrl: "https://api.hiro.so", + shikiOptions: { + themes: { + dark: sequoiaMonochromeTheme, + light: sequoiaMonochromeThemeLight, + }, + }, +}); diff --git a/utils/data.ts b/utils/data.ts deleted file mode 100644 index bc582e2fe..000000000 --- a/utils/data.ts +++ /dev/null @@ -1,30 +0,0 @@ -export const guides = [ - { - title: "How to use your API Key with Stacks.js", - description: - "Learn the steps to integrate your API key with Stacks.js for seamless application development.", - tags: ["stacks.js", "api keys"], - createdAt: new Date().toLocaleDateString(), - }, - { - title: "Common Clarity Errors", - description: - "Identify and resolve the most frequent errors encountered while coding with Clarity.", - tags: ["smart contracts"], - createdAt: new Date().toLocaleDateString(), - }, - { - title: "How to get sBTC testnet tokens", - description: - "A guide on acquiring sBTC tokens on the testnet to help you test your applications on Stacks.", - tags: ["sbtc"], - createdAt: new Date().toLocaleDateString(), - }, - { - title: "Validate off-chain price feeds with Pyth", - description: - "Ensure the accuracy of your off-chain price feeds by integrating with the Pyth network.", - tags: ["oracles"], - createdAt: new Date().toLocaleDateString(), - }, -]; diff --git a/utils/source.ts b/utils/source.ts deleted file mode 100644 index 044156810..000000000 --- a/utils/source.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { writeFileSync } from "node:fs"; -import path from "node:path"; -import { createMDXSource, defaultSchemas } from "fumadocs-mdx"; -import type { StructuredData } from "fumadocs-core/mdx-plugins"; -import { PHASE_PRODUCTION_BUILD } from "next/constants"; -import { z } from "zod"; -import type { InferMetaType, InferPageType } from "fumadocs-core/source"; -import { loader } from "fumadocs-core/source"; -import { icons as lucideIcons } from "lucide-react"; -import type { LucideIcon } from "lucide-react"; -import { map } from "@/.map"; -import { create } from "@/components/ui/icon"; -import { StacksIcon, BitcoinIcon } from "@/components/ui/icon"; - -const customIcons = { - StacksIcon, - BitcoinIcon, -}; - -const icons = { ...lucideIcons, ...customIcons } as any; - -export function icon(iconName: string) { - if (iconName in icons) { - return create({ icon: icons[iconName as keyof typeof icons] }); - } -} - -const frontmatterSchema = defaultSchemas.frontmatter.extend({ - preview: z.string().optional() as any, - toc: z.boolean().default(true) as any, - index: z.boolean().default(false) as any, -}); - -export const utils = loader({ - baseUrl: "/", - rootDir: "docs", - icon(icon) { - if (icon in icons) - return create({ icon: icons[icon as keyof typeof icons] }); - }, - source: createMDXSource(map, { schema: { frontmatter: frontmatterSchema } }), -}); - -export type Page = InferPageType; -export type Meta = InferMetaType; - -export interface Index { - id: string; - title: string; - description?: string; - url: string; - structuredData: StructuredData; -} - -// Access and export MDX pages data to json file -// So that we can update search indexes after the build -const g = globalThis as unknown as { - __NEXT_DOCS_INDEX_UPDATED?: boolean; -}; - -if ( - process.env.NEXT_PHASE === PHASE_PRODUCTION_BUILD && - !g.__NEXT_DOCS_INDEX_UPDATED -) { - const mapPath = path.resolve("./.next/_map_indexes.json"); - const indexes: Index[] = utils.files.flatMap((file) => { - if (file.type !== "page") return []; - - return { - id: file.url, - title: file.data.title, - description: file.data.description, - url: file.url, - structuredData: file.data.exports.structuredData, - }; - }); - - writeFileSync(mapPath, JSON.stringify(indexes)); - - g.__NEXT_DOCS_INDEX_UPDATED = true; -} From 885177f3161344d239520ee8ad04ef85ac61ac5a Mon Sep 17 00:00:00 2001 From: Ryan Waits Date: Wed, 30 Apr 2025 11:50:30 -0500 Subject: [PATCH 03/21] update ui components --- components/ui/alert.tsx | 1 + components/ui/badge.tsx | 2 +- components/ui/banner.tsx | 4 +- components/ui/button.tsx | 37 +++---- components/ui/calendar.tsx | 72 -------------- components/ui/card.tsx | 2 +- components/ui/carousel.tsx | 154 +++++++++++++++--------------- components/ui/collapsible.tsx | 32 ++++++- components/ui/command.tsx | 19 ++-- components/ui/dialog.tsx | 9 +- components/ui/dropdown-menu.tsx | 4 +- components/ui/icon.tsx | 69 +++++++++---- components/ui/kbd.tsx | 22 +++++ components/ui/navigation-menu.tsx | 128 +++++++++++++++++++++++++ components/ui/popover.tsx | 13 +-- components/ui/scroll-area.tsx | 53 +++++----- components/ui/sidebar.tsx | 8 +- 17 files changed, 390 insertions(+), 239 deletions(-) delete mode 100644 components/ui/calendar.tsx create mode 100644 components/ui/kbd.tsx create mode 100644 components/ui/navigation-menu.tsx diff --git a/components/ui/alert.tsx b/components/ui/alert.tsx index 89d5e16d7..feabee0a0 100644 --- a/components/ui/alert.tsx +++ b/components/ui/alert.tsx @@ -1,3 +1,4 @@ +import React, { JSX } from "react"; import { AlertCircleIcon } from "lucide-react"; import type { HTMLAttributes } from "react"; import { cn } from "@/lib/utils"; diff --git a/components/ui/badge.tsx b/components/ui/badge.tsx index e4284916e..20a645704 100644 --- a/components/ui/badge.tsx +++ b/components/ui/badge.tsx @@ -4,7 +4,7 @@ import { cva, type VariantProps } from "class-variance-authority"; import { cn } from "@/lib/utils"; const badgeVariants = cva( - "inline-flex items-center rounded-full border px-3 py-1 text-xs font-semibold font-aeonikFono transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 group-data-[state=active]:bg-inverted group-data-[state=active]:text-background", + "inline-flex items-center rounded-lg border px-2 py-1 text-xs font-regular font-aeonik-fono transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 group-data-[state=active]:bg-inverted group-data-[state=active]:text-background", { variants: { variant: { diff --git a/components/ui/banner.tsx b/components/ui/banner.tsx index 1a697af2c..bfaf061b8 100644 --- a/components/ui/banner.tsx +++ b/components/ui/banner.tsx @@ -74,7 +74,7 @@ export function Banner({ id={id} {...props} className={cn( - "relative flex h-12 flex-row items-center justify-center bg-[#ff7733] px-4 text-center text-sm text-[#141312] font-medium font-aeonikFono", + "relative flex h-12 flex-row items-center justify-center bg-[#ff7733] px-4 text-center text-sm text-[#141312] font-medium font-aeonik-fono", !open && "hidden", props.className )} @@ -105,7 +105,7 @@ export function Banner({ - ) -}) -CarouselPrevious.displayName = "CarouselPrevious" + ); +}); +CarouselPrevious.displayName = "CarouselPrevious"; const CarouselNext = React.forwardRef< HTMLButtonElement, React.ComponentProps ->(({ className, variant = "outline", size = "icon", ...props }, ref) => { - const { orientation, scrollNext, canScrollNext } = useCarousel() +>(({ className, size = "icon", ...props }, ref) => { + const { orientation, scrollNext, canScrollNext } = useCarousel(); return ( - ) -}) -CarouselNext.displayName = "CarouselNext" + ); +}); +CarouselNext.displayName = "CarouselNext"; export { type CarouselApi, @@ -258,4 +256,4 @@ export { CarouselItem, CarouselPrevious, CarouselNext, -} +}; diff --git a/components/ui/collapsible.tsx b/components/ui/collapsible.tsx index cb003d175..695733e70 100644 --- a/components/ui/collapsible.tsx +++ b/components/ui/collapsible.tsx @@ -1,11 +1,39 @@ "use client"; - import * as CollapsiblePrimitive from "@radix-ui/react-collapsible"; +import { forwardRef, useEffect, useState } from "react"; +import { cn } from "@/lib/utils"; const Collapsible = CollapsiblePrimitive.Root; const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger; -const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent; +const CollapsibleContent = forwardRef< + HTMLDivElement, + React.ComponentPropsWithoutRef +>(({ children, ...props }, ref) => { + const [mounted, setMounted] = useState(false); + + useEffect(() => { + setMounted(true); + }, []); + + return ( + + {children} + + ); +}); + +CollapsibleContent.displayName = + CollapsiblePrimitive.CollapsibleContent.displayName; export { Collapsible, CollapsibleTrigger, CollapsibleContent }; diff --git a/components/ui/command.tsx b/components/ui/command.tsx index 012c90c9f..e3aa4fdfa 100644 --- a/components/ui/command.tsx +++ b/components/ui/command.tsx @@ -2,11 +2,11 @@ import * as React from "react"; import { type DialogProps } from "@radix-ui/react-dialog"; -import { MagnetIcon } from "lucide-react"; import { Command as CommandPrimitive } from "cmdk"; import { cn } from "@/lib/utils"; -import { Dialog, DialogContent } from "@/components/ui/dialog"; +import { Dialog, DialogContent, DialogTitle } from "@/components/ui/dialog"; +import { SearchIcon } from "lucide-react"; const Command = React.forwardRef< React.ElementRef, @@ -28,7 +28,8 @@ interface CommandDialogProps extends DialogProps {} const CommandDialog = ({ children, ...props }: CommandDialogProps) => { return ( - + Search + {children} @@ -41,11 +42,17 @@ const CommandInput = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( -
+
+ {children} - + {/* + Esc + */} Close diff --git a/components/ui/dropdown-menu.tsx b/components/ui/dropdown-menu.tsx index 9b152bc5c..f0ef9e04c 100644 --- a/components/ui/dropdown-menu.tsx +++ b/components/ui/dropdown-menu.tsx @@ -65,7 +65,7 @@ const DropdownMenuContent = React.forwardRef< ref={ref} sideOffset={sideOffset} className={cn( - "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", + "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-background p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", className )} {...props} @@ -83,7 +83,7 @@ const DropdownMenuItem = React.forwardRef< +
{Icon ? : }
); @@ -20,6 +18,50 @@ type IconProps = { style?: React.CSSProperties; }; +export function ClaudeIcon({ + size = 24, + color = "currentColor", + className, + style, +}: IconProps): JSX.Element { + return ( + + + + ); +} + +export function OpenAIIcon({ + size = 24, + color = "currentColor", + className, + style, +}: IconProps): JSX.Element { + return ( + + + + ); +} + export function StacksIcon({ size = 24, color = "currentColor", @@ -3745,22 +3787,13 @@ export function Clarity(props: SVGProps): JSX.Element { width="20" height="20" viewBox="0 0 91.49 91.49" - fill="none" + fill="currentColor" xmlns="http://www.w3.org/2000/svg" {...props} > - - - + + + ); } diff --git a/components/ui/kbd.tsx b/components/ui/kbd.tsx new file mode 100644 index 000000000..3ea787dd4 --- /dev/null +++ b/components/ui/kbd.tsx @@ -0,0 +1,22 @@ +import * as React from "react"; + +import { cn } from "@/lib/utils"; + +const Kbd = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + return ( +
+ ); +}); +Kbd.displayName = "Kbd"; + +export { Kbd }; diff --git a/components/ui/navigation-menu.tsx b/components/ui/navigation-menu.tsx new file mode 100644 index 000000000..fcc4b7ca2 --- /dev/null +++ b/components/ui/navigation-menu.tsx @@ -0,0 +1,128 @@ +import * as React from "react"; +import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu"; +import { cva } from "class-variance-authority"; +import { ChevronDown } from "lucide-react"; + +import { cn } from "@/lib/utils"; + +const NavigationMenu = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + {children} + + +)); +NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName; + +const NavigationMenuList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName; + +const NavigationMenuItem = NavigationMenuPrimitive.Item; + +const navigationMenuTriggerStyle = cva( + "group inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[state=open]:text-accent-foreground data-[state=open]:bg-accent/50 data-[state=open]:hover:bg-accent data-[state=open]:focus:bg-accent" +); + +const NavigationMenuTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + {children}{" "} + +)); +NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName; + +const NavigationMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName; + +const NavigationMenuLink = NavigationMenuPrimitive.Link; + +const NavigationMenuViewport = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
+ +
+)); +NavigationMenuViewport.displayName = + NavigationMenuPrimitive.Viewport.displayName; + +const NavigationMenuIndicator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +
+ +)); +NavigationMenuIndicator.displayName = + NavigationMenuPrimitive.Indicator.displayName; + +export { + navigationMenuTriggerStyle, + NavigationMenu, + NavigationMenuList, + NavigationMenuItem, + NavigationMenuContent, + NavigationMenuTrigger, + NavigationMenuLink, + NavigationMenuIndicator, + NavigationMenuViewport, +}; diff --git a/components/ui/popover.tsx b/components/ui/popover.tsx index 3d437e6aa..b7c44b56a 100644 --- a/components/ui/popover.tsx +++ b/components/ui/popover.tsx @@ -1,8 +1,6 @@ "use client"; - -import * as React from "react"; import * as PopoverPrimitive from "@radix-ui/react-popover"; - +import * as React from "react"; import { cn } from "@/lib/utils"; const Popover = PopoverPrimitive.Root; @@ -10,7 +8,7 @@ const Popover = PopoverPrimitive.Root; const PopoverTrigger = PopoverPrimitive.Trigger; const PopoverContent = React.forwardRef< - React.ElementRef, + React.ComponentRef, React.ComponentPropsWithoutRef >(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( @@ -18,8 +16,9 @@ const PopoverContent = React.forwardRef< ref={ref} align={align} sideOffset={sideOffset} + side="bottom" className={cn( - "z-50 w-72 font-aeonikFono rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", + "z-50 min-w-[220px] max-w-[98vw] rounded-lg border bg-fd-popover p-2 text-sm text-fd-popover-foreground shadow-lg focus-visible:outline-none data-[state=closed]:animate-fd-popover-out data-[state=open]:animate-fd-popover-in", className )} {...props} @@ -28,4 +27,6 @@ const PopoverContent = React.forwardRef< )); PopoverContent.displayName = PopoverPrimitive.Content.displayName; -export { Popover, PopoverTrigger, PopoverContent }; +const PopoverClose = PopoverPrimitive.PopoverClose; + +export { Popover, PopoverTrigger, PopoverContent, PopoverClose }; diff --git a/components/ui/scroll-area.tsx b/components/ui/scroll-area.tsx index 32cf968d2..cde128f68 100644 --- a/components/ui/scroll-area.tsx +++ b/components/ui/scroll-area.tsx @@ -1,48 +1,57 @@ -"use client"; - -import * as React from "react"; import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"; - +import * as React from "react"; import { cn } from "@/lib/utils"; const ScrollArea = React.forwardRef< - React.ElementRef, + React.ComponentRef, React.ComponentPropsWithoutRef >(({ className, children, ...props }, ref) => ( - - {children} - - + {children} + )); + ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName; +const ScrollViewport = React.forwardRef< + React.ComponentRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + {children} + +)); + +ScrollViewport.displayName = ScrollAreaPrimitive.Viewport.displayName; + const ScrollBar = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef + React.ComponentRef, + React.ComponentPropsWithoutRef >(({ className, orientation = "vertical", ...props }, ref) => ( - - - + + )); -ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName; +ScrollBar.displayName = ScrollAreaPrimitive.Scrollbar.displayName; -export { ScrollArea, ScrollBar }; +export { ScrollArea, ScrollBar, ScrollViewport }; diff --git a/components/ui/sidebar.tsx b/components/ui/sidebar.tsx index acd5d3eee..a36694dc1 100644 --- a/components/ui/sidebar.tsx +++ b/components/ui/sidebar.tsx @@ -5,7 +5,7 @@ import { Slot } from "@radix-ui/react-slot"; import { VariantProps, cva } from "class-variance-authority"; import { PanelLeft } from "lucide-react"; -import { useIsMobile } from "@/hooks/use-mobile"; +import { useIsMobile } from "@/lib/hooks/use-is-mobile"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; @@ -269,9 +269,11 @@ const SidebarTrigger = React.forwardRef< + + {cta} + +
diff --git a/components/card copy.tsx b/components/card copy.tsx new file mode 100644 index 000000000..ef561a8e3 --- /dev/null +++ b/components/card copy.tsx @@ -0,0 +1,169 @@ +import Link, { type LinkProps } from "fumadocs-core/link"; +import type { HTMLAttributes, ReactNode } from "react"; +import { cn } from "@/lib/utils"; + +import { Badge } from "@/components/ui/badge"; + +export function Cards( + props: HTMLAttributes +): React.ReactElement { + return ( +
+ {props.children} +
+ ); +} + +export type CardProps = { + icon?: ReactNode; + title: string; + description: string; + innerClassName?: string; +} & Omit; + +export function Card({ + icon, + title, + description, + ...props +}: CardProps): React.ReactElement { + return ( + +
+ {icon ? ( +
+ {icon} +
+ ) : null} +
+

{title}

+

{description}

+
+
+ + ); +} + +export type FeatureCardProps = { + title: string; + description: string; + image?: string; +} & Omit; + +export function FeatureCard({ + title, + description, + image, + ...props +}: FeatureCardProps): React.ReactElement { + return ( + +
+ arrow-right +
+

{title}

+

{description}

+ + ); +} + +export type SecondaryCardProps = { + icon?: ReactNode; + title: string; + description: string; + tag: string; +} & Omit; + +export function SecondaryCard({ + icon, + title, + description, + tag, + ...props +}: SecondaryCardProps): React.ReactElement { + return ( + + {icon ? ( +
+
+ {icon} +
+ + {tag} + +
+ ) : null} +

{title}

+

{description}

+ + ); +} + +export type SmallCardProps = { + icon: ReactNode; + title: string; + description: string; +} & Omit; + +export function SmallCard({ + icon, + title, + description, + ...props +}: CardProps): React.ReactElement { + return ( + +
+ {icon && ( +
+ {icon} +
+ )} +
+

+ {title} +

+

{description}

+
+
+ + ); +} diff --git a/components/code/connect-wallet-button.tsx b/components/code/connect-wallet-button.tsx index 14b1d3674..5826ed9a4 100644 --- a/components/code/connect-wallet-button.tsx +++ b/components/code/connect-wallet-button.tsx @@ -10,9 +10,8 @@ export const ConnectWalletButton: React.FC = () => { async function authenticate() { try { - const response = await connect(); + await connect(); setIsSignedIn(true); - console.log(response); } catch (error) { console.error("Authentication failed:", error); setIsSignedIn(false); diff --git a/components/command-menu.tsx b/components/command-menu.tsx new file mode 100644 index 000000000..2829d0362 --- /dev/null +++ b/components/command-menu.tsx @@ -0,0 +1,126 @@ +"use client"; + +import * as React from "react"; +import { useRouter } from "next/navigation"; +import { type DialogProps } from "@radix-ui/react-dialog"; +import { Circle, File, Laptop, Moon, Sun } from "lucide-react"; +import { useTheme } from "next-themes"; + +import { docsConfig } from "@/app/config/docs"; +import { cn } from "@/lib/utils"; +import { Button } from "@/components/ui/button"; +import { + CommandDialog, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, + CommandSeparator, +} from "@/components/ui/command"; + +export function CommandMenu({ ...props }: DialogProps) { + const router = useRouter(); + const [open, setOpen] = React.useState(false); + const { setTheme } = useTheme(); + + React.useEffect(() => { + const down = (e: KeyboardEvent) => { + if ((e.key === "k" && (e.metaKey || e.ctrlKey)) || e.key === "/") { + if ( + (e.target instanceof HTMLElement && e.target.isContentEditable) || + e.target instanceof HTMLInputElement || + e.target instanceof HTMLTextAreaElement || + e.target instanceof HTMLSelectElement + ) { + return; + } + + e.preventDefault(); + setOpen((open) => !open); + } + }; + + document.addEventListener("keydown", down); + return () => document.removeEventListener("keydown", down); + }, []); + + const runCommand = React.useCallback((command: () => unknown) => { + setOpen(false); + command(); + }, []); + + return ( + <> + + + + + No results found. + + {docsConfig.mainNav + .filter((navitem) => !navitem.external) + .map((navItem) => ( + { + runCommand(() => router.push(navItem.href as string)); + }} + > + + {navItem.title} + + ))} + + {docsConfig.sidebarNav.map((group) => ( + + {group.items.map((navItem) => ( + { + runCommand(() => router.push(navItem.href as string)); + }} + > +
+ +
+ {navItem.title} +
+ ))} +
+ ))} + + + runCommand(() => setTheme("light"))}> + + Light + + runCommand(() => setTheme("dark"))}> + + Dark + + runCommand(() => setTheme("system"))}> + + System + + +
+
+ + ); +} diff --git a/components/components-sidebar-05.tsx b/components/components-sidebar-05.tsx deleted file mode 100644 index 042623855..000000000 --- a/components/components-sidebar-05.tsx +++ /dev/null @@ -1,285 +0,0 @@ -'use client' - -import { GalleryVerticalEnd, Minus, Plus, Search } from "lucide-react" - -import { - Breadcrumb, - BreadcrumbItem, - BreadcrumbLink, - BreadcrumbList, - BreadcrumbPage, - BreadcrumbSeparator, -} from "@/components/ui/breadcrumb" -import { - Collapsible, - CollapsibleContent, - CollapsibleTrigger, -} from "@/components/ui/collapsible" -import { Label } from "@/components/ui/label" -import { Separator } from "@/components/ui/separator" -import { - Sidebar, - SidebarContent, - SidebarGroup, - SidebarGroupContent, - SidebarHeader, - SidebarInput, - SidebarInset, - SidebarMenu, - SidebarMenuButton, - SidebarMenuItem, - SidebarMenuSub, - SidebarMenuSubButton, - SidebarMenuSubItem, - SidebarProvider, - SidebarRail, - SidebarTrigger, -} from "@/components/ui/sidebar" -// This is sample data. -const data = { - navMain: [ - { - title: "Getting Started", - url: "#", - items: [ - { - title: "Installation", - url: "#", - }, - { - title: "Project Structure", - url: "#", - }, - ], - }, - { - title: "Building Your Application", - url: "#", - items: [ - { - title: "Routing", - url: "#", - }, - { - title: "Data Fetching", - url: "#", - isActive: true, - }, - { - title: "Rendering", - url: "#", - }, - { - title: "Caching", - url: "#", - }, - { - title: "Styling", - url: "#", - }, - { - title: "Optimizing", - url: "#", - }, - { - title: "Configuring", - url: "#", - }, - { - title: "Testing", - url: "#", - }, - { - title: "Authentication", - url: "#", - }, - { - title: "Deploying", - url: "#", - }, - { - title: "Upgrading", - url: "#", - }, - { - title: "Examples", - url: "#", - }, - ], - }, - { - title: "API Reference", - url: "#", - items: [ - { - title: "Components", - url: "#", - }, - { - title: "File Conventions", - url: "#", - }, - { - title: "Functions", - url: "#", - }, - { - title: "next.config.js Options", - url: "#", - }, - { - title: "CLI", - url: "#", - }, - { - title: "Edge Runtime", - url: "#", - }, - ], - }, - { - title: "Architecture", - url: "#", - items: [ - { - title: "Accessibility", - url: "#", - }, - { - title: "Fast Refresh", - url: "#", - }, - { - title: "Next.js Compiler", - url: "#", - }, - { - title: "Supported Browsers", - url: "#", - }, - { - title: "Turbopack", - url: "#", - }, - ], - }, - { - title: "Community", - url: "#", - items: [ - { - title: "Contribution Guide", - url: "#", - }, - ], - }, - ], -} - -export function Sidebar_05() { - return ( - - - - - - - -
- -
-
- Documentation - v1.0.0 -
-
-
-
-
-
- - - - - - - -
-
- - - - {data.navMain.map((item, index) => ( - - - - - {item.title}{" "} - - - - - {item.items?.length ? ( - - - {item.items.map((item) => ( - - - {item.title} - - - ))} - - - ) : null} - - - ))} - - - - -
- -
- - - - - - - Building Your Application - - - - - Data Fetching - - - -
-
-
-
-
-
-
-
-
- - - ) -} diff --git a/components/dialog.tsx b/components/dialog.tsx deleted file mode 100644 index 314c69d63..000000000 --- a/components/dialog.tsx +++ /dev/null @@ -1,79 +0,0 @@ -"use client"; - -import React from "react"; -import { - Dialog as BaseDialog, - DialogContent, - DialogTrigger, -} from "@/components/ui/dialog"; -import { Button } from "@/components/ui/button"; -import { Maximize2, Minimize2, X } from "lucide-react"; -import { cn } from "@/lib/utils"; - -interface FullscreenDialogProps { - isOpen: boolean; - onClose: () => void; - title: string; - children: React.ReactNode; -} - -export function Dialog({ - isOpen, - onClose, - title, - children, -}: FullscreenDialogProps) { - const [isFullscreen, setIsFullscreen] = React.useState(false); - - const toggleFullscreen = () => { - setIsFullscreen(!isFullscreen); - }; - - return ( - - - - - -
-

{title}

-
- - -
-
-
- {children} -
-
-
- ); -} diff --git a/components/docs.client.tsx b/components/docs.client.tsx new file mode 100644 index 000000000..5ede72983 --- /dev/null +++ b/components/docs.client.tsx @@ -0,0 +1,49 @@ +"use client"; + +import { Menu, X } from "lucide-react"; +import { type ButtonHTMLAttributes, type HTMLAttributes } from "react"; +import { cn } from "../lib/utils"; +import { buttonVariants } from "./ui/button"; +import { useSidebar } from "fumadocs-ui/provider"; +import { useNav } from "./layout/nav"; +import { SidebarTrigger } from "fumadocs-core/sidebar"; + +export function Navbar(props: HTMLAttributes) { + const { open } = useSidebar(); + const { isTransparent } = useNav(); + + return ( +
+ {props.children} +
+ ); +} + +export function NavbarSidebarTrigger( + props: ButtonHTMLAttributes +) { + const { open } = useSidebar(); + + return ( + + {open ? : } + + ); +} diff --git a/components/docs.tsx b/components/docs.tsx new file mode 100644 index 000000000..361f2f288 --- /dev/null +++ b/components/docs.tsx @@ -0,0 +1,233 @@ +import type { PageTree } from "fumadocs-core/server"; +import { type ReactNode, type HTMLAttributes } from "react"; +import Link from "next/link"; +import { ChevronRight, Languages } from "lucide-react"; +import { cn } from "../lib/utils"; +import { buttonVariants } from "./ui/button"; +import { + CollapsibleSidebar, + Sidebar, + SidebarFooter, + SidebarHeader, + SidebarCollapseTrigger, + SidebarViewport, + SidebarPageTree, +} from "./docs/sidebar"; +import { replaceOrDefault } from "./shared"; +import { type LinkItemType, BaseLinkItem } from "./links"; +import { RootToggle } from "./layout/root-toggle"; +import { type BaseLayoutProps, getLinks } from "./shared"; +import { LanguageToggle, LanguageToggleText } from "./layout/language-toggle"; +import { Navbar, NavbarSidebarTrigger } from "./docs.client"; +import { TreeContextProvider } from "fumadocs-ui/provider"; +import { NavProvider, Title } from "./layout/nav"; +import { ThemeToggle } from "./layout/theme-toggle"; +import { LargeSearchToggle, SearchToggle } from "./layout/search-toggle"; +import { + checkPageTree, + getSidebarTabsFromOptions, + layoutVariables, + SidebarLinkItem, + type SidebarOptions, +} from "./docs/shared"; +import { type PageStyles, StylesProvider } from "fumadocs-ui/provider"; +import { EnhancedSidebarPageTree } from "./docs/custom-sidebar"; + +export interface DocsLayoutProps extends BaseLayoutProps { + tree: PageTree.Root; + + sidebar?: Partial; + + containerProps?: HTMLAttributes; +} + +export function DocsLayout({ + nav: { + enabled: navEnabled = true, + component: navReplace, + transparentMode, + ...nav + } = {}, + sidebar: { + enabled: sidebarEnabled = true, + collapsible = true, + component: sidebarReplace, + tabs: tabOptions, + banner: sidebarBanner, + footer: sidebarFooter, + components: sidebarComponents, + hideSearch: sidebarHideSearch, + ...sidebar + } = {}, + i18n = false, + children, + ...props +}: DocsLayoutProps): ReactNode { + checkPageTree(props.tree); + const links = getLinks(props.links ?? [], props.githubUrl); + const Aside = collapsible ? CollapsibleSidebar : Sidebar; + + const tabs = getSidebarTabsFromOptions(tabOptions, props.tree) ?? []; + const variables = cn( + "[--fd-tocnav-height:36px] md:[--fd-sidebar-width:268px] lg:[--fd-sidebar-width:286px] xl:[--fd-toc-width:286px] xl:[--fd-tocnav-height:0px]", + !navReplace && navEnabled + ? "[--fd-nav-height:calc(var(--spacing)*14)] md:[--fd-nav-height:0px]" + : undefined + ); + + const pageStyles: PageStyles = { + tocNav: cn("xl:hidden"), + toc: cn("max-xl:hidden"), + }; + + return ( + + + {replaceOrDefault( + { enabled: navEnabled, component: navReplace }, + + + <div className="flex flex-1 flex-row items-center gap-1"> + {nav.children} + </div> + <SearchToggle hideIfDisabled /> + <NavbarSidebarTrigger className="-me-2 md:hidden" /> + </Navbar>, + nav + )} + <main + id="nd-docs-layout" + {...props.containerProps} + className={cn( + "flex flex-1 flex-row pe-(--fd-layout-offset)", + variables, + props.containerProps?.className + )} + style={{ + ...layoutVariables, + ...props.containerProps?.style, + }} + > + {collapsible ? ( + <SidebarCollapseTrigger + className={cn( + buttonVariants({ + variant: "secondary", + size: "icon", + }), + "fixed top-1/2 -translate-y-1/2 start-0 z-40 text-fd-muted-foreground rounded-s-none shadow-md data-[collapsed=false]:hidden max-md:hidden" + )} + > + <ChevronRight /> + </SidebarCollapseTrigger> + ) : null} + {replaceOrDefault( + { enabled: sidebarEnabled, component: sidebarReplace }, + <Aside + {...sidebar} + className={cn("md:ps-(--fd-layout-offset)", sidebar.className)} + > + {/* <SidebarHeader> + <div className="flex flex-row pt-1 max-md:hidden"> + <Link + href={nav.url ?? "/"} + className="inline-flex text-[15px] items-center gap-2.5 font-medium" + > + {nav.title} + </Link> + {nav.children} + {collapsible && ( + <SidebarCollapseTrigger + className={cn( + buttonVariants({ + variant: "ghost", + size: "icon-sm", + }), + "ms-auto mb-auto text-fd-muted-foreground max-md:hidden" + )} + /> + )} + </div> + {sidebarBanner} + {tabs.length > 0 ? ( + <RootToggle options={tabs} className="-mx-2" /> + ) : null} + {!sidebarHideSearch ? ( + <LargeSearchToggle + hideIfDisabled + className="rounded-lg max-md:hidden" + /> + ) : null} + </SidebarHeader> */} + <SidebarViewport> + <div className="mb-4 empty:hidden"> + {links + .filter((v) => v.type !== "icon") + .map((item, i) => ( + <SidebarLinkItem key={i} item={item} /> + ))} + </div> + <EnhancedSidebarPageTree components={sidebarComponents} /> + </SidebarViewport> + {/* <SidebarFooter> + <SidebarFooterItems + links={links} + i18n={i18n} + disableThemeSwitch={props.disableThemeSwitch ?? false} + /> + {sidebarFooter} + </SidebarFooter> */} + </Aside>, + { + ...sidebar, + tabs, + } + )} + <StylesProvider {...pageStyles}>{children}</StylesProvider> + </main> + </NavProvider> + </TreeContextProvider> + ); +} + +function SidebarFooterItems({ + i18n, + disableThemeSwitch, + links, +}: { + i18n: boolean; + links: LinkItemType[]; + disableThemeSwitch: boolean; +}) { + const iconItems = links.filter((v) => v.type === "icon"); + + // empty footer items + if (links.length === 0 && !i18n && disableThemeSwitch) return null; + + return ( + <div className="flex flex-row items-center"> + {iconItems.map((item, i) => ( + <BaseLinkItem + key={i} + item={item} + className={cn( + buttonVariants({ size: "icon", variant: "ghost" }), + "text-muted-foreground md:[&_svg]:size-4.5" + )} + aria-label={item.label} + > + {item.icon} + </BaseLinkItem> + ))} + {/* {i18n ? ( + <LanguageToggle className="me-1.5"> + <Languages className="size-4.5" /> + <LanguageToggleText className="md:hidden" /> + </LanguageToggle> + ) : null} */} + </div> + ); +} + +export { getSidebarTabsFromOptions, type TabOptions } from "./docs/shared"; +export { type LinkItemType }; diff --git a/components/docs/custom-sidebar.tsx b/components/docs/custom-sidebar.tsx new file mode 100644 index 000000000..148cb092b --- /dev/null +++ b/components/docs/custom-sidebar.tsx @@ -0,0 +1,377 @@ +"use client"; + +import React, { Fragment, ReactNode, useMemo } from "react"; +import { usePathname } from "next/navigation"; +import { cn } from "@/lib/utils"; +import { + SidebarPageTree, + SidebarSeparator, + SidebarItem, + SidebarFolder, + SidebarFolderTrigger, + SidebarFolderLink, + SidebarFolderContent, +} from "./sidebar"; +import { isActive } from "@/lib/is-active"; +import type { SidebarComponents } from "./shared"; +import { useTreeContext } from "fumadocs-ui/provider"; +import type { PageTree } from "fumadocs-core/server"; +import Link from "next/link"; +import { + API, + BitcoinIcon, + Clarity, + Hiro, + StacksIcon, +} from "@/components/ui/icon"; +import { ChevronDown, ChevronRight, ChevronUp, Code, Play } from "lucide-react"; + +// URLs for both sections to filter out duplicates +const STACKS_NAV_URLS = [ + "/stacks", + "/stacks/quickstarts", + "/stacks/api", + "/stacks/reference", + "/stacks/clarity", +]; + +const BITCOIN_NAV_URLS = ["/bitcoin", "/bitcoin/quickstarts", "/bitcoin/api"]; + +// Names for both sections to filter by name as well +const STACKS_NAV_NAMES = [ + "Home", + "Quickstarts", + "APIs", + "SDKs & Libraries", + "Clarity", +]; + +const BITCOIN_NAV_NAMES = ["Home", "Quickstarts", "APIs"]; + +export function EnhancedSidebarPageTree(props: { + components?: Partial<SidebarComponents>; +}) { + const pathname = usePathname(); + + // Determine which section we're in (bitcoin or stacks) + const isInBitcoinSection = pathname.startsWith("/bitcoin"); + + // Get the relevant filter arrays based on current section + const PERSISTENT_NAV_URLS = isInBitcoinSection + ? BITCOIN_NAV_URLS + : STACKS_NAV_URLS; + const PERSISTENT_NAV_NAMES = isInBitcoinSection + ? BITCOIN_NAV_NAMES + : STACKS_NAV_NAMES; + + // Define the stacks persistent navigation items with updated styling + const stacksNavItems = [ + { + name: "Home", + url: "/stacks", + icon: (props: { active?: boolean }) => ( + <div + className={cn( + "icons rounded-md border border-border p-1 shadow-sm", + props.active && "bg-inverted text-background border-none" + )} + > + <StacksIcon /> + </div> + ), + }, + { + name: "Quickstarts", + url: "/stacks/quickstarts", + icon: (props: { active?: boolean }) => ( + <div + className={cn( + "icons rounded-md border border-border p-1 shadow-sm", + props.active && "bg-inverted text-background border-none" + )} + > + <Play /> + </div> + ), + }, + { + name: "APIs", + url: "/stacks/api", + icon: (props: { active?: boolean }) => ( + <div + className={cn( + "icons rounded-md border border-border p-1 shadow-sm", + props.active && "bg-inverted text-background border-none" + )} + > + <API /> + </div> + ), + }, + { + name: "SDKs & Libraries", + url: "/stacks/reference", + icon: (props: { active?: boolean }) => ( + <div + className={cn( + "icons rounded-md border border-border p-1 shadow-sm", + props.active && "bg-inverted text-background border-none" + )} + > + <Code /> + </div> + ), + }, + { + name: "Clarity", + url: "/stacks/clarity", + icon: (props: { active?: boolean }) => ( + <div + className={cn( + "icons rounded-md border border-border p-1 shadow-sm", + props.active && "bg-inverted text-background border-none" + )} + > + <Clarity /> + </div> + ), + }, + ]; + + // Define the bitcoin persistent navigation items with the provided styling + const bitcoinNavItems = [ + { + name: "Home", + url: "/bitcoin", + icon: (props: { active?: boolean }) => ( + <div + className={cn( + "icons rounded-md border border-border p-1 shadow-sm", + props.active && "bg-hiro text-inverted border-none" + )} + > + <BitcoinIcon /> + </div> + ), + }, + { + name: "Quickstarts", + url: "/bitcoin/quickstarts", + icon: (props: { active?: boolean }) => ( + <div + className={cn( + "icons rounded-md border border-border p-1 shadow-sm", + props.active && "bg-hiro text-inverted border-none" + )} + > + <Play /> + </div> + ), + }, + { + name: "APIs", + url: "/bitcoin/api", + icon: (props: { active?: boolean }) => ( + <div + className={cn( + "icons rounded-md border border-border p-1 shadow-sm", + props.active && "bg-hiro text-inverted border-none" + )} + > + <API /> + </div> + ), + }, + ]; + + // Get the current section's navigation items + const persistentNavItems = isInBitcoinSection + ? bitcoinNavItems + : stacksNavItems; + + // Create our modified version of SidebarPageTree that filters out duplicates + function CustomFilteredPageTree({ + components, + }: { + components?: Partial<SidebarComponents>; + }) { + const { root } = useTreeContext(); + + // Create custom components object with our filtering logic + const filteredComponents: Partial<SidebarComponents> = { + // Custom Item component that filters duplicates + Item: (itemProps) => { + // Skip rendering if this item matches our persistent nav URLs or names + if ( + PERSISTENT_NAV_URLS.includes(itemProps.item.url) || + (typeof itemProps.item.name === "string" && + PERSISTENT_NAV_NAMES.includes(itemProps.item.name)) + ) { + return null; + } + + // Use the original Item component if provided + if (components?.Item) { + return <components.Item {...itemProps} />; + } + + return ( + <SidebarItem + key={itemProps.item.url} + href={itemProps.item.url} + external={itemProps.item.external} + icon={itemProps.item.icon} + > + {itemProps.item.name} + </SidebarItem> + ); + }, + + // Custom Folder component that filters folders by name + Folder: (folderProps) => { + // Skip rendering if this folder matches our persistent nav names + if ( + typeof folderProps.item.name === "string" && + PERSISTENT_NAV_NAMES.includes(folderProps.item.name) + ) { + return null; + } + + // Use the original Folder component if provided + if (components?.Folder) { + return <components.Folder {...folderProps} />; + } + + // Get the folder item + const item = folderProps.item; + + // Generate a unique identifier for this folder by including its full path context + // This ensures different "Examples" folders don't interfere with each other + const currentSection = isInBitcoinSection ? "bitcoin" : "stacks"; + const folderUniqueId = `${currentSection}-${item.name}`; + + // Check if this path or a child path is active + const folderName = typeof item.name === "string" ? item.name : ""; + const folderNameSlug = folderName.toLowerCase().replace(/\s+/g, "-"); + + // Get current path segments to determine if we're in this folder's section + const pathSegments = pathname.split("/").filter(Boolean); + const currentSectionPath = pathSegments[0] || ""; // First segment determines the section + + // Only consider the folder as potentially active if we're in its section + let pathInFolder = false; + + if (currentSectionPath === currentSection) { + // If we have an index page for this folder, use its URL to determine the folder path + if (item.index?.url) { + // Only match if the URL is in the current section + pathInFolder = pathname.startsWith(item.index.url); + } else { + // Create a more specific pattern that requires the section prefix + const folderPathPattern = new RegExp( + `/${currentSection}/.*/${folderNameSlug}(/|$)` + ); + pathInFolder = folderPathPattern.test(pathname); + } + } + + const isIndexActive = item.index && pathname === item.index.url; + + // Make sure we respect the defaultOpen property in meta.json + const shouldBeOpen = item.defaultOpen || isIndexActive || pathInFolder; + + return ( + <SidebarFolder + defaultOpen={shouldBeOpen} + data-folder-id={folderUniqueId} // Add this for debugging + > + <SidebarFolderTrigger> + {item.icon} + {item.name} + {/* The ChevronDown is added automatically by SidebarFolderTrigger */} + </SidebarFolderTrigger> + <SidebarFolderContent>{folderProps.children}</SidebarFolderContent> + </SidebarFolder> + ); + }, + + // Pass through Separator from original props + Separator: components?.Separator, + }; + + // Use the standard SidebarPageTree with our filtered components + return <SidebarPageTree components={filteredComponents} />; + } + + // Render custom sidebar tree with persistent navigation + return useMemo(() => { + // Function to render our persistent navigation items + function renderPersistentItems(): ReactNode[] { + return persistentNavItems.map((item, i) => { + const active = isActive(item.url, pathname, false); + + if (isInBitcoinSection) { + return ( + <Link + key={`persistent-${i}`} + href={item.url} + shallow={true} // Add shallow prop to improve navigation + className={cn( + "flex flex-row items-center gap-2 rounded-md px-2 py-1.5 [&_svg]:size-4", + active + ? "font-medium text-primary" + : "text-muted-foreground hover:text-primary" + )} + > + {typeof item.icon === "function" + ? item.icon({ active }) + : item.icon} + {item.name} + </Link> + ); + } + + return ( + <SidebarItem + key={`persistent-${i}`} + href={item.url} + icon={ + typeof item.icon === "function" + ? item.icon({ active }) + : item.icon + } + > + {item.name} + </SidebarItem> + ); + }); + } + + return ( + <Fragment> + {/* Always render the persistent navigation items */} + {renderPersistentItems()} + + {/* Use our custom filtered page tree */} + <CustomFilteredPageTree components={props.components} /> + </Fragment> + ); + }, [pathname, persistentNavItems, props.components, isInBitcoinSection]); +} + +// Helper Link component +// function Link({ +// href, +// className, +// children, +// }: { +// href: string; +// className?: string; +// children: ReactNode; +// }) { +// return ( +// <a href={href} className={className}> +// {children} +// </a> +// ); +// } diff --git a/components/docs/shared.tsx b/components/docs/shared.tsx new file mode 100644 index 000000000..56cfe23d3 --- /dev/null +++ b/components/docs/shared.tsx @@ -0,0 +1,206 @@ +import { BaseLinkItem, type LinkItemType } from "../links"; +import { + SidebarFolder, + SidebarFolderContent, + SidebarFolderLink, + SidebarFolderTrigger, + SidebarItem, + type SidebarProps, +} from "./sidebar"; +import { cn } from "@/lib/utils"; +import { buttonVariants } from "@/components/ui/button"; +import type { PageTree } from "fumadocs-core/server"; +import type { FC, ReactNode } from "react"; +import type { Option } from "@/components/layout/root-toggle"; +import { notFound } from "next/navigation"; + +export const layoutVariables = { + "--fd-layout-offset": "max(calc(50vw - var(--fd-layout-width) / 2), 0px)", +}; + +export interface TabOptions { + transform?: (option: Option, node: PageTree.Folder) => Option | null; +} + +export interface SidebarOptions extends SidebarProps { + enabled: boolean; + component: ReactNode; + + collapsible?: boolean; + components?: Partial<SidebarComponents>; + + /** + * Root Toggle options + */ + tabs?: Option[] | TabOptions | false; + + banner?: ReactNode; + footer?: ReactNode; + + /** + * Hide search trigger. You can also disable search for the entire site from `<RootProvider />`. + * + * @defaultValue false + */ + hideSearch?: boolean; +} + +export interface SidebarComponents { + Item: FC<{ item: PageTree.Item }>; + Folder: FC<{ item: PageTree.Folder; level: number; children: ReactNode }>; + Separator: FC<{ item: PageTree.Separator }>; +} + +export function SidebarLinkItem({ + item, + ...props +}: { + item: LinkItemType; + className?: string; +}) { + if (item.type === "menu") + return ( + <SidebarFolder {...props}> + {item.url ? ( + <SidebarFolderLink href={item.url}> + {item.icon} + {item.text} + </SidebarFolderLink> + ) : ( + <SidebarFolderTrigger> + {item.icon} + {item.text} + </SidebarFolderTrigger> + )} + <SidebarFolderContent> + {item.items.map((child, i) => ( + <SidebarLinkItem key={i} item={child} /> + ))} + </SidebarFolderContent> + </SidebarFolder> + ); + + if (item.type === "button") { + return ( + <BaseLinkItem + item={item} + {...props} + className={cn( + buttonVariants({ + variant: "secondary", + }), + "gap-1.5 [&_svg]:size-4", + props.className + )} + > + {item.icon} + {item.text} + </BaseLinkItem> + ); + } + + if (item.type === "custom") return <div {...props}>{item.children}</div>; + + return ( + <SidebarItem + href={item.url} + icon={item.icon} + external={item.external} + {...props} + > + {item.text} + </SidebarItem> + ); +} + +export function checkPageTree(passed: unknown) { + if (!passed) notFound(); + if ( + typeof passed === "object" && + "children" in passed && + Array.isArray(passed.children) + ) + return; + + throw new Error( + "You passed an invalid page tree to `<DocsLayout />`. Check your usage in layout.tsx if you have enabled i18n." + ); +} + +export function getSidebarTabsFromOptions( + options: SidebarOptions["tabs"], + tree: PageTree.Root +) { + if (Array.isArray(options)) { + return options; + } else if (typeof options === "object") { + return getSidebarTabs(tree, options); + } else if (options !== false) { + return getSidebarTabs(tree); + } +} + +const defaultTransform: TabOptions["transform"] = (option, node) => { + if (!node.icon) return option; + + return { + ...option, + icon: ( + <div + key={`icon-${option.title}`} + className="rounded-md border bg-fd-secondary p-1 shadow-md [&_svg]:size-5" + > + {node.icon} + </div> + ), + }; +}; + +function getSidebarTabs( + pageTree: PageTree.Root, + { transform = defaultTransform }: TabOptions = {} +): Option[] { + function findOptions(node: PageTree.Folder): Option[] { + const results: Option[] = []; + + if (node.root) { + const index = node.index ?? node.children.at(0); + + if (index?.type === "page") { + const option: Option = { + url: index.url, + title: node.name, + icon: node.icon, + description: node.description, + + urls: getFolderUrls(node, new Set()), + }; + + const mapped = transform ? transform(option, node) : option; + if (mapped) results.push(mapped); + } + } + + for (const child of node.children) { + if (child.type === "folder") results.push(...findOptions(child)); + } + + return results; + } + + return findOptions(pageTree as PageTree.Folder); +} + +function getFolderUrls( + folder: PageTree.Folder, + output: Set<string> +): Set<string> { + if (folder.index) output.add(folder.index.url); + + for (const child of folder.children) { + if (child.type === "page") output.add(child.url); + if (child.type === "folder") getFolderUrls(child, output); + } + + return output; +} diff --git a/components/docs/sidebar.tsx b/components/docs/sidebar.tsx new file mode 100644 index 000000000..e0cfadd7c --- /dev/null +++ b/components/docs/sidebar.tsx @@ -0,0 +1,517 @@ +"use client"; +import { ChevronDown, ExternalLink, SidebarIcon } from "lucide-react"; +import * as Base from "fumadocs-core/sidebar"; +import { usePathname } from "next/navigation"; +import { + type ButtonHTMLAttributes, + createContext, + Fragment, + type HTMLAttributes, + type PointerEventHandler, + type ReactNode, + useCallback, + useContext, + useMemo, + useRef, + useState, +} from "react"; +import Link, { type LinkProps } from "fumadocs-core/link"; +import { useOnChange } from "fumadocs-core/utils/use-on-change"; +import { cn } from "@/lib/utils"; +import { ScrollArea, ScrollViewport } from "@/components/ui/scroll-area"; +import { isActive } from "@/lib/is-active"; +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "@/components/ui/collapsible"; +import { type ScrollAreaProps } from "@radix-ui/react-scroll-area"; +import { useSidebar } from "fumadocs-ui/provider"; +import { cva } from "class-variance-authority"; +import type { + CollapsibleContentProps, + CollapsibleTriggerProps, +} from "@radix-ui/react-collapsible"; +import type { PageTree } from "fumadocs-core/server"; +import { useTreeContext, useTreePath } from "fumadocs-ui/provider"; +import type { SidebarComponents } from "./shared"; + +export interface SidebarProps extends HTMLAttributes<HTMLElement> { + /** + * Open folders by default if their level is lower or equal to a specific level + * (Starting from 1) + * + * @defaultValue 0 + */ + defaultOpenLevel?: number; + + /** + * Prefetch links + * + * @defaultValue true + */ + prefetch?: boolean; +} + +interface InternalContext { + defaultOpenLevel: number; + prefetch: boolean; + level: number; +} + +const itemVariants = cva( + "relative flex flex-row items-center gap-2 rounded-md p-2 text-start text-fd-muted-foreground [overflow-wrap:anywhere] md:py-1.5 [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + active: { + true: "text-primary font-bold", + false: "transition-colors hover:text-primary hover:transition-none", + }, + }, + } +); + +const Context = createContext<InternalContext | null>(null); +const FolderContext = createContext<{ + open: boolean; + setOpen: React.Dispatch<React.SetStateAction<boolean>>; +} | null>(null); + +export function CollapsibleSidebar(props: SidebarProps) { + const { collapsed } = useSidebar(); + const [hover, setHover] = useState(false); + const timerRef = useRef(0); + const closeTimeRef = useRef(0); + + useOnChange(collapsed, () => { + setHover(false); + closeTimeRef.current = Date.now() + 150; + }); + + const onEnter: PointerEventHandler = useCallback((e) => { + if (e.pointerType === "touch" || closeTimeRef.current > Date.now()) return; + window.clearTimeout(timerRef.current); + setHover(true); + }, []); + + const onLeave: PointerEventHandler = useCallback((e) => { + if (e.pointerType === "touch") return; + window.clearTimeout(timerRef.current); + + timerRef.current = window.setTimeout( + () => { + setHover(false); + closeTimeRef.current = Date.now() + 150; + }, + Math.min(e.clientX, document.body.clientWidth - e.clientX) > 100 ? 0 : 500 + ); + }, []); + + return ( + <Sidebar + {...props} + onPointerEnter={collapsed ? onEnter : undefined} + onPointerLeave={collapsed ? onLeave : undefined} + data-collapsed={collapsed} + className={cn( + "md:transition-all", + collapsed && + "md:-me-(--fd-sidebar-width) md:translate-x-[calc(var(--fd-sidebar-offset)*-1)] rtl:md:translate-x-(--fd-sidebar-offset)", + collapsed && hover && "z-50 md:translate-x-0", + collapsed && !hover && "md:opacity-0", + props.className + )} + style={ + { + "--fd-sidebar-offset": "calc(var(--fd-sidebar-width) - 20px)", + } as object + } + /> + ); +} + +export function Sidebar({ + defaultOpenLevel = 0, + prefetch = true, + inner, + ...props +}: SidebarProps & { inner?: HTMLAttributes<HTMLDivElement> }) { + const context = useMemo<InternalContext>(() => { + return { + defaultOpenLevel, + prefetch, + level: 1, + }; + }, [defaultOpenLevel, prefetch]); + + return ( + <Context.Provider value={context}> + <Base.SidebarList + id="sidebar" + blockScrollingWidth={768} // md + {...props} + className={cn( + "fixed top-[calc(var(--fd-banner-height)+var(--fd-nav-height))] z-30 bg-background text-sm md:sticky md:h-(--fd-sidebar-height)", + "max-md:inset-x-0 max-md:bottom-0 max-md:bg-background max-md:text-[15px] max-md:backdrop-blur-lg max-md:data-[open=false]:invisible", + props.className + )} + style={ + { + ...props.style, + "--fd-sidebar-height": + "calc(100dvh - var(--fd-banner-height) - var(--fd-nav-height))", + } as object + } + > + <div + {...inner} + className={cn( + "flex size-full max-w-full flex-col md:ms-auto md:w-(--fd-sidebar-width)", + inner?.className + )} + > + {props.children} + </div> + </Base.SidebarList> + </Context.Provider> + ); +} + +export function SidebarHeader(props: HTMLAttributes<HTMLDivElement>) { + return ( + <div + {...props} + className={cn("flex flex-col gap-2 px-4 empty:hidden", props.className)} + > + {props.children} + </div> + ); +} + +export function SidebarFooter(props: HTMLAttributes<HTMLDivElement>) { + return ( + <div + {...props} + className={cn( + "flex flex-col border-t px-4 py-3 empty:hidden", + props.className + )} + > + {props.children} + </div> + ); +} + +export function SidebarViewport(props: ScrollAreaProps) { + return ( + <ScrollArea {...props} className={cn("h-full", props.className)}> + <ScrollViewport + className="p-4" + style={{ + maskImage: "linear-gradient(to bottom, transparent, white 12px)", + }} + > + {props.children} + </ScrollViewport> + </ScrollArea> + ); +} + +export function SidebarSeparator(props: HTMLAttributes<HTMLParagraphElement>) { + const { level } = useInternalContext(); + return ( + <p + {...props} + className={cn( + "gap-2 mb-2 px-2 mt-8 text-md text-primary font-fono font-medium [&_svg]:size-4 [&_svg]:shrink-0", + props.className + )} + style={{ + paddingInlineStart: getOffset(level), + ...props.style, + }} + > + {props.children} + </p> + ); +} + +export function SidebarItem({ + icon, + ...props +}: LinkProps & { + icon?: ReactNode; +}) { + const pathname = usePathname(); + const active = + props.href !== undefined && isActive(props.href, pathname, false); + const { prefetch, level } = useInternalContext(); + + return ( + <Link + {...props} + data-active={active} + className={cn(itemVariants({ active }), props.className)} + prefetch={prefetch} + style={{ + paddingInlineStart: getOffset(level), + ...props.style, + }} + > + <Border level={level} active={active} /> + {icon ?? (props.external ? <ExternalLink /> : null)} + {props.children} + </Link> + ); +} + +export function SidebarFolder({ + defaultOpen = false, + ...props +}: HTMLAttributes<HTMLDivElement> & { + defaultOpen?: boolean; +}) { + const [open, setOpen] = useState(defaultOpen); + + useOnChange(defaultOpen, (v) => { + if (v) setOpen(v); + }); + + return ( + <Collapsible open={open} onOpenChange={setOpen} {...props}> + <FolderContext.Provider + value={useMemo(() => ({ open, setOpen }), [open])} + > + {props.children} + </FolderContext.Provider> + </Collapsible> + ); +} + +export function SidebarFolderTrigger(props: CollapsibleTriggerProps) { + const { level } = useInternalContext(); + const { open } = useFolderContext(); + + return ( + <CollapsibleTrigger + {...props} + className={cn(itemVariants({ active: false }), "w-full cursor-pointer")} + style={{ + paddingInlineStart: getOffset(level), + ...props.style, + }} + > + <Border level={level} /> + {props.children} + <ChevronDown + data-icon + className={cn("ms-auto transition-transform", !open && "-rotate-90")} + /> + </CollapsibleTrigger> + ); +} + +export function SidebarFolderLink(props: LinkProps) { + const { open, setOpen } = useFolderContext(); + const { prefetch, level } = useInternalContext(); + + const pathname = usePathname(); + const active = + props.href !== undefined && isActive(props.href, pathname, false); + + return ( + <Link + {...props} + data-active={active} + className={cn(itemVariants({ active }), "w-full", props.className)} + onClick={(e) => { + if ((e.target as HTMLElement).hasAttribute("data-icon")) { + setOpen((prev) => !prev); + e.preventDefault(); + } + }} + prefetch={prefetch} + style={{ + paddingInlineStart: getOffset(level), + ...props.style, + }} + > + <Border level={level} active={active} /> + {props.children} + {/* <ChevronDown + data-icon + className={cn("ms-auto transition-transform", !open && "-rotate-90")} + /> */} + </Link> + ); +} + +export function SidebarFolderContent(props: CollapsibleContentProps) { + const ctx = useInternalContext(); + + return ( + <CollapsibleContent {...props} className={cn("relative", props.className)}> + <Context.Provider + value={useMemo( + () => ({ + ...ctx, + level: ctx.level + 1, + }), + [ctx] + )} + > + <div className="absolute w-px inset-y-0 bg-fd-border start-3" /> + {props.children} + </Context.Provider> + </CollapsibleContent> + ); +} + +export function SidebarCollapseTrigger( + props: ButtonHTMLAttributes<HTMLButtonElement> +) { + const { collapsed, setCollapsed } = useSidebar(); + + return ( + <button + type="button" + aria-label="Collapse Sidebar" + data-collapsed={collapsed} + {...props} + onClick={() => { + setCollapsed((prev) => !prev); + }} + > + {props.children ?? <SidebarIcon />} + </button> + ); +} + +function useFolderContext() { + const ctx = useContext(FolderContext); + + if (!ctx) throw new Error("Missing sidebar folder"); + return ctx; +} + +function useInternalContext(): InternalContext { + const ctx = useContext(Context); + if (!ctx) throw new Error("<Sidebar /> component required."); + + return ctx; +} + +/** + * Render sidebar items from page tree + */ +export function SidebarPageTree(props: { + components?: Partial<SidebarComponents>; +}) { + const { root } = useTreeContext(); + + return useMemo(() => { + const { Separator, Item, Folder } = props.components ?? {}; + + function renderSidebarList( + items: PageTree.Node[], + level: number + ): ReactNode[] { + return items.map((item, i) => { + if (item.type === "separator") { + if (Separator) return <Separator key={i} item={item} />; + return ( + <SidebarSeparator key={i} className={cn(i !== 0 && "mt-8")}> + {item.icon} + {item.name} + </SidebarSeparator> + ); + } + + if (item.type === "folder") { + const children = renderSidebarList(item.children, level + 1); + + if (Folder) + return ( + <Folder key={i} item={item} level={level}> + {children} + </Folder> + ); + return ( + <PageTreeFolder key={i} item={item}> + {children} + </PageTreeFolder> + ); + } + + if (Item) return <Item key={item.url} item={item} />; + return ( + <SidebarItem + key={item.url} + href={item.url} + external={item.external} + icon={item.icon} + > + {item.name} + </SidebarItem> + ); + }); + } + + return ( + <Fragment key={root.$id}>{renderSidebarList(root.children, 1)}</Fragment> + ); + // eslint-disable-next-line react-hooks/exhaustive-deps -- root.id is enough + }, [props.components, root.$id]); +} + +function PageTreeFolder({ + item, + ...props +}: HTMLAttributes<HTMLElement> & { + item: PageTree.Folder; +}) { + const { defaultOpenLevel, level } = useInternalContext(); + const path = useTreePath(); + + return ( + <SidebarFolder + defaultOpen={ + (item.defaultOpen ?? defaultOpenLevel >= level) || path.includes(item) + } + > + {item.index ? ( + <SidebarFolderLink + href={item.index.url} + external={item.index.external} + {...props} + > + {item.icon} + {item.name} + </SidebarFolderLink> + ) : ( + <SidebarFolderTrigger {...props}> + {item.icon} + {item.name} + </SidebarFolderTrigger> + )} + <SidebarFolderContent>{props.children}</SidebarFolderContent> + </SidebarFolder> + ); +} + +function getOffset(level: number) { + return `calc(var(--spacing) * ${(level > 1 ? level : 0) * 2 + 2})`; +} + +function Border({ level, active }: { level: number; active?: boolean }) { + if (level <= 1) return null; + + return ( + <div + className={cn( + "absolute w-px inset-y-2 z-[2] start-3", + active && "bg-fd-primary" + )} + /> + ); +} diff --git a/components/docskit/annotations/hover-line.client.tsx b/components/docskit/annotations/hover-line.client.tsx index 1893d4d7f..5f180afdf 100644 --- a/components/docskit/annotations/hover-line.client.tsx +++ b/components/docskit/annotations/hover-line.client.tsx @@ -2,10 +2,9 @@ import { useEffect, useRef } from "react"; import { InnerLine } from "codehike/code"; -import { CustomLineProps } from "codehike/code/types"; import { useHover } from "@/context/hover"; -export function HoverLineClient({ annotation, ...props }: CustomLineProps) { +export function HoverLineClient({ annotation, ...props }: any) { const lineRef = useRef<HTMLDivElement>(null); const originalScrollRef = useRef<number | null>(null); diff --git a/components/docskit/code.tsx b/components/docskit/code.tsx index c94aac591..461d54d93 100644 --- a/components/docskit/code.tsx +++ b/components/docskit/code.tsx @@ -93,7 +93,7 @@ export async function toCodeGroup(props: { code={highlighted} className={cn( !title && "!m-0", - "overflow-auto px-0 py-2 m-3 rounded !bg-ch-code font-mono" + "overflow-auto px-0 py-2 m-3 rounded !bg-ch-code" )} style={highlighted.style} handlers={handlers} diff --git a/components/filter-popover.tsx b/components/filter-popover.tsx index 3cd313af6..0e480f3d4 100644 --- a/components/filter-popover.tsx +++ b/components/filter-popover.tsx @@ -46,7 +46,11 @@ function FilterPopover({ <div className="flex flex-col gap-4"> <Popover> <PopoverTrigger asChild> - <Button variant="outline" size="icon" aria-label="Filter by category"> + <Button + size="icon" + aria-label="Filter by category" + className="border border-input bg-background hover:bg-accent hover:text-accent-foreground" + > <ListFilter size={16} strokeWidth={2} aria-hidden="true" /> </Button> </PopoverTrigger> @@ -82,8 +86,7 @@ function FilterPopover({ <Button type="button" size="sm" - variant="outline" - className="h-7 px-2" + className="h-7 px-2 border border-input bg-background hover:bg-accent hover:text-accent-foreground" onClick={handleClear} > Clear diff --git a/components/footer.tsx b/components/footer.tsx index 3fb79bec3..5b7a4bcac 100644 --- a/components/footer.tsx +++ b/components/footer.tsx @@ -1,3 +1,4 @@ +import React, { JSX } from "react"; import { Bug, Newspaper, QuestionIcon, Pulse } from "@/components/ui/icon"; const items = [ diff --git a/components/globe.tsx b/components/globe.tsx deleted file mode 100644 index bc18e2f58..000000000 --- a/components/globe.tsx +++ /dev/null @@ -1,128 +0,0 @@ -"use client"; - -import { cn } from "@/lib/utils"; -import createGlobe, { COBEOptions } from "cobe"; -import { useCallback, useEffect, useRef } from "react"; -import { useSpring } from "react-spring"; - -const GLOBE_CONFIG: COBEOptions = { - width: 800, - height: 800, - onRender: () => {}, - devicePixelRatio: 2, - phi: 0, - theta: 0.3, - dark: 0, - diffuse: 0.4, - mapSamples: 16000, - mapBrightness: 1.2, - baseColor: [1, 1, 1], - markerColor: [251 / 255, 100 / 255, 21 / 255], - glowColor: [1, 1, 1], - markers: [ - { location: [14.5995, 120.9842], size: 0.03 }, - { location: [19.076, 72.8777], size: 0.1 }, - { location: [23.8103, 90.4125], size: 0.05 }, - { location: [30.0444, 31.2357], size: 0.07 }, - { location: [39.9042, 116.4074], size: 0.08 }, - { location: [-23.5505, -46.6333], size: 0.1 }, - { location: [19.4326, -99.1332], size: 0.1 }, - { location: [40.7128, -74.006], size: 0.1 }, - { location: [34.6937, 135.5022], size: 0.05 }, - { location: [41.0082, 28.9784], size: 0.06 }, - ], -}; - -export default function Globe({ - className, - config = GLOBE_CONFIG, -}: { - className?: string; - config?: COBEOptions; -}) { - let phi = 0; - let width = 0; - const canvasRef = useRef<HTMLCanvasElement>(null); - const pointerInteracting = useRef(null); - const pointerInteractionMovement = useRef(0); - const [{ r }, api] = useSpring(() => ({ - r: 0, - config: { - mass: 1, - tension: 280, - friction: 40, - precision: 0.001, - }, - })); - - const updatePointerInteraction = (value: any) => { - pointerInteracting.current = value; - canvasRef.current!.style.cursor = value ? "grabbing" : "grab"; - }; - - const updateMovement = (clientX: any) => { - if (pointerInteracting.current !== null) { - const delta = clientX - pointerInteracting.current; - pointerInteractionMovement.current = delta; - api.start({ r: delta / 200 }); - } - }; - - const onRender = useCallback( - (state: Record<string, any>) => { - if (!pointerInteracting.current) phi += 0.005; - state.phi = phi + r.get(); - state.width = width * 2; - state.height = width * 2; - }, - [pointerInteracting, phi, r] - ); - - const onResize = () => { - if (canvasRef.current) { - width = canvasRef.current.offsetWidth; - } - }; - - useEffect(() => { - window.addEventListener("resize", onResize); - onResize(); - - const globe = createGlobe(canvasRef.current!, { - ...config, - width: width * 2, - height: width * 2, - onRender, - }); - - setTimeout(() => (canvasRef.current!.style.opacity = "1")); - return () => globe.destroy(); - }, []); - - return ( - <div - className={cn( - "absolute inset-0 mx-auto aspect-[1/1] w-full max-w-[600px]", - className - )} - > - <canvas - className={cn( - "h-full w-full opacity-0 transition-opacity duration-500 [contain:layout_paint_size]" - )} - ref={canvasRef} - onPointerDown={(e) => - updatePointerInteraction( - e.clientX - pointerInteractionMovement.current - ) - } - onPointerUp={() => updatePointerInteraction(null)} - onPointerOut={() => updatePointerInteraction(null)} - onMouseMove={(e) => updateMovement(e.clientX)} - onTouchMove={(e) => - e.touches[0] && updateMovement(e.touches[0].clientX) - } - /> - </div> - ); -} diff --git a/components/grid-pattern.tsx b/components/grid-pattern.tsx deleted file mode 100644 index 7569e4538..000000000 --- a/components/grid-pattern.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { useId } from "react"; -import { cn } from "@/lib/utils"; - -interface GridPatternProps { - width?: any; - height?: any; - x?: any; - y?: any; - squares?: Array<[x: number, y: number]>; - strokeDasharray?: any; - className?: string; - [key: string]: any; -} - -export function GridPattern({ - width = 40, - height = 40, - x = -1, - y = -1, - strokeDasharray = 0, - squares, - className, - ...props -}: GridPatternProps) { - const id = useId(); - - return ( - <svg - aria-hidden="true" - className={cn( - "pointer-events-none absolute inset-0 h-full w-full fill-gray-400/30 stroke-gray-400/80 dark:stroke-gray-400/30 opacity-10", - className - )} - {...props} - > - <defs> - <pattern - id={id} - width={width} - height={height} - patternUnits="userSpaceOnUse" - x={x} - y={y} - > - <path - d={`M.5 ${height}V.5H${width}`} - fill="none" - strokeDasharray={strokeDasharray} - /> - </pattern> - </defs> - <rect width="100%" height="100%" strokeWidth={0} fill={`url(#${id})`} /> - {squares && ( - <svg x={x} y={y} className="overflow-visible"> - {squares.map(([x, y]) => ( - <rect - strokeWidth="0" - key={`${x}-${y}`} - width={width - 1} - height={height - 1} - x={x * width + 1} - y={y * height + 1} - /> - ))} - </svg> - )} - </svg> - ); -} - -export default GridPattern; diff --git a/components/highlight.tsx b/components/highlight.tsx deleted file mode 100644 index 9965df0eb..000000000 --- a/components/highlight.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import type { LucideIcon } from "lucide-react"; -import type { ReactNode } from "react"; - -export function Highlight({ - icon: Icon, - heading, - children, -}: { - icon: LucideIcon; - heading: ReactNode; - children: ReactNode; -}): JSX.Element { - return ( - <div className="border-l border-t px-6 py-12"> - <div className="mb-4 flex flex-row items-center gap-2 text-muted-foreground"> - <Icon className="size-4" /> - <h2 className="text-sm font-medium">{heading}</h2> - </div> - <span className="font-medium">{children}</span> - </div> - ); -} diff --git a/components/home.tsx b/components/home.tsx new file mode 100644 index 000000000..fb1da9090 --- /dev/null +++ b/components/home.tsx @@ -0,0 +1,210 @@ +import { Fragment, type HTMLAttributes } from "react"; +import { type NavOptions, replaceOrDefault } from "./shared"; +import { cn } from "../lib/utils"; +import { getLinks, type BaseLayoutProps } from "./shared"; +import { NavProvider, Title } from "./layout/nav"; +import { + Navbar, + NavbarLink, + NavbarMenu, + NavbarMenuContent, + NavbarMenuLink, + NavbarMenuTrigger, +} from "./home/navbar"; +import { type LinkItemType } from "./links"; +import { LargeSearchToggle, SearchToggle } from "./layout/search-toggle"; +import { ThemeToggle } from "./layout/theme-toggle"; +import { LanguageToggle, LanguageToggleText } from "./layout/language-toggle"; +import { ChevronDown, Languages } from "lucide-react"; +import Link from "fumadocs-core/link"; +import { Menu, MenuContent, MenuLinkItem, MenuTrigger } from "./home/menu"; + +export interface HomeLayoutProps + extends BaseLayoutProps, + HTMLAttributes<HTMLElement> { + nav?: Partial< + NavOptions & { + /** + * Open mobile menu when hovering the trigger + */ + enableHoverToOpen?: boolean; + } + >; +} + +export function HomeLayout(props: HomeLayoutProps) { + const { + nav, + links, + githubUrl, + i18n: _i18n, + disableThemeSwitch: _disableThemeSwitch, + ...rest + } = props; + + const finalLinks = getLinks(links, githubUrl); + + return ( + <NavProvider transparentMode={nav?.transparentMode}> + <main + id="nd-home-layout" + {...rest} + className={cn("flex flex-1 flex-col", rest.className)} + > + {replaceOrDefault(nav, <Header finalLinks={finalLinks} {...props} />, { + items: finalLinks, + })} + {props.children} + </main> + </NavProvider> + ); +} + +function Header({ + nav: { enableSearch = true, ...nav } = {}, + i18n = false, + finalLinks, + disableThemeSwitch, +}: HomeLayoutProps & { + finalLinks: LinkItemType[]; +}) { + const navItems = finalLinks.filter((item) => + ["nav", "all"].includes(item.on ?? "all") + ); + const menuItems = finalLinks.filter((item) => + ["menu", "all"].includes(item.on ?? "all") + ); + + return ( + <Navbar> + <Title title={nav.title} url={nav.url} /> + {nav.children} + <ul className="flex flex-row items-center gap-2 px-6 max-sm:hidden"> + {navItems + .filter((item) => !isSecondary(item)) + .map((item, i) => ( + <NavbarLinkItem key={i} item={item} className="text-sm" /> + ))} + </ul> + <div className="flex flex-row items-center justify-end gap-1.5 flex-1"> + {enableSearch ? ( + <> + <SearchToggle className="lg:hidden" hideIfDisabled /> + <LargeSearchToggle + className="w-full max-w-[240px] max-lg:hidden" + hideIfDisabled + /> + </> + ) : null} + {!disableThemeSwitch ? <ThemeToggle className="max-lg:hidden" /> : null} + {i18n ? ( + <LanguageToggle className="max-lg:hidden"> + <Languages className="size-5" /> + </LanguageToggle> + ) : null} + </div> + <ul className="flex flex-row items-center"> + {navItems.filter(isSecondary).map((item, i) => ( + <NavbarLinkItem + key={i} + item={item} + className="-me-1.5 max-lg:hidden" + /> + ))} + <Menu className="lg:hidden"> + <MenuTrigger + aria-label="Toggle Menu" + className="group -me-2" + enableHover={nav.enableHoverToOpen} + > + <ChevronDown className="size-3 transition-transform duration-300 group-data-[state=open]:rotate-180" /> + </MenuTrigger> + <MenuContent className="sm:flex-row sm:items-center sm:justify-end"> + {menuItems + .filter((item) => !isSecondary(item)) + .map((item, i) => ( + <MenuLinkItem key={i} item={item} className="sm:hidden" /> + ))} + <div className="-ms-1.5 flex flex-row items-center gap-1.5 max-sm:mt-2"> + {menuItems.filter(isSecondary).map((item, i) => ( + <MenuLinkItem key={i} item={item} className="-me-1.5" /> + ))} + <div role="separator" className="flex-1" /> + {i18n ? ( + <LanguageToggle> + <Languages className="size-5" /> + <LanguageToggleText /> + <ChevronDown className="size-3 text-fd-muted-foreground" /> + </LanguageToggle> + ) : null} + {!disableThemeSwitch ? <ThemeToggle /> : null} + </div> + </MenuContent> + </Menu> + </ul> + </Navbar> + ); +} + +function NavbarLinkItem({ + item, + ...props +}: { + item: LinkItemType; + className?: string; +}) { + if (item.type === "custom") return item.children; + + if (item.type === "menu") { + const children = item.items.map((child, j) => { + if (child.type === "custom") + return <Fragment key={j}>{child.children}</Fragment>; + + const { banner, footer, ...rest } = child.menu ?? {}; + + return ( + <NavbarMenuLink key={j} href={child.url} {...rest}> + {banner ?? + (child.icon ? ( + <div className="w-fit rounded-md border bg-fd-muted p-1 [&_svg]:size-4"> + {child.icon} + </div> + ) : null)} + <p className="-mb-1 text-sm font-medium">{child.text}</p> + {child.description ? ( + <p className="text-[13px] text-fd-muted-foreground"> + {child.description} + </p> + ) : null} + {footer} + </NavbarMenuLink> + ); + }); + + return ( + <NavbarMenu> + <NavbarMenuTrigger {...props}> + {item.url ? <Link href={item.url}>{item.text}</Link> : item.text} + </NavbarMenuTrigger> + <NavbarMenuContent>{children}</NavbarMenuContent> + </NavbarMenu> + ); + } + + return ( + <NavbarLink + {...props} + item={item} + variant={item.type} + aria-label={item.type === "icon" ? item.label : undefined} + > + {item.type === "icon" ? item.icon : item.text} + </NavbarLink> + ); +} + +function isSecondary(item: LinkItemType): boolean { + return ( + ("secondary" in item && item.secondary === true) || item.type === "icon" + ); +} diff --git a/components/home/menu.tsx b/components/home/menu.tsx new file mode 100644 index 000000000..0663490f4 --- /dev/null +++ b/components/home/menu.tsx @@ -0,0 +1,126 @@ +"use client"; +import { BaseLinkItem, type LinkItemType } from "../links"; +import { cn } from "../../lib/utils"; +import { + NavigationMenuContent, + NavigationMenuItem, + NavigationMenuLink, + NavigationMenuTrigger, +} from "@/components/ui/navigation-menu"; +import Link from "fumadocs-core/link"; +import { cva } from "class-variance-authority"; +import { buttonVariants } from "../ui/button"; +import type { ComponentPropsWithoutRef } from "react"; + +const menuItemVariants = cva("", { + variants: { + variant: { + main: "inline-flex items-center gap-2 py-1.5 transition-colors hover:text-fd-popover-foreground/50 data-[active=true]:font-medium data-[active=true]:text-fd-primary [&_svg]:size-4", + icon: buttonVariants({ + size: "icon", + variant: "ghost", + }), + button: buttonVariants({ + variant: "secondary", + className: "gap-1.5 [&_svg]:size-4", + }), + }, + }, + defaultVariants: { + variant: "main", + }, +}); + +export function MenuLinkItem({ + item, + ...props +}: { + item: LinkItemType; + className?: string; +}) { + if (item.type === "custom") + return <div className={cn("grid", props.className)}>{item.children}</div>; + + if (item.type === "menu") { + const header = ( + <> + {item.icon} + {item.text} + </> + ); + + return ( + <div className={cn("mb-4 flex flex-col", props.className)}> + <p className="mb-1 text-sm text-fd-muted-foreground"> + {item.url ? ( + <NavigationMenuLink asChild> + <Link href={item.url}>{header}</Link> + </NavigationMenuLink> + ) : ( + header + )} + </p> + {item.items.map((child, i) => ( + <MenuLinkItem key={i} item={child} /> + ))} + </div> + ); + } + + return ( + <NavigationMenuLink asChild> + <BaseLinkItem + item={item} + className={cn( + menuItemVariants({ variant: item.type }), + props.className + )} + aria-label={item.type === "icon" ? item.label : undefined} + > + {item.icon} + {item.type === "icon" ? undefined : item.text} + </BaseLinkItem> + </NavigationMenuLink> + ); +} + +export const Menu = NavigationMenuItem; + +export function MenuTrigger({ + enableHover = false, + ...props +}: ComponentPropsWithoutRef<typeof NavigationMenuTrigger> & { + /** + * Enable hover to trigger + */ + enableHover?: boolean; +}) { + return ( + <NavigationMenuTrigger + {...props} + onPointerMove={enableHover ? undefined : (e) => e.preventDefault()} + className={cn( + buttonVariants({ + size: "icon", + variant: "ghost", + }), + props.className + )} + > + {props.children} + </NavigationMenuTrigger> + ); +} + +export function MenuContent( + props: ComponentPropsWithoutRef<typeof NavigationMenuContent> +) { + return ( + <NavigationMenuContent + {...props} + className={cn("flex flex-col p-4", props.className)} + > + {props.children} + </NavigationMenuContent> + ); +} diff --git a/components/home/navbar.tsx b/components/home/navbar.tsx new file mode 100644 index 000000000..a1474c81d --- /dev/null +++ b/components/home/navbar.tsx @@ -0,0 +1,136 @@ +"use client"; +import { type ComponentProps, type HTMLAttributes, useState } from "react"; +import { cva, type VariantProps } from "class-variance-authority"; +import Link, { type LinkProps } from "fumadocs-core/link"; +import { cn } from "../../lib/utils"; +import { BaseLinkItem } from "../links"; +import { + NavigationMenu, + NavigationMenuContent, + NavigationMenuItem, + NavigationMenuLink, + NavigationMenuList, + NavigationMenuTrigger, + NavigationMenuViewport, +} from "../ui/navigation-menu"; +import { useNav } from "../layout/nav"; +import type { + NavigationMenuContentProps, + NavigationMenuTriggerProps, +} from "@radix-ui/react-navigation-menu"; +import { buttonVariants } from "../ui/button"; + +const navItemVariants = cva( + "inline-flex items-center gap-1 p-2 text-fd-muted-foreground transition-colors hover:text-fd-accent-foreground data-[active=true]:text-fd-primary [&_svg]:size-4" +); + +export function Navbar(props: HTMLAttributes<HTMLElement>) { + const [value, setValue] = useState(""); + const { isTransparent } = useNav(); + + return ( + <NavigationMenu value={value} onValueChange={setValue} asChild> + <header + id="nd-nav" + {...props} + className={cn( + "fixed left-1/2 top-(--fd-banner-height) z-40 box-content w-full max-w-fd-container -translate-x-1/2 border-b border-fd-foreground/10 transition-colors lg:mt-2 lg:w-[calc(100%-1rem)] lg:rounded-2xl lg:border", + value.length > 0 ? "shadow-lg" : "shadow-sm", + (!isTransparent || value.length > 0) && + "bg-fd-background/80 backdrop-blur-lg", + props.className + )} + > + <NavigationMenuList + className="flex h-14 w-full flex-row items-center px-4 lg:h-12" + asChild + > + <nav>{props.children}</nav> + </NavigationMenuList> + <NavigationMenuViewport /> + </header> + </NavigationMenu> + ); +} + +export const NavbarMenu = NavigationMenuItem; + +export function NavbarMenuContent(props: NavigationMenuContentProps) { + return ( + <NavigationMenuContent + {...props} + className={cn( + "grid grid-cols-1 gap-3 px-4 pb-4 md:grid-cols-2 lg:grid-cols-3", + props.className + )} + > + {props.children} + </NavigationMenuContent> + ); +} + +export function NavbarMenuTrigger(props: NavigationMenuTriggerProps) { + return ( + <NavigationMenuTrigger + {...props} + className={cn(navItemVariants(), "rounded-md", props.className)} + > + {props.children} + </NavigationMenuTrigger> + ); +} + +export function NavbarMenuLink(props: LinkProps) { + return ( + <NavigationMenuLink asChild> + <Link + {...props} + className={cn( + "flex flex-col gap-2 rounded-lg border bg-fd-card p-3 transition-colors hover:bg-fd-accent/80 hover:text-fd-accent-foreground", + props.className + )} + > + {props.children} + </Link> + </NavigationMenuLink> + ); +} + +const linkVariants = cva("", { + variants: { + variant: { + main: navItemVariants(), + button: buttonVariants({ + variant: "secondary", + className: "gap-1.5 [&_svg]:size-4", + }), + icon: buttonVariants({ + variant: "ghost", + size: "icon", + }), + }, + }, + defaultVariants: { + variant: "main", + }, +}); + +export function NavbarLink({ + item, + variant, + ...props +}: ComponentProps<typeof BaseLinkItem> & VariantProps<typeof linkVariants>) { + return ( + <NavigationMenuItem> + <NavigationMenuLink asChild> + <BaseLinkItem + {...props} + item={item} + className={cn(linkVariants({ variant }), props.className)} + > + {props.children} + </BaseLinkItem> + </NavigationMenuLink> + </NavigationMenuItem> + ); +} diff --git a/components/icons.tsx b/components/icons.tsx new file mode 100644 index 000000000..ae036fea5 --- /dev/null +++ b/components/icons.tsx @@ -0,0 +1,148 @@ +type IconProps = React.HTMLAttributes<SVGElement>; + +export const Icons = { + logo: (props: IconProps) => ( + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" {...props}> + <rect width="256" height="256" fill="none" /> + <line + x1="208" + y1="128" + x2="128" + y2="208" + fill="none" + stroke="currentColor" + strokeLinecap="round" + strokeLinejoin="round" + strokeWidth="32" + /> + <line + x1="192" + y1="40" + x2="40" + y2="192" + fill="none" + stroke="currentColor" + strokeLinecap="round" + strokeLinejoin="round" + strokeWidth="32" + /> + </svg> + ), + twitter: (props: IconProps) => ( + <svg + {...props} + height="23" + viewBox="0 0 1200 1227" + width="23" + xmlns="http://www.w3.org/2000/svg" + > + <path d="M714.163 519.284L1160.89 0H1055.03L667.137 450.887L357.328 0H0L468.492 681.821L0 1226.37H105.866L515.491 750.218L842.672 1226.37H1200L714.137 519.284H714.163ZM569.165 687.828L521.697 619.934L144.011 79.6944H306.615L611.412 515.685L658.88 583.579L1055.08 1150.3H892.476L569.165 687.854V687.828Z" /> + </svg> + ), + gitHub: (props: IconProps) => ( + <svg viewBox="0 0 438.549 438.549" {...props}> + <path + fill="currentColor" + d="M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z" + ></path> + </svg> + ), + radix: (props: IconProps) => ( + <svg viewBox="0 0 25 25" fill="none" {...props}> + <path + d="M12 25C7.58173 25 4 21.4183 4 17C4 12.5817 7.58173 9 12 9V25Z" + fill="currentcolor" + ></path> + <path d="M12 0H4V8H12V0Z" fill="currentcolor"></path> + <path + d="M17 8C19.2091 8 21 6.20914 21 4C21 1.79086 19.2091 0 17 0C14.7909 0 13 1.79086 13 4C13 6.20914 14.7909 8 17 8Z" + fill="currentcolor" + ></path> + </svg> + ), + aria: (props: IconProps) => ( + <svg role="img" viewBox="0 0 24 24" fill="currentColor" {...props}> + <path d="M13.966 22.624l-1.69-4.281H8.122l3.892-9.144 5.662 13.425zM8.884 1.376H0v21.248zm15.116 0h-8.884L24 22.624Z" /> + </svg> + ), + npm: (props: IconProps) => ( + <svg viewBox="0 0 24 24" {...props}> + <path + d="M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z" + fill="currentColor" + /> + </svg> + ), + yarn: (props: IconProps) => ( + <svg viewBox="0 0 24 24" {...props}> + <path + d="M12 0C5.375 0 0 5.375 0 12s5.375 12 12 12 12-5.375 12-12S18.625 0 12 0zm.768 4.105c.183 0 .363.053.525.157.125.083.287.185.755 1.154.31-.088.468-.042.551-.019.204.056.366.19.463.375.477.917.542 2.553.334 3.605-.241 1.232-.755 2.029-1.131 2.576.324.329.778.899 1.117 1.825.278.774.31 1.478.273 2.015a5.51 5.51 0 0 0 .602-.329c.593-.366 1.487-.917 2.553-.931.714-.009 1.269.445 1.353 1.103a1.23 1.23 0 0 1-.945 1.362c-.649.158-.95.278-1.821.843-1.232.797-2.539 1.242-3.012 1.39a1.686 1.686 0 0 1-.704.343c-.737.181-3.266.315-3.466.315h-.046c-.783 0-1.214-.241-1.45-.491-.658.329-1.51.19-2.122-.134a1.078 1.078 0 0 1-.58-1.153 1.243 1.243 0 0 1-.153-.195c-.162-.25-.528-.936-.454-1.946.056-.723.556-1.367.88-1.71a5.522 5.522 0 0 1 .408-2.256c.306-.727.885-1.348 1.32-1.737-.32-.537-.644-1.367-.329-2.21.227-.602.412-.936.82-1.08h-.005c.199-.074.389-.153.486-.259a3.418 3.418 0 0 1 2.298-1.103c.037-.093.079-.185.125-.283.31-.658.639-1.029 1.024-1.168a.94.94 0 0 1 .328-.06zm.006.7c-.507.016-1.001 1.519-1.001 1.519s-1.27-.204-2.266.871c-.199.218-.468.334-.746.44-.079.028-.176.023-.417.672-.371.991.625 2.094.625 2.094s-1.186.839-1.626 1.881c-.486 1.144-.338 2.261-.338 2.261s-.843.732-.899 1.487c-.051.663.139 1.2.343 1.515.227.343.51.176.51.176s-.561.653-.037.931c.477.25 1.283.394 1.71-.037.31-.31.371-1.001.486-1.283.028-.065.12.111.209.199.097.093.264.195.264.195s-.755.324-.445 1.066c.102.246.468.403 1.066.398.222-.005 2.664-.139 3.313-.296.375-.088.505-.283.505-.283s1.566-.431 2.998-1.357c.917-.598 1.293-.76 2.034-.936.612-.148.57-1.098-.241-1.084-.839.009-1.575.44-2.196.825-1.163.718-1.742.672-1.742.672l-.018-.032c-.079-.13.371-1.293-.134-2.678-.547-1.515-1.413-1.881-1.344-1.997.297-.5 1.038-1.297 1.334-2.78.176-.899.13-2.377-.269-3.151-.074-.144-.732.241-.732.241s-.616-1.371-.788-1.483a.271.271 0 0 0-.157-.046z" + fill="currentColor" + /> + </svg> + ), + pnpm: (props: IconProps) => ( + <svg viewBox="0 0 24 24" {...props}> + <path + d="M0 0v7.5h7.5V0zm8.25 0v7.5h7.498V0zm8.25 0v7.5H24V0zM8.25 8.25v7.5h7.498v-7.5zm8.25 0v7.5H24v-7.5zM0 16.5V24h7.5v-7.5zm8.25 0V24h7.498v-7.5zm8.25 0V24H24v-7.5z" + fill="currentColor" + /> + </svg> + ), + react: (props: IconProps) => ( + <svg viewBox="0 0 24 24" {...props}> + <path + d="M14.23 12.004a2.236 2.236 0 0 1-2.235 2.236 2.236 2.236 0 0 1-2.236-2.236 2.236 2.236 0 0 1 2.235-2.236 2.236 2.236 0 0 1 2.236 2.236zm2.648-10.69c-1.346 0-3.107.96-4.888 2.622-1.78-1.653-3.542-2.602-4.887-2.602-.41 0-.783.093-1.106.278-1.375.793-1.683 3.264-.973 6.365C1.98 8.917 0 10.42 0 12.004c0 1.59 1.99 3.097 5.043 4.03-.704 3.113-.39 5.588.988 6.38.32.187.69.275 1.102.275 1.345 0 3.107-.96 4.888-2.624 1.78 1.654 3.542 2.603 4.887 2.603.41 0 .783-.09 1.106-.275 1.374-.792 1.683-3.263.973-6.365C22.02 15.096 24 13.59 24 12.004c0-1.59-1.99-3.097-5.043-4.032.704-3.11.39-5.587-.988-6.38-.318-.184-.688-.277-1.092-.278zm-.005 1.09v.006c.225 0 .406.044.558.127.666.382.955 1.835.73 3.704-.054.46-.142.945-.25 1.44-.96-.236-2.006-.417-3.107-.534-.66-.905-1.345-1.727-2.035-2.447 1.592-1.48 3.087-2.292 4.105-2.295zm-9.77.02c1.012 0 2.514.808 4.11 2.28-.686.72-1.37 1.537-2.02 2.442-1.107.117-2.154.298-3.113.538-.112-.49-.195-.964-.254-1.42-.23-1.868.054-3.32.714-3.707.19-.09.4-.127.563-.132zm4.882 3.05c.455.468.91.992 1.36 1.564-.44-.02-.89-.034-1.345-.034-.46 0-.915.01-1.36.034.44-.572.895-1.096 1.345-1.565zM12 8.1c.74 0 1.477.034 2.202.093.406.582.802 1.203 1.183 1.86.372.64.71 1.29 1.018 1.946-.308.655-.646 1.31-1.013 1.95-.38.66-.773 1.288-1.18 1.87-.728.063-1.466.098-2.21.098-.74 0-1.477-.035-2.202-.093-.406-.582-.802-1.204-1.183-1.86-.372-.64-.71-1.29-1.018-1.946.303-.657.646-1.313 1.013-1.954.38-.66.773-1.286 1.18-1.868.728-.064 1.466-.098 2.21-.098zm-3.635.254c-.24.377-.48.763-.704 1.16-.225.39-.435.782-.635 1.174-.265-.656-.49-1.31-.676-1.947.64-.15 1.315-.283 2.015-.386zm7.26 0c.695.103 1.365.23 2.006.387-.18.632-.405 1.282-.66 1.933-.2-.39-.41-.783-.64-1.174-.225-.392-.465-.774-.705-1.146zm3.063.675c.484.15.944.317 1.375.498 1.732.74 2.852 1.708 2.852 2.476-.005.768-1.125 1.74-2.857 2.475-.42.18-.88.342-1.355.493-.28-.958-.646-1.956-1.1-2.98.45-1.017.81-2.01 1.085-2.964zm-13.395.004c.278.96.645 1.957 1.1 2.98-.45 1.017-.812 2.01-1.086 2.964-.484-.15-.944-.318-1.37-.5-1.732-.737-2.852-1.706-2.852-2.474 0-.768 1.12-1.742 2.852-2.476.42-.18.88-.342 1.356-.494zm11.678 4.28c.265.657.49 1.312.676 1.948-.64.157-1.316.29-2.016.39.24-.375.48-.762.705-1.158.225-.39.435-.788.636-1.18zm-9.945.02c.2.392.41.783.64 1.175.23.39.465.772.705 1.143-.695-.102-1.365-.23-2.006-.386.18-.63.406-1.282.66-1.933zM17.92 16.32c.112.493.2.968.254 1.423.23 1.868-.054 3.32-.714 3.708-.147.09-.338.128-.563.128-1.012 0-2.514-.807-4.11-2.28.686-.72 1.37-1.536 2.02-2.44 1.107-.118 2.154-.3 3.113-.54zm-11.83.01c.96.234 2.006.415 3.107.532.66.905 1.345 1.727 2.035 2.446-1.595 1.483-3.092 2.295-4.11 2.295-.22-.005-.406-.05-.553-.132-.666-.38-.955-1.834-.73-3.703.054-.46.142-.944.25-1.438zm4.56.64c.44.02.89.034 1.345.034.46 0 .915-.01 1.36-.034-.44.572-.895 1.095-1.345 1.565-.455-.47-.91-.993-1.36-1.565z" + fill="currentColor" + /> + </svg> + ), + tailwind: (props: IconProps) => ( + <svg viewBox="0 0 24 24" {...props}> + <path + d="M12.001,4.8c-3.2,0-5.2,1.6-6,4.8c1.2-1.6,2.6-2.2,4.2-1.8c0.913,0.228,1.565,0.89,2.288,1.624 C13.666,10.618,15.027,12,18.001,12c3.2,0,5.2-1.6,6-4.8c-1.2,1.6-2.6,2.2-4.2,1.8c-0.913-0.228-1.565-0.89-2.288-1.624 C16.337,6.182,14.976,4.8,12.001,4.8z M6.001,12c-3.2,0-5.2,1.6-6,4.8c1.2-1.6,2.6-2.2,4.2-1.8c0.913,0.228,1.565,0.89,2.288,1.624 c1.177,1.194,2.538,2.576,5.512,2.576c3.2,0,5.2-1.6,6-4.8c-1.2,1.6-2.6,2.2-4.2,1.8c-0.913-0.228-1.565-0.89-2.288-1.624 C10.337,13.382,8.976,12,6.001,12z" + fill="currentColor" + /> + </svg> + ), + google: (props: IconProps) => ( + <svg role="img" viewBox="0 0 24 24" {...props}> + <path + fill="currentColor" + d="M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z" + /> + </svg> + ), + apple: (props: IconProps) => ( + <svg role="img" viewBox="0 0 24 24" {...props}> + <path + d="M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701" + fill="currentColor" + /> + </svg> + ), + paypal: (props: IconProps) => ( + <svg role="img" viewBox="0 0 24 24" {...props}> + <path + d="M7.076 21.337H2.47a.641.641 0 0 1-.633-.74L4.944.901C5.026.382 5.474 0 5.998 0h7.46c2.57 0 4.578.543 5.69 1.81 1.01 1.15 1.304 2.42 1.012 4.287-.023.143-.047.288-.077.437-.983 5.05-4.349 6.797-8.647 6.797h-2.19c-.524 0-.968.382-1.05.9l-1.12 7.106zm14.146-14.42a3.35 3.35 0 0 0-.607-.541c-.013.076-.026.175-.041.254-.93 4.778-4.005 7.201-9.138 7.201h-2.19a.563.563 0 0 0-.556.479l-1.187 7.527h-.506l-.24 1.516a.56.56 0 0 0 .554.647h3.882c.46 0 .85-.334.922-.788.06-.26.76-4.852.816-5.09a.932.932 0 0 1 .923-.788h.58c3.76 0 6.705-1.528 7.565-5.946.36-1.847.174-3.388-.777-4.471z" + fill="currentColor" + /> + </svg> + ), + spinner: (props: IconProps) => ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + strokeWidth="2" + strokeLinecap="round" + strokeLinejoin="round" + {...props} + > + <path d="M21 12a9 9 0 1 1-6.219-8.56" /> + </svg> + ), +}; diff --git a/components/layout/api-example.tsx b/components/layout/api-example.tsx deleted file mode 100644 index e4cf7feba..000000000 --- a/components/layout/api-example.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from "react"; - -import { APIExample as FumaAPIExample } from "fumadocs-openapi/ui"; - -const APIExample: React.FC<{ children?: React.ReactNode }> = ({ children }) => { - return <FumaAPIExample className="flex-1">{children}</FumaAPIExample>; -}; - -export { APIExample }; diff --git a/components/layout/api.tsx b/components/layout/api.tsx deleted file mode 100644 index 8be29a0a3..000000000 --- a/components/layout/api.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from "react"; - -import { API as FumaAPI } from "fumadocs-openapi/ui"; -import { cn } from "@/lib/utils"; - -const API: React.FC<{ children?: React.ReactNode; className?: string }> = ({ - children, - className, -}) => { - return ( - <FumaAPI className={cn("mb-14 gap-x-12", className)}>{children}</FumaAPI> - ); -}; - -export { API }; diff --git a/components/layout/index.ts b/components/layout/index.ts deleted file mode 100644 index 9a2f6a7cf..000000000 --- a/components/layout/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { Root } from "./root"; -export { API } from "./api"; -export { APIExample } from "./api-example"; -export { Property } from "./property"; -export { Info } from "./info"; diff --git a/components/layout/info.tsx b/components/layout/info.tsx deleted file mode 100644 index 3b3c13ee6..000000000 --- a/components/layout/info.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; - -import { cn } from "@/lib/utils"; - -const Info: React.FC<{ children?: React.ReactNode; className?: string }> = ({ - children, - className, -}) => { - return ( - <div className={cn("min-w-0 flex-1 prose-no-margin", className)}> - {children} - </div> - ); -}; - -export { Info }; diff --git a/components/layout/language-toggle.tsx b/components/layout/language-toggle.tsx new file mode 100644 index 000000000..0de9a0448 --- /dev/null +++ b/components/layout/language-toggle.tsx @@ -0,0 +1,64 @@ +"use client"; +import { type ButtonHTMLAttributes, type HTMLAttributes } from "react"; +import { useI18n } from "fumadocs-ui/provider"; +import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover"; +import { cn } from "../../lib/utils"; +import { buttonVariants } from "../ui/button"; + +export type LanguageSelectProps = ButtonHTMLAttributes<HTMLButtonElement>; + +export function LanguageToggle(props: LanguageSelectProps): React.ReactElement { + const context = useI18n(); + if (!context.locales) throw new Error("Missing `<I18nProvider />`"); + + return ( + <Popover> + <PopoverTrigger + aria-label={context.text.chooseLanguage} + {...props} + className={cn( + buttonVariants({ + variant: "ghost", + className: "gap-1.5 p-1.5", + }), + props.className + )} + > + {props.children} + </PopoverTrigger> + <PopoverContent className="flex flex-col overflow-hidden p-0"> + <p className="mb-1 p-2 text-xs font-medium text-fd-muted-foreground"> + {context.text.chooseLanguage} + </p> + {context.locales.map((item) => ( + <button + key={item.locale} + type="button" + className={cn( + "p-2 text-start text-sm", + item.locale === context.locale + ? "bg-fd-primary/10 font-medium text-fd-primary" + : "hover:bg-fd-accent hover:text-fd-accent-foreground" + )} + onClick={() => { + context.onChange?.(item.locale); + }} + > + {item.name} + </button> + ))} + </PopoverContent> + </Popover> + ); +} + +export function LanguageToggleText( + props: HTMLAttributes<HTMLSpanElement> +): React.ReactElement { + const context = useI18n(); + const text = context.locales?.find( + (item) => item.locale === context.locale + )?.name; + + return <span {...props}>{text}</span>; +} diff --git a/components/layout/nav.tsx b/components/layout/nav.tsx new file mode 100644 index 000000000..182f7c2ec --- /dev/null +++ b/components/layout/nav.tsx @@ -0,0 +1,93 @@ +"use client"; +import Link, { type LinkProps } from "fumadocs-core/link"; +import { + createContext, + type ReactNode, + useContext, + useEffect, + useMemo, + useState, +} from "react"; +import { cn } from "../../lib/utils"; +import { useI18n } from "fumadocs-ui/provider"; + +export interface NavProviderProps { + /** + * Use transparent background + * + * @defaultValue none + */ + transparentMode?: "always" | "top" | "none"; +} + +export interface TitleProps { + title?: ReactNode; + + /** + * Redirect url of title + * @defaultValue '/' + */ + url?: string; +} + +interface NavContextType { + isTransparent: boolean; +} + +const NavContext = createContext<NavContextType>({ + isTransparent: false, +}); + +export function NavProvider({ + transparentMode = "none", + children, +}: NavProviderProps & { children: ReactNode }) { + const [transparent, setTransparent] = useState(transparentMode !== "none"); + + useEffect(() => { + if (transparentMode !== "top") return; + + const listener = () => { + setTransparent(window.scrollY < 10); + }; + + listener(); + window.addEventListener("scroll", listener); + return () => { + window.removeEventListener("scroll", listener); + }; + }, [transparentMode]); + + return ( + <NavContext.Provider + value={useMemo(() => ({ isTransparent: transparent }), [transparent])} + > + {children} + </NavContext.Provider> + ); +} + +export function useNav(): NavContextType { + return useContext(NavContext); +} + +export function Title({ + title, + url, + ...props +}: TitleProps & Omit<LinkProps, "title">) { + const { locale } = useI18n(); + + return ( + <Link + href={url ?? (locale ? `/${locale}` : "/")} + {...props} + className={cn( + "inline-flex items-center gap-2.5 font-semibold", + props.className + )} + > + {title} + </Link> + ); +} diff --git a/components/layout/property.tsx b/components/layout/property.tsx deleted file mode 100644 index fd3cf2ab1..000000000 --- a/components/layout/property.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; - -import { Property as FumaProperty } from "fumadocs-openapi/ui"; - -const Property: React.FC<{ - children?: React.ReactNode; - required: boolean; - deprecated?: boolean; - name: string; - type: string; -}> = (props) => { - return ( - <FumaProperty {...props} deprecated={props.deprecated ?? false}> - {props.children} - </FumaProperty> - ); -}; - -export { Property }; diff --git a/components/layout/root-toggle.tsx b/components/layout/root-toggle.tsx new file mode 100644 index 000000000..242f69c6a --- /dev/null +++ b/components/layout/root-toggle.tsx @@ -0,0 +1,109 @@ +"use client"; +import { ChevronsUpDown } from "lucide-react"; +import { type HTMLAttributes, type ReactNode, useMemo, useState } from "react"; +import Link from "next/link"; +import { usePathname } from "next/navigation"; +import { cn } from "@/lib/utils"; +import { isActive } from "@/lib/is-active"; +import { useSidebar } from "fumadocs-ui/provider"; +import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover"; + +export interface Option { + /** + * Redirect URL of the folder, usually the index page + */ + url: string; + + icon?: ReactNode; + title: ReactNode; + description?: ReactNode; + + /** + * Detect from a list of urls + */ + urls?: Set<string>; + + props?: HTMLAttributes<HTMLElement>; +} + +export function RootToggle({ + options, + placeholder, + ...props +}: { + placeholder?: ReactNode; + options: Option[]; +} & HTMLAttributes<HTMLButtonElement>) { + const [open, setOpen] = useState(false); + const { closeOnRedirect } = useSidebar(); + const pathname = usePathname(); + + const selected = useMemo(() => { + return options.findLast((item) => + item.urls + ? item.urls.has( + pathname.endsWith("/") ? pathname.slice(0, -1) : pathname + ) + : isActive(item.url, pathname, true) + ); + }, [options, pathname]); + + const onClick = () => { + closeOnRedirect.current = false; + setOpen(false); + }; + + const item = selected ? <Item {...selected} /> : placeholder; + + return ( + <Popover open={open} onOpenChange={setOpen}> + {item ? ( + <PopoverTrigger + {...props} + className={cn( + "flex flex-row items-center gap-2.5 rounded-lg ps-2 pe-4 py-1.5 hover:bg-fd-accent/50 hover:text-fd-accent-foreground", + props.className + )} + > + {item} + <ChevronsUpDown className="size-4 text-fd-muted-foreground" /> + </PopoverTrigger> + ) : null} + <PopoverContent className="w-(--radix-popover-trigger-width) overflow-hidden p-0"> + {options.map((item) => ( + <Link + key={item.url} + href={item.url} + onClick={onClick} + {...item.props} + className={cn( + "flex w-full flex-row items-center gap-2 px-2 py-1.5", + selected === item + ? "bg-fd-accent text-fd-accent-foreground" + : "hover:bg-fd-accent/50", + item.props?.className + )} + > + <Item {...item} /> + </Link> + ))} + </PopoverContent> + </Popover> + ); +} + +function Item(props: Option) { + return ( + <> + {props.icon} + <div className="flex-1 text-start"> + <p className="text-sm font-medium">{props.title}</p> + {props.description ? ( + <p className="text-xs text-fd-muted-foreground"> + {props.description} + </p> + ) : null} + </div> + </> + ); +} diff --git a/components/layout/root.tsx b/components/layout/root.tsx deleted file mode 100644 index fa39ed35e..000000000 --- a/components/layout/root.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from "react"; - -import { Root as FumaRoot } from "fumadocs-openapi/ui"; - -const Root: React.FC<{ children?: React.ReactNode }> = ({ children }) => { - return <FumaRoot className="gap-0">{children}</FumaRoot>; -}; - -export { Root }; diff --git a/components/layout/search-toggle.tsx b/components/layout/search-toggle.tsx new file mode 100644 index 000000000..92366c259 --- /dev/null +++ b/components/layout/search-toggle.tsx @@ -0,0 +1,73 @@ +"use client"; +import { type ButtonHTMLAttributes } from "react"; +import { SearchIcon } from "lucide-react"; +import { useSearchContext } from "fumadocs-ui/provider"; +import { useI18n } from "fumadocs-ui/provider"; +import { cn } from "../../lib/utils"; +import { buttonVariants } from "../ui/button"; + +export function SearchToggle({ + hideIfDisabled, + ...props +}: ButtonHTMLAttributes<HTMLButtonElement> & { + hideIfDisabled?: boolean; +}) { + const { setOpenSearch, enabled } = useSearchContext(); + if (hideIfDisabled && !enabled) return null; + + return ( + <button + type="button" + className={cn( + buttonVariants({ + size: "icon", + variant: "ghost", + }), + props.className + )} + data-search="" + aria-label="Open Search" + onClick={() => { + setOpenSearch(true); + }} + > + <SearchIcon /> + </button> + ); +} + +export function LargeSearchToggle({ + hideIfDisabled, + ...props +}: ButtonHTMLAttributes<HTMLButtonElement> & { + hideIfDisabled?: boolean; +}) { + const { enabled, hotKey, setOpenSearch } = useSearchContext(); + const { text } = useI18n(); + if (hideIfDisabled && !enabled) return null; + + return ( + <button + type="button" + data-search-full="" + {...props} + className={cn( + "inline-flex items-center gap-2 rounded-full border bg-fd-secondary/50 p-1.5 text-sm text-fd-muted-foreground transition-colors hover:bg-fd-accent hover:text-fd-accent-foreground", + props.className + )} + onClick={() => { + setOpenSearch(true); + }} + > + <SearchIcon className="ms-1 size-4" /> + {text.search} + <div className="ms-auto inline-flex gap-0.5"> + {hotKey.map((k, i) => ( + <kbd key={i} className="rounded-md border bg-fd-background px-1.5"> + {k.display} + </kbd> + ))} + </div> + </button> + ); +} diff --git a/components/layout/theme-toggle.tsx b/components/layout/theme-toggle.tsx new file mode 100644 index 000000000..79d0c5282 --- /dev/null +++ b/components/layout/theme-toggle.tsx @@ -0,0 +1,55 @@ +"use client"; + +import { cva } from "class-variance-authority"; +import { Moon, Sun, Airplay } from "lucide-react"; +import { useTheme } from "next-themes"; +import { type HTMLAttributes, useLayoutEffect, useState } from "react"; +import { cn } from "../../lib/utils"; + +const itemVariants = cva("rounded p-1.5 text-fd-muted-foreground", { + variants: { + active: { + true: "bg-white dark:dark:bg-neutral-950 text-primary", + false: "text-muted-foreground cursor-pointer", + }, + }, +}); + +const full = [["light", Sun] as const, ["dark", Moon] as const]; + +export function ThemeToggle({ + className, + mode = "light-dark", + ...props +}: HTMLAttributes<HTMLElement> & { + mode?: "light-dark"; +}) { + const { setTheme, resolvedTheme } = useTheme(); + const [mounted, setMounted] = useState(false); + + useLayoutEffect(() => { + setMounted(true); + }, []); + + const container = cn( + "bg-neutral-150 dark:bg-neutral-700 inline-flex items-center rounded p-1", + className + ); + + const value = mounted ? resolvedTheme : null; + + return ( + <div className={container} data-theme-toggle="" {...props}> + {full.map(([key, Icon]) => ( + <button + key={key} + aria-label={key} + className={cn(itemVariants({ active: value === key }))} + onClick={() => setTheme(key)} + > + <Icon className="size-4" fill="transparent" /> + </button> + ))} + </div> + ); +} diff --git a/components/layout/toc-clerk.tsx b/components/layout/toc-clerk.tsx new file mode 100644 index 000000000..2b8797dcc --- /dev/null +++ b/components/layout/toc-clerk.tsx @@ -0,0 +1,162 @@ +"use client"; +import type { TOCItemType } from "fumadocs-core/server"; +import * as Primitive from "fumadocs-core/toc"; +import { useEffect, useRef, useState } from "react"; +import { cn } from "../../lib/utils"; +import { TocThumb } from "./toc-thumb"; +import { TocItemsEmpty } from "./toc"; + +export default function ClerkTOCItems({ items }: { items: TOCItemType[] }) { + const containerRef = useRef<HTMLDivElement>(null); + + const [svg, setSvg] = useState<{ + path: string; + width: number; + height: number; + }>(); + + useEffect(() => { + if (!containerRef.current) return; + const container = containerRef.current; + + function onResize(): void { + if (container.clientHeight === 0) return; + let w = 0, + h = 0; + const d: string[] = []; + for (let i = 0; i < items.length; i++) { + const element: HTMLElement | null = container.querySelector( + `a[href="#${items[i].url.slice(1)}"]` + ); + if (!element) continue; + + const styles = getComputedStyle(element); + const offset = getLineOffset(items[i].depth) + 1, + top = element.offsetTop + parseFloat(styles.paddingTop), + bottom = + element.offsetTop + + element.clientHeight - + parseFloat(styles.paddingBottom); + + w = Math.max(offset, w); + h = Math.max(h, bottom); + + d.push(`${i === 0 ? "M" : "L"}${offset} ${top}`); + d.push(`L${offset} ${bottom}`); + } + + setSvg({ + path: d.join(" "), + width: w + 1, + height: h, + }); + } + + const observer = new ResizeObserver(onResize); + onResize(); + + observer.observe(container); + return () => { + observer.disconnect(); + }; + }, [items]); + + if (items.length === 0) return <TocItemsEmpty />; + + return ( + <> + {svg ? ( + <div + className="absolute start-0 top-0 rtl:-scale-x-100" + style={{ + width: svg.width, + height: svg.height, + maskImage: `url("data:image/svg+xml,${ + // Inline SVG + encodeURIComponent( + `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${svg.width} ${svg.height}"><path d="${svg.path}" stroke="black" stroke-width="1" fill="none" /></svg>` + ) + }")`, + }} + > + <TocThumb + containerRef={containerRef} + className="mt-(--fd-top) h-(--fd-height) bg-fd-primary transition-all" + /> + </div> + ) : null} + <div className="flex flex-col" ref={containerRef}> + {items.map((item, i) => ( + <TOCItem + key={item.url} + item={item} + upper={items[i - 1]?.depth} + lower={items[i + 1]?.depth} + /> + ))} + </div> + </> + ); +} + +function getItemOffset(depth: number): number { + if (depth <= 2) return 14; + if (depth === 3) return 26; + return 36; +} + +function getLineOffset(depth: number): number { + return depth >= 3 ? 10 : 0; +} + +function TOCItem({ + item, + upper = item.depth, + lower = item.depth, +}: { + item: TOCItemType; + upper?: number; + lower?: number; +}) { + const offset = getLineOffset(item.depth), + upperOffset = getLineOffset(upper), + lowerOffset = getLineOffset(lower); + + return ( + <Primitive.TOCItem + href={item.url} + style={{ + paddingInlineStart: getItemOffset(item.depth), + }} + className="prose relative py-1.5 text-sm text-fd-muted-foreground transition-colors [overflow-wrap:anywhere] first:pt-0 last:pb-0 data-[active=true]:text-fd-primary" + > + {offset !== upperOffset ? ( + <svg + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 16 16" + className="absolute -top-1.5 start-0 size-4 rtl:-scale-x-100" + > + <line + x1={upperOffset} + y1="0" + x2={offset} + y2="12" + className="stroke-fd-foreground/10" + strokeWidth="1" + /> + </svg> + ) : null} + <div + className={cn( + "absolute inset-y-0 w-px bg-fd-foreground/10", + offset !== upperOffset && "top-1.5", + offset !== lowerOffset && "bottom-1.5" + )} + style={{ + insetInlineStart: offset, + }} + /> + {item.title} + </Primitive.TOCItem> + ); +} diff --git a/components/layout/toc-thumb.tsx b/components/layout/toc-thumb.tsx new file mode 100644 index 000000000..bdced31ad --- /dev/null +++ b/components/layout/toc-thumb.tsx @@ -0,0 +1,73 @@ +import { type HTMLAttributes, type RefObject, useEffect, useRef } from 'react'; +import * as Primitive from 'fumadocs-core/toc'; +import { useOnChange } from 'fumadocs-core/utils/use-on-change'; +import { useEffectEvent } from 'fumadocs-core/utils/use-effect-event'; + +export type TOCThumb = [top: number, height: number]; + +function calc(container: HTMLElement, active: string[]): TOCThumb { + if (active.length === 0 || container.clientHeight === 0) { + return [0, 0]; + } + + let upper = Number.MAX_VALUE, + lower = 0; + + for (const item of active) { + const element = container.querySelector<HTMLElement>(`a[href="#${item}"]`); + if (!element) continue; + + const styles = getComputedStyle(element); + upper = Math.min(upper, element.offsetTop + parseFloat(styles.paddingTop)); + lower = Math.max( + lower, + element.offsetTop + + element.clientHeight - + parseFloat(styles.paddingBottom), + ); + } + + return [upper, lower - upper]; +} + +function update(element: HTMLElement, info: TOCThumb): void { + element.style.setProperty('--fd-top', `${info[0]}px`); + element.style.setProperty('--fd-height', `${info[1]}px`); +} + +export function TocThumb({ + containerRef, + ...props +}: HTMLAttributes<HTMLDivElement> & { + containerRef: RefObject<HTMLElement | null>; +}) { + const active = Primitive.useActiveAnchors(); + const thumbRef = useRef<HTMLDivElement>(null); + + const onResize = useEffectEvent(() => { + if (!containerRef.current || !thumbRef.current) return; + + update(thumbRef.current, calc(containerRef.current, active)); + }); + + useEffect(() => { + if (!containerRef.current) return; + const container = containerRef.current; + + onResize(); + const observer = new ResizeObserver(onResize); + observer.observe(container); + + return () => { + observer.disconnect(); + }; + }, [containerRef, onResize]); + + useOnChange(active, () => { + if (!containerRef.current || !thumbRef.current) return; + + update(thumbRef.current, calc(containerRef.current, active)); + }); + + return <div ref={thumbRef} role="none" {...props} />; +} diff --git a/components/layout/toc.tsx b/components/layout/toc.tsx new file mode 100644 index 000000000..2a11f0a73 --- /dev/null +++ b/components/layout/toc.tsx @@ -0,0 +1,227 @@ +"use client"; +import type { TOCItemType } from "fumadocs-core/server"; +import * as Primitive from "fumadocs-core/toc"; +import { + type ComponentProps, + createContext, + type HTMLAttributes, + type ReactNode, + use, + useMemo, + useRef, +} from "react"; +import { cn } from "../../lib/utils"; +import { useI18n } from "fumadocs-ui/provider"; +import { TocThumb } from "./toc-thumb"; +import { ScrollArea, ScrollViewport } from "../ui/scroll-area"; +import type { + PopoverContentProps, + PopoverTriggerProps, +} from "@radix-ui/react-popover"; +import { ChevronRight, Text } from "lucide-react"; +import { usePageStyles } from "fumadocs-ui/provider"; +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "../ui/collapsible"; + +export interface TOCProps { + /** + * Custom content in TOC container, before the main TOC + */ + header?: ReactNode; + + /** + * Custom content in TOC container, after the main TOC + */ + footer?: ReactNode; + + children: ReactNode; +} + +export function Toc(props: HTMLAttributes<HTMLDivElement>) { + const { toc } = usePageStyles(); + + return ( + <div + id="nd-toc" + {...props} + className={cn( + "sticky top-[calc(var(--fd-banner-height)+var(--fd-nav-height))] h-(--fd-toc-height) pb-2 pt-12", + toc, + props.className + )} + style={ + { + ...props.style, + "--fd-toc-height": + "calc(100dvh - var(--fd-banner-height) - var(--fd-nav-height))", + } as object + } + > + <div className="flex h-full w-(--fd-toc-width) max-w-full flex-col gap-3 pe-4"> + {props.children} + </div> + </div> + ); +} + +export function TocItemsEmpty() { + const { text } = useI18n(); + + return ( + <div className="rounded-lg border bg-fd-card p-3 text-xs text-fd-muted-foreground"> + {text.tocNoHeadings} + </div> + ); +} + +export function TOCScrollArea({ + isMenu, + ...props +}: ComponentProps<typeof ScrollArea> & { isMenu?: boolean }) { + const viewRef = useRef<HTMLDivElement>(null); + + return ( + <ScrollArea + {...props} + className={cn("flex flex-col ps-px", props.className)} + > + <Primitive.ScrollProvider containerRef={viewRef}> + <ScrollViewport + className={cn( + "relative min-h-0 text-sm", + isMenu && "mt-2 mb-4 mx-4 md:mx-6" + )} + ref={viewRef} + > + {props.children} + </ScrollViewport> + </Primitive.ScrollProvider> + </ScrollArea> + ); +} + +export function TOCItems({ items }: { items: TOCItemType[] }) { + const containerRef = useRef<HTMLDivElement>(null); + + if (items.length === 0) return <TocItemsEmpty />; + + return ( + <> + <TocThumb + containerRef={containerRef} + className="absolute start-0 mt-(--fd-top) h-(--fd-height) w-px bg-fd-primary transition-all" + /> + <div + ref={containerRef} + className="flex flex-col border-s border-fd-foreground/10" + > + {items.map((item) => ( + <TOCItem key={item.url} item={item} /> + ))} + </div> + </> + ); +} + +function TOCItem({ item }: { item: TOCItemType }) { + return ( + <Primitive.TOCItem + href={item.url} + className={cn( + "prose py-1.5 text-sm text-fd-muted-foreground transition-colors [overflow-wrap:anywhere] first:pt-0 last:pb-0 data-[active=true]:text-fd-primary", + item.depth <= 2 && "ps-3", + item.depth === 3 && "ps-6", + item.depth >= 4 && "ps-8" + )} + > + {item.title} + </Primitive.TOCItem> + ); +} + +type MakeRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] }; + +const Context = createContext<{ + open: boolean; + setOpen: (open: boolean) => void; +} | null>(null); + +const TocProvider = Context.Provider || Context; + +export function TocPopover({ + open, + onOpenChange, + ref: _ref, + ...props +}: MakeRequired<ComponentProps<typeof Collapsible>, "open" | "onOpenChange">) { + return ( + <Collapsible open={open} onOpenChange={onOpenChange} {...props}> + <TocProvider + value={useMemo( + () => ({ + open, + setOpen: onOpenChange, + }), + [onOpenChange, open] + )} + > + {props.children} + </TocProvider> + </Collapsible> + ); +} + +export function TocPopoverTrigger({ + items, + ...props +}: PopoverTriggerProps & { items: TOCItemType[] }) { + const { text } = useI18n(); + const { open } = use(Context)!; + const active = Primitive.useActiveAnchor(); + const current = useMemo(() => { + return items.find((item) => active === item.url.slice(1))?.title; + }, [items, active]); + + return ( + <CollapsibleTrigger + {...props} + className={cn( + "inline-flex items-center text-sm gap-2 text-nowrap px-4 py-2.5 text-start md:px-6 focus-visible:outline-none", + props.className + )} + > + <Text className="size-4 shrink-0" /> + {text.toc} + <ChevronRight + className={cn( + "size-4 shrink-0 text-fd-muted-foreground transition-all", + !current && "opacity-0", + open ? "rotate-90" : "-ms-1.5" + )} + /> + <span + className={cn( + "truncate text-fd-muted-foreground transition-opacity -ms-1.5", + (!current || open) && "opacity-0" + )} + > + {current} + </span> + </CollapsibleTrigger> + ); +} + +export function TocPopoverContent(props: PopoverContentProps) { + return ( + <CollapsibleContent + data-toc-popover="" + className="flex flex-col max-h-[50vh]" + {...props} + > + {props.children} + </CollapsibleContent> + ); +} diff --git a/components/links.tsx b/components/links.tsx new file mode 100644 index 000000000..263b6167c --- /dev/null +++ b/components/links.tsx @@ -0,0 +1,127 @@ +'use client'; +import Link from 'fumadocs-core/link'; +import { usePathname } from 'next/navigation'; +import { + type AnchorHTMLAttributes, + forwardRef, + type HTMLAttributes, + type ReactNode, +} from 'react'; +import { isActive } from '../lib/is-active'; + +interface BaseItem { + /** + * Restrict where the item is displayed + * + * @defaultValue 'all' + */ + on?: 'menu' | 'nav' | 'all'; +} + +export interface BaseLinkType extends BaseItem { + url: string; + /** + * When the item is marked as active + * + * @defaultValue 'url' + */ + active?: 'url' | 'nested-url' | 'none'; + external?: boolean; +} + +export interface MainItemType extends BaseLinkType { + type?: 'main'; + icon?: ReactNode; + text: ReactNode; + description?: ReactNode; +} + +export interface IconItemType extends BaseLinkType { + type: 'icon'; + /** + * `aria-label` of icon button + */ + label?: string; + icon: ReactNode; + text: ReactNode; + /** + * @defaultValue true + */ + secondary?: boolean; +} + +interface ButtonItem extends BaseLinkType { + type: 'button'; + icon?: ReactNode; + text: ReactNode; + /** + * @defaultValue false + */ + secondary?: boolean; +} + +export interface MenuItemType extends BaseItem { + type: 'menu'; + icon?: ReactNode; + text: ReactNode; + + url?: string; + items: ( + | (MainItemType & { + /** + * Options when displayed on navigation menu + */ + menu?: HTMLAttributes<HTMLElement> & { + banner?: ReactNode; + footer?: ReactNode; + }; + }) + | CustomItem + )[]; + + /** + * @defaultValue false + */ + secondary?: boolean; +} + +interface CustomItem extends BaseItem { + type: 'custom'; + /** + * @defaultValue false + */ + secondary?: boolean; + children: ReactNode; +} + +export type LinkItemType = + | MainItemType + | IconItemType + | ButtonItem + | MenuItemType + | CustomItem; + +export const BaseLinkItem = forwardRef< + HTMLAnchorElement, + Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & { item: BaseLinkType } +>(({ item, ...props }, ref) => { + const pathname = usePathname(); + const activeType = item.active ?? 'url'; + const active = + activeType !== 'none' && + isActive(item.url, pathname, activeType === 'nested-url'); + + return ( + <Link + ref={ref} + href={item.url} + external={item.external} + {...props} + data-active={active} + > + {props.children} + </Link> + ); +}); + +BaseLinkItem.displayName = 'BaseLinkItem'; diff --git a/components/lists.tsx b/components/lists.tsx index 9c52f5097..1764b106c 100644 --- a/components/lists.tsx +++ b/components/lists.tsx @@ -32,12 +32,14 @@ function OrderedList({ children, items }: ListProps) { {validChildren.map((child, index) => { if (!React.isValidElement(child)) return null; + const element = child as React.ReactElement<{ children?: ReactNode }>; + return ( <li key={index} className="flex items-baseline gap-4"> <span className="flex-shrink-0 w-7 h-7 bg-secondary rounded flex items-center justify-center text-primary font-mono"> {index + 1} </span> - <span className="mt-1">{child.props.children}</span> + <span className="mt-1">{element.props.children}</span> </li> ); })} @@ -72,12 +74,15 @@ function UnorderedList({ children, items }: ListProps) { {validChildren.map((child, index) => { if (!React.isValidElement(child)) return null; + // Cast child to access props + const element = child as React.ReactElement<{ children?: ReactNode }>; + return ( <li key={index} className="relative pl-0 text-muted-foreground before:content-[''] before:absolute before:left-[-1.5rem] before:top-[0.875rem] before:w-[0.75rem] before:h-[1px] before:border-t before:border-border list-none" > - {child.props.children} + {element.props.children} </li> ); })} diff --git a/components/llm-share.tsx b/components/llm-share.tsx new file mode 100644 index 000000000..ccdd3847d --- /dev/null +++ b/components/llm-share.tsx @@ -0,0 +1,236 @@ +"use client"; + +import { useState, useEffect } from "react"; +import { usePathname } from "next/navigation"; +import { Button, buttonVariants } from "./ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, + DropdownMenuSeparator, +} from "./ui/dropdown-menu"; +import { Copy, ExternalLink, Check, FileText } from "lucide-react"; +import { OpenAIIcon, ClaudeIcon } from "@/components/ui/icon"; + +interface LLMShareProps { + content: string; +} + +const LLM_PROVIDERS = [ + { + name: "ChatGPT", + url: "https://chat.openai.com", + icon: OpenAIIcon, + description: "Ask questions about this page", + }, + { + name: "Claude", + url: "https://claude.ai", + icon: ClaudeIcon, + description: "Ask questions about this page", + }, +]; + +export function LLMShare({ content }: LLMShareProps) { + const [isCopied, setIsCopied] = useState(false); + const pathname = usePathname(); + + useEffect(() => { + let timeoutId: NodeJS.Timeout; + if (isCopied) { + timeoutId = setTimeout(() => { + setIsCopied(false); + }, 2000); + } + return () => clearTimeout(timeoutId); + }, [isCopied]); + + const handleCopy = async () => { + try { + await navigator.clipboard.writeText(content); + setIsCopied(true); + } catch (err) { + console.error("Failed to copy text: ", err); + } + }; + + // Function to open the raw markdown view (browser-compatible) + const handleViewRawMarkdown = () => { + if (!pathname) return; + + // Assuming paths start like /docs/... + let basePath = pathname; + if (basePath.startsWith("/docs")) { + basePath = basePath.substring(5); // Remove '/docs' prefix + } + + // Construct the /raw path + let rawPath = + "/raw" + (basePath.startsWith("/") ? basePath : "/" + basePath); + + // Append .mdx or /index.mdx + if (rawPath === "/raw" || rawPath.endsWith("/")) { + // Handle root case (e.g. /docs/ -> /raw/index.mdx) or trailing slash (/docs/section/ -> /raw/section/index.mdx) + rawPath = rawPath.endsWith("/") + ? rawPath + "index.mdx" + : "/raw/index.mdx"; + } else { + // Append .mdx to non-index paths + rawPath += ".mdx"; + } + + // Clean up potential double slashes + rawPath = rawPath.replace(/\/+/g, "/"); + + window.open(rawPath, "_blank"); + }; + + const handleShare = async ( + provider: Omit<(typeof LLM_PROVIDERS)[number], "prepend"> + ) => { + let llmsApiPath = "/api/llms/llms.txt"; // Default to root + + if (pathname) { + const pathSegments = pathname.split("/").filter(Boolean); // e.g., ['docs', 'stacks', 'clarinet', 'quickstart'] + + // Check if it's a docs path and has section/page info + if (pathSegments[0] === "docs" && pathSegments.length > 1) { + // Get path segments *after* 'docs' + const pagePathSegments = pathSegments.slice(1); + + // Get segments for the parent directory (all except the last one) + const parentDirSegments = pagePathSegments.slice(0, -1); + + if (parentDirSegments.length > 0) { + // If there are parent directory segments, construct the section path + llmsApiPath = `/api/llms/${parentDirSegments.join("/")}/llms.txt`; + } else { + // If only one segment after 'docs' (e.g., /docs/intro), it belongs to the root context + llmsApiPath = "/api/llms/llms.txt"; + } + } + // else: If path is just '/docs' or doesn't start with '/docs', the default root path is used + + // Clean up potential double slashes + llmsApiPath = llmsApiPath.replace(/\/+/g, "/"); + } + + const baseUrl = typeof window !== "undefined" ? window.location.origin : ""; + const llmsTxtUrl = `${baseUrl}${llmsApiPath}`; + + try { + const response = await fetch(llmsTxtUrl); + if (!response.ok) { + throw new Error( + `Failed to fetch LLM context (${response.status}) from ${llmsTxtUrl}` + ); + } + const llmsTxtContent = await response.text(); + + const instruction = `Please use the following documentation context (list of relevant pages) to answer my questions:\n\n${llmsTxtContent}\n\nBe ready to answer my questions about it.`; + const encodedInstruction = encodeURIComponent(instruction); + let shareUrl = `${provider.url}`; + if (provider.name === "ChatGPT") { + shareUrl += `?q=${encodedInstruction}`; + } else if (provider.name === "Claude") { + shareUrl += `?q=${encodedInstruction}`; + } else { + shareUrl += `?q=${encodedInstruction}`; + } + + window.open(shareUrl, "_blank"); + } catch (error) { + console.error("[LLMShare] Failed to fetch or share LLM context:", error); + } + }; + + return ( + <div className="inline-flex rounded-md border border-border"> + <Button + variant="outline" + onClick={handleCopy} + className="relative inline-flex items-center gap-2 rounded-l-md rounded-r-none px-3 py-1.5 text-sm font-medium focus:z-10 border-0 shadow-none transition-all duration-150" + > + {isCopied ? ( + <Check className="h-4 w-4 text-green-500" /> + ) : ( + <Copy className="h-4 w-4" /> + )} + {isCopied ? "Copied!" : "Copy page"} + </Button> + <DropdownMenu> + <DropdownMenuTrigger asChild> + <Button + variant="outline" + aria-label="Share options" + className="relative inline-flex items-center rounded-r-md rounded-l-none p-1.5 focus:z-10 border-0 border-l border-border shadow-none" + > + <span className="sr-only">Open options</span> + <svg + className="h-4 w-4" + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 20 20" + fill="currentColor" + aria-hidden="true" + > + <path + fillRule="evenodd" + d="M5.23 7.21a.75.75 0 011.06.02L10 10.94l3.71-3.71a.75.75 0 111.06 1.06l-4.25 4.25a.75.75 0 01-1.06 0L5.23 8.29a.75.75 0 01.02-1.06z" + clipRule="evenodd" + /> + </svg> + </Button> + </DropdownMenuTrigger> + <DropdownMenuContent align="end" className="w-64"> + <DropdownMenuItem onSelect={handleCopy} className="cursor-pointer"> + <div className="flex flex-col"> + <div className="flex items-center gap-2"> + <Copy className="h-4 w-4 text-muted-foreground" /> + <span className="font-medium">Copy page</span> + </div> + <span className="text-xs text-muted-foreground ml-6"> + Copy this page as Markdown for LLMs + </span> + </div> + </DropdownMenuItem> + {/* View as Markdown item - Uncommented and logic added */} + <DropdownMenuItem + onSelect={handleViewRawMarkdown} + className="cursor-pointer" + > + <div className="flex flex-col"> + <div className="flex items-center gap-2"> + <FileText className="h-4 w-4 text-muted-foreground" /> + <span className="font-medium">View as Markdown</span> + </div> + <span className="text-xs text-muted-foreground ml-6"> + View this page as plain text + </span> + </div> + <ExternalLink className="ml-auto h-4 w-4 text-muted-foreground" /> + </DropdownMenuItem> + <DropdownMenuSeparator /> + {LLM_PROVIDERS.map((provider) => ( + <DropdownMenuItem + key={provider.name} + onSelect={() => handleShare(provider)} + className="cursor-pointer" + > + <div className="flex flex-col"> + <div className="flex items-center gap-2"> + <provider.icon className="h-4 w-4 text-muted-foreground" /> + <span className="font-medium">Open in {provider.name}</span> + </div> + <span className="text-xs text-muted-foreground ml-6"> + {provider.description} + </span> + </div> + <ExternalLink className="ml-auto h-4 w-4 text-muted-foreground" /> + </DropdownMenuItem> + ))} + </DropdownMenuContent> + </DropdownMenu> + </div> + ); +} diff --git a/components/main-nav.tsx b/components/main-nav.tsx new file mode 100644 index 000000000..f367e82d2 --- /dev/null +++ b/components/main-nav.tsx @@ -0,0 +1,91 @@ +"use client"; + +import Link from "next/link"; +import { usePathname } from "next/navigation"; + +// import { siteConfig } from "@/config/site" +import { cn } from "@/lib/utils"; +import { Icons } from "@/components/icons"; + +export function MainNav() { + const pathname = usePathname(); + + return ( + <div className="mr-4 hidden md:flex"> + <Link href="/" className="mr-4 flex items-center gap-2 lg:mr-6"> + <Icons.logo className="h-6 w-6" /> + <span className="hidden font-bold lg:inline-block">Hiro</span> + </Link> + <nav className="flex items-center gap-4 text-sm xl:gap-6"> + <Link + href="/docs/installation" + className={cn( + "transition-colors hover:text-foreground/80", + pathname === "/docs/installation" + ? "text-foreground" + : "text-foreground/80" + )} + > + Docs + </Link> + <Link + href="/docs/components" + className={cn( + "transition-colors hover:text-foreground/80", + pathname?.startsWith("/docs/components") && + !pathname?.startsWith("/docs/component/chart") + ? "text-foreground" + : "text-foreground/80" + )} + > + Components + </Link> + <Link + href="/blocks" + className={cn( + "transition-colors hover:text-foreground/80", + pathname?.startsWith("/blocks") + ? "text-foreground" + : "text-foreground/80" + )} + > + Blocks + </Link> + <Link + href="/charts" + className={cn( + "transition-colors hover:text-foreground/80", + pathname?.startsWith("/docs/component/chart") || + pathname?.startsWith("/charts") + ? "text-foreground" + : "text-foreground/80" + )} + > + Charts + </Link> + <Link + href="/themes" + className={cn( + "transition-colors hover:text-foreground/80", + pathname?.startsWith("/themes") + ? "text-foreground" + : "text-foreground/80" + )} + > + Themes + </Link> + <Link + href="/colors" + className={cn( + "transition-colors hover:text-foreground/80", + pathname?.startsWith("/colors") + ? "text-foreground" + : "text-foreground/80" + )} + > + Colors + </Link> + </nav> + </div> + ); +} diff --git a/components/mobile-nav.tsx b/components/mobile-nav.tsx new file mode 100644 index 000000000..7e8901988 --- /dev/null +++ b/components/mobile-nav.tsx @@ -0,0 +1,127 @@ +// "use client"; + +// import * as React from "react"; +// import Link, { LinkProps } from "next/link"; +// import { useRouter } from "next/navigation"; + +// import { docsConfig } from "@/app/config/docs"; +// import { cn } from "@/lib/utils"; +// import { useMetaColor } from "@/hooks/use-meta-color"; +// import { Button } from "@/components/ui/button"; +// import { Drawer, DrawerContent, DrawerTrigger } from "@/components/ui/drawer"; + +// export function MobileNav() { +// const [open, setOpen] = React.useState(false); +// const { setMetaColor, metaColor } = useMetaColor(); + +// const onOpenChange = React.useCallback( +// (open: boolean) => { +// setOpen(open); +// setMetaColor(open ? "#09090b" : metaColor); +// }, +// [setMetaColor, metaColor] +// ); + +// return ( +// <Drawer open={open} onOpenChange={onOpenChange}> +// <DrawerTrigger asChild> +// <Button +// variant="ghost" +// className="-ml-2 mr-2 h-8 w-8 px-0 text-base hover:bg-transparent focus-visible:bg-transparent focus-visible:ring-0 focus-visible:ring-offset-0 md:hidden" +// > +// <svg +// xmlns="http://www.w3.org/2000/svg" +// fill="none" +// viewBox="0 0 24 24" +// strokeWidth="1.5" +// stroke="currentColor" +// className="!size-6" +// > +// <path +// strokeLinecap="round" +// strokeLinejoin="round" +// d="M3.75 9h16.5m-16.5 6.75h16.5" +// /> +// </svg> +// <span className="sr-only">Toggle Menu</span> +// </Button> +// </DrawerTrigger> +// <DrawerContent className="max-h-[60svh] p-0"> +// <div className="overflow-auto p-6"> +// <div className="flex flex-col space-y-3"> +// {docsConfig.mainNav?.map( +// (item) => +// item.href && ( +// <MobileLink +// key={item.href} +// href={item.href} +// onOpenChange={setOpen} +// > +// {item.title} +// </MobileLink> +// ) +// )} +// </div> +// <div className="flex flex-col space-y-2"> +// {docsConfig.sidebarNav.map((item, index) => ( +// <div key={index} className="flex flex-col space-y-3 pt-6"> +// <h4 className="font-medium">{item.title}</h4> +// {item?.items?.length && +// item.items.map((item) => ( +// <React.Fragment key={item.href}> +// {!item.disabled && +// (item.href ? ( +// <MobileLink +// href={item.href} +// onOpenChange={setOpen} +// className="text-muted-foreground" +// > +// {item.title} +// {item.label && ( +// <span className="ml-2 rounded-md bg-[#adfa1d] px-1.5 py-0.5 text-xs leading-none text-[#000000] no-underline group-hover:no-underline"> +// {item.label} +// </span> +// )} +// </MobileLink> +// ) : ( +// item.title +// ))} +// </React.Fragment> +// ))} +// </div> +// ))} +// </div> +// </div> +// </DrawerContent> +// </Drawer> +// ); +// } + +// interface MobileLinkProps extends LinkProps { +// onOpenChange?: (open: boolean) => void; +// children: React.ReactNode; +// className?: string; +// } + +// function MobileLink({ +// href, +// onOpenChange, +// className, +// children, +// ...props +// }: MobileLinkProps) { +// const router = useRouter(); +// return ( +// <Link +// href={href} +// onClick={() => { +// router.push(href.toString()); +// onOpenChange?.(false); +// }} +// className={cn("text-base", className)} +// {...props} +// > +// {children} +// </Link> +// ); +// } diff --git a/components/mode-toggle.tsx b/components/mode-toggle.tsx new file mode 100644 index 000000000..ecac242d8 --- /dev/null +++ b/components/mode-toggle.tsx @@ -0,0 +1,44 @@ +"use client"; + +import * as React from "react"; +import { Moon, Sun } from "lucide-react"; +import { useTheme } from "next-themes"; + +import { Button } from "@/components/ui/button"; + +export function ModeToggle() { + const { theme, setTheme } = useTheme(); + const [mounted, setMounted] = React.useState(false); + + // Ensure component is mounted to avoid hydration mismatch + React.useEffect(() => { + setMounted(true); + }, []); + + if (!mounted) { + return ( + <Button size="icon" className="bg-transparent border-[#333]"> + <span className="sr-only">Toggle theme</span> + </Button> + ); + } + + const toggleTheme = () => { + setTheme(theme === "dark" ? "light" : "dark"); + }; + + return ( + <Button + size="icon" + className="bg-transparent text-muted-foreground hover:bg-transparent hover:text-primary" + onClick={toggleTheme} + > + {theme === "dark" ? ( + <Moon className="h-3 w-3" /> + ) : ( + <Sun className="h-3 w-3" /> + )} + <span className="sr-only">Toggle theme</span> + </Button> + ); +} diff --git a/components/multi-select.tsx b/components/multi-select.tsx index 29ebdb2c4..dfcb1b99b 100644 --- a/components/multi-select.tsx +++ b/components/multi-select.tsx @@ -57,7 +57,7 @@ const multiSelectVariants = cva( * Props for MultiSelect component */ interface MultiSelectProps - extends React.ButtonHTMLAttributes<HTMLButtonElement>, + extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "color">, VariantProps<typeof multiSelectVariants> { /** * An array of option objects to be displayed in the multi-select component. diff --git a/components/nav-main.tsx b/components/nav-main.tsx new file mode 100644 index 000000000..9be7b119f --- /dev/null +++ b/components/nav-main.tsx @@ -0,0 +1,78 @@ +"use client"; + +import { ChevronRight, type LucideIcon } from "lucide-react"; + +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "@/components/ui/collapsible"; +import { + SidebarGroup, + SidebarGroupLabel, + SidebarMenu, + SidebarMenuAction, + SidebarMenuButton, + SidebarMenuItem, + SidebarMenuSub, + SidebarMenuSubButton, + SidebarMenuSubItem, +} from "@/components/ui/sidebar"; + +export function NavMain({ + items, +}: { + items: { + title: string; + url: string; + icon: LucideIcon; + isActive?: boolean; + items?: { + title: string; + url: string; + }[]; + }[]; +}) { + return ( + <SidebarGroup> + <SidebarGroupLabel>Platform</SidebarGroupLabel> + <SidebarMenu> + {items.map((item) => ( + <Collapsible key={item.title} asChild defaultOpen={item.isActive}> + <SidebarMenuItem> + <SidebarMenuButton asChild tooltip={item.title}> + <a href={item.url}> + <item.icon /> + <span>{item.title}</span> + </a> + </SidebarMenuButton> + {item.items?.length ? ( + <> + <CollapsibleTrigger asChild> + <SidebarMenuAction className="data-[state=open]:rotate-90"> + <ChevronRight /> + <span className="sr-only">Toggle</span> + </SidebarMenuAction> + </CollapsibleTrigger> + <CollapsibleContent> + <SidebarMenuSub> + {item.items?.map((subItem) => ( + <SidebarMenuSubItem key={subItem.title}> + <SidebarMenuSubButton asChild> + <a href={subItem.url}> + <span>{subItem.title}</span> + </a> + </SidebarMenuSubButton> + </SidebarMenuSubItem> + ))} + </SidebarMenuSub> + </CollapsibleContent> + </> + ) : null} + </SidebarMenuItem> + </Collapsible> + ))} + </SidebarMenu> + </SidebarGroup> + ); +} diff --git a/components/nav-projects.tsx b/components/nav-projects.tsx new file mode 100644 index 000000000..5b0bb50aa --- /dev/null +++ b/components/nav-projects.tsx @@ -0,0 +1,89 @@ +"use client"; + +import { + Folder, + MoreHorizontal, + Share, + Trash2, + type LucideIcon, +} from "lucide-react"; + +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { + SidebarGroup, + SidebarGroupLabel, + SidebarMenu, + SidebarMenuAction, + SidebarMenuButton, + SidebarMenuItem, + useSidebar, +} from "@/components/ui/sidebar"; + +export function NavProjects({ + projects, +}: { + projects: { + name: string; + url: string; + icon: LucideIcon; + }[]; +}) { + const { isMobile } = useSidebar(); + + return ( + <SidebarGroup className="group-data-[collapsible=icon]:hidden"> + <SidebarGroupLabel>Projects</SidebarGroupLabel> + <SidebarMenu> + {projects.map((item) => ( + <SidebarMenuItem key={item.name}> + <SidebarMenuButton asChild> + <a href={item.url}> + <item.icon /> + <span>{item.name}</span> + </a> + </SidebarMenuButton> + <DropdownMenu> + <DropdownMenuTrigger asChild> + <SidebarMenuAction showOnHover> + <MoreHorizontal /> + <span className="sr-only">More</span> + </SidebarMenuAction> + </DropdownMenuTrigger> + <DropdownMenuContent + className="w-48" + side={isMobile ? "bottom" : "right"} + align={isMobile ? "end" : "start"} + > + <DropdownMenuItem> + <Folder className="text-muted-foreground" /> + <span>View Project</span> + </DropdownMenuItem> + <DropdownMenuItem> + <Share className="text-muted-foreground" /> + <span>Share Project</span> + </DropdownMenuItem> + <DropdownMenuSeparator /> + <DropdownMenuItem> + <Trash2 className="text-muted-foreground" /> + <span>Delete Project</span> + </DropdownMenuItem> + </DropdownMenuContent> + </DropdownMenu> + </SidebarMenuItem> + ))} + <SidebarMenuItem> + <SidebarMenuButton> + <MoreHorizontal /> + <span>More</span> + </SidebarMenuButton> + </SidebarMenuItem> + </SidebarMenu> + </SidebarGroup> + ); +} diff --git a/components/nav-secondary.tsx b/components/nav-secondary.tsx new file mode 100644 index 000000000..aee870402 --- /dev/null +++ b/components/nav-secondary.tsx @@ -0,0 +1,40 @@ +import * as React from "react"; +import { type LucideIcon } from "lucide-react"; + +import { + SidebarGroup, + SidebarGroupContent, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, +} from "@/components/ui/sidebar"; + +export function NavSecondary({ + items, + ...props +}: { + items: { + title: string; + url: string; + icon: LucideIcon; + }[]; +} & React.ComponentPropsWithoutRef<typeof SidebarGroup>) { + return ( + <SidebarGroup {...props}> + <SidebarGroupContent> + <SidebarMenu> + {items.map((item) => ( + <SidebarMenuItem key={item.title}> + <SidebarMenuButton asChild size="sm"> + <a href={item.url}> + <item.icon /> + <span>{item.title}</span> + </a> + </SidebarMenuButton> + </SidebarMenuItem> + ))} + </SidebarMenu> + </SidebarGroupContent> + </SidebarGroup> + ); +} diff --git a/components/nav-user.tsx b/components/nav-user.tsx new file mode 100644 index 000000000..2019263a4 --- /dev/null +++ b/components/nav-user.tsx @@ -0,0 +1,110 @@ +"use client"; + +import { + BadgeCheck, + Bell, + ChevronsUpDown, + CreditCard, + LogOut, + Sparkles, +} from "lucide-react"; + +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + useSidebar, +} from "@/components/ui/sidebar"; + +export function NavUser({ + user, +}: { + user: { + name: string; + email: string; + avatar: string; + }; +}) { + const { isMobile } = useSidebar(); + + return ( + <SidebarMenu> + <SidebarMenuItem> + <DropdownMenu> + <DropdownMenuTrigger asChild> + <SidebarMenuButton + size="lg" + className="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground" + > + <Avatar className="h-8 w-8 rounded-lg"> + <AvatarImage src={user.avatar} alt={user.name} /> + <AvatarFallback className="rounded-lg">CN</AvatarFallback> + </Avatar> + <div className="grid flex-1 text-left text-sm leading-tight"> + <span className="truncate font-semibold">{user.name}</span> + <span className="truncate text-xs">{user.email}</span> + </div> + <ChevronsUpDown className="ml-auto size-4" /> + </SidebarMenuButton> + </DropdownMenuTrigger> + <DropdownMenuContent + className="w-[--radix-dropdown-menu-trigger-width] min-w-56 rounded-lg" + side={isMobile ? "bottom" : "right"} + align="end" + sideOffset={4} + > + <DropdownMenuLabel className="p-0 font-normal"> + <div className="flex items-center gap-2 px-1 py-1.5 text-left text-sm"> + <Avatar className="h-8 w-8 rounded-lg"> + <AvatarImage src={user.avatar} alt={user.name} /> + <AvatarFallback className="rounded-lg">CN</AvatarFallback> + </Avatar> + <div className="grid flex-1 text-left text-sm leading-tight"> + <span className="truncate font-semibold">{user.name}</span> + <span className="truncate text-xs">{user.email}</span> + </div> + </div> + </DropdownMenuLabel> + <DropdownMenuSeparator /> + <DropdownMenuGroup> + <DropdownMenuItem> + <Sparkles /> + Upgrade to Pro + </DropdownMenuItem> + </DropdownMenuGroup> + <DropdownMenuSeparator /> + <DropdownMenuGroup> + <DropdownMenuItem> + <BadgeCheck /> + Account + </DropdownMenuItem> + <DropdownMenuItem> + <CreditCard /> + Billing + </DropdownMenuItem> + <DropdownMenuItem> + <Bell /> + Notifications + </DropdownMenuItem> + </DropdownMenuGroup> + <DropdownMenuSeparator /> + <DropdownMenuItem> + <LogOut /> + Log out + </DropdownMenuItem> + </DropdownMenuContent> + </DropdownMenu> + </SidebarMenuItem> + </SidebarMenu> + ); +} diff --git a/components/notebook.client.tsx b/components/notebook.client.tsx new file mode 100644 index 000000000..47a2f4632 --- /dev/null +++ b/components/notebook.client.tsx @@ -0,0 +1,127 @@ +"use client"; +import { cn } from "../lib/utils"; +import { type ButtonHTMLAttributes, type HTMLAttributes } from "react"; +import { useSidebar } from "fumadocs-ui/provider"; +import { useNav } from "./layout/nav"; +import { SidebarTrigger } from "fumadocs-core/sidebar"; +import { buttonVariants } from "./ui/button"; +import { Menu, X } from "lucide-react"; +import Link from "fumadocs-core/link"; +import { usePathname } from "next/navigation"; +import { isActive } from "../lib/is-active"; +import type { Option } from "./layout/root-toggle"; + +export function Navbar(props: HTMLAttributes<HTMLElement>) { + const { open, collapsed } = useSidebar(); + const { isTransparent } = useNav(); + + return ( + <header + id="nd-subnav" + {...props} + className={cn( + "fixed inset-x-0 top-(--fd-banner-height) z-10 pe-(--fd-layout-offset) backdrop-blur-lg transition-colors", + (!isTransparent || open) && "bg-fd-background/80", + props.className + )} + style={ + { + paddingInlineStart: collapsed + ? "var(--fd-layout-offset)" + : "calc(var(--fd-layout-offset) + var(--fd-sidebar-width))", + ...props.style, + } as object + } + > + {props.children} + </header> + ); +} + +export function NavbarSidebarTrigger( + props: ButtonHTMLAttributes<HTMLButtonElement> +) { + const { open } = useSidebar(); + + return ( + <SidebarTrigger + {...props} + className={cn( + buttonVariants({ + variant: "ghost", + size: "icon", + }), + props.className + )} + > + {open ? <X /> : <Menu />} + </SidebarTrigger> + ); +} + +export function LayoutTabs(props: HTMLAttributes<HTMLElement>) { + return ( + <div + {...props} + className={cn( + "flex flex-row items-end gap-6 overflow-auto", + props.className + )} + > + {props.children} + </div> + ); +} + +function useIsSelected(item: Option) { + const pathname = usePathname(); + + return item.urls + ? item.urls.has(pathname.endsWith("/") ? pathname.slice(0, -1) : pathname) + : isActive(item.url, pathname, true); +} + +export function LayoutTab(item: Option) { + const { closeOnRedirect } = useSidebar(); + const selected = useIsSelected(item); + + return ( + <Link + className={cn( + "inline-flex items-center py-2.5 border-b border-transparent gap-2 text-fd-muted-foreground text-sm text-nowrap", + selected && "text-fd-foreground font-medium border-fd-primary" + )} + href={item.url} + onClick={() => { + closeOnRedirect.current = false; + }} + > + {item.title} + </Link> + ); +} + +export function SidebarLayoutTab({ + item, + ...props +}: { item: Option } & HTMLAttributes<HTMLElement>) { + const selected = useIsSelected(item); + + return ( + <Link + {...props} + className={cn( + "flex flex-row items-center px-2 -mx-2 py-1.5 gap-2.5 text-fd-muted-foreground [&_svg]:!size-4.5", + selected + ? "text-fd-primary font-medium" + : "hover:text-fd-accent-foreground", + props.className + )} + data-active={selected} + href={item.url} + > + {item.icon} + {item.title} + </Link> + ); +} diff --git a/components/notebook.tsx b/components/notebook.tsx new file mode 100644 index 000000000..3a62d1550 --- /dev/null +++ b/components/notebook.tsx @@ -0,0 +1,361 @@ +import { Fragment, type HTMLAttributes } from "react"; +import { type BaseLayoutProps, getLinks } from "./shared"; +import { + CollapsibleSidebar, + Sidebar, + SidebarCollapseTrigger, + SidebarFooter, + SidebarHeader, + SidebarViewport, + SidebarPageTree, +} from "./docs/sidebar"; +import { TreeContextProvider } from "fumadocs-ui/provider"; +import { NavProvider, Title } from "./layout/nav"; +import { LargeSearchToggle, SearchToggle } from "./layout/search-toggle"; +import { cn } from "../lib/utils"; +import Link from "next/link"; +import { buttonVariants } from "./ui/button"; +import { ChevronDown, Languages } from "lucide-react"; +import { BaseLinkItem, type LinkItemType } from "./links"; +import { LanguageToggle } from "./layout/language-toggle"; +import { ThemeToggle } from "./layout/theme-toggle"; +import { Popover, PopoverContent, PopoverTrigger } from "./ui/popover"; +import { + checkPageTree, + getSidebarTabsFromOptions, + layoutVariables, + SidebarLinkItem, + type SidebarOptions, +} from "./docs/shared"; +import type { PageTree } from "fumadocs-core/server"; +import { + LayoutTab, + LayoutTabs, + Navbar, + NavbarSidebarTrigger, + SidebarLayoutTab, +} from "./notebook.client"; +import { type PageStyles, StylesProvider } from "fumadocs-ui/provider"; +import { type Option, RootToggle } from "./layout/root-toggle"; + +export interface DocsLayoutProps extends BaseLayoutProps { + tree: PageTree.Root; + tabMode?: "sidebar" | "navbar"; + + nav?: BaseLayoutProps["nav"] & { + mode?: "top" | "auto"; + }; + + sidebar?: Omit<Partial<SidebarOptions>, "component" | "enabled">; + + containerProps?: HTMLAttributes<HTMLDivElement>; +} + +export function DocsLayout({ + tabMode = "sidebar", + nav: { transparentMode, ...nav } = {}, + sidebar: { + collapsible: sidebarCollapsible = true, + tabs: tabOptions, + banner: sidebarBanner, + footer: sidebarFooter, + components: sidebarComponents, + ...sidebar + } = {}, + i18n = false, + ...props +}: DocsLayoutProps) { + checkPageTree(props.tree); + const navMode = nav.mode ?? "auto"; + const links = getLinks(props.links ?? [], props.githubUrl); + const Aside = sidebarCollapsible ? CollapsibleSidebar : Sidebar; + + const tabs = getSidebarTabsFromOptions(tabOptions, props.tree) ?? []; + const variables = cn( + "[--fd-nav-height:calc(var(--spacing)*14)] [--fd-tocnav-height:36px] md:[--fd-sidebar-width:286px] xl:[--fd-toc-width:286px] xl:[--fd-tocnav-height:0px]", + tabs.length > 0 && + tabMode === "navbar" && + "lg:[--fd-nav-height:calc(var(--spacing)*24)]" + ); + + const pageStyles: PageStyles = { + tocNav: cn("xl:hidden"), + toc: cn("max-xl:hidden"), + page: cn("mt-(--fd-nav-height)"), + }; + + return ( + <TreeContextProvider tree={props.tree}> + <NavProvider transparentMode={transparentMode}> + <main + id="nd-docs-layout" + {...props.containerProps} + className={cn( + "flex w-full flex-1 flex-row pe-(--fd-layout-offset)", + variables, + props.containerProps?.className + )} + style={{ + ...layoutVariables, + ...props.containerProps?.style, + }} + > + <Aside + {...sidebar} + className={cn( + "md:ps-(--fd-layout-offset)", + navMode === "top" ? "bg-transparent" : "md:[--fd-nav-height:0px]", + sidebar.className + )} + inner={{ + className: cn( + navMode === "top" ? "md:pt-2.5" : "md:pt-3.5", + tabMode === "navbar" && "md:pt-0" + ), + }} + > + <SidebarHeader> + {navMode === "auto" && ( + <div className="flex flex-row justify-between max-md:hidden"> + <Link + href={nav.url ?? "/"} + className="inline-flex items-center gap-2.5 font-medium" + > + {nav.title} + </Link> + <SidebarCollapseTrigger + className={cn( + buttonVariants({ + variant: "ghost", + size: "icon-sm", + }), + "text-fd-muted-foreground mb-auto" + )} + /> + </div> + )} + {nav.children} + {sidebarBanner} + {tabMode === "sidebar" && tabs.length > 0 ? ( + <RootToggle options={tabs} className="-mx-2" /> + ) : null} + </SidebarHeader> + <SidebarViewport> + {tabMode === "navbar" && + tabs.map((tab, i) => ( + <SidebarLayoutTab + key={tab.url} + item={tab} + className={cn("lg:hidden", i === tabs.length - 1 && "mb-4")} + /> + ))} + {links.map((item, i) => ( + <SidebarLinkItem + key={i} + item={item} + className={cn("lg:hidden", i === links.length - 1 && "mb-4")} + /> + ))} + + <SidebarPageTree components={sidebarComponents} /> + </SidebarViewport> + <SidebarFooter + className={cn( + "flex flex-row items-center", + !sidebarFooter && "md:hidden" + )} + > + {i18n ? ( + <LanguageToggle className="me-auto md:hidden"> + <Languages className="size-5 text-fd-muted-foreground" /> + </LanguageToggle> + ) : null} + {!props.disableThemeSwitch ? ( + <ThemeToggle className="md:hidden" mode="light-dark" /> + ) : null} + {sidebarFooter} + </SidebarFooter> + </Aside> + <DocsNavbar + nav={nav} + links={links} + i18n={i18n} + sidebarCollapsible={sidebarCollapsible} + tabs={tabMode == "navbar" ? tabs : []} + /> + <StylesProvider {...pageStyles}>{props.children}</StylesProvider> + </main> + </NavProvider> + </TreeContextProvider> + ); +} + +function DocsNavbar({ + sidebarCollapsible, + links, + nav = {}, + i18n, + tabs, +}: { + nav: DocsLayoutProps["nav"]; + sidebarCollapsible: boolean; + i18n: boolean; + links: LinkItemType[]; + tabs: Option[]; +}) { + const navMode = nav.mode ?? "auto"; + + return ( + <Navbar + style={ + navMode === "top" + ? { + paddingInlineStart: "var(--fd-layout-offset)", + } + : undefined + } + > + <div + className={cn( + "flex flex-row border-b border-fd-foreground/10 px-4 h-14", + navMode === "auto" && "md:px-6" + )} + > + <div + className={cn( + "flex flex-row items-center", + navMode === "top" && "flex-1 pe-4" + )} + > + {sidebarCollapsible && navMode === "auto" ? ( + <SidebarCollapseTrigger + className={cn( + buttonVariants({ + variant: "ghost", + size: "icon-sm", + }), + "text-fd-muted-foreground -ms-1.5 me-2 data-[collapsed=false]:hidden max-md:hidden" + )} + /> + ) : null} + <Title + url={nav.url} + title={nav.title} + className={cn( + // show on sidebar on above md + navMode === "auto" && "md:hidden" + )} + /> + </div> + + <LargeSearchToggle + hideIfDisabled + className={cn( + "w-full my-auto rounded-xl max-md:hidden", + navMode === "top" ? "max-w-sm px-2" : "max-w-[240px]" + )} + /> + + <div className="flex flex-1 flex-row items-center justify-end"> + <div className="flex flex-row items-center gap-6 px-4 empty:hidden max-lg:hidden"> + {links + .filter((item) => item.type !== "icon") + .map((item, i) => ( + <NavbarLinkItem + key={i} + item={item} + className="text-sm text-fd-muted-foreground transition-colors hover:text-fd-accent-foreground" + /> + ))} + </div> + {nav.children} + <SearchToggle hideIfDisabled className="md:hidden" /> + <NavbarSidebarTrigger className="md:hidden" /> + {links + .filter((item) => item.type === "icon") + .map((item, i) => ( + <BaseLinkItem + key={i} + item={item} + className={cn( + buttonVariants({ size: "icon-sm", variant: "ghost" }), + "text-fd-muted-foreground max-lg:hidden" + )} + aria-label={item.label} + > + {item.icon} + </BaseLinkItem> + ))} + {i18n ? ( + <LanguageToggle className="max-md:hidden"> + <Languages className="size-4.5 text-fd-muted-foreground" /> + </LanguageToggle> + ) : null} + <ThemeToggle className="ms-2 max-md:hidden" mode="light-dark" /> + {sidebarCollapsible && navMode === "top" ? ( + <SidebarCollapseTrigger + className={cn( + buttonVariants({ + variant: "secondary", + size: "icon-sm", + }), + "ms-2 text-fd-muted-foreground rounded-full max-md:hidden" + )} + /> + ) : null} + </div> + </div> + {tabs.length > 0 ? ( + <LayoutTabs className="px-6 border-b border-fd-foreground/10 h-10 max-lg:hidden"> + {tabs.map((tab) => ( + <LayoutTab key={tab.url} {...tab} /> + ))} + </LayoutTabs> + ) : null} + </Navbar> + ); +} + +function NavbarLinkItem({ + item, + ...props +}: { item: LinkItemType } & HTMLAttributes<HTMLElement>) { + if (item.type === "menu") { + return ( + <Popover> + <PopoverTrigger + {...props} + className={cn("inline-flex items-center gap-1.5", props.className)} + > + {item.text} + <ChevronDown className="size-3" /> + </PopoverTrigger> + <PopoverContent className="flex flex-col"> + {item.items.map((child, i) => { + if (child.type === "custom") + return <Fragment key={i}>{child.children}</Fragment>; + + return ( + <BaseLinkItem + key={i} + item={child} + className="inline-flex items-center gap-2 rounded-md p-2 text-start hover:bg-fd-accent hover:text-fd-accent-foreground data-[active=true]:text-fd-primary [&_svg]:size-4" + > + {child.icon} + {child.text} + </BaseLinkItem> + ); + })} + </PopoverContent> + </Popover> + ); + } + + if (item.type === "custom") return item.children; + + return ( + <BaseLinkItem item={item} {...props}> + {item.text} + </BaseLinkItem> + ); +} diff --git a/components/page.tsx b/components/page.tsx new file mode 100644 index 000000000..72cd6474f --- /dev/null +++ b/components/page.tsx @@ -0,0 +1,402 @@ +import { type PageTree, type TableOfContents } from "fumadocs-core/server"; +import { + type AnchorHTMLAttributes, + forwardRef, + type HTMLAttributes, + type ReactNode, +} from "react"; +import type { LoaderConfig, LoaderOutput, Page } from "fumadocs-core/source"; +import { type AnchorProviderProps, AnchorProvider } from "fumadocs-core/toc"; +import { Card, Cards } from "./card"; +import { replaceOrDefault } from "./shared"; +import { cn } from "../lib/utils"; +import { + Footer, + type FooterProps, + LastUpdate, + TocPopoverHeader, + Breadcrumb, + type BreadcrumbProps, + PageBody, + PageArticle, +} from "../page.client"; +import { + Toc, + TOCItems, + TocPopoverTrigger, + TocPopoverContent, + type TOCProps, + TOCScrollArea, +} from "./layout/toc"; +import { buttonVariants } from "./ui/button"; +import { Edit, Text } from "lucide-react"; +import { I18nLabel } from "fumadocs-ui/provider"; +import ClerkTOCItems from "./layout/toc-clerk"; + +type TableOfContentOptions = Omit<TOCProps, "items" | "children"> & + Pick<AnchorProviderProps, "single"> & { + enabled: boolean; + component: ReactNode; + + /** + * @defaultValue 'normal' + */ + style?: "normal" | "clerk"; + }; + +type TableOfContentPopoverOptions = Omit<TableOfContentOptions, "single">; + +interface EditOnGitHubOptions + extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, "href" | "children"> { + owner: string; + repo: string; + + /** + * SHA or ref (branch or tag) name. + * + * @defaultValue main + */ + sha?: string; + + /** + * File path in the repo + */ + path: string; +} + +interface BreadcrumbOptions extends BreadcrumbProps { + enabled: boolean; + component: ReactNode; + + /** + * Show the full path to the current page + * + * @defaultValue false + * @deprecated use `includePage` instead + */ + full?: boolean; +} + +interface FooterOptions extends FooterProps { + enabled: boolean; + component: ReactNode; +} + +export interface DocsPageProps { + toc?: TableOfContents; + + /** + * Extend the page to fill all available space + * + * @defaultValue false + */ + full?: boolean; + + tableOfContent?: Partial<TableOfContentOptions>; + tableOfContentPopover?: Partial<TableOfContentPopoverOptions>; + + /** + * Replace or disable breadcrumb + */ + breadcrumb?: Partial<BreadcrumbOptions>; + + /** + * Footer navigation, you can disable it by passing `false` + */ + footer?: Partial<FooterOptions>; + + editOnGithub?: EditOnGitHubOptions; + lastUpdate?: Date | string | number; + + container?: HTMLAttributes<HTMLDivElement>; + article?: HTMLAttributes<HTMLElement>; + children: ReactNode; +} + +export function DocsPage({ + toc = [], + full = false, + tableOfContentPopover: { + enabled: tocPopoverEnabled, + component: tocPopoverReplace, + ...tocPopoverOptions + } = {}, + tableOfContent: { + enabled: tocEnabled, + component: tocReplace, + ...tocOptions + } = {}, + ...props +}: DocsPageProps) { + const isTocRequired = + toc.length > 0 || + tocOptions.footer !== undefined || + tocOptions.header !== undefined; + + // disable TOC on full mode, you can still enable it with `enabled` option. + tocEnabled ??= !full && isTocRequired; + + tocPopoverEnabled ??= + toc.length > 0 || + tocPopoverOptions.header !== undefined || + tocPopoverOptions.footer !== undefined; + + return ( + <AnchorProvider toc={toc} single={tocOptions.single}> + <PageBody + {...props.container} + className={cn(props.container?.className)} + style={ + { + "--fd-tocnav-height": !tocPopoverEnabled ? "0px" : undefined, + ...props.container?.style, + } as object + } + > + {replaceOrDefault( + { enabled: tocPopoverEnabled, component: tocPopoverReplace }, + <TocPopoverHeader className="h-10"> + <TocPopoverTrigger className="w-full" items={toc} /> + <TocPopoverContent> + {tocPopoverOptions.header} + <TOCScrollArea isMenu> + {tocPopoverOptions.style === "clerk" ? ( + <ClerkTOCItems items={toc} /> + ) : ( + <TOCItems items={toc} /> + )} + </TOCScrollArea> + {tocPopoverOptions.footer} + </TocPopoverContent> + </TocPopoverHeader>, + { + items: toc, + ...tocPopoverOptions, + } + )} + <PageArticle + {...props.article} + className={cn( + full || !tocEnabled ? "max-w-[1120px]" : "max-w-[860px]", + props.article?.className + )} + > + {replaceOrDefault( + props.breadcrumb, + <Breadcrumb {...props.breadcrumb} /> + )} + {props.children} + <div role="none" className="flex-1" /> + <div className="flex flex-row flex-wrap items-center justify-between gap-4 empty:hidden"> + {props.editOnGithub ? ( + <EditOnGitHub {...props.editOnGithub} /> + ) : null} + {props.lastUpdate ? ( + <LastUpdate date={new Date(props.lastUpdate)} /> + ) : null} + </div> + {replaceOrDefault( + props.footer, + <Footer items={props.footer?.items} /> + )} + </PageArticle> + </PageBody> + {replaceOrDefault( + { enabled: tocEnabled, component: tocReplace }, + <Toc> + {tocOptions.header} + <h3 className="inline-flex items-center gap-1.5 text-sm text-muted-foreground"> + <Text className="size-4" /> + <I18nLabel label="toc" /> + </h3> + <TOCScrollArea> + {tocOptions.style === "clerk" ? ( + <ClerkTOCItems items={toc} /> + ) : ( + <TOCItems items={toc} /> + )} + </TOCScrollArea> + {tocOptions.footer} + </Toc>, + { + items: toc, + ...tocOptions, + } + )} + </AnchorProvider> + ); +} + +function EditOnGitHub({ + owner, + repo, + sha, + path, + ...props +}: EditOnGitHubOptions) { + const href = `https://github.com/${owner}/${repo}/blob/${sha}/${path.startsWith("/") ? path.slice(1) : path}`; + + return ( + <a + href={href} + target="_blank" + rel="noreferrer noopener" + {...props} + className={cn( + buttonVariants({ + variant: "secondary", + className: "gap-1.5 text-muted-foreground", + }), + props.className + )} + > + <Edit className="size-3.5" /> + <I18nLabel label="editOnGithub" /> + </a> + ); +} + +/** + * Add typography styles + */ +export const DocsBody = forwardRef< + HTMLDivElement, + HTMLAttributes<HTMLDivElement> +>((props, ref) => ( + <div ref={ref} {...props} className={cn("prose", props.className)}> + {props.children} + </div> +)); + +DocsBody.displayName = "DocsBody"; + +export const DocsDescription = forwardRef< + HTMLParagraphElement, + HTMLAttributes<HTMLParagraphElement> +>((props, ref) => { + // don't render if no description provided + if (props.children === undefined) return null; + + return ( + <p + ref={ref} + {...props} + className={cn("mb-8 text-lg text-muted-foreground", props.className)} + > + {props.children} + </p> + ); +}); + +DocsDescription.displayName = "DocsDescription"; + +export const DocsTitle = forwardRef< + HTMLHeadingElement, + HTMLAttributes<HTMLHeadingElement> +>((props, ref) => { + return ( + <h1 + ref={ref} + {...props} + className={cn( + "text-primary text-4xl font-semibold mb-2", + props.className + )} + > + {props.children} + </h1> + ); +}); + +DocsTitle.displayName = "DocsTitle"; + +export function DocsCategory({ + page, + from, + tree: forcedTree, + ...props +}: HTMLAttributes<HTMLDivElement> & { + page: Page; + from: LoaderOutput<LoaderConfig>; + tree?: PageTree.Root; +}) { + let tree; + + if (forcedTree) { + tree = forcedTree; + } else if (from._i18n) { + const locale = page.locale ?? from._i18n.defaultLanguage; + + tree = (from as LoaderOutput<LoaderConfig & { i18n: true }>).pageTree[ + locale + ]; + } else { + tree = from.pageTree; + } + + function findParentFromTree( + node: PageTree.Root | PageTree.Folder, + page: Page + ): PageTree.Root | PageTree.Folder | undefined { + if ("index" in node && node.index?.$ref?.file === page.file.path) { + return node; + } + + for (const child of node.children) { + if (child.type === "folder") { + const parent = findParentFromTree(child, page); + if (parent) return parent; + } + + if (child.type === "page" && child.$ref?.file === page.file.path) { + return node; + } + } + } + + let items; + const parent = findParentFromTree(tree, page); + if (parent) { + items = parent.children.flatMap<Page>((item) => { + if (item.type !== "page" || item.url === page.url) return []; + + return from.getNodePage(item) ?? []; + }); + } else { + const pages = from.getPages(page.locale); + + items = pages.filter( + (item) => + item.file.dirname === page.file.dirname && + item.file.path !== page.file.path + ); + } + + if (items.length === 0) return null; + + return ( + <Cards {...props}> + {items.map((item) => ( + <Card + key={item.url} + title={item.data.title ?? ""} + description={String( + (item.data as { description?: ReactNode }).description ?? "" + )} + href={item.url} + /> + ))} + </Cards> + ); +} + +/** + * For separate MDX page + */ +export function withArticle({ children }: { children: ReactNode }): ReactNode { + return ( + <main className="container py-12"> + <article className="prose">{children}</article> + </main> + ); +} diff --git a/components/recipe-carousel.tsx b/components/recipe-carousel.tsx index 7aee11c5a..54d6e406c 100644 --- a/components/recipe-carousel.tsx +++ b/components/recipe-carousel.tsx @@ -11,7 +11,7 @@ import { CarouselNext, CarouselPrevious, } from "@/components/ui/carousel"; -import type { Recipe } from "@/types/recipes"; +import type { Recipe } from "@/types"; import { truncate } from "@/lib/utils"; interface RecipeCarouselProps { diff --git a/components/search-dialog.tsx b/components/search-dialog.tsx new file mode 100644 index 000000000..2062a868b --- /dev/null +++ b/components/search-dialog.tsx @@ -0,0 +1,577 @@ +"use client"; + +import * as React from "react"; +import { useDocsSearch } from "fumadocs-core/search/client"; + +import { + Command, + CommandDialog, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, + CommandSeparator, +} from "@/components/ui/command"; +import { + Search, + File, // Keep icons used in UI + Terminal, + Code, + Webhook, + Layers, + Package, + Copy, + Eye, + ExternalLink, +} from "lucide-react"; +import { useSearch } from "@/lib/hooks/use-search"; +import { useRouter } from "next/navigation"; + +// List of common English stop words to ignore in search queries +const stopWords = new Set([ + "a", + "about", + "above", + "after", + "again", + "against", + "all", + "am", + "an", + "and", + "any", + "are", + "aren't", + "as", + "at", + "be", + "because", + "been", + "before", + "being", + "below", + "between", + "both", + "but", + "by", + "can", + "can't", + "cannot", + "could", + "couldn't", + "did", + "didn't", + "do", + "does", + "doesn't", + "doing", + "don't", + "down", + "during", + "each", + "few", + "for", + "from", + "further", + "had", + "hadn't", + "has", + "hasn't", + "have", + "haven't", + "having", + "he", + "he'd", + "he'll", + "he's", + "her", + "here", + "here's", + "hers", + "herself", + "him", + "himself", + "his", + "how", + "how's", + "i", + "i'd", + "i'll", + "i'm", + "i've", + "if", + "in", + "into", + "is", + "isn't", + "it", + "it's", + "its", + "itself", + "let's", + "me", + "more", + "most", + "mustn't", + "my", + "myself", + "no", + "nor", + "not", + "of", + "off", + "on", + "once", + "only", + "or", + "other", + "ought", + "our", + "ours", + "ourselves", + "out", + "over", + "own", + "same", + "shan't", + "she", + "she'd", + "she'll", + "she's", + "should", + "shouldn't", + "so", + "some", + "such", + "than", + "that", + "that's", + "the", + "their", + "theirs", + "them", + "themselves", + "then", + "there", + "there's", + "these", + "they", + "they'd", + "they'll", + "they're", + "they've", + "this", + "those", + "through", + "to", + "too", + "under", + "until", + "up", + "very", + "was", + "wasn't", + "we", + "we'd", + "we'll", + "we're", + "we've", + "were", + "weren't", + "what", + "what's", + "when", + "when's", + "where", + "where's", + "which", + "while", + "who", + "who's", + "whom", + "why", + "why's", + "with", + "won't", + "would", + "wouldn't", + "you", + "you'd", + "you'll", + "you're", + "you've", + "your", + "yours", + "yourself", + "yourselves", +]); + +// Helper function to process the query +function preprocessQuery(query: string): string { + if (!query) return ""; + return ( + query + .toLowerCase() + // Split into words (handles basic punctuation removal) + .split(/[\s\-,.()!?:]+/) + // Filter out stop words and very short words (adjust min length if needed) + .filter((word) => word.length > 2 && !stopWords.has(word)) + .join(" ") + ); // Join remaining keywords with spaces +} + +// Keep DocIndexEntry if needed for type hints, but data comes from hook +interface DocIndexEntry { + id: string; + title: string; + // description?: string; // Fields depend on what useDocsSearch returns + // content?: string; + url: string; + // snippet?: string; // Fumadocs might provide a snippet +} + +// Keep predefined queries +const predefinedDocQueries = [ + { id: "q1", text: "how to set up devnet using clarinet" }, + { id: "q2", text: "how to create a chainhook on the hiro platform" }, + { id: "q3", text: "how can i connect my wallet to a web app" }, + { id: "q4", text: "how can i query a list of the latest transactions" }, +]; + +// Keep your other static data if needed +const suggestions = [ + { id: "calendar", title: "Calendar", icon: File }, + { id: "emoji", title: "Search Emoji", icon: File }, + { id: "calculator", title: "Calculator", icon: File, disabled: true }, +]; + +const settings = [ + { id: "profile", title: "Profile", icon: File, shortcut: "⌘P" }, + { id: "billing", title: "Billing", icon: File, shortcut: "⌘B" }, + { id: "settings", title: "Settings", icon: File, shortcut: "⌘S" }, +]; + +// Helper to extract a plain text snippet from markdown +function extractSnippet(text: string | undefined, maxLength = 80): string { + if (!text) return ""; + // Basic snippet extraction + const plainText = text.replace(/\s+/g, " ").trim(); + return plainText.length > maxLength + ? plainText.substring(0, maxLength) + "..." + : plainText; +} + +// NAVIGATE Section Items +const navigateItems = [ + { + id: "clarinet", + title: "Clarinet", + icon: Terminal, + href: "/stacks/clarinet", + }, // Example href + { + id: "stacks.js", + title: "Stacks.js", + icon: Code, + href: "/stacks/stacks.js", + }, + { + id: "chainhook", + title: "Chainhook", + icon: Webhook, + href: "/stacks/chainhook", + }, + { + id: "apis", + title: "APIs", + icon: Layers, + href: "/stacks/api", + }, + { id: "sdks", title: "SDKs", icon: Package, href: "/stacks/reference" }, +]; + +// AI Section Items +const aiItems = [ + // Add functionality later for these + { id: "copy-md", title: "Copy this page as markdown", icon: Copy }, + { id: "view-md", title: "View as markdown", icon: Eye }, + { id: "open-chatgpt", title: "Open in ChatGPT", icon: ExternalLink }, +]; + +// Define an interface for the search result structure +interface CustomSearchResult { + id: string; + url: string; + type?: "page" | "heading" | "text"; + content?: string; + metadata?: Record<string, any>; +} + +export default function SearchDialog() { + const { open, setOpen } = useSearch(); + const router = useRouter(); + const [inputValue, setInputValue] = React.useState(""); + const [isSearchingDocs, setIsSearchingDocs] = React.useState(false); + + // Remove Orama state + // const [oramaDB, setOramaDB] = React.useState<Orama<any> | null>(null); + // const [isLoadingDocs, setIsLoadingDocs] = React.useState(true); + // const [fetchError, setFetchError] = React.useState<string | null>(null); + + const rootInputRef = React.useRef<HTMLInputElement>(null); + const docsInputRef = React.useRef<HTMLInputElement>(null); + + // Destructure using 'search' for the results array + const { + search, // This variable holds the results array + setSearch, + query: currentQuery, + } = useDocsSearch({ + type: "static", + }); + + console.log({ search, currentQuery }); + + // State to track if we are "waiting" for results after setting search + // Since the hook doesn't provide explicit loading state + const [isWaitingForResults, setIsWaitingForResults] = React.useState(false); + + // Update search query on input change (debounced) + React.useEffect(() => { + const processedQuery = preprocessQuery(inputValue); + const timerId = setTimeout(() => { + if (isSearchingDocs) { + if (inputValue.trim()) { + setSearch(processedQuery); + setIsWaitingForResults(true); + } else { + setSearch(""); + setIsWaitingForResults(false); + } + } + }, 150); + return () => clearTimeout(timerId); + }, [inputValue, isSearchingDocs, setSearch]); + + // Effect to turn off loading state when results change + React.useEffect(() => { + if (isWaitingForResults) { + setIsWaitingForResults(false); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [search]); // Depend on the 'search' variable (the results array) + + // Keep useEffect for focus management + React.useEffect(() => { + if (isSearchingDocs) { + setInputValue(""); + setTimeout(() => docsInputRef.current?.focus(), 0); + } else { + setInputValue(""); + setTimeout(() => rootInputRef.current?.focus(), 0); + } + }, [isSearchingDocs]); + + // --- Handlers --- Keep or adjust as needed + const handleInputChange = (value: string) => { + setInputValue(value); + }; + const handleOpenChange = (isOpen: boolean) => { + setOpen(isOpen); + if (!isOpen) { + setIsSearchingDocs(false); + setInputValue(""); + setSearch(""); // Clear search query on close + } + }; + const handleSelect = (callback: () => void) => { + callback(); + }; + const goToDoc = (slug: string) => { + router.push(slug); + handleOpenChange(false); + }; + const goToHref = (href: string) => { + router.push(href); + handleOpenChange(false); + }; + const handleAiAction = (actionId: string) => { + console.log("AI Action:", actionId); + handleOpenChange(false); + }; + const handlePredefinedQueryClick = (queryText: string) => { + setInputValue(queryText); + // Set search immediately on click + // No need to wait for debounce useEffect here + const processed = preprocessQuery(queryText); + setSearch(processed); + setIsWaitingForResults(true); // Assume loading + docsInputRef.current?.focus(); + }; + // --- End Handlers --- + + // Determine what content to show in the CommandList + const renderListContent = () => { + if (isSearchingDocs) { + // Use the inferred loading state + if (isWaitingForResults && inputValue.trim()) { + return <CommandEmpty>Loading results...</CommandEmpty>; + } + + // If input is empty, show predefined questions + if (!inputValue.trim()) { + return ( + <CommandGroup + heading="Common Questions" + className="text-xs text-muted-foreground font-medium" + > + {predefinedDocQueries.map((query) => ( + <CommandItem + key={query.id} + value={`predefined-${query.id}`} + onSelect={() => handlePredefinedQueryClick(query.text)} + className="cursor-pointer" + > + <Search className="mr-2 h-4 w-4 text-muted-foreground" /> + <span>{query.text}</span> + </CommandItem> + ))} + </CommandGroup> + ); + } + + // Check for specific message if only stop words were typed + const processedQuery = preprocessQuery(inputValue); + if (!processedQuery && inputValue.trim()) { + return ( + <CommandEmpty>Please enter more specific search terms.</CommandEmpty> + ); + } + + // Use 'search' variable for checks and mapping + // Check if 'search' is an array before accessing length or mapping + const resultsArray = Array.isArray(search) ? search : []; + + if ( + resultsArray.length === 0 && + !isWaitingForResults && + inputValue.trim() + ) { + return <CommandEmpty>No results found.</CommandEmpty>; + } + + // Map over the 'search' variable (results array) + if (resultsArray.length > 0) { + return ( + <CommandGroup heading="Documentation Results"> + {resultsArray.map((hit: CustomSearchResult) => { + // Map over resultsArray + const title = (hit.metadata?.title as string) ?? "Untitled"; + const url = hit.url; + const snippet = hit.content; + + if (!url) return null; + + return ( + <CommandItem + key={hit.id} + onSelect={() => goToDoc(url)} + value={`doc-${hit.id}`} + className="h-auto py-2 flex flex-col items-start" + > + <div className="font-medium text-sm mb-1">{title}</div> + {snippet && ( + <div + className="text-xs text-muted-foreground" + dangerouslySetInnerHTML={{ __html: snippet }} + /> + )} + </CommandItem> + ); + })} + </CommandGroup> + ); + } + + // ... other fallback messages ... + if (inputValue.trim() && !isWaitingForResults) + return <CommandEmpty>No results found.</CommandEmpty>; + if (inputValue.trim() && isWaitingForResults) + return <CommandEmpty>Loading results...</CommandEmpty>; + } + + // ROOT COMMAND VIEW (Keep as before or update as needed) + return ( + <> + {/* DOCS Section */} + <CommandGroup + heading="DOCS" + className="text-xs text-muted-foreground font-medium" + > + <CommandItem + value="search-docs" + onSelect={() => handleSelect(() => setIsSearchingDocs(true))} + > + <span>Search the docs</span> + </CommandItem> + </CommandGroup> + + <CommandSeparator /> + + {/* AI Section */} + <CommandGroup + heading="AI" + className="text-xs text-muted-foreground font-medium" + > + {aiItems.map((item) => ( + <CommandItem + key={item.id} + value={`ai-${item.id}`} + onSelect={() => handleAiAction(item.id)} + > + <item.icon className="mr-2 h-4 w-4" /> + <span>{item.title}</span> + </CommandItem> + ))} + </CommandGroup> + + <CommandSeparator /> + + {/* NAVIGATE Section */} + <CommandGroup + heading="NAVIGATE" + className="text-xs text-muted-foreground font-medium" + > + {navigateItems.map((item) => ( + <CommandItem + key={item.id} + value={`navigate-${item.id}`} + onSelect={() => goToHref(item.href)} + > + <item.icon className="mr-2 h-4 w-4" /> + <span>{item.title}</span> + </CommandItem> + ))} + </CommandGroup> + </> + ); + }; + + return ( + <CommandDialog open={open} onOpenChange={handleOpenChange}> + <CommandInput + ref={isSearchingDocs ? docsInputRef : rootInputRef} + placeholder={ + isSearchingDocs ? "Search docs..." : "Search for commands..." + } + value={inputValue} + onValueChange={handleInputChange} + className="bg-transparent rounded-none focus:border-primary focus:ring-0" + /> + <CommandList className="min-h-[300px] max-h-[400px] bg-background border-t"> + {renderListContent()} + </CommandList> + </CommandDialog> + ); +} diff --git a/components/search.tsx b/components/search.tsx deleted file mode 100644 index 9682a8fb8..000000000 --- a/components/search.tsx +++ /dev/null @@ -1,71 +0,0 @@ -"use client"; - -import algo from "algoliasearch/lite"; -import { cva } from "class-variance-authority"; -import type { SharedProps } from "fumadocs-ui/components/dialog/search"; -import SearchDialog from "fumadocs-ui/components/dialog/search-algolia"; -import { useEffect, useState } from "react"; -import { modes } from "@/utils/modes"; -import { cn } from "@/lib/utils"; -import { useMode } from "@/app/(docs)/layout.client"; - -const itemVariants = cva( - "rounded-md border px-2 py-0.5 text-xs font-medium text-muted-foreground transition-colors", - { - variants: { - active: { - true: "bg-accent text-accent-foreground", - }, - }, - } -); - -const appId = process.env.NEXT_PUBLIC_ALGOLIA_APP_ID; -const apiKey = process.env.NEXT_PUBLIC_ALGOLIA_API_KEY; -const indexName = process.env.NEXT_PUBLIC_ALGOLIA_INDEX; - -if (!appId || !apiKey || !indexName) throw new Error("Algolia credentials"); - -const client = algo(appId, apiKey); - -const index = client.initIndex(indexName); - -export default function CustomSearchDialog(props: SharedProps): JSX.Element { - const defaultTag = useMode() ?? "stacks"; - const [tag, setTag] = useState(defaultTag); - - useEffect(() => { - setTag(defaultTag); - }, [defaultTag]); - - return ( - <SearchDialog - index={index} - {...props} - footer={ - <div className="flex flex-row items-center gap-1"> - {modes.map((mode) => ( - <button - key={mode.param} - className={cn(itemVariants({ active: tag === mode.param }))} - onClick={() => { - setTag(mode.param); - }} - type="button" - tabIndex={-1} - > - {mode.name} - </button> - ))} - <a - href="https://algolia.com" - rel="noreferrer noopener" - className="ml-auto text-xs text-muted-foreground" - > - Search powered by Algolia - </a> - </div> - } - /> - ); -} diff --git a/components/shared copy.tsx b/components/shared copy.tsx new file mode 100644 index 000000000..2a6650b65 --- /dev/null +++ b/components/shared copy.tsx @@ -0,0 +1,93 @@ +import type { ReactNode } from 'react'; +import type { LinkItemType } from './links'; +import type { NavProviderProps, TitleProps } from './layout/nav'; +import { Slot } from '@radix-ui/react-slot'; + +export interface NavOptions extends SharedNavProps { + enabled: boolean; + component: ReactNode; +} + +export interface SharedNavProps extends TitleProps, NavProviderProps { + /** + * Show/hide search toggle + * + * Note: Enable/disable search from root provider instead + */ + enableSearch?: boolean; + children?: ReactNode; +} + +export interface BaseLayoutProps { + /** + * Remove theme switcher component + */ + disableThemeSwitch?: boolean; + + /** + * Enable Language Switch + * + * @defaultValue false + */ + i18n?: boolean; + + /** + * GitHub url + */ + githubUrl?: string; + + links?: LinkItemType[]; + /** + * Replace or disable navbar + */ + nav?: Partial<NavOptions>; + + children?: ReactNode; +} + +/** + * Get Links Items with shortcuts + */ +export function getLinks( + links?: LinkItemType[], + githubUrl?: string, +): LinkItemType[] { + let result = links ?? []; + + if (githubUrl) + result = [ + ...result, + { + type: 'icon', + url: githubUrl, + text: 'Github', + label: 'GitHub', + icon: ( + <svg role="img" viewBox="0 0 24 24" fill="currentColor"> + <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" /> + </svg> + ), + external: true, + }, + ]; + + return result; +} + +export function replaceOrDefault( + obj: + | { + enabled?: boolean; + component?: ReactNode; + } + | undefined, + def: ReactNode, + customComponentProps?: object, + disabled?: ReactNode, +): ReactNode { + if (obj?.enabled === false) return disabled; + if (obj?.component !== undefined) + return <Slot {...customComponentProps}>{obj.component}</Slot>; + + return def; +} diff --git a/components/shared.tsx b/components/shared.tsx new file mode 100644 index 000000000..2a6650b65 --- /dev/null +++ b/components/shared.tsx @@ -0,0 +1,93 @@ +import type { ReactNode } from 'react'; +import type { LinkItemType } from './links'; +import type { NavProviderProps, TitleProps } from './layout/nav'; +import { Slot } from '@radix-ui/react-slot'; + +export interface NavOptions extends SharedNavProps { + enabled: boolean; + component: ReactNode; +} + +export interface SharedNavProps extends TitleProps, NavProviderProps { + /** + * Show/hide search toggle + * + * Note: Enable/disable search from root provider instead + */ + enableSearch?: boolean; + children?: ReactNode; +} + +export interface BaseLayoutProps { + /** + * Remove theme switcher component + */ + disableThemeSwitch?: boolean; + + /** + * Enable Language Switch + * + * @defaultValue false + */ + i18n?: boolean; + + /** + * GitHub url + */ + githubUrl?: string; + + links?: LinkItemType[]; + /** + * Replace or disable navbar + */ + nav?: Partial<NavOptions>; + + children?: ReactNode; +} + +/** + * Get Links Items with shortcuts + */ +export function getLinks( + links?: LinkItemType[], + githubUrl?: string, +): LinkItemType[] { + let result = links ?? []; + + if (githubUrl) + result = [ + ...result, + { + type: 'icon', + url: githubUrl, + text: 'Github', + label: 'GitHub', + icon: ( + <svg role="img" viewBox="0 0 24 24" fill="currentColor"> + <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" /> + </svg> + ), + external: true, + }, + ]; + + return result; +} + +export function replaceOrDefault( + obj: + | { + enabled?: boolean; + component?: ReactNode; + } + | undefined, + def: ReactNode, + customComponentProps?: object, + disabled?: ReactNode, +): ReactNode { + if (obj?.enabled === false) return disabled; + if (obj?.component !== undefined) + return <Slot {...customComponentProps}>{obj.component}</Slot>; + + return def; +} diff --git a/components/steps.tsx b/components/steps.tsx new file mode 100644 index 000000000..ce348a296 --- /dev/null +++ b/components/steps.tsx @@ -0,0 +1,9 @@ +import type { ReactNode } from 'react'; + +export function Steps({ children }: { children: ReactNode }) { + return <div className="fd-steps">{children}</div>; +} + +export function Step({ children }: { children: ReactNode }) { + return <div className="fd-step">{children}</div>; +} diff --git a/components/table.tsx b/components/table.tsx index 9f6e999db..dbb8742b0 100644 --- a/components/table.tsx +++ b/components/table.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { ReactNode } from "react"; import { Table, TableBody, @@ -21,7 +21,8 @@ const NetworkBadge = ({ network }: NetworkBadgeProps) => ( <> {typeof network === "object" && network !== null ? ( <code className="relative rounded bg-muted p-1.5 font-mono text-sm text-left text-muted-foreground w-full"> - {network.props.children} + {(network as React.ReactElement<{ children?: ReactNode }>).props + .children ?? ""} </code> ) : ( <span className="text-muted-foreground whitespace-normal break-words text-base"> @@ -42,16 +43,29 @@ function CustomTable({ className, ...props }: TableProps) { React.isValidElement(child) && child.type === "tbody" ); - const headerRows = thead ? React.Children.toArray(thead.props.children) : []; - const bodyRows = tbody ? React.Children.toArray(tbody.props.children) : []; + const headerRows = thead + ? React.Children.toArray( + (thead as React.ReactElement<{ children?: ReactNode }>).props.children + ) + : []; + const bodyRows = tbody + ? React.Children.toArray( + (tbody as React.ReactElement<{ children?: ReactNode }>).props.children + ) + : []; const rows = [...headerRows, ...bodyRows].filter( (row): row is React.ReactElement => React.isValidElement(row) ); if (rows.length === 0) return null; - const headers = React.Children.toArray(rows[0].props.children).map((cell) => - React.isValidElement(cell) ? cell.props.children : cell + const headers = React.Children.toArray( + (rows[0] as React.ReactElement<{ children?: ReactNode }>).props.children + ).map((cell) => + React.isValidElement(cell) + ? ((cell as React.ReactElement<{ children?: ReactNode }>).props + .children ?? "") + : cell ); const dataRows = rows.slice(1); @@ -72,14 +86,25 @@ function CustomTable({ className, ...props }: TableProps) { </TableHeader> <TableBody> {dataRows.map((row, i) => { - const cells = React.Children.toArray(row.props.children).map( - (cell) => - React.isValidElement(cell) ? cell.props.children : cell + const cells = React.Children.toArray( + (row as React.ReactElement<{ children?: ReactNode }>).props + .children + ).map((cell) => + React.isValidElement(cell) + ? ((cell as React.ReactElement<{ children?: ReactNode }>).props + .children ?? "") + : cell ); return ( <TableRow key={i} className="border-t"> <TableCell className="py-4"> - <NetworkBadge network={cells[0]} /> + <NetworkBadge + network={ + React.isValidElement(cells[0]) + ? cells[0] // Pass element directly + : String(cells[0] ?? "") // Convert others to string + } + /> </TableCell> {cells.slice(1).map((cell, j) => ( <TableCell diff --git a/components/theme-provider.tsx b/components/theme-provider.tsx new file mode 100644 index 000000000..189a2b1a1 --- /dev/null +++ b/components/theme-provider.tsx @@ -0,0 +1,11 @@ +"use client"; + +import * as React from "react"; +import { ThemeProvider as NextThemesProvider } from "next-themes"; + +export function ThemeProvider({ + children, + ...props +}: React.ComponentProps<typeof NextThemesProvider>) { + return <NextThemesProvider {...props}>{children}</NextThemesProvider>; +} diff --git a/components/top-nav.tsx b/components/top-nav.tsx new file mode 100644 index 000000000..33b901fa3 --- /dev/null +++ b/components/top-nav.tsx @@ -0,0 +1,189 @@ +"use client"; + +import React, { useState, useEffect } from "react"; +import { cn } from "@/lib/utils"; +import { cva } from "class-variance-authority"; +import Link from "next/link"; +import { usePathname } from "next/navigation"; +import { Button } from "@/components/ui/button"; +import { ThemeToggle } from "@/components/layout/theme-toggle"; +import { DocsLogo } from "@/components/ui/icon"; +import { modes, type Mode } from "@/lib/modes"; +import { useSearch } from "@/lib/hooks/use-search"; +import { SearchIcon } from "lucide-react"; +import { useKeyboardShortcuts } from "@/lib/hooks/use-keyboard-shortcuts"; +import { Kbd } from "@/components/ui/kbd"; + +interface TopNavProps { + className?: string; +} + +const itemVariants = cva( + "rounded-md px-2 py-1 transition-colors hover:text-accent-foreground", + { + variants: { + active: { + true: "text-accent-foreground pointer-events-none", + }, + mode: { + bitcoin: "bg-hiro", + stacks: "bg-background", + }, + }, + compoundVariants: [ + { + active: true, + mode: "bitcoin", + className: "bg-orange-500 dark:bg-orange-700 text-primary", + }, + { + active: true, + mode: "stacks", + className: "bg-inverted text-background", + }, + ], + } +); + +export function TopNav({ className }: TopNavProps) { + const pathname = usePathname(); + const currentMode = pathname.split("/")[1]; // Gets 'stacks' or 'bitcoin' from the path + const [isScrolled, setIsScrolled] = useState(false); + const { setOpen } = useSearch(); + const { registerShortcut } = useKeyboardShortcuts(); + + useEffect(() => { + const handleScroll = () => { + setIsScrolled(window.scrollY > 45); + }; + + window.addEventListener("scroll", handleScroll); + handleScroll(); // Check initial scroll position + + return () => window.removeEventListener("scroll", handleScroll); + }, []); + + React.useEffect(() => { + // Register 'p' shortcut for platform navigation + const platformShortcut = registerShortcut({ + key: "p", + callback: () => { + window.open( + "https://platform.hiro.so", + "_blank", + "noopener,noreferrer" + ); + }, + preventDefault: true, + }); + + // Register 't' shortcut for calendar scheduling + const calendarShortcut = registerShortcut({ + key: "t", + callback: () => { + window.open( + "https://cal.com/waits/15min", + "_blank", + "noopener,noreferrer" + ); + }, + preventDefault: true, + }); + + // Clean up both shortcuts + return () => { + platformShortcut(); + calendarShortcut(); + }; + }, [registerShortcut]); + + const navItems = [ + { name: "Guides", href: "/guides" }, + { name: "Cookbook", href: "/cookbook" }, + ]; + + return ( + <header + className={cn( + "sticky top-0 z-50 h-16 transition-all duration-200", + "bg-background/50 backdrop-blur-md", + isScrolled ? "border-b border-border" : "border-b border-transparent", + className + )} + > + <div className="flex h-14 p-4 items-center"> + <div className="space-x-6 flex"> + <Link href="/" className="mr-6 flex items-center space-x-2"> + <DocsLogo className="hidden sm:block" /> + </Link> + <div className="rounded-md border bg-background p-1 text-sm text-muted-foreground max-md:absolute max-md:left-[50%] max-md:translate-x-[-50%]"> + {modes.map((m) => ( + <Link + key={m.param} + href={`/${m.param}`} + className={cn( + itemVariants({ + active: currentMode === m.param, + mode: + currentMode === m.param + ? (m.param as "bitcoin" | "stacks") + : undefined, + }) + )} + > + <div className="inline-flex items-center gap-2"> + {m.icon && <m.icon className="shrink-0 size-3" />} + {m.name} + </div> + </Link> + ))} + </div> + <nav className="flex items-center space-x-6 text-sm font-medium"> + {navItems.map((item) => ( + <Link + key={item.href} + href={item.href} + className={cn( + "font-base transition-colors hover:underline hover:underline-offset-4 decoration-neutral-150 dark:decoration-neutral-500 hover:decoration-2", + pathname === item.href || pathname.startsWith(`${item.href}/`) + ? "text-primary underline underline-offset-4 decoration-2" + : "text-primary" + )} + > + {item.name} + </Link> + ))} + </nav> + </div> + <div className="flex flex-1 items-center justify-end space-x-3"> + <div + className="w-full max-w-[221px] h-8 bg-white dark:bg-neutral-950 rounded-md flex items-center px-2 cursor-pointer group" + onClick={() => setOpen(true)} + > + <div className="flex items-center flex-1 gap-2"> + <SearchIcon className="h-4 w-4 shrink-0 text-muted-foreground group-hover:text-primary transition-colors" /> + <span className="text-sm text-muted-foreground group-hover:text-primary transition-colors"> + Search + </span> + </div> + <div className="flex items-center gap-1 group"> + <Kbd className="flex items-center justify-center rounded text-md bg-card text-muted-foreground group-hover:text-primary transition-colors"> + ⌘ + </Kbd> + <Kbd className="flex items-center justify-center rounded text-sm bg-card text-muted-foreground group-hover:text-primary transition-colors"> + K + </Kbd> + </div> + </div> + <Button className="cursor-pointer bg-neutral-150 dark:bg-neutral-700 flex items-center gap-2 px-2.5 py-1.5 text-primary hover:bg-neutral-200 dark:hover:bg-neutral-800"> + Hiro Platform + <Kbd className="flex items-center justify-center rounded text-sm border border-border bg-neutral-100 dark:bg-neutral-500"> + P + </Kbd> + </Button> + <ThemeToggle /> + </div> + </div> + </header> + ); +} From 3003db13c1b6918120af81076911fad5d13e8da8 Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 11:51:19 -0500 Subject: [PATCH 05/21] update app configs and markdown component loading --- app/(docs)/[...slug]/page.tsx | 213 +++-- app/(docs)/layout.client.tsx | 110 --- app/(docs)/layout.tsx | 103 +-- app/(docs)/raw/[...slug]/route.ts | 36 + app/(home)/components/card.tsx | 61 ++ app/(home)/components/interactive-badge.tsx | 26 + app/(home)/icons.tsx | 3 +- app/(home)/layout.tsx | 18 +- app/(home)/page.tsx | 102 +-- app/api/llms/[[...section]]/route.ts | 105 +++ app/api/search/route.ts | 17 +- app/config/docs.ts | 53 ++ app/cookbook/[id]/page.tsx | 46 +- app/cookbook/components/cookbook-ui.tsx | 2 +- app/cookbook/components/snippet-result.tsx | 30 +- app/cookbook/layout.tsx | 13 +- app/cookbook/page.tsx | 6 +- app/favicon.ico | Bin 15086 -> 0 bytes app/fonts/Aeonik-Bold.woff | Bin 49764 -> 0 bytes app/fonts/Aeonik-Bold.woff2 | Bin 45340 -> 0 bytes app/fonts/AeonikFono-Regular.woff | Bin 38724 -> 0 bytes app/fonts/AeonikFono-Regular.woff2 | Bin 36260 -> 0 bytes app/fonts/AeonikMono-Regular.woff | Bin 33308 -> 0 bytes app/fonts/AeonikMono-Regular.woff2 | Bin 31600 -> 0 bytes app/fonts/Inter-Medium.woff2 | Bin 111380 -> 0 bytes app/fonts/Inter-Regular.woff2 | Bin 108488 -> 0 bytes app/fonts/Inter-SemiBold.woff2 | Bin 111588 -> 0 bytes app/fonts/index.ts | 74 -- app/global.css | 839 +++++++------------- app/layout.config.tsx | 15 + app/layout.tsx | 151 +--- app/llms.txt/route.ts | 44 + app/provider.tsx | 21 - app/sitemap.ts | 33 - app/theme.css | 388 +++++++++ 35 files changed, 1244 insertions(+), 1265 deletions(-) delete mode 100644 app/(docs)/layout.client.tsx create mode 100644 app/(docs)/raw/[...slug]/route.ts create mode 100644 app/(home)/components/card.tsx create mode 100644 app/(home)/components/interactive-badge.tsx create mode 100644 app/api/llms/[[...section]]/route.ts create mode 100644 app/config/docs.ts delete mode 100644 app/favicon.ico delete mode 100644 app/fonts/Aeonik-Bold.woff delete mode 100644 app/fonts/Aeonik-Bold.woff2 delete mode 100644 app/fonts/AeonikFono-Regular.woff delete mode 100644 app/fonts/AeonikFono-Regular.woff2 delete mode 100644 app/fonts/AeonikMono-Regular.woff delete mode 100644 app/fonts/AeonikMono-Regular.woff2 delete mode 100644 app/fonts/Inter-Medium.woff2 delete mode 100644 app/fonts/Inter-Regular.woff2 delete mode 100644 app/fonts/Inter-SemiBold.woff2 delete mode 100644 app/fonts/index.ts create mode 100644 app/layout.config.tsx create mode 100644 app/llms.txt/route.ts delete mode 100644 app/provider.tsx delete mode 100644 app/sitemap.ts create mode 100644 app/theme.css diff --git a/app/(docs)/[...slug]/page.tsx b/app/(docs)/[...slug]/page.tsx index 5ae7fe988..f4918e50d 100644 --- a/app/(docs)/[...slug]/page.tsx +++ b/app/(docs)/[...slug]/page.tsx @@ -1,135 +1,132 @@ -import type { Metadata } from "next"; -import { Card, Cards } from "fumadocs-ui/components/card"; -import { RollButton } from "fumadocs-ui/components/roll-button"; -import { DocsPage, DocsBody } from "fumadocs-ui/page"; +import fs from "fs/promises"; +import matter from "gray-matter"; +import { source } from "@/lib/source"; +import { openapi } from "@/lib/source"; import { notFound } from "next/navigation"; -import { utils, type Page } from "@/utils/source"; -import { createMetadata, getRouteMetadata } from "@/utils/metadata"; +import { HeadingProps } from "@/types"; +import { + Accordion, + AccordionItem, + AccordionTrigger, + AccordionContent, +} from "@/components/ui/accordion"; +import { + DocsPage, + DocsBody, + DocsDescription, + DocsTitle, +} from "@/components/page"; +import { CustomTable as Table, TableProps } from "@/components/table"; +import { OrderedList, UnorderedList } from "@/components/lists"; +import { Callout } from "@/components/callout"; +import { Cards, Card, SecondaryCard } from "@/components/card"; +import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"; +import { docskit } from "@/components/docskit/components"; +import defaultMdxComponents from "fumadocs-ui/mdx"; +import { LLMShare } from "@/components/llm-share"; + +export default async function Page(props: { + params: Promise<{ slug?: string[] }>; +}) { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); -interface Param { - slug: string[]; -} + const fileContent = await fs.readFile(page.data._file.absolutePath, "utf-8"); + const { content: rawMarkdownContent } = matter(fileContent); -export const dynamicParams = false; + // Filter out import statements + const LLMContent = rawMarkdownContent + .split("\n") + .filter((line) => !line.trim().startsWith("import")) + .join("\n"); -export default function Page({ params }: { params: Param }): JSX.Element { - const page = utils.getPage(params.slug); + // Construct the absolute page URL + const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || "https://docs.hiro.so"; // Default or from env + const pagePath = params.slug?.join("/") || ""; - if (!page) notFound(); + const MDX = page.data.body; return ( <DocsPage - toc={page.data.exports.toc} + toc={page.data.toc} + full={page.data.full} tableOfContent={{ - enabled: page.data.toc, + style: "clerk", }} > - <RollButton /> - {page.data.title !== "Home" && ( - <h1 className="text-2xl text-foreground sm:text-3xl"> - {page.data.title} - </h1> - )} - {page.data.title !== "Home" && ( - <p className="mb-8 text-lg text-muted-foreground"> - {page.data.description} - </p> - )} - {page.data.title !== "Home" && ( - <hr className="border-t border-border/50" /> - )} + <div className="mb-4"> + <div className="flex justify-between items-start gap-4"> + {(!params.slug?.includes("stacks") || params.slug?.length > 1) && + (!params.slug?.includes("bitcoin") || params.slug?.length > 1) && ( + <DocsTitle className="mt-0">{page.data.title}</DocsTitle> + )} + {page.data.llm && <LLMShare content={LLMContent} />} + </div> + <DocsDescription>{page.data.description}</DocsDescription> + </div> + <DocsBody> - {page.data.index ? ( - <Category page={page} /> - ) : ( - <page.data.exports.default /> - )} + <MDX + components={{ + ...defaultMdxComponents, + Accordion, + AccordionItem, + AccordionTrigger, + AccordionContent, + APIPage: openapi.APIPage, + h1: ({ children, ...props }: HeadingProps) => { + const H1 = + defaultMdxComponents.h1 as React.ComponentType<HeadingProps>; + const id = typeof children === "string" ? children : undefined; + return ( + <H1 id={id} {...props}> + {children} + </H1> + ); + }, + blockquote: (props) => <Callout>{props.children}</Callout>, + Callout, + Cards, + Card, + SecondaryCard, + code: (props: React.PropsWithChildren) => ( + <code + {...props} + className={`border border-border rounded-md p-1 bg-code text-sm text-muted-foreground [h1_&]:text-xl`} + /> + ), + hr: (props: React.PropsWithChildren) => ( + <hr {...props} className="border-t border-border/50 mt-0 mb-6" /> + ), + table: (props: TableProps) => <Table {...props} />, + ol: OrderedList, + ul: UnorderedList, + Tabs, + TabsList, + TabsTrigger, + TabsContent, + ...docskit, + }} + /> </DocsBody> </DocsPage> ); } -function Category({ page }: { page: Page }): JSX.Element { - const filtered = utils.files.filter( - (docs) => - docs.type === "page" && - docs.file.dirname === page.file.dirname && - docs.file.name !== "index" - ) as Page[]; - - return ( - <Cards> - {filtered.map((item) => ( - <Card - key={item.url} - title={item.data.title} - description={item.data.description ?? "No Description"} - href={item.url} - /> - ))} - </Cards> - ); +export async function generateStaticParams() { + return source.generateParams(); } export async function generateMetadata(props: { params: Promise<{ slug?: string[] }>; -}): Promise<Metadata> { +}) { const params = await props.params; - const page = utils.getPage(params.slug); + const page = source.getPage(params.slug); if (!page) notFound(); - const path = `/${params.slug?.join("/") || ""}`; - const routeMetadata = getRouteMetadata(path); - - const pathParts = path.split("/").filter(Boolean); - - const genericTitles = [ - "Overview", - "Installation", - "Quickstart", - "Concepts", - "Getting Started", - ]; - - let title = page.data.title; - - if (page.file.name === "index" || genericTitles.includes(title)) { - let sectionName = - page.file.name === "index" - ? pathParts[pathParts.length - 1] - : pathParts[pathParts.length - 2] || pathParts[pathParts.length - 1]; - - if (sectionName === "api" && pathParts.length >= 2) { - const parentSection = pathParts[pathParts.length - 2]; - if (parentSection === "runes" || parentSection === "ordinals") { - const capitalizedParent = - parentSection.charAt(0).toUpperCase() + parentSection.slice(1); - sectionName = `${capitalizedParent} API`; - } - } - - const sectionTitle = sectionName - .split("-") - .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) - .join(" ") - .replace("Api", "API") - .replace("Js", "JS") - .replace("Sdk", "SDK"); - - if (page.file.name === "index") { - title = `${sectionTitle} Overview`; - } else { - title = `${sectionTitle} ${title}`; - } - } - - const pageMetadata: Partial<Metadata> = { - title, + return { + title: page.data.title, description: page.data.description, }; - - return createMetadata({ - ...routeMetadata, - ...pageMetadata, - }); } diff --git a/app/(docs)/layout.client.tsx b/app/(docs)/layout.client.tsx deleted file mode 100644 index bef178ed4..000000000 --- a/app/(docs)/layout.client.tsx +++ /dev/null @@ -1,110 +0,0 @@ -"use client"; - -import { cva } from "class-variance-authority"; -import Link from "next/link"; -import { useParams, usePathname } from "next/navigation"; -import type { ReactNode } from "react"; -import { cn } from "@/lib/utils"; -import { modes } from "@/utils/modes"; -import { ChevronLeft } from "lucide-react"; - -type Mode = "stacks" | "bitcoin" | null | undefined; - -const itemVariants = cva( - "rounded-md px-2 py-1 transition-colors hover:text-accent-foreground", - { - variants: { - active: { - true: "text-accent-foreground pointer-events-none", - }, - mode: { - bitcoin: "bg-hiro", - stacks: "bg-background", - }, - }, - compoundVariants: [ - { - active: true, - mode: "bitcoin", - className: "bg-hiro dark:text-background", - }, - { - active: true, - mode: "stacks", - className: "bg-inverted text-background", - }, - ], - } -); - -export function Body({ children }: { children: ReactNode }): JSX.Element { - const mode = useMode(); - - return <div className={mode}>{children}</div>; -} - -export function NavChildren(): JSX.Element { - const mode = useMode(); - - const filteredModes = modes.filter((m) => m.param !== "guides"); - - return ( - <div className="rounded-md border bg-background p-1 text-sm text-muted-foreground max-md:absolute max-md:left-[50%] max-md:translate-x-[-50%]"> - {filteredModes.map((m) => ( - <Link - key={m.param} - href={`/${m.param}`} - className={cn( - itemVariants({ - active: mode === m.param, - mode: mode === m.param ? (m.param as Mode) : undefined, - }) - )} - > - <div className="inline-flex items-center gap-2"> - {m.icon && <m.icon className="shrink-0 size-3" />} - {m.name} - </div> - </Link> - ))} - </div> - ); -} - -export function useMode(): string | undefined { - const { slug } = useParams(); - return Array.isArray(slug) && slug.length > 0 ? slug[0] : undefined; -} - -export function SidebarBanner(): JSX.Element { - const pathname = usePathname(); - const mode = useMode(); - const currentMode = modes.find((item) => item.param === mode) ?? modes[0]; - - if ( - pathname === "/stacks" || - pathname === "/stacks/get-started" || - pathname === "/bitcoin" || - pathname === "/bitcoin/get-started" || - pathname.startsWith("/guides") || - pathname === "/stacks/api-keys" || - pathname === "/stacks/rate-limiting" || - pathname === "/stacks/contributors-guide" || - pathname === "/bitcoin/rate-limiting" || - pathname === "/bitcoin/api-keys" || - pathname === "/bitcoin/contributors-guide" - ) { - return <></>; - } - - return ( - <Link key={currentMode.param} href={`/${currentMode.param}`}> - <div className="group flex flex-row items-center gap-2 rounded-lg px-2 mb-4 transition-colors"> - <ChevronLeft className="text-muted-foreground size-4 shrink-0 rounded-md group-hover:text-primary" /> - <div> - <p className="text-muted-foreground group-hover:text-primary">Back</p> - </div> - </div> - </Link> - ); -} diff --git a/app/(docs)/layout.tsx b/app/(docs)/layout.tsx index 530830b84..8eb9690c9 100644 --- a/app/(docs)/layout.tsx +++ b/app/(docs)/layout.tsx @@ -1,88 +1,25 @@ -import { DocsLayout, type DocsLayoutProps } from "fumadocs-ui/layout"; +import { DocsLayout } from "@/components/docs"; import type { ReactNode } from "react"; -import { ArrowUpRight } from "lucide-react"; -import { utils } from "@/utils/source"; -import { DocsLogo } from "@/components/ui/icon"; -import { Body, NavChildren, SidebarBanner } from "./layout.client"; -import { Statuspage } from "statuspage.io"; +import { baseOptions } from "@/app/layout.config"; +import { source } from "@/lib/source"; +import { TopNav } from "@/components/top-nav"; -const statuspage = new Statuspage("3111l89394q4"); -// console.log({ status: await statuspage.api.getStatus() }); - -export const layoutOptions: Omit<DocsLayoutProps, "children"> = { - tree: utils.pageTree, - nav: { - transparentMode: "top", - title: <DocsLogo className="size-28 hidden sm:block" />, - children: <NavChildren />, - links: [ - { - label: "Hiro Platform", - href: "https://platform.hiro.so/", - icon: ( - <div className="flex items-center gap-1 bg-secondary p-1.5 rounded-md"> - <span className="font-semibold max-md:hidden">Hiro Platform</span> - </div> - ), - external: true, - }, - ], - }, - links: [ - { - text: "Guides", - url: "/guides", - }, - { - text: "Cookbook", - url: "/cookbook", - }, - ], - sidebar: { - defaultOpenLevel: 0, - banner: <SidebarBanner />, - }, -}; - -export const homeLayoutOptions: Omit<DocsLayoutProps, "children"> = { - tree: utils.pageTree, - nav: { - transparentMode: "top", - title: <DocsLogo className="size-28 hidden sm:block" />, - children: null, - links: [ - { - label: "Hiro Platform", - href: "https://platform.hiro.so/", - icon: ( - <div className="flex items-center gap-1 bg-secondary p-1.5 rounded-md"> - <span className="font-semibold max-md:hidden">Hiro Platform</span> - </div> - ), - external: true, - }, - ], - }, - links: [ - { - text: "Guides", - url: "/guides", - }, - { - text: "Cookbook", - url: "/cookbook", - }, - ], -}; - -export default function Layout({ - children, -}: { - children: ReactNode; -}): JSX.Element { +export default function Layout({ children }: { children: ReactNode }) { return ( - <Body> - <DocsLayout {...layoutOptions}>{children}</DocsLayout> - </Body> + <DocsLayout + {...baseOptions} + tree={source.pageTree} + sidebar={{ + tabs: false, + hideSearch: true, + collapsible: false, + }} + // tabMode="navbar" // Set tabMode to navbar to display tabs in the navigation bar + nav={{ + component: <TopNav />, + }} + > + {children} + </DocsLayout> ); } diff --git a/app/(docs)/raw/[...slug]/route.ts b/app/(docs)/raw/[...slug]/route.ts new file mode 100644 index 000000000..06d991a83 --- /dev/null +++ b/app/(docs)/raw/[...slug]/route.ts @@ -0,0 +1,36 @@ +import * as fs from "node:fs/promises"; +import path from "node:path"; +import { NextRequest } from "next/server"; + +// Base directory for documentation content (same as in the llms API route) +const DOCS_CONTENT_PATH = path.join(process.cwd(), "content/docs"); + +export async function GET( + request: NextRequest, + { params }: { params: Promise<{ slug: string[] }> } +) { + const { slug } = await params; + + if (slug.length === 0) { + return new Response("Not Found", { status: 404 }); + } + + const filePath = path.join(DOCS_CONTENT_PATH, ...slug); + + try { + await fs.access(filePath); + + const fileContent = await fs.readFile(filePath, "utf-8"); + + return new Response(fileContent, { + status: 200, + headers: { "Content-Type": "text/markdown; charset=utf-8" }, + }); + } catch (error: any) { + if (error.code === "ENOENT") { + return new Response("Not Found", { status: 404 }); + } else { + return new Response("Internal Server Error", { status: 500 }); + } + } +} diff --git a/app/(home)/components/card.tsx b/app/(home)/components/card.tsx new file mode 100644 index 000000000..141ecb80f --- /dev/null +++ b/app/(home)/components/card.tsx @@ -0,0 +1,61 @@ +import Link from "fumadocs-core/link"; +import { cn } from "@/lib/utils"; +import { InteractiveBadge } from "./interactive-badge"; + +interface CardProps { + href: string; + icon: React.ReactNode; + title: string; + description: string; + badges: Array<{ + label: string; + href: string; + }>; + variant?: "default" | "secondary"; +} + +export function Card({ + href, + icon, + title, + description, + badges, + variant = "default", +}: CardProps) { + return ( + <div + className={cn( + "relative rounded-[0.6rem] p-[1.5px] overflow-hidden transition-colors hover:shadow-[0_6px_20px_rgba(89,86,80,0.2)] dark:hover:shadow-[0_6px_40px_#383432]", + { + "bg-gradient-to-br from-border via-border to-neutral-300 dark:to-neutral-200": + variant === "default", + "bg-gradient-to-br from-border via-border to-orange-500 dark:to-orange-700": + variant === "secondary", + } + )} + > + <Link + href={href} + className="not-prose block rounded-lg bg-[#ebe9e5] dark:bg-neutral-600 p-8 text-md text-neutral-500 dark:text-neutral-300 h-full" + > + <div className="mb-6"> + <div className="w-20 h-20 rounded-lg flex items-center justify-center mb-4"> + {icon} + </div> + <h3 className="text-2xl font-semibold mb-2">{title}</h3> + <p className="text-muted-foreground">{description}</p> + </div> + + <div className="flex flex-wrap gap-2"> + {badges?.map((badge) => ( + <InteractiveBadge + key={badge.label} + href={badge.href} + label={badge.label} + /> + ))} + </div> + </Link> + </div> + ); +} diff --git a/app/(home)/components/interactive-badge.tsx b/app/(home)/components/interactive-badge.tsx new file mode 100644 index 000000000..deb620820 --- /dev/null +++ b/app/(home)/components/interactive-badge.tsx @@ -0,0 +1,26 @@ +"use client"; + +import { Badge } from "@/components/ui/badge"; + +interface InteractiveBadgeProps { + href: string; + label: string; +} + +export function InteractiveBadge({ href, label }: InteractiveBadgeProps) { + return ( + <button + onClick={(e) => { + e.preventDefault(); + e.stopPropagation(); + window.location.href = href; + }} + type="button" + className="hover:no-underline" + > + <Badge className="bg-neutral-50 dark:bg-neutral-800 text-neutral-500 dark:text-neutral-300 hover:bg-neutral-200 hover:text-primary dark:hover:text-primary dark:hover:bg-neutral-950 cursor-pointer transition-colors"> + {label} + </Badge> + </button> + ); +} diff --git a/app/(home)/icons.tsx b/app/(home)/icons.tsx index caaeb7e63..c59a513bd 100644 --- a/app/(home)/icons.tsx +++ b/app/(home)/icons.tsx @@ -1,6 +1,7 @@ +import React, { JSX } from "react"; import type { SVGProps } from "react"; -export function HiroPlatformSVG(props: SVGProps<SVGSVGElement>): JSX.Element { +export function HiroPlatformSVG(props: SVGProps<SVGSVGElement>) { return ( <svg width="474" height="40" viewBox="0 0 474 40" fill="none" {...props}> <path diff --git a/app/(home)/layout.tsx b/app/(home)/layout.tsx index f20da1dd4..bd8210c49 100644 --- a/app/(home)/layout.tsx +++ b/app/(home)/layout.tsx @@ -1,15 +1,13 @@ -import { Layout } from "fumadocs-ui/layout"; import type { ReactNode } from "react"; -import { homeLayoutOptions } from "../(docs)/layout"; +import { HomeLayout } from "@/components/home"; +import { TopNav } from "@/components/top-nav"; +import { baseOptions } from "@/app/layout.config"; -export default function HomeLayout({ - children, -}: { - children: ReactNode; -}): JSX.Element { +export default function Layout({ children }: { children: ReactNode }) { return ( - <div className="px-10 *:border-none"> - <Layout {...homeLayoutOptions}>{children}</Layout> - </div> + <> + <TopNav /> + <HomeLayout {...baseOptions}>{children}</HomeLayout> + </> ); } diff --git a/app/(home)/page.tsx b/app/(home)/page.tsx index cf1def15c..0e1ca3542 100644 --- a/app/(home)/page.tsx +++ b/app/(home)/page.tsx @@ -1,82 +1,50 @@ import Link from "fumadocs-core/link"; import { StacksCardIcon, BitcoinCardIcon } from "@/components/ui/icon"; import { Card } from "@/components/ui/card"; +import { Card as LinkCard } from "@/app/(home)/components/card"; import { Badge } from "@/components/ui/badge"; -export default function HomePage(): JSX.Element { +export default function HomePage() { return ( - <main className="container mx-auto my-12 space-y-10"> + <main className="container mx-auto my-6 space-y-10"> <div className="space-y-1"> <h1 className="text-4xl font-bold text-[#141312] dark:text-[#f6f5f3]"> Welcome to Hiro Docs. </h1> - <h2 className="text-2xl font-regular text-muted-foreground font-inter"> + <h2 className="text-2xl font-regular text-muted-foreground"> Explore our tutorials, guides, API references, and more. </h2> </div> <div className="grid md:grid-cols-2 gap-6 mb-16"> - <Link + <LinkCard href="/stacks" - className="not-prose block rounded-lg border bg-[#EBE9E6] dark:bg-[#2a2726] p-4 text-md text-card-foreground transition-colors hover:shadow-[0_6px_20px_rgba(89,86,80,0.2)] dark:hover:shadow-[0_6px_40px_#383432]" - > - <div className="mb-6"> - <div className="w-20 h-20 rounded-lg flex items-center justify-center mb-4"> - <StacksCardIcon /> - </div> - <h3 className="text-xl font-semibold mb-2">Stacks Docs</h3> - <p className="text-muted-foreground">Start building on Stacks.</p> - </div> - - <div className="flex flex-wrap gap-2"> - <Badge className="bg-[#f6f5f3] dark:bg-[#181717] text-primary dark:text-[#8c877d]"> - CLARINET - </Badge> - <Badge className="bg-[#f6f5f3] dark:bg-[#181717] text-primary dark:text-[#8c877d]"> - CHAINHOOK - </Badge> - <Badge className="bg-[#f6f5f3] dark:bg-[#181717] text-primary dark:text-[#8c877d]"> - STACKS.JS - </Badge> - <Badge className="bg-[#f6f5f3] dark:bg-[#181717] text-primary dark:text-[#8c877d]"> - HIRO PLATFORM - </Badge> - <Badge className="bg-[#f6f5f3] dark:bg-[#181717] text-primary dark:text-[#8c877d]"> - STACKS API - </Badge> - <Badge className="bg-[#f6f5f3] dark:bg-[#181717] text-primary dark:text-[#8c877d]"> - TOKEN METADATA API - </Badge> - <Badge className="bg-[#f6f5f3] dark:bg-[#181717] text-primary dark:text-[#8c877d]"> - +3 MORE - </Badge> - </div> - </Link> - <Link + icon={<StacksCardIcon />} + title="Stacks Docs" + description="Start building on Stacks." + badges={[ + { label: "CLARINET", href: "/stacks/clarinet" }, + { label: "CHAINHOOK", href: "/stacks/chainhook" }, + { label: "APIs", href: "/stacks/api" }, + { label: "SDKs & LIBRARIES", href: "/stacks/reference" }, + { label: "HIRO PLATFORM", href: "/stacks/platform" }, + { label: "STACKS.JS", href: "/stacks/stacks.js" }, + { label: "STACKS CONNECT", href: "/stacks/connect" }, + { label: "CLARITY LANG", href: "/stacks/clarity" }, + ]} + /> + <LinkCard + variant="secondary" href="/bitcoin" - className="not-prose block rounded-lg border bg-[#EBE9E6] dark:bg-[#2a2726] p-4 text-md text-card-foreground transition-colors hover:shadow-[0_6px_20px_rgba(89,86,80,0.2)] dark:hover:shadow-[0_6px_40px_#383432]" - > - <div className="mb-6"> - <div className="w-20 h-20 rounded-lg flex items-center justify-center mb-4"> - <BitcoinCardIcon /> - </div> - <h3 className="text-xl font-semibold mb-2">Bitcoin Docs</h3> - <p className="text-muted-foreground"> - Start building on Ordinals and Runes. - </p> - </div> - <div className="flex flex-wrap gap-2"> - <Badge className="bg-[#f6f5f3] dark:bg-[#181717] text-primary dark:text-[#8c877d]"> - BITCOIN INDEXER - </Badge> - <Badge className="bg-[#f6f5f3] dark:bg-[#181717] text-primary dark:text-[#8c877d]"> - ORDINALS API - </Badge> - <Badge className="bg-[#f6f5f3] dark:bg-[#181717] text-primary dark:text-[#8c877d]"> - RUNES API - </Badge> - </div> - </Link> + icon={<BitcoinCardIcon />} + title="Bitcoin Docs" + description="Start building on Ordinals and Runes." + badges={[ + { label: "BITCOIN INDEXER", href: "/bitcoin/indexer" }, + { label: "APIs", href: "/bitcoin/api" }, + { label: "SDKs & LIBRARIES", href: "/bitcoin/sdks" }, + ]} + /> </div> <main className="space-y-6"> @@ -89,7 +57,7 @@ export default function HomePage(): JSX.Element { <div className="grid md:grid-cols-4 gap-6"> <Link href="/stacks/get-started" className="block h-full"> - <Card className="p-6 border bg-[#f2f0ed] dark:bg-[#1e1c1b] h-full flex flex-col"> + <Card className="p-6 border bg-neutral-100 dark:bg-neutral-700 h-full flex flex-col"> <h3 className="text-lg font-semibold mb-2"> Get started with Stacks </h3> @@ -100,7 +68,7 @@ export default function HomePage(): JSX.Element { </Card> </Link> <Link href="/stacks/api" className="block h-full"> - <Card className="p-6 border bg-[#f2f0ed] dark:bg-[#1e1c1b] h-full flex flex-col"> + <Card className="p-6 border bg-neutral-100 dark:bg-neutral-700 h-full flex flex-col"> <h3 className="text-lg font-semibold mb-2"> Stacks API Overview </h3> @@ -110,7 +78,7 @@ export default function HomePage(): JSX.Element { </Card> </Link> <Link href="/bitcoin/get-started" className="block h-full"> - <Card className="p-6 border bg-[#f2f0ed] dark:bg-[#1e1c1b] h-full flex flex-col"> + <Card className="p-6 border bg-neutral-100 dark:bg-neutral-700 h-full flex flex-col"> <h3 className="text-lg font-semibold mb-2"> Get started with Bitcoin </h3> @@ -121,8 +89,8 @@ export default function HomePage(): JSX.Element { </Card> </Link> <Link href="/bitcoin/ordinals/api" className="block h-full"> - <Card className="p-6 border bg-[#f2f0ed] dark:bg-[#1e1c1b] h-full flex flex-col"> - <h3 className="text-lg font-semibold mb-2"> + <Card className="p-6 border bg-neutral-100 dark:bg-neutral-700 h-full flex flex-col"> + <h3 className="text-lg font-semibold mb-2 font-fono"> Ordinals API Overview </h3> <p className="text-muted-foreground text-sm flex-grow"> diff --git a/app/api/llms/[[...section]]/route.ts b/app/api/llms/[[...section]]/route.ts new file mode 100644 index 000000000..414ed2b90 --- /dev/null +++ b/app/api/llms/[[...section]]/route.ts @@ -0,0 +1,105 @@ +import * as fs from "node:fs/promises"; +import path from "node:path"; +import fg from "fast-glob"; +import matter from "gray-matter"; +import { NextRequest } from "next/server"; + +const DOCS_CONTENT_PATH = path.join(process.cwd(), "content/docs"); +const BASE_URL = "https://docs.hiro.so"; + +function generateTitle(section: string[] = []): string { + if (section.length === 0) { + return "# Hiro Documentation"; + } + return `# ${section + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join(" ")} Documentation`; +} + +function getRawWebPath(filePath: string): string { + const relativePath = path.relative(DOCS_CONTENT_PATH, filePath); + const parsedPath = path.parse(relativePath); + let webPath = path.join("/raw", parsedPath.dir, parsedPath.name); + if (parsedPath.name === "index") { + webPath = path.dirname(webPath); + + return webPath.replace(/\\/g, "/") + "/index.mdx"; + } + + return webPath.replace(/\\/g, "/") + ".mdx"; +} + +export async function GET( + request: NextRequest, + { params }: { params: Promise<{ section?: string[] }> } +) { + const awaitedParams = await params; + let sectionSegments = awaitedParams.section || []; + + if ( + sectionSegments.length > 0 && + sectionSegments[sectionSegments.length - 1] === "llms.txt" + ) { + sectionSegments = sectionSegments.slice(0, -1); + } + + const sectionPath = path.join(DOCS_CONTENT_PATH, ...sectionSegments); + + try { + // Check if the directory exists + try { + await fs.access(sectionPath); + } catch (e) { + // Directory doesn't exist, return 404 + return new Response("Not Found", { status: 404 }); + } + + // Find MDX files directly within the target directory (not recursive) + const files = await fg(`${sectionPath}/*.mdx`, { + cwd: process.cwd(), + absolute: true, + onlyFiles: true, + }); + + const markdownOutput: string[] = [ + generateTitle(sectionSegments), + "\n## Pages\n", + ]; + + if (files.length === 0) { + markdownOutput.push("No pages found in this section."); + } else { + const fileDataPromises = files.map(async (file) => { + try { + const fileContent = await fs.readFile(file, "utf-8"); + const { data } = matter(fileContent); + const title = data.title || path.basename(file, ".mdx"); // Fallback title + const description = data.description || ""; + // Use the new function to get the /raw/ path + const rawWebPath = getRawWebPath(file); + const absoluteRawWebPath = `${BASE_URL}${rawWebPath}`; // Create absolute URL + return `- [${title}](${absoluteRawWebPath})${description ? `: ${description}` : ""}`; + } catch (readError) { + console.error(`Error processing file ${file}:`, readError); + return null; // Skip files that cause errors + } + }); + + const formattedFiles = (await Promise.all(fileDataPromises)).filter( + Boolean + ) as string[]; + formattedFiles.sort(); // Sort alphabetically by title/path + markdownOutput.push(...formattedFiles); + } + + return new Response(markdownOutput.join("\n"), { + headers: { "Content-Type": "text/plain; charset=utf-8" }, + }); + } catch (error) { + console.error( + `Error generating llms.txt for /${sectionSegments.join("/")}:`, + error + ); + return new Response("Internal Server Error", { status: 500 }); + } +} diff --git a/app/api/search/route.ts b/app/api/search/route.ts index 96b4422cf..578eaa76f 100644 --- a/app/api/search/route.ts +++ b/app/api/search/route.ts @@ -1,11 +1,8 @@ -import { utils } from "@/utils/source"; -import { createSearchAPI } from "fumadocs-core/search/server"; +import { source } from "@/lib/source"; +import { createFromSource } from "fumadocs-core/search/server"; -export const { GET } = createSearchAPI("advanced", { - indexes: utils.getPages().map((page) => ({ - title: page.data.title, - structuredData: page.data.exports.structuredData, - id: page.url, - url: page.url, - })), -}); +// Cache forever for static export +export const revalidate = 0; // Use 0 instead of false for Next.js 15+ + +// Export the static GET handler +export const { staticGET: GET } = createFromSource(source); diff --git a/app/config/docs.ts b/app/config/docs.ts new file mode 100644 index 000000000..5ccd0656e --- /dev/null +++ b/app/config/docs.ts @@ -0,0 +1,53 @@ +import type { MainNavItem, SidebarNavItem } from "@/types/nav"; + +interface DocsConfig { + mainNav: MainNavItem[]; + sidebarNav: SidebarNavItem[]; +} + +export const docsConfig: DocsConfig = { + mainNav: [ + { + title: "Documentation", + href: "/docs", + }, + { + title: "Cookbook", + href: "/cookbook", + }, + { + title: "GitHub", + href: "https://github.com/example/repo", // Example external link + external: true, + }, + ], + sidebarNav: [ + { + title: "Getting Started", + items: [ + { + title: "Introduction", + href: "/docs/introduction", + }, + { + title: "Installation", + href: "/docs/installation", + }, + ], + }, + { + title: "Core Concepts", + items: [ + { + title: "Concept A", + href: "/docs/concepts/a", + }, + { + title: "Concept B", + href: "/docs/concepts/b", + }, + ], + }, + // Add more sidebar groups as needed + ], +}; diff --git a/app/cookbook/[id]/page.tsx b/app/cookbook/[id]/page.tsx index 12e753ba4..2e40b08fe 100644 --- a/app/cookbook/[id]/page.tsx +++ b/app/cookbook/[id]/page.tsx @@ -1,7 +1,9 @@ +import React, { JSX } from "react"; import { Code } from "@/components/docskit/code"; -import { loadRecipe, loadRecipes } from "@/utils/loader"; +import { loadRecipe, loadRecipes } from "@/lib/loader"; import { Badge } from "@/components/ui/badge"; import { HoverProvider } from "@/context/hover"; +import { docskit } from "@/components/docskit/components"; import { HoverLink } from "@/components/docskit/annotations/hover"; import { Terminal } from "@/components/docskit/terminal"; import { InlineCode } from "@/components/docskit/inline-code"; @@ -16,30 +18,16 @@ import { AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; -import { Metadata } from "next/types"; -import { getRouteMetadata, createMetadata } from "@/utils/metadata"; - -interface Param { - id: string; -} +import { createMetadata } from "@/lib/metadata"; +import { source } from "@/lib/source"; +import { getRouteMetadata } from "@/lib/metadata"; export const dynamicParams = false; -export async function generateMetadata({ - params, -}: { - params: { id: string }; -}): Promise<Metadata> { - const routeMetadata = getRouteMetadata("/cookbook"); - return createMetadata(routeMetadata); -} - -export default async function Page({ - params, -}: { - params: Param; +export default async function Page(props: { + params: Promise<{ id: string }>; }): Promise<JSX.Element> { - const { id } = params; + const { id } = await props.params; const recipes = await loadRecipes(); const recipe = recipes.find((r) => r.id === id); @@ -91,7 +79,7 @@ export default async function Page({ Terminal, Code, InlineCode, - WithNotes, + ...docskit, }} /> </div> @@ -116,7 +104,7 @@ export default async function Page({ Terminal, Code, InlineCode, - WithNotes, + ...docskit, }} /> </div> @@ -156,3 +144,15 @@ export default async function Page({ </> ); } + +export async function generateStaticParams() { + return source.generateParams(); +} + +export async function generateMetadata(props: { + params: Promise<{ id: string }>; +}) { + const { id } = await props.params; + const routeMetadata = getRouteMetadata(`/cookbook/${id}`); + return createMetadata(routeMetadata); +} diff --git a/app/cookbook/components/cookbook-ui.tsx b/app/cookbook/components/cookbook-ui.tsx index 5fe7c8f97..ee3c3cb1e 100644 --- a/app/cookbook/components/cookbook-ui.tsx +++ b/app/cookbook/components/cookbook-ui.tsx @@ -2,7 +2,7 @@ import { useState, useMemo, Suspense, useEffect, useRef } from "react"; import { useRouter, useSearchParams } from "next/navigation"; -import { Recipe } from "@/types/recipes"; +import { Recipe } from "@/types"; import { cn } from "@/lib/utils"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; diff --git a/app/cookbook/components/snippet-result.tsx b/app/cookbook/components/snippet-result.tsx index 27e80d704..c0a75d6b4 100644 --- a/app/cookbook/components/snippet-result.tsx +++ b/app/cookbook/components/snippet-result.tsx @@ -3,15 +3,15 @@ import React from "react"; import Link from "next/link"; import { Play, Terminal } from "lucide-react"; -import { Button } from "@/components/ui/button"; +import { Button, buttonVariants } from "@/components/ui/button"; import { ArrowUpRight } from "lucide-react"; import { Code } from "@/components/docskit/code"; import { initSimnet, type Simnet } from "@hirosystems/clarinet-sdk-browser"; import { Cl } from "@stacks/transactions"; -import { loadSandpackClient } from "@codesandbox/sandpack-client"; -import type { SandboxSetup } from "@codesandbox/sandpack-client"; +// import { loadSandpackClient } from "@codesandbox/sandpack-client"; +// import type { SandboxSetup } from "@codesandbox/sandpack-client"; -import type { Recipe } from "@/types/recipes"; +import type { Recipe } from "@/types"; interface SnippetResultProps { recipe: Recipe; @@ -76,7 +76,7 @@ export function SnippetResult({ await simnet.initEmptySession(false); simnet.deployer = "ST000000000000000000002AMW42H"; const deployer = simnet.deployer; - console.log("deployer", deployer); + // console.log("deployer", deployer); simnet.setEpoch("3.0"); // Store the initialized simnet instance @@ -123,8 +123,8 @@ export function SnippetResult({ environment: "vanilla", }; - const client = await loadSandpackClient(iframeRef.current!, content); - console.log(client); + // const client = await loadSandpackClient(iframeRef.current!, content); + // console.log(client); } } @@ -231,11 +231,17 @@ export function SnippetResult({ {getButtonText()} </Button> */} {type === "clarity" && ( - <Button variant="link" className="gap-2 self-end" size="sm" asChild> - <Link href={recipe?.external_url || ""} target="_blank"> - Open in Clarity Playground <ArrowUpRight className="w-4 h-4" /> - </Link> - </Button> + <Link + href={recipe?.external_url || ""} + target="_blank" + className={buttonVariants({ + size: "sm", + className: + "gap-2 self-end text-primary underline-offset-4 hover:underline", + })} + > + Open in Clarity Playground <ArrowUpRight className="w-4 h-4" /> + </Link> )} </div> {result && type !== "clarity" && ( diff --git a/app/cookbook/layout.tsx b/app/cookbook/layout.tsx index 51be6614b..bb75f62fa 100644 --- a/app/cookbook/layout.tsx +++ b/app/cookbook/layout.tsx @@ -1,6 +1,6 @@ -import { Layout } from "fumadocs-ui/layout"; +import React, { JSX } from "react"; import type { ReactNode } from "react"; -import { homeLayoutOptions } from "../(docs)/layout"; +import { TopNav } from "@/components/top-nav"; export default function CookbookLayout({ children, @@ -9,11 +9,10 @@ export default function CookbookLayout({ }): JSX.Element { return ( <div className="px-10 *:border-none"> - <Layout {...homeLayoutOptions}> - <div className="min-h-screen py-8"> - <div className="space-y-4">{children}</div> - </div> - </Layout> + <TopNav /> + <div className="min-h-screen py-8"> + <div className="space-y-4">{children}</div> + </div> </div> ); } diff --git a/app/cookbook/page.tsx b/app/cookbook/page.tsx index 2fbc01e9c..2c9615056 100644 --- a/app/cookbook/page.tsx +++ b/app/cookbook/page.tsx @@ -1,12 +1,12 @@ -import { loadRecipes } from "@/utils/loader"; +import { loadRecipes } from "@/lib/loader"; import { CookbookUI } from "./components/cookbook-ui"; import { Code } from "@/components/docskit/code"; -import { Recipe } from "@/types/recipes"; +import { Recipe } from "@/types"; import Link from "next/link"; import { Badge } from "@/components/ui/badge"; import { CopyButton } from "@/components/docskit/copy-button"; import { Metadata } from "next/types"; -import { getRouteMetadata, createMetadata } from "@/utils/metadata"; +import { getRouteMetadata, createMetadata } from "@/lib/metadata"; function RecipeCard({ recipe, diff --git a/app/favicon.ico b/app/favicon.ico deleted file mode 100644 index e7466163c1704f66bf7a68ed7cf531fb629decb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 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 diff --git a/app/fonts/Aeonik-Bold.woff b/app/fonts/Aeonik-Bold.woff deleted file mode 100644 index bb2013b68ca061d0133c006566bcc54bb3f91adc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49764 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≫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 G_<sQY&<)4{ diff --git a/app/fonts/Aeonik-Bold.woff2 b/app/fonts/Aeonik-Bold.woff2 deleted file mode 100644 index 650c0d1a2fdbf25067a0413b252dd816dcf73a79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45340 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 Q@vSO^1^nO5#D=c`0JYF3g8%>k diff --git a/app/fonts/AeonikFono-Regular.woff b/app/fonts/AeonikFono-Regular.woff deleted file mode 100644 index d61b0a2e10d5ad816fba41aec6dd51f065cdb4c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38724 zcmZsBbCf4R&+cz_Y}>YNYsa>2TRXP3V{6B@ZQHi(JMa5__x^S3^wZUqljL+&b*gic zxXFo$$tf$#0RX8Y09e3JyNmnJ{r}g5#l#2z0K^9Xz@7mB_$v*hIZrO4Bq{zQ%k#qz z@xK5P7ZDW$00KyU#uWbn2rdYMxV)Uw4^0{Xfb9VQ2&1rJ<g>+<RD=M4I2Zr`oDKkh z`^rEjg^^RDX955~UVh}%f1n=`yXa+PV_^TIo&x}YECB$}c&0JA_svZVi~#_k9~$6? zAHaq?Ix1-XL;R6l`5EK=fCP*YM8e$0+5Lyl8UO(P0c4UA@gF@K1NR?&KtFQ;fc*!* zOymK!1~w)D0H{0w@ayE~eO?frz((xtoSc8=yYs_?`~!k-4ZzPl<pIBbINgDa^o{ia zhQnQb;Pv~jHeE~%%-#Bc0I&SerQVZowD0J@pK0VktrIZP1PXw_W!V49G%f;1SxX@d z-BzEkHQ8)8+U!@k<=Ct@*=Y6FBl7(8pGuq=6OD-<ikmK$Gn<Rdu1!>xf&oIbx9+gb zKBGFh9PLppC`Jy{_laRX$tJB>cApM^srvm6@cLR?($cfS+z>F=b)%k@@>vzV>Y!}= zU>n+5mf((<V`k*J1<F$7Hi6XlYB!kjJzDqrj20#qcyicFc{++cc9|USF}q9CbjalO z0xJua714e3y1-qk<<+W)uycW2Idd=<mcf|F%!FCims`<vh5%jY)NPu)K7L_c;#U1% zgNEDSFTPjfT{R_EjeXf}b<PiSfbDNo2QVv!;V_*iqYm;$ufd%O)dMq($a`(_%x6cA zXZ0;$^;&ec=N2g@ea!M2=9u9;3O#V}irnOE^OtMU>t&T!g>XE?_4zCxTt2|8XF>N} z=dhZ{bhS+C<>51tJvo;~tjbDw`ZEhl2U7Ue6xXip;8}-Jd8F?%*W_Xs8+JQY|C>b@ ztr+5ViEcrKNQM6g#}M;~LVsqx0#}nD;vFL}r~)7B7~@b;dTUi_PA6V*btvVz?dCRn zlmcm8{$DF}M5P5p{nd%x>Ef~}(^L1Swv{~<gT)8IrYE-&%TjLbMGORAc|^2OuZ5t& z2f-><%2iu=!;$4LTPs+Xb}CfhzIDxuDtY7-uV@ph!S4MMy3KtIBF^k0tiG6@i2IxJ zCaB1UWZwR?oIDZ!X)k4qarbYlk?8y{<>=%3d)m-v>cL(fei+QJ?fMzNX1Ltcea>yJ zw`+{2zsEdU)?RUTb1YW!&o$9xA?`8|sOd;p;p_KZhv`@;@p}2ago)bqWTN-sZ;7ug zmd8l@Wm(dfFxii}t{|<g3sWoJjcp&@B41AAD~ay9$ZZ(6zTQJ`U8G-Cw@+dGW>I#m zi@J0A*R`~be;-qsvr$gq$CX?QIU-Er&oESG>pLVUKUv+3bg$iP{kq20_as-q)@Rq( z6TGBub<n7{nhbG4$4F9-W{)k+x<>W~C$Q~vL+<g}24t5dVkb0=*zW!Da`H{hqQyAL z_C<PzY1MHCwco7#SuJzuaQ|J*jlHck%w(19R(N0@F=m^#R#2zjhNlbLO}fT1@uzh9 z>b3g9V>z>Q4H&$Dni(vQK(@e$?}_k4+6Y%Z@Fz)!?EjB_>g#@OV@RZYH^12RUcjRW z0!f$sm?-F<|FK_#I^)cq9;m|hzeE@q7#)NxMmT}61vtRK$n4b6%*?<DEDQ`S%nTGL z%mV)Peqq@CKww+n-)X7e?56tqx>NRO6f`giMjyis;1ZM!48Q>SC^%hrAn6fca{_(9 z@a%R;y$yG^88fU$D`AYq6l|-<DyzwKQ>O{NRqN#q|G+Y^ZiWL4;0D*YU$kpHrJiIo zX4rTvI|F6ZUru?{tVOWeJBAu&^tiPrz&n23dNlRx9u?0%sQ=|&ApEv&H>NC(R!zF# zB8=&>?l@W_85s0Pov)udgFI(HzA|;%Y20-j{Z$|QK<fJyO7G&z4qL(@)%d=DwT`sE zaqMase=J+>D-B2Dw)HLzf156cbaZ;`I1C#7;GQHH=Jl6Co<^61^xq`<+e?_yl4RxJ zxjhDiE%DXadu4kJPPb-<(PWee7U|@!PahgwvW?G`2FdmuQ7YGY<56qfo6i%VP~Ve# z==b_n3}2gZ=XBPHoJ!RXAM(-H_E8ztv@%aq>vWnt$xAn8YBetCq-*d*bUoj$?2A#{ z=R#6k&gL1r#KUkIkL!$eqB@Jla^;;^GOJFOrm)E+`%=$;+vm}5-@|y*4~bJLAKoUH zZB<sNtG~26O5`_TJ;6910%&YX^P-T_XEUJ;+vE^=dss>Iup-aMS>>^ms}+)y=8~B7 zp+=ZBclF<VB}R*wTChr~nB=KXU^*z3$Jxk51L3NWAhFf}T=?Pw$WiaXzC!E{S>W4= zM#tgKU*eBirb$XfJowS<;HvT@(k?qFReaGs)sn>PVN^pdkwYj#v%=>}@WT+xR;FII za{S?jkRO~2Xv682oJkW^=03IONLOq{;>B6h@EfRgdk*hB&;*z`npYTV9hftuJ*GSU zc~m1pCULJjafrGT6n`v_qu(hP$3{;wC&FeeOQGG<zDBU1HDIr|+3ar#OT3s$T0MC? z6EUwziNSye93JGjy26RO4Z*<*!;1dR%oV7db1!qD3`6T<iq_>*GG>xiikAByGWi~u zJDN?*E<&bIm1(;Pd_6M9v7!dFLHd*Mh<`mbXeAhNXq&l5&%aK$Zo!o$+Fhix1soRo z%YFZ%H_^%d`Oc?+D|7@Az;?b%n>?7>Pq)lO8g15XwSWF%>rI<~U9N2}78I^mr|z-k zUVv^|d9T1c+-B1G$&Zh9$ey1AJpnNWkiP};dFo~$DrZrB7*LED5S?lv*fXc5h|Dq) z?a$k)H><bct}C8<ycF|PT9`gW7fa!SNhrlu7n0VL@Y98yELbax_MIc>W_Ud%VntyI zMfn*;qENgBZBEAoRFhPUaWThORyAT$kPoC>lyy{>7i}JuJCzh@m|gkGEEOLMRV1wv znn-M<xYAXZGy#W#BVtAkg6t223{it56a9!Aj%{_fIa=dBhrSf1+DKo8|CA%o5D&33 z4zSH;kTetRI<zJ@1YnT01}eRc4h@HHt$F%}tj<zA`-VWUrw_4GNh)PEQyY?_{TrX) z|KR`evDI5i?Z{a(qX;9hU(pd@p*%xx4A=ZhhlJ~Ac5`F*n<Q~sDonTdXk@gJkx?2> z0(LI+%TV<!;LC+S1OBL<QCyx?d7-LA{6_Y}<A)r`_%buX$?a$8A^6zjUv7#vD{#$d zi~d=C1*e}q&@vrpGF#{1*ZGurECI^ptK7=-RoI+#!9H7B=25&ipM++mU(yAKXaRHo z1#pM_W65^_t_7lMXriz3;h)o-1<Gxuw!-=W>-zM~{zv7bRrdSy^qH<cBIo(LZ|)B? zN_9q3UZ_o(?c(H^O7<L#Xt}z=*b-HxYLww6Qu_>@YQC*Po};qyzVnc_MvvwpwGt@X z(66Li@W(>DIi;~V+@lI^Rz0;<b*DL<qjE3nq_sr@+curiqY^gSnMJInT(P79vZY#o z8*5|gb%&lbV4R_N0`FV$Kb<7;vP@;hiKb#`!)1FE!z}^Y;q9&2S{|9)?m;E)F_yZ! zE?c?Tv1LUu=$JdmV3<eHVi&*omML^9q+HU9Z<0-G(%#jlWvq7vUGHGpJ+gT_dg!uE z@ab!FQXO__;qItpJHn~$oWhpvk99WO!R5Aw1D|h>ggajT$frXVBl259<b@0H^@W1< znG*)6u7wq5nRA8b2V%5^6=iUEO6116drB7ONb?Z~6EeLd;dGJ2R#Wb1-Mxkgbrl5R zQyzgwyktY^NVL-BN)KU19~TbUi=^6X?sMeLX3nWkSrDmNVyQVqAK7OeIaD6i1(r~v zDxVSEGojzJ`Q0<R(JdQKS^hd^4KHVvQakybwdkQ!<<zG3OsSG}rr7McQ1X@YJ7t)n zCI%4JSC75k6rEoC9|v>Y^pcGYtDxy}$n}czexKXz>9VVa9w(~EFkYP|CCtQdRh<hh zdeCU}FMr5i8nWm{qfT}5rC1lEKy^w!eCh$mT1OguYN{fVqE2c_#S>D>WE!Gs8lXE3 z45521_cXK`h7`1hnnbiZ2-Kz<ELy`|R85q@l|*v~=mHDKND)$6nA{?oiQFREhY}MS z>0Far6mEPUtm&G_d9zy_F9M$}LnO^9Lm|yALqpBpJ_gO%zVZenOJc&aT*SFtMonVq zHTAz@>zaQh);0dhu4_rlaI32ea%)<Pa*y8SGq)80JoQl`3>qqMhSdKG4QpbE%NS7M z+A)%Dn%7cq8XHh-S{rct^!E9_<p<+FkV1o>jH3<BtI>2w>NTzebeZnbzO@DOJitPq zpJt#b%{J4pmDp+h*{WR$@3I2&oHlf91Jx?J;odZ@W!*H`g>9SfgJ>H!G;3S$vvZCO z?r^RShIP&fj&$x0zJK@=EcK8Zy!#MW#srr!w(p}Pio>Wfte`}S!>rQppah%Au-Gf9 z1f9vm+Gmj|sFca-G7MfU`+|U<2hGQ}I80u=`?A0SmXjv7<1|m<ZIJ$lUZ&tSc~GL8 zEqa)}c<^P31%G?ji)H}6xbbC{1(II_;=yd5`(^OqmoIB)$hNfCZTqRrhrwDfzYO?I z>Z#9%%^Sk^U)epqk5J|py(iwO(XJs6?Vjcq3hof8I;R#I%&L*8{eKrkRijndAK$Q% zkS8*$tQ&Q4nOjY9f46#dTopa1g~UAdT#?~vjDw|B%o%L*W|jTP7&@hq)Bnwh6koE` zmZ8ZQa)~6SpUoK;6SK6I;mH_q{Z>l1oL4UHXK5@0k}=|volnP_b1p_^=`16i)PD;z zWnnE&lP)ngRdPxnd;prXv=psR<11d3kuisxw@9B~2svW%`R$aUInPrpXRfQnoj(1* zIcaAp1^t(=08|FooNzw1p{9(N*6=L=jrB2qP?~>!uNbc(=u}*DZXqp&$wyc!!*h<Q zILBN=iTy3?l=`i-jM!)50oZ3_A%oB0Ett>ZOe&{uKEbzW`tRGUnN0Wmu{7|>eKEfU zr;?xM)&qE@K9&S^`d5CkbfCG({B}cx1w*CfTc|2CY|*03_bgU1VMFn$p5{7B)Dq*T z+<E%YtY>j~Lze}KjeeT|cKXnqSTS`&tp$;dVVht^I@!Ewu~tK?1(l6Ko3K`T@r-Km zdPAcHmW@%H)Oxz<oNF<7L#GAUrGA?ncY5)>Y_V5Ey#?JRkyKb!F=s;t4NzN#={#Ot zSavaLLn;ldXGY2#UtQ9Pm8QV^XhLqc1t%_nRJ4CFsdF3+C|E|yEMc88hNY%x=;)k5 ziv=z&;doSh@uPE+1u-t|csOJ6q;mxg`%oI&>}{R4I?Z}?dvW?h_GvCkeY)waHJV6$ z#?dSe8q(}Ohkw(H<`Ulah~}P_2Dmr*dBC*^?rmU2bdr8qF!uv1wA(2k^z#WJ^mEYy zDvfobqZ~_RULuWgZlVnJDGId3sq(xf*QAiA=W2t$Zf%^-SOyU0Dzk;Eu~Bu=Ds4p} zXMAL5`cYF&#E~f9lNU>OutGykaBoA!VBZ5K4|Q;K!@ppshWKDc=iFeuQ~4<UZ%J`O zly`nEMCO&yQ|SrAoML+Q6=A(5`>-wx1N2QB1N=>+U4l(J1A1O_gYqQ$`a#nlrEccP z(CFsO4TgHfHZ$2ifpiV(5p;FxL3B;(QFOKH0d#{*u9$5bh8Asoh6-(Sh7N6GhLUZ- z+^f^SUke5USmFnHSfU5LS+WK{SULv<>a}PDoU}x~kkIbu($SP=V$hIhtI!f>ZP60v zjL`5Tg4qlcQOf7tXjBWdXqJk#XqO7OX_oT1X_rbuX_ksYY1wj1XjO}z?Q?XLsI=D% zh2OZg^w|?4jB8ecOzT#XWCxrnd1TD=$=ZpsqJuBqoDtFLGv;N`$|XpVG%7@pwY;;* zYSsP88r5US>ebW8n$@$5Yt$8X6`=&7<Ytq8wQmU@)fwLYH%?&+2>dpHVS`Zz07#*M zl7DC*y})r800iKk1IHhq?LQ9N&&6B%pT4tugLFfHNjD9y)6?}-wN`Cfm-Ec^geBK2 zql+Mon}w}UmBG3wnCwY!vfy0XS?;Ua{?5-Mv0T-0GCGcD@mYOz9zU#}AC$pEM>~cc z0TB_C5fNW99t$%b_f;OHNCA>n9-ejvj&~NHm=RBj5j?U64Z9Y&-5!D59&h;uVfq%g z_eGeI%7}?ii3!-L77$rWV^s^3QBT|M2ncmTA$J5jc3@?9pmw_l#NP1O-QeZi@OCrB z?V|M>Y6(f%rd7nL)PXInwQ1;K8z@<4(>6vot;ejJv|CMICVti+q~%j*Cr~6aQKUkZ zHc*unr<XRiS^f#Jh$1sjFtzkowJK;j`4e+mL3h@6b>^Ra8tqFZ{ml~~e(#<=$L#Jp zeH`2ol=^I`JFMjietqTRQxp3j$+xWbg0_7~{*kHo)c)1S|0)On`2DlQ00bZyKo84x z{r_9y|2|Z;`vG<k5cdR-BtS6<!4E?7<smHvh0TF3^RQt8;u(NUdx+FwGxXtc{Oj$( z@%p7+K>QeBu*3%b{zaHKM5Fm*Qp2>=i?#y#zHgoxNNvx1HMH*zXSXZt9oj8PK}DKR zqx@$~k=9a5$DAO#@U$VRX$G<FH~a~$&+!b7|Gonl-Na%GsN23jPr&fKadz*x2d>>A zulHZMThXrG=T}z0y&NP(Wuo6Ok_4lqfySwZih`EEjV!1)3v;64!kMH}Mod>}#Sa>^ zQ`YY!bjQG7>Aq1|XGXBp63xLTt6m#gQs)0@il193*%atBR>RHSaw(;rk!==`KPGG~ z9KXr>rD;h^8E905CD*PkO{{6Eog4Mr1jsZ8H}x&8v#r~aUqtZMpg#?Mak+!U?w9d| zqTko)4qACpU!U-Hbi?1*@=YGUA?aOac$eVcB>MJNzw`Q?*?rW1LkWQ*1;OWoIs_UE zt`SJZz4L1<<{gw)fp+VE8&Gw*&7<sSV|wvqI89LpMl}*kbqR4ypm$9BmS)thtU*15 z`@HQ4zv?<&`=u7odfuMRn&^-hr0#N}?WXOeRrWi@RcCIDds9Q1$=Fg`9ZXUhhrBAH zM5jXYLC+qc7d_@v6yB;mKp#e!wlCeafK1n^?Nr=ICDBTH;gdcaO$R31!{@)>%qB2l z6(q2X<IQ=ET#0uIRXbC90a?F*2+eY1@b~I--IG`TGaK3BKNq&-@N|dc32h5?=Q}<) z&KOeeW7VR?`le!v8JgbdpffIOK&viDh?|}}ol|abWQnS8-tk!{_Z}y-Yu)lX@j6c` z+o}li!l&F${mrFO{zkjxtH)WJif{DA%EeFg0oBxl%<sZd&pty#03sJ6YHTR}kk*YI zOM`7;NMzLlMJ&zq>wW$e7y4=q2%6Z3B!7}>ZMQQw8_m!imjT*ZL%)~kjDAl)JOW9a zQh~fSoF_FYOl(eBF|sg<YVM8)e6iI9*$Gu0H9I5O{;Y&3nrL!b{jJQcIx%BR(xQQ( zhzf;;p?2mHCGfY*YVn*st?9~_s78$A2zSzQ&H0u5IY(9~4-m{S&r+Hls@DS}!|@{= z)`aC-J=T<E%aVV)zzdL?eapL!oWs$ncT~S_5?{LPrxC_h0?Wrv^Rb&xShPzyWC>Gi z@|5mdBY)8G8e0`;An%eTy;h0p@Y5*aPRhTv7dB%V32adFs4=qnpg6Wum-GqFfoewZ zsaAUd45XnTh2y;Jrz8f8!{Cz%yUe5-0#=NQkr8~W53Dy~0=jjpkvs>WSHiJMLtohz zA{uM8rLJgo7Aa4~YRK236sv8AhYM0&=Y#IEL$n&oFtSxIHuA^UH%Xy2XcM1yBUgjL zss`k7j4XA4N9S2#j>g>S_*qHyd!Qetq#1cuoe78dsj-Jfm}ZDK(;3O6MiUZTYchqc zCG8n3ubEw8>-c3*BG{r%U1c&~)b)F<zSEjb;jV<`VZ{i2GpUU0cn_+0R_8y3Hr3*} zZt-6RFcz(iU(fOj6iwWxmIh-_yv4v49NE7T4*~4S6V<8F^;YE4Kq~QZr__Bg3^EXu z1_Bs$B;W@|VB{UTD>@X!6ZREFwOUprakmODa0T3h<Y+#=2M~X_+IFpi{bP~Q_&C%t zOw%jx!HFXD^Wa0)n1!bFXyKH^Im9qkh2}{h9juZ1C7GuG;?7~uWFUyaOr1nSDxF0S z=x}unII|E%5fV-mZkzPS88cvCDO-H1zQFb~)1GU7twY#UfalwGA+%@Ji;Fakv9S8y zR-ryM&FWr0K*F8r#}_;O;)H?A0OL1hq|8x~g`&sZ^T{Zw&fuDY{|@{}3|?1ZMt$s4 z8*28*YphiEzijbeE3aA)XEILGpf30*v!T!EyAHbleWF;oY~ZTQp8;`v0dzdwlf)p_ zu?nQRWXILbk~MpL!uOEHzjzk|#<&ndpV+Gb-nr#aL4DaPLO=15Ozb*I9^~-HgDIN3 z25gp&lW+o(Sg1=?bKKD+c5UmoQl3dt$)9uTzBz8vf2QDee0)|x-4Ymh2xKHJWV}x} z$4)|c`U!igi60SLVKjgL7Vo#M+6JpF5oDB9$Oy#IqPx2Fd7|rmX?efy6G_z_7#eJ6 zy58-ru@yU)j7MspN2=wOcDa*Uoj%odeDK3QO%RA-fB>9tFWH$H*Z#^_7lhla%Oup> zV6SJ|tS_!MUFJsJGjF}GW1Rc)54C;ADty0_&_Toqb<I#zp=?Kt8iuPAPDx4?jVE*~ zQ;aix)qUB#24|9^e=2&@YmGeB*I)c<AI)ZvF`ZOK8&TANwKCSR{@q%k{cUn3R3w^q z)PsK`r=6<h1b)@0f;UC}O7jhegVrO<0gJwa<_#cb0H?kILlq(ft|P=B(}x(+hg#l; z+lUmu;ph^#SrBJ#5HfQXw}Tmgi0Z|;AT3;M@Nb%PT@xNY0ox??sUuC^qeylv{Ul#q z1VSBb{dC*DniyzpPYjw=cV%Y&ea)7RJ1|hCKe!eB0JnthC5r5o4vAQyObh~46nMH< zP_CR4M*7+5G_39TG2Pu<f1L6<w!z(fy|L}<Cb0ac3#c2`z4zQb1iuG<57!;t7m7bp zZ>ajX|CNI;czY=4fPZKDQ!7<_a{K7|uJfb%19}D+7+3({Wgp_e0KOzZWE~=W!>ApE zLlKlA54<f1yb);Y4#VG9eIxhM|A0PkRm|R?ySjK#=`wDYVVZ&VS2ZJFIzz@w<~oCq z(Ztfn(Z6g(+4kQe*CE+F@VwEy(|mO?{{&e5=tqc0m<A(v8t(-01m98kk;Rexz2QC6 zJ=HzehiOij|FrLr1(c^F$K<{lRG|PodOBGmx%hl`tA4Jw6$xbv=q8Hu(M&-eCTSAZ zuTfz#vzU!QV95laZ(Zs=XJh#R2aXgLsd)=BMv^&otVkHxfwbRg@f#g}g5u5>@1UDA zkG0U8@$>fRjw%Au+!;@!lGL6!H)o{c*qm*!1-mSJW?m0MUG=Za(@6l=x20F?0GlhP zD<1yRj%oiBo<>wy^OpIy@o6`*xcCPp@-~Wqu*6$bWd^JQ$$FNwfH2}TLkcj~NWn25 z;!dtpv&;Y`P2VB4+eb8Vo7n?N*@w0!Y+S!nA!aOK%hBBqp`~ebV>WecE2wwRZato( zq>nIBhgd7})>ZSr!yLa1*U|Hp@&f`B%Z<pj0!=F)93kG$PIWy<q@J$7`>}zo35e#k zo>4Hbr%#jNlXI1z<&?Fgepi27+Md1*4j;-s<#>IRpP*tp_&RllK9Ui(3tOz}bov#$ zc&IDaZ0F~%gI`OEdztO)W4{CkameUoIh8l<7#2hosP`t9EPSbXll1)ABF7rCjFa=z z=fh`8d=M7y>L;wjI+@2Gn4Qq2e@FzKo6cc#yr_%FF{Z&0CdGOE^r1V$+n8u~6$Oi5 z0aX$Mt0?`_8LD7RnvORc2VvQ+Y|&02pWYJ-3Xab1;5jbGt>fo@kY2|@u|Dzq2GT@* zoWYPqX#W>+9=Tst!CR*8+v<7dD3<qFUK8N3pIQOQN3&eBJV%$)Z9v_TgoTKg+@>h0 zIi~qWS4XO`zGTrHlq^NW905mtzY=cItjgN}X()5h@zLn5YZJqiN-TVmkmq}U*R|;& z_m=Ah2iIU=ul2Ku3>L3A^wkNgv@(NwygqGvu5on}FQ>y^%{dBTgxp6vtNr-C#+_b_ z-4ewT`$sn9eBNq;#9dQ3n`uwWxJx@PZc8Hp)iy~Wr)JF4h3j?9$V5bY$V5ha(<WDH zDK+=8sX=P%LD!K`XJ<<&Q`*?bIc;*BA7AkW*Ba+^n-pE?U8HX<-iehf?Ob;LwC1DE za@zrEWua8E1&Ltj_n{Q?(d6lLwGUM8OwgLgdV(nrBWR+j+*J(AGNAyr)n8I4j+ zA5FGu(hG`K5{q}Xt9LlW(N+a~)03^~3i9@>jNVGlcUXgW*fI<uqB;|!ot|YC7nT>r zH>E8Mq6j)3J@GBF7j2!+50b%_t1*d>$&*;_4`(X~scy*tynzt8dVFI_cY#YIZ}q#= z=Ul*|u#<z!_i51TMBSv<mX7T`tTCwP<z@H-6s*TNI?T`xzOUeUeOuAfsUv=5!QO_} zNUvC4jB$bcOHgw|RwB(LUq{iwFFQ)ziAdXoFxMBd{b6C9fyzPZ{e8CRV}IlQwZdsS z9j+W*d3!!mHa1F^%9KW~WLL0!_QyoGTuZAXkWAB!q>s}<Xw2ifdgi8qVN$!TLi5JS z=Gq#Q$C8W3iOV%m7M1tq$q~gqbp-rHl_32OEgYGAcT>bEyitSbc<)nISq{SJQ~_^! zrCAS_*igFgjzE=G|BeNy2Sd>4vk*&VGhy&(!-|3}T|}g6oDDDgWy14axjDE(ErqUV zQ=FSz=hdXx#(x7qTAx}ctk|!ui9!x|r(di0NtB>&YJ82jwn(AVUst2`cHP%r+T4@t zR#OeT5r2FOiqIoP?(RsSgQ??jg850IJ@b~88uVK-2Mt=tHAke186Ttv!u391ykrz6 z0;HI93h@8>sKFii8VttxvpB@G_kXCQQX3j~ggj2%mKtR&X@O#elPe&T{VAGtMiM`k z$~|&;so{@3bw@;+$r+y$W=*~AE)~?*)1Atb!g`%|n^>lK+s8dB4r%Cm3Kh>Piqtlt zvK~f)`xM(M?j9kKRmVCjW~pQ6o1#lOXCmWm)~LJQtnjD;sV{F5qe-RB2_kE1TcuHG zSmrP|<yro2Zg?ZNIgRks!a_}7IWk3_vu|r*di$*~n>@~Ls~xS|NJV8@MC4vGQgyHk z7sBM8_31B^#)r00Ak`4nPjX|M7CRJbqK9HOdb4vle$MSe?^5r2CIE|W7HSQxRqh>i z3**}K<W(p6`2-Kgh?~kig|_l`R_u{LXWt9*JcEySp}^uEgv>j2Vj&ET#pS?3)t@tq zAc_!3`gcq#JM@ka3D*a)55|P@avA~bDfWm^WqZk1AjkiO?D_qgBkPH&yCx}$oe_x` z13ZO^G7t#s)9z+pf=iP4z6cI&O4{VBI2)rMYV`eT%6drQos=Ua+fc+?%vRP^O!g`` z$Ua(ujZ)~Us3jWPaG%X4qSKxBdu~u0l<qn*Spa6wPcig!fnORrv?E0c09{_>Q&wZ7 zM=aYBsR+Cyz%!1bxN(zU2oe)=AQiw*kFnuiYB=rJK~Cy1d<6o!c8e3*w#FUXZuj+k z%Oz)?w`?MaGY-ASM5``)^qRRbaGyccs7uSkOexiCoKD8}M4vfffJ7SBiiyd|`OSxq zm!0;v2x2>V^X;v?MvK`rh&B!QJci_EriDl}YaN1_1ZcScF?1JfLqZJa_c?0B>5<-v z2+qLXNr(Z8z*n!ZMT1bF`fgFzy`J2>S&1yX_>;tpj*5IjfxvGrc$4z+IBGowNDe+Z zCY)4#GhXJR@1Q3^ny{+`lXpi-UX1{3pEO84*Ug&tbRvz2SyZq+lBu~DFKR0b7y14U zb<c(FB*=jrN$e}7_UMP87^eWB@#n~sFc>V>ONn$+@j05$4AIH_f?vn>#EE{^>qU=E z(HTbUcuG^VVqgo%!z2{Hx2Xj`t_npk(`&mi6&W7z_&hyHP-z^@+{X_|u~)jURvU$z z4(N4M2TgAtIVuoEEQQDyf=-X#KF#r%LzF%#f+UGmt<Rp}_duResh3D8!P_x45k`b4 zZD|_EY4xHc@2P0Hq<FJ~g>dB6_4HF!+Ai4A$7sF<=+zTk`Ho^>hj1<Asj&pCmvy7> zG4$XvM#5PPJ{l=l)FXFFL|5pm_6>la?M8vpAD?ekfZ+mBbZI$Ad*=&S7h@}HsHi+y zKQR0Ju_|Q|?ZkqQ-qxT<SM(AR0$fF}eKlNw)ips`%pFSWrB>Kq+AjL%v@VI|-(C0y zEb6#`A1?pp2=YR>a=aDUR=JMR-@Bcy<=JY`axKx7gG!xK;yET%cQ^@!gqkcz*6(mT zf58oC+%nc1uW`d|8!4zM1#*c_-t7jJe|X|u8O{0R+OJW*RcP{%J!D<nozc^K(-IFu zy+bz_<u>jp0MWb}>SR=yO!qY_76moJ)A|8cZ`3=#;9Rkl$$7|@l%Cf!?bDXn@(+Qk zlU2@qyqye+aKnuHw>0o81uT-$tkK~YUsPGczNZo&c8TCpKe^qYoD+a>qO1l}=+$8P zi)Xy7r^EL$XxR|%>Gj%D@SQC7hyJcaW77>EQTGX4coH(Xd`cp#_!kuO!>+mV!~EsP z{~XQv7-=SoLKKsfL^5Y(w_qxf&9D5vg4{sI_faG$Sdms;a_T>e*ED^ra8w?H<-kc_ zOgO?PsVP6{nE-?Q>eLTzFITb;9b)(7aozrdE5D`_KvyImK}Wh-B=0|U$e(28)#l>` zWTXO)IKTzTc2nXX(qi9d`*q=M+YIt^IyI(ymt}M)EnEIk)%7PHsqXL>wiTR4WQmbT zVHwcxR4zNEgB5IVa-FaR*OY2Qe}2d*<Lal^cf)myu>faTSV3I^vReJ!=1@Tj>LOr= zW6=}n=HM5Ihvi^g(4~@PEI*(7c{twZcNmC?)gD=Dprj-7bppS=oU&UzC}($Ct@bOs zOkjK6lVVAamN6I8-kY^c#{?YJ#v63xiv}~V799WK556RfI$rKhzeaW<;PHSWI}YG8 z>*m1unt-3{<_Egr*IV3YA#K&yTIOj!S1$VuV~KRa*aErChSk7v%&>NYU8+@VzjjjR z8dzNYWZov9Wd~@NqSp-`JdBc0$PRdXt|e3Hr!y{rlWK#JudY^U##;C_<5zgaF3>It z&YQl%`tSiQXzwudQ@#eEc{YXK*nC~w>;zu4iH53>a3m39M2pGda5>rtmQt(Q92ltN ze#YbRyu(qV*X{Ip-kndi<40nQY%NS`h_a?RI6y^7PEt``TwrBsY;bXYe1J7HGDny4 z0`IPkXypG-WYQ2A01&PHj^ST7Jzi|ObZxR>X8ac~+jf!?&gaP@K_AF8KOIL?$3%dg z2*cb*p;W;%#DQFA6fZ0*?Z`L@17@0L<nMu|VW=@#u`>{+X6wN)PM!0yQu9v~sL?VA z#}&sIWgr+Eo-yL(mQqB(Koo^kB8)*HK_o1Zpa{caaP+PcMC*4#i9k4)Nl~f1N;+2i zSWPe1xpmzz8}|kEI8f-A!+87}=kZ_UL(W5KFxwV+e`-1v<#4Oy*8OaBJokfe_Uy$x zsOo?Jin*@6Z$|O;K9tPiV0204QTVT)zb0%Qtuk5}m+*e#*;=dG<&9=G#LE>nu<vlk zcv}WWAk<`i^5ph>O0_3SJ|QwW=g_zVF~T}rg|;@sqaei$3ZZEO#>Hi!rxW^U%q~Hz zT>p%?rf`n-`Y<QV@XTuCK)HGi(P~A=IiriT2TrjLq*=>k=2?ZAS*7Y(#hniOR?|yf zGy6$1Be9PifY2RL)f^d99YIqaIIUXKt<;AaY0OBeTcXc31}&F%reIt4{NcCUcf;wI zcZVxCL<rcC#30-pnVapwn~?=*+;-&<dV`Q;kq||YWY81_5acq8E$h(C^PqzI8kI%I zNCa2YCGu&YW>sb8sW@2$d!ZJ8S1zFxmH8Vhj*<oQ%#9Q!I5UkD2H{ky#5gAB^0bcS zi5yZ(j-n_?@PRU+R?i!ksB1(l`d-d)*(kL!Q4}a6MkFRX4$2FnE=DM`z_KU`)6y;| z$bnBj%!r^@Hq6SBpP!Uu=se7hd*T@Yx37+nvDF7(TAN@$*9T^8^y59%rna}He)5d? z@Z?h1?EGP~0*Ak4h`nQy!?J=^>z}kgX4E~z#5;zRnX|oIM58^jpq(Ys-KVrU&<HM* zvvSXl^@u@tk45(gZ^qbh(cOjJI+EEs1dh3b!%tV;IwoFK9zpl+EAbxU&)nh2af%bh zIfB@BilXNnU52?s-M)k6zrpRkA?Ckj?k|qs#@JKyJ%;}}p#M73``Z8h$;B2#{bgdL zEzYA-`KM0$Po?ZkCC@UsOq=x|^W^|Rzdbt-tX=;!1P1@B|E&|wz*sQNaHK@tNJ$Vd z%#Hsk%d!Rz8v1x^N-~<AR7jEO$M%uUIC{$L?R7ff97FI1a54l006Z|8k+iOu)&Fl| z#b*7gW3kERx>IuXzRt}oXWaJ^Nk>#$MjKc=LkC>P5AgbDOh8zlss^#;r@++r4;}-* zIv5Th20YatyQg4B<%S$32&EK+1+xvJq!+OTK^xZ=_#3WUL;yt0T|^{;AUbYq<d-qO zBc?|%lDTgKa~p7H=wJ=l3c>}%6aEt#xjia<EPKEBj@iw!NEC%c66qQead_DP*B;ny zJc)$AwXiJlazg0n`vE)q>CX|f;kD7si^`kGYsE9nqsDvPQR<fIR{q@ZOf0G(TI#7x zZpqRZ!X@@8&igRhrO?&wlk>^vXX|I<=k-nSP4vz8?eVSiy(~Z=&oo29Ky1%C0_p|M z4vHTdBwsL-In&61meMcNU*G2^S}HL<l4owp;^r*ypbrzV7;Y2&iTsX7zGv;N?(Oj* z&?m_vTOolX+wt3!6nWHew0Kl^6qAxeg>I3zk-#Nps!(bM^_1*E-jl8~i?9C$Gv#!W z#`Mboj}c!zo_6@j5WZfo1w<{vYK(UG$}#5!p!cV`-|dL}hB`P-Ue}#^%n-6RoI^vK z6ffoOw@jh#9I-|`_UQbf%^fGHj3kw4(%Tq>NvosQW4X#g%9(^qZJQKtHQ%DX%tC|( zZ6nYckxjYl@AgXeS+%qFhx<2|&$6$<9@w>-C@L|ff)d8Lzg88ju9)Oe<3r5*k(dmi z%sHIHAM0ZcKN>3#m%z^B9z$W*igmW|?5bVl#hszJ>odP01Hc7_4FG^#v!BY1+)oWt z(zFDdOaA|xqO)1|wo`bN$ptY7^$cXxhg$(W1vu>xx&!<6Juv*j?uoG{$b>@goxH*5 zfVl2`h9H7xl2=*)h80zsb!<Sq6g6{T%Y;YoQL!hwiZR<`)+DsaWz)<kxSXf6tadJ1 zUgSO(ex!VB4QhZ?k{}e4v{6iLAmbgSs0+9tSEDVXZ8L$Kl%<{}u#s4w?{enJl31Pr zeqi&loz$n*uQVrBwXL+fG`zIIHO?~9v9hv~v%)vlJ1;$VzpB{J-0wL1*cYlQxGKKV z$&Sdb)GcwVdyc3Muq(X|$A5o+<F99_0F+PQNY{c@0AmlC)-PVrz7N*l@N_^l-(plx zX57nmpyLma-%fht^Y`N4>k$==P(g($=10^(39}$n4#+c#(;#OI=sIX?qs0Cq{nZbQ z9`G927!VmCCsZVSDg53i+PB}IN;FD*NmN4IZ9<hMdXy}$c$!R@Mu9!1T9=qfmpV@C zSnW-;J(@$+I#vW#&h#(hx4bQ?vcsaZi<<C)`Xl!mGZ(!l!5gJ2$r5cg>DTCp8A3t! z?DSuQ3x+D}Z5eY{7PAbqiRo`i54b-Ru|<UTZe6UcB1^;yb(vy;v*?2nwYg^3q+ryO zTUIRjLyl<q^!i9z7f@^<ptaas`K1&TzsT)TL@z{O<+85p+&sQ7o;Sm9le>#fHf2}S zvQ~fECidfNDPloN3>U}Qo%!R*RRMbR7B81ulx5U0MmOX6u<={>{`M;WieL7(={LuB z{nzpb^#?5w9#F_1N+4AKYp^!(CfH0Ibrf^B57wL5+~<G?!OOrdC@lO28gr$Y@Z6}} z<KD*r{;8d*Y1ttWvWYOhG_X#k*zZmIt2Z5XC*9aNIF-pA;r&L3@UNZO0}bSt(*CO= zZndlpl?GH6nQYebGi_<9=S3!o;0+D4(Z;I!L(9^$K5#H|Qk{j@$p~&gKCY{eRbeNx zk6d`=Yt44gb;H<dwLRPfT4?x-tp=Cn*f+fe<mJgM<O`tAjZiuM>~zNm5l_vF0R`d` z8LYgLGtDa5VI6qe$fy`yJWjhUN1n#jr%6Fx_@gVXv$b6R`M-%ftb#IDi%eY6N7+D@ zXA$LO52IqGO2GX9dzCCT{7ZZ{ndArwe2h#mdo`7A0F7Am%&d*Ap97VA4iAgp+(GL- z`N{DM=)XMthb4bBPPjpp4TkeMV^$fbe<nCg_2$2-3yNX4931!P;9b_6t+%?24v$Pc z*Lqe*EqwoIwxfL?wl`3(8VS|HUGqiEh60cD))=bmu<(KyM)(oi=Np=n()w$=r31PS zn|A__eURI2m**4C-=|2?m%&wzc^qPDK%l{=xXkl?U&dQ>d4Y#K&OMMDtEpL(=J!(3 zhh482iNe}XJeV7w?tbrOs-FIu7S4#zWT;26b7fQO!Cy((<BOd%eVG)EuxEE8!ny=Z zEHF>jY|vokC2|}0VKVarkMD-BuK6&}r-XcoY|K#=#oE53&61QtEzSlh3#D4WXp5%$ z%9+ohTa(XPm4m2_BzxeH?Oq_p2ha*vC+b@JmTGVrxyDrefrhxW!~Ay+Qr;?BA8pal zWndbq6vk{HWX~W{(-PJyvQBitG0PXNPN4(hqaK#gsy>H0?=&-%h4verb!P1>e@vx- zytT9fJ(5<KfBuF}mEJb4LpcY}a4ix#tQF@frL_nB%1MK!KQ9ie;3`%KyB-%&Qe?!V zKyir`$(!|Nv|#;)(0ipL(=Y!xBl#>U_HDK(UeBA+UBrpku4HKoj@6Ais4ZCD#5J*1 zfxJzb%S$WOmGp?OWy$XyVK9-5b4p<jxfz$^QZjWaHcHcHjkwG{-*YtL5j)B=-Pi`I z-Ni1u%K4+|yFy@^GF9dHXmX2pqChWI+T~&i_1^U)_F0KGo7rcP1pZJ&teQ16J(RAY z;~e2AvxrUk{A*KkYFewWzuA3GRJ^V1_agFjxjl(W_XY^<%hGU!4zCXQBkGpKVB>Cx z*-XJ##xDo7olT3j64xA`g{rXvwlrKQ+7!iztVx*Wg}fZ5%eJs!H1c|8Ye8z&R;^6e zTs>S-KLR>=l(l%#VE?gq?4u^7fB8;DZX3Jc6}yd!^X`13np5PGhg5c~6~jaYOI;bh z6DQg)TRuDmx1S@355UI=e-Mr(Am9DAaYKZEMIAu?vt)%&&NLw0P+?WL@ABrqhJIJc z`DZ}5)F{NMX0eZsP|Ka1x!E4ye<$KDP^kUvK@v9_9H8iIVKCZBrbC=x0;$K?MgmiA zQ9oOmQ3DyK4EOwj!5dMOgQo-$t<iJxki%VS-eW5id$+Yj7`^f$-#S8IsR;=~KH^}J z0bc;Q%OT3<+DGY#Y+GL2+O&)1_8j#5YNCV8meMOwft2J-6FlbVc?9MUjLYJjXLBM0 z%X{w>Pn9k(EEek_{Aqb^pJ~gF<Vlt>p&MG?wgEaP#81u?I8JehmV^e{W`VgTD1+=y zzU~#hBH~qa9PA9D>f2|o!abC+Pw~X)KXd>?TN7gCoch*7fQ+BykpjE_2rIw6CSHKc znKOzp|68XJpOz{sym@{kIK^ON7{IqN#*JNAOU8#;!LT?`VoHUIX~QC{@XtPqi_NUz zfUh7nIZp%IAtN_aoi${C#UigkX8C-a)2R5wzzckR#=;u5EQrf?2K$VKs#A_Y*)!it z^yDycDU2@4ZxmR14m2^U7Uqlv4MQ@etgTF)ARC93p6+U<_obyZwD|1Rz*ke8-j3KG zF&>00)?ls$4x_onY=u5*>rX#fmS_>DNCN}Xu)aVZ#q>viS#@b|)*u!RNW`~!j5AQt zIk%~44~<XXukXLTcnc3EHvyyf4-XUR&ZyDnwErqOEz=Y6bJDZi>{(I{Bc$>K5}k-h z$<HO^@n5aVz$_oTPY=s<P#vNTI@l%GV;DSb8GZ3a8YugG?eS&)Vy?v{CC*@>xA+Ch zC)O%2&a)Mx7%t47L_MRT-z4emFt+u4TBnJ@JfaQl|7L9%U@9&dVqA&tmj;*yT7VaX z7Mae8;YRC);-~KXNg3D-UCUmz^jxW!eG5AJZQD9EH~{(-?77R~F<~~f6HRt~VY}zT zS|Cy0QrqomS&h*Ap%_M0bX<6K!>(Ygi_+5;#Cw4#x#232$01z5*{io!YDsSD$W6Tz zSLphW&GM$%R@tIDls9E9h=;gltP|KGO}OdzxVCPqFfv3484rdX#Z7z-@SAYUnG@^t zj<7o~MnFBr+pRrcz_q+Zd;Tl!btsQf82(H)E%KpcmLwL!p0+$xsQlVh&1-eVyZ2L= z<oL#LTyg~nk9|BXP^5{ERp0yi5`5p#9t}H2L+UIO#SN)<9j!G+fgCu2K$QcLFCzx+ zE|=w66#lidyhl7hi(`)mjbr-XX6|*Q7JZy&8T&3~Qy6>cVV7<tK}R#K_5;YZo<m?S zLNHK~2$mVAR}zM`8F+j>&kj|CX8%Uv?CWM8ylf)QSFJ6g$Gv@#q7DDW=#j8;?|g~u z?Y4xu%d84(x1~l!;Mzxa1oq-uJz{<h-61JQe-Mkklv8|ZQ8}Hf+(E6<BknQ${<BOt z?Crt!Y8%0FUX+>om`m@4owo{XMsfvLioi8TNJ4rMJk2{ZM(1LH{CzmS_~uP+vwNWp z|JkcPz`we0LS-=ZskS$DvoMyLA$KAadpqwNwF9yZ29N0>8RfxC2bfVE8u8EqsF&t| z$309$<R7s#lF|BtG>c)fvaNG-keea74R$SK)&RPcq#-9T*eAH@?DnpQf6VgrEsCcg zJaTsZ);P|pd-s<=R{E5UXXrWa3&Yg}|H1ansoZO*zIqw_t%8in!kR@x`j@Z&V4$s( z=qix8`n1;O$$4IZrl+~+bl=emqz}aU%t<=~dZG**ZZJxiJeZ3-%L~X^OAoUYi&%mE zdabE(7;j`-P{KNLnVHZ_f0O+t4_nZLDF>M2*MmF-)b66lRHbSCM8&qmi!S3_^-ci2 ze`^y%mWFVVtVpzcubliR)!$yU15@&L5|Gd68FU754zoqm4+<%&Su7H#M?2%n8`)m( z5OyHTNQ4P|stHDWqI)f&WN8i5zc!JsGhCis%>g}ftTg4-A7V?;=weFnsB|#;-0zw@ zkbTMgU+MZ|T=GvQ<t!>sCWRr#={u+MC1APxUokP%X3-WJ981Ao8kr+FO3{F>0rU0T zf-<lPd^HS_U#)#Fyn=BFLPXJ<A~DX)vye~WKpf{m#But{QID-Q1+pZ$V!b<BCD)Mo zKD`eR+mbwuMP8$=>_|%loCdHW-g^F9ptXSqTjr~Zd=1oyKKYA?_<W&UJ4BIZAZQ)~ zDeEz(<`IbDsn{kKwah_ObEZ4i6KsJ}g6tTFu3Cj%9L@KniB(Cr+A@^qi?qvFx<IRO z<Mq^qH`t(9=QMm0;B+fH`Mut&6&M-_T>&aWlO?5x)EcAF=863WJ06OYYX)17*q&4e zL1(#>HazlkQlIOZ?-m@G>xt$3xVsz<RCbV+ycUG;gHBOUEeooZu;{+85MBuPcj$b- zjrVs?5^ZmK8&4womuIF_S3+!0W5e6h`9w<hJZ%|DetCJ@LbBKBz=++;p(rwg4Xn|3 zl|!J)KL2X-OiaxJIWz%EQnU0cy_X#H`NfTrioLl8gchZcG}^tq2y3vsFyj!`SBF(# ziW|1~38I2KF11Mz)|NkdfO~=Dl8_~vdDJS%yX!(rWnNU**fN=o+|dEZ`G;HeTyt{f z#3a!fCUDQgTIsxD0byoR3-Xn4D>b+Z1G9!qLxy9;xn^S6HTSCoP_0+5q#!0>trjHO zzK=mLXWHj;bE9Uhy|9i!-(;s_h+)sD$o_>QyH&q6lr^E7z@FOki!Yzrg3!+C_l017 zBLvc1C<cjp%wQSq5fwzLX&}1LG7<(|(Ft8Z>c2?OU(bpbS{J00!;lY%-loB623Xz@ zp~48Lraj_T;RjINnfiJJJ1v<c+x>8!y*juJ|Kw3E+{>F<su~X6SVL~9^rBCbB65=W z27OuABDa|c<9y1Ek(q8in;z>Se$B960#0!eGhV=(>_KwHwi%9>Gs?eUjv&hD?*0&& z2SM@)U2S~j!vqd%-po>>(^?CU7a3Vn_2Ql@sMt-e#2qH`yuTgslJ7X47{+hi&7%vU z)RLr)yA9WtGCfp~E9!WtPz|b_hSyP{-nKS<)=SXzlMZ&}C0atK71(58)vKqZ1Xrd$ z*U>~x!h4T;u7k~<g^`8Hmg^H^NvbEPQktIWuT#W9{flP-20j%n{OrwWXuz$T=i>U; z7%)K9VsYci?cq*+tL9nO7GR@B0QH`7G_H`ingH4(s29Pm8}g|9$z<B&Z;KamsSydW z{X+Q0cR3x~ZLfs-H|f#EKXhMqt3P-!k?E21kjjdp+jg5Mn;)HtbSY7<!BQnsu3CEh zA3dw9TGc)*{F;|_I=Obzmf9s|v&l=(+nTy6hSVI@{QgStZx0Us*OFZv(@5Ki9gHih zZn91L-A?c#R4`;63X>jK+zQ5f)*3+mPc0p6wQXr}Z8I4x=h9$cv&GQ)ov610YBjV? z1Rd^Z?DD)FU!dP#hvz=IG7Fq<LgnMdZ^nnfuVp;m?wsZ9cZY7gORclUcno@e=6+x1 z4stKMT^$eTFU*ETf%}rz8^{wal)I&t?U3iSEy6iX+y)gjJ-8=ZR*KTv>}G}Wb$J-` zm@M;f2ETesrZh;vlqUF2jQuJbh9F`9-TTp2BX3*Qqp@24g?=!7xXguA?`e_^vaJc~ zpPEj<2OS6LIvW(=h(Z*?alE>PUNPw&HA%_?A-7&H;Njz2JK!VS&$%1byUj3fTKw<8 ziU?9aeT@;-&B{$F%$H)f7>%<Tv#_4-TMGTNa?rrwwVc*{xM6hvC1)o6AD1yWowgWM zjPqMrgudn5=l0(B4{y*+aLpddia>-$A9ng7rQCiaMle$x856y3x-4VJ7VKYs6ZuHW z2A#&>9<ooR-4?-=>Ls&@5XruLm1}{S_7C4>Of@P&Q3by*2%mb8P1YCUaR-e%(?zdM z6k0YufkeCh0<W{Ru$hGCxzphGPn6PBct~A8HAM&9X}GX*|50+!k+ysgn?q|7hENc~ z6jZ7r5J%ZC)OQ?@sWfh|0d5Lg=u96JNIF@el1V7338mE#*ZVkr&tEueVN4$ZuJXTv zD>t3Ca|!k>Lw#_wAjRoHd9uOUdbV{kZ=7;kivpb=TEcfQ9U_%``*(t6S{b-lpJKD_ zcQ&#+p#C|25}CZCg8#l~uHbX3+gFERo+CdQ6EW}&Hl_iWO1o7)O1CbOr6ZC4c0EAj z7UrQmu-Xyf<3NL?@lnpey@0kEzdFufC>-3*cj{x1zqM%0V{7srPs7H8n}Oal-G{<F zivn$|WLywQFjVF{Ap7HN2omw@Kw)=6;+sYy+>rDNn!aB_&EZ?1RNdZLKEwfqO+o!1 z07pQ$zijKrv3T^up)m|%!~(ngPYdiMTR6hMmAmL&laDMxyFU!DMF^NMJhFSSf)oj4 zrTT->;{j2oJH%I$dE~Goug7M2vcoSZlA~Ru(6Cu#(0NKav(Xlfz(BDGy{;dnz$42D z1Ez>~Y_;VoQZiPNmW4689IHqvqKbryISNT}zy<Pd9yOYb4^0w`5}1Pp|C|r=VKh0M z&}E`@v|KJ7rTn>c6v&EL+19=6TkLxep=XT{FJ<>+nEh^Ip7g9CMzl>NbfE!OTUW^f zooRp)Eo>0Run}cCV-P|W7m>8`!+Y5gKZb0g(%`(zCMHd=i9$BmhHMTsfUewgI#KST z(a8-&^=pJ-H$n`K`d5-eq&)WTB@+FHkMLnAO*lbmP(c(&Xo!HfRa63<V}ui(q*^@) z4Z%$Sth5#goshYx)frKzZ=GfnL_wXDjM_2ON1UYkNOj1FRK9%PYZay&g$n*oy9uJy zs33Qlz#N^49mn_lV;`YLIKiG!UhGQ9i?FxlEvQCeH=?gEl&ykHVC1JbF^u44-73p_ z%7F4NFoZE|M0rmcg}l#@tb9L`9g>Z3%m~vyB}KfAE?K^0Mh_THGdj^A<n=S6ya$Xm z^44^j#~eKhzTVw@81@!Uus4($yAv`a;9rdK8$P_;GD6PF>2ervUHz~97>BpUkAJcg zfG5{0zKjeL*c+^74F4ZEbJZ0TVjD!+-8sbxn*M+kPEV~>vJgqa&P&nG*oJZ>3p<N= zje<l&)DdOeoS@SWB!;hZjN4Hoj@wMx&Vj<tu{CzC=`fEu`V(w9W*8`Lk}&pC+1Sez zV<*35>~GEzSR?i!yop0(X{EdirX@zxJWV4a-_XU=8-sjHS3i0CyjZ-!Ugi`qb@Jpf zxJfB>!VNMa^CnP*3=fM9j{6+E&ngD@Z~1%hR__U;lYHk4+23-K)?Q|)!m(3FGLLvl z8?oY7;AHHq^2gE1H!fhC`>POX_@uyzej5pLMkwC|!Kf`t+An{1slkM7%AKU%$R^p& z25vVddXzzybr190Fi?dk!zTw!P?(^QZDi>J*{KB3CE%FFij`*r>O56!-eIN9OEyrd z2reryxL_k1C{+$FISNgAil9kHe>s*07o>FEEH)@*^ff*7bPZ-WDbG(q<3(UieNKe1 zRdCvFf|##u^;Xw;Y^vb@J)h;nu-kAHLyjUV<S2rWw|z?_!DT<iv2PSZoi@O?mXCBe zp%-H?GUC-f{J4r?dkZ;Sp0j5E`*2x}yvifv*g+*+8eqL(6_bXn4y7S0{D`cg1S<@g z3;4AECS=wKm&g9IY(j!`UiW_#IituELiZRgTfsP=&^Y6ALW7K%gzh#TXZUqLBBX)` z;_Nj@6D@uQ0#mG05%ZV<F@p`6NSt<@;n)3a_By3{ht=x)Msm<v@HxRIoa1uS6Dg+? zi?ilqBj&|<(!2R+?FaVKU3!kLX}??I(NT8MucqYjeRk;YsKIq%=UiULgMa4LkhkQ` zDw;xl<3CmHTsGxj-&0+$t-AlWqsMjk(26eYK^>ETSyIj$NkBWf`*ljuuKe#}nZ6*O zAgs0i_Bjd7gX%n(9TFj?l_;^7NXspH-HZ$st>UULr$$cPGk#~i;iHc(Ke9A>alMuS zN4|phvXUm92#y?4@94yUz5P6R9j<E0+wexuyr3C$sDyW+4SYHT-f3Q>Z(@ztHSKew z`sMY!Ump~SV&pr0yEWEp&*Fvk<KXr7(G0k9FI}cu+1Aqpo+r*}Vi7kvw-?k$Y$tj~ zO0|5Tqj6U|;2F>W?xmq|y}*mt*Ent*)7gTXlqKwrr|Gf0!kR4(d(cewo4xQ%q!ACS z)9}#eRXYR~F}&HjWiQ)v7k%tkBb<>J<`-gN#;=i#R;9t;_-#agoYsy-F)0vZw+|^& z!&rVtVR9AIJ%#<tIOMUJz*=h?1pQs`FQ`suKj9j*UGV2d2*f4mp%FgkFA<~CC{WNk z>FhStd3=|0I4A6b9QYpy2hk&}ajYX#9X(FO7@f|3hNwMvaacHbV}Q22u=Ypj%XVy; z$h6(_lzackS)|)1P<Nv^?E2U5<C@-Y44<slPn%woaa)XX%579~?$bvPC&%gw4yIh* zQCREk7j*O$>Jj}qUy3R1Sc1wva3oBR<%H>hAqLw-!gSw&2~(5ijG7Gh8NJ^?neov| zZi0q>qNF7coaD4*2_l-E#EF^FftU}C5bY_LaA5l3!K_)G1dUX8c|4+)A?B|RL~s^$ zOX2vhP$v4!$?pEhwin`-3${<~Y{T&+E)iYrW4AJK7Dr2<wB|6b4z$$Js$7nLmSlIp zkNphzsh7!md79%0FIS#~MKbLxh_|fLaq*PNSIymm&|O|vE}=GG{`MK)0|v3CF8D!Y z-wcxERM*8;TQp@Bk?LzPrAM#PGFUB-=TkA9Ws&T(b(KJ{mm~d4ar&EkkX`JgwLr9E zCGyu7YfJy8B>v6N?=FwBZnaZjFJIc-YO{597uFEZlE5pH$Rm~^&Jv*|{`s8Yl&P(Z z**5o9gudkI)+f4B@m8hOHbw_j{rLEqdwQv$gY}kX;?gDKJ-Jq`T|=s`JYawSfi$&N zbz!`oT%cU7ls}#1%mBM-gv_fURAD|6xtcWe4)=cju1ifH@fHSX@VazaDOTM_qIQWL zV7c;1MnY+#s8$XZ>%vo97Rtn`@N|`2v3zXJt~nyLkI^PEMq5yC#U}PZS*(^V#jo@I zIy@r99r+uFq%cHm#sl$ObmJHX`#V@SYQ(vzxJ#b`9y!PX&iqc$T<_RY#VIO%j^eAa zwS_f7jbG%)X=*Kh-+t7Jm4!ou-r(Nq=XiW9%9l#aL#9~8M4YMi<5)UZW;FHBjIgp4 z*_Ct%Gr<)25GI;(7&L^B=wX>Ljh9IdD<tuD5?Y0w!321$b38F{JUP&7ePu<QVF8{N zj*}MYxc6`s>{ARdU&C7rSM|_9i*yy=q%h;&a7+W<=_>6i^!iXyuT^gH<JzH?y|ytQ zb_A2e#b|?p%#J0pVh7d&C46G)`z9KW`85o+_S4`JY_1x}M%c!5C97n|6hH~xNGE$6 z*z8Zv<kuIT3jQ09(tcMwvA02O7XVX}qS7sKY*8u3r5qz{6An}0gdUUagf4?0S21kI zMB<w93a^VI95pUx_(dE^i$&gXD*ez%qOAoDNeU@q<uMrQ%4s=VkZ0vHF)Pa>*?Map z!X0a}AVb;aNI8G5t6K8~lGve?AH>z+U^!0GKVSw<(wi-<5A6&bz21{@Mvz#ABn_CO zIaJEl1rS*69zgt+PDPou{0KzFl)FenC5tGtTK^#cb`ohThP2TmRY%A9?HT03n>NDO z-+#}rBf<JnBhHRXPE}1meSXmu4`}-Lm*9PE(S;dj^(kp8Yezmu2hP`vpP!Cf{!Nr8 zU(dIyzKvdW>|}ko?~bpfJ9~|rx-D{!C#;99s-3eoPnl33hfSn!<@@8<0ioLy_=j{) zw~A1+81E;m-YT_PpEM*85o$6NL5EzZSJc(ymR16LN;;Oq`a5)?(Q;9&T-(DVHrJ=K zjqusuI^V@asq2ub{if&<e09p;<5+sF*Rct2$J>`QfqJ(tAJ2)?_m00h#q3d?mjf=l z^c~fhHuhRRdHMhkpHZ35^qVzwmJvRJaXQoKvEoh6dhsSF@s<ZN<WH??U58OOpcc5M z+$=3k>B%)*HL7<9y|$dZc`@Y`v_-Fk7>(mTN;|*t0n_w&S>=z9G&ml6b@cZiG4N*- z$K?YI@jGz)snj!O@=<df5D}yVL>g(IA|*o*hCxArBFIm<v@mKNeq2K6#MhS=^3584 z)aKWfC^r{`!-~rbXN=^mwZMyMm1f~lqB&7yrfJrE0l?Js27=r&N-l`hbXN(rNVDNH zo&Axy=l|uAIX<ePe0}4>!BA_}pUbuJDr))rhLQ{S>eq;bv!qy*Eq&jbB7GDAv0VG7 z%NSEcxpqe=J|BeQTv(Ye0?UE&ndLMAszY_)_V5<G_hP`MhP(81>9t)c7sJi9UbVT2 zCHeP1>%yCQS{IZ`i!~1}WRw-B1^4bd`YZ1Gy=M<i_?AuKTRf15bJ4h#UB4XNamLgi zwolRb(5#4y4L$Cm<#o_Tm`}ZHlJ9{)l1Uf5bmtj8xIn*L-Vfe|J|^A=8g<}}xQ78e z_`CQ58tQRZjeJuCJ~pZ4TO>J{i+Q;r3vqNP73gT8J>PvORs!(A(#;zeOpqj<oL<cY z!3t&PAayqBcwO}<;uACW&Uc=2J(<3cHwTjlmXxbSKj<^7|J8*R`Jn9z!Juuwx00l! z!^^GXmar=X^SAuc@AtAW5haf}*;C=uP9m_y7-K}+M1qkK8t_70Gf_SWKq@(Fv-3NH z`ET520-n~t3WS9M{;V2-p%~-7!}b1*od5okz<(9+#diAF(l|2RSG-6T2-s`TdIXiQ zEH!9=si3EO3$^%mh!+Y(tacz`7(|6(AE)GWIKkT86}wmxz?R9?1Jm$@ha!n!H!y!U zVqKR4aI?SLQ8MVjcWY=i5**t!QZ-_-qf&rZeB_Nf(nW|JcBB}ZR3n^wYp0G?5mb7q z{LWM!mFid=%hho#6bW$fV5L}bPKy;MR;)PqaTUY%7V>xww>EN&r*bI>E%b~?8YAg# zy{_v(<i;2lC0WsJet2_-mu<~)z(bx@JHrSZXBYVXQ>-OhD_%ozh>@MESVj8F1ooRl zq8kQDM&e`J`sV#1Y`0$_a`?xHzcPg;hT+RJl%mI*QY71ceuF%Q$+YwpI>S@h85%gK zWf^PBGIm87$J=7w>=r$xpmdGhQ(noQVoBf?4q{mi2EPb3I{v9g0dWXi<3c&&?vs4H z&mi4M;3pi*F$9}1&SF!hh=Q;k$3t$E3)y4E4tcMVk$!D`f)IcBF0(jsZ1RIMw^Q6e zn++{5k4m9s5GvtDv^4Yh;p02?Ycw=@+U|uXJ!#6(<mKumD>v=dLtTw&^yzlK!zc6) z^}MP+@?%uwNsr`1cv*U(kEXT%<birx_GQwHT+fY(y2%T69gaB=c~)N$s`j4}G{h4| z^TE1IZXT-9ju!oA!1N3pw`>@24G&eZ=SNxDRaFDCn>QcWuUWIKevkASu6|R_T)lei z%=z>2V+RbFJl0PSZTJXel8a1shu)Gdnw+!BpbSr?ul8k~!-}LPCTJYu22091h+vc* zLdJy^N+~Ai<Z?K32Q!7qWKk}WI^F4h2bZMA{YhvRk!qE<hoQ7k3RuRLd}o590%%d_ zESKSaWpHgc+Z0*=1qI++;G9(i6_}#j>dgk?8HG!s^8smr3v@flMqnnr76Q8zx}7u8 zcxmfN!mr{B*ZXQPS#&BCH4iqG!{R)*tWqL%>`nwrU%^$RFcn3(sP!U>I#(2Rvih<b zZH~*@NUkA7QKnE)=EP)zy7(!&`1U8Lio0Ev>C4y~ngq+5lnrOE6}h4)V(QHlJuV47 zCZ1%k)yNfU#G@JoiW;|t8n3muf?9OwPF^c<MNuNP7r{5Gm5DGT@t%043bn-}U3fR$ z1u88}_x3N|y#0$fdTac@{|Owav1<#4+#e<S<F+^vS|+<;2lG=#C&R>aT4rp>o<0(H zc77(b)aZD3j_u0BbD0n(qgaBfuJV{1>ZMZ~5@I<3-g%@;#L^3XZ%6R^0a+3It9pe< zyO4ofIxTP6kgcoSMd-7ZyK&Qcqb;H3Lk|*cA1P>{lXxBcSk``H3iL{MX~?o3=?0SS z8u-!mA`@&A%H_x7k7c%vz9LW;*`_sQ;gxNWZCV(?Z!Kj^<(<3I|9i?~cW_Uqe;{(D zYb!==X<w281`K8)59}%AkuI2MvBe_+(nQ0ON4iN0r>ax;?2PJsgDVSa9)X(wF}Bim z0>RH+2>l~s1Hp!a48L|2AYYmC)D0npLaIxFcQ5%Tf>x0sw6ZUu|1boxN^&0dri04` z=hK;2GNDIiR;Eh>2Jg5wA)yzcmUx;Be&YQzjLGmj4_{<b8-n#vOPA3cE^8?F3s5gz zy*$K|+WPpJ)LS<ExZy`VAKLUQjaJZ~hwXOe1sTvJvs7m84z*g6N|HvdGl<C?c_|;6 z8XK^+@Xnh*weyGZfAU*9NcnGnYzGAxFWy?iUxWY<k^vr~{{pDhoniM(X}^Dy6o}>@ z;GMssRH^JbyOK-_GjW_6u<uc(lGMcfyfI0ghfSG2dyRgNrszaU#<7@16E=CCSKnCq z)$xHI-hSP=wqb(dsUGc`=o&N=e;*_Ue;*_oe;;I)_<fMmMDh`R%z;|R*lALn3Ma)^ z?k+7DfTA41k+{B--M~J_%7b6?<2q>3fA#A+i1^0O>mbs<`h6Wl`j<bjQ%O=#NzC;A znma1xilQiX`rv#%XkP}HKI=Hrzk83QF~t{-9X-5JzewXdanx5+X6`w;+S5<ndrQWo zEDv;@!OTRUz3`Ytj2{3WT@zBsAQhd2-rj&E7U<lQ+#=8e%`PxLfzB-n_@ogx>3uXg zeTX=R!RK>kVo;KS2xFjgcZLYe8T@V%Y={J(zam8{bA$HDguXz6gW%Jge9ewarx2bN z!oFtEH+2!SdP#=|Ang(22EIEPtwz)XeXt<~X?rVbBE2H!|3*tmR&sz)ath-=Ih4$k zm2675%C6){p(J8xYm{sxD~ULp?Mgn+K!n~kN>05=uwi|Tk^_X2NU%XsGEO>+@T0Pl z0jX1%)vZR!FNKnb`jbP+F%Bg~<Nry?MncJHq|Bk?5n0EXn0DB8^hO;K0j9my5xA`5 zOj2xD@p1;jTh*v&xJjmwJ2e_M5*p4Vr4B2eokq^f`n64+MgnToYbw;6Ny;4BwRUKS zZU1}ac)@>B_8o9hoK4)E$L^ZdToN`*%-y?pVu>bL0J~xY5dmXE5UhyCiW<Qn7z+{; ziGU?V1q*fsgN4{YItT(5if|wT_FfWW$~?StCg1E~65sdhKfK$g%>193xqZ(4%{()= z=4)k5h%#NI7Q7DMeyuQ$O2=5**i!u%G-IdS+t9Xa1QX$PJE|t~aVfb6GQhz~G~BXT zmTEi{-Fafw&}^mkpB5a}&@A}dzkJi-DI#D^k!Q)527WMCPGBo2M<&s-f|G6>#!o^N zJheN5HNopdVI$oDXL>H28}{j(IR_R~Uc~-m$3pkbHA$6IUj)ea`BlX1&FjKc%!E3- zitCr*jSh`J-&8$PFi$=p6s8@_Pc!Bo%RF;O|8u`ud<Px+yoYZauk-hc%5K%=O&#g~ z$-JQX#&I(PLk8*R3evBqaZ!j8Mo%gUq-Mp<dU&I2<DKhPS8S##N+^kPkVH8^qJ*iU zJefsamN3D8c4)wC<Aga=rn=}mUw4Cdz~SaIc-z>IcN#aU_mIFd=L=JgWTYC4j^`b2 z&>t1ZqVU<*3VcQyUw|`YwHvCv-h(qC$^@7NyEX7HIHH9Vm?bxz%WG;Hn>S$K*uVh; z&ILA_bdz_B8i@VV#y#3b3x}BRSW!3Y!{(bB*zj`fDBC<%e2!OX;`7}R;93doDm58w zofbZ_KLD;AD0~>YauvL_!&P?TcS1Yvw@OFrfR}X=l~+65@aOzeY{xkae{3CqHy9^_ zVjUw&U9pHZa`V*zFRlvIX0|f?F#!J%nk=C*ycmEl1l=WtDBxK0Rc;`U$6j3JXr%cQ zc_0sJr;*oTDB3qa(=;_|8He^Vc7~3l$&gNZ=ut}7&d}NTK93U0qp%Y?>(QkYJHXp$ zZ~TiB!Wy;P2ogGD$5Q&Ro%GmaG+pTt%lMQB3FI>91kQSJ84VrqZ6MBS5e78`s8NOo z%&+-9xw;d%g4=rrxU5{aa>ELfbZ2LGZbQ`isA&Dfd5e0*8olTg`mNX_p%e7caZzid zjMB5E-MO_Z;#NlKovQ+VH$Ja+;C<($6mMFWxFOLbJ=k@J+qiw*)<pf;PfktPWXwxQ z{-Hph7@N3uE3ro2;npU`C2ZCg9XnKPl_iY)QvnSmi!0ocrDwg?&r8nHZ&^=RMiS*A zw_)45ty}eXJoDQdJ9+%Z7av<V?(?`+YolnTNEdGH%GjtV{rKcrd8>>QR(~?xPam~z z<;La2y32*MSQoWg?>pxcU!#M^bN=_L{JV*9Ti0$Q)};?sITE+%bB`RnwVuq`5ACa) zgR3=n8??-T_Hs3bH3vgjH5R;hCj2uE`x>-4WN!}$dl8Ib9#GIs(<w?UZ1_=8>+e{W zQT?4Ou;Hm_?OmcCejhGE+nZXLVc$Hq&nD%S0Vc^%)d#DDn-*$a>Vubvd|kM>3o5nG z?O`RQl?>o9iqcB{9{!o!=L2|HNn_V|9j*=+OB%KCi#_%L+3zQ4tA{oPPrwNb#?Czc z3#EY0sMF({1)YI14vkg@SVA1H*@J<e8GnX1^`Hy*8UF<maexzfaz4N|dTi_01$&@u z)Kw`kpjOL1Y;G-Azb|~?Gp|F``eo~vo7S&fzbabqvoNfO(NlPEXwisOv8!TNm|~a3 zu87iixHRvH@oBXS@4fJF>DG1IH|{X4Ph6jnpf8@4I&F*b^rjzD&*>9l6XFt$U+sw7 zo~SQ9bhzBQR&=cv&a%bwmh}niw;I=PU%w+!|EtfD4~*}7+~La)g^Z4hTmIEDQ(RQ+ zs#W^2Kg>V9+BhwG)_h<6s`abZM;SLRTep0re)Pf+Z=;LHQ~t@NBflobZj0SvqBmOp z;-TaR#wwx5!ULB~Ivk@`mTLLTwf5CGk>$h0YCN<_`FjfD8??|sCdWe_Fwv5a6FuON z>bU~*-&L2)FRL!af|>3C^WXP?neGAe%X?svTcze43(~T!ZZr}^Bhy6`TmFa9K<`rM zP^zUeJ^>0$n-D<Di%&##2tu02j~8KD?s$>LnD2j(GvB|-%}>OawA5}Pqg-1el+uWd ziUa*sq|hi;x{A6pA{5&DP(m5x#K}Gi^;sf(H(&7wa@wX$Ccv0-u>@kYD%q<&l}NYf zHv3Lf!lqFF4slyCUKu5*CsrsTy(r$MIl91O>UD1RkF@*g*ZXRm?*@!v?(!-HcG|C^ z74m3G^V6@|m!mr1(D@=bTo`#Cvd%-Ni*!!1u?n2d{az{MMzdDvET7NcmXdB-U&YOv zG<n4s1NL%;w;%*UpF&sY2Bz!S3P+oy>(Qu$4xbjfYG=j<<8JtY^XESg;Eu0axOa-d zWn>RjOoWH8<-6CPPCJm1WLzK3N!Oz1e0yl|X~X^EXD|qsVk<D94~|27bi-{{`gQOI z_Jnapa<F|0d*x}1Gj2XRay~y}->g9>gp3+*(&ewI9bU`MR@<Gu9@PY{P0|9EUn_^N z_-^lKrcZu=cOi=F%R8#a$Du3ttT3niivI5K3r?Lqhkf9;ZDy9YQ99WxXsY`_J@Qw* zK)6tpQjkTZ22*Bni}oCfK4rLA%i{%hR?a%SAYk0=Np5pZvvNK=oU1QPJyuA(!Im=F zGx%gp>48%hj+!>C1qb|y3!WbwKGmRGQ#&~Vs%zcN@OiCW*-h`8P<UNB0=dj6OR0T= z@-AO4I^B5xY`~y(>Pe5cW1SkXg8}u<A0jvC%*fK^Ch3UV(g|ao^vGQw2t97*C)0oO z($p>9+-0aK<E0~J0pG(xa<`Eq9lDLnsWs>3{%C|D>p0zmaFKEK)%9BDN8g0lM!*l= zcSIAKo^}IA(+OP8!%~_UO#3g!p}cuuxn0GL$xW_}5ZdV4H06eLlO;or{LJAn^0eZ4 z@16cT&g-+!Bv+KChxu(VHt`Q*Tnilx_}bvn&VC2x9basc?tHX(Mv#xb^KT)*%{P`W zEnGfQKXKY3AEQ(=GU#C8SEd1ckFOj2Kw|)*uJmqE=+Te&nWUSS4xGxks7Fr+`Ll19 zezWxJ)_wMl-FiV^aQslgHsg*pNijQPTHg#WSvgYgKWoAG6-Hgnn!?8=kWu=eP?LY| z@<pgRr-gfKR7Xe~=nQjU4$>6|p)0<IopBD%0lI>#sn8Y;PVhQ-gZDkU7~o&`ur2za zj}u+~Wr}+&Unx9$Khg9N@3(r<{9wblkaM?h9WE|9l^o)~$#jvwA2qJX&Cp}C3*m~T zE)PsPZ^%9Y?b0Z-^@OG*<3{?8Gvygt*bUh-w7Gj5UW3=1?_e7gon27G)^~e>XgXor zeR$=gCzVwXA60rfb{p>5%``7pZagYv4dk-<@prkyn|AFxtUo<3WxTOBF6Gm~Pd>>X zNLm&C>C%;pO*431PO~9j^Lz2{c`zwY3j>&k3=8V=aZbP$Tp++gd+-zL(2q;!>%osh zzdYD8R2Ynt2E!z7DDL5P_%@Ty!-Vsis!EttsfE={k{?%B+<)j%;pph$)xBr6*JIOp z+i}xRo-I0cs;KDH^l^UEXN)uH7Sp41zbcp$sex~5v~ZQJlwr<Lq}YomjJ5QuVdOij z5_HRVM}S8a%&r0tqTFoOvR!PCjQ-%^jvnam3H~^{<>Fxm5Ad&|soCJq>r$=79bm~- zR~Y%T_+9m|>dV!Yx5nI2kKnjLydz2JSp7_ZwmUCY{;L0ZMCRaaMyWo!YHxaOgZ_cv zg)X~{VCz9~#OMxm)~_M@*Os;*J&bldsL;8cM~*zTzi6H=LpT0j4i$r#Fx}aN-PB?b zJ!#7Amr|+*F)j#gOcWf~9VK~IH@MbAI7u`DeW>KbvpQ(gB2ls%tAj~0N%0{`aU#0X zD#dR@EAid$j8ba!bE*`X9Nihmz8DK*yVm_kJqn+H(^w0y>1hHlut72|c@LHdQgt+B zqpdt5c*c-5M)*{?vgXu`kE}$2=qKYB@4**>RN@Anaq|6`g6ZyhuZh8qYmB;2;-MF7 z3j<Ui=v#GKD1cu7i}PbkpZSz`OlbXZNH+oPmi6y~9rW0_=>w3K8++B=7M>?olqWrH z{rADKy+7B$?HY~Q4A;$Ca05qq;SV`W3k>-=I}iO}y5v(_<Xz4kNZXc~tuI`bz2FC< z+3Z{7=EfbIJ$3se!^Ek}LuZ@ZYJJC<-MIy`mQC{4Pue#1z-*(pcd;)AGw;e>y(^#o zSYG+#)AHe6-}fH=zDY;N{=8kU21GQst{)6OlqT{^9dx}V1^(ZXM81T!y&JLJme$f3 z)!2a@1QeDJad*(a%oj2KFY-mCej8C&-v{iLw3ZSa>WGW(C)38q*Fn_lQr27r*NU17 z@Vsib3%c~Cyj?X3653tA0;avDUVP6bK|%cuJ$;Kn8)*Uuep3a9PJCQq+_uCm>o#xE z!%*vxCl5kWY1u<VQ|45sou)fHC`<ZY#di!6!;U?AV*hZHx7RbVlwTFMI$FOne&srP z&}XB)DxQhxvj4sdm<+mE4z<u!3t!i2PN=p2_F9Vyydm_P`myVmrq6IDhrQgOJ0Ffa zxS+2hB7+R5af8?S8)r^j{noS(e&E2R79IKRFow(6xO-QILHA`m1blb}Y}Jw_b|Bu8 zGS~$*p=G>fLnmHZ`r&gy%D~rd3DQz{4LVZi3U&lrC~Uw&h=M-^-N|_H9n{dEW+K@g zg}~moV9y;X0vPO(q5XYpDUhDmvAqfB;V+fSph|@z>!=~X2++Xn2Atg>KpXf)zF$lQ zLdFL4G@%IlXqVB~#h!*|6+bt4RoFGK4bl@9ZI8}yykSpaX+q<>H~7sJl<U4Gb7|Uw zL#^QhwQJe%OdJFQgsX)gk4iM*MK8F>k6!8jv8w_54}!rwbjCfLZf|@e%&mf?dOK)! zEs&BSShanFVClcUu;gIFs>|;}P?dUwW;VY%eZ}z;`Wt0MH}2&GxFi~{@nDMT(})gq zlCg6yw40nbd-F7t^q{}zJ^nk_MQ*+$TMrR*yW?SiS4CX~Gep|KKGmLIlRa@f{)m3? zBbD`qPb~%xyLf@e5cD7uQ-jR<fokF>)@B8I)PY9@b`f9^GjO`tmqlGTN;ZmsoiZxn zev`TyI>IFWnpiJf6Jb(sTqX<&<%SA%2f4w2w=fR;1nBaR!kGI_y07BlHOC0}QoWT8 z(3&1jD;lA&QHo^u*m!vqY#fLiu{)3CQRh&=jibEEhSCeaY=ketg@;!7B?kh0SynNM zo-r&^g*=LvvcMqVG}{OKk)a$)JcQVX)Nt_nP=1`3T!e4%I*fNvo!FXG)rX}8F9&jA zVP+R=Sxu0wjx0#+GEBrhT~vRx=9ucr(n3KOClM1IR8Q7dR!<gu=+I5UwVzw-bHe<y zTG-cRsDgVP$eERSS=557gQJLB9mtoJs=BgZxI=dlbN;lc{;LLX5^U8%>n_I>OnYVY z`#kOUu;U{IH#?Af>#*wGf}sw*6oSensK2~h(BI+z+qabyLm`_C1<uJm6#PBDCBkC& zjAAQN8Z5G3Lq3@JSjB$6h($3gl$ZeuW|k>-;FC+w=3m1Kdnt6JC`f765Qj9jSi$m` zmoW~z3_nrIhR!ilMJ$VnQ(^)Yd`KJSySs`#MJljfZPzLGvlN0}F2)R3$zsJAf3gTO zW|c>RYlhN1-YOUCI8Kxj3l(Vs#dtQ+*?|2U6)A<B_lc7Wg?$uoV;y4^N`Y3zWX2T= zGpd5J1!_P>L&9od1<n2)iNSJa{4Xh)Q5BOJ<A_%kw7J7w70@bZbB8*$O@b2ma*-K_ zTS;T7WfgXq)r8H<TSWE#FB>v%S+yebCJDV;B=jT+J*^Uc^Qwg2{~@8re@p0Lm2enI zILs>HaFWpLrG#E}1l}UyFp_ZCa4TsnwfsfP*l-c2up%uuv(|D~MfYR88V`FgPJ}ag zAQVXV^2xHb`DEI=`DELN`5V<Eu9JA0AoGqES({K|V}IJKVX{8re(|@MjHMCqt~ElY z!kmgwq#c(DWZPu|*>Rjel3WNRX&iw}x%>)<boes+nhF4BrWIN%ADg7Z7kd*+%>j`R z+|_xXb?I}f4LWFDraUF=les_TN}skT@cHcteDQ7q58qATOWG6oiT1Bbc*kD)G??y3 z8n)Vzdc_J1EK?q=A!mjP6tE*hlqT(<@ZF>Zv~IxR10s#ND=mvc*%DdWyrTsvVuy-! zdWRK>h>DfRTdWeD^&?rYsM=mpwarkq?XPM(LDlxkD*_RjFR64TUS)7nz(fG5>0=`Q zDryZeej+`Q?VJD!tYb?Ua%TpGA*W72og)_{uwE(-jS<e#jChe+g!A4Ot43dvAW6v? zG?<)3G~0VqH}!xz_8$sOozqpJF+w<!9Iwt2g3}fShN$<Rx|QJ=0qx5FXOA2&5-|+E zm(_yEl%es^vbDED1cY!bKVBtuQl44MP4}P>rFsLLep!wCObVIhR0^5p%v>@{=3FvM zrn*l*OL@gCM8-D9co9*eulU=3MMX$oqIQX!izaT38*#UCBkoqw#O)LPDtC0JXhnLn z9fd8U+kYccm%^4#?I>)yyVGFOY`=1wY_pW`vOcmQ<Jh*gNg`M$8!`_SohAE--Zt)v zI{S)|+&;Hap>3m8Y^{w7Zfis6G@`<5ZB%^QXj<SsTHuwf36bhbSJZEiUbI+rJmKg6 zuYWd!$Xb3m0}7XrLEYZ8{y@q9O`$gX6?k^Wj%qMN7%i0({oMM!#99}L(lDEs5Ubq? z;;m?cSWQw>mmr*@31Y9?V1@D;Q*Ou8J;yRBvfpHXUckl8Z>fc7!d|?^jTEFx*w2^@ z-j);&8L#_>7*03X<-jbQc{jKGe&ukO<$PCaf&_bLFZ9g}sRpASx)ojl4QLD8klZ8l zhW4FmL<d2-3bPt0lL*`I;qPZ>J%i4A2<#3#_QpQlk;g!MFSF~ziN+;@bQe1eqWo_3 zihuys3F4)e&>nCN_BC1ybY-%PT6yv3-=>(>v5wpTjHils*k-I-|ACWApp_B!4R|q0 zkj&R$J-=vML1><#viNYp0h4rQ!oGzSMkzC+me;98j$Utqg-u#^kIordirsEoyqcI7 zEW{`LsFY8NjK#H~{Nm5QNijkFeQV_5bBa8Ceq0QPT{SsM^$Jl(t=l5(%2L8vV&tAk zJ2Uf?g5e~@)hL{_`#QY^pH#v#vP9;$KnaKTmlejJR>HqODY7xaV)$h?ZL0!X_WsrC zxm660HdCW)y%PTIEfJ=FrG&@Vz-n`j0<sJvV3Zk0!H7XP0!O;TNE{(R63VpvgSz<o zo15vI1SYWMqiCtc)Cq+SuxKTTd*-$Rni4UL4TgVf(pi)ibZoE;{oybS#KT+@kF(+5 z+%O(z;lDXm(GpU$L{;=IDGD7(Q)-f?cU4WfNDb+!B{eH+l<Nv92m)!iRn>4dX*iNJ zd`22>CJh-MN$NE2{j0TvG+d)<SWX%ykcP8K!`vE3Qr8JsA(A>BX$|Q2iarIZJ{d3d zIi>3JC+Xu=B3^n_4PR7iPSmoIwdC}BB$s3yzjw;ybo$K962qP12CxOKZ-dL2pqb9W zrn@ty9v^LR@g0O(v@ITV$F#9pp1kPvmD=R=tmCOO2YzoFxM2RQnFcs%KXd-^#`&g( z)YRk04Oz)S?jME*PcrF}AJ)K=$h;a&&NbHRnwC|tDtU6o<cZv&Y2%Yd8?ZZa1pR@} zZr`+NrYV!Mf-<wYh3SQ#l^UQsaL@`IFD)saoo=$|(N+HKYSS;rkFAPKG2(Za#6^C; zD($2mKEko`%sC0W7MkEYNaA)cOqex8@8CM1qfz&fLv3@XS`Dmh(!vM_xg`zZc)DUa z{xT0iapQHF*3|lUs1V34?FqH4;=LCkx0*v>zV&jCYJF{TsG|oK%?Y+k%Ss&NI*YSF zOI_g33b-6jaO|x*%NHIzBw!7u;v>#O&~1r-Hi#;DP*l97RNn&Y&uvI)IKuK6--kcY zesuDP;$-My(QvxWYpUUTImAS&=c;bsP)pO%ZFU!U=m{U=>kx*e+f2g*SP<FRKD9&Z z6LUxG_A;P^8W-${ikekrs<x#pswa;tDxcn~_kF*Ek0<3&fwbnr><HL%;m8G;bAj?A z3oe7H>OvL0Nm=<2z_fI<qYP}o#;>$rU;oi)gEnVJT{lUQ`Fkx|nQ<hu2XC>Za7Pxo zm4d^LUN#Zq<pW1fpFTKmn33p)h0YB&s$fqnKJtx%QUcTXw}5E~Z1i>01>4}zqgB-h ziRZvP56`f<!6aD7nzFeOu(#}38HALnf|Y|!`R;PiJf^FZ6%5(zund}@QnwF-2+85h zsJhyW(%+4ey$y7N{xY`5o7`m{+QUuGqR0NSWU#5;b?oTjU9*P`TRL~1N;o(2Sd~c% z-koD1sP=G+HY%~*;@AneAqUP~<h$Hdykc&0puuhGD6}z2(YtAx+PtI5#oLYJwjcc@ z*HA}GstBqeLyXey8#o<P<avZkYaKbVdzPnX<ea%Cm~Q{~*sfWgwEkR^?%PzBp@BVS zEj&(@nWF$>a7<nvra%hPUtZu{k+V1ox(McN)-V@xin%aZ#+_znuo&DSNx)pp%?qST zj!G%TQCS)MAmbrO2@F($IQ+vM{@{_CDosR13kLiN9SFmn8JNKxlX%R9+(4TDN0vR{ zE@z6ULNG^nTK=XPo=0jP(bQm=Bg0O23-OvUNdV$~tlUzvY4vPc91dX$$v+0haPWs2 z|KRV6kCg~E$!ui~Ws`{6Y$4&zki>&3d>*H}0PD<}LySTT=~rYVM>Ge2svp9T!pZP4 zY(jeZPX_99_$LoEKRydT#!WykPWM%4b2Jsi7ou&*Iu)>14$MQUJRHYn!w4Kfvh0I> zxEJ^32Eqs!vCc9Z=|c9|hx<6)Av%W_5UGLGIxT=bD-vKDPAe$DEXYFoD;N*cU>avB z5_Eh1Y}J*1j)GRY{qiS(wCpn$E3d_LuAcShE&bxS!2+ajusB<s3dVD~JgB&$*~cu} z=C|Q@8PnmEzduaD37jS5Ll(m06bvl%=Lpv(m~j8p1Vr0JzKXt+HOh>zFnt37GlFOR z2MZf8-QvWYN%C#~NS+GqWh6nzk5|P8`Ws(>qzK1~$l<W}Pn+@4HYE!C^rl=dU|KA5 zW<AFjSez`*8z7Bx%Hk}}FU8$X;=&)$R>mn1$gz+smJlAMzy$w7Ovh6|FLIBt;u57C zBIJ60Eu=9*DJZZIBBaG~^@7Ejf(XCE#VeXa%_c1rgRP8?Fok1Xc>DmT6i<W&a1!a| zI|&?d3TNrc1I>@k#szp17UD@xM;}RBvj)bP;bZzlHEM#D*4qb-CR})0L=9><h!k!d zIa*bDWNu%hWs{l331IZTgsqG(dFxwPJ=ObhVauErTd5dEOPrZ)Qn@RuRBntsEz*iD zraWNQ9$`b}mQ7b?W@WGJMk^6-zN3J#nU`S)kKM2b=QbohXtW+ro8hEzKH*?`h7mph zM-G!}Xn*PjUA(!OkG!L>$;==lZB})1TE?n_=k;*X9Zw6R<AZ947(s=?9qvre47_gJ z-@?F8V31jvyQNIX6uA~K&HWmfK~tZY$r%kjxZ1k-j8Z+EcE^*#$W@`!f{bKlM-GyP z(hk*|1rnPnX80mf!xj^pADbiJ6$42nRjGfr>I}YQ_opA3u-FVG!q0)lU5qXIzFdw) zs4hRf#ZaT}T6KZ+poGwodOT@{(?V%{hFhHxRdL8L|EyR+3&u2ekXycrX7ODDeLI`5 z#0<s4h28r~j4<QnR}+vdEk=%sub2|i{Cc@vCVBKiDP#^o@EqyIb>=Y$p98(P_G<B6 z7dQqkc#M<M&;^fjy0!6jETc{XuQkGqM%tPbq_Ws<QW~3WWtd^fK#G7sB2_AG_SZJ= zr^y%o6vBedEnE%PSn4%x^B#5Fcaw6Bm{_VM!;;GD*2kAI`!Y?|MfT>!8u23Ym)V;Z zd&`?NQ!Zw)Z)-%|x!n<(J?u|yvuuxL>>{4GT;z0N+aff#*f=da1RG?_IM~ElHVM|z z40UuBQ%7+VqZg+;7k^Qc#%^kxd3!v=&SSRaJO|m#olIx3;Vf<Gae8|M+Yza0D$}x5 z_)fM=ghbA=LnvdtW!R5SxF36Re-SZnqKaV&M1_frUL4+nM4|&H4lfA0Gcgz0u#1}0 zW#E4n{LgElK1POq(3bxCKwo?v+F)Pohiy>3_Mu)|=x0J7aFxT8m!HVcL+koGz;7|4 zhj7*&JOr@)yule;>w{O!3|nAC$LliK;X89frhhgm=3PJgiC+ir3`qq$uy3dPGUgmJ zp3|HvVaAdu<(w^Qdff&Mw7PvueZSQkTcM_RFKlJfeYrhCbBb+=QglCuiy6&tYn$Dh zJIX#8_{frtgJ9E$$*=+$r#lrc9%EHnsDmsSmS9$C7A}XgupIKoWMc$oVkBganMAbt zxB}0XPUdvbj=W#1OW;|_8gg-#gIoFWa(M5O^b^a0)$+ZptKbAZC)YbUO&YBJ*k`uu zJ(Hy`u9n#j0s2~Ya94Qgdh=Ls%U%KdvAx`og9`f$a^*>%(qUnfM8`Y!<!5K@55TsR z!H2Ie9zWTrOHsaJjn6gE&YG<-k~Ov$bziZ2@Qwzepq&=-*}db+15pDKcxmArD-BTR z%fO(4Sn$z887p&9M@m4^Ko|I33$t0tU+H?f2cnve+6t~oyJ0LVm8D=xeA;bIrl2{E zI-`YhRys&gA?ig?cBuuQ53mx-$VpQZazgj0Q(0<qiUxXFYn?(e%lblH^ZF4H?5)L1 z)8GcXewJ7%(Im~9Y)8|-lxe^S$y(;jemP9^1)?3yu%;JPLN-p33)2qgX8#Y8&H-r8 z7z~2>k~ex#+qP}nwr$(CZQHhO+k@KpYqw+F*mJwvcuCFpL(J^sx~A#)P5h;d9^|h1 zN7nw&)!Hr6+kbXT@n^C2&*HR={NOK_TXdeT(zJHt%9G%)(S7K|&tl@I1d~3Mo@l-` znrP!K$o`A`Xu{iY7q3hrx;ugRi-_|1P1GHc|Hpn)h+3k9=p{yr31XgjEZ&F0hsuRU zg$_$2W6F54ylg1j$>DObJRz?sR8dqORZcZjJ=8EYTP;^x)WslYkS}QPClhibxT8rY z(Y^EtJyXxutMwO?$Ye7`O+{1P^fg1xIJ3g+H`mQQ^TfO}AFZ{8ZB1LxwzM5=KfBfL zv^VS>`@p_%#(5XXrE=9>d)L)1aVy+Lx6R#m&)hpNeI%d4m-AhHFW=t}^`rfAzsB$K z_xyAJ8YD18ffx`Ql0a6-55=G?RDx>I2wFgA7zfK?6YPdVa01T2MYsyL;0?TouP87& zro%#59;;v-Y>X|iEq27N*dHh1GTe!0@E$(Gm-v&yQ+!HJ=_nKBqykioN>NR!ORcFV z4W)53l@`$o+Dd!qARVJibdR3VN0$F`zHvASr{WBpjdOD`uE@3irhK^#cjaE(pNH@$ zp1{+1HZSLmyo(R;F+RoT_;+Pz0T)%ezi~!9=ji<Q&iWbdF$U)xySuySW(_dWEyNCl zvActHi46-`!IiWV3A+^#F^0zO{vAK>c)h<f<LvGK|6Y)G`o#Ob&+~kr0x=~aVOMfQ z!sICt5mTlnL?p}TT|3$KyD3w{>32IKcF7>xVx-u<@jKSimNjMV-!w#Oh^*es;|^-9 zk<ypf`Y??(LrQd0J|`|S{kpUH*tcGC7;Cjh>pHk8%vut?Q^xQnS`cg~4_hs%)JO|T zWdkkT;r}jZ4|h)&sA~M+f=(R=yOMlg^R(+dxibcerD@qG6Spsp+$6CkjI4H>*KFQq zs3N%gjL4t1&zG?Yw&SAaZJ28^^q4qen54t8Sj>6<Y-Gh8C>?9FeQVmI9zzYO0){?B zC)~SQ!oF%pCN_Rrj;(gec8u<S#pIoZ4y-N)$U5=%iR_z&!P$dCr!J11Cr3Z$&?ASL z_$4fi%jJJfO4^*Zw#K34spG~?pByr7`fuqg$Z+o!ojaBmeMPKQnvd1uWxJ;P|1w27 zKWm00#Qtv{`=|fTV*mZ}Y)|K)uyMiiqEkXr+;2N1_^_Q`4e=!N65f?_dy~^sPZ+KZ zKiX^1;8A_0<)=0ZnaN2<4km|(hR&Qhd8Wi#uo_&jptD2D?a*>{!>NhRTx-4?bLK$2 zn0e^J*>4U8PM*1F_B?rG1&6JUu)#beMkgkw88XLZ_;`nm4_GT@^U3ks_hoFK6D~p7 zRW30;eP^cO^q76#{v*Hkl~&|L343=WWTYgTrcRv|5iwVSzI>OST}!w=JgVCbCSWH4 zTeAf28PB@lKJG!{`J2xSSf>q@9!M<8R(jBpe|SEqXHWlOZDrDfq0wiO5j@8mkJ$~n zDDp})ZHk>NotxrIZXn-?z3i%V=2W~1F~8}-?jYxJVp!OWndC$crw7YE;9@*zW(RQ= zRVP?nJ_f?~iKf(FHvJGABW+l<ZskftXv9eOwe<9^b2Y{oW3-YtPt}G=vGIv1hU}1Z zU*C`k!zahjOj;^|n2(L=wnnqYoK94qzDvCIxdi-Kz*xnPYfanpb2f%V%Vs?OWbxzJ z&w>vBLj2?_n{qCi4Op$?P1QQou|KQUBPZbUeCieMJ$s0cYD;=Vwj^x#s2I7&0q6T| zrIKM5jh)16r;k=toF3!hK6p&mu7i)}(Iv34Wu(}~Gq>o*mE0#!t^^Gn;1$$b)+tv9 z7~yk{CGU?MOZmU#SZHMP1ZA9le|CA;dHKdTmxHuZ$*r0*XV&;p2imEw9zDBLj*3~g zJ}R!p`nhYPOa>+eus^YyJw|8c%~w19YHlg(kF}gvW4_q_tE&$moxl3v!3FQOt$n=O z(bi8no~QlPhyyVYlL#HqpA^ErMzJH^yBk?o9#?#GskhhIZvq1ketqe{uB7-M<@GDq ztyyIVoE9=>a^%+J71BsPDEiR&lg`k=Qr=8yOHX-YOWO`gxmxO4L$#GE4ixRZxb<ju zg#oK~DPj$nNPNpbuOY$Ny#8Wtv9tNySXb9k!&}I~1J3i*KYDD;px*w&yR`8+`CzSD zJuBbufz7eS{bB?%p1t?a_WxPZVUF_ZZ;<lB%p;@F$44cldUIp2H4LVQ;-ih;xFIS^ zW-Z-E32>d5x65vz$*d{2GP%oD+4@|+fwvfOe}sQ6Uaj+yw((`y`UY!_Cafd;L;tEy ze8cMI9&3a;Y<qgzHP+N43cHf4djspjnp~aciERfrWMAfv=HOuUuo;QzX-SD0X-VN> z6J~}_kaaehZxm{*N*{F|wp3@$5sMvifTB@Kh*4~_X7G^qhQPEDIY*LqX6&6AKWX9o zRZEviYkpX_aid{R!tuQIw1xM;`dok!?2?Vn7Q;UA&-v?<0uVVXoxoXBRJK$Ip`|ix zoR=c@K)_;!<E~ix4!}HtnJpaWCFoQzT6-f{^Tleo7)YNeUPoGD2P3O*E$>w8bEk~K zt^%vGhc*?a<DG`@e#iA8NXPhw9E%);A^b4bkz*|eVJ*UNgfb0xoBp^5H5^71veA4l zcI2=*|92?}o13(h&>$PM?Tr;D;r71$S!t$SVX-oF-*6(x><st#zZ;N2?OW`ffFbD4 z6&GB-`o@6zuBEIQlRCC#b)`9FzX(sxoU5ohGotf=5yN~2OKb~U%()7>iCP&{{?|SV zE|b4<iczMY)cmqUKUpKp;5b<e;wUXxWwnQ-s^ukWBeiP%%igGm%!!2>sERtYJ=3#& z8zc~?8%Z-@4Y8gGqSFyV5*#2TLE#@rf&*qj7h$wF<_r~3i$<KwO1L*X`(0^-F?dq# zLoT*Baf%ZGp22KsA}Do~6Wm41yxz(ef~B721gR}LGcNv(p6&IURQLmtA9`0&m$t{y zX+fcK?)0GF2RS!%8`5a0T*9A@N#AwW`C9sT4;kheHIO?t8~N<9xv-b!h@kqryYmy~ zsnebM1W6&Sh2QjZRCJtd>BxNhDuK7@L6f0JH)X-kJFKa28LR{5rCLCqSr|V6pB1r| z=);3GBB)P`P?IIEu@#6IjDCg84}*KNVCFjreOa&o;<3%C_HOGv=FHR2tu@$Tqa|Aj z_Vj)uhR~R2qQHc;9DTSBZEk3j7x=35?EcF;C6C>gLW`YW6@DgHz=!ogT2QWa(!vTe z)c`<F#=%?}>>2c9)$M)I_I_v?SiSH++KyM6)V^a7agLeI!CAP;Y-!E2%XFkF=kK5! zhu<(aA{4V-JUA*5we8StSW&D6TdGl?Y6~=yZ9;}3<x3XV8wZ5*u#CBI$9ULgl%bDN z_o2IuO%BaHZew*C-`#rg@>)OUD1$jD5_8Pt`-ZTkrl}JRU<f)ulqncDHTf`9mT+)u z?QMNtA!c8vzSHBLxKW_<oqf6lxX7}ex2@`X3_xEybBK`#(cY2V#MY7g71u*;FAm^z zXfj(7z8@WcO+^ip&>O5ux(rmc?aG6b1N|ik8`Gv?0>b;4KrE%Jz^`mw$W1<XA?y6L zI-9zzn-)HQyaZ0=R?1GEjj~hznX&^ob4B5xBJBCe!Cfs*$z1F}M5rRbJj`c#l^+7T zu+uCbPpd5Rktt`wDx9(5o442jVzg8-e-vvSLE$Kf7ufH90-RZXMh}Y4MGLYw4+1lQ z)h?v6&q1Uy#2z)hq^6ld)iH!lUFn%f_lS)tB6A7W!lMG9_aJJ@RcC2>D$8{WQ`W<Z zGoLi6pG`8hEG7s{gPP!A9LYu^y$9!j6_#*G3)n)DwrF8md}KnT@}tU#BNw{Ua8MVY z=mP5E553a`P<UVX9t9F&um+{Gfm8|AI0o6n^Re|Ah*_<Lr|0*dr`;(R`Qz_%=@zoi zWx|RIBj}&tm!CduqPwIPKEw1bMqnA%LSX!Y0Y?_N=~SH%a9i}<L|>w{oOv$C2_Vvl zrNuzJ&FH9LCDu{e1{RR<IzbDxKG6RbK0-$lZsE9ET?A}pl@hJ7IqZQsdi0~x8LGe0 zfM}6i0ILXvV}rH8iXx0EnqtEJMS40hbyV-q#>Eb2p#jBH@YXfFbzM*U#mU-Aw1wUU z=t358ixV}3Q&+#$2?f~4>U094T&l+pxaf;UJ)A1W*kZU|iItU5NB}@kZQ=XqlhbQJ z|EpY~!2CTq*ku)Ui?y^7`W3-WV<oi;7c1Qzl~quvxuOiCFh0F@SPhV#d!S>^OQ1+V zoFlAK&SQPhP!oY8=o6Heph9z|tI(Vu%0L;6UsPplE}Vxv%_-%I;|C5*DklRp#F20W z-svsq&6V(Rg9v{GCZV+50096101N;C0000000IC601^Na00aOr05Jdr0d4_q00aV6 z0#yJ4cmbrC1#lck{zjkHBO2RsqHLJ{%*=du|6^umX2ybJX67(6qa2RuROdC6VRcrb zXl=`akwxASWXtcmx~5dwvgFYF>i4x82YRM^w6p*zuj2wr&v@1gUP0Ff-uj6TaS90m zjrAw6;^|L&#UF6S3t#+#Kj6<^_Tm@*0e@H2wiIcpNLLhTLhJkA`LPf22hsl``aeYf zkLXVYN<hn_rNP@M2k#)^4|o}uwY(<g+FIUJ`k&7JHD`3+(0!1W?gk0aN|{p#XUX5t z(()<S1^=X%1pk6R3jQ5`9sIk&OWjoxD8H!uKH6yoGa}7@S%XOGkUeH#ZHaa{kud5n z;;8>n{stYS;2>qUvlL|>f$PCvf)}s^4!YiTG_y=w@JB#Gf!o8lk>(MK^ZkQ(zRxMY zpqRzpa4*ZT_bL1z&)|8ygjewf-o|_Q5TD_5e1&iE1AfL?T)<^q!%g&X4;%O`+o{sR zv#mwHJo=BKKM?)r(Z3eGH~Qx&1;0DYOIEZyn*V$m?_I_}w}h9D{SXNp_rCH+IDx+b zQpc@%z)OOk=MK-J!$ZzGYAtA#Zr6E%btjx4b(`B*5h6ABI?mvzI0EKi1Dpq^%p5Vd z?g%M33{INU=05j9hy<*2h6^l%qvkQ)YQw4zxz0&&7D&v%8Hd~n9s+wDcN~IGfpv5D z$7gy8JmAAI-3`w9uzTDCbh^N50uGS4Kqvw4hvKScfOe-GwBJG6IRZD@<3VRhArReR z7d#Nk2)>?n8}?gw$oI#)Oz^$nf)%fWcosEhmpSkI!9J(m0nIpRKLzII5F(ayR2;Hu z#u2!VCxJDNiW59BQfpQmwBaGAJm3JSji70(ZgPUM^PzOcx?v7NIs+j(%^Ze;gd^!N zw_;rNyw2PoQL+w>#TngC>RP|yq&0^*#v8p6LUe+c@)txL0=j6znv*fz3idncCU-%k zixfhB+!_(jrnocKi@p`BZll1=Dh1wX&tmIF(6A3#i?cZx{RUDJa|K^Odl0l+kKW@I z-~dbDv^D4A6M8tV3;V1)M!Q4qF>{E3xmoe%HenvmW?|{~t$15&;AqeeM<9~KUSnVu z`{EAgf@VYH1bo<0GiO)=FY#=*IzS3^xj@NjZ*ek|UuPxwC9GkE=a{?O>+KJ!yF2JC zC%n$<A@<vBt+=+v;=JV?1s`M)*LpZ;*x<!H^|1_|=Q{fxr;A0r*M_}T90-07DOfQ# z^L_3Q+8bgAIBCUR2&@bx!)8QciaV^CJ6_zugT+11LsZ=td>sKFh;1%$DrndcU>-`h z7wgWb(`L=PyqVjY@4XW?%&Y_r)8@Q2N1Zi?;Ij}SV6}PeiKUBpmRGsSK1vkW@OpDE zx5r9+x;xCh)d~0bUI&7DLu>?V-tE;8NZjCF4^m(Q=rD7)2Oe4Gw7Dbha<h9$!3Bq$ zaU7cVp)peP<<<zdcyUbc0;>+W*3qKXD$10+%W*SeiDyyZ3=#XlUWb5YN@)iPthwUY zzvDRm80@nW&u?>_soW`A-OuC1nw5B60jI1x73U^1BXP(n8~(;go(yFuC<i?X&hl*j zl|SResFZ&rV8)-sFOLD>AHgZQ&G=hh<1`8X%|A6AFLi{|LV7aoQ3)rIlKK$1$$l>- z;v~n%?~Rinu$pr7T$;JAP>n@GE~mhpGNA;lG_P+*&L2y0EX^(2mY$=a%)@cDoi>Ps zh?{A`X>hdI<L8$gsmH1ns}Q2VYSR^AW`!bm#5;bA*Mr-wIO(YKA@&*GEN4ipIS@+j za4fdQ1uz2-QxNk7PH`$Jt)xMTbHM|SnAz)t-fE**pHlY{unx`GV<q-D03M2(cg$+s zm-2YGcAN94m^n$eb5M{31>6rLMLq@Rz=fDQ8YKcxv_<@~Uc)LnX(7ltx}dm^TOIal zA`a7D?C7)2*HVl!zw9V|j~FE{M#-B;v098W1~zD=33tTOMLa~S6U#jJ6#FHVoim66 z_cX7aP7!l1EH`Hk8LrEjs7V%aER?QqTHA}XiBjuHB+&I&UAM4?Gr)`|!IS8n&}A*I zBT4-BsD|iq&<RrWpsJG&n+5F%vFph1+TyA!4!F-s&}JSlU96<DX$D?J#D+PTH-DWu z;3m3(#6d6d9@o)k52<?{0ak-ER^4i!4R@0Gpi>mM-Er4}*8yut!Ff7dpwrF#F_3zY zGHZee(X=L6vE~Kf1!k<E_}+2|tPt^cz$#YR2;PMAB#wc@B>Xjh#UIegAF_gzoadOJ zQ$56~6qs{5I1T&-c!y_`0*PzA-uHP4_+D^_qreH^{h`g(UJc#}q1Af(n%<vgnpe>S zk8y7vb{gDE!qIv1|BJO-cM@X!$e($!Lm?e6_L>5B1r3LoGzSt2ti}25iTmM7+RR8p zJUXS8tt7DeO{?EUiIv4(S110qaO7_Zjyd7NV&Ai3-y2r<P$B^roF!oW_e_)nuq53X zhM%u{re}KQ_Do;fzH56ch1jLog*bn>wpm!)wrv*kBetECW4-l-_3XX(t!ka~p66RX zb0ceCv@h9WTW=c(2(8n)z<O+uz=qi{@)%9_Y5R<Q&hMOMb8V3=v1PWxR@rJ>W7}<q z?X+FC+xFN#J77ocn4Pur7(vh*^r7d;5>rD1jWp9j8%tQhN>;I&HLPVF>)F6|cCeFO z>}C&p*+)Q3hJu@$kfTgWOf~HknaTTT;Dcf^AK^1h;j`j3%;F%gB_N@LPN16^1RUZp ztsLc;o;|@yT{+DeT|38ldb!9Y`nkeY2D#1+hH;DAjNmRmV-&xzHr`1<g*tcv)WYWo z)x>NvYGN*VQyawUV;L3dWCe+OSwl&UuBXyA+cB!t$65O9yjtnU2<$KRSO5Dr`#WZx z6v+?(5e8%l1!VARegz-|WfS=QCDXYO_?iN(>5D`<p)Zm1m1VTDMPzM>)@Qyx^YxkO z#0Yd|dk9UZMd<6x`1<r-s{Fk<e{as;8~S_mHp^xa`P;Mp_Slx%QZlyOmXq<f2e#5y zlJO2A|5DDsWVYA#64`#+Pvl=Uw<Jpd1o(O|zhVRoBkR{95t0)H^1_I5FGQ9K5s~12 zh&(B7i6~Gbiqul4TrVnU5DAT<M3X4fEK*uTC9R^0HX+MIja+&i#_M@AA#dSr6nH!D z!g#m*%esGM`S&p*KF%k|@kx>AQ+$Tljf|PaA_^=P#u8D>QkGM}3f7Rw{SB1Z$TrGs zXBU<1W*^n;=O8r%%poHTZ-Igceb1dFln8vEq3<yCy=8oFS>Idad&~LW^1in&-&^c^ zE6^c|bc&QNQKW}H<$eaJU{E9s6N8Kt!x+VAdKe>8#)=-siInkThzX*GiK3QCqK?U; zfhnSqsiKK#qM7NUjv1nbng8q8I}N?l$UE)i<04=diwV82jQ5rGz9R1{?|sGISAj#K z$YGIkgrmyGM9OhaD4!H5r#P*AMx>nOobq{*a)FD=mqf~Ct|(s>Dc88Jd_$z%<d*Vn zk#dK7%J+Fu`6a$W!q>zwzRnLA<VRu{KNdawgkLEClHV%-jz5s{M=^{)@fY>>SA!Ze zGx{vBEVUL{nL10YnntU!8k()vbiyW->#bh7!5Wkstx>tjnv{idi?z|>(_3jT*bDUf z3|IOLxB2vzY_`p&>@!^LGu&Z|Z7~Br$=yE5-9E$J|M&k`yKT0ulx>@Bqu!^w(&x3x zr@G`*U9y9Akg^@JL-gBWJFI-fjwoxUb?0$APOHy+H36@3^Afs6Oph>nML?g3-NKAp z7%@y_87?A5h@2almx*JE-NMK%EVzY5x3I!3Ox(hfTUd4rQ@60>7DjGir5lsDD~Vf@ zxF3m|k+>6y+mN^ii5rk`R|do~;4#J%5%W}pJQD%WWk&2~L~`OgWcjX$_#Qt{{-KEE z$dAeK6OreqBIIWx&o4xt-^r5LEh)Gq#eZ^8AGQ%fK^O)(Rw7+aFX$4`n5%X@4x=q$ z{%@`1VkJ8(*;~ocN)A@iS;@glIx9I?NoOSoE9tD{+_cS?@3Q(C8{cB*TkQRb)`v)( z!iPvcM6k(h3Y#07O6BN71eKsNQ+ZJ7s646kR0b+nDkGIAmC0{d6~EE?UhA#O6SGix zA{Q!8{6gi4VyHZ^43#IMq4LBvRG#RD$`j*Ic~W_>EY0`d-L-zy`i*5({88&im50iY z{APX+avixRxq;kB?n!PW_arxxdy*T;J;_b_KI!|T@83$x0ylObh=SE^T4p9`&yw@} z@Oc6U4gIHH<}R6WJTARy*^9j}w^w^*A=j(n`X;H{@_Qn`C-Qq@@>@=K<aA3;r{VOw zy|WCnKkbvHJWeCE&F;BVMpuChVw~nAKtU8GDx|QUTmUrKtwfY{&pZIvWF(rjZ>tJT zMru<M<~VcV%t>{p`PLrSJf~nxi82+c)R<y_6PTzgS<z?{+5lKg9lA{DDQ|~N7?B*s z*UXQzb9}6Mx<dwMuiRxG<ZFsxe1vjP4QfJP;numZi!=gg(>y|pwvGjC%8n4n>8zR2 z4JJqE2SX-1(@2;`;)XMjSE-CjWl>ocnG)0GQZ9=US(M14L>8G+vZ9o98CA%rR7Pbo z%H)zMC0+UGGAdItmgH5A*>}88p{JXk>w1dm&dK)Obd~=CvRVKncmXWT1D2Zs07c<1 zW0x^&+m166tL9(Z_HozMh1GpJyiW)-q3+~+BjsvyXyIY-^0B%x`1w;D<7O-qm9oZ0 z+w6A0QKytGX&X4_vg_`6=$Y3(h!`yuhB@t4r<wDu-)ZH1|Nj;;Vb*dnX=`n=-5v)W zlUGsKF?8M)H{A8eb8me7%O#AMG-rj?;xg9RY=^xLIj*3pq3g5@uDa=-$6k2r(|>Z* zlzA(KC1kC)#ZLPic0y52Q_mR}U31HQPrUTb=l|rGX$w|~NXpq@t6lax;-r#AEq!NQ z61eSwr(SvQi?2cO@a5>p-<|nIDLn?rk%R#luAQomZQHhO+qN^FiEZ1qZTn)|*4@Q+ zzIp$zs=J@E8{=RSOw+ctr@hXCxv&5h!!qscj_$e=*1&q$1Y31*w{ELDpc8xJP#oXQ z(YBkOiSu!(-Phf%SK~(9j(hR2!`;rVPv8Z-fe-M7QyS^F_!)l&G&YRnk-eB07!Q+R zD$L;NZ0}&QVIC}mC9s^wlPkBWg0-*#Hp4bz9@7c!=*8YRP|RzF<5--GGjYC{&n(5& zxDmJGUNOHpj3@9MUcp;p0rLQ#;s5v^zlsIT?|_!UC>RS9h=r_Vm<BUp4$LPOwu)dW ztbo<9j>nTbm(>VcU_0!BPBFLT$G$iiN8)%fk2Mu%<3e1HYsI|QX55MU@hG11_}X}^ z3wRCh;3ItD@i{%#Yy61c14d97!7KkjglHHC6JZKWr<AhE7Zh5|7c)d7g`ifERTLF9 z9H}6s(WVe1hM-MFQ_;f^2dNYx8Y@Jt;52qIw&{dzuo*VMCSn{@4{Km0EQ1xqxTX{q z!F-ql^N8_GHq3yjFbSp*<C{bn2cuyGj3Op5CZPU}U-3PD78B~X_%A-ed-zC9r0?K0 zynv_hoS0ajz{9u~x8rUxiQbCqaV0Ls<ziC35NG359FLR5WO^(P$AQ=z`-{nSPjq89 z>=2N<Fd-TtL}LVN8dX8nPz_Wo)kV2gZ#7trR+H6iwOFlHe>*1!U`cZ*3ZL)x-{WV_ zvu(e%ZQHhO+qUi9v29yx+t#hAti9Eh^PQZeZmMtc57bCa)J!eZ^LkzH>vMfi4-(0w zfC?JuU=2243w98au-S?^iR~wxMlUk`e0Su~AS6LoU`JqEU`t?AVAxMxs8GXd!L8@# zMUr5Tu;-A#g93*J4i6j|I681_;P}9afs+HL22Ky088|y|Zs7c%=aCbCr%2AKzzSJZ z=W7@1azxx`1;3ibBv1095)tJINrfRxj}kpg4;lXE?{bwZv9C48^-~RWeP53XfB8qa zzU)cN`LXas!bj1{<Z~ad|0WqMuMm>rmB|A>-d0H5zbMp8D6;K+y%|5jUu$1kY`SVV ziA%VY%eb5?xRR^5nrpb0>$sj9xQBbWkNYjjk}btjEzQy`!!j+)vaP@6Sgz$+zBOBm zwOX6CTZeU8mvsyOR*;apON0aAXPSfw|Avs`=hf)vEbi_yA<@I#MM9#dyPK3L(M$Ng zVu{}F&QqO4A9tsyQ=+fCqqL4hKj99!{_vU1*Egk5i4=L2D%aI?sKU*WK^FbVWlc6= zd-mec(2>9C2ahm?`Ala9GnvI~<}jB9EadI~(W#SEtc|plcF=CxM+f=+AE#4vmM+k3 zdPbA=ygsE5MRc(qyKof8aT2F-7UyvhmvId@a0_=SMxlyTBGY}k-}ON~<obvnb$wh< zxIU$)U7yu+t^+m5b%=(#4%Z0vVGJ*`i0RbP$vSM#PVDRHSYBZ<GpMJFb=iWQ+0WB) zyvh=0(m*%su_e2(zo+AQjit<@kyTiqt=N?VJe|PnEMqoJtjY##&2Aj%=|tXOIdf=c zH8x}$cIO~ZC-EjLm`e+*vk}{}2M4P!lX;8hnMW(ttii@?$DSOb_%HXRK1}5uUSt97 zti`76z}_6@=``NuB^J`b+HA&-?8D)LVnK<ZR8S@;7gPu;WwcQxs1el4c#q3m=kbED zY?=BfT`1B~GENlk-Ux0Be`UtEiYTNAAHr8J)MfgfNC-6u;d>EEmdPllN}`5Z^%8<J zh2TB;8jE;d;zeHaHJ>w`c@qA@e2yoPii9&w%}$i+KF*0=U!2axf;+fdiTq#*O0`OB zRIyMW73p3*pojICp7gghK!Y_*2vrKjwJPakl1+|~DM5!gQHD@os%ZVC`%GpY&-0c{ zP)w~P1P{w()X^%@PKSC4ZK}vCrFoS~HEUI`8M;C^>sM7z<aEy9EY9W}&gDGL=K?O| zA};0*?&L1+=3)F~7O|KmEM*zXS%G(nxA?(im|4ssi(3!tX}zqs^|8Lz&l0=?RaR{^ zR%>-uZw=lLRQzY%pqLU$DWjYUDygCxzai?Vr-4SAXr_f${NHgV&kLE7)!>Z$m*y3l Te*_sPbie=r00001000009&tqA diff --git a/app/fonts/AeonikFono-Regular.woff2 b/app/fonts/AeonikFono-Regular.woff2 deleted file mode 100644 index 3c27b1537c7fc6aa0820d2d60faccd6ebe2ef021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36260 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 diff --git a/app/fonts/AeonikMono-Regular.woff b/app/fonts/AeonikMono-Regular.woff deleted file mode 100644 index 3930fb4fe8e3e35dd511a99468ff03220f29ea33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33308 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 ggwniG@#VQ>CB?a; znDY!MI16>kAYFx+Nej3pj*w&G=*+)-;BtusVieE_Whtc{y2M3vyVQFaw<-GK?Jxx; z+#_zwc}L@y^bdy5?e1z_;zJ-@>R&m!6noIN8T)bw5|GY>p`Xr)@2(#kLNp#DUKPC5 zJ_Wtt#@FrVQBiP~R1b8|Ebo9HnW1aX4-e{>C`VAwk`HLlR1fm!%SQ!^%tr)E%|}0$ zoR!&g;%W9p)WGM&S{<0HqGXlj_2R4!Wz+~Yi&r`@*hgKrgkZN~y!O{CX!C|2&f+kO zBs`dLLeq=xJh*XUHH#WO*t24E7r1&TzHxo|vqCtFOg&h2LfQcwX?wXApgXZ;2mFrZ zx02y^!Y%lO65e;pk7NRI2z$wA%sx1|gXRn1J_P*Xj78P2C<glweQ`TuoC}w)7`yxO zK7{&1hzp#r%t2phzR~%`w|BCS)j~f%6yLn)y&s}{v|p-xq+hW9&8$oQBM(dd#k+U; z9!42jt{2AR7D&}{OOe+_=c88haK@CD5{+GK$!pwM+BLv4B+qa&G%E>asNGV{(aXi$ zBeP36#<7+RjZ<vxTBuo)S1>cQD`6+7-gzgO))KH0`o-X*ItwDkbBja9wwB0^m=?;7 zCoLIkt~z=({Pe`nDD>1TacL;ti4+m8C6UJU^JI+(Y}!|*StKi&Wl`Hjmd3efw#M~~ zo1^cGydyj1?om%=?vcH+w-}cax5(bXJG3j|JCx4^y#_UuzCu^*?*&?z?+I(Xk4BAt zkI0RPXT`>#7M3YS{!&v>@FmA10%gae5KAz|`HNA;!4~9=iWa7g#4S;4<}FogN;>ja z&N})wShd8@;I-5oK`SU9Q7ag@3YQVS(wC93B~PP$W$+^ui($rsOA^K=7AB3i7O0KT zEtPAEEtzX*8+uoq8zMG1w$#s%w&WbaZ5SWXZOGXQn^9lVn~^gm*Q4KM_#-FtamGIj z3dYTr=8gWAn2p*k)oX$+*=ryh{4((b#t)WrRQO(zGsV5d0RqO=mb+A#?~%0yU&U8g zL~R)eF)T(2YcxDulaa*6Q|I$kxM7jCCBwydSj25<aWVIXDQgluJTwu^#@T0Djr1;h zYIujEZ41!K(sF2<GL+)v4Rkyq{i7H2{v)$lp+m;bmdK99;-eUg#s}DErh3AvJp}CI zxXPkE*sTM)%D6rFts}h3sLd|4BmL#xqy7bokv~#%kw3rFnwz+8WfYKg70aVei<d@L z=Fbm0&*2(fUCKOuy%(>Uy(fDpH;4HAnah)cEr#-@rl;vkz>tJ~Hr7$`L6#RH@y3)# zArxC0@m~5MM=Lf}o}JcQ#5o{bEISajII3Sj#+vbqjvLf^{&0aYYgSy~&X^LAZI31_ z>mE^D1U-QKw=N~mQ4c83mJTG(wD0)MBEiZ37E2%SS~%auTgtYW`b%sUqkdR-iHV@- z(-d;)QxuZvGY|*X4am5`=#vv?)}<*0)g>xL)ukp#Dekj<2sD=v6++Dr5ev?c7ZS~o z79!2ie$&#^6f)6M6BG8ziU8|K1}!ig_%9M1{4C}j{LIT92xgbs4Qezi<q@PQ#StVc zWfG(-#pWd`h32Ix<>n<TrRJq81^-G{O8XA>Uq_!=yh&9`z8Us&qi^24m#z?nm8y^} zH%!ai6*V_O_(0}ClwDgsSD`amE!QPaVeY044w1B!fJU5`Lm?>3B<GWAmZFkxmhp%% zO9n)|A+8TRcU!uFc5nO~HrXiuHy1Jk3jQ&I;}D8U1cnC!BF6(x`_DMoAZP#<5FF@0 z$+^w{4c-3hWnQpup*Ry_G)lzF<7_w7&;B;5hE>t)JX!3P&`O!X#>5m<!eyBSHv0N_ zd{+_vDj)Lx^hZ4SnZntf9a+smx;xB|K@*hTqT)pX8lIIfB?LuADMUtIK*o$rL^)4{ z_f!TeRRV5ZK&xFq-d?~IWx_#ahMZ~u)@>k!bi~7S1bw-KAq3zLf{8MN6f-lRGGVi_ zQa&_eO*Oz=HZ$us;&(S8LOSx5J2GH8g0DJKzC3_2K2Y2~koN=HGsPR$(l(rQg=y_u zYbskC2{=Y1HeGaWtZlpTo0{E5?bcyGh^b13XtNHe5*MkOohk!ls*^4%0(B~jyQ<3} zEHWsp!qO~KIV`%}E(_u=a~LkV^3GZXF1r1=`C}wsJn}|Vy(Q)jLwi#+AH8-)biFWd zFG+ox7@t%7wqM>I1+Ou`+5{glzjuC6!4QE&fS7=QmU{l*@9TGZ148;00vJGoMG=Ad z1GG-eh!zf`go-0#eFh$E2qzcH-GHSr1hIw?zDK4PaOr@UHw5{L;IG8QK`{uI0XbzX zZxfZ<0EsXv%|*Dnr@$A>383~HV)~SnaHOU-E$dOsvQmM)kPx+`p)ZbY36EQn_YyU- z!OK;3M3|i$?LbREwbDz^cCfw~;r9eWJayztJp~y5n%jIu%0HO$$<7B@e-9anpr{|n z!c0(cmnNhnR;d_lNONKnk^U~4PIzmQTbaaIryoDg(M#pM*ZMUf37tTQqaa;uVIyB+ z$rg<<pQIy>Yawe}%kPp9x18A}w|XJKU)=s!>bJ6sF|lQ=Yc=(|vo<5O^+IDVONaN; z%Gahsz9qBmZ`&F$uleeAqi+k)$Nt_8Gk+lEi%Z_}g9ml}S!+*WJK%X|=HnfS@H*M2 zj1h3$H`x9mAb4T^*|d8f{ynrS`K_q#YTFrQJ;<2hf5y(}Zp=7P`4zD=!F@^^9OJ4Z zML>-Aepz2R6yfK%T!-H({Q9yhv0Ap`_5Hr=sxEG_@HrNry^HM8Wa$TazA@1&C!5G^ zt)i<%YQI$a$BOavb7o|nbuMM<!m0S!F;ADVNe-t!z}j&Z%`cKimP%Gbw`l{^gCGQC zs%{`Sj$aS<g(-y3%g3q=SKtDKpz(xs#b*olN#?YPgC+{{upH}+x~zcB8{ynDA*{HR z`j=q^=H>?4&~hn8tAFgkDzO8bALzL}g>z}E2WnOyfBfbM+1<?2me(Sh_Tdq}RsZFx z-{ASK<GZ^;<^lf6cK`yR$T4Cls`neQ=Hi5mdVbI;DqnsgpmQ@iAT}J=f`kdg|C}_G zF{R|PFSlnDV#E~Wq=0i+xbj|&eqL6AQ*jey`^be;HvmQgUN#WRBB+-_I_x2I5FoNk z=$8V{JIw8rCqbfV42zO<r9s8rd}IS|9Hn%MzpahguMex~f)V}?M5;81Qb#NML9YVX z=4@do$P|Z8sFyJ(-}Kfv`!ZM)WfLKeFQQ>Q+5VI^;Y}0oguX761gW*&+PeBjk>z=T zEoCfM^jw2C){*?>Q`)}OdzfX9zec)8NT+nZ_%*Um-Qk_W&?8kYi_*gTd&hO^$$H<( z$DryV#-o<PwI`}r+g6RGGZKoKm>3S)WT>JwL3U>-mL1D!(wmpdkf`4^=|0y5<9G41 z8jUNNQ-(nHz$2uYl)4RnhO#Z{vmA6YD1wZMaE1x79&ReRA<lx%f(#V%3RC}z)8RQG z(qbOlrDK?#&9&EIjTbPiQ`=EuP{O0fmXn+Fj57ChDK)v<HEwiYW68qvC9cg*y#CX+ z^lrp0xm&P!amTd?^dYkg{gx{QO{d$lMpm@CrLt{h^c9B|?|zA;3>d8X1`0`XF6xT! zY3-v6BrlkaVs|ZD!QxSRSksk-GHtD?rFL<B2u%WwDa=ekA4(9xe$;J=D#tkH+yowi za^9#+#%IsHN5IUChIvF<@N$!z+hNEA6(f|Y2uw#L(0PW2oD`JkPyiE2OJXvH2lb%+ zJ7RxlW@n?RGq~_)V8ly1vE0yd$V{|HexX`v9Fqh2V9bRkr|bE@xeFu!azM#58J%~& zKF)v;D3f)Dv6^gFtVDCjK&V_;2(ppfZVJYW$c~JbA|DQtL<qByh=nMC8&@tophZ63 z=~8yT9m(7|4{@sD*S99DJ{NV5%btz~dc@jw4u23!e=k~Bos^okb-mj=7;2zl=SH<& zP+RCA<BVa8r0tjRZI^qmjOj*L(IncBjuAw7Tj*p6$I7spS#iugrS{EdWl~=ywB)T= zL++pKo+<{}{Zw||{T>t^&Fol*S%M4vf{#BVOWDqWJ+pj|TLf^&)J9uo$7ST#T)!|B zEXL#tLc5qY5BBuW4ey4-5QOz~`{5^=nT-|^{(71%z!Q_pL9q@+1iVpNZn<7AN}gL4 zx1_yo5Lk`}EC)3_Dnu6T3?3jAdx}{LWhja5aLEHtH1UG!jDrqAaT1H)aS>R1Q_2%( zuE+72N&T&JwsWVXyT7<3TwfKePoj#fJ9)mgq^#Fy<LKnoHz?IH=(P)~s$OkMvSWO> z{8=(Y<Pi$^ho1ZUPXBNIH$%MHR!iI+X0ypbaCl?SME1oGC;fvsT)C^Bu+qW;I%B~) zJk4G`L+~)<!!Bs!qdU0LW_zu~J2~4Rd+q5xBj9+2(rH|mXnoDo!F|)^y|>drC{Uz$ z;`|}g*JXd%{lV;)lz+_m2KpW8f8HO?QYc}8(iO&R<fcWS5w5?l^a=t2g(74ug_udq zix$Y@@34)OC9Hb}w{6616B_J*@@o(=Cd`qEm|`>~1N^~+6)#HF5&dSI)B~k{Pv0lT z{*Lyaf4WkOh*GAml4GwVU@ztPo7lA|lqH;Pfq7kA>=MPWXxb(1evZs<eh`5dp6p1Y zFc;bhvby)a6{G9SNifswL4Ui4>XXF?@bw!a6emv`Nq<Z-h?1eEW=t(D`<q_2sInoW zcuqU~yGAapvPmdyif5hf<G3RywfbJ^*QEDbov?bbm5qEEHhVnADvOT#r6sCu<+Wdu z8pgbG&NlAum%Z7^<yMoedw=B>3vUPSh$!wB@gifC>OtL;VPQ}=K2AFP2tO_-UJw}? zN3^PYce3-+us_DEx7ms78~>bdc>HnlEB$BsC-FB}{@^J9{1dy7ine+_CkGupHwO<t zIn^f3;r#Lh({+J4Qbu3FsSwO#fo5;ZzyV5ObmGtfYNpil&;m-njJiJo<5W5pfo<!W zmu*k?YxlqbZ$&T`?zc;}%rIF)BfTWuC}-?Sn7nKWQ`SJDQQw?})P@(6!O(~@i33z# z`njvu=!~^ZmSqUkeX$YAmZ@~OXy*FlxB(a?WBo$(3MQwk`tdHyKAZ+^!6Bo?0GJ$B zID`|~xa02vFqzj-xHBqk{J8sV!2(bo7sZm%mNjb<ZYdqT@ULl=v=wDR(Agrll-r@q zn?c+D?1rsWD=sJBru+Qv*wSM&RH*BgkdF^wRXYZOC9@6;rCW|wN{=>6$#K6~<JszJ z4$80)GBPpp3=6!k@VnENo1z|%l|2=^<O+IPIx5C!YAEQ)NceR<EM1C0Ipv?^Q6t-w z&bGFShPqk2UORo4X&vcHi=0_eOFuhpZ9O{+3q27jDL;`)Fp$0w2{V#QF$su}Z;Ywh zY~fe}fkI?v-jezbUi2CKQt?}Rp5IpH-fiz`jGPL-?hKaUoF3mraK6IIUb-RcS9F?^ zxQBy9_=YEqTg91U&7IK5$am0*%y;F^?lOTjw}D{*gkliq*EvLoKaR>cQ%e<J{&K_E z5(S#QyLmn-_CLUxJ1guZ?~{-8(X)4~cJoN2o^q;SvVmK{ot@_JX;0)+X?5`WPo<Ta z?B>5UQhxg-R1k@E`^AxjMCI}6Rn}hI>?rlxn8^89bv+(`>w7<Acfnp<M6(D+2pC%Z z)^)F8^j+nmbeJF;uQJtu-qG%Lx<3j-Z}+~O`vDARIXjmahSw`xzrI$8!JTK!#rt|5 zl<a%?Y1c-Q;P3pL?M1Rd;{({u=F+zF{fsj(3A+YM@QD>VucHxQ&^(cIA4f*nIyBJg z4yDFY_2o&iYYicNB7GHb{~R?iQx_Ky@ite{@RD<IP`ehF%<$$U>i)L)rQ754wgCvJ zhzaSjr9hHsX>s6k<K$j4Jqa2Dt7neQ(dfGv9JbRVsfpEa;h^Qgq~?)acg1+;)xEt< zOluNax<jHtJRDk-;|ZA@4){!F5(gUu52q<2t*#(XcUa@n8sftOIAPP7RVp)><ur*8 z$h^4&vp=R3dT3bB!QWbtLHgk5&W&#sR6aZxQL@Hwi{8#3;V!_=o02y^N=PDsV)4d? zN1x3YB6uhEWZG-5nT}rfW>~5J+(B9ATYO^yP|k7=bHZIvx4GfI;lmHj;IM;-skEGa zG|Bhe*q)N4u?P1<9)>4Eb2Jf(p_AHv)|)5ktIVs8b=3fPZ-*yQ@2nIZrj@W`rc+!j z3o2&t3L%POzK(eH@d6i<XRCR8Pvk8Q4$Dw^W&)5wOXo<`h|ck$=2dsk*vah`IssuU zhR}8+iD`yvmwvVgHXu4z)b&?~LItZ@zS`JT*qj=>s3KNj0#73|SKUV=^Jt1_YcnHE z8f|#k5P}!Q@HV_W%v^!X3aEr_!4G*Hg4M`X_(KQI(Q_xqX*n~paIlI}aOo|9MQyn= z0<HYyZ^^dMC>99RAYY0hQ#10Ivyg1``Z!1(C>BOPE;&_LBsrL$9$VjCgov)bbnxTt zU`Rt^&<<JG)C_70&1%A=9#qbc9Qtqj`(v^<vMaWa_f<O%l~qiPhXF0#r*(`1tRACv z`lzW+8##6`#$O04A#J$8yCWuY?Beypl5sl?*``Y?85KmqnjaV8lSA$_G}*Id7-9Hn zds6xD-kyCDvqQ0xqvKn9d@zPN+@1t)%-!cdA$@~yc{yo|5ItBbjVaIdn4m#@4Dx?9 zOYh%xzf5-zXen&F)a_bC-Y!9Z1rQKMWo`4RUBR9)x234H%LLR{IbvS0c_4#562;Fd z+z+guh1vPl9!cChC&kD2icfU6ztJL_ty5e~*~D)5OFOT(5{7_fYEbBmV?8+%0Phs1 zba){1x(q4aZAN=6PHJLAzK79!dnWg-Gz<S-wbP~-;qTK4*Xu<vcZYP}uc+H&_#z}? zlkiNJQ>B`s?ME8C7>R{P@M4tqlEdZaw$NXVv3cmykm@Jz_kmTw<ji0=^7yn0xx7>b zB;!XZ?H*J7<*V4ttYR&{Bidu5l^-V4GcJXsBd7MTv4Lbz>Jfo$Sd;Oi`)zk<B#X%E z4=8|l*5aCwZD5rM0X8=R$I#m|T$S&9qJTT{nG7DRr@7C8Zd>9j3k-c?KGE^`ZDMFH zDg$$2wPdw%2^5cbW48P8Ivh)(W8Z#-c+9Ry-kI*V*AhuGd(z-@>t0fhBuXYp{I5m; z-CM3;j4m7EC*<)uD)kIlLFm{>=;z4~`TLhcAjQd$D(=Zffg|(HsZhPjpedd+HiX-0 z1k=)-w_2A=^z}x%bsfiwX*fd)Nr$NcO9Ba@Tqww|*l$g7_-CQX0D~%=2QPL&Jti!{ zCo^&bq;<vVLcl8BMG4MTPHX%s1iEV|KidI7@Mp-9r~@*r50ie-*T>lT5^`!70?!&a z)DTh&Qf<=Zv)F~8<~lurpN8J>)J`!*&sq<=5)0J9KK?xquOu<rv3{Nvt0iG+qq=UA z(CVn{RGpAUozv5&J7M)FlwWCCHI`BRa=sqhKmgN5`C@}e=C8u(p@-D1SDAoGKaZKM z^1f{D#f6>LBn<)zM8@e)z+jjVGM7s6#x7wn6;$fcE=UWECN+Af8WdMsayW1I?S)OR z$9~$c()eM^f@a)*+Xm`$rY3b`k7CR2N#)8WU&Y)5j@0cbaf9&^J}MezwkV>=66)tZ zbj^Oe&=y>Gw*unq{RrjJu%$g!Sga!LO|Nea7ouC?a0?WH#gi!-kjYUZ$lA!G+IBk! zT??=kkL%<&Jy+X)A$W-Jt|yb*UKq{~Z8ckmcBgvTW_z=LbQP}1D+eCTexmgLCA=TI z+pYHBv*jR_Xb47N?9emC_+ue21BWoEv%hiJwpM4pA)183v^;sL!@FM|9fU5c1U!DA z?|y%04;}>*F<4ZZRE|I^Gb?!tR_zZ~R{@vVJZr9)?Yoguqeb0Ot{RWR`R{c-(xjSH z*y~GGi7&&bxM^!>6)iAm0sVnI27ML4`ej>?IB!Fj_k+UZjtN!Y{!!DwFe{>v!4EV2 zt8IDzfGF+k)&EAl6}Fpp?TztHDOdg`pW%V`#y{^XtM#3wRJhHAG*hbfk91Y)H7_!) zUG02o*W1eQRpg=~d#dUzAbl##!+V>lZ|K+x5<~T}*x>#Z+29V;HAKZmrP!z|Ax<+~ z+L9Du=f9n_6wAWkCv4Wl$}l|>rm5FrY>i}_klGT(Csdk3_(ams*MUhVs)DX3c-Aae zl6#q8o(C*4#5vHe$d92nCpeq}uSj@}2-o31W(e*<)-@-Qov;uRiyboXV2}SmbIB;A zaY@XE9v&Gv!R8RPYaEbua^{e{gf|{R-y?a#DI`lyL^p)+#pMUF9!)rKc;d_^n@9DC z{Gwnq!pDNd{8Q}^?FoOGxJt`PK;6Ngwx>{wL@~h6gnVLB8sy!WB{!sKEdR-~67<o) zu~iS>z_2ndv4-Ry6nn_IM{M)YyN&~jU!6a>_=55SkeMJZ)b5w&$^6Oy?yumVD1ONO zHM>Lg`!9Fduauu|`-lgEcanGJud1Km-!T4>!2r%z>reXcUq3<VhxvCZpS0ijKVh1C zf&hb1%>ADOau4ReK{)etE};7~uV9Y>&ua)gBJ4eIG7j9+p&J0z3Y5t~+C54DYX!8e zA=WSLTmzwU2UeFr0})dT1pPvB8*QZld4P09$aNv;7SNOtvRts|Jck>U=5VYMFz?{g zns!~_WdrW>z|9)#^We@}`;h})P_QFa-KY^4h~(iPE{XC(kDLfp2b6!ovm?&zfI1hV zdD>R!gCj9RfOTPx4p_4hFayIeW+?3e&Q?%$ArD<xDHEhX*yY|KKv|E_>_DOerEFl% zQFSX`*OAw5IJW~7@z9Px=mQY26I6bOMKF4(gxqxq?SrW}#(Jl~7hb>j=3%|>`--)r z{>rgqu)ukDSJfB8xUc(a<pXLE4m?lj6*f4J8zv%%1?4+LgcWqVN1pUa(?4r}zxhci z+f4l7#KE}sxBiXv#~PNBcl#l24oSS#Snf`z()exj=WP-4A27T2ul5RPUes<XD_wKR z!2Cb(EQesuf6>|47rg?4c>*m68!$KE7h$Mr=r&OAAk~56J^F}16eY_FYBuOB#M(e{ zE(G&%-ofO3eSq|<z$fw@DTE59W$dG97%6K)>>u?b`Yd$#BG-ktGsj1YcWluHA`YnR zSlhuiqtgc1HCeo2_8zt!2*Oat0mOZKzBm40zDxf4-nRCp_GI@A_dxgTm#7z5VPuAd z;0#eba)M-(%<LKk4w8=~>px#d;`hwx#Wc$D6~F$fS@F9jbjkG=;x3V%$IEe)@hv5t z&&e5Uu*_-4#5SO>wOygP(R(NKj(#6#%^ux5x^`r4krM2q_rdL^5Dq9FaRSQUAV1B4 zk;w{6=A|+ia?rnw^&NXW<UmS&R1htrAC=zEWk0e$PTp@mn%~Ah>cJj`HU|<1>J2;h zUiY4qSk$Q0=vxF_C?1*gDEUZySU$-}Bv2Ar5}y+n63-KBmAN;_cm%rW-<2?qX`Dbi zv-!k-Q4=QC(^e&kVwcru*wNUh8qn0AXiQa`EQ?+^$Ict;K-$)}X?E9tErELJF&3=; zjXx8NeIBDZEV&zl%ZSq+<FgQ8_8;3A(-^<eYDsO1()O)6UqQHRd0H^LhIwZ4j`tn( zBa}QW>_BBCw8tbw&nFZ_>&NiV|C5A-Vr6V}VA-VNWOJ`aqgW+*A=4$+<>{pYk;_bX zSSHF9nnN(lX5Rns_w8iJPPo03cZ7fMn-You2n!Y%DB$1D`K<r?)1IX)-<tbhgZWQ? z+3Ot;JXV0H1>P2XxW_mRIVH+j1D8Em=YW+1fjQ*rfY}3)KWsonPZKanN~uzTVHNjY zlxab}5j<N6dB(30uymNyK}FF4Qx|->kKh5Z6K9W88Ot-~cUa=M{%TCY37a80GjW3B zT<<w1W5!+6T!L{fT$YIa8zWOxBl+-%;LVuUs@j-Wytf78S|ofa(S<En^mL*3k>_hn zg@v+uNT;#RhA4YXqmkZ*uzU2^rY3L5VZvdnb6RzPb<<@LZ)$f?cjrg0dBbU!ribDy z%}3g6-ka<@<a<206W9d=19%=pAApRHb#5;DesOD}8o<-TeLGTqXZlIhKkgq{LQ?&Q z(uaiRB4WWfZ;hBC>gAwaj+|ANBD98ba|+n0D2Fk9>gm3shdloe;=RE<at=WcCJmky ziVm(9ZXMPQvH%7(8a5_3>Km#p0YBas-dA-}HC<H#O(hMDY^WN#y8N;d=(44&_V&tz z3q-Cg=Bn0atAV78=(bM#^7WIFukh|XqH*F{<=U>tcSqEZraa&{p++fKDSbX={$^gi za9lJ${4VS~%rvYuv=*ux@0nGPbc?o!%17gM5a5rjfeem}N)jjb8F3Wt5?K?!h5SY> z!#l}I!%@Xx<@NWV;#%3fh(P=+UL)=~W{2>L<lO|$AjWsPDubQb+hlf}FX9br3XK-G z8uJoa7lW7FP5LTy?Y2?SkF{^N$7;XsDm5F?$9=Q^u6a1_AwD$Dz^%{vP2#fKV>naH zP*GdwtM}a<da9GXIh$jyllzOe``x>ilcPQ4mf^tR)$xe4_-roPpXdA6Z%i|Ol0CpS zU|e}2Vaqifp;ph`;-l&FNZ?JYjr)3rm8LWrC(!w?>QvfvE}ySL|EEG*N?g#V$N6oY zaiKQu%dKwn`CecvHS&IDrP2M64IUjFu6Ek2R)>@6_R!D}&mP%8%wp;Nz#Rv(vJnP2 zcv!{E?sC$42salF7K#7VXajUJ5bf0Mjk$Or9603dEnQ9c+KNXlFR0-b4^TEwQX5`z z`KNbe@=~<V$fV384oC=!T=QARPIa&)1=`Y}5QrFpWNRlVXkj~$o1Um6@y#PjRwF%T zC)rQ{bJ$iUi{jPNalY>yiNf25f4G~u`N_=m?5tn&iW%`jH^z*ihT<h*fr;}N_6Yy` z&*BlRIY~Oij82P7nCE_mA~+!Y8v-B_=TT)%_fS8LGGa56y|O<j&dS9!4;1fwqHVd> zZGF1qTgbbbF$zK8aR34J>s1if0vsK7AO03utOid+w&FVvG>$7wGlJY<Nmnkk?is}6 zMba2U*3K_E$?gTXmOQ<ctr5I*<lG3T7(isH)8D6B-pa{ZJYP(Z0oM4c{rvaFmqOkM zhm{rjmu!WkL@4FjYCFaHNbw(Fcfcy=j;!>W%YpJaASJ2iT0e63QVL41ZCD3k#AArc zz5_1(>I$U>ykTk>P?Re7=#fwL+9;Wrfv~!QJM!0s#ILWnRzt5hFydUFO7~tYke|Dp z*R7)?2v%0YtZ!%B605dErNwy!{z4Mqmv8gZaTH*a11B+1j$31#WXDSrh$F-A;1a|` z6TdLJcV=D!H}2&%?6D0C2pg@D`j9h}Bx4O3CbvZm)KBegNy6+$2pd&OVayGeFrs}- zzf!WroC})JrAwK;9Qf1J!U60<Buks$&MVn6--x(Qx`IPsne8{c$}L$VMLs{_ji4>E z1f^%N8${4KRSULm(Gs}hfVOcti`oWVThB}s<ecA-1_FZ73p1bvgn0dKLt{0vy!Zkh zmcXv-Ue8{x$Nvl1{`C`sh$Hg670YpDy_ZrUb7VQXKT;>%MvfY3#KjX#3}@g+bFahw z43HXFMqatmGCCL@h8zB>kD+j*)9q3J)*ZN!Kt5R590NQO!xIDL*jGyBpwR`+9ws<i z;(h}MyK97^>BlOjOE=B99A*BK>jb_75{;-kzQgQ-Ior&k^DOcDhX(6RRTEm`)aOcY z{AhG0kT@&q<m~VZ`cB7y&J@G@NL7(aYd5M0oZStPD`v;*{QB>e$gZhUJnaZ7Xc;_w z@Q)RL`Wd41s7H2cuMz){&^0o*32;*`xRjf%F7OKJ$-Zmm3JU#Qp3F#cFtpcS6Yv2T zM7-ya_8ud!l0mApvRdQ}_4|NP2gOZ2L*FˁWtY?ubDFDp~I=tk9Q1$($3Nwvwx zJV^@FuUZx`DyEdq<^$WXvA=X>aYYBGxRD)R80bscOPON%>Ig5AD$EKnY40RfSiu$h zdT}@qL{?bkMPc0)JApMpj*voiE#;&|64?pzVw_tT?)#FD<r|tzgS=N&h1|I!hJRqb zW|Hbkm6RDMcF7#JG%3S6B(|0#Ck!wx6_w65I-=Ow>XXM0FknfI@7Ymg_+chHLwS*1 zeKpXkI^fmCZEtuaUtx@CE>FC=ku$|%sP(!i1=3ZBTZoaXc^x+48v<uffRQ6M)I4NC z4clU8`f7N4Z-t7WH`cW%_lFBAuV;$2%wb*9AkTU*kV5?wE6ZJ0D%sbxboKFJD4K6D zER$m8!LiFW*B*5=eo;miX|ZQjTjP?XeTt3HEXzpBP*+{wk%mQzZkPZF8<~jyz;*lT zlY&fuI1zrAh5IVyTgu?0$$VCNJjM9@jc)?Vc3CK!76^KWcTlmq*0XSMXWPO@VC5ZO zgg;n@@;YJ))xL~in@KkZ$xewPytA!5wHi_#D%cVbf8R1-`$DdJJ@&3HgX($xiG)_+ zRHJsdsp6iRF?QOj+7n%h5q{{0`elS+i;L2FPz&rNmPkY~V6u%UX^fJLz<_UMJQrOc z;eIaVVth~-N}8I_=*k|L-n|FWIflyPXG&%_68m~<G(wwFrYc7v4~2^aa>#|&@x6-W z;gB4`VO`l)Z>>T-0!7J$LRi6UsA60IW3o5c+9j(_Yfnm7s79H_MftScd5vcV+MsLW zm0^3U5!L9c&O`ge5kZM;_=N$yQf(K&F1dK>fmXnIzrsm=W{0R1*(Y#rYvR|nP~toE zmy)7huWEP7c>+qy-a>vf)kIp$G=EslUmHfX{T7W{WHZu!m%)khgw}P@4aqPHukZ<` zI*F&IL(=i(J?Zi&tmU5~UZT!WAt!W7AI$?}#qE&79nYeH*vNUFgkgs_;QtW+u|{7V z#>ei5T=Z11vBrSe5c#>_7aNqYxnCEN8&@`=#D_#GIWJgEfoTEAit{KHZgyW8O?h>- zq7DtOT?BNH6<QFQA1E9X=o~o_isAF{e-Q{{_`@GZ8~$S3A=z#M@&(_lvKQ9t97-w= z*aTP43O65uPL0=@CROw#FKX1u_?^NKi)yNAb7X_u>k6qNM0C@oigT$Ge^=0&LhUQ* zbk|4xy3kf|5F{gcY|Wu7LKm^UJ;cE+%VjZtHcxI>X)HSn8(_(yHE>sZedBJ@nv{PE za9l5#drko>&nNz#U${l_-KzL`EY2UTXKPev5VQ?t%4s4q?=<3DpYD54or2JD&Iqt) z6HK^DGUq~v-9TBWBRV$*-aO_BGkA7@>J@!VI39@Ehj(8w(K}AyJ)*%%9ZXLeuYU1T zj@FA{RdfcZ@gYi-<|K6Xn&|QB9AX9e`N-Wngt?cR>mk=lV{mK7U<oi{?F0#n)<xG3 z<k=hEBKU>)5js@k?9k8TtexSqKHuvwzIWs-b2bIeWd6};1V_w-$`zfV<*^2>q;k)u zim0DmNCvE|ij$8QE_~RAhRISYypNoP8pBFSgla)w&Zl-)YE^QfbQSsht;G8d;~Csk z+C`1ZWnSBWanH4pmzcM40vB*d7e?1R+^%yNR>^_Rp6$<07Xt+O<6qU3$(V+qrq^H6 z;_pLt&>M&-7=X~~8$om{q;#PK&N=7#?9<L7A&^MEOwxjvpwz-vdk(0Z4Df3{ro^~f zT(ST0C5`8v^)uxKkyu5Z?Nc$GV<l^vJ0wi5_JIrOFitsk4P6EN3E_9eTGczWdH{(1 zKmY(KY;`HCQ4dV)3Y1cyCQM4EmbEAq9XMqAdt05&piBY=Mn1-O>Av{AnO*^5cOXnl zFdXI?!qbZ#-cdh9KP6?tAhTfet##KB%u7MX`#P}oh^soBNI4a%#1yDEe63kNVnivM z6ynXX?RsjAZBF7?9-fxRm;LiLMDbFXR%7Qn7!>tiM^}jkw2LgIB=n=?*goPEFmxa4 zJ31UgBFWHWU<Lu#HF|o%lcI&j)5~?q5P#z@tN(nU9PeKd(&)(hF=iAnx(Wq>a=Hfn zW<^s@E1)g<?zNlT$5KuR*oLP5H0x6!7=XYQ3I@f=?Iuttmf@%CQ%jyx{oG2QTqTf* z$1k@kOrcZ`2CZ{J8@Rw(jdep?3pj9_-#J2;VCHHJTLHjlj#B_ccw&t8f_7sq#@jjP zM_Kd+|G*96=pxa+(Tx#+tQ(j97LYQ+wl1j~v<R-7<K$X-aPUTeW!l=g9b45qZk}}P zMn*J23=bY+XWvL`_2-Wt)Q~n>t$u;CN`DOlG6}DaVcr-(ELs!lTbz3nxt8M2u&))7 z>9~7NA%I9rj>j_&^&$-jbaF#C1^o!f-;3*-EW%ZH$!PfZ*NL8RjUi~M4Hi`a`Xp1O zYbT(W^cdvi0ID1wzOtkxRLh}-9BInumjN^2;f*|)*Sd<ehZn`B_{yYhWS|~*$ZhBb z01K%i&EJt2Mp#ml%t9NFZ2U?Gp?#xwaQD;eGXTOdD>Cd+UI~T@jikq!VvbUYYliYX zU#V<I<z@-YrmCyVBr?gS7i6}PHw3pL7k$rSLItO^E=2SRuRtqLJDv5E_)g#xz9WRd z1;^-k!k@x~NYh~dn%pKezTvt!bRIWd_>f(8T}Ugn*d$h2oSS;llZNz{DpiPFGyGgn z*L;y2Opy)GYe-c?RP$A?%BR-p2V2gFMKcH-P1uBPJ$kZ$bNcMlB%P&E0wzQe?m`!6 zHG+k@Fp4G~?9){SS2^X=dkcLe>tcx-ac0(5zr%trJZf^N=zNw1u45bkOCbK{fyS>9 zUqr$&>I%2KFDZ+ojCgOc8i&D^<csg@u?371UWuc4Ut4$0HTmGjk*9jWAd()nY&8pT z6$hMu;%pr$XUG-PC~f(NDc{-gYL+x12?zmCzTwv|nt_fc&dfFt@o1a=@{NrSsd$A^ zeBy&lrUj);P<Wr^o@MH4=U{g@itHQP@K*o$N;^wD5g_~p*OgEXFV)%dTG#k2KmWyO z^T3$tT-|bCer0zZ%0SEfTOuV=oLSqNzgghA2vN<m`Zj1xQP9b(5V}Zc#gE_Q<49S+ zV*s6C49}A!OG3k;n_AMt62CjvNxZ$l<0(hMYyHXmW>`vcx7#@4FU$>AL1r#{u<4#T z=E$*4Fwxk{swrcxuS-zkxnx88divGW)RpbLIXRx(#~2+0Ap-A}2dt53!>sA|CHyz+ z%^(!kTkYY=HEORm5v<;pcR&)j?%I9^{?4z#+W^6>Lw6wy;9A%DE*?ajz)pQ)YjZQg zp-p_*$d(15+E9Oe1e;C2*Az3e6`8$sNjc-2kK$bKE>ZS>1#QsNv^SB2o?>p}B@wJx z$^E^K-?{=Og_E_YhvJ<c0>?fm`n)=o!)K<Zuh^$a`%xC+jX2ap(7t`eF_@(12#M0^ z!~+fCSy{=p)8$2=8U1kQdW5hDn2cO&-0!&<7xw;22=?zDm2$9B0`Z;4{n4F$If4Y@ zu6Bd@^O>I=!X~+M;qn)@S~Mbjq5{kC8V&MtSKuVPw*e1^f6O7)z-Z@LJ`bkl2P*fu zHMip+l<McTk9hJ|4z~pBqfvUqu8c4%i^4;WuN!49IPO$QWDF=R5uvyA{5yhfPk6b5 zH77p<lsVVh>+o$IYF^(>x;}um^~Fbi0QeLuA>D25g9T17mX9!R$?_|s=z*|}Qhsuz z4)Nl9lU7^C?6&%eK6t7ym_>F?T&ZnXRD`PS>tvii-ehx)xJA!IpxWD(9vI4+61ZNW zX$j*kT?2@p@jN4%i)vhkXX0Ckn{CkUfUS`%F&}ohjDEAZ#+IWD!lW7Qa>b2(MuEkG zIG%66BfpC*bb$1Q3C<ktnFpE*!fLK9{L=aSbR_3=<&zm>44*3t4GS@`)j~}{XtY^& zdxx2y#3-F?Em0%h?!2iXbgY$KblGO2XzG!6c4w89`<|4h3$9nDuErp(MpYZWwmfnx z7jK51#x3sT7Rz$dpv8n~6gliduT<KfiC+fX8i%PS0hdtuQuX@vP8#q$8v4OCsXldH zZ_w$PryD$p4xco!2L)QtQ+}#wb1tEZBkXz#FQ=FIxPO!Vm3c`t6x{IlRo&dL)E$LG za|E*OS0vT84IFy1W=Uo4Vnio*f;`m1<F_fSQX7D+RS@d-#(ZMye}iz1KNTHp<m>q> zE2Y7SX|LFfsK6?x$;CD8g?9v|fq9HZA~yZ`moJHP*x8V)zQg7Vwb-GN&|zmMfJ<tv z&_Kza*dwP+kbSUps)reUfzveP_iqPIGge?32fE&CMj=eVOYGl5;6fu5;Y?uEN#2<z zsefMs<M1XO6jj)8mGgl_O`OCB6wy`s&;>*#!VknNA1^CX9#YfHS`8o<I%0%`kkH%7 zL9shf;ees42X-4cFz+AosG#*l!b*NA^ZWqiynbOCc2%<Pk&<}66d%CQ#SyE`Y6jBK zN><fWd}C&5KO*mM&?cU=nbb&l5n_t#I4UEyooSk$>U1_GvwK4?cBG0MRb?t`(CUrB z-qBxyBA9A(Ito|N$Q)E1Y~8BQ)C(Its38s2#%>5Hsm3_cvL(CIZcyk*?AuRC1O;1M ziP2U?Cq{G;467$bwe~j;U6r*&`07<xd29u3%(gh#j%z7z9%{6=QOy-j!cs(asLOLN zwe|i}p*1pE#8(+(6_fJYQ0KKk!68g>Kq}<?zDqD(zU896@of$oOm2EaG?~>goB}UX z=p^>bKg9Hj9W931z7;1e6X&c4T+_lYts4FOe5<y4p_YpScHOcA0?%-uA*6z9SqTTQ zEn>1R(O!5^V^Lu^TAT0GKGyF>8|6%O5EMycJC8A&lKJoOk0ZC+t@U7oy~>)^?{tIK z1^+nh-J9EJW}8NKGX=Lu%ea+(g}u&qgC<QYr9JIL+Z%H{JZpqSe&9;GnZgL&plVPo zcBF=zPeW^#0<VuIe5MWb_16QNKR4UoD&ZAy9Lq!Ts0+%RxL!Q#Bod^*ldD?Z7S{Qz zk)A8!zfXziQR3j=T~0D;(YQ&$H-S}gkn3pOBl>OqD@VhwCfOJ9ey1x>A^6#dD9cwD z-3l0Q2#7_KnV5r5D`6KF;dg|cm5!(}l^nR!LXNu;kZWW7Nt@j_UFFHmy2BI{mV1SL zU%^!zVWda8uqxwXiY`xOWUk%Yql-$}3T)>R{5+DIz1@;>G2+k@a%-hb90KD!?_}q4 z1_M3`mF!>yZGJ&1arsbDpH!|^W7_9A{!-+*Tc@}2lZ=9~J%Dkf^sg+-su3*78XC^9 z0)*(+b#YCAWSawepv;f6f1I0YxML>nE!g-ADP&<ocrS68G{X#6CU*FB!hc#&@a$zh zhV;hFeh8saTOFu${+V}VFe_9P&-l)Vzv;B9SiZ`dAmTLVmwm8(A~~dLdJ5<zf|JD) zQjkv?Mz&<E&HfUPv&%$iNk_D#{BS(wT)%NlsZ@t9rJsE-<Pr(gH<yBfQ54g6o_?74 z{T?OK-(*42GB;QjdRu@Xv$)gmth`#LQNnR)D!~~vq+N6|g+Fh(4q(Ypgo!%|cCMw+ zPQNG-vX4oIsu`*LwW71ocUW2;8G#f5J=%{WY0SO@0uPEHe__w_hQF<T(`T{&zSg3Z zlm#??12aEtCAxno&3xd83LD7ftZbg4Ponw?cWOcVr`s)8!t*#z6yh<7+J27`Q*;Y% zQ?0s?Tsjw0U}6Bm-Pe!tsu&VicxJ*pF<Xq;m*R4KT}}$mKXwUuneA+^F3!|%+hHT{ z;q46+5qa=ET(&+OSwRs#aMuko+wd<3aDKMnbOIT}L3xFi_5l*vB+kxnC56WUyzGp2 zrvjc@Y*C&KoDk1LFCD6Xs4bqyF(7-UvalIoFKo5tOpkkZnL~dcJ%SSYqNrGp{H9*` zSL`PDI*6G~9jq;yn=y}w!$P=yxu-kODZT2<6w+{xH|KPm-D4RvtNcMxzbCjggLurn z#^<>XT;5cV2&^OJj$aUdV`L%FI7D8`;4w=Gc{nGk1!O*K_Dsr9F?l0Y6p0q|GNRBT z6;OFanL1<3^PEGo7b^BajLDb5If?IZkDZ=qpeohApV*czYp4Nb7q!zk6n+J+qNc?S z-Bq5DCh`UOA_k%P`F{XeK&HQOIr{}CfeVBkcrwj)%bJA;4eAR~hwq_D81%rj?|dN- z!r2!cFjMA1&m5q+h4d+}u#e+6TY0m{5WYM7V1y5}-q_{=Yhq+gS~g^D*+<olq17hy z9b{ouYHq7qbZ4f==A@dp2x+mg>0e)Zvy0&W`RJfN##X~_S8p<J(}^!p>65QZsu+BX zi(mH8T~k#lHPu5)Dj&m|>VXCPSo1cxSuNNzdeA`43Mbt~4f^)6TG2ezC>71;NNU&c z_L9|2ng@*)!l#gr*7s+PwRQm?>uc|^lSo{Kv`^fm@CHI$Sv=HhP%rUk4P5Z&T>B$o zIp_M+`nqeSM%Rys``2w;{S`2@s&jaNmGD@r9^4QA)h|cB9$4Gz$|)eY=q02%zcSSM z3!)<7HS7n3t^Iu?%mYqi8>XJkk1pV~xB635Dqm06U-;<d%LGQ<h$)S`A(lb0V$7%9 zmSu-XlKd5?KsXDRA)NKGbn6&BBj@u$4*3mzzOi((TKI=zd|jO&?^fvH14RyeJAv$! z*C|~$Xm*$?R(i_YZXA4S$h%3ez!wdb<oyv9U$8Q)T1uq|U!l}B$pG!$FUNi50u=~i z9|~Rz5P(*hkJ>_8$<>@WLV%%a$8UT&VfA>|kMpkKeLq-)Ol>;xCpPf)AIk{hBR0?i zU0)-E6+8|facB_vb2M=9h1AkCjs~9KXV6nTg39m&LN6+aV3mB+-AUv~-y7UC^)N(K zchsiA+CTGRmF$=yg5zLy8i_ER-=DF87_pAPF<*Q!thN?2!Kic>r8i#@bkG~FtVGIZ zmO?Y^z~PK|ay4m*?Njj%$M!B`r|c4_7+;;vB-_r8BG_kxX$bbsRYqX~Pr|PdF{phj zuKt|~8z{g&sQ6?1vreZIUctW%(DIr#U&mSw)k2JF#84gU(NEh;2R(AMY@M5(&I@C8 zJ%=jQm)@A(^-8QYVWT23`EJChA4XIn+=;J=thMQF-q<=+XtQe^AW<8iB{*6=jEr+l zvZ(RI=cL9gz@UT)NILLse~oFB=lUkG#Qg^i-w0y$zc1dYC`}vN#Kc~xk<{NJs7heb z@vwA9Gz}@mWOB<2$GN}rHR$l08t!qd7YUAI&2htejlG9@#922|{DJx@2XH!t>L3y= z=Qkmt{El|9JO-0fxmXTYm96wM-%90&$W}R*Q{Z`dRlz`{TfYSw<vg6`H<63wCopZF zDCa;UENsf5M!8a13Ll`bN9RbqN}CN7e{Ys<BG9NZN1zeKLsV=z0*#WB1C8=8IDvH1 zeoQqJ$7|!JjX5;b$XYhWOg!k&sMtXBgmEd;GP1ODlg_WaW`vf{UO?L$D=*GVF=u9L z<*sa@0X%LO|0^kB?Q%pJx3b;ZFQUKt?u-vS@MazZx;L9Pd(Tk>8Mnf2?f&^YKbzr$ zW+^<3W;hm2kC&?;qjcY({GE+x=O%q@CBMZS<;P9P`aH1YfH6-WRRq2Teno1D^h$ET zIz#xr@WVTOp!o<#%hA*44_|7!xOiIJC}Z<sZCQ8L<7%6q&nLxSjx-NFmK=Q5C^}>5 zZXH7M7Q>i@H{o4)H|qNNb5Vnsp6M43A8W=0x<z_Bf_S}de%E<Cfs-vTpdd!)elyW& z%=CacW_(cbpZYrd$ioKlRTv(L*W7J!OsTb<@kGg_pb~kP*td&m?KEb>*VEy(F)re1 z$r>!CxM_daTA!)5)+b<Veas3xrPbCt3wG7BP^G_)@usxcD}zXioR4jGWfTKL8GXWw zzHB)U$Fb_WgERUUB^P<scc4UcN=KlD0kj_-WpC~^_1ZZ$;(||VTJ+tVw3*|#o63b3 z>pnTp-ZU~@=iwhUe6S3JHRgh^E^HX=6EGpTPv>zdS2meG5k$7NN#QVf^Q+$?n<urR z^V#;2i}!t0g?LfOH}1mU1^EC)H-t8S^H$(94sEW_`!ocKb09QNUsMXm%Y)0sRH#{R z0DWZvy#0Lem4*k*;_4d*GB1VO-+bBOE_;u?)1oK7T9cQRN~?4aFJ34s&JOH9aN=lI zZ;PpqE_~OH@Lfja;ZZcLo!`ibUFXgI$KKD(eRN+Y#IHYP#QerfmbYx`D+R615V(4O zvKc&KNe){AZ^059{#RpP)>wU>@)qmd5C5y4PI<=w18n>ty7*HkEGm%!rvJ{;4+gQY zwvepk$r=3R9}IOLKV*@lP{PSKtA)69(q>?O!f4VVZtA1WCIxpDpDVTYrv#x__(0%^ zJ@n6BQmp0YN3Mbr?!|-&zwppoEeEY4xfCm;`=y%?(9Jxh#cJTPl82HsJQ2lMQ~6i` zPh((WC5G1grazY8-_PJ-ltz(RvSh-lC;^M259GFdK4dI1MR4VQ>EAIi{hbGDGR()s z^!-`(Z%(j^6JR!1RoOX#JZGhfB0$xlgBbaR<hlSlpjznb{gJ?b9cLw+ilY&zFGOwO zoD-oZ)|RPT<o=xV=VP(Bw2cjkJWP>>U&T4iZD}6f!w<S|^}g(=PP~cK-|ZN$9XHE; zk;lg-$~_qu9_Clv!)OkEo4xwGi!#C%_@!1ZZnc$vNzGxj-&fIe9WFqF!FGNmB=I95 zo*xPLPb<OkwuIYowA|cnL*<DIdgLC3CqZO{eB0owjHS^?={ko`>t2xx<Xg4VD}Ju= zfbM8nPgvBHvVpS0J%J`gURCGF7=>7U!h!-S2|NxWon5=@JY>OP{+30(YOImRwNlB` zD1Ta02}|nA&TxJG>q^DvFZm6Emytl_2DM8Sy}BxTEkM1dyJG5yQ^H{#POj$;d8ynk zoZmBtdo8MtT2`JTUF*u?!(2;#xp={DwIWJM>LBnmh(H7yYz$F~M;v*^a~bT%59edI zi9dy9ay9;d4VR14re-`${%_Xa1TKnWc^qe5W>zOJn>@xL$!=ywyih^$Hr@y-cq1a- zinn+L6C=a}NjxG58jnOYXz<1ef)|3y5d=Aun_WaM(THcFiFv8!*Xzr_dKZuP{rvvF z`=hfnU0qdORoyc^Q{7eENq2y5h0r~3YPwhl#|eI<)m}dvclHN$vrbG4Jh<k(BBsZu zh4O2^+H+8a);jaFi+u)9o<Dkva)Up;^W@?4#<UZ--*!!3UC$Yd#;Ri7#H-6nmEBjQ zMXO`temZvel6rRwKV$Li2?|W3<E87g+DE5n&0mA1*EHZ-2xD$)As-ulR8aWz>Da=q zUB`~<(xqV3BlViS-{RyOHxiSxvXTPEj9C=mr$R64k333|$CgTxW7g!?L0z2|3fOyN zS63?1Ky{gp20o@DbcL>uL4-i%v<?DYL8M(3+Mhm=U`XDtFS0MK^uw9>EG^=;oZ5Eg zoB`?_>5%bV+D)1hm$_1bvrxkATE1h+0)u{g6>&C0`(Ot+Ti4(AlIkP%@5cwOTeV!F zAG`D7bLhYy*tcW%cdDfa9Xpu#RN)2@IszBPZ;^Df=2kr<H(>mm<1Kt~g4r;Vt0}u# z^uhoRed=gOs`TheKUBV~kJdfO$!)loGp(2Vw8>+96&gdsxZ$X%8FrXg1jBi=1MzF{ zXuwHuFtNkuWWmAI^acai_cqfuRB{<eTZb!ke05|&W{t5rch2zPGp2S@r?}_gT>0Yi zERTWXr}lOoll34%#o%(a@e^={PK`D2jv`+8Ykd0neF|Gf9C`~Lffje@636;};3M85 zOC4dT4msT7#ar#j)UG_eZ<)@y!!wHDhor%tKBBvH`mJWDGC{Xnn!oMlFz2C9m>pcc zqlG#WD2?-3H+7!+1FYhp{+7j+Uu|hy6VBDe)$O}re0bg4mD;)c4em0rsAdxrO~3nY zM{qTQ2-<pZ1J&&b{Rnr_n!sd&!6r?972K`Yf*EJEHcy^`5!&Hrv7zV4Sw5@OZJW1! z6>f-#iTozk07@>r3$1Fd%ozRy&dktiZNEzTzLECrLRA{%65B7{R~>$#boOIogh_H6 zck|Jc8-))a<al@MI^Nq&W$S+0Tbf+5S_=yt;ZBppUAL?rLi9Rnda32GntTJZhTL)} zHH%3ki7g^7<;4;@3qO*Q;C)E7;WhGBQaw6s_SD0d<qr7`-VJaLe{i|JKm1z~pB5g- zD5y3-iyoCIm)c_}ZShIQgq!OX@sEKalg4y6Q0~zH=my;$)d2T+Lf(*r3i^0<Lr<wV zJGG%9dzRNo-&uY7_@<U11+=qFmt4Iw&8EW4Cr=9fhq;gPcd^=TFq#i-R}Xiqw2*<e z>-Pjy2x<(uvm{S71$bWUZlr1#XKJMF9(4!9{i0NS7u>ODd*qJqT1Kvo*b!`?$^`l@ zZS~2_w37As5<^?X)DMOCjoYA9a+_H6@KIjTg9rJeySj`S)lJn`UoE==%dV7O)g)&8 z#==aWXRw=8kp43<$bTjcQ7z&B|9L`)gZ*H+`f8;u(jQ;q9TGEO4hH+f#0;@6%n6+) zY^%@#^!|lSTgZoQ`f7uM@QVVYfkh|^Be2Vu0;_$020lZ4i8Sanffkk071~jU<$(g0 zF9|4n%ERO@gW<gtE79*8g}*Yy`tDBhwz4!KL&j%ZNq_t#@ktlNXWd5#ShY_;jiGZ2 ze3WKpDnn>G^vuvY$pw|tB-uj;JMC{UzL)E*!QE!7EbsZtph3o&PI6?~C&(*vhm57Z zG9t17=8_B6=AU1gf&0MIL7O4|8&S*b2jMGY<}CTP0IgsJXjn7Bl~NJ|=q^J7E3d7T z)(VWx(+l@)Twa99f1=K@sPn%ABFa|Ec<qVTvC#qo(yc{y<-uCF1yEb*Kw}G{{=?S# zma=8C__zCNVM`9QU}3_bWiizG*TM68!F6pL0b1C%W0fth!N@G|V*$!A{hD7Ed~#iU ziPb8!l&*D!Je^4WX7cMdg$66)OD{h&|J|;gyLPJ7r}HG8p3!H){$}Q;Yv6pn*2>%w zTDr=t=}h3S{*_rE!%x?z<W?Z-ur|Us&_cSCm0FS-bZXunRs46@PkZBzUc`-=7X}WR zHrF#k$>z^S#vMs9UOXARG;n$FY<2Z?9w|@omrt*okBP@-Pg{2MQiSTu4~a~hbI-`c zn8(7OZE@ldd<~3D3KO&(Y}NmyV5?~?l1;2)2efdtR@{&a<or0{)^)U58zBN(^kQB1 z-^=iFP9}XB>8H?gt$a?todM@rkvfvq!>x)oXErF1i(h3nC_%0PRzt55u-Ci=EUsYv zH;P@2v<eW10^n=3OX<|~e47x6-c7)s8!1=F(2sT37cxBteWi8+45|<y1N%t46DiP- zV9*c*nFa7<c1NtXFvwMgzQ+af9vWMGh)8kJx1#{xn`NlEh8WXf&|m@jvJ?S+MKS^o zLtj@RRe*jhA|LUOLti&}g>aT!z{<?kcnRJaU&xk@ByKpeUN0jK3gd-L;$#OHX%n51 zT4hAZiB<41Oz?36{q~LE<yOHv3zT~;_!K5MV(DKC-p(pGBJF)G`15OsG4hSzONwL! zL^TUOh6#@NyKI7=A(yZ+-YWRajB$d+feBtMz{EHCCJ_7EH!4hjr2+%LtwKAdLV#TN zMuXE<4fe?J*=r5lPy<AQz*iaowQ8_OzWrK(ylaTi<BbCDMRI`L&@6vDCjTC}_Lbc) z1;|-e>3e4c$TORT@BBviJt)v?*?Yc{9igv9-x@4$m3qkf>B3fcA9e=IgvTN#TSgdl z&S-@9I;<fAyzc<pz#%9f-)B=G*NWq7*)NF|QNlJxsmTI|LhFAm2#g{4IX3_3v6@r` zr^;dpJcT9FKC&L;PNFUAIq^<BU4gi4)~$l~5yMWrgVV`m=~YssS4omov1HcE$<hOU zBNBV_R+f7z9q!eafP+)b?+xNpcnpEkaa~r@iOeJ=J@IntFNWXyndt}Ur07Un<BLLL zcK+SUj9Fv-RtC;qruZ(HvUH$fiB9}8nXW_;*lXt=)bf7AEpX^q^Gm(eZCmo+73Jwd zBw3~NTNLEKNSV5L=B%EE4)yNv0XQ{0ht@cUcK03Ed+3zZf~>fNl+#M~xs3Q~!x^0( z)&|S4mNf>K@#?bmY9YjGU@#<TAs-e>wbwIhYke~M5Ad1NzyI|qHL5;F(7?&R?M8&z zAqMdnC+qt({rNWN+i^0qpf|@cE5e`>_^?EiLn5^>)$uqC;y~tC(Lr1>Z!K^o?fFCS zA@{Em7c0QaT1n-%3*5**_z?Ob=QQ$(6#(xMP6F8qLrguUqSz}tOHF0{UzX`?B_c>b z`ctB-wXAHu(ib8QBsP^{h8~*uvW!DO(@JRo53Eqb>#1YYa}7+Z(UJ)2DADfF)(b7z z!vJo@c<v7E6=$A)OvRD3J?&+ny^3jDkg23J6F#odf`AO6J8fHxz1+h<-MsMJowiq= z@$fO=U~3P(4A9F9+EN*iuv&(h)&6V&;vtD>>L``d);jTdyAl39H$-mOv0fE_In<Tg z5gHX5W|$WEsY|%xh3~<S!xMt08p0w%w}mR=^N_CGw)GJkLJd7i{a+~1x}1K%`z?;k z*&7+XBU%+7{`d>G^M}a&(S~a)FHYU7Wb8Y6_Gd$Mc=WdYNF4kNw=Fti-*<-W#8X*T zac-br&A%GOIRtkl@wrP>;K?+@_fg18L17+oI}Swd-*5P3L}ojMw)TV%_^iYgzF$Rb z+!l&$1^48(Z3qtyHB3IaFk_=K_3M>$CmBK`H|$)8#6R{#O(H|THcVW+(odluctUIb zMQP^!=!pH>4j^&JBPL7q_lER@6OW^qQOlbG$~DlhT1&#HBibgaDFC9%Y3<ABx>vR2 z-D)kgMx%Q|)XM-G<q5S-SQ{@V;6E1i)qwl>F^5ne+;jV?NJI%r`_NKdg9Wb&`_Mui zt8;}CEo^jz4H%HtpQoW1gZ3I6%09z**nqG)o<V2gAUWzt$AHsV+)HkNR=Eu@9y%#) zc-oIT`F5x880fn>ZqS#0tT6lsI5uWFLSOhe=K;KHfOmWwX+Lm6d>BtV<@TYi4D_9` zJt?kN;x6xU*j5T#QTJ75Esl$psJo!+GAgibXw=%Mb!yaxsEuKUQJ=1AuZ+<Baq`pA z8^bq-uUEs@hOZAbv@HyLs(?^VHN5wV_`Lm*KkSTAqoSks?K9*oJU!=oC3)}J)7K6A z!uLf)E8oOK{19!(I~8B_cB{9rRU`RK`aWu3)P5!Ehp3on!=IxPx+qle1PxzwYU%jU zh;`qrRU<;fH*PfeoL!duwK6Ac;j)Q_jZqt;LY19sBiC&(j9;<TTcH|H5csEs34cb1 z9|(_8@dqWjdGh2RN~x~>r^gF%<wC}}oOQBeISnG25L8YxcM4YUa|FAi?P;bb1X(g^ zkSApFdN94t(qn4Q(i1Pl3+^SF60$~1uDBy`4FabNw%G#hm=7-bI8dmw6eaW)AaIJr zCJ8bc-fPUzfM}~e)8yxibs4^bo{auaLNfZlOSm>)OC+RvMSvf(P@OL(L8z4=cWK7t zS*t!>tcWEGjs?d@|FCoK9wq9V?OV4R7Je~xc!Z+AEt|+paVnHJddp%Qq(w;HG6L^2 zAW4Qjb7eo+Es1fHtrODj;6?!vZI=%OR;|BB_GplY7DHK(wwVJ1A`dOHcxq)~Mcmye z+_Tm0M&c(3Yw|;ZUBT`*u(Qr{TSz}?g8-)-Hwdgw1AD;^-PBg7p7yu_Z3{==fYdC% z8_?l~Lt5eWVtBWB#+C9yu{ah?w1<>&Vc&_1YGetwe9pqqX-4`Hez(DL_@Wxxg9EfI zq;_;7ZMSaxqSc!YUfQ9Gm9YomEGJe5`14|7z@{18*|5(KEiw+6(u204!X=N=gt#LY zar}P8iNyhdyH9+PWURUTD-3}Ry}*(7qJ!Gff%Hceo2OBK&~7kD!3{K@!BJ`P+Kc!8 zJerf76tj2$ZME8GHv2U7GLx(dhb#4K>!DA*xSGs_wi1XC#`WZT(m}KZbl`r?OfNPY z8pqt|p@_>ncnt64AHC?xNZi0SaL$YoeGOD=_JEc*vQB2EV*Sx&+|pxlU!61Nn`iMM z>vkReQl&G=G3m<5<&!5bnc=xa4af~Uo?^&KOuUM&k9n4SY4og=vYekTW}Q)^!a<>< zxOpoV2F)<)nLiiG&BILamD%>?o>ea<Ksr$*@pPZr8D(YJ$u$qI`45a_dp}x-V~()4 zMr!CWgmME@$L6h5#RT_|sXpu*z8=5f8!}JgG%wEj-kU3fihN#7FzIMVI#6;QJJ!k7 zH_dEHPybDUp^?^STy|A?m6kZ*bF#CJcIoWGyaT_wf{S{HuHzvD;e+vpbSi2ZP~>p? z&WzeYH4s!YsCMQZv4Na}H0ilhJms;u0`Eh9F$IRJsV9r`F0GohL#gE-Z5@>5WTdSI zkMA+*c;LCua7r8V*}U1K3?2Tp6u4zdQApOhv4&}LJ{_fq6=P?g$ofX@&v*N_dJ<@i zpsUQgpB;2&{!vwIC_H{K<)(p-aFV{<6|yVj+m?Nf`0T%7`1#zapART8TMlkLw6$f! z>f8-u4SoxkPhOAljag4}Atmo&mL@$X_XeEK(PH$a1l|4xZDA=ab%M6E8+B_(o#-;U z>;-iKH#N(izBd>I7z1Of@bn(MUqxHdvFK;R)B9?~6R9-q+Jk-SSl)N@=gSuvXRN%| zct0-dO5)LFlXj~&_{NP>b4D8bPwYegflvQFwW=Pjo`(;UDv~nJYkp6;bLmcMQ3{Fy zS0#Ao{yk^~t$O@I-=RW}o>ZVM@Am>hJ#XK2WXa>FC8duZmyB?69XY~P4NRA6&giZT z;I8tM?{o2ce>@s*NDhpftn{WK{3VzqUEq%&+_?JlkPV-y^LTyJ#~GRz*}tcQPr4TR zJP}|;c?O+5rGl=|!6HYPpev^nxQo0ACUA5@IvgIMbEh-hVFovX9_IB#EP$y68faSr z(@RiRB1%uniyu7lEOv46^y=zX?)5}1u=kyN;ac{^i`m&1=lV{XJI|Lnu}HsCSj@7u zRcPTivO$8y9u${~Mu3l{Uj;!AU#SkUz_Sz<m4c@&ts6-shb8I<p2Mgo^&0_xbdl}k zX#!91E5)is;K%E0<Uugjq3Z6Q^5NxW<u@=l0=oK>V<FrHrE@9&T?fLC`K2!mcLYVe znQ6<C(CB}o^I-)zPn~GWY>Qh73p4+;U89dN)8&XPnlm4}@OZtcX|4p$d}A7BQJBiI zC^)k$3SF=&_C+41QSh~<QRsqB*4u+`!`Cd~SX}ks+bGYoO0c&HGsT@0!c2(?urJIe zz>DFfwDot&A45CP2`_!n@ZyxPPL<Dehzp%}-!?-lgLpEGW|RIB{lXc((21wR-~zRm z#?GJbxk-Ulx{6Kb=8rQ_A38~*o19^j4u(fa;$ruEo73ld8b-|s=)M^zZs<k+0sS=< z_3+P1EtsI!e`mW`$n#M}?e?{NG}Ki`9oBy0Oxqf0huSV6u2Xtd-qZaNU0ihV*OssM ziTz#y_bN1HCa5=QVKBHzE6%2c{A|ojJ9O$SZivgt_AcU%Cmpza)sVIJ>hiOS$uu$B z-JLtJXx0zYjnihW3tFVQn<x63hH=XmuAS~@n0{c^@kNTacg{o(7TlLQd6)e9TT#hx zzZQ+`)Y*GvXI0+@ya!`^M%7>#g&`WCtpxF|xbjtm233yEjVm;iXD0u0uV705y~=%l zGrC4@(|;UjDbD^Ay~8Wp>*zZh2cb*T;8Z*TTvjQde12)Um%+nlmYeg4yvLiB9{f() zy0#BUU$zv_w5voK95&+KyS2a@FkAoz7FQI*@M?!R=-8VDYd*)Pg;-M#>M^w!@3uN% z!60J~^e)*4tMD<ux0s`@d_?s2{rkU<{O)@L46=fT^3d{7PVNI^Rr37qht+#L$e#@` z;Wj;y(6&8#&;g&Tqr4u=xqMi}S7C+?+c!kwJ3N`-RrFY<y^doHifq(7nW5GU-<r`Q z9Ihof*4TSTUB6lL2W?irqzgFe&UV7ArZL>?Z`K6Q#)m7*E_x^R{O#T9QJhU-5R2yj z0dMb=ov}Zr;L<7h54i>QEUyR7!FO3|2<AkdZrMTYcrj!M*y+R++Ul-O41rdlVBr>3 zz#ej|X)c5ktqwU%99Uh=!hRgiz?9y1Vb3q(8h8wcr7VHYpf7F;18)kvm`pXuWDRIw zYBil&t@{&RNcV+yaMT*ke7O2~@$c1M#ST?uv-p&(cBDPvT=n6synQtv-QmA0#z^oj zmqU`4pK1wRSkbciu{;pmbhoqSkBe4mmKS94<2U%tA7rH620||$I?%%$i-QX+g@aWZ z_^=*d79mwCrAy#F-JSI8`o{DAJ)?1*0@To<H58|z_uYC?2bD?#M^w|mfdffwHMKw> z)33i*ab+<v20K73Gtf3P5cQ$I(edyb*N%sk79&UTb8yH|Is{FI7igs}%wkWim&J5Q zB@8L1?R2n=7@1T}cDB$wvH|u>^uyKu(>obE!F0Y#sM1vlFugZjs~Z}`dFU!naD!i8 z(Fho?1LwwC@H(dIS+0yVu$hfZBecYq%c>g4su6?9b23>P2RjGQowO@Yb+D78I=XY5 zSH1@xbaM@ChMqjMpqn|+!RGwparg>g5sRg9ym$qSIy%SxA)nyEQIUtGj!P>zc-MpX z^^&sbd%WJsnvxMdVa_8h+;BqQk#mIrNmkbp8R<Mka5f7tlDUnvWP-D+?1Ww~-s&@g zG^dWjS7sTiu4&0Xod*j}v9gn^;B-cIa+CkID{oGQ$(#%OweX|!+W!P*Xt5$@xa_oE zh5{!q!6{L2dgT&A7k{Y?*QLSocAHz?0TR(8FD8)=j$#nH;^SU>;*%~4+Y<ywtEc@T zI@(Jv30sc{ThjzptjdrT(TpDT%ji%~9U-7IJx6eWvUGg={g!aZX_AbKDpoJL=yOBZ z+U!MlfF=HHUHs-&be`Ajz{|e!)-%G^rLy>R7K`%Qld6F!utE#*j!D*Xo#41u*lKl( zJHX^H*}A)}ARO`075-;523e)EYdm|%TNCB2=<6n{1)^Lj3Wh<Ya?@ngl(c)3YuKi3 zH0eOvN#a!0ckeV_JQg8{ap+i%o{^=yhOWm1JfyevCdv^ZTlnv(O_sA21P!XLB^*+{ zUOFJkf7O{NZ<Hp=8N{%u-PHEA(x>rrp=}*&eJxi1SFMS%^1rJ$Q4;ZJ*4#7ebTI6B zYv4T*+6iRTTO*H*8iIhg#vU2vDihDQMj!F)D3GJC#vcZuBHLI*amDi)JmVm2@$|n8 zLNaPCgZ}3zY`Qoc(b+I0o?b|tC_E8t197o%iezia2c)Ic3BOU<a?iu5GAzpg-OplU zW*&Q~z}~r^iQV%kGlFdgp3Y+h_RvHDNDxwyZ0pz@DB!qE30VUlS+oB#E^{{uVoVwG zI8cT>V$LCtgFTVQL0{xCv+OM%Vtg5yu+_Fi6o0cnB3Gm{+7YbAI;wv~e&f@hrHh}p zL59oPAj8jMk>ToCWcWoJWO%;K+d}Pf6h9BZ(T`y3NWjt!AxC()S*~DQ{9`W3;`A6c zkftxk_Wa}11q8CO1e?E*#P4EkJl4c89?3CQ9*A&5*d;SjLi|z2TTHcEOtloI+9yo4 zsZ6z7Z%Kk^WHP(Y;&1I>G<{{{!0gQOBR8+9wf1Kb2ZyG@?pFi;PzsLtSyQRrg`2H| zCdLS1Hb!SscF0&@j8GlWp(qDWUP91Grp}=s`eXTYx`4pf>dac)iIr{i2`6_j3Puk@ z*=^$hqtd|{+2B5v^{;N8d08@bf}bS%k+Y74ZdmsB6cEA2A~ACZ!^Wq^#dT|-8!ou9 z{$5~PZxd7F&@dO{&@ib>&@h*mpkXev8~e++w+w@5#GgHKQln?dhXuwUAdHoem<vN< zjXM&za7W@6VMshG>}}$(_Mx)){)c!MhP8=iMZ6EYe~33?Y<mync5k!Xh|I2xu|vby zx3puH;kw(QX)vWK+D7oU8zHdjW&^o@WyhG>hcT{NJI2=DF4_uVj1hvI?Zd3BUp-LH z`OAN@Hg17xeWuulp;3g)|Nh?tKs4K*1c1md(2(w7G}zLz=l@g>c%JHz1uN>XowP7$ zb6S9`ELj|G*G&DjJ5v8M45`0HX|agZJ;IRsh`R?y+mpC^ILn?PmvLUHbu7@)&zk<p zp-*qs%YSlXbz%t|BSZpkOB_cDuSfjkYHV#GU2s3W=t0RySlHvfSPL<Z&_>ty^3rlp z4B(n|3pAkp*`0Qya-c`wSqj@Rej656W55w@bC`c{^$Kq4Fu;_qz*9`K*p>2h3hj8g z)1zq$eiGcLZ3ptUy^rRRX5tm>P*&T&4vyAX^HyCZXU)=QU+s=lBS|~1Ki!U*-{?C& z?w<^po(nA$+^YO?x=u9JK@|V#fuDmij3qhoKOa}c)Tu{T6f5H86zje?4ZK?mD{8f* zk?fW%Iqvr?UbVyvR?w&XxVV+sN{%^*|Lm(>aVk_j(CJ}wune26D+R~Qd*#v)0Wa!g zI3}4b^D(n~9hs!LOMJDE2RlRL<O>3sJy!syB7x}7;W<Sh)27QMWW^o<evs-hJv>a| zdWQ>o8^~?1uuAw;-fn_$WDW)i#=#^rodo0h({a?-9en9H9UP|y$z+*7Os9W%o&}i? zoHoH(HSwum%Qb1&pQ#?a7(Xi{aE2nr*s{FOq>=Umr}=b5oXcP1Q>7*?=Q(1{wBpRP z;^<*biVUBBDMLoR44P{)hEU^Rz_id}02tx6B*ua}Tm}z%nXBjNr$pd9c)HReaC#^} zixgNb@|X$ThMD9sn&fe_NucW+o0vjm;Ls??&?t-1D1PVgj7Ir!x(uq-1PyOnr5W~x z%`AClh+{1*3K7r-onNu<hejy;e`AEJXoS=+Wx}BmyspWQ%V0~H=B$aRW-WL=ma>yC z-b+w>C!_>q8*8pr0T0}yssX-p=JpO$8<x#Zo@g8}X)xs|pEbBv-B~6De4bo&>u7TF znbQG-537S$FQ2=_2nQUOEK9Cht=>9vI{A$8;?X%n2d@qYQ1y>0;AwD1h2~NnX;G&o z`J_~ukuqZ%cWTb$gX4{~EArLSE~8>6Ce2Z2PQNny@>OodrK~UWjL;Q0XaO#TU*s&h zq*@Ggko2$HwJ**kZVZl7=pK5I3;t<i(gg#Ip+3@r#ru9-p~4<G$i=SMw{V`pX;A-m z3VwDqwKr?vNUat=b&_n64Ck8jqjfgZZnpermUGRK4SjG!x;4oDqr2dJS9_7=Dr|hY z^lsBq@V1^Bt95#(%BHrJnyci1mf(wYrNvbT-@*;<nvQ-6=Q;9jr6tsphwo?wJw+dL zp7<g1d?04pzz`-ei0B+yUPSH_mR)PK<q7Q!|E7-PPmazx3EeCj>qejYBG?+NNw0@{ zceL>H770GN4?MWReEKe|qIn0@;W}6mTutpxw`+NR$>>-wBNeHpCv8V%7K^2p+hgq2 z(<j9xzcyA)?A&(Li1z3vEm*t;jua#mKwtsJX`U#7RwdWik9Z{$+=y1XeI<t_1e~5d zc;F0QYESL2PQ0y(!I?)aS_$r;#3OlHk1Hi?YxKf3r_Cx7nqz-Dn-sg;T|qqeHOm$$ zjM)u~H!{mcW*jmbG~JhS)IQC(3jIq+XR18>Qxeh)9TvQ7A&Ql|bPXKKP0WRrxhPiR zP4mt0o0a%0UI_q|*h@uca-ap+FUj%tS~3yE(j@v6sUl|wOW=;=L~FPr{x7KE#DQ&S z{AB6az9sJNVM|x#$SORgMbgsMp)1y_aqCy_UuG0zW4#yqP_30k{E_`}`_+{Pj%<iG zTANUjgS8n&ba$u!joy(MTQ8n9A;#W;q@Sf6`B?NKk6{}FSE=CSh^2jthq1;~{b`b7 z^?Sjy(-LtxDp*`}dg5);5D)Z)c@RmWhfKt1F%E-+I+{+?Gp2BQh(uRiu%?V`(2{I8 zE74OBH)RT7MthDv8wSt#2AQE{G;?_m9FWT}VkE|4^dL{uA$<x~zi#<B43m;&h(jhB z4Khbu@FCh@f<J;a&=RYCVX*{<hFOr@L=Wl!$$t@=MaV@Fa!~>}MdLCu*dHq3;F*a& z;{h*!5y(=LjmH+U6nU5|sE7#;^1u|yuqvX#xm64CW{FBLjDvEXen5v^n}x0JrFcx5 z1z6^2IS*Lxmr8x<UciIX2Q`IR#V0tGNjAY3q4^f+l4aZ>cUXpJjwD|P)95r5>>Qk< z_%CA$OoM5hB_C~^5h!c^*4zoR3zW5F4T+Mr(L}D2xbha)2+myxNl_LzOV<p4l(N*M z`H|pc_&fY1(FFL(-yi&_4`-P$j7;DuUjB?&f7=BhuQxn@B$X0D4m2qW*%4$)T!-p* z&_qi&;>PI@poGW4C{Yv$`woQz{5K_oqQD%<AErZwv#ktoG6Cn~#G#`n!igK{IwjN6 z&EmELj&nmTZF#GB2T(lt9VF&C_2I|_lVt)Ac<G->6X;J6Pk-W2<7Q?zVZBtzZ-e6m z*<@r|kR_Z5=gc}w+ep;5u(?kXp@l?cn8QI0Ph~nM2RjAj#AD(tz%oZ`c)<FJ*eNJI z9%y$=Hi}(7!36WMXEbbMtk!!JRaCm-qD(bZ!$Gj_PQsbel7uCF70X@|iO_-KT}WFf z&9qfE(h+P>t+3T;X$!_fu|$~2UPfI~%BX4ZMO#lN;9~`Q7DpWRtO+}v-3i#~IH0W( z@umkdC{4TsF+6pp-8lE5+h>nA&}0)_&=u@EaVbTCF5tq^gB5tE8St5FYT|<*$Ych= z{=wUhRnAG-c%r}n7lzSf-T3XZ%|jJntZ2+IVjxD|+Mmy`Ke6j@c-d~JUj!>B&4UV< zhd04WlLW5NjWbtnPsuYt@-TWqH+EytoY@NPLR~mG=z;f`!K6c(iEM&R!5Z=zl1(Cu zC8pdI)QIWy=1!Z(=f-|MMx{9>$kqKmCC6E@soUHjS;L%q28*$R-EypnOSAU{jWy5< zCP>!hZBKEpR45Y&?eeD0Vr+72Q(MXQI9bR$Pnp<3rMV`^!9<rwa}{irJzki8HVbbr zp1G#!-6Dr<vO^4lmyR$S{-AhZzEwJ#{sDM!ZCK{no{$JV@g~FBt0z5!gq0+vQUmR) zVOWipe1?lk^zKffy2&2zbV~{y#@5xV$O7EFj8&EeJB4P7syfI*&)y{l4csZzF@h{4 z$if%!eBzj|$+}72zj<H2N&F=8zQxh<zE!>5*1za+U&d=q0=bG04o4bCVrZNt25-kT zn!kvz?QgnR@VUcT_Uah0hylMN3`qA9JUG_Ij7FL6Cj04L%YF{_5=nv{w34I6811o! z!~|=e<uguuB+E32<}5L~e9~KjW3)RxM%}n(95Ne`V#q#3qR|8oj^2f6M1$@ey@7k0 z^T~(#n#}7kG!usAYN24O1f4(wEubSf(-xqi&a@NNP<HMJ8iaIG=_k-b3OTy|%z48f zCDp%wuTVE#rX#rNo_$p|puJ(y#=zB|;;!*>3G8XhWy=?>57_#VzvG;57sjlN11;!2 z)Nj2`l<S(zT%zQz6RzW&+3Ox_^WI(dd$%`jK{dU5(H1Hyp~)oQuM@D3ZjwV<Qs2}` z@;XoVTh37j2=|@?lWl2sFOicdJETc4ho<FUqKhFH7DM*<6dFLU(z$ST{A^f4v*{9= zn?Hx$uCOT!nzC?0ugZgW^G@YH%f+vnXJjsHk}4A_pbzv8tQa~p(1U#$C3sY-)J!)? zWWP?VeSy7!8I{Ic4)adrFgNswjC3MgmKJYF0|{F1PfJYPKaIAg(uQe^RooInYW~nz zGwk3C9;s;~>q#SqyTdm45Je`9Qa6O;u|U|q;H8B}ByThV@>zgqJdD!9Q<C2k0l6S+ zU^M)tg>aI)kdagh&;jbiSooaeNn!v-PsOsRjaS^T4j<MeZvZ2{E?9Gt20<Rl#TcI? z7UC0hNYIljmqB`+>l4Mf@;}H@q$l;SlX@l*?2J%B48rJ^Bx`)0p1jD{z%V$eC4S_^ z2^L!B09&jPOeIiHXG&Q~@#$CRADgCb=6}fLrtzz&9SdZ-GjN(M8D#f04j|VH$h-tf z5dWr5yu%`GM;zk(7S5PIDN5Gsx9lQzyP(Z(7_*C~^LFW!*nWTiqt*6*{C^bPgA!X& z6ac`NTpZT6ZQHhO+qP}nwlSziwQbur(*2Q@n|xa?%~ZWTU88&tV(*C+ociBxRt$zj z?v~r3XrYFowV?-*Tob}&!XqR5#$yx1q&68MrDj1>&2%;E%z5i=GF!&hw?phGyUZT3 z7wt{^)H#>XrF8{eHP_PhbCcb4x6W;GJKV8IoO#~e_Qogid3;e{-Z%7ZeFs0%Px3SU za=+Ri_UFKWKx)VUSs@=3f|5`MDnJY92z_B7jDg9p9yY@zcmba=!04D3vtS8qk6m#T zj>G9V7Z>3gJb`EN7Cyx{_#Xd|r+Ac<(ojaqN`<L1HKx|ohlbM_noP530WG7|w4RR8 zaXLfS=mC9X=470XvvM9T%w@R|x8UA9o)`0G-p?ob7Qc}|ys*TO6p~i5N-ilV#iguN zmYPye+DLopD*a@LjFJg5UFOI_St~o`pq!8^a!;PgEBPSb<d0e<jjhQvqh`}wT3AbH zIjyWUwZ1miw%Sem>rfr3|2jJh_%^O2j9Vw~?sex**HcdE)%xvjn3*|l$c#-4VUF1j zW3S<B5<6vPL%|p(H>O%HH;zG$tBWbj<=Ng-VV-1_*(9bhy*J-{|8M8tcDodDU$Qp% zYe;(&|Gu}FFZ1o&lliNRghKyoJ<(USc{62l1NPRihlG7=?Wmwq>&yD8)OTZjCi^l) zg`Wop47$|?`=i`!|LA$`$8-R&^zb{wMaolWKD>2mJYTT;P3Wna&R5oOT|Ba8$l%B+ zB)i{MIpu;j6vHh|`6U(EFKk}(l*+m>8hU$r*VE7WoMU%dmalp2g-sfE!vVtHjTsx( z`ix45ouQg6Zfh(K?D`q&?e@>IfuD57-dde^55Eu4;IhencxoIoxO}lZ15UVDb+z4b zsr?zpWxbqnF$Di@h3`*?fB3tG!!Q5hZ1~TJpV)C*pC;CwqDuyhW#AS(wVx3@p||30 ze1Sf=BRjBbAewQhPae$yT*eN#|2`GRXY%+qar)#TqvzOYelT}5E0S2RnvwX=_bRfB z_o?C1;MnM4lV=yac@K?|c7E(k2%4<e?QA0|n!anaL{+n%Yr=jnX&x%??;-rIyT$&6 zQ>o;Q<s}Vu(Iu0XrfgobQG4j7fPSTHt+<8731#AwIXO?~@BZtNS5xNCPfMCRKP|Ih z2h}Cup|W|k6ct*T7`bnjQe-R8!X##li0w2Yvgn<A>g6XchGIu6PHt?*o*G=Ls6*3d zv+cdcM9-Qu`L&rJR2JpG@{qPp8oxN^?qx~O9o(i)7pFb?`jWS;uw;9QzcnguezbP) z>r&36nOQ1)@j@pBSm&-?*dR9MlYZD4EWH)L!MMoM^2W@e4{OXOHa%QjZnv5|<6b{M z>jf6Pz3DXm<$2Acvi~O3W$29_*qe$}`)vOI@-^J0Ulxc3JHpwQjn(_oQC#SJbVZ0T zYu&bcXIlqTLjqsK?h^JQUG#>?)m7m_c2&a-AG~8gGwY<XE$+mEZsNtNsL`XtXAIO> zR}n047aw`6YT@DVq!stB+o(OzDqx>uEK-E?Sl-IYiPe3LAm0;3U+2&P*ho#UzN~Sw zK9r_tuX510(}0_?)WJ$|6@Kb)27MV0&F>4@&lkK@>{B`CKw#+11;Of$(!J9DtQQM& zv)87itXjQ#1C^tP(nt?}p{gt#mrs@0M7CUr!jQodR(cbH^>)eB?%t^W*1gg4WA_G! z#u74Czq{7Mh9&l&(?3uK)-g7$N3Ym7(V_xAF5w<Mgc40z6uZHu;|)$4Pj`k0>~Ve{ z-f^p+dnqUD+5G&h^~=*%uZz>*i#>jdi)MUKf%WsB6Axx@;z{)soSl`Y#fZShd&eZb zR8W}va!E;UYFvC$T8w70tRYZ<KS^83Byk1M;WRn#vFx0qKDOzHd?(IW7%@L5HE)Xw znCQJQ>BYi=+^j=~a#zO3C9htffpnJ)zRs2*_@O}42JFL$dJ9$f8lOT9qq_}OjJ;*} z(2YgtPHw`pc!cv4-eg`>%5WLNlr#k%dLU!(UXAshHcJ9apIs3V{e8mnqsx!yyj*l( z#q$aO+4$eB+tgk6?|I+>pZzbE)TFE6c2SrA*gjn$ft_8KuuV4#rzo!z8zk21Gzydp z@R*-a!;v2*mpPa_gTb>h@vKy+eo^0&fx$9K_Dt=Y@fx3w+{@=MNuaz>-f=p}jzcH| zlX-_<#Q?Y<es6UGJK|(Giw{dE+G;Ph6i3j^ao$<nM*{hz78;;8oyY5K?7Hx&c!Ro5 zW9X3zbFvBwS7a?qTtVTfIV*EDyoZIlo20mbt+y0qXBQT@E~m0*ugD|!7;bjpDhF`O z@QKZ9XsBp2S%&E-S%wc2xeDeItPJ#1LloH24$XlTvH{5bu7}k@kYZZ%j0_Iv-zD8k zFBjf+E*y)WN=}2boCE{Y*{{Do%y;$hwV~OgFv6ZKGPvjp^gx?sXstMOqCkU94b<g* z-`)9*5r*y})sb1LWjJ{v?GO`W_)!Wjo9_Bu{#5)y{w?(f_F_Lv!t$)bf@~^9&Wd=_ zRA|M>GZ$U<YYp1UPE?&teRc7p8lagunb}vLW@l?Kkm`qX-M#iXquCsHuYIlrE~E7f z?ug>~uW18M97mAYos<A;a_>{Rp@81>wHu>D){W62a~&cbVmA%&|Mo))JclX5{=FMs zS!7+hHf70P?KzerfF)IilKCYlmCh-L<y%*+RKbo;J8=3vUbwnvEvz+sM%|9^j;KhV zevBbB)9|6l)?+cIVWQAQq|RxU0M*#J4vhMtjvm4?*!6#~)nl>KN)ckyGgD4kVVG=^ zu!Z$u^eGINV2R|K7l59Ajp&VrQ)g~{cxnPOYOqq#579kb&#>99_`tlR<oT37Dgh4w z`IcY?cgY?scbuZ?fnX`mo=4c*(PHZZIj>b%!EjZdY}7O1F{O<s;6{5Aa80<@;ex<^ z=>@Z841j?2qj9xXh}*h0CBX-32zn>Nxsrp&^MFNRSD-W+_&!i$){@n8SExtVEX$0s zy5d~5g9_NT+sxpIT7#ty+~WY3$ml~NyeC@LjKL%=AIEa|UblqNdwU}V*Z|sA4NZ=X zTC)0;vdX;tlj@tI$?beIgXJyua)<<F*rW9QQYeWzjeTu!N@<5>LGbdFV3j>F7PCb3 zs;opWP0s^TMUxc3`ftNi>)XRqxsq$f7`Kqi_Za#pa9a?~7}c(aeu}4nyMrcp+(B3Y z+>+kG9en|uJ@U2JB%a}Ma<dnwkO2LX2UFiIm~C+%Gf`~n`49Fu+M`pS!8kw}jdnER zZ3cV*c^VDOoK+#dF7J3j2Dff(vf~K5F9w@0=)v^FUIH9ZD+BL9lr$N^P^K86wyfZt zJPj<TPwcCJ)Rmi-slaBRe4`jh4BY1c{rx}%u+ya$yaVqT*vv!cBWQQ0((noFL3u7$ zkAcI)%uvUv<WSj+7n^|@{U-EKO%z>X0InaK#10z>j3d%4l^0+Gkzm|d6W~wKK+n!d zPmbpS;BLNqeU~2nx}%E!A)`d<VT2BFD*PWPpSi*;2fRZM$4!!E;BH!P;D$#7xVTy{ zf++%E==(yQ#6tZAAaiN+ahJ0caD*r97#!5tf=s0ijvH_W?-l~p$qzmZEWYbW(AQ6q zz|gG67-21kLqIe&doS6dM~w=P8mNH*{cxvIA5BMQ@gpH%AjW|aIuv_BTL&-DCtKhf zzqt~}0C)i`%!7ej0RRBdcZ^d8^{=lsV>`K^W@>wYPSvqGLfrx0vw-MAe)YS>db2;1 zd^7*@PSY~{{3(MKQ5$6JwAUfWoOZ!gC3PJ`Q#al7$a8Oel(tl>%mUrPs2}(`84Uv8 z{!a^5#cY(d%RYx4cg96IWer^;Gq>FL*b8rc`fIWlg~V;L)i%5Bx8{ViF3GEC>RETq zZ4W&0(mS93t0iFxo26{G#{oy2bk1c3RV{sE*WK~ZQ?I=D<-b}Mk+enH4uOM?I_118 zifY;hCT_TE?wQwqQ94iIkp)2*hAY#3*0yciwr$&cGEW9;+qP}nwr$%sd%o+i@cwmK zPVtDhWy>yZ$5A|sSMe@BZQat<*6|iU<4>PTFkBnkzpILZu`mH9!!+#zTDDf1Fb@{P z3RtU)f9o!)3AVxxwx?@=veAt_u|E#=4`^en(Ks1r<6>OxGT*ArxD)r|Q9SMHXtz@r z@jBkc$N19a%8^sO$FKO?r*>cjV=f&H<6t68f$5C7br#Hp1+W;FG3L>gum;w{CfLfD zS9d@g-PjZR8}sR*I2tG7bewC<uNUJ=T#s9Ex3Pdeh{y3PUdEfog8Du_#n<=|zq?#H zbLhW5Esc>d2F5eyw31*d%z)W2k1>~32uol&tb(<Sxvd7+4BKEQbh<pPT$UGm<3Jpa zV_hDn%bJWcaXv1^)gt0B>lae8(SkKXFe-^CktA{$E<aJ|5XA7o=#VH9H5BP5(Sy|r zN}bObL+8Lum<E$!Dq~EY1mj^0jD*pQv2+A<_*B2~EB-XbR-f@LKF5dn)EGzI$D4Q= z&*DX6Ty+|c;(pwTdyVnbcHD@oaVf4e##f7RE>6dZIMtXyjmMEV82jQtV?xy%z39YF zXd4r$4%iBtU_ESPOswi)HLQT8u$(c8DuIPC4`%ZzV${JJE=W^IDXAp2q=~c>TfEX& zhRRr(DsyGIY?PgHP)^E4xhW6jrF@kCos|QW+*udI>vy|5ww+OI+qUiGTgS=Twr$&r z#xt4NTHAZLHtu=nt^GBs>R%U+efn#Ra#W)p8MLG$J@NTT!k$sWnJ{a~^d+Uj7@kj~ z;6d}qO(SPT&WM~AIp)(KcBn_|s5%q=hXrF}&dkV<M1Cyt6Oo^a{7mFEk=I4u5IHAu zUgUzvMUgi~-W0|s5&I>!McyLw+n3aZx)hP}r-ENSB_wz965b`;KdE8#)+C;AZ%y<_ zJfLeG?+SQ}-1j^8u;UfF!|^69bv(zNg!47QQK)ScoE!Xm!Ec<I@($5y9Gv0)z2s+y zaBIs5C2gd~JFv)SwOTD%!s(pBnViMhoWr@C$N5~qg<QnNT+a>M$W4~Cl$Em5R>sO& zIV*1!tfE!2%2vgyS~Y8G&8)e#u$I=!T3Z`yD-ykhgj{tDgsbK<SLUj#kkil6<j-Ep zRp+2exoRI&X;*z!-c^|pt>vn$tCmW4RnAqKTDvOms+PLBst^=1$5Av^CDOdAxnpk~ zqj*}>q&9V_PiOiuk}1rOd+|3r!R_R+l|qUrW+NqRVl&&=&TIe29@S87b@mwz)NqZ} zWX;rk9j?V%sq=J`9#fGH=|g=_4bte$aK<V@W2GxYrh9a+<NbQT@gY6z_^4Nyp3swy zPwN@SHCpSqUK<>9l&i9=;W>6tNNc(=kTFbmZ!OQWlOo#Cok5IchI{LHfn5~SmL3dd z95dZp&x`D4BkkzP5XLjhy$!s?9!h9WFNQLK+3scYGJDxX2YNG%iOg{?hgaCgW;)V` z;Y?z#%8|>f>}Lxt=tN&eFqwHu{c;vwmCx%OWE)-R&nTv{z`X+A;1JvC$^b?)jfFDa z<V?pc91wggQ#sWTN@}^gi-USEs<A(O=IW4=G$sxIhUodaMBkHijoJzka#0nTjC7hy zw4_z|^}y<Y0r>z1|8Iua4)#kN^p0i1b0J$K{62(S^WJHJtE+=Es^&VyV(%|ja+=_3 zu2UsGHB&WfU|C8RD(6*q>pnfGNA$R!(z9Bp>`>oKD5YN1pcZwg7kXFJ(axx*ypra> z>?XNvVLz|R1nEA13BhfSqm=Zz>R!{#XV%L*#62K({#BR7tYj6(avaBV0w;13Cvys? za+=Tm8m{F!ZVMyrU?;oS%^vo$58o4B<x@W6bH3n9zT#`X;ak4rdwwt(X1?Br*2o%L znx$KYW%}w-?LS*P>12>e7ENeMGn&%^KMz*3U&vG?oLbV~)xEmIkIe!?C;$Ke00961 F006$+$`Jqn diff --git a/app/fonts/AeonikMono-Regular.woff2 b/app/fonts/AeonikMono-Regular.woff2 deleted file mode 100644 index c72742841da25f2dbc27a6f005024262cc6939ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31600 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 diff --git a/app/fonts/Inter-Medium.woff2 b/app/fonts/Inter-Medium.woff2 deleted file mode 100644 index 0fd2ee7370b34dd5628eac3653b541ce0508f154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111380 zcmV)MK)AnmPew8T0RR910kaeU4FCWD1pAl(0kX9K1ONa400000000000000000000 z0000Qhyojhl_DI0x<CeC0D;M73W$v$hVv!?HUcCA+c*o`JOBhB1&;&=f&O?~{eQF< z{$KI8b1AD6=%ZVwFgp@WQ8za57h}{p#AJdLEvT~Zuv{n`!}ek(DGF3=6~^!D7{h=K zK&do;>kiXRcNkHJAlnsQdQIF=QU3q`|NsC0|NsC0|NsB{NEV?@cju(pJGGbkmr4y7 z9`o=JOtEQ+9U?Su79_Eh%yJ1%1z-ep9+gF91?$FqC{5Z<dfkh;ctj!OfNH~)BqJHi zcvRI=Po}d>=3s1#CH2aKLDuH5fd_b)$k2MpLKvv#htbXGo<d9Yl#(+8)+7=(M<(Go zImu6lRMJ%a70!HEk5!Tt3CHKwB;O9h`N({-S{&4#Gr73jc2-|0Q=P7|?~oUeglt@` z?5Ni5wS|VtJl-+F91{0gE>y`;L79vs)UjLT`i9%vc3DkNRhJHkas}yNkeIO2hqS~B z@rzsq4=E=FupI91Qkd#Y9YgOaEpv(o_qr4VR2@<95fAW$?K0y+EXZx4PUP>0;~Gr8 zM|WnBga>M^%L#hub>GY0&xYh=2s#wzsef?rCKc0Zm4wG~R9R&{5&9sRtS%B%GoYu@ zVbVTZIAW4Dm6eGkFF(_u12@d5`WrQLeVai~f`0Eo=lvK_h$sX{w(+3xncr~!Ymnp> zElOF<ctP3tdvEDVGMOT}(7C5`CcFpp1?Q&T-eVV*;7+PbQUx(1!G3=(53*9;6Oe@D zhim?bep0p+M!Jo~Rop&Zb}>y#g8U!6kW)nXFJsfI`%-UJ<Ct8!`Y0+me^!Olo6unv zxkqo{6Kyde`5BW#sb#!3Ih7anThYOz7a{6q6YSk?@v%C%b{^m>o=fh&(D|oo^dFV2 z^eR$|uwK&ZDwVrCP{ZaK8yZE@IM*>={v^D50yFrBn2-?$O!<Zg|6^>1j|r+DWk4z1 z#%JQemC!Wp)gymMF-7SJlOG1o8VlZ3s@}8fn=i*(yxSooV{_p;#PJvYAxC=t+x<7T zC|}`v+v_L8EFmL5eyd+j<x$oWWTCm?y8ig*M18??%Cnj(!v!`e!G}D7k6-DcX^xgs zw0)YiDoG#-Nyr%_th;YZnT@4RZ@Q*y&r+Nb-Vm6WMK&pGwY<tho0zgo4?JrVQ{*{K zNYzkM>VjgVFnyHZL#o<V|Dgnm7q2*1UtR}IO-+@wt6V~uHklsb1Q5?=T^iJJ?6&v` zZ{qhNC2H}z#qI|8IE&w{&NN*zI=<^PQ>HDd*44+a+4+$isPADjQM*DyWW*LlEd`f4 zwOKV&g>z0wMt7?g2SIkJ%5!t^G5UmOY1KUEc_&}d7w-Q%T<2<^N{F*}WekbukPmU0 zG6-zkpRGj#5UHu&Yn3)(2(b@2r_>!zmvF0bE9LQOzJ)(QRLd%Jh{!6byBCPzNiTu} zpcn9$2sA2H7(BnW|2c7ElVw?|d=eH2N~tJdVgh0<wM3ePl~^DpuAu!<umZnWxmJ9O z7j5Hf`}^1d(AyqnW|+6lc@g=McY5@uOIJxpg^JXdB+*z0g`7Dd=g)a(&YbdQo7wy^ z#x{D|8|uEDe*&MtmD?&!E0fAN0o|9={=Z6K*;U<=9l!Shc}K9LmRh!wIABQP$zUdt zR3GfgPM*61o=Z%I|5kYRKLG-mhv)6~tdTVvW+-D<+E#_y6tP3*IOLAwoa3xJW1qQ> z9s7)Zj(z`(6-qSKzF7O87$usN1daM5S*$|z>4a`kM9)O`?wJhD{cq0@4+%mdRI8mx zCXw?OKe6eV4+XY;1PY)UEuqWv+GM@g?w0S&j9W4!LLoE~C$SKxHOrA)ItY|gitmY; z`a?8l4Hal9HK++<MJxg_S;<DkH$f~3Aqg6+MZ8K)kBV_twUgG*q$e*YFYSpE8WSxd zKJO#BAsc{rL$J+GjGj7sVMNYGFd9@u1;IcO#ULy!RIpGH1tVhCbZ**HS1w)kZ~J9_ zYzqLYY7u3m_w4<Z*&_jrM4%WDJkc7z`GWi1&b+ld|6*Rr&^$Cvq)3UBK#5Qf-LnnT zllxKgD5RiT$^v2z+?~DuNPLS@(4w=oa(J5Czq{?;wtGaTQDlo~V-%4_A~irKD?kSZ zCJGq%#b1ETr~m^Tf^K7j9+5+)-_PByZ-__yiOAQACmN%4LL|bxPCq@3p6)J<|FT{t zion$7E`&e=L6_T=w$53Wygh5C_79x3E7_9uQfP|9Fr;#ZLju1kWA;D)oAdk4CW3B= zMIVbU7uD|_j<9<7A-I6y{oiT&QjC4K_cBL3d;sHRuYdY;M2MTBIwr!nhdtf<kF(Rx z?k|>R6)-~4M7T79IK=erMTXqkPEi6<VS+~i$|lyE18xR!{pTd7T|3YD^5wK?Z<C~L z&ux;lN!lc7Pm-ifo3!VgbCTO6NzP4ka*`xTk|fDFNs}Z=k|arzBsocvBquqCXu0Qc z6F7LC8e5@lg|R<Yzu$KDt3bXMfNC0=XcXIdp)|n%F=z)`4EY3&-IlD$v>{yjkNM;B z-~BMe{D)M7Z~Y+HgU<ro1w-zZWHS|;(+$lKZ+&Czm%li&hFPWJL(=YHHe3=(S0O^E zGzd*ZGoCD&V8IqS^gyhVqV|Jwu(xHBU|=n`q1s4+kcoI)hDL~IVlO6$XrkhkR1i^_ zSm#1~ftzo!L&^)K5v}v!OEwDWz!om)M66r_eECRN_S64gDI^dO5fI0!)^?ve-~M{^ z1Y^J6XV6_NBs@h+fv6W^IQTx7TZ%9WCD0g!)TNZXP43@-rbB)%e%t<+q*@{*!a1;p z8N^*Pv{pMxC%r~gLn)Bj+Ni86P~h&RTcHI8IR+R6HfG2}lS7@>p(=_hPkU#GkQ`A0 zg06Y>IM2fW=aT*1<R!a<MHrOCfl#RCn#VFLk=Rm|t4246>;L!UTzH=5%DH5+n1d|Q z0pnZ&e}Qv)RS6t{Fe_vM_4=~~U0b8)EuBW%0?C-9$-dj5wTiU=5Xjid9XMcJ+(#8F zNyJ}NLi_zs?`5xaW|B=tdEIIYZ|l3uf&7yBW%7&7`pTHzuWa9b<v+=;@=Ylg(M``H ztV8Ms@rkfTyi<zDfDhsi@vd6LJQ7pJ0b@9=1FH*L-0~T!^Z;M!;uBwQypcxCxKzWz zpQk!hl_95R|D#tWFI{pXN-{Xmsjj}FylNrL?8vK+;543C=lT<|L-WH+(sklDhq6_; z5fTCxUgoU2lS64e$S4S0#Y4^_+3N52fSyS4ATp2*%RUC@zou5#|0TOqQj)h-PJ`S_ z@uIvK51ki~Px$U1ELZ(1*)EloNl6L_0+Jk03j%_m9D5RXde%cgnLd;xcegAx$a1{x zxXEsGXD~QKcv^&8A7`(}0ZK37`L?Iy9s%IK*X8-=_xseIm85WGggkOwM!2xl@6Q|B zK@#rDUk8jriFyer>+1jiGE4fdWS#k6JNBwK_GUFxJ8J<75$!Qbh}HkUOI5Fam%6H3 z8igLMrPc<OW<$4TQ&1_aTG}KzrKsREGmct^*>%WhkV9s>&@5zTfHNC7YqZcdGhl|s z=F9*ZFjE8U!wnEH5qJasv!ZZ7IDVk8FdYB}820n3nk)a2G;AF#M%FpU@UH8wr<GOJ zjj~e9nmL<@N9dU%DX7y;E<L^T;o$=y0J2NEQgxT~DO=X`HEYH#YsQJ9QfN=t%9df; zGHvmnR4rQ$2V;ogypni2T&7dt*+nb5+7jErRY%Oj#}|ni;(Q`Eh|AqeNq3HcLpB4d zA$1KLV`Ueu-S(+9L7Q6>d2e*sW+{8ZO8Ea;ezSB9X-54=JQ9ms;jnTp@y;&s52?v= zH+Mt!u0e*ZwlD^b@D3;NO>2EA(%S>%f0;>|ndk>eh9#zI+s}JhY(RIkz{CGf|Ci1A zn|f(4)bJgWg)v!Jm4ueOL%)<PLYW!58`*>zIkGy@jMnpirfTgjA=+@typTHky7YQU zzAD7>%4_dlzw`gh&hE@E!t8=!0Wbhy0u@0jQnojMdJ9mtK}z-`9U(bI*_SIirwh3% zQyc5MrfZG|b?_$jo9;_aG{j~Ah<hlJ3v%ng;Q#-ZnNP=EXSajybqs)*pb3C@jEtaH zSHI_=y5-P)C)RV4<rFpcPwj+8LeikoN8=BW4UK0F6f;Dhr`J;lc+dW2K-5eMTC!yT zI>f<o4KOfEpIPwqPL+FfPe$%X9TIC{5REOV!wK>W!xr;(t3hQY8lHAmBOZXvUlLrU z5DE|S7plDr-K(sfY+wW7gf6lFtzv`FCMCU*ZD}tE4*{jn+m<9+gGepp&-2+y@nX3t zmlg~B!5$7_lQN#{fNhR0Ie7Ty)b{f456Uij$~D5(Nw^XZ$f4%vGnL8xuc>8=KbXIZ z8O{bR&o=im9VLhSdR>b3)mQuV0RCV=%m9=`a-=;`o5JO+A@}xiB?nsTl&fo9baof3 z5WC8C8KVLCioH&#knu>I$#{f8xlG>eZVLY^ickoPzN0inFaRcAAX%&0TouPO{VxY9 zfPZK8pLOp2!=}3vBZM)+h{8N7)40xJ71N2y*~vNW3vVHUEQFAgKGt!_o%sF#nS?ED zX;oEJRBlB@R76BYL_}0YRaNhOU!M2>9^U>w0eo;F5C{YcgCkIw<%Pod>Ws(#>>YGc zfq^vzSW|#OKtMr2K|w%3K|z6mL3R*4{(1klb06S`AZXq^2*WTapPB@qXTJJ9bI$K8 zO<asHLI@FrFv1uUOjyDt+gi4?_g{$rea{RD+}b=>#E6K9sEWF(q9Q6{RK*zCF-D9L zF-AnyRn^`7|L*QWW#``>Pz6g+pk^{epGBMwgi#aC1!6fw^L^`oN;>yF`3$*@Fu6t; zBZLq_7$b}^#)M!@2qE_s!ZHjY=V{MWd3`jwNG^KDfSv_H7|H%AZ7O|Ardp;<8N^$l z#{Op=Y*%?6w)GB_@8xdqxtn?zgouDaSQv$kg@8&Z0xI8IQ#CeDVYa-XW}zI5Bs}b@ z*Seyr_$o0BAspxb^KRC;Fp?$&zGhzxO$Sn_1eFlPhGJ52W_EwR)+5CKRK{g&Nay^Q zrQj$X1)&H!*Z)(cKxqMLAX`!U5eE|n3|$;jWLZcFEdw^$GEC-wohSyfi~|wma-|XE zDx(1*&lv~^dD&1v$eU;ZAz$K00s*i;6HdcSxPds~f!qnN6;24mobW;Gka&L&S@3TZ zh(H6vxe`Rp)gW4~1u@W$=u9snkWoaiLlNPuBO+lV;>aQrXd=d|k0|Dkm@XJGOE_Y# zj)0c>9nfY40W~8AbV65{JE&n^VTSq5dgLv3<h`~P5Qqta8pLb_8xYeEBw~gki<sj; zA?7+%5$iN`5DORvh;<((h=q(pi1iv)i1iuvh(+fJV#9I@u@O0gSbWYQHaZs(OUgCG zQgQ>af;>WOTAm`-kaWcMBnNSysfl=}c@*)%a{}=(<BGU(ZX=#G0f^6<*N88l&xlt{ zB;qym1M!AQMZ9S;5kEFnh@YMs#LrGW;+AP8<kzQ@kl&s`LjGjPg#6c8B<ynfufk=r za$9Ghuwb#l<0G>w8%TMKE>E%LyJ6&?k4&+Tl_`?xW~9|v<U6y8r)ZHj%*f}1LK%{j zlmrwl9#u={fK{U*Wpt&Dx%{zGJPyd?gfcGZ<BmBnu#pd+ksrTNfPhhupb-jcL_!+T z<&GGNMoi36rM}U)wb2&RoH0D-jLl`!a}9MK(V{(?!BdgU<Ow9RbUySsFNXCwzs=J7 zyc-v-Mx_C*>l#PvzUI*e@0?_N?7V2h)-B$M^@z6j`b67zeUlxsXtJ@3MVr3%D2jqz zRP`Y_C8zY1o$~XC^T+u+=wO2nG2~E_Ol4a0ZrJ|V@F=+Mj84v)b5?A@mTc|#_1%g# zQ-0vuZ+1>U|1INY=`TF@n{|KS+-_F<X}fl_dWS0^0^!9H;qw~dwf1(>Q$5#ob>Xcb zKq!Pp3hBY>QICkW4}MCswhw-0v$qcxvCD9EHy4t>tV8n3TZW%b-iX_&vK)j|!n@s3 z_**?zc&^6g`kzWMrB|e$5_7oaVwfMaK9Ba2%MwSaU?j=~27yh`6?KBXXb|}HHQSJ& zRlS6;R%VzDd)v2TyS=}OraxUulHp=D`1jKhB_pp`qKA9yuRv&f^-fk%dw?bX*TKQE z)N_S;y7c1fyTO&~*S5?J-P~<G(VacoJ>B0!`_Z64_e)U#pa6B`RksEf(XQ%H>4rts zaR9&gu16JTSw=_QZjC^@t9!p6Z=Ii*uD-W_$A7S8f4K)>^+TQ^)$_mYZd}8)xL<O3 z{zp3-@qP$Ig<1qaIYmKS?wr6<NexL&VdubdZ7OJ>TiXB__0co}nu4Fr4GTd04G!zx z?+Gx2(_*l0pgtXM9mDsqM-A8aOWKFUEridaEy@P7|Go{l2`^a$oMO>}q!UXewbavh zP|tJsvBDj{iW~?AUmgID0*?Vt1JCdUKk+NShh_`zW2W=L?UulYJ?HWfB<9`3A+x{* z7S`g26jF>ySnv5RaF++XA&Q@oZ~^o`i11yjz<2*pLCyDU#1B#!MMGZ6uShACR8dVm z4K#9-JKW_SZ}CpO%g6ot_dR|f;C?Q%?I44FPzZ|GA}W4z6xE;xbtpg)N<}?3f@~PW z3qJ6LGw$FX?ia6hXvBE$xw{6}u76v^pp-05swTM<QaAmyW+0PEW?5Stmg1El!mQ59 z@ws%>>dH{BJ-SYPF^xM~xfyF!A5(_1l&##9_t#ow{<2-U7xt_2#!<CCV^`vboyz=& zU*$A)wK_6gKD+WY)vkN#M!Sinvnu=xop1M(GqY!71K81}*AaW4<+!&WCDy^y)ZJ8N z+bD%+W3iVVuX#?$5Ao&R=elZ#+C1SX?%^KAE5QB!I!7m*d-A}G<2KO%AA%v#fDF<> zmH{nP0o4syp=PMV4KBrl^5eU3S68zr(2g!7Zpmx}sS%kdKF?t8!cOlTja@uJZg8m- zc!*h7D8~WQwPXg8xvDRmV>*P^X(Nf7*%*S~ZfTesDGJcNN%#SjrMdo2@8S%{cQed! zic!~keW-~WT6Gh)moj8-qfxvHZlxhx+hkU=_1)nnUffwW@AgoJ_pi7|dxTn}6Vqco zzBS3;dxn2R8GU~FFqzgoFMuU5iioOU18k$U4z7Yjun)0aYcBu}F_%q~^Y-YYPb8T{ z64(2*&wauITwO9>7DeguWl|f8@6nz%*b61|O}~yj`w1}cSlf993Y$Or3m1^h0TTd7 z5XgZFX#z8_AV+u&LMRsA5e-xepNJP41q%{^PQeqrAYk)ry5UsT`rQzYx7Si!pglr8 z#&|sw0EF;lQ^`tmk=WUgEVKt#hSbZzl1U-tHLQ%ZjX#vUD@G@D`>aWJOQ0^aVjnUk zw0lDR>q0AZ!+?Qtn1$uQChWuMmMfv?=H4J25s5PJKy-Q<cp)zFOW#(G$P%aywbTk> z6{L8hUB4a6>_snX6p(~v+>uluJFfd2(>8u`1q4?~kdK02M-hrsYBG?e0>J}SYEXNi zM?;zn%xOj2TMl%t!+RqlV$l&>iYIb^Ha<p1?(@_59NF^aU04E93Ry#>QA$6~HRyav z1S(R-wutIu0!?tiR7RT=!RU=Gs{f_yqfSuuAjuntPB@HRiU~rl)|`#N-ApGI-F}e$ zAYA^kjoieIm>wyig#4leO)ogsJIIGa6Za;X8k?A-jC)@i#~j$fC$x&Viss}h%kjzn zv1b1PXm8m~5{Zz=_ej*(iT$sOqd1KV53J)Z9?xFBYvSt?W*gLGZUvTAHBnf6_yznm zqu5+LF%#>p5+}VvY|v;3C)>n@>sIugR6P}s+VXWUxu}?lO(=@P$LofgMLM618n0F? zSVTvl>(A+sk|ZaSqjq}|M7n%Bc~c<o5rzcBBR0t-%#)!>Ua;pi8D#tQNmUbvd02Ia z<MF4ul2=;p64=X%E!*mYOcnbV@ay5eNFsI9peBvKLr*R{(+rafN2tLVKlY9Co#+2L zE||zDA%^|p^;eE3AxX(>mwd8Urr;E%H>!+nv^U^QF7cX#!Nu1;1W7;frF{P3rN2+Q z<wdS9_ukN(moJ1%C0pi|9sM6dms`I8moA^rXZhq36K+sCM%XZs8t*R8@$NW*5p2!g zNKWw@J}Mb(!-TFflGm>>UUs~LR*e)xvW`sDw~%<@x4MeQyGH`=a1KCeM|+q%D+D1w z9HJ@-yBfYLX;s9SxRUcWNU#^pl?QE6Wgj|db=!IWjF6w8BIv}4on#9Dv5bx4IiIn< zb%Lal@J(yQmgCzd-E;Ds>1`l6R?RaB9ylfLr4p+6sh?K-bk9J|0u5x;rDpjN!H{jM z$<Jk5jp9|vYz^Vr*{hU11&XWIVEJY>8G<64=zm++pK%slujj0KOqPmN2~Io>KpW<; zH)4L$BGx-5$waLpBwdblZJ43#CvGau{|?e>ugBj7K=+YQj;2S#%|u5WJwYgYYCQ2{ z@_P0sNd18Xav5?XEtFccN!ysD_1w2-hlO)8NQS_p@hK8{YG{*l;~6nY<Xt}ALt<Ah z`eRnxiz=SBY_*@wYHt)Dw40Pyn2rq#rT}d)<g{U2)=AihD=Uc=LLqxMwa~6%7S>}$ zEiS9--~mL!DzFNlqkh1tE&P#1D8_UZ$~#_)Dt)%qNJNRWFX-72G&E%A5Xu^gO+$}6 zpJK-cZX7V|vIZw=`2x%UtkSp`6A%wy1>BZ0BbQB%PxdcP`wu{S%kr?<jMuE+=x_Fd zaV0Z77ARpuf+(?Yl2q@XFD2-`>3TiiG|R^{f%pP((^5|u6>N=9%MJN~_{~|drCW58 z(gj)6kO3lFK3&FTmUmx5*_3_eL|^&VL=z|Ra;>PEdXq@978U0xv9ELc6&tY@l|tlU zkzZbg=9sH(%$-$&xkRN`?)LiBt8^Z>4{T$_mTj#bOntL|0lyx9Ia9CV3x<COfXPyQ zxiA+$;e{PkuDqNRhF&|xC&?rt1FjAkLQA(H{mj?i18C(cn+2LG(P1tQmT2{fYG}S# zKO`=pST&YZv>`WYLE%_62`d_OwN^XJChe4L#Dv;!gOs7b%~ifPU<bH>UoRn<sPVf! z0n}9b@;tNuH!kvuZi<g=K}1BX!b)KXY^lVCfEcF%*EdqT-?&yA5AE*N;Wd*wKX2)} zO7(B+;q|bk>MksuSJwH47==bF*oKFfV57DV!1HJ^<Iz(XuIENz%3z}rcyr>7>=NY# z-UC*o-oy>ze{Ctjy-n1zw1}l9jZVt-Tal*<CFI&P-=sIPX}X*TG)R4CTxs9N?TylH zj-Ji}-_t#<IIAn&qE1Z28dL@Ueh>?MK>M~3W;qL>aJEeF2?K_%X;Ivk5NipMmM$zi z2MpKRDJ+~9Aa=@x<0QMsTOi^S2J|5b%eL!FkAhnL^wbO;C2PlgF?xvQR)dfAGk+F* z$yTWQIig9A1y-U1w&poawazfU*!pdhm7hlai?(*{8WvZs^5gnu5cLQL8$l=jXF9T7 z!c>GXDN2C3?FLfm1e+yqO{SA~*e^qlEEQR^I%`MKi`+~C2R)asunZwmRmi#GHEX_` z-a;&sMVAVhN#;mh7-iltjip5vK}XK+d9Jqydbr1y$(|wZZF=6{IDkRvrNm{W*Ly2# z+3jN-4o+r$d9oSA#lD}=yVrplH>f>uKqr*(a7Z6dt?_ci9enY&kjNDumrA)s?#f^4 z<#p)9DsNu61_&SZjo^r6{#9`lroyZ(L_K&^FB_vhdZ~-a7>22r^RYrl+i@5?PecNG zVqcs1NrFSEVohtZ7Y;@G$J>ngJb9qg3=ahgw9tlNAy*h+K%>AFRlu0DP}X*#LumS2 zGjuOH6CdNW7P(o3%kr$vCM-L%zg>>z6pj~jJur9kI4{2s_>hE57ytq?DjFshj#mn5 zLSpX>zEWLc6Ufh;Tz;7}5LuKpDstldyuvfG3LN1Jk7Mz-l3xbSMP8&>5#z6X`LDG5 zoyu4LTEu(ZHU9?aE6cPEj^UeqOIWwk{1)YR-~KxtzPv6}*3pNmZhR99t!hJJjKdP~ zlCmC%6Z(4Uy(}&l?f~{M9EA@+bor(dsT8Sk{AHR1OlW8?<@y6keJZfNyzHtDq@fMa zw)8<5<or9^ag-tzy`No$1!px>tyNt%Ry%Q_QFn#kqI$4~Yf@r4Un~4Tqz(~4#deGn zzCo-5*7;;3#++>I?rqZMLOwK|#p8+GtZ&(j{k++D%xh^<Arts01SeX1Kq*fJnt`oT zSE;+&0By@}2pyq2Rw^KNoq)I7qU95va%Qf$fYDhH3QXR-MIDnGmsZx%hJ-Aoo?xeU zf>)P!aiyn6eU7Z<kTsAd93gN`<;3Ie)TQSb!Qvn3Bc`_hhMYxgiqxKSE%!Op|1q-? zH{8byA`VfNhuCx26i>wAV03q+n8!ILO>L3tA+xC`lE9(b35U?ygrJT(KPI44u3jSp zaKP<63IysLi<&0!^wMENK3{}`pG~oLt`v%MwBEkh37c7LdhR`JJu@y7>ag&u5Yg7k z_{=Kn6KlRnyAYz^AtE*a^;`)w{DIW+Il)@o=v=vP$|%z*tY;>pkU8AG_a0Ny5N8|{ z^(m8}@RKJ?(46Tho!wM^LIN2NW+)1+Yhs9)-;H#MKn?6VR)TKmMl2N2<UJr;E!g22 zF=#F0Q$@6i>-lP=CjJ^%s2oHB`2)M9-870KUMTA0as9ho(3@w#M6PPUUe66~7qRa} z+3-BySYfdRtyJYh5qq3dtuDdxv<PsKkTyulK0+(%`qZ8Am>*)KRkC`YQ&QMr9<86M z<FaOw1YE=w9gvqs$K^VM3kKTUsbmK(=At-&oyM9_cFHkwnbZ=7I_lpS1Sy#FU<!G# z_<Hoygy~{A+lVPqkXJ$oO{`_R-}RcjIt6ArV%HbqK(Rz^yl$~woWv>)*vm6<;7hP} z?;_!oQm8~`6lA(^QMxin8Dk<d3$Z-8kv*C@T_aUd`jNHR>*16L1gB_ee)NxFpU_Z4 z$0?dvR9i|htgNWbsU=d8O2eL?bseB#9Dme@X~FtY&`61y_-$7;i-sD%;C@!yPZ;n# zkR^Iz*f-HRH)oJB#OaYGbX!6PyhbSCFy-cD;pHM2^1i{Z?8nS;3^IR&GmzitCs@=H zW!>p4=o=J_a?hdlyRVHPS@hVoYnT%7$R5J<uX!SgVj<N}{;38{X9db3PO|Z;qFi41 z&@VR0%5|yOS3V#FD2(|S=qt!SO+X<+T>ZXY2vmqtMT8M7*NEXL!K7YXsFz_V+JF%E z$Ym5#2oxeHM+}@*`tt7&6_or!>nD-;-8z{tTmL0}W%2q+h$2vk{rfG2pcHob_s2%e z<NL=sLl@osix}`hN8*bF4L%+6J|2IwNC)hHOzhMeC;_(gZKseU<7bP=?%py<@(Xv3 z9Ju2yJ~K)5&N6U{coO-@*YhvIBv=&hY0}SYGoivx_huiNWFYun!KC-2CJ8<V2KxyT z)Hn9;&zmL|_zR<+z%Oet({&R%kAj`!6iF6WaSaD?6i1;rE)Xd$Qg;NN@T8STrNdI? zYfB&l4uJsJF#(EQ0K_P^Gk3racdiiHs=W{=$ik+;h42tL)G|hRaRv`~AP7G2(FhYN zhp;Wjz$iwsi3T)a8vW?UG9)1hL!f|C^Q2niUF%FnZYLQDZ>abp*q>m&uf!E5{bJ%~ z$}>hbHdgovY=Dh>_>U=^1q(~K34JvvjDSNh`!j1p;04QFxChSjLiA^AMFKf+CJe~H z)p&(hSjQ)P62UcpAvq?Vy7OgX1}}_Z4Cg=x9UiJZg;c(9qqwp1*S8{G2kbi~g4kKk zG{U3361Q&q7`&ZHJ0jyyBXX1GVC3o~hyB6Qf|uYo5fNYD*I;)3h6RC&kNS%2E+lBM z9kMq)xjG=uS{wI*7&Kz0y(YXi;dPNQ{1u7W6;*w*EpXH&#zzi;N1@gg$I`kf#qdre zgO9Cxr;@8&hJ1A+L4s>GKs_^x65~j4jRO3cGFnW`A(3s`Ia^==774%~eBT)efLQf( zeos28$-y)u&|60@!P;3|@b%)O01&UxCa9-~qRY>Uh@)gqucmM%k{)j&J{+)<-LkQp z#z@Iuz~{%Ri(vnrU<6-nC3v%lt$G$CR69Pj#qvsZ0sG}~&mCY#mgJZ*kusnaPvvP- zF$@URj&6OLB>B*_&K=!UlrA8tdy(#Sxbx;FbnjO8g%B+HB$q&6L_8hp88Cj$PHE@_ zKImN|6cZ!W3Gn0&d?3AJY~X_cq$(_t1?RnXk2Q9%5Eq>&!kB~h3)j(&2tyEOZxACx z3{MvpaHovgkUV)t)Qu35ct(g(x1{@L9i%4<10mMlB8?$TFNj;VK9ox*inSGC@jPlh zg^ZC3;lGj@^*!AfDI&zR9G-WiCLtCJA=3C1j2|ih#ayT|V4mw~d5ziYIo&s2zK5ZG z*9=M`Lr|okNz-Kf*_|fKPrbPR%HFwaE6z&i#r<@Y?DT<fnrGMh(>e%@Sg$U21oMW~ zguvnrzA|~gXne3i0^dxHXr63O#xjj%ec}5ff~lIO5QHSQ4C&A0qmX<GQ#$ozD1bX@ zO>P_}Hi^Mxdq%N(Cy|z3Nj6i&6YZZg)J6%$B$Kj?dHNgzK2*Ds9V843iiuRBu3(YQ z=GzOVn?(3Zy$<*_>JED6p1@f|->vf>wYr(Ac;qa_cfTRt2^3@Eo>_Rz+we1qX9VQq zI9Ph}f}N?7AC==%;-8}0SV2{1My>aIQ=m5rmci@h^_&VX6pU&>it6my`l!z~`lI3k z?t0M$Jn&VWyMV*lo8aLL)$0R0KZ_8Y-!ewz`ITSpxEG3b3oqair|UrCHzRr8dQ@~t zVr9Z<oTvG+$4~wqdYW$nUo4=J$4!N}W+iMuRj;Dp$N4ydCCdXVDw}u~IfO5VuYPnp zk}W(VS{v15an8asQn}Fxcs=6voCuq3I<Ki=InyroEgX%3#tu>J)!_&p_@Rw~b|go) zJa63Gwk9Lme?vwbBa-KhsK}B=7^mfY!;T+~`Wp>9ezb55#?255xMn46Kvl1z;K%tm zg5@9O_@OO4ErAj61-@V&*XlAxE#_jitZ8=^QlM+5<xp%1=IZK<jp>i(H+G53Ks{S; zf7Bkc|9$8iNjm$p=kRQiz7t0O$}@dK-Spga_t_$$*|tdJFrPX(nzr6%>$4JxtZL~U zX4z(=X5=b$#7y>Gg?in%$bMuxVfY<L4z`R)j~308ibgDE;O9pTFxzfczQs@1teRyt z=9?y(wC3*Y)U6mPYXcUd=DZqWkRcIgh|_W`JuAGRL@EYiJ8Ds<jm18q6~!pVIt)fB zO5qD1Y}CcoRyxO%i)Fc-V`nVm3gI&sgXJj0OsrU^;6FhSA67R#W<${xU%2w~e*kp* z$`3cie|}{axA7?$H2KdaLRJU+R}Z+!IOwVGK;@s+L9kpKaWlVsFo?DH!58qEx{s3q z(TCf(&ed$IAc`GSm2|JNg-?u6gR+Hy<K3+Ny10)@;#libQ0zHlPkL%c;Z&q*s&V?F z0}uR2W8>bbF<wc+8j1z&{AVMUQrR~OK5XN278_5Eqaogb85C8Yxx`7!7&$(MhuGmT z%0KT|yGJ)ij%>3aij-$rd(tvyEIgAG`e&{_(y?qTxMs(6Op+7&Cgn?nrBwvbF8Y>n zi|XOKfV<p)UNxEaPWOPAF}8`xYxg)8W+*@uC*&aVv^&M9Pa(7RUFgg&y|AhezlOW0 zz8_B@I4RN$yICD!9oC}$_8p@310KDw8Vu}it_am<c<~g-1idwJmqzW+JHan!;@N|< zH6MOFC|VJTQ|N_@i>7iJeetZoyq1=xxI)g?qv$7sOE$Uv&qK0XMvn6qV;-9$RAK|4 z3QM_J+zhvvH`K4oq)*D1XE0rSyPx6e{swqd5Qsnz+`za?%=%T*ZJRhPlBHMB%D>+{ z`o}#BePrIw>=no!dzs&eNEcl!^S~Kb<ODO>TMGCzFfsZ4fQpL12J;E{Gw*wnz!-&2 zNVBU`oNc{9u>f~?-*q;yTdLjeGRZMxyfL{)P>7C_$XRsy)mgMpWIv@pgvbrYXW{Kl z+5nF%LXyg~-F|`)>F_yI<c7m5cZ5xA{c#h*BlqVZ1LuiP0EGCusyXCMz-Ei?9Hf}> znMp*t;V8J@pJ3}cP_J+k{P}(HpuPO}{}KJ7)$57a@^G{<fT(a<(+HE#Oo!d215xCg zK|Z@Jz_y}194oEAl{n>p7v1z9IPk9jlLPt4$6v-xX?g`DeKRH?z6=^nsE=y!KAFh# z8mh@>EXKdAxaHnCqb-u(%y$=4V)*2gmr4-H{J=0B#L-8A7St)3=|GDNnu!ltV5WaC zKM$G-7)v4@8UD#g^C!j90u)+($+1EMy0_b66p48oz*Pl)h4ITlM2^LioN9we<O>IP z)5OR_rRDt4N`Z_mWLE+TZe}v*CJr9NjTLOwU-OO3m>v%BkNZFBRu3m`_qPH>b=C($ z?NDWB4zy^lhuh+;-K?P8h5bSUAPLp|<GmASbRZs+Dto+lujw&u_UmQE@f*(Wb`r-% z{7zXsb5AH7T_WWJHYGhIvL9k6vGAZM#Igg;Q#|D7Y180mA`E63$maAL8~oPLds-eJ zYR*tg&q&;t1k{IQd2>r*%yx|Veu?7__!})EqD?>*4!%UYr|<J!zDH@FPxSix1RZ#Q zl6Ubintazuz0a~WDp-8*Ub+ebskI{q2A><TeSd26vDfFe0J{8{p4n_cXA$2w@D^*o zevsEu0|1bAyy4ULJ2_)|pNFHks-~TV9R!5B<8-^LDc0UkMTD0&s}Z9Fh7~*P_uO$A z23dcG#whTZ{xS1$x4Q5Mhexw7{QgC^@zU(fe>6+l-E0@HV9aRJ({Qt<XQRh1Aes)f zwt&GE4h$b4csi%u@1B-FiYFCLI875xQ6T@FwI3=Tym$Qkp$CJb1EonegZ}b{e%py5 zeH{rPotqH&0B_{JyJD2(6NVhAysQVA`}GuBT_0?oQOUk7hHv(cy&eye=8{z)zzG_L z(>L9D?6j#XlSyCjEz~uOg(CA`y1XK2iTUc9(Ou;Iud>d9TVskbIx&END=okEO2Ow! z?&dd1Ue6LiRrzktSj(vHoEY*Zfy?U=FCBgp6iBPAt<m72O6g%P%oYNx^K}1lG*+oh zmtgINUpEG|$fuZ68^EG1mv@D@vGZh^Uuk9)N<%R!yhr!Ph~Go3^FFl7ev<}`Rpqj> za`}>O(-;G67oJ$d5cb)7iR&f;Bp#b7i59SyQRg`C%3!r5lnPvEKkm_hYw(n?ZJ56f z&x8>IURAiNn^;VUf=-9mhiY}+J>L&@UN2sv^I}f!_ai?%a=e3xXvJiyMxw{~dwnv; zLj=*Y?#Ep{vpRJxA2FN&2KX<F^BpWe2@d*GDIY|v^iV5#V5~aYea_?jFus4E|KnWD z5VH3emv>)f*^Myd*$hsWD3$Nhf}P?hslqOPgMKe@cE9&b6jAY#Gqrp?N&aIRlzQEn zo2mx&;<AHU)D(4^#$eira1Ux#m@c2QF7jjcMTd|(TI&`Cxf)>7_+FVnZL?lt7C3k} z+a5IBFr>NRWl<+VzWEteVqQB<_InE9z%5yQ5!n9CWcBJ@`E0_SU|p#;;$A(I2DA=8 z%QvG{khJ}ahM&aBpH^THV`V;@gp7($>flt{5)YgVV86}@n_aWq>q5tV-W-!N7Oxa^ z?N-T#kBk0J89?)}?oWiZTl{j4GrIe!Jdz!Zt0UleinTm|iIu-Fw&jM-2BAa^SktO( z_$i^Ftdz_xhL+nHUZU((u3GAQ8^aG?wfzbOThmjE(IrxiP-9;Sf*7iDw`v-EPP@n5 zNTsXJH-<q&Ea1m!KD8P<r2vm98p8)O`o)f7!^n8RWGj5%TRbLvZJ7eE7>q715;Cwr zP3WcLlHP1+p3YCF%lQ;)zH7xq8P^dZ^rS55bx3wTE}tRE^1LBb>Yl39ZrMQ>n%Dwm z(IKn>>rWPliOm*#I-t6f=9WPN<Yi~n;9l|1^4zndP_6EVLai6(LxxpZVNT1<haV~5 zZ|fqaHf>Pt5ITs0s*>-B>-^ZKtI^!N*mrg~Lew>}hS0Mf#y0YfGNIc0+Kh|djmh-| z5SyJj==_!Nb07PQ#aze7)zUVAD|T#e$1TQS9l)nj#LEQfEZV2U{B@D@_6U3D*w9q& zcnJKi4iY@enqYGo&EW&V7P0P&VbQr2K~0#JPiw}UiOcK7fv@%(jxpO`(9aWGb-m^K zPd5(&$2B3e4c>RNW3^5os0C82OP37%7~0Hs{Va$nk+DQBC~Kl?D;KOQbQ@^vbmu4; z{{`^P+M1oIN@R4v;Mv$^HqU^hE%|h6$BZx|8zDo4FNhkEHP6v^{oH*#NYFZU#-dkG zTHM8=wi6qj%?LCC*;WMuwP@Ho$Ao$|K*aTPo~P_zdlRbN&6&pJCW8Op748x`<g~)P zlU?LCTd+D_!q~hKZ#sXk0sSzCiU!&LonIAm9@dH3^>%)qCR}Gn4OCt4p%@$&4Or;e zlhn2a==;!8YX({Atp-+}pmqLWwG8D}C;gD{A)D`LlD}yku~p-z$9b1#I}6tTjvkT( z1#&Cg+JFN?X_L!8{;G;>wSp@)TsE8+K{R0VR+7lhi?R^XbXAm_fQwj+VLf}AHeak# znOWw*(9^#t7Kr=h1R*i>K`1CMUp^8nupE|GpI_dROEsH==)|VR=qPp^o`U4T8d813 z51yZRalDE$N@wfvfxH;9#h6@c685ZILyNOhSQKuR0#L8*4j*Q=asF)fEoFIn<kN)$ zQ>*I*@s~7)_SLXD<?t$JDU&|_JR3Rcvde8=T`)uNYJ+9OabC^9<iHQ!Ip);_49-)Q zxmTYIBnn=IUuBDvj{Wg>cf)|QV{pb_|L>`O_Dsy`$3d?(Gcwm5^<tEd5V@}IFVA%@ z`R?nXEewX40SU~F$T|GWcboRWL*wF6ZAx>3uTEfqeSq3<fZ?D4Twu9<L<F|?m>}8* zet^MPlOoRA9Ovd4ssIoC!la3RfwA@AT(=pJkefr_!OdmLc8l4w-x`OB_97Ruz2l;W zz2}9-{Z5jkT|z+EWofc@MK<DYDn|q4FEJTgvg43le)ljPkryG}KO%xdpAKqZ`g#<H zV&9DNQ0-fFhZj9#JWTpd*P*;0+u_(=AI%(XpE&1iKaRKQm+_@v<q7>d{*8W<kbLd8 ziMtvdmV~5qc+##$f6bp{^|xeSbaZn6bJ{T}N^$>8X^0)0s?>LU8q?T>w5F|7(vzW1 z%UH%bC)1hj+)zU4g3z+ig;~r}mt-~EE)Q=+_{D*Vy6zq1l<wg{Pn8~>1JkhokMT5Z z%9u~9rjO0M(9F3smjV{Y&8I-bl@l40`E9<%az;&btmdzYjm?ao-?5u%lOBi3pZpwN zkR%HI7qcl3=QZ36$C)+ROa^w%HrwH{=k|Qu_VQlNm7U-DTwU6(=i0KD8?WWn{tizq z)V3k|EqO)c-EtQ$A5gH8h=_|+p>m~Ft65ofnpa+{?p4yOfA^uH?S5R`)v<R_ts!P2 zUQ(e_i!6#|g%z>sN{hn@B`$Z&cmf6I1qGF_NRjy=A?1&*pa4b63RkYYXq76%s8$zN zJzjD61SM$GR-z7lB^fYSnsMW0m^4$SIrC*%v{bGYn}s@KxCj?a6zP$Jkly=P;**t< z72`d_m)+>M{e;H9)2FuayM9KSf839+)gUO20}7%DAleWF#2Sr*M6(ev*IWcFRfd3a z<($AOtE}=9mFjT~t^m5KldNvNfbJM1i)0wkBco)IO#u4NKeDK3WHB%Ry|zde6B95o zpaj4_o&*7tO9&$Qv;i~k5>%JFtq%9X>1BcHeL;91!Xn|zqA$B_q=brT%cz{Tzl{*B zGa9;yB&yA3kZHM`M66m8t&&Bp(FS+x*&c-?NFT)*q@P9-WYpoNK^DO)2C^8e7|1eu zV#txuO)Xq(1UVX}so^9<kP{_Ekdve|wJ13;<N_rT<Z`7|AXg~QAy;XLAUA8O3sFl$ z%C**|LR&*Bb=0NW+Z=MQ?z+_LO--ZbB(-SivYT2{)21Uyow`El){`*gIlW2h)0dil z{Ye@$7|JkmC}YM0Lf$bQ5b~j!l+2<9gnWUXFyu>X5#(o^IplZzXcHae06`f;1!pP< zHB+NOl{qAwEQ*aFNsJ<m#8D(hQ^m&6C6X9($?!zJ#@fshj?C4PTc|I$iV|6?S4E3{ z;<2l=C$2kab({8$`z9@56EWIACRO+>XWH$mt_ZZ~CC1et8m@uSaxIjOWP~0v&OoM7 z^6BTyfMG-s<ANM?FauMj1v|t%BAi7*ELq0&VinPwb<S+q#6_}==*upx7~F{dcxep) zMGOL`H5eKZOHh!Lu!v!Val?rsMv_Lvk;RRn&Y3GsTI1A574gLs^EXyNpl|^iQkx-| zn->~Wo24T~AARhMF24iYA}Kipgyf{jN=~-?<P<2#UXh}NH6sSrqAUyL$^$vBB4H<V zMR8M4xZ8SL=UvoPJx2?9fu5@ci&3;;2ED<`(URp%tyl^7r_IEBTe%N*nu@N98z7ib zfkHGUFi_)y0QU$B5@eGFB_vY`8ZgreT8L&N*gzM_Aw@L(K<X6fA&r^+kj2bl$Wfc) zKw;)QFsQi>C8Bu@Wh(O=D)dnus%QtP3>qf5^+H7Cuya4qEe;_%$j%W2=O`lLgl=)h zh@3!NPN7>)BRXgFBCx^Q1(<RcQSpIK9xE45^Hl$n!=G*anO(vXUi`&y3{K>TME1Z3 zA7As;(Sm5}5t;-HN}}W>gp)zf5D=0S5ot;DA4Fs%!<m5FZulezKFJd<0+}fWvH!w3 z#0PBir~KS^Og*=-|NqAtDIBFb0?YI^n5HlNtTJ$Ei@^+Tk}||V8VpQ(I_oqVp$iIG zfK?XZ7AD-oQt=Yv-PLTc3p<-Hyd^k>BjxSv^x%ejpEm#~P^32tHgGINWFb*>h=_6< zCaUmN;i3jTiV$$D1Q=RLaMw$gM#n%;bjD02Sy_mx3W)o_sYwMj%7f9;v5Qm+g$0yH zl2%ET9)a0P%T>Tb>4F?lbV4{oMs#vvk_d}D*hIq7*5=`7Xaxs{@ODHPVXkf_@rR#8 z38YncGV;wIkQa^e`?Yj=)6*BuD4f*w0?oPjfuyc8DPDV(SyZ`m6^>k^IrR;x510B? zAJ?eHgo5ip{u7n@C#$VwvW?_UkizdD!Dteaq=4<fBo*w$*FfkAlUcUIHVZr=Hd`d( z1#OH6iKpuEd>MXCW&bdDiSqYdAsl}Kb^HY}{sxJ+4IO54w|ETaLf~wp%j~F_i)iwe z&vyj%4d5`G5kaI1N|v?Q1`#^Q!j4R`n3TvK_Vw_g{U>yy7m_}M5CWMeDx5`VmaJ1{ z!!{Xq9O@K}TMuXA!bs9c98GMTXlj?GJb_V8)_d!6gQX!i*<=r>;r3sj%Y;XARU{^= zj}>W1%n+%~TrIf;da79AbA^?@Gzcf6ev!UbsPVmCKm3ZV6I+)!$&uauM)t_ADo0Lg zpWG(PmmfK(AeFaA;}H@kh@B>JwyLIHgX4lGHzRC;#Fb?;{;5rkhIQ&{KsT~`q1pA( z1pPE%kOt6}kw88gZxQ5>!nrvyms}x0PBdsc3HZtCrBb0n>)?PT=7J^X$)1ncTyRpI zkl4$x;(89z%Sx!@Rw>SyrXB`P8d>)j5RXfDvQ}Mg5A%L9Wf8d;&NtHn)=|VJw=ybW zRLZPOEZEA=3-f2|-XNwNrZxH*Wv#k(*29R$CXX`}sCXO7a)+)-H`TmHpFIGRL1yEu zm}GoZ$2?_vi(}^BU36k{(vrPuCTpz!vh;XEUxRC7?V7mrHLJ%Xo8?ox`@ThG^Cjb7 zWKaPEG60W(<5BV`2*?uzc|$}#ASebD#r^^TP}~j$eSiQWK@^FDWY~!30ul%gMvo;D zCGR&yDo2oJHVMqNk_5`E(i2pw;{obf=>YcHM+Eyr3l6L?9addcgEAiBaeRmG;u)SV zUgPxz4w9l}$O$tFYo3_RfD#Lk%D@Q0u}~_B;dqb*i}zqI4uzDJ+I%2$qb{V{dS=zd zGdG!rRK1u~;j2}(+K#Tjy!pu5Gg^lcolerOM^YMjW4SfH)!KpRhC7<NOe&t5PF-sK z7-R-Uj+q_aT!gw9-NPNq>rCl57+N|+eIrx69XW_0$Is30MVfy~?*1WS$SKqmtu4pM zDLGlOeVMBSa=9`)iw&!d+JUta#(l&a=>tc+jFv|?)WBg`%K7V2H~ckZXiSG6QBbq( zp0zPvB!xX~2nSuri~<>KMr1IBiwlfGz^O&nGW)cHzF6kOIO4{nO|34^oh@oa6op4a zO)F`{sz#%t=_*XPh#BWbLFu?Fx~?=iHG4iZYQM_LMS!NkqLgdtiFH)1Y@0Sdg19l| z%emZfcj``QuUQ*8ap%{rT6IYVCW^*90v&|<`91-oeq$EmO5HV_tD)uQlWn*SBr?{( zPJRQ1rk$dVxsTZ$23@TgC!4o91I_2upe6orA3=5Cu<7ID*n<u6<+!nS*_d^lFRBV6 zCOSQEyMUKA!ywg!)cKNx6>i+Paa#pFG=6QCEDO<ZE2vB%gh*kP(U-2|3wbH6Nf^Xx zA^evh>fdnohPM2+w@PrDv-z=ih{oJe;%JE44wYH~)BvWD8C020)sgUxNMe(GXNB}4 zl!D4?RJJsN7Gc(~56U2m^mePRcMF=9np1>*MI+|o8@ohtC?eGCkr01w%p(Vf2^VhY z7&2xQ3CaO0uMNscF|q|2VDdi0SS*5z;3|0fdV1b{J$-sBBicyOM(QU@KT-M}jhc6j zPH?ivY;%)4p`1nxA@pl4?=PcJ-uBbx%z+DM4s1Cz7Q^RbW}o9HGyA#l<Ik_}PtUur z@9XJ#AJ<=ypcg2TcRx;?K#>`^fA81Kg5XF9QrX7{64MV6#Z(x==&~Y?$JPsza)G2r zmbD(kwT4g%${n_us~W=>=8k;Lf)Z#_F?^WIL>`#mMi+syD~P%lq>SJe%dkpZ&*y2O zie@Zrk(Oz!At6JBS!OZsdB$<cUxSoUwU(P0T|C>LW;c;b!jl>PnN>LSBP5Bi8_cFy z{-V;R%*~`NR}wU#@r6ch=;K?O!!VUl-Z7~UbRh9ZB`r?q1`!45s+Ul`g!X$dgv+Af z`$|~@siJj7Pju2FtLv86j?;dJ=9!;s^4nTFZ4T}nw~s?}s6Oky&GpfVKX)1(g2vex zjrfWeN*SHsc~H`G!IN{)Yko+jn5wVCsQK`v=7@#zYn-okB1BT(^_T90pe?DKLi=tv zKg5LvGZsAUANoukl~lMl9s?bx&Fgq>K?M!~#dUTB&I2825-L;%g)Za?=^?@>5k`sF z^XbAfhD=b9O0}E`eM%R!eNOxJ1*h{${Q55U-ETJDnsABWWtkb)PA7a+LDP3hjXr&M z?nBNF{@afukB(v`#9v0~?vpm87`FMw(KXE#*O(!MTavsNYc({`WqOS@lte9D^4b4J z-`r8sIr=T6q>pKNA7zv3NtHX15{>y^jy(Pk0XUR>Q<Q8?vu)efZriqP+qP}nw!3%R zwr$(kt=+bL`};A@J#Y7}Q6sCe>Y>(H5t%t7Vn)QvsbruJoO@O}+lvM7ZUhN?jqK8V zQl@qbm8YqI5MrYZ?HAf81^-wWhJ3gefv*5LWZ@$C2<ZE*n$<7wWyS7#BBb3t0AmZ@ zCLWk(ACk7bT|>va%JxrJg*&P2rE<A1w-idB&{+gb-`UA$)b;nlJ5MV$?a$2*t@=fP z5pLq{Imj+#HXr3vQbYkjGdf^!n-R6Gn6K}A(bK+0TTN2=v?J6zO|LRl?oju`p5{-_ zvK?V2$^3!9P%^&`153Eize^-VwrNTl*!M4NhBYgT&!f_PFv@d4zvyR<RuFj9H_)yv zJxrPw#Wb^hT!8<8kT%7L=)>gQD5vukbsYh93J-evy23-sVLv6uo8j$fFRF)&N&8J` zt1{>0gfO6Ah?cI2;Ur=Al?NLrj^3PS=hG0w0Dx{@E=+yeHsxng%ZIemTJ2uNxB{IW zn=P~#Aj^&%Zft9^VrB%?^S5N^$seK}Ad0r$U&gxfxeawb`WmXxeZ>1x!uuHx3S^WO zm|JU1w4-)LWZKOuUVKy1dy)kF0!#Nw^+QgG1_>f@yBPqm1n`9>tUf_OppVZ8<S4=; zM!@|v5_`QuJ++ax+t1EkyDK{cT`kFV#uHMp1sO0pOV115&3(Dxm=swRM}>x^ea-%j zTZvQY)_j3a1Y7cT@e5;#3fy?L8<00}{;|T&+o;!hb-2Bh^O)N<DK|K2^Q;#Jl{#L# zwK2qDL5>sb!w*|_bLPh5e0%o3VhqS<GG8f<d6YLhj}Bt1NBp%9l&!(o5HZ3zx&q7B zU#vuqK@LXpQdlNBq23MciDHj8)RwT<VLnQfDW;(-n>>_|m1>HhCXQN6GgWiS%rHL~ zDj38uwt;o-s%gIl%Q{M?Up*{x!CpGnK>p4QlDEi0<t~>vu77!aGX$*AHT1hc8cmv+ z2gOf-CUvGvCIVDV3x*y*ps<fgNEBSBsGbH<V+eJINOnvwKv(tF;H(C=kmmk}myib{ z&d6tAa*zNLfY}d5p{l2faLNu)Cjuz&I!{7Fg@e*&fGjwNHj`>xp-gnd4a8@|p*UVb z4&y3az7lLTcT}I*{8<1rMLA<8nwgq2BJSKkn=}nSciWKfwLTwo0rm$%j^I~d)%)#L zgWp2Ai*^-xWXRfMGK<g5v2Dy^ZzDE=r|M)AEh9bSAbCEp!(AKxWiu=TAV+ZDHe*Fl zrAA}s<~*ERbS*D3rNMy<3z`zja7=VG;o^vHtyTV3K~b)7CPAe}F_qP}tEk!VaV^RC zN;LCbz#K~w6(|jq|8HxsYFq{2efw-z%ag>0Lkf)<!F>6XQQB&~^~&=$rcwh|PAw=@ zP+$9WT572V-BC~)N_T5ZDV@oD|AA8kax{LiP=t)3TKm&`)Eq;V)3q)suFG)oe%Igk z;nxtjA|Q8j>a6g%w8h_ONeFlm!diqBH$v;<F7maE&CRh`a>T{xQMw%;n9;mV8-${* zBZae2cuUQ9f<;C3kwX>olAG>>TzGHm7W9UYcz)>XbjEKF6+BpWW&9*(M$Xf5Mb)D* z%7<Jz*1QEZ#ET84ynC~<)8U~qU6-+NXIG-!5#6(l%6Yi3=Ec12Y-2uHw@bo=6btdr zC-XNbuzGj;#Hs{6%SrEz)862OIU}2OL^TECi>>vh*`|*SqJz1&Ezq20@A=`YVr9YH zIQODtG_2dpRX`HGZ-U-fvpREGa?1=SaR!WIn}Im{m|`nXlVB6M&=1ip&S)Hr+hAct zSR{yxza6GH|AyZg>5X>HNnE2Ggkk#4j@hN_I%)D{NE?z8kgjUi%D}!}P4+DHu6HMB zJi}ZUEs&a$DbjZiRJ-BHs{ZaRQA#cTl$L$)2O~_GHfLwa#L0-J4aEa1@enP+6KB3a zvg^zX>M;7?q1`t;7!HO0Qb*-*=~uIQ4ON}pC#2mc)Y%%2N}5Ec5~va^M_U}ojz5U3 zz$)V({8Eeb!dD}$_RdH7o4OuB3uA~*gig}nZa<%C$TO6I!P}9FAP7MaY#tDw%^{^0 z3LF?}5+h!!5w452I?C|XtKvnZSt3(}1Mgw0S&fmo+zj|jWUvK0_h{E~sSNx)X!&Kx zcWB|VyO?<z`jq!T7YG{;&z19Oe$~R@DHFzh)_K+j;=ZJjX)Z(n#t5VkU#<#;`{iPx z0KnZ!^gQ5ddOo9EIx-52GU8XixDe+TK5)jEAgg116!*mH2aZk7fei{vHSzErq{JLT zyF~@Y6ed*G4oBG_mvZQChWtq$Zj~q*npNUo!cbsL?)ICE9ySn|8<Ht9Eg-HnC1Kqa z;|4fbbJ6o5gh_*yi*3w9A=y}vR9_?#3DI~$l}u+0Mk=f19HQ8?^F}AzDqoD~#hViQ zbAq3Y$Nyf#)zmY_kdi5t%EhA9oH3a-Eb!Bt>#U2kIG&Z?8WPdnS0!4gow@%M-1*Oy zSBHAQO-g_I`@2Lsi=(3+YpSpy-$<ikx!(0+(m-2SWT!-b1l{N-5%Qlw$pks<EIX@a znT@_K8_XNnp3O1R<qSa{Sdq>%ogZG&pGbDio)tjEHj4>k-kT`EfYmpAiyzJ1T>obA zd-+Z`dtXMD-W||NTOTkH85Ns+O%$>SN(1$q^o~;rq|(J4SA<NnWTD{FV|PE0bP$xn zWJ(eg`ECmL*kljW_9x*1ze)34z4uW?>VdYrmUhyMW{YT^kJ7MiaX6&KI0GZ+s9riG z>Q`4-Q5)B?9J61k*My8(vC4jJ=Rn~6z}_E3mV#%(a1)M;Od0z~E=&jz!J<4PVScHH z^~-l4%a3+k>s7)%`<rmgU4OMkDc5zAG$B_SAOaxIzV-}D+nBQ4?H;<qdx(GPC^+~0 z4949}0D>S*dx2Z~@1ya=rvu}KKmdKO|2*2RE)W3E4?!gl(s_EWVlx!@(EXS-xiJrH z$N*tt0t}EM{2xPC42+RNDitU84}1FzEz74<H={M_z(L7q!(ts0?!oQvKBErsA?_mG zNU%ou#E~5YWcojV4*24R`E=kQa#R8c)<^ri7)S41s_BSu*f-=rh%x0-<O?yt1g=#w z0YcjA{Qdv|5P4r%`@WOvzI)7=;NdexNClUR-C<vocV38?*}fKJZr3a9XpNt3Flqo> zp1_0*6tWG(@{x|p1yC$yA~`nkiU{Eth^Rm5y9-qN4Wy8L90BWft4ZA$Z6fv0w4!17 zB_3c?Z^__H2pJW_P5tV4?=dW&spe~D3|T4b1sI&z4rY6_ZCDSB`VWZ5y8SQpW~EhH z5n@_#i?F=g1s;4NDnio_x4&Dn>&t*ju-$q2L1om20GQ+f0AV14@nI18%_^I0J*g{9 zitrIKE2S;evqi83j@iJUyqsN31mbEz@c99Nfe0XkK;*-LTKWL&9<|ImlmGzgFqRmo zjsNpCzq6h-^RZn=@$US-#frP+HR50P8{?pvzqDYdIL3%99>nyL#<zb$Rcs}bG$L^? zka99Q>(etRj_ImzbCq%yJg^$Ljy{Me(Irj$^71ip8*r6kwcm029OZdg;b?Jt0x7XI z4@zn<F+zVllSvH7B`)5x{+pPq{*u_~j+Ac1m~=a;nwQ?6Nd-Rh0&(H0IkO^M3v0=h z?u#wueuXR5n7dg`@Txvnc_DIu5Y&?SRvyFE(Vj&<m*Pu+k(H?KG64P3SmFesZ~P8v zfAbxk&-88i!O;1d=yuLI4|J*&CHY7$DX8Qn`FJiFkj2;tcWi6hU0jZvcdhM0ve6+^ z$t4&AQOXyJCgUk8xjdXtXWFFGA7=fON|=H)oXGzw%+J+RkBd|m6vYVWSIYnii?Pq7 zQMQXx=G1!%10Qji-B7)9O=$Tzz^)ba!9Dc=-!b2izD~h|6S5<fDCdGJ7gQfQzbC<b z@dIoL0mo8&D8bxHRk7dtO2z;8pWlguN~rxzCKIUSdVoSAQK%Fm+r)a^G!d{JexW1w z9tCg$zxIg5!w34H>?h3uC)gibDGpZ06D8nBBoY&eCs4|Cz+^OZAQwux!H+Xo50N+2 zQyqBDfF*ss+D$ZJH2#(U_r8@Fr8*sLYvxlGbeH|ZXUsqdH|kLyZ!S<2LIygGZw_Di zTi?(k2?LN_*X~I<6tJ7}r}4C0obV6f^e(1Y5c`h?;>rsgfcE7L%VRpmc;eS{!hUXO z?l*(-XmCI%^LW!RIng#6o)&7h;yRzR)>%1qS?#!==R5~`BU}_B{0@GjmUj1PSNZDD z5ox3vGQ_pBfB+FlL;;OV-q5S2-+NWu`*Yt+j5(y7&&g7R=3;T7*&Gr(TuGfGxGbf; ztw?G42sEcsr>Q{a54I<ACL-(=b8TbS^?21*%jZSdI*Z9l>zJhManRV?bkE~`fGv&I zQm}Y;l6ZAhPwx46%BEi@&b33{#c*(fMo(>MsL^0OT*2~lpEer<^)}$&6?tZV4vtJ> zw975P^(tg)m^?L@Rau)>X`8iqSS!;k^bPCSS&vtc6V2IWrd+wXNNo)a3ko_zj;t)^ zHTyZAF<6n@-_B%|6K7NLX1pKvM{Gg1K3u>0;=bY_SJgK9Bp6WtbFBQqv!2ok@B<Iw zBXfm|S~hiK*Rf;P<=ZNi<H5@fi~bD+2Lg#GVic-kFR4oso~XHE?&29VZ`{JJX(Q`u z_DhY;4PK5;?|~UWI9+}uBwV}Ra=HUHYu}uTZU{ssPzW0$G5vSo^Y|=JBDv=lW9R(f z{^v;g%+e!P<Gama3;`B$dICQ!z|a0i8r}t;Oxv4!cnk7(Sz0dPyl7q|^XjU9Y&Jx( zc*VSy+NlwiwR7;4@EjUIkUr4RRB9Zj=4GeN<#?x%Y*rTlVGy!#+`4{4JknG>_Ls24 zFIk5Id`b(pWL_F8#e3-<<-N?gw&bI<#8TXpx4Bv15Hw6oQvE0jGJ>`p@zhWTe!xii zhF9ckPpnu=SMn(_)NPs*&3#RV0GCZjtJ!?MdsyVFC~<ea%1iSWPQJy#X$%7GqC_8Y zUZ|!p#|iE-kxdcc(V=1w&nSF?0`sXlDB1B!5Cz3a%xYOX`phXbvC8T3tBd`!zgK&w zM^U+8{t(C$Z3xFT>dmIxq0<|li;%;e4mtp`L@QOBeJvKyWSb2^mGqYrVyeZ8`>DNf zRG)2CEJENd_==~=XM2E0;+Ri%S9~F+=B$`P!$v?;&S?ytpxOB~*#{Owaj?Ju2>AYh z87mPORfRm<sfG5!+d6Qh=0&xuHcx|d;MsxB@;?j62XlV4K}0X^WMou%YSs{~RJhzR zrDCZ}rBos5uTNG;5*P?jK%9V`JNUn}fT=1_>5ft$8G-;|9HpWtxd|p{+|a3wyN92= zVpV=|d6A8tnUR%&g{if!sR3<sZDXB_os*-p-7B6v9snPNh&&XTScHjsR0<YW7G2^; zPO_@XGQ#&#^dJDlV6xdD77d5_6~0rB)&GJ&SNC^)LcSk7$oQ%un2(suYUk__1f}j0 z@#Gi+k<3SwOJ_B?I!pU67_`%iTK^wP3hGk*-)GL&geagMPnAsBEV_xah!suhL|0M$ zFC`oPkCH*JM~eR3F?0bjbkPEdth@0nu3B=NL&<d&T{1%}q!u(!ErmI4#SP?b@pw%N z@5lli`=(+k`NW7L3=bA^)jB$;1Lk$ON%J2*9RPd;`Y|i#tWg6RgW(RFwT+e>%S(<X zqV2)a_D>egnTeiU9eB@J$>B9zA}>;i0VItR1A7+*Bv04BOaPC!Q*Dm`_gBDY5!Md) zB!cYCpg+s<zXCDWuR{>e9}wn`LLmWz)BV}ekr0R_1usZTG@?{(He61YinZc&ecoWv znSb2M3PvL`>CQ{Z7EGqo9Hu*hc*kL()!HGFDisbtq7SRYl?xK}29n8aHeW8$3Bz!T z%^*|22jqtkm4_kw*Xl~c%!DC}{zsH#R23y^(NyR_04;TW#7GQ4VeJ11ac#D+Alv?o za>di2VVpF}+os`e9UDREn)wbpu>`hWfht9cIm8kdmFD68{#P~1qE3BDaeEa~r`aO= zFb*upKR~XeEboNv?Qv6@i3PfQ%Is*^`p9}=y<ySPmW}H9)pIW(?Bm7Dl|_Hb^at^- z1<omFD+PJNX4bZBgeOC9OSDpL7r#sId>sh5VhjHvTcQ_Wia0{K6$}&}hfpk{P|H_s z6+X-O2#0>C4E+903!j$TpA^v7m9MK&z)~uH=gHNQvblNC?pnLE^Hi1)=vg=}=vn(Z z@J=YY`%Y>)Z&W(G(ZmJ)WKXx+g3jrNYE)>o!uRT8Z5&FZlukoJ2~9d^vpt3JL@ITa zb6jN>G@#!?1mx<~Befo2{^Ao~<s9~vxl<x=fFe_{Aly1J)*++H{&Fz{TnCCn1{4}7 z8xJ-pp#I+HNL6ThbcPd3BO6~=9T2!7YCb<1CbEU*ap%e(Fn}{Ov}I7N=_;JnuETWw zveV+<q0F4sX)s%x^6Ey8UvmQCKob=EFyPMi7WF3pt_B3&pk;x2t%lm`sqzo~e9gXK zhX!r=uJsoXG~}5!85i*dNhfi2B@e{8X>V1xHIl=2cWev%C$iN+_1Zddr|UDF4ji3+ z3)v6Z0Tq;GZW(<zUwv8ucVZc7IbXGU9vyQTcRF7KXC8xd8KXO2O^1VBx`OLzFyGUO zdbEO1)}baKd#appn1q%E``Ud~-1|VQ&?AvdB-Zc4ikje6^B_V}S>c|lH!?Mt7==ed zq9&w>xESr8%r7!y${3YueZ1!AkhE1*F?(NA#v;5qwPI;i6mwDihYhdgu$Yv;@k5Bf zB>YHUM?><3EzTdfr*0~{;go{?^###N0&YjF<v>{Kj3x7+d>W)=Q_+0njFHxosdlWQ zHOqG2QY-TZ<SFKr{`ZE@0N83SGS?6F@k?6NOJ?Wraqu*=#<vMy;xGxVk>YvrhX(Qf znrZ!$EAm5w@NG|fb_A!f`Smu)=vFM`YO~7ay*_EPb!RDxperS;dIO8lkZMN?`I<Pk z;7##><2gKq<9p1p*t1z<?tbl2cwH|Ni51?Za3?;Vz~y*{3Im1cKu@V08)(T=SR{L2 zX1>gm`SuWpOL>OAHi#!wj7UU5X-OojD7d81Rn%0LL>v`s8bLA|PyL#{P=o^wdbGC1 z5Jx0`)1Q|&g9Ul&J%^fIOK1|NTz)slenzXvvtw`z30Eq!Iea$f<^Tqx+u(4JX1MTB zoXO;efkuO~9JxH%VtXH$&EQQyo8BfLhpnCdys;A(R#LG9VRA8!SJG~w?Tvei&3av< zXUI^z>qNolgag43K?pE}4@fb_4+kY52(^?4NOQsu4@MsdIi(Lswblm*XCDZ?^#_pd zr4JquLJ(pAA%J`c9}ZGn5NaVlfSThDg<P>fFa^^Eli6avL?{i{2Mh*-!E_)Q!wHRA zquz8d702tssgFPm+i8HpEZeD{q;<<-7Pz+ScIMaa$IT?(HxLLE618xdJtCn<1R9ZQ zwmamHEuQ*sQ`}@cl}Ihu8x#taLbX6S11hDWqND@UvZ9#P#hhOVb3UDvxfp}SLd0rg zF4eWE6d31J*sNnNMHicL1~JwFn=G57Ut*viQGnRJCjlk^MNxt%htK#X&DwE{B+eU( zyeJ%P1l=sr@53z8!Zagj;6pyY9w100y-wXQ165VS2pVqlqR%9a$NdHrNuAcSTy20t zFk#@lvgfqZmt1l_a$fFJv1%Wsc2`oqATgObP%*iJx%fPeF}a-jQ>Dc*xsv;+l0Sq} zv0hS{vLFIui+H*Z<}yAbqg^AT8mFbubt-#mU3SA_Ff)qmBEp?BH^uCH-DB7n^}D9g zS#@S(on6aqeI9$8hCS4XGgZs+oUT*^!XPgkNC<{~A3t6ginw8n03M1N9YtOkQl@Dw zj#XW|Z9t`FZye{!F^+!+c?dl4RUG0s1WByBZxTPD1o3^ExA{eXP#iyh00^2gW8yN# z>v@LmNwF@4ya1GHIPYmC=2Dr(w7IHNfz`Uq)`SgBoZpvVH(YSg)33JD%D&&_M7Wlo zVX`_Mk0;BeyZ!=$qJ(oQg<YW8ETpEi(gc>of%Mt+^64D(Hv5wj8}PUW7(rB*`xJY$ z`nK$PpbvXhI6`r%SNW$0)l?$nZjep}{SN6@4XB~?$1S!N!-CJiPWVvjUzEL}g9xtn zda+#pLAw8b1N&by|NqWl{_`RJ$63Jabn>rRE)YQW?09z!Xdv|M3>()juRRqK)_*-R zn?UAdP3Wa9!QlmiVzN_FG5>}}=9&E2NL0w6DvFYtq5a179NM^g_$V%6u;*<0bMXd5 zqA?h)4$oFB_yU2TP$+~1R3gLaQ?hM0H^7iv_;dQ<;^KuGC9|gs|L;(W=6|46Z8#zf zAV5R_@-8xV0-VO3yb@W0%36bxxAwI`<wpSSq<Sc-6|41e`#?K3vokb$x<UQYWb>?K zEg6-tI-QvCe7XS#37w>+M&a@)><_w6^JRt4FcTmaKgB@b?Ru|jN4pdpQ}pS5di)PE zvuAOIB>1Vng;vh4DAWx$ttn:n&Y3J(F%MgS0j4AsOlPp;kC;bT%#hdlcJf?URo zge1F|t7=i}JXg&1xoGdYwf?$p6W9IZwT(sl7fS73)r0Hz`0)|6-dl?=`ofZ-H_u** z#qTdaARq`7Vs!|RB6))Wzn~yLN3)gBSKu^HZdlA)NM?(byY~_Q@3-A4?cAL4Ph<#q zUI>@~q&|p<a0&78F$(hXG7Iz56Abi>bPe@&@hW~XCf^6J!_`<8$FA|;_>!hkk2I4B zh59=Uhud`rIXrA+6zo4mpu!WY$`~mTB8QLwg7ra$?E{O<L%Yu;Aql?uZWq#|iaUgf z0rAoMArlSSpKv6Jw}18q0K$(-R}wZ|c8UIgA4A||+zxXMg`K1pNjRd&5J{2I5y}!% zlatgGO_kLZPL}pc4%1J(ixvD4)nSk(6j?NB-LN?UWx5WVE<91UlOMihtCWZT$Y#Gh zx`CLz`)yxUID?E9OPXU1W0AhQUq&md)ytega(FZ7mm?6~$N*DuatbQhNaB%b)VD!t zR_+h<_`hMFP1CrkmUZ)V@Z}7<RitnL2mk@P07EuDMWz9V?%Rie*th{>Ed7)AKhQ3% zj@Va`QDhk@>^?;w0ze!l`{kYlAXN}e67xs1<dVk~*PwQpMRBM}Ya6d$pBk{6PR7m) zrAPNs$g-U&OWDlyb5L2bBS;N`BqPqEygK-9j##u2w6aOC=6de-64yM_(+|{_F353* z+<mheBfGTK`#GK9{KCkHqMA4s$B;H-EQzRoSKTQ{{c|upbt5K-h55ip&7)AL2KtAi zI8uC4nD|{AyslZKqHe-(_QR!ccTK3=+(MhD_wgmgfLx!?M%iRc&-72r{gmXwEH4#k zRBf_vZM`5HgC!6E=khs8X6o8mnyaj}+6%)fxMymwqtWa6qpF9zoXB5rh#;PjdO`L2 zJ1{vd@_D5o^QruO&{G@MWc(v6(lq1M8pm{*#@-N|Y}i+}SmncuO9CuK!G^|#4J9pA z4UL(^jo0An4_u8x2}uwmlWT0R4(?oC7gP2Ugs&V(50xN^cv7iyHQIKlZYo7#$sG0O zfEpu0G{B?=krE&ysX7ERcL5AXq{<)5-12-)LPf7`UuVb%)TEqmhTlZQymVfjg^jhK zzzWFmg7};P8X$W}$|3q^AioZUoS0y6PLTD10q8;WFR*&6I|-}pj_oAgclD_o-fmqb zJo~w`d0)A91sR{|F1p7~zKv)&ZWpD*QmVQwKE+#h3%kjVcM*fY3G>W=Ue)#Wp!V?s z-vsFCY&Sli@W77{0G^HO&3fOb!|wOK<L6<$jX#0Urtv&1jyzRyr*7-1`5(M7qPUx% zM+ZrRgce~6N)yv_kvn6rwPkPA(e6&X(l>MG%&onz_#*s!Lm=vM_@8sc5#Kc9^6^*$ zEJWU5t4K70e=|nj0J^Z-Xnt8i+e@<YU1{En)9_}8No(XCtmxX}EKxJNOs-0DSAP3h zer9l>Ed7ucWj?&Jyj?2!<{vK2*`58vIx_JZBvmH}=QNnou-3AaGQ2UmwY`HtEXi_{ zS2x4jQk=r%&KFI=3FFf~jA#!G9zt;-nrx*`BzbCO=BO|e;!UI?U6ynIsy`1RM30v^ z|CMV{0(WhZ1(;%pOu-zL)hA(4LbrH;5dm!s`C#MHXKG3=i7Zblpy;3nF}h@?-~Ofu zqFl;@0|>)C2?0b00nf7=qLNhrR>r@ci74Y>mlH;IRv2AUym1RU0Fzt;!@Ww~1Ut8t zYFJXVqWOf`U<H|N->mo)dff8N*j5_+;Pz|p>Jk33*^Uze?syj4f4x)oB^bd_xWc=B z<9w3~K7ps3W#AP9(gy|(gMfr0&j(9wB$*cPms{6UHhoiPo*Mw;ToZ)nLjMDD?DV?* z$G4^4y&ntb29<LFyyqr}k2B?~;Lh*4@p<<Xn^n(!l-yz~s|ND7;A`jG$coSCa55&B zhPdvP?e(ke<(2JKjqOE!&Go$PWoq6;ahtG{b05uZ26=4<drUX(0V6p3%){zFMU8%0 zXpVm2n@Sma9Z`s1&tbzN_|uEo0uqY?Ss9go?uYu8PRRfnZhztCGn}u(8r4O@+3+6M zDXumjL1(Y$UD`p6jhk&ZQ*Q53s%+Ue?H&GXuho+%1KS3@>mU|lWC;6Wu}jP&-n!XG zF4xQc_cpJ1Gt{4vVHIkmLT@bWCO(&SP?|1VMWZq%W%LS|A^hJzA-zI3izs@?&6B#I zy}yF}37wkJBKgy{&eUDnl<eMWQgxK|(=@Ur1ZmK4+slg9low5d8O(nr`}=>}qL_k; zVmlE(wyOjATdnTImHC>6o6+{9(ul=kd+E*MJ=wtX-Arh{<HesziEb;=a|?HyZ6;k| z_{VnHT^jq`D&ZK{I`{eN9G4x)s!vmtx{Yo8?rPh-r4j8>1S|S8P@b_-j&-#JZ--gp z@Ipjh^Q|4glzmEV#x>eL<J1GK{n8(WwJ3$P`nb?|Fnx8BOYdAG!MOAa*L{%oyt)Ae ze|2^xbOuiI!mN<ecgy{gvGo?zjQ3#`d%1CSNnu;1SBjTNH4FC2x^7)*)3Rw)yY0H6 zqWxVjtNP$+$K1*0Rmsu4%{6_wy<@fWwKKE-HvjAU?0Qzs%jQz*!-WlsjdTKp?=TFj zHT0g=eM;l_uC!dr(oE@G#`(9~;x^kV)~p~b%>#9C!Z7{d#KJi;wxyX@GENPqY|9`# zUFW(|aaVv}(bluC476w<3Wh1QdOd}FnQ#bVmQCZLC}_*tUbvAgXVTlvLi~ufwB8$& z{FV;jU~Q^}?urbhP1QX?iMHi=CsugyzYp{>!3al_`Cg^^Ge5D5LWxP=4QK2;sW{%C z<3o}Ix>QJ|uyh8q{=|Ra&U*c^e-PE@wA9VV?CWmk*L8UeQi0KM6NIuv6BI0e0XrZS z18|X=5)4_&_;P_P2!&#?#Isnaw1&)n$?5Fl_}I|Yz{JQ*|M)QM@t#VJU@_&g<x+*x z>?j>RIdPRll<K8qiUE~cK9X3<S;^@*=>K)3B9Le(ux$GWMS%zM8wd{-86PGqFEKwf zIScG)?=}2&C;FOMiO27df?JT**8jt$(!<YWwP#%z%`gL!gl!TjlWAUJ0(iv7I4299 z<2*mj-T4ph#{UE2AReGB&JSTBA7hFFejtwx7c&P_JqMRF2fIiQbwCf<JqI5|5Aw{n zQ$_1-zW2N-0>eR??BIaTM}<FDZigr#B2$uYA~2emn*x)1`(i3n&Q6cFo;n=dnAmJ> zOvSZ6DG=+J*r<I-$<{t8lzRsxJpJ2{JaxZJ6n3Jlz&2BQ(Hw2MFr+D2H5h?V{05FA zS$+@_w&^7hkW~E!_Wj{(3>HE61yLA%9zWQq$MN&71kr&wK@`mc1+Xv>6Vp6D2*(p$ zKN!+fT|Xpd$*B)AEw=3a932PRS{SI{HMNPEy;gI<zb}v<@%wOn0_AUhf;62F%;G5j zYC>#b&L~>Z8Y5Lz!w4sqT)ojmwp|_3PG6+bH6)Ddc%ssl_wV;+r~z`>1?t`36&)6k zCfn?fgI#?<DegzD?+34M53iG}cDw%w>0{hmI^#=~mlT*oQy`f&k=XO~+xHnjIb2%* z)bloK>+{OYl^88Io;gxg3<EuAj2E9*`(XZ|bQ~8uAlAjfgh6NZ;3W2QkP~Tgs}UUr z&FAI@j(2*@a0ODdJ74!Oo|GP{aEGFXO5OD(pupbGdD#doW#^^rUclMKbMCcbXVCY- z!IL-?cU8Pxm+T$K)u=glR{J|4)Dij~um%e5XP0MJaZXLRfb%ZQ`Lh9I_(7K}!EX*P zuC;%BUf}OS>58iK_}P?yCsf<rGS~{g%saRP_cbJ7&`DQ_*C4<#-AA4k8eDh_pWtu1 zLT7Ny0o`rd-bJgZ2<So7>er`{B^E=?7`S5%uppkuRgQ!-)Cz&j3NTUsx9?4$cuJwv zh}*xY(ktAaNfrP<d5^cVS4_k6X-tA8Td0X^O)G>}$VTF7i+|O!i!zMc5%&|{?Q=Sj zp#sYC<oi#$Gc(^wT0=H^^B?`%k39Zl?tmd)2&5L?fJ8C|FiH&CmXUtolloNMmb$Q* zn+?v)pn3jv__~bzwO%rE{NTa{Os&d4d?zdeOaf>+*Z8=^*wuYDP4slJx!pK8fSRHk zQ<E1vgq6*+^$gXxOWmAsz`tg$+SuKp*XbLl7;WdR(I|uR=4}*#7ZFDL*%!QhH?K0= zs-?c(dE{j$|CUj}!N#cd)JDTM@E@J5H#5I)pd6-G<+QH9_tl4Y-caC0aRpyt@KD-1 z1P)4EE;BOE#H@bK%n{j@7pB)cUc7dGfK)h(%9UhEjLgUxMhd0~QEUWYVZE#vUB!_c z;z{cHQ44*RM?W4jF6&Krw?g{@!Ukf71dIHbDFrH7uJ}Ku$-o~7VyKw@ecfZx48h{% zPFXX04QtxCtue%iS0I9Vo&-;J&)trKn^U9JOU63bmXme4WwN}BG(@uY=&_8hVz`H$ zN<r9x%D4@#m!Q_rfibO%E{fw5Lu^=DZ>G0isTqQHK?w~J6&W2NB`Ga2HM!lsxv{mO zrKzof1-<W&Fn$Aj5TuZikMTCB1mTjUPTAsl3~AP|tuZ8sc5YsV0jT@8*>;?%P_aFx zyX<|3PNo}hU*g<+6YmXHx{()aZV1T^1xpWk3`EfAy$CanZ(h?+x70RrRp=TpRz2tz z@u*hi$$@n!Sli_l^UEreO033JPn+~YR*U;=K+8()W*e@<njB;WSmM$lByNUqeB1qe z`RRo)S2_3x_1Oo-+Gkt5XOjjA3J1mHg&w@{4euevpS(r@A?Ln?EBu6>*PK{qcz^yN zL-(-@7!zjXj2UgTMr`YYy*)&4f#Hw9SVz!Bvl*iPDkwhzm0f-xGAB=B+KdmRi!{v7 z1-0JfE4j{7+>lup5WSStVGJ-(Si{tLq+bess6Bpm049`97`NZ7P*W`pRq-kfnk&i+ z6RdY;Vjr?liHD|iNhD;O3JB<i6SyAS<mTv5FDMiW^>Lggn9Ptb8*=XeDR|p%N(k_c z)f7bF8T4py42v`x^8>1_MsoWGxeWlK;=<O_${}~PzlaQ0NK5kyO7fdvW3X@r0}9FX z4Jt>k&VeT~wAo~4LbKTIoo@CDo_An4^g<{fEmbNGIx`&W{X?Tt%pjpHQQFx(a?xbi zDobjmBY<2y=_u9X<q3F~U+tj0e-bBtA=(q}`8-a$xnM3~2{KwQh2wT}Hl43n$fxnz z{GBR9=TdkLp@e=*h{^g7sf57_W0Nyh#fr6ht*<UT!eqP!N6P?sc$!boHch$-&*cct zDfap84i&F|!mnunw5kBpI|lE;jATw(;)>*p5?akK=P*w1M5hNXslvm;Zi4C7R4knN zg30B~xiw%Fi2Z1}<Y2{aJJ(F5UHprEI1@DYYvd;?>6W{kU|G^bMV5hEUE~6Kq6^+N zizuFMkkq<dWZd(&^vX%^ZKL(J`*?}}150!qBKy=BO}OS(UM9$339d%nE_}RPP>j@w zlWD@ZNp7oa(}C^^9#=Zcjo=lA<?X^`8Yx8_GGQw5vL+uZD$l*37V%y2LReK2+QvB- zLONg<FNhK)g{>j_rl8HE<=mQ{N=1QT@9%A3jNJ4?gaY5MMz1apdhtk5X*{Jkw4Ohj z_jfI|C2c@e?My5*z#{Y9Ibm@LF(FJ~n_8aGPlQCn`gQcB?f79ZrRV_phL70C!B<7* zX;@<^SMS8<tRz5asp@R$X(bhpSjT_IxU<3~*5fwY%F$Bpovd@=eHU1bvsjnG4i~bs z*^pT@-aWL~mcd4CW~BdoWM{+fKFKuaw{sqoy6>0j6SY_|y?wQ_&)i$~$c=>BLPMlK zV#U@Oj1HXjb4XP2V|_$mK3Oy@MtV^yfOp*v*MiuT^TC|ylQK%#s{DG(MJrh%^JVdA zS73W1-QDL>13<GjZ(qsM#0Ozv+x_7XWZAx7_H?`5z-`Y<<t|AHNGJPPl!p0=rW?o7 zYc!~Hq9}=?@|EwZaqfcA%a4tg0e11j1HDdIlGd;5b+!BRtJI6ifSb6TE!4`qYk@?B zwKwhd^&7)&kpU~neNEB2d(Fzof2cR4Xl_^J%>C3Lo?<TT{T21ae3sQs)`6HtmrIjD z09`BuiMk{&2aN-Qp`T3gSHm<&Czky<RE!`qKQb>^Qk7$Wdgsb$U8o6!SOF@79QOjl z5kWrRFFz0%#Ze6}?(W0uu9o~lCS6p7GEp$4q^qJ}DDhlKk8zSV?jw@CJX?Qxd0w6= zrsB-Znm)f2pJ|dajMy2wB7J}&ZR>8Va;^byag3*`e!Bl{sBS;^S3at2#zZyaPc9>I zf*|IpNrF%wP$Xq>*MwzRWy0T$lb2X@sAfn<LLV505fmrq4MPFI!emvdu?)?=Qx7g$ zI{tDc|3?mxUXu75F8vpy@E2%^7p$@yw?8jrWA4BxFKT7CcJhKrxUh)oD>rddvPH{K zU_GN&C#M_!zq&C$1@~Yf>_M%p;X>#mG!pPWy3(e$Op%hOn=9E>cJb(s`dhJdjE#Oe zDx3;rB_liV2hiZ=oCmO(QX|Su5L0IVUS3L46WPR)I=?B&E*bSBfuFhVQxw$mDHh(M zWbdP+KRHq@9$kITWX{)&Bsfx0mF)MbnqlqbpX$BnIXmweZ+&6i-Rty@yS@kZ9gBNm z;3I$*V)(ZUNx4SZ>QS_D`HFZP8ltdm-kQWB^_NNW8~Vc?JU>5FBQ~9QgQ^`f*Tw~{ zEv|0Q`ntMqorC>t*FG|WClMhj!K19Gtbl~bWzYy2O%9zWnCL$qvR&&7>}>5VelgkH zrnhWMrS3Gz;)PU&<~Le34=Ux`3FZ0<OSQ^3%%!5#%$1rM=wU$F{jtS1wQj8sk`>?a z)iBy~tBf=sk5oSqRmUR~YDy{9$@2`<3YB5Hgg(N)?20u{Mm40F&n|II^H3vFr$!jn zvFt=~jmU+Q#s`yxd~8tFyn>Vp@03acD;FzbvuP`$vRLSOya`C{8{^zTDO61@Qwf;! zG3!VZoeUv`Di?t{W3>Ufp_h?ll_W;#*XKoc>GffSbVuVpqlxbYdwP>viU5xsD<uSW zVDKKbVO<n}t}g)eWk0~^GrwR%x)4KIa<mY`YI$qbwPQ}jBb8ztHI*f-{2@=W6m81N zXNpIG0DF6o40dMdX*L;DczncPg$q$9_DpQkg?DR49#@&R@z9g>D0=WtCQ&9;Q0gpK zC2D<Dd%!&H*5TgNttJe~#_z%yj@jz05c6{i%#hZo(IUnx`KWe-!%u<*7Q(lt*NNv3 zV8nk&Ba9Vehj)wPHGjV)GI;O8WIWP@ZHc!`lF0M6hboZg)fq}s7J5s_Qk51=EFc!j ztH3rdFUlt&VVPHDD7#qEtpq=eVV)yNkgVYag?l|=IN-2&>h2$g76q)LXXJXQO6>ul zX_)<z7FK|QC&)L{52~b0VRB!F2saP=3I4b;y2jrMk?`p75>$7{gKUT?`x7aaod*g6 z8cCstf<O&2x+A6N7K}3a0=^H658?ZRh=+?(@6YoG*goi^c@hxdFww(D)feni*H2B1 zsXHzk_G%e4^L?5W(j+KYb<4DD*ro}*V>=T=MYCTeH`1c}e)-z9UFL={K8~h+U!ly0 zdZcMPY}2^$+^jLtb=N;{1CzIj91%yGIHgV?Ii}FAIz=%#^X;_J>wFe^{uD}QpI;lU zi4uI}H-L+VP7LfSg>fXgPcaq*UEk&Z>tggsZpxt@8X1M@9_9%RA%it&(&Ht}ojeh2 zaq`W(FtE~8%Eqi0p7>6UBY2Ur%pWMmkxB8pWSyDK%#ghC26&7+0qIilT6My_v*!WS z+WJjMSeFT;vL~s;G<sTX8pO45pqzzxl4M)wvQw;u`|jvmU4Rol@9I!}26u4SK^w;| zbkwwljI{$!{u%I;<Ie-G`1ZC^Y*?x6TdaH+clEqqaNK@4J}|iE^DRtI?)WUlN3~qu zm*zQ~g%;8+T+&6^6HdYaLpgS9SmpjxORx`l%<km@{OJcpP_HrMA-hfu(;>&AuMv(s zH}x|MSR8rs{Mb|44F?TRP3xTou3y(YhphVh1|!aVlICBo+xftes}qetVksBKf}Py2 z6NfKnY#&#&tY4e+6Z@~0T<20#lb025b7PE~*m9g9Y9+fByRd@;Bjbacn>C%Dg2o+4 zl9Xqf9aW@^=*_b_FC(!YC}k(_25vWpikkyPh)>BIs<Dx-J}jYMHeIhPn|A9&Zv9&m zD*>NS2o@P88PjHNM+CDJH%l<=<rL2hmk&(SobTGe$6EFY=(qcZ)i(&{vh_YDHFuQ< zBbsg!V*s#e0Tp?hc3i66`pUM)v_ScS28N_MGB?M?kOy&;9nEA_<<dVr7?pb2n{<AX z+z`WrQKJYd45C}+Bdr~h4hjfI%sWNPFIzmDE;UU=ZJZ>P$HE-iNgRgkJ1-o1wh}!= zlDD5a<ZUxPa&~w-c~ouJNBWj+>lW7?jW}Uz>Q`xxE7<bws|dic9R@IdX}kLT;lT+! zR1;Sq3EiYEE9?=S@4WYL-Smm$QIpg_1%dCYrt>7%<`O^b#j<S5w|;~^WYRFn5<<s- zMc(aB&=-fv71mJNUBV0~R4<j+w?eBj?3#$1m<*F_dZ*9om)=afp1;lULT^Y?5j?o) zY<E@c;+p3Y@dp=@hYhx}uh0#p2K4~|#qn+NNtQO3g2<}N4E->AAQ;(~;R?BcDY<{4 zP3chF6QyZAYad)760TM3lD#J#6l2sYe{ypfn1%K|dj73G#_k_Th^<hDk7_CIV`UUD zUrutal*I!cgug2=2UWY2q;YT^;V+IrqgudhLiy;A$RI6*To>@nqNdURxclZbk1WK1 zOYpSu#{x~3qozHAwIstt;Q2y_jmz&M96DIE@HE)5ELbBwsLnq6DM=g1=jPX4*2t&Y z>t!>w73>V*Dx0gU%gHs%cVdvEc;IJ=D&I=^rJad6VrqES-f1r`dSff`oTt(w1_weW z%RnMUo7r!N1~XQpliwA)`Gz%`qttA#wkLdtIK!kJT$xN$Ed4As{SiHX4ar_h$hg+; zYnaEaSRaM#)^_5$j`jJT+}z$ppawGU1!IY{(M?~RwLlUcLW4zjg=o)r^}zq69&ias z9J_70=w3JHfq_)Az@n2lCFp+@SpW~ul`l~YuUY!$SO}T;CQdbS76-pI=r!_K%_IS; z{icXHHJMv;2=1(EjWIl>?5N&linOW8*lcmNvc6`EsPPMAz05hR-YJNltVA_ab{h{h zELPrz^kZdH3YDqcKEv~k<MuCee$6?ift)5?^)8{&L+jjF=>n%~s#+Cot!?7YsZ`0$ z|9Z5mX7ZfHb$jN`Q*@qs{%E!2^E30CsQCs4qQ5d!3|Z|hxDVWoJx}lpdX{s-pF69I zCF<1_YNYD?s`={RdGk@JB|y}w{oW)w)Z?;ijd^DC0}uQd<n!}M@XLtQmgd8<zO^%9 zIo3I^wvb5s?FZ<?))d!;dmEm%`p!g%)^%3d7;4qBa$Z-1MRXGwA)G)GDUw37J@MHN zyV;S0wb75Wd8)IPvc1*KvlG?5O-4wfid3A4n?W{d^5eEDi6z}QDTy;6O=l5_`w%6H z&Gca9AT|1<NK^zYgiL;(>BYZ4_TbNf6#|fmzyRB=K5sbrxkr~}(>m%amhC)KcYfu5 zlCjE*4mN=DkPpEz75Zq8F5&D@MA_dI7KubBvXSvuH&|T)C}R|5d7ePi`oM52wp3+F zxyvQyr}t)zXm!i3Njc@CrZc)$g+!WeY5K@ex}eo4_3WGV>=*XztM=?C_piildTu5R zM)*mC;VBA-aY+?0B`c@(2^D$6BBYe^z#QG~4JO6|CYHv2`rT;55Wx(BLVm9I8tzio z;d+p?j#F*Tpd&^jtju~=Z}M=!{;TXMPv$LZzYG_;YnkD7HAHchbM<ASD%yh+HMYun zg)&?H@X4&RS424g7Kjqj{Gl`<AQ($U{^`ha5e%E*VjE0zpx-T4B{&-vWLSLuG*0MR z$K+p3WOMYT^)^OyHml>dmQ4zEMwP=emrDz@+ZQF<tWZz3$0S8Q$hcRly&n3ueL>e1 z#`n_0;Y&oFfjFxQI@r2pd$8zrfKPp>?g8kZF%Qu;UDE9#rW(a7m{F2)NjR>$Fkbve z%_>KGuYlg|Fpo3P{eNzpL;0!aQ#LvWbbb2~#Ti2+%^-rUy5nL4@)OF7d+nJ6#0%ux zz4H;T{Q;<FY_?`_w#JpvIn_z8K}gI@_f)6|DRmQ#F)EhJL@u6#w@;nP-4;;5NM$&+ zUs6V?Y2rXY)X}K{MI{@wdkBr09qS>GNb>Uv@+TAj;l*KZPOgDw!eTO754BM&qE%_M z8n}39q4P6FT4OACz;3!;a2Zax&`O)gQ+bxBy~d5fao%v6eRj*?K|47o9)EK%Q6$yZ z=0?XJJ#F0$vh5PcmzT7}#$nUS;iE(pmw2nr=sA>IDVzq3zzQ5_Vhg0(n^?lngXu;6 z7DP{44zBBYulwy`Fb_ZR?1=nf8S^gMR4XLO0?+**-8CgqWKd`KV1(rkINR3Uf12}l zj3qD03^G<Q&2<8<2k!Hvo7ql&8>f?cr(8t2TrOdAruaLQS+=dj%))G4Cm?x>p$d)u z{Y$HzSiFE(qM;~0IZ;wk3R8k=UA#laQpk2;Y1qf+hOq^P`R+;Jz=`g_-Ro9txgpO` z%<LC(DMKTAVxT=i#K0RdMV8^;X7BEETW!!Um(<z6g*{yS8fWQkXn@*8yjgyTHN1&m ze5z2h8^_-bnGB631#sP%>7O_Pl|YlqLy32i99H5h@y$2Xh;X$s>~`aCg!kPG?xQV0 z2)(L<5b)W)13Z9IQdP!bQb*Ks8YwF3rSFr+Af<u<NXaW7bC{aNDp?*PY;Sxhx%Kgw zgt1ap7C&_X5Vm~$?9cS1gB8)XqUk79D+my%fn`&EI3551{u6JRwRUTKb{%jE=+G10 zMjq|Runt`C5=at>rlzI<0PM%vn_lgGsZdvlq{%=0&mX4aWQjQS|KdST96}XKR?nY3 zfc--~Ua$Uoy|(X|!p&-#aJg!1b2#o#`en!K{d)TgUp`)+o<K0fg9sa2Fj!n%p&);V zKPm)~3|BQ!SR%2wuU{&KROct=&~P-7R4AX|4FVdO5`1*Vsp@*4H!I{Ehqe<3o5VHK zK?~`PL-uVwn(Utls(KWK%&518@0&+FKiXiBIC|@WL!-8RkUS4uso6VGO(%s``!Hm+ zI(kKS5nhwVE!wm0(CuufSWR<}PPe-y=$g~$x_v8e6j_mLv1r>3#Zc`xIDrG}P5{#= z74T`vyf{vNx+<rR?AO0B6t~a)DhLC`f-6XwN^nUwHUS-?gUvXa3@b!^t-7+QY~g+t zlCZ{*bv_r1)^uh;I`*CO4Rpx!)4@t%E4jHrK6S#QA{<}TAvyaV#;#D@$P+SpO`B-4 z;w52ut%Jw{b|Bp_x^M*kF55mx=Ylr|wt2hUH5FIpI5y%-x3N`L8&U0dy_(PVY6r`@ z@BZe{uYE5EQbj4rh<l7g9YT{bm_!Cf+-?#(@vg3Q<pH@UXQ??F)8#}=u&VB=9q+%i zg(WL6M3$Ad2|@(Rfr!KFm1lF}DwvHE?DN&JH8kM?EljT%!6%hVu?N;)k_4M%SsqP3 zb1mE<7Z=p&fl~<wj*_wyg`0hu=k$+GMw}LA<kvYV-qB?3oK*GgA!;icdAc;HA~7j$ z5i6opq|KD*QLh3=qlhOB*W3LHpbD&mfL|2v=>sj{G#5}|g!T54_Nh19F={gX<@DQS z@);)!i*<3zL^z=~Xt1v3ynf}&sbI%oYInjVj_8kvQTc7hHnbqJ0r^{4z0Y#dnsKD( zpU8kuGB~Hd1QixWul-e}q$y1-Zb<<@c=7r>5is#|l@vFTDkj0n#);&rj{iP|hsmAB z7`<;Ssx(SrVc`8u_1OQ4uIzq1wC|#1<Q+Qx0MT=w?LF)o^wE)<cX_CxA9FIxZt!rl zfpp5EnrvZ@fX<-WX^^RLQ+;vBdguO2;O5R;Q<LIu-_oL0!@Y<50r~AEht^q{mGvEg z{s$9%Ja@JTd|VZuj;w|kgTVw#*tblY11bY$JhAdc-*UJWE`+Y5G@%*Uc;3tSC+@w3 z;x@+p+$)Bb;b54VcO7qXB@sZ{ZCo;y27i>r<)ps5KsK2Ic<#k3K@4qR)pNlo8JM*Q zfBZY^_AA(^<n^T(Z;`%hM9H?YHK!tt3R6oIR!e=dRL==lr$c>{wWAxb;7L$CONtDu z)C#(6H@f6=YazKLtK?h>NEJ;uaTZ;~nPFV7+BlWA*h_Vz0hdU|<*16oMWf7E+{M*l z`P|lWmyhKl%b;6HuGW0P2~}m*|0wFNsbz3aXMKErec(!@dzI(JP5GQj;pkXWo80nk z<erkTxVw+2_>$Y;Vhx#Hex5n<I-Zo{6f#r@1h96G8>ch}=?vyuICdmKxEd5)wg%E) z=DL!+Tlvlqv!8%5mX8c+fnaxNhbU=D_mHP;GI1%>5MNxMm}3;deayBO8L(X>Q6^E5 z2{uEL(nO{331>n4lTZ?uyv>2;s6Agch5**TX}owUr8=|pFBMmas_2=2gJOrI1csYN zE`4zYOv%%9JjKnQu0j*j5q_UqSB{d^(9Ja5FYl4hxrgl0NMyLt#x<F2`w^2mjfU0} zXQ<OsmsFe76cd|aO*!tx{ts#|I<Q6(k$KOWxZc7u*88A~++!jHZ_3N*fq8HO?IZrN zyw0+i@Nfh~M2w$w#2-Fg>;e1LV~gYWv5*?nyu2Mb53vOCPq)$xK!88lPPDdc*8lE$ z{GaiMhW9@&3sY4#7fOjl@kC}OCSZU+s-~v@o5nZ8p=MX1oJgENZ1K-e{!TOP`3%*6 z9=P-U>LB~li@gB#c$y}Tof%&FL&*I>zT=m^<>qbx+Ccl5{BUL*aMl0z;~}l#a!>MW z13bJD0NTP~%=rUtVb1lr`1SKodB9A3m(5tYg}l4~)b0K16WdE3b#+_SQJ$$4NMhAN zA|6jHRi`J^M@NTC1(4FRE@oc8OWu=+rvOJ5tLAN;^Ja5skX?Np<P#gkc@9F1b~i3W z-$ozh;UY~R@5=O^$Y^WiseaP5EaviT+F!2mjj`HE)#;77ymCEiZr!YZXp-Fcw9r__ z+BZMJ(0U0?I@I?kDCmp*<<5vhbZ>1xTp<IWSYB0ZwhtOHkT#(*oBFFeX7zn_=XHke zeR1@u?RPZ?dbS{H#|@SH3HNpVOa8Og_9B(uF&JCt@}3x;-@40gj5p8o_;v5qb?&qG zV}a*;#}4dut=l?vOXc?CObu1Xn%}$4`+F9T-xnXh^(`dAAO;Kw!yk#_U`b4KQ-2j& z`;xz~!7`fL8@hj$OSwjiP1TM54**_3p})Kd-g2@ndW1(t<iP&&jUmAiAW#p(5C;j6 z0VI&YgK+xfI4uwWXoCMZ5CQQlU2|*h%Z$v+gISThY|PH=&EXQ8G_))1R)G~-@s(ED z#lFsnTLX2!R@n~Q<3Zi~0ev9?q8k&&-?L`RqO8ib**D0eFV(cxUG-DsNA*}OA)57U z;gD+T>hRsQU&CgoMzJj8iJ%6xsZ-Ps$UIsF;W=(r+ahDrd9{L)rj9ZBMKA|Y_}sQF zu4hyB&r0x_@UE}H$EVf4{*7;W$Wb4k_chqwIQje+#3=+q1s8-M!Cj*vQ%V($v@pn7 z_FQ;gSIw}BHNDg+pFY=RW?HMS%=;b~G9n@qHkbFyH-QYtfPxQ3ARZDSlVcR{A#TN# zVD8H}j?(OQFzeg)a?9BE)N_c0ZQV9|i<)G^S=XmIf0lj5zjK<z=NwWYrR~={_g<+v zm==zjcsnVGLV_$tb*|6cTqjIHS2gDFij}T>n<Tid&k)^@Iu`NYHL-=!&w6k<HnC2f z>R$B3--{TEJdUFx@nIij!Hljb3_`?LTEeoz@QP9<P(hh3{8Fo7z^1~w<v|&jfkf3x zdOn-m+=j|;<$zbZ;jZC^Sqw4fzsU7bXG!{J%CxgCK{oKd{C};(b8?(>hi!hV-f;=~ z?@PaBzh!!qb>5n^#vEX{GBBcU^XKVQS`&;V2*w(dC73#(xh4Rnde>0RzvgfA<Fmb> zl^+=W8V}h%zKPC<Gx;t6P~G{A7pR*F`u+{{{aw06T)`A{S=^xj0zhq<kn{DjCq^TV zBLaGclLAiZn7D#6$uK1PV$K*l{KudN#Pos6g{<X#dbaJLINj-OcZc_;aBuJ-^u6SK zkK0v$dqAoMT6~#Sx#qDK8#I9kXtX<L1E86Tml`9Ew1)y11XQ$vVbMSGlI-gc7D>|y zDP%GXq*KEbV7t9Il{=bQk!T<m(9{hu+;<?JtbgFreDOhlk>b(6Rt}J7(PnJtjavaX z;6$BWKD(D^I2WUe(D*mRaG3%${X9`za^1%%OAIkh%o8uN=_}7&_|m!&m)XFtf;^{B zVV(hHAOkk8ab9$nF~>0f%HkJVreiZ`+cCBLrjmZZ-U@~4uvxVIe1!S`%c4gUr-r?7 z)?==;cUHUT3Y}$e1Qdb_=EE{=m~*%1$l2TV)>r$<%wSGKCm4Uc-%mTXqpM!cYDfLV zWKRpnBgDPnT&D`FLZvER7j)^?{5@Ac39yni)>>it^)qAJb?VaW?HYMC#mbC2{s0xE z+HlguWJ$=AQlw$J#oThK&aEa~Z60-b)i)xolcaaDj82i+B`Uj0MK7r6MfJU;A(Ezs zl-ybUgY&DCGI^)A(&7{`r-XH?7*nUo&r>lEXk<Rn*n-N$15eUQNIMao8U<7aA4_a( zan(zUC%pz4HOj0Dt8VNMT^&tpX-0RmdYaSQF@4SJ?;=`|!)Se`&ORaf<rAh~KM_8j ze()tacIoGuB8)gw>RaOK5u0<%PrmY>bk(1dKfP7gP$taZ>C2k=6Q^AVzg4Gx*fl@t zWiI{&-LkWIZ+GCH?a(S;#;0(an|O=c`GBeC6wmJLe}{kYsSi5O)n47zUriRSTf2S6 zPHm2FNm_{FRn0r|(nfqmYk9?MeI;vqrE7m>P<2Au(M7Vp)T)x&sj|lB->@%zE-&L0 z&c?_|m%`B|*<F9~JNTqhKpOR<zI%_JEip_aT|QqG{5{pusMei*nLGEg_UYNJ=h^Sv zE8p8!G2HXs?iYP$?nDPvoq}tZbC>ta2f`!>Y$Gtm%ie{zZWmw9F1_4My=4neOb&4O zuAHHQ;)#~F%;)w^Pt)ABpxrsWW-H%Zer7?>bc653zIsfGXLQDnpNx+FNN0Ig-^(xj zHGL8HM4zsm-|iihp-8c}U#=Z=v^(>ri3mxXq_o1xpZ*lj@J!G6Dvo?7uk?L*Z{EZ? z9{%2Y{~q_O&-RWSddLy}0i>9(@w^_Jc^8j=FemqEPx;!V+^sX8<v0#2|D$@|e@gyX zozGQXMVoc~cKg1+)f8?r`BYQsLKmGQLDJbRZ7rn)6G}L>lv7MLxz3X(M~4(yGNX>R z)opHhvu=yxJk4F*Eirn#?xq{AC6Xuw7jA~MixeqQrb3k(b?0f&q($2$mtEP;wxK59 zJ7^qig$mXwK`~>e|C^8YM&9TfyZxU_e6;ni?Nui!r$bE!jhv*^8X|#fu+RL~4G?%c z(Dj)E<6u6?wP4;^I9Wr5oH5d5`Y!0M2<n!s%4I%&0S!8ZNRW7~3a;(i6|Su!#mbbc zP^o+Adi5cwUOP4Vukm`X&jGsh^j!b-T*GzWzzu#Ezi0F09zCT-PcGs$UGufX?K9U4 zkj=IjIzxiT!tkzfsP`7N?hG1ye#I?wkm*>CwL>gMuT$f9p$lK+n$XzXI}G-Yg1`_c zArbMn8r=d0))#Eaiq%WDj)QA&o&Ok?@Tr52X_R5Wly-y(I)MlkLXA)-R0$nZHWfF_ zM^Oqd=O_A}dq*Gg5BZapas@|t-+v-$|J!%)-@*&JqKmlVi@cIUUg<?$*+pOZp|0Y) z@{WJ%-<tb;m4|*NH*u3>;exMvgVChLTH%=1?)NV_Z&sqv;yu4zu>VpfmM{ErMjo4) z&5^U!HF#Zz&*fhx#y<Bj`?B2OmbZxIFLDKE^a(-ip2Br_q7cUigB<=Vy62zb@GIQc zeOu8rzZ*MpxBFaz#<c>7{<-3#b9ev#G@Z)Lq)J<<(cAoVFRWxyD_!)6i&@#d_>_*# z%8%_Tj{kS!1g!ErU)6rD`rG|RKjk;}O?~4#xtawmaj~ntMwfZW4<agE+gf9SpfoEe zs=Z1zYS)DL-v>Q?11&=%V-r)?{cCPv>92qOL!fT@k4)j{Mv{Rk1`-b%pCB1!TIO^t z=~*+dWn`~PL)C)SXslMKI^p^yce<P|Q{Clix<YLiBXp&@o>AG8%Es^iWK2!g^pq`4 z#qw0GOwH=Fl*A0+elvmEVu2<SBT9;7QDlqLFiXok9gFlV3qzJKv`U1kBvvgc4q^h- zn$T)SuSHg^vg=h*pUV1GHK4i`<E@%#&1CD2wxPE3mKwL*l+~uKMMiDLdK4SY*>2uW zYmWMM=)kSR0CElqD#Y;@W~`F)?QFLFY+FnMHOL$ZqXCL;qUZrbFA?-j&;Vip2!p_A z0^lo>Pg8!)1+>(lwV<{dwYR5eZ)j_b#tvt}DkJMmY%;UW!Y(WOY#g$4%;88*PPsVe z=F(Mlol@VHhPDyg(b#ECozdK5pZeu<zkNyU+8BTT683N3)sYw&nV4Bv+1Q^+x^mpP z!xdLjX~fDZuR@AcY0~|XAyZcW{nV<>FTaUNf@#1Yk|D!Jj3SeVf`*|$krHLM@3G(; zhQASiZ*-5{`&w_@*iAOKo`n=zSm8y~%U9og_d}FuF@9E4ZFSYx;E~6k^tcI={`qgp zv>B?@sMD~ICN29tQD2w3)~&#LzvuVy3wWI`$S<+t#QWXHLaMB)mXnt+@|sP`k$Yr$ z@}p`eBR_fdnqG@r+I8H75~VtI4QrNWc~&NHtzzs^^QiN9>a8U!+<{RpySaBsR<*@h zOYG!T&T6Y3WXZ#^?hzXi2GO6e_p|twB7QS_MPZNK_Am;WF(#Pg-xVf0VO}_Kg03q~ zs*!Y(MiRtbYv^Z?b~<Q9pr);{e&tA2QX?y5pPQH!vy#It{{BgiR-O7MP)?lu?UkM? ztK~eua%vbYdaXa@+MjU2{LoQl^@S)gJ99O2b2KY6HfJ-lBTOXIOwHaL%*3qC!Ys|! zjLgvV%*pi4#oY7Uok?=M-nY+PkyQKDsN~A7=v#K!X{Af9y5_nYHriy1t+v^2+4;kD zK_(hb(+P2!Zpeq~a?9`=VvW%(m4(*!?V)hYtl&r^i9CM>G-pU^Vc3Rs*nfU{i?9i+ zup6IyK+TRLAxxvwG((JrXxhB=U8S{2<2Gi#S_<>Ko%gMx#Sv=0b3;9Ug>~Ptxw$=7 z-s{-+vqs7H@5D3D_m*zl&*Cw2hesalruTI_ymJJ#GW9oFeh==x$b^&ER_FeRg%Nib z^ze!DG-*XP%UlKDKjJFoX%_VSwxw)Gw@2H&FH?OHq$Ox7>z8NIXOEPvdsq1#i90ss z!m0B%DDA1-Pd8Ho0Ly<~@HM<hTV)cM=4bIPz))K0#&D0_nh!>d_|K?O<};@FYd|Zl z(C|0NYA(sPPS4FjUu5OV^;MockL1g@a0}4ou|kDr6)E9?fCP?=!WR|QQ#3SxqoaF| zf#EYIrVm(H+OV;Wd~=xg;o^LF1Rp-t2V(uedOwK44{Gm6;N~wZW283_Hu6M74iFR5 zCm~@@N(x3sCXbvPlY&AiB_%Eul}>7EV>C3*(bBp=N9P(ny*t>&+SaC+b);2ptlM0- zp7mUu^`)z9Y|t=lXhV&&kwQuU8z%>CY|=#9)TW|sW;4k)w>iEoY~h$KZK>Q=wo+?r zTl-`i+i0?_ZT+6@q=1d>8=4*Lz`%}n6lEtnSz%{8i?)khq}tW4n0B+9QoGyTS9{n) zvpwxeY%hC}&)$jx0Q;m}-q^RPwV(Y|+28&q=0e500T-p6+_<>0aEVJ;xzwfpcbUsr zy4>aJ<_hT+8&@`8UF9kou68w}xkj;Wz_sc0jq4kAH@HEw8{Nq8syH`!Z45Wxw@kv$ zt;s(FZj+n_+%7i*+#!<z?v(!m+$9eI+$}c-+#~A&+$+BWxKDlqaKHR6;DOi5kWmlb z55wvav>rw3F)H;q^VJh9!;?J2hCDmZZ}S44$QP9aZg^>t@)s}PuQu-R8n2<x>%5NM zd4udb-h5~b-n!onRlLW0P|y2mtLRg}pQ+xDKUZFZzffGjUp`6C0!1LFivkRTBM5mE zrHWy&xY0wCiI>@`#%4ntshr&g^-fSUONrxPcpiEJm%oR2Pu-<c;<u{$scBf#Llfij ziCC(CK#)@+l-Cw%mxux!v*j`|l-Ch+c{22lt*58i*?Ee+y{9{I;;BxZdWK6bd78^E zd!{R{c&@9tnitR2mHl<ZHA+5@xaM<{Yv*7DLJ^5%P$(rd+7AY!jK%74I2Alz66LX2 z`e2wE9Ji1ltR_i|C`zr-B1uvPDN>?Hla@(_j5M-jRXXpyzvRfNAWvRD1q#|+aKV6! zF6yC3(I6#CdMQ&zV*WGD^w=!3ykfT5>aMMxIh4$R=04nI=0PRqchNWtpc!tBAIF_j zB#;M;)6?7u<OP%PZgh<gOvAU)ef+FsagqN<#{|GC0vqB9!psb|r~yz2W<_X2eZnw1 z!W$a15bhD#AZMO!0;9O!keCNBj)x7&c?6Sq+>n|l2#Ti-qj`qNFl|_m8IbY3VKXlf z73K}wu|Q(HY`BjllESLtG1f>9n}+AuA|>n^USp5kaA+Xs74pKd5p|rrNgB>L6FIL@ z7cPzTaYcQ&HS)$C4dKzqA5Rd&t3eoVG=@*3V0_UOevQKM$7BRFXcGu1f*OYt3|hhX zoFP^w0H9F7mk4Vx&l`M=@CM6)6Boh)pabGyAeOK=&_N|Fp!~%l7qK^N4u?`S5LZ|k zh$k!!#1}^a6$tAB6$+~X6)EWf9eQ~k4s)1!M_^&^i;6c4PYES`pd-T3Ku2ZPK*xj= zfR0ODfl9@ffldf-0d&%M8lY1!$kXCxpfh3#(Akw1T~xLk_HzzydETN5K;=lQ3PQ6| zVghvGO;)(bMHbH`<izE^SV9$5*v%E3iNAU!gR5M{;8a`5{i16dIrBFz#XpUe^DnCE zKdSS8$tj>3sUuLWlPypkn)AA)6Q~~JA?#lO;|4b{dTwGjOt{5ue9s-P1>!Du2|f3$ zwCbY!8zDU40m(e%F*|v}6Ly?ug!O@*ixYreIGF>zgiXBamG8XfHJ0-R0r^&<2lP(p z0HF6`Dgb>DUIpmm!~NzHqVluF8mIyF*=V^4^aaBFYPkgT4L9<;<uXtcZf3Kk3g`!J zrATrGs71^L`nk|~QR|)%R4tYnGrpKLOVXS<KTuGpnK$nrDykSXH2=}j#Zx>BKnA1n zZx(?~rce7iumCQx)X+T31ZOe^>QnLt>R<fjBE^RG86d0&G$@V(8d^B*qT!9Rj4;CW zXOxoz&={DL;}T7v2_XT{<jV$7qGSQ4n8IrQAStIM-oU_^0Kgak1>TrA6le#vvDFaR z6R@%M(6Be?jn{^Or$IJeAB1PAB3cTp`idPQ)TmiTojQ9OG;nCr6ibU1E^XT4++-xu z4~23;qx~@$S1eYH!>Qo$a42WY7>64i6Dye(D@6dC8J7Z^<62nsisM*feOPtjbgU_@ z0k#p10c<P90ocx%1i<!C3x~!w<A}6$5-kVLeHS08Jc`)GQ<P9b0cDhVh6*ZNKowO? zQA3T3sH4s*8ffrwG_e<24UR_}y8)j|80GTkijupU=m2Nc6}Y(G0j?1gZhwED<4$WN z@KBQjpc-L-r(znw6l?%obq9E9oejWSF$;WLzX0Dz3BSL8==ftd0vaVJkUAnDNUJUg ze){5s5W=&A;C>STG7b^?33IH1@bF306B{&<KccMIe?{Mzh7;IN%y;s@fujICc=9I} z=PM3D#yhZpgy>3w=I;O!9h)F2h9Q#7K#^F^lxKWH#`8+!MWyq1W|+Yx*dmjJ%w`C{ z1PDPUKn5}ak{;PwL22KB+!91UUP)*GBRhJ_?<q`y0+?HjZelPoVU;P9IxHE7jok#O zP{DC3y)LCnl_J%uwc|w1O48KIzO~gg_i=IkJ3M7X0F4=!jo-Kt5P)ma#80zkzFM@f zomN*wCqQXaVglMVxdELHDWEH^RX2~bSB(njTk*Q|Z}`jr2sKDj4zEOBMmECFD0fLP z7L769D^Mox$$;Z1NAYB8rq7<4(Y6X^m9&64ZJXejwsSDQlFm-Ig$}agj!T_Ixji;U zw>7u5N5?YSyp@H*=FXlbb?G91yU|5ej~*&|^|_!wNGqQ+Xwcai@_dP5!`5cRe}&Q; zKI0*1!UQ#wCMlaTMbWfrvdGBf%$RY0D3vUK<Jp_dJBKbh=FO9`V1cYfi)3cWb1KVL z&`?orf<Tth(9F)Nv@_*^&8>~UHf;>&m-Km?e>Yyl#QaC1<UnBQ&E{=K7auY*e&pnQ zb?D%&GrCq`p!@WM<MfvHX>(ss*80zAINvequrqEt=Kcs!Tnd7vOSa%$xF{&(sHkKh zh>vz?4F??^8v{cj5~+X+6}(X|y?u*zM-g4R4vn#r4}(~zcWkli(#iffgn-L&p@bWE zM+6G8SExA0#M>!MnthBXeG2)3WWUq`Q?8ejr&tHb{z7U1!hZe*4vx0rDi{V3UNJcc z|6yMW6u42LLhsBWk5Uj2XrE$F^(ax|{2cKx#8F2r=~x_JsxqYt_5nFjXabOv1vh}4 zDyjw`rwiT&<V+z$kh2Bz0!Y~-C(b#?f6gna4j|=8$y+LV(om^Vu8S_xbjc-u&1Hq8 zAXQJbxZ;ZM{&JP}R4aHFkZXlxAb+Q>-SSU2>HhUEj{p3p-2eV}Ta6lP)M7+4UoBc8 zwP}|#9ZDKZ$=j<9r_)zph#^8!>&b7f>pgu_gZ?wvv=}mE{Cha>jGWP!ykqD>FmBvi zy3Yh|<fODSGPQKN<V}4bGs7g5dv4{znNK>Al7%PL&!Q)lKtS|DgT^?=e1d$qrvc)X zAcNwsAVZ>EAj3+ZK}M8KLB@quKqf@aAj((kG4+{V>G7+;2Qv-_#R1Vl>6NshVrddD zod*2SzW56IO`oX4xXBPvh@eza$^cb;$rEa*ku&Ok<7hBu1W--PNG)LrP;IBZpgNeH zy2fFkdYDuC%u5522dJUR3)Ben%NX}G5xIbxF5Gje*~T8sKUUwAiS=y*udr?8jvai; z9zPs#AsAO?5}C99v+0G*y=7`1-8tWU5Oe{0aKoLx^!S&`@B9Y?<;7@uGf_S$(^nD> z>L<eh)L*h3G(fxxG*E^EXwZKdo;!Fl2}Oty?LviuH;lTW3l{-dD3Y2*7Eu*t2^~vg z+2VZ5Eq7s7D5(r|Widn0RsTu)^Uvy!?MK)2_*<+!>n>WezQUED8*WlI+NfeSDKY}+ z<}}*Ym@au@#kz3g&}ILPM;A>A5*&~y(M3s;ux>KCT#_QiL8($*w#63tw%V%7Hrudm zx7`&x?7*?pPJh{D7p~oQyUL*11CQKm2?b5Vs@x|t15JMu4;f@oO(vP}PZr4{&;u)- zxs<i>;2iX3Bjm$lJA4Y*dJ5SuAM-;WgP-zP?azTePNNI@c*Q=@C%Be}J`pq2Nqn6r zul?><pR#fOoQmc1G><y;>6oR?;QKst?T@<ptc`2V*`9FBIrz2CW%fFc-||974f-Pd zo)<sda|!;-OYH}Nz6|4aIV<E99u4R#u~J^8(F1+8_D4fsv-a0U?{?abah>a2=X%#W z)(viOy&K)=I5)Y;4dk7hDP9Nq77qjZR?Hu_^`v)h$AWQ3Bh8&yDDG<Hxf=`TJx}(S zd$Drfr_l#}zxKyNKd|;Ue*3}uq2dG{=3#D{M=(b{$}jO)ubecG<IjBJG44Ex|MRH_ z&eJpi{fzb}LqDti&Ct&|rh<MR|KtnGap)IYhjfqK*)-GBSrimAn>Fj4Idc{?Z=SRT z3y!pCQS|o`Pk$|EYTUZg4GtAm69@#4hNju7RjJmjY586_X1Mrkwp^4t&y|BsXG*>; z-{<)*wy3Bo(9rk~-8-FN!GeHc$hVdIyx2U)#8h=z=;o&-OR8sCo_6<nrQuk$YR{TA z+t#h)*|1?}*z)bKeco(pY}pckgCo(lZLxOjsQu<*gjTySb592{(3z(T<jmLGxU)cS z>n?^m?|do<56yG~U^VZJHFnlQAWWbH%!r9ul9I9|BV$iN!I6f>5n4K~jEvklI3#d# zB6D%eu)_|f_ShrKl|hhhs7<S|l9QV#N(0SnlS)04X?5vXOJ)^0xo0|b*rL<0=ai-a zKA-=6_!)#Q7UBv^p=VD-tc1QvM6HE^jVQ1cCU&CIKEm3*qFJgUa6#xQg7)OQz=OfU z5QtbPR0IYS2ZxIy5aN+YH-(i_6TqnJT86=ScxZd`#+#;&QYIs)RDy9F9Ho*O^AnK6 z^Zp2eYEhISNor(Srb?w&t(L0MAZWF+bUJl<y>5d+yV0ny+)=2|@f7J8#j~dP@j!_Z zN(cxZA|g^oLh=Y1nTArO-YHW?69vV4R8(4MXg;8$)5gH?5fhU^Sa!MyY;1-&I7D%A z8R6j(!^dX}0@)7+vx7h=LZR#l2q?i|90&<16A?iZ6Eh<r5lKqQoQzBqIXMdo3el95 zEUBn4sHq`+f>KiQrKN?+$f%T+MUazIB`+_L!BEX)N@B5a*la`&hk(mP<?%G}`Dg-x zW}y&WB+{awU=Hbzgd{_X6aiADA|N9}Nt32Px^yuzWGIv=6B-3Y5h|)!G&G&)=qhE& z(j{BADmij=%ayBIo;*Dm7;5Cp*Q-E*T7?RYDN<xfv0~$xn3k0&F{M<gRb|RdV_{jt z#zt1I994x1Gb&YDSEUL?wQ3tUIOf!-v8`6Ed3EaS;Nn_Suig<Jo^P#s8a!pCQKRqp z_}B;toM_U7eVP@n2VkHj1+xcQyV=yH&GEE*EJTM6Nz<hy8|#FD^OvkCS5gcNR1{PJ z1}Y1y0}NcaaJ%Rtt+^yo-vgI>f~r($I2r(02sH>fjJ1ULP^x3haIT-=y_+Z+CV3x$ zm&meFQKYKMq=Nzh2BA<>Bm%@@J4qx$0Km>5C=`P10>i=(#I7jn4Tjkb$AuGw-ANLh zqU=G_5Da5amKDKq-r#vdQmHp(GQ-JTWHC^zs8TAuRH>+`)hsm{>RK%;osNcH&)Q(1 zX*9AinP{2KY%LbrRx3N3%_X~?y~E+M)5*c*a>X*^#fv)tzzPK2g&@{2tPw#Jpr|Gc zQ;6f52||(4sKsPbY&L7PSd>_;+H5wZB&nUE5NX;B!&qZkvm9rg=gkR%4N*jqBy4`n zC(F0``)ldOLsc1Qn%lb0&~6XU_iYd}o%mA=BtmXsgnTG34Wkx^7xtqShD%Y5!gApz zR^hm`z>)A+cn>tZm)ztR!HZlVPvoU*qD$J_gV>IJI5-Dl#d<F;l9!T^WD-U}VLw!v zX7?biOXQ`ar#V@&B*>O+UXC0Ua^+f>JWmW@U|5=bPX{SbU|FF;ONtbsDpAQnRn#xc zf~Q5IRz2?3Ys9kAGu=p-G0)9$i@aseIKaX*AZP{%GSA>j4jd$zpgl-C0xm-rB#uK6 zp_ZmItSm14MNN7#?vl$rI>lrT-h*WmqEZP{N4vCgIxj6U_FG!>HEe7TpP6H2hV8+# zn^2d_8-{F)-%Fp5*h|ewLb|k0JDFGH(Y2`iw<b?d^!}Cg>BBM*LrZ@dF-kIH9_?h@ zxZN}1sX3D-=~7a1m?<S6guy?VGgcEs(uY0qE72!rq7z#Rd$(6y#~vDD-=*jaxjMQS zUpTIEiOF&kJ0h-;q}x>3D<hrV-MOQ~y?b5rFgKeXJ=*l-$%bdo*yfezhrB*-nsIN> z`^$n4=MyXQdA-ccm-BTx@Xa@zzWXk1epD<s&7YY$cJo&Um*0M4RWfpLh~wfC9iB3C z1%PCJ#@6g)s7wEa(Pa<<)lNX56$T?1p^VjB$)Y1JYa@~IaywbtMV5@5JOu?GN^1K@ ztIWIuK(h74zNbzdxO(-h1q1|W5EP_Q7(zs|NG)20YtzO-yLMTkqH=WTl&4FV0^NEP zS+7@#J_D)@8p1YW1jeXQcw@$pj2lOtjdFI%PTtg0yv=7@B$_ZG#dbTS&7MlUHvq|d zbEeHs-q+aKZ$DQD9ANICgB%@lh?T<*Gj_xg&R+2fGm|DAnWM@yA^^$9a;CvfKHiu* z;Us&foo3>UGpwC81+}t3Ktn7hFOiS~05TBd3JjA)5LZ#ujoIAX<L>BE?}&5RUL$$r zZtgezGJjn|Ah72j3k8J|f$#wYy~n^XHQGuJf+4;1$vvdsXpNaihcIWZh(%Z~*I~tq z_Sm^va^mdI%uoUY7@Bk89xvB>+$eN;XQ`#0Say~-FRifBEvu|^&w86Ywb^DuF|mK8 zR{8QxV`EFe3GT{3!71S8luQP`hmLgUIO-^xV~){v+;JL8mC|>@X)3O&X5fD{HmXx+ zgX^x_tX{qKZo6Zpk3J%N_8F;BBP~C*iX$NvLq=xdbSe=E!}xP62n73qimCz(tEb!S zVa>*Rv=kc#hK<tg_OMxF$(b|TSs+cihr^q3F=7l#kf>j2oLF(jNhh6i%Bd*(GeSWV zg^Fqk0%0)&1{SepYZ*KCR&(Yo+5rbF#ly2)ks>R+_ujhspu}1jwSGC6n3FQG3BOFK z(>WRWYpfzJl<<JD>Sqt5R;`)04qfQhxFNcziA1!34*)+9f+)i<bqu45<20#{qCc8p z++bO^CiPsNOy=@b3e@2SW9`@aO`nX!-2&YNAwXfgc?%RPR<J~gLR6@T1%FCyG%ob% za}_O`p9Bd)9l*z)J|$BD%Ha&kE=L-=QKK}C83T<QhfJ6V?eD3S(1WSnGtTd6U=u-$ zHg6_OB#n&{2{3I=@pzbaf1ycWy6IBPf$0s3orlZ6x#T@?#VTnJTy@uyDF7ehMF1Sd z!c2JvP8WScF^m?=FlMZS2@`$pyKlq;4@`LIA&N&VeHtrIo@33L6<4lc+yb%8ScDkm z(315@kzyN8Dm!V?I7(OK_Y`~1MTt_Ul__VcLY0@Q)v!^kma95-ywz*qi>MJwlP2++ zHA~Q<RgyMsaN2c9^;VY*BPQfnMAZNSDL_M0WYwAy>(-Uqu&L6P9W{3Cf_#Z@31czu z=Og!W6G_r6pS*I@ro#`Nr*m>Q!6ZM`PlI2E&M;!5MoCR=YVD?pIaVAt=b5W1H@Ep* zFu&D3vWB(&u#WY$%_gh32YmF%vp2jPAFMF)VSIE8Gd{i_ui2S?=gEpUSEa*S-VN!` z_q48ISV0E(UJCUC-)mt*_}-rU!MUOdCClLZRH7Na&kv7NC_FW79$ltACM+(HWG`OK z^6J$}O|wf%djVY2b<Yh0T+`F-igkO?B~q_G$@+~sq-8Nei(B0EEa6!KOWH}&?5y}V z_<olcmF#L)|JcoLTJ3Ik5_{N3yM66TYCrqya)5*NI>aG*9O_U54vQmJ;pND4!ZhSW zXYrl0ds)so&JljkMPCM;=W-FQ@UjlCc*R_=p7)y-^Fc3^eE4;PvFYdct%{3b{Leo! z4u~S~f4F9JkI)rW!o>Rb7NA!KcOtq%|KG7V|8E1^nrX&v{;zKjaQarkb^q9WI<I+v zul$}@T=C%h!wGWbTurNH9x%yX@)d#j?26tu#cbCn!3PuAo6K06Fs5}OyBaCprjcyg zr%)%W+_YKN9d+9-kBvm+nFF7%EJipa?cijMW&D;>WWiHLMaDy3a9#7<bdT3{MIjLM zLhCHCQ}8JULe)+LQ(to&Fw;;Ma_%Vk*uVgr0|XrLW-SIq_3H@6fpQzi4|Y{53>;u; zls0SG@hP_D9j2{Fj%Q(lLRHFgm5`9WP~0g-5}lG<N0->!oAOLiglEmk>jjTVvC-X` zuAVUHkz=CM1RxQBt&o<*RWRa=JO51ZxdVh6<i9q0k9@3PC149-lc{bCfq0HR9*jod z#mm+RX}!vvp5Is}hhm4vlydHx!U#olzPpZ8q<jcd&@HQp<jSJn(PE+yAiv0=wrzVg zG)$vHu;>LUAtvvQd{JgQ#C#_#*D_REq^Sy~1_>Q=?x7eVaRIdx=<d}>YO_lcWo$vO zciHTjr;ELuL@$t1jYpTHL~EL6TkIo>X0}Gr(5g)13p*$F>BPB}HW4NZ08a`<NOb>d z7In@;`x}_L%=9+>vkBv#;r(TD02Lsqzjy0&C}P|H005D{&#)JnfC$9;EFgWNk1&s} ztzZ}u<m}QjEOMsSq%qC`kiP{a{w0HAdTU=)l(G@?f5NCBx!GFBN;rIqP)m*~F;sIs z&U6}G?p~x30(pOBT54S+PAC!;AfE}dSL3~QcI5mOV^=+tRE7$e)Od$Hy!ATgsxnz# z-W{~(+8X(Ug}V5dav`Vz-bA1J!(&z`NSWr3dov>G5X!U~VFH7;TmnK-)RE#ayWG*T z<tcHc93LAE&|V$wU!|}Tm&pJiIXoB#6;Vet-&Zwjs))lc6M|a5PTxZf$+p1W6_r@) z^;A2zXlA9Xl%di_3So35bwbuE((83Yi@y8}T}@`nh4Yk--BxVHPsZBRwy}#%+qkH^ zbd+SO@n(6of7vW&383jOo0!ANe3|7DPUCeC%MF;lHnlNeye`>IT5Qkl5|;VIQ~D}w zEM6xCu5DMUWUh8LRbS0+-RH>B{_T(R{in;v#0~$c^Bl&|^)<ODYh$J<&-vU@CJs|w zkN|KF005^XWxHL*iVZ0zlZmxYOVEXoul7_^LlrHxD{1-SBR1&PBKe$(f$t$*f`6Za ze`&gouN>^`T{Tc5%CEo^7eqo8GQHU3Sd?rVOr-uT%48|jiB@t+&e6~<Pj;g$E)oY> zU)HIiXOB>Nga|V<m*=+(vTk}5QV#O)KrzW5d9BJ|9@e(676If$#EipBAGUpVI5W?V z5t|y>kc|-CaXBd?fG;@1#pX(6)Ytu=9ySL!-Z_R(0(F3mg+K{t0SF8T4*CiLY(npY zvlPNym35j7nw?P~t50P#@!)t=)&j?(_}A^e97}^O^;!!UOyHJ4ka_+r1gzP>8kmD* z`aK6T<(lV$h{)Yz)Cae8&zUn(9GQFPvNk1)#Iq)8xevCvXAfF7NCFF4>wS(^fo%`F zEv$zE@!1;{N0E+VB-ft6GO+JfXzblL*w1IdpCKMN0EilAlxhZn;3CIOjeyrAB}}pz z;6I%OLVy^AIpD-u9*>6ucSy$g6EubGB}l02tXd{4ZD5&g;62kdc>(6mv6C$p(M=%{ zLDyeES$eg&uD8VYg}J0l$?;_;IaOSnZ~8d;jJ@gkOlLFSo`}<a8K=oyj>)BF35fnq z%Q~2)eA&&peyXxHCWI;Q^3Plv&a$9pDj|sV!W5{71-{XE3|pMass+!9x5`g(8F^$? zjG9k6rfv0&^+e02Jm&UzLd!gGA!VHb5Ojb{NJIiAfFS5N38*L%DyoTG=7w-HkDOj5 z1h%&99s9*b;v!!(E>@4~mWrw9%xplIQni%ULN%PC4L2T=FbR=QVJ8&1Xf<G?A__E0 zBIj5urK$=5#h92=vIe<AuE@;jq4gvwP5wFO8kBO5Dr~paam4zUw=y!;<)9>9CQ3_8 zkwVH#XCie}2?H@JmEJl$N=o;X1waFpX#n2I5v~ga&EO(L0=Fi~D6Uo4fra@Kp~xrL zJ0Uu)0=ZS+Rk5?3Xx0#kzK9eYQ3!AlzrHe25lWOh+8t6o1dI%XIcOw{3b<@?V^Wp5 zV+E`Ohh)?30&mAk8V!pss2ip|oh(VsK}gEu)jIVkr9wE)@~k(-j8aZ+Bsoh=PR`PX z(22@pYPw-M)&a3ZGxR|qU{OES1l!Rw#wjs{(c3L}Iu(AuheDNr0v9N%+@UaZulOwM zOIi}E5CNgjOW#BD9L@t8PT6|*!V9PC2c#UknJp1_n}yJ&OZmsJwOOT`uDn1_q*?X= zWR1hQUB%q+`$oB|f(E@;$x1X-+A6GcgQw0K9mAb!Z5`odEUiNuY1@)SmJI`?8WdFz zjbzH%$jFhRiIE!y#G#vdDc;}1XQSA$s&-{cMc8Toq<jjaWo?n)S&WLblkk+c?opTD zC=ySzBDNwI_9CAP@<UI6>h(-&5VFfoM7<`2sMs(IW*juKV+}&GqvwR8Dj}k@+GMf} z^x2#Ir=s(rZfqx@>KgQFLSzVq8eE^Oq>_`aSda8kp$?3rWtl3Ehv2eC-cnUQDWypB z39R(vIPw({=s@HS^yTU-7i)tpn7Z1ZXvmF%NV6P5rMFe?k}%*xmGAV|-<uH#Z!j6O zhv3STYW+P(;RsE!a}qTQrabeOBe@c;O+c)8T=5HLBIqcQ<rl$G&FK%E;l<#=SRhVW zUSK(A&$JM8-i&p#IVUw_23pDnRaW5Kd3H~NDbLqs-dz*1NdQ+${HEp2`uh{@;dDva z+<;5mqJ9C<p=5rY<E4-C*%=Aveb|0@PQEI+6sMV(-VtNI)6mjR+gAtGynDs;?@xIm z<k6$Uj@ccXbMFNs_j#t4cD9w}v_pxZEK$PgjRu<^^$Dr1>8giS&bknFEtM<@r$*?a z)?uVN8857)QKJKEd)j`u3}%gxh|?%D4^oRZ_n!w-cTma7J{OHum3?_i!|Y;&qc`^C z=uof?svx-v*=m9t@CDn9eVtGgl%4RXCO(%f3--J!t&y9GrNb(xs8k!VVLdqSW3ney z$P@v=O)#LqgF-`YcqW8oJu11-H%oUtxo!-1=anOBoE+#*dcREX6{@SXw?03O{8A6z zev$E!&OOolJl5^sL+p9v3#h(F{!k%zbw_79-BQ0#n`D%CEhyu@*oOQq7)fThh6{SS zY7+*z%D0M+SV<EAw+EZrTMhTY<_!`<qZhU$L=5?agt}P3>$kEa=+NaF29h*dY>$V6 zO*V%<11~9AA*`D`*)1A;vUNDe964bH&@{_VEE?8R2gjB-v~kKtQ4~4Q9;7aBWaK&_ zJ+?~ZkMap(S!*I7iz%O+1XL7|5T#KbMBBB(Y)8Y5Fxpq--z;wld?#z9VG7)b;cy0O z9?LjgKqoG*KYu{A<7uzAm>7;lZFwCFSDMTjwfL5W{9{k=+kGzh5Zn6>1>M~l&IKdu z{5&j%d)hs!xa&zI-GvZa^Lh3aDU(>7ll^IM1`wDGF7od`iPJ#WayANvHRAJ3oE98G z1d*J_bjUuZh-!q1J}g+v&?mHWAW?~ykK`9_b_ePMs5J69J(cW%7ZDvxix-BMru^WT z6~xxdPD{Lp;TS$|+{u+nbK}0Z2vCiJ2X)MV4B|*VV1gEw5A^*28dQxN;=JbYB< z>2QaDMrcivj@Xf`fEX2*_z`$6>Tck)Dug=7ML)k9?M~$#ONYqE+K90__~ehb;8pwZ zdCQNj4)}QrdB=`JIYW5mg{So^5tNJz7_QhU7m>&c6yne@mmdX@;d@qs9-Vkt=qm!k z_1cBYXQ4U+AB@UZj?YO^80!k4Zrx~`N`vciUI8NnC`RXhR0QNP4Cc49HRph93<L{E zL`;1QG>)-l{PRY-zpsYI;jQNV^wv^PKz%hj&;#oh*RTUPNCsCWVebt7ity)-9GfnC zyt4tE)aQZblbW;A^Hf~5!F%BA_=bKytILk>gU8&8*s5nOkOR<J)kPd#!}$i+BCs8? zx8Y|RZb-OU4vporD7<3UDLDsP4P9S2fA<QPk-NE0&Umb-sBOL~;VQUnu@g1z{;B~I zGkC0t+%zT~b?(|R#IFc>H<gCoU-<m6a$g;M1Jb_1MqFKjWmGsT8m;-dw`6ncBUU5A z%I!I{a#Dl$a?<h&I-GJMY<ymFg=PtyKd65_g3{*<(MRx(FnDi=x%JMm8;=a;KL?8G zkvIY`e=Avuz8+RI#hrNM+o8?KxyMNy9A#Gt><ZjFGI(qTPr_~}>J2=&vGaTTgR4?5 zRB>?lFhwI$g*S-!qh7cwA$N{&{UzZ{7qiM9yvcm|neTnvOqN-{BMVs|hZ|aX_Yni? zRx<Z}p1&maY0Q+2-xXE1=>Wu`O~P1hswY1>e|&Z6&p;%Q@eiHF19YxRF4&M|9VY8A zPE*Gh_~%-=K7LKrZ)^9R$#V2+^zRx888KoTY3rZ9S%f)a{s)DT65-l-1G;{v?tSQB zyg+CH?y0^X6^`ZpA0yunfZ^-W>i9XvJY9gi4#)rVkR7u?e)Hp9DJB%-g%*#PnL|YV zfcoR-AWCu$nJCn?n!`TUw`sX{9MRce2kZAQp99Q7k=EJTr0tD^m*jrb3eyQT6RJpF zG>4C*6Ch`cx|_%Gy2BB4HnzV?W9#~>2!n$si0R`$Nr3c(rT+%CiH9>#<rsuF59Uf- zT$!z@ViXXWaO(;a(j*ezrb#3i7|pP`ki~{o^2YabX^(R$X!BP(woZ~U)1ih+PThf4 zy24vR;gk@5xA6hTZ)5ATJZ^b!pOSZ|?I{>B9qB&f{Zdj13Y~GG)_L6X<L2SXY<0u4 z*k50;wu{44@W}oI#W4#|9cwV%U8_i&1qkpKn}pouj?OsUQt|iuEao?sAk2<Ya^B2x z4|spfdk*6XhWHf_MJyk7z#WqU3fE)otY4jXA@+x(>p+Kw^*Ka19654uf}L#>(S$>p zu?DPyLXO@ZP#KkE3On*Kgvi*2l4?1&K#f8sTjS_W9)5#{hS-L1zs1z+xH^FT92OvW zZJZ_ZT^bn{&%dRBZZNk%Hq}-xP90+BN@2qx_eZ6m%SvdA47j#pm2k7hr3tGE8bbGn z<tSmzV+E&|QyMLnRMzn0W?MzR0y7;PX^kcO2dH&tB%dyVUMK4U*{OTnSl#o43*lT& z!EC8?hpFXJ_K2d!<WW7#!cbjyL<z>%_ucXNOFq)QR>2;*Yfdj}gz4O(<I(f?imk|} zJtYTvpM9C)V^f0(z}5GwKzKMe-=1et1Xp0mf|XIM=`r$5nnbGy#QL#@tw(*vpO$*M zK<es;jqf#T4dl5&YoYn-_3Dvu!6~_Ga#H269q^FC6#u0(%L2(YnXv;)Y=%(XZ#!v~ z3mx5E3PxUwO^34KJ?ABDm_3MBEkq_&1#^PRtls>M>^V;A(77<HLyREapX=oDN`m-c z5K7eD3JJeqI{B)S_tbblSd7*=u7*jc1E+}y!ZVZ}Qr1!dc{g2=&y2y#4Kbd$pX{Lc zBZ#kDbw=1_1nNi9%s5{0>!h$FSStjK#|WXl;3U|tr*AhcWgt%!1KQ8XRmla5QRJ8~ zg;B;~YAdm?(41ZMrB%a{jRXra<Mj=@Ltx`QoN!B5|6X}V)PRtM^d#Q+)$&)@IIdiE z9aF5(pVN7ZVJiXx#~jH-vanqX=f}*=jYrWOPjj6e_?{KROd&Z{x&VmdcwLdy?Cejk zI>A%d%1Fm*m=`r6%0%@c=xCCalq4mR=-U(S@o<`93r^jB%fp6I(V9cC98y~Y(88{W zsev8F4-sK#TMYElYXYu~a`}_AE`BX}kQJ>c>fbb|9<udF6bg%>VTTB<NqIY93tM33 zqSuxADvC{As$-qmHjr1I3J0OK_Ygz~86ob7kr#ng#A)b*YSnd2CEHP@0CDA%0yI8< z=W;G%l9KdQPgq-g|Hm^{9)|h2%MP#84oU54*bOE_`D!VsHi2;hKMwM)6z(}>M<}gx zH_6%bHMg@H6o1|q46D6t!E4-Z%k_OOkKe|^nRH}T@hCP=4-1w)0RGZa5WoNC!JmA= zuC#IO0<jZq!Y!a`)DYzn6M~M<OM;4OOOn>yNBhdm!7Lo;0lQWZeeWo8$ff>vRfE;; zmfCCy#qRb+`dX%_u|jQRZqQ`$RL_ASk1s596d4MzC6mKVuHO-i*l~lUU^HvhS&K^l z&tjrNw${m24mAJ~RSy%nDa1jzWCF!t_7Fi6ob-a**$Ls=%j&qDo8k26g}Nz?54e-@ zUZ)lluPa&)wdtWcx$o7vri1A2dO6lJg=)INo&!PMcxF$~3FD6V9t8zR4p)-pe=Vk5 z<(xAVIKJ|<_Fbb;^D&5xzh+e)k!MomoLl*ZQpu$&QW}kMy*@-RKahke)u9H`j--~v z`GTE&xv?VJ14-7=S)oB~Xd*Gj08auZpr9fTyuXS2yV&VJcFxZaoumQ>66gllt+X}+ z!lEi^LW(ErOIt>5VXcO4Z*?>jY>hyCCF!0P;ueX1RFw0t8fyK&0Jr>#N?dVmNXBI@ zqIBcb<{VUIkxx+I1$U=G*LKKNsPV7k14f+bT|!QlOIcCI^9!8?%tShox-!KKE+^)Q zZI&6p(I~Dz&?-P+7q+6(+Zl`bmS%tI@(o%PC0BSb50N?F8JyZWmxbfP+ZQj@rdyQd z#x7M-WcivnT~2n`_%-uQ`vt_%+!p)JKB(hF&y3JYTB@=wlPoluvvHtMU=7(Xmvgm| zWS~0)Eny&(V&ur3;&fRE&R~^C!-c_HkT1Ig$V4vt7X=dZkpP)4xK5jjNTZ4R69M(K z&#y$AG23`Ty+D?gOd2W0G%}}VAZeqaF&b{{qkE`(dP4&VD>@!KMao{VY`L1KUC*7K z@U>H5T+G2(e`));atkKeGLXu!hLQ6fbl<ZukfVlO@ILjv_SwsIa^pOj2xp#(sCJ$) zO8%VE3-ma)-a|WdJ`hV@v_Hx;7H_UtD@l<y==sdYW^$b&D@Tm+#i^~e)~Iy8%q8-E z<O@wo^6RU~$loRDK#+ueJ8Jh2uhF|~=`(CrFGFC!g7L^5g6P~9j-@2?mYf>K3c<X9 zV~2!JR#EYtV9WzZ#a!7azh2$x{4}rDCgx8zJcIJF>;6ch;ytVX!zWS9t7dWr&A2HE zEZ5*z4O$liwqFTUjoQc62JR*>p`_(O(>VY@xO6A^kq7W1_XW9H)3V)%i2A(zNwEWN z?L}p_H;1yJX%`MriKY<aj@2LtoH01xXP1zC?KqhQ?wb_@7$p^Ag<K!H8$8I)V^7Q0 zb;ZDy!j>;op|Y5;58y-8$KCvR#!RI$)zH&@h+xG?TIR1$v_?^MjX^y)ll5tj3J~9P zAnCOrO!>{yl5tN)7}<1)r)xy71qx7i<z0eD8Fs$TWH7`ctn(1xDAG18#N7rL$-$@O zqNC5`tVFEb*v4*|>iI$!ZkGinQyXsq!;zROnDaAPWO<~&5@o<StlqRaO${X&@t*W1 zu<ualVWLmtm-r3q8Ep-Nk8{+G`>hKN)ga|m@Lthy;oQ$wBOGnGEc?KgMH^kQgN^S_ zTOLM{g$E5l&Z83|5A72Z-p34{Wn`$4*mzit4*zPS-*DT$TJM)~B*ZAsO3qW60SrX= z=pYQ2_e)8>sH1<@0S4lI(?+~^LWXPo%MF;#tUAyBK5lY))A|CgXa3k5lwH3D+UaV_ zp1Ma_Va>0tVOl!jm22GEb*Ok@dtEIP4OB3kI5ve!JkskR3!yF?E{y=Ym5W{y-mqx8 zSJo`M3uN4{DWkJ)bgm3|U`(?v^*;ai!4<8rf3G`!>C_vyLMl^hre`^N8K?RRHe?<6 zuCk=l1~MFTMjC(%qR#yMDZw!o<RmlM8)fW~c;p|JTnL2Q3mUDIc!_I1c{n_2G693e z$iHx|8;{ks#3%2Z3U<&h_{d{lA}^F4uSfMwi!@;v19*D75Bz4^!x8rfb~NNcKSP1@ zZ~-L8OL!5B9*#Hzhu}1^m0Wrb&w@eJ&PXrC?)g4!}B(P&vb=W?p<zrG{TL>cyz z(a;V?aen}$cLhkhu)IxtAh~<kf}S}<eD2(-D_#JkzQ`y(Cz|4Xo!L@|pUX|07Bq3x zMSd%g>O`JGQ~#S~%=^@(bewG^yE}Hf%js^swQY7f=K%6WLkJ;+5{84X{EphcC#HnJ z{kJh3jet3tY83EJ_cHj75JCv8<3IBFLntz4j|(&BJz1icGL~~3YLsEgp0uDAXiC>1 z|8NOAm79hxp$2j!rAb|9tI}qKXFs~w+x1UND!WGlM0$F(Fr0h0_K(FD$$!EFj+*qe z=<OT^>G1|7WOUYLKgxWQsJ_dI@Fy1j;SsiqyW9d4BPf_ytkao-My65;I<Y=gnoqvm zV>`cqahf)~nqDHQ7t*!s$l!=93obM1qUq{oj?(+ccEGi=n!xEKpN)gY$f1CNpSAU8 z+}TtiZypPDp{>cL!ZqQO_}7fiZoeE0aey%mGN>)ef{7G-G$7&LP(*Gk&b?NQ8HlYz zm7><3w_qJijxD%#BVugT_@oDxsjwchX0dg}=)p`XqbjmEd}7OVV$Z}ER55OSE_S`J zp>#F$s!?{NCc-a@AJ-uhbEO{!?Fz3p@$w9?pRYrBa*S<gUWTLd6|1vEb;F7%Q=3Kh z0lJRxm;iM^Z*t=qn9sf_IE9>D@Zh2T>!?Pr4A>X4$GpEsHtVL+h1{)@C=4rLn5Z$t z`^-Q}R+kL-1nlsWtrL|7d_ql3zs6S1Y<WyFeC6?7zPy%9!GWW7`^aiJuJ3UMr(Jzm zztQUly-SR(tnSnPTL~LmFGNbge&smfK|X?f_BQ)oi9P?LHDWIvs=cM<{(zEy1F2E4 z&V6m7Ov7<Prc@jjuWDS&345?}u?i;YHBMFokK9^D!X14)*B>v9wQyrE7tlbt$L;<2 zMsVe*d8F)_jAs?e;w(=Fs!g|*5SyPrr{(yIcz6c<KIniuk7Mb*+??^AY;t^eBb3@L zsFgq8IwiMK(e039WFcDeFcv<^^)pi8kwE%awAYxP{qBN`f0iN))3S*p+ui->gNCN+ z?$Q_O>C1ZdN~QkOW{rF@XvKdF7}AW}xh6Q$i6D$&X^H~i`tBGk2!-QG=n12@wW50@ z;g~%Jg0$vRAK+>a_JTASsOZQGT3nN45h&B;?9CiC8KRvTZGmd(-H2UV&$xeiE@1(d zWA2<i`~*!YA-sK5BUV#muRq1Z5~k6`W%p3Jzwk;*qx(Xv(o<~Wu=`b@<yhWv%zBEM z)zx00RbHp3;HsJ!Nmy&4$~T1(08c=$zg(opp@j48fw1E}TT<HVJHBy_)|xfm_U%r` zv~5G}?3T>L&hF(oqA!{Ouu}sn1^C1|Fo5}lUb3Nz0X=w|z6l_MGMP94mL+Es(DX^t z7iEac-?VKE>mRWE#wOtXHX-axxHD2AWf~lO>q0pL=&O|9s|hcA4v2=^>d}&%4vK<5 zs*U`f2?%<(f8c=Sk_zQ^_fqy6;aqkIHi!^~!9;mR<)%>YuB5W6NyU43f^aaWDC6@K zSqRhjVB4n(@-hj-)5)M6E(nQU-sO(Y&}+;$amRw<6M&Wki0m3*HK;}<)p_B&IFK$9 zn*54T*XJOpA~iM1OGg#53|?);iQI3<J3ficS0Fyre_;!n6-_O0HBSC^fpVe$zwkeU zxMNzdX5uz96G`5{r2^%vC-z&`?*VIKYlf3cTHEC>Ctp*dwElN8`XBt?A=<H{Cbn&| zhOH3E8z5JL*SA3nR7L7#9K39f-=HQ{ND1w=k9`aVj*^o%x!*=xlUfrE-jlD;(D8ck zIyUO!N?1={{v;2d#7D0|&y|;sW+gdS`6FI=wO5YbOh#)1BZ@+MI45%9ZIf&(&z0wu zlglRghSc2%;axYa+*&ytb98LuuTkD(8*YJ;6|dW!5c`sk@%Fw!fg+nLOj1eyxkt`O zx0?H*5kj?@w>9rBQ&k&b*sq1!@X($eNSvSB8*gcbA~{P@loDIQta49IV`aM>jpdDe z7vxd`{hU!D?-KWY$7L^A<03`$f2V9W)^sH{rb>H;5KrW?HEY6P+Q^z!J%p16q)~s( zi;Z;`aidR$9Q4H_$ECOiM^Rpi^oOIUUg!cDbH(w|<x8?Su)@t_^IJACIdl;P(5@w9 z^zG2DPbH)HM9$|fJ6qf?+<b`|S|XOg&2h-G#WCm!WnadhM*Vpb;{3_Cyu0=V^%46U zai3p-zl#4C$obyIsJ9WF-$;1t<G5>8H&t=klR|k-|4Al3K2yh+T*W7yvysc@k2rT* zY6io@<q*;^Tn`@%a<hAyufNm~3HItlxj01Fxil=kdG-n!CtfsTbH_+yiT8%1&*nvJ zgG`ZA9-Qb)*3HS&FQ3F`4@~b1qe4Sio{J!4)DnTpwY<z@UzDtWN|rt@ku}$k%oG?K zj-0g3EW@fbv={AZchGkSGDj4gyOMf*GN3mc6~^K;$0C=H#{DP9YsHi!Ajgf3vN)dl z5WSPjxhu}O;mB$E3ZvTE7mLkvh`ScB*K!9ZqtCYM6f{5EtWl%=JjGC#O>EV*WZMs# zdBC+P8zDMhs-uCjWTfcStbm90PQ3hzxNt33-QGsj-Cac8+(hou_4RpXL(TG6hF5WE z)RgB(vPT?TTs*8qnSPtac`RV1?5UMp9;A;eMP>Up#T9$E$&V|8`x#3l<|u6z(JuO5 zm`J>ltXMxJFZDgn5@w_i-?TtkqM@&e`zU~+?nG(ll#sIX?IrALr-Rx!8ITw)`*#a9 zSnvT?3|Jw{=ySiofpYbB#zWSqMuob*M%hD3zDD7`aH6Fo#$gDrWxC%5_lYe-N;_dA z;813W9Kqd40u_lP^+Sj$Y%obyouD*3l<r20T!sw3K#+rSRM11GRGYbz>I?jN2Y<nk z*AC@ekmuSoTgqLpt5psUc_)|T52rD|EZ8RGYmSASSa9Vwy9fNShJfY}LRmAW@nCL4 z69y|ddhAqjmG9^s06(ke=K{+bVqnoKnOfdvF!|hW4inoe8^Iek!Q4wMDwKIA=d=vA z0KWw-{K_@DEAT-BA*kn~yzTBWc!$n|D4=|Sx;?NZq1xcOWjK8e1`4iBP$vjJwN--~ z@@^?s`6G3_K2ngxWf$rthRV9H7Tm0G;Ro4Co`}ANMswvW)t}^j2C+tF3EFC_LvFjw zl_&DWc0on=FdfgWz#i<h{jts+IwM-S9pX29zdulefg1sOl5ee9^;Ppk#us4I4RfFN zfL<8CY5tA#`qWs;d8&T47Cvjk=_{L9SJw(}Q!n#E)HhD-_EjQMRdt^{Pcbo|?MmF= zDk0a*y*k8G_o9Gfi)#W7=iUWtw1zqKhH-3$uTaNxzB_^Zaw-cNlJ}9T;3J;9Zu*z@ zq8Mq@S<ge&~es#}G7kNSCSVA!P-Q6$z^jAWM(X*}%(ck&T1e$;8ytaqsI|^Yi zU2S@Xn8*nx(fWid9kjecC@!tkpIllUSN537sjK8}-4j@P?r}LkcH-l{x5yVDpjEhC z`~pa<mOg1ZzE-2!5k6{XYzQaWgme|6-XvGMOGdE+M~4xfjXjJ1FHMi|Y?aD|4cz{0 z)aRzx;K2<+`vy&1YQ0kn=J_a+pAdFhaZlxhdv4}+vm>oqad$xt<JE?_u!&Xo=-GPL zeT3C<x-RQXm3ofsuIjnkl#6|c46|!KDgxfBJdAX*Ha4`&j(q^;fX32!?`4%cZmdSx zljswdZ(p!fg#0PZY2ZeJlQH0g`bDPjn$&d)pS<}vwzc$vpEyzn-oz`9lFVo0Vdhny zUUjTyxfK(v#;bTY1HTNYK?xR9ta!@0Db*R>Gjp|mE6e*+DQ%^`z08G7?ZP3SU@_XW z29$i&kr}SL?0nnwIrn5xx*XLL9<I8^A91>B9nYumNohIGK{2<*D;crVSq~)3dGiT4 z;T0#6b|gD($fc8Uf3|h%rnFhaOC8{ijPTDRz@<3+(>}5h&Exhax;}jNw7eb9w}U&_ z_~jn7<FS<uPWQQ{!K^t;pbCAjlKD{&qAKrCt_R_(ed_tbF99}aKlzlgPBW-@e2&z# z=;tOVh&m)pM~lyIdc;~4G4d*^yvt7D*`gOJU?+Z{0FX;@5c_BkKMsU(lWmtWTMy4s zA$F#h;9ZBz!15Cf9tG5KVyyf3hoLehPmzhjJAvK@nkM{C`MV>5J~C4zpzLT|<SMm8 zr&*y(btOgD>!ZGPj(9W-4@2RH!+L8vJ)lgfB_<NypzY&>_MU?YgNo1ww2Vh#<W3D$ z<_Wft@fJ>Gx{0w~^eas}cjc!fN{!X!v-N3+J=71y%xX~k&qm%o=RTP1kPke{)YEpZ zndiM`?4S$7%yn6kKXY{LI6}0#?*V`gYAThezvlRPY<+UFJ4uY7$jnWAlc#&Ag69`C zY_GwHFIkflxgW-ysVL`-Zxw!G5%MVvswV41PklT`A7>~J8+{q-;myRoeGO{x+@#St zk5<W~Z%c%J!YuOLt+9TRHEe7X<vL-$qqWY(d?~rSHuzCuup7UHv$FYM1%LV_9XUKk zJ>p_r(W3;paAoSX3rV(;v*3XdncaV2W#?d6bO_F-HK&g^rD{AsiXFCH3T#DI^fVug zZUm@N5AvCX@VBPwjhx8RAl#mp5xU7iRA4u!2aO9el0_V|@g@pl25RW;74DyMxy>cJ zb6w=09KbsT7rFFG(V2a&L9I6cWB&1F->F#9S{{8p+!uQ6NI<ju0Se|A(I31c<GWv< z6YQcIxu0F=jhUJT&9&h4)=>rxu8-m)Iu?3D*lRY>bc?r=*g?_Hcw>_QU4aD*VgR>@ z;WL?EkWpZe(g?dj-CvNsf$64+$d9I6y_>8IvqR;sMQXcUOT$nyu+Qmy&W|}S4}VFU zyxHf-AAR9Kp=IIV)b0P*7W3n*G)wD@5L_sV#YJ^ycj0&sA2;c|4x2T{xptcc&ndg0 zy^`@>yni~{um{}v`Sh`N|CcxVh0{(-x6MvU*^b=?ZRYy+h}8ic#BxazDj200+vd+B z7x5BonRvU0yEfUu3vkj+OiE+k&rkya;eK}|`}4mj(zC{iF|bmf+g`lEjA5Un!bVov zpSr*BbGplC`9J8^pZ&Rg19$)OFC2IX`-Wxr=_3H-`vr6Hfxvi0E+23bSkq3&jfl>6 zWy;wGZNDIN3kY3?17jMF*jSq(sN4mGVo0HG6e)1JtGjxj`!!z@D{2wzR*N>1-39)u zpUIEHy>gH7BabgWRIC01&J6c-Huf!nTsm0!XUuP1c3RXY&~zsnm$#q81f}~q(4d@- z{PayX9M<`e*OM7GGDAD*R$Y$0h<rj9L8*ePmej|OL4+N#lg1-|T^pJ7fQGs4t!+@a zI%kWX6hf&e>kPGfx62-tfOR<k)(Jd(>>VxUIpBy({x<fnm=Oc>9Cp4{42}-4YKKEX z`Q)LRTv@sy%Bh@N5)f~<&m}wn*uOj-m_Y1I%!m6PD`+s3n^M@bUVg(*b+^brp#r&H zjj=nA>AX<t@>d^4p4=5iOmMQX$HeMhYCQ<+&G~rqmaZA1jH5BI$}E#VLT#jO{jPeS z%B_n!Gu)BEPu-s$+u3Ase|x*^vhh3Y!57i3b8a|%>wra$$n>LX_HWJCS)S>&K%MzJ z`wEd!l0)u1o`|i6fUo_ki_>(n9^a{-*@w74fhvt@sbuyDJqjKI<NUSd#~$DA-++RW zYgB^r*(rSxvAuy#wDZMaxY@%)qa+|VO{IQZfo4S}(2ZPqgDQw|KEtR?{<EF=aVnrw z7j0UInU4D)IdGw{6ra>#n2SvCoqVjJo=S7$UzCC;C>$x&(3f(r(GLFo=g0STvr3n# zBmJ6|%)cihfNHS!*~2o5sb<W_<4U;EXnHNsHhhMbi38Ie+yc-og3~T}r$>-6Jn{YQ z;5HOH_><dvUCW&_8Gkn|e`5CEC&Aq~Pw0bur|jB}DMKKP5-xeh^9Lu~aiTR2TK6bq z6PG5jr~>MWZhVLf*=BoRj+<K)v>(_dWso`LU@?nFsBV;UxlK-$!Sw_s9#Dx>g<;DY zgL8%l)MY$OiQ<BbN(_LZL`!++P9Dja-9lX5l`i*P8<K4Uk!(9yz<*mfQT&53;|@?_ zBVgWKnF(0u+P1+qi0qRJw<pAtLSKav>~aYejUsl6FEE7DK}MFrNHOj!*!^WgH2bRK zhd}eh=rT8Q2o;=Paeqcx^;Vh0KCmHMy>(?~l3$1??QpzUv9~Ko@2E`a4`D`aaB@is zPCg2$Z}f%|%SI<08?x#s_-i4Cq@0V<fp4U(DarjVQhNH$%I*s`o{KFhT#QP>2F)}1 zc<X6=G9THr*!OHtw1D&mY`I~>DOoCi3PQdPslDOra&VKtDGj{j%zplJl+ANMO~R)) zcE0)mZb#?dk}dJ1cw23P;cS&{@6c4I_xU}I*q`aX#YsPdUFg1g*zhl(tLMjW%z6Dk zfKK(|#Z&HnunwoSRWA^NVD<b!6=l4&W8<>Rv4#?(4ke}EAfyzn-WowR)8}#OOX#`9 zZf%R!iZ~HsYp`xX1(>sE5|nad4nu04dBI2diP0%pm7U?6bSnPqN;Vwdwbg6FOj6Ds zJ*wggA2?OlypwXmQwe^H6Hj~0WMKEb#itP8#KhrY><6rLVAG82zhqbCvI+}1k8Zvb z7n3K~ZHEH<^2Ryrtd<Gwf#xuv{8wgy3{xir!T`Hb$yM`U?NJb{%|&+bJ!3Z$&dnX{ zGual)L=cz#go9sRX>2+QrZk39E`;!ZG<&P;4K?du9ZUPp*39yUDw+Ro|H@pj&Xk5d z@4G)4DgMeYHSO&f*I*%(-c$(Vlta?C0d&};+uz#tv0Y>OfIw>4`8juVe>oOX?#NH! zVz9bM4P4ySAf6{4a_5i#)X4qvfD{?iCloKdBEC}eLx}qs0M|DX$=YMa+}TcK*G(>Y ztwA=p^S6y6R<PJZUd%r)m#-1d-G9(U3&Q9>8Cn!ed+vM=9cyMMFw34Py$j4zkiwF( z%OBZc$IOp50r<$L?F>uCB-{s2d~H#$<8ZyJrYQANLVllYD*DRS!1$^Px{8=CWiy_c zhvzabDt&jw;(0(3%LXsGS8lOrJ36*TyC`7q1e9+-bV_<yf!L+nj+EjvzAJTk)u>v* z)dEy)cs%*$<3M_M`R9nq3=eZT6>W%RF)m#}o|rDEg!L_KDFYy6`SAptCYWQtQX+Kt zmH6}U(s^f%zJwfdrCO3RFWB3o14{;-M8=G%O<W3uGL>j=SGz7*;>Lp(c)!8pe4!LL z*KG{q_Cq%l>8a~#MGe;zD$S0j;{rFwc|$+;qjY^|F7<hwyZPrhJso_zWvnJ^>sCYw zJrruyb_R$WT|}@qAWC?=8a4J3giqd*e?zY*0<L0VE)!#W&|ivB92v?cTB~>Q^>8w+ z%tKXc=85fQQ3hv+(H^YPr5M5UwIFx3GX%!-_wR;~om_`9l=!nTY}@4t>J-Sj+{a7c zqQFSq;f7i&tIhjiHOoKoOuIE(;zZ&SA^L)u&t4}Z)M>|!6uOM*>bQO1m8GD~LkO=r z|9dcZM8eSJFP8Aobfd-vN(uEqV!i%c1po^I4<>+u4aBW;tYo8?ks&T{Ya#r$iQYaH z-Mc>a_V&PyjTgs*rc&ZEJ)j!|B3B$UMUxVtj&>?5gEyVFP++UAzlW0CA)SPwjo4L# zhC`;`&O~{?zL<NlNB^z(GvM38t^R_U&ngA3o;{w{OR&6rLOQ%OfuN~6e`oCVnOFLi z*`9{5Z?2*iOf9D0<mlfNQrC^?FW@QguLE0C@4YM%sSiJZADSSQ#nIPefZH71b1(!% zDYALf&Q3EKwS2s@x?BJQ)-0xvMo(RM__`))OSga%ic9HiMj6kTQrnp1n38<9H4w%d z`FliVlRqoC0a32=(d=6XkD>DVG0_?*oib>xF@1kjYi6<7m&*`X^;jf#M;yD59*-DB z`2TEb_Wv;&j;LM85U<-6!j*0?B7S`}^1c|ZQJEi~Wpb}dQyb}LVJmpKT3lDONUHfv z<cF7^iJ|O`h1y52VOIxf!WlbUCXeWB6_jMX9x!~dBUT;0#kMTC#lB=%L@9#R3()mB ztzWsdmZvVudVK$RyJ888>2VPLX-?Pf2&I&qH_me)P`>=TLM$_WxnF)CdhD;^ue{%4 z65`v!UjZ$<101V+r#ZKa%tE_v>MKb@o%jL#_yh?=cR8%i0fB<lS}xXFMv^+=%Tfcn z$n*bNw6#}R{dt(n#1*4Do=`ImVs<DZv4S+%i5tMZ1xj;#`J}gN!2`kWz__oC&qgk! z+ZKq~CMPoqxGSz<;Q{a6|_5abT5DN5&!+bc}peylb#Khamf6jpg(B<VmtvOgUc zeirWkv#H7d$2cOYVTsH@^jHa+SRwGKHodMLIH~{0U9+MaIUU3eXH&uGj`~wg<vD;8 z)n}(!8@*P7|1UcOSHh7xk6Th0xR1W+(N+s>2W|$o>8N)yHZwphV+FxiawlUWV}}h! zU>HBw*`V^<$s08rAYwDMO-e@&QEO{Z>E5PLMsyQ&2?7k$y>0^_DxkN(DFul2N-t1! zUrRU9X?3DDQM<=+_>|~qY)YojGoKT|-vEQAb|F|30%J+6My#YSEi6VXB;cobmAAO^ zbmtkI$x2P7HJLh3RjIp+oL{^Uz5EeGUXu@^?~>F#w!UyM*Lov)Z4Ue&5CVPOsE}<k zj8A9J>YvoJpQGtH&rKh{0yZ}JwWym<=um8|if`S}`D^+DFL7-XJ&4PJz?IgQj2{Vv zN4}5^H*Da6D|p(AR+jlvfFbe;5T$HMJrSV?y%ohc&Z;$^;#bt!l76bA4nzLAK+@f3 zsG!fjqLbI#C5yCTt|4yNI#t|_nRM&X3m{Nf&(YNbU~~k}o*)*-M%57?r2WpS3Aagb zn#<MHHYuBZh~?|aRYD~|9~6C0*hJq)MkBxraUIEf%yC)-1P@MkeuYUqw14;LmKce} z&5Ij0Y}XbCYFbL0MsotNQu~w{Z}#D1rp58zY4`}-{|BU>&IT_z2e&mh`TxjE`j!{~ z=JXOZVL>qY3o0*<y|s)*WA<_1v8NfY=eac-W#zUm_$xhUuh!LnTN5LYrUPBz*|Xkg za}^k!Gij@O@OYDuTQu$~6RKV1IeU1J{8w3c!uRu31g4D)gsOMKeePl~zIVm*RAVKz zD^{FT9A3=pFBJhJSoMcu&%eBlZ(u)5?T=7Rwv<vIAi0(J=%jcMtS#)NZg;|=ZJry1 zn0M#1_n}M0Mf6>_SMcfR%k=ouj9cNQ`L?&%lkqKgy-|-c8s_jp_<jMazfpkbrU^Gk zXxmLvO>~q?I4)=Z6_eI3emdFmF*X1B!JW#C&1mgR=}oZ!m6ncVv;PTsFaLjwON{8o zI{jBt<MMA8su?b_AfLV1w3w9`b>C=VB^xnuBirwo!6eL^;)cc&5#Z+2>iRrdmA{*V zTaRC~h@y?SI6^|Y#aDUXwTMcM=hS{yyW*h3z8<AdmcpNVh~tYeQ$wk+IQ?U&$Rjyd zfzp)1)wl(7yBwL5M22g|mX$S<_w~L%dW9e&hzo~$^<OVLJ)`_Tn4=T?y=)kTK~xj4 z;yT<`x++++9puZUMO^Gy^kDK4Qmfj3I<G~?ci3QES*6@|q<efnK3DUo%5l{T^_dZv z-jA+nZF{a!OY{M&?2e_G%*vjSSl<YAp$#`l)<>cF8Z$10n^au7^Zf~EP@De#q;x0T zF@(#EYj*Wf;K_2sY|v=m*xvj~=5VHz<0^eX)Y6`7X7fi^%tl1!L{E$AQI%ZHe(U(O zldOb@E`Leb4%@iG0ifybznxPIf@p<*VqpJO-Vc-xEOKziInBRS-RB_u<fiu-&+>+t zK&%gmXq~iAf?Ix;`Z?lCR3bITqWQ&LAe3;CqDj+0;GzP73&6NNyt)&T5(=ZEZh=EZ zGasBE7N8wE)t(=Z2BKv%G=5%OssS@W=qSyOgS%wG#)rJCB$a1Z;!LkhkWLeu%%5MJ z-c^VwG)yo8--YJc(J7x2DBC^hq=Aa^{(<zK9ZC-FlV})@(msioHxlX9LMd_lSkCke z%t<85m}$kd20ag2qBXW-m%7sjDC`p;L~?=h9jWVf5as*!V)n&ugI8kD6b7#UQ1jjc zS49o>j>Y}WRO5}WBi)q9CfCt+va@EtPL-Ic#hG4}aoL|@a#hYY`{$R>qDgx!Ttj~R z0Xk#cw%jizh6Tg+4fp{^<$qTe*hsS1Fz{SmA6;*+JU7f)S%&x1k_-^ox`PAKouuQb z2~BlGescg(k9ERJrG)PuxSV>x^B~+YRYKsdsFZE#V;~$r0kwlXHjt30H@ZPKj>lRo z4;ezss8P>efJm91=yNJ(&uu>zI%^)i^HyDIUVWCRF1f58%vQ2tcxiw)X-46*I>AY0 ze!@85|DV(~L+)6CSy<YTzc3yI{w9HUGyV<1y_-X}lGlF?7?wP5-w|0;njBI4oJMK1 z+J48obpWT9$R(+E+cN3tsp(!GCZ1A@y_L7+z=Vj~cnF~-Bi28^z^7F=L;}ZCF5)7F zb0?-`6vdJ*X~`1m7{?tG;VqiwPr}<6f6r%fNO<;UqGzI+K3-H<{U0wPU5-CSCdvqn z%s~RvXD?hQ^8N;C$|in2B|h-DJrU2zkVN%7$Ay>HJ{Z@DeCB9HCZ?np3;36H39H^m z@UFoN=v?MgZ|wK32V$cARTVK-Y{cQ<D>5<_Uo+bh7u>JJ+=E+;*u8;J{qr&C(45ei zXr>R03fuf+Csc|r3XftU{L6ujawR1;Sh%SrL})f9#<|$b2dlI1_=@#%9k;Z93=?j% z6pvr7t4*0pNJ)W8y*y{joWYthk?G}!wcS6x00atjfm7QjhUt}3u@?gqYH11*ro^^& z*p?)F&Sqvnr%D{-x%|1>y3}RzJIO;LJulMGQrc$!)YK%ZI6li{w@N^DGd2{l^2Rc~ zNLAO+!GHAG4-%qanwss{B-k-ZrsoXHiNI@KsBg%i3h*E#6AA&zUvQ&*q3->}2>P1Z z2u4?9UhSWJ`F66J5SpDzOk$@%=hDc~8Mm8Bq{<9s%w;wCuD>N<r=WN^Os`I=Dd)@h z&To`Ir@7F?D7{J*b486m$m-8UN%lv2z2R?Mrfv0~#&J9Cn?-OOE&bJuJ4Ra~14%5` z))N-WZIR0~DzF<4h!AG6t#VZd^DrR__nKKgMq9?@K0u%>)bZK+VVPcb4NL{N1iO+X z=u}1nN>c;vrj984Nucgj60K(%bEYQD9HFB$IiB+*()aKxA){YW5}##!uS%v1clzQ` z>$?(nT%O+?BJv_1{J6ic1+Np(UJtAKJTu8$pJ$%i#`U<mjL^Jsu4;nsFLj6glz|7r zZLP+XjDFJeS-~dmys((qd@(QE$o!f4>@fH4e;hYDVrPapef8l(wh#&G3?-KxjY1gv z6t@QzWlf}>;rLPT_D1Q?T9EY>9?41$_Fc~|s~S9h++Mo;II)eNtpB^TM`X6p&=D3v zS6dw}`Yt60{>(e!d)EU|(Y~t6SW7nIQ1B&Hxw0?G2c<WpS@8vMc55|g>1$r{F)a8~ zk@ID!_ddbDxv$LGrTlZ_gE82Rcjn}U8_k22y7PIwY|=G%)Sek9Yw(LU+_yHS9O&G$ zhYg%bK=*n;$$KHdZZl%bJJBrmgSKKJ4hLU+XY^?GwPj7SK{O1nM6#LvvMYt~3J%x+ zU7oo&{+k0;%{9&;5N!#-Kmh(huN?idrUlsgnbHrC)_74h+c=B(k*R?qC@()d9O7+$ zFkc$K<N(1#=*53-{5;X*_EY;<<-|p_2h4|JjbZlWmEPso^ob~TC$jfKLyJCQ$nQSR zmw5TTMJRuK(GyqxcFQ8EG#=kqU7kWouq#W1j*|xkqZAiO>(6r>(s$<`P=Cjlz?J<T z6A5PLW9atLxUloqkt5um>mpBz@Ns3M{VlB}1F^8$GCGg%mE&>AAy=2Y316k>1P2P6 zx{*_YcB^D`g01ixCBJ>>_%c(Qr~f6fa$PfHESWxWbzyplRs}1n%%Jdjz{+~+{%*B^ zE&^t5=ano)ubtLJaz?V}T~EzcO-Ew4jUdfD^Ld(`UD{|8ZQ{z@4KW1ezpWH%pvx2l zh$N-iwavY+Z;HyP^rj^$_(im=$YmJQM=G71otxqIx|$VbViLvef0CfXT}=Sds1x4@ zK&Zmm9QTQOT_a;WnN~|nIyKwXy5HT7GC`zdzAVxn#yP<hzBD$N5=^j-u*lks0ydum z01<!{W@>em31s`{iK&-4LPu|M9GLO<t%0N_{y}L~Yi+IKs&udyG8j0W82mWc=6GWJ zBdHBo4&gz6n_tl^KgRt9^lrUjUksr2+UsnE+#PIQ=wB#TbhE~q1Hs1pf-w;|vB=uD zu^!5k_tiC(0|d=Cm@n2%x})&K^VUMS344Pr5j3fa?qS*x+^*4424Zf|o=XX-&D&@g z#AnfvX6RLYG$k}^a3Jf_e|`^E78@U0*}{&PEh!kBHF*Wz7R=PA0EA-*2p+c;p)>OJ z;0<1Qr?NsEi^d=)AcCR4-Jz|L^G5^yWk8_u)O=EWXgS~AC&E4HGPGI?#-_!xoc%$Q zoJ)cGxPswGqU8}UXVWf4V-IheYIzAlYquX?uQHM^_)TOcrq>r}Wf)U7U_peQ2>clH zGY#?%B}9;Nn28sb4=jAi(J@uU`HKLxQG5ShwTx~E%-k+Jv~%}qXVxeKl0P25$8elC znMpV~O(^S(yoBBeT+#O|rl7x&gLG>_-0X!DY}c$Q;IT%)R7TFUTGzi|>WXq39emJe z0)=jE=d|sf6~W5BHmSK&k7{k5K8PVJH!!(BtQoHx(AK3pcead@G`gr;ik>x78KHS& zZQT+8x3fISZRsUnI{IL@T1IEG5B8%5B3&}YFDU_D(oNqs3@Om@6*6Q<u<*WZ&FpSy z7arQI;|(!nNVM<;DMDQb$`f*~+&tF8SX&c8U!>iMoeG^vB}3;FCytfM$Q;QnbN;D1 z!(LJ@5CU|7p24L;_P)HqUVTq(AMfM9sAq}!y~*AuQ)m-m>|?BcfOiT(Z}~V2VT&|@ z8EaZfAm2c2O{taqxidPs{S@kfEGnrzcfo`kncNs1mDC6#v!CE$|73D!2LH2$%i3(w zR(n{us-V57+S~exZ1yGzHbRhd&>LYUMFM^w5CaP>eB0wLwDNp?&-f_G&b8!_|ES_B zSfhKoM#<S!Vn#96lES2%u573%ONW^4NgBxTn2Ok#>QeE`@z+&|S#0d+wMgAa^<`Lk z01ezIgdTG$QTNyW;|u4C+P6#nAs<9+UDh(isP(yX=KE?dwJWtJPCQh_PE29u$Xzoi z$PbKFfWOhic?Q!?N>C;UQHXjH()8w9&ykt-M1Np(L*?!*;_rpe=l;A~qoLf!0xr96 z&7#C#Y#<7n3k?pBfM;#b%&WSd49FU*2ZFy7{l=DzQZ1i1lKgeix#0!Z2TI>XY7&JN z*)!VeNP&0eK&GMG;t4yIo^CHq_f@1nHUdq@v0qL`Zl?VKf+nPs7R{o0mD0BqNBgIc z^fF4S=m_yk;>&=Z%JGjmX9QCh6vs#1!lK+$J9U;X*m`|@mC<zS34GyVmUO}P1*7CB z0+tc#aRljwRXQeT<@L(Rzw`17&~a2pX@N!-n)ljj-mXu-Mc+#3sNzm?P6#44X;>hv zM(&k{Gkko~>Z)$0op9%HnQ&+%t`VSFGEHcMZ#`KGB!1NJ!bc!o(kULysFXAE#dBxH z`0opQVy0gBbrNZfEqT&&a#$s#*AWj!D3*{MZ32dn#q@<scCoCvmtj+djDiW0wp;^e z?Qm8|=85x8sOi3ZFII6<N+Ub0Xydtk7B?o2$;u>G7ZN>ynuw0hJ@s|gR=eAJNN!)D zuRh+&TMuSx?dc!y6OV>5qFV0O4_Xx)uNfW_a=w7ZX9oE?!$S!^gb;X2h^tXhh*5wG zJ|_kpmzoD;cV0s}dc~gmli>!_R}oU@+e&j1fT14#*rPXk+!)w$7m-|R+4vKS8jIK= zc0env7SK%zMJk}=jKcQCq$48RuaQ>dkJ4<e9_ljz-x^Y?3u4t#&kmJ+w{e#f7b9IM zfAngIG-#<i6S~baU?2a=(|z^5Qrm4sXzf%+Sne2?FIXS8l{ot+l??yc)RP2;1l7dh zBVQfNnlGVirt%74*$<JR2fl9R2BF$rM%9az2&TQ1Jos6w&@pMBB_5M}8mV%S+-Rd3 zloWNz&Y#<m;6b3YZ<{Ord&YwjRTAiH@Q-C^V*~)HYByC3Q)r}TU}AA&F`&LHT@!dd z;ru{p(Lj@&FaSD!b!S4+DNxzuK09ddua?nC4Mpxp$r*);auAa;OYuc%HCGSy8v}V+ z#T7uHm@b_U8_jwav}(ep(r`|tR!Zk)<#c@&(+n;h<(C*lNK8Vyk~yqI0%W3b)?Dhi z?i0nz3&genPxpq~W>_Z>#y1vMb2hu2Mc)9`8rRwkH6Igcb}8ogQAsrbBHx3}g}ElE zob|^EYZk3(E~Hdkwf=#;hU4_7U_R20UgPH@cGmIht7ej;GRlWyuki1o5K(`_Mm~Q9 zKSREV|NW2;_Yq)*!XN0n-r)rH`x)?q3ET@g6!XV}YGo1pUdWV?x!p~4q-c@tEtFNL zLa-fYVQUXpE4IBMZ&}NMpaA|s?7GNv%Wb(=s)?4TQKkrjcs%}<qxS7ZitKL5TNS`y zB<@iZT)o%^*k2-w+=!Y#-<{XFlGfj^ofc4X{_7*dLi-;vhjN#b`%1Nv4O<RD-#*c& zBHt-3H{KX(tY~1fbRw{3=;N^_=FgM<ZmuQjm{_F$jGL_)fi@0XOfj+r>;|p5=w~W9 zM>NQ)p$7yG@1YP8fBkx1-~GOZJW;>LAs^1Z`bWLI8XcpF+y^dwbvLFR3iD!QdnO?; zBO+4BcuiB9B<4xEOZQ;~UO0ui6n;g`tS_Ih=q&83qM-MFCi&SxZ^KQLYK0wpncN}3 z)AVCOs5!xiC*t=+XdbN*`Zl_RtswtaRzIx%ZxIav3e%#0u{-rz6v95SyY+%l-uKhK zM-otR>G#z+ZLl@bi{S0YGL~hQMs~)V2fBs0YP#@@I}_}a2pzdmJTsU(G)M^wyc?!; zl-o**QOq~h8tf*iK+#NjC&vs*p8E&vgoF}uyICTB^9AjXNEANGiz49QSb%=&9;w&H z@ESM;^w2J+ut_HE-QwBq72^LN?hqVvd0EYqqky&jkfiUpk93`6&sTh^v>%MoxyZ>z z*Icnb=FYEaES!90F~D~~Kk^Bg#&2sstcLW@xxAdzvk29<gZUIuOyH1AdJElc5VUbL z@(i=)OpWq(OO3MK%rJ8#l$1`@qfl5sGmkIRGR&7w*gr%A%$X=_36FdNEya5wf{M70 zF_QZzy8gjUqJ0y@7xGPo5bZ;5)`RRmKm8S(lZqF+t1sEi3=gZ<*Ie4|?ND4+_o8nq z7`GZues9?M3hAEs0-^R)evgw61eDeb1v1qyWE8ixe_YlVWIw-!NcMd-hDIVs(LS$| z5oWhivd#5>YH#atR+;r1Tp-oxS{@%9RB5Tv1p$(_Q)l5YS!sgq%AXVA#Zfl-*M5$E z(@mkKCmMLlaB8mW33DAe3%5Ti1t79}eAHH~$hFx2YDlr^rqiZDP=5s$TO1u~Zb%D1 z0TW~a{cz)S1Kmy;-J?>5hUs7kh*B~JnkpVVWm_MfWIf)#-|beN8XZDuDz0|x{DWvh zX;vRZ-xMhk32Sy0m%n1{e+~#-d5o*KZbC<ew~Y98X84|8v;saml=ynL8r2g+XK)-G z{t?$Bw<9UA2=O!5;GKgaUNsZ(&h#N6gLZf@R<CBF_s}m(ShWmlrQ|#GqF2D*CA*&9 zPfyj|7*E1WdLtb7<c*MI>ya3@*$+{q`6plv7IfTXYG!Pv43?j(0vM9~9hAHI7-ueH zQB1SLerAETZzV~WKi0T&f!LU5l3skV*0cL`?S;1mq5n!}>t>+;T+_-5f2*>mBp*a) zaXqNu@$>$ER-xWh;ngle4zcUmzm=4B;=OZfe06kGE)&C9gTnx!L}1Nx?Zl%K_PKK? z(8Bn4`IZh46#zW#*T`L7&o(Ku5}RT_V;5vr?NO17d2GF=1+1PHVu2k{VRnGqP1~3! zb@}r*?sM$?E!Zy0EXF3;AGHlOPa7-h0O_2|z4cIaSqn&+R+`ZW&NfiP6z4~Py~(4r zy+4V4B`t~mS-${81)f=md2_n)k-^;@3{d0e7<@(oVn9KlY@fg$*i#PEZRCe?Hyh^6 zVr;~vYCnLYX3^(C;FawU$#v6r74CHbjrT}tkKG68>VfsP8S}fkzX)C1M84!M@s}_n zN;ZX3c1|ZRrY6*XS>=C)?Kc*?yS!DExR5H&+ZD;JT4xN*l__eCsUyB1#iM>BFB9dp zx*PjcT5B?kn^_+3Ymw@2Qjxp<E4uM+p*w>@?gQ@%ah_?Yii_#n2>Y5>+ElKj#ro{+ z1XZg%ofH)rN=^wc;&F;EYSnT&X(2VS@@PwR<z)YTzE>No^@(@aJl*hm`pMqPajPbw z`j=hSwoTd=OyA9jPBIrC7??RU|M5*x%^<UNN6I69&|=dw-=QLo@<!XV8eiYgWjJrg zQ1aG*9e-CWwS2Sj@q%bxYF-1pq~mRFJRAaUY{)d8>m^=PxN6UYyme7u?;*Xa{N+ML z-M-E~p*p<w`5Z;n#~Z9F+(5cK>p&!_lExe+OTdHx7UpUltnApgW$-h9pDcmhqm891 zeE%fM-istw(U`&tHkI0{&E9{gFttAUE%~7k(mXqy|EC?%jAa__iA7P@E-75G^i_i& zu&ZU0ET{ZHZ&&dGS9?~sRRgCB{=PX(cng!2xrq+@l$#y+ehdxIZB2`j*NH4%j*n8T zl+C^5*qz{<>QZH*(PrlB@avu8w`=vy!>KP_$0IzF<4Y4f1|8yD`w{jaLRhew5-w6% zgJ9TBN{=jYz_qC$JUuQ)D-S4NK4YvF7CSKF{>G4DNEvxQCoc$H+fQz3$|c8`7KDT| ztjk*gzYmC#WBhi=uCY}UPCg5{Mdkbeohqs6+5%+Y*-4+MjCQO60U`YqA&3jkVb}PT z&6rS1^O6ZAv<xacH@PLXx&}NbK#7awD_?)9B+kf)0Wrd@+c5awMSFiZ)10a2h8>Az z>YQ^8Z(Ay{+D?we!R`9pa@WO|i{XE7!_t?dGYZOr!y|1g?DDpik&(7u;GDGKdPu<t zL1Z5*)ox7I^agl*W9NfdCvNa{dv`4tAysmBMUxI<)`@Ee`|GH!b^)?JD&%)-7ir%y zNglg53>=esu7~8)s&+Q0Oz3w%3840?Hs8D;Kz=%%Q4KpPZ|s2a$}5A(A;t$@0B9uL zx;v~jcF|;!)~)r2)<+?NR(t(me_dvsm<cuMD%{obB;+m2wB8&1MfUk1+E_BC>CH`! zYTL(xoJ}J)LO`@)%rBwpv;OcCik`zWYt4@2>mi>pz6~|`zAc1wp8Zu<CUz=rbY^!& zA%Zr0T?5~uLD=o>Fh{Ox4hNCrrGKCLbt;CxpF?$ik3SVZ<R;i~W!XTjgCrR{WgrNw zJT*_~#CU}~_&3;L??1q4awsSt;IOxvgNtOcT(@7A?{wO-4k~DOX80ELlB*qB)5EyC z21Ic6*w?iChDE}C?;GIWkDjf;4Lnxhn-CCTKzNJK`3LBK1wOX36Ej)#$YH$wS}*P^ zJ_#!yn0M0CCzCDFisANi=4e@!;u)qrS4g){o}6xrkk7WCc@ZwBmOsU`txrIT1sK=! z`6~G8@kIUahXC79%~hQrN6CM)%(O-Zv@M#%$vk6AyM)V(#YWN^pb@fnPc>?fU|DHg z@4P}1__T&sZS+O8a0acH(Gp(QarCd3z(!$^rNNW8tBJ%MVt<(7n42(rnE_niczu}g zc0z8}PFy&ou|5bwiAOt@7@rm(dd^YO-KXHM(&}0$b+xHf5Mr&_9g*_9`&CrL_mkpH z`x?m^=B=yw38%ZY&{bDQ{9BC6h0o<PtZQZqaw5KjBeHG1bz~(%C&{VMX_iY8anH@9 zBu%nkfwg^_;hJc-rI`+w9Bur^I{j&V6~O6>ui-dJjr#Q`>gn6ON^eb%Im<(7+iA^Z z)8#x#L;ZclF%$7V|CVxIaFkT8Gs5T>^-<5e7&zmCEQ(of*WB`6B}Fhi53`?`7dLxK z3nk}huH3|Pj^(Pz;^uxH^(@N;Z1A7bwAR+Vt3t^kmG!RlmQ|A|;jjNBwX9{iD?sFa z*+b8GUWqgQ<TV%i?)JUxIsb=og<cb+(^_8#zQ$T~CXp!<{Rt*d0vg=C-aho24*HT- z<@v0~ub`?S=4^%*Rlo+h?X_j_B1uV7U)eu}@W@xUeW290;!kl!-%iPpKw*9fW>)sD zNrI79i;QlIgrOb*c-a5CQWNNPM>vb2fw6vycS&4}xak~HxfdGzuBtZt|6O#>2eBLW zY2be;=_{8-(SXS&r0-mrHC|nw-5MK{(^_7YGXc!_%U!DkjBP$WMTsI)j0-EjSk`8E z!WS7G01L)MB7FNGFP#Hn&=fx`0JAIM*FF&-YhWyb7rY?L6n=lG2NSX|aCd(vNm0-L zO{k(<)MM3i2cNcH@%@D$YWzV=UmKSYikvnfLu6yq%k<?Elh;I}$oFQTnY$KOfYtnV zhh)?US<vJH{K7C4tWRJbCMBdPB$688?}d*D38n>VUISXX*B*aJ%bEzs)kYBt^JDh0 zeBdjKcgANlZaxKW4>sZ3Ux%%s?_xXOMt~WApX%&;_f(C<v1@V&Qo>-$x%0ZqgZfk{ z`(Pu(GyeDlJX1YjF!gX1?lohrCvzNkGWMf+qvy}v6+}{FT>tP4$MeSR2LaI|PI6KP zTn%$m0TF@Hnw*=Tx88B)O1>W$`~!lUoFC_zo>Q$rRRm8y9-u|N)5rag_16_l)$((Z zWmch6Cjss@x(o%%N{s(HTmT>Pgl&Q`$O<ENe@H^nSJ$E#oIlU$!Rse5)K;VDYXG7u za>=o&Ub87FUUSv%N^rSNGdc}Ew=d3Ax`B>k2I;arf-nhTc8P{A!a8JJ<~ZStn|YY! zXIB1k@+UXTySJ{zTQ%NoJ5~vzo?Sogo$`P@0*Xng9uzq%rTgxXuL(^Ku<2XhCxrIi zCKR397jXdWK;xcT8!vE49A3Areq#;Yu$Qw6hz$<SCg2(@h~T+2RWcFUyd_eT?d5S< z=B%fqyZ19}nBAEW`<U9-?55^Y^l$jH>;9zMeg-G)k)SS)-Zf%&?pky2JL(>Fpo?QL zF>R0oD5z8n+WAjNyD##aml5%KoufRw_KG&Xnw<QAlzggu@GW+qkg+pXh@SlvxM*eh z8{vH%5a6%Ro?z}tGu}9Lc!uRALBTQixN+Y}zf#XMpa=9A3f>rfn~XC1Z)$aJ9=fm| z7`OPd`6W5gVI10${xMd_db0ZyL)x@FkwBi$O1}_=3;Sy&B7PX0=ZhtUKOb{%W?nJo zysT_|O;QaQ{qGF80g|m)T?TPOw+G1>QiS^Vac_jns}PKPDS3zytB@nTC-D3E)RgRw z9{!rPigsRJc6l(KMcf~Ko5Le;e8&!)6;kl9-ZvG+c$k>i;aHLCHAg;io;)t+5afg1 z3VM^W@zx{1U^y*yy`Y$O&g!nVyu4%5!EJ{Es0LTauZ6ABuGRPZig|8VUTRudbW|!U zokr{eHf-yque2QkjgY4Qys?-K{#yl{kgBiIB66>r7+MFbiS|($L<lc8dSNjz{(^>Z zQT04{&r7ke9INf3JteA-f6t41DKi6?p$JlF2`3`_)ZmH(_8?}qYn_XQ%GR^P>XuGV zlioMr_wl?SK{*Q-y`p3Wg8MP7Gaf;65U*7>3sf3OdUD;r^Kt1I_;|q8g$j_xhsWVt zaa7IRZ&j}QLj1x#yu(s#fWdey_jsz;cS3>JkMXovuIixi4$jp|*?O`Xe_(17QkwNV zr-$qQkjrYa4QuteoE3q|fG$eCm5BAZ32gQE_UFoXeY^YQ%g?Kvt7Px|mz93A7w5gx zZ_g(np9J=bwXun|7vq_ynJ_*#=V3{+-}=RB$P&Csd0C0<!ZzUm=0#F*4+}HM<v~0{ zJutxa;z1ELVD`+ac4nZVzP(U#dt1En>tPWtJ1=bL7O|G-ys*}lr5Gps>-=$s)H9<s z&OqxMX-CB8l!!M^EpuIsVw48PV&kqiyaP`&Rrj~HTw{m^pm!ej4L(eYyvKfU8`#_U zI2Zb!y2HB7y4AlGw$-;aeztN8=6eYqLBFsSxY>6JAD`$;scA~l0dV9QeZ01=fxgbO z<LQ<1LqjDfyB5E+$P<CyyN2G+^iJFU?$J(<<kQzzI;ky4)%er@{u#X_#cZiB%Q&v$ zbea4xfRWra7BYqS%l*q7w#x>boWjrP6X-uHPixsM{6PiOMC2&hZ&zp@-vFTj@`)h$ zYv#br!qx(L;O=dwt&jomEhQ->DG_DwUs?D{P?#X3#PR9tE7YX04?yGJk{9=4B!v@s z3=HMv>(74lDTE#j`2LkB?qB4Q{vHFO9g0u?KrZsVi0GK;-EP|$+IY78EJ!Qd#55c* z27VF>6o;k=zwmr-qWFUN``_aEei9}XO9+Gj=4~2m$t&#kLFkfq@a<Lj(($p=3MHq* zO@;<9mK2nH)gQ`G@upj^abH2MTdi@attIb>zLXKcw*RvfgD;^fn<+mPokZ_C0G=TX zzGU<SWBxFDfZk>pyaz%ICks4&Df0X!PXlzjxjn^^!~78qN0u^wpy6qay|)%7o8RAT z_HgE%j(|RpPnK)E^+@aq2-X!EOqW4f2Ir%x8C8*haKte9uWEbkqzsG#!YyRO%tLKz z0v>ueQs{`@-FEV<L&1%`#u5vM;Lf>+b0--uhM4=3BS5UfTw};+eq;XMY#Ps#clUM^ zQWDDPFOCx8k>`rFUZ`H*w9-rJ)!ly^OmExY%EXi;8P;&!0AY@T7&D`U|L?YscT8Pz z6eWWzvjZ*Myc<97J>1AP*}qoL)gRoS%<&$PIV%)%AmcyC57{T|I?<TIK^Irb)*plq z9aO%paKfGwmpIVD)ipt1Vg-WJYM(0LJc`foN9^$1x%nvSJ^(RXU)oKn&!(fcM~**G z@YeNzYr|kJ$+B+oeXyth2t~x!y5CM%d+xzL0}1cHE*QY}Z}o&Q_8~pL)}!?<pY|(J z5|MIHLMkXJDM5|E#o2*+E}r$QdyhA=jpWzrxCes!6WKn5X5SXV?}#E=@Gx03m~2a` zXvwZ1CVk}tGL^kQ2#*|6y{_<WYhDB(8(n=@cmC^Lqer;0>GT`Y6$cZ<^8VsF*H*ju z_i6LG;$oHQ`;S#-rYCyS{`pPaKAXA5B~iDK78iE<jo**9?YdJK`HCqbr*LR%Cf*dG z3Ou$=vfo=~zOl)AW5vEx|K+COi$}*7cdImedH)wpIsp1eDSIIB7^%jG(lV6}D;bN6 zk@>%yKSreK!p0AIj>zsxwTY-Pbg8Gv<l4P8l<t4E%h;cJ!S7~aaXs@Hu41L~o$l{P zQE_%PUe-_uzu*3wKck-Dsr6O*@3T$1<GxPB72ov}-C(&x?gVzKbY~&~8ib+XZ96QD zh;}nRWLyj-*{1smde*R9e#7{Zo*CWL*~1b9FoB1p0Gk8$vF#Bt3q11b{KKnQjG+Z7 zvm|Z#-nr789-(lGxUC}!5mi+gI&|N9rGoP;yn{yerP$QieFh}nx@@(%ts!PT=7oQF zq@Z^lb3Ch#e;SC4ezmdR(A?4qA`svKXa<+lzrWGz*~|~oZ~M{P2ob?n`1wb~6p_z! zpJGHG6GIKQ0g-csMI($dx?ekr(S~;6YqiO?4|>B=bk~U8L-*~_DUdAMm|E5Ko%BL_ zDc$}3MMKp$FW9}G0yUwVceOx7`%(iCr8IN|FLi>8&W<zbfq-i$Ej_=J9~%HTVWZoV z%aiq!{gVcLPAsuuNl`frz(3h>1O&=aNAS`Z-Per{;p6i-dPzN(SE)Q*Xg5IQo7;p& z0!0zcdiPW<J_CdNEs`r)gU8sPU8*1_KYXzxyG&6|E>i)R+#msgvIztRm<QdC!Fy0M z^b_U}%N<LgG?)0~)^UUHq2F9s@s8szc)`{fp{|`71DH5zE1Av#utc%tz!|;B0DH$| zUq;I-8;x?$9IMTQFEI<+OWcwx3u$RXG+{@GAsDr|?u4nQc=?=2FRq#N*N_$n^>xRG zRc#)60;=Q*dEK9w_bvS-DXKc%<{IY+g%gDH*DSjrPBI3pGTUS^$jreBltpk|<)bL? z3JdnknI|7FZM{_PVSSsVjjFm14|$Z79JTo_0(9p7S}Zo1R<FvtdCh!!;7^1{ZtlGY zZB$G=Wth`%rFap9cK_8=8#VPhVv#53v7iMzi##|l_DjqHzv&uSy7wmRenMiz&R%p* z&$EiKkh(~8Acy@pBBC+^Q4<~>R9kKeHsqrjIF|=#<MPog0IAsZ(G9f>!w2_Nxkl_` zeIi!g7EH^ZyXB0jUT_YZqvchea6cds#)Wo8_TU*+%SUe6Ct?d@yy)YC2xJA$KeMkA z)9A@7bxEl!qS9-M++<5Zl0f;iOXNxJpiKcwc23&Bg7|MSi<nLKz_M#^LRo#6YWDz@ zLuXIdW6;%arEm!x>;8Xl9@!L)M%IRh2G^9EqEQuL!L{hf01o@Hv>3d+mMBh0^YiN3 zx`opH;K`D+U;GVD^e0u_Briz>zb%nY+5!RvEK#iAx5qBBgzvFAm1X3Xj77i$e2Q9v z8C9che3`I;yt2lnG!~jy@M&07)yR=|*B?kS;Xl`;k(-=L-SgeU{lijA>L8AvyA~Sp z2=9q~<6Rp5^(e<eJ50%<YTV2FVtgX}9xW_k1=cZwh{`U8<#!B5AhXMW{tX&-o%Csl zdE-?Q06{>$zy9qg+d|<NA^hH|C8Yh6vWi0(okq=yBFa3sR24o01C?<lEAbfnvkGJt zmHW=OJN>+}B3livc3}-C#RG^HFbVpuk`{bn9xo0j`FgdV5!blMBqr>c@gR4aYEDq+ zj0y7dQhpK4t2{Y7{$wvb4991#d7|l_sYtAT^7!n;^_e1LZ75EI=q^39D0*1h6A>H2 z)U|?Cm6OFz55=lSk&;7;+YgoAqoLzMnA+A;*UwBmzD~!v8i42?1K^VakDi<v2XLj$ zx6`xUq?-l3C0QyuqA?sIx=p*rqJ91YQTokTPxanNwj0Z~-PY_3yxkG_?(ge=|8>%Z z{QK~p1Hx{soDNrT-Gc@GvB|es&z&eE%+{#H5~~qovg^Q`N(snq$@N!~%>cYD5)yv- zHio^-djmx&nM{?E%~A_QUa*=PZ}13w`4;!zRS%rGEcPR%WJ|8XW*o2PWOK9ieuXWX zX;Sr)X4XFvX5~+vi^=afN60*#(^NB=KzkbGljc&+$M=|bvSK$I9B*R;lwWkQGt)ON zmfCt=Y}R)Nl%>KbuChN<ryNL$_1_jL%{y}jm*0Jcm_C)&ReCDkO;`vElJv+N`N=I) z9V9hmRWwBfxN~AD;Fp#{fjd0o%<1Ny)5MI%GMLz?5P^daoZB?u=?)06$iu+SG&w~$ zewyA}Jntd%X6Yt~P|>`RT2ve#<vR<j<iZ_$0SrIJb?<-7-YmQZ_Vj?b*W}zCAo}>u z94P*4=1%LKxyg*>t$?nALf>fOiq=~*w@{OSb;{EBFZao&aNOJEnW_9VmnUw|FinxL zZq}j2y{rJ{W9!-h-C7dEBYW5gvJ60#Q2Wg7OMrlPH8$mgIB@B4+q18E>-p1_!|(TX z{H6QIlXd?Y)nFfW^?M<c^+bPJW3pB-AhCis5bN(*EX94!<B;E9EoicJd7qauOtl`N zN@!m6@v|9$VeZ-IFT57U!@nn&R#4<y4u;a_koP_l7#&mJO6V&%G(5s8DGqf_78pu4 zry0RUKpmDnI3tVQIehZAgX-DgQ#U-nD%ekhTL(|wc2qq(bn+(CkGdJv<B1V`(5|@X zEo4MX3#06EYhl^z#7f3R2hmVNVYHs-PkGJVjlT{RQb+jAC|_VNqMZjRAkpDfYpk!D z87(UhW?l9zpUl0QPrF~t^xfZN<c6*>==Yh${`;r$f!Q;)HL<@~s14k-XMkkmnKJ{Y zPn@4VFEjjl;`{^<e}tGGta!5Cybhp{695^(uwT}SE`gHJRRS6#?S=Z02=!=`UOnP$ zdfjLQGDsjHqCg!$BT_XZOx27g1+)YHUN44uJpzGUjb32uJH2Lf3AoM~P=^3&<jUtq zV`pJRz8-d=S7Ay4&_=qr>sLQL8aWSbaW*9&H;@INvw@Uu@1WnFNHoqCiGDw5zmHX| zhJL9QP<QtB@;A`$f!MJL+sx+$20$(CXcr^%3m~J|<0kykMF<?`jh?{Adfu%I|F!y- z4+Pi$A%9J(0gV3`b{)O(bi*Uziu)HJVD@Jix&CC+eQwX5rvY%fVnmj8y~Ev*;+{HV zaChSz@Q3Wx8P2!sPf68poGk?C<KkCjCb&i48rgELziJHtRbT(**Dc+|KV{%+)RX0- z{&UN~uQI;%1M?T~!;Ns3IJ}(@3d`+HpFMRJKxYz6CbOxJ17Ol?ab}4?V0coUJax`_ z#B)`v7<5&XqceQduZyKfG%z|Kts*#mbgk^btpm}uQuSNv(NMvrcYsrZ+*#=_7dA4* ztels!ZhUQwYFVf`ba!>20%@d3c{xuEsE8O~mo}Ld;A<abNZC36moaH9O~|WMq9LlB zKkJ%)Bnk{n2sNYITNR{0BQzNt|I~m6X#jc|(iV0<0hzFwCF0~w8I++i5Ca^Gi{m#h zVQ+x>l}kZzjbkuz-R!7Y$s-#pJ@FYJ*4VNXEGc+ok-)|#;zXWW6oj7j<*#4amASkN zwu|-^#~ecTEA%N9IVg?x74MNP2E&L!`97$Ke&BFouy4{c?B2q3ha3q$irs1RwsiKQ zbc6NVF<l`?Lyp9%?LC_?1QXHWhnSuo%%i-#Kob=&BmAhtXsAb|=Z!FKW@q1IFapgb zjL<DYOda}!+FV+_T2opqfhzCUU|uD^wjW=am!D5q<^|5}s=JkgkFVt@@9r@Id9dBu zXxFLSOHo~2QSavF8X0-8T%Mo_E$F+lLCe99Mb&MQwXDeU^0i`qEr(Of=W%NE+Bjca zt(nVTmbRvD9gf6<S7@{=8n*PF12m9Dg<2hotlTPNou96i@N4X9czjN6jYSgvv@5a} z%9hC}K<&3UzwcYwS-0|l>t6ZIB-Jff)!;J!Au+f17si=SwLHN7{~e7{`pRV;tp(c( zI@PMRBk04+{kYS(eak@a`BElo0$plV`urh58;dq<7Ivm-<(|x!I%M`L&NnAQ6NKT* z6Ra_n7F?n9WRKd>)ib9f(nrD)v?#WqMhOg(&Z()*|0-I-oU43|J5@q0vuf4npW=Y} z_|gMa*9WSV1;MZTv^Q7fUl)typHh0>Yhp}q>{!AZ?p-yG`5FHN_Kk~myZy*_fMwb_ zwYQ1vB0Io<cvgYiQHk_hF|lP3OfgeWce~6Al&@EF>X7M8<rP(Oe|*b(m8|Hl8J?LJ z5SQ4>;|=Lfa9CMn0Ua@>3B1*`-Px>`i5O%MM<U&P*w5`o1#X=FBpQwjP}~jl&x(JZ zXpMzB3O%()^G*^=+Ov6rlH%k0+~X`ByO&e#To|waf38<H3)jjydAi^_b;ed8KBy!C z9jj;h`j^jkgiI{$^bM};Ouq<;)&}$%RX{J%sT;LgZ3tjrsGU`t*_oR&X_Pr>lD*9^ zXDg7uap~_lwWFotgISoOeyFij=FEG4gp$Y8Y5@*VIiiB|ho*!FFrVu&D4#uA2;mkG zD4=K(2$Y2aD8zRU72|syf)zx(YXYt!X_H{o^OP7=bhv|CQp^F>mS<_9!4+cmOb>&Z zUdlr0wk;WC{_MTf{3Tq<M9w8EzXTlc^@02PCm^Lnn#4#E@FK`_`e*)?fyyEuujK~C z#tX(xGqNY+@Z(8081I?Z?n|yQRJHfgaYLXAg)!5{;zxXd)}VMcI35dgZ;2D+|8sC( zaV*MO%cQK*vni`<-dP1p37+nEnV*yOe!X?b&)M+yS<TL(u5Nfa_F+nju`rs8*6yfC zuU!Y#|AsfVq$vE#3lJGz6z!kov8y^(3$xauxp+qx7Xia<NMm5(fz6)9sJkTxp{fUu z=^m~<pRxL1N4VQ}osAa?PqK5fS7QS|WC-!RAI-vvt8ws!GC`a}i(fPbo0Z~lJRq{j zF^ud65E96>>NLkYj`LY2>uQ>f*EIPcOmGh%wyXo;M-CAEu@1x*Kv<O46W`}){o*Lb zTT=i;m6uuvYcB*z1&ho{`H4vI8-b|SR9zc51Q#z_5)~L+kucrsS-(5o4JNIF5d;0# z0=!O=a-%Ng<&j?mC7<vLa2+Um5I8t=-QQ=KlpA#=FL&BJFlE_0z%4VBFc23%nCPmX zF7xwOuZPU5=$|`1Zh9_BgYj_#iLSb2fOwa(-<!6d@~+?R<lE7&rEg2Xj-E}b!o(!B zM&?SqWTKGF`&Y-Mu+yo&cP9_5h7ZJtmBTh#J>&QsHjeJDXyTh0C5&=?!gN^djl-#& zRG`fZn>?^6zIxUAvQu1wC)6SCg31SI`zAY<8bXv7@g^b>D@`&On8Cs4*<%~C_4PQC z7%Ly8C7O>LT=t_dBs!B?rL#y_7;Vplexl`I4p1FugpYRi(dGSYsL0`wC&W>%SYJ$^ zBTj*qj0P*s5}DE@mME-ZvBCllr8OMe9Bpmbm>v-9478gAh)*0Wtz{n3TZQh7E{Xa! z%Gn5_VFM|6$%_(BiE?dkrlU|gUt_j@OH?s$SUqzmr|SinuVGJyE`@d*{Y}K_iKUH; zR=8*eX_vFCGsCYKU_-^$3UT4=&<ZJXyR5k^SfQ0j<z|UgQOo^62Na1vWUO1C3phcO z=>sDrNuwKSc49i0tD*yOcnS3~)q2tRtbY1g<D9d48E1jG_ot2c+&$rKD~1$3H0y^Z zIK0Wa>+*H7nyfDm$-aC_m6cy+{p`xOnkAq}KAkAmG%w!c($T}HpT$G;&?<GZs@q5C z?V#8WZ!j!*1QL}`DhR!qU%(-d%TQ8bqj0-MJuSRZog2`aBWVY(XOFJWak=Cf9f=tX z*CA9+nOtR)I@K-{PooRa+afPA;uG*T-qk!)IYN(9by0fxX|Nt^-$02=QXzdO?wYk+ zvNk@viu=0zXq}!S&t=b+CNUYS-yHe-nVdhKPci{@WkbuMu$AJ?HreJZ23@dbMXqZ> zyK+^cTL+ns5c?S;K5GUY3skEKCFrUZ>{_W89V2j6CB}A{0wjc(>)aSjjOsx_FXxW0 zbmbmZ$_5mf#k=A-IH1Z3$*M1LY*-h=KR;%ZvEf4$!HdGP(Ljk_qCnY=xN`VF%&`Gc z+@X>yXOZ4Oo?ddxd*trH#%W(^15UlObjag_+6S*csnBHf+4RI|f89G6U-llfc|R>| zKQ$$kaM|`fU`WK;?OElCQ}&s<&`<RHJkt>gXP4DB?M82grdxcRJAhjifcRRM^4qXO zar%mGs<d6i6*Hyi(k<~9rqx%@+Eh#WvlDaCK<o>`nMx70!F$sq6GdI{K*KiY<OS-` z@FcaZZ2}q^8mG49TEwzS5H=MUOk5>X1huG#j_3cWIhIlXriMBbJYJB2)^LN`CZ2T} zUUn%IDDn{&ze4n=6UugB87K7EfHe>gFR6~2#kb?aIYb?m%U6^U-poGFY3f?4Am?Y8 z{l1{6Jtl6l9UM*yIuE!ws(|0Nvb_+(jAi)+4vJFSriBMj9Jx{ghifjLbq@IAs&=^A zHyy7?<a>3>*>Tm<zBqB^g9>n%5X29-*s5aC9iO-YNT{chiky6tHS)Yi^k@gaO8u>B z;WL#f5@+ozE<g+=GSYJBf8se~IbBO^(NW*{nT*+~?-2>BUdJq)z5E}OFAEwAy5`y7 zuruh|?xCxOFUja_*&;hiXX2<ZTf8QG+>CG-zJ2WQV=;PK2^1aSWwqY!0f(RG;7|G2 zpKL#U_4RziVuK96IUJNlvpY9r#l2bQqi)&D%V<B{)7KE-5K<`)A%?lcWu+D&IQTdl zyT{cTG4V>9B)=LjOP5Xlr&Bt@%GDX$JH72={uYcvv0^A{bBJaXNQRfRH;R7RHrm-C z0Ehj-s!3OemyL$%)d{mu85@zy)H}8vvD+q`3=Rg@jw1=P<kHO)jP3MRj4Qi?9IWCZ z7YoCjOfiz3Ep)SW)Vy3Rg~QgCxr2rV4*uVdw<wVDY>tLxQ*6$@?6~t>Z&mX?UWQWF zH5lZJu?tNi%TM!nuDqKZ_w|ZQuo**zc5xZiAp{3Euf*(eb%f28Dz+p{+Pb6}9cAZg ze=$3xGExNy%w<y}@+{iqYS6q5@1%cc;L=bz59<4m3#Ka%!LY+8g|Pdtg9BCk+0!|c zMS0hiUunq=@BWx`5PJv=ARNZ_{L=pbeZu{@ef<7>-uwanU=9S{IGUT;1tk3?I;=Wk z<hKcc2Nk8X&=Dc1lE^Kcn;0u!%+4-f8XYg4&q==P!(m4o*82JR*0H%kvP4ex(#S~l za!zj5%J4|lQVuqmKSddKJyqU2eGf0hJC%qChAWf6AwqHS$sWmz4I=}E08;2*Q9>RP z<L0R^32Z=O?&4&aB+V;=357-1EstdGDGo*3+3^``mDVP+U2l))HGn#a=9$zP=2^68 zO(7X0=M}+hMBN=h<k5=PISO;-87W6B6}E0WNwkg=35$*FgxPv24MBpRDhFJN&}`x? z=X_o8(mb*_hmyrq>XFF4IcXEmHt_X(e@MWCSH-D*vlv9=^~3W%G<FUX!iO2thhpYj zMkFNvJ-$%hz8{BV9)9osPOK+}_cH)TD%@Q-%`~pVU6)%XLg{pwl%4oy*j7VQ$8BEl z@=M~6L$vbhM_RH%N4r3yL~;Epmx8scl#jXEiZeCtu9UM+U3+7W=~^4(dGtQgNMm;7 z@L(OsRVHUpMG8i#T!Lt2CXgZ_E_0WJwd}$kSJP3^qqlt5%<H=HgH3w{c^i&!U>bu1 zm6h@!8iNOe{Ln2@ef6+SsO_LaVqm(AfEs+9gxN#hZiZ!VL33n(k%<YrYG!|orwW{> z%Q!3#ghn8VI8>U5O(wuJwx^g=R#fzj9qE}>(Jx@ORAW!|KG)Rt14~rj7MdMb?ZGJ@ z5oEPa4pj-|*RAx(xVzX*m}|{=-A;FjmOzjiIdqAFPQ&Ct#Yq=;cu2xpP6e*AzO%5Q zX-^ZQ7cwnn+{X_t0+e~qyU)1K&hySc<vu+J%mU}QkwZZI%bq&tL8s~c&iz0<D`VNw ztNk#UK4Acz`KtHcfBK^;6h8q+S50sDPw3=*JHFjUuVdFo&V^9>CawW3e}S_H1r4Gk zYIvX$W%o_IME*bps*Hd&CO(Ayc2_rmYY0n(vQ=YXB&P>?{uCEe!Yp+QQJUL}P+gSk z0m+wevLsfx?InH%apg(nv-9O7fBZGMjlWw=lMHZf%!hfrFWzm7;U7zOizWh0(tn&7 zHTl{m=Lj|DQ(*hGw1ZGcBnbs%(xXHY5fgslfbm(_tW+pOE9HS9^iVtZ!!%RhHG2U{ zBnrluu)AJp5&X&?z`h8hzF$QJQtS^kCeKfs0Oc1)B$F>|On~Z>4}Y0_J!*1r#N<<| z39wXu*ln{57#&n48}kIYt5)q(=!f9ZP3kgr9+aO-n5C(LcyVC>Mgr8*^WMxhF-m9< zD!>pB-Me7K7ta-60it`mM(OZ;IKubdz{+NOBxqmV>>F4*)gHNhd84NTA@^#v0ENWm z3K_1}>J*-TFLV~~0G=hMNl3y)H@xO@<Y;^7y)3%^UQ63bq_g+0nu;%-R<ls*po`RW z;mE@AbPRA|2i4M(`2#M%;d8b91A_xB*4^75CTjdj!{LQxPu8v<i7co<OOMq(xO*ED zpLbvb!I~>zjkdxLIu@-yA`y~L@9gIRaOrn6*dqP;P)xkEoUhSnwc!h^`xBwmY8zN) zBm<m;1z;sz21-6SbXn2-gULF7MPvbce0X7)KU(wQzOz_^10ZVyQv|la=Gm-)+qFLi z9DYSZ)an2(AFHJba={gbPOH&0onJ>O7`9|lr2SB3pz|&Okxgzm87!yUfMO!~<wA-6 zL+I-2)<R$7F_-GH@ba3OMxpBJ^}VC-v77T=zo-Smj|;lBPzu*!=I`~*y{2bSsQNnZ zv@e>o&+?eruXTa&FI|+-SOg@mH3x8vTv69YQ4Nm6c&!HQA475HRY>IMNY@MreJlbL zqnQpwv6(Q$UPI`c(O07476G;b98D&D+@V`Xr#e43S5FuvidZ7X9AYm(n}N|QIc|z& z3nGhI2oU+idh&~`$JP$8Sf=QXbk@4Od=y`K$!}PJ;q;>Z-4$NO@Dabd$;mhh($#B< zfo7YRmjBm$j%Mh{(U#7<yRP_d_xNSr{ANeLnu&iMqcuZ;M9ZS&1u!h1?|7;1$zyO9 z*#9Mh5IF)w&mOt8Gu(;-|1rL5@rXPFkz<TB)lPiud(5OQm{x>@R76COamB-ku(hzd zClN>*2D7=X4FtA%8kI_xP-7vNmkz72_nJJqfZaqyR*>{=Mqr;<5>bI*w)8>7LT7pY zk57o2ZzLuqdy=g9Oex7%w&H+H3NGbMK~Z6&on2VW6&4^W2gFJ!0R-Uuw-HFyIc?y8 z!Sm+5l&IMMN^uaJZU^Fq4o{1bH<kV7um2USr6)`jvc1yT_f^ckKF8qy6X#A@F^Im< z!9x4{RyY8?J{(_0ub;Zf{$YuEAYTW8I70J~&PPrv!a{p(H{)i24IoggB!J!WOW?8X zO7yu#F#2*2yxs#vLAf;W^57;|c_L?EKrQ-)Pqd!xgejt)8J#)PE9CGv`T{||r(WHD zH}ee8C%k<oCx7wEWF{zS+`Bd~a2?sFQ9vJ?mw7dH%D&<{$S)hKv9A#;|CL!*qt{&9 z7_p;z#|pwYMUB0t;c*!n1O_K^RMKFK7gpA=ufRJkl<^{!U7Wk&X6;8WcI|d{RW}ZA zU@xA_QR&Id#tw|Z0J~nSASzOT!A3SY6^kJ?s;N<<1R^=Q!#63>*AKKMCi?jn?2vbM zN=b2Y3YAYK?GPfJT`nYNnMtyu6s!n3C%O}fB+_L?QA_xa>rYQ=7rqJGTGEZ-AAicf zbjTB-_J(P0?)=vJz|9OB{p!k|wK<v)8y_1T`Qqw3i<eQDNSC+PhnHWx+HiFC(&oz6 zM&4jcR7xg2U)@>Ni_xn-mmQ{4BVD6G@s$$5Ho|3VmZRnBil?Jzq6=l~7NaxD$Oinw zp=J{@{~q*o<XUpc?)lBk1heZ$ls!kBJ?A&_Hsa49p!v_{wclbK<ZJ9bml^Hb5-9AK z(-b@7Z{~?hd6%{t6<$#QmMJ>W7^xY<7&POJQTn~V`=ZCtn(?7DdMc<lY>d>6Vs`!R z#%O_BX}khQr7>q`*!{aF8qilZ&Lu-h(~g7XL3HGpAX0x225?yJu0E*AN?ck^KPAKg zU%cGi-NJx4>t0o-qbq78;_ak}E<z8pbGwsJ<We*SQrK{%2c^3q(ur-S$66&4N*L zOUIS~5_X5Ap^3YD_cqwOZRY%PKAlKIADuZzOtd-9$gcV~8*VXqf;)g~Bt4{fIb_|; zMIWyPp+HjFr4#EXz|z{oks!K!A4~<-fLq3NdWVev!UdY__I6U=-et(uBJ01nOP8Hk zr>XC>w46iJ{dXc95(t<}t)dqDhY?DPZk>Mch{byJ0C=43KD%>yHj8c)|GQY6CyQ;O zXV6&n<wZul6xchPHC@n~$gwZP{<xBao?<SYEA?$l)n`8aR}jJ7Mu*Y2>1ze-Q?hi> z$j+a>+uAo<2QbPLutJC?7@0-QnlVc)&8^IfOU=#9O^eH{EG#XUWfrDj35Zh6*1@y= zop;7OD-On{#%2UH#e0Df7G@S@WKf4Js-ij?p_cA8y&k;)iS}Rx4F%B@bcf$l%_~eo zjadd$ihu|xe{uN#QVf@nxqyoUCZKVr7Mr<17jwJK2V1|o_B)LM`qt^!8G{}Bt1c1B znCOTbwst}g7^|B_dI)t$_FB|2z*cR$<2BGtKDb1cbOLS)Is_v*SFKd3QIk0<7~u0* zCnc1eJ1uzt?vs}BF0J6}ug7)AsmJ-p=U2ikOAYS;HpoyysPQ$3rcc-_injt_-T3~! zz4#)4vjQ9iafR`g0IUa`L<&KSCBQ)CFn-rO<`!c4a7ra4?c5k4r>Z=X`uQ>U#PVpG zJ3k5@Ne?kHaKioj2hh`gabpo6AI{8Y<wBVy`J9cmcmSri022LI+?r>+!f}#A((r@L z!~E7iuW$v$FGRPO!0vP-ct3!3_VZ%C=S{itIe-j8#fjP5$_8yehMvmPSHmd+RUGD* zQpDwvOA&~|66@scx%)uN5no~dT2rhM$9O6khb@s(G6y8oXooT@-g)PuPrQ2fPg8<2 zGiN+oU1La*NLd`UoQuf}>n6?`kY%;)L00oDb*;fCusJFjZ~n%bb)X)j7xt|S3Y^1L z&&wK++;$+kkKilpH+`{sj=-Go?CD@u)0aXdh?)F%N2i*BO`(`kO#!R-!9RXo_v(+( zUl`9{>s%fW{1xSa+nSo0`PIb-C56MJ+--yHv@VD;hyu=k(}ojncS5TWj0`}K=+#6I z(|e2Gn0M8TdYCcbQ*qw`YvONm=uq#u8hTsvT$B^a)W<}}Rw4`yd1aNQ>2+m=JVU0E zfj&YUT7hODDg+c-`=R?#3Y&4o0Am~?De|kDEyW?7Upo~@eI>SXiuEsd-5&|);<Kr> zDd6oBRxW?5j)!-T`kA}m^27|IOZ!=mS&7F`DC8=_=3d{=ugKpF<*CcDN!SZ8MuVg9 zFFY+UV!d0v`#h6jfEAzr;2#~m!Ax*8FBHtZ&CC%la&!fvCJELj#~m~?gE?qq-CO_k zC^;Js)b02DB<yU1JanqM=sx9FX99KG>Bi+fY=fw*eZN>t>P<2F3AEmIph9=|eM|i} zjI04Wz$@1~v5lK(1ZK^K4tzs*QNw&+cC@Jzy9L~@zJJkfK*qmHX0<1S62-PdPxNM3 zd|x+SNIL6mO?7xW^~6=LB+j}MYLPye%HUW+OQ%*ACX?GsLYYg<wy}7xv=KHkc$g+; z|BeBMUOaFHpZFKfHkI+MRH+Le_5Uy!8rHCrs=z)FNveXF!U(5sjbEuPG&MO1J=KQ< zx*lD$&KZ0(1SULq#boVNKkz6%YcvzH2}9G)jJPAq8s_FX`Oeyx{R1IVSWogWY*nop z;tGAurR+$;K1h&2h-Vb+vm;BIdHXWN7pvpgzULOOa`EXiZ=L1myf)u}K#scmo<YN~ zn`K^f!T>U<Uep>qHEMospxKns6#?h4qu|YS+z*hAT73U1vvtotay{NPbU6qaVH>+x zS%du#!Y=Qs3~5I3R^8Y}jhP;OCI{hJ1d<0SK=S_xMBikm>xZpXa%Rq*u1LRfCkV>E zqB}ehy=iRhrjYI3KNs|NfMcq~0=v+etP*-<5WEAnTW|0E1RC!;P$9c}zNO|sl<PLh zQ25^yv4G|8mDg?`$pe96=gE`$ho#3`$JzO*3E14!>?D9Q_79RHGV~4Wvq`u1_BJM! z;MRUT0lt!nn#bPqNB#rg<$vx;{^ff-iccMlR@WZb;<)W!A{htjYFw%8%2YO>9XDzn zIZh~|_M%Z|D$c%BcCw-%%q?g%l8U#HxyD;%Cu<7Q+>%U>Q}fSz2LuX@B|sh8=0{2& zKmpYuitL55GpIS)_*C(mrhDUYQDVT8@dVKPxdV!?-sJfbqTYS^dgfZAU71S-2-qNe z0uU9r{Fvm24aVPx4uL>9ysE3)eIc6j)-CCJ4lvSfmPT_9A)}%r!Z4wVtAWBDW~rk^ zdC47-rcsWG$MV}7rhj|&s`mczYPgsgnlvAEB+``FkylI}Icb(H-1Sru5fhF<Mphr9 zofpPdpwKZD@H+4EhjS__qQTu2eaDPgleQNvNTW{A<YW?!A#Alz2lHD!=N>(}j`#kF zPY(~hQ<Moir19@0m?FF#E6mQ|)%M=|Kp&8R4_p<sNYgonbG{0Pe)4w;A%c%cs?MWN zuZ&)A?AP3)DZbO=%&+0MI?<Wc#Z3(r;NSwq|FhL+uKkHW&XbnP1Bt`&34_GMgrQ-3 zqCZsqz?K%DzKVM!G8hpV;_ew4f(VX8f^}tL3EV$Mci;4iHMQlGln=Jpi&SwfCPb*E zDOi{i+umVYmh3s3Iot@PJOp?p7HA#x+4UD|U&fHT_)l1&tUjE33<n!nQBNp8X9Tqh z&G*dkb@+L-(z5neMtea;d3IPj)Uw8qbI?yOt<WADkO8+g)oNRu8#(t}LuE)>w^`5* z1pR(loGkKio!$vHdd4w$^d8RbTk0;}{Rb6a8a3qXwFn7ZXMFBgLL{Y=jryPc{Y<XU zBNe#J2EXZOT>XiKnRO$FxyuBG{eP`u^YYg)0Y3@_n5h^0q9b_AxF6kFow(^I_EbcP zWIO7c5MRT%Mi9s%jlzxZ8rm{&M_Pdlf9-<1ZX7Gu(T4{OE^94gO_*|`{~~oWemxlm zsgUmu|Gba(8<2wsbx{cURT9zMVBthPpaoyhJf09-Fx?t=8>$%UUI7Au@YMK=oD(!| zex3<Ihuez6`A~oV&^AA*Viy311M#Q|$ArOQdt#C}hlztp4{Z&QFm1+itD%@gM`2eJ z`s4_4I3Zz(V(->d0fZY2eM&)~LjXePVdh~v1=OH<O6+1xXauVKZ;}uiDcsw#q@i;{ zJk<exwTUK4&Xm5O5h^awu7vx+54udm|M}`TAs3W<9;Xq8V?}xMBZ14X*J;DhT2lV8 z=4|UO2WH6kQL2*1P$Md{#<@c}xIeo9KgJ1X>-0@tq|zLTWyxeV%h}g$_hg`$Z+-9M zSf3DkWB0b($w4$jP+pmR{G@6p!asBULNG>x^BbwGU?7O|Rp!y?mO_G8!B`0*csNti zagQZD{`j5)ko32v)l)rd)Vgy#ViSwzL-G!A&O}F8dZzkBJEv&*gb3@uGj|!<bxA#U z*n&fj<WDOEsS?~h9im<0&m=!J-VdOX`p`sg_Mu~PH}L2eNrDyg(yIQK&K+^@Z#gE# z#$zKK+%jBpR8MP<#iElxl}`n;XchaUJOlz|6=~<aVO)IBk(}ZWTpA61W|!tVh=#WG z6tCIExmKb+7&ggG%1AQnHFrlF_j)ChqKk-PkJcHSVWT^*g2wKpxPQanD1CgtIOC0a z{<n+3f$BI$PWXmjs#yB^HjgKHIIw!6c{SXp)SZOzDNdp+Of|C}vo_Zbcs%frOmj(t z`laCF)A&12qnamOUJqej((4-{lC|yQNCCk3Iq7cb!M?1A_Ym%U@^=Vd9!YZcJ}w-v z&Sd7pB$6`IjQgIXp^f`JQ%IDb;A2qOf&R=#_YpS*?%$~?rBOppUdKn4xfne<bUn;u zG89t6gMB1(6~VLa8YVRF(Pj%W7V)m=uy>+=xtUN5ui)F<`14tf>9WwT_Wq5_AcblJ zTVnuK5&Wj5_Y;mWwSHZ$%+)7rkTsCsHo#%kWwG4<9*=nTB({Y)V73kMHEPOq);A>n z1MEk!CMP_QGNml~-vhl(W1KTW+iQRu4XDM#pd7}zdj=l8xY!`ez|w)7*r>wPn5-J7 z4ry7=B8b<=12J&8>U%ZLC1g3Vx_=4p@eME2?<NeTl{pRgG(Y!}+A39stIq4iFZvv? zPE1QRo^sUdMf8HuL3haA`cA0{OVfGVrY>{pCyPfGYoDHWMaMOn&I4>!mz3X(P**n; zWOXj=sjlED&M$;oJKpuV77S<Bhxmu%^aM`}ap#~QfPeLv>Cu~%_(U?vr2mB_)@;-> zjgX#RCF-`$H2CquSjkGN$FFRaCa)hW_<Y2OW576Q(NudrE!n5;{noo*a!qX)wL2}@ zuNL_svQz4r64vIXsWfiBLWE^`{F|j(xz#*M@5V(L+ycNet>M0*qABp*h9e+?9i~8e zD8oNo#TUpi9X@7VeBFGZvtHUuoLRU^L-Al}Y&7~>(?n;Tw3qlUV@Jj%R17A<TFBQ{ zMsql1q3!X)RP&i*Z!W)o3_^4~4ta_LIX(R3qZ_Q|&9Tx|a<h6Wh=$1mbb3*Bk=MTm zI5;xF{I!`=YWy-1ibQwjmQ0ZLW+lV;V1o;0Y|EZN+BHNq_`Ki(cLGDO8HuED6e&45 z7-J3O(tx$af`FX0cWAB?e)Zv-VUYLy(KZZcpHLm;_5~64iB4D7r&47&YAP;%xuO!g znqto)!e+sLX*KzA5k<rzc8HzH;nbbhD|r%SBND>Im?Ug|s7KmS{W;mzbFB$MT^|~z zMYeMPUwZdM1$^_&5A;av(q1{=Bhi=_5DZM<)e)f9C@dLAh)O|d%=tmuY*H6k@RXrw z3ycG4uDGLN^4GmCwXWay8ZKnRNpl#7D2vn~CX2jq!iEkZKGHy^5OATy8YA@KHIe$t z*l1J*CdvC%8WR&;jRu+Yno3}R^m`x){k+=EDe*3w_rrQGT;-`GmtQ3UldpgG#m89G zxSKp)S-TQ<15>dX|N4))W<n|1V#FgJAD$kf348EAU5t#$jJF;&LKZ856xC6$_!vaG zpWLRz?X;k9d|JHu2(XRs6;<Heh%TUtHP6cqDjh^(_kU0i$3O2-#nqiw#O&Byk&mHO zCt^KM4LC(?Z>>zEV#o7D1Kv-+^29RJQX{I8;uA~hAd0Zo9o!T0=aUZsfdct+X39Jj z0bJjRMoE+;4xQjnI688#K8K!9uOGQ5^~E(HfszpO@&56RcOJLzfRi7z%8DzwGKUL` zq<kfISvs5@>%|#&ir2spCf$nnnY7Hd%+<{Cit(h?q_!kl6419*MJ-Zw=5S6|;m{BM z7GZ_pEu5wk=>0|;^>BuB`{rz@^6tr6e!CN`m{WpJr~q1C_&b9m$9!f5k&kM%b$INn z;dsJOQX-Wcu_xNf?*DRJW?uKkG8{p;dqyEVBnEtf|3})!F`Fz~k1!Riag;0nTHOO( z)lfhGI*Z&T)wEnAJ3X8wQLpTUk7Zq8?$x`6edN1Axt3gmD7`XOq8`r9s4`4-DVS^N z>#rKB<DyTtBJ0s$j%Ed=QNUr!0#MxBNM&*AFQ{U5kMa&U69~~-yl0I5%(KIm$g)98 zud{`fhn1j(nhw;zEIvqq#n-H2?0y!jpU!5yRrToR?-d~YgXlDUYxQmh!OmdS<Lvr< z;;~_=Uax?o2)_42FJuj^eOQC6!8ST@E|G9FLyJi|G2uX%U0khpP?tq|VUe&H7u9SU zu?y?|@;v9=N0@K{xE$xIeHxSvx*!{E%AR^Y`96NZj0S%x*lhBBUl&VLsH-oCL7ivP z#2bX@p1%CZ$M8)V(*ssHQdm)bFN~0+3<Jt4Vr!bouJF9N`oceL6Cg(~0%`}hRyW@c z4+&wC^ur{-6B_~);lLAh-i70AoI#l8j#|c<tpBayE=n+<@~s01BjrGJ1bBMS>28}a zvo*eG%xj1VG`>Pdh~L2Kx@;A(ES0ZdbzOn7SfcVj&=Df|$;fhzqYBS-!iowoN%;kZ z#!m+=Sp~6irF-wW4nBBi(jJjA<Ztiq6mZlpwdAb5?+zIA6uG`n;N=Fh8oiJrQNO`; zuDNRIuYc>p*}ev4xofm!`W3e$SNW!j<qmc?rvCMtx_#~j^+Vz=rp8u$nipRGyP(f! z`clF2)N*nD(n?hJ&Bebs`q0&yDEDLcUppg=A3MohGF~nypoP2NS-q;$D4%zV`4@W) z1hMzNY<@e_QSiQ3&wL-8bE?g@b7XZKyfXW4Ky(Q@F49?(r79)=>;U*=GwPLoG@Io} zp+|e)!9(Hf_jS{j1%Wym#jFO>KcCSBGNu&CEy<BmSjn89MY()EF$VQ!?V)3`qxY_| zstwH7^w$MJh&sy>$%(02Mir_RR<V8aI`ah${kSAJGcKu^R;ewNRNhx!(9CgKktMDu z4JsFsyjE)d0@nSy9`}kDd#^e27$mma47OwPxr>W6ZjF^{Y7exf{q!EZER?b<5_TpE z8N8fHzLlNpe)FwIZrPa#QO2_;n+!HOaeIM4gg;{_K4zN!4%)YJNRNsl9rtQw0PHQ1 z36E^((9d#u&@Q8BEXOd(AaOJo1kguSCiC)gOM-FbN&7LkIXnW!ckH5@R^K2Wai#RF zK-SR80C#c>l?qE_e%Is?%54%xOUdc#<*x-bm40eQP`7tQhc_-j9V`5viZkNZ#bxl_ z3aOqBNW?P}vkx)|*;0T)fGWDWA=H%s_!|C|6f6y+S<`MBKe$nCt%>hZD1h2?md_=4 zvmXFL#gnD6K6cGt#!kPhI4NVR6^j+PXtylK(S>pyS~aP8EZa_H{y{0I;@UcK$Z)!H z$Qt@ntp1;o)1O=FK4|={0LqQ-G&)~?g<iFpU-VeC%lhXWmkMg82(htago-<{$$sA6 z$^Nl_+8b*}e{ZiOe|*}>w59v`Ne-#>=mQBFxvZpyhn3y>eH7}L#YxsXo!n|{^)%~W zfwey}62Rkow1nG}@9ZLe*V56#Vc$PqXy35kfw+)$(KK3VJ<I81#?QoTQZYzwY%ZKf z|3y^W`rH1u+wiY54=9b<+Th!lw@b<Eb0BB+M5Z$h8`VMl%gB0H1a{!Lr9uNI5(#+d z%d^f^jtZ>S)!5k-P5II859e6{n9Oqh`{M<v<8q9qXsv{voj<Jy{Va{5?EU{V9_V#p zfd5HV60u*~B*-DkIR*lUyx#~qnX3Bdn;VPCsK<d87WC)Q>6mBxBhr!UOLmp<^gBqR zV7?(d@%_Wdi%(}DYiQoV<vPcRMz0PqyOuHZeHBUxct8uw{sFvg<^3r<<@+!(tur}N z&yU#|Rs?NP#%dqR?|}Nwhq|u2wN;?dLBkd3H^Wt@7T5JeD9WaRKF-=kZqUFG8Uh3` zh)ZtV5o&$Yn0<N56V09V54eiC@Zvxivp$2ETgi?{6uA)-_yj97H8xmS*fY^#L1=>s zSy*}?T^*pl04>HSngz)u>&7(inKQuozTUvAl5Ep-ll0;2yu~N{jLIUn?saAyL(Q3! zwT{~?WS+A(BlWcWV*g5i-GffdIM-~ey{MQ1emd6zrX|+LUmpG!INW3`b+)&#C;#ck zA_&=JgT;6U%02l^M4O188O$eTX<iEi@W=OhfOnunnsUpz2Q|Tnf3E@|fiZu`YEpjw zT3o=-B9S`R$K#Pnu9FB)??ZhJ83^$V)$!|br9GxNKzn9a^F$3KY7Y3u#p39(cKyz3 zVRkisDBy5HeNBB7N_798CEMol6-p@Md!yXDUot3SK7!duotYX00uCEGx?9@ikcU+W znfguOHth98YVw^jRGH)TYDZGaL{ifArz5Dll`f>=`0$1fW_M<gi{)Z&yR+t))yBr6 zYdb;8!ZETwIVUwPKT`iOHhY7}HIN=x%v*Piz(=hgAj*5W%ab&({03LC8v90jDnCR< zt%8K)JGYMtw=?Cj%hKfu8hZ)k6wQ5OZ!6!!qaK|~{=gd_Uz$Ox<6h6j>OIbljCE=a zkf;LtuVIHiJpN!xKK@e^)^i7541D@_8!Mm3)OwKVHJ*r=s)h5|`u=&xB;Ne1qyZ3n zGB*c=j5$hjlE8i-c1=kRnA(v#($bK@$s_@dpPU>VLMC@)wj`5+gOig5G(mDQMsjn7 zXGeNkD6*MqN^KxQDuP5p9Q^+r_cTPHrZh!p$buwjXUQHesMMC2A%sCIc+B1`x?|aw z*3VdThv+jvNI!%ADUiv(f9cNHos<Ye#czPkq<rngfKt^3vQbqs^@}1SXve4}^kb2? z8r0otY=H8VHpc&G7)7HrE@_J$g0R^n5gmkdsLa+#khE~2Gzj9dVCcF)F?c2j6A6ez zY`gPt2!$XZLA%qsh+%$)qo|^9vVeWe*XMN6hsA;NdX0<CGQarnB(|Js*O+`=!@y3C zl-@n8823{bP&ztzqPD4UhSdK5&kUT4Q>PLt9x%00faGhK#)FT<RI0YP3?celAeq0! ztJ>ySa4@_=vC*X;vEBuO8;HOjWSR5~$N20TFJ12V??(<6=hmx*QmW)KT*e>3Bewq* zH-+X;O@Ao@pK5AD^XKOO=dTOuL-VI*z(2LW@)Mqje*&tzN^^DMMRH1WfQI5i*2%QU z-@_fcNE>VpE;cq7k1^H@3m8-SKAm|I$>62vqhw{E`bI{;2-rT=Cf}EtxWm++Xt_DN ziIti#U>Z-1x=4>0m+FnR8ytO}DnDji1h$NPaQB9+fLEJsaXw!%05y-~^!9Bl9eXo_ zb^m~q5x9SV;>$EZ1zhi0U1<-uE|+e_dYAMwKqw9QR<huOWH+hw*1lWZq$0q0xO%z> zDD)1McF#mWJ$!7VhN^n$M)zA_sfT@MOI>z*cI<xnK8TXKI1wG7vDWRYQ9iZ;1`r?R zu7NwZ6RUG$lgpFQx#&cIj}&C%vq#wkRU7$KC4qXmR7+lZ?)%idR6y%g-?1I%t65us zCSXcSEx(p}8|s>NXZe~7$db;tIB>Za#0J1Y-ka_UPxkO2<c50tz~ZuO;7|(-q1jl2 zQ|tu=3+*@#;0dpbg(J;;OdSpV&6}9LA{uQS!%dN9wnlkC3=gYp&Hl;)_PX%f<KG!E zfV3D_e9X?qBRBhawLA`JMLqDKmAfsIflcXMUVmKaZ-5)cMZmDP-LI}>V}6RZ3APO8 zpy$iyV{?Gv5D|zHkG>%4pI82^<NBJa?r?QSaYOE-b|CDCAQbF-6_t_EBuK`)WeS>c zDQ;xGASKm3liv*FwIEaBfwIp9b4{J3R2roxXvU9XeC+6oUcgY0!2eUQ3XHE2R~hwi zxzYI7mOEwH;1qXyccq=M+uz)S1!WJ<pFAIkoA2pOH6%S3_-^SwK6mG#*C`YySFH)z zU$c04iLa$!$0IX~6qP{W^LR&%u<XV)5b<$lPV74Sa(2$c>TXWXgUea$?U!q^S0Bry zr#M}e(SiKE1)akr&?R=-_+PhYZYu!yU$#I#r=qLZGa(94h%Vt0ViP)1l;5WW8ZVBG z!MRkGTQ8DzM2GZgYNdg*K~zxe@Y-A4jxPh%hdU&mMBBD&(q$Rkv>QM-u&<2UPD|?H zwPZ$`x8;(&Vi=;AaFS~gVJC_IEbP97bw0J&0yLl9H5xXW)1!6HFmpm{?W95GIiPo- zKX0TR6v}`iUPoTjU}sT6q^>L9&!rdy3D^-Mk3%tH2?8erIQ-%>*}qcju8fEVg8~N8 z-3p$O59qn}RTdwlCi>d@%QM2EX{su@*#u^(m6HhI_7+y2sAz+*w1Nr@Rr^Wd-Fb6b z^R}m$G;4=dnl?J}cz#)m;FcCFr_jvU9D%a|m@d7eUuDvH>RMSN9`x1{(Vfyd72tqx zZVbsJhx5$+5ydPmUem-M@ov!O@h+;aga*AE4B|IR>y2uGde7ae9)0me+OU!DGaE>| z5~v10rx0ceZBh<qOgJe}t3KXDG4=2&fYDcTr;N5H=~`QDy6vZofYFkVu!Fb*L&Ne% zRreDn36uTfst4skd(nm|9r+6O4|T)T&#WQsymnx6FuhC6Y^;t^@jybc-EH5b@AWiS zYx|56)}?&~)SvW+1-WrGv5-LJ(u-u#=te`TrYp}G)8VOp3+C*Kgtz6A+_O6i^Ptro ze!|V^96P|Y?fJ+OWdBgY%lc5ldM>R*3JwJJg#@^>E%AszDi-Tf0i**zrmkG`wzo@p z(_mL&LKC->;pb30?`S6@_q-l4+^WSAMl|X2ENtD6OrZU0ZZBc`bE7+Th$=}AMMy5B zpQ|vEp>~sZ>O+Uwn{b^)2X&un6%q^#-AoY-7$->x3pw6}j_rx<|ENSVDuMY@Ltd3} z$xf#AVpg6`(48+7Nt(DwJrvl?&E!Niv~Aw0BmdP^BXXEZHiaYNFkq`XKbHKNC1wUW zIxn@Ew?B@`Gi$pjub#C&o^;`iJFP$881O!DZpm-s>c2v0XZL2Wt1;m{y}1d^6<tIZ z8IH6qi|orZb8{{6UmHo;OcRzMa5e({1EYC6DnUvyNNs0lH@11=)Rk>ER8^rd4q)9% zrBcG4^T@oaxc?2Sb^)e`FI~npO?GWReBsyM^=jp4{UKno^iG}1AW-c#2y8+PJq8Ag zB}W#gP{ZV*)Y?&cU=VcznEsUIIGLdFcRcEi>Vair?2@+j2GpoZOY1NS7&NR;eOiy2 zQJHU58nlHa8CZV)!q72^(F-C_h5YOvyJ!tr-|3~Lr!@d`vVfx)icg~`{AM|gtNgy; zf=E-tTW>9hQpo48bpkClx*`>tFOm;oQnblr_jD7n4U#ZcMp?OffVi|86Ux@39l^E$ zze_`uoUH}g2j=SH>;ac1DWg-S`kRK<vRt70szKmJyo^FJa4a@X1&jkn$Ss?5W<?7Q zrI(=D{#l&Ta`(*HX$j5)<Eok!a)KPH$Cyv`cmg)XC7XphDS$!aKH`Q%V<|!Qy5|zu z#;NMb3S^2BXMD@O92)3pEFzhCoaK4U-?hA<QX-`yyBrWrrmWWq$Pnmq^Mf#Ih280^ zP}ax2<4C%!=lUrNgwecCr_ZbOt^3e{bRKNm`2dnuWq0^1l)kKY9f`SYjPL<Hye<#? zcK&tu97z|fwtkD#rq{-P`o#PnP(oi&y;QFQ0l7c>qbTxD9M2#yvXwiX_1V7c^Nz%i zthry2d%aG(nBLl~@9fE+0RPZKh_J)V8;Gq-FnbTY3Sn4Yp1EkVCvNus?FSs&yP7Yb zsS&aNM8FPP#~;KK<{@n`NXP%u$20qG0%7&+$5DJ=Hs`jn%L?|1CTF&u`Dg^lv%q;% zx1P4w__nQcZCP!URGrx`PrhtHTkm|rIhYAF-AfOjW^F<Qu5~~a`gHhoD4bR|ed8uj z&e+voF>8sg;U6OANDI}4<OO{Oj!pC~T&U=Mg;#*pYj^J^?{ifbR8qXT95u5;#l4PF z%EgbxAB!yGQ3%)7I&d9ydre=dbOrHKt`QJtKa&lV_4v@;IStuA<qy1-QF49teW2&N zQFgA24tomuQSWE1_}-NKNB9ahJwK72AD^tyE`ONyrQGAxq=UDr9E`cQO1Qo9Z5`2J z6-AW?=K|GT<G3JgKi&S3d8+r9Hao}tYyzxa&LpPgeuR5}AEtl)K<k`|A!8Wnt_>m! z)+m!;D20M&90vCDf8?g;d<4`p=G@Z33m6z3K$?8RY>G@sE+sn(MJ_BQj|=P%{CSb> zf4lWxijw#1j)MKc6~pEgxLy{ht6rjOg5+IcV{oGihA{!&c$mDiCKxDnjRb^vh!260 z`Vb!zg!vBb5RZg;Xw*))hy;>|cZ|T^83AS2kIjDTh0@1L8#(YEM>#Mje6g0`{3y)7 zRh$bKY>B>-vM-C>7*kEE%N_LUk!}qxkmv5J01JH?VbTuW^zHWQwO<k~V>IhRyD+t~ z2=JRF4J6wTReK=esREp1HPXeh<(Cf7dq2f#0-3L;jb9qn8$b01kiX@bu%t~sjsce& zTNTR{!#~r10=Hj3eC}+k0va1XX}obPt0-rbdj8Ng6c%g}t1T16<w0u`={_%`*ff25 zR-fgVbX{pZI1ua?$bbwMFODnChx5ppk-4LiHKhW4sWMNVOUxG7D~n;2%|c-U0pU9Y zNy>@##z6!MTvR|+GtnfeVNq;cNh*>;&gj=46H}LFTS}FwvNTe*_)?R&j+Kd4AeEfi zoIWP5EX~?HPN&FHNLfa3)NsSKyVq`3b@x8#?ybCW^TyrEp8iKbFT=O|OegE@h1VBY za~<H&fdnncC#y9Pzs{Q1lAqn22NYiIo_FFZgkp}eY^vx)m!N5~>zo1sfthRsCKN*` zmx;h&Ox8~5W|vnITs>8l<?)X7mF&tmTc8REUmq#6MG>MIO6chQ83R^(?~@yP%vb7n zxy^blHtx+1=N0<B=AJ=+vUN+$C~(`W1kj}n3sIZ(#nmW7qP@L9t?9_Ma+q1xfM{!L zyb)o-;ujNG+`N3J5{jjfCNGD<Czdcc`T2MpEFm!Yz~okOrOU~uWXm46<9`7#)v~E+ zxg@ZbOl5Bif9Bj>b=!4IIPa{r^b%jg0>I)&-9z2L!S#NzcB11@WqDjeQo+icmD3Y- z!dg;7yV1Pzsk|r+C?#gBT)px)KAfP649r~p$6%XK@4NPKV7L*bn6i~$;~zF%T-%K6 zDjzuHTz@%&S^!8W0KUDnW%hwroO`$NqTK|6;ZMNga#zmm)HerTh{NV1#1fd#<RJVG zfhgkXTnN6iA$&G74cJay+cryFx?t}>L=g@P*{~RaSR52;8`s-4J{cgu<CWEes<SBv zO89(g_L@DE?UJ)USiYma;{B!Dl5$N_3ze?8eusn<Xvqx1A+gv)wy}`P>J{+XT=<@t zN?JO1$-6*q*g!GR{#v{#ynikcSWI1eZT9yif!_%nzE13vxMp^f#RJa#$J=JpcQ6OQ z=E?1%*$<d*!Y<n(v$F+<nTLV%i`jTHl4Sr#K)AnG?5=kg&HfWTQgj$VMA51`o~v%- zR7c@iF_uy)VJb`K0;K~NF+8_pWnEIGY^7MtQkK3}c)SA$C%w11@=0|M-g~w0>Sg$W zl0EN%k@|g7EzyRkq9gbdOf<1{#Yf_w<23+^TDVtQsk*~@zm!55obcEj_p;3^X?f<4 zmvvV2Cv(#|Sym~7Rcgu5WaQ;bSFdp9gTpU2ukqFr9wm5zTs(*be$h?^D#cc)?h2{X zXz9_tqyRvS6A8=)Odyvfv8R)P(c&==Uq0$qh=u-Ewxn}npuRcl^_c|Y(!AQ|Y`CE( z&!KkkSPG1V!VDT+zFZmgN&*fu&ZrD)YK)bQ+l%Lfa(9zmWbSx*BAsjy%n>;nX|fdb zrY;H$`1=^)?b#$;$VV8)HIU%-6t=2^+eTZ|+1L(VH%r*$m6ce)!CQ|hv6mXx@O73F z5SQc9CN6fyRokyf{pF$!&>%niYU#=^m@!=dgcKjB{71<JDV#BV`jGXsX^YM(bLJP& z1jRFFprQRKRZe0a4XdZ<&jeE-q;v&1s|s4~LIZ;dt-2W;8lk1WJ-_%k<H`*KE>(~H zpugq*EUfd*(_{?`=0f~SHg{R6RNz$9<knLmOM8P$w{WJP-vc%6pC-eEfK!{KNsFy& zpwCNv->eWgAFyb?t!fhu1(64B*3G|N)nMfR)Df*%>1w<P?3a8P9EaP&ZcprNEOAI+ z=<^7_*hmiYZ88KJFOFP;bE!(VX3-ngrKuGMSHWX%t)Lyt<#CTnJc_cbUqhEhYBgDq zJZYGDPAlaNgRCRJwY2W(Wld<Uortn0f&P<z#z=cnGx!*hA<b0ab}`yTFq_M*-`P-& zCEqhh|4=LCj(+By|Fq;L4YK;Q*7i}Vtnt<7Mnq<r7O#wmhJpeH@pe1nlbz5yx4`Z_ z+&2v}-uUxvLO*L#4vZRRYy~p|^IluR-*@h*xaqVdykW{ld7XdQcwzaF;RYYrp4J)_ zQ!#zkQe~<<m6Xwxwoy{ePPcHSsYnVbs}lTb5SKIS=S(TEWkFS0nw2X{K~mGIK=5b1 zip7-6qqBQ!IqAR0bsx?R9=N|gap1JULtxDRT;kh<2=v(ftou~-rahMUPy5AR-bbQ0 z-=*H8L~g!XD*h7A>HkqHAT|qgL>FTg`;2C+{jD&^rtiRFicCZ%!%Lya9fHFx_=fRG zq}Sgf-A?<3W5-PD{aoxYClLuRSui5}lE5(#F#6|j>@HMSA+Lw?4b?#7xvWx;m?)16 z)j=>+8{&wB6bIMB5L}n=SQ}9#5a1`0pxCYfX}ce_b3RNnxiekXBe@<YLu>+z#U^`Z zFgTqAsV50<d0THhO~3Ajhs1Ad?F9!lMaB`NvL8L}iyL6XV?f5x%6=XaxXPcVucjY) zobedwzaZf!y9=fqnM#S6t0<c)IMLnszppz~L=kZ490-~=od*YI`ya0+I6eyZZ`n2F zTn5TFel^3ws@A?1V`R>7CV`R@S0%^WjtLI%V_%z5S}=cF3=|~R0hyzMw)rv1hmymM zLNN;#%s6!#CI)7__e%j^+c~4+mGhMvLYLMFBvtBn_H{WgOt3QwzEfz;?XElq(+|>E z6&XRUh${+Kcb8}QnLGx)y&wkgqK*zvINN7V4vzy9{ujwf{hXSb6mM_srX|tS$Kfm* zsP$Mccl$qEZ-~a?BE>{LmqDkz-s|x?C|QCK2=I_gV*|GJd>Jf#tzqTj#tKmC5fbHb zpjwFEyMT|GinZcsKA{AZc=@Y$E`rT|Nm^PA;vhr`MB!~i5{3{782Y6>Tp~FP#QH~R z=Gn1*Hhtjiy*1LnyG!7h;iZs@A8Owx0{JDHA(0O+h-7ILa5)q@i<@7>;?QYqE>Kr} zfUXIacZQ9@jA|GrCs!5s9LkgWnA(#&ksQ3QH4Zb>F*DS&D*p_qFZwv5I!M+LHVh9V z(s?6cAsSuels-p84wkcW)oHnYh&?)}DpTjcxhcdrMK#2U4}krFFE2{`Z&?4OByqoP zvi4M=`BMGoPpwYmJirS|<r>#LupoV)V1Na0ca)%MtlOFoDW3oU(+*GoIBNsag6_hb zc1=LSj!GJOuL@Y)530RKQI+_fS;7CgCV8LD1u3nh^tx!M^ti+91qhH({CqXZ{UOq~ zO`O9eY{p*(5~4psil=&cjJ+h;8A`OB@h(IA-)D-vg#vh4Ei0PH>P`?ap#ZS?`olb( z0b@>P4<YKYyjB2XNXy+f4DIl{?WJkrv%Tcz(WyS5uw?E2kpZCaRb)h@Qmc>DtG(@h zx!KS<AaB|=(ha-}KCJ)b((}=?=Mzq>J}IEy5CIi&7QR)zE93ADVp9UH?cA*oC`G#( z|Nj8_`M(GH0Iv9IMA|J~AR~He8z_<o3w9Ti`vzyXWUasR1qE^U$@OEs)ts?``i7B- zrVMaj>;1M5WmV5xnmJFu7WV@EWiu>?mL0(VFIr+eV%E^2W_rys73q>ja8;0ST}2Ak zgl2#n;46^k&v>YmET&4qVyhKQmRbn}c=5*;X@<f#<y8w6h3B-5A6m#PAF3IqKNd<k zSjD_*?0sML;yu-DH~riJPmE3YL8KaB4wBE!ETtR(VR4}J-$>Gb>9}oDs?7@xhfmDt zFX(6cEN1*q|0Pi;DK^-f@U<by+O_vdnk$26ud$yQs|5bsKK-0?2uSJuiSfWrW#3uS z7|DieT9M*U<$TRdhTY@a@QDMAULmI@cvM5`PqqO+l&3HJV8o%czLxO!+Ync9!sDaE zY2(3W5m`%A>~zTb#m@4b;in^ZW;*xgN;^W&FvBC^?Qj`Npf8zJppeyX?DSz}qloZS z&eznUq>E%Lue_wE!0yu~`gumgJ#M1>57m{D^+DAH<2o0`<6pk)F?o4M)F`flAwR+F zs`tG{DJj;}@e!1mY($+`n9jbq-_~pf&BC75pGxgr7@wD$Q10jm81?PI$@@~f@{wH> zS1YHEjBq}VV5~R2<<8_CehrjrCclh>>dw~gR#4sAOWp%)9)9i}>@~`moE!%h@0H4L zlW#lH25d%ew+%BBx9yJtvm1$}hDnQ7rt#7wIf7=$74;}wy_TOW$rXe#U_Cw#odnq@ z4pZI$|J_tQed;DSv_F)^l(tleS)LqCP6km`ki%A%(e)9hl8xu6b25zp5+45p<;f4q zx>e*mi-_^RJV?22>pZqBN3%r___phDoQ97oalr6!S$7$zZYbVW3`*L%$GSnChmD0? zikSEX7J0Cxm&|AUQ!eV?127*7F~QMEua>!|@`{)+rqXGqjALGqLlaA2*{oboS6RyS zU|+wJHBXecX7wW>0mL2KY@q4$1$k-YS?UIemk<V0s4MJ5^^QYfh+GhW?K{F8P&*U= zL9$JbG?|2Q_v6yo7n8(LlH`WQr(_WcEu^W0Nohg#{mA+UT;npIB7S(RYuG1wfpw8W zx%VS-*V`rQcu%O-IdO^O8F8L1(bcoCdSPs4s+)zi95x@eIBjXlA+3!_BI5|Eny6vl z)260W>?&Z+*ElKv(J!UxdYpcpz2@AHWL&MD-#NytpJkp%c~WIbmdchT0kZ?{_i|on zkzfD3+!r=a&YddkPq2QO2Z{wbXMgu4`6dURMe5`qmJCsfgN|?{kWOdVU0c^W1lwP9 zDqCaeAUx19wQPUVxoo9$v#1NczBVh1_$-DfW*~?>C^wczk~S7l*V^c1o0P!%vFfus zk3*SeL0tJ76u(~c;>U<+0kxNmeMb;a*S11fD<y~|$&KhZCnbHJ#guOBBj6aw#2(MV zAaOt9WRaI$CHf82#c@mD<+^zg8h8E{M;reV;Lq<-f$*G`CBmPWUSQHzP{(bRCf@~V zyRND_n?plfW?P)^Rh<*Le7ZPmz~gyin@Ax@+jX5!2?7O46mEO9Mt_Ry_FrLrD7T;} z-8LpQ`BvISB6Y>bo1=ddnYk^8&4(>cTbgo!94O&g$t=89O5=O9l*zsHlh1PRamGn~ zCm*UzDN<STxyqJb0_M4Az5NZ=BCKD*NV8!EHjSA}Q)NXa*(LLCLjHH`kvI_o1)%+G zB2J3v`4!CE66Xb~E=f_<lZ9cmJ~pgp#f0??6V@}#aJ^`F*Ga*@0u6i$SS~{z*pDwn z-#!hlv(;Lj!w=G#zX6ood`LM;YHb1ak_<NtHw-s~4Zvl%A#BK)s$4o?s)1(R0u42A zQk%Tmw|Zwpb=%9V;M#7@47Sc@2V1*)09z+|0b3P%0=~vI5;TBt2>~!!S^*0ifYUND z?pQBMzUg?qfl@Z${bS&_V+UB~T8`rXX=Pgg%9s3qUzECZ-A9BC#3US^B)Kb&+kI(b zvSrgJ`K#;=CyReBbCTq+t@4~>?Z@&Y*|R*43vqUv*lnhBTrq>va>}x%AXuDb9JUNw zLJM#SEx_fJWm6eklx|qJsKb`4EYme@^5#W4X<FWxYV-N3O%4QY9iFPq-UYNdbGzwL zq%0e-t2du44kqZGydJc<-ckE<OPO(lkY`j|<JR;1*rmTCi?<OmY7>x_Qdwn5sLJ-` ziQ4$Gro6?bK7nM1ZBjelM(;%1x(Uq#ZQjNOOOEt)iNLB9gZ85vtFh%xt|o+n2F#)z z+R$Q~cpS?7_8MR6{Iy&J21pHSG;LuIjW}_N=p(CmssjWeBPdaXvG$?ZMkO~Ma<vGJ zN4@Q6^BtZWe1jv$SMgUJ8uLV#g0;Q8M5>ms>}MCfp0hi+T-qa5<LuLuah=<P0JDxH zDa_ZW1_&h4hthD>(N#bpoCNftEcEnb3pCclO<;*W$&VD>?yFlOwmMTb=q@{LEIo9P zj>GV}Q@k@JY@nOiLoxy7ffzt>S^x=!N6w)nrC7(gfsM(+ELEeBi5kLN7wKbTqeZ!` zDCK(B1Z=lHN%q8zxX6JAI-vzd;Y$<$k%&rb!#>g?79MV0vWC5*edB{;h4DLy%p$gG z&alO4OH&rQ8c_``9hyf15D$2ijGNSyQ)O2JtEs%F_p1@NLj%atgp^sPLP(Cvk~>xQ zG!LY}#%muJoLFR8w~%QQyRyBobLQ1%t}+>+GRGCGglDC1$I;~Jt!1@Iyk(tb85yu< zS}inZ(jj2&`c~e`iK@wv2C~GO>o}rV@{Sdx5z(ZQB-an07DO6&JPUHmw^pD9cSU=G zpf5m1u^ReF4SZwD2KEt9W6M&=ELA3-t1|gPmAQeIX_DJ8n67cL$CBZC1E^iXtILby zJ@U4Y#AYSA;Q?E9g>ru*3x!JZBmVJR5KBXxy`iYY0g|_htWnvNZTZE*mTYP40>CwK zxEDPXX7WLE*S@!`xB8&HpM7G`;xoXRmru*;B3W|DDNX|y$*{M5Ws&#QD|ywt&3m3f zKqjFy&&MPMN|Nm8xRsOt7k|8E!yzY5Gly*10^K|sE11L7de&x`Vw-vw9Z(pizn_RL z9d{Z=YyXtxR%xKdr~giX0_B2g5|#pTR_2|^+hA@uv`^iby{5w2EGeA==1zXQFOJB# zHf(!n@iTR_k42kvEQ*6RB&87FAkm@EA<pwn$jx+7IS8l(lsWV@Xrr@0O4_V4&NEjD zl5cw-8QW<}3xb4oZVgQ|RbLsJX6gOK3~~F&%!;D4YzT~-TT!)8r!C)b*#7fIjAZ{t zSM)nsM9&6XO<x0i)1u;1D`SPB|C?lwrSUtmmn5q%P8WOqQVhyifxm7>8bxW@;8UNW zJ?=n$Zvi(>k9(h|#k$>TB9A1QD4;$HY-aHUax~vTvtWLLP~VA^+!~qySBIt<{z*b^ zhJQW~78hu?0#}BX!2G`fyggmf<qVO^k^?hkd>|NLa1j3KhDc_u-kIYNT(D*y#sHSt zS0&%Ar?&hpMUeg7RjVjxYGki3I?1@<Ujax|oWw@n5QGQ7=*5HF5^){T+9z<DXG%Br z5fFQPn&_Md@nlLquxcj@RNcZ!RYU`lP-e+O9FC~yvwa6;kP7$!fTC2$+a8%&HA|D~ zEe6=MEM$_GLHwUKFj{dSmtzS`g5=tn;+2vl`L4$}5tTqo((4Y%bHh@4fBPBlu_rDF zhiZ7Jsgay7+JAQEp<F6O>9#Sa!B}Z|{lH{h`3ti%DE8-a*nHUHv}I8i#&PY0n~UZN zxLJdOO9P{pe3?RGAKQ*`-cL?=#z)bnhXRy8`PoRp*SfJm`78>FTY)|HwDMZs3QAre zxv7{q-@O<oV*6-Yr08*SJC?=2qkA%Cru<>O_+5iet6*%>cqkSAIm5g-XZ?!@7pBfW zW?DYU_xP`f{1IjXNt>uU^B;5n0AQR&&Qhd?9Q|xL&~z*Zn6d#+!sfmeI+7p%j9b3~ zN5y&&0W7&T>;Iwg@}MSN=Tk1BBn%Ye1*s&It^IZWO7HD<@po#`qHejR%JYl29}D9> z3%g(VZ(U&o-XB=nS5sUXtulgAClKdrYIy|f2JRse&p6$LEaMNn*w=op2}Sjg{6Hyq zYn$0<K>XeiWt+BZX)NJ*JJRSw38LF0|1;l(OcCbyxjg?*U{C>fIMzI~^^-6_w8fcB z<Pfq)Q2aLo$SMK=BM`r+n@nOcN-Y;Cw(62rk;qFT72X-=wM7g~Kd<`KjX36$e{ejk zGDSsHgj)?=A}Z>7CrMdC1$R{BO$zSmZ2q1XxQAJshWCC}a8^Z%p>65Ls}CWSjS4(= z<DQO*<MeNmJcliDsbdi*;(5IQe!jiAXaLW&YM{A0D}$9@rV&B;YkO!*P!4%Q81Sv* zrZQklT&60{_b}eza)sC4M@uu+l+ty@)m#3@XNrHcmm8w_DAIW&-+@@xf5g4kn_Ay^ zN-K%NRht^vHzJ<-MumaaSFe9U4Vw>Jgq9iABN3j-prLsRfa4h_+oUx<b{WIQDoM)Y zaV$M9B*~088q4%^lFV|dnr#_oMy#m&4M#DZglEp;^Km@6f)$>k$UEOg4Zx&I>a*zT zNk)n2>_VEV=m9A4Ur4zl{#&C*@{aU%YR5*+2&PYR9N^WZCDRa#Kd8+wHegdzOQRxH zJ>Y&&O_CIZSjf|7-pE0nR!yX59+E(+82>S(mTpQry9lT;%mfE&EaV`vie-l6nSb@( zsQ-e)6C)Mw?f~7|9H4jC4HoQUce^RNF)iK<1|qR=jYZkxVo_uLXAx-@5oQr{7Li3M z&6aEcs}=C7WEqph{XWTcSmRZYB>5iH3qq?Q-r!=qIB6x%8(YY0<8;&MHr0Za*8DeB zDvsoG!Nvyw`cQ5X{+CT)i;34$&2RivNj>01vK?zfMwF)tg68rVr-4hZo^q}VuP-Ys zQvS~q!ZPIYrKI6OkP(q=dWhT@V*`~M3Uic*FGb+=se}?$zUYP}w-3Mgk}r5TRpG1v zj1=&)0Ui~TM9Xs)=8xeRp0pJ%gv>Kv>&4@>fgYrvZ64giSAdLhqb&)gL5NAx<;zJ< z2Ka&Ay@Hgq;@HwoojH@=T0>H7<dx!Y4Juonk@6Z>y*+}mcj{gkU5pURy&|bCI-$q{ zn2>Y{<c%lJc_qZ!egNNz;OS|PG}u+Q*9cFXjVyT!$rh{|+*?fh4QN^9SAdVjJH5Ph z0bruAPbNfuCCq%p0Isd4uh0bLDaX8$n4{`^otq-pL;c4=!lD^v3I+?ocVM=K-1_%l zP>}9FM^meQB>_arVO~=0crXuDcec+3E&A>@Z5-tz_Ux>jRNe7=USg+|+{B(Wo1d6r zJnc&ckfD_t-{TbA$9uV&sk6je`7-w2xoW*~=r~G!nLI^vHc|3?Cj1^q1bq=rPkmmA zQep&vJd)g-GOC|;=`)KGLt*_b1UpyD8=~+IuqapOAiC~a0k0v4ou8qMI?AxJVQvlx zYi@hqUmE;n47WU&Vy35NIoq=>$uuWsn;X6dD;k1>5j2kLX|Rf^5KKqGlnnmaEh929 zJ;HTyEnlm43b~$Wr{Q3%IEnOT@_Iup9_9Bn3A<@1Q6a49u^TfY)=Y=YQr@#ILW;}{ zEAxgOzJ9GIvHUHYGTF4r=8Ei+rO52h3HSco2+3K|nt8vg#SmT2!bhBl;am)-bK#6G zS269Jm*LdR+U&wzn_DbKU46Uaia7U8f&7jV5^Jc~jQrNSTC<b>K-JB-BL;D>7%byi zE4-R*37J@t-me%p<^EQebsK)DgQO>#Ro5u*2&KnFw)74xS6e$<@{OuBccA~o{r&I* zE+IvD`}v@@@46MD+?$wvr0G#^MiiUrN3)#h*_LFQ6VB#_`&U-f+;~6V^Zq!Q_gy!+ zx18O!?foiGXK8ve&B(20#%;6Wc+a*Z)0~9nruNB7VxZdF6>n@BtYRtz(@`)bgMW6* zh)hh6U>6Len{Y4+hpm5u<zsKf>P!e7kHMSy%lpEQZV>nQalt}=S<V4f7bO({;0LU& z3iYFwR<__MEFVI2Q&mZ|t=@-9wF27!-Bx<*0~B!?zyUNDQc2RiBTB0Yx&>Ag>hZ+L zKTZ)NF_tq#s^{>!mQM?IM+sG2TGH+oYvZ+_QD%q299C-Otgrn}?YA40-R8dgv$ly@ zBLIIl`tT=~c;5u1pbNqOBjmEMYYKmAMHsaZQRlU|!IJx%%9fHC#Jg2_&bV@If3CCu zk+f#AG{3__oi<@VZJ{vEX%J5$QGR{DW5sp$^~(D`Ui?3BjP;rI<S_-c)MUkaz)y*& zcM1-R;{CpN1E}8jYxVv%6!n2O46cTD46jCDlrhHD3?`lzP!%jPmk_-qu(jQ{`n&yB zrdFb2JYZ$1Fo+vMgTpw2qc8^MFb+(-U_BA4jhC2~`kB(qB=K~7`rdscDm}}PC?6E7 zfTTUY$S*^ceCS>QyuWZ07U~sOLii21DevL7J7eM<yo>kXKAedUqK9L?#0i!*vtGTG z?YHrRzgu`05qc3|RGX#efpEk<Z-hqO%D<lc8Z?O|i@mG2%1ctMQBpOl(CoyUu^F4I z78Y7!RVP}Q{7<dgTH0;t({AfY-bU3G)}I2Ro%Z3KzuaywLji<yegfK!V87fk+IE&N z(HS!CjGP3#tL%~`&n5$;IY2)g$rTC#KpJ2O&IrS17=e!}3joq6m|$lK=(zR|NTd|c z$<50zC@d;2ArMLA(lQE_MrSZtYz~*lhhPL1U_y~tB9+M%N|jop)#;lWr`I2v&d_p} zwkc*G;?>8Y#g$lx1;r&tjvhN+dgA1%(`RONbauoqmU*@)BS4{_WL#2jj`tmEmBtS~ z(kI)9R()J40T15s@%FJwSUE!c_1X>L2bb2b7*f~hEkA;Ht{iJagWWI1gcE)5FZH7O z+TFnqKh@Fr(|*ldq^{kZ7(BiIRFKrW_W)-mYBGr@10I?(Hyeo6VO;o<SL+-y_Zy(I zFI@J~eY*O9XuI{!wxhQk_UO)i=-|h_9v7hml1Yy<B%c9^h}(klNS2ZOC{qqzz<FE{ zioawqT+bI8z6!+FVUQ=wYV@tnq~C^6N8pdwub<BQ328V;$$>+G3IQZYXwYFmg3v${ zt)P93qYZ0u?F?$+N!3>>$6Ya+@`MacV!Bn=x5PX37f}3}G`gt9W}b;DH?6cRD+eo+ zXG1n&(U%oN6el%Orcp&{8**KfZ(!z`S(y7XS62R;0?YEVSF_DmS?Sw|upt|5$~F{K zPzk@B(7$R7C}V?CX>dL@q^O1!X?R5#QK&C$Ffu1yRJV-EAs6Q>m(=XO6iYkO(^ceu zB|PeDLGkF#E?ey@m;;oO!;a9o7`@SS(h^cvy__*{tVxPA?BZ}q2>M;FNd;@lf$G1( zPf)0tl1F<rf^2aH#E}%oLcCf-e?5!)8(5oLc#X~zm&7?LPO&(jiPI)t%_e`jKSz)y z&S!BxiO&j2z!Rrl9HcmH;&h2KB0h^vFec7^alVLiKH^vV9}^G~2PzIkeAbYd1tpjh z=Z!cI#W57eNSqMyDxJJw{~f_macB{r$uTsG(<ENvlrx59;xiIth%+Egyf`4@^?tvc zN-j3)8x-nWE#QAwu=H<!gHet+lpSd82dnvnFKfK`eEG_Vis1LJXdzb>U6Z{w6-;Di zQ`bdmIn4HR!pb`j;CGn)Ps~&+ZQMp1C;fOePrwNbfws~^`!OO{y!N;JJWg+kUgtLn zag|BXMJD&@LnuT8v(j#(<>Wm~5o!ryI|)^Z)tih1Ubufm1l91l&L$m18Z3^a23tnq zOHkQKux)UYwW?vux&p?coj;J!ruVYGwS~^w{Gv7JM58haZ^_bmFKum;Zb?x5j#w)p zSXCP57fN-tn=tBB?8#*`gac?;1OFoGTDRU9LE6mt;uDr7hd)nJ0J3!6Og06t)4P2G z8mp0<eS-+fRjVr7@)Kx#wQo_Kt6r})Y*}rn_ER0e8v;Rc#jBP~Z<Hw5S6cSTx25R4 z9JnTTB`clKWJ7L6tFlcNnXa0ujk0J`N-+sntR^Ast6%=0&G|zRH|V|K8rLL(_?;I; z2z}>G*4k>#>7rk(>e7d(zBGng=NTm9Wlk2678QAP8&q^%-$@GB27Y@$Rpo|U{LTP1 zZE)>|FQ2eJ=IpVZbeH9&=#@Q~uN}>2Jb&dqqCBTf7qN_bkLBam86KUr$KS8BlX#UD zah3DJoR9KlXdKVKn;xLQh%=d-rCmWwhk1cH`KeE!_|-4^+XDp)zc!_+x{bm`lF=O! zslE+v>s2OB?XdzIwUY@!^q&3lg~bH~CBLq0rtZ<ZUOaZ`-Q+KHR&;T|QKo`bt7J|@ z-zu`YwS|Yb@HO4&#T_uZy{+rxBK)R)?hl}b;NOWm-YLlzJNgRDenlRY&86tuEwG;_ zWZ~2x#0{VP)}I4$CrpgIrunx@9y)2K=94=O&ZG}nXv6OU331PT!{=5JEB0h`hcsDz z?*TZiqHg5`(UpI0z%Tq%73U#Pw1q>;(!myuTAa~}=8VyLuq5>gdxZ)E5;J;*y+VcD z`ul>akn-K<*PF>zuh0$4;+%R!H%CyNTPr-Mb62*f)sf`tMX-LbjWm2)bPSXfcm?!& znI(5n;=lL0XDMghSJV8O=oen%oAdLSu85osow~{I8v)(^$5+QTO7fRmtdlGflTXi$ z^@Cw_55IrUM*VLz9fQdFk7ctHO*7fHT0`9@w#oU)FF@9(oreUoWiLGoEAt<0Qu>SB z;X~|8*A3ZThBrM9k3cN{IKk%2Ki+8Ie>`0O+-G0P((gd+3Q6vlQO#lfke%<qq6Jw- zMkb?!LZMjQoSAInk~z-C!<7gH4cFm!&`HJ5BM5kxXV0cS&<QD_U!KgK8htYa$T?7Z z?RUT-M!S$cHoe)uF&LQgKY25mNN`^xHtNchEXozE1x%;}q4p9#3K`XWYzSfN398}t zG1KQjx>`GB_<ic?Aq#!<8_;5?dA0eW+|RAC=+B~v;_9Aja1EoPehH=!+TcD+PE~nb z^bdnmHUD?3_ePIntcX4I)(#Bmx)GUCxe!Z8PF%S7?p<?+P!)x;sr}|HkOH`ddZH<A z2e*MCw2jShZ2_Y+jPx;vZe^9nO1AdlmsXi{@o3Ga?Wsk(ARwsnE}WWn7!svTN_YO+ z)=od5@Ye#V9}9O(q~7m!&YpM^Y53DnvWtMO6Z}-&^Yfu-45=DMJ7kU_h>by6Vc}ii zhbY}wp&7AyZWDUzXSkY=N;^MV)q(9M24mC<DDtTetZY^}fYQ8Y)i!jToZ(-Nnsi7_ zKKAi<_1fy?CsK0s-a2A^I-XDV4(_gy-AwGF(TWX{JuHZ{K#)V-k-&4&ZyFDzBzsab zq(a9c4SX>0NR(_BS!9R{tP{#$>z1#3;Bpo$pnBItZ)W$0Ul?`Y$1l_hEV7SIy}vw+ zV<n=!D(MIv#fRP2Flh@iBJ{L4oF2;#7^JYyZTpby$$|hG2x#X@t$<6dG0}ks001$B z6bz^&dr9of=g3grU84!paTB08BN85va+-~oT12UJlW`8Bt&pyJu`W8a+fhf_3S@{n z)$Gnm(|aYksbo%X<O=MS-koBvGVIlc<&wN4*gGbYyriu84Ba0acmp=@-`Ie^tFD3> zBL*0P#Duq9(`En5e8>M>+1*zs5=_tGCB;WAvE%+)xE++QJ)iFXnoR${yHFlv)E<L2 zD1B3WG`q4N+HB<|!D!c8y!Wp2L?}+h|C@<nHc*>M0;D2CeWe9g^9Y21m;c|T01B50 zz&{!Y$N(|(bBaJ!fPcTj7pf)$`B>ih?=QUeaBT#=4^Gtobhy>>@C`>xMt5JN?^77f zJj#=o;J@A8vN`M^${zGU_^{(Pmc8n{^uGYbtEb#e2-~K)4ra+bRY58IrnTo+&w}|O z*TccHRMPBR)SRU)AuY~-W=7ZLup1U!4}4Y*&tJyJ&KIqvALDqwK3=^(pPl^**M`xK zJ}_F8rBBk6OcI;(<UB5!bT%HYM4({_>3PVko<-*8!}N6e8sU_p@SrMX-X@JA-ZX~f zkF$ps(zmYR=e_v!!S}4{z<Q4TrDS&b2acWCuG{&5m9fb^|JbY-A%{ag)YL9p=_xst zIxIb;Qv=6F(9m`XgmY18*x(w<8h?y2d84R)>&y$db1fk+IaNJba4<i!yu_`tLrG+I zb*?X;^lIBvj~3Db8S}xlH-sslRL}4e4|H5$%P{^>N_5O{QHsUVA=Cbu0%j<g&3iJS z9aeQ_L&m_8Nfy~K$uU331@N-!*ZOL!gX0CWvs@S55~REIi|kvU6M5E+GgtiIfqk-n zuyoTV?`Fy?(X4};lizmp(V_UjZNHD){*iAh5SVXQzyIrZIL^#?0po$kz4#*&_H5|? zz4H@A>bH8>T>ans`C{z@)9k%`#K-6P`v05-yoL9F@5!5sU}|M%1%lY)#GQh@ub}DZ z)q)Kx-)$DmTCk^IWzX$tDIiMzO9#&O2xkfUNxPzE#p}Phho=F*QMAf}8QE9`A1!Eq z6Wm$`Hj6TIR{;W8R&Wm4KP)#bSUPm={GvxA+^@Z#u3hI}i{Njaro3qPzYHQf`F0lU zdC2o8_68_i(U1?n0x!XD1|urs+1LL7{Cqvq_MEe~S$VgGaIF7{1NceE>;(EEl}5iW z2)=>Cotc$L%Jsrv;fyS=he-A7abD28q4kDzuwc<&Gz&1<1LUbxRo334jTJmn{S(Vz z>h93Cv@hSMNsL0@)}zz-85QH9F~rG)D4uV|NXt5HdGgI1Y@1|16^MyoyLtqPLeL<M zTohG^36jFUI%P5x;}zC)%3miK0TPk8J);-=!rG3-g;eB)Xu_=f3m$_jylqKc-6kPp ziSyPht_Db)ouT}a_Vsg#Qe##<hRXp4A{HZc>tS(}tzEsf&e8>1SnG!@x|c4AEhmZe zpr)_#qpPNPny4!4wx)_Dt)-^G*gmc8aP6LgJunDeS!Yq)h4ivKTkmCz!Xv|gD+Tfu z;ZrUcsjNawv@E`{SkF_9G~{gGG;vL$``B)=KtU#9Yq`*Qy-HF(V%Akzk7d17ZyjM* zbclUMlQUB>Q}n25L&$4eXinsp5Y*EkpdQM_ngm5-l_v5tU~GbpscobcrzWti>BWa! zF5uDCf*m`&MX6Zx+y#hdm5rma+qAR_mcZGT5%H^_B`DZZGKVJ;J7l#3Rjbza1T(Z` zhCp)q_@t93tZOxa8nFIkwb|SBP)}}^SxDjp&0OxAVDx{EoAFESSix)@6{n806^VA5 zp0+pOj!&_Cn{BtPZ0x#XB|BsxQi>W2@Kb?)h;@<oheV(E1>d)8kZ!a9`CVoHJ9B&8 zVT`#LADc#LfXHs!!}Jn8F>=89>%M|QR34vTR?I}xkwK9T=1sGb(TPnVY)JsJ!1B33 z3L(ePUF{ytLMO&VSS=s50hXJDbGMV=sbKKq*RNA)BhCoj?IohwO7iw>yhnN(-I%=i z<-OA4RZx@2FChfOZd}92fJGI!5&>0O&d(4NPiy3g_FTY^_0$&9fS(G)?h?r_K~gLl zED#^3&z%>b^7euQ8CbZCEP!q?e#_Ijs;pW2^2qxkaq9ja-NusEYD~b`Zq&B#)%An{ znxQH)9Nd4rZh4ROHb<XQ(p|c9$t4b67ings!-qQtjzv>2o$iNhB6HusdAz{%Xe>(t zofl0nCkS2+PsQlum05!I2<K2w_m*A@zAq;T=8&Mp+!DSrO=c9Q;4u*W5Q~vBoSHx; zdh7Fo?wD+CdV|Umk1Eudn<$IMo!s`-ak=uVo#4*Y@1gO&r}JPsV_+E!iMm`^TvpGS z1ukK^6pM7CG_6+dPm|Up3`DHNvH+9ov0wfaH%3i_dIr1`VZXo*4fcnz`;o25-8=Da z%KH>9Y^LyTBN)64FF+zvZ1)vDbF}H1Gchq*Y@YJDp(oMoQL@+wZQL2m?HvoS62Ttf z*{i*=6NY1>wJ~vhu)?N$%v2d|iI&!L{l%XRzO5rVf(_~xv}6;b^0>*1;oftK(ITFE z05kzdZQWwU19t{<d&dH-M6gGAihh=M!bohiritr=6;9a0sSrt=>o4A;;*+W$@12Tp z#{g)B+p39ImE-R{hVIW8M3flYmX=Lh$@EFqOIB|MOyCYC?jA@utE^8epq6sjM>y_k z7~cs@risjG8nY)5rq(N?GpsciPZ_{WWGOLv7kKBy=jl`(gRM>Og|I)2#w>7s8Zc8* zabc8J5BkE>!g2=DZ)%5|PnamkQGbU5dl*7AA~5)NFuzh0RG_vM2}T2H(+&pTVrCh9 zH)Qc_7ucgrRk5`MHhXndS<`P($+$OHpwTcvVP2ma&-M%U2R*M17k>?6P1~oO6ew}= z^@S{9O)~~_&q+x$zyyn3H%+wf^<hSLr~UNGy9p9&vwdsJ3YyCPE2BC)@*HM^_1y!& zJW=;E#VF50_Cgou6lbVAQLPH5X0jr?+wE6%#r<*OrZKRV!2n=p!sk=m5vhNKn}f$J zfEiO+(sh73D26zwWy5Jy?}#-z-A_kD!xR1bbH*?Stgm_uAEiRD45_cS3A5#CgSV+G zVKJmJGx_Q3Q`kc3ToW;~27w()@PjL`;8S}PeMDCnDG_zaV4muZ`-rdaZZzH?e~)H^ znjnw1RM3!*Yj3R5R)ArkC-C%81P`tR%rr8q0RfXNS`P@&Y;DWl2zvy~MIT!RPuj^w z)03c<rk`l4(27`l*8~z^B-ir|O>X%PT8kS#3p@63j2~&M;$W_^>K_=15wg>a$G?s5 zeZp_!7)Z16Li)O+>`LnRyJ=*Xh&v{boYF)WMf&j!GxGXnS)lXnP0I-o%TRC5@Rnsd z5oBSFWI&lOFAQFz{k~ntQ2H)>52^uSED@MzGTiMaS>|jPzhLGr<oLEg$rsKNe1l>o z9FGsf(z|!7y8Y2?8#afS%uBq^Z4E;v{sS08zzIb2)X3@65WgPxqE-h?x9@p%Sqn1~ zl&p<A)R>!fZ~Fu$wS83#rrA4St^+T@0MYv~x)p4$E-O8Z*5bMG604h3f!i$SunY{- z$Lc1v#9wi$dn06;pz~*?B~I0Bdvbj|KyX1pfP2_k#QEkMCU*wI5YiG`gH&2ULmWme zFQdZVhT(QFnI;YxF`H^Js7$EEd|M)V$B8!jS{N~cfh%~=GxG%fivtsbh-H`ouoZ5f zn<TVRG%$v{vDSa5>+MfC5CfpECR_l^0S}|ppR(jr2ns>bAOr)6?T8eORSMaoH1u1I z$L)(SQ0jp1a$$K=cwdQG5fv{evVoQss0DNMT_t>uVOSKEo^x_cQ$2n0x?g(6n$&wQ zH+i98jKSTgbtn(5FC}=zKp<FnG=`dh_0NsBCX4g6j5Ex-147o`59ieKn3b})8@2A0 zht|h~R|<p%EL!7jdk(~h=C`aSZ_^|3c(YC$(;QD;F$_?yx3rjp1MQqm16~3fXzd=# z!w&WAsTtvgKK%}t3>?)&&vlE<TRr;Cb_I^#i0-qFwG{vVY3FNZS1#}bVTidKwGQRs z^e3=~CR**PK3^A;S4E90m%C9*RTKH0l69qsJPlZ1Yus(m{N9P5;O)<n$C{sJxz=Ik zUbsTT{pnx`6M&)*n}sy13;p`Tb&Yd^E_)9IA#?~D`(ob#yB2<56&B_Egwf|p81b(Q zo4h8KM7n6IbC<FN=O08>hQ?ku)5Y-(=XRZsxB-7HlydIGu5cM4#{tYChA$zR{2zFA zjNwx_=5NH_!3Z9^P_eQPN<`~Q?6-7_8~as%IWm?w`X+|#mxm}w-mzRxgj0cia}?3c zS&t~>8&6)@nz_R$Y|V1gjE;WO{tiF9c7*6s2)bSlQ9iLE1%til$MzuAAKOC9qW8;N z;1DwWp-mA8>+f6jkNlBpG&;F9RIbn_ltKV$MQabzMwiBdbhz-^F|L>3=z2M_`cdl% zJ9`lX_TXR0$0j?@(0*B1hZc}8?jZyo$1S+&k;<K|UPn5)f2gEN6ROm4yoWsRe+C|f zZ3aoY^hjtzw{EzsQ1|o8iHU<V76<SE?@<C(s_qw(!TInDp9|wXUm&YH0DV<G!%DN9 z0NH@4<CxdO^$0EB<$sC4b-Q)&VTA-OFY|IfwvkqDZK!rR>|_1IRxlg=3~Z~<wcxm0 z;iWl9`nA1+e}3K_bkgI-p=v!5I-!0cSvlo}t#Ns5dk8s}LhJU<MR%|!H^&+Nb5OL^ z=GoQNx&pWE7hzKiC@g3s%1y}W;P$<$2{r!K4n_un-S^^BKMT??$a%=C&h@vzyS7GF zzi&NZXD@=lIlP0!cE8;W?a0Ei1d!MDP!(>*Ex751%HB7wBVF1*Y@<pOtJI)-a|e%; zl6#kB0+A>QfW$U5kX<|8fz`}I<FAh?)G`lX{3-H#uD4&@*E%aq2}P6?O>pi>JkGUB zIC-Jrmk_foBo@(Bx7u;am{Yv7)!6YiH+A~M_wGSQA;hd71<HftaDi-j)Qif2rpg_= zV#>Y6%XkwJ=bC`w7|1}zE=`O}4`*-TG0L1w>|w9eU7nBa6;o`*?u_Cms6V-7>v`VV zpn)rEseqc}jp$4(!yl@!5ucHTvwK^)%<>O;plba{9?a?&C5MQjX{#*HMA{UFe?-2) z!nK<!17qfKE_O0Rr-$6`!}3&K8<S#juQnnpW52?Kbk2@zjB&P4PTs;Z#Fx?7<#`La zX?Y@-wHIeKn6mm*fQ2DtYYYE`X{6-;7YvMjRF&spcJ`S~kmIACS<4yI@lIQqi(|^Z zg+nK;$V?`XV;<aq=J03_N<axcTf+BB6d;DNm$q<|Vc@C##S&ZY=|ulo>Sh{I&vII_ z@iLS7@qmM#Vj{wXPxn!;T=|Ky0Z=+3PQl)V)DUCm1_q;fB{MPZ4EeGee3ynzdaViZ z-n?CdmI*zz`4J`2!p!v}op~=zYQ0>`)m0XV#4A}S^k?qM)VIoZPjeu`^L2pj+x*Yy z9lJL13rIfCyQzuf*{A9gpkI`XA9I?@ohsJ>>|ksj42|@xD%GA69!{j_nu|#EF8wsK z<e*(@=?}(YKVWcnLC0r)4R-(aFw{Tt`IU7}FTba-Y!da_clUe-`2QlzmH$79&B9l7 zM`r;;>i0-P96i$L1ss-2djux{cUX?=zlFwV4+%weH!~DlB@zV;>d#NIov#<x-K~a? zl+gQgX1(%je<}rWjH0F^Zz@8D&e?X)yKS%AcZ1br*}W;aaiM*vW&)LF2RbV|Ms)LT zWPGqFk@3u|D8xFez({W$=iK?o2G-)(V%ySilI%KR_E21^lFh5O@0Uo^_>TIv?P+#$ z+xL`i77<B3sTAUOF5J!k;Wc{|F8R*H$3bmSphBX$A#j_O>_=j^jgPzovD}pY3yYxs zFT;@gXgL<$=z81t7wAU(O=AOT?i!ezxDs<^_(VImg6BT67FVL;!lVAqC)m9}7Rttg zHCc6g=WR&jLU~#x&(V;G5{b>R1QMH%^V}L@a_Oy<R|n2*ZYr2s!1i%25PNK_VLcb8 zQ|qaUwO)3&6Ufs!&^<?aQKAYY&w5aCwR;ti*%q*?Kp8EkZ7}t|O{OwuKtMA?scPgb z^*51W6MwW%pQ&E2PBed_Iup4hSR>X{J4>K-P|<quC>i9!EKwra^=g=0F+<4*(o=GR zl|I-aP^2e%OacMjM)bK*L|iPDG>RpP(M`-?<Fx9mP@>Qsv<7W=6&j7*g&7gt%j#>& z#bo#@CYMG~*-aLWu!HwI>ztb<bwZZ<{WNh4DKyG^$r&IPITW*Y#d^KOjHgN1{F3b< ziqVE)%VKq0-V4671fm$7+w=2~89tr-41IoV*t{266BROnzN)=1hkL=a^t}+{KoiNI z@AiIsjK|VE|McX&*IeR*ffFZI7Zad7w^`Rtb-R-QOf9=ti-39h0k6`IK{@KQrwFum zdPkLrGo;dcl_PDn9BPMO|7`OrI@KW^%^|{#!?PwLWL_xd0#h(igH)^&w{-BLaWmT+ zN}m0tio1|qTp7Kyz1I)eFQ;@O=eK9oy_9xwM{T~X%#VB&K?!M#zwCugjVblrM;Cjq zoL5WXYpwR|5kd$du6GhcR3J`G1BAF2e(DaFFsEQb)Azad=Hu)4?<tyux2gY?;UWTK zS#e_P6Gn<6gHvWz4QooKH*QCKH=17n?H-?M5%P2oq-Xe+P9dM>Y<8y`6A&{=iam=w zzk@WvY9U&U?$mXUd>$-BFCBSYub0;e9HEYVMb$B{d@r3WhkT{=q&;<rV|R}EuNB)n zpVvy{&JY|zQ09TD8kKnuyioCm-z-71k=D6S%3>x>bR=G_o+rD%&*xr7*5)cYFPSyK zKnx6l^ACZu$H0}qo~oSwA4vNsT8}v(G<!`%922GdS~Q*VB0z9MXX7rYa31Z(bZ?5) zE}&)~3Nw^>Mzk&_hC^|2RgyZm8gKdd^*NxFze_3;_XxB`nM-9ZC2g-nBdBPECG$31 zH#ux#R<e1<<Qlt&n2;}4eq{xA_Jz%vKXoN7ncR`t=X=Bz|GhPe*^s48>f$6DPNqA` zDT~oMt#W@bZS%jSw(sZJ4vXke_kq1eax!OjTH@QYu~M(=M&r)!Z2D1UYOeG2HY^A; zz|3r}#0BPpF#8_6^Mf_PRZUGcj#5M=<ud$GSlANbUbiNR#SY3@yN#D%LQ*8!>B>?m zW>}KlvwK)#mvZPTp6Rp=d8<n_Muyu`7L~~4x17g^XL_41Y!&Xs$|uJd?gH84e#VRZ zeJp(b`Q5rOD@#fUh@W{;NQ^)T4xW;Fw9Z%S-LPbRgqKwlTa~xgv2pU*?GT@+X}`7@ z3NkpQOj`3}W&IHQB1<_d8vDQQPK#J|hwZVwM_NU!^A87KfIjMx@#7v>@ZQ^;(Cgy| zF4dU5xg(3CPuw8oJD>XMpsp9VhO%O5D+jy@cVe%s;u*az_2+?9%AW?65J;QrXzRV1 zT=;hDy9w6bzqO*v4+xL$0MFb@6*UU-I=4jiJr~VJ@%ouz^l9i(@%E-wmFEkX*I(m> zp6XI@Ag6GtmEEe_z)F9g-6-Onr^voIIJdIR_DiZg*j!i5y-aCBAWp%@{_oJ>clLRD zo9D4V_Uc+}B3$O_SlPP9@GS5GTbU(hr|4V>eBxN(I)MvbaP%ROj$6*{yFhK+p95Fl zWf2$i%hy`cFMWTdfPX$44B$xbJp4qv1Z(ZL{IiV&6Hf1u<lSSJdOsZkz`$?&hDRIa zZ2tUL87No=@E0HdBC)5Q@vZ-BzxM2A00sJ&6ovnFkLWu8-ihN@|0(syKiQ|-$Kg14 zA&hJFIMyB$mnpHcpK*@-K%Z=6-_fUOmCEauXZV~H&tupk{HSr%G~_~mmLl}iJB3P? z1i#I-0U<(W=ZSTOH+wYB9uL_bEFgkntWpUi)rzrB$caKB;^}WK6|cye*%6de-}@@B zXGPgnh_j)RM`cr!ZNzLC?<qzU6?HT#^zSWoWg|&*opHQEZXyOzjV_3hbgknLXPer5 zD%y-_;IeN>yc$2hwdB1eTPgZf1Y!(S@hk|4qOE>aB`k?7<xSS`6m#_`J(N`6s2E12 zT6j5**aI67K8j8kyq8)6O<K5Wq0<XN$;R@Er=YqxGv*SqDX2pxmCJBQ&|}}gAul3I zl5{oR1Om-f&ox1s(9lts^f1hc*VosfwCMf8f}M<A%+N14#GJubNyTqy>w@jtQn_h$ zh2-3aD?UE&eWGD7;z$}x#yN&%|A6^0mRxSB`jKz;>8G36(icQs6FW@qth)#`r9{SR zHL4Yc^F9(iJ5ufq*PcUk6@a6D;c2&I#H+t;WXz+BnRPQg2QusD)aXyfeLo+~<G6)! zLVgQFUpTJ#M~YOL9}mB!#4%$pDS5%TXJDMvd+hV8ee5=$|EQWtWcb%?oY6lpdss2& zq5Qe7GXZ8RiDju7=+Go4)SmXF*;}F><Z(!kA<m=zJt-jq_uLZRRWf(|SfVhH$jsKj zPqnxN6sNYJFSHqTT{Ukq9p!lQT#<V(*29?r0@St%w+Q;C2(=h9pkVa9H1x@}D=%AI z$`XRvs<l9cwOUx~rF9w;;SA77AB>4oK7gsVpD2Y4^-GM#Y@P?JO+=J2yD2W{8zytI zYLZ^ttb`?KS=GH(_!S(_pxZgP-S8R2pbPIoAslq{J$Xtzj%ZE^?#u$6B{@{WOR zs9Y+T?~LiFPT|BtHY)j~iuny+(bAjYTO5VsempR!B+^&=o*+6TBL7H_h;!i!segaE z{Q>H7#hqd}qCWLGu@>!F%@cT^=|-WL#VSd4Njano3$tJh8^6NQ&Ju!i;2eF?@1gw7 z;UdF6B``Ea<EjM14_V0oiGYxzhY#rw3Vz1Vn3o~5{6_BsW0(sPQ~6mUhK1C1@7g`g zMUv<}afqR?6TzwtY%)C%&~CdM905>=G#=+T0nq+~LJ9|Rz@>Edjz`0MK8u66F{XMz z;qw{q;quD7b)#>i(={bgk2iBXmy~{L-9ybE8HFRm#;>X<i94Mc=c3#xs6{4~$>EUT z`D(+%o7x*yTX9~sVU8rZTCVC4Jx!e&+)t?m$41-2wyv;1Q1XfJs}F%y9%E<jYB^Iq z`iJJ%m`99BW=>mLlbuGGc<Nq4HPr7#+9K9sGsOYwPrtH_U*c+b>`M~}#1{J(Kqn|= z$BaNxl6JOjhjA%W?i~H@y*;jK)vGcHKMFvKbLQsf8neUhTgn4haE$CJd`RIx#&aqc z=7>k0^*sYhvNVFZpu_=~yXLj*1o)*qFEd=@?4vneMzT1z0t-%Evcr_js5gijGWT0* z@S2hClteNsj4i}!+`RdeAfkg@U?Gg_$$rokrggqZgTeWrk!+7MyA|Rr&xaGKRgV>= zod#QoaK^_gK`RQ1qY^hiG@`pT#EzjdH7o!IY8XF$V=sx8(*Ejvud^S?xy{kY)8M$& zOU)o;Dk1l?_zdaGyeH3icuT&{>S_vNDkQ{1s2}L3a?(s1$}_{l;yC{}ROnaskS|+S zRh_dN<Jj;wI!ng4K!ZDnUy`vbXgCVir)l!!W5qpiAWP?^c^Q}Jg7_R1-BMhn7z4A* zKOPVziq?7^%nH<Ib(>Q6MNbmu!+qEbg^&vkP#Sj0Y$?N3$SrptN2w)gd1*IEs(yiq zK8n&1y{z(F4C5pvn&B`u<7L<bE#VMBGgNz&EAKM_csa+Z1+?2SH<OYW`Pg<(8=$zE zE#E@?ej*<69a%P3$z^fF4UBDj&{C3BsA`AjH2+Y|v@sk-X=eQ*Zt`b~-=NE`@@`e4 z+5mmMQ<Nu7um{+-{cqd0ZTGZo+qP}n<}{~m+qOB)X>Wh`?!$fAty3>`PMu$7Wkp0r zL<X=}u-bqfa5tmh#PB0?Y~3x6@*2;aZGTDzC4}1MyzkjHI_thIC%xNZAm?HnEH9Wc zC5oX`A|?Ms8(S+^R+yX{`>i}XV&pAN1jDoOVkbi@JCX2_(PN@;cu&LnTXt=%!OZq& z&n<W+8yv<DwOT#DsKW5&4yy=)3j6dOtV#Azo6l^37adF`?s>MSY^Z`&?(7Fy7Slec zR;+kDPoxw`ioeKoSpenie7w@}LE22Ry%w%ZeQ8hgTY6GV?;p5K5sFdIdqyHcZ^`c? z<2|WLNUN1mh3tgjq6bBz)n@AN8C<=|u(5|3ooOt+i$+v~UBozmLnS6xS_Sin_s2V( zGl(#eQ_Hn7`(xv5kZ07ZP<hF#I%x&L99%GERYHduAFBR-6f1S8x|itvO5thu`+}gt zDf2a|Gy@}JjIa@xlEUB)w*ufm@5?SQLB_NOM(!AT>70})^@N66Yu*H!U*#FV+@QfP zk~su0tRgJl<+L6Fli@KYFC-bB-Fqe3Z&c*$Ic+`uR<-WIBH@P|8Tvy(F-Sz8UfYOw z{Ck=V;kw*8YIaF4bl6REIPWENvyUduV^4B=RierV06&~t<xuHTIw?txoH1)p?3w=R zQF7mdVI>LH#rZF<wf-PINWWGWo|91x4{4OV{{7e7X8(<90O7rs37ML1^Yz#@^+3E- z-A6^?!`R2Q-2-)a$L&X|YfYXChkO-jov~x8*8xxyq`|j6;>b{kPu&UunyrL7&_&|c zD}hB(R))*dPCIeAmTY&4(%~*u(4$9kta^T6Q2uIcJ??GwTSaAs>w@Ll13~vg>NY{) zs}|_f=W4D`ZT*QmAkF=u21jD+7<ZAv@vy`Tu&d6MkhNP`S_w-XMv`l0H-1H$yq3w8 zc~^CExs%GZjTlF1Qwnry-@%xwP`<EkG>jVa%zW8+_YW@5Yj+mP)a)uy@?q2{1314l z{?Flx)28<BBt?M|?XgEz?~~7TnPDx<c+06pgLoWXt9k1uO~(5aDt`Xp!UEyN>rd>j zA%2n+H_-Q%O0ZOz37W0XVu%%$`5Y_ZN{2-+={%#K&))K|UHd^{)mh{7h1H3<$x2-f z<gTn(*NZVN0k<pD%HV;^ald#!Y>m%B1qJFdqe)|8R0vs&sM^8=Kv*#s!OE3FlpxL% z(Wp~;9Ew9k)bDJ>#RM?zc1C3<6%N32cNs%2mP_|;6?KBvXO1oJRem$cj6smX^tkx6 zQ=ZoSp7?GUMtq!?wLY|Y=o+an6TFtXgtV&UW~D#+oF6(>4M7)-!Mp456==Nx#wZ0_ zd4xX>ndUUpZI95mDCx|b<hFBqS2~OWe+O=NaZz1!X$Jl`{8~3DrJlcVq5h;wO~rwg z7A^w@9BGutu`y%1WqF8(_Zw8m@R@3+4&XUCMr%Kh*(Q=!jQwgfs(k_%pOs|kjagw6 z8Cpm*OGmP;h;0kov<vo*#i77g%FvQQ$N+oyT4xbe`ku&2A>BGov45X9oNu<G`wv0# zYv+7lRpl!R^Q|yu3(1^D=0uvWozXKa;^;;7LUrpfT!3)RudxvCmlfI2Ah+Fha^~Rx zF$AjYxF3ntAQIiU^YjpjjlL<c*gi$ZfMVVIL}L;kjOz%wn0gT=4cn#yZA{+b4YXh? ztSVu+4HdQ8xQG$|72&ilp3`<v$ZfWzk_xXHuV)a(MrF^Li%I!8%AXPEny(qdjkE>6 z^V=wOhqy1{==e+$k`|grwPFW1wi!MfE+Vf1esFWZ9hR|`Ng1aCyPU<Rhcvp;+y({) zw8pww-s&doIEdG0m2swsyn(TcORxp22~mu(Vf?Ub#E(<YddcB>4SbIVsSWI>$jhTc zb}P-H`q53t-UgQHlUh3{$9N%EU?9Qe!#VXer%grE6Us3lg9jKRYkDs7x&{%sj)*90 z)1gMCFr_<D3m4Y>0DA#!3n%5B@kMqu;NRakbMHhE0v6v2qKoV-VqNri!2?R4aD_x} zyP$wJ7hqqut{srwH{|zRDB-*`-mi{!=i^KMZx%8d@H1!dzxc`(*sSptAjZ;+jN({p zva)^}V{^jND4^2pY77F8PID>frDK0+EAeWK)|3>0>BD0t{T?h1er08IVdXW#O;1o1 z!L{4caG*VW1qL*$>E?;oITMSm76~7x<=eg~oi*y|Jk;oSz6{>{sm9$&j!&XyR)0;i zh8Xw#&2>_|P?pL2jD1Y4hAu++XlET3sm(^#SBRn-0n6YyCWb0K*c-(J3y^7(0FIr2 z6{$cW<Ub|fstQvQWbSc%4a{EKOP-5ZB@7t%=g<)%38K`>u^q2Q+k@lik?Rbk-DzVu zeXf?rl}ba^gb_}XSj2gJsdS8uQtXm{_}1Y8{--JkP5`Yh=>d)}T)%^T8d=;~>?W9f z02DV%Ai%G62LfxI5UgRr1Cc6q*3@-3L}vzCJN6qCN`To(X%V157RK6|r_Vru)+`*g z&~})9^KgCN#ZDR*&5YZJr~?@^YwJT=181)k{3oFT83g3Z2-QVLgve_j2400Y?h55} z$iM0*s%-6-*{;AwI^7}i&EhkbqD;#<hhu<El`lsvE*^(89vKtWe6&TzEq7eIq7SCh zYfiyZka8++d!tlQ^1eQ%{GzYTT|TK`9t_^Aolh{lH)E-cuIAX1Jl1Yu2DTViOG?Sd z$I*fy6Y<&+yw5$tM|hMeF)aJ<xcm;F+&$N!KTY>^YzN<QA-@Pw2xP$9>EAu6oFmm8 zy~@BvwY|8qQzaDYTOKJ<NwH@&#<367%Q{d86-Sduq|d3-%Y%p6Y>^$q&su_R@Mwfw zpuRLGF-$HCM@p(k*mC!2%MehPJO6=MmMh#4O5K@2*eq50Wk^T3T{;ajVs5&jEpikI zuV(wmsx(t&C5j&xp{I-#9pNISG9-*6s8)ArrzEE$?(P0Aq0;AUlT?mFQ|7x>4Fx z13tsy03Q$c3dX)YzRhrv)ye^`DiUIRUMy-xmbFbtP(F+8w7&QP5d@0DOZyeXyU?>) z$Rbk%01cV27_EU)R|Mk><SY_|y^jbiH2XI$2Th2UGfFq(#Q;qjhMfRsLK}zH2fKNo zRtn><$^fsnybzT4&w2rv><h99+zJNoqj{78VF1Vq4bK?Mp_mgHfm>NP5+njpN-;FA z6lx~~PqNZV+OC1@lqm(=J)4BWz3Wz;lD~9zfwa&!9$F&Sz%vE`e3BHW-8`OVA1ADj zXeyDf=-0Ql7dLznUzriMPASaqlo*cUL4>u995Q#7gi2vT(U=j0;*jX1gOe2%G;ekv zR>aipymNmfMtO1v1(*=_V`l|GPjqmzLZ5HVqXM7pINfTdBf0aih7n>3o$Y5Li5|U( zgNPsUG;M#xe~f<%7cGaM8MF<!4d;k1vUB2xw>oH5xfDrbLfD6%&Kz5HUbhd&6>eZ3 z&d7i`S^&{uLW_F32d{`pFgC{>M*I1AqaM&B?hre&fn6j;1`GnHc3%R~GiJJqCwgmj zfqQ5J>h_&1Y@Vuk=u6aSTSM+nW8x0&w|}}XRPk>!^;DJuDllRUZ;`=6OqasN{7W!= zuKo`BpwUfOy6X5gMwg%`jk-QZxvN^w!*b+8%wo!QSXR+T(S>EwodsOF>FyT*%2V%H z!GhcW2JCVbTXdF8iP%`Y2V&uBj=)MqJe#s|e30w2l8jUkCj|oCl;Wr$VKY5`n5RM% z!w*VlO3#+H;UH%gT&Js;U6@@J)^=HDQK5=G7{}-_G(E|B>`o&81jejM%e0e64ys*` z3^^X#O_;A@SS*bAqgJvXA2VtmG|set9WBwnJxW(Y6w3_P4O>2sbEX&o<kPTQWclb! zby|OiTIpx^>AOvr_?GQXNEOcW)yk-)yrp31*`YRr&yVG2WPT0)diS${e!X|WJ~4=U z6>G8?J$?ofGJryZkRVjDfKyAiGY*s_R<2+*{$r1uJbdEd=@Y0(nkISZs#GVbUs+XF zS6G=E=;rR>my99_BWNptu;^ajZ_>!6qqlMGbj7$5C`gGSQ^MTQ9bBCJJDR2<Af-V% zwg8*1Y!N4h{P*xro6ggld0-KS{Eg>POnv(lr8?L^B1J5t?NQ;<%b5OyJ1}DCyBVwP zwf`{j^;_%?C212Uj$p_HMdr{-SN}XcX(`Ke`el{5FM8|peYS78;>60yPEXNIUGnGp ze~A<@a)Lw(8#i!v`RAtMSjc2k>O)0O@8ACeDg0lcQt4Vo6{*Ty7(Vm|GmSV*QK>j* z^PTM-k3)rk&^sn1STis~<I_DDikXZ`T<4`L_C+z6BvwGv(U^#k_c?TwKsSbt9R<($ zIzH<hA$rwP1&P#lW;h~<^`>tj7~_CETlC@(X^F`Za&G()2s#@)UG8hE!4i~vzL^Qf z`rD^6K5mZAmIJ=tajFydb+#3o)pF(OA?BQ7<|&_bdtw(W40N=`LXB88`!%sB3|aSu z1trrQgm8``TV==C^VQZ@vUe)A+@F{eWD1#9+>U9QN_)~(gdmVmdRd`yc*+SebZXU( z9o=sEZit~1=e(N7j$7TiiGLI>X9P0+7gDzYMN1q{W3F^8H_4|iM|1*!mj)w!n%BHF z0j`|*a-bA_6=P)DY{v8a?=snJCToOYUTW+=;Be6y8jKzauESM4=K9gD1pBBT2~Zm& zO8%cCe~ILCpB&dX-3@DG)a$m}Rqyw=cL=4gi#jc$P^L@8WjHhv0^ct3>EhI~legE0 zm#4P}7bny0d)^b}-^Cysa2X<!YC;Sxyn5e4gQI^Ik|IP9+8{)<e2Frc*@=51A?&$> zuV}})Q5-^?+zex7cW)A6eT_@yo>pF<*{=g8wMwO0X|j<cq5Tq^4TcOEL+O&n+Vc^F zK+xN6mJckDNZ5NeS5VkRH(k1zC4)Avg0sH*hp3S#9*RYtjZbV<D5<I|sv=K5FRZN4 zmvm&je~xbI#x-^Md_hG>j8T<Yj=L_4eu#?dtb+?9oB~P8<R>#opIXd3X7T*`?$=w4 zfITxxIm%pi(gw%<?_Vjtn%2#N<>eM(#~y_iy^>8y%#|%=)o#QE`zb8A;P>Irm>g*` zIwvr7N7QvE*mcM3Iuid&UrUMf%l|Nx3q`$B>1>3eSrf&Z&jUEX-&WTp#gid38B^cV zro!norP!%#+SHE&f}_jVO@^{#%#-y-#n0)>3rdQ5TGQh43ZZwTHkqF%NBYNyby0G{ z)jh{^9~DjQH?&)@TP~I!xX&rT=Qbk7Zn9b|=)|(!2*8YaKKsOP6@-25DhET}K`4Yt zyX+QNJ4kEq9<im9V){y!PV4oP<mCc|lPC_;mSj{s7e>4ZQvXA<o~w}hjZvE;wZSa4 zTVRxt7xft-J$ZSxV9Y3;{QE@FCHZZBC^tz=wkGIU+FE_LuhkOP91%To(tG6))xug9 zNwNT>Q$P&n06|j`O4_enP}$crN<MH;>a$WVASy`-S2_@ez8&|XOQDGE8S$D7GOR9E z)3>C=u-Fg|P7hF~Cq*#kqX9Q*$W{|R-GJwYrMADnbL5ykxPJVaRR;){4}RIyhks+o zNj)1nGWR1(3n{G_WWJKbZAd!VyHrTZASyRo>{KC7{i#ig_GYkXfn;k<wNI$mNmqJ} zh+J)7IWco{R)wDa2u)4Z!H;QQ$*EUMd;Ipj-hoj`7f#gi$QzbQ<}YHqiK&FPFV?CK zfu}XnimkTkyV-^$stQ%fxL*wuokST8qeN9D$|jl<h;QjJ4$94{jw=z>7bP9>hl(vx z8Qa{lYAYqbB2v78ElXPUxDsSTMOE0qb|Yu_StZv>+1F~ySJ~NW`coN)(hZNjVR+}l z2{WkbZy#BihRAaB>Gm3^g2!M?%bhS=^HE9t<e^4zuB3bPc8K_p0W|%6$OuVh<ra1C z8ZbH@g4%_$RhrU%YAb_!v}%>CZI++B?6<Q@47GB5d-tT2v1=Zdb8RZ^?W9@C@84YT zFKy|nnE6x{9g<@9j)$`GafW&@+So38i)v;ZLe~zvR{~PQ9t?jazcd;bLzCgnOe`mR zak+b%u^$z&Ar4E%Grhi7p;*Du{1>kW{uAwyvW3s+pA3v+vi19E!zURkx*M2KVhk~R znnu%IOhLPZ)q`mZEa`g^GIVVy=wM>jBCA%HUQz$aX=3T7A}emkYnBQi-PYlBul<Eo zJ&Smq3Ro;`gYn^dAvg-j|9MYTN=-$M<3BbPEM1=m$YNv<9{&aZN#8rz8S>2L<K*V* zY!8Bwgs%R`c~;h0cDcHjO0K$T1F1UKuwJ;Sd_Zp3T|nYYEw>vh(wJJHP@PTljGAC_ zDOZEk+!)l@pt*Im8koRQDNVz^&CU!ydpuGk8ChZNJ}F+Y;pyhRUqI78e^gL<Wl}3w z+Z||dodJ=M^_r9JXqx#?)E~x?)3E8s<%rX`&KPcv`sMtpP^LP(CzmsLYZ{G0y^Z1i zP;c$_?Cjd6Rw>bl{3U8S@j1Pz3f<zRgn<{T4Q4CRbjHbgRGG#Z55Ki7!ECY?p=4q_ zQ<CgVdE!pyrRD-VQPTBc<@igljb*cpF2^R%dKDj^Uubup$9Ikb7*Dbxw+$6=xh+DA z&UUZDrvM^Fm0bC^lN5e;b8+*D_2BMl`g;3wkR$*Kb)r2%8t2j{f+~IEjZnG?M8&oo zr_7Y6?iA7xjlweR7E$6?t-^~_C^)sFD(Xga&E;!*kSA>JPZX=zSQLNu{nO?PtX2~v zF%vnQ^5Yw=X54I4(yw}}KTL*|JVQ@taW$zWntCZCso*WknrL>J8|Tk&^OpIP{YJMr zARcOf;d$zItMf_c=5V#l@VU3VG!wC9m%(P6(Wei>m;=)3`=XkQvd}v94UJO~*^Z@^ z7t8OD%-<%{X?zlOM=8$qPTF>}cpZze6D3ywo@F$K?)xn3$sC%LoS)jCKYM<e1jQfi zSKGGMnfink+qGuX%{bj3>IAM}<>3w<H*#+0?fL&uWXy`$c7FUp+gp6R-9Gp0m`Q`3 z;6Z)$K!xEW2C?n*wEwF<{T~n#)eV#ThNOE~p@`)rwhHRXT|-FQw2Yqn;^93gQkdBP zbe<x|6{>|ZIP&OepSA0BvSH?qfhOjP6*NR{zSPh}ybq$UrsSH6FQ`t7()>6P$<kO? z5A2Aq+eFBs2P!wr{i~`$YkM^5IOe;tR54P`(iKIIT$%2Ei;)_x2Mk)RCY#|Zw#zJ) zTTq+LMj6sXDxg#|iT^jb6%%Tl<^NY<>+JB}()`94d#cJ#uI!>G^*t%O?Plq`vTern z$~L!$GGkiTKHFKJS2i>rlWVoE9{J=9c`4+FWgGDkKEpDAN)gw`5^lprkhyBq^?l`i zTee5mLZk>9Ctgq4zzjwt4wq8i8ILra^FgdgyCKY=O_E!-v8k8}YI_(~c|p(<n=?4} zD#dmp><>13<}W*C<kShqgqA4gwR8WeNu{!i=~gaH@5{O}V=XIn)68wVM6{bx9wd8b z-IXC)g*&3hn=$}4ckg*9=jm%#j@#UhfLkT#24Ucp8JPWKE2{&Wb%xKG;!w7LDN?}d zWdx;LyN3D%bcw%$`%_2eV`DG977^&@Vg>}Qt`gocfmyn>(i0UJV7gWS{)lQB3deA7 zx0J!R(5?_2jH_~o(;uuJdd!1yCTrvGKUsgWbou)pLvhq*T1j~5d?@|H{}6)DL-G*4 z^L~WUwZDI-Kj){3CsHBoKjV35qB$C}9E)@!<}~*&WH4X@*BAvs0uw?4>z5U3nZ<m9 z`=2#ak@NlaWAWk11b#R7d`%N<UG=3%hy3a_M7~WZ@A-4geCo9ecoce*<@-}TW;-P- zzKbqNP(+ov10DY8qwiGDQ322_<Dl&QALL^*Fo_hW>B4`B-De<MGQ^JTMV5e-*amUG zPr3Tw*F1191KGy!x;E_;O_=wIOQdN~fWW{L;&#dDdJ$AOq;fjBNMyx$DfD7etJOBg zAha?LX{8|Y6l2Bw;MP@hNDa*&U4BGKF3PB{wGtr%hZk&!R-+w+0YucDTk_u%Jr=f? z&Ejc!Vt+HxUW<$P%Ce|E6|WBnZi1&_4f*UtdGYXeOaNb2vdI)Ih5vF-_K|LTQReiO z@o?E&g**y5ebr9t{G2@a+0`#l2v)YP<8!?Sf@PkctOoqFr|>bQ1!bc|Lnj=QsuHCs zQK-|29#yb?jiK;B;Q|-VLcfEzwoREf%|Ue>dD0&&&eDtN;077tBycR*CuK-DmpZ*1 zDFSHAlWx$&EtFkbFv)wthOEErDhGN)G~UC17l3z*KEh!S6!eu0_LG`Ffr8BC2gR`; z17->k5z09{F9?yut*zn4r2v0fs9UNZVjk7jPt5l+jucba6V?s(Yl>GqRme+SecSYi z+shlN>VJD!5#1c5!$!mR&xg00-bR;aZ;3*QyIeAXAuO{YF-BQ?xxz7mNgK1*<z{hv zDsL}(X_=lsHcl)sNKCpcSRYGs{<H!!(rYhgNsOeq`POlnjqQVS@0$52lSwOE)+b(N z%Tv$8A5FgFAU{bV#L&JT-isiA@X_q<W(dVmeedueA#7OMC%^YM)PD|zw&)G~hcC4O zuwgJw9svWlkkPI*R*A}+Q}nPD;VO``#8&E#s|CKdV46qAc3z3mQ8SoOvQ=|vsU{rt z0v`m%e6~0Mz<Zel+aMM^6Yd208h?X;xA!B_jhO>fn2-X^Ly%g9>SZiLa@{QyefpbT zLbywa5KHR1ke_cI#6uUr`kaNqF%=aPJn&@KtyYMsjbmdJggy?SR_jS92vnF(mZNFr zYOZEV*BUhHyTeQ_xTqRe%5BK2-tlZ5ghgxMa-_DE{YM?>Bz_XX>vqiI`!(&1G;Odc zM;KWFGpK~JB6x88Q8@1WGe>1rEVy`W+d?3UbLHeOEaN<N+fSVtM;PsQ3B^B{n z<Pf(6RGb^Z_%0O6p-rhP!3rL}va;ZFLlI_R+CoeraaJzX7<%cV`u(Tln-n!0Zebon zG2YED+m}M2UAM=A+4KkfAakD#{0Vie_6OA}6M<pfiv@3pG3(E%nO8y*g3(k~_&YLU zYfSFQ2r-lR77)mjySSl|gDh)14!#?Yl(~jXci7wRy&L_$E~$%k%NjaxHu%4|?0e;T zloU}f&xj9Luo~h|T#D*ConUZi&?(a8>PuZZ&0feSTPAOaM}z$w<&BlLX87kJl=cVt z*)SH3D6rcaR#oqDmgU6QEw-$e!)%mjJ;4B)7!p7QG)~R2tuq_LGruPDG@E90CtL_{ z5X84*KEU-ge)_bnu%4QZFb1Xe^{xR>`PpOKTY1B#`0Wttd@d5J`w(UIK2zYD8ln(N zJIX0uNJQcsbTEq=){;|I@^{IHyoO&Gv2k_NZ+bt&j5(=8v9r2@BkO$EyAxfOZWFh> zo(pNod~2HgMBMW7_;C9pG~~YQVV(xU<-+07gTtKRkw~-Tey_3il>tLdgUv07>`Stu z-VHqSGv*i@01<-8i1wNlPc}F@RmGn%83bF{>=zf;2T2<)S^z}dD0<}asLU=J2YGTK z=hnAEPuZN0TW2v&ZZX!XGB&ppZFZt^%}?P3!J>Uj=XDAY&Hns^H=DY$xVBC`A?QKa zi6ICg1udT!*G<YB#AAnNYciag@(hHmefEmxn)F<t&L-M5dTS8NOG@)3<6YKWZ(rV~ z%(So?ohwJyvcudud9SxLQDJJ8&pN!nNrv>11R=KK`0czXw})?D9FeS1A8$MNA8W9r zdh<%V<Nfn$JT$*&;rdTp2{S_dkR>154_$s@>9qrK^eD>ttMTF`F&t98lU(&acygJB zPj(Qk?!Nl)7;rP-s=+8#1POUJ<KN(Z7?cdR05~ls#0c{CMkqzLGph92V9c?(#x4?B zHgsOQdfHd2R%mubN}J4;MAlUB+t?O`@w0c%@AdGiANhH8{Pn#rceW>=Ib+a9w%4Qh zaJy+3EIRSFksfzD{p>mm&s5@vU$^`gMS}Is37M&?$8pM@Juv>nk3i*(J!ysth%4+5 z7OhU5E2UWDtggy0-EDZ}KY<H+AJ6Swo0&=FLl7XJf2|M|L&ld8b??X?Ag6moM`Lfz z>s)_pPEK5(Tn-|li7EZu+-6p?<jLbEGv-wXoW_Kj1RO#%{Ly*@su)dJD~o}pLlA3* z!ta<tsh6Z!v@Ff@abPl|WTPcLyk=IkIT6rl%o2*K#u7rd{p_x|J6Z6iHYTw~12nw2 zC<}pid7Pj?L|8(mX2vccf>7d$nGA4(7Ux)Bp?Wa5a$0Sv*Gtc?CUNf5@}tiI=?IA= zFn__@VeLM533~Ns(i-diVX9c7bS<#J0+485DF!EDC6ebV57bK$g9xF5_Hc*)+r@>D zGDChK>*kE{9O#L-am^WAb#9$q8%x|_W`zJiKYy6oS(y<j1gmZ#xf|*4)4ou$XPW?b zl%F;isT)eX>C%T$sQ1hz&(8U(81I=BAoe5uDe?!Na7>4_k`^drU;ELNw60)>-^+&r zfSHak_zquf7-Rm!6eJZ>bp1dfKdu2_?Ej`<S7tsP2c~EOyfPVCios6tdKSsb$A!^s zD~#0oE88GES?NBDGlDb^AN9f{WX)@n*cgv2(MCs+lShcTWvY#;Bc$x1?1D6S>_k}7 z$JT(n)1)TSnjM7K!w`)91NSex#2_M2{(E&hBQ|lQk7LCLRL|yg@5Knew1ecMV3CC= zi@MieO}_BxKbH{Jg(nrf>PqKp@ea{?Gu=E{fA_5D;?cUe=Mdqlc8P6+{;EqPDv2No z%wRbwTcS_$LNAQRfZkgukuU(yjRyn(=|Vs`9GM18`m)N%yE?+b^&rDBKXSVZ+}|7; zv2K^qxf2gi*}OyQV9EgMB)|jNn0D|nrX`thPnZjSqUHj)VYUnEjU31b0W;lqM;1}X zGbQzE(#}0L&8Hmnv-N#Mrp|bAQyfNX(KMW0-EhvY?ooyU@TIn)5yY}hBr{9v3qc`g zxEDz6wn(~QFtf*tIo{n){Np<_<UFI2M=-BhOl_l_M)ok)2t^Eq#-~ix0}H~(Qr(lP zR~EbK@A_&?0PU1V#fcOa+mf!NW0irq?SIq5GP*$ECB`TTD}A2K7)q3vNkyfW;t1OT zeEB^guvRX<JZ(5!uy&nW_G6J`3cUyW{*xvCXk8@7Fuz^ZVzFCkC?E~*={DNp`g)ks z1?;}fnw~#o5DF6LihS*or&czOS~;dL4F7DBvP`07E?9<jRjJ~-^Z<D}|F|<?dy9%b z;vZ!LQ!Z<vTcn)6%>=|uS1?l@H(2=8=q0H4Eviabo>EzX(o8{go``AehNNMZXP6<- zwx%N!9?-Z}TmA)x@zKcZjz(1Cy9tWRnP<=s+4XBBqbE9_vrx?qdB;2qpNE6VRIl=D zvh(2|G+lPdN$RU|XlRLCUWTigN>nqNMH{qo#Hcf?&ZK}Jrpl(W_zl}2PpxFFlV?(! zlXvK1&D+N7$uNoUh8&UsXgU?DHL6pBzxAhL@K=4|%x_>@>K;@%vlHv1$#W}5d+XoU z0lfYW<<klRbGI{bGYbAhWuBUCpI$%R%<Qu1y@<8f?M@}t=_?3E!<)tHH>s0io2dmp z9HNoP2H5Drz=73;3?8<7KmWo(&=2ovqL1TMjpAJj=AZcp!7RNh?K%5H|7RckpQ~UV ziV_PHa<v*+k&+aS6&nYIm>C-sa_O07TSrac7q-)}GImSD?O0d{0^D9q`HluGaBD44 zJ!v7(2Ksp143ER4pygPqg5}ac4+#zmH)8-xo|iEl*jj55Q6Uhv6BG_!HxE-FYi2lX zKUCB{*u%r$i`?;1D+AN!ly1CgC(1Q5E_xj)TtPf?^4Ba5AIhY|b8=bgzOArGUcQa7 z=uWDPP-D+FL=!q!_mJXu_6V=&H?NAFtB;6-b^<Y#Qr0Y9zg$ToX}(o{E(X-`HgQVe z$eS%_g`8+Mb|QWVpt>_dCOI`TouM!XDGD*{DR7jLyV4vSanAlJlny=cx%%A6NIyx% z1ZPgBUreu-@V5wID8{{(=2yaT*Lz;YvyBew6uU|lNFRR`Ju=<CDVN*;=J!9zOf8Wb zs}1I-HNOUqVE)FUYEn%nzs`XUM3O9Kg(oo|lP|o$`Cv<DWvZG=nEdvPdP#Y%_KpSZ z7H|9ma+17gOXMWaqCO$ea9jk^1fHi1FRwGst4Xf;%epJzhi{eZbJ7zgrSzhr98_B8 zYHHy%h^8i1`x6jDRm}YAm+B;}mlayq(~WLv>r3deuNAu8QXWhsLDRG)J6J2H!CYM2 zGuqw$X>{ufP&Msz=fj1HNLb!&u8;+AJN1Ux5Y*9@Dp=(s=~-~3@}K(-JT(2g<D8-A zv)<V<o@0Z7>@S0wPALvmEUy_YuwmQXLYWZzHuP0mx$z1W4-SZ!4liuiZo>~|Gp<xG zV4nS|!AFL3Wt>_eE+s`3g%jjuh`hb<(i$thUDj=F<oM$ilWxS>Z<1&uea!`g6oia6 z2u&VsqHI-t&iy}+JV(1XhzJrSy$+r`6h1|27UIay_d&?6zB>YNr@ljbUw;!wc3VDW z*KyO;%d_vV>WDVBn;sVg`3Z2j3P^}vZ)mt_C9G;cu%r>cV)n0T3K^0=s{e9ujU(mK zSXam|#Y|F-VQHc-gi#%?zB`zH6{6uKUGRG-kurl9uwPejICw+;ALqx<QIO}RvWw+L zc?d3Awke;A20lnsw4?aHct46E$xy91Em^`-R3vdoB}s#PLv}{{4EO{1E5s?pKAa?& zX8;V;vm<L379sc6>*9CJv|Xid(0*QVUx0_m2apix2}BI^!;{u|;}qQx8DD7qU5k%N zNy4OAqbLF4KN3P3WxrxZOG;Vr2~~k)n_Hxwp6R2_wZC6tLu`PpXnQvz^W_b&THnor z{R#6JEk8Dc$F}gSSogodt*nZEtK3#~>y!SK^uYzsV%xQBF63KzR<CFrruC?fUxsVo zClN!&aGanr_`a^i0z$t~Q`S%WX1OgY0D;{ah++my%u7fOhfal%xC)yUn^ZpyMHSBx z5D7J`dI8lABIy;-RR_PQQ>IfRK^$Z=<ESB!;?5y+nCfb~%hC%fpbV)he_vgVWXcuL z2$7fY|Dy-qAG2FvK507PBaeB%?)%Fz_<~Lxto@JQ@+(F5oBi#Ck1)&~Tv=@4x>B9r z5V9hT(()P1TahDRS--F{E>w3OdM&2Enthc~k?K=Q1`<Bw@XM8=w0C0RgvBmv{A7(B z1{j@5SF;N)92iWAoj_%a)1a_$zQ_=Y)&>d=D5)?QZ4yz9q`td*D<@<rMj{Tqp?Vg( zq6*xN4(cZ}PZ`+AJv!|#mG{o!_`i!_{sX$1{ng_oX5$0<&mjZ@4~5F5f}Wq!o%*wd zggcnnNuTm*za&bUF)^@Ib}Lyi4j}YbwpTkP_LR><bky~~@dFj=73&WYACRP-pG7B} zqL@s%`T9y3@+_6^&|z`l`v<}zILoHbtuy2ZdHXY{FZGj*?+quv7qg+rT%!txOV5d4 zX8J!rrHD=PA_u)NzQXCo^*4FUqB}3Uw$z<P8ws}j-6My&vj7>ir;!?n{|HW=s>}Me zF6(KJ$jU+fh|BhA^g@%Ky|jfeh(4|B{tA39v>(n%jY~iD8$c`DUw9raA6uhZb@Oy} z?FrV+i&js+&7sUd?nsMlXKHiQ{JQc9VNX(8IBghv_kSDIkHy*(4P}dabML}tYsz0d zdXWbt8AW}^@6NJ&&_r%gklMZ{y_dpBQh+d%Q%%hD6sQe7eUWhO8^71h4?RMt_pXd* z_IKkLKa>jNBF|p?eKVAYL#pW`A4}XFuU|m^=)}yKvT1TZ%5l*6myLGr=jQrwFonL) z3qB>q>XhT}eHFz!@~~D{Py$q1^h<!rPAhHo+RO{#5yduVC;PQgD*xNJ0lp5NSZ{^{ z$}UQC__XhAI4>o4v;s!8-f%vr<Qd!(7#cC!Muy0$fq1v%>(heQ@*{)YZkeDAoO5&j z@p!aY$>p50#<{4#Do2+O{m!m&2^cF&18&iAk&e)Im%iJkSnh4e`PMh0fc1$n>m<hK zr_Dh0qj|^EyKFCaD+~wmLJo{oM6|E{4p3kqo$#VoE4I@{A&Yj8d%_4q$yGXjMda-H zmx`ZTRLFhTD2KNOSNu)!+ColKne!m0cHpcorS1|$C=pl302bZADfM(_W8rh!+1o_l z*e&NHcm0F*HRh)l$$jCS`xulT?EPXVO7_lg5;FU8@Am|eWn5dXVSgNYlJ418*ZI(* zBBK$xIX~#_0HcH!t%6uqi&0<|*VMuigaF1U7OB)t!Q+rwsVX1%)KefNy4~a&0)iw5 zPL&&xOkurDa6ss!S{VpZj6vhFouYl&SVy1QJ4g!!wJ&6J?K5$Rfu%QW;f|9>iknvJ zOIe-E#urm(>A&dI@H`gFXvynWzs)#Q%O|f?H81jaG99yn!I3XP+5kdP_8SLbYrTz* zk>-93)cPwnbUV1y9)0tE<-eoq8c-Ny^|#$fJnp*}@pd<u@jlGZAM0Ej3Rw~z1$nf) zjZe#Y`IrK*3AS}tA8aQ6juWRWzsAD1_76-Bk?j?5e$1Ab0xWq(P15XNou~`vgT_}< z4zea{iv}TyJcEooY#OvyFKn=9C<@2TMaRw5rbs~jm`9eCj?Z~=?K$ZO7mMeQeYI-0 zV~)=P8mi6JE8&Ul`4j$33Aas$gCn<(^~l%WD6O^vZ9B|lrZ9mCYpohB_Q_hE_9$MZ ztuH|T8C)?2O_J=Yzq^O+_0xR5K6^pRhb_Ibc1>ZQbEVuucdAYt#$dhF1MwLGp6WO1 zKN+l@L%Kk7rNKxj!%$^0#>>n;X|K?Fw7I<?DB<D+i{@gox)^~9ON-3|AUHN0kbb_8 z#o8z$PynE$fWabF?;TQVW*+AxUIxOTy9|b=YX%k@h6<5%w)x<j=Q@@1$r1}K8j)7K zFHMomL-W5QEYbguiO7`m-%Ly0@B{%x)sALv_l8Po;gAqNW0?mG>`9_!DJ9#(MR+iQ zp@f<(9mN7e(c$sIOly=CtQ^*ESi~A4pfKr-AEb9OgY*0<1kG2^e758unbz@jm32Bk z&YN6T_a+1v*y}UZ4DO8nt?BtxC(_=@BeAIE9@q1CuH43DBG_h~XEBiK8Aw0Y&qzYo zc1;+{v7o?n+{IMr*zYVXml>#@ML$8CF;zI7Bx8fSxz;I+CgQccNm(8e+{x?NWBOKP zzaq5v^RkwnRYX3U{kr4e!=QfR<q1Yl*y~m_nyeVhltpcQ<?}tm%bGJ(J4y71h2<@N zpHnO+y6Nrl$;4HmTh4^4)Z&i)PG-}i&wDpbD@I-^Io>0deXFs?TorMoNH?@7Q?1iH zetHs{ukdTNfNx1`W)v_t4Gf(aE6s`Y>`8rK?;zl=jpNhRv~9aOW&R9ZH2Y&I;ZWSv zw&~o4m}S#r#zloZCLwK;n5nzg!X!qi8}<$Z%0ce2D&C$Hf^$)FpevL;5%!Q{jfQ#6 zvH4qE#7ZvPU1K#JGHp{;*^baqUuyvs6mw*YaF=q!D6)Edl~XyD`=6@9t`Rc@X2EP@ z{!gE=e8iA^uVIJ^DU|m6f77<7sdWw!j*2!Fl&(cz4aDA{D=(MZQ3vB5`n*!=>3A6t zhpF3EN<tR4KHqx-*4qyz^!i_85@hHEWySo~*Q)=98T`sCMmf75zZ*nku(<R(#=-vb z`k(b81^JH)d;?g%>#HiCKB3~<)HVHW&=n0yeQ!bEsrZqIq;7NwH{*karuS!OG7l~2 zD(%!Skhw?=uqqnsusHg{PpL4l$?#?%%5+>U{j8Nt(1RHiiw1dVuAeE6#07Mcp1<}W z%M=eDKZsB#{2g<xGcY-59>DO0^ObO>(&$wPbLkP4{r8!aq9Qqz+=*N^yj^nTures4 kX}bOLEMVgUhDA$IIedSOQ%39K^NZ#A*c6(B{ung>5At<>DgXcg diff --git a/app/fonts/Inter-Regular.woff2 b/app/fonts/Inter-Regular.woff2 deleted file mode 100644 index b8699af29b021cbbbdf82e18f5c4a2271d19b616..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108488 zcmV)0K+eB+Pew8T0RR910jJ0S4FCWD1ni&y0jFsI1ONa400000000000000000000 z0000Qhyojg^DrENx<CeC0D;M73W$+VhWK#-HUcCA+c*o`JOBhB1&&S!f&O?~pmDU= zuYPRrxt(jvs%LQ?2w##+oN1a;*(Ks#2gDPVZk<^sl#HSGQVa_iqu4o}jxh`vFp^B| z*RP=Cz9$4Y9ov-b6<NSbl>h(#|NsC0|NsC0|Ns9RS{9+sX7{Ab-kmI4mSkJFbPSk4 zcL<?;fROTOUqO=|!AE2*5!`dSx1Bo$bI~mgRZ*Cz(d#RQ0h+xELEoch6mf`%QPfAu z7?WNPwU~zV&7v}2EPak)8>=-cjV{y(Y6MlP>ssS}hCDaS!zQT%Gl!09YG_dQ3|&LJ zC=7=It#}kY)@W~WeDL--%VY?32=WA{zSAvxBCFquGttqOIJc$^3ZKR!oJi`81CN-J zJ@gb3t-Ll|<R=R)$A+*o#%S^Y-h0jBvcH&J;;MCp8HT=ImPQcQg384jrqE#rOC-7! z6Uz0wsXFJTHSS_~gE+~%?GUGi-g3+sWA}Z?kAlUPi2+L0@=TOuZK29x!sE6^J-|)z zK_jRQ%v93(t}Js|+<R0NM#$CoR7sU|r~5-DvP}5YjV9Xh5K$TJg;@)&5Xfp%)KSDt zEWGd{d-RxwBhg1dt&POBb``}RxPnKm(S^=T<fHoJ`s{9Rpc|K$i4x@{S_$;EhlE=4 zSroixBGJ_+@=1Nw4SkL3VR|-RnKuScIiuRAy5x$2oKcwI9bw+Y3ZHEkC))Uv`i0^I zbhu54Wmq@|RwV|nBDmZLCUhd(`la}q)~}h2y@?e~ZJ0OTR8l>oTF{;9$Ey|E@|`c> zi#U4u)0s@Ja9N(|xm(ZSPGyqbp`)4lo$2v9(bcH_V0yexM2+fCrpN2VNTd3lDLO{3 z-zv{Zy(aQ_qfA;$@mV~G6T#!Yxo^}jFMah_0xkU)b}~!hk@~oKhtrF*E`FycS9>Fz z(Zp`GTif9n`K>ye=IS|BQZ1RlO62%#_vK9~23}{QQvaP`d%p@9YCPMgscf(vnK;C~ z%B@Q3J=ZxbJGUjc`xenzBU-pMW$#g)P+e2?blt2_i5z}`5|lOm8nSr_SlwmW?l==! z9?i;7h^}vTvCdedt`|`RWom|nnETbLl|5bP13KR`vA>5|2h|<QDpXbVp(^wh6Eo`H z^@jr66LI<hr^GgqANnM*Cs8Vm_-8ON*puGZ=Q?#uuKNbKSnZ=dZxFj#u@SFPWuu#F zREO$*0%O5s{+$*m!l~MISjp?BhoI!h8*$llCRH-IwK{uWY|o#%`^b{N(c9`beVpDe zyMZ<!ND`zZe^W7BQ5eMmRRc*ujC<KAw8TRGCz)I$vxzWiN$p-755UxJXS3a0{!HIL zdX{D4c7>SYUwT(1|4+$`fE44_eF*?fM2Yk=M3!k4o86&1U2e}9HRr49Q-1j;x~JZA ztNYDNEq<T?1rVYTppa(Pf1cL%=e{>Hn=DJTfuz}(phSdCXnzyYFIZ&T&?aCMHdg$w zA^~`+wa<OsGt*1_;ebfp>99i~O_aDqhIJ}i00Er<5Wsv0*5*l-2(3t!Wc~A%d^CI{ z@zetkPvui7*#ZV(6b9CuI>p(W(F-?M<%VEx9T`fLQAnAn7;m70kyH+pkPyk<SQCq; zR;(DkAvr)oB#a3yN|aR}){pG>tc@h4Py#7gDCERCe%HU)Q!y%P;OZTY0C56Mc`PQz z0#aj;FXb!yp8$Z0$60=L&q(%@k3-}D^Iiy$KH&x|zuN2Gze{O8ajgnNsS3_A-)7F~ zR0XpRW@$|rY~J8dcw}3LAJ)_#Nu#ITQJi9^U<aDj2PQa`PKZIU14Xn`_z$P$yOI56 zPm#RaSxQBBfiM8W5S|_2^Y+h%&6&`0o;l7OclD!F-8!Xf(fyM-CQ&m(>7vVVm2`Z^ zm9Nur&#<}1Fm_^_Z8kfwQU9{%=eawtG$4#?KC+=r5Z)34t7cWePFJ;^K4+3(Av#eE zNr?nLy69uqcYDsv&YN+%Y68>1bgq;8^hWDnM9+qfk<s{8_(IPWRDNCmSXoQl1cuXr zZkeiozk}n?pe|j`nB6i~Kn_MO!)u=V{d+!-AQJdy^s5E&NIvkO{}_XIq9LEh>fo*5 zt?v%?zu6SQD4qZA-T6*_B1>lwuvrF_4EzHOHFqhh6jdfgnKCm7(`WiLeNdg~KLY5s zz1lZ(QLqF8%M^oKN!i_3+uzyq;~f3Icx!bjOC=Ka$Y%WjNq{_{Ep<6jweK#yT_|nO zuR(r-yPe(>K$sTmFhYaHrjM9gmQvI)HUClP0D)2{i?s>u^a#=*oWRQ$@-brf(M_y4 za0vjT!Yy3EbAytuDe8v$rOf}b)iBx0H=m2y2puHr2pz;5iyHAxuR211bkVC~&_?`U zNbSdU4moiFW(LpI_fF2aNlr3veK}{}TFGgWCP{A6WUX<=T5GNKC8xQ`Ns}Z^bDE?{ z(j@s#lH?>wlAI<<k~B$@BuSc+CP|tkNs?Ib@oCE*Tcy48UomH?7@W*<TSCYzHM*UU zztibtGe;<$z0!{?AsaF^gX#}epNbhZKQV)z$J^V{$5|6Brbq+ept8mPI(wPw*>^&i zFPuX;j3WWTtH1VZqWLcp@k%mDCp*KodnfQ_9<+am>XO7Z;n_kF)nv)6U%lL>Q&6{) zeUYC@A}tVzC@7)8q9`8z|NfufTzjw25qy|H!y92EgM_26<^et}fiR%Y_uggIa4HbC zySu&quTcsO4kN0uC{QqTo2bNpT1)@p-E5F2$cH?#umujPQz1|#^wCVJAj_(XK*pGT zN4Zti<g|MkQDelV1=%CWgi%YnzTXpjss&gTtz85u{<fvkFA1>AtW{)EK2r5;*vN+H zg~Y)R!Q=D*dZ)A0TBP!>WXXS&1cA(iB?N}hGFZq8%ib_$h?G24KluNCKYlkPhV<>7 zbN62Fn|MS+p%bE(M0AOSs8J&Ws%)Udo1qFfNCEiBxBl05+|Iz?Q@j+h*Ii?vbV3uW zO*}#U%SpD${Fg$(N_bB9^Lqa#t&@+b<|J)&P;sI%j9t5ZP|Y*XJtwH12Tql&f&-q= z$aCLoE4owwP?>)32BlLYB~i-K(zyQDdV5y2YBLlFX2%@dJk<cG;^g;{)=^zWXdwtW z%{=3i+%9m0mIXlD6cTJhd;V;~hRqpjn>Y-!xjnR_41uYG{zO<9_fV!|bKtP68XzEI zo1p%mRd6A#)|C_%2T=f-Za1OyghV(&NQ$6c$wT1pxo@)xu}M*^WNer}@9qWhihaYj z%|-PYtLy-dPhEXg3YJ}^C)w~f<ao>B={?y3jBx@ybfiI2ZNS5x<e6J{Pwqb{2Zs%} z+55uRezC_eEX%)ewHc%z7@E=O_sY1JPUC;Zi6p@3<)Zf>k;`0EzxQZChczcld?7d= zJYQ?2onP;8)c)X)Bv4eoD^_*S2D-P8J20EDJD|A$36qM7M57`UDM0CBRE%*ER)pvO zf9YrRZbv;k1Lk5D6kxVzD5z5Tx9a@rAWckY#9GV9tV2qK3}7h%Oa>a_2^8O-2>jL( z3I+(n2NX=P`T?j@z+$gg^{o{~<bM<gA{5Lq26m=nnqJ9Clw;*wRKC>V;SpRW7-UwW zsE`~($;Smi5TNuaK+@&VR5w@DRmk0yS9IlFT_4Z)-7{@0eAi}9Mk(%3Hozt8<do<C z|5S_4Pnpv306bd&oYE@cV?E0^iR|c{IN9FO!a;d@|9{z%+{feDS{PWglr5x-ByF=7 zCGqw!02jeI?O?2t6;hnG;^*^C&E8hP`$@E54%6Gv-lA$uz&jK3F&C*^Qnj}KpRZY_ zzfivhXaF?LUJAXOGpA>?#!)ti8eGR2xj!3qyqPwLQ1AY#*FaSPB!J(vJzUYPF%I=H z+Vek}=Lqa|kf*GT6gv~@<cd;-^8epdvwauCvHpPMIRfbbN<KDcD{!;c=eXXOI)|ok zJ^z0UFmFDFoEZRG5}?GS1abqwjnqbvqBbN-o0F>)N>PrK9768xqNq~nT)K48l`cy2 z{PMJC+lU7sY4;@_;ty5xG6)WX0iDQWUbg55jIPmwRZLnc)(ZdszptDP{m-sU_rk0Q z!eG=SR8S}x>eqV=_3v+1s&2;rm@3UMO)A|g9o3Br5)?K%M7Bc;780I!9j^zn8W;}0 z;pFOux2g5*JnMWJc}Y(0HgjwrD#!j*$Dc4CxdQASNS=8!l05<^BPk%u3$na0lCyiV zykLsglr<-Oh~6A83Y@I$kgO2dj&lo0-aSI7Qf^oN@|Q>c0Myo3l)wGmF9E3N|KF=> zwSc)nz7#^yh1}h2byW$xhtCK6k3a&TNCBiNgNmdaDJNQ|MWDQ(B=3+LwVB!|@5NBb zvM$LNQ*~9fp}OwsJNUxsC)Mg*+N9Z68ejo{U8x%MwLxC?jT4+u;I_&$FHj>R6k~R? znYujxI{!aumaZ-NT1BiofS1DOH$!5bfXuHgWEC$e<EX^j_Fy(!MNs++VbUs?XSg{c z=bldw>4)-^PQ6d<(G|zT=j}XO=Yj2Gz#r`4$Okb*pOalQ5O6vRWZ}N*DT#16yZ6+v zq7Y?^Ce-JWN0MOB3MEO+^d|g17=qKY!U4~}(^u}9q;oOyu3m@48dyX<qz?a&e8RBR zsn_iWm9@bD{5!3vdS8s3bio)Qj4{R-Q#3t$Mb{C8n*@6&e)KmJy6?B_TD2moqM{-q zBC0AXBKjgKV)gD1(R{zEi`3n__tP|qFhU4ngb+dqV~i<GVT!>N#Zc6}YF`ik=g)dh z@=BY}Ef<jxLJ*Nbd`%?VXG?Qi8$>RbkSVuXRYnTtUV=?gNFpL4QWR1&g%lzpg-9Wi zh%1sv5QrpFNK+I=QLkpewC!&b3h@%B2pZKi1fv&-|26p6H|IcH)Do6(2}@Y9lrJkH zWJQIntiOF}Q*P(fDq`BMJU$|Wm{RR^FPgKZ0+R87!3XX($Y^(lL56`lwpATCMF+mg zSn4H+voD%5z*H$x%bvqFs}q5W2M-b{1gWiveb4pr7K1*UAG!4!kdq7=w4wp6Xh4Gj z0|pq}$H2f~ffX%q@<$=;U^s^xXj$nGhiWXw@vvJoXOpeUFdP@;pZa??=Puxb#utJ= z9)w{Sd}w%f{=d3_7EU<T5WMnG3m)J9Q$JUIwF8sgy(-^5bueQ}7*WT77{EwU2_m5t zM!nsi@8o}<PJfPYQ6wI$@~;X-Alrbzwx~s5=pnS8(l-0QQu(h+#nJ>gPuf7*hU#Y$ zGh1scYmC_1O~-C;J_h}1?}&LcJ7P8QMr>1$M(kokBldrU5xWt6#9kzu;_&Vx?kRc1 zqoj`bWSS9AP(I>IRE_vjv=Luzb;MtgO%WX22MB@^Pz!26BWM6azM->#&_hV*Eiw!g zABIW_zNo<;JA}#$a}<PmibA}Sut;rKAwR5B9d>98`}KuOXyK)$@D@Adr`#_iNV(q@ z1R{!R5M5ChM1QR!hHD!!S%-+lx<)#!U!?m6MS5;{q~AtH25($s$R<WcE;8b=#E93D zBYsPZ1S~TWu_=+L6-1_NW@OgpMaq{O*}T<Jw!ES`K}EU1M+IR=g_A~2QWzDlG%6V~ zDpOHZE<#i}c2qTf)Lv~-2X#ap))jS9XVh7}Q5OwIT{j-}*kU{atPhBGc+@Cnby4~d z(bE-0&sGvutS4$;N7TRmXkY^ob^K^$D`|4qgv&062@`>2E=5HTOO}H4K>-#eC=?2C z25f@~`(Vx~wBr`6d4z5PLr<Zhzo;-sY;ceehJgl0h~NwpT;YN{LhwWiftVpqdYD5K z7ODt|szM4@*i06VdxX<~a26c?L4?bcaNn*OiR|J^xSZu`xZLPdF!{AJVDd+2L*$<> zgpf@(2*t?|gpy<mLiNcVj2e(92sI&ZP-;fLAk=~aL8vtafl=4M!KqsiAQ~4E2m}P6 z2n0<*6-{(8#N0^Rw4)sE2uC`~(T;JhS9^m`I3t3HoIR0%R^8NiyPoORBfS>gD4K7t zPVNf~a}?+aEu8gdpqTUZjaBL#zf+pBCcz{F0tlPI0K$0$fUpA!bYZMPFcQWf>;V7) zKnQ@407EdAz@3&|uRr8ttkxfL8>{z+Aex1UF)R@bzI-PbY&{3zu}%`H@sU9b2@s5c zupgZfe&7sY0|Y<^lXhPs>FM{GA*ClTCTwe-SgxVSeEwZENUkO6g)b>C)EByo`wLHc zNY@u8`@6MVkQ)yPFjSfy^2}AR-P^PM-oNCkOqtul0*hS{ztdH*9+VypSz)F4r{squ z^{n`|XawU&g(7X}zx8_?Z(SRlTI+4psR_a4`erhR`K(|Ot5~XA0fsUEuL_`t3&?S` zlM0=7#(w9#a$s7N?#`aZEkN^q?7n`|ntq?3v7z3pCIsuo6Ix;H@R1h4W~;p}W45tn zWKQqj?U-v=!q7G3x*p`Z1i3B;xeh_DYk;AfFmwlo?jzUB$n^pYy}(=_VXjY&*7K(} zL0j43$GgGL%Yy4`7<$J(IcV^aQ*s2(nvY}u6~p-$HUn(QHW9UFvpTL1WnEg>GMZ0t zy`tgKPv6?sEYG+@y!jI43U5JD`Ii6l7yl4<DAG3$5&{%lI2DK=_xOWf!*AgC@dwPY ziiEWxf9-yBH=*d)%?#srb4(?%_>Xu}Sz@p&wslA_p&S~2?X}zqBL*a|cs&Xpz~w12 z*sjDbb$ZxWBV0H#R!@8DZDNCyoZ>X+IL`$xbB)iq&gb0Bt>)v4d{=w?z#pxw7`Gi} zSg>nYKgZdP|7+|K2OKfP2;*2FzT%4?C@^5z!xi9MOLWztVT(RpCmXI#)!WjK4cjQK zCYtDC6|d4Nxyi(rK%x>imL!r&b~Rp&_2;rRYcEHq;R=kJs>+gsH8^6k<{A@C43(;U zs`%Hd_+DC0;GNf1`_9K|{Y+53KS*lw4_W_LnmX%ulj+>u`5jhmwU;i{<;K#r4_$A# z`hsX&;{yP06Zbj|N+>Lm87sbZ$iNBx4pF;lJgskNPGekePC5CaiVuS!s}pa#D-Q0C zMmt~4U>tZaM|6;*rA|7npQKJ5*YR%=ev*8WKMzsM_dM~zSXl7iP+@{}ViV?-A}UX< z@9=hRpCD&+aDG8&{$w*UVCHj~jdafGYX`}wXfFnaj%;?dGX}^VbnZCN`s7vP0T#B+ z^#TZDm&^BUsBn!X&k|l8;=)FBG0VA(c}WKi2rey`5t2W}qR7H@m7j2R*A&@Hg(8}F zSA6Qb4(>j3GdICq-`vivfrpt^i0}Y#ca+C_EbdP7bWg$EnV#p_aGeXQvbb$<WIGkq zPXT}uz3zH{Ei}F6=X~yT{`NF1;eV0)DwzO61Q1Hn`3FCbc={aK2YuuzKJJjnzTis} zzADqRZ&la8ztpSw#ndtzzrP3A1Y|%L4k3_>iV;{(oX%yR;;o}TTLtxhT%}N;U7@%c z?_&}G;Y?k`u;qObffB@@W$~cQhR+@QDiJh+goR66dC+?sqF|ICm5;&Aw)uGxzDivk zl+QPxt)B{apB=$vQjftOLaAs-gmfwwo<ccQ3ysiD^>{&)IYYfCzo7DY9HwVpzX^1Q zPJ2H<3Wjq~C&nUktg_<hZiNFbuMbOG6b=k|)I^DxUd%<`AVx@~Xz?VTrnr$W5~d^~ zxk#1LimpV)lv!jG+2=TUF}zi?ff!E3VlrlY^BYqT>&$Cb)Dr8j^1Lswd~EVzNQ-oy z4|M(d30Jxa7WEyRbAHGA4&o?I_};Vl7T$837b&h?JL4cX3jKwp1o+|c!{b7P9pouI z&gSwEln>TeFVJslnYSjTY?KE+o+Xof6T?y*JUS;WMsd;UyOI*~s<2nU=bo5{lH%R_ zsgz3R7a~)TzNIk=x(^1mnj%l?{^B8dQoa<t6*H2H7vOsa2ldHEa8aN+Rw_y<OEjx0 z`po(KT8?M;swpq_l4ZceG(d%iy!gCEgNZF52U19L*7GkjXtG>dGM{xbZv)s3?>57i z`{8Z?BrYkBtO`kcXSoc+k%5ei16tLEfT%*!?}{^|mX(Xi1Wl-J9FU6&8g|q?V==+` zf_Y?qUYxG~L1*7zMgZrKuD_eq%Ec_g@jS~oG`U)ZBo+*aeK_pe*QE5Bt14Yi5DiIt z%fgVx=MJg#DY=##_1vyv&a7T+c=twZ72nCbj_k^h-0IJv96ft9J&kn6Y%V{!%LP!{ zrU$xb)K1Dn(pzxIq7E{XqU;0}7Kw!Am5*dC=8s7}O-sHg*e@GMuL9LKyv^WI|B$;M zJQTIP9PKHX0`^gebL>Gmr3s%V(<kt~EKFg4&hT^+j&>~)aiYNIn&kYn#KHpP0v_H+ z4ry4G!K1zw&T{^heFa2}ZK~4OH7bYf+9v0m#T?$XzI6thCJhrpYr$tRO|>|6F~c7N z=R+mD*uY^^g58$Gi%hRHmyJkEu_QHsB@e=ilT&b~jTCR#Q3HZYs|19EPdAoJ2A)Zg z)%x@1^XgDnsh9sqDzqt?`v7)SDnC*3rRae2?7-5%2f2~{FDyDiNTvD7x}YQ&W<;W| z_=;szHR4;#MXd>|;;5F%sshR^98zyZEN>haF6(;b$5wjzCrSMA3d)Z87NJNLh$8qj z#5sS(8c!58Mj9q|7#d%nMX99E-(zW55S;zWtn62S@{AH*<=MK(c~#w9UuMtU;^TKh z>Mcmd&#WSeG>ujD+pv1OCJm>dF{!i_617R{B-b62;BnqTOOy$$K&V)SHNkzn`JNM- znU~gk$%8Jf>cP_&<!;+Zb2;|S){$WdR+bOoxWpQ)`l%YJ@vmGNFtDi!m8j2P0A{Qb zTvLV#?%+|z(Ag#<wLssMR7+Q-x&l7;1ke2G8Q8Oa2%l_$$@K+mhIBm#zMrnIbq@b* zy55?vj`EVatQ#a8TK5hjQiJ&*qk+tl+|yWRMX$eHLo=~1^KgLO@J=H%a^9Va#%QcO zhw0IqxMqqnebxjnv13y%qsb(yoPK-jQ`>PFO+!RqXTce&uvk~9lb0^=DVK&zYpmTQ zezI`fQ6LQ!H0)^fnOr)YFTmU3+sU5snn4c$Qw;$&=DKrmfec<;RG-rZa-9_1N!MJa zBRVe%#&#MYvrMUEYio?#(?VUuOTX^Z*wQNvO1ummwP;H)d>Zdu8gQdFv@NwK&$4fm z@016Zb7}H&2o7)j+Cq9m*P?jtkPV;!Z>O|zn^xK)3M-g?Ypa59f5C>I*K7e!mFV!m zb}#^Vg`Ww?{V?GApWV$rvmbSgy8dT&NSB;6lBb=U<V%G~iBz6cNwqJ2B{lvBf}J=8 zw4?pav}s}=a0a0()2$Zq#w1dcC5%8WxFy3BDo@cq<%~oRpWFDP(PLja$(~W3d9|m= zUR3YnWYa5-?^*B777u#I%(>Q}Hz$pt=V(~5t6M$rXPHQSa#d#dg#m*jO@DiC4bGl% z{$j#w20s5tUmJgvNc7z$48VKgfdJBLoxHc`|2>G4j|mN$U5NhzBCi=xMw)@Ds33}= zLn9ix7RvI&Dg*!J2P6#&Ug>B5JXXt5ocYi1oAk`k2DR*<@9EQEe)+Jb)-P<E!NctN z7m-UEn5^QTGFg>BHIgVi+XMgIq5h&6s26pW2Cm1p-zn9>fm#!kp>IKhc}x6&w_omA zXZl1CJ`W^JBJL}}7E=w=qx^g}Blu+|GJE$K@sS$Y-5nW)fvQ~^RrlKSXzBCaF&Ho7 z)!3YmrQVs0u~DAj>zXfnx!;6M<V3e|lS~L9S)SA+W3o0l^X$v}0-0DQQ%R-lv8|Em z)l_>LCg#nwRdy#hN-p>PrhkTJw4In~baL~lezB%D8?)U3M*W6_jLFnke3@Ns%6r>+ zSa4%^Vb;+=tqm@snuZqb{wM2naTmWW{3^ke{i}Rp88<RZm3v3~_3En`&CTLyqn6EU zII-bgUfd_J!YhW^<Qi$YM!v!nX%#0{Wv#xNCUo-svnKbMtl4@)d%bqvEnp++*EV)* z6TeAqGwMet&BVmUb52A`K~3k{y$2>1x7_9XPyxfZC#&1OUx#ZWI~a{8Q@bE!Rg0FU zv8(y#_+72tg}4Y&imv<dy*=13u9$!Kb<g*b`fzjZ6mr$E{bLRc9OOZ(yV^HL|2~du zhcIfB4;7~$k3Y{~BXo&fKI#UGv^nRDx<>F#tX%NifDnvm$;-k};)dp1y6fn_8HB|< zUGvVK+p17<Ig$Wy`81$@64XloKssrXBTq)To2{M3hwallLtcIy!nD0OEA@4o!rp)G z+x8qTe6)3RF<xlq4Dar~UR-D+aFbm=>;{e3KDnn<l6(0xLWL28pi4_$5{4W%REkX3 z(JHQlMH`wnmu|B{$>~S}0G|fbZ%p@*mjVEnGV+S7Q>dV60-U!6<`WpXUQ*nU#ZeI4 zW8(9-@E((&yR;BPTkaj<#?QH(2k)!RJ4*D#6%#I%!=*ri`H4VUL{;;y18b5mHX+^} z5T5%F<OV~J8eHcwX?faB_+Bh=7*9pqD<qLubXk;Qk;nkibvaUCV!~ukE>a{OYWzHj z(>YH#PxMDZc%jZu2N31Xez$-LaFcWk;Ki}Qd(n%Z4L|dNk0|h?2Fi0$NPMZ;?^C4` zV-tT|Ht}ppCcI$b_d=rc&W85v!Z?|(RfgSM(7iYSk<lCif4tFTBrf9>$I8<a#`PS+ zdXujxFow$n0RY1`j+o5UMg#^nc(OQd3TKX?U)@AL0|Hk(HbNoff0~fu=fC|lfH~|D zz5&eXMy&vTo_E1V3lQqzf;gcq!vkG)^Gn*%v(NmsP9bs*1n3@6Eq`o?qN^)(wegN> zz*B3BdqQbQV4FOa=`Q*0$cCw%@N_{qVyIMnm@fI)SL+X&=85*^NvwIQ>?7o^s;4`X zA3Y|_sATa;sIJKMJoEVzp9-Z(HsA<P`+eieoi+Y27j4)4=V|PKySe;uKxY#r5G=t* zNUC&qTB5$vvq`8Z8Q{8L_wATHSBYHG)i#bwh@z$&@2R$I_F844&m&@?=^&8X#qP<& zxCh4;GzA}M#dYo#oH^hLP`x*|<rtS|Zb8uk=t^fGFW)j>h5S5(WoIM%;=BdBMWUj+ z&U~Z<B}WfWMQMI4fpEOeh#IV%0>$Fd5@kVs*EQ2Fa!1pAWJUi8nrTLFV3dk$KTMsH z1kE(NsAV8(_#OAAj;o5#hT6nWnO^7$TQb-p;{2JdV_U8s;1<CE2LZP*49W{&YTE|3 zvCnVcZ3HarGE|~>p6`{kOj36~?8S;!G3zad&)*pvjVwBMza2K#VD3&a0f8VQsO~{( zmh#h0CT4}2W2Px$CM#e_-C4!2>W}K;&amJQ1k8VaGmVWa^s)#qCW;@!0Cxc=s_iRT zOL}Edg<l&q@TWCty>DNik$IMpAtF``9vK5xqL-=+i!RMSSx<hsp-CIPh<MGwpBRfO z)D{YU1#oHpu|QMn|DV?&|Npr2mX!bxxa|iq;Da?yzQ(6#T*i*mbKBw<pM>onK)l6M zum{{q(w;t?80n=XHTFJ)t4$kE#?4FYK4EB<GuZM*lUD|H&E&e$bV+>qW9s08#Gex< z>=Wec)mR9LoEtyI0a3s4o5Nqgy;2@l#YnfTVp}I*KTG>fsTFiU2fRinbmHf1^trEs z&4N;v$}s_23xW%l;IJSnsF)uLDi-Ar<cALn;>z2BPhH4?g<CB>`xNv*e3V#s_`@GF z5sq+OU}Ev)J4NcM+?V)yt~OYWy{JHi9$AI2E`jO~*2diA-B${80`9X8gSje*U-GYP zIz*foq|cKW>6MLd$4P<;y?7SSqAKphoe1DTJcxwO*_5Y=8mU={ru28`6W|Gb!nDbQ zy=Z>aW=FQXdE?u4K1#xe$M6`c;U?UKAnw9lNCLO5P{k_FiWbb0CG5)L!F|T>Z`_t> z)HA2zSoS58Wt_o|S|)HKgTZP^<iljN`{1j5H6{Km$f7?5E|@Rr5AEcFe2q`fxQ=<o zQ!oW$&b;+7VM)u8?lLjb#K<K3pmV2OZppZ6;lme=Gua>G*QYd9nzrK<8zWq?E@sZm zOw+0ug02}X!>x&YiRU^b*O7P@TPWsg-{bdBaf2}ABTKGo)8HRR6(BsLHxfMd4lcM_ zr>C$Ah>rX*bAKy7N|GlY;vq($uk`giX2}wE<z5i`<ko`jD^a8MFScUhku3Ik%#QBk z1upBQ)L^wuMG#*0gcisO9>E2)@=6zLSh$>4fLO#zY*lIyz-k*ch|OjFt2r}es!B%q z7%?RgK2ly}BSIs-sI;{*y8??XI+Got=Z@Z{v6V8JYu`2o<0pu_7I@OLjKm9G`0MvP zl#mcGu{};C#v+IXe5J7v8T}^i79RKRPONth0vg{)7Fh_^S;i#d?tk(G7^3Ns)G!us zVo~Qbh<WztB9Piv!D%k*C10Y5J78s{fr6u8fBzPJJw(U8xJy`%Ee}4x)~DDh1D&XE zM13P00IP@WSkd`5<gE91^9~ODzy}$R2Gtj(26ZSb7cPPioO3dAM%m2GR^sA0SlV!F zaA$e)5ir!%M})C}|7JamfH*=PBc9y?3<LpjaMDR5Vbar@WBG&)f_U%J;01Q&k05TC zWLDgof;HzZ;H+Y-6Ce?Zn2M=l4~sdK$iOK*HMk+h>NmmML?f2?a2?w;c9KR;!N6G2 z<W~oYc_(&`OXc%r6^8Ew|1oAWi0Kx$!7d<o6aKH+gAX&4bscakI|0rB?s$vk&4H^B z0-To=Y~O3yoMh$jMJfV4Pku9!^n~3DnBSDM3<~hKE-aLPpvI0FT`G)A9v9mCyl?fR zL<y|3Sm$a(VPA7g!msDfFXCTQO4}bSc=1wI@XCc^WLa=?%!yY=DCaAty&9QpNr4=y z85VZy?!rxO;}>45V$vsr?chcP)n!utz#?hJeBpx&67;$+%EPIY1lx3*G5^VelCZk1 zmc*8Dmjx9IVM!!ke^v41fQz_v%Kzq#9b4&=uh(eJ=oH~<{YnWgVX@A)H28+C#j1*p zz5V}<b;>5QJR;c2hZV2*R&BCKl|z-Vuv>OljA;M9t-wkpg5pxKPT4na-^A7*+~;hE zNnGmN1|J#opDZXzR#&-|*b?l5>eoVitJWz?7T_W-<<zqWnMgps6x5wP@<0oQ=t~mg zkf8Zfw$MGL{Qi59<wM?kpr<(s|B|}@))KYfj3tTu3{raD6lv}6pGDXQlwRhA_nn@? z2R$A`m}m`g9TcagysK#b5c4ujj4;uE%EHlYNnE2F3g3dJwAsZ@?nE0+m@wrwuQ=w3 z6x=4*=W6H~#bGfQ<mRibG23YN6mx{{U>f%|^6vpf`0HE<E=g|91#qU1X)twBm_twf zy71y+RWRoRi!Eem&g2#I;|^wHHdb*YTsAW-m^wl_+HozitnR|<DMK{kg$-aORw5Zs zk%VNVV=gjV9FsNmA=}vxFk}C=+-y2i4UD!#bHS<q*aqSn4<jT5!$^<|UCTgNt{9oW zW%P29xeSZp+iwHm@ED<gKFTc=4TKsRv6m}gUjmqLu8NIL{J<SA7zy0F0TY#UJb(|S z6!rpqdrav(csSz(cDijKYU}^LDRQ`j&*D-*_)+lh|J^V=d6KwAOHKUmf?}ypeM=wJ z$xci*evvpP60I%ykqr;>a8{LpK=#n!h_Qs$A%LraU3lFVf-rU&iFLOU#{X;g#9$pv zaGPWR`fl>;3=+s~PylFEJH)DpPIgYf<-Il;kGawbh(YT@jD-$942^y!77YjZ;VtW> zI8>k+#(NZ+J17#}WN(w~+^JX5xZ=r<0&z%O$kl)h<T8KIMq{D@+~V2Z2_P7?`<oVC z;}VVfh{VMI2byOrXJg6vi2mEb$PEtdCr`htH-H$%CW@{Mldva#a|)D&H6y@%*5F|e z-T+23oX5o`Sj=q<GO?WhAre@OEC!Z9-`hJHH=g`@UTMj2zChl2Du4jO`&<a$&c&cL z!4R9lc+8X{dAx~{-6wsmVQ~M2GS*{P)E<+5#(s|l5R6RrA`m?e6VOkghxP{EYMmC2 z9~{s?vUiNh-=e<#hz=c4{ig7i*WNNobnZPcOmH@zd!}VhCG3eyB_<KX7}Q<~|L3$F z=SlYMQTbjgGd{@ppp6XvWHoS~F4A|9XM^6@$5@{mo4S#~X%1|fR@&HH-u;gm0|#Qs z1q=8ap^x@SV&`t%$3Pnr{wL9uAZ>6VlBd*oQlYAsRcXEt=|xHJ+e94R%ibY%B6dIo zYvjK%8{)(S>x~;iOt!l)+2aNH-&E`iA`R`sEdCHF3_pmCKT806ueSXf#1qHEpBj2L zfRpaQ3cS#l?S8NXqWebXup5F(A@NH4=XY<!^WRdl2vx6=*^1s(;EI*6?>Q$ROw^{& z=|r!IwBnH>vU4p?uEAQGG+?^4F|S$ApgL7g`W~MJmb9A_BC%Drq3*lw0YeMs<Pbkk zRf;?Rl>j_ZrVTfjFxO1J$mRiuECvnN6@EOkrJ?M*d80MRa8`;JG4m%oXWH3iSE6(- zA_sdcA+*y!4rhT>NHHqTkt&Ef0!lqV7<Lkjs)ffF$2@Ov3yWi{YH3*<_go<dP|s<f z)Z`74bfSi`3NwNBF*|2_lCCrnAv-Qi;)5n-M6myiW^Xz-kzZqFF5U#=lY(^FcB#ZY zmNY-&g$qR~fiq<y?WudaMqW)#hBws^wG|YU?YWv8Cg<{u&?@tKwj{|Ez_JLXu7%1* z<o1FEmk;yP8p-Ztf^z<9>%k8~U)nB-BKEuYEw8Kr;m9(`8o4h}%k@Tf<HJu%l*^G9 zFxo)sTdcR9k`cKr>`6FXpLf%~YNO5V{^e-f&ziSzG2htrPZyZ+yTZ{EXa37!UFK|+ zV6(+U=bftTV&x`=2ei#dY3i+#(sFESe2zkjh~<L`?aZ1_$D1oVkyjir>enL7rw64n zi_i-aQjET`aUGTuT7Qqq>3&nYH&k<4n=BEHw)g<QA@6ZmDY9--sM&qkx0PI^E{|}9 zp!1UdhvFoFpQmmZ<}~^(`Km7`2-cFbmcQ5rUV+|}dVLsL9|*QHOlp!L+UvN3Mg7>5 zIFSWv#o;?RHvI#{AW({5#s~p(dkb)O13>r_WOMjfdiH-=xo}e*5$bKoN799ykm`1( zXS1Q`XjC+};mU`T_BX<`X}>)z;Z=Y)5g@;St|}rK)wUw+L{wsm;3mb07|cnqbrmMD zz=73YS$Z7qg6+`7>N0alm8BTu!MjHCxLi=2Z_Z#KQ+EsY%#>2!CA==n`{lRx_Irgl zOj9}@$^oJ;zvQXr2qegn`<n+SEPN_YXAKF7C^OHTMN~+eC=2F&tj<u<RMwsC4iw)a zt<6o&G0H7jO$-Ty%Iadb-J0o0GGt&GQAC!HgO)$urXnItYw)7DS_c;Pf*7;w84L=L zNfXShsLlB&LCrXzM@h;Y;P>}HWg|oM(A8RpvuyQ&`eM%`Cq-16RbK9JJ18A*F8~;v zq$q`(`hrrB;i#q8572N13Q;ltMtDF^+{`MJ_DT{n`B`n5_|O|GTT+rWtmzH-my;c3 z!gT1kyo7Aix&xRg#6W!_A!~U<EL9*+9njDUrtY{PvJutxYVQmVX1${?ScZg60`*<m z*D9v+6&jT6C2~`fNi&V}q47z;siJHDXt%#wdNZl2SnxvU?W-sX+YBnPu0;NVYUkU; zWn@k9sG^8yCW#UwMpl+`pf77i$`<i9-7asAujog6Bhap-b{t9alg(+74M2SNFHrSa zVpV+Ig`BKhERUh+;@S|^e$~Q@LTd-4Y=KOSUrC56;TUY$YE|oN6SC=Cb>y+y9Dp$( zv|UqAYoP`JBPGh{Wt`kI?uOScC(w=c&+PQ5Yer#hMB8vWLVYYZ)WNy}4o)Oz@>a%y zJEuPn38=_=38k3-RJ3CZ1d{h2C=OZ6G4$U!F+}E|F`y4K*J9?h^dT#FX!ScrsY7R- z95axFVo~H|)MT&o?g6Bhmn#NiRTtolkc0gT&_^(4Gy#Szb5$e(y9BcnyLsaM5+lfD z>POtqN8y$(J6G2xIH6+^tc*P{gd>WG1itZc2GD;RICA!J0W0BFD>QdaOay+2jdL7u z28d?VdGGiXv8gcL1F?nW3TdI7hcJGfhl3f3lDvnt1Kw2P;6j=EnR3jukiX$t=S<<` z-oa=ssxDafJT9x)EYleNDkz9{1Z#bVksTL64Hte_GS`rXe3m0t*B$qLO)1Y()}2fy zN4+q6_Z$x}68=`YytZsE3pgRQj|yd{?izgMYb7aI{&-HqrE@C8MsmMnFQW4p?A-`! zQ`{JXPKASPhPGr_USXI&lCOzi1*%_f*`FD$AK>APA-I#>z=`@$#>YH)@$VJwLK)mt z5%-!To-8V7xK&{DA|kl|C(U{5;6Wij@a6BMt(onpUBo<G=ANj|D%G&tB<cqZd}IsF zt?2F>&-9b<#P_mF@hF>pI0@ohAx!rVvI*M6qE%P9;ik&hc-%Axgc2GYdexi?UdI-b zc7*&?a#lRPnyUoE=8DAEi?0qasu~H?JP}5lnIm2G%@9={wyCB*Ypn!!CaK7J0<}2n z2Xw>ki!#1+5PJOik^g+Ou*|=3p}sh72Z<yzub({QNS*h$z8w3}#>E)q_pjbr#XIk{ zBd0}I_n`4k-f})w_jTsq4F+^Bd4XL^n?sl|dDT{NzI9brKodPFraKXP-)zFl`zKky z0k2@EsBty>mnJt3PtU%dI3Se;pR9x*qzZ8!I_8uyQ{sG03h5I=sq$6S1?}c(v)VEz zVO!w|vNgdHcg9YnoplIx*Bn>4>*8tly&^?pD^W6za+O>5MdO6Nqf-!GSmNdbiS7Qe zW~WW<|58FbLuQe3Xg7XNIT7WYD{+4Lkri4vd2z)_3ldy<$WXGwMU`7tS&GXkM@gzw zN-L;9S@o63YA8BXWwD^+#8FaJ0=PtpkP;_GuAxShBuUX~s|%x^T9wpam(oTeC~v9> zUwhS@Z!JYp-D*rVy@{>9Pf2|*6#NY$G*OkbbCWjf`I0`Dxo?}G`I?)EdC6PMyyYiu z-V1=3Z|sJhkM<$XFTzpgH%Bq%4=1qZFA*B%2aKY%(FM2r^&;&7188e+Sm_=%gS!q6 zsoi6zBa_5IxBHwIdchaG$P2&lMP1ZE7Jam%FZsB~UCO;a>K?wg$KNCO>q$5A{-eL0 zp90R%SFKd#_uFUUs|c-9cU7T{q*oo<to3R@f9SYc(BFEm2DDTE)iGf38la(HV^Y#< zYW+dCTl6vU7RZK8k#^f%6b~Lnixpc8C}^>W$i-n|2EoAzDqVVs3X}y?p*Fk*4N){| zjH+3CG@ZI)>(v+6kfD-|m@37L*`$^%CAZ>83Trk}I_^~2&bUy#s~(o>hLO@d^QLq^ z_z?We@9BR&=Ud~#7hdyX7gx&?2B~f0NwUT|FluEigNS8ug)p7~1gytG2#2x=!g10N zPLa-3h75$$l@M^XQwT3Q%gA{b5#I10BmcXC@V;w|Tz3oMGj|wy>KP+1y+ruMD@I;> zjYvhhm}OdRL1Y|^hD`E8G$3!L^Jxb}j?y4dyec6|R5gK?R)i=!2L0t%ifC<I8mdV^ zLz^0;ptJQe8#X-45t?8)Vhp<UCN^FAATGM}QEQlQeFw^BoH(WS^2m5XB#@8+jSz^m zi6(f*nh~J|*|An^=)#9?V#j*fi3v%Vmlj))7aTBzHFLG2*0vnCRXbsC%Smz*ZPWIn z_DSquvT6HM_d3*C`?Ph`v5+p;xej&JGi|-~&9wfoli0-urVSTv9U5$K+J+mRX(Nr# zw26o#cDvaTdk}eTn~OeT&tpttFXBzHPYDP1E!h-@CwR^{M}Z4m1<%!7jT#MZyx^t| zjBzhX<J<>j#C_4nc>v}Z55gVi5mF}cNU7s|GR@RHUdf0rQZb1qYMI0{kVd?SbaK8& z^Ekg|Y$|@;_(XmKaVmbx)Y_XizxF8TYl}fL&wr85@)q*oh`>FpFcs8*j-UfiBWU1g zSq6PpIfiU{Cs1GuL4rdsp<M|RRxd(C*CIuSfnvH6D>i4axZohZg#-yXLqWnY&`ORF z!3na`DCpn}Q^^G`xWRXYfDk+ob3BoPH%jnD%?ZM4fsI`$L|$UH{L~x;y{D$`L7~EO z^A)v9LsKqZZL8`$?u~l+sr8B)O)6<Lqq5PGsz!%Z_heOV!48e7J(_xO-1o#j%?11Q zrOv}9E*j{wTWA%Yp_h4%(V6!aQ?D%*yus?o2b|XYXgTqLFy@=pgzqHfR%b;@0Sx67 z0^<x+g>yudxq_-HSE10j0mkGegc`5GqGfY}q+L#jPE6C5m=;(%hhB`wASz&-5Hm@W zFikRJ7L~J)Sn{aiz%Sw~DB>!(sSvPk;NX1#3E9d&Q0;`lHnj(?C*a|G8WFLn14!MF zky{Cu)XpK4-bO|3>Xz(!?#Qj@UwQS!D#(V?SRF=lwk$0<vbAP=qP@Bt9oe4g%#o`v z;cG*c3XJxkF=LgAjQ5~PlNHL%RH!gt;gf|bzHy+Qua@ii&%t_Xt@fTZYZ2es$kXU( zwicT?{x}!&x7KW(x^iG)n;S6D7|vh|Lx!3gHryB<p}q+djm?^?je=f`fsu`g*}|g5 zPL?cn#=`1^jolg7N<=`|(5lrW5m7^8l8BVFp)j8R03bUg20gkGhY3ANfF6BGf&oKG z4m~E43f9ad9rR%#X<%ZfqzgBeEECdal^bi;S##uAAG__%nltBybKw$Y%PUj<{Of9; zz-$BwDnPK{Y=j7@t5Bf@3lmnTa1nJCDXQ+GMQ0;MOx?wb%|@KKx{DWIxC9AJ1O?4Q zqQqjrz={P2&jS)FduW&(VPT6#K+FLNIeSTx8jpff6e?Qwn3y?XW9Ni}+bBG|{G}*K z*&^i)R;e;&iK-f>T3(TAz*CkAld=rh0<|fszYZmh)Qyn4UZe);N2$L7)W#S@E5Z<Z zz7DC)&p+09iXsR^1!z)*r~zFrbIIp1k9=P9%I7_wT)qp8j*M2>sc|FfsJZA{h!(e4 z+tSz(XUl2aam(Y4SBO7;B$%M>gj;Pr(L`M&p16}FlXQ`E(oWi#to`H|@RXp+03c8Z z;6S0805(B40ge{!phLI87RJGZRgN{gV9&9Z6X!}Uyi54-X~CC&n*s#Z3ldUg2SiJI zkTc;Z;V^b00;glAa1*Dcgmd`S&J(uf0&%sAB+XqSEx0T-T%%0gke9fpFojTB4ymFb zg|=7*WEl)h8?qI)=Bbi0&*59~5;gG_t=c=4;WJ_QLe$`^>YQ)H^{Ui{YIQk{q={xN zssFVme(Fg5CTsLZcdAueqjv47PMxVPU0v$d)3#oHt?Sp{wgCg(!NJuSG}yXf!>yyE z2PtXJI{92o2o&Lu9SRO2C`53QLV}u1A%jG&kb@`{D%deosNu|9p#v8d3Jsj?ROrHm zrCq&X!=|@9cvR{ys<~Kk2?q%U9*8MVq@IwGLm*~B2u?wq^wb>cus}&jP@1zyS*5>K z)T>k(lH`S@^7EE~h85r;1+s-EsGM||oDA4XnTo39C<(c6^?DI=3X$p!q1PK#o?5S> zU;|dF5+_xKo41*$%vR#WHZ=ux>dNdSN$k~<+OI8fNN4IWS!>SeN*r|!rvYWoLsOSA ziTmvEnBT%XL3kmq_k%nXOWM*#EN!J79P%I!RH+&Hf>U$y1EH1_070!N5QN5t7)Ikl zf(WW+Kyd=c88>9OhbxA76hF-I9R3J+o&e180+9%KlQEd!Z5ATK7o^hhr5zerMOliq zQ=){iEw++yyKOYMLmiG6on_&Y|5&){8Vh&aVd1G~EWGlH#nea_g|z82ok5n`&nhcQ z8YwtRaugbYoQ1((SQR1A0%?#@yehHZLscPAQh98aRuSXnL}#@3F&HktQbsG_K!kBK z9RXVI!SL|$y7gEO4Rn%@-BE2f-bAht<D%mNR_vTaP6jST3??Vtz*Mjh(=do-Bvv4h z*kLmtzYnC;&FYwJC(#z$t0g*0k4(s864uxwOY~Zs`oc8a&mM*oVvBRuNzKbFE>hYh z1Azn#c0s-t;)UGS_ysJ$A_@LP#+$XwObX0|EzQj=x{cc;<`8*yaaVcKZ*hqsTpEjV zIIb{5hngYB)q$ag8)Y=sch_)Jh7)hYXxrF3U3N5S)()b_0Bn|y+pL{<&upB;or;HD zHpautY#f21LMw(+9{<K><6#(1Op>=Q(vUV6p^o!XI`cK85#6b2c7qjHjT&2Q#jeYk z4W@-%d}W<kTOzS$dZ9-04u?Jl9rm?@E>mJsetFe`smwtS^FV1-jO5px(HKR`W^p8v z#pzyfnK$!BqhGG!$IUwzB#d>ch64)?_PnmF><(Ng-XqfrJ!O$j)0`jFvTiUWl8~%r zC6gv3NRS}Wa&}97k;R}SMK8BNltB0ZyVcn@R<I`4vWAHCg&TjBA=qz*$5z5L{9{=i zRJ4ee|5+pmN;iS<W(ZbcXsps890qWufZ~D%(LRR=OU5pm3J)qdMT;=3*xbQ}7*rui zXX?+h^?gywBeGf22jMY0e$0)y5ePa>h=`}%5Oa6#0bdy`8u?zBMbGTi#Ar{xkC9BI zCr(TqjH8S-y=r<Ddd1bpCF{DlIg1Nz=}B8Z#EDvH-EA9QN-!;7Iq@TbW|A3g6R(j` zkADfN-&S$M@@!(@;<lY+UqPs3k!0*CIk2Z>MOjUKnPXByVS?nqLp;nw?!!njSGp2O zHZHg8kjyxdxli#FGfsKd?;nV5!U2VF6pq+>fa1~D6e`^Dh{CJkO+_qVi(_jP6Zp_$ z_(+g~&sgDEK4)I*Cj^BBVF0u9Xj7QpP8MCpcrgrju?p_NL&KE3RW6pR6dyATx=Izz z#Dbh@OvS)p#GpL}u9;WpXbRKYDH^UudyOnG1_{@6n`G#R8KkbH3)FQ3-Dr4AW8DOo zh7cEItVp~_$JH724vD^Cw4~Wv!t)qZ|GA*~B9<3|DHHaT>?z$94e^u7W@*?^495!A z#N@czz}TuDT;rBLl6u-21H;C!Lra<QrfiRm717OlTSLx}2pz112~`F_SYru8DV=Xg zP(rg^hMBOv`H-;ym8(U=qDTpgFq+6EI(efI1iBl4HW?IDRgC*l-Nczg4osOa<%aZY zq}762oU7PlxW<N&81jOV8!722@H_@;@&Zj9vBYQ?D|S4|jwjg-DocWkXjB6=NP*Uv zA-W8$FfBr}q`}lo6!xz9RNEi^`jMDG(<UR(Rx>kep>Et*wyklKBz?wwn?tc+LM;>Z z6-3lkuuvdB#apUT!>lW)=%ApgVm^RMsZu<~+H5Vj?x=3Q@M+JS-znrKV`mas!-T9( z5@njADQe0@>3=!W@FP?JyR(?bvQb=30q<$Y;P=G8mn7ZTzCNl^8;UW)?B3^23*#7! zHk(UN`_LmhaHCTZDQW8V_RM-x%Kk%EI|3g&MP0vM_<{34`BxCYe8xuw_xa#@NX=aj z(S~+vr&=shR_&5C1bmC(?0VV{4XuO|xqbc9>`!qB(yBPmVx0=TI}byK9<;1bZwH>a zl{tpBdG%0^Y`tTUXfd-WI(ux}du)4Vk8RtwZQHhO+qP}n_PqH{o%8N_uWoAn=p<`p zRl1UNrztlcWzQGc6tSe(qdVU`nnl5bU|!PI+*l4DwcnL)RqJ&vw3^71=JaEp3tGpn z0F%2Y0^6!=HL*KO(wOnQ7>KE-AQ|@WgiQG|4?;x!ABKIgz?ey*+q2-5+JoJ=@td>$ zL=ecdN=uNkBJ+=_-Yl#kZITUgz;1)-2v+ixUpU-RxywI0?B=VR^1@Q81ec~cceU4I zD*ZmdriXH2xcj6RBfd@DV%{S}`<IzjCURe`DT46$0%6t-KRnFKL<q?uUT-12b&MG+ zj|%z}NuimTBVD$HEtlJ-0M;?76%&RdC_+C9AQW|~=E-N4v?B#45~mz^Pi9z;y!?{x z-0lWZ8AsW-$+~<S2V}mBCLXjVvWg%%WDb+<HX-igo|2%*oR=YsrPrllrsvbP_jW#< zsum|jhrzPaMTLx|TLWejV~BFuqcc3@(~ojg=SapvOE_u{FRpLoBJt#Bnu|bw#*;A1 zI*PXYD%S>YVgVf!@1Jt=?ZjkF&&%-#_b`nS>k5hm@v^?t`Ldty2no)MFXqar!pjM~ z$Wg;!uEaZcZMzeQ4SMEuqSB6VdRc=DRNkWl4u34%Z--vO3x%;Ie(@Svxz;^3^(wa9 zdvVQDzUrpdK1+qu@t{N`3LTGvLkv<boqHxZA%c`-@RVR0MSwdy%gag}qpGc`B3)j( z&EgUmDdL{`_pJGGqB805^g~igx5{P?oF?+nH4E27r?kTSGtbeTH1G3#3?ICqtYz3q z+3ymA30}8jvFg42kRs-$D&7(mQn{GJnxf11mV1x&ZtWIU;v4;u!uLe^#n|<+A5uox zh8bABXqcJx&rV@^<v-;P75UNIf<TCeNlZtS3bJ5?Dh0i%f!oJP+GC94Zse1Gm$!qU z4VUQ@_L7)s0jBnz5fT^-r!IqLE~7}BvtDE!sTL@?NdyS?HScZLj69gm&`Zim+IPB8 zFIX=KV9j#V&T1;}q3CXQj#iK;_Fj-yf#A;EiiDh7LcLD<&8lazsmLL{oq*=is!Z%z zl$07$7T%?=@C#pjob2)WnHJp-*z-FfT(ukSM9GCJ9AuCv7%QX;xRDeV!&Uk9$};M9 zNO4Y2nSYUSs9T8zl={t?iAD(GB?Xi=CB>S#Ai%&xtObg;SQI}lSA@HvoF6|9-Bd@Y z0+NKishBAix7>+Yia}Lahq!!}ecqJgSWDHQM*E@!a@lYcgCM26<hiHk#O6XLn<N{b zOECj`Mizi5*f<N7QwBngv;5c3B<j~>o%N}RPa%UsTEmIHhSRS>AE9;mz?g+9>tpiJ zOv16+$6DG5cB0z;Mb4OM+Dw{Gm)dQ0W!PbfcI|k<JZ6m5Zep<7T*BrcQnn#OhB@Ik zZp>Pf8~1twgHi&HWoh108<#>h<78(&#~DpA8{um3#$WToJ=p+(nomZU@iTt!(sDqY zcup%EI#ZF?-G&RriVIxA3?+|YEXhiFh?Xe_2L*xX>gkP*Q**oKxB0s#c#5thdwBMO zdG5jmkMQ{ko3>;vaU<d0C95<k0zMI>>BT{V<x^q>2S7M-sZohWDt0W9G2P?1G94<1 z#)-G5V65S36@a{76omA_Eylt9^M+kSM~J9pAFAIvu!-h`r6D*8Am{)wK|PsSTq}m# z99~P^qTdWb!K|-l8%B+)BW{Nrj-&hD!wno9-bUA-=*Li!_n;cJt$5IEw!fJK>a*mH zt`-QRz9rh?|D9;4<SpmFEkjgOH3twUyi*0VUR;ANOcTYcLYefu!ntl@LMYQa_8Z$` zG%xgFaAA7kgZ<Kol%`ir<O`*wE*D&QxC@#O9!|elS2omyM_EI>+f~cFZHeeL9RxtX zQ8+~6PY2#ys6(L6b+*s0PC8sAw1Q-U5mlV;K32Gg3YtT+gZS9uO)xyA*TQ);9j^yG zW7Q)%xJGYpQZpRxyk;jk0L@@t9@I&nS|JadGC(Ugo97^W;DrRNshQA+jHJHjP@6#f zthi9^2r@a}vkG3b0@*lyV(}#M7rr1Fr8RWJlv$3pU$2)Edusy-wKW6U?Xmxg4?_k< zv~CBWi%cjQeq`*U%$+Sdh8)c<8vtcx&VJ%w>dr~?zrx7m+UD{qn#Yq9Ef`M{WH83~ zhX+Ud1!-+2<M*M=AB+9N`80rW3oe^DD7aX1kmV?0yNIvQ&y`DB^jnL*30rg>H#S6& z=7l;a#&%F&O0nYVUNK9g==CO2x{a!$P%KmplQ$aolHF5KVgX$vZj`Q$vb-SN8X`a1 z97e3K&vDIffoIzzQVASf#qy0B2Fn4lbwOo%KSL=W=}}x)9*Gmy^a9nEv57AFnBL5K zzw+k~Y9nMrE+8oXR`g3}M!e|e=lN<?{_GZ2RD*6}3%>E-Z<D{I?fZ30W5;aD*4ZA2 z#19m#kS{_x+{6#Z&lLfM4?$C215GK3w*Qx<(wtIUJ^)#y`d89uJh?#b0t6KlpjRM< z0Q_`VWq9aMZ=^QF-@sT}M1JtUUVdc$zS#=#d+_|)G^GqnUX^}yN#q*Q!d2*7`S2FU zRO<Nf;O@zu@ItZv&3wEPMt@!m*AW>2K*AHr6!OHQ-jk4>pj_7aO^%wA(?9>YtvjA3 zZ!5_joXXfjA+x{#qf<CetK8C}_<Fds)T%k^^890{yzDjwQe~aEH=VSpw<F4<p~Hgh zGEZ)j*~Fd$w)~A)-~|UD?GU}wnBaol`t3ktOhYC2^qdjo?3D(S))sb;P7Fc4vS7r% z!6JWdr~!2i1=Vx0q=oz>cEfhPG3D2Xx!uk59>sf7N;^JeOd{f$Iq_y;zh+q((;xH$ z>Qe0T2mra_Z;VhRgaMognP8@k1BkZ%x@+I@di<_U&_kA$Gx_7~oitP3Me}sVsSn5b zlKk<ci(p)E%K8xhRVess6?P5@^bWk;+U@l=WY+4(etWXpc`e-e(4h0F-ou=oFWCmE zRK8TIRH6-3B`lR*Q3O#T{aWp9lMf4(?7TKGwtcQ4a@coA3ec9waHKSc9K27gyN_NI zAcq6jk1wwi_}x60aqTQcMXH&Y?tn(X3i>5<$|n#b=Ph_E#q?Vohw@GRmpe|a<K-S> zFk$r50#(nlt9*wCK+d)Q2*At}fU+r_U5U+BP78I+J)!ys3kPr){#k|P<RMw7P=!Px zSI$>Vv&U0>Eo5*{I$y{cOiPgbo5o^*x|ZpNtjOdDO?8P#dF{_p;5PI9JXP;yufIH2 zh50PKx;X3Nc?fDgN;D>)*=QF%15e}%IX8@GpOYuaB6F`u#;9m2)B|Vo)b<ah=aPo3 zmsBymGj3%M)~54m+T#rpnL@r&u#Dk|`?a*6G>Q9TzryBQp-4SS-RYd!w6jb>4tIOn zg_8WOR=&vXkUr7zw9MxU5008mgU$(s?Emb!gz?j)3K<{xM`r!SR68UIeSDZSeg>;y zs(SVZvQpDibk$X^rd9*}@A3pm7cb-NFB?45b{pwQjyEmlP5xQO93?#VKkvZKd<1>` z$2MCaTN43xnRW{Ft2_t~jc(pVDK2@M{6WFEBv4JSgLd>;*orlFPet!3*Qu>Yq3Efo zRO<cx!*!7nAvQt2vlIyQ5NlLAe4hoW-_tTI?DRG4X-{Z{H-_@g3Ij)Q;1@VBqL}N! zC1I6FGt2pHwXP;&67NR$7|Z1`b_{~q<7Flp(2F@Ec984SXjbL&U5+6Hzev>Si+T`a zPx3wu8R~7}m+g0+;TM1I6)2nMx<?o1XoN;jOLFQ}?OWeswrFFjG6$S1G-4DGj+}`& zBe$^j=a><;FQBLX9F=(+x^c2BNuYs_AXSUe$vDOR4lcO$&LFLQIPjRyJZaK+xU@Ip z6Mxo4A%zp9IiT&eLkK_bd9J7K;6g(hCV{48L_)QZ>XGOpe>IJ?gb2o<QU$UFg~14h z^H(Gkj>2F?5LA*%|NkMswQm7s2l7vz5`jMA{C;KAo!xVVG-f+Ftzkn9rKW)+cjTp% z^krt|lPhV5(ah#886g)eb5Db*Oni352VTbO{zwm0EaECi86s8TM&88q*@m0-pIla$ zAmku;ee__yQh4Dx@Xt{RKguHiP-D7@vanz@K`}~7j;=ma28~J<PHiMmehf5uGmf1q zjTmiMX&P%>ZEo*Be1G*2<T_C_D45-X7tLlXrBcvp7G6IF*S59KT3ugoq8`LI@w1jh zrATXtJ4By%mF`h}0pV@Qo5d>NuI{QLWYFOrUUM&&lybgdDOUi9*aCu~2WZ0}+((h) z%@~d2rqV?Cgak%<`>Sm;u2bzv;ic05dsY7577fOm+IOvw>1km>&jT)~y*@`<2_?hW zqOO=~k}W7BQ@Gn~xxIChW5%Ia6%G!4Z!E$=+qvGkWxc3T7%d(qXa#rs>-gQl4v5(= zmL_EV<H#oz*t3;Z<_L#w;kF$^&k|@;6y>To6E#X_!@K=K>NDqVX#=1%$x#HE0@S3X zm^$&r)z#+CV1yIa^qbc1(&^yGTVur+*acf~yRb7gH@P}JKLP#u`w8+D6)*G2pUtt+ zd}HLeJSl+#mBR>NA<U|pIJqNl<PR9fWx}L~eF*7ZG2Oqc`;ASVTuIYrr_zzyj*~A5 zHUd`C8^EJOF~vGyNUNys0m*=YQ}@}aydy7DUAEoFp31&uqRKtz3!3+=q#d+QL*U5r z_%lwMV{YoaXsUOhB+UvkA<qE6u9a$O7fE42gsYpA6CnxG_1Kx`ZvDy3j40F)DKI%u zSzu|n|NQ;kjN};XL5r(DJrQT!&%+uwohdcEc?3h^i4+Rg0WlPw@@EaS-S5Xd|9wCQ z44cZk&iF;@0uR~x7n%kiDVj$qm$0Hs88g3GHE{yK|9A7RU!bAT5y(3o9kuG<&_D}6 zuc-M{I}F1$ts4?=o<ed0z8sPh)9I={<-fiUpGHW7AMEc^z6B;Pc_2<rrem1}^B7h_ zL}gYBvii2@d?XYYFPOU(w5~#83CiW+Z3jifOoZgp!YUMBGXF{0&Lcw?H9XDh1v_Ng z8c1mBMYpE}7)FM*_|NosQ~K%-(&aDq>28Ey>b)2s&B*f*(zAXtorBk}y;32e^DYvi zU}B5ej5BoMB68*sCYf`I7go%h_a6@Hqk4_@D~S27DkXUHU-Q#XJr`B{o*J|SzyU@; z05IY$p%jVFcoyO$I~w(|j|y?ybu-GfJHeC#?UCD6Q@`1~X}GhT&}R#<k{MW)R4S;| z8K1_58B>a3%^fr?-GStdTt|3ou%|?K0!U%&!j_oFmtOy-xC}-6leS<h>ydD~3yO-< z&BtZ}5)(H4Kykhi3ZXU49nx_InVKKK%&Muo=Co#-J@bQpUliw{pI*sj6D>EQJ2e;G z#c_}doKM-4gu-T{<k8fq(o&}9qU$N<1<~AQA-#fBItv~~0u#p?kn!M$nAmKsa=-g9 zKdT=jnmc$#(5%d2<)H7RaQ@&`Fz-4pa-y5TSVj!sc^-0^MyVVKr?uvsbgE)~g0Uh^ zfBbNk3$_=1ci%ea1QBJUu~kz0mN!_kmieT#RPou&P9#Hmvm`^>^CUw~G*v@pb!9{L z^<_g&Hnv0N_U1!sw?9-G))nl(7Dy;ookrUI%`@4=HVsRV2cuGP<4zR>lRQ>AlRE!# z<Fb4TleT%)hV_wh<0_duldg8m6DJt46Dew^sSb4u9PccrDe+ZsLd*QHHPhy{IH9n5 z$j)I+_?$YGu%5z-{@C2K<<)xqf8N+_lib#uB+wv6{lt`M;6~#iW%5V0OTIBJB&!f~ zp)7sJx5vo=<|KnoUJgf&hVk%T9W!o;Xr6ru9(!oq<q;gChd3{-3idWJ>|!rl)H4Ae zXRi;Z-C2&ZFB!1NC=F$NO2|5MLFN?Q#WEkAdV}wsEi2CtOLCku!4hmIoePjNR-)7= zT_vX{E!9b%6_N|s(wW)pI$BuOcZC?54^76dJk^8;A6{K&S|?8?_N`cx@1`OX&&x8& zI3UCh_~xp`<unzJr^gVW$!LtmZViTMa5~*@kcf#nU!y~u(HM%2kBCDQP{sUKDa`!N z3K995j{Qe@Xymj4r*G(e<15hCeaWHiRzg~TmqptTTATAT=hpt6JUXr@Z4I^m+3=d7 zLOlV?oF|hIk$-Nhyf3m2L6sheriHzdhUH)IC(R2YEZ4*r3`CE`7YfD(5mzjo%M}X2 z1rnA_t<xO}#sQPoY`xnZ3dsTB;|~mjCl<~G7LzX=i!I14Ev(EhuP!U9DyS&2(KR)+ z)HgS_)-yA*GO#%5%_H;}k<R3Bxb82aT(RD4e>hx=P|@lBdL0p1U}=87EEqCwoa0NO zwiJT%f~Fe;H;|+of_9*)9fY*7tQ~^&Xx{TBlx92dr?hT8@FU&0>j%^Mye0MJ^#>;j z#370mMHG#9<ApTi+NUR*=S%n#ELlH#3?VbNLUW~D+TSSR(Ik^LzKrxwDLT7Cm6$>) zZTyK3PbqKaJ-_C?_(!qGe5q6!Cmmi+fxt|iF?}iXSO|f+AdIFMwXu}AZV**uVn4h@ zDU2vtP`=7c3oD)-o>Kq~awu_D9P7$)Rt#<HaaIEF<IKdDFBsi8P;MCA#9yp9)i_w~ zIMu{Y2)1^RffD-=K7_rW!lJUFPfm(?VIDsqifP>RATSi3SiO=BB3?4ypR#}oz7CBC zA`!n#K|yN(jpq{rKUQH@uh-CzShaTV!5SehwtzPbl9|JFHa~=07~R01+&I;M4{KdN z0_WLr5DTv#oYX%|k{}&D`4=M+YQy%*weg0^b?MBNMmQI1y(H(Z!+7atc}heiG;PpE zM6^?Ln$)tLsODkujgpj&^6VVt2JJOq?xiB`)h^2;pc}G1FgZV^>oG{YW@RE<)!!+? z0;RRV=KtX_Nu+++<K<3}e1WD=R6i$GfA0pe1z2G@*h5=O#K(jo#AKJkn(x#pUNb0i z5T#IcB4r4AU8_Fs#VovODD@sRrdCB=fBfFf9r1B*e?6?^K4mve^+X~gSLQqvI&B*r zwEuN;1pom3|I~c{rw0AsK<sbWHlqK)xqkpmOPZnZ-JlzgY*;N?N*sy@{^w=%{{rxV z0eyu5bOG@Hr#Tj2`!3ZAcJ{yO3;^%|fB?QV?C)G2s45Wrs-dEz@v^dWv-I72PRbpc z$@6?AG+XYE=M6eNemPU|9~bj{KC1ATz|emEyWm8SQGNTjzyx8EdGn{xBoR}4_pgW; zzn*xx=+d#sQ?=N%q4AZ!CPmNuQ|rgx6C&1iiZvIk;w{hgztlBi$=C$|ADECV7>P)T zk!l1gpQt80Ciz>3W}=OUW=DzVTLH-KnGp!#&cy-aL@XPlbXU9#KR<0ZG<m`u0p@pT zWs(Hqyxjae1HFUYeI$59goN1mI0aAV^Pi3Aqz~(oZX|g6Ut--D7!+lIfd=<K3~Bv7 z^;<9)hZMVl#qzUwKVv$ScZ){xX_-mDEB2k&pv)(+F1Y4LaSjNUY=0~aH}clD<lQJy z;44=QvT^y5$`4Di?nee_qZzPJf-$vvli5n1LW=c2_oua*9bZ0y;HAZutv|m1YgUvL zwCgUSDhYX{2_O-D;&^SYugc)yX1H_2`$CB17Ry$G#fMS=Am)o^tBottIgY;^L|0B~ z=?k84_FBi7J#EZG>G4IMdl0(m%Jp|#Bd1>73ipS@?s2Ydh|j$kN%l?Yo?M0=7-vad z)8e`P2Id^*BWc120#Mht^9}Vz3ED}nOOdQiiX{KuB7?VJjF`TFpkJhfalU1{mK;U+ z7-Mk+h65^<npS8W%QOwm(RdUmTz2zFMW;@m$duH{k73W9hOxa=Bl^k~(nWWxS1^YR z<w(PXaoKf6X1Sux)El|aYlRl6dtr-2F=cp35_p9eUeDGS?6x?Q(Uce`Gb`!zx=AUR zgT%7<^HM`6CV8%`oj93NHf@a}_0pU6)XMjMtz*u+O>j}2EKME_(<7AJS`Ixuu&FJO zf^pB{CMV{%Oo`oedQJ1OAxxk}W!kBodeS4YM4DM@FosFI6w1{^MJ|7o3!yW=MNo>u z+=CJMbVxOuILcjl6}uV`g~z5U<J>`GdL+Y&tpSN8+XEtzA|gwkB73;vJcY2@2~R5e z>8*LEE5P%9^nrJ2_s|!HubZ1<uSHEaC|KvdT#>?f9ED1wj!IVr&|Jgezo+NXpMrkH zCyJ8tAGhlgX@b-DF*cBaA1L1v-BF!u1UiUGp7wjCQb3CzeK&BgpAo3tL0aBd4c!Ng zT6oQO>wkZ$eMT^$<MvY##oV-m%CZV5T%AOJym}zODdwt%KplFhqF^Pzz#uze7P^V( zSiP6psW^?_;&#Kn0OXH%a#2OPj6an!k&a5IdOe*i?t7bMn(ZR2>p7V1;?4V6{SP_5 z10OEU387S8N+<qNJ2cb2%`*gl*P<dZC~%mlCsULZGa7VX*{#OUOzCJ|sV)uvn||hQ z#AD&&Pe+>jXKceN!o1D4c2<YT_&Q_x6<<%^ZhDM#>}~L;CMfS`Gmy5xG%v{c++03j zjFec0KSYYDC+yWY`HrVRF+xL~kNO;UO2;U(g?8^Rxc?m*l#IM=c)n}Jj|fxE#gVFO zH}Idr+um$a3rnMhtWOJC5A4I(f=t_ZLz6MbI87CDXQ*9m^fp?mEjVX2fv7QARwhC@ zu2bV<`6YgS>Z1B2#l~d(AmGH}Nzh&S9bOvXNTR7)W(omXugEi7^I1VCSYBwnKl()Q z060bp5?qT}kq2fs*sT}`SCtN(@?but#`0=w5Cz?I0m&{CTQsAQkPQ{Vt?eT_Zbi)_ zqmmr(&wm}fxOo<znZ>G=uu(sXG+9q8)N<6bb3#f;c*ZZgn&tdKi`$iPj}vizG}_ly z=9Oap;DZH20wZto1;Ji2F@^<;W=beYH`Nn>N-pa51q<T9wBFX+2Zb_d#35s>pXNs3 zzN71ga^0b=>_yd#*?3YPL|h}si3+H;X>Y(XH{I!oRJ5!|Uj_$Fs^)FUf;bs1CeNw~ zih#6fn^M{IPH$5;H1MRh57e^oplEIt&n1=IjloCPBmM=E*>m3ek;M5EKDY^2jrW1( z;>FfnPWo7w4Kyoi0!}~z?J{3#aCe#(75yB%p~2L%Jz$@M^v`>_F4cOa@ws<airvPv z2bwU-(0d9jRQH#1Qt2{kSw=)UpKTw=c=INxz>a{NVE{yBhV*$<lJl3zUg^K&b3-@r zl%J*IE-+XnNWR?%2R7S`dQ^Mr70Q*gcD2T6uC~kFD3RrlFOlkvJdL2S*esf$kc%l{ z#<m`OBtT)Yo_B-`sbq;O?Ld5;1wHYY)hOY2iZ2m*)1DR3`8uA0ia<f)fpoS#L^~}k z<8Wp*To%|pYb<lvTYQQswNjF)qbwm2d3SQTkpna~@igirdDj6b+DT(yS!MtumbFio zD?5Q@&hl)sO9n-y?<65JIe82;_bV@kYlsandlE9~6Xpf`1O(S$J5Ab=W;%|WnPhr# z!$m9xS8rQe*{NDJ;SRte#X#4DZLfawacF!0_)1SL@>i@9UN(=BFE*QhXs8pJ+Kav- zpp)jfHQ!h1R|rN$23N0^>F))i$r;KCB56S@g_l7lm0>e~LYbe}47Z>lrOql#8R{pb zE-qVcIkq=mx<0L5>rTPKb=C?D;B?efz%%XlqYC%8+9D9eDN32k9=K(9ni>T!gND~j zakyjc;{xO*E4yPDIp;-aQB+)($mSh18MYz9X~+#FITcuFu^KuC{dg#uJZ4}P1t4*U z9N%W<jJDCqT^jN1VH1ZL;@+pG9Nq_ea^I!dEIz8`ya?$me~Rq1zU+E{GkyRpxLrlH zY`fhA#Bje|M$~k_U5Dg&zg@-r5<6l7{XsGOIHLHtOyt7EnDc98OQMyQfdn)gZqK*7 z78ze&KK~$a6cWuqQMvq~P!v*aK=4vQI$QAU1=jJ>u{FHsYC^2cXPGHt6NbCT%9XR{ zQwX#V5ON)S<gnr7Lv3Q!Rkqgh+gphEFDNGq(PV!aUQt0wesN*xze?$j7>Nu<W66Xm z;@O@ci{Z$Wa>e{b=5M)>y?^oba&rxCR)X++K7hfIiBv;n_4<WEk%`qKRqghPeSO7& zfkJ!(gM$Qk`Gxs}26_kkhX?wiynMDMl%|4T$)A(ZJ$AN9^~hO7Z{5FsV0i3E4|bjg z*ruMHeKzr46)*tc{SjQ=y4xO~?@*o`Y$>eFD4WeKnys;#%`}>=IGy!FoDD~sEj*fS zz~Z`|i%PT2Uw@Jj1qc!kK!znUM&cIa!&3iEWgE>jpsh_@Dm`;}By>$}M{ViMHZr0f z07xVs%8Sw;DJsYiRyod3;1@(bq^qH-8E08N10XSq%IflBhk}LSV-)%_#r|RFQ-}q+ z=j8?z6phW}4FUz@sHW5Hk4)0IT!1P7+vM6O<P8;t7*c0gV^aGPjRYoVI3$xTluY7) zQKveaHRuhcubEUOOJmk}hLP-#vQ$(HvKWKGq;vqfsj4N&B_=wCi@8km53hdx^j=YL zYTXw-n(N88qdM5%({Mw9ZzFSug?H~*DDBD#Iiga|Uo%J{8w)Q#3qC7UQ#%scdKB1* zQh*n>W1zig#yfH9;K`;{C6FXL;HR+ibxH~YXES`jYx;oV1z5a>Tl<7s+`}8Oi-n2= zj|$c~1POD{UvVP`W($MW^eMo-)@ju(H)y;$uiJVpDPnx2fx_mFN%^t*JJ4$9dbZ?= zIPOTW`B}w$m%_3@!)+Tb^(OS5RlMnh3ilfEo%h8)hojsw@f@Z@7(z*W!dy3^hehEW z++|lrH&Jx+d_J$IF{{Bq1SL~|KWvIrmkG#IsRs(+-$hpE%(ceTNi`OG$EH?|3AW@2 z-HaQka7GUaM7Ebq`(h}rMg!8~K@L;e4}o@4JUq0CIX#&X*Vwo$_a?|KEWNm2JC-}F z+N8C!PNM6mo{ggcLWIx4FKZYStWf+4B`Z%?evb3_$CoL4<1dvvZ9D($)c3YJzVsz_ zui%#9ZP&HE-e99<vY{D{WkEO7iK}6>HNx<|y{9OMU;Aep+-df&liXC$2I|DJePX28 zX0*sj=cqEAX2T}3omB|_Rx1~PnO>QZU}D35CoRgTKb<cF-fsNa;0q@$0{C=X(q-cu zKCe3dX<KdM1BEI+U^z(QLxVBgldp*ZdTQC^@bY8`72C2WEro7V{#|p?R^#ksG%Ck8 zz{>QGFm>1RG|%|?Fx-06EANnQ9zg;1&FNrzSdZe~Pb`2@+qxr`ot<vO(F~PS5J+Jz zF8qk=4g{coknab_w--WgU1Ld&!=I{%;SzT!cQ57)5f&Q@jfBQ;ZBwPoJ-9Q-Fm(~m zytj%oPK>ye^BoJ3ggQn02#q+u;#XZnwwtvN^P`#Ui2Cx3=8F)!^c1I!n1}W)ycskA zemZ}BHa>Z#f#~V)_{!3!@dd|$Mr@TxqmZ~0u>L_d^4yM2eCXtVO*tFrfam&I|8gq} z<pIq8!cdxI6t!+f?)|Gjx}G@-1hm=d&u~$tr=z$1)(y7*xgS|0@$Uma5k7$YNjVZy zTaw!N&zUgMel_B@HS_V%wS66P0tN6Foli-aJluHI{mAZDq8d&y94{rY0HYUwHCh$l z7u=VwKSMetMc^y*NWW}tmJDpfDeT~|4tlKRL4mET2p%w$Ei0Y<(*#j5`(tt><fP|_ z`*N4v3z4%bmJJ=9z%!)4{<I*;9Mvs$;wa4%z{rshd6%hXd~#LUz|{eO^milI|KBiP zLNxh^BYdi9j*H8cxsM3vmW<YgGn@zJGyTmgSH7r+lV2DQKBmy(oZlpKssYlgfrPa~ zPDn)b3F6(OfsTI|QMO_|d7<L8>TViDXU%}84rv?oQymvVE@V$ldCgI;pym3eU|XAA zLqbLaHfC2v@JmWVEtGhY@?01nC?9?TF|+EQ7u)Y0a$Y`JAu`<`Vx2>^JXw@dOhugX zxdakNBt`QSAIoB?3AQ+^KMz4jOwg4uJ(f*;G2B4GhLPxuMnnD(63d5(&6l|FI<PgL z`cQ7lGS!=Iwh}wj5_d-@>VD#}x+AFfK?ex%aj{SM+Omb+I)HBaOpcONme2yqLc8MK zYFyCj`-Vi@Tp*`L_a#7G6ic@X6tL|r-tP+m!?NS?q$(sypCxcnMar+xxe(&Wb7Wq@ zvxX?+*>ci3IpasA2^FA<xPgGTTt8BOh>)2g`BjC&lY09S&YnjcTnUFG`!Qz=G<viL z-gh0-M1<(?6my}emtinPn9Lx@8ZjD1k8Qzk!)))ssWs|!=MYg@=)<0tD{8-gd<4_z z-{WewyAC2u7h2efrhYU$?qX4&r_TRr!s@Tl&pRvIfO$Z8k_`QL`lD=u&(<2%+E<EG zv8&McrigDw``Lggb7GcuHZPc6lxbd`taPoFo0XfZ%i2(-HEe&6S6mAwX~-wd!Xzv) z8Gy)lh4>y3B9D5hD{WW^5)pmfVDs#fe){t)=$OQv=&6Ig7Jj-Bl^CvvQD;UQ*){E7 z)-|&|61)IHi5b~S&ifGEqGyBWK%T>i14FNYMLX62FG)Y*uCPgu^h@}PYCldey{|e1 zQ`9WZYdC{eW<5~454AqJlOi}d&-V~1vQ1u)Xt{TMm{8rSjwXm>M1k>loV<@rGKL3L z<7LG_3%5%9ydJ-ZK{xiyFm<Gxjjx>P(5-ZKtZh{~a0OFZg5}ycAsb+i8uCTMfPzA6 zfytX^7Ml%A&%>1XS}p>5t1;cDK?7EU;;?DoV(X#3xbd6ewJfn|k766Kg4>hPmRk+q zeWxK^0*z5pWXwq)xauMG@yWYRtr$0Nux)p<4<O*)WuJ4K<=jQxq#s=VjYCsJ-ijXe zt(L#N1h;a1v2|L#jPU-G%3{qn<;7kZUY`JkmLpB?8n?Z)OX-xyi_3)A*2AwodU4ZO z7x4{V^&uXg#L|wA&#~)uCvLoqK&WX_am8J`;SGkJyqkJpG1zKmUGH!QAu&p!ZzjY! zc)0i&i36Vc*vWJ&f>DTeNZ?$vZ7WPba-S|GE)98Ay8!0A_618~`8S8_bau=YLbC`M zLE@8uRs>^EwMK|qGo8&QVj?dy0pnNqH81&%N5*;L<N#&YKg~21nA|A9FE%oIo}Hm1 zC@(FBBW;-BtnLUDTRz<8KFavC<KdBEfrG#grMSfV^)@W9H%f~FaHj_YKj;1jF#ddu zcrV<}z0b7;_rbq~Y$zm9JQdx{Gf*tHNHhx7Yj{%40Ujb**Oy#*b>V=mOg+bGy~Wxc zAn!UdL8hvCZQETg)oJM;xWVQDw~Xr;XDfz)uec*3`fFG$kw_Sa6{w_YEyAdx?W)9! zD~J%W5j!p+0WDLk1cA_Lu_kbGt8-^m><?PVBoABb2AjEygW~ncshcn1zsWgfzXI1t zgTN8?^mWmQ1&i#I*QOTUJ#IwLYqW#*W!uLN2_Sy3LFCMd_BDLcpi=A5>Gndlj9xTE zG*|I;AbY!4Bm|8rLYynhGl@5g-ym^o?*SPe5$m=CXBdQ-PnSybjl-+zJod?U-g}_N zc!+VR?g62VrV4&2nnam92#6kp3TgTV4r;m&tp1`3+@SJ~k_(C~dFWb!LV`ns#6(4f zMuta+C|u+e<Q1jmWgg43i}TBKOAD-YO!xYh`%8<HoBbI@Nlj5zSzb8Tw|0yKnfS@$ zN#<4Crq*U0p@Kw)@Q}aCt6(Has*+#c*LC_f>;IKx$;!(u%+Aks*iZG29tNicB~4Xv zI=^6N;-20<kgh;W>IkCpd^jZGlR9K5;{FbBhAf|#CfxqWFrJt~)xhbRkCbB-edPax z_apxHhD>^QgF)k2Cy{g0pVCU@7i%#3G7w431I|MexjRmyW%hjy-S^$;QCNnRdK%W9 z8d|g(mSKmH0Kk+qHy0m@;6orrk|KY;YX1)iJI&CKGy{l$*-p)Y%*1}m>cKoGmo?`F zL;1nz13rUPU^P)?GmGv`n1*C#JT{`y4cor1S>P{PhzFPb9bG>kO|u-tVTg7EC`LyI z78n@7p1fQjV>!5qWnN|n<dG)S(WVO7NgO}B42tqDNKKPubqhQLNaFrf;{L#m;@>6S zzq=A1QVqq#L2tnN5^{r8p^vOm<!9lH-;<NVy0kJbR`!pql)ZsF<}-@7DRo8rfQh8- zV&{oaTd$kX{ZjxpyO>@Jsr99BxPWBLn7;u;!8AKhYlW})sX=$K-d>z-{%)_Q@&Ea> zC1j|Mp)r6yl2!CKu(c%b7ZjBh$jw5w?mWOGh|htSLo6KA@*}TDCX0#=6-7B`I-50d zd~=7!h$&}L9#C)Z?bC#MtvkZ^)NIM(CE@ieicn947J)PNr8ib>C&-~2fz*I(N2wVl z`1k&ZB`eqAzFdK+n3A^095}mix9C>_=XQU92!lnh7lrEuDsnAMr@xt~1_d9gJ61l^ ze950H0oMI`zIlXv0C+t7)tW^Ymp}9e1YA!4FPES{89a_Yzh$m3Xclh?JlZ~`V!oyl zM0O>aa<P1rJIuBzbzhS3)OzE^V%3W8-uYk4$wG_=)Eu-<>xJkq`lqW1csfA#94d_l zy^U;v5oxVf3UWgfWyJf0`&WuCl7TB7FA7sh7<!h~st~`Kxl2#{UH*q$&9qw|g);+M z{GuS%j>4SM3l5#{<zz#S4;l3sI3NeQDi6j+&|-=EEkgBg^db{I&x@;Y^p3`K0@(c5 zJiY_`=TGx<e9&fSqvs5|F#k6I16&;>!$koOMaq_x&XM40Cy%Ze!n0tmYRZZQAhRz~ zT6{{Z&Te-2bMZN67_Sw2XCMb7RORd;sK|SkY5QGlk!c5lct*7Sz9c^?Es#p6{_b7d z>V2{gcn8lmZnbXlyOU$yR+YC~n!sCH$3&nu>QGMqHp)PshJ;nQbS=R9eK}`fr;%9~ z#Yayh#-BFUDjKU6O3usg%CHQl&^34-hA@EmKOVmM$cbEnY80`BdF-)C755fSU<JOA zc7MxvF$C6<B3Ro;vnD+3rV?jPCzd9!dUbvP1v=T^{A%__U>E>fpFmIjju?gQXJpRw zK{gE1QbO9h#<Z$zKN$XSt^q??+UAbXN5;NGUR6UmqKj#AH8&?4>>m`-fXXD6&E-;C zbOs`PZT7+uR{PZP2BqO6*7>&j;l`ZHS1w8K&S^z=MKMl!vpMc>CUu~?v8B=-L^XX1 z<;EZstLk3e-D(yF<Qj<ru1wg8k1J!|6B-mdUNGyj9U3Kcfy`s#+EF1nSe+<z`<Vzy zp-VufG9)<a9_NKo=_jzB&;Ux~7v$spOeNZoC5N5p2=j~KdFMk~CzpE9#WDjZ*U>0- zh6~-AqsK9$iv@iNb`l61!U)Ml6_Z$?mt#6Mb@Fqgk%p}aU7st(6NPO7aWUz}lZ5U3 zl%b-e#}lpo4KkH4{yRp%Azx~Igeedz^s)Tn`2+X!D)aM6`=vh90qA;*K*ZnKg9EGX zh#_ffJKFQs;qyvLG!|R33PhRQ{u{P7^u`-!|FqmDb}fOrt}naD9ml|}#e@A$uIFz7 ziDbsZSUodV^Hmu%G7B}njbMD@(F(k6VF(vjm)h&L9#KCY&3?6V|Ih(0A8{78T{M2^ zKSWq(@an-lvZ4qivUMM>Cw)Ew2n+PK;Y`!Sm70DU_m%^tg$pUh!rHXkyflS1s&X@B zW+o9Yn`sN1;3y`-;dFYWslc{i>pZp1%k|h>G~lUo)P~T?xEQc9zp{$51;vd<Csn%B zw1!JHE0^>^Fy=5G=P6?(B2PPrE5MLegi+P`(f&UPi^z?!zKsumwN#=wUJ-sIRS^V{ zYhD&frrF1<NhN8zoUBTbJ&y0qPN1@;xWnPW1zQX@>MnpC0TCvqA|;J<PTJ_qI+H_P zI4-Q~EN+-k9P&>DUAnotZ?bJ68ES+Mk~6D54aEd1xzGkWdwT%#ySlNT>OZ+UIu7Cq znFn<nCFDN}ry6@OJX*|>c6BE~aJ&yaQn-m*_;*6weGJj-HOx&WTHJ21nyWU>v#fSt z37`9#-Ml`UH?TMx2e#L8I*dQpRv?`2>`n(;KQpg&C;z3)z{rg}y{dcqaP^{fM-i_c z(B37j-?i(6Fb%#llFwoE85f5O$d+b*N)@bH%BF=;!phNOjpaJ&2e@k#y;EJS`9_$0 zV%Vv*?AG}*MW*qrfxeK0ljB(oENY}MR*7ebzG838Iat;uacx{3YudNrp?!>cR}+OR zRrg7^erFIm1Vq@c9pM>a^YBVeI^@Jm;ddH;D*_H*cB?}EZ6IcdXHm}Cl*}ktX18mo zbok@*6}H?KA0`U+4YWpP_|w@T_O&I?p5em_X7i1#n43H5l3R%NJ+7USRPz&OIWnoJ z$GPagY@O95cV*VY+OEli@YMz{>v>cL77`dwywUJ+oa*xIR{KrGUdWeWP1`}ud?diz z3@P~r`(C=(kJ?Pp^c@*WseLtjFw^<EE-~V!8O0%6axT6lkxt?DYYuvkOr~D$d6Z3< z;4p!uXOAYHTZu4bCLn^Mp<R?$zr461doU$Cm-8csp&!f)`*^OxVmg=@0~(dq{Hx&B z5|P&8DBglVqsH~e2OSK44Oc2%$`$IM@d}noZ8Duo_8OVi@<2b-<$>ps<)P!T<pCGw zD4&Zlvphhb0Vd%n8<TO%E@2#S%W7Gpv6O?7A4TRkO0*Y7sPbg?=sND&2zjzLJ;+!q zsj_zP_^5Bty81@Di+B@#6@7EPj|(V0-b!w6p1QiWCFR^%x(19W=oOY}q(@||L*yin zLiYh*NZqR~+`oe(&33#u5^G{&?W~isHb%!qLngg1os^xU!`^m{DP@EEm=kW{^lutj z98Tbx;E)a$ElU>KGtK|^CXfqdG&`G4GDneIECe|9_oRI(X#Q?V6Juy%T%Ct9qao=a zKItMn>7+erW{DzJA4R+++)#bUz7kQkLb0w1a$7yhw2H58Szq<Sw(`k!85FQWvPr3W zy1dmth=P7iQ)y_Typ6x&8JDUNA!Dkk%vDXpy0p=0IH6_lMze)!^eG2mf)ka(<;If% z&#I%Y75gKI_3mt%EP~2mlKkfPtFV7xDtAVSI)1`NMeXV45((265ZP!=6lzZL;hp94 zjc1E(5;@%h!7-tg%pVCSJaw-5iq(tfUwz6qW_4S5H#;l5L}}tC4o$)q4oS)VR8^L% zjXVA-s>^s#q_(a0SqrpG*}N(ijl<3{M_H30;}ni@g3c!@iTHKJN65K@#MKi|XR{}R zNoYPIp`)YZrH5lGyj8M5z(kSPMnhs`|B=UrEtV4!FBEB9+^5f03)K7-R2V&$oug76 zzESD%H~2ob^4RFW!{rp6VVt>xG3a%iv@0Q&u-p5ID=s7|t1mDA;eC3lD(@anPmf-7 zWQ@zO;1+LG{_uD%t#~5Dh=D!brzByd5pPvcgL$^e1)s7WvtaUTLMTd?w-DYfX{nSF zvZN{d>>c{Mryxf5XCN{wLA?d1Fm45lzyoOx>uZKpPE<9toaAI{^|MA8UF60|=8=Tr zt}}{GPgAsL%Bh!FT|~vI%|9ouIJ61B;06Zgb-ELTF@m~okzt~$cAlc5s&1KsrgAI2 zMLbPSNw>aLTKHW5Yl?d4#G=?MApgqyE6`yf<dX#+BD4BwRiU-oouYGDU`~GDa$iW* z`|Lxd*`otk3{QpR8&S9Ng)-pjfkRlUN7}%f<6<W}B%@_-Mw;lGHfGGMG|J~woP<%0 z%ZjkiIs-KyHt((_syYZ9=9P+9M<Tc0Y2jdaGfnVwTqfnhEirwOsQ8Z0p3*j#z08b3 zh_&RHh&12rdjI=I+tqXygvNuoFIT=y7TlWKZT2i8sF(y=48~wt7BFN5373U8p6EB# zDm>A(mJ`UcfYP-zACn{Xb6QWGkO1*0k=Sqgx3siB0K1tE);EXpP}U4d&NT~Ik^eWX zJY_Z2ud-dZ;<uZmVaU9JQ`5Rc=h@XOT>UHon<d;>HTu`~QW^UZ_dim6V)-=9KfdDN z!m`k$qQ8C8Ma!m6?g4X#&8wHnEhBr5ZeDGkr&=`cXuR_Vnnk@miRjH4qmU9}yF@PE zlrDksnTGLk7VVR$jq)+M>O5pFB^~(Q+uFkZ>=j?xYDKkUwmW`$me9oMWrd|uRyjMm zd|s3a1tw%(W-sY_+{~9010|=q(`<;DcVq(edAa1;lrK|`*bpOO3WtmZ&NaEZ3xFHf zoH)i_%+{AMB&8WIEXgL^Z5}AK`v1hY@QV`A)-8gaQH0v7TN3T&R77r4RL$Bo)#7I^ zo$<CDXV+>xnX;z~0loVfxu7noKZ9a!QS1a6&GX_o&Od^0GhgXi3z@-c_z${hKD1H; zyb$WDc5UJUcW0%ZYk_QKs1;D`jN&a;q@8NSU}!i%J?E{?rd6!4SbN_3{*ESiOMC(L zXfz_>sY8i~$h!a(Gen6^nm~x$x%~>hkdy9-3Yqemz{L&9Alb0)S5@@LG7~h>ECW2z z@EC#zI#n6Q^^I+DjU_=MqRZ^U>c;0L6=}cA5sQDL^1U5MLAkMQ$zXB3XW$CrW>vEo zf#0jRiE$IvjDjsN*Xb=UVB9BEzOvu;Gs=a%jVoU1`)#lC^Oa9ud9?oqnA>2A8_HKZ zjp5V{1L1x=0+y2&KtmsO923kZ5~Ue8f<S3)OR!Zm76>RTsWjsCWir0Ft_$Akh4nrN z2Mf8v<*~_ec-hP~qZYtAs~cM<L64l$pZgj=+O(|e7~jMRN^Y!R@(jKTWtTub@mX@` z-)5}n^ej<7lh@_~bV>FUwEyd2K24N;0vo16#rypE7Mk+#c2!_+U1plRa`0laU3%5P zVB}sxcKP`0$#Xcd>sL7n76&t*bgaRCNBM1CX3X^UvDkPrD$n-5JHfPcU?zEZD!c4x z)_%-XF(&jTQ$2>#Mx?TECckIjL$4K^ba8+4*t7H)W6${$Bkq@CYotH51EG$OXrbiU zTl=JQnx6;!4Xz7a=AcZjQ%l5u2;#h!&{eTMB^9GS-BkX?wW*Yh<U>dORC-SLVriPs zT$c_#<pgt2M{c=tlAJ(`)UuV@k<6sV4skK!9e3$=vw-qo<3oqKd9~v?PvpOo!xe>m z)m=n+-jbry5nQdclB$x>9=mj6!Tv|isd?Xh+ed!q#sbi+AUk+26;n&ABjnleii|l? zA3?k=F+!E1Bu4H%KOfgUYk7C31k=Q$a6QaZ>}{+lI9$1@qB2Pc{dhopgV9EFY-OjB zmHZ)nrv-1+qKlQauin|mCobD3xBB90h`mHJj?8g0c~chgcn#I@V;^`x23{Jf-}E@n zvsC>{ayJ>6B2A3bcJJ3D4Tiy0!3Ai3QXU_JiX2{)p*<{;|Howhy9dXz9_8ETdB^FQ z=yI*xQ4BYQn3#sVH-JdmKoT^h$^=KY2kL2xWZqT8v0ph_jk-ZflvZtQvQE$BppRbA z<OUK+0d{Z9*>ZLy-3q(+kHKdBPcPlT8WN*20wOBs+p{Rpp5uhC*LM9Hh|$wiSkF7p z!dL&#u}F;%enV;adE%YZcr_An&&-Ee^~TJW_t|pI7I*ep#1Hp`$@{dA)LEm=;rxuv zlbLSAO9jyo?|za6Eea4KLp4QG0rEY6NU=h^V0>X(8U_HsH2X>WbMX)JIVK;IqQ7E1 zQ9RMq<Rk!q?KHc~wKr|$>Tg2L|MQ6cACO3Fe$ujLl};>PG(OOYk&zJq;P>SH9r1sa zOA8Xrbg}>auX}EyLy33Y(0`=<<uf<{G<GAmLTO6bN^*9-ad2cBHb*YKjQ|&w9q;Yf zL8vl#J(wIK2fi!-hpFaRrwKra@V*$nz(_m2e{aa5k9o?WhJ6HL08e+ZcEOvkBc3|8 zy_8a^Xk>iqTuD@@#K$$qmNZkaR{LX#Iio!<36d&AlTd?HNu)HKCa9B2HTMRrq&vc7 z?Bx@(fBgrAqH!PAWwQB%*OnwIN(vWqS(<3;+4jkW0F_GXoRS)4B9T$dnQdp_bQnem zPTB$(&SU3=(P(kn1vO>i{iM}F(T)5ul-WfDQPk(=QPy%7opbmH^mh^H=1=+sUrFoW z{}Ax`1g*x3X8kn6sELa!ijtp+VkAlhSdL+J_eGEmpe-J7dgq~RosQt2s-p4+-^(mB zh}oAH5NefI2Gdk5lB2Ru#y%XbD?3p>di<*~Sh=YKNJRpd-6a$hV-~%Y-JKl+x9PTA zPE}t!%k9X1$D$T&<~Ootcg#L<sK!yBqI6unKabQ_>pa|gKm5rSkb=yuk=&|2z0Y(k zhN`kFvH+uR{VTaf7eb0%t^#98;IRQAAY7&R)zqkuO=~N*iCQC(#0Y>Y3&5$=ey;Vx zH4y1gm7=1fRUh0)oLM@&FH}xb{$zFS>uOehqt!8(P|KFIbnPz&MD0jt0l>8K2zwqH zCrP1y&P^(v_r$Um%-R<TP`#ER>9!%C0`Ce8K;t#^!8ca7lm|im8Ug!=k@EvUq;T`S zfyNbn80!FuK;d7(nzrcc4}d}wz@_@8mGh6jWlp=LW6LB`mVI2QyK<m&Ql%q)`5qRj z`m<eM5jQ7e2Mb?3-@jpD9<%CL-K^y_TBd(+rfUPldOj1Qg?)9gmK{YH1i?9(Nd^n! z0Yh(B&bMUOZaMQTRk+q3Bkan_dcDMy;?ye3XUEc|ec%fJBlQy~RcP%ckb8CkNaNY1 zUmPYI?{b2A+G-=}vwpT=Bip5|eY1XgVme`yQ5WA%z~dIz(HPEu^IVvvcy_s^vtB%! zaun0AG95Efhx|!R%4Quvu9<e!dF*Q2t*ZgT3uph#Y3I%H44u}P%Vp$W41thouL{jk z;M()d#X$!B+RPux*}f7Nc=>Mv@aN77pM98~rjPiE&x?YsOVO8-pP514C-&T7gD0_> zWoLL<PJ~jg0#=C2Wttu+_^WsQ?Ua_Is<)YLTu~MPr0sM5s*dB%Z|x3PXLA5SVuy4s zUNuN`7bLpt;9D-_5T)MRNJwbFQklwLA}g;n%^`+AvI?${w0mH=6|MUc+gg7Lv;YO+ zdKi>_E2{8rOxi2qoGzD}fONxtoeV!F;edOA_DOZ&kaVDQxQFBu5z*fp+fujK(-dP7 zc`0;nfCbC0lvKBv<tm7=@JB*hP$Ig*?6zf;O3207>j?Oq_G;mq4}dQIj-1lDf*I(I zXp3yjHKiLE?!y)u!%>vw^gqBMOn-mAN1rgEtT;12^Gg!ev;SsB7}VMxgI|zaHo!ZV zIlK!rZ+6d8;nMC<DKlWbuOqZ+RW70JQXfEj1*u6}`Xm```eG-tT@;RNr=I@FiL5R` zz~%Y$W3?Q}BD6Hwvf5Ue*z%-B9+=JN_E{Io+?e5Px&1vDJ3`>TZ@Y04aZoNGm^nm& z+g0Pi{_ECg-zSuk={+~qM)zwbBR+cWa<y!~Z(eToTz=<zV?H20slS*umMYbnH0_wY z;APAq!ZLq>BiwmK&t5#Td&-kf$MsfnnTR*;#`>|3MPV!|MSV&~m|eVUM6q4GXTZ^S zjJ6S`8{ZJ-3`;*vyiBp5DPoQ6CU+#F0Iy|4kb(GKV*K+w;`8<7V@0FVqhU<v<Xkkx z*!0n4g36d)6dBTF+z>k?3w)qyDld~!idOZICw{GI!_&gq`?Zfyje2+vtkt!9;rP-% zsM+GNLijw~Tg~71Astf<`*g0P88B`!*hx~Epu1CgMyR**c!x*){z<lgHc9oD$|KX3 zM!BKG^;+!Hjx|lxKYS~b904)>z&h!>RbhIK^OwoAc4uT?{3q*q&yC5Xl4`3S0i)t3 z8}4!=V{WIKlTf+#H0zl!(7|G{b*Ls84+;6eyq*i=?W~;IPjMQrY#&j6n1ns7s;ya{ z9>#1VvN}ii=VocU@3!>L)|`9uI_LiZOhB{0s#*@O*25nJU8aLEX&IKe?8pjZv~fs< zhi8YvYYjJGMps9ar4&`F?!`LyvzdaK8lFY)NT8P*#-(Gj^O@oTuGZmNogEJEj)YI? z=a#hRwoV;E?ME2##A)Kdck}M0s_M0wv&DZ;>CXgVf;6$K)uM-Q$HK4U;opha*UaGz z^QiGef3~MfGTr%^B#%Cw=+sqo*|Ut+wRN=688T<*OFf=yKR$YWmd2<{&6V2=MSa}I z6Ump~CTz);ZRxxIa-Dl)yUP7lJkI03_AP%akMZaZj*f^##1qvy+VIdPdH9nuN>TQS zp0vrHVPR6|!H`DEU!YxZu)_ZVk*ksZ?mqGyhk|*sr@+CO>PO&6KnVU8p5X6*n}1<{ zes0Oc{7Msr^EETG=jQAdvf%k|UoN@kma`9?ozrY*H~WPyXaVz@&%E=^r?}kn%F`!K zJL9}W3GE1$qY=gn3sHQK5`&g7hdJh#KX<ZhUjYRcRB$1M7M6G6MHE?7(Zv+&8>yjP zmk}m-1z|$_rkqN$$W|E@ywlsWz1#OJq$yo}ky$-5EvCWk(J$;4>A*G31RWfzzo|dE z_+<KqY+E6@lVa1d2f3@tR<3pvSLf=wvllmp(~2}G*5Z_W1=I@FK`BspovN?vy45Vu zsya=+YxckXF$};d@nb>G7zD_+?!e;iw(D>mFLnnPyMMQThjw_5`+j%J_K&du?YoWp zVB5DtvXtXh)JfHlmtJj?;Fg3$7LDRIIpg#^&Rj}ChFW>-uV=pb-|g2YM+cTric3i; zEwCyRFX1XcBtk*Mz``LSA^&^5!?b|)Kf<<*d&T%fq`Dcb&z^S3>ao(1e_*+$OhcC* z1BUdOZcDKD_!T_1vdjkYZa&-_PdlAgiiJ6U2hp`@x$TmQBOe!36&RiZd~gB?!aY8r z%gR{>5!75Wtm|j~yY<WY<^EK^ykF)o>kD0;{Pe%bN!s9DgfPB0vR{wo$W;9`S;2a( z@C)13&q2RGC;iz&IqZ>k%OZwVqfo6Pb>E4UP|I*bGDb5KwBG8v<s?VF5;zTebXUCC ze?NQu-)JCT<JV@_p6pX$@^LWz#CUw30KV?l5lN6pku|SJd%pp`e@|)tCJz2v=;SxW zDHQGVb40T~;@KF9H##I6L({njcIi8wqHY9^jI98H!bOUa075ELj@<W~#UB6>-Uww} zT&2>6<#<7K`||CFVU04(fTOWE8OJE&@il`G3kbE4FpCJcm<UUl=0c{sh#A%})5Xkk z2^rxPSEf3#nrhTmt0Jb2)j8k)&eW8_Os6|DZJF6jhMnnfGMnYhM+$Mzh9cQhqK=fQ z5AE}$bKB{jmo0Zvz(okWQ-bca;7dfkQnYIna!o?7S=hA*zdrG|U&8fEya7o!DETHK zjs<yasN+Ci2hnw^J{j?Kskv@dH)P`a5f5kP2F>1(sT)Q<ytx}ey-~EAwS2+{O5Yw8 z`u?c01{jOD2rz7(Z;(bd7^5~};<TBhj7fuHvQ#j6s+b}OrkvbVDPZbAm?kj#0qpHk zX1k0zE@!SQnCD97yNU&_7VjF@>vE%OSofWQr6Bky0Y-=u5yT`3MM{$~<SYf}g6cOl z?`l8PeX9S`5YX7flkpWRD#3%7yu+8iqo4abnPe&W1cXGyB(Eg>*2KuSb_W1LFmhPf zIJm0t@Co{*Gngzkhr1<1hT##67&T_xRt_BPwuh6woJsGlM>i(t#(lnt?Y@UPk7(ki z`lwLa*xK1UoK84+1Vkiclmto9jH{dbA(}LWWZH~bWM<sB^We#gHy<i_rHQGz<F)9% zdU3Dr<)NaXV<_#zCyEKzgjf2?EvY8HN&l(spDz$z6JOb@a7DMCn^aHYk-m@hu|LkY z{H46gSM_QvqkVV2JT7eczS@`i`qu2S=Qz!@(3(*W++Y9#BikP8QB~pXBzrHOrtM)a z6|AyfEMtr_!6Z|VQnt%kO5J`$d0J8|kvOq-idfiiVNePUl3UrND?Lfc@OFjCD(h@S z8v6W6F-NYv7f>3GdU~Z8C0fkuD~s||Xu5fShLRUtkpIk)Wp-%7h#-MLq6xu|I0A^d zQ}JdWkwoE7C_w}hjxRoV5{nn{KwGQ+yYr>{g*exAueJ-Tp|)DPWskl7Z=0RU?6TWd z+w8E@F1u~||0f4T4>!Z5cvzhKEnR;+RzEJIZ~lKM9Qle~;;;l7oyqXi+ETf@+nJSx zV%08g{bYyP4#A76L3B>bvr7BLKM~LQq23E~T}AV$qKPLs`OFQmT-Uk#jLlrpWc<{z z>Q{{dNuSBr`!jX##`gL=W^T0bgWcq3-9~GJh89DCd-NaKll@_IGVgrs<H<Z(C;Lax zT|YZTr{R1*Luc;DpFd)s=*vBQ65}oHf1NFri!{!Iz{dLezZ;6YdL*s>bX6y*bf_QZ zyQeE%e<R-u$pn6-|E=}x5dUC5*<E(%OChQqTHd6(b>cP*s#mXCg9fJ6DD=J%H4W|6 zq~>LC;IwE}JZ<!ghIZ`)I&_%TsZ-;0(M8s+Tdf`r!JOQ7@$d^15I_+WL>Cgm5f;W5 z5wR>P>YbRFPZN6Mk|m1EtDJH(sz9R~%egczWpS;XTPH8~Z{J0x8y<rtPo8%3;>C+M zZ-IRHK=9?Om>)k?{Q0X9AV7yefkp)hazL<Pp9vA-hESpI3KQm$aN&MRge6XGL=GFG zM48DLOETLSI~W^hoG&xphyG2b6%}w*b?yo@48pK+1i?_$GKSg1aaRQ4J4yOOQU21j ze=$~d#jdbJJ;!P0dBcKWL==rn5+Tc?e31t|sK`Sea?QgYcFQ9k@z|pt_2QbQ9uo`@ zJw9ypq$d_TJn2a_p7NAm^^L$AAU9ha+M7vB3p2}>Sy-{6#;R53)~u<obwf9sw6Peo zX_J;MTMTMjXsi(J3>`XYZ?Va~eUlCx(62*}Cg$imK84juvGNj6!1uw9fFD9E0Y3)+ z0)7hd2K*di5BMd-4EQzpAMjg<E8zDKXTTpJ?tnixKQn(_|G;~More2#rq2-dnU3tU zoNl&xt}*{!__!A_t1XV$5NOFz-QTqIsvBI?t2au622Rx|>^GpMt@fe$YKtw}wYyy% z1*-t+3=<F36<QCdJ5)1J&(_+#tg?`mrIwRpqE8=7{rY(uu-p_YtPp3V)ec%?jor0Y za0t-4$H-Z4qqa8L#N1|^nbj8TZ?tur>9$=vVvW4KVg&_nYN#;1-2rXHOAvw{5QPmv z?8FEluB8dVNFXt61d;};P07|dI#FdG2E&<5roJTUEQIu9v7F6j>(Al1h=<3>cztmY zP`*zO0m@yv0YAT40s@{Ig5#zHfs&*dMPW2;&M-L3T5z0go_7-jJEG_=Np@w~13)Vy zBIJZI4uA(Cgp|57<_YJ1gz!{Ke@c0#Y5sMcdMs5(9gnH2u4U?}=l0*zeD$?B1*isp zdP*8%Rihbiq%po~GQ9tqI^rHcH4|UW5B(ibEhMVt@O@g5tk%O1uZ<mNKGpW}ZQ7Bm z_QU7tK%Ld`Fb<%y6<SDPhMmC@TDZY71Y(Lfn1lqO$b)N=AQokC3l&n)2KUg>6k{NS zNo}zPVc66aXAp%;eeniylIg6JAuD{kN-$(cNOy^boQUbEqyU2p<f70p7tCdmVg6CO zvHh!Lm)UT>lo*a8`C4kYjOJUJ;VPEz<%a8cepDE468TwaxJ{;T7Sw}7dmf^#9v)WZ z5!!!`TE8AU*aA?G+fYvo$dhcWrv~?)*6iuyY*143D4?Z{m4KGDq7PcWJ^Is%i_Kf9 zm0+Oc#yUVLja7hBo4tV28k+&7H`WKrXvG+mxgGu~>(cjS+Z^&K=VJD9wPFIwYn%eg zZ<RHupm8Rsuw^$;QFAq@xbZQl<lq%hDbuy8`4(t(^ApgTT|7Uny@P$$F<`AfLI-Gr zxxX^btGq=UP{n_-qEaRARI#|K=NTV0YS^Wg)wOX}3v9B9>Dz3VfuFWq7H2C}wQUGY z9W}ptn^!}NQqcC6oj^N|Vhh^o*4lN%E6{E~YtLLj_S(z*Zy$GPW4}hj-T|$01UlF% zXP`s71bsSu8SRK8Vjb0FrsIyA@lI-N0d%T)642?Rv<IDGQ)g#&!#U@4$azMt3oVR6 z7aOC1E;S24|1{nM{rl&6`46x4{}I-p%XY6TM^u8Y+Ow`5Q3bkg@49hBHRz^&>(&u9 zpxgGZJ1uHKcbk(z_co(H-M=Rt4?Hl&Ll0>^^2kyid#r;eo;br(PZfFQne#mN-0HkQ zzg`Y^@(S<u`Uo4)8$R`Ruzl~eVgY*J$`H_p?W><YUJTwRjm?2RH%|civN`|L*UK8; zd~?V9?kF8WKlENdTj+s)H44!0f1C2hA4_Z2%qlI!tkxDoz&IESCaPk?xNr<g7<P`x z?2?9EB4bX;hxeo4L@9?4qT=LIH~9kV{D&PfG&KC^(q&IeYb8B;#?z-SnE?Y67&6qz zh>?wq89Ts)iA_wIDqzOUEauE@V8O!5>sO=N7^Q7@6gS{@C$0mxx8-H|vFdbpAmU~9 zF*=vED51bMp&!7ukqp>wv-q}0^XmBZU+C_{+}1hd58P!(r@9IS0C(Hbt?ojBz&&=9 zc2CwRNH4u~(OYl#^wGz=yDu+Z{XS4tf2T+U9^kBj$Dk--z=MOizz!$Y1|GumHT3K4 zQ^SO6!NVh_0*{E~z$2q{0Xs&C0Coyi1RfPS10EfvE7<wO!N4vizg)lGp|>07U+y0y zm4}ERV9!t%*lWjE&YQO<<>M5u!M@t?JN!?jCpds}3*03aEaV@dM(Ou<*cCnu5^+Sn zGhUP^i;OWw!abIAeVoEJ{!|=+Cs@}eMm_^iI+fnwXf<NQs_bzNw8=Yb_f($tX`c7# zp0ydHc)dOIm^Fe;|Fw$DHk;ZUb12L+k4r5uiqCZX!mkz@5jLG=rRzjjrcCm#WEEeP zDk*B!QdXUzh?=Z^L7=4-U5y@ILz5;Inl&5Na<sk`ifS`N5Z9-(7I$RJ_N#J53V`!R zahNVx3{|L*lOjc26)WbVM2S9CDh#{>@Tw@0z^fw{0IxljIN)_I_w^pMvWP(7@=-=j zS1g?GN+$Ly(XD2bkm=e*Ky7r2B=9ErugxE;5w=`gBg!`0j8u2mU#*6Tx+i#hlxe^_ zqV5ge8TDZBu2H5>?_M$09(zowy+%EJdf#HC{YT@wx?2Z~UZ?4U>vYi}hjiSBS=G}K zNAz&iF`YFXC*DnaC!N%;PKo*k_;i#S=mdK9Prv6ke9emz^Ub%f1s2%LLJRF-kwt1P zwpg&l5=kvBWEY^9ZAo_>s}57IUbO}dYBg#!p_)8srCE!1ty=YH)23OwcFU^6kYlIr zTpXiImx}5(aKO|(i^KKmbxdW290zo6OS=15b)<g%jy7PxQ3ee<!t!Iq+m~B;t%_Z1 zb;B;1dd)i3SbJ@W-S<|lNNlt7*#CzifgCVuAUlm-^%BDvz*s+kSGda!FN#E75R1J= zh*uRU@^TGppl_N{D_&Qk#2YnM$eX~_3=B?_tXeKyyM&a>-d(jK*8l_MapYtUXA=~d zXeJkP&0|sXg@%tvc*<QC`P-RVBC3}|B!)CVta$3HthCaDN)}8vA|<L9L!>?&Mw&Et zNtf=^%Je9XY}uYwjwg-Dm1}+Fd6<@b`Gyo6h3`~Xk>JoFibKCfQ4-uaL}{c3h*iNS z5UWFGBh~~<j9B}qGwZA~qSlMl1!BWc?2NK?(kfT(Z<Q+PsZwQQRSP{GqUK3`YSp@7 zqfHEIv*0s`EurT_Y#kXk!_?c>FkhWIE7hyFL4yX3w%ab$4!g~^$6m|rv)|fk6y+qu zft>@_L7xwX<CG918^jleI(i*DZP#?29QHWn6gTO=yTj0P^~S*NV^xWM{eIk7g4#f+ zKSK&`sDoX3SSv$@4ZvR`SKDf|P_ZFpY_ooi+pI-G^4GL!{kV9BiZ9^dKoFn9*C4)x zW`Xz`<$s88(X@s58LSK9SEvibpC@<Ie6)_z^duZ~;si)0_{Bd~b8i9PCO%q)bm(gR zO@oZfIC+?tjBcHDXja5a0Namhj>EC?_V}c{PP7leKDC=0bTVN7DP90Lpk51}=tba= z`aP^+i-c+haP*{F036e($2Dz<P&ENg4w^hUwU{q`<lga8`Kv&SSMh^YcL^jI+U*V3 zQCFjM(}PFr`O|G*sL%CW@9RzLck(jG{@xm3p!aRikFw#NzwoI$_}+*3)rb1ihDEr7 z93B;c91-CUa%4CNq+?VJq|?v%I@hQZH`-{=ICCa#7p+0gl^Ydz9yC08(&5F2A>YIA z?dAOWtEd1`)<OnGWd<4aGv<H(3i+}9$j}~NkFYEJMZY2nmqSMG5=4noR%1kb137k7 zvYF#nEs;zC;C4e+O>M*~DNQhJ8bRElsF`7O-Q&1fg783+<|xV|O`B&JPb_PJ<2>`c zMM3bw3hziqOQ-4{HQ87zfi|mlkn^9C!U79y7B60EEfnDiGHI06GnX!o)H1s{S<A1K zm@ZYCsg>SI!yq$!Y?)EkKxRdyh0G2u0-19PZ;-iq^gORx{wVWj7A)4^g?P83Q)L2K ztWPiTu9c3GHgnZtORct5xYzKduhqY=^R<<oWDHsETdUZV?@F3m)rs37tF`nRKCSjt znL=*l*EU6E4!Jo>I^>p7w)TvY0l7_?S+|Bv_3G7W&>+ip+tt?&p=*#kPn8IAmtk%9 zsj`6FV?^6~suUpi8QJ!qDkaE9j_ttqjQb$|?NC&0AP<j{J@d$_21gx}qe+wP_i+aF z6F$FAeysBDQ~YSBH~YQM(Av&!sB@wM<oPK1kQbutfV_B8C&){Fw|~MdApafAJM+JF zYRB>L@EiyTOpO>3GisEjF=L(>H!l62;8-ILRzKCrHM}xqN&^y-T+^mCnlU5KtXWMr znd5CPG~<vuA5uU_r406cs?=41XlR<z(Zv?SqwIx=DXta__Wx8D7YIw1v}_h@c#Vzi zM{x{gZK}%)5iYKEJUn82d>dA*kd(k+Z>B0-{IqIS91)R1Vq$MeNc_5`xb`(mZ9Sq? zT?cLsD*)UQ@haffh!2D95&RR1hld>s<9~b53B@WA2GasZXv1Lma5z19ygnk)0F`Qx zMmNf085au0L?TCG3F>YuP{2Wn63%}3VQ2nWHpAa)zea-&9cp#z)vQmS<ND$KLcnkW z6H})J3$9xv)McH#@Yp{zBn?5MfwU4j2Bg)X<3L&q-36ps(D5M6Lw5yf5p)7b>!G`W zv=MX;NSmPtfV2#{7^ErmD3G=WT{6@5IyohyIUJYr@EF6(>oPt*W4T<H^Ya@gAmFLe zIBr7_3`yEj6id@~48yUkJ;(7p?;r@)MA1=_9Lll}fCsIJkQc^y0N#Y)Q|iMQHs>xv z5J>5(lwnQttLt)_GlB&>mJo-mU%SxeYhl9J2p8_D2oY>Wiu6pBD9)lq`yfUP7qMdf zAWj@t@#6g`K>{}r5FbH7c_-0wJz!vbz`^N5K=6fxWB>&v92%Mx42%d^Sk`cGBH`iL zARvfBL}ZJEgpG_WK$0XJ6cmA|sJLiog3!_NFfasTVk*JHLdC{bii3lOi>nb2k4&;; zO;V(g<Kt^4AfO;5)Ivlgm6%wcWDNiT1RX$-2*VB$L_$$V7$)PmV}ejf(ltd{q-i${ zV~J(ma-3zJcP9u|MA0uv@+!-ID~dzJ4<65n&-YUxa25*v5{X>IV!tI4uvAKv$slq$ zNuhuP038GoN+kn=kT6U^5EP0sF$|64EP}w2B$uLaG|gie2FofqPM6AhORd&xG~Q{o z2A$4(oYjjtsay{Lrw#=(Ic*J#=;%Hb!y_A0suZru1q%XzS8OS(O2L8w;LM;R05~gT zJpj($RK~%vvA716OkTB4)<qQ$Pboe=bpirqgoHGRh?J{VO_P{dg&H-~)T&jPIxGE8 zy?Rw?u(AS;8gWgUD3Xw<CMBh$S+g4V-3PR2F|Jjs3~ky>XxA=NhYpiEb;=?mGo?$H zY~8v|>(L{}0}ssT)hkz@KC}Au%QIlWoQEFDH)zmTk32HqniK|m2Lf?5s82~=3R^7% z94-Zc5Q;?Nqfo-oXaWpII2KEY!->G-i3kLdL?SVXB#KNXp-@CqsiZWT7&@Jd!4S)2 zlCxOi*lY?8M?9D70*~h~pYNhT;D}IYOC+)?7P};oSd&U!mdUKk<*q0cHk3+NRVqi- zYR@$qKWVjI=yZP8>%BA>{9-hEWit6SvttIn)Y5~*Y87O&k=pHo9gY$x*{*bv0Tg7% zmjSI!jcRDsmc~!eE8|8_GArB0FR?3^M*ngx@5bNqso+NKLTYz2N83{eo4VEEM7+LV zoT)k8QUg14c4E+Z=Ph@^1uI0=wdTd5-BISQyROT>R=jLy?oB;+W0_N(`|f*7oH+Fm z5PlUeUPBT*b0UcnH6_X886Y7wOO~w30}r%HmEn4rde*eR=iYeRTg9d*@kz7FQ$19w z(cpGXzPm?rwKVPShadL#(@%%zS08x@WPY!>ZD;;WJb3>y^}JTCp3znv%^&O1?K3^q zd#R`I^fM6_*7OX_l1Fw1H#}z0peGC!zWKKhytt9E+0B3c?zW~L<z)ISd30xHW_aAJ zSx+L@eDlmuytoBw(VG89$1n%8mRha+GdzV|oFB1l*|Yd1XzsR3Bpb1(?nXl5-bgLZ z?9AGrFhONyRddxx)`LvNk|kY<qKBXH9^WYxw`K3%mHvsl1O(l4L(EI?hM9`|a-#Ku zn7G#^PAXoJmiDGhWgAlN<hV~>-h(O3l~hsDXG%&wRYetM>Uj8(x~Jaoy!xl%%Uc?q zCcKxX=ZT=%X@2@n3oTe$YUyxV^|7ZwW$PuhE89#s+G@+tPCL5x+T-cqV;=yO9T)N@ zt=kekHGMHm&BDSNhKDzZfS@l#OLA#T(jnJok}T!UZAqCjM@3_ajt+x?#VQ;h@eu%) zq9^@;iV9MmJfYOo2nrP;(I`PtsvJj!N(@!1M5$IytwxO^wdxeBSFcP1tqP5rRcq0v zNxKg9x^zj_t(#Df9_f1Z%1fW6$k>+q=Ood8hC*)GunZ$cWo5FD5)FXm)DpwC<@69? z#*75BW(ArvC)&JuAr>s~vuIJA0}cqVWJyexeOM|0mMcs2-j)Z4eGWM+(yCSd)~pG& zZbOixjtY0e3BFD`$;T<Dcsk>ZSZAH(Wz(j3=bQu06IVIoe#O)gU)R%?r3KdCxH2!l zSn^g^p_GSLN~0;`xR(jSOH8J#@%u;zP!(GEe^-SEHz`l;BrR=+Ol2DZIXV86Ty9lY zLq%%)I0dMxf2o`nE@s?$?RBO`xp2|T^|%d#+<9o_$xkPL5PgCKX%<|$&0c|l`Cowo zq2PsR16;HwT7t7|in|s+Wr%=44H1zM5)yr6WF{!+v<Zors@EV;lO_QqB!Wmu`D@e8 z!&6VGkdxCiX3Rz}y>i>K6~Wf5fv)@IsPBa90jkvpIXJFL3Bfi{?HMS{YTqJXuCRZC z>exVOR;LzOHPle7#)kcJR%ayKB7(n&iTy%O;iLW4-?Cu?28<arSfl@}bs5O?=%LW3 zFNp&OBwoDGc=N%r&pvF`s!=s+MAxbn!!5TY)3?45G9Can9*+`*_)0(3JNB8%sBdS; z>fW}K$8^YI0kB<q#PhLcP4Hf4Rro%}s!+!r7wJ?#<#a#oj5C6qbyk@3&I@tD1raXw zOD^}zuDAl~s;gji-6Q$(xzEMa7Xm3<6QK61ZRgd`hMP1Ktf2!==%S^T+8bw_jwYF; zle5kqjlTsyi<-j1Y8h;>HYS>=v$eL`SU(G4K=^YwZHB)VhQIyI=O6zN{`D{NpZ^a3 zy{m8`V7I2jou0dkMK><LmJ$*sS3$UmV2_o731E*kq5cPZR)((+>=g-n8vOJVG9UbW zk9a=#^)*BTy6AE3XcD@7)5nVJZiPMSwAKYs6A_(4LUI8a*)>U$+(1FGjf(H52t3X~ zNJv0QsYGT~w@6f@(V`~ZF6hzYwO;#4^y{ZEV8-M48Lp@6QiW#|J^@cc)%=Oo2vVz7 zlsa|d)N7ESQ4<6Si9%9R#hTrR)1n1Yt2SiqI?)UoQD)Mt1~0t8GG`9QORrR!H&0-} zB9SF4YOGrI!q@t~G7kU$uj(1oXwWc2^JrcjrA^oD)zh4g*}%X{CdV`uY(G0#vdb<j zY}s06S4Z1c<k&erR65}lw$r@y@aAWhKZyB+oR7w!8PGlL+2>hWtm<qormMP-eOf)o zJ=ZLiJF{C&E&5iow)*mdeymn!TS^NOV6_SL3s}veqrhtWm<j-PloRqbSRIFZ53H7l zX5x8ss>q`*(O9V((R!PaM%rVPQBE6ev^$h2ako;XUQwpZr^=P9OoeN*n-}k9if9if zY4-Bc#v9r(7#RNt>xpu3@}wr;M|uFjyMia1LQU<ULWQ0wQsgy_GH;bD_eO<E->FjT z2X*RvP_N$48mh5X@tRKO=~rEbKr`G^zGuV;+#O|Jelcbq-hyr4xa+QPU!JD}BhPxW ze|e7Q^8gRwk8fLr6|Nt{;QqUYK_BP-8?|1{b1d}k)L7Vfb$b`qmFeD<)x+fbkG1@b zj=(zB`Cp#`KyL;FCjN`s7woVyxbzRU`Y*7=8-NDjR{!zi--?O<6wLoA{<A&QOYpRz zKGt&9?P-eP0)4=Q)<|&eO4)iCi87<ule)+0Woq1$CdKV+=hUUKn+Pb<Z#i9Fa3*EA z3`X}E4qq!q8lH+K`X0)X10~M`k9eRgOFMxV&P$75ASO6~mSq5?|AI+E$DxBTyj;qm zkpnRW05Gy!&0TT(E)tu_>x7=!zQheXCnzyRx7r&o@wE?_Kb0ks#t2d^a=98P7*~{Z zia}#j7W6PDHgCb74#Y%cOqtsyk6E$t!>NP-9G-JTx=0Z!5m<$yDzu0ZornLKkm~{T z23xRh(R+w-BTXV2`(|TzDFE{vJu>4^s5~zi4BgvomP&{Be1+goR<5x_kZs7g;@Zfm zviTlLFf6T)Ddkwueeq)Akih>zz?ZgmX*h%j1<>>YMj-6EF)vCl_gKk@l~aW)D+ih& zHlSQ0Z4Yvc#tf`881B}Gp*35IP_cr0sn9_YK3!sUGP^_@J)*KC^`C)pwz52M+Fmfz za&EK9J6$v=@x;`#i5d|t0-O|%poYKoQ57%SkVyxnYUa)Ka}&Xlp?!rE(2daO$8Lvs zLB`r20EFzv8G5Avs1tD~3Eh#)AdNM?(R)9!v&+x0@_gtN38o0x4*`Q;WFY50?FGdL z7K!{Vj7ze{c3z@F$fpQa%9t`oZK{tmA5S|*&mywDU|>S{;>s9tRFS}+iJ(j4ye_)z z{4FOn@uB1@Tq59(7Mf>ao~W3(x*y{Mv{JXQ^6f+-@>G_j18BsU_{I}dC>R8$Pr5Ru zwES?%jBy<dcuEo2pk*&s96{AR9acUiwN}GO7UVRHikinKtW~{zULOD?!HX4$nnq3g z`%~|R0&!IOC4GLneO3u%HvoI7gIe-=&mt%FIZ-f{8kZ=>RT>&pl})10pI^~oXfExX zjh*{iJhjJgZ%oE_i`h9kw|Q>f^m}?T?clbD`!#xT#Vg<hX}Xld&3?4ohxnM^9&vpG z!@<~WE!4p@R%WBlkLNQU+s$sR$TmeuLKHc>p;;xu;dU41uzR0Fx_~~v{d>IoD&@%B z*`Kzoaf#!UNm5m;U6!(z=Rk!xu3b$EKm-5)mzJp9pL1YKTB_Ej>~mXH5@TUYhB^v# z%hJ&86Cc!*oYMNz)+4`5xi9#4i~duz{X>av_Yy{3IrM$xjfF_rkv_2PQ|;LeSP>>u z#N;SWTPe_%MQ9qg_be;cFN72IugB8S`x#-Xl!_~m<NZqk%KZpXRTEx6pjzl_IfIY( zgSGvKK?78)CT5&Jn(OVc2(FeFVMJafF))Nflzlt3Q@{W#*f<ennD77p5jX`9Jb4)| z1e^-`tP~<bCO~9>#KIUwfoswGDD^pm2XV!aMSEjZ$oir!uYD4pwR6C!uK&v2$JJZx zXf#H_Y$NyRzOC}c5!kSWBQi%Ez@H`BrIcNWhh}&;nX4>42gZ3r#~?eGOT3Xp$uO9? zW8#MC>B3m$cGmkF<B%tm_>wC|BEi^^G;h2Er9{EdM(n=do$66^Sa5$l6km`II5JRV z#cDm&12922lnSUNXiBMW0r1a+fKs4lWe>3bTJ8Jw%2&ufzJMXDUqJ;q7uksj%p5pj z4!mcwO-_JyVAzv#8<9td*Wm5P|Cf#=KlXSWuWfDh+R%%)>4RIU<2pMbKAC+98Am(v z3q9QS`W|t)Kjvkz&%Lcnw?{<(r2U-S?mxIyWQJ|4wHLtYi}!y=W4Wtp8W#^y?Qcwx zM%dspt^4t;b<qPH@R8<T`#J41&#ddk@@Zmw?7p|2XuoNX#VUj~$cYlf38gOu5KV+a za3cW^6p{krtVl+ck#p6bo33cQ+f!!IZ3XO{pM?D;nOM4~sdh1|er@Zep6q5pS+9Fa zw_10ujSi<?128F-Z`cGAHaRQsU4^fp_(URXwALX2pqeu~+SXlQP^2zjKJ?K0GeL^P zPiszIYY__ApSy6X@;C2<rxF%@5ekeltbN-O`9gykuPOr>a#gu|L05Gf?`v2ybVU-N zQA}z@A@mfc^h97YbYXO3^e}*f^@1P;clTZp#oPd8!#IRAxItYk4#d`{CnS7@3Zf$X zzKKOeBysL2cO=OWFftJ4ppYzvz-7pW#uYiXJ8S?WQ70|njkJ{Buy8@0DDA4w66GAY zY-n}3L0w9zQkZ0UH$5>Orv_80E|asYL*&G)+ol_(6BQ6kJYz{n%?^t|OuD0HM5dUc zAyR|~A$VFn<MD}vDvqMaT~zr;<gj0}j}Af0ic-M?C}xtqypOcvIk+_3jWSM&%?`rV z&arJyvu+m6mhw#2`j=wr+C%HPZaJ+K-I3?byD^;Q9zu*4v?`Y*AHg7cOr}=zX_wQ= z&1Qz8#4BRz#)@%TzPF>r3Rbv{Ow(j(?ZaQzvm~))%|NMwP_7?o$wFr{BS(rR#%|Oi z<7zL(`#RVxOJXN#CqS!$oPWE;l*zd?BnUAUEIzHNR?BAUlQ$xPM;%wJ^)5+zAQSdl zJ{ROSJprnJTu2Q<cG+pMW4Z~gLTMvVFgn!QgNPncpm~)brdvB1Z-Myio!BxK$pBSD zq5Z<Tf`bYPG7v@$uAhi=o|CRfjrp+g_I>TdQuBDSlrFjC30vahT9?ot!{*=uW<x0k zzo3ezm?#)Mqc#OoQcI(k%BN8-7!<bt*j}_m5-c45Z5$*!X5+a8N)~m`BSwPBW5*KO z#7Zwse!Ot)1o(=4<P0qWP3gDfh$5(^a3(&XZ{yTFZlT(~U?kqYZp|;(bt0wITsS)$ zH<lQxWyAi;{YEuML(iYx^f%&(HaM@6<PF_3{#i4Vh+fd0J%mY<>{;-H%=``~E0Vv) zW-5cruhLZr&k7Y1m#*`8xZWRQu5nDbZF{tTuhhe$(Wg>wgglyc-f6pIbM8KG-M!U$ zPO7(?<+M#kQ)WVvx(EUT)O<qeYqI)5l}|Q|sU!_6L1C5x0VzQijk)B#)l+$^VMgf% z`@tRH;_76vkwQI(Q<mo1|5<Qqo539Lk!T?8OL#7sdbdS5e%;A?KnboxSde%`w7!5n zxGbsH7bJx%At4#NOBO%G)~dE=nAXVM5K9MDK76g3DELjeXZ&UU$O-Q#0)fXVHb=AJ z9G~-a6PVg@$;Dz3?o`6L`fL}!W94e$c%R#E)k<B@^vh>5-YsZ^Qyawo4_+{QYoD1h z=brE$PZs>YFuCiIFAxqq@<$<ZhubRSbUXYbx@ksv$3y8_z;(#qY$;ij#W06AY!cyp z{ab~`cBM(+FPO`ZH^RNXs7-Zc{lCfai#m;p7feWxp1Cwb4KIT;>%42CyA@J<Z}<Z^ zDfJ`_X9}N0d<K5vBNw)<aTAf(xC#~;^^O={+G1pnri{Ky{6&BATbR*d#ucuOgA#oa z<`$A)+|0;zLV8eO976L$2-cv5AXR(($WX9+HMOj1a1%BbxHaD88~J8!beH8xK*}_P zUP@0^Fax!NoPK%6X-6+_>^_Hu_peC1lN89ZymX?8e7K+BQAKiP8UIuZLP^XzmK>M3 zgX>c&8)o3(XUY`rdDmLxp?>KeRD>;gzPi-L;*}bLU`#tjIrZ%7`S$cb54k89)riYa z;Itrz7|KblMSMb}Zyxq;BZ;lrhC51TgtoX1WAyMR;Z7h-KSEw8na=Avy;?fbywrS& zEwd0?%fu@g|0ar4K5L}ypk80)@SH#kgf$8X88Hf^Q4PTq;X!@>xvXSP8{p?xaPuK+ z6{iSiH!Vp0BpV3duYocdGO0Ysq{*Db8aq=R6J~X71^JjD?pQ}9j^-wwx4`6&ciKgD z2(NSqDT1FSRE93H)~3VY)(MAX3Rn|dHdVxM0!f)AToYmiB0gxLUi{cVhU*O%>s2%w zwwC~~oS)of(`nDc2c{tK)F38a9QRL1`Ex;Ra9!s2T>vHI8OK0a5d+m2hI1zwjHek0 zsy%Lq-c3Q$yvi)e)|dx-&1phe$AkZw6co^a#{0ZyU2d?0<I1p<$3%ka#_~f$p|j7s z?D5Xjg+32sfg|&NAhFE#XbEd;?&jD@?uDZpg34uG?3zFh23lqak^f?YYcaT52GWjW zZjC=|P&k-?DO@mIT39FJ2<<KA!T7^ND_jQd;5s>zk!W;q^#&+P6U^zk^$zcw*u-RG zV_Sezo5@X5=5#v&W2`HJY4B~<;JroHfGU{#YYEG<G_wdM(`BG=_N1z*Hd9{R_M{T3 zTz$BR9HkI+-I>zWRJ3rFVBBq(nM+lj4fO$}gD8eG0giy2x~(k?<=v!3e{fRd6WFx& z&`5?QL6q9Ii>56}V{KzRfJ1(9x-W8`k20~7NmoF+w(KuqALlLBV2EQKe?D9dL<BDJ z)W1$GcxVV<oKBzsulS=~obQqof7v{sunud<*T3z{!<&MlZG*#~PV(q3xIJ-~$>D|y z=zaK*I+YMQKC8hgF)2HBG2_0ZLH8XTevq?REf6T?TVKEyO@0~>UnGSe)V*w%L`fw@ z)28;SI+GcH=7z1wqbcC~-MPB_d-?J8+-&Ty{72e%s%nx?Czb8QcxO_k8w*6K5GskE z7|kNI)TzS|&8_ea*yo0OG#ttL|2#mh%TNh6rq%5N<oz=J!xXc<VyI6hX&}cm<zzv@ zkWPc3R6j9%3N9a_GkftW_Gcp}M!~8$y#1*VG~)f!$g+K42~6#qF-46;dXZm#PHqEC zYID9i^FYG9l8%8KJ!RLy@z#fFSf?=s8#MHnUnNuh{ox!?v^E96P(UvCsh#MIfhuKQ zLbxY~NBG$y(it(U>j-Gs5YhG3H_o3#K&P8U1(=Cjl0-GmcuU^wcb9iLmx8wX*{KZ@ z$qnsX_NkK7q3+>S*j?--Clrg5eNNtbmaG`bUU!eo+t~3aOzO6Dp7#6{u_`XLCzYuE zl>VdsP;cv<^xN2<S&*{gp&_=QUDbh&RHq(Xw}9@x0)$iDqRn<ghsmb?+vuNN0@q5T z5AES~_jzx^yAJmkCaxoRaqdLFAo1h?p*qSazKL>l9%LFU<uS%;?4-#iJH36VrbF3b zkPFelqB4A4McFE8-|fO9h>&p|N*3kVg4T;S`TY4f{)Q%A$L$fWLsa4XYfKDbFo)GG z1$(()S7%s^vBW{@s|-}J8>_|Dk)8j1>5%*X3te{jNCaF1UdgC%xmDH%1(7S`A(Y*k zaJn^D;SMQdOM6dh$`9c{5cbW&On<+UeYtrh7>LcTE8O$i&8wwdPq+}yV;7`PS0#LP z-56e?ZDH5cEC<D`vtv#kC#pZx<uB;5>b44Y$X#=?RwGL12JXeaV7J(feA*@1=RNj0 z$9uGj;sBKQ8bH|T7jLh!D8Uq|S&;0tLXUA5tR}6Z>_++g<?2tR$Ic<y#=(sb9N={V zQ+ZfJaDQyqdMsRUO75B*-v#jk^f_$JupDPO5V^Z@tmjEZ@h}3^EF3Dcmt&=1>=|t~ zl1=Z*k%39}&PX$2Vk+8#%eLC-R_zkNIry&zR$dlfvK>Trs^*DRC{ajoxg)z?;qPCW zOMX~w-=)c#vaB|E%#xY^;6yHuq0);#U=?1Z;lO@zO5T}zAyYP0U_RHu2OmO03_w)E z9ogJ(=cmdeEx*nQ?XflqBC%a-e)8bq`d8GKRID5|<x=l6nC5Utzs&`Uo)0Pga;crw zd2-v>mvPw+4@TI$Jx1MI8E<U<>oIPA@7>r9D{gCTTWW>ap6swUxnU=|n<JK+ZcS(V zw`?nS_OzCvQ30W8_l6F@aAAt&2i7(u4P&NlsZ@p&rsuznFfdUs4{)89l)1`HhIjZ@ z^`lv#Q~S3Qrd2b}2_%>BoYfD)Eb-;g$vj~l$fq`!+^HstD^X;>p@{_UVk^0#@F2<n zo4HpuHPCU?jlfw+$E)*bWjHfiMLqPmuMN0%3X|VlB7c;EqDaMz`nlwCJIV4Dlc<ol zmew`4dy*yxkZe$jOn;|nejUi0%nJmkeQ!X}JgOvf4-+TQf)cZf8CurXAjT4#4wx=G zY?7uveCKXCCG^HT_UqIWQ{;}{zLL)$aoG`e)*-1~PTIlD2yZAG)fF6e;KOd-^~HM* z9aNSvZSb8`zyfUuIpl(E{%ma1*r1CG?*=|w7XKhmp3=w)78}_aV)ErqxXE{Nm>)gk zvVo^|{DB{ALH7KhzJ#^gRGjiyre0s8h6w&5wfP$@lN;CamDGHB9E8w7iD4_s$JgZ% zi9#CmQtXCz1+PS@{XtJI1(Z{R|93dd4UX)yIS>{D9|M5lG?0M?i{Q8;sH71=kpR)% zI!O%W0jf<UZM%^}jdLKtibTy5Q=FOjU2qzYL6gD*Qrzizx8E)Q(V=MjqB>;nQwW?s zZB0#g21KgXn0MQ4X<k*hVoEEotCRa~i)$+I9jliUHRHTy8|*nKw2z{Pf;IvKJ*f&p zh-GpsS@s`BLpO5HTH)qc)K=1lL9-DLt#K@h#P=6EvKsVelN(k-O5^ziYvYSta)zT~ zmE=$(hRA!szVdkWA=&TRr^r&m&T|FfcE{b>26#4{)QGcnpmE3VGg`c2B>B*uORV4p zc{Go;j6Es2%^<|0WoiSLPd1%CW$4_yR$AS)Q!)Mlc41xke_aLSrL=0#N$1br8_zzt z=!_)elFi7hKq*xsYqQ3LPyk~hFW=+)S`6WL<ie+t8=}JRb)NY?<BVj7kj;|VVOb>l zi`xrWjAu@QYPYrk)lQTgZ)mVr7*n~E8vb++fj(^egvU{9CLpKu`x-5xhASZv>=0`E zhU#4G$ao^Uy}mBiL*(rw4Cw+%map;C4PNPgE5vFVanUqGPo_PfBcqNy73tUhywJ9^ zS;zumof;tutRed)Pq^w@f`RVfvX+7NDHq9i`RV!yoSgVYqzwYmC1tNqz7e&XkNHr5 zbhI9Id`)Dt_X4n6nkz#+wqY~rC(e^m`lYdHBB>9VKFE!}B*}ZbsJgtVfC%PoJEJmX z4VK#^HevsJ*UP!@Nc8Fo5c2&08ved2;rdYp7EHd2AriwH#&2-oKMn{O$e~eR9LRgh zXD?SKJYWoW-qw0X)dfAJ3MHXFF)F!d-U4GxZbUF<)Z)dJG~Uj;aXg=y1Wg~(WZzb` zwj7GKS*y7}U*={)dLC~=N;B)(kr&1?(i%h{l_$*-khF}q=HmEP+|vsS2pX)szenyi z_EEUHckakt3U6vu+zIBuaUyAaJT$do1yhDq6sYQ(<yYH3Te22=>r)Lo$<Q-g_&yw| zJ8sySC8A%E%`>#+rX(0maUB9b@w99zllaDY2c00S(ePMm?Y~}?kXc&NBY$oHq(H__ z`>7A%Cii)vI^dAYqwtvS#rJhR;6^Wqvx8}_Wx|@GJit&?4rz8|#|Q$4pBD%05;9*o z$KD+G-Y$bDB|Ya`=$$|ZdUn!5RW?p5wzuTDz9?t5ampDgikmz6*U<p`)yayPibZl( z!t4NI*iNzpfo!xBLg5;P?{sZIc|Nqc+<Me>TM(uEMv;BQzB9t7@*}cKw1PAZ4-=BE zthbm-gmwi5Oc2g8$HmbBbMHa5+hQBEhnf(Jr+Wxf3|E@yZSPWuET25DagC{xFRB}_ z0>zbXpy*gS83sN-x9ZA94oXYuliLn}cbU6%oVrJ{uwi2Zn!HFXz86?ulmM_Y1V#b< zHe*D@Cs%<W3zkA^0w>*>#9#>^Y5@MI)W)Gs+-c9lT+;C@0WA8c_ekv3R6?dc?(ms4 zD}c$w=+y{~{+1IM`)(h}w)>}95@DQYCFd#ofNXd`{t(BCy>hbQMAD}tKmp=z+_PdC z>tvnJS54J3kbJ0XZ;R7Mb`+j59hCDISLt_dQug3hKvU6?S__VvQ~R-y8w~Wc04=S+ z|H>&kk0dWl1=#s*Q9uR5v6nm^24Cp4k%dqdK5mkLxvd9jALoX$acaNz&T>0)tozm) zdQyv^5*xM2VyYN0|0_Kd++SnzqV7FPW@h0E>RI-^oKy8m)}-&pet00G*GQxUrVCY& z(<XKqr*T0}!pyFhu}9*Oe^7EE5OEutuU_KCdei(NY}R~&0%pek`Ln~gQq_!4-q|qV zv#)vRu`jU~NtZW#@|I4$%Ap^y`5p!QL-Em=2SYm^@o>;Zfpc&kB*%+*0Sj=!b#MSq z6I+>=oy9YtSv4{ym+#xRgenUe3{6*<(q~;>+Y=n@2sBYf12Z1k;W!x#LB3yy{C$jL zraqJ0U2K8ne)wnlqn6|apyG30XtN!hPs(m4hZ0;YZf@nYpo!xS*0v6*3Z^hE{C`;{ zyhj~MC)u{?@7P|4(|)qu(>v|6Ks{}UB8q6nc(A1<;>m*v83Ol!C*>EQ*w!Qt@M;Gg z@M1QIYUpV45SmDHmXJ$Q7{A-VGuAX(CN4pnwEh#cJ(5@QoGu-Qd~Q?w&vVnrB~(C; zgte*TY*z;z9zU>lJLdm<i8XhR0)3^Y)9P38UGkshT}I#R0sD%%N%3!T7^KUaWJs&5 z!;nv>nJVhD5#qoKbA(29QVL=waHZ80)G<@1;_RrZ#OI<X-!#rY`%xiKXM%{yYYJg$ zmD9C5vEigM6kJAYjMG*M7wp78+YGo?Rv9wQvRN9ELWcqde#W|>;Lc|Y)fm~BDiqoE z&Qm}F@u@BKUOEddV3Fq3W|lX#yz_DNta~WEfUmcV+mZUiT&|io;14Nbdzg60-TcJO zZ{m>_@SLwtJm_lraw#?a`>U=;vaPq`xW%gP+`|Ped)1ZqP`a7d)$wd?DSU^_Co(?F z4p)4F5g-pN-MY5}Yj}Kw>(IOehm6vQSlF&E>=->>$Q<<P`}?W3PoMy{rn6gw$s(Mx z0BcP!`{3;9!_SyJ{(Ri-Wlnf+m+WMJSB4SST|_IAc@(nwR7r>6z0jLnEm++_Kmj}a zL?<Pw!l|^p@-?<KdzA?-(FPQ_Tq`3x2axs)k=*)<gt~hKT}fH)L`h6c?8z9i!K0hp zFa(Rj(PcWwjXDs0_O_}7nI_pR4v869nH|(XHxk;tYo7;0GXDrtqo7UpKFLDk0bC|m zS|Vy|TIX?->Zw;b?dcIGYk@~@D-+1T0MGKL&CE8qI!Od{P|=zou6ai!)aR0=#bYpy zdc{oRO?6-I+^C%wHJKXV9$)uI;6Aq>W7YSNFXLU=;^Yq31Iv1(+PyZ&T*Hdnp-c-) zTK15;{RwJamag-#r{wnGHr=(~v!Kc!%khSC?a0={@hRZr8i0b1N{{YR2CpgOm%sg& zwHo=P(Te{lP@GW@*96DX5$Oav8WhO;r@O;j_%dV>(S{gtw!ZW2l_kauCzfSH$liBp z0NCj+><#nKl5D=Ix@NK%LOs~1fCop?smC+zZ&%+%=qGnF9()q7q<h?iFu$94nY2`% zG8$itgn~<CNy)(!I;H0By~@WnQ_9{YrN|I@;(@1-7L6W$0up{H<1MKhbQ8~a`P^Ae z+`$CT2>8DH7{di)?;l1u@6o`Oqe=Sm>~*OQsZV?fr{7#LmGlO<(k(J0?;()R?vGYR z(L@tkS74d~_TC0CxI*v4Tkjn&7#m96L`A`yqy8F7AO=O%ouv2+l;!l5P6})+Bt0PF zeL~P6@!sou-ydzfnWO%>2SU%)-b0|pwR|ytSUR-gOd-?pA<RK}bi!46n?{W3Ywl^l zY8`gd7M}G3-qc%DQ|ffER8aFXb8mijMd6ojUY9qKGCs%HLYTyhIX+~L=S1Sze5S_; zXt?-Z(c!ktIB1!$$nr6OYu-5#1DFACIElGbuSrap6H<&T)|UJG-hg|1l4EWGO@}Aa zbzzT9Cw9Na?4#p^PkZJc5L<_}3g;J0B%!YsDCMFv_z(E^VZe$Otm$MOn!&1Ef$AJM zTsL+_>Rq5~xISZZXO@oGOA`9p66NH7Gvj~9{}@G5vCzbIYYxp;uqs!eIx763HfTXu zp?ryrUD8LdW5<Glgm&F4ABE9FbNmL47<D75HBl8l{W6XpwS(7KyHxH9OYFT*(8O_a z_$mx?tRv8DBoXBt)|9$p&GCU~cc?o80MF~cp^jQ9$CtEOqP**r*`-=W7|G$0HElBQ zwv=|E>Zp2F0<L{<61)@FC{QG`q>!A+-rDbp+S{#tQI$}9wwm>)zOkF4T9skn=Cs;< zZr2Va$<H2;chw`2oTVsANxaG}mW8m`M#=Qts&PG65H`*k6-!*^{_m3P2_q&_)EfK$ zDc2ios^S|{aec<1PlU2H>m$Lmmo}?zsFNO1&0q7jO4~whvaRrqKHmi|!!_u^yc8LX z#>^^w$Sf2`hnFsz^3bxK<D=H-0syk~{p756GqSCtW}F=JV(zlDt&JiqmZ+dbsSPg2 zGEEdm6KNGDMdB*Q2e|z3_!~-Xe~s>@Ht?8VLUK$04CGw*LfqYq&uxZ&{ZX&e4?Aht zOS@8pUej-1#V9ZK)zL*a)YHzH*j0;%DtB9E4x@wRB_z4=z3@<o?uo9@c8(F>!_Y|5 z%EA!QYD7*k*W@$?_mjM^V*9P!P$J$Njo;cAa2;fc-1Xsc$E1H&+<xgeIkRs1gD@@> zMCI8SB1R=Kgt>~D4hEv2!711W$uA?@kM%5=8jYQ7pCpsA71>>B<qijKC=(`U`g-=! zaY%1DEcEWv0*hQaT#p|gtrfFQ1$DT!Q5O4De?s^8Qtpa#b~JWceu!~x?VHZ_D&npM z?6utCapG<3bqbnqYu2c-zDF@qWfNO<C1j^S^IX6+k%7S5w5|`w$HUO!(=;-t)envd z<1pT7s;Khs-Zj^K|9%F$Z{MO1>dl)M(KB*Zc&&u(di9D{|6gckdmg@gc~J2(WwRVE zaqDIDwmu@$UYMEp=t)nmuIanGyX+mKU(y1eK-fq^R31xNLyBj5XC&D)D^d>%>;90n z#3=dB-3unlcpMGe)*}EP*2kPaHD-i;>K<@}ej9h@0v*Ls<*z2!q}m5uZ%7BwDIl=% zEE@7Q9`fO;Ce(=~nmC|r{>3^su;s*07{o>y4?3QeiDgKsgEsVVIvC&>)@BHBOcZMz zB1|zi09Qb$znbhC-FWG2_J|C=fP)<e-eQzVv(qhAHPl^?U|d0gDRr%tTQ(~F1_wJo z;I}iObrO^L;itA_Q%kJ*W2akiL3rX2-~ri?hjVtsoNiE4H3Y-W9N|6<TowBIlK}oz zt5`gdKE41IS4G#eE?$T~sh`7%$;NOdc>6djW_k)N2)txHS|!0v3s7z}o`(-06X3vg zN|>m}kjn|+1(enixIUm5#A-fNdo7SFaaWjxO@vQ$*%v%`!5xxfHD==Z%w$0_o_W18 z_T9R>@jen4&96`zG7a$+^qMUI)==yfkg9wZu!B9_A$PsZ$<p~Hc7b~hVISpJ49_q? zJ{;|#lQyFxLnV(ymzVD%gER6LG~Xz>qAmS+!n=)MS@smny3=#hid$EYy{VY>WM_JS zJvWpOygP|o*HzLRq6<!h>Q*g=tsWEY4etF(mn%}OtJD?G^-ksF1}n@HD#BCSroc4G z)`Ww(CBlf@kd?0LM2{ZE-e=D&lFch#V)74ztA+^bJQ(dM?B=R0Z9Ttmmcw^0?=^Ul zd0my9SL#eB$A00NBz{CJfl9UGu)6xgugk*p&V_-SkM!m=r)c^bScjcZ7Nb=PV~aQv zt;A9!A^xR?SHoIa;?qTW3FP95m9IjN+|VK4zxfFbcKHGXbkOe?-v@CKif!S{jfhn7 ztPTdrAi9Xkk_z{{Zb7NkBcr50hCPe_S0GdQ9+#{_-3T(5t;$?8K|H%5Xy3+JE7=FM zpkJ1e{GhP&xd`ri!)xU9y-W&fXpiV3OqXxLuIsJ-!-#fE4=LVriZnd*TCmA6f}AY0 zW~lwyy^0kcPMKVF8Zsl*T5^}xT@B^CL#zjNPav#L^e`~_&7}ac!!yFu_dCDwrh`zi z&k+*4oD~&Y<V_C|9Ax25jLGD~c!?`?ehXuh5w;-Iuh7D(Z(orjmM(;?1NR%)bh){L z3>H)9dCu#gb*Jisb8a3jp}^YGt*NnZH;u)v!%!QY?@ancGJ#$SU3N%s+lE8Sy;a7? zRo|FSUyV9``d3;`EXe=vcx54$Nwdh%iF5*t!Mu65&IQgo<kHS~`t3HTlhRfZD3l92 zbJ14`+|`8l6^Vw=K`tj{i@2ZDO8oJbaPuby&m(Ibna<fE1quOM&%?g&iT;Z*K9Wow zKT(`vLMUK?xKj^p)_cthh2JR6<*kxLqnqaP0-GLNc@a(64-brqQ;LPSYt+0$R!D10 zFT#MG+Y}&vB>|n^)5ZJzY?kz0pj$S>W;@_n7dX}3K8f&-!RC!^9tEP$u%hL0hypTC zCIwCgR$X|RrtkYs`8b58xE6_wyMW4*0dZGv2c1v|idT_z4M5T+&v*G9X}DvWO}on6 zlQvvakpX3)s8WoD=X=L^e|@)Qc##PWMAJNu;+3a{#cr|{o9+^#X@^5vsn-`YQcqIc zuq#A=Cj%N`7u8p9<`sl{FAbWUH9gGM;nzIMhD}A!!#iG24xs%pKEU$N*}5!gryRCA zbBn(K=hM;U9z93gxdX;%>AV{Ud+~|}d#W23mcu}e)>mW17nJO{@Gnj{3uElhY@4hr z<(qa>(Yr9Ly3Ix>07Qs~w@YbcEJHPNj65+=5Ds5DG(PLlx|wk!2JR?u2bs8DY-(UK zTbu5NO@xIoi9i$dm&%#twS*e4D%zKQ*2o~%aD7caC|xG)=u)lQlPR3Q7v{qAX1umD z*91qDJQd3*-UiwboQ^7n4kXs9M)IMwNXAY%EfhO&DvUi4jJWFeNg(GBDD$k~QYGw_ zL0PE~NVYqXN_7C~(uB2lA}|)9L)_hhAnj?KFH`^=4v0&GhZeBViSuU)!p#RT7FgVe zNvpDR21a)Om&cEe9Z)+D46zbaOg{UOh9AHZ*2w)74xBze8TzYcP=*bzPm)7A5_&wA z-9{6?P*^c`SPX;`ZGiA0S&5}Yf(N5{Kl(G-ogSt%#(~uNRoNZtPHIHHt*ZWu<k~HO z`M&zf>eJ4#6s<BEBf}?HUx**?v}lXB#+>>BG3d?pT*?b{yY35YpjSEimhxIvJWSlo zu_MA&^Ti{0?#P+pYi*QmA-uuzf(HQKe3$b?vg%dsK5za=`s8pQXLNCOWIBpzPw%9Z z?bx1&G7owathyY6Tz*sqhLe46C)P;6VHfZsZ0n@g#lAH=cpi>BMyE94y$ls!FYk34 z>`(lZm>MRhOn?Rb+}=Wt6&>^}dxg50ahp0n`Qz!O9qhyQZ~snj6Z^mSyF1u}Jw>$b zB%yQbU%%;NH5Yc&x1w7QtUKhC({_p6$Pd}+fpW7%ZUK?Y&eREw#;h%$L)@0-5Qz&> ziG>0ixWEMg@ZG)`J245PwUKVKW%>*D@2-u1h-~eayA>n}eYtsx0X;ZV-P7tD=Q%24 zY-b-vV7=~xY#zJu7eIz0clxDGm~Fy&Nn>%$sD999N{SVh5(~w2wNdtk7%$C=q1sl* zlUGG}K_=|v?;iPP>V&Sp`|@A3a^Ue?Qm2U4BgnQC!}miviUvxozkh26A4-}p<vHZZ zuUqOEKWSA}^b9-S2ubg^$DyEng3JHINNAc@c1sZAg+7-&6qi0=;u#IdxdFqvd><kX z@-ry6xcwtPmhnb;XJM(c{SUeGWk9Y<-qxY{j`-W06}$lV#+TpAe0!pl)XAN8KiRw1 z^<Gqop%OdR$qnB%m842@)6+R5$;$sv)K@{}t>1<82X(cvWMJc;HTeGf;&Xk%EFSb^ z|8EU~V<lv|18HuFfm<JuC{_Hlvi&3dRg&-Qnx{qov3)%iv=t>=m&cxCb!f>y#h$Kz zF4~H34|A@n;>5K?7;|CQ>P8DEZ7)0s+W8a9dXRntP*8G>N(g;+N|Q$Hd!h=W1wN!c zV+5U&fPCKPb<#@=+AaA&S1a~rr3<Bk29;*Yv<4HP3up?LLb^bfOaf}Cpc<Z&N#R+? z$f?PX8BNsd`#-@m_(6!{5ETqs=e67E5Uoh=9p9^;t;~`>d_2(!TKUD?-4-a+P2Y!@ z6-75TA{rlB5hQuWU7DuBUt-g85)h~G-D2iLQ#0ft&nGVByBOe_<^EfX9sIstp7Hmj z<@aWs79Gp&(qKQyO+Wcg*|BY1MnD)Nmn%LN;zJM@?vnUIWSx}SSR=Gy6+<t0mxf*n zYdC1Ko-RYx2)elLtz@1B2GJCfV6WT}m*BACr`qQ-7cT|pQJzwV@h~ij%T<U%65vCo zoPBUNi|mB!`H6Zk9Uj0V`Y5R{QwyklUpPtpb1~yKkkKvV1&(@m_yk&8C;Nmj?r|~6 zkXNywS~&&BN8do_vT}}0XDL~RQH)Xty8}ZNMUBaWuscOx;Kq*PPn_F?e?(bLHfUp? zU#a!xV^?3Pr<53)Wo_g6n820yU|2fP2**<0c@n~Z!8IAnS{Y6>*)YA>)o2qi<-8j` zcwT8cQj!&4ewUBSUvKxmVCPv#PJW)CZdkvBI$tt?+!NV|j+JpJezHHvM=-sbHK$}r zI6<FZ<DSbCJb;S{UTHjvV>g_F(5#S1O?mTmL7*~9VruUV*%HNYPnZIF*2~NANRw{M z*)&T=r8YdUP35N;DJ`eWW8|v8e)(J`e*8wJe;@&y(^Pc9+|OTaI{DMLApfp*|ERh$ z+1{~9+2KS%iK<Pev_FF|Zl4X!!*;6@S0cqBQ74aAjb?-~t**oZ^qK1n3Y)YzYrfue zoq2?gwMxl`*>&umR|@|s$C8!F?J(?ZSTyDAUZx7J8W+fGgOl=zUJp!tzUwJnPX<5` zDotJ`<Hu>(510eN+>R(eZZ~FMf{n{lOP##@1jhCioj;-@W~k8W*d7j|{Hr^FRszh# z*%0|N3?x3S5~_Z9Jb5B|Zg{%v;16rdX{ovQb4+L4Rxt*@VQC!v#7eHCDJC4y^$31} z69<zG_Og4&NlN>+fQDiKc=>Nq>Fjo0W}J~A;oaObTWQko5g@0^r&5(I9`TN`A}ZFJ z_$;F!Le}ob^HpWh?<PTwJ?Co(E7-(qvf<w=Wn=&QXa^4<8FBkJek<cad1zv@*-Lb_ zTFm$JAi^OwNjn1_>*^L(XK{?yin+upg;Qgl9Q2vJ`zb2}@f+tWgum<m`I1EllpYI9 z;xuh9<+m|}zO~6U995Z$k5YOQsIr;d*<mPn+JIw_QdiQO=pmRtxEGF@Pgg9IyVd!C zbT48xl$ohjxRt0{F3K>nFETssrDNRf(eD{O*t$H8m)$RyYyi#B9=9uC?-;_%0Wc)i zh&5y9r>)vXP?sKci`3x_L*<f4fMN{=zP7{dT))p^F|!Li&*fB<CgyTd`mQ`}LZ_&) zg(+nCV{##sq@0=Yx?UwD5o=ep2*=CNE72iWwqm1~SXDA86YGUgiP{3jLmK;o;YCYd zPz?jFpONr6|H1*%+g2~>-6GUnr?!Qbrr2Hz(@Ytyb($OK5!O(*4Y{f=k_&ZeXKh_4 z>Z#z$n0igtzFd_tMAWM=z?)7dKeLMk{45blTT<{JgjK0PI0cI#pAIO;Tw#RN&n_oB zubS2K^m3v}T#XAutqW`NGK^ur7UZsSM!<MZf2%thuP_dvM2XAv4E01cjr{^CLmw~t z#8}kf?6EKdv{-aBJIV6*K8-c&c4uNFsSteoW<GoEj8LU*_ep1rSBLEUpHY|LFOX@& z%yA90`|>lM=krG=!Dv3S9vIEnZ`A@21Btl+2F~X>I$!nqZe^ta_k)R?vyy0w9_qlm z=aY`fu3U@j5_iE$s>Hd8u=7kRi?}KaUkc1)ILhiuQGW)*K*aWY@)tXtw+Bg;;hhtY zoIgkJ-AzC~+|SxK>-@yT31GDyeb#2L!*uRb_XBye04s|_j9ni@CLkT;xD$ph3hxH8 z&e8+hjHI?#dCz9hn*{p-Uh8l*h}d&kep_(kU4@|H!=#{yX?CGf3-X0oAlLx<a{aQQ zsM~AVVq|#^9=6K@t&8#IPZg?C*PlexOBaNPdf>N+#EKT8IDHaVJlC2i(Kg_30Np;n zD?t%iJg!b|K;JH<uKAMVRwLZo%#cqu=WI`iyuN=g^722~Mg5f|dSphI87hifmoG@P z50KdgU9ud5Nd)}%61KS2M!xCTFPQz6eE&?XaG?A~d2em8bIktF&ve*fx1W=CR%ll2 zzrgtBW#9&Wr{nQ?_wSQVOpKcnWctjM^50E8k!ZUl=C0{E5*N&8YMmw<`>yUEXKGQ{ zuONWDD%iw#B5#$x4dG*R+P!t<=uaRJx0ZD+HVSS)F!OuU8lC}t`SQ%+2JW?Yud8lA z*1z-BEKMSIn(K$?I-0vSjHubtGwYTkAvS&6Q7Cx4S}rL6HYot`vr%XJfxbNH$Z778 z(@BeS*cGsNp!4gGMcb&e>Jd7vEAUl^Qry?UZvcLDn+N8&YH-2BKQIBT064HJ6<=t% zKR*l%l7C-;{pG!NB~Adw+9r9M8R}wl)vlHA_1$~Em(R(r3Q&6Bu{o}9Z?T+T0UJkT z8+6NZ^rw;Ntg~rZ=XTUWc_(LD%k`}KAPxie%FB(+wCnWt!#$=Ujy7j^iLnx$i_04Q z1-w%q$mVbxe#Y>LKn^u_S2Z_cKA)^Ww_f%Ug{M0Y1gOEmIB->328suZ<2FxNumhi^ z>aOVmhlA7BrI%Ga3%fzKg-aFd%bDkZzWs>Div?0Y8h*Xu$1i7e`v;OI>GpO1%d2FR zlu#Kws0_-@crp_M>@Byi5nC(3Uo@`OSbQQ-uT@_Jt_GL?S(|W?QJY$e6Z5;NQP!K* z_y1lKe{laO?t)M&dy)7v&;Ro+@LIqA;@9xR;%i_6MEgZ%c=MeV)T-^XbN|zR=S*{H zH)d|*g&MBp;l@B1zSTu$#hX5Fr4;)1|M8)xvzWU9ecQE=I!Sbme_3&cTrl@@<UlTZ z8_$UKfGBTwr|Z5~O!Tdy|6~TYx$9nK>%r)t{$K}H$k6-b<qpx)yya5sD+oJGZWOKC ze6mNm>%X|Y*ToQ#OY4qJ)h|}R@8A}t(@bjLQEllwh$C9%><2b{PKb$argj|SutLB& zw<x3gD#gcBY2DUm<F@6psCy9Mr0y~G%rN<dKC9xH2caNdf$EfMb(hUak=KWJ65j8G ztPVbb$T5(0=con>M=3diKFTp7{VQ+Zlbrxa3Ojb_=|;m1t{I?I%B`$6Ma?3S`BwDp z((tQ1tCk}%o8D_{=5x@+;iSy+8%fYtn|jY?ejZdWbhwQ=vj%R0fqmcJHqniz3$kb6 z$-dAy5%xHBv33eKU6iiVPz%>|G0tHxg+I0PId|{D;ddXr%B_X(xp=IBTn{fG*ETs2 z#Yv=YxjPEG8$8p-xqEW<%R1G`qGpOc@{m{i$%uiN%7$WJJ;~7K&Aa9!10z(e=JWV- z%$Z`zxlaRm;`E3cD+8q??w6!L^DT7lLb&1_0DEp57-UD_LKx=HK2wgNJ9=SR{bn(x z?~&9ti_6S_S96tKd$!u?>je%4W-FUiqNe)G{LFZqVAK8zI_eSip0T(&-uO|8uCFyI zcfWv>5VM5`$nvj_oC8*85#JrFr%+*VN@b%1fUJ@n-(n6mydnal>RJ{|=h<6&v~--? zWcNY5b2P8|zXU#+X3Kluv5q(FkCH+MHEKzj97v6`2QYQs{<m>1EBuRW=HOV-!PM5q z*3owtK3<%JN?;QC`}58JxHxW}eP@;1g@aVlFrf`d@0vJp<wEUr?HfTq33QqLy!W+s zTd$hCBx^8&qnLyXG!z__*APpwUAJGizuHO4X*{!b2iLoB2fC)DI%Sr1w5XxG4i%Xs z7S=}y`+U#gj@AV*JJL%lw?4;%F0+--@i|)=5zLOdfUf9sB<q~I2(d6J<8TumE=@7J zdrD7Lv$k-D*tK>Cc_ydtYUgMdh$LI>aVif-5ojji3hqFJG|Rw!OS^6JYp^k=_(pY^ z^%EK?Bp!LJ^JSsCD6e-hjEHHs$Lx-uW!-bev<(sSLX&cGLQ+l4x+^W)=Cl7w$t{rw zPX>Gq3@rT@!x!%YecMgu1bWKRX5lTwfZeg#U4@}90VlZK!tV<Yh{RV%#%@4=e4N7v z&c+X43SgLiUSJ#pUpzHVtSi1JFrwcsbi3Uz(D>}f{!RDCJI(e7K}Jr4zwM8xHkW*) zPs#?PA@hfWN=pxk1oN5KWRvugkIHC}xn-u?wXxt5BBZ!@<HHYAJ!Pr)ZE2_SH}fso z1Dw@ZK4oJA+$Jz)Q<4J;^K@V3zL^V;j}p1QeMJtgn}uyZ(CsCdi1uAJh?t<i;F$&O zH0YVq{Yp4^%KGNU@PLaZ5Q`>4pBY>}r>}HmBgS(|Ut*c;Hf}`S`L!Oz8vXt2{TCB| zbsgsg(Pw)1)8lyO9{)A@?a6inohQoa(KMve6X$_JXT{JA(g9cMj#PcMdp__~&R+Ch zEF?G1>-lWzElCP=;qs}{CVjXQuH@eNdtsr2UING5R&B_p46r;W)7*AnzAcmPzI-(8 zgY4i}?FS#W9eg4?=%T^caa;>fi?Eq_wc(0_hSwo05KINyO*Xn;IN!*s*9_tQECe7V z$xp`(29tYg|H~nG%|<{!r@01~U+tZf+YtKe-0nr~Mtk|8Y@7Mux<XZUHWua&Gil~y zWZ=G8)Cxs0lp`i;Dp5mjWaALCZ1Wx))%3!AbxC9T@X9fNMR)$;V0KK0dHqfHXx%~s zP1~D6Z-`DD4{au6%TXgMmu-YQeM|_BhH>6V0*q731^!9J-0$JGX^us=tu|xm2atCc z917;#yAOk=jfRegwCqxbzW1|6v0g}GBB!SCfmzf+WT>pFR>FcS{nyBdf_!yxle8yZ ztk%3V$tNkEeN0l$TaIgmy4@?i>Su7Mt&JGk!FFLD3h=J{zOt4umFOTDsgkV3{$l#` zO@uF<A^%?j$>mLCOgU=uw^-21lA?m!d6XWIXwouPl&0I*kghX<#on#LAXE14TyKJ` z9n^Qm2x_pT$wAiZ_STA}(x~<<%&Edc>}Go$m^D$>;L!Xan}fALUoNq-2t+1VVYA!5 z#HQ&qG^Xl~74evnZ7R%Wp&EUvEk-#!vDDhmdd>V$ai(_{UyK|v$y}j8n-%Ut7QMFE zDQ5q|f;KxWQZE2X*M6^XOX?d^^~Q@>^ytof+=bK>?Aeak?6K*!4jK2o1W!U1lnr2* zBzZWw{ory*uCBN)S1$}Qjs1<iw_AL`fz_3hqv}+n&#H3JXF3yAc|G|K$;%-Deg6o+ z21`7e<XmrXm^RK8#ICl~mT|#(Z)vFm<sY5fl6o9}&ak7DxtDhjFjN|p=lHQ?5B!|c zp~nPxp%athX|AeBD|dhWfOPKSh9h2Zdt|~PNRmuR!t7hei&AwP8`5;fvDla@EGl`g zg-<?wO0_kH&KQ0*j$-S(Zp%iWQWs*%5?)jn<6&7`BVeO4;jTLM>ciL&rrE**<=Fm1 zS5=2u3yUaQPREOYt6GtVtOHMXzIcWw)l8?hraBY4I%A98u02*&>8i`bIH1d?yVHuM zy1&^X$rE2}y+k8Kh5vZa_S4(uYmVS1)N1B{+5Z(;syW0}n)C#-yUyCId{S_vS=JXG z=xVVO`#^GD>lrM@mDsZ2*;3R~_N}(*x!ae^M5BUIZL<cIyUCfCvU6)Luf$PG@7yRJ zFj7L_kC$|T{q&oXoE>6urv4(4=DQNt26ewzdet|Eu;h?iI5Q6huXGuhiZd&wHDZEW zc$99?!0LJxd8y!UF8y=zGGbSMYRduPt@xVvJy!=%p1mjzvBjZGr$ydIy@2u<u0NlZ z)MKSBW?Mc`@{Md7Obz*0uFD4=p+y4yAgePC7Krq3x1Hs}dVTc%>n*>U?z1!)!zLzl zXl!`5JCRBI9QcO{hjlJV`d%<zkTGwS4ZNHh{))Bt4}CL?8RilZ1Lo68d(l4}?-}cT zVEpTVNKc-cLmo=$7F1!##Zgl2N^Z;Z4f|1?YDAXyUQXsObv5aq!hJ=nG3b=QUF&t3 zT{X=wJPR`iryk#LteE%l$Kp}d%G5N=x@I${ai8E{_faiqtC-v!^-WNPS7?03rNF%T z4Ou6ggzdT6t*4(q9B3OOz{+Wg)jB;L`Ne6s<Z+Y-bZPV34_H|_%60V<-aS0kqy0w~ zl#@0#e!VRu4pF&FqMW7M&&CF%_wy0><dVrz@b{8)O#i}XZ3Z?ZLi$@MX&u{hGKQSI zQ3z={6-`a!F@dcZ=S^r3^F;>+B<!mRLHfz=LDG4{sAY-l^U6OkWJy~2OfHfCwPN>9 zAKtj4c3J*pLMI1VD-PV3JUAJU8QOoJ641Q<aTrA5yH)+N2kwN%_prmG^H+qK=tQ_) zA}HE&i$&f2vq#0jVKO-%Sr&_hEGY#B0B2q_s?(p#WYO1n(u3PrhVtHj9I_z<#$yoa zAuv(Zz}Ypwy<ZFx83VQhj5EXiw*3rX$U=Z&S{#E`+ytj(eJgqMm_2nE(2+gWzK#W1 zA^-bYNB1Sh$b!H)(3eYY*?s-))$><>XRpyT3v))nxCQG|;mtiER7gH2$i{~O$#!ca zMPfTAs>^3H$lh4Ly(WVQd**$QW@Zkf2}ae>^TtQ8r(HG29#3F{gJUp|KnOh09|4I_ zf=8?b?g08<ySwKQ_TXc6Yx=m9{2Du`R#~nsc`T{9o)ok9ZtqTN3fdUV;fSp?<t<7g z9p(2%vR*@|IYcDxqU=fBqYjS6K!YHN;C)C^gl>)#*7M$5!eMa3I&LLbmeW<fH`OO& zv!p~a!4Mv({UUvzjz~++t7(pUEcsuM%M(cl8WG)q>9!o14Gt1EPQqI(57T)`MF}xm zTdEmem(LTjP4LHJ^3*h2i?L7wF=NlS!v{GCZXHQEq{v%hHr#5Yj$hvKr`{5VW(w7A zy&872Div!qnYR!7-5FZ<76e*JZrt{9=5<V=!rQe&62P2*zJ@M5XT#io9W)O4r6?zi zPV4m`=v>sr`Btq9e<;a2%%tyk$Ld_rCHU6VS_*xoBye@&T-_nknDN~O=rcLF=*{k= zycVk*Et{kJ8F&f+5+J}7Su^HrclY~(0fxwyMHGEUVfPAq=i$MFDSkxX-MecxRqFUA z6;dM@epr9EAY*EoP9Qx`%lEm%ngygWV^OoQh&a|1_|-?aCZ9ai=qHnElSzYsvHvSl z+FvyN!PLKINTe6cOVK}#eZF#O@~_G*?*kB-*wqZn4E(A#S_sBizyQ=W8Mf59g;jT3 z(f-wS)y&I)JKZ~VRasP!omVM|D&eCzdH80tV^xQai)qd+X$5d~U@O=Rjk1vE352Sd zmfW<cxgIZ@_1Z04<CWF4FxNFG+wG|{g0mAPt+t^FZa8x@1}RVD9E?;^DX-=@<j{(? zGjlvuZX@|9jsIg;$yiVPnMB-{z6M^cw1qsy+e65Qwa(iq?oZ}3rl_rDV}NS|V%+>2 z^3*nUm%R2lkt}hG_j3E`0IPR@;32eXz6*@M!^O=XcIF4)#S1@g_llFc#U*onpi05} z!(<waL(YCZ(O(v?n#uRFIsfE0TieWJ=ESGYECpXsk=FIE(7QgPX=e69cyfWeVO2AE zqxbvgG<G)r!r?3<;Fl{pfuqUF5_xl%$l5-oo+U4Ak)aD_yieNg!+aYY-E+!Kb8wSl zSvc*Nsgz{N>r*gL9zkNaXf?32o02Ha8NA{R+O5|#r=UV%Ba!i6gz?N@82QyFM-${S zR7p_{?e)b67s3lZ#yQ4|>Pr%{&tJ>RO5R~LF7H2*Hsl0)6`dOpr=6l__K3f=yKr*f z?Ct_gt4w`&PrcaEsePVa4;%2lHzdjH7+~yLw368I2vAIYiaaw@oCP-AD{?k21?N>> z2}oQnF0VYK^t9;GS?yz_WS+bfSun@1N@{72&Kv56<%|4r>9`m*BCW9_Mb%RuMFn<T zORr;=&zI)K!AA*2V--YSNhHP>9uSEpr{WYGbV>5S19rph`QUR-Bi0!q+;k0t7>8!1 z5!31D>?G(uLc2dHQCTJDD{~ux1w3K{Lrg$ncVQWx1FaW~cXqRAXy6qp9Dd72N2wPu z1ezO~;3c~pEHt0Zwochat28bo=iSwLOWhkIsY^SvyTu87Xg~`qp&kpvd}YuNj1T*` z#0^M$u>RJICZMs%0e$}t;CJhCmFIoa*v0&`TolYfG8KFGU6Dgl)xlvVmHa&?#U}|7 z?8Ejt=hA+mI$LjvNK4z~lunpu9<?IY7UlJ=&3B}E@@3L560(|`i=(AE{iod{U%8yi zm-O=J0ZGu5J_#ko3cS$Jj*XJ<(R$H%hfx&3`nXg7k?8{G^PZdLK|co`1y&V2_F4z$ zE!rp#YuX%inqWr4SFDd8<j@_5^doYDF4#NV?=uHPB9*s<h818Cck#;0vGMu)+sb&7 zThV_f>>b(l!j``YE2b!20%7CmAaN|9>QrJHjHpTF9VWY@rK3yIWqeNRC!>vX#!3M2 zt?#cd$vY%X7N(|q)}<Zt)Br;hL*gW$ZXyd&39gKqmsUiv3ID=e0=fL2VuthU+K8TH z->w9vv_Jmf0l#GkpudKUB82A}*G#;kADS1KS4BK93ut)P4O=tujks@?XHgY(-_)=1 zU6(xGde?szqOi}+q8yYFH_ZcC1{6M|*ql+|O^`g7ZOoMaN##ZMQDtWP!^g=sjfd`V zeq1`9x;cI%l{@!0z)d->tNph!?WkoRFu#YTbfxh2F|Q*}kk6O>`u$6FfHGvTLCoyE z6uK|<I_WqYw37CY?4sLhVth3&{M{R&>hIv&$#lM^{z&QDB2@{i=VWU_(B@#ElQ5*w zf&|S~Ch+kOaL=A;d#<~MH);W=XM*n$1&DBGEz;oC8PYhP%JGPxlEljiXJ!%;FGY{= z0e+rvn@<5qJo1ZaK4`YZg5R=%n^p8$`;1igX!^+B@W4kc<0w$6^$GVj6)j*py{-3} z7A}CO?zewkj7sN-F&0SKIVR2vquM56X-)fbvk|gzB9#2deCzeD(=}efTuNJJiZ+~# z$8+q609{+xb9%g5^g=vnCUAN8L31!Uo0M=NB{l!zY$9_H`h3?L3pxvxSvJ*4w*biB z<or=sPdtL;AYzBt_R#j#(cCe3LC^lnquK_{O=vG=CQX7izV*U6eY*wIg_GOGd>9`v z-pG%JsRbjY9)DUQuT4>!oG+1ZJnHeps|##e-Hy7Za6TLfAt0et9I0Gw?5K-Z5Q-N- z81ro9XDUYy*B!Xr4;Y|oHRpIpSfGE<Vo>=RH0?Em!H{P+(lf@M-T?27yd@u>WY*Nu zlw^j_Z%H}9dD$Du)U7&EHKlto()(o#s9eY-tc9I+xH~F57O>jeXV)M)c5|%b$f`Xd zbHO2C*6z6a=bYsC<5?wL1gTFrL(S@Qdjdeo*)RDA+WpNO7EJCztj4Q?-k|B}e@@`B z*l~QPqN5>i%B%AD_e}T>X6?QUVPB33o&AsZbQ7eH>VOJ~TH1nyn~x>!oYP;iB;?XU z@}4OzD%uFe3L)x|rO@M&uA?(DX6Y2z;k^CS-2JsVarx=?q#HL|<TuZ!^i<W>5OX!b z{%Xo{bj|G-*8YLnUhY3y?f&TIy)O%F0DXA||ICorvgT6Xkj94<&nkNVR0%wDs)6D* z4tg`SPrMIE65nNLxlTZ=E$`bW&Ph&|`L+9w0@(Q54F$)&Zftz(kpz&6ZAx?Y{<m#I zTa*kR7ZE2(GSVcDIJw2Z_|)K9E_sb&22h#hK(fxHLsLJUJcgbkSJ`jIqoK5KSg%uI zn<;FJ)RcqWiRS-8y*I~yHMR-)M_1qLjY1U(OwFrxs-9hX)U<OFNEduD%;?}zt$yWS zx@dHD{M!ZUdH9+ix%R3&rWxo6BM7`8_8z3`rQD~z?M@@yPc~IPg?#-p;|=X2+YW!V z`64B!37QW+a(W-An2*!U&UFb4P_^1C3kmK_7=5U*`hH@9r<f)7c)9=vmSK~S$?Mpq z?%TjUz2J?+5d!q>L6_Zo&82^bWRE!QIDF)}cvfU<E4w0i23|c1LWsQA8i~H{HXI=X z*W13X<ZY1Eb0ohBxN|m+6ItMi{Uu+_H`k*FTsa0zof}T|7&vRz8$MU4KB(SHE1V>K zr~6^#xz0c9+kn3PS+_W8_hKa~cd-W#?00HojVqUZy#b_?zF1~-(4bb2iteq{+=ghY z7ancCbn!X;UK8%+tK>w1b^mU=>6@7zVcvZH6g2jMKQo~JP7ypdqu4@iytLwGO8z@7 z;oXG{%W>$;U~IZ{8B^S9quAU%B%J=8L}fMLt$5O!<tY=iEVt|T?VV|2K~cJ-+ve+z znBUiAl3`w)`yCk48wDVL69KmZk>|d;9@-Y7oh8BVeled?`>Au)(P52J35QXr^)_g$ zAT7BT3w^9#5xJ0MD$HLSP01!Y$Bb-c6d#RboBkvpx$j-;@TV8rRz1ICn4fa$5tE1< zgKmS(F`%T-O_SLcbeNa@+Y2NPKL^kLzI1Hh6fGRjHarxjvOzdS4@Gu)ZEhX(yl5z3 z@j6f#cE6B>Gz1Aa!*z?<nu8YG)|&9d)$6Dq?Hw)T;)AZU?LB(6xWm^uj^>>F`A3Oq z6Wjc~9ew5{!WmHJV@+w=(G&E#9g5Apl>~hOUKn)ir((|D1v)>Nm>zBxl#ZXXI?4C? z@Kzpf-$~OYbQTOODLC_FXnW?kCgP9@B#`Wg-Qzhuv{L-j2@9vMH-d!Z#?NkH+FPKX zBpLsc8cCEnblOj46{#PGkXg*~SQfL?(uGrcJ>r&rPEhvk&^jrk3|EeHZSsLd{-H6n z%}#HXVCPbWu%j($s*DyT>TsGgaTyZ@==NQ6#4J5wb&l==fsikVkWAV$u#}~NeGB`R z+}XQXsf)|8e_c@Q+lO|ktML@|t-N~BC73S`tmAOBVeL{d#sc~uGUAS3yHilp7kclA zy0WQ1*{x;AS_2oBbbTZqp`79Pq$N2=wy>zsydp|Q`;2QzTTQI8wNz8uS(S4lx3>?x zW>L(4RSIT*J<vi~*$-Iuy)V-;U$a)fDqPdSZR?GY8gCh9JrGb&z~ZVH!@dXhTr+vb z$$UMRMw}#YYw8=hj|qgT(WVBj7=#<tKE9dKB?<PFiCG+bnjMScA`BY&SkqNMjNesX zz0ZzZz|B-?MPy_VL!%u)BsVI_<UUbFu~KN8e8k74ZM-VG*s`BreD#3wr}zdt@0uKz z)FmpJ?^+v5KD}NTT9jRzf1lR?dxJCMRa@KYt?ZIBgvAwoA~LyAS*RUAq!uxd<OWe* zW&ziZyd30JKZLLE8eR{V?sE~cC^S2cy_n@G3zigh-Mk5C)_;GD2X@LoTmN(JL&Czp zeb3kAyu?~jc2S!gvJTYOacjJc&PtyPHGuNsg_}P#Aj`t3ftrT&G0W!Ag4OhWs+M;w z^{(b<Gf(Fp2VThTn?y6s8JHCaadkQGa12iT`v1=pVdS}<_VC)8s;xW$9i~^J9FLx| zYEJknFs*brz7$`7IH51RvnZwJk}{LIy=#P&7q-lPe6=YH_tI%G>rzywA~4LBnQMdK z|0kKK6o<`vwQU3chZyC_<EC!Jt}p0s{$)gTV38_<X=NQaqJ}rKQO}izHyW?E>?zEP z4%Hj}`-0Bif*4_qmDLtRzjgx*Ju>){8ARN2x!_;|&wj5VZ^=s<Ub`VQcQwHs=M{)0 z$)!DTy4fXj`lc?V+8gap=}_f(S^sP1zjf`{{LDiQ9KYtS4C07UWtq0*W@W#mUrNuX z_cL!0`I4k~qD;U#*3<fo9dlSJbq<rUqoF=kf2;%>E&F0}U$JTmkf&N=GKZ%Z+FDuf zKxD(#slSpCDB0j^SneOk+fmj#BUJLv!xSh-o47VBxEvj^IQPG0EG=%RIe*{&nVQPn zKUa!0ddJ^#+34fBdz|e|P$?_}j(5j^V>&y{_o;+&Q$4JEBg6z0#tO^u7=VEWRv}O8 zXCmwe59;zgqdLYpXz2Eyyf0XUNS7Wqy`ea-8+-S!DqW9=|Li*s95XmJ^|&Vear{|$ z5>B=mbZ0ef=rt}!cf`unP&%eT%QhRK>LTQTD$Lo=Br9tKqFJPxy#p5v)SO~GZ8wZw zc1}0WN@g2n(~IF>1bRBf7<EX1uHM>fB~WtpV{9G#`e`T4D)}X@I^%>YGka;~TirKK z$Wpet?8Gw3<!x&1xuN~B%jBO+6~9qvh8Cx~iQJ^UY9KvXHB_$gauFm~{%g^je%ZH% zbMTr4EUWy_hq?i~i@GW*Z&}|AmioB;<?a2Ci<h4SK#l%aLDwd$c{Q1CwaVcc{W;yE zX;(s$>ThSH|4>(#_1`Nrb;;;Vl)CW$$3+GoPwruZ3KJt1vv2W5Ym=~_N)Y!qwN%f6 zamZ)Q6Kv$|!aSKZ%qRszD(2K~32Q=U6l@6%!<LBHiUAiz9s`HTPf|F8NGIXE&It(w z_&W(Lm-G#gPnTYf?*isdq<Nj!rtdoXtVOiebT$-T@YY~snf=b4s}4F~<oRQ5yY9u# z_|8gZy<;9vw(i<I_9)?n=bU8DGwCbvhgt3kOiqms`$SCrb)LK;l}y(v)OamkR3V}e z(}iqi4P%GXp&dM>_Q(~bYKFmWWy#CRc$P+0)-~7&fwJqg8`vw|ZSLmby$sp#Gj~J! zErD^!#_PDESIeE7wj7ruo|le=Z9L}H8skg;h6|~8PZp}A$5+yGtiyU@ox13ES;;k1 zS2AAUzbr%!RSxYw@k)MYQ#NdS%kxVkl_Qa3V8{6zgm<}bQ^^Rh;aS6pSg$SBR)e2@ z7D`VL^qbXAIR06bSq^M>3BNX;lR}O@F`kt`KJLCm*mvWp_CLl6+p<EGw2{=HlThGt zq1K(yI}skFRiqBSEy+__smoIiDq8r_)S)*gukvAWo)V(b!wuuR3$SN$a<M9Zuc<o% zp@IstnVXF{o1fLdaMRiUbPlLsjg9M@EZ^^P^4hf3TY3_-R~Y<-QnyO?laT$-Zk-fG zcDd|d6atLk;_Ap~xFof*wJ?KFWp%`11F})mm16~rmm!i96)nDvhOnvuFmG56$RC!5 z31^N5*FS<tVyZ1=Rp|^)RhF#F>frIdu92pyqvVg~lBTGK^?&?tc#=qsKizx$ZGE}q z*{<g2HDv1Z#^$LN{gvLTU1?cV5+#e7<_TO(D$fe?rp#qW?UGy5<l3dy4P&e96$46j zJv6?y$clK>Tv<G^=~F!PnwYIu&Ck$XCV_Ft(sN_Ie)x;YbgUudiqVUvGYekmP>r4* z_|&Xx*(tZ{L3Jg9J6h-QosH-~Rwz2at+PyO(?~755Kc_HW-HU*fE=4ww0GreRhe0< z1sR_~aVgKA<|1fe)9;Tkz{h;_J<>71Hvi_{I~i8tBZwXKmC;gZ+w3*zjdfayF1H_B zCS~aItF!f&397@JlrVJzP_tZb(7()H*-$QOg@?7J*(M(~R}@U12>{1Uc1H$V9?qq% zvmh(3ON}|Jx+I@{bQI~1QQXeYN<H6vPg8t6C+&PDrtEImC26;HoWk+aA=F&H5xTWu z-;hJ!V(7j$5j?fLM<Flm)l_R%K-ezfq@lyk6VjGl)T=J+P2))r0~{Dj`Ovo-<+X~d zU7U(rf}D&U`d!dzc^U>@vQ=-JaUqvCE+uQP@pdUYrJ2MD9L<Sj!^j8BM-L`-f4$VI z>(z*zDati9pM<n-PGbJ*<-6HtLun7;>Nld2S9CK@nMnEzR3`t`!C7Iv&{Ox5X~q|0 z^33N8qitf>W{2kCM4}!#KLAThE{p;$q5}O(<h#FBvhMy7pbA|{S?bbyRB5AyW`!$C zPc}WtH%-sBrIy3}$5FrLnJS{zVlp{`y(_Oc>R^a8YB^p5EWXRn_9~y-lE=UPgF5Tg z<J5$LorPhVFg;$#CZPHT<Sg(=3Y}o1{lgTp>Ki5K-7iMdikIFEnF+)eR?7N{%+AIt zr4oZTOO%)D);d(8BsnyQ9SA+Jzagt$3;dPihDKLKyvEY4@@qP*@6Jlv@gy<(t&}c} zSzBwv+R814Y?(`N^CKNGz$JP6$Nt9qGgHnqCweFsYy>DDb#$+i>`c3w_GakqteXhB z-!bJ(bN4PF!k$NI#x3CdHf_G;zd_3<O1TbyDlO`>j11-Vsg&=$8zX(C>6+g0(whMB zs`oq&ZSC!4WrFBgwb__%$K4voZ(S)PVn4qW_u}-n(EoppAV4>Id0QVp+(kMFpxa-p zb7+^w5%CjO#a)j&Y>xu?m+|&1G+kNF#I3*z{kNXlZ}pK%6-N0?h@Frcx?<+Y8W7dm zhb`6HudFMaAX%jYQvEuAOuJM29{+;GWg&b4JendBh>Y&^e)8<-dz#HOmr!Kr>ub|a z;MmN(r;UP<ov)%c`ukf!hi!~CT9gyb)BWrwY9mr(NCupl%tdF%iz~my?N8=py(@y1 zJF>Kjz|=pEr-GuHXH0?piCLy<{YoEV1%ZJafUT%7rw_L9nOTiL%W{9tg#Ikg|B{jW zb2swKUvOSf*oi?w%i#VNYkJTq_&=ZIuuJ;KRhNB`?x9Qke-Ex{Q_gvCwbIR*Xed=) zpcD|4$}R-2Zr*yqa`lnFg3l_YUJkEC?5}Z~z7BaYA7a!s@7y^|2<>hkEGkNDZXd!G z-RqfgI$L(u40%@T+G+a@vg6ej5Uflt{;^7qWYmhvi~7WwpM!JY_}KGrO~QK^`oPQ~ zn{E$jKrqVU;_jP3!CSr*!MQnKC%P4tG+v26(`p{Z3Z`i!Ks2*PAPdM6adq+V%A?h; zRT_aN=>F1Z+jHNo3)?ogL3hMuDHnDi7M=;Ngm#}`^d)5K1{qXZgwbvkbYF#glMOEE z6@V+#L-iYsE)Xt$^@@DOsJlk*v$Vky&2MrT+os4q8)!2drGtr`X~e7lAKIXPH8ry{ ze`j+^<X?3PuWYQG7qzz+6<cxv8PmqJ=0Z!)*_3UbIwV5dsNIc>zv{J;p6=m`!7(Rp zSfM-#AA^+qe9J}MsE4l?3`a)P(CJ&c4r@0ooZZl`Y{zdK{AyOGcn6)K*Fn7gY>UAu zBTo!GFv-f6Nk@2t%hN;E`bOs|m%g5(TsG>d*1w+i5Uc(^z4WdrPPVCSxE!k057W9{ zv8h#N+R1pno?d8tH8rEFVAoMx#Gf@a5r0Ta0JS$XVQ%1+rC)^@*|P(GDNC=bY*S;W z;+{d#^v?v!rp=2PZoiW<iiUuBXosT9z&eu%pZMZZKYknDS+;w!u~Yjuk3e-SJb>%~ z5}lx<e?sV=!Wo}Jb!5Hj5q(C=5u-FOO?=?}ziM^|P@G}OEOlX@_F8t!B005s4wc~z zx4e1koN37pqWuESuHE#iTzp;s`jexb+$;C4PZpg2y=lJaXHClYqiL}H&&c--ga-y< zz8gXmhIU}W5jrNA?I&Vvph7j+dGoJImxc8Irb>jnNIFm*;9PwHL|Bx-va->1aj7hB z=2l2<{F$tLnXF6|v*60;4sQJG4q=~XP;yX0RS>}K2jq(${*K|oL3YYo%T)7Auk#YA zU$CmQLw)x6t#eNsj9(RN3DRjaSRMvjn>@M!**K-WlaZo{#}YM(y^)4M<s?L<DZ0+$ zZd3XE`V*b0zjR)&Po}0we(d@fatAP~!AWooyc8+4Y(3M}j@))g>Dm3(`wz3NpEePU zzwdfSF?!aN?spYHHjXl<k63wmJz~+WM+>gui4kvxpu~;y1m4t*J6yE|XQIcJeR`W! zv(w8Pd2sSM&+)>EwN9%4=Qoc6+R0NDKwn<bmUe0oT#LH3mi1-Ihci6|`B(L8lu4)k zGyiLzIlnsZvl_2lijEW2)PvU6wy76$-EC>74#@&tkeD5s#x)EW-kP1>DATnIf9pG$ z|AJG4!CzLLca=81|NLv+8<n-I^S>%?{fRw$kNh>uX*lV$XY~Z|9hU=rc{|YGVUlJt za{dDtMt?AM<7GESm!b<N8&j+L2Xc<pr(b<`58g0xFX?n4Ep`y!1H(Eeo7M3_sddjn zNWrRd;d!;l_0p=gV<kx?>w~=XxstkROk!?lLk6inimA}KbX-?mw>lL9YaNV@KB}y& zKOFC7)?qx>U6fIGZsi`(1dUi<QeXQu#2?z<ydTW#nmHHfXoJ73>z;&XuIc5SFp^DI z$0fHhD7`{4W1!1Rh;HAv+F-<aq0f&CTT{P>JwR^0mzVJZSCaSYRUYUr@u-n;$N97N zKjCOF5S&B~PWbP-g|=Mzo!uXjy}C<%%0b*(leBWtTE{G&znQMCzMGx%6o<`xxqzVZ z{5pAzenASguiZO2xjTi`&*9SgI|INqn=lu%fBC%)HY_(#Y(20Vm3KN_NSv&Trdz0I z?WsChlwY`ZGaOzw8lJM2UsQcEa*q+!0v1i46qeMUUX3Epl4^=m7>vqp9KZcoMOM*D z2St`L)Do}S-;hz>*ASOC&;pXJt1gFRukR{4V<&B`OIf;Pt!EaWd^WSN`d&`X(-Lg< z>qP`jF$ElV8W{86`53!%<(<sGo6jELu<3mr0sQ0+E~B5HLhWnyzHCA?luldB>-ZeY z`4=<b3UdC9qGiq$IB;PgP=v@IGblV&?kSxC`f^ZWtz8Jj9#Jp9s2RJiu4+DkM!66g zXWSc02a1oG)$lW0PyD2-KZ{MflAc#Luo`#r-+#2UF*>~~{G-`#Ba)F}{_uXue!#G9 z8P86Cii=A5KDD0uakMrmhU*m8G#D3q1B=OcFqVm$&f_$q3OTiT`P>>bmeT~hj=VLd zH9i^xn{j_U6S-3Z8igbp!GOWvJ3H?xt$P3YcUNyz*3LUbukN^$^WhU+)t_*7I&vJm zV3t5{js<=V^zA8=nBP~p@BE7qP|E%{5~1I;g4#Ve9_`ta;IQ%in%2?fd#-7z`rD7~ zQ0TiVa^8;Cv`$cSfKXlK%uTASaImRxOseKMRS65LK(5{XyuctkaaKyXqs_clNflh@ zN`bn1U_#tFx|$p)F9e2?3?Nbzy&lB{7$B{C$L}VbC=d}_>Qk6dvOqYO+IOXc7dOS` zbn()1M%l1T3bgj&R>ZY~qt`C-p8T8+&&1=lFVtI#=Dbpn1T{Kms4;8K%tKd<o%v%A zIRYz8p|R5BR3xq#{5qwM=GiX{X@mpt`6bx;Is)!~^?rNoMpCrsVq(Zlv;&-v*wUsw zkE(k6Xx5TMt}$e&-Zp~D^IGV`eIaa=FWiS$%1Li8RdDy`7-ntiRTLe*5Rg*48Je-0 zUy`vbj{807l6xA@)cfWt$1+f+)pU4&2n*%cD1+CRYnYi{UUcM+HRr-Ij+BJ?kg@LR zT$)CXF|O@I17j?sF|kHKh=>CrYZVlXQWXh{&kiA^>w6y4FI68t7f@JpCNgbZRaY|@ zbSfndPE+cHzz+4xv&kU$biI)Y<i?SCk%`yL41JGddZmSjHUo>Q&$jyH5rl(~7Z3=g zhe@L<Mm(YCY8tm%<8aPHXb%wC)o)NwUm&apEtf$aJ$$89O@J$=pB40Eje!@&z|g5< zXb~7}d`Snn_i2lri}Ye^_fAl1C&394-o5h`?Ui(ff)7{Z7h~xs6*#<gbM|HH=KD0_ zjQL}Sf@h17n+Kz9?>jX%-Bm}FxbX4qMicPhyoNQH-}53w)ZMlWjkp>;XTlusJ&EAK zaxgEyWx2iQxBj0sedFA+;`>WHyeo-1xL4!(nJre1vz#>@yVPBAXsrnWg}D_lA#EP~ z(5YA{xO$$UMhp*}8-8j^e)(6-6I1GJ6h5aQM}1{X1!U#$0rlc^r3NnyqRwDQiB&a) zWwj0V#F&$JvLNS<lH0nH%i24y#2$52q@F+!<2nfGWj(zP<b<=)snN&n3C+#vW!3f9 zVdrqlsp5+{33qezCCr1YG|i=~q`UdKU4*_Iu<wF{v%#OdE(_RwbPX62%9jPs5rox3 z&HguhAs?8(5(bAZKH(Mf08Ho3fDF>bcf7l_I<@41Azb2yKbjA4ypX_o1@bZ=cnL5d zLyc8N2enB#*%V33NfIb(fI-BUIiAHl5SSL4p@CrG{`a|&;qNad9=NqmY~0uggbQ14 zy%XPF43B)9n`=n8cfpb{E)<w3jg&gHct-^|@2Fd)`WCQKqo|8UZu^jt7X31M3mAkP z58r(~(;V2HKVF}{`x-DKl1@PG9zO-VwJ&@3ubsHbN%t5%=>(KcPkbB;2M(%L#_#y5 z@1d*qT=W3ox7Ab41KO9k!A(&v$0Z+Yd7_DVCbc*ss0Y}W)jdZ%+Vafuq`Bgb*Lfqz zOM@5YJQVL(O{0$sN&<!7|HC_>G_B&T2fpEc_39VzjM7xZdk=XBsItC}%3`9Bh{z;> zT^kb%#Q-*`l3Z*B1&~=NkxHZp=w+g#BB4mm%C8C>C6i*J$mHl~5;-b{M2h<Di6ut^ z5{%JvkKksvpx)<zPu*gj_W|!Z(x&zE!k3_w-dB$x5{uz9B>&6ZiCFFq&a94x-rs;G z<4d44^d6X(Pdt&bLojo^q1#`N)GvWk5X5&@I^GVpP)u>OC=yN+PenuEKE81z_=&;7 zu^nZ3KO+c)5(pJT{>=u8;c;enlrr`=APA%~7zrVKy*rLb140nJ8ozT*CF&5EcM-v6 zgX{c*Jp%#JYti2Oz;zy+vvgoVLog|7Eh<C@Ua0gvf&$c6=lH7+Cv@)L2Paz15==K= ztZ?i$GPa6g>h3a4Fc~#fLIpue7@$9?R6%c&o7jg~Ym~<LFN`b4jVt1AeZe!_07XE$ zzqrXwkQ+7*ILIsB_M4bU-cBn{-VRV%i%WRGy9qC-t@LV2(bbGnfjp_S<Qj(POU9am zr90U(iVznQp5&EvyCCpr!LglLjyWMA`F1%VuG)UWw&?Ej6x)djhJak(1RrkvVA*~D znVFRPnPm(aa(!j^-QfY$;)1QdL{0i3ZvKF|_=p9*Uc|&{Fjx&9hb_`za7?w(f^fu4 zoH;blP1jsXD%e^+vL{ue-s(-#q%CqYhq^dB@oEtZUx>jJ;qVv@d-1G#p*dh7D1YEE zH%+sZcr?w2lPUYU3$LX!(Zj%>SJLHFMs_N>_<%u{+iPF%2d+6FGW^tddWOhBJ*}P5 z7CK1MN7H&Qu|4LP)0cp!Zlh`8ly+KM<RDg#WkifCGwXH5X>1zT-v^?`IIHbXlFSGc zN8=DdW{Q+X<N9sIqVWd$WV4f;-3|CmI`Cqga=<gcMYl0e^?vKIG{^grRi=_lYaYN+ zw{gaVbKgW1QvP;-`Q;Yfqv~0er>agVH;hi`X4GGR_4JuWGar_<(NEon4pw_U0YNjT z9Ii+k%7GZ907+e$gt-U7rx=PjA`!}mJ|20T0@!YC=kWm7)ig9}E&qrpk{BmT?9%i4 zPn;P|+bt29F*BuLFA^dc<fRPq1t~*=$pZdBa`KQ5lRP-UOW9A(%pzGXo1B#O`|U|t zS-|s^(H(gxUQ=71mb+YhFg2{Y5P=U1UEV1_P}fm6(b60jY7+WgJ=4rLl}&{QaMgY+ z&mmywX_Ev-PG4oRPF^d$F?`}OlXL2F?b;14yO7IfsCh|%%PeBE*~LKe&UDH_?{kGW z%hQAD?TPa6MuMHc-v6P}bg0^3ED2A`>*%i9Iq{9m;$pG<6d(io0ULVEi6`lKUm_8C z+p`%HTR?vs<emol+gp{h8F||XWZsvv=@U%74G@RQI|Nb$MKV!}G#Zw!fH+LE(iy~h zeUUD)s3XZiCpM)gJH2%YB`a7@PF++VNh{BhP>M+us+>i3oP@}@&{CRygff}lssA)4 zAIs;rPt!6MuRK*|*g&X!;qJ-vH=Prx`*d8`$wJe?&n!0t1GxOEoeK^n!y(sS9ed39 zAh}(lI+~ezRF#)`{AiY{Xk7$@T88R<SNzu?R_C3_$~vB>$~tx;Q_};)TCD_K2o3#U zO4>dIcm1juhLdRPna_hPAZcj{i6jmD`;;F$Z<u@)S_H)=ra>U-z(@8!Il984Ir?&W zWHL$Xgs`)mInd@^aOU^VOLKqsJEit{yi6Z{h)MjBYTTav^|RaqbJ7Z4d@t8d8aG=m zlSoU|aaYT6qF8|%3rLpf^SS-m_hTM1cFp@hkHkU_0O}h#Fj$lU1Mm<SfK6bq2n1iA zqwSiw>twLAqYCI#jx3*<@xhs5?T4)iy3V6pK%X`>vkV;X?mG0f`LC6?cg$@wzbG&A zz;Y;=GCdtnK%Gq2aBr1Y-1aF>J&D36%*;@TvvUwU=5)G-ce|qemTytUX*2<n8=iS2 zBV#oS;a3dv^weAE_g9&xr`|kYc+Ofz`f3)!R|9D8ieEEH-xRNL-M>~h-f3WH0IUl% zY0b$g;vr_SQL=&9%EizQ?VDKah8T8q!OrqjNi9Jf9&B-nZ+I>t%1uR(p`u|tsksNq z5aI9Yh4TTf;ibZKe7wnw0|Cpih8C$bIkg@^ZOs{58egwtaZ_n@u7X8RmNDtc3b3a@ zGjr~6N5{FtGu3msR_qb?GfDAqmPpQFi&9xADs*(%&5AQ!0PNRG%a_K-a;U8h2#PF~ zw#RVLO2B~}Q*t`ivyQ=2(3w0LgT+au(YUE#&t1*pc_FED^U#E72$S5Jy3dFa(<$r( zikErG_C2T(E~HeF#lw-vLOd{G)P8{HG`OZWWC#QC7Lh(>Ti<Q?aR2Gb=?~ygXYDN2 z5!T^j5#otsh++~-clpbq0$M`?rB0bcZPg+uk_>W?@qz=2k_$Qe3mH5<gTa+CS=>}A zjVA<FdLMF@0~XL{3y55GdxfH7B`1cSh{h(vfgz(db2*cB#=FYhy~^7M)&v-`K8P`@ zK4!`88tV)M>ualA4K^hduzbke@cS!<=9c`=Uj6?1Jg_pT%cOvsgF9wa<%Cs3kyt)z zH_e$^hbE`h=7?uj%ENI{u@GWxSm}Ia2s%10ff5&9ymf~!b5f_x99Bq6v4i%=G&7q= z+S|oGGwr_wr>fa0N(Lh(oz3Q_GwA$GpdO<fC^p%nILU{%T$q7RFbr4{9q-E#(lfro zFigt8@=xXA6J?NtP2vx*e>j6=k1kpZc}D!SghZ!>{!0=)k_;Oo1`b=Asu{i=bJW$1 zR|g}wI|XG}RoE)6WE^D5th}+ThrS!%@9c)ki6Xh~wfl))XM4k~R<Mx+jO@ymJ6bDS zAujhnp1&0DQo4`<grJy}f|FEAfPF#ve(1C1oM<`>gXO`aa#k`Yb=%Al8Va!Kt+iGj zYeoj_<{de*J9$qNazp=hJYczA`!H&q_7~eJ*A!(2ch0rs{Z-8QYr`ei3~2(}ll$?= zUrmprj--A1>mWI^;vhMH=M$jGYTurE6mWu`-jN7)c*4ur=^Ib?y^lYZT2&G7|4-Bv zS_LGB!%JvrJD&Sso<sJrX5?-=&cp=^wqF-=1G?gdui$6;!p(re-P)k?YJH_PR+(C; zU#tat3yRmT%=8UBoM~*lGTYzRKhszwQnWT`740HXYDYu8qD>oB<BK+4=?>%?Eq6f; zzi=o3E>VX94h|VTuBP3}1l9$$so!RJ#kG=}liGR%fT66mjA4e2!H@!@1W+`V3yqr3 zKi1SWuu-2L;FX-M%BBqF7#_s}r<r2uM657<2l|M8Mi@Rx3JDHXLinUI5?PiI63B`{ zVWd$`3jm#*F&HoGIb1J6DU#_X21>I$2|4|9IB?o3?*A-DFJl##7K*1z5~IVj@N#zE zw+$+X3u{X49=0ePM5dBNIWzIVfN7*Hb$Pf~)2z`hX!V)`jO`dk$xn1KE^~4lBfIZM z-(@zJX{WWosjj&Dloq5exd>vA)U+fRA}fi?YZ&v2m<(x~b$M)1eJ2oJz1*cP+bRcp zJ&IG7@!1ClE<JkJSh(6|CO>G)YfR1Ps4%?N;>4_&>&huVUr}C{ltza@(r6TFI*UM% z(7~Q?P09#FSi*xxYLY%VEgMBiAT{&#g-mY6AX-#UmQf%O8HG%e2Pl0FjAgZxBl>Sz zOWUW%fz#dMjQIpnDhyYc$1yX+nTr(&C|legBNXnB;Yc6|4YLFd>1L(51eiE=E+M^y zmX3;uP$DT5g5g4yhN5Ml1c|}Hd<YuNPY4O(!@wS7QR`}lnd0CwBLu3*=&mq))Z)Y_ zpYO`0acXCXDqXS8w43Bm+oiz|!U|F@vnoSOAyZQ636L~8*!_Dee;6Vx=D{P2lRh~u z{eNgLx^}+4ki{+EBS2yj07;Xu))Du(ew)O#P}DfSmSm&JL_c*I9bfnW$RAwCP*0;Y z4D+nxVJO0y-zN93n4=&5_O7h`yS5U@KH$jSzk{&uy)V}gYvaY^w)-&<gpTdtbpT_z zZyTZwZfN{K7fgTqfc!iXG#U-Ewugt<<5cSO{YOL0=QIR~(An5b=q8Z}Jxxu74$x{e z$iM&aA%BWSTX-}uz?-Dy6Up5z`HtwX`ByQ@ulUDeh~&Q3Y_LZb5HK}se7=u4T@Lgb zcPk@eYxNR~=%-r(fHG^RH!hAD6if&Y4*TukNcMPnLFxWFftL%Fr(ugS)Fzll&|y@* zkZ!=4NvFDm#8F~`BCsejvyvH&f<^??hwkHeg$*arQfk6Uto+1yc{Bzm_*#=?OixXc zE!Tlgqk@AX6Y=~c%|0-e>7TG?1nq}}<xij2;x~FLU;iQK6+q#c(2TW8kX&Aa47}zi z)5<D_D|8wnO|J<|<G*d78@T_ky{6ay?E6!pRa6XAfLfD+fg)YrNGQsGUp$2ffwGuL zLmHrdeCiTgas}zU`<UTZ7<;e${e$WxQfUJgbQlHY?2%CuM{D|d=PCZY{Lvaq@x<%1 zq2WYPdATVrs~S^)L~AHTGqbI=iA+{v0)+*OWmA+HYzdGVsi(Tip}~!bl7;`-Q#U95 z^J`1gMWfy7s#pXT0!N@@<4|a5A_@m8*~6wCh?q9+1gJ4;5mw3ZoIHe?@%TA;f^f97 zq<E}M071$sjlbfn2=e8srg9Vk5)nf~K@zE`m<T)soe_bG3k!qCM908l!om=7pvbsj zq}Eb4dCxICf*`IeH$kPvLotOYba4_RskQ~r)2WVfl#>yo^@F?%M1NK<oWYMkF~ukt zoehPMS-?)Wzj~^x0vgl^+l|j!P*bWd9O)^nKHb0&nAmtE29k)x0o$3h&sU+V!?58M z=*ln%@Z6|Pss%=}wHp5#zfZaTRlsoeo|gLi@vMFXm#yELLp8#Q`<dC)KY-8+{RY|} zN0kG}bvAA&U>ITq1GA5Sz;&;vmX2tqC()5jwREAlh7N0r;Yz5MR%Cq5uGMt-By(Bf zE%Ce_OHCy~(veAs_>3eXECZ2*gr-N&@H5q4vT=oynUXuRp8DOanJ9m?dDD((=IE=n zS3l8KkH@Yg=F9w;yWsVir&q7q>l$!4Y8#41hYEvAL3IROzz-F8U%s>5>w>~dd?Eyi z41xOGAwiJ+y-U%F$|7J=|EbmMvkR8MR{imB#I$nu5g%W?pj@!rIN)_n?FEA0+%2~4 z0KN@wp?p8Wm%o>^qx(9Yc#4pyCMQQ|u=KA2l(6Z`wa7gYio;B`Ol7{DVzr+cmVjY@ z#-5x$ab`p^dh*nGH<OXclK?h7gUx1Sa3sl0<!b@8YyiNjuS8J8&p;H}o1D&J>h+`o z?sW?N6i3?p99!_qXvhv%accsFe>!GYT{a%HBlbJExJI<b19q!>`79{des&gqxQ7ti zl5ZKOQ==G{Z`neKJ=_C_Z$DEO<V}Kksi-c9Ja5p=@EZ8}&_)#iH4a>qOJ9$@P9J## z$;o{F{`ns_Inh8>HJC5`2x$CEZ-aT23e*};S|6KO@Zf_Y7_j*n56sE|81&@C0`>=} zYJ-BjJrMR=cvS}Ge<GMOo!Y|Zf)jwsdK+jgr5{mP4fZ;jd-vDYFk{}I_e7U(a*G9H z-5X0T{Bk^s^t~qE;t9_mFeWeU!K-4z|NbPfz97S07~HU10VW?I%k#rSg)T5NTq(B` z)&V^}o}2?<Pl;ArX&b;Hd)QW4Fz`^L?8$Ag#Q5FH5P=dL%vB`}JT|}*tmx^@latNo zIpjO6bqU7BY2%X<&1N8*!rqaG?KvDvShUQKvzfPv`xX{s_yifgcnE>eT`fM05b1UG zdG!=*Ri1xk#&^!so`ZQ1DK%_5&p^MlOx4ON4|UKpUMGXm$>T}*P9~2uPilFZ2Yrk} zb}+QWJUhU15?F#7#IOSrg)oWN$*eem!2|y4PxkB4Bu#l?sLZOkDCU<UV6c)_TvuCH z<FfU&v|a&CJYb;MPMQR9sUaXW4iglfBS9d8dP){PEeoFo=S~7cjLdpgd{AH87GE2r zZv-+=B~{H+Vc@A2y!hZIY)_!CgOb)ZDdMhGqr&DfY5@!~-xddn$USQM!!6Z<so12X zXc<L`jh^157jzHt*L+KX^FV)F;0k>Ch?{<%hj6_Fi|^OLx9>r|Mw1WTe|zTk{Ewif z02vkZ_nvA9l@aZT-FruGg7#)kW$nG4+)3IYg;Osuu~7Gg_DN|_Eq#A->-MR-IcOUs z=)5>sbJ*w~fPm740|)gF?r!*dVd0>1FyZ`)9_;HL$W`t0*nYA0mOU$ASF9P<tR*E~ zx-igRfktatNq&ii10vWz(s4dh6>wYi?)?=AH`}>h2^9YON6Z4E3fQlz{{&9`>u<vS zYE?k3{;e4QC6);NJ6MT0;(t-mAU;;1h>fMWrpgQ?@7S0^7EcjmA+8l?I?i0}IIbWC zn@8K8>No{iC-;_)4ODljneflO${#ueuXgzEJ6~Sh_wnCy*eS{19D5(nW6MMm5s&ls z<olRpZVEU4`}hxB?l%gBnjz0&|DpTwo$lQpr|vx&e}W|V^tpYuU^(DDpsDzL2@o%G zyjmZ@t=eb5fIow?z1knZGjS~8hG*_Xn>V4;<K^+#aD6kP!O3S1veYO>>gIEo=fR~! zHR`=|d8uc$3ls&eoy``l9cyse;6Ak8rKjlQZBjRnX<gP_{wxN`(WsUyP5t@RRk3Q1 z&_)Qj_2v_nvMn$`wxAUPyyN#P;ZAC#<Rrijbmun?&_E(a%`cu8i_s|YKyE9XkBR6w zorfxtF|^17C5s3nG73YUaMcc;Qo*1knxZpho#*7n1lGN#@p&xhAMVuxi01^KvP<<O zn+d3hBf1&%u;bOxpdDX6d~_>Fk>;Rp<3r{vqmfLj_ROF4ySL{B?+i-soNM8=fK$Ae z%5i4?1%w_Qj|U)@0rREW1vf?#bV?Z_j|?*miRl#F98T0>@KSkqDk|i@X~lPZ%f|pg zx%!pgGd~A6p`P;9hbwFG@$XhZ;@8uXCW*wo$LPNd*=JEI<a%Lf?Y}=wkhQ@7rNxvR z;mA>XvZ3GU1Y^d=H9}KtpXpDPMZf52pHs@^+rED(^u3+Nn*)9<1A3O$mR@_!-?MsC zKaWHp&mdEFoXb@qktk%23gMuK2_&>~Ai$|IYN+14URk@w?AbH$;zoypKVtNn>>MLB z<guvZo+BXtka?bOHPDIz_xPhMp{l|GddwNBctOM3`~RnihL*9rKn&bL<$Z}cSm+-v z+__5wBT>uuSsR9}dJtMV!2bT9eB%U_{Rd7JGBU>f@lPRZ{($VSAJgTfAv(l!)94|< zgQz#%d_)4`T*Di6bNk$E*PB}rv*`fa9WIZB+nE*L$SbB?-vv4>+V$t)zcn%`nv)rN z)Ehuf;D#VU8Q|#@uX73m0l3vRy}n+^0RjQgkW}o#008=cGA|qO`2aOl5PnTG9Ge;T zeBM4Y_wx~fLAHOv@QO0+iv{+^F!O?W-aUv7{QDO$qWt*LoCiv)s!CP2nN`)LEgx$N zgMq`GDKHxJ2s=2wztO$lm@*~%n3O>Za~f@TbE(hf)MdwBx_+wRy`J@4!{6(y;U?q1 zoRs<+ybZmTzng~ez_AS7h^|2}cw`g?5tT^bQEN*lKz@i|UsFBamoCFV$b^JAEI!<$ z$}oT~!h0Jdf3lnKIwb#Rmr{VG=aykWl}9)h7oR{TKrnPUx4WqUm_NUd?1+y$@?^a3 z#(Ln8c)ZB!gLZ2DGsjz7f3pr&^(9V0!AWsGrRo0F;<Ky8;FM*Ub@XM-8n*bdKJU&P zG@|b$&aTcgTm)rU#RVq?IlVKxy#d}~2WI8ugFZ*Im=^@A+{xCC3-jyLdZrhhcP~}q zjb|34lX7uB#bhh8?uRtvFh0x}9z|z)@`3e#Hok+1;GTDRfzH~Z+9r+fG^^ieYCLg! zU4-l36s+}UJqFpZ<g+>bBTKB+XG-&FbiAAAM`I024idHcJ<qm!>s##S30}EhY};X8 zH6OlkRY^XVlp?u_Fs`G&KRVJQ=g#x@;kOGoz}|U#fW8zteopr1ACZ@^-A{v9{%C*P z7o~T-eM*0S$>pjPtrT1}Ryj35ivz=Ze$xBB?}76B&tA0E2BeO{P@g?iPmaRImRAr{ zL7{ce%01Y*jP~*FB4e{WxB9vqW#-XqvDmt)5ZJ1c`nV2`si==4m2@@47R<Cj)8|U& z*J<hMW1WS0jTwfK=arM|Ru@CSPu8mzeO$eh9A|JQTW<^jD}T=2*WG816V51PjGe#O z{>K9=y*y9;@ypSHCZ4-=C+pC!GeCm4s2Y+xaKt0MVxvg<d2UJBotcCZ^~iVsXnQPM zw`w|D%&PudS*&wdLN+y>Y+|WYS1bWqHPVpGTvpDVTGO5+n{L#V=>A*5QME8}Zna&u zH2e0S()i9N30Zeaa;2Y3Q_7S_m^lLmGVs);?6uQhqnu$(0jU^+V&{cF1Z8y_>mlUs zh1>a?=sT3-I0_?@f3~}!@YkP1zUmv+;+4J5Z7Z)^Al@}AX+BsjkfXPOVbX12z%D*) zfKXWG&tEbTl8!$pn57?co_~}+e&I^Ic@8@4V9sB1qv!sVh}&`&{Rrpogq8xZHb_<d z4Bqwjf!}`)0{V8Mg}v6hRf-l0t_r7|8lZw^gMrU6g^#QLo%okmQ%b;Bm-2+S>147w z>p7o#&Ukxs%l&F0mpJ=124K6>Tnld7Mm`1x#~z1o{M+dHcp-ThVehW{gXY=#GOK<H zCAPS=i?tC%IUWq=E~iyxO|aRYiOp`CB}P;*f`i!EaS*|mR(6iJ%o3w2Si!+1r5Za{ z)-9kf?^Q_&g%9GCS<`G_QzhShqHYUo)u@SJeDAO{7x7l**s)gY9S?zFk~#bVchAqu z<*%;&mvQXd&Z*|`8fZGeuTIK=emSp>!txsSfqDG!80gC%pFHb6yGPja@h<5h2l$+C z@JZS4%o9sRd_{`wY@D9NGh?o@GJ7n=pC6TZv|_k>=)cf%htdB+37^q(GLQ13ll`*C zD=U?A8=g6O+(0{Csz917?swL#ISjR63HX)*y6I4B0TI`V1<xNHj4e(Jn)C1D2F<5s z=4O{y>npA+CFPvliiR%CQ11SYC*{(=;xV!v-5(DDjib#`(+%nS?PPh+_9{7WC)y+| zq&c4?MLZ~&c=Kl|twB;a6MHTE_|$QS)`jnkj_oeXpAOtV0cvxIE5%%7S;Kx*EOD?n z88{|yn-UG})(wByJ@$KtVzoA2JetBE6^r;Iqk-a3jy>Ax?(Ge~1wgsfBpR0rg>$L2 zBrX-qnPk>r(Sjh$gN=~&b-h4DN);xn?H)E=r=c-TcdUrdjBHn7Hwz0fr`qmje%0{j zvpbcT6;*p${kb_~(>EKbjg#zHZgX-%Rn_{^wtdJjRvo$o8~vpdI<)(2T4#A(RZn>u zJhbaV%YBEV*M1)0VscPnA?_oS(;s%+_HcY?8GPOJ1VCDgTk`bXE-3~T&u)b!&)+9S z{6=^~i2Qw$%!T$u#H{J4E~x}oHf7}$tAbYizxCU@l9mf%@M$+#t@TcDD&B;J8rmo{ zoKN_7s+i80DN6jO%CJ;<y}tmpVaKXAE9vx{Gga@rhfQAWT4tJDQkojKmS9tubqF0` z8j)5jhE4!I1Iu=K=Iv;FFPhps)~+%t_g8$o^C@w*Bz=e2dOGW;ML3G3*IiJRpsd}m z*{u&YK5n_vnyP7@!lx8ZcW2=Vd-6>*G`r7SN<`hwW4&)y*WyzAyuZ1&>D`2`ZRn4O z9B2d_Fx+)Em_It|FBXla2u8&~A522g;4Xf%-YCOOUAQK3@7YZ_@u+}5#)Ck)NwlPa zBLlcc5+K++K|W=@FxL{BZV3Z<uk~`o&$Qp~c-Xy3o3&eOPrd`;e{;lxo<ayHws3+Q zD=uXHKiehToW-}Qrc^@1I;F(%6cELZJA=z>k!cqCh`|%_6^wg{7h*K4<3&ZZ_~T|3 z3q>tGFSPU2&&Nk^s7hctrE*zusT>2navk%h#U$HDL1M)P1rrmCUD3?)Kv3Q|uoefq zoSUh+^du!;->hpEo3&747I%CwT|4JSXrwltM5FQ>QcPkls%5qwc?AK+yM!6l^`5P^ z)6|%@yVw>hiA`#>7t9@#mn4Cx+=(pR%QyYPXRbyNF03};^9L(NY;zpNa8!&iF>}2( z2_FZb8{Du8V&mRZ*0&1bUh?kaKIQeN{bj?#I{=oOE6)}RV-mArrH)suAJGc%>(ZW- zjd7I}%`u=aZ-#|ZuDJ4?A~SR8AYlgvGj{FUVEKixR}tsNE`94OKL<v37v_}ahAjC7 zCkHR5=ct5Dxkesa%E8667eW&j9*`n`#qY0me_l<488^>Zfrwk-)6eiT_*wSsx0Ec- zRBRA>&@CR1&xB-=@ul*vbM!8iZIym{KlUn~l^LH2$7dvqmA#v8RlV2lgwLjYp?I0V z%JGO!&!q!5gJ(fs<vux%v!yOia|64kPdY#MoSt6JmYRQAP;O~n@QROs{}3{;I`@&e z4)b)EXL$#^BY&MFaiKlo^Gu^XColVi23iyZ<RvqRrbH|7)hJy7y6aJKYv1h@1^X6j zy=&n9SaVrfYF%r@*UCA;#bHx6$p5CK&=Z6UFkrh&_%WdP$Jv+mQ?~Pj_t!s2AYhkr z>>&COgTL#;H5b=RVJ9V=b@gg#+hN-+{7o0We)F-2>Z^~O(j=cTd4BCTeEseLK7VRC zjZ%32;`xNyy!PBMO6w635m(PDETP36Hw##o0y0ww48WzoQ=MuPa7Q_sv3um`-*MKH zkvpbnRlyUGf#EybWH<Jmw|_O=f7vu7vnW6Kc$DuE(g29?$hvG0xw3KdWxAjL(ZInW z|J)xv)+YDISVl?;SF&G80hay&*)Zc$Ro_AeWE<w?HSM24p_lfpcZ`D5;Be{ygPM}z zHSJX=+@8+>g5)hVkEVk3j3QOYvR{-md@U_6qp+ykP_?C;r95{&8a_Qqjry17&=vFh zIJq?EQdr^w7})CY<oTYq9l5t++uiQ&oi%;&d{6uKn#cLAJMP&9=Ijje65T+XYJ+aQ z^Du1+x&g7Y5PFMl0fl}yk!;2*z(0K`2L|B0a(qPzmSMvK7M_XQD)N}dtv1nVq`CUs zVft={R3duX(Az3H12b2f6CPuWWrDCb*VSzXQx5J=I5*T~&KLmyZ6|mJL+v7gSE#V( z?G4S-94s}-Q{ypop4hlpnb#&D2w?Zoo=ZT(M3YYF46h+#_5Z!^jZ-~p?kis#Y>H$r zoedqv_W6`kNTu|vdceCPMWj&{rU-Kia_GW1uu~QE+}FFq5{lqfATu_j0nr;P#6(u2 z(8-B*i?yaZX9m1aZK)??PPO0792r|~X{&rgk6Nul!H*bWC6vRbUyu0@#-HZSi!P8X zOJ;ny>GE7zLkb4Q$BS$iEc>?i6{ZY4s~t9O>eowVVFcs{8E_6JhKy!eow6R?(NUVf z0e+lJ-hdxJTahU&NO2#I)or|$u~CzsFfRxcMXHWgGw{RzhLkys{1<}1PS1}$CW;gU z=FQhYBR4jJvvnDM?xKQBc}n(xKhI^(bhxbqk8i^<Ob0t~L|kVP$j*<jnT`6?heOvy z7Awvf<!06$L-pYzKXDCLB0fDRL^VX0zIZwxoxa-CQyB5dPk+TQCt@`@O`fb~xnus= zfheT1<eH4gwQJ8|h9D<$Ej2^VR3~}B{<oYhVDMyxY2m9NJbuzZS#r4WSS`_Y#)T^; zg;{kco*?+zJhb)qT7OyE)@<!~{C>W@b7t}}5&f8DM!4MzN#r-F@&yAqX}KMxfNeR? z3)}C#wbS^7k#Mb&b`<TNu>)pdYt)*;n%ea0r0Q|e<vLAESxa3|n<y!%m4%gCT}4s_ zb5Yk?*7~;TBA9q~Suk9!-`81Qz7=V>qFF_C=(W(!Fy;aLjXiq}C&hK*nsE==51Gx( zPNtLz++iG5O8vR&>Yd|Im-qJ6iv!!y|DX;cDv1Y+xyaInJ`A@)0-U*!*K<GgX3XAM z9I^B+m}!RxjqwGeB9U-pEKr1cWT;eXrov6+P?KmJY9c39^Ar3(=g{KA%VXim_ELYe zw>mV_J3VI4E-EakIkIHV{@?HRJ9rDi<=)kPgrJ_J;v1JL#zrnBl?3-(PWGujB=-?S z1^@G}!(4iEB#g3)vM0tnJv`G}jrO;fA$S$BAb@&C92`|qP=-1c;KYk|82^*LDPGD= zacI9*F`Ic^7Fbz!R*-p}TlKgqF{VNs3>=icxkp9HTFzjC|EfB0wMGHC`0VVTr$GOY zOu>`C-}hYsY=nFuE$(1Ox|Eei3IMjdgf};gN+28GZFnnzfOE)%LsHp_%C#=$_+oHM z(RdnVEl;}JjHMFMF&wyEVP^VB3j7^J;~GuM9Rb&{cU(_vO@LXgdmZ+0cXSCBgD-By zTcm$o<W5Ko2}C3kfTZDUWPnr1cZT~<NBUaW1w5%u!5LeLkyY6TU}A}#4A^+t+_Vf& zfETrNvVXNtMqFe-BT$ihgHIA;5^I8eh$a`8x~mK$0leXCx|35FEXcw4<hJ%r`TzJk z#oEY#o#kzy|C9~%pMt$AYnGP+RV9IUEhT{leSu@@{f*<w9$s>e0oVIW<wIWe-UcM^ z$Ljr!cVtFi$2)GqDjUi;skLR5AMQ|ECKR@vc<p(o&jn~w$1!2pDBJ;b+S>bPfU$Ln z7j3$jzcQMVEm^{pwAv`n=<FE~PX9=x9^1N5>tJ?&hF!#xWtbQGPwMUVOf`~!Bve1N zpu2BB1wzKPIOr2S=6`m*9-_Ifmu)Y5s^;c$2fe<Y)yG%n1-MmNGw4t7^@VfYFI!(e z@D0_>MZGM`ZNHQL+2K8yqR?L*;B5Wzdk;RpSvg$E>ZxEIdh_|s<UN_HsRxgwU^*~l z6dsR?bL~A~>i!=E{FYOjl)a6qvCJ+yvUHbsz^4(NUxtEwzs8g-w=0?s%v>(i)E-F) zthH`yL?bgdAB7c$6JXHLh-eHU@QhmnVo!N;QZ1+UMDCb>Z80vRb{fej;g^&nG2vMa zmF@d}$JZ>^R+IA2?PeC18K#zIICx5%cM10cWD9-`7p4_IYkN9_JzQ@CH=9@%bDW5K z_c@20=8tv#lreqHw0+a5;ZY&F^0O568y>&#^`qp9=115~b(`2tJz=8g>tyh!b?T^) zvzYU5!$0Co6<?rKiT{b*Ua3mqXKdWRIh@5|VQTTL#zW#Mnb80|qI&w+uF>V=_44-n zQ$YR(RQ5c|t$v}?JN8ln*?2mk*8}@%GP6~4j#GU1$_YcL)#TT%tXd6%!S3p`o#nrM z{Vg#R)8AEd-a;-szNcO|YI^`1QzS=4w~GI>sr0P`j3XeYC>Ra>O-!}ufpApV-uh$0 zV~NSnPk#h`yAETc&v@lN<v=|B&FoOGTGapMy#LRt-2Z%)Et#I}%P+&9TtA7Ymj<JX zbEXdn-7lsrgNm-y_?~T&;z@~c<Nsm#qz&0|)$rWXV|LSYHnO-RgifHDIC@zyGGi&( z<&r4w<tf2dDO`JQc$ScvPbZP3AoJgn?;{NPwS$(KKAC=Wn_Vc$QYSk~_7>JFI=A^! z0#A&9LgffS(4-OPgaT|qfa*7NF!sgO!-wtkVzbsg<+qoo+ilKoz)MY^)|ri#7l$K$ zeg9RP1N5vv?~tv&CH*&BH~%WQDvc@lvD2v{R{JvEU;N3_a{}$&l<C}9pZ44(jUN}^ zNpwH2V>RzN^w8|R@27>6DvQ{#Tk}s#4w}}sz1#|bp)IoVAG09G5$BBNBxlyqzZ`MC zUDkI7I)9+_-Qry1t40m~JXojmTMi^rl&{iTjgF-Kt8Zl;>(7Z-8r5H(6}ej5>o--n zTqx13!T73_tIwVO`Z`VjTFvuN?X%ezNACN8eRa##S0nRokSPVvXEKL=_)j6mf0L;A z=20X1Osf`#sOY7Y!Ut^xUQX3>5W;aTZXREWAlHcd%1?CnG@R(`tlM97>8g|3&YzA( zx%)$LG<q=y;0nx)X8yq$b-(!X;Sy#vKJO;x!p#c}4TD9Q6&;;}-S!XrQ{I$pIB=nr zF>>-^Q|7B5fjWPsV^dHG_#~-qL)#S~LkVXExQ$z;cf-yV&zATW&_8@R{K(KyPycb! z#o$?=neaT<)A9@HUq%U33zMdIOef<O1eqmY_Jq5i4$TF>WDgW6_+*N+_hb>uWOvW% zu?61uf=RTDBNvh=7GbX@BhiMtdygESOW3Xl2>4?GAl1eyZF~2Abs`=2`-O%4|A-xo z;YUSD|5VtvDxW>fFU~#8OT<{KrJY?Awl#KV{r2?41obdeT9zE!$FWt#u9l@qrDbVx zt14SgTwhr-@R<#p51W60i~Q}a&tS&S6YW*}2_jQ7qucdaO|wk~jHos>6Tm-Iw{1?J zA%{7Hr~M`bFO{S&D5a11hy}@)ys-3)IfeMk_Rq=0kE<fnN5!n(8Pgoo8UNmtukV@9 zdUptgypCDG_(E>n*Rwd*z1WKXrcf}%d|R8Z9qT-7-Mg*Zk@wYN_ViiP#lp~=i;oKr z8r62pzk=pG0W`PEfp?DloC%g5Gg!ce-dY+hIbgD>dHz*a)mJ*5qek5wtK-^3HH>#O zQ5)`?Dr{@vbn<03*oBO}{%_G2nfDdiiP^J9^Ogbf#pl_7MZC5+X=ZBzi+7!G!`VOh z1*E3#cHsU&fc<&u3DB>eordM_+64^kcI^Z+RJBrEib3WV&PiwT3lJzx$wBc#o*IG7 zFPM|g=c_Tu0`&sSR6GtES-`Al@|6YYfvtoF9s9gG$J5C?*fct5wjOYy)9%7rz2j~W zA>Bc+)m@*8`a1Y=a3S8O?k_Ofb28#$`WdL8Lz+XTuz$>T#SBjSqQA{^W&_&SFgOZ7 zadnL-0$1CJ#M9b@I;1ref{2R~B{cZisCpI!f<xmq3yF&q6bFOEesKg791qty;laW9 zup$gGfB_hQd*I-k)U&j$Dv75*YZpO#^>7p6v-~Tx9EuDXF8-N?kz^o*lmyZ(sLkG2 zIy~=uYIgkVW#B`(0X<0;kW=9Z*+*`ONRG}X6B$?Y%?N<f>rAb-pH0c6^u@PR8sm|4 zRaiQq;eEM#I;}UpnWBwHV+tcc1XX?6Ch1oGDYB4~4nr$`_;6T|ipe1pXxH*K5dmcN z-v6LUk$QOTw_fn`p(6=QyV=q8^U$h7ad;K{+x6dJfQa%JXufO52F^rW=)V^=u$M7D zXMSUsOb0c$7Zc9T5(<TxB9@OUiFm~N-_cnes=h3gWE<#f|CfOs1cd8$yp`s@jIDBC zKAL#=dC|6Ibd~q=)kxO`LXF#j6X=y!WXl7@3UCBoD%w0N0*SL>ZS`|Tl^wG!W|b8S zt<x~5F!DRRbyvpscgTGXv>4xqtD=h=vAeJ<7aMjz1mPDMPi)$sSg&u1FIZx%ww8d1 zzIs{YY=ySGywa2hwS!j7%GL(#q2JP0gZ0Bs+HX_sofDn4uS%By)b;kmtYXhQcal8I zZ%l#E#Vfc0uo+Na+f~~z(%`ORJ%HBq&h*S2G10fF05&EFopWj(Y#n%urZt1?Dst$J z5vUVN^8_llPhI>^zw_hs|CYvQgFLqcWXt*aSvWp$+c`Qf0g;*r6&QlhXjK9-6`BYL zH7YL*1rH7a4TBRpC>RX~hi9~=Ah$xx4@d4swfOl71Do{oDqDpylz^nb2){9)cd4ST ztMjj4LBOWsS7B#Y9Uy*%p#Je!XX}(M`Toa<7FbH(roAl<U6F&(p8~5Fv_l3U5}>Q? zK7Lp`5Ev4;_QN|cwbWVrS?MEa3GjNe2K3jS0(~=s`9Q}6Pu0$eBY!qP?w$u=anqjw zyw{DuLa#AQ(bL<}BTMV<>+F)rx_Y{L<=pTJ483(%$D+(=wmJ4OCT88PV_ZC*iww`+ z3w-3=*_<Q-pOPyO;Iibbf10!M?YozH3x!kD%v9+lR#eXi%G;fdTM)5L+HfY{@xP1! z2j<h68yoD=YF<ip@^JX&G`#xTQpi4REHZ*y00t6o9N7)?K6C?cqz9goEp6`iPMq@E z|5ToJIjP_a6s4u$R)1po$)_#ar#nrH3Y6)16%E$P9p=K@^B7<fZrr)9^#g=Jfbh*J zx<Ehd{0;Vc{&F=bD1jyCktj8s0;v~|85H4KVFa+{VuiR=A$_&Yz;U86NvywlJN%qW zBFhWseGj<XOjorI7TC1*_N0{-j}``}>mo6P#K@mx(db$Q_L1uwwTK7=R0^E0Jhs;Q zny%Q=?CqK1?40iHRSZ0ArVG1=D$T0T`h}W~kxH}jdn?LDLHJ}dii|>%LNOyFS>WXP z3xVnr%aLc5<LmJiBFa~2gl}p-7s%v1a#SVWMpZG>kfYJ)QmdW!MM0qwlnoXlP7D@` zs`ZEsD&X~cI=pP6*sP*tG+n}S*4nA7qhQ2rmM7)v4k9N$QA9Q)L;1k(-L)M&J}))5 z0<MK8_#z@`PxA}xK%_w-G07*oBtY283`^uGR6nCOAuCdX6z8q?BI}VABI@S_2wxd+ zxbisr+A$0N-S`5nZ`w|H9@;Bp53pxHkC7YFg3Wdw%qVEsOGil9=8|lQwn+=Te{H;E z)uj}qrpg6<m#l!-?=yk}q61S0b{(`Gm#-*R##U?>cY)4|iuZq8upN@VFW@P5B0_O| zi)!HKl~ZnV)-JfhqzTB%B~rzJeY&DVnNn>+-sj;79Brm)YQ&#WG8E?1?(C7WK^0<o z&LJdJR#rG#7@TU@ktYg7V9*OnM9QZt1N;iWo9YXy8w+2lg@+;&Wx&yMnyf~e(&SiN zu8)T5FeXvim(C=x<H>aq7goXx2p^jN&)LA$tE67s_tNStRJBV$4UEejkG@&&AbqLs z1-DzoY{(ne;80FHTOW(r;cr9saLKTej7llt<V5FZf&jxw{;6EM(K^Y6<WLs2MuWo> zOAwembkR_U5>n;DtI0f(@bfu`Xas}{Pe4$R3Aki-m|5nlF4>-pD8q1a6Dv{k;#{t( zOLvR&U`4W+=U30>^;e&suO9wY8B~+Va-h5UwigChiIACiXeGt0ym?HX8jZ^;-oqd& zN&;i!gC_QVpUgzUMP#!ihyZx17d0b|%F4{)dbOrhX+S9(W<sH7E%APU3gA&pcEqdC z-O93be)exq0Q-DyJ!I34bYGf#dwF2)BNTQ->jZq?T`MrI2X^;dbGn(@x4`o<a`hs| zqe<15n=@2VS<jpS0hpl~_G<~jJ_endnwywSehpeJ6L@*GsvjXdjMEE+3^pV9r6(>Z z)JA*IsA*0GW)<r9;lSNG@Bh8};qG-Hz>c0kq$0AZsuXHGlDk=cQ?Ud8@`4vKA)JVD znFTIhxV;SYPMl>akwPeA3uFzcxC**wI3vzE1(NERizCsS7{Y>THL~22;p!871i0z# zC=g54GWssPD!nwXJud#i!0xwgIVYu-oSiub#3nr88?mUY-d|``m%Wf3N${&PgqL<C zc$@Sw4c~Lgfo4aIpb|6p^}F46JK=|frm~GlP&)9!PRkqQ+?X)RJlqZ=g=aSv7I~Ac zeqGWIdy*BJpu`jm+BLYL6o-qCgevx_(gWd<Vg8gTGN^;(1G-8nmgXxNd4^|?Mx67s z`8|n|moAm&r887U*P|j%flEGlfSQ*jmWXvKgH4q`4Bz`GLCNWoHY_vw5W;DsdFSh7 zqP*}qK2IYff4DNA2q>xy6FD!PmT!3aXxJ0cd23ZmNf*l~l$P)JI4a`o_bUiUhtxm0 zzE2{eZvtH2JgG#QjBFEjnI)s!zPVZgd&P4WHJvS?>0|WVe|jKBi`;(mxNIkqSoNXJ zZGuEH3)B!C%~8L+0Qde(EHgLW;&x*b;g@Y>B4Dm?b+0_~(Ie|Hh((Y4)2ckO0y8|~ zbF0#`y_+o~j|9cl#x2Da1^|}^+qr95=XBan<^wy$)2cyNWPHAEdpEFd7@yQ04o~tR z2TD9}LF}Mt%O-DWUqLNj6Y_A!0T7h>cqYt3(NdBgmFA0}Cl<%9`^6_9%1%m83ZTgN zsGn_%0k<Y!nAKKmk}Z3Ium*<AcRD!pR2($bE7R-45HrNz`pb9kne-1~cPbQ@S}`m* z?t+yOR3{kUBSZ$Ls+Jf*eS+UAL(w08cWQ&FPiM$jzGj)aq>nYD8mzD_>WBE$Eyv8_ zsM|cv<tIvweF<1@d@PfkhfLBivv+5qZ8-k!4a1|tBSa1hRnJYZt59cE<6D#Ex0=T5 zMTfwyB0DuqJO}1KM`{V=YDztd%SNLqAyhquR8>m^);4oE4HA=w!C+KD!QqP-sMx$B zxgv5biip7BA~C|Rm+-(w{t<&|it=wQYAr{XMliuXk2fcSg^xXn1*9N+@BsUC*cn;> zUOljr1#}@=uO^X#@j+86Fg%q}6usi*wH!^~`$nXd=q8hB+#Fglz^zM~WkM{sjuy4L z6CS7#CsG(rxBcU)Z~M3cGt^1H{jdhV1{lz>vxHtrDn=I*5T|#cMqD$bTdWI={`&ck zuC7|JclH;T?|kFZB#;=nxu<V#aFc#sb%!tj;rbF@Ab~^*sfK>Bu%HIhys9SPsLg0H zSJgBN!r*(*t-ij8gX@h|RqZJ;)IdsLgkKJ8IxqowU<-O07yI<)o&?n03=K{g*lHV^ zOc*t(0tDF&=^Ev8*0WxpS(Wu0nc_Z$iS)}|Ycgclrt(V>-I4B5zK1>P4QW-Gtv+<6 zxJCL_fDWIEJ1?KjWKSP>z!6s5oq7H;dv^H|aP&%ZJu_GSap=dVSz(~TZgnyXlxA`` zr3Gx^k%=I`@c^)^uzfZj!6cC2thm|YxuLd>>7hlPU<fQ`KdBcOk4%Vxc(vw2ag$TG zh{cVqEzN4tEiKv>zPPy!=;_Vn^mFaXp+7#rFAvkZM*|(%qwxm2{R~bpVjS5Mfr@ra zxM+V$CrEJH32sdZKb+%x_pXm`gs7^Vt<@Sq1jpy)MTr+7tkP^^2poSnHZ%;54hZhp zu+U+U8RQSeMutIAfk9AASVSTQ_%`QM#BWT7*_K1rCILuIu9$MJVh<B%`>R|YIwY4o zKE`oj&W01OVNEyy6v^o<I*4$38f&qWKhpsX(lhkh>#_Hf4G)(aW0B`+Azv!5%r!IE zyVrj2@74lbMl1*j9h>!-qCGmERrdHe%au7BMfn_K%vwBP!n%$DzIGcQ8(dXDKof%> zY9%&LZSHKNR5QLl1U?SnqIIK&Z}&g;iLki1SVTzB*<*445%FP9kDZK%2M0YnaqJlg z+x4J)Z~t2RE*%I-L@*G`K1d!swBb9XeEF$;9rZsk!@wVHzTugu$Clfs;+Bn#zv*~w zy6Ky?bqzI)DOZmyG{7DR+VkMiq^A0#kqKjy50Z}>#-5%?yIa75XF;lMUQi}puidx< z0tzOlt(VT?Tc{uc9@YPCm-QhS0Yq~rA6UPkWY+b7V5bM8*7LrV@`*iN*0VVW8)`tb z(}N;wXYqt^;@PP6b4(4su~r=fI&<fn%9~^9?X&&GvoTOMg`CKa`5%zp1y*x>OYPu) zF^Oz4DI?Dp7Zsp;l%6xyA057eE`3q`Wajkl2-Oe3+xEG%X|9eAQivGepF^Ybf~O3r z_5;B)`ZQZG3U8DCm5H@;^nP}3hfCD5${pe*ASNb8^Su~e{y|ADekuEa)5ce)kS@_L zxkyl$!a}mdObi+4#JKd;DIvkT=dLdfC<Is(mqWnQsPQ`ef%nlKNNx~TPA3xz%3;Kc zh3U5aIVYDDDfZsVt-SM`mNE%Tj)Kw1iLDI@aL1$?lr@OBv}UYzW{H#~Bb8>wB@@c@ zD442M0FC35&8YEw2-A!B*={oMvY9R^94`n?)q$f(FhM8`fm}?3Gpkz$)HY4M`;ESP zr4|v6h*yB!_n*heE}(mEWlO@OMKY%4>pso2LOVB;9${dw_uc%R5M-b(Bk1VZys)b< zkH-Y-GX45Py4?1z&1g_OK17e>g15SD-xc8azu;2P#d8qzI;i|JM`Dpw=ItD+HmiJG z8Jfu3nsbjgp&-eWo!R_*7(Cfo-ADf$g+OUxb(3-bXJ5O#P|C21^e~E<RGYj0eXt70 zPwC}ja=aEF=ZlEi=X$LT<(sy%*2O!<dB6G;2>LB6RZuDwFpxxncF-q16={pIMk$aP z>LIPC3Y_<^ci61&)UDM;OggWgC*JFRh()^+Z?6((EIH|yQ0D{g-aFH;&~u~mUPv@2 z$$7}jW60UH-@~i_ql<Himlx03nd_HT4ECyjc}ek!<tnnu@mkJWNh7bkP4n>Lygd4U z9c-SLcZM^TOauq|XW6sVM-G~zhYqupf!QeP4U7qMe$I|@6Ai*co$K`(m0A3S{d4=Y zdo&rd>QYk<G7f&NH=tK46R|b!cf+Vo<s*}h-!4Fwx>an&hUgtvmEV>5|Jb?v{(`{c z*|~a;dH?&sSN&G)x4TvJ*2gK26X_jy@>Twr)&Jv8ty|~A#D@uf&pWyLzgZV|#EvB# zpf0v0Zq4o=5y5C<+!4$_h4ALd(`8knk#%+iqs5;#^JSYmu7#Dtr8|_BQH0alPJi=a z^Uz*Z5dx1F80;9d@Ir)^Tr4QY0Ta)UTw`TU+VLQh`I2Z1G8_p(MoaY}qa22f&drka zQmq)m^IM0I3x(xcup1N1ZK6;bS@nc8J{q0IC)Bejjm;DgUvoG7Q0mD0wD-Vs_Chgh zsAx78$|95D%(&U&*@3nn9FqcKVDXXh3GkqhLtvlB6Y=O4fw+*t5SuqTO{a@6`?#tz z7_K~;4%){*|K~u*YNrF*K+FF1wz-}T4#r9WwriaoYm0we|AP%p#_Q-=+<wibAPv9} zde|f>)HF{mwJvQhLBx>)!~5A2V-vA=blgP1M|FC6bvz0J%>c^shD>#0($p(;W<`Bg z1{4WNs0QWC>6z)c&>avT_}V;?%R9O{I#W~IyE?lhowl=mLRUBR{f1omW<LZT9UqSj z41O9L{nQG+wFC&|)fj*Iq-MT>Uq5zwy>D%Hb7`lI%4X_#G@bS_@`pUzYOsH99?^Dd z6_hy5$7pUBK8*zy_mkQT9^O(-4i5SvIzA2_5EKWCj|~qRI53}y+xF4i5ii?s)Z{wi zsv=NV*Aet{doT2nfrH*dYBhmanN*GDScu8hNhw^lKfX!IxPP!q{dN~%)1EB0vT*D1 zlasts(9-xMHC7g{1J(B`UuiS>c<DxX2{4k!xzs%~2HN@;#&s_?{2KhpdRN_Zg~++k zGp2MC$~i-tdG8?uT>>zC^`!N-<cT{@O$tOs45XX}hUgE<Wy`ajWmDPIjV#4f*@G;% zUs}r%3=++@9HB_Xwr7%2_$3hL^<kC@C()GH_EZJJuAD@pp~_GHQs!3vfEAWWJvx<L z+OsqdETbHUM~1<!*IXtj&E)V(^I77__TYUj`+yE(aAXi9dOy~FiJJWhHv5y%AYV~T ztDuo+IJ++@zSt0l^x~q6>aP3(;Sfb>o&@7R#q%-aE*8V>v>Pz7J$M3G$2Mh8m)hzZ zjZV&*gk_OH757Ny$gxBH1IO2gM~|MJ<>@~#zd!so5Am8p*1mY3Jp#NPHiXa3JcV1K zuB&3#o};ArCI3>`&!(F2bz3;N0PcQT2V0*E)L-9|d=iZdEk0%Vh=PW!@Rpe15pVH7 zF;>E(IFZg-Al)sGT@K3mC2ah6Y(PfroTG3DTj#7F4%DCh8Lj=C1+)+#`aw<d!<N+> zsjZmh(u2$CejM{`?e|kV-uehw<Cb9Grc&8NJ6oNAi6;6w)VRWgbxEsCNZ{9z!`F5q zL!?3|h2eDGKb~`x9`F2Kk~mswBXgQFmD4y(drZH29-`kTn$PK@2$P~ELCHVEbDkhk z3^NXLh6^OK#l$-LdTmKJqZUOcL_FGY2M&`dB{31fa#msz!}-OZaaFO5We>3}k!E{q z51ZCR$&5(x&&7m|8HSQx$?FhTR!~;ua(7}c#n)DI^UzpAWc13&YS|npkW>g?k2>@Q zRi-%u$GEE7E;-LNJVjKA@4!`xDDBFMGVElYyc(VtiG}~^Uw#Nu{F|~=Jp4B(WKBO~ zgVvcAZ3}3fZp&x`q44(<YQK;7@#6qbK(N2Zf$PPJ|DOI=Hqrn>-L@KNWuP5YfPJX6 zQg@`?o?s8054wOLDRsoy?{<MZ6Z|kL3J4t;4jcwUQ~LX+fc@F`HJw0z;d(+GzC4eP z$_Ww#`Ngoq4pXCIS*7V5R89~-$X^6>bkn|#y8A`B7E=Dh{&M~=FXK3FC7(24&KfLe z46Nb7-i+n@0-rgpRts7?>b3QtYEC<?1(S)wMEJaS*Belt2qVq|@Dx-fRv!gbV0sz; zpT=-%2n0vuq?2d=`F&w>4V(#3^5SQO89eY|<;-lRiTrkc5NGh_U36wZCcON5kQT56 zM<6FCqNUc~5=;(_OOw?&RP}#LL2J*Q8F~S}wBIa+03Pf1$9_I_Tn0BsV+5%z(o!-C zXC*O3&pIVs({brc7?&-Ry6JN~yt7I{VDzow&{?x|ywj{Eve4O0vzv`=ZVFqfwBlQO zL+z|<B-w+;HueEN2&W1I%jZCtUroVBds#iiG`bc)$(q>D)K&jHVVsr^RHBSgN%G$m z*`akdd7G!-;K4Tg-7VkiXCP@`gFeU1Q9qk6N#Lt!Vt+?aAsGtH#7;aLzBx65X9TMw zW|hfMb`ZNTvzb`Ee|DK@x-M$d8g{%23br(<Nq1YZoAov|y@dgJ!{M=w+F<iz1H-}r zFsS@l{&M^M;THoMkR`(>a;zus1Z7*+GaMAO((CDg{TV)_agHz;0-5e)a3W0y9&1<K z790eF%uR|S(r%);auAX!z6AdKHvoVAGy~b07#UFh#+m?pJV6~EswgpOT<3<|`ijCT zB7<Tv{Hp0`@ys2-3~orLy=-px92J7y@1cZRYdV_yKSLS52PTOw$kL|1HE8Z5p<c+T zB$#Kt317P3wBKyMxepuULTPXqn9K2`Bu|l+$vcQ~lG0iHxPZA0AwlFZl_;lGl3YrW zGj=WZ8>Y4VVzgOu1(sbhuT4!|HI3!x`71s$IH1jq5K>DPqxxRDt?2p+rVV5>B&|~; zcNj9GF11Zzn5HmHQy8XSgnk^7)7xR04?(lKnUPc9K~GPz(k6;EfuDd;@i5+H{#s4| z%{DyuNF0WYkECDwwO{+SUz-X!(tnQ*1BkK%>QinSl27}}>m4y(b+0QpHLE&<m0jJz z%DM%>%9cgIDvgC0{u)VDh_Dt>h6(Xbp|#$b80;^znK<~-g9#Biza8TPHaTAlfBCNt zQ`2C!I{*H%9;dZ&@YBj<sI<8x=r)U|tD0mO?Y2F^v>l&;JbTbnPfza8$j}G%2Zi0< z>183Ov{C!JX$In5LCJkASrG!!G4`{cO@f#vLCiibTL-U-BGI9i^%n+9_Ulbw-KJe6 zwl}fY#>UEIM`|7Hl!c3cHf?#@{}Cf$3b4*_-u6r?P*2b9&&bf*D+h&*Wj2fbZ=cS; zKSS9cQQ3t-s$b|CqZ3l566K;wl6-}n>;^E)mIQLDY0@TZbWvE@jtZ&Wy~%@s9_aII z&D;i<VXz5W_q;DR2H{A6LcL&3E#0u}g29bP>=d`3Wk)WMT2+HDFAVBLxM9y*sFDhV zCMOMit1(7xvYeym(VQ2OB|Z*+VZO2W31<=?f_f8O^Tuoh!TRwMWuy@(V`pwyz~j=c zL_{>`Q*e6eh*oQQRBO=Ef&s8yAu#NLCb%Y_W;wK!We*G)(Qcibx^EiT6O5{8x@s8c zp{VsCLUVR9RQgg8)nR+x8q%qa!p=0Y)93?WO6@X#i6#II#XZY;s`c4q(aOj$WUH05 zGChJ4XqDBB+TH=HT+rpI2SBIcps;l_OJd)quCxO6^xm6OHlj8gdD?61%pUo6rIxex zzmv&iS^uCn(cQYK={IYdlVGKb74^`y*F!I)9$H@yy~x#}O?}uar+S02R^{~TYQT|< zfF4^y%uT`|<tkB9RnnLXZ|OHo8~k01E@cO)7jZWqL=s)skZ{Umo=PAs4Gx1Hsjj)+ zhO{Y}8`8eW5|gIQc@i+!Om<1r)_Ja9ovuE&Y6ux{<~mfUG<hiGv=Q%&927J!Lryo9 z!vXZJ#^KY`SXai2p792{E_+@R`1c{gIl_Pl1ubN|Dv<A0flO2dVq!rLrvaE-)Y-r` zns35@Qo`rs73ZzaP_1}S&|+p#tUm}Q-!cqo9~6v=23GB>%@B0?r}%?52hg9fNupBv ziT&i}bbd5p4d7`-EP@>|qu++-uBPbCS$><%8R@W@Zo|k<mOf6ttdfP-yyA;t!*F)3 z_uUnm-wfNr?h4uj%R$h5EJL;QprF*}(*unAFIy7Mr)!Hjk0MH7o*oH{IUf_7Z4FHz z-X{4sC9ca-GAP3Lz~B;<^E5VA*AHCS8V)rplq-rTb~pnLL*CH4J1j1Tsm|Y-JH+q` ziCS(;k!ybNS{#sbs=^l7!rmA2{SA)yxbsXYTT(pn)aaK>dNzZ*O>~ZH*#rsRvJAA3 zo%0-&Jhfi&=73<>wC4?Z^&x;F5o?1@BcdLpo5p$jY6^YmJ#WIwg}{=+tSPIynd~?J z2ta@1uNgtT-6eg13SK@gG(Qcf`mHKUBe$0&4|-s#>Gf-j6`O5_+bg{JK_fboN%PfS z%Z0#_oK0t`*R`0l3M}0pFJ9Q}+^)5tx2gUnKu&5k*Ii7ae}uUT{u_gOB=T*rX#`@^ zG|s6WrHRg|z84}81H(ZO>!vyI9Sc+%x}?#7myZjL_*e}7EC$cVP(5DXWgL;?+dYQr zm%5j!C=HYEyt+HN&D=)r`uK^q62W4cZyul#H?ahG9t^gG{jUR&0<d>++Xi}Q4wH%4 zpW#Cq=LlfHhd<e~rR!t#J&RNgkZe+D6ej{41cRx8vX*dC4tE}u%NfY@0dm2hZ@W_F z<GhX5$5epx)?NPEbr1uxuvc-&>I_v^_5{r?O=TZX55qP6vqbS{{UHYh>KR#A(SOUb z+1twz<0J5U_O;ql%gx+@H9_xzNrVeYOFR0spgGzqwN;n7LH@-PZ&vr4_M7cDcVSap z*Un)1hI##Q*EI7}_-GA%->53oPF>I$4~#Obmwe>XVDi96Vu2x(lq=rBsDc1c<JIN< zvYT5XXoL6m0J0cvWYU#-z~5B*Q<5=#1Jno(qp_ba{%*Sai)C)9s92`)-BCfa^k=*( z9okdIFlG}qSP^&&hPyxa((Q5cE<qNH`a^tj*8tX`%eg*!Ok#DVzKl314dg=vZ^8b1 z5T?f*2wYM?&W=P9$`X08{5}6wvO#OlwrqhaoLNnU&OtC*txZg;UhKxR3)|?y%*zw? zjJzy;@Gi@4Pn?$Z*SQ9)A;LQJ?(x`nr$_@e5GwKV1(a>PLX~*G>56--pUC1|kN0$W zWUmfuP#$M1ftX)X6^Qq0u+w~i90*htQPS)S)<tPQe=BGI29{aD4OPzzH_i^1S+d-H zhf7Sj2g)axc?%f=m<ccRLE|tcn^GVgq%}Ft<1ph*-ElhMvKm`lIC0W(i+;G*+?ak| z%4<yC&r>|<q<H;KiYE^#o*THGjrk&g=T{|DzmlZmhu`ynoatnv^H4-##CH(u9z`MM zTyY>v<H#g^n$HX16T*S>XbuVHeO9$JPR~Q{KA&{09++G0`0Fw~<msB;bK_j-aeSc3 zVH^|;53&R<iVW6!{;&lyM45PSC)J0hdTfbvq>*p%y4&-shxO)^{++yPcKfQfb#Bk$ zZK>tVUfwXKm!)KSaI4h)ru}A3^PKwOii**OVR-w1>zSzAD7iFF8De2MC`_eqA~dG6 z@oLW|@HCsq$$C<tAK6RO;4|=1RTI8y0Ux{iTCfy7Z<zTZ9Na*qRCgp@fE;l$e~8Ax zav7-X0=SFV+L4SjKa5)2U!E?zgCfr1la*^Gk;cz>`J;%K*23NBgMwyRHb+jijKD!q zr0&zxSSpc4yIw=#3DeUA<~~F?M}Y9i7A>j+>C3%^OgQ!-sB9Mg)9JKVP!+ebLqIMp zUf4hn-9DnPLU(97WS7bml`VlZyRnqY7PO#UEGk>Zs%&{$Wy=*l@1Ul@;?qj-sbuY_ z5d381c$cvsKOfm_W-1^nOW<VhnWg4TbGJ28W$h>KCyQy@<SP0fSvLFMhJv=ObdSjx zjr-PsQzkYyR(EFq{3;103{HonPu{Kv!mDGV2(P&QHo4wJrD=<-vl;AZqWM80cooL# z2?|;xM>8m3Hri~mC=x%2AX>7&Y0^CpYo6}!zG63Tr`mKRfcFXb&_dHCv477WwH+TF z>8OG)IW%1d8Rf_PVllGNUlQG<ejAFHKnAUegP^H0L-nColJqJ)dnePjfl@n(kwY+g z=l+ot&m6gLEwgI5S28!ytP1zQ*zo0&-pkZZx)5KXO+z6E*pG}%naScKSRDEdFdQge z-u424jkEOEZ)LDr>H~tpZWjbz+ix!UBPyIFz*{bJv~@SFKzJHnF6r3}RtR(yxez)m zm`<aizZmgYQJ0T*<t6$^n|>My##<rgK88WwP>C`^CCLjZ@<?^RG{Jyt+2IfRtq75c z7UnmnR{FQWc=fJUBEc`&w(}v{fm8EMON>`OZVOgrw+5%iOnU}%2<8{6gc?Vlv`shO z>%G2c1pdR=sl-lUlHY2`!^dnmnJBvd07TRSFVaxj^%Kx+FYu;5+QtA#4_r%izhW?9 z-=qt!>Zdj@`X|}2BbhyUqOeFm>H%Kz;S=y$dX`BYMhBg)Lcz?Z3c{(^o=0ngAIDJb zAe+FmY$B)XNr8T3Hd%=51EDUaX$Ti^x^A`MF}Gs4T@1He!pTV!?-t4JnPqca#PASj zWA))v@siRl3F0C+?Uk5YvlHTC;>ZY^WfP$cvhm_&6WE?jB(I(nXd?3&q&%R?{S#wq z<*Y)<K82ER6iQxDs3_2n%q9z$eIP<FO%uOgqCy(eg&l6ha4&}2#c;=%laOKV%W!L^ zw7WnYidTz^uJ0&35`|yneDL5)Xxu?=Qp-Mf7d>l;d88ZP$0k~BG3#t%%dIB`nn>J_ zmG`Wx9(=HtHhZ*(X$$Z_p2gJ7lmRx7We!$$QrnnNceUgdRp*ak{uB4NbH0KMz)jDe z??t}tNr?4UALttwq5a0I!36G_$f24P$VihF>jTCArm5?>`~JfFNV)A5H#c*#?!c`~ zpVlIrXS^jQ=%k4ns!4&2G}*R3u>F<hECZcCQi(p&24l1WXvaZIf%v3}gCfx$U=9H` z&!pobZ2JqqlxGm*PRcB(H~sXYAN$OdJ?v_g;>~c?0qF4z+<$ZIQ{?wXQX~pkk8BYH zRj3`6OzrK>bbB3@vM(2?sW8CwgDGJW{c0Z2lyoCn)q#E`D5NEVt2l!zJ!+!j5M?xW z>H7G!EhZYW8X)%VoYFxsME$l_he1|Oz^t@^nA~gv(<z?2`F88@Z=>1)h3EO0zL1jX z$y3v=&_B}d$rLt~_N=G9Q+wY?2T{0mXa%0fhv{^7pvCTFCdhv`3FH>F+-pz&Z*|9P z(Dj5OL4KOe+2R@V(vmSlwse_h`G4SAiKNj$F*<1FabuZn<S_UfPn}cF*o55j+mv$u zVJu#j|4(bh2u4PTwQ7khu_b|Y!9fE!EopJk1FqWOay#sDTb|iAugP!uZnOdmP}o9y z)fPdFY$O5FMJth@30`A1j~C^cjJDtPyt{DPBX0p3O2wO^5?Bvbx%Ckh-W&H5psrjq z$Tc$6G+}*5v$sbJf86XJ_D}m4e&ZASPv&nEJEa@!SyjhdTG%F5ceOQO4X8uFgtE<^ zPX){O)<`rmX^l;dsZHB~+~ET?wt|-4D%4C$G?`>g+LQLAnI<<arfQTU?_`ENF-Ug! zAUO*xvL26Va}r>7wQZ&4Zx_pk09~NrHt#Z!L4BGJYi<k8(NkJ1X)fw@18XT<(xJYZ z1lV6o4ldrXc#;6H4+Qu;62@p1OC&1*><d!*LMYoOJAg#ZtmSW?0D*!83lS<zxCoJ= zM2itCPP_yVP>EpR5Rg#NFtBj&2#83?l2B05&@nKvuyJtl#_IaxY_0WN+bF=%(YDyU zb{#r(>DHrHpZ)p`7&K&fj(ospbbzPzYI!A_@)_h#m(u<Axy+7|<!|1tJk(R&&0Mwf z-4E{cDiJ1msE;Rq;5Xi{^z8`rJ(O2!K(<c`ddltO&5_W*Vp3%3-``ugj^BJx8HFFJ z#j~LAtz0sqhMJ{8dQ`HL3lXbJ4H0~zBW3>joY-I^E>f6V^S|hT|1)&o96FRf_|WIc z&tqr6b8g3e|CbIQyvq~+Bc#K}B<abJ$<t#?N(=~SBnOEQ!dFdYa-~d@DKb0c%rFvM zvU}6Nh2X&Ay{W2uIb}aSC~oJ%`fC@umw}97k_!k&Ktw`@90f{LXwgGo47!Fg9e`Vk zXylbq-K-AwRAr-sh`z~_g16sScQ|&tg@$@a-%y=t?~Hai<=`?(R(O*~Qt_^8ThZJh zZI5ravURMw#JAEY@qtSLv-{)Pez+;JXTy5oioD#2H=E!iwNV^S#Su<Bl7~)o9n~#I zv(SZ&t|+>(tL`2>?9|iediAH?-PcD#^@T-GgsT+S`T%0LmQ9U!jjVEgPaS@0A%FE- z48F&_$qe%y*+}EOg3--IDWl5hT6t`!02^wTIvEV?Pw*3HiLVh3{e2Fl!kHJ2k#GWq z$L;tQYyZ^|D8%MpCL)DXCmd(tEC}b3@K}S8;D2-CQiL@Bk;8Ao`AIl!!f6*yo^bkw zGbkL8Z~)=Wzb+8()?t_b&f%VL^o3(89E@<xg*To87zpQ*aDEidd*Or$CtNrp;nWKU z2<M1!C<(lwB_IoDRyZ@l8%F_Lg*UnYPQn=y&U@hi34AZ<%o6E}*x*A>(xOrWj_Cx; zG@hE{+iN79F;O~+`2?dc|C;i|G(|w{jonwp$s%Gba&wAoZ0)l#T0Zop(pL7LUVn>U z#o7?bB_~n+z(9pmi=auf1#>{@l0Li9wECiDgE-GP5Rr)9iv(1{!&oQ|hjf$;!@Y8( zq2sM8t;fP8d!jW%Xxz-8ZqiCbI3j91VG8#U>9XU^LCg6y$~aa4fR?P0)<bAV99AD- z8VgQUYdY#t2F+L*qG)umuD_yGab%cq>JA1GrALu(>d~xXr=>js2jM9Jr%p@D?TDr2 z6EvqGbK3vP{ig{TqIhH@=W)d16X31C#o>Dl(y-`M1uKdG9X_`$)?3x%P)UKvQ|F@2 zM@0YxBEgj}lvNNV_G-OnK}Xm?3M<8)VhII2!P6lsC3Mslhz=R9h%5eRj%yL4Cx$UX z^E5L1Q;XJpI2Un%Q@B7e6-T;E4Y56nUzO%J5Rp<;-AG{U6EARK;axOaNu$emsQufw zfI7JuP9r$sfIp>niOU2a2FSqD2C>^?=o=~1T6i^)S7mX9#Mc7>+JMFIA;f%lJ0dZ9 zoI&X@Iio@cVqu+2iC#SjBDS0jI~$UNR+PRh>Xy6Xh_zM@(h=qXIB5fsHoPx)B2sWL zZ))=D7CJ7vCesy+H1;-#3r{jC)fR6b4o+lAda__A<rV=3^OY{<S8a)RJR7kLR=80D zNW-F2B1fd(P-OM$Y1&nmvUI(OL@(l0daaWEDsCnC7D|BX9l<MaDNov>{ll0=hK0#` z_g(_}157&{9zjVke}^)tbi*5=sT+}urMZWa8c{_86XCHyhfc&1K;*^kIIb51bwy(` zUBT$wzH<jeg`$4p1PYmS*IR4Ud1ph)Ycm{>A;Kj4EFYN&BZ8aQy|hU{7Vl@(B++aF z7^(?~Ppo=3oiyqA-lz1j1mu^;^ntv@eXpcrwQEn?lYFW5?rP^L_cL98><nH+7edh; z6c}QrJVB+u%#H4p_-&qSi(z5>G8&f&uD}Gm`HiURA~LUZZKE%&6gvL*&`|}-m$_jZ zb^eWy3-{^w4*Tui#68%bAr20rn^UdNL=d@<GkQPdDbX)>1M?7ldZOaseLWsW66Oxi zA7w#_o<0Mdq%Kh3Tw#}olN<fH!LTRwgZ%TXWtFe?&{6*r#hL+mwKMAf)^hJo0Nt7f zj=3#w3|ktF=6bzIsY~XK*&W)V1!xd1-;z@NT^=HZ$0sIz;_Mh1<mHX=88c`JYfC+# zIEt(IN+3n&4WMHCSpPUyQCNG$V+sHmG-<#^osgPFzBwZX6(WCxScM&86(@pv?~j22 zz#>gkq`w1bcVs_{kFb%rTlzr1t)dAGm?>cQ-6wn63HYK7Tgd9Y)RJ1}6{=9Y<t=&L zOUd-`H7B0}0B`>HR1|}yFebLky6rfnMr#A@Dx&S$5XXP?AVB4}Dm7(DR4}rix&-}V zW5D4x0J0jg%GPT@Xd$4+XG^uH^1m&7mDyYN>^s5qKi>6ywe@sc@bVFgOqam-zo;tZ zg_OPX(&Qa(sOY=Lqk8DZ?8v)bVx`%g=~C;H`D<JT)SB>OJ-55j)HG1kde@GGCV-GZ zL5bhZVQA6oQm8x8tQA7geh02|qvOt;$b-&b5zkSJ46`-?_p%@3KntDX^;9{~JJ-yv z-5}C{kZ-<k$?rRP)J4ygn>F1!=|0E!>KA;tkdwS5(Z;bGg1TLRGJqUK?uVSNf|vDy zwxG(w7$_{nXhe&_L4S>%kYmsbSb{Q|CHW%xyJvela04NF6V6|}InU)^Lt1HUeclVG zJ=0KyMyyUWu*<C9w~NYXA2<;_`_G)BlMD>cVAI>K64YRb&=nN3Tt?}A9AS!k9snT2 z&@4e$Pz7P!b8FUjdUZ1T_`{!FmHps11iypdjm6Md*j&O5vP>99y_Pa`EZM~}+A&l} zv$Sk!$<pN`2doJPoGsN$(`|*`u0rn(F`dc)oF38kYhDJ})}P_>>ax772r^C)RGiEA zRLm~`Gx&1eHkzCKo?zvlG2Lc;!e8!?0onN_7rfG)SJOequLWr80MwunO%!2L&X!s} zEZ>)DeSPP#^}lv2=xpt|;6MCx@ekRLt;Z3iDk9+!)t%SMj<Un)uuio4OFjrf`1>^l zN`eWLziE(@6c7h@Ad(J{UxUu05eIrg{r~^Vs@uFH96yL4?*3+D^6nQhOTRj>@Z>0~ zdNi_71%>8Sr4jggosaO-Jyu_S!t0s;4&4Ij@wWJWR(cR=ewp|n)K`?jbHbMz_J8=# z343xXZyg>)Z`rFSM#xNA4!XguSzZltwaQHhhGm;ID%6$N+r*a|BCiA6)`jb<MB}M- z>9cTWDIi5?ae0@e_-5abLrOz2LN+g##>;|q*_7?E%B_!0S?U_`ucTR@cxHcKz1uX9 z@3$U(NGl&l?~7OAnU~*i{6IgBZ)0fg)|cN;H@8VyBmbeX`DM1P>rvHmDd=c9VWoaR zt}AW+@<r1DHU|QM4(<b!4Zu{Jt&6XNZ<+u91F!iySM7eDxljoQ+QPP1`7moYP6~dX z-6|Drb}CLAz2xF+LV5-IgnyTeK5`+zj>*QqM`wxp^qUB!QvHfqUYdZ)SS{LS*=}*I ze6f|8pz(!ziYcL#GRmpQHRg2g<^FHne@!RL@>{@6k)_)Akvsnl47{l%{z>$Ux9I(+ zi!QEZ#bp+9_=VqVR`h9$)hXY@zi!|Cy__|bd;hy~kU#rjMYC%8!m}Hj7JsqddJg07 z-=}{N<<Hjy@hJz*jIZhpFgsv&J>ECTQfK^TT1Yo;f8~F_u0ABMUYUI4>Dxb{m!ta7 zwC&7b(-r)$tWN9NbUoiS_$ksg0T^1$e!;dYAeIYihy@({eiZ(E8cVf&(wNA4mXpbm zr;j)7{;PcV2Xa!gWqS!S07#Of9mm@rmJ6G*PdpNrO&I)Nx#(f*lh57`AN{!Z?Wt$* zKbYj=ziZ!Lj%uO$0P%H;n(~*|q<sWww{2M7u4e20XSV=!>OT{QK0otQZUtI?G8M`@ zRU4oK3f6BB?vGP3?@3lFZ9UVEBb*m+OjwTgl*0GVJTavssyvBry{|+oSYCOOad-8- zUuE7`M<Z;4UQDd@2I&m;s7tC*HC;3s%T+q7E`+fb4Xg54S$>Exk2Vf(kO-h~sztSF z01VjrH8(v*X_l6lALcU?uNB-Xyp%hna3%BYSuBn&dh4=YX|hzj%gVXcub0e%^@Qc4 zT^}$gCOBqvZR}CJlXk<dvs+&W3b7)rg|>yBypDcS-U``l?HTu0IOYW%PyJS~yeeaA z6Dl#T-neIuD@^cEd1Pvfdahd4>*RB5QIEN~VHK_}+Y84q=xYjXU!zEfowyd}^<}@d zVU<sANV<dO4hkZ09E(|kXvF~T&U@I722j4g0wMCHd+egDaCcB&)C2Y6qQh8@boSb^ zpSa2+(`a?LMi4*=6j?C=IIqLZSL_x{sqn9J`wBX85Ib1V<DYRBfcsBJV_th}36lo@ z7d5P@+53sL*>)C>Kyba}Vpi7bIAP1f{qC(s5#9JkW-4#u4SShje(9(wrxnzG?y_L# zw)hpp5KIoh&)(;n&X|knFYLFguN16x)lnIyZKh@>V5~EfXA9J^UBkwBoJW)LBh$sZ z&v>iw?dT?Zk}OorI1K&n3EqA#{^cvJmiHWv(JFs&eV4Bm&~w#E8KrHfb{1fT&ODtY zplj~q8lh!-dj$Ei^anm{jdqsP=1MkfuN9n~EM18MO1?Jlhk4G7Z8&6X+-kiBURxP` z6Jb&gNd8j)0*@2K55Io9UT^UI0+Oo`&UPRl@9sZ{%k+W`m>8F}N*rUwLVW-P$&>P4 z2*V++M1Zwy`HI#)z%?3vxaTfn5`57>e3C4lFf40DOpDI4JS{)viQ%+~Z^JmMc;EOm zIKp+d<>u;poWDN#7`D2siKnrI7IQ;8-)h}A#QAb54wN7uS)Z;&<!r;a8t;8ci=!OY zCHFMmT=hG>iWI|(BNj|1c2$n!K@OSY7R)>PrH`?$hg9itKNIo$(X%vvN?Kh&dzgjp zBS-J4Vb<KwM7+eoRx;(C!pF_abciiSAymw&u&g4Dt%%ZU@x<7>8INnO{On{%&?R|E ze^Q)Bl_y&@7t?!fwaY#a(f!_bb<0g5M)3^j*Klx#LuPIX;vF*YjKaSLexK#_wjCTx zAyn7^TPs-JPh-q6PA&`YVsP(W5zX>+((mW?j!tbm?ETRDw_)`85q=44aki0)-<Q=2 zZWTV2FE4y3{!1shVXe75ct^2JCkE*krp;Fh4j`1!gDa=y&2|+`smt{uym~fSt|(wW zPcn*Y?`vHaST<`qD<bbUOy^_jWopli)tbwv1c^C0sQ=#WyHaofp@be>;dxDAiBgyA zMR@gW%3e`GYo4sVuhpbP1DA5&>9qRSG#E80KdFY~+#7hMhK<2SIk%?Aet}f@M@F^Y zEdOgAMuIfOB-f4(0WhwqJyK|c^d7)YD?*!qTM?MGwC`M2aJDv=eHw0>(jB4y#FFY- z3ANl^Fx-nOW$XSsUeGJ15s%fl){A<Jks4=1Vsy<0_pLGhgc_5*=Wd&{uS5#`1o7Gb zqX>+Uj0?{S(BAK7C#xgs;*W+TtA~i$FzBYTQ%GX>)q)12f(?vgMs7_(J2t4b(NdSW zy!{0RjD4;)CETf`!Mwr97n*oT=6MC>zb9F072E9S!JxVt@$!zdMOwm;I`6IJDd+40 z&(YKB+%CjP8`{Kzos<;SE<4^3dX==j!LhWaw8G0!i12{EdmE7x5a92xoxTmDocW~S zeT_bTy<fPFa`|V{!#h?`P`^-vqX&aX?H#=5L84mT*SNy^XuGti^~8gnAfR*z8ZsAZ zm2=;(a0ELAa>ejvh3dUHBe){Jz2Rgr!VFYTH~|vFEgi%`vEd)iuyY<^Qp0=%?hmx` z9zKDGLUeTVycxF|cE}PDg9>FjN-BO#<9e0uUTF~jLJ5^!g5oo~eF7NYR}nH?4{-%5 z&y~w6AuGVKn9Hnk0Ph4w;ySd{aYZ;k@sV1=d7WHuR6g=UY%_~$4DWlk`Fpx+JM6FH zno<}~!GjZLeDiAFMm7i?E25|zzDbyChs^PvcF9NJBL?tk5rlYOyG*_hY^~6G-qe03 z!27Tmcf4cUZZNX{h=fp7(a7cFZAbMYL)>=UXr%Zc63^^BN9$|{G*VxE9jS(VZYOor zHbaDnZbyuU#E+Fk;@|yZyKt1xwpt_g{zDlzNZk_t91Vl6M34my+Yc#1Q5k8fr_W{8 z7v<jNx?j)8C|&ZB{=~teu_wYB&VGo7Co5P_1cOKGi&_T~X7D&-WLV4DvJrtbb2!G{ zDdEJn?_FpY!K_z8uzUezJX7i)vlrN{!am$P6X6k@8|3c^ECIKI+&f>uIcU*fNf1U_ zu@w#C3b1Yw&NO&ML8epEdlF&0k}yV}mKI+&t`L)~%BK?r^OiFWQ{a8DX)xEM{N-r@ ze-}L*e%AU^v51(Ixsrs2q{fT!$*VT(r_pMVMi4+5DCJa>Fr3%H3Rlnaar_h9JP0J9 zGoQ=t`R)Bv@yk;D^8!ycp+hDr1aBnjglEq%g=s`Syq`3v;>1;l$qwl(=GZ-btRNZd zeQ0@37RI%9wC@^#iDnhzWu?YlVH#)hE7|4RWs%;nZr=RGY%>qLBbfK0*;R9zYf}4e z0V0@A-sG9`rX@t#Ew=lLVLwqMb+>Z0g&hq-GESNa(Z4<Sti<+)DMnnwIlW_nk-D;K zG)9IpRD?adkk_IewVZGpc7%@Ud);FuTcNz$#cNi+a*@bwkPX9rADW$;)61{_DMc9N ztNN{`)XN>HWNhz4OP!efNRfT_^m17k*E+%&o++bv?Alt^mM?ky)^cWko+8fr@4kjp zCrI=gJUf9GY=(S=#=)_sKj&J()Kp!m@!5e5xix2s%sM0B>~<@l*^Q?{$yb|~zb~G2 zd|I$e1rBs9cYTZQ7-qZ4%Tf|g5AV4}2d)!m%kRSbPb|dJx4bF(=)x5%_i;S@*F{14 za$1J_rJFVXu5?i-Aaa{iy9^`arn$6`f1#$GghJ+P!UEB<A%%-kwgmHgiV*HXVd1o_ zGyK?J(iud#>s~)6s;BPcCC5Lw?ZNwF@f6-^!#sCmMfFzu`w}H9F}FF>yu5h|B^A1} ziNH1M8P@;iE?QdK^ybdX_Vavw)k$KRe>IUex-nBqIKFY)o47RwrtnVx&T|QqzMgZX z0J9;&!W?i0xq0)3C}^F$ldW-mV?-`GQBQt&v88<|-(<Qh9P{<9biN8QNszlMlop-> z%Zg6SZjXeHrH^hHvO8M<HsfR5MHDKSA8`Qj>u2}GhI9((P7hG@kNL>GCf5%*2`mnv zHnBGXJa-DfvgxL#J>R(Jd3_JvfQXFpn~*LRc1W7#ODjLL?HHjKT{kk-k!Sv4&i7pS zdX0=^n3}lRsk+Fm^4>wO_InDyUmL_^hV_^BmbuKmdq0`Xa96mwpWWFP3KF?4cU5kS z)wM(^vR<LjVhD`g{V|@G@&>(^$~9l7GlVzTz3q;=p~zCgcPKpV^}3~$0vCSVzw>&+ zq+itaQoxxi=uCFXBR7#ZM80)0C0pg|8zFPi^?EXY5n>zrP*!BR4RFklw~~-Gw8kz~ z+2pp6@qNIDuSdn9a$(yXLie}~z4uh3Drs{I?FemuJXZ4l(A%m31XUF?wkR|HQ8it~ z)}ZQ@a$A(UqGIbnFG7h~1FoHIv)b6`SGY}O8mc&<b*aCjB(kTFw?pqU?fJurzMD_X zIu9SHf{M)bO2`0>LJ5uW<Xhw^_Cb@@@-Q65b}-SnRwve|6cX!Tw^kspf+iiV%M@6Y z<R%_Zo{e0rLOWz+eZMoV^P$Cgv+f$GW>n@TU?S9^-*mJ^;YXDB8<MZ|#iJ$;W0~!y zgVOth>)U!zc-m@;8`#-VsE8}cAHYYdNY3*@j{d+sXu{glhpQw1d{b5YRxqL{i5|Ar zcP@ZgRE#7URj@I#fM@oK_S76N>Ez9j6A>zdA<H#;85GWIBkZvp_+kQIKUD>}(4!qA z(Q)A^WOjY241Qd~?82<}X_Ry7-L{uAe>;6wx-V;G=Y$)3QsFW-rk1dK+fCxeM#E&V zgf*0&ayOw{TW&>zpcuqnB(aZee(g%=j&~nf5madHd<w7SF>i^u2BW(^9-l6trxl@= z=vz`m%e*no(3aKexZPW+%Q~w?mnyh>HKXV`u8m&-Bo|+<iBnc_(fhQVF!q-Ri0qp( z@w6lX+-X7~`*0=m+ZGq=B&iqan#$Rqyvmu!PA?;$)>iu!6qj?h{<b2p^}B~6dzt&D zRy2K!ekjYwalB(6?Bk5TEW+>kFOz7nx6aX(0aN}vQV_DzrF{%c(zQom4tr?YmQE?W zuV4<t3|7}?&aDGEkLo#$L-kQayi4}F&ENQ4^bW+|_}UnLm(1()c89+)pdH%+o)<7^ zhH^<Y_NF3K0(>ZC09)fgtKb+Xp@D4L#2{qTQW+M=NziO(HOhyk-DlkH>uO$--2?gQ z=C+0LP?8C^l(#MVC6vfRwii6js!-qKLTi)|MVF<J?ObH2f6;2ZiiF&mglr_C`qV+_ zX_5%7f*(mkXV3VX6d|1B7{}BA{eKxI4e!_wDir-K`U@3`{FEIWy6hVA%P?Si771`} zHrAf;vK1iD&<@y?gSL?;u=OHu>b7_y0Xj{9MvEs3s-U?k-foM$sjUH}r7z;Qqwr`# zWr9v4j6aqwsEAwAd8E6g56@*;*g_>W(!kLf)oX_|0Xf8_;gXj)eMs4)ce$eF^+lkh z(c;Z6sFuP{gc&tcCnW;rvz33$>C>wiKcXmtmIMo=TlGEBFb_IZPIq2G9ybX|gOg^% zXobY*JT76mMjW-Uh5*xJyS>KFjJ{U*Jjm9BCQdpXCvbEOwB$)UOiZvdZi7z4)E==X zb{FO{iaqGF$Vi2ED8}=+K8%VsnA7c0okvZQ397k>%c59K*6Y)Z<&Z2hcXqyrY36<~ zzL87dXdN?4JUheC7Lj0kO>prH481r)aj%vyUpp_WgTWsp-4(u7{qpU_@{UZl6@swN zK9i3O-Ht1UWA}%jY0)CeNk#8Yw=u;sklObU5d|5^Dae`T1qyi#^rgUo?Dfo=SE3%~ zQ;a(*mHA60ow8|Kgi{X#aYff3vG8GEnnJf0$x!3m&mQYN=mwB&9}!2oA@!K&rG%pT z%lNm2cZxu5_1^S$U$%SOtHT!?%M*3zPj*=Kqx<9;4-+WSWf|XDj6+j+&7V7NS(y)- zt=Ox+@BeI-N~Kb%Q0*LZM?r<k&I&3Oipb)bdFlJU%vpvA5-(EtwQ;}vV6z~Bdl~Fb z<T?A5kFGJba`sXkaN5Z_m%VYZJmjIe$2|qRW0apGZ!SIifNhW4^r}Q~rjC+l@$PpZ z70l0~zewMvVfz`$U#2WH^YDL+;VLGFwjrR(!<}R>&y%jC^l@dLIt+W$qR#BCFpP$= zGZc-3x$=l$f}7#?ZrMK9-nZi+HR64lL&~<T*}*|fd~LjM?C<ljkFs90HmbU0=0G77 zA|S>e5TjR!G2%^9o|{0P-s15)Rv<8XeMZR*u784@U(w1rOzojGAM<TqcVqOX!PP^1 zt9v6M*M0Pcc`+O=a&51OqCqtenx8Wb@`R*Q>JczU-3E0fHYoRm%b-JWrn5RFy-A~3 z<*H<KhP4K#E7$6YNEMRoqkgklJ@Fm~Mb{oa#Vy$1n&UgVaofT>)x`vJ8&T@w`FgA~ zmUv%k(a$HLw^LIajM&`7=B^Fd!l0!4B_5iQ*R9V?>~r@FMSQJ3L^_J;ak|RsB%1L( z?EFNz2+$`b=20-}|5_+O9J?!SobXNM^V8)~v=kRUlv_SvaO!l0{b~A%pNKR6g1J#Y zQu$YY8&yT)QAC&&odb6wEa83!euwQpM)Km`tcIoU`2T5}zrXc`x-ui&QWm<Um*Fj9 zp)vz`a*+uCh3vU+!JCuW3%qa%$l9&_IwhCGJNq)*`1Pu#|G$wX5AiJ#75kx!Ng8p* zd?DgQ*S`IKMh45$>MCa?d1>psvXZ+<%1^PU-*{!dFFf~uvGVu$BHfw7BYVbQr8#Y_ z+qZ7T^fem8yDeFgqbhy9gO9DuJI>{&*KhshCi^<}+gwxQhtb{n?T#V)_rkX=;n#gL zzeVBs{Quk=MDja!^!DQQCU0cL?s=Mh$yY>r(tMlW5j}h-jQ&f8=DaBq5Z~I0wEi4d z|G)cjT=d{y>IBActIF{%ci8^;PQ7Q@xVUdicfN1qT}1Tw`oBc3)$i?h@6IKTTA6!~ z!xPRuD(>0LzZd&?T_(Mr;<a%LZz9uT$7HeJpK}`yeT=X!_^-g?86S0`^CqttajDI$ z|HRE}dH&QL*v#8P=XB7uBGkU-|JMmm_5Jw9$C8Wtwfd7-0Ak?E-wTy74EVzbEC-0F z`yZ!B*Ju14@aFvT+yDJ(8WjC1sp8KzBrf^;cjDhp^^2}A|6}_Z6%u>02JA|<ZJ-_% zvnUqi3<s+{d+*vAv-S>l<uJQq@6Q3u>&P58EI!u>3=?8;7jtF|^Od!44*9rI{QGF| zh4e_%OmytY&DmQ>$G?;~>&J`AmM?_=tF{dPBuiS1aXF0Ukoiorft8pWFO-T_jCUT6 z4lOm%J+SDwbDpCTxm3`%%d=Cls9g6}(a~uPo08;Cwr}y^a4l?y#(|K~P$$4M7i7e9 zG>S4U_R_pVn_mV`ygS5Tw7rk1C^2!=0TOyJ)MKftx;{C%C@W5S1DK(FJ7lG5vps4z z&fG#e{-wk|V@vr*l>Y`KGd5q4g>gT;qNA8}OcUw~m0R%<h1OLo<MeI%s}vc;V^}{f zmw`OyRz{wzC{H!PWc2tW;GFbq6PJdr4LLjKIv(LRA@+>PTBIx1#ZldBBc@1qc03IW z+o!lIudrFQ!2}r}xXzl|g3hU5c=p>+KDrBsZKKCn@Mcc_kp-`F<Q%fnx8_mqJnwXz z!FD0y__juaLB2XQPN~b*g@DrG<a|JH#V(cdJ)_w2Tl(4!1rzE2H!FqzbuZ2#8-etn zN~Z#D8n~GW%V_W=6{Y9?<;o-R*mxAKO2l)dei}Ve<e&G8Z6ssSmsmyc0Y^;`B}Xzh z5lY_7NaQu1ADI=Cx}}b?1I0}ysx9{ehhbR<8ga3ODrvJOh}9Ld+I~lfDym!UzVgi# z^Q0sPu{B~Fo$be1G$k|<Pp4>RDvaAgG{c2@>clcv2lRV1C>0ypk7P0YGBT^7OH%Zm z3|-ASL|5>-Ow4NOPlEsrA(1vlXi3-Cc963<E;KvGuMuT4zwV6IB?MLIw!@=rbr?@} z8h9JLmn?Ot?#4(!@+cRyU5r{%OWCqL`mqX<`SODHld)79W$N-j2F|`qPdVsCv2roj z>yPENxF7PB=sN3N1cPs)wJD3<S^QN^8MwIein)jham2?dx<lK0!k3mRddmWscfp1) zQG}p?(AVQXJ2F?A(QZjfkgsT`*#V^DW7H5ug%WC4JkPR0NHrDOwJs8!=46XfPayys zcf8DO2{QYI?|R72>zXG7?b*e%^%SX8ecSt}8x4VtiR}aPyxfrB2!`3DQl?|+`_T<C z+x*i%mR>cmRo!pwu@Rwi)`vozlZ;%X5~gpbUelEBt5jEqO)+0crmeWJ7>3w^IjKWG zk;%!vDuZ`y&50-e5#bYn2-d47bN6r|uuTbdth2{ZzsKEN>%Di7PO_i3e1tPaeLBg# z;4sk#P#^v3F}aC1kFa;`Og{+3&i@}^z9SY%YE|52Z1V%vXQ~fxb#)vbe;dsMGyz=% z%J^iz+~s6NrgW%B{0GSnG4>`!-JqJ1LP%`Sg|`wTG}fogSqjc#bfUo){a6y{8rSU_ z4=qJGka_)wAPZu55Jtx1JH*`m1KniYUV?tL(s4duD*Q-RQ9|cIa!$Fu6p&`}NvJ~# zRiE67AbO9Q^J9<u9U`vvjfK>p_7yu_ha5PCUfdltpt$nOlgW)5qJ+dYuYg)1ma>k$ zs@pooMU&_E@Ev`0qPkH{Qysq>cwBN*)TzwsH~Ys>-^@$lT8kn`lg+KUMFF=@uxW)u zIOeu6eT3jDwk^}Mqd#Szc@u(Tr?<t=xW*XPUFYLMm|1+XxI>m6(amv|YGjw5d!)V} zcL-?C@=afmjU7ZZjcWtdDyEE$6*+Wo+*N{~H$Guo-md04Ug8*%n2rO;Vt-|+%0e8| z!{hRwMfaSKtI<pWp^E6)usEQ0mt7-VjuVyR(%5%kZaSlq^1LS?l>0Yv9yVadwDwfy zpg1U}_i~=hl`(QF@i-G9ZdRlz<0@G42m$-!Of=6J^F1%OEm+!}d{f@6y|E&g*BhTh znRRkf$7GfH0zkH>zyUzpTRAD<=|<*H3wfn`>Gf9CnL98!bK&xA8AQtsM~XB@UIOp* zQqVmVW(gk<tJy_cFPqD8d4x;m<z`W+K!q~qdQ#R5b;xnO`b>7c-fsuKv#;A9<IJXf zQP}u!Z0O$l1uMY36V}pBqCg1S-r`8=9<~V;5>YMzE{=1D=_E0PA>S}RO7R_o?@j4E z<A@XxUhq?B>K1h${KBkljdh6baTu(nTLo?>krYj&7lA3NxQlOl=wt`nwPor!I#N~V z(fajD==kyo$s8ihjb5&bDZF=I--Ot!+9u!Z8O8dhKew|pQZWtG+w?dn$_kvzL`&9* zX0xJOZ0!FG9umE6gGJFUDx|GM{xKXs&e%sm;Ei=lCq)iv53ywAUw-kDA7JQj$dY$B z@bn%YHo<uR#KbVavt0+=M6~&D=7yQXm+ZU3CG>YG?v5yP<tA@g!arX3^7>;u>Z?3D z^StX<b>~d1GXo3N`gJ=#vC}v@@NC~^6J}oP8GTisnBo+RG4y$%B#9pdwBw(Ds+aib z@j9!e?Sa6z-JjtW!sZcLn<%zr|MD`hw?-|Y+vh{~hEt@9kBN7Os;D4<>w6i)CEaa9 zUkcr0Z3S#e1-dKv#r_C&VNY*QA;0>`Le$h;7d*y^8UcdPTcN8e@S;sZdv}<w8TxF8 zm=9d)L`vPtQTjc9OHCMC=JKayiC=X;$SnfM2hiy65;JxC`n%RsN#*g+KuTVpZ&d22 zKDIn0M@N>eb`2^!>K}AG+pUrFz$mYwJ%Qf$$=LAZxK6&#_T>AXXms$2J#TZC9X#jo znS)OY!k>r`mnR}AkMJ<>*fL+{pB6jhdCLRLVM;GOzDBQlJpb8pOdRgh^wu9Hnm$Dx z4*r}%um7`)lD?v+B{{1NL}1i!W}gcur@@ojW(meL?$J!MZ7N=%PY_-_JfTKg<&3ox zSExj2X*}0&SFc4GcHS`4+E-w+vxi&lF8mQ_U$EfG8di)hHqxg+O@a=Yhz=o1y3{~k zpeS_t0|iw}Gq?;SptHTh;|pRg>n+=%GER>(*|l{$-C|zI%udfP`OYp$G=*bj>U6`W z)8gEcLy-kvL($H&o(ZdgvP7n0v;-#7krlG)gDN>#ODl>VPu-3sWLC>?_)!_W#T2vD zwu*X6x03c34G3(MBUVdycik8AAXl=!d}^Hv6|3c{D5(n1ZZcdBMy#+G<;~NE+mn)6 zRN1y_N~o)#_Ov$mp~4=Y412WQR0|6GuHW;c|D{+hrwDF5k=3HmK;dPnN!9i{+Ilm9 zd{~tmR1;R?CfQtSfpYN<DFU#>?!3&Mv(TKRcJ@un%w!)>d0<TC5atKxT%x#(+u9=H zEoanw6iYe@rTRrl&G%}btxPKWd21i>diV2h#5&jRaDuzb2E&BC36bR!b;`J{Wi;Q; zbNu@OIeJ&hy~2thU44R1^DhaDOfEF)w0&VT@p>nRE;;bc!jE=>WCJc8w|K0$#n>c9 zf<JVfmTq-=;`9{N=1dzBCR4CBAU2i-ouWjYk%#Ck$(y+?MXU+m22!#|r_E*^tw(9W zL!e}_I!aJ9m(KEA4{eRC30>zH)^<>hapVg|M?ni=q1mwU&cY6Xg_D?JOi1B#hsL6O zwyos1o|$g|%oCT{1erq1Iv#sJ(s(PTvh+jd5b($T3z=snR#hnD`4nQK^E|hh=_K|f zpF*P~Y9&sMMv8HoVbW<Yxf%m$r4J&)YR&zv+40dA?6ciFI7eW=-gf3^H)11<T3cre zkKb-W22WH)eV0xE&p_D}V9ti<!~bzASfIvpQQtGwu$r^q2H|BxvYRSctpAv<^gQP` zmR^1l-*fmd!P2QMb>j5q%|K!2t_Rk#hkLM)<c;LHCx5^8A$-L?!|V@{ee*9N+Pc9{ z>ja^{o5^>o2NpsSDSK$Kb4O1{b$6HExxoH8WSj5}E#8Xr1jXLm?=6qjQU3k%G_ww$ z2ke;_5(Od-)f_fl?q%=;iABauCO1b!)ls5NsJJe-%_0!OlWIiqBjcnu^r{~ILf~j9 zvwOO3AuL`Q3ynMM5LkEtTale1K8XbahC@`)tN~dNcKW~Ys9#6(^pS_7!osJN%3O28 zoAl3!?|1k)d42*GQeef6xFUQrD!G_5lVSc;3?VDH`xNFNkHRiJW{np_3i+Pcg0nxu z$v5zVR#Xklz0i4`c4_I*SKzP7qfINyf&!9mqfoFg40L#gJ1R6>0uu)CQ%Y=q=WJ(? z3VBh`JB2v2AQ0vz?ddw+%|Ri4fq~_LP*9&w#jS3tSbOODaUBNGQ;@-9(M`hj*o|)J zQ)%H)hR-Wkr6NzN@A&r`GA9LG32^eKAVUX;Y9Y03s9Fpc6AF~-sNY&~O!U}#{@ZD= zyVhHFhfW3(oRc)6Z=lZl#w)|FJiSE7uaUJ2MYwQAkIoKLC>)hAw|np-h5}XV1;iRy z@W1FKfP-F?{W`$~4I;XAcF-gByvaJ%JOgHXdCAWK9UFM-_AZB3sa2_#{z_8X?d$QM z3(=<In5S}&she8luZu*kjw&SYr{+s#`9`L70uba<Dj8~RzFvrhWYmLVcVWkPf1&mC zARy-C-b|j2WMI4x0ouCWBOXNQuG<K}l&n1*atAYxM*1Db<O53>NlyuQf=HM8Y#|ie z12)d@h7=~*O6#*4u$JIkIxc&DcY``TN5D+r5|0h51-2fji}&{(O-Gw5e-7={nWRnj z+JQyzNG{OzI_mjQ@HlXf9^}a#qJ~QJTrNF0*v5j;1cvQ-fZz!1Ej+^M%EBVE_0DXt z03$FlzoljUBz&Pilo1L167q<Bea7+>kk~aH6}lN)QfHJel-_F`deX&wr<cEPaJ9D@ z=R=1;Zw4zUu`@CV4<oy@>GuVP1O;F%K(0gx4b~!zQP_kCtVSG>nA|Q!7aSY>OCjJZ ziU<WSyg4JPs4DY`JETeywEq5&`Y@E%5-?Gylc@lunkGU)s97OYjI<C!!>uU^hOYJn zyyJ+@4;?;(fze&Vgk<{&35%WMqP5=)3lo+?*l^hwK0~?NAUv2c0pUf+Ef7BRc@Vh$ zO86mpDt$5z*bn}a*H$J@cvBLQn1M9Z)O8@&2|;UxF&!)MF(<hH-gu&k5!*Oko~&pA zpOd4*1c7~_rK0xa;mpaA%Xep6LtQg+ZT*o$XBWGB4khoSe7h^>?2x$+TUvr29|EL* zFf{qrGn$`{@i)^<Xbz)^RbziORE1L(xDc|(G{!2_;2AbnCLF2zOITX|OJrfufABz6 zRf_33tOn#;F!MPT2wysc=4k^#k;|m9H!^b*tO0BLk=Zw23U6EEK+JS&+<Pm9(z2eT zu3kDmE1KVRWBf3ac+GAqj(P6M#5`r*7&$R=!Jy=c?xY(pwJcouVzi>EM3JM@hx}k} zJA2m+7(W*#5t*s`1&nfsp>^l4&*zM6GFWzo-=R4p_C`Y!u?o2fB<J9s3=u_fSmv|s zPA+dE>2_^>RahNOur2QH65QQ`1b26b-~^Z8vT=6_?(P~qI0R>-!5xBZ++m}a{O6pv z+uuCQOV`ZTUDK;pRj+9;gptAD&)*a+pg8d9Y}=pYY^0eBy}s7{qU&5*;}EAt&Hh2> z*K4&+5iy_2T-xS8jgMUR&HEWc2;DgXeq?`hO;eJV129HQlRRYlXk)aJrPok!EHc3+ zRad$Z`K#tl4@)T6HuRu#7S?QX>`#XpadH@4w(8{gw@5Ijy!4|ft3viD?D+8S=`IaN zTD2hhv}3<;Xu12Q+1#D0S5*IrTfl5KB*r)PAc3_U_toDlDNe2#<hYe`5!@vTtDnnr zm47)PE-v2AO_LACa!ygtPjXIEPSi}zA1`#OZ27-l5VJeaY*R=?pptQ5olhTeFptC& zi%?Lz6>XUQec!;meJ6~U1oM4CC9`169Xq%NpmzEw8Rtirx|Hfy^Jdk0l&_tjhZkR2 z2xPORRo{K<TqBDwzX{taTFZS;KAgz^u_Yqh3)Qd6hjrIyfSWwH=ti48fgg?Mlf1et z-L!D-<}2#eI5_LYnG5WPjXL--*{BqFGX3VvjbK;sKAp}~`N^o}=I#yfe!1f?e)hU| z!-RnnMm4J|C>BM>feYT_O-vW+P_JDe25NWCpWVU#XX^XYpjqbO>$DCMQav7Sddkz| z^c}I~{wKNZhhZXKAp@mFho+4jx^^;%>ty~@v!N_h1CLXF=aNHn{z}&iqKLhfV<vGj zzo))bV$WaIG!*PGNa>zaREZVwIPszVyO*JqGcmu(H7d9TLdMKo+odqCo(}=o(Z8`O z73=8rX^%^6ngzQ1tvL;%)&9KtKLO9adGdXAJSWXFf*`+FKSaQRJEShMXYJ8_6=sN^ zbE(B)j5F$@pp5}C^m}cAjfQ$eWlx(gB^iG(r7%)<&nP>w!%;Lf-=)c`tV_b^(Y@)S zoT@#hp_M$PO?#qaJVW%oM5d*6WnQi#ZC=0Kr?PAZ2nOj6ie!qH&Jrr(We@IO!HOs8 zQl^gK$`7dc`e1?8X~qn=jD*Jsf;vPmDbw3gWZFU|I)a%xqN_X5mYl!Vwdk3#i7w$a z`0<#pIb8r(?a^)t=?RDuOT*c?4w!X+ngPREzTCHd-yV(P!mnFzcj|J^YrWY8MzD#z zLA4@9lJ^tiL7_n+!lH7a>+*TQNK#wK(N|a>5oG8t^R?fs-?{oAQ!Dh-kyEdB0XG0< zSnAtC3|h1FK5(UqdO!C^Q_r&5>j##~>~N+HqSP(NwJJ1AeT01hbE5q?CJ#c^INS-# z6{G)IoYP1Hw{{_=eptRS=pw}L(S;JHT=;G4{AlF4V3+ZZcX5$wXE=c8nB<P74m`J; zty1bl%QXSOpZ_T}NHB_>`3tv=Ld1!ZVDh_yV{gQJ8;9KC%McgxrDF0lZ^BPe#hyS| z@0iAX_-nr{8fN=X6YXA)+6V}>SZ9<0$%*;~{vAz@A+dmY%wW{UJWgv8=-(y<&f5ba z2@n*!9*zGER9|UjnT~n&xO%y-wjR&q9JR5(hpO3j7?VCl5Bm-!N^eV1ZsV?MK_ZU4 z6}vNnECGEm{5~b6135Z9h}(@0`$Q4_uaV%`-YiF)u?u`$N^Fi9gL<i4I){I`<k<Ry z<9HfXx_q7{j-H%RF=T1I!h}{uj%cbaxWEJnPc|aZ5Dpp@x>_~KjK0hTL6Lyl7E-I? zH;&a$Y<2b>uRoPbag;EM-s;;GsSfjX5_FlY8~QCaONAQYh)wJ}mco%<DK<03mEhe) z5!1=P*<1-wLn#UI_*%`@h)hWuEJjC2kcC=BzQWBVZX4E|*QAWPdJaHJGX0p{(P3@s z;@_HANMw9`vMDp0B!bh9_k5?QUw5~s@>;vD`qR@yo~NRCf;JV_4^b#mNY|xdUgzeD zqA1e%cI6<T{@_l;T89uE{I0@$w=H!}O5;LVH{yTSPC-EA#HpBxCt{OCBt_q-vbp%! z`q?K_a!T!ZvR6Hbx1<*EX6jE(+7Z*>AB&9NSQwFgQSof-S6iD!ofgOk3^&JsoH^RI zpu`K&B4mIq1!q~e{0!W^H5mw2%8bl}*vI~vIo9}>)dHxmHrv~ZxbTNq8lCFMTygK` zH}Wy+j*`TbWO;Ro)xuliwV3d72Y8axk{BGH<V9BPnw192kvwRb&a)j0HY?UM8>jK8 zwS{wKk6=RHb3w1`|M@~d%JnR#woIZXX9821-W`0WkxHNK>O;h(nD=M4orIUmMQg8M zn&m2XM>&<Gi>OdjSwn(7f+y1?8`lL+c%MzwJ?Zp%o^4KBs*=V_?>l1y5pFG%ZCSrY z;8}g!Zk(SRpjNW6QTGOF0mBxK9{&z9YPz8+5PgcrTT!HO#Zn+~a$w|k%4I&K5kbhs z-ls!oa$|35Hxrt32&BbQCzh(kYh=N_%X3*%V9)<8ELTx$0WnoTF?fj}9eY2N@g3Xm zj7{=KS)x~cS)SBqt2fTqXN4Y(a?nVVruKvDwcpC-!`0Lc(9xZ^{L98!;r{s@1U~xK ze_ql|I@3F5-?(}je;h0gIU)mc_QojTM<|g-R{tKm>xIY7)z;AbQ=8tw{_K?GQ*O>z z!wm>g3<9XIeoR>$qL85-L`kenahlK~>3qbN<xi{$Y#9Hoy61mvi4yP$>*llc6}3sH ziIhiegENU&ti@Rjd2jB1NC?)uvsPrAVO*f#XntLXS%@x(Z<{Npl)!e(%Jt4F#Lbvm zSvzgd%f6Xh_T^saBc!@hr9%8OG{QyNP%dC}Lm1u8!Vf}jd@CQEG@9(mnOHCnzg4*+ zO(O;8qd68-lfq{s2EVvP#?dWG0+SMi&yGgO4cw7bLf!H_c!Z2zc?|b>a{rbr0Uipc z=Ii3Rl>y!eXvrS*9<?OFAtk!`z0SN|61;#%s`b&h&E>c)n3YPWH+q>3-ov+q?}`l? z_=jm%$_!h{!PuL}QORAmi;l0Kl|5W!9dN_ci+c`jszQOD76pY7pL2)qT1-Gbx3GiF zu@NHk(+vOL#rkI3<_p^<;PHBoO|*c#U%Zckys*I3WM>-_BPo%lu%M{W+{DauZ+llR zEm%cVR#H)1URs$#E6a^Ah0}5@jq0kU0s#9533t}Zacmq_wNn00netNx6bp<L=y%^H z)c}L`KtC1vf(4Eyw=RmCICxu3y)~)5>hcm1p>QFRr!A7)CL~CSx+E*)M;Qr&$Hs+O z!`{zhw*yWL_Z?g#c9!&o0*0j(BGUdyHS=L5@+|H!i`7^?3)cg+{{(|9y3L_sapr{o z>r|8<;9<AukeKwYS#s9v;MDuIiSqh9`{Ezm3InhVlXSC#bs*~wCp^zchZ2nn&y?Gi zc;!b_jZ(S1wI*do2d~_E44ohl`VpdcVB}^|Ca!|%$D*r1;WjJrCtxvxA-Sx5DZPbB z!)gKLo1c!)-;LTj9e1gqMUQ&n=*z6b*X#<s#8NDz7TgA#?MLoj$YZ<MI=Gpb#{)?F zmYQ>)XbM#))pmC^w6q^!12JL?2$U0X@R!8B|MgMin5K8X0gH_W>m`;{-W1i$eHKsm zK*&9?+$UxGq^P4qk)|s#YaSycNQtFA>%QC^eGvY!HDvJLQ+BC=tGSN#A_NEj7k#;_ zIktAbLLMAz^zHjViy}y?qR`1kf76Y}mz2}iRN_^f@GzW4AD~yBV`dw#a$Kz=8@4f8 zjO%TRMUUy*myB3ozwoW)YsgBm*jg-V0lB~nvoHcbe`BF6pURVA$Ctu3@D^C>UJfm9 z$nRfSour`tH^aw*ln7&tYl8bjbADda^p$vV+71}u*ot_S*YxxeRe^GK=f_cnv-YSJ z>E;lFh_o@9uk2a#OkJiWcisJa;;p*g1|uxQSc13fd1gM$!H~v%gIK7jLN!aNYc-YU zawm@GRodZb&_8HdP|J^eiaGDl0mgP!sQ`wY4EczA@AXC81-{G&B$X3zj}Xhsj(~Rv z(+$^XUOFAPrza-LP7WI$UWN{?4)ozW6*q)pvbI3d72Zs37M2wjL;9%8n<;pRkH(KI zxnda7XMmk!)Ey)?R`>TlqZl1cO3FPa#EoV3-m5XvQ)KrIkV~scC=z#8iP1o8ht4NL z3P7Gt$cE2}_HZ%ZgKYbA^@#u!L;;1u*#J4WH{32vC~agS5}X(WGjDt~sKG#&7wx8L z-VfWU6p$RX%BciPju8BD@iSFP^c<C=4mbyoQQAFem@}b!>dFJ!UM`)sT*_7k@Z;vX z3bQ;jJLL^yC)FjaREuwaXlWYHHXQIHKe@T9+E)xd#H$xu`3-f4s=EFhbyWRM@z3!1 zhmKFHa?zf|c$SW4TOV`VUTUwo#<gth<>d!wmZPFLRq^orbk$nXIQKxN8Vm=y6?Bfj zhS0AJniEsvN)1a+%>^bRC3C}!wAgVidaVi@C7w|NMr~pA210ZJ+S;tCg)gGru!z5X zlZk@*U+t{<9NwJzhVP+n6jkb7XK4y_-vGk0$G`i`{VT2GG*mLzEAFrC>>kn-O!wOc z*0+?rGA+R|3`$g)QB&>NP8Zsh7u~lSzXk(aEKTz0r*>L8=C`^I&0g5!OSSa%_nlA2 zsb1#lT#9`Bkbh;RVqqwAs1>@omHqszejPejis<+G7$Aj##fij7<eoSCFxnCu%vz7v zuHM?U9dvZ~g9T-f9YsdZ2CrIyiSKXqtLhX)X2?JcS?rO+!v0}D*v3k0E`Mrx^UZet zkvGqS<VbJs;j4r-jx`^g^MSU16vUtGjfl@czuv%2Uy)uL3n!R?+f_mdBu;BL{W8ym zhmaMQtX^15D>S)ERDR3@G%XtklByE7I+eqD$i=-zx_Xt7jxcjiL7mJCg!|`_`0f+F zt-qAwsx>h(7<|7fg91S)9aiGfVp7GdOtv{$!Z)Hu)4*nd+{1(g&`ZM>|FjRwha30s zOiO-x%*=XD-LDb}D>zv|igo64>Fx2PP)#|8{wqkDo~j}!P5)|XWDtefukMYPqFLKo zcXGThL$f~ls{2&V1EqlN{|S7lrsl`=C2~5kvPHs^p_ALkh5b8-(LGvTB`PiFr(2=@ zOsOW-ar%*>s!Wb`5tZ)EYA{wh6v-vBy+_dDo&%A6!_SK~FQqtum<%2H1LS$XFp~=T zHVme#+*gZ~tjeEN@=4f=yRwWj?5=+anUU1FHR7A8=}Px(x`|Cg%Ig~n#4Vvra#VNL z5>=CHX5FyplsGkpLUU{gJPuhtk@1o`S340;x9DU@t;`l?eUyt-Ey$z`8!@p2O3Y{l z`09KjTn+IHn<6SM(I=g2=z4H?w0pmy_ZwZ9A>zT}*bzjdydq@yRnzfwqw!2s8uJS6 zrU-0L-6J9hBVyu6sK%P8sn5@aM9ERL0p#SVAcLM2ct4S9+@4h0m0i4X6u*pr{EVp8 zf8Ac8t-$eu_Y`5Pfj@12cj&#R&-xAswIHsQVI>n0(Y5~W>;$i&c9yBF9p2VZU$j9F zR_7zQx^|wQN5&?pk))8_l{)=;JkoE`MB|>f6=k$%h%2;C3!g3G<-4Y5lqwrq5Z&Vb zf{$qmly0!xA@2RCJ_Z=(R!rkiEXAccy^nMm7bVbFM7VP=0l1-RUh#l`?o^e(vACrD z<vISr@LC6I8FM{r`ZDTKoG&!1D{x-oRKcI<<sBL)<GV~S9_E}|-IKZW$0Ee`Lnq4_ zzF-ncXj1}~gE)$|f6z9_J+ID9o;-Xx)fd(VvGS6}`tiCD3%BcM{#cvK;qi<x`%SWV z{(C|pRHseY-@fYb?DcnkC*dq+V7+TW-00wMWS}2V8Op^?)*Vse57W%gBwKgqkX<fJ zMtg_+bCLJxn>U71qUapcqT>2rXRi@YgvmcVjXx4f==<lM7FKr~<_OVJ&0x=i{+RTU zBu~u-FF0kCFiQqg1`~$BW*=SVRHg-eAwWWXEP4%OB)eqPEtR&w<<uC%)}OdpN}_6T zWuia@jzB`1n#IW4)w@KrsL<!GR`y`WFl7<6Fk)jPrKVcwR>3gGwhNqlGb<1&1Ok<= z&M}7ktu%SZ?0I`frfq^kclX{X%LEz>g>|mTaqDU1cdm*p&3N)O_{qqPXDnAFrc7+B zS_9H*yew?>^0)*Rl2uZb-jn9?@ksV^ECoxX`Yd4*{f?2>nK8%!P9(_5qB%?8onfw) zb>`H)U=T3ABOqC~S+}A&JoD}N#zXA@@!We_m$zMxo-zfo(y(&z`2CRqnQuRpv7-xs zW4d%j`wk6AIP7BXEz}1_<@f_9&fHYh_-uE79w>hKZXw+T<79arf7WNZr|!{u*-?}2 zFt;RPjXTAIl*mhU*o^6+Cn9pt(k0>!vzV8`oMd*=rdWa&V^n>kO4jsoy1HgWt>>wX z1aHdgclxo(@PtSn(r!i-pI#C{xL1#_<$k<4spk}H<*&R9-YHImk&1IayG)847~RQY zN|d~EjxVbt<hlgWZU#W6Ddu(~U~=0G&rKD6=$S)HrtR0Vm=e#}wvg_(;*Bs5Vu5oT zpZV9}>sQ+A49gQhcGW72!RHPC8IYSmu5!7?4rqrje(!Ozsd1VMF8Sd*X7g_MY3Vie zXpLS6bhWt%#D<Z{<HAnXiJV=eSVmEc3$?CaY-E*h>?Kiu-v9-7Q|3}EZq#@z@Oimr zY9?0dn*n0IvxdQUA~D~AR6bM)3W7ofr8Pc;|89gR*+VlzPYu9@;t~mE)yxU^W0Wj{ z+`g1q3CQJIn5{2RJ@SsPC!J^4Hkj{E>@}?P9?oJ^5TPbxyg2AwM8DF_@7Wm1V8k$B z`U#^s{^7`=3l=3UMQ5^;&F>C3@*an;$IYAg$3+tOVJZ^bA00zk-OnVq$t68_wl-8K zg;(R6(IZ}yR7;-6P0hHz$NV^WM$~5F^;`#~Tdp&qpq9LOyHfr`Y))+c%qU2TXUVre zdX5TCgRD~<n~^W0d(TQ=^LB0ig{WVT1)};eJ|bSuYx0k{+=G29jvY%hiBLBTyE+>b z%RQVVd;Wu}z!FW2PskU$#`;@{K2xsjuIp&rIN^{sQwZOk8kXD$dFD-DM*G0<Pi0nG zPa}(5OAL@Ad(;S&&lZ}^&TW``qFyz`eMqBcJG%rKEGR~}IfSZ~=6d_+*zeJP?Xs%6 zUpEpjIbKpdQqbHbwiduFUsXpWSwIDH%VkU4Ear8%x8l;`^WiEu=?4#2qh)`QdXn|X z6S6s>Cc4<l^#bQAgmAV(dh?`JRLE!Ny`%=KK+7bGVYR!XU?p8&J$t@M<k4M}#uxmu zriaPzh3gw&X%Spo+$6QRj(;60Xe&wvIduHJ-!q<2$d|_45{#E|Bmwo97)z7Q6#!p3 zHDLwV$@pTVonL^H<_M{2N~~jRo+@?q+mU1YEH%Ijv(PmrO1yJ5j^|MGa<JA4MIvEb zlKXI_gtHI;4mXi<Tc4`}g?6=Sr1f$6#$J=GO`wfc-%~$1sL_hcJiPZZz71G_Lf;c- zfG%j7%yTP8w%eEB$KXs>WO^??`gi<bHMlzFX0in%(^2hVf9Ip}!%gcFELe@#DvL)! zpUM+9G3<biJJY&t#^C_hT7pN`W-bGdS^hWz%-+Saad=5!e@(EX;ZH@24=K37lr&~t zmbDQOXwFk2AiGQJeFeX#B7gT|$7BjV?_m6^ljpmBjND6k)KM+&?+EF=)Mz9433SZ~ zo)BYQ=Ky^xRMdM*a8n7=;77zGq#e7fY4`1ZYK;&Eug8W>#ws`6<?R>-P#}wnb_DA7 z?$a#RC{^lvPeB}Z7NPEKfBv?o_qK|#`{T>62h@uV4^hk2DXtAXp)d_~ika4NeD!TE zG7db`Tc!B90%=RZ=}!sY!3M(df2L>9<6-yKPJFWt(QCsWaUpx326PO2&Tp_I>e~Su zht;ILl-oLaU@Z#c2XMk#*5Otie$aJwiWtasIS&hILGt@*mHk5>34rcu?ZhDeMFM14 z&BqTD-}^O#Kgi2FH(dkPW<h+z!a~Z{EnS0&O}jh*R*J^*j)>d#_<*i0m+*zFW8lhN z8GNR2JaNT~+IV7@x{D{hgfDVMIGQ%h<S-fCXD1u%m$}1%LW=goae~O42#ZI|FVHKv z0y<eNh8c<bq8IufEBL==)E+_lX$DeE6q(B9b~_MFz&R+8)Mus-R@qqs9V+jdc+$t` z{hs%Zmbd_B7P7FvPZcE|OP>njGE0_L=4%1O0B)d}x;PVrw2-<ohE{MT$|xMYn473I zJ3CHDap)ofL>F!Hm>NEPpffCV$_!E<<T$k5HQF_dy2YR&g7gtR^x&4A)qM>?HGWl5 z*zwD*mP9`mZhIuncL?{4xIcDAmy1dEo;v4hhMgnVUagHJhGn<jk3IEtz_9JXuuHZC z2OoQcXRzk$hFEt$|HXwRa<07;lkjxO4FPfIw>=Z#w71O)o!^&#|8(J+#YsiB!38q? z@@`JR^{qFfawaC1A{<q^8#*ZzB$P)%xftj`hkS}ag9vp*{N%Y!CX7Pp=N_)oL%=Kh zSmZ?enKcY;SjM7kPhGTUAgEwrT7IV|ZN1dui@CH`EMbR@V?4PqaF_;1XbLu;UkxF3 zanyA>@^cYLFU(!ND!lEq8)CeRHY<B*Cf?x2-5&&2dmWX5bBo6uCZb<I8Vw1~4y$Gm zZrIg^1|zXmMI1@-Gn%IU4VMRqo{?J4*MDWA$17C|&Wd!?w%(KvsaI{k{gh$WcT74c zytn8dT)qUWR}^9PgS0*)p=CM0OijJ6i3U~4Vby{eYahn#*L?TaTo+9zU$N*a&wlcd zJvRxWis?<7K!Gk^a?pXJq>n@=6e#RarkuBnX?tq6#cz`H%gN#qGRfzdW)!6_BS?jH z*a@P?<4$!{e~X^3<0<TfyNlGQ$jyj>ssL;J1W~V0f7q|bO`AZ`5Xayk@0&z3>PYKA zuQV*<l?9y9)C;{0dj}RbFoKK>A%QZxUdg!CKN|nf0sawZy<ZP-9~p!hHM*L(gar84 z!SRIQ8;(L$4rC;}by&5@EAV5YlyB_lWj_PFh@C@Dq)%wIIZj7^If84uWhz?#<Jnje zY8Ds8-UI8b5A_x!{-TZW`S;T|+@yq@VfcAA{Lm3={}#e(ep;0Y!(?kS9!%uD6sa>| zBfZa_c*^E(iQMU>sXQQ#=>4x4PEyf{|CjTSTBhPYWmtPW4*X>$my09gr4X{}e=!-e zpKwd&fT(9vtlgZX!>)q-IUc=)3U3#kk~tI>6EDq)A}Fi@T6bn#`b7+$_-bjzdKbrR zAi^_X)|4b|cng8kS-`76Z{{?x0U8q>hHl_kr_}Se$S(!5%L<;wHWK&IOFcml8%3<E zsJ;p~No?>))x4s(+X~zx|9Jj0F@LxGBqo%u<U5IoK<KAqca#%hQjX|5p`jX)<;(j$ z4dATj3v-8{ZU86$eAUijKnFv11E~C$RT2wh_bzbAuW?>Z;9asId5ucgSQ>$7(GYMM z@uoPzM|UXDw0`TNsFdoD!}OQSwsG(rn)St~qJoQ9J5{7Qjh5`!CrDm$-FtW3vZ7cP zvmCBWr4@3&sa!XczI_xQ8ECUUs~C-hQkO471j7IXD$BGehArh>15UR1o0p5u*ug%- z^+cak?+W2Ue?tytk>j3=?e8~qFZ_R<FEX2YA0wrJqbMl2nZ{T5b6>cFDoJS;JWqM` ziCEu7(cNLRe|%AuNl^m9Ayrv!fX)gC+G_e1^rm|)Gm{yz^{-dzFops&OJs}HZ6Ki$ z%-jU6<x?@~n<Ld!380XnU;|6^6e2TfwSZ?CJzF{8SOty=G?Do&WU3imMm7RUc%ETX z7E{?=3z904${Sl8#em&)Mz*e8&Xj;S=r1lw`<2bhfLr1kYT-Ua(1rM#WB@Iy9ZRX( z2KQ&rI>l12=q3M2pfJ@>Lr{iaes+Mg1(<2I!qL}Jy|Uj$F;k4waH@c)opi)k8%2<^ zK@|fAPjZ<=Kj$6E6=nE>{h;tnXN4c!y7#UXBWp=YEoOK~nz>#-)&FwWDT%Ng#s|}h zU|eW-&9-Fa7CcQGaq<m~!ye)?-vR^9st;<j?$8zZ5*{%1w>T3TTqQCM{XWSc<5-nS zWzF$MKWciH(2L!|_iNhjsL)T7=XvF6Wh3LUH*z&mzMEnXcWyD|I}Lp7lPkXN_xvtx zz%>g}QPGyAc-!CUc3N-OFUdM{1+>d%sUpuqZ6b5F1x&aa{PSBtr((w%j2+=uZRtaV z?DuN|hs$#6*Dh*mKav0~7=oxrOOCqRXp5kS({!fpRfS?c(@BoJXMy)aMQYZ#Vxt>` zYQ*!yhex2WMr3~!Zr(Izxi=8)2`x;#P?a9%SeqUP$({bzz^B3^p*}&!k}uqjUV@Cn z_50VRAQ9%}C4DAaN`ssdu6|03vx7D@ysXUnjmJ*|fZ{yk9=^LveWsf;Hh@mm;Ldnx z@uS;ZwbA3S$5QUb8;xgJjW#%K`9<8Sg7rhp8@Q-<d3YAa%l0T#4)xfw(GyZzJUfZP zHgac1dh#m-R~zm6z1f((Csf@v7zg^gVQPZ8hJNrRcZ;c-WsSR&`ZeIuF^4ledZ>c1 zq6hH8!rGQ@W!DPZ8@qy?W7yLLd9s=V31T>{l78qVO}}2N>LATgfS)d%Cfm?Lw~W+r z<C!pSPfDS^*qdidGbcL7=~UXNF$fh#TGzQc#ONx7mT)2BH0S1epdZX^4IHm7t4$0_ zV&l8jGBS8QWLvOvZ-^hrrvyI!v{Qb!x|s9*ob2-b;*84CS)ywQ?p+RWWc@9TD_?x) z37Mpgk?o5cbo4>n@i%J+q7-vz#-2IVpS%zQZg5kYzdrwhJ2+P?mC<;zhbX$-pF9SP zhMGf^CX{80qpNdqa;BGNl0XET!6@t_wQ%bBK%|XBYYMB)r(-gw(tXg8eVUBp+rS7L zrR@EdQ6~4UEvq&Jf02W!!^1z9TrJ;Dx*S<;g2<`@79Id1eGw*Fe{|8zApH@N;+cpv zCe@jWsq8@}O+{_*)@HOcdV#)qydvXa<VPQ3Kch*ze%=>e<`?J?l{d((YwBB|g%Ew| zrfdm<kqvt0@^TFL&h7Mt@&=iZi@!Gm1GKg^lmXx`5@-QKVgzFfjQ9OZJ8B6dfSy8X zYbzN!e%L6-VG^KPMS9F`dlqxb2C{-ulrh6fQy75gqL;88@2SH8(h5?s<x-XD^7q!{ z<A=}R+TPpnJ=|4&D9(AW^Es|bNWGqM%Rr`*odbQXHS9hU;VBv~<kYP+Y5NKbwc%`7 zKFTch{{v+xbQ#R*3wQlP>2~Uy!v4PeKXNPcZA4AaPESe}x}z4emXCOX96y^7*-ld} z9)GCP#aTtI=tMq15bj@+xkJn9GAp${BlM#t8k`)R6`uB?B!LOX_>q{LBqP_t0Rh*K z;HO}aO1P&Yt@<?vv`|+K{n;Q57;o8R<=u*_l2L*rGgE;og2V|re9fE|kQCG7rcESM z<71SVm*dI#^1q|Q`X8k%M)~h;_q!p(q;!raGfg5ct>TX&Aqd13KMEvba!L{k<(oP% zcvs976*ktOKfY2X2potEs4QPs0`*%I>b(sb_yHIzQJx*K5=6Mg*WQt~pRZ9^_`&Eb zV^N-A6Jr7NqB-@uqK!FH%p-cFKG$}*S@n&l)_^*J5#y@+Ov5UR!Qd}n+<$*T>WjDt z$WJP(Mje0+Qe{Zgp*&{YUPm2N(1wHHyK!LUWk-YF<Ar_!Uv%1E0iP)jz+|XAqiP!4 zE`~y>6AtvBmTv9?WSUs)On^Ocf^>#jzV61AhXAak-OykfPDI-DQbxh|0;d<S$s=M$ zWkII>XoB6hW+HDQhqc}EPp^3y!6wAkKB>KHPk%$KLXgipK0yJS#>(8E?YI|SXJex4 zn~QyM!fmc<cUIn>7%)N2NU`B@ykyW0$*_>f8>S*IEJ(hmf3*rZ-A-+U%qNFWp#4~y zo+gNAL7bV}b2GV1BRqK_o4ZTF;MDT(w0=^5?x*(JkXb0X{SP_@AaIFQ!9S4juOq37 z#Tf%2ic)FDia6IDUJj7#P^c|i42ShM33cBdl~R#kY)KV%njrD#%0?ZmnA4gW6V|i% zdU9%xL(snBTTf-Oy>}EI7Wd)HYKUs1i6OK&?TqP!Z+j}lt$rN4Ak?=JeSmUm`1(l) za9)VZmLTD>-94@9q=1&ETDUTQ4;mXfWvCqsW_xRwIkHpf@3&v$*=sN#5r%gt16scB z_v`NtTuqf{5&#-hUK2<$#!s_XwyfT>{CJ-?-UC*;dcxMg3!G#kB$@?VfIohG=r=fY zlmc8maP8%;>^t6DE>o<<57;PM76}b0{ei=TewLd=Z?gh)P+AA4H5>`uMc#Iq$sVZo z^jDp5+Fimu<eoPh3E>gF-5t^t8t)Nzg@|rjC3gW(*_~%obdPM;7k7V7%^mq9EiQ}8 z-j}3{kdWTo0qw9)<?(g?QIteHHX9cU*|5E}@Z_eHS-;72!in&FUJtiSr||2A8@QVw IKiJU!1B3_vwEzGB diff --git a/app/fonts/Inter-SemiBold.woff2 b/app/fonts/Inter-SemiBold.woff2 deleted file mode 100644 index 95c48b184ea96eeeba1eb03904abf1c587f848b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111588 zcmV)gK%~ESPew8T0RR910kh-)4FCWD1pG7r0keky1ONa400000000000000000000 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 diff --git a/app/fonts/index.ts b/app/fonts/index.ts deleted file mode 100644 index 56690006c..000000000 --- a/app/fonts/index.ts +++ /dev/null @@ -1,74 +0,0 @@ -import localFont from "next/font/local"; - -export const aeonik = localFont({ - src: [ - { - path: "./Aeonik-Bold.woff2", - weight: "bold", - style: "normal", - }, - { - path: "./Aeonik-Bold.woff", - weight: "bold", - style: "normal", - }, - ], - display: "optional", - variable: "--font-aeonik", -}); - -export const aeonikFono = localFont({ - src: [ - { - path: "./AeonikFono-Regular.woff2", - weight: "normal", - style: "normal", - }, - { - path: "./AeonikFono-Regular.woff", - weight: "normal", - style: "normal", - }, - ], - display: "optional", - variable: "--font-aeonikFono", -}); - -export const aeonikMono = localFont({ - src: [ - { - path: "./AeonikMono-Regular.woff2", - weight: "normal", - style: "normal", - }, - { - path: "./AeonikMono-Regular.woff", - weight: "normal", - style: "normal", - }, - ], - display: "swap", - variable: "--font-aeonikMono", -}); - -export const inter = localFont({ - src: [ - { - path: "./Inter-Regular.woff2", - weight: "normal", - style: "normal", - }, - { - path: "./Inter-Medium.woff2", - weight: "500", - style: "normal", - }, - { - path: "./Inter-SemiBold.woff2", - weight: "600", - style: "normal", - }, - ], - display: "swap", - variable: "--font-inter", -}); diff --git a/app/global.css b/app/global.css index 64465e9a8..8a0c6a508 100644 --- a/app/global.css +++ b/app/global.css @@ -1,586 +1,283 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +@import 'tailwindcss'; +@import 'fumadocs-ui/css/neutral.css'; +@import 'fumadocs-ui/css/preset.css'; +@import './theme.css'; + +@custom-variant dark (&:is(.dark *)); + + +@source '.'; +@source '../components/**/*.{ts,tsx}'; +@source '../node_modules/fumadocs-ui/dist/**/*.js'; +@source '../node_modules/fumadocs-openapi/dist/**/*.js'; + + +:root { + /* Override Fumadocs navbar */ + --fd-nav-height: 70px !important; + + --font-sans: var(--font-inter); + --font-mono: var(--font-aeonik-mono); + --font-fono: var(--font-aeonik-fono); + + --background: var(--color-neutral-50); + --foreground: var(--color-neutral-900); + --card: var(--color-neutral-100); + --card-foreground: 240 10% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 240 10% 3.9%; + --primary: var(--color-neutral-900); + --primary-foreground: 355.7 100% 97.3%; + --secondary: 40 13% 91%; + --secondary-foreground: 240 5.9% 10%; + --muted: 40 14.3% 95.9%; + --muted-foreground: #595650; + --accent: 40 13% 91%; + --accent-foreground: 240 5.9% 10%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: var(--color-neutral-200); + --input: 240 5.9% 90%; + --ring: 240 5.9% 90%; + --radius: 0.5rem; + --hiro: var(--color-orange-500); + --icon: var(--color-neutral-950); + --inverted: var(--color-neutral-900); + --code: var(--color-white); + --highlight: 40 13% 91%; + --content: 32.31 11.93% 78.63%; + --dark: 30 5.7% 7.5%; + --gradient: #59564f; + --contrast: 0 7.7% 5.1%; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --sidebar-background: 0 0% 98%; + --sidebar-foreground: 240 5.3% 26.1%; + --sidebar-primary: 240 5.9% 10%; + --sidebar-primary-foreground: 0 0% 98%; + --sidebar-accent: 240 4.8% 95.9%; + --sidebar-accent-foreground: 240 5.9% 10%; + --sidebar-border: 220 13% 91%; + --sidebar-ring: 217.2 91.2% 59.8%; + + /* Chart Colors */ + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + + /* Sidebar Colors */ + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.87 0 0); + + /* CodeHike Styling */ + --ch-0: var(--color-white); + --ch-1: #7a756b; + --ch-2: #7c7f93; /* Not used */ + --ch-3: #b5aca1; + --ch-4: #48944c; + --ch-5: #ea76cb; + --ch-6: #ff5500; + --ch-7: #bc812e; + --ch-8: #179299; + --ch-9: #3676b7; + --ch-10: #bc812e; + --ch-11: #7a756b; + --ch-12: #bc812e; + --ch-13: #04a5e5; + --ch-14: #dd7878; + --ch-15: #6c6f85; + --ch-16: #3676b7; /* highlight */ + --ch-17: #dc8a78; + --ch-18: #eff1f5; + --ch-19: #4c4f6912; + --ch-20: #04a5e540; + --ch-21: #1a85ff; + --ch-22: #7c7f934d; + --ch-23: #e6e9ef; + --ch-24: #acb0be; + --ch-25: #dce0e8; + --ch-26: #8c8fa1; + --ch-27: #ccd0da; + --ch-28: #ccd0da80; + --ch-29: #eff1f5e6; + --ch-30: #bcc0cc; + --ch-31: #6c6f85; + --ch-32: #5c5f77; + --ch-33: #acb0be; +} + +.dark { + --background: var(--color-neutral-900); + --foreground: var(--color-neutral-200); + --card: var(--color-neutral-800); + --card-foreground: 0 0% 95%; + --popover: 0 0% 9%; + --popover-foreground: 0 0% 95%; + --primary: var(--color-neutral-50); + --primary-foreground: 0 0% 98%; + --secondary: 240 3.7% 15.9%; + --secondary-foreground: 0 0% 98%; + --muted: var(--color-neutral-300); + --muted-foreground: var(--color-neutral-250); + --accent: 12 6.2% 15.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 85.7% 97.3%; + --border: var(--color-neutral-500); + --input: 240 3.7% 15.9%; + --ring: 17 6.5% 21%; + --hiro: var(--color-orange-700); + --card-hover: 15 5% 16%; + --icon: var(--color-neutral-50); + --inverted: var(--color-neutral-50); + --code: var(--color-black); + --highlight: 12 6.2% 15.9%; + --content: 40 5.33% 33.14%; + --dark: 30 5.7% 7.5%; + --gradient: #c0bdb4; + --contrast: 0 0% 100%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; + --sidebar-background: 240 5.9% 10%; + --sidebar-foreground: 240 4.8% 95.9%; + --sidebar-primary: 224.3 76.3% 48%; + --sidebar-primary-foreground: 0 0% 100%; + --sidebar-accent: 240 3.7% 15.9%; + --sidebar-accent-foreground: 240 4.8% 95.9%; + --sidebar-border: 240 3.7% 15.9%; + --sidebar-ring: 217.2 91.2% 59.8%; + + /* CodeHike Styling */ + + --ch-0: var(--color-black); + --ch-1: #8c877d; + --ch-2: #9399b2; /* Not used */ + --ch-3: #595650; + --ch-4: #c2ebc4; + --ch-5: #f5c2e7; + --ch-6: #ff5500; + --ch-7: #ff9ecf; + --ch-8: #94e2d5; + --ch-9: #b3d9ff; + --ch-10: #ff9ecf; + --ch-11: #8c877d; + --ch-12: #ff9ecf; + --ch-13: #89dceb; + --ch-14: #f2cdcd; + --ch-15: #a6adc8; + --ch-16: #8c877d; /* highlight */ + --ch-17: #f5e0dc; + --ch-18: #1e1e2e; + --ch-19: #cdd6f412; + --ch-20: #89dceb40; + --ch-21: #3794ff; + --ch-22: #9399b240; + --ch-23: #181825; + --ch-24: #585b70; + --ch-25: #11111b; + --ch-26: #7f849c; + --ch-27: #313244; + --ch-28: #31324480; + --ch-29: #1e1e2ee6; + --ch-30: #a6adc8; + --ch-31: #585b70; + --ch-32: #45475a; + --ch-33: #bac2de; +} + +@theme inline { + /* Base Colors */ + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-hiro: var(--hiro); + --color-inverted: var(--inverted); + + /* CodeHike Colors */ + --color-ch-code: var(--ch-0); + + /* Radius */ + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + + /* Sidebar Colors */ + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} @layer base { - :root { - --background: 40 14.3% 95.9%; - --foreground: 240 10% 3.9%; - --card: 40 18.7% 93.7%; - --card-foreground: 240 10% 3.9%; - --popover: 0 0% 100%; - --popover-foreground: 240 10% 3.9%; - --primary: 20 14.3% 4.1%; - --primary-foreground: 355.7 100% 97.3%; - --secondary: 40 13% 91%; - --secondary-foreground: 240 5.9% 10%; - --muted: 40 14.3% 95.9%; - --muted-foreground: #595650; - --accent: 40 13% 91%; - --accent-foreground: 240 5.9% 10%; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - --border: 32 13.8% 78.6%; - --input: 240 5.9% 90%; - --ring: 240 5.9% 90%; - --radius: 0.5rem; - --hiro: 21 100% 67.5%; - --icon: #383432; - --inverted: #141312; - --code: 0 0% 100%; - --highlight: 40 13% 91%; - --content: 32.31 11.93% 78.63%; - --dark: 30 5.7% 7.5%; - --gradient: #59564f; - --contrast: 0 7.7% 5.1%; - --chart-1: 12 76% 61%; - --chart-2: 173 58% 39%; - --chart-3: 197 37% 24%; - --chart-4: 43 74% 66%; - --chart-5: 27 87% 67%; - --sidebar-background: 0 0% 98%; - --sidebar-foreground: 240 5.3% 26.1%; - --sidebar-primary: 240 5.9% 10%; - --sidebar-primary-foreground: 0 0% 98%; - --sidebar-accent: 240 4.8% 95.9%; - --sidebar-accent-foreground: 240 5.9% 10%; - --sidebar-border: 220 13% 91%; - --sidebar-ring: 217.2 91.2% 59.8%; + * { + @apply border-border outline-ring/50; } + body { + @apply bg-background text-foreground; - .dark { - --background: 30 5.7% 7.5%; - --foreground: 0 0% 95%; - --card: 20 5.3% 11.2%; - --card-foreground: 0 0% 95%; - --popover: 0 0% 9%; - --popover-foreground: 0 0% 95%; - --primary: 0 0% 100%; - --primary-foreground: 0 0% 98%; - --secondary: 240 3.7% 15.9%; - --secondary-foreground: 0 0% 98%; - --muted: 30 5.7% 7.5%; - --muted-foreground: #8c877d; - --accent: 12 6.2% 15.9%; - --accent-foreground: 0 0% 98%; - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 85.7% 97.3%; - --border: 17 6.5% 21%; - --input: 240 3.7% 15.9%; - --ring: 17 6.5% 21%; - --hiro: 24 100% 51.4%; - --card-hover: 15 5% 16%; - --icon: #ffffff; - --inverted: #f2f0ed; - --code: 0 7.7% 5.1%; - --highlight: 12 6.2% 15.9%; - --content: 40 5.33% 33.14%; - --dark: 30 5.7% 7.5%; - --gradient: #c0bdb4; - --contrast: 0 0% 100%; - --chart-1: 220 70% 50%; - --chart-2: 160 60% 45%; - --chart-3: 30 80% 55%; - --chart-4: 280 65% 60%; - --chart-5: 340 75% 55%; - --sidebar-background: 240 5.9% 10%; - --sidebar-foreground: 240 4.8% 95.9%; - --sidebar-primary: 224.3 76.3% 48%; - --sidebar-primary-foreground: 0 0% 100%; - --sidebar-accent: 240 3.7% 15.9%; - --sidebar-accent-foreground: 240 4.8% 95.9%; - --sidebar-border: 240 3.7% 15.9%; - --sidebar-ring: 217.2 91.2% 59.8%; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-synthesis-weight: none; } - - .bitcoin { - --primary: 20 14.3% 4.1%; - --icon: #383432; - --gradient: #ff7733; + a { + @apply cursor-pointer; } - .dark .bitcoin { - --primary: 0 0% 100%; - --icon: #ffffff; - --gradient: #ff7733; + pre { + @apply text-sm; } -} - -body { - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - font-synthesis-weight: none; -} - -/* Override CSS */ - -.recipe-preview > div:first-child { - margin: 0; - height: 200px; -} - -.recipe-preview > div:first-child pre { - overflow-x: hidden; - scrollbar-width: none; /* Firefox */ - -ms-overflow-style: none; /* IE and Edge */ -} - -.recipe-preview > div:first-child pre::-webkit-scrollbar { - display: none; /* Chrome, Safari and Opera */ -} - -.recipe > div:first-child { - margin: 0; -} - -.recipe > div:first-child pre { - max-height: 425px; - height: auto; -} - -.sticky.top-24 { - font-family: var(--font-aeonikFono), sans-serif; - background: transparent; - border: none; -} - -.sticky.top-24 button { - margin-left: 0; /* Override Tailwind's ms-auto (margin-left: auto) */ -} - -.container.flex.flex-row.gap-6.xl\:gap-12 { - padding: 0; - margin-top: 0; -} - -pre { - font-size: 0.875rem; -} - -li a { - text-decoration: none !important; -} - -li a:hover { - text-decoration: underline !important; -} - -div.container { - margin-top: 1rem; -} - -/* FIXME: This removes the white space margin between frontmatter title and description and start of body content */ -.container article p.mb-8 { - margin-bottom: 0rem; -} - -/* FIXME: This changes the background color of the sidebar navigation */ -/* aside div.rounded-md.border.bg-gradient-to-b.from-secondary.p-1.shadow-sm { - background: hsl(var(--hiro)); -} */ - -.mt-4.flex.flex-row.flex-wrap.gap-4.border-t.py-12 { - display: none; -} - -div[cmdk-list-sizer] { - font-family: var(--font-inter), sans-serif; -} - -a[aria-label="Hiro Platform"] { - padding: 0; -} - -h1, -h2, -h3, -h4, -h5, -h6, -code, -button, -.step { - font-family: var(--font-aeonikFono), sans-serif; -} - -a, -h1 a, -h2 a, -h3 a, -h4 a, -h5 a, -h6 a, -option { - font-family: var(--font-aeonikFono), sans-serif; -} - -/* TODO: div.prose is for targeting the <Callout> title, need to fix this approach */ -a, -p, -li, -table, -input, -div.prose .w-0 { - font-family: var(--font-inter), sans-serif; -} -/* TODO: div.prose .flex-1 span is for targeting the text inside the <Property> component */ -/* div.prose .flex-1 span { - font-family: var(--font-inter), sans-serif; -} */ - -/* This changes the default background color of the root level Home and Get Started tab icons */ -div.bg-gradient-to-b { - background: hsl(var(--accent)); -} - -/* This changes font weight on active sidebar tab */ -a.bg-primary\/10 { - font-weight: 600; - background: hsl(var(--accent)); -} - -/* This changes the icon colors for active root level sidebar tabs, Stacks */ -a.bg-primary\/10 div:first-child { - background: var(--inverted); - border: none; -} - -a.bg-primary\/10 div:first-child svg { - color: hsl(var(--background)); -} -/* This changes the icon colors for active root level sidebar tabs, Ordinals */ -.bitcoin a.bg-primary\/10 div:first-child { - background: hsl(var(--hiro)); - border: none; -} - -.bitcoin a.bg-primary\/10 div:first-child svg { - color: hsl(var(--background)); -} - -p { - line-height: 1.75; -} - -body - > div.guides - > div - > article - > div.prose - > figure:nth-child(37) - > div - > div { - background: hsl(var(--code)); -} - -article { - padding-left: 0.75rem; - padding-right: 0.75rem; -} - -figure.not-prose div[data-radix-scroll-area-viewport] { - background: hsl(var(--code)); - width: auto; - margin: 8.5px; - border-radius: 0.5rem; -} - -/* Reduces the vertical space between code blocks and text in the steps guides */ -figure.not-prose { - margin-top: 0.75rem; - margin-bottom: 0.75rem; -} - -/* This sets the background of a code block to match the theme's background when providing a filename to the code block */ -figure.not-prose { - background: hsl(var(--background)); -} - -/* This removes the border from the code block when providing a filename */ -figure:not(:has(figcaption)) { - border: none; -} -figure.not-prose:not(:has(figcaption)) { - background: hsl(var(--code)); -} - -figure.not-prose:not(:has(figcaption)) div[data-radix-scroll-area-viewport] { - margin: 0; -} - -nav.container { - gap: 2.25rem; -} - -nav.container a, -figure, -pre, -pre a, -code, -code a, -th, -code > span, -.not-prose div { - font-family: var(--font-aeonikFono), sans-serif; -} - -div.flex.flex-row.items-center.gap-2.border-b.bg-muted.px-4.py-1\.5 { - border-bottom: none; -} - -/* For dark mode specifically, FIXME: This is a temporary fix to change the background of the theme toggle icon when inactive in dark mode */ -.dark button[aria-label="Toggle Theme"] svg:first-of-type { - background: hsl(var(--background)); -} - -nav a[href="/guides"], -nav a[href="/cookbook"] { - text-decoration: underline; -} - -[data-radix-scroll-area-viewport] - .flex.flex-col.gap-8.pb-10.pt-4.max-md\:px-4.md\:pr-3.md\:pt-10 { - gap: 0; -} - -/* Target the header toggle */ - -body - > div - > header - > nav - > div.rounded-md.border.bg-background.p-1.text-sm.text-muted-foreground.max-md\:absolute.max-md\:left-\[50\%\].max-md\:translate-x-\[-50\%\] - > a.rounded-md.px-2.py-1.transition-colors.hover\:text-accent-foreground.bg-background.text-accent-foreground { - background-color: hsl(var(--inverted)); - color: hsl(var(--background)); -} - -/* Target the search component */ - -body - > div - > header - > nav - > div.flex.flex-1.flex-row.items-center.justify-end.md\:gap-2 - > button.inline-flex.w-full.max-w-\[240px\].items-center.gap-2.rounded-full.border.bg-secondary\/50.p-1\.5.text-sm.text-muted-foreground.transition-colors.hover\:bg-accent.hover\:text-accent-foreground.max-md\:hidden { - background-color: hsl(var(--background)); -} - -div.not-prose, -div.prose-no-margin, -div[role="tablist"] { - background: hsl(var(--background)); -} - -/* Target the form tag with specific classes */ -form.not-prose.flex.flex-col.gap-4.rounded-lg.border.bg-card.p-4 { - background-color: hsl(var(--background)); -} - -/* Target the specific div with the given classes */ -.divide-y.divide-border.overflow-hidden.rounded-lg.bg-card.-m-4.mt-2.border-0.text-sm { - background-color: hsl(var(--background)); -} - -/* overrides the background of APIInfo and adjusts sticky header on scroll */ -div.prose-no-margin - .sticky.top-24.z-\[2\].flex.flex-row.items-center.gap-2.rounded-lg.border.bg-card.p-3.md\:top-10 { - background: hsl(var(--background)); - top: 4.5rem; -} - -/* START Wrap longer endpoionts */ - -/* Target the sticky outer div */ -.sticky.top-24.z-\[2\].flex.flex-row.items-center.gap-2.rounded-lg.border.bg-card.p-3.md\:top-10 { - display: flex; - flex-wrap: wrap; - padding-top: 2.5rem; -} - -/* Style for the POST span */ -.sticky.top-24.z-\[2\].flex.flex-row.items-center.gap-2.rounded-lg.border.bg-card.p-3.md\:top-10 - > span:first-child { - position: absolute; - top: 0.75rem; - left: 0.75rem; -} - -/* Style for the button */ -.sticky.top-24.z-\[2\].flex.flex-row.items-center.gap-2.rounded-lg.border.bg-card.p-3.md\:top-10 - > button { - position: absolute; - top: 0.75rem; - right: 0.75rem; -} - -/* Target the inner div containing the endpoint spans */ -.sticky.top-24.z-\[2\].flex.flex-row.items-center.gap-2.rounded-lg.border.bg-card.p-3.md\:top-10 - > div { - display: flex; - flex-wrap: wrap; - width: 100%; -} - -/* END Wrap longer endpoionts */ - -div.prose div.footer.not-prose { - background: hsl(var(--accent)); -} - -#radix-\:r3\: > div > div > div:nth-child(2) > select option { - font-family: var(--font-aeonikFono), sans-serif !important; -} - -.steps - > div:nth-child(2) - > figure:nth-child(3) - > div.flex.flex-row.items-center.gap-2.border-b.bg-muted.px-4.py-1\.5 { - background: hsl(var(--background)) !important; -} - -.prose :where(a):not(:where([class~="not-prose"], [class~="not-prose"] *)) { - text-decoration-color: var(--secondary) !important; -} - -/* Default light mode */ -.highlighted { - border: none !important; -} - -/* Adjust styling for Shiki word highlighting */ -.highlighted-word { - background: hsl(var(--accent)) !important; - border-color: hsl(var(--accent)) !important; - border-radius: 5px !important; - margin: 0 !important; -} - -.size-10 { - width: 2.5rem /* 20px */; - height: 2.5rem /* 20px */; -} - -/* Add a deprecated strike through to sidebar links */ -a[href="/stacks/api/accounts/nft-events"], -a[href="/stacks/api/accounts/transaction-with-transfers"], -a[href="/stacks/api/accounts/transactions"], -a[href="/stacks/api/accounts/transactions-with-transfers"], -a[href="/stacks/api/blocks/block-by-burn-block-hash"], -a[href="/stacks/api/blocks/block-by-burn-block-height"], -a[href="/stacks/api/blocks/block-by-hash"], -a[href="/stacks/api/blocks/block-by-height"], -a[href="/stacks/api/blocks/recent-blocks"], -a[href="/stacks/api/fees/fee-rate"], -a[href="/stacks/api/accounts/balances"], -a[href="/stacks/api/accounts/stx-balances"] { - text-decoration: line-through; - color: hsl(var(--muted-foreground) / var(--tw-text-opacity)); -} - -div.divide-y.divide-border.overflow-hidden.rounded-lg.border.bg-card { - background: hsl(var(--background)); -} - -/* START Docskit theme */ - -@layer base { - :root { - --ch-0: light; - --ch-1: #7a756b; - --ch-2: #7c7f93; /* Not used */ - --ch-3: #b5aca1; - --ch-4: #48944c; - --ch-5: #ea76cb; - --ch-6: #ff5500; - --ch-7: #bc812e; - --ch-8: #179299; - --ch-9: #3676b7; - --ch-10: #bc812e; - --ch-11: #7a756b; - --ch-12: #bc812e; - --ch-13: #04a5e5; - --ch-14: #dd7878; - --ch-15: #6c6f85; - --ch-16: #3676b7; /* highlight */ - --ch-17: #dc8a78; - --ch-18: #eff1f5; - --ch-19: #4c4f6912; - --ch-20: #04a5e540; - --ch-21: #1a85ff; - --ch-22: #7c7f934d; - --ch-23: #e6e9ef; - --ch-24: #acb0be; - --ch-25: #dce0e8; - --ch-26: #8c8fa1; - --ch-27: #ccd0da; - --ch-28: #ccd0da80; - --ch-29: #eff1f5e6; - --ch-30: #bcc0cc; - --ch-31: #6c6f85; - --ch-32: #5c5f77; - --ch-33: #acb0be; + h1, h2, h3, h4, h5, h6, code, h1 a, h2 a, h3 a, h4 a, h5 a, h6 a, option { + font-family: var(--font-fono), sans-serif; + @apply text-primary; } - .dark { - --ch-0: dark; - --ch-1: #8c877d; - --ch-2: #9399b2; /* Not used */ - --ch-3: #595650; - --ch-4: #c2ebc4; - --ch-5: #f5c2e7; - --ch-6: #ff5500; - --ch-7: #ff9ecf; - --ch-8: #94e2d5; - --ch-9: #b3d9ff; - --ch-10: #ff9ecf; - --ch-11: #8c877d; - --ch-12: #ff9ecf; - --ch-13: #89dceb; - --ch-14: #f2cdcd; - --ch-15: #a6adc8; - --ch-16: #8c877d; /* highlight */ - --ch-17: #f5e0dc; - --ch-18: #1e1e2e; - --ch-19: #cdd6f412; - --ch-20: #89dceb40; - --ch-21: #3794ff; - --ch-22: #9399b240; - --ch-23: #181825; - --ch-24: #585b70; - --ch-25: #11111b; - --ch-26: #7f849c; - --ch-27: #313244; - --ch-28: #31324480; - --ch-29: #1e1e2ee6; - --ch-30: #a6adc8; - --ch-31: #585b70; - --ch-32: #45475a; - --ch-33: #bac2de; + span { + font-family: var(--font-inter), sans-serif; } -} -/* END Docskit theme */ - -/* Replace the nested selectors with flat ones */ -.light::selection { - background-color: #f4d4a3; - color: #bc812e; -} - -.light::-moz-selection { - background-color: #f4d4a3; - color: #bc812e; -} + pre span { + font-family: var(--font-mono), sans-serif; + } -.dark::selection { - background-color: #ffe6f2; - color: #ff9ecf; -} + article a { + font-family: var(--font-fono), sans-serif; + } -.dark::-moz-selection { - background-color: #ffe6f2; - color: #ff9ecf; -} +} \ No newline at end of file diff --git a/app/layout.config.tsx b/app/layout.config.tsx new file mode 100644 index 000000000..2723a161d --- /dev/null +++ b/app/layout.config.tsx @@ -0,0 +1,15 @@ +import type { BaseLayoutProps } from "fumadocs-ui/layouts/shared"; +import { TopNav } from "@/components/top-nav"; +/** + * Shared layout configurations + * + * you can customise layouts individually from: + * Home Layout: app/(home)/layout.tsx + * Docs Layout: app/docs/layout.tsx + */ +export const baseOptions: BaseLayoutProps = { + nav: { + enabled: false, + }, + links: [], +}; diff --git a/app/layout.tsx b/app/layout.tsx index c37cd70b7..4b4e338ec 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,143 +1,32 @@ import "./global.css"; -import { aeonik, aeonikFono, aeonikMono, inter } from "@/app/fonts"; -import type { Viewport } from "next"; -import { baseUrl, createMetadata } from "@/utils/metadata"; -import { Provider } from "./provider"; -import { GoogleTagManager } from "@next/third-parties/google"; -import { Banner } from "@/components/ui/banner"; -import { Discord, Github, HiroSVG, Youtube, X } from "@/components/ui/icon"; +import { RootProvider } from "fumadocs-ui/provider"; +import type { ReactNode } from "react"; +import { aeonik, aeonikFono, aeonikMono, inter } from "@/fonts"; +import { SearchProvider } from "@/lib/hooks/use-search"; +import SearchDialog from "@/components/search-dialog"; +import { KeyboardShortcutsProvider } from "@/lib/hooks/use-keyboard-shortcuts"; -const GTM_ID = process.env.NEXT_PUBLIC_GTM_ID as string; - -export const metadata = createMetadata({ - title: { - template: "%s | Hiro Docs", - default: "Hiro Documentation", - }, - description: "Hiro Documentation", - metadataBase: baseUrl, -}); - -export const viewport: Viewport = { - themeColor: [ - { media: "(prefers-color-scheme: dark)", color: "var(--background)" }, - { media: "(prefers-color-scheme: light)", color: "var(--background)" }, - ], -}; - -export default function RootLayout({ - children, -}: { - children: React.ReactNode; -}): JSX.Element { +export default function RootLayout({ children }: { children: ReactNode }) { return ( <html lang="en" className={`${aeonik.variable} ${aeonikFono.variable} ${aeonikMono.variable} ${inter.variable}`} suppressHydrationWarning > - <GoogleTagManager gtmId={GTM_ID} /> - <body className="flex min-h-screen flex-col"> - <Provider> - <Banner - id="api-tiers" - cta="Meet Hiro’s new account tiers" - url="https://platform.hiro.so/pricing" - startDate="2025-04-09" - endDate="2025-04-16" - mobileText="Increase your API rate limits" - > - Increased API rate limits, dedicated support channels. - </Banner> - {children} - <Footer /> - </Provider> + <body className="flex flex-col min-h-screen"> + <KeyboardShortcutsProvider> + <SearchProvider> + <RootProvider + search={{ + enabled: false, + }} + > + {children} + </RootProvider> + <SearchDialog /> + </SearchProvider> + </KeyboardShortcutsProvider> </body> </html> ); } - -function Footer(): JSX.Element { - return ( - <footer className="mt-auto border-t border-accent bg-background py-12 text-secondary-foreground"> - <div className="container flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between"> - <div className="flex flex-row justify-between items-center w-full"> - <div className="flex flex-row items-center gap-6"> - <div className="bg-primary w-fit rounded-[4px] p-1.5 text-muted-foreground [&_svg]:size-4"> - <HiroSVG className="text-card" /> - </div> - <a - className="text-sm text-primary transition-colors hover:text-accent-foreground max-lg:hidden after:content-[''] after:block after:h-[1px] after:mt-0.5 after:border after:border-1 after:border-border hover:after:border-primary/50" - href="https://hiro.so/" - target="_blank" - > - hiro.so - </a> - <a - className="text-sm text-primary transition-colors hover:text-accent-foreground max-lg:hidden after:content-[''] after:block after:h-[1px] after:mt-0.5 after:border after:border-1 after:border-border hover:after:border-primary/50" - href="/guides" - > - Guides - </a> - <a - className="text-sm text-primary transition-colors hover:text-accent-foreground max-lg:hidden after:content-[''] after:block after:h-[1px] after:mt-0.5 after:border after:border-1 after:border-border hover:after:border-primary/50" - href="https://platform.hiro.so/" - target="_blank" - > - Hiro Platform - </a> - <a - className="text-sm text-primary transition-colors hover:text-accent-foreground max-lg:hidden after:content-[''] after:block after:h-[1px] after:mt-0.5 after:border after:border-1 after:border-border hover:after:border-primary/50" - href="https://status.hiro.so/" - target="_blank" - > - Status - </a> - <a - className="text-sm text-primary transition-colors hover:text-accent-foreground max-lg:hidden after:content-[''] after:block after:h-[1px] after:mt-0.5 after:border after:border-1 after:border-border hover:after:border-primary/50" - href="https://hackerone.com/hiro?type=team" - target="_blank" - > - Bounty Program - </a> - </div> - <div className="flex flex-col space-y-3 items-end"> - <div className="flex flex-row items-center gap-6"> - <a - href="https://x.com/hirosystems" - target="_blank" - className="transition-colors" - > - <X /> - </a> - <a - href="https://stacks.chat/" - target="_blank" - className="transition-colors" - > - <Discord /> - </a> - <a - href="https://github.com/hirosystems" - target="_blank" - className="transition-colors" - > - <Github /> - </a> - <a - href="https://www.youtube.com/c/hirosystems/" - target="_blank" - className="transition-colors" - > - <Youtube /> - </a> - </div> - <p className="text-sm text-[#b7ac9f] font-aeonikFono"> - Copyright © {new Date().getFullYear()} Hiro Systems, PBC. - </p> - </div> - </div> - </div> - </footer> - ); -} diff --git a/app/llms.txt/route.ts b/app/llms.txt/route.ts new file mode 100644 index 000000000..69efdc9f7 --- /dev/null +++ b/app/llms.txt/route.ts @@ -0,0 +1,44 @@ +import * as fs from "node:fs/promises"; +import fg from "fast-glob"; +import matter from "gray-matter"; +import { remark } from "remark"; +import remarkGfm from "remark-gfm"; +import remarkStringify from "remark-stringify"; +import remarkMdx from "remark-mdx"; +import { remarkInclude } from "fumadocs-mdx/config"; + +export const revalidate = false; + +export async function GET() { + // all scanned content + const files = await fg(["./content/docs/**/*.mdx"]); + + const scan = files.map(async (file) => { + const fileContent = await fs.readFile(file); + const { content, data } = matter(fileContent.toString()); + + const processed = await processContent(content); + return `file: ${file} +meta: ${JSON.stringify(data, null, 2)} + +${processed}`; + }); + + const scanned = await Promise.all(scan); + + return new Response(scanned.join("\n\n")); +} + +async function processContent(content: string): Promise<string> { + const file = await remark() + .use(remarkMdx) + // https://fumadocs.vercel.app/docs/mdx/include + .use(remarkInclude) + // gfm styles + .use(remarkGfm) + // .use(your remark plugins) + .use(remarkStringify) // to string + .process(content); + + return String(file); +} diff --git a/app/provider.tsx b/app/provider.tsx deleted file mode 100644 index ce193943f..000000000 --- a/app/provider.tsx +++ /dev/null @@ -1,21 +0,0 @@ -"use client"; - -import { RootProvider } from "fumadocs-ui/provider"; -import dynamic from "next/dynamic"; -import type { ReactNode } from "react"; - -const SearchDialog = dynamic(() => import("@/components/search"), { - ssr: false, -}); - -export function Provider({ children }: { children: ReactNode }): JSX.Element { - return ( - <RootProvider - search={{ - SearchDialog, - }} - > - {children} - </RootProvider> - ); -} diff --git a/app/sitemap.ts b/app/sitemap.ts deleted file mode 100644 index cabdb307e..000000000 --- a/app/sitemap.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { MetadataRoute } from "next"; -import { baseUrl } from "@/utils/metadata"; -import { utils } from "@/utils/source"; - -export default function sitemap(): MetadataRoute.Sitemap { - const url = (path: string): string => new URL(path, baseUrl).toString(); - - return [ - { - url: url("/"), - changeFrequency: "monthly", - priority: 1, - }, - { - url: url("/stacks"), - changeFrequency: "monthly", - priority: 0.8, - }, - { - url: url("/bitcoin"), - changeFrequency: "monthly", - priority: 0.8, - }, - ...utils.getPages().map<MetadataRoute.Sitemap[number]>((page) => ({ - url: url(page.url), - lastModified: page.data.exports.lastModified - ? new Date(page.data.exports.lastModified) - : undefined, - changeFrequency: "weekly", - priority: 0.5, - })), - ]; -} diff --git a/app/theme.css b/app/theme.css new file mode 100644 index 000000000..bdf1674f6 --- /dev/null +++ b/app/theme.css @@ -0,0 +1,388 @@ +@theme { + --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --font-fono: Aeonik Fono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --color-red-50: oklch(0.971 0.013 17.38); + --color-red-100: oklch(0.936 0.032 17.717); + --color-red-200: oklch(0.885 0.062 18.334); + --color-red-300: oklch(0.808 0.114 19.571); + --color-red-400: oklch(0.704 0.191 22.216); + --color-red-500: oklch(0.637 0.237 25.331); + --color-red-600: oklch(0.577 0.245 27.325); + --color-red-700: oklch(0.505 0.213 27.518); + --color-red-800: oklch(0.444 0.177 26.899); + --color-red-900: oklch(0.396 0.141 25.723); + --color-red-950: oklch(0.258 0.092 26.042); + --color-orange-50: #fff8f5; + --color-orange-100: #ffddcc; + --color-orange-300: #ffbb99; + --color-orange-500: #ff9966; + --color-orange-700: #ff7733; + --color-orange-900: #ff5500; + --color-amber-50: oklch(0.987 0.022 95.277); + --color-amber-100: oklch(0.962 0.059 95.617); + --color-amber-200: oklch(0.924 0.12 95.746); + --color-amber-300: oklch(0.879 0.169 91.605); + --color-amber-400: oklch(0.828 0.189 84.429); + --color-amber-500: oklch(0.769 0.188 70.08); + --color-amber-600: oklch(0.666 0.179 58.318); + --color-amber-700: oklch(0.555 0.163 48.998); + --color-amber-800: oklch(0.473 0.137 46.201); + --color-amber-900: oklch(0.414 0.112 45.904); + --color-amber-950: oklch(0.279 0.077 45.635); + --color-yellow-50: oklch(0.987 0.026 102.212); + --color-yellow-100: oklch(0.973 0.071 103.193); + --color-yellow-200: oklch(0.945 0.129 101.54); + --color-yellow-300: oklch(0.905 0.182 98.111); + --color-yellow-400: oklch(0.852 0.199 91.936); + --color-yellow-500: oklch(0.795 0.184 86.047); + --color-yellow-600: oklch(0.681 0.162 75.834); + --color-yellow-700: oklch(0.554 0.135 66.442); + --color-yellow-800: oklch(0.476 0.114 61.907); + --color-yellow-900: oklch(0.421 0.095 57.708); + --color-yellow-950: oklch(0.286 0.066 53.813); + --color-lime-50: oklch(0.986 0.031 120.757); + --color-lime-100: oklch(0.967 0.067 122.328); + --color-lime-200: oklch(0.938 0.127 124.321); + --color-lime-300: oklch(0.897 0.196 126.665); + --color-lime-400: oklch(0.841 0.238 128.85); + --color-lime-500: oklch(0.768 0.233 130.85); + --color-lime-600: oklch(0.648 0.2 131.684); + --color-lime-700: oklch(0.532 0.157 131.589); + --color-lime-800: oklch(0.453 0.124 130.933); + --color-lime-900: oklch(0.405 0.101 131.063); + --color-lime-950: oklch(0.274 0.072 132.109); + --color-green-50: oklch(0.982 0.018 155.826); + --color-green-100: oklch(0.962 0.044 156.743); + --color-green-200: oklch(0.925 0.084 155.995); + --color-green-300: oklch(0.871 0.15 154.449); + --color-green-400: oklch(0.792 0.209 151.711); + --color-green-500: oklch(0.723 0.219 149.579); + --color-green-600: oklch(0.627 0.194 149.214); + --color-green-700: oklch(0.527 0.154 150.069); + --color-green-800: oklch(0.448 0.119 151.328); + --color-green-900: oklch(0.393 0.095 152.535); + --color-green-950: oklch(0.266 0.065 152.934); + --color-emerald-50: oklch(0.979 0.021 166.113); + --color-emerald-100: oklch(0.95 0.052 163.051); + --color-emerald-200: oklch(0.905 0.093 164.15); + --color-emerald-300: oklch(0.845 0.143 164.978); + --color-emerald-400: oklch(0.765 0.177 163.223); + --color-emerald-500: oklch(0.696 0.17 162.48); + --color-emerald-600: oklch(0.596 0.145 163.225); + --color-emerald-700: oklch(0.508 0.118 165.612); + --color-emerald-800: oklch(0.432 0.095 166.913); + --color-emerald-900: oklch(0.378 0.077 168.94); + --color-emerald-950: oklch(0.262 0.051 172.552); + --color-teal-50: oklch(0.984 0.014 180.72); + --color-teal-100: oklch(0.953 0.051 180.801); + --color-teal-200: oklch(0.91 0.096 180.426); + --color-teal-300: oklch(0.855 0.138 181.071); + --color-teal-400: oklch(0.777 0.152 181.912); + --color-teal-500: oklch(0.704 0.14 182.503); + --color-teal-600: oklch(0.6 0.118 184.704); + --color-teal-700: oklch(0.511 0.096 186.391); + --color-teal-800: oklch(0.437 0.078 188.216); + --color-teal-900: oklch(0.386 0.063 188.416); + --color-teal-950: oklch(0.277 0.046 192.524); + --color-cyan-50: oklch(0.984 0.019 200.873); + --color-cyan-100: oklch(0.956 0.045 203.388); + --color-cyan-200: oklch(0.917 0.08 205.041); + --color-cyan-300: oklch(0.865 0.127 207.078); + --color-cyan-400: oklch(0.789 0.154 211.53); + --color-cyan-500: oklch(0.715 0.143 215.221); + --color-cyan-600: oklch(0.609 0.126 221.723); + --color-cyan-700: oklch(0.52 0.105 223.128); + --color-cyan-800: oklch(0.45 0.085 224.283); + --color-cyan-900: oklch(0.398 0.07 227.392); + --color-cyan-950: oklch(0.302 0.056 229.695); + --color-sky-100: #f0f7ff; + --color-sky-300: #e1f0ff; + --color-sky-500: #d1e8ff; + --color-sky-700: #c2e1ff; + --color-sky-900: #b3d9ff; + --color-blue-50: oklch(0.97 0.014 254.604); + --color-blue-100: oklch(0.932 0.032 255.585); + --color-blue-200: oklch(0.882 0.059 254.128); + --color-blue-300: oklch(0.809 0.105 251.813); + --color-blue-400: oklch(0.707 0.165 254.624); + --color-blue-500: oklch(0.623 0.214 259.815); + --color-blue-600: oklch(0.546 0.245 262.881); + --color-blue-700: oklch(0.488 0.243 264.376); + --color-blue-800: oklch(0.424 0.199 265.638); + --color-blue-900: oklch(0.379 0.146 265.522); + --color-blue-950: oklch(0.282 0.091 267.935); + --color-indigo-50: oklch(0.962 0.018 272.314); + --color-indigo-100: oklch(0.93 0.034 272.788); + --color-indigo-200: oklch(0.87 0.065 274.039); + --color-indigo-300: oklch(0.785 0.115 274.713); + --color-indigo-400: oklch(0.673 0.182 276.935); + --color-indigo-500: oklch(0.585 0.233 277.117); + --color-indigo-600: oklch(0.511 0.262 276.966); + --color-indigo-700: oklch(0.457 0.24 277.023); + --color-indigo-800: oklch(0.398 0.195 277.366); + --color-indigo-900: oklch(0.359 0.144 278.697); + --color-indigo-950: oklch(0.257 0.09 281.288); + --color-violet-50: oklch(0.969 0.016 293.756); + --color-violet-100: oklch(0.943 0.029 294.588); + --color-violet-200: oklch(0.894 0.057 293.283); + --color-violet-300: oklch(0.811 0.111 293.571); + --color-violet-400: oklch(0.702 0.183 293.541); + --color-violet-500: oklch(0.606 0.25 292.717); + --color-violet-600: oklch(0.541 0.281 293.009); + --color-violet-700: oklch(0.491 0.27 292.581); + --color-violet-800: oklch(0.432 0.232 292.759); + --color-violet-900: oklch(0.38 0.189 293.745); + --color-violet-950: oklch(0.283 0.141 291.089); + --color-purple-50: oklch(0.977 0.014 308.299); + --color-purple-100: oklch(0.946 0.033 307.174); + --color-purple-200: oklch(0.902 0.063 306.703); + --color-purple-300: oklch(0.827 0.119 306.383); + --color-purple-400: oklch(0.714 0.203 305.504); + --color-purple-500: oklch(0.627 0.265 303.9); + --color-purple-600: oklch(0.558 0.288 302.321); + --color-purple-700: oklch(0.496 0.265 301.924); + --color-purple-800: oklch(0.438 0.218 303.724); + --color-purple-900: oklch(0.381 0.176 304.987); + --color-purple-950: oklch(0.291 0.149 302.717); + --color-fuchsia-50: oklch(0.977 0.017 320.058); + --color-fuchsia-100: oklch(0.952 0.037 318.852); + --color-fuchsia-200: oklch(0.903 0.076 319.62); + --color-fuchsia-300: oklch(0.833 0.145 321.434); + --color-fuchsia-400: oklch(0.74 0.238 322.16); + --color-fuchsia-500: oklch(0.667 0.295 322.15); + --color-fuchsia-600: oklch(0.591 0.293 322.896); + --color-fuchsia-700: oklch(0.518 0.253 323.949); + --color-fuchsia-800: oklch(0.452 0.211 324.591); + --color-fuchsia-900: oklch(0.401 0.17 325.612); + --color-fuchsia-950: oklch(0.293 0.136 325.661); + --color-pink-50: oklch(0.971 0.014 343.198); + --color-pink-100: oklch(0.948 0.028 342.258); + --color-pink-200: oklch(0.899 0.061 343.231); + --color-pink-300: oklch(0.823 0.12 346.018); + --color-pink-400: oklch(0.718 0.202 349.761); + --color-pink-500: oklch(0.656 0.241 354.308); + --color-pink-600: oklch(0.592 0.249 0.584); + --color-pink-700: oklch(0.525 0.223 3.958); + --color-pink-800: oklch(0.459 0.187 3.815); + --color-pink-900: oklch(0.408 0.153 2.432); + --color-pink-950: oklch(0.284 0.109 3.907); + --color-rose-50: oklch(0.969 0.015 12.422); + --color-rose-100: oklch(0.941 0.03 12.58); + --color-rose-200: oklch(0.892 0.058 10.001); + --color-rose-300: oklch(0.81 0.117 11.638); + --color-rose-400: oklch(0.712 0.194 13.428); + --color-rose-500: oklch(0.645 0.246 16.439); + --color-rose-600: oklch(0.586 0.253 17.585); + --color-rose-700: oklch(0.514 0.222 16.935); + --color-rose-800: oklch(0.455 0.188 13.697); + --color-rose-900: oklch(0.41 0.159 10.272); + --color-rose-950: oklch(0.271 0.105 12.094); + --color-slate-50: oklch(0.984 0.003 247.858); + --color-slate-100: oklch(0.968 0.007 247.896); + --color-slate-200: oklch(0.929 0.013 255.508); + --color-slate-300: oklch(0.869 0.022 252.894); + --color-slate-400: oklch(0.704 0.04 256.788); + --color-slate-500: oklch(0.554 0.046 257.417); + --color-slate-600: oklch(0.446 0.043 257.281); + --color-slate-700: oklch(0.372 0.044 257.287); + --color-slate-800: oklch(0.279 0.041 260.031); + --color-slate-900: oklch(0.208 0.042 265.755); + --color-slate-950: oklch(0.129 0.042 264.695); + --color-gray-50: oklch(0.985 0.002 247.839); + --color-gray-100: oklch(0.967 0.003 264.542); + --color-gray-200: oklch(0.928 0.006 264.531); + --color-gray-300: oklch(0.872 0.01 258.338); + --color-gray-400: oklch(0.707 0.022 261.325); + --color-gray-500: oklch(0.551 0.027 264.364); + --color-gray-600: oklch(0.446 0.03 256.802); + --color-gray-700: oklch(0.373 0.034 259.733); + --color-gray-800: oklch(0.278 0.033 256.848); + --color-gray-900: oklch(0.21 0.034 264.665); + --color-gray-950: oklch(0.13 0.028 261.692); + --color-zinc-50: oklch(0.985 0 0); + --color-zinc-100: oklch(0.967 0.001 286.375); + --color-zinc-200: oklch(0.92 0.004 286.32); + --color-zinc-300: oklch(0.871 0.006 286.286); + --color-zinc-400: oklch(0.705 0.015 286.067); + --color-zinc-500: oklch(0.552 0.016 285.938); + --color-zinc-600: oklch(0.442 0.017 285.786); + --color-zinc-700: oklch(0.37 0.013 285.805); + --color-zinc-800: oklch(0.274 0.006 286.033); + --color-zinc-900: oklch(0.21 0.006 285.885); + --color-zinc-950: oklch(0.141 0.005 285.823); + --color-neutral-50: #f6f5f3; + --color-neutral-100: #f2f0ed; + --color-neutral-150: #e1dcd6; + --color-neutral-200: #cfc9c2; + --color-neutral-250: #aea498; + --color-neutral-300: #8c877d; + --color-neutral-400: #595650; + --color-neutral-500: #383432; + --color-neutral-600: #2a2726; + --color-neutral-700: #1e1c1b; + --color-neutral-800: #181717; + --color-neutral-900: #141312; + --color-neutral-950: #0d0c0c; + --color-brand-orange: #ff5500; + --color-brand-mint: #c2ebc4; + --color-brand-sky: #b3d9ff; + --color-brand-pink: #ff9ecf; + --color-brand-gold: #bc812e; + --color-mint-100: #f3fbf3; + --color-mint-300: #e7f7e7; + --color-mint-500: #daf3dc; + --color-mint-700: #ceefd0; + --color-mint-900: #c2ebc4; + --color-stone-50: oklch(0.985 0.001 106.423); + --color-stone-100: oklch(0.97 0.001 106.424); + --color-stone-200: oklch(0.923 0.003 48.717); + --color-stone-300: oklch(0.869 0.005 56.366); + --color-stone-400: oklch(0.709 0.01 56.259); + --color-stone-500: oklch(0.553 0.013 58.071); + --color-stone-600: oklch(0.444 0.011 73.639); + --color-stone-700: oklch(0.374 0.01 67.558); + --color-stone-800: oklch(0.268 0.007 34.298); + --color-stone-900: oklch(0.216 0.006 56.043); + --color-stone-950: oklch(0.147 0.004 49.25); + --color-black: #0d0c0c; + --color-white: #ffffff; + --spacing: 0.25rem; + --breakpoint-sm: 40rem; + --breakpoint-md: 48rem; + --breakpoint-lg: 64rem; + --breakpoint-xl: 80rem; + --breakpoint-2xl: 96rem; + --container-3xs: 16rem; + --container-2xs: 18rem; + --container-xs: 20rem; + --container-sm: 24rem; + --container-md: 28rem; + --container-lg: 32rem; + --container-xl: 36rem; + --container-2xl: 42rem; + --container-3xl: 48rem; + --container-4xl: 56rem; + --container-5xl: 64rem; + --container-6xl: 72rem; + --container-7xl: 80rem; + --text-xs: 0.75rem; + --text-xs--line-height: calc(1 / 0.75); + --text-sm: 0.875rem; + --text-sm--line-height: calc(1.25 / 0.875); + --text-base: 1rem; + --text-base--line-height: calc(1.5 / 1); + --text-lg: 1.125rem; + --text-lg--line-height: calc(1.75 / 1.125); + --text-xl: 1.25rem; + --text-xl--line-height: calc(1.75 / 1.25); + --text-2xl: 1.5rem; + --text-2xl--line-height: calc(2 / 1.5); + --text-3xl: 1.875rem; + --text-3xl--line-height: calc(2.25 / 1.875); + --text-4xl: 2.25rem; + --text-4xl--line-height: calc(2.5 / 2.25); + --text-5xl: 3rem; + --text-5xl--line-height: 1; + --text-6xl: 3.75rem; + --text-6xl--line-height: 1; + --text-7xl: 4.5rem; + --text-7xl--line-height: 1; + --text-8xl: 6rem; + --text-8xl--line-height: 1; + --text-9xl: 8rem; + --text-9xl--line-height: 1; + --font-weight-thin: 100; + --font-weight-extralight: 200; + --font-weight-light: 300; + --font-weight-normal: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; + --font-weight-extrabold: 800; + --font-weight-black: 900; + --tracking-tighter: -0.05em; + --tracking-tight: -0.025em; + --tracking-normal: 0em; + --tracking-wide: 0.025em; + --tracking-wider: 0.05em; + --tracking-widest: 0.1em; + --leading-tight: 1.25; + --leading-snug: 1.375; + --leading-normal: 1.5; + --leading-relaxed: 1.625; + --leading-loose: 2; + --radius-xs: 0.125rem; + --radius-sm: 0.25rem; + --radius-md: 0.375rem; + --radius-lg: 0.5rem; + --radius-xl: 0.75rem; + --radius-2xl: 1rem; + --radius-3xl: 1.5rem; + --radius-4xl: 2rem; + --shadow-2xs: 0 1px rgb(0 0 0 / 0.05); + --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); + --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25); + --inset-shadow-2xs: inset 0 1px rgb(0 0 0 / 0.05); + --inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / 0.05); + --inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / 0.05); + --drop-shadow-xs: 0 1px 1px rgb(0 0 0 / 0.05); + --drop-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.15); + --drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12); + --drop-shadow-lg: 0 4px 4px rgb(0 0 0 / 0.15); + --drop-shadow-xl: 0 9px 7px rgb(0 0 0 / 0.1); + --drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / 0.15); + --blur-xs: 4px; + --blur-sm: 8px; + --blur-md: 12px; + --blur-lg: 16px; + --blur-xl: 24px; + --blur-2xl: 40px; + --blur-3xl: 64px; + --perspective-dramatic: 100px; + --perspective-near: 300px; + --perspective-normal: 500px; + --perspective-midrange: 800px; + --perspective-distant: 1200px; + --aspect-video: 16 / 9; + --ease-in: cubic-bezier(0.4, 0, 1, 1); + --ease-out: cubic-bezier(0, 0, 0.2, 1); + --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); + --animate-spin: spin 1s linear infinite; + --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite; + --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; + --animate-bounce: bounce 1s infinite; + @keyframes spin { + to { + transform: rotate(360deg); + } + } + @keyframes ping { + 75%, + 100% { + transform: scale(2); + opacity: 0; + } + } + @keyframes pulse { + 50% { + opacity: 0.5; + } + } + @keyframes bounce { + 0%, + 100% { + transform: translateY(-25%); + animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + } + 50% { + transform: none; + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + } + } +} \ No newline at end of file From 1ce235714a3d37cd48a02a94aa2080e70fd1f315 Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 11:51:42 -0500 Subject: [PATCH 06/21] update and reorg content --- content/docs/bitcoin/api-keys.mdx | 4 +- content/docs/bitcoin/api/index.mdx | 96 + content/docs/bitcoin/api/meta.json | 10 + .../api/ordinals/brc20/get-brc20-activity.mdx | 11 + .../api/ordinals/brc20/get-brc20-balances.mdx | 11 + .../brc20/get-brc20-token-details.mdx | 11 + .../brc20/get-brc20-token-holders.mdx | 11 + .../api/ordinals/brc20/get-brc20-tokens.mdx | 11 + .../docs/bitcoin/api/ordinals/brc20/index.mdx | 6 + .../docs/bitcoin/api/ordinals/brc20/meta.json | 5 + .../docs/bitcoin/api/ordinals/info/index.mdx | 6 + .../docs/bitcoin/api/ordinals/info/meta.json | 5 + .../docs/bitcoin/api/ordinals/info/status.mdx | 11 + .../inscriptions/get-inscription-content.mdx | 11 + .../get-inscription-transfers.mdx | 11 + .../ordinals/inscriptions/get-inscription.mdx | 11 + .../inscriptions/get-inscriptions.mdx | 11 + .../inscriptions/get-transfers-per-block.mdx | 11 + .../api/ordinals/inscriptions/index.mdx | 6 + .../api/ordinals/inscriptions/meta.json | 5 + .../satoshis/get-satoshi-inscriptions.mdx | 11 + .../api/ordinals/satoshis/get-satoshi.mdx | 11 + .../bitcoin/api/ordinals/satoshis/index.mdx | 6 + .../bitcoin/api/ordinals/satoshis/meta.json | 5 + .../get-stats-inscription-count.mdx | 11 + .../bitcoin/api/ordinals/statistics/index.mdx | 6 + .../bitcoin/api/ordinals/statistics/meta.json | 5 + .../bitcoin/api/runes/activities/activity.mdx | 11 + .../api/runes/activities/for-address.mdx | 11 + .../api/runes/activities/for-block.mdx | 11 + .../api/runes/activities/for-transaction.mdx | 11 + .../bitcoin/api/runes/activities/index.mdx | 6 + .../bitcoin/api/runes/activities/meta.json | 5 + .../bitcoin/api/runes/balances/address.mdx | 11 + .../api/runes/balances/holder-balance.mdx | 11 + .../bitcoin/api/runes/balances/holders.mdx | 11 + .../docs/bitcoin/api/runes/balances/index.mdx | 6 + .../docs/bitcoin/api/runes/balances/meta.json | 5 + .../api/runes/etchings/get-etching.mdx | 11 + .../api/runes/etchings/get-etchings.mdx | 11 + .../docs/bitcoin/api/runes/etchings/index.mdx | 6 + .../docs/bitcoin/api/runes/etchings/meta.json | 5 + content/docs/bitcoin/api/runes/info/index.mdx | 6 + content/docs/bitcoin/api/runes/info/meta.json | 5 + .../docs/bitcoin/api/runes/info/status.mdx | 11 + content/docs/bitcoin/contributors-guide.mdx | 4 +- content/docs/bitcoin/get-started.mdx | 2 +- content/docs/bitcoin/index.mdx | 2 +- content/docs/bitcoin/meta.json | 14 +- content/docs/bitcoin/quickstarts/index.mdx | 117 + content/docs/bitcoin/quickstarts/meta.json | 8 + content/docs/bitcoin/rate-limiting.mdx | 6 +- .../bitcoin/runes/runehook/installation.mdx | 2 +- content/docs/guides/api-keys.mdx | 4 +- content/docs/guides/contributors-guide.mdx | 4 +- content/docs/guides/index.mdx | 2 +- content/docs/guides/installing-docker.mdx | 2 + content/docs/guides/rate-limiting.mdx | 4 +- content/docs/guides/sync-a-bitcoin-node.mdx | 2 + content/docs/stacks/api-keys.mdx | 4 +- .../docs/stacks/blockchain-development.mdx | 20 + ...hainhook-as-a-service-with-stacks-node.mdx | 0 .../chainhook-as-a-service.mdx | 0 .../observing-contract-calls.mdx | 55 +- .../register-chainhooks-on-devnet.mdx | 0 .../docs/stacks/chainhook/installation.mdx | 30 +- content/docs/stacks/chainhook/meta.json | 14 +- .../{concepts => }/predicate-design.mdx | 198 +- .../chainhook/references/scopes/bitcoin.mdx | 5 +- .../chainhook/references/scopes/stacks.mdx | 4 +- .../stacks/clarinet-js-sdk/installation.mdx | 2 +- .../references/custom-matchers.mdx | 170 +- .../clarinet-js-sdk/references/methods.mdx | 199 +- .../clarinet-js-sdk/references/properties.mdx | 33 +- .../clarinet-js-sdk/references/simnet.mdx | 19 +- .../{guides => examples}/add-a-contract.mdx | 0 .../create-a-new-project.mdx | 0 .../create-deployment-plans.mdx | 0 .../{guides => examples}/debug-a-contract.mdx | 0 .../deploy-a-contract.mdx | 0 .../{guides => examples}/estimate-costs.mdx | 0 .../run-a-local-devnet.mdx | 0 .../start-a-development-console.mdx | 0 .../validate-a-contract.mdx | 0 .../working-with-sbtc.mdx | 0 content/docs/stacks/clarinet/meta.json | 5 +- content/docs/stacks/clarinet/quickstart.mdx | 1 + content/docs/stacks/clarity/index.mdx | 1 + content/docs/stacks/clarity/meta.json | 1 - .../authenticate-users.mdx | 0 .../broadcast-transactions.mdx | 0 .../{guides => examples}/migration.mdx | 0 .../{guides => examples}/sign-messages.mdx | 0 content/docs/stacks/connect/meta.json | 12 +- .../docs/stacks/connect/packages/connect.mdx | 4 +- content/docs/stacks/contributors-guide.mdx | 4 +- content/docs/stacks/explorer/index.mdx | 2 +- content/docs/stacks/get-started.mdx | 121 +- content/docs/stacks/hacks/build-with-sbtc.mdx | 28 - content/docs/stacks/hacks/index.mdx | 8 +- content/docs/stacks/hacks/meta.json | 3 +- .../stacks/hacks/{archive => }/recipes.mdx | 0 content/docs/stacks/index.mdx | 2 +- .../guides => }/integration-testing.mdx | 0 content/docs/stacks/meta.json | 38 +- ...e-clarinet-sdk.mdx => migration-guide.mdx} | 2 +- .../{guides => examples}/archive-project.mdx | 0 .../contract-monitoring.mdx | 2 + .../create-chainhooks.mdx | 0 .../{guides => examples}/create-project.mdx | 0 .../{guides => examples}/deploy-contracts.mdx | 0 .../platform/{guides => examples}/devnet.mdx | 0 .../platform/{guides => examples}/faucet.mdx | 2 + content/docs/stacks/platform/meta.json | 11 +- .../docs/stacks/quickstarts/app-templates.mdx | 22 + .../stacks/quickstarts/contract-templates.mdx | 22 + .../stacks/quickstarts/event-streaming.mdx | 22 + content/docs/stacks/quickstarts/index.mdx | 117 + content/docs/stacks/quickstarts/meta.json | 14 + .../docs/stacks/quickstarts/nft-minting.mdx | 22 + .../stacks/quickstarts/token-transfers.mdx | 22 + .../stacks/quickstarts/wallet-integration.mdx | 22 + content/docs/stacks/rate-limiting.mdx | 6 +- content/docs/stacks/reference.mdx | 117 + .../clarinet-js-sdk/clarinet-sdk.mdx | 58 + .../clarinet-js-sdk/custom-matchers.mdx | 828 +++++++ .../reference/clarinet-js-sdk/methods.mdx | 2091 +++++++++++++++++ .../reference/clarinet-js-sdk/properties.mdx | 113 + .../reference/clarinet-js-sdk/simnet.mdx | 58 + .../docs/stacks/reference/cli/clarinet.mdx | 5 + .../docs/stacks/reference/cli/stacks-js.mdx | 10 + content/docs/stacks/reference/index.mdx | 117 + content/docs/stacks/reference/meta.json | 19 + .../stacks-blockchain-api/client.mdx | 35 + .../stacks/reference/stacks.js/common.mdx | 108 + .../stacks/reference/stacks.js/connect.mdx | 356 +++ .../stacks/reference/stacks.js/network.mdx | 71 + .../docs/stacks/reference/stacks.js/sbtc.mdx | 232 ++ .../reference/stacks.js/transactions.mdx | 498 ++++ content/docs/stacks/setup.mdx | 20 + .../stacks/smart-contract-development.mdx | 20 + .../broadcast-transactions.mdx | 0 .../{guides => examples}/post-conditions.mdx | 0 .../use-with-react-native.mdx | 0 content/docs/stacks/stacks.js/meta.json | 19 +- .../docs/stacks/stacks.js/packages/common.mdx | 4 +- .../stacks/stacks.js/packages/network.mdx | 4 +- .../stacks.js/packages/transactions.mdx | 4 +- content/docs/stacks/stacks.js/v6/network.mdx | 4 +- .../docs/stacks/stacks.js/v6/transactions.mdx | 4 +- .../docs/stacks/testing-best-practices.mdx | 241 ++ content/docs/stacks/testing-environments.mdx | 241 ++ content/docs/stacks/token-development.mdx | 20 + .../guides => }/unit-testing.mdx | 0 content/docs/stacks/web-app-development.mdx | 20 + 155 files changed, 6410 insertions(+), 822 deletions(-) create mode 100644 content/docs/bitcoin/api/index.mdx create mode 100644 content/docs/bitcoin/api/meta.json create mode 100644 content/docs/bitcoin/api/ordinals/brc20/get-brc20-activity.mdx create mode 100644 content/docs/bitcoin/api/ordinals/brc20/get-brc20-balances.mdx create mode 100644 content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-details.mdx create mode 100644 content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-holders.mdx create mode 100644 content/docs/bitcoin/api/ordinals/brc20/get-brc20-tokens.mdx create mode 100644 content/docs/bitcoin/api/ordinals/brc20/index.mdx create mode 100644 content/docs/bitcoin/api/ordinals/brc20/meta.json create mode 100644 content/docs/bitcoin/api/ordinals/info/index.mdx create mode 100644 content/docs/bitcoin/api/ordinals/info/meta.json create mode 100644 content/docs/bitcoin/api/ordinals/info/status.mdx create mode 100644 content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-content.mdx create mode 100644 content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-transfers.mdx create mode 100644 content/docs/bitcoin/api/ordinals/inscriptions/get-inscription.mdx create mode 100644 content/docs/bitcoin/api/ordinals/inscriptions/get-inscriptions.mdx create mode 100644 content/docs/bitcoin/api/ordinals/inscriptions/get-transfers-per-block.mdx create mode 100644 content/docs/bitcoin/api/ordinals/inscriptions/index.mdx create mode 100644 content/docs/bitcoin/api/ordinals/inscriptions/meta.json create mode 100644 content/docs/bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions.mdx create mode 100644 content/docs/bitcoin/api/ordinals/satoshis/get-satoshi.mdx create mode 100644 content/docs/bitcoin/api/ordinals/satoshis/index.mdx create mode 100644 content/docs/bitcoin/api/ordinals/satoshis/meta.json create mode 100644 content/docs/bitcoin/api/ordinals/statistics/get-stats-inscription-count.mdx create mode 100644 content/docs/bitcoin/api/ordinals/statistics/index.mdx create mode 100644 content/docs/bitcoin/api/ordinals/statistics/meta.json create mode 100644 content/docs/bitcoin/api/runes/activities/activity.mdx create mode 100644 content/docs/bitcoin/api/runes/activities/for-address.mdx create mode 100644 content/docs/bitcoin/api/runes/activities/for-block.mdx create mode 100644 content/docs/bitcoin/api/runes/activities/for-transaction.mdx create mode 100644 content/docs/bitcoin/api/runes/activities/index.mdx create mode 100644 content/docs/bitcoin/api/runes/activities/meta.json create mode 100644 content/docs/bitcoin/api/runes/balances/address.mdx create mode 100644 content/docs/bitcoin/api/runes/balances/holder-balance.mdx create mode 100644 content/docs/bitcoin/api/runes/balances/holders.mdx create mode 100644 content/docs/bitcoin/api/runes/balances/index.mdx create mode 100644 content/docs/bitcoin/api/runes/balances/meta.json create mode 100644 content/docs/bitcoin/api/runes/etchings/get-etching.mdx create mode 100644 content/docs/bitcoin/api/runes/etchings/get-etchings.mdx create mode 100644 content/docs/bitcoin/api/runes/etchings/index.mdx create mode 100644 content/docs/bitcoin/api/runes/etchings/meta.json create mode 100644 content/docs/bitcoin/api/runes/info/index.mdx create mode 100644 content/docs/bitcoin/api/runes/info/meta.json create mode 100644 content/docs/bitcoin/api/runes/info/status.mdx create mode 100644 content/docs/bitcoin/quickstarts/index.mdx create mode 100644 content/docs/bitcoin/quickstarts/meta.json create mode 100644 content/docs/stacks/blockchain-development.mdx rename content/docs/stacks/chainhook/{guides => examples}/chainhook-as-a-service-with-stacks-node.mdx (100%) rename content/docs/stacks/chainhook/{guides => examples}/chainhook-as-a-service.mdx (100%) rename content/docs/stacks/chainhook/{guides => examples}/observing-contract-calls.mdx (93%) rename content/docs/stacks/chainhook/{guides => examples}/register-chainhooks-on-devnet.mdx (100%) rename content/docs/stacks/chainhook/{concepts => }/predicate-design.mdx (67%) rename content/docs/stacks/clarinet/{guides => examples}/add-a-contract.mdx (100%) rename content/docs/stacks/clarinet/{guides => examples}/create-a-new-project.mdx (100%) rename content/docs/stacks/clarinet/{guides => examples}/create-deployment-plans.mdx (100%) rename content/docs/stacks/clarinet/{guides => examples}/debug-a-contract.mdx (100%) rename content/docs/stacks/clarinet/{guides => examples}/deploy-a-contract.mdx (100%) rename content/docs/stacks/clarinet/{guides => examples}/estimate-costs.mdx (100%) rename content/docs/stacks/clarinet/{guides => examples}/run-a-local-devnet.mdx (100%) rename content/docs/stacks/clarinet/{guides => examples}/start-a-development-console.mdx (100%) rename content/docs/stacks/clarinet/{guides => examples}/validate-a-contract.mdx (100%) rename content/docs/stacks/clarinet/{guides => examples}/working-with-sbtc.mdx (100%) rename content/docs/stacks/connect/{guides => examples}/authenticate-users.mdx (100%) rename content/docs/stacks/connect/{guides => examples}/broadcast-transactions.mdx (100%) rename content/docs/stacks/connect/{guides => examples}/migration.mdx (100%) rename content/docs/stacks/connect/{guides => examples}/sign-messages.mdx (100%) delete mode 100644 content/docs/stacks/hacks/build-with-sbtc.mdx rename content/docs/stacks/hacks/{archive => }/recipes.mdx (100%) rename content/docs/stacks/{clarinet-js-sdk/guides => }/integration-testing.mdx (100%) rename content/docs/stacks/{clarinet-js-sdk/guides/migrate-to-the-clarinet-sdk.mdx => migration-guide.mdx} (99%) rename content/docs/stacks/platform/{guides => examples}/archive-project.mdx (100%) rename content/docs/stacks/platform/{guides => examples}/contract-monitoring.mdx (99%) rename content/docs/stacks/platform/{guides => examples}/create-chainhooks.mdx (100%) rename content/docs/stacks/platform/{guides => examples}/create-project.mdx (100%) rename content/docs/stacks/platform/{guides => examples}/deploy-contracts.mdx (100%) rename content/docs/stacks/platform/{guides => examples}/devnet.mdx (100%) rename content/docs/stacks/platform/{guides => examples}/faucet.mdx (97%) create mode 100644 content/docs/stacks/quickstarts/app-templates.mdx create mode 100644 content/docs/stacks/quickstarts/contract-templates.mdx create mode 100644 content/docs/stacks/quickstarts/event-streaming.mdx create mode 100644 content/docs/stacks/quickstarts/index.mdx create mode 100644 content/docs/stacks/quickstarts/meta.json create mode 100644 content/docs/stacks/quickstarts/nft-minting.mdx create mode 100644 content/docs/stacks/quickstarts/token-transfers.mdx create mode 100644 content/docs/stacks/quickstarts/wallet-integration.mdx create mode 100644 content/docs/stacks/reference.mdx create mode 100644 content/docs/stacks/reference/clarinet-js-sdk/clarinet-sdk.mdx create mode 100644 content/docs/stacks/reference/clarinet-js-sdk/custom-matchers.mdx create mode 100644 content/docs/stacks/reference/clarinet-js-sdk/methods.mdx create mode 100644 content/docs/stacks/reference/clarinet-js-sdk/properties.mdx create mode 100644 content/docs/stacks/reference/clarinet-js-sdk/simnet.mdx create mode 100644 content/docs/stacks/reference/cli/clarinet.mdx create mode 100644 content/docs/stacks/reference/cli/stacks-js.mdx create mode 100644 content/docs/stacks/reference/index.mdx create mode 100644 content/docs/stacks/reference/meta.json create mode 100644 content/docs/stacks/reference/stacks-blockchain-api/client.mdx create mode 100644 content/docs/stacks/reference/stacks.js/common.mdx create mode 100644 content/docs/stacks/reference/stacks.js/connect.mdx create mode 100644 content/docs/stacks/reference/stacks.js/network.mdx create mode 100644 content/docs/stacks/reference/stacks.js/sbtc.mdx create mode 100644 content/docs/stacks/reference/stacks.js/transactions.mdx create mode 100644 content/docs/stacks/setup.mdx create mode 100644 content/docs/stacks/smart-contract-development.mdx rename content/docs/stacks/stacks.js/{guides => examples}/broadcast-transactions.mdx (100%) rename content/docs/stacks/stacks.js/{guides => examples}/post-conditions.mdx (100%) rename content/docs/stacks/stacks.js/{guides => examples}/use-with-react-native.mdx (100%) create mode 100644 content/docs/stacks/testing-best-practices.mdx create mode 100644 content/docs/stacks/testing-environments.mdx create mode 100644 content/docs/stacks/token-development.mdx rename content/docs/stacks/{clarinet-js-sdk/guides => }/unit-testing.mdx (100%) create mode 100644 content/docs/stacks/web-app-development.mdx diff --git a/content/docs/bitcoin/api-keys.mdx b/content/docs/bitcoin/api-keys.mdx index 6799efe2c..80e6538cf 100644 --- a/content/docs/bitcoin/api-keys.mdx +++ b/content/docs/bitcoin/api-keys.mdx @@ -3,6 +3,6 @@ title: API keys description: For developers who need API requests beyond the standard rate limits. --- -import ApiKeysContent from '@/snippets/api-keys.mdx'; +import ApiKeysContent from '@/content/_shared/api-keys.mdx'; -<ApiKeysContent /> +<ApiKeysContent components={props.components} /> diff --git a/content/docs/bitcoin/api/index.mdx b/content/docs/bitcoin/api/index.mdx new file mode 100644 index 000000000..d71c7ef72 --- /dev/null +++ b/content/docs/bitcoin/api/index.mdx @@ -0,0 +1,96 @@ +--- +title: APIs +description: The following guides cover ways to use Hiro tools to build apps on Stacks. +icon: API +full: true +--- + +import { Database, Ticket } from 'lucide-react'; +import { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon'; +import { SecondaryCard, SmallCard } from '@/components/card'; + +<div className='flex flex-col space-y-10'> + +<Cards> + <SecondaryCard + icon={<Database />} + href="/stacks/chainhook/quickstart" + title="Stream custom blockchain events" + description="Use Chainhook to filter & stream for contract deployments." + tag='Chainhook' + /> +</Cards> + +<div className='flex flex-col'> + +<h4 id="learn-by-example" className="text-[#595650] dark:text-[#8c877d] scroll-m-20"> + <a href="#learn-by-example" className="not-prose group text-sm uppercase">Learn by example</a> +</h4> + +--- + +<Cards> + <SmallCard + icon={<Shapes />} + href="/guides/build-an-nft-marketplace" + title="Build an NFT Marketplace" + description="Learn how to create and deploy your own NFT marketplace." + /> + {/* <SmallCard + icon={<DAO />} + href="/stacks/clarinet" + title="Launch a Decentralized Autonomous Organization (DAO)" + description="Discover the steps to creating your own DAO." + /> */} + <SmallCard + icon={<Ticket />} + href="/guides/no-loss-lottery" + title="Create a no-loss lottery pool" + description="Build a no-loss lottery pool that leverages stacking yield." + /> + <SmallCard + icon={<Plant />} + href="/guides/build-a-decentralized-kickstarter" + title="Build a decentralized Kickstarter" + description="Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party." + /> +</Cards> + +</div> + +<div className='flex flex-col'> + +<h4 id="installation-guides" className="text-[#595650] dark:text-[#8c877d] scroll-m-20"> + <a href="#installation-guides" className="not-prose group text-sm uppercase">Installation guides</a> +</h4> + +--- + +<Cards> + <SmallCard + icon={<BitcoinIcon />} + href="/guides/sync-a-bitcoin-node" + title="Sync a Bitcoin node" + description="Set up and run a Bitcoin node to run tools like Chainhook as a service." + /> + <SmallCard + icon={<StacksIcon />} + href="/guides/sync-a-stacks-node" + title="Sync a Stacks node" + description="Set up and run a Stacks node to use tools like Chainhook or spin up your own API." + /> + <SmallCard + icon={<Container />} + href="/guides/installing-docker" + title="Install and run Docker on your machine" + description="Essential for running a local development with Clarinet" + /> +</Cards> + +</div> + +<Callout type="tip"> +For more, check out our [guides](/guides) section. +</Callout> + +</div> diff --git a/content/docs/bitcoin/api/meta.json b/content/docs/bitcoin/api/meta.json new file mode 100644 index 000000000..64f9ff115 --- /dev/null +++ b/content/docs/bitcoin/api/meta.json @@ -0,0 +1,10 @@ +{ + "title": "APIs", + "root": true, + "pages": [ + "---Ordinals API---", + "...ordinals", + "---Runes API---", + "...runes" + ] +} diff --git a/content/docs/bitcoin/api/ordinals/brc20/get-brc20-activity.mdx b/content/docs/bitcoin/api/ordinals/brc20/get-brc20-activity.mdx new file mode 100644 index 000000000..f4bbba54b --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/brc20/get-brc20-activity.mdx @@ -0,0 +1,11 @@ +--- +title: Get BRC-20 activity +description: Retrieves BRC-20 activity filtered by ticker, address, operation, or block height. +full: true +--- + +<APIPage + document="./openapi/ordinals-api.json" + operations={[{ path: '/ordinals/v1/brc-20/activity', method: 'get' }]} + hasHead={false} +/> diff --git a/content/docs/bitcoin/api/ordinals/brc20/get-brc20-balances.mdx b/content/docs/bitcoin/api/ordinals/brc20/get-brc20-balances.mdx new file mode 100644 index 000000000..019363e4a --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/brc20/get-brc20-balances.mdx @@ -0,0 +1,11 @@ +--- +title: Get BRC-20 balances +description: Retrieves BRC-20 token balances for a Bitcoin address. +full: true +--- + +<APIPage + document="./openapi/ordinals-api.json" + operations={[{ path: '/ordinals/v1/brc-20/balances/{address}', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-details.mdx b/content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-details.mdx new file mode 100644 index 000000000..6425598bf --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-details.mdx @@ -0,0 +1,11 @@ +--- +title: Get BRC-20 token details +description: Retrieves information for a BRC-20 token, including supply and holders. +full: true +--- + +<APIPage + document="./openapi/ordinals-api.json" + operations={[{ path: '/ordinals/v1/brc-20/tokens/{ticker}', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-holders.mdx b/content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-holders.mdx new file mode 100644 index 000000000..b0048cacc --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-holders.mdx @@ -0,0 +1,11 @@ +--- +title: Get BRC-20 token holders +description: Retrieves a list of holders and their balances for a particular BRC-20 token. +full: true +--- + +<APIPage + document="./openapi/ordinals-api.json" + operations={[{ path: '/ordinals/v1/brc-20/tokens/{ticker}/holders', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/brc20/get-brc20-tokens.mdx b/content/docs/bitcoin/api/ordinals/brc20/get-brc20-tokens.mdx new file mode 100644 index 000000000..edd29f3d9 --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/brc20/get-brc20-tokens.mdx @@ -0,0 +1,11 @@ +--- +title: Get BRC-20 tokens +description: Retrieves information for BRC-20 tokens. +full: true +--- + +<APIPage + document="./openapi/ordinals-api.json" + operations={[{ path: '/ordinals/v1/brc-20/tokens', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/brc20/index.mdx b/content/docs/bitcoin/api/ordinals/brc20/index.mdx new file mode 100644 index 000000000..bb0d24b2a --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/brc20/index.mdx @@ -0,0 +1,6 @@ +--- +title: BRC-20 +index: true +full: true +description: Retrieves information about BRC-20 tokens. +--- diff --git a/content/docs/bitcoin/api/ordinals/brc20/meta.json b/content/docs/bitcoin/api/ordinals/brc20/meta.json new file mode 100644 index 000000000..42d7fa338 --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/brc20/meta.json @@ -0,0 +1,5 @@ +{ + "title": "BRC-20", + "pages": ["..."], + "defaultOpen": false +} \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/info/index.mdx b/content/docs/bitcoin/api/ordinals/info/index.mdx new file mode 100644 index 000000000..3062e329e --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/info/index.mdx @@ -0,0 +1,6 @@ +--- +title: Status +index: true +full: true +description: Retrieves information about the Ordinals API status, including the server version. +--- diff --git a/content/docs/bitcoin/api/ordinals/info/meta.json b/content/docs/bitcoin/api/ordinals/info/meta.json new file mode 100644 index 000000000..99aff65d8 --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/info/meta.json @@ -0,0 +1,5 @@ +{ + "title": "Status", + "pages": ["..."], + "defaultOpen": false +} \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/info/status.mdx b/content/docs/bitcoin/api/ordinals/info/status.mdx new file mode 100644 index 000000000..73696e143 --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/info/status.mdx @@ -0,0 +1,11 @@ +--- +title: Get API status +description: Retrieves the running status of the Ordinals API. +full: true +--- + +<APIPage + document="./openapi/ordinals-api.json" + operations={[{ path: '/ordinals/v1/', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-content.mdx b/content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-content.mdx new file mode 100644 index 000000000..1a561fb0a --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-content.mdx @@ -0,0 +1,11 @@ +--- +title: Get inscription content +description: Retrieves the content of a single inscription. +full: true +--- + +<APIPage + document="./openapi/ordinals-api.json" + operations={[{ path: '/ordinals/v1/inscriptions/{id}/content', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-transfers.mdx b/content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-transfers.mdx new file mode 100644 index 000000000..36d01db7c --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-transfers.mdx @@ -0,0 +1,11 @@ +--- +title: Get inscription transfers +description: Retrieves all transfers for a single inscription. +full: true +--- + +<APIPage + document="./openapi/ordinals-api.json" + operations={[{ path: '/ordinals/v1/inscriptions/{id}/transfers', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/inscriptions/get-inscription.mdx b/content/docs/bitcoin/api/ordinals/inscriptions/get-inscription.mdx new file mode 100644 index 000000000..b58eeb652 --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/inscriptions/get-inscription.mdx @@ -0,0 +1,11 @@ +--- +title: Get inscription +description: Retrieves a single inscription. +full: true +--- + +<APIPage + document="./openapi/ordinals-api.json" + operations={[{ path: '/ordinals/v1/inscriptions/{id}', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/inscriptions/get-inscriptions.mdx b/content/docs/bitcoin/api/ordinals/inscriptions/get-inscriptions.mdx new file mode 100644 index 000000000..0a56fb4db --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/inscriptions/get-inscriptions.mdx @@ -0,0 +1,11 @@ +--- +title: Get inscriptions +description: Retrieves a list of inscriptions with options to filter and sort results. +full: true +--- + +<APIPage + document="./openapi/ordinals-api.json" + operations={[{ path: '/ordinals/v1/inscriptions', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/inscriptions/get-transfers-per-block.mdx b/content/docs/bitcoin/api/ordinals/inscriptions/get-transfers-per-block.mdx new file mode 100644 index 000000000..a3c94274f --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/inscriptions/get-transfers-per-block.mdx @@ -0,0 +1,11 @@ +--- +title: Get transfers per block +description: Retrieves a list of inscription transfers that ocurred at a specific Bitcoin block. +full: true +--- + +<APIPage + document="./openapi/ordinals-api.json" + operations={[{ path: '/ordinals/v1/inscriptions/transfers', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/inscriptions/index.mdx b/content/docs/bitcoin/api/ordinals/inscriptions/index.mdx new file mode 100644 index 000000000..0d9f50aec --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/inscriptions/index.mdx @@ -0,0 +1,6 @@ +--- +title: Inscriptions +index: true +full: true +description: Retrieves information about Ordinals inscriptions. +--- diff --git a/content/docs/bitcoin/api/ordinals/inscriptions/meta.json b/content/docs/bitcoin/api/ordinals/inscriptions/meta.json new file mode 100644 index 000000000..8c9647df2 --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/inscriptions/meta.json @@ -0,0 +1,5 @@ +{ + "title": "Inscriptions", + "pages": ["..."], + "defaultOpen": false +} \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions.mdx b/content/docs/bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions.mdx new file mode 100644 index 000000000..9e7fb32d2 --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions.mdx @@ -0,0 +1,11 @@ +--- +title: Get satoshi inscriptions +description: Retrieves all inscriptions associated with a single satoshi. +full: true +--- + +<APIPage + document="./openapi/ordinals-api.json" + operations={[{ path: '/ordinals/v1/sats/{ordinal}/inscriptions', method: 'get' }]} + hasHead={false} +/> diff --git a/content/docs/bitcoin/api/ordinals/satoshis/get-satoshi.mdx b/content/docs/bitcoin/api/ordinals/satoshis/get-satoshi.mdx new file mode 100644 index 000000000..f07b47a3a --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/satoshis/get-satoshi.mdx @@ -0,0 +1,11 @@ +--- +title: Get satoshi ordinal +description: Retrieves ordinal information for a single satoshi. +full: true +--- + +<APIPage + document="./openapi/ordinals-api.json" + operations={[{ path: '/ordinals/v1/sats/{ordinal}', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/satoshis/index.mdx b/content/docs/bitcoin/api/ordinals/satoshis/index.mdx new file mode 100644 index 000000000..d1053cf27 --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/satoshis/index.mdx @@ -0,0 +1,6 @@ +--- +title: Satoshis +index: true +full: true +description: Retrieves ordinal information for satoshis. +--- diff --git a/content/docs/bitcoin/api/ordinals/satoshis/meta.json b/content/docs/bitcoin/api/ordinals/satoshis/meta.json new file mode 100644 index 000000000..ccef2faec --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/satoshis/meta.json @@ -0,0 +1,5 @@ +{ + "title": "Satoshis", + "pages": ["..."], + "defaultOpen": false +} \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/statistics/get-stats-inscription-count.mdx b/content/docs/bitcoin/api/ordinals/statistics/get-stats-inscription-count.mdx new file mode 100644 index 000000000..bf177dcec --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/statistics/get-stats-inscription-count.mdx @@ -0,0 +1,11 @@ +--- +title: Get inscription count per block +description: Retrieves statistics on the number of inscriptions revealed per block. +full: true +--- + +<APIPage + document="./openapi/ordinals-api.json" + operations={[{ path: '/ordinals/v1/stats/inscriptions', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/ordinals/statistics/index.mdx b/content/docs/bitcoin/api/ordinals/statistics/index.mdx new file mode 100644 index 000000000..11a0a94e4 --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/statistics/index.mdx @@ -0,0 +1,6 @@ +--- +title: Statistics +index: true +full: true +description: Retrieves stats on the number of inscriptions per block. +--- diff --git a/content/docs/bitcoin/api/ordinals/statistics/meta.json b/content/docs/bitcoin/api/ordinals/statistics/meta.json new file mode 100644 index 000000000..cc16e0a6d --- /dev/null +++ b/content/docs/bitcoin/api/ordinals/statistics/meta.json @@ -0,0 +1,5 @@ +{ + "title": "Statistics", + "pages": ["..."], + "defaultOpen": false +} \ No newline at end of file diff --git a/content/docs/bitcoin/api/runes/activities/activity.mdx b/content/docs/bitcoin/api/runes/activities/activity.mdx new file mode 100644 index 000000000..7f6513f78 --- /dev/null +++ b/content/docs/bitcoin/api/runes/activities/activity.mdx @@ -0,0 +1,11 @@ +--- +title: Get all activity +description: Retrieves all activity for a Rune. +full: true +--- + +<APIPage + document="./openapi/runes-api.json" + operations={[{ path: '/runes/v1/etchings/{etching}/activity', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/runes/activities/for-address.mdx b/content/docs/bitcoin/api/runes/activities/for-address.mdx new file mode 100644 index 000000000..d9d4b1d73 --- /dev/null +++ b/content/docs/bitcoin/api/runes/activities/for-address.mdx @@ -0,0 +1,11 @@ +--- +title: Get activity for an address +description: Retrieves all Rune activity for a Bitcoin address. +full: true +--- + +<APIPage + document="./openapi/runes-api.json" + operations={[{ path: '/runes/v1/etchings/{etching}/activity/{address}', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/runes/activities/for-block.mdx b/content/docs/bitcoin/api/runes/activities/for-block.mdx new file mode 100644 index 000000000..0473ff214 --- /dev/null +++ b/content/docs/bitcoin/api/runes/activities/for-block.mdx @@ -0,0 +1,11 @@ +--- +title: Get activity for a block +description: Retrieves a paginated list of rune activity for a block. +full: true +--- + +<APIPage + document="./openapi/runes-api.json" + operations={[{ path: '/runes/v1/blocks/{block}/activity', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/runes/activities/for-transaction.mdx b/content/docs/bitcoin/api/runes/activities/for-transaction.mdx new file mode 100644 index 000000000..3b3b9c1e2 --- /dev/null +++ b/content/docs/bitcoin/api/runes/activities/for-transaction.mdx @@ -0,0 +1,11 @@ +--- +title: Get activity for a transaction +description: Retrieves a paginated list of rune activity for a transaction. +full: true +--- + +<APIPage + document="./openapi/runes-api.json" + operations={[{ path: '/runes/v1/transactions/{tx_id}/activity', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/runes/activities/index.mdx b/content/docs/bitcoin/api/runes/activities/index.mdx new file mode 100644 index 000000000..bfdc06ca7 --- /dev/null +++ b/content/docs/bitcoin/api/runes/activities/index.mdx @@ -0,0 +1,6 @@ +--- +title: Activities +index: true +full: true +description: Retrieves information about Rune activities. +--- diff --git a/content/docs/bitcoin/api/runes/activities/meta.json b/content/docs/bitcoin/api/runes/activities/meta.json new file mode 100644 index 000000000..ffa2df90f --- /dev/null +++ b/content/docs/bitcoin/api/runes/activities/meta.json @@ -0,0 +1,5 @@ +{ + "title": "Activities", + "pages": ["..."], + "defaultOpen": false +} \ No newline at end of file diff --git a/content/docs/bitcoin/api/runes/balances/address.mdx b/content/docs/bitcoin/api/runes/balances/address.mdx new file mode 100644 index 000000000..ee832f6e3 --- /dev/null +++ b/content/docs/bitcoin/api/runes/balances/address.mdx @@ -0,0 +1,11 @@ +--- +title: Get address balances +description: Retrieves a paginated list of address balances. +full: true +--- + +<APIPage + document="./openapi/runes-api.json" + operations={[{ path: '/runes/v1/addresses/{address}/balances', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/runes/balances/holder-balance.mdx b/content/docs/bitcoin/api/runes/balances/holder-balance.mdx new file mode 100644 index 000000000..d046deefd --- /dev/null +++ b/content/docs/bitcoin/api/runes/balances/holder-balance.mdx @@ -0,0 +1,11 @@ +--- +title: Get holder balance +description: Retrieves holder balance for a specific Rune. +full: true +--- + +<APIPage + document="./openapi/runes-api.json" + operations={[{ path: '/runes/v1/etchings/{etching}/holders/{address}', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/runes/balances/holders.mdx b/content/docs/bitcoin/api/runes/balances/holders.mdx new file mode 100644 index 000000000..6a807cc79 --- /dev/null +++ b/content/docs/bitcoin/api/runes/balances/holders.mdx @@ -0,0 +1,11 @@ +--- +title: Get rune holders +description: Retrieves a paginated list of holders for a Rune. +full: true +--- + +<APIPage + document="./openapi/runes-api.json" + operations={[{ path: '/runes/v1/etchings/{etching}/holders', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/runes/balances/index.mdx b/content/docs/bitcoin/api/runes/balances/index.mdx new file mode 100644 index 000000000..bb73ce112 --- /dev/null +++ b/content/docs/bitcoin/api/runes/balances/index.mdx @@ -0,0 +1,6 @@ +--- +title: Balances +index: true +full: true +description: Retrieves information about Rune balances. +--- diff --git a/content/docs/bitcoin/api/runes/balances/meta.json b/content/docs/bitcoin/api/runes/balances/meta.json new file mode 100644 index 000000000..8c31ed11f --- /dev/null +++ b/content/docs/bitcoin/api/runes/balances/meta.json @@ -0,0 +1,5 @@ +{ + "title": "Balances", + "pages": ["..."], + "defaultOpen": false +} \ No newline at end of file diff --git a/content/docs/bitcoin/api/runes/etchings/get-etching.mdx b/content/docs/bitcoin/api/runes/etchings/get-etching.mdx new file mode 100644 index 000000000..95c4d2526 --- /dev/null +++ b/content/docs/bitcoin/api/runes/etchings/get-etching.mdx @@ -0,0 +1,11 @@ +--- +title: Get etching +description: Retrieves information for a Rune etching. +full: true +--- + +<APIPage + document="./openapi/runes-api.json" + operations={[{ path: '/runes/v1/etchings/{etching}', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/runes/etchings/get-etchings.mdx b/content/docs/bitcoin/api/runes/etchings/get-etchings.mdx new file mode 100644 index 000000000..ecb2311e1 --- /dev/null +++ b/content/docs/bitcoin/api/runes/etchings/get-etchings.mdx @@ -0,0 +1,11 @@ +--- +title: Get etchings +description: Retrieves a paginated list of rune etchings. +full: true +--- + +<APIPage + document="./openapi/runes-api.json" + operations={[{ path: '/runes/v1/etchings', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/api/runes/etchings/index.mdx b/content/docs/bitcoin/api/runes/etchings/index.mdx new file mode 100644 index 000000000..b967d8712 --- /dev/null +++ b/content/docs/bitcoin/api/runes/etchings/index.mdx @@ -0,0 +1,6 @@ +--- +title: Etchings +index: true +full: true +description: Retrieves information about Rune etchings. +--- diff --git a/content/docs/bitcoin/api/runes/etchings/meta.json b/content/docs/bitcoin/api/runes/etchings/meta.json new file mode 100644 index 000000000..ab252ab1a --- /dev/null +++ b/content/docs/bitcoin/api/runes/etchings/meta.json @@ -0,0 +1,5 @@ +{ + "title": "Etchings", + "pages": ["..."], + "defaultOpen": false +} \ No newline at end of file diff --git a/content/docs/bitcoin/api/runes/info/index.mdx b/content/docs/bitcoin/api/runes/info/index.mdx new file mode 100644 index 000000000..294c0490a --- /dev/null +++ b/content/docs/bitcoin/api/runes/info/index.mdx @@ -0,0 +1,6 @@ +--- +title: Status +index: true +full: true +description: Retrieves information about the Rune API status. +--- diff --git a/content/docs/bitcoin/api/runes/info/meta.json b/content/docs/bitcoin/api/runes/info/meta.json new file mode 100644 index 000000000..99aff65d8 --- /dev/null +++ b/content/docs/bitcoin/api/runes/info/meta.json @@ -0,0 +1,5 @@ +{ + "title": "Status", + "pages": ["..."], + "defaultOpen": false +} \ No newline at end of file diff --git a/content/docs/bitcoin/api/runes/info/status.mdx b/content/docs/bitcoin/api/runes/info/status.mdx new file mode 100644 index 000000000..fe42ff81f --- /dev/null +++ b/content/docs/bitcoin/api/runes/info/status.mdx @@ -0,0 +1,11 @@ +--- +title: Get API Status +description: Retrieves the status of the API. +full: true +--- + +<APIPage + document="./openapi/runes-api.json" + operations={[{ path: '/runes/v1/', method: 'get' }]} + hasHead={false} +/> \ No newline at end of file diff --git a/content/docs/bitcoin/contributors-guide.mdx b/content/docs/bitcoin/contributors-guide.mdx index 1848ec856..0178a8f40 100644 --- a/content/docs/bitcoin/contributors-guide.mdx +++ b/content/docs/bitcoin/contributors-guide.mdx @@ -3,6 +3,6 @@ title: Contributors guide description: Learn how to contribute to Hiro's documentation and content. --- -import ContributorsGuideContent from '@/snippets/contributors-guide.mdx'; +import ContributorsGuideContent from '@/content/_shared/contributors-guide.mdx'; -<ContributorsGuideContent /> +<ContributorsGuideContent components={props.components} /> diff --git a/content/docs/bitcoin/get-started.mdx b/content/docs/bitcoin/get-started.mdx index fa6cbf61b..ac56ac522 100644 --- a/content/docs/bitcoin/get-started.mdx +++ b/content/docs/bitcoin/get-started.mdx @@ -2,7 +2,7 @@ title: Get started description: The following guides cover ways to use Hiro tools to build with Ordinals, BRC-20, and Runes. icon: Play -toc: false +full: true --- import { SecondaryCard, SmallCard } from '@/components/card'; diff --git a/content/docs/bitcoin/index.mdx b/content/docs/bitcoin/index.mdx index 5498714fc..7236e57af 100644 --- a/content/docs/bitcoin/index.mdx +++ b/content/docs/bitcoin/index.mdx @@ -1,7 +1,7 @@ --- title: Home icon: BitcoinIcon -toc: false +full: true --- import { Card, SmallCard } from '@/components/card'; diff --git a/content/docs/bitcoin/meta.json b/content/docs/bitcoin/meta.json index 301226879..6ad249dd9 100644 --- a/content/docs/bitcoin/meta.json +++ b/content/docs/bitcoin/meta.json @@ -3,15 +3,9 @@ "root": true, "pages": [ "index", - "get-started", - "---Tools---", - "indexer", - "---APIs---", - "ordinals/api", - "runes/api", - "api-keys", - "rate-limiting", - "------", - "contributors-guide" + "quickstarts", + "api", + "---Get started---", + "indexer/index" ] } diff --git a/content/docs/bitcoin/quickstarts/index.mdx b/content/docs/bitcoin/quickstarts/index.mdx new file mode 100644 index 000000000..6ed08f3c5 --- /dev/null +++ b/content/docs/bitcoin/quickstarts/index.mdx @@ -0,0 +1,117 @@ +--- +title: Quickstarts +description: The following guides cover ways to use Hiro tools to build apps on Stacks. +icon: Play +full: true +--- + +import { Database, Ticket } from 'lucide-react'; +import { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon'; +import { SecondaryCard, SmallCard } from '@/components/card'; + +<div className='flex flex-col space-y-10'> + +<Cards> + <SecondaryCard + icon={<Clarinet />} + href="/stacks/clarinet/quickstart" + title="Create your first smart contract" + description="Build a simple counter contract using Clarinet." + tag='Clarinet' + /> + <SecondaryCard + icon={<Blockchain />} + href="/stacks/clarinet-js-sdk/quickstart" + title="Write unit tests for your smart contracts" + description="Learn how run unit tests with Clarinet JS SDK." + tag='Clarinet JS SDK' + /> + <SecondaryCard + icon={<Js />} + href="/stacks/stacks.js/quickstart" + title="Make a contract call with Stacks.js" + description="Learn how to integrate smart contracts into your app." + tag='Stacks.js' + /> + <SecondaryCard + icon={<Database />} + href="/stacks/chainhook/quickstart" + title="Stream custom blockchain events" + description="Use Chainhook to filter & stream for contract deployments." + tag='Chainhook' + /> +</Cards> + +<div className='flex flex-col'> + +<h4 id="learn-by-example" className="text-[#595650] dark:text-[#8c877d] scroll-m-20"> + <a href="#learn-by-example" className="not-prose group text-sm uppercase">Learn by example</a> +</h4> + +--- + +<Cards> + <SmallCard + icon={<Shapes />} + href="/guides/build-an-nft-marketplace" + title="Build an NFT Marketplace" + description="Learn how to create and deploy your own NFT marketplace." + /> + {/* <SmallCard + icon={<DAO />} + href="/stacks/clarinet" + title="Launch a Decentralized Autonomous Organization (DAO)" + description="Discover the steps to creating your own DAO." + /> */} + <SmallCard + icon={<Ticket />} + href="/guides/no-loss-lottery" + title="Create a no-loss lottery pool" + description="Build a no-loss lottery pool that leverages stacking yield." + /> + <SmallCard + icon={<Plant />} + href="/guides/build-a-decentralized-kickstarter" + title="Build a decentralized Kickstarter" + description="Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party." + /> +</Cards> + +</div> + +<div className='flex flex-col'> + +<h4 id="installation-guides" className="text-[#595650] dark:text-[#8c877d] scroll-m-20"> + <a href="#installation-guides" className="not-prose group text-sm uppercase">Installation guides</a> +</h4> + +--- + +<Cards> + <SmallCard + icon={<BitcoinIcon />} + href="/guides/sync-a-bitcoin-node" + title="Sync a Bitcoin node" + description="Set up and run a Bitcoin node to run tools like Chainhook as a service." + /> + <SmallCard + icon={<StacksIcon />} + href="/guides/sync-a-stacks-node" + title="Sync a Stacks node" + description="Set up and run a Stacks node to use tools like Chainhook or spin up your own API." + /> + <SmallCard + icon={<Container />} + href="/guides/installing-docker" + title="Install and run Docker on your machine" + description="Essential for running a local development with Clarinet" + /> +</Cards> + +</div> + +<Callout type="tip"> +For more, check out our [guides](/guides) section. +</Callout> + +</div> diff --git a/content/docs/bitcoin/quickstarts/meta.json b/content/docs/bitcoin/quickstarts/meta.json new file mode 100644 index 000000000..164b8a029 --- /dev/null +++ b/content/docs/bitcoin/quickstarts/meta.json @@ -0,0 +1,8 @@ +{ + "title": "Quickstarts", + "root": true, + "pages": [ + "---Get started---", + "../get-started" + ] +} \ No newline at end of file diff --git a/content/docs/bitcoin/rate-limiting.mdx b/content/docs/bitcoin/rate-limiting.mdx index 8f07a848b..c42dd9c59 100644 --- a/content/docs/bitcoin/rate-limiting.mdx +++ b/content/docs/bitcoin/rate-limiting.mdx @@ -1,8 +1,8 @@ --- title: Rate limiting -description: Understand the rate limits for Hiro APIs and testnet faucets. +description: Understand the rate limits for Hiro APIs and the STX Faucet. --- -import RateLimitingContent from '@/snippets/rate-limiting.mdx'; +import RateLimitingContent from '@/content/_shared/rate-limiting.mdx'; -<RateLimitingContent /> +<RateLimitingContent components={props.components} /> diff --git a/content/docs/bitcoin/runes/runehook/installation.mdx b/content/docs/bitcoin/runes/runehook/installation.mdx index 97a2e068c..2d95c9215 100644 --- a/content/docs/bitcoin/runes/runehook/installation.mdx +++ b/content/docs/bitcoin/runes/runehook/installation.mdx @@ -1,7 +1,7 @@ --- title: Installation description: Runehook was developed to be environment-agnostic. Below are the different ways to install and build the Bitcoin Indexer on your machine. -toc: false +full: true --- Clone the [Runehook repository](https://github.com/hirosystems/runehook) to your local machine and install via `cargo`. diff --git a/content/docs/guides/api-keys.mdx b/content/docs/guides/api-keys.mdx index 6799efe2c..80e6538cf 100644 --- a/content/docs/guides/api-keys.mdx +++ b/content/docs/guides/api-keys.mdx @@ -3,6 +3,6 @@ title: API keys description: For developers who need API requests beyond the standard rate limits. --- -import ApiKeysContent from '@/snippets/api-keys.mdx'; +import ApiKeysContent from '@/content/_shared/api-keys.mdx'; -<ApiKeysContent /> +<ApiKeysContent components={props.components} /> diff --git a/content/docs/guides/contributors-guide.mdx b/content/docs/guides/contributors-guide.mdx index 1848ec856..0178a8f40 100644 --- a/content/docs/guides/contributors-guide.mdx +++ b/content/docs/guides/contributors-guide.mdx @@ -3,6 +3,6 @@ title: Contributors guide description: Learn how to contribute to Hiro's documentation and content. --- -import ContributorsGuideContent from '@/snippets/contributors-guide.mdx'; +import ContributorsGuideContent from '@/content/_shared/contributors-guide.mdx'; -<ContributorsGuideContent /> +<ContributorsGuideContent components={props.components} /> diff --git a/content/docs/guides/index.mdx b/content/docs/guides/index.mdx index f30f85a7d..a0a3de186 100644 --- a/content/docs/guides/index.mdx +++ b/content/docs/guides/index.mdx @@ -7,7 +7,7 @@ import Link from "fumadocs-core/link"; import { ImageZoom } from 'fumadocs-ui/components/image-zoom'; import { SecondaryCard } from "@/components/card" import guidesImage from '@/public/guides.svg'; -import data from '@/utils/all-guides.json'; +import data from '@/lib/all-guides.json'; <div className='flex flex-col space-y-10'> <div className='flex space-x-6 items-end'> diff --git a/content/docs/guides/installing-docker.mdx b/content/docs/guides/installing-docker.mdx index ea13effcd..47a440835 100644 --- a/content/docs/guides/installing-docker.mdx +++ b/content/docs/guides/installing-docker.mdx @@ -3,6 +3,8 @@ title: How to install Docker description: Install Docker to run a local devnet. --- +import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; + <Tabs id="docker" items={['macOS', 'Windows']}> <Tab value="macOS"> 1. Go to the [Docker Desktop for Mac](https://www.docker.com/products/docker-desktop/) page. diff --git a/content/docs/guides/rate-limiting.mdx b/content/docs/guides/rate-limiting.mdx index 6fd441850..c42dd9c59 100644 --- a/content/docs/guides/rate-limiting.mdx +++ b/content/docs/guides/rate-limiting.mdx @@ -3,6 +3,6 @@ title: Rate limiting description: Understand the rate limits for Hiro APIs and the STX Faucet. --- -import RateLimitingContent from '@/snippets/rate-limiting.mdx'; +import RateLimitingContent from '@/content/_shared/rate-limiting.mdx'; -<RateLimitingContent /> +<RateLimitingContent components={props.components} /> diff --git a/content/docs/guides/sync-a-bitcoin-node.mdx b/content/docs/guides/sync-a-bitcoin-node.mdx index b3c01de2a..0450b36f0 100644 --- a/content/docs/guides/sync-a-bitcoin-node.mdx +++ b/content/docs/guides/sync-a-bitcoin-node.mdx @@ -4,6 +4,8 @@ description: Learn how to sync a Bitcoin node for building Bitcoin applications. --- import { InlineCode } from '@/components/inline-code'; +import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; +import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; Syncing a Bitcoin node is often one of the first steps a developer takes when building a Bitcoin application. It's a great introduction to the Bitcoin developer ecosystem, and if you're relying on on-chain data, there's no safer way to get that data than doing it yourself. diff --git a/content/docs/stacks/api-keys.mdx b/content/docs/stacks/api-keys.mdx index 6799efe2c..80e6538cf 100644 --- a/content/docs/stacks/api-keys.mdx +++ b/content/docs/stacks/api-keys.mdx @@ -3,6 +3,6 @@ title: API keys description: For developers who need API requests beyond the standard rate limits. --- -import ApiKeysContent from '@/snippets/api-keys.mdx'; +import ApiKeysContent from '@/content/_shared/api-keys.mdx'; -<ApiKeysContent /> +<ApiKeysContent components={props.components} /> diff --git a/content/docs/stacks/blockchain-development.mdx b/content/docs/stacks/blockchain-development.mdx new file mode 100644 index 000000000..c65533165 --- /dev/null +++ b/content/docs/stacks/blockchain-development.mdx @@ -0,0 +1,20 @@ +--- +title: Blockchain development +description: Build your blockchain on Stacks. +--- + +import { SecondaryCard } from '@/components/card'; + +LFG! + +## Related tools + +- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks. +- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality. +- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API. + +<br /> + +<Callout title="Need help building with Clarinet JS SDK?" type="help"> +Reach out to us on the <span className="font-bold">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET. +</Callout> \ No newline at end of file diff --git a/content/docs/stacks/chainhook/guides/chainhook-as-a-service-with-stacks-node.mdx b/content/docs/stacks/chainhook/examples/chainhook-as-a-service-with-stacks-node.mdx similarity index 100% rename from content/docs/stacks/chainhook/guides/chainhook-as-a-service-with-stacks-node.mdx rename to content/docs/stacks/chainhook/examples/chainhook-as-a-service-with-stacks-node.mdx diff --git a/content/docs/stacks/chainhook/guides/chainhook-as-a-service.mdx b/content/docs/stacks/chainhook/examples/chainhook-as-a-service.mdx similarity index 100% rename from content/docs/stacks/chainhook/guides/chainhook-as-a-service.mdx rename to content/docs/stacks/chainhook/examples/chainhook-as-a-service.mdx diff --git a/content/docs/stacks/chainhook/guides/observing-contract-calls.mdx b/content/docs/stacks/chainhook/examples/observing-contract-calls.mdx similarity index 93% rename from content/docs/stacks/chainhook/guides/observing-contract-calls.mdx rename to content/docs/stacks/chainhook/examples/observing-contract-calls.mdx index 53974a9b5..340aef2b0 100644 --- a/content/docs/stacks/chainhook/guides/observing-contract-calls.mdx +++ b/content/docs/stacks/chainhook/examples/observing-contract-calls.mdx @@ -106,35 +106,38 @@ Using `file_append`, specify the path where Chainhook will post the payload data } ``` -<Accordions> - <Accordion title={"Full predicate file"}> - ```json - { - "chain": "stacks", - "uuid": "1", - "name": "Contract-Call-Chainhook", - "version": 1, - "networks": { - "testnet": { - "start_block": 21443, - "decode_clarity_values": true, - "expire_after_occurrence": 1, - "if_this": { - "scope": "contract_call", - "contract_identifier": "STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0", - "method": "cast-vote" - }, - "then_that": { - "file_append": { - "path": "/tmp/events.json" +<Accordion type="single" collapsible className="w-full"> + <AccordionItem value="full-predicate"> + <AccordionTrigger>Full predicate file</AccordionTrigger> + <AccordionContent> + ```json + { + "chain": "stacks", + "uuid": "1", + "name": "Contract-Call-Chainhook", + "version": 1, + "networks": { + "testnet": { + "start_block": 21443, + "decode_clarity_values": true, + "expire_after_occurrence": 1, + "if_this": { + "scope": "contract_call", + "contract_identifier": "STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0", + "method": "cast-vote" + }, + "then_that": { + "file_append": { + "path": "/tmp/events.json" + } + } } } } - } - } - ``` - </Accordion> -</Accordions> + ``` + </AccordionContent> + </AccordionItem> +</Accordion> <Callout title="Note"> diff --git a/content/docs/stacks/chainhook/guides/register-chainhooks-on-devnet.mdx b/content/docs/stacks/chainhook/examples/register-chainhooks-on-devnet.mdx similarity index 100% rename from content/docs/stacks/chainhook/guides/register-chainhooks-on-devnet.mdx rename to content/docs/stacks/chainhook/examples/register-chainhooks-on-devnet.mdx diff --git a/content/docs/stacks/chainhook/installation.mdx b/content/docs/stacks/chainhook/installation.mdx index df6870beb..fa143bc39 100644 --- a/content/docs/stacks/chainhook/installation.mdx +++ b/content/docs/stacks/chainhook/installation.mdx @@ -1,29 +1,36 @@ --- title: Installation description: Chainhook is a CLI tool that allows you to create event streams for your Stacks and Bitcoin nodes. -toc: false +full: true --- -<Tabs id="os" items={['macOS', 'Linux', 'Windows', 'Using Cargo']} className='border-secondary'> - <Tab value="macOS"> +<Tabs defaultValue="macos"> + <TabsList> + <TabsTrigger value="macos">macOS</TabsTrigger> + <TabsTrigger value="linux">Linux</TabsTrigger> + <TabsTrigger value="windows">Windows</TabsTrigger> + <TabsTrigger value="cargo">Using Cargo</TabsTrigger> + </TabsList> + + <TabsContent value="macos"> ```terminal $ brew install chainhook ``` - </Tab> - - <Tab value="Linux"> + </TabsContent> + + <TabsContent value="linux"> ```terminal $ sudo snap install chainhook ``` - </Tab> + </TabsContent> - <Tab value="Windows"> + <TabsContent value="windows"> ```terminal $ winget install HiroSystems.Chainhook ``` - </Tab> + </TabsContent> - <Tab value="Using Cargo"> + <TabsContent value="cargo"> Clone the [Chainhook Repo](https://github.com/hirosystems/chainhook): ```terminal @@ -35,6 +42,5 @@ toc: false ```terminal $ cd chainhook && cargo chainhook-install ``` - - </Tab> + </TabsContent> </Tabs> \ No newline at end of file diff --git a/content/docs/stacks/chainhook/meta.json b/content/docs/stacks/chainhook/meta.json index 1a0ce2b79..cf0756f8f 100644 --- a/content/docs/stacks/chainhook/meta.json +++ b/content/docs/stacks/chainhook/meta.json @@ -1,20 +1,10 @@ { "title": "Chainhook", - "root": true, "pages": [ - "---Chainhook---", "index", "installation", "quickstart", - "---Concepts---", - "concepts/predicate-design", - "---Guides---", - "guides/register-chainhooks-on-devnet", - "guides/chainhook-as-a-service", - "guides/chainhook-as-a-service-with-stacks-node", - "guides/observing-contract-calls", - "---Reference---", - "references/scopes/bitcoin", - "references/scopes/stacks" + "predicate-design", + "...examples" ] } \ No newline at end of file diff --git a/content/docs/stacks/chainhook/concepts/predicate-design.mdx b/content/docs/stacks/chainhook/predicate-design.mdx similarity index 67% rename from content/docs/stacks/chainhook/concepts/predicate-design.mdx rename to content/docs/stacks/chainhook/predicate-design.mdx index 305c29243..8b37393a3 100644 --- a/content/docs/stacks/chainhook/concepts/predicate-design.mdx +++ b/content/docs/stacks/chainhook/predicate-design.mdx @@ -110,9 +110,13 @@ When using `http_post`, specify the endpoint's `url` and `authorization_header`. ## Blockchain specific configurations -<Tabs id="blockchain" items={["Bitcoin predicate", "Stacks predicate"]}> - <Tab value="Bitcoin predicate"> +<Tabs defaultValue="bitcoin"> + <TabsList> + <TabsTrigger value="bitcoin">Bitcoin predicate</TabsTrigger> + <TabsTrigger value="stacks">Stacks predicate</TabsTrigger> + </TabsList> + <TabsContent value="bitcoin"> ```json { "chain": "bitcoin", @@ -150,73 +154,66 @@ When using `http_post`, specify the endpoint's `url` and `authorization_header`. } } } - ``` - - <Accordions> - <Accordion title="Additional Bitcoin predicate configurations"> - The following additional configurations can be used to improve the performance of Chainhook by preventing a full scan of the blockchain. - - Ignore any block before the given block: - - ```json - "start_block": 101 - ``` - - Ignore any block after the given block: - - ```json - "end_block": 201 - ``` - - Stop evaluating a chainhook after a given number of occurrences are found: - - ```json - "expire_after_occurrence": 1 - ``` - - Don't include proofs: - - ```json - "include_proof": false - ``` - - Don't include proofs: - - ```json - "include_proof": false - ``` - - Don't include Bitcoin transaction inputs in the payload: - - ```json - "include_inputs": false - ``` - - Don't include Bitcoin transaction outputs in the payload: - - ```json - "include_outputs": false - ``` - - Don't include Bitcoin transaction outputs in the payload: - - ```json - "include_outputs": false - ``` - - Don't include Bitcoin transaction witnesses in the payload: - - ```json - "include_witness": false - ``` - - Don't include Bitcoin transaction witnesses in the payload: + ``` - ```json - "include_witness": false - ``` - </Accordion> - </Accordions> + <Accordion type="single" collapsible className="w-full"> + <AccordionItem value="start-block"> + <AccordionTrigger>Ignore blocks before start block</AccordionTrigger> + <AccordionContent> + ```json + "start_block": 101 + ``` + </AccordionContent> + </AccordionItem> + <AccordionItem value="end-block"> + <AccordionTrigger>Ignore blocks after end block</AccordionTrigger> + <AccordionContent> + ```json + "end_block": 201 + ``` + </AccordionContent> + </AccordionItem> + <AccordionItem value="expire"> + <AccordionTrigger>Stop after number of occurrences</AccordionTrigger> + <AccordionContent> + ```json + "expire_after_occurrence": 1 + ``` + </AccordionContent> + </AccordionItem> + <AccordionItem value="proofs"> + <AccordionTrigger>Exclude proofs from payload</AccordionTrigger> + <AccordionContent> + ```json + "include_proof": false + ``` + </AccordionContent> + </AccordionItem> + <AccordionItem value="inputs"> + <AccordionTrigger>Exclude transaction inputs from payload</AccordionTrigger> + <AccordionContent> + ```json + "include_inputs": false + ``` + </AccordionContent> + </AccordionItem> + <AccordionItem value="outputs"> + <AccordionTrigger>Exclude transaction outputs from payload</AccordionTrigger> + <AccordionContent> + ```json + "include_outputs": false + ``` + </AccordionContent> + </AccordionItem> + <AccordionItem value="witness"> + <AccordionTrigger>Exclude transaction witnesses from payload</AccordionTrigger> + <AccordionContent> + ```json + "include_witness": false + ``` + </AccordionContent> + </AccordionItem> + </Accordion> <Callout type="info" title="Note"> The following command allows you to generate a predicate template for the Bitcoin blockchain. @@ -225,10 +222,9 @@ When using `http_post`, specify the endpoint's `url` and `authorization_header`. ``` </Callout> - </Tab> - - <Tab value="Stacks predicate"> + </TabsContent> + <TabsContent value="stacks"> ```json { "chain": "stacks", @@ -269,51 +265,53 @@ When using `http_post`, specify the endpoint's `url` and `authorization_header`. } ``` - <Accordions> - <Accordion title="Additional Stacks predicate configurations"> - Thse additional configurations can be used to improve the performance of Chainhook by preventing a full scan of the blockchain: + <Accordion type="single" collapsible className="w-full"> + <AccordionItem value="item-1"> + <AccordionTrigger>Additional Stacks predicate configurations</AccordionTrigger> + <AccordionContent> + <p>These additional configurations can be used to improve the performance of Chainhook by preventing a full scan of the blockchain:</p> - Ignore any block before the given block: + <p>Ignore any block before the given block:</p> - ```json - "start_block": 101 - ``` + ```json + "start_block": 101 + ``` - Ignore any block after the given block: - - ```json - "end_block": 201 - ``` + <p>Ignore any block after the given block:</p> + + ```json + "end_block": 201 + ``` - Stop evaluating chainhook after a given number of occurrences found: + <p>Stop evaluating chainhook after a given number of occurrences found:</p> - ```json - "expire_after_occurrence": 1 - ``` + ```json + "expire_after_occurrence": 1 + ``` - Include decoded Clarity values in the payload: + <p>Include decoded Clarity values in the payload:</p> - ```json - "decode_clarity_values": true - ``` + ```json + "decode_clarity_values": true + ``` - Include the contract ABI for transactions that deploy contracts: + <p>Include the contract ABI for transactions that deploy contracts:</p> - ```json - "include_contract_abi": true - ``` - </Accordion> - </Accordions> + ```json + "include_contract_abi": true + ``` + </AccordionContent> + </AccordionItem> + </Accordion> <Callout type="info" title="Note"> The following command allows you to generate a predicate template for the Stacks blockchain. ``` chainhook predicates new your-stacks-predicate.json --stacks ``` - </Callout> - - </Tab> + </Callout> + </TabsContent> </Tabs> ## Next steps diff --git a/content/docs/stacks/chainhook/references/scopes/bitcoin.mdx b/content/docs/stacks/chainhook/references/scopes/bitcoin.mdx index 3130e23cf..173193579 100644 --- a/content/docs/stacks/chainhook/references/scopes/bitcoin.mdx +++ b/content/docs/stacks/chainhook/references/scopes/bitcoin.mdx @@ -1,11 +1,12 @@ --- title: Bitcoin Scopes description: Reference guide for available scopes for Bitcoin. -toc: false +full: true --- -import { Root, API, APIExample } from '@/components/layout'; +import { Root, API, APIExample } from 'fumadocs-openapi/ui'; import { Property } from 'fumadocs-openapi/ui' +import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Badge } from '@/components/ui/badge'; diff --git a/content/docs/stacks/chainhook/references/scopes/stacks.mdx b/content/docs/stacks/chainhook/references/scopes/stacks.mdx index d130f1172..c5f158f45 100644 --- a/content/docs/stacks/chainhook/references/scopes/stacks.mdx +++ b/content/docs/stacks/chainhook/references/scopes/stacks.mdx @@ -1,10 +1,10 @@ --- title: Stacks Scopes description: Reference guide for available scopes for Stacks. -toc: false +full: true --- -import { Root, API, APIExample } from '@/components/layout'; +import { Root, API, APIExample } from 'fumadocs-openapi/ui'; import { Property } from 'fumadocs-openapi/ui' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; diff --git a/content/docs/stacks/clarinet-js-sdk/installation.mdx b/content/docs/stacks/clarinet-js-sdk/installation.mdx index 8a4131de2..b34ef3fde 100644 --- a/content/docs/stacks/clarinet-js-sdk/installation.mdx +++ b/content/docs/stacks/clarinet-js-sdk/installation.mdx @@ -1,7 +1,7 @@ --- title: Installation description: Clarinet JS SDK can be installed using your preferred package manager. -toc: false +full: true --- <Callout type="warn"> diff --git a/content/docs/stacks/clarinet-js-sdk/references/custom-matchers.mdx b/content/docs/stacks/clarinet-js-sdk/references/custom-matchers.mdx index 5eeb90948..27329f3ec 100644 --- a/content/docs/stacks/clarinet-js-sdk/references/custom-matchers.mdx +++ b/content/docs/stacks/clarinet-js-sdk/references/custom-matchers.mdx @@ -1,19 +1,14 @@ --- title: Custom Matchers description: A set of Vitest matchers that can be used to make assertions on Clarity values with the Clarinet JS SDK. -toc: false +full: true --- import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; import { Badge } from '@/components/ui/badge'; -import { Root, API, APIExample, Property, Info } from '@/components/layout'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; -<Root> -<API> - -<Info> # `toHaveClarityType` @@ -21,15 +16,11 @@ Check that a value has the right Clarity type, without checking its value. ## Parameters -<Property required={true} deprecated={false} name={"expectedType"} type={"ClarityType"}> The Clarity type that the expected value should have. -</Property> -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -71,13 +62,7 @@ The Clarity type that the expected value should have. </TabsContent> </Tabs> -</APIExample> - -</API> -<API> - -<Info> # `toBeOk` @@ -85,15 +70,10 @@ Check that a response is `(ok <ok-type>)` and has the expected value. Any Clarit ## Parameters -<Property required={true} deprecated={false} name={"expected"} type={"ClarityValue"}> The `ClarityValue` that the expected value should have. -</Property> - -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -135,13 +115,7 @@ The `ClarityValue` that the expected value should have. </TabsContent> </Tabs> -</APIExample> -</API> - -<API> - -<Info> # `toBeErr` @@ -149,15 +123,10 @@ Check that a response is `(err <error-type>)` and has the expected value. Any Cl ## Parameters -<Property required={true} deprecated={false} name={"expected"} type={"ClarityValue"}> The `ClarityValue` that the expected value should have. -</Property> - -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -207,29 +176,15 @@ The `ClarityValue` that the expected value should have. </TabsContent> </Tabs> -</APIExample> - -</API> - -<API> - -<Info> - # `toBeSome` Check that a response is `(some <value>)` and has the expected value. Any Clarity value can be passed. ## Parameters -<Property required={true} deprecated={false} name={"expected"} type={"ClarityValue"}> The `ClarityValue` that the expected value should have. -</Property> - -</Info> - -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -272,21 +227,12 @@ The `ClarityValue` that the expected value should have. </TabsContent> </Tabs> -</APIExample> - -</API> - -<API> - -<Info> # `toBeNone` Check that a response is `(none)`. -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -326,13 +272,6 @@ Check that a response is `(none)`. </TabsContent> </Tabs> -</APIExample> - -</API> - -<API> - -<Info> # `toBeBool` @@ -340,15 +279,10 @@ Asserts the value of Clarity boolean (`true` or `false`). ## Parameters -<Property required={true} deprecated={false} name={"expected"} type={"boolean"}> The `boolean` that the expected value should have. -</Property> - -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -389,28 +323,16 @@ The `boolean` that the expected value should have. </TabsContent> </Tabs> -</APIExample> - -</API> -<API> - -<Info> # `toBeInt` Asserts the value of a Clarity integer. ## Parameters -<Property required={true} deprecated={false} name={"expected"} type={"boolean"}> The `integer` that the expected value should have. -</Property> - -</Info> - -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -452,13 +374,7 @@ The `integer` that the expected value should have. </TabsContent> </Tabs> -</APIExample> - -</API> -<API> - -<Info> # `toBeUint` @@ -466,15 +382,9 @@ Asserts the value of a Clarity unsigned integer. ## Parameters -<Property required={true} deprecated={false} name={"expected"} type={"boolean"}> The `unsigned integer` that the expected value should have. -</Property> - -</Info> - -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -516,13 +426,7 @@ The `unsigned integer` that the expected value should have. </TabsContent> </Tabs> -</APIExample> -</API> - -<API> - -<Info> # `toBeAscii` @@ -530,15 +434,9 @@ Asserts the value of a Clarity string-ascii. ## Parameters -<Property required={true} deprecated={false} name={"expected"} type={"string"}> The `string` that the expected value should have. -</Property> - -</Info> - -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -575,13 +473,7 @@ The `string` that the expected value should have. </TabsContent> </Tabs> -</APIExample> -</API> - -<API> - -<Info> # `toBeUtf8` @@ -589,15 +481,9 @@ Asserts the value of a Clarity string-utf8. ## Parameters -<Property required={true} deprecated={false} name={"expected"} type={"string"}> The `string` that the expected value should have. -</Property> - -</Info> - -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -634,13 +520,7 @@ The `string` that the expected value should have. </TabsContent> </Tabs> -</APIExample> - -</API> -<API> - -<Info> # `toBePrincipal` @@ -650,15 +530,9 @@ The principal can be a standard or a contract principal. ## Parameters -<Property required={true} deprecated={false} name={"expected"} type={"string"}> The `string` that the expected value should have. -</Property> - -</Info> - -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -701,13 +575,7 @@ The `string` that the expected value should have. </TabsContent> </Tabs> -</APIExample> - -</API> - -<API> -<Info> # `toBeBuff` @@ -721,15 +589,9 @@ For building a buffer, `@stacks/transactions` provides some helper functions: ## Parameters -<Property required={true} deprecated={false} name={"expected"} type={"Uint8Array"}> The `Uint8Array` buffer that the expected value should have. -</Property> - -</Info> - -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -843,13 +705,7 @@ The `Uint8Array` buffer that the expected value should have. </TabsContent> </Tabs> -</APIExample> - -</API> - -<API> -<Info> # `toBeList` @@ -857,15 +713,9 @@ Asserts the value of a Clarity list containing an array of Clarity values. ## Parameters -<Property required={true} deprecated={false} name={"expected"} type={"ClarityValue[]"}> The `Uint8Array` buffer that the expected value should have. -</Property> - -</Info> - -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -914,13 +764,7 @@ The `Uint8Array` buffer that the expected value should have. </TabsContent> </Tabs> -</APIExample> - -</API> -<API> - -<Info> # `toBeTuple` @@ -928,15 +772,9 @@ Asserts the value of a Clarity tuple. ## Parameters -<Property required={true} deprecated={false} name={"expected"} type={"object"}> The `object` of Clarity values that the expected value should have. -</Property> - -</Info> - -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -988,9 +826,3 @@ The `object` of Clarity values that the expected value should have. </Accordions> </TabsContent> </Tabs> - -</APIExample> - -</API> - -</Root> \ No newline at end of file diff --git a/content/docs/stacks/clarinet-js-sdk/references/methods.mdx b/content/docs/stacks/clarinet-js-sdk/references/methods.mdx index 061197a34..961fa1319 100644 --- a/content/docs/stacks/clarinet-js-sdk/references/methods.mdx +++ b/content/docs/stacks/clarinet-js-sdk/references/methods.mdx @@ -1,25 +1,21 @@ --- title: Methods description: The Clarinet JS SDK provides several methods that can be used to interact with simnet. -toc: false +full: true --- import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; import { Badge } from '@/components/ui/badge'; -import { Root, API, APIExample, Property, Info } from '@/components/layout'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; -<API> -<Info> # `getAccounts` Retrieve a list of all Stacks addresses configured within the project, including wallets, deployers, and faucets. -</Info> -<APIExample> + <Tabs defaultValue="get-accounts"> <TabsList className='flex flex-wrap'> @@ -81,21 +77,13 @@ Retrieve a list of all Stacks addresses configured within the project, including </TabsContent> </Tabs> -</APIExample> - -</API> - -<API> -<Info> # `getAssetsMap` Retrieve a list of asset balances associated with Stacks addresses, including fungible and non-fungible tokens. -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -241,13 +229,6 @@ Retrieve a list of asset balances associated with Stacks addresses, including fu </Tabs> -</APIExample> - -</API> - -<API> - -<Info> # `getDataVar` @@ -255,21 +236,15 @@ Get the value of a `data-var` defined in a contract. ## Parameters -<Property required={true} deprecated={false} name={"contract"} type={"string"}> The contract identifier of the contract. <span>Example: `counter`</span> -</Property> -<Property required={true} deprecated={false} name={"dataVar"} type={"string"}> The name of the `data-var` for the contract. <span>Example: `count`</span> -</Property> -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -344,13 +319,7 @@ The name of the `data-var` for the contract. </TabsContent> </Tabs> -</APIExample> -</API> - -<API> - -<Info> # `getMapEntry` @@ -358,29 +327,21 @@ Get the value of a map entry by its key. Note that this method will always retur ## Parameters -<Property required={true} deprecated={false} name={"contract"} type={"string"}> The contract identifier of the contract. <span>Example: `pool`</span> -</Property> -<Property required={true} deprecated={false} name={"mapName"} type={"string"}> The name of the map within the contract. <span>Example: `Participants`</span> -</Property> -<Property required={true} deprecated={false} name={"mapKey"} type={"ClarityValue"}> The key to access the value in the map. <span>Example: `Cl.standardPrincipal( 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5' )`</span> -</Property> -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -481,13 +442,6 @@ The key to access the value in the map. </TabsContent> </Tabs> -</APIExample> - -</API> - -<API> - -<Info> # `callReadOnlyFn` @@ -497,35 +451,25 @@ This method returns an object with the result of the function call as a `Clarity ## Parameters -<Property required={true} deprecated={false} name={"contract"} type={"string"}> The contract identifier of the contract. <span>Example: `pool`</span> -</Property> -<Property required={true} deprecated={false} name={"method"} type={"string"}> The name of the read-only function within the contract. <span>Example: `get-participant`</span> -</Property> -<Property required={true} deprecated={false} name={"args"} type={"ClarityValue[]"}> The arguments to pass to the read-only function. If no arguments are needed, pass an empty array. <span>Example: `[Cl.standardPrincipal( 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5' )]`</span> -</Property> -<Property required={true} deprecated={false} name={"sender"} type={"string"}> The Stacks address of the sender. <span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span> -</Property> -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -803,13 +747,6 @@ The Stacks address of the sender. </TabsContent> </Tabs> -</APIExample> - -</API> - -<API> - -<Info> # `callPublicFn` @@ -821,35 +758,25 @@ This method will simulate a block being mined and increase the block height by o ## Parameters -<Property required={true} deprecated={false} name={"contract"} type={"string"}> The contract identifier of the contract. <span>Example: `pool`</span> -</Property> -<Property required={true} deprecated={false} name={"method"} type={"string"}> The name of the public function within the contract. <span>Example: `register-participant`</span> -</Property> -<Property required={true} deprecated={false} name={"args"} type={"ClarityValue[]"}> The arguments to pass to the public function. If no arguments are needed, pass an empty array. <span>Example: `[Cl.standardPrincipal( 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5' )]`</span> -</Property> -<Property required={true} deprecated={false} name={"sender"} type={"string"}> The Stacks address of the sender. <span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span> -</Property> -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -1067,13 +994,7 @@ The Stacks address of the sender. </TabsContent> </Tabs> -</APIExample> - -</API> - -<API> -<Info> # `callPrivateFn` @@ -1085,35 +1006,25 @@ This method will simulate a block being mined and increase the block height by o ## Parameters -<Property required={true} deprecated={false} name={"contract"} type={"string"}> The contract identifier of the contract. <span>Example: `pool`</span> -</Property> -<Property required={true} deprecated={false} name={"method"} type={"string"}> The name of the private function within the contract. <span>Example: `reward-participant-points`</span> -</Property> -<Property required={true} deprecated={false} name={"args"} type={"ClarityValue[]"}> The arguments to pass to the private function. If no arguments are needed, pass an empty array. <span>Example: `[Cl.standardPrincipal( 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5' )]`</span> -</Property> -<Property required={true} deprecated={false} name={"sender"} type={"string"}> The Stacks address of the sender. <span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span> -</Property> -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -1266,13 +1177,7 @@ The Stacks address of the sender. </Tabs> -</APIExample> -</API> - -<API> - -<Info> # `transferSTX` @@ -1282,27 +1187,18 @@ This method will simulate a block being mined and increase the block height by o ## Parameters -<Property required={true} deprecated={false} name={"amount"} type={"number | bigint"}> The amount of `uSTX` to transfer. <span>Example: `1000000` equals 1 STX</span> -</Property> -<Property required={true} deprecated={false} name={"recipient"} type={"string"}> The Stacks address of the recipient. <span>Example: `ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5`</span> -</Property> -<Property required={true} deprecated={false} name={"sender"} type={"string"}> The Stacks address of the sender. <span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span> -</Property> - -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -1462,13 +1358,7 @@ The Stacks address of the sender. </TabsContent> </Tabs> -</APIExample> - -</API> - -<API> -<Info> # `deployContract` @@ -1478,33 +1368,23 @@ This method will simulate a block being mined and increase the block height by o ## Parameters -<Property required={true} deprecated={false} name={"name"} type={"string"}> The name of the contract to be deployed. <span>Example: `hello-world`</span> -</Property> -<Property required={true} deprecated={false} name={"content"} type={"string"}> The Clarity source code (or content) of the contract. <span>Example: `(define-read-only (say-hi) (ok "Hello World"))`</span> -</Property> -<Property required={false} deprecated={false} name={"options"} type={"DeployContractOptions | null"}> An object to specify options, such as the Clarity version. <span>Example: `{ clarityVersion: 2 }` | `null`</span> -</Property> -<Property required={true} deprecated={false} name={"sender"} type={"string"}> The Stacks address of the sender. <span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span> -</Property> -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -1645,13 +1525,7 @@ The Stacks address of the sender. </TabsContent> </Tabs> -</APIExample> -</API> - -<API> - -<Info> # `mineBlock` @@ -1672,15 +1546,11 @@ In epochs from 3.0 on, the stacks chaintip is advanced separately from the burn ## Parameters -<Property required={true} deprecated={false} name={"txs"} type={"Tx[]"}> An array of transactions to be included in the block. <span>Example: `[tx.transferSTX(100, recipient, sender), ...]`</span> -</Property> -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -1770,13 +1640,7 @@ An array of transactions to be included in the block. </TabsContent> </Tabs> -</APIExample> - -</API> -<API> - -<Info> # `mineEmptyBlock` @@ -1784,9 +1648,7 @@ Mine one empty block and increase the block height by one. Returns the new block height. -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -1817,13 +1679,7 @@ Returns the new block height. </TabsContent> </Tabs> -</APIExample> - -</API> - -<API> -<Info> # `mineEmptyBlocks` @@ -1833,15 +1689,11 @@ Returns the new block height. ## Parameters -<Property required={false} deprecated={false} name={"count"} type={"number"}> The number of empty blocks to mine. This parameter is optional. <span>Example: `5`</span> -</Property> -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -1894,13 +1746,7 @@ The number of empty blocks to mine. This parameter is optional. </TabsContent> </Tabs> -</APIExample> -</API> - -<API> - -<Info> # `runSnippet` @@ -1908,15 +1754,11 @@ Execute arbitrary Clarity code directly, which allows you to test and interact w ## Parameters -<Property required={true} deprecated={false} name={"snippet"} type={"string"}> The Clarity code snippet to be executed. <span>Example: `(define-read-only (get-balance) (ok stx-balance))`</span> -</Property> -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -1987,13 +1829,6 @@ The Clarity code snippet to be executed. </TabsContent> </Tabs> -</APIExample> - -</API> - -<API> - -<Info> # `getContractsInterfaces` @@ -2001,9 +1836,6 @@ Returns the interfaces of the project contracts as a Map of Contracts, with the These interfaces contain information such as the available `functions`, `data-vars`, `maps`, `NFTs`, and `FTs` defined in the contract. -</Info> - -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -2132,13 +1964,7 @@ These interfaces contain information such as the available `functions`, `data-va </TabsContent> </Tabs> -</APIExample> - -</API> - -<API> -<Info> # `getContractSource` @@ -2146,15 +1972,10 @@ Get the source code of a contract as a string. ## Parameters -<Property required={true} deprecated={false} name={"contract"} type={"string"}> The identifier of the contract for which the source code is requested. <span>Example: `pool`</span> -</Property> -</Info> - -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -2205,13 +2026,6 @@ The identifier of the contract for which the source code is requested. </TabsContent> </Tabs> -</APIExample> - -</API> - -<API> - -<Info> # `getContractAST` @@ -2221,15 +2035,9 @@ This method throws an error if it fails to get the AST or to encode it. ## Parameters -<Property required={true} deprecated={false} name={"contractId"} type={"string"}> The identifier of the contract for which the AST (Abstract Syntax Tree) is requested. <span>Example: `pool`</span> -</Property> - -</Info> - -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -2281,6 +2089,3 @@ The identifier of the contract for which the AST (Abstract Syntax Tree) is reque </TabsContent> </Tabs> -</APIExample> - -</API> \ No newline at end of file diff --git a/content/docs/stacks/clarinet-js-sdk/references/properties.mdx b/content/docs/stacks/clarinet-js-sdk/references/properties.mdx index 687910400..60ec44d2c 100644 --- a/content/docs/stacks/clarinet-js-sdk/references/properties.mdx +++ b/content/docs/stacks/clarinet-js-sdk/references/properties.mdx @@ -1,27 +1,19 @@ --- title: Properties description: The Clarinet JS SDK provides properties that can be used to interact with simnet. -toc: false +full: true --- import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; import { Badge } from '@/components/ui/badge'; -import { Root, API, APIExample, Property, Info } from '@/components/layout'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; -<Root> -<API> - -<Info> # `blockHeight` Returns the current block height of simnet. -</Info> - -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -44,21 +36,12 @@ Returns the current block height of simnet. </Accordion> </Accordions> -</APIExample> - -</API> - -<API> - -<Info> # `deployer` Returns the default deployer address as defined in the project file. -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -98,13 +81,6 @@ Returns the default deployer address as defined in the project file. </TabsContent> </Tabs> -</APIExample> - -</API> - -<API> - -<Info> # `currentEpoch` @@ -112,9 +88,7 @@ Returns the current epoch of simnet. This represents the Stacks blockchain's progress through discrete time periods, cycles, or upgrades. -</Info> -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> @@ -137,8 +111,3 @@ This represents the Stacks blockchain's progress through discrete time periods, </Accordion> </Accordions> -</APIExample> - -</API> - -</Root> \ No newline at end of file diff --git a/content/docs/stacks/clarinet-js-sdk/references/simnet.mdx b/content/docs/stacks/clarinet-js-sdk/references/simnet.mdx index 98fa21ee8..2d2dde1b0 100644 --- a/content/docs/stacks/clarinet-js-sdk/references/simnet.mdx +++ b/content/docs/stacks/clarinet-js-sdk/references/simnet.mdx @@ -1,7 +1,7 @@ --- title: Simnet description: The Simnet class is the main entry point for the Clarinet JS SDK. It provides properties and methods for interacting with the Clarinet network. -toc: false +full: true --- import { @@ -11,28 +11,16 @@ import { AccordionTrigger, } from "@/components/ui/accordion" import { Badge } from '@/components/ui/badge'; -import { Root, API, APIExample, Property, Info } from '@/components/layout'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; -<API> - -<Info> - # `initSimnet` The `initSimnet` function initializes a simulated network. It will often be the first function you call when using the SDK. ## Parameters -<Property required={false} deprecated={false} name={"manifestPath"} type={"string"}> - The `manifestPath` is the path to the `Clarinet.toml` manifest file. -</Property> - -</Info> - -<APIExample> <Tabs defaultValue="default"> <TabsList className='flex flex-wrap'> <TabsTrigger value="default" className='tab group'> @@ -67,7 +55,4 @@ The `manifestPath` is the path to the `Clarinet.toml` manifest file. ``` </AccordionContent> </AccordionItem> - </Accordion> - - </APIExample> -</API> \ No newline at end of file + </Accordion> \ No newline at end of file diff --git a/content/docs/stacks/clarinet/guides/add-a-contract.mdx b/content/docs/stacks/clarinet/examples/add-a-contract.mdx similarity index 100% rename from content/docs/stacks/clarinet/guides/add-a-contract.mdx rename to content/docs/stacks/clarinet/examples/add-a-contract.mdx diff --git a/content/docs/stacks/clarinet/guides/create-a-new-project.mdx b/content/docs/stacks/clarinet/examples/create-a-new-project.mdx similarity index 100% rename from content/docs/stacks/clarinet/guides/create-a-new-project.mdx rename to content/docs/stacks/clarinet/examples/create-a-new-project.mdx diff --git a/content/docs/stacks/clarinet/guides/create-deployment-plans.mdx b/content/docs/stacks/clarinet/examples/create-deployment-plans.mdx similarity index 100% rename from content/docs/stacks/clarinet/guides/create-deployment-plans.mdx rename to content/docs/stacks/clarinet/examples/create-deployment-plans.mdx diff --git a/content/docs/stacks/clarinet/guides/debug-a-contract.mdx b/content/docs/stacks/clarinet/examples/debug-a-contract.mdx similarity index 100% rename from content/docs/stacks/clarinet/guides/debug-a-contract.mdx rename to content/docs/stacks/clarinet/examples/debug-a-contract.mdx diff --git a/content/docs/stacks/clarinet/guides/deploy-a-contract.mdx b/content/docs/stacks/clarinet/examples/deploy-a-contract.mdx similarity index 100% rename from content/docs/stacks/clarinet/guides/deploy-a-contract.mdx rename to content/docs/stacks/clarinet/examples/deploy-a-contract.mdx diff --git a/content/docs/stacks/clarinet/guides/estimate-costs.mdx b/content/docs/stacks/clarinet/examples/estimate-costs.mdx similarity index 100% rename from content/docs/stacks/clarinet/guides/estimate-costs.mdx rename to content/docs/stacks/clarinet/examples/estimate-costs.mdx diff --git a/content/docs/stacks/clarinet/guides/run-a-local-devnet.mdx b/content/docs/stacks/clarinet/examples/run-a-local-devnet.mdx similarity index 100% rename from content/docs/stacks/clarinet/guides/run-a-local-devnet.mdx rename to content/docs/stacks/clarinet/examples/run-a-local-devnet.mdx diff --git a/content/docs/stacks/clarinet/guides/start-a-development-console.mdx b/content/docs/stacks/clarinet/examples/start-a-development-console.mdx similarity index 100% rename from content/docs/stacks/clarinet/guides/start-a-development-console.mdx rename to content/docs/stacks/clarinet/examples/start-a-development-console.mdx diff --git a/content/docs/stacks/clarinet/guides/validate-a-contract.mdx b/content/docs/stacks/clarinet/examples/validate-a-contract.mdx similarity index 100% rename from content/docs/stacks/clarinet/guides/validate-a-contract.mdx rename to content/docs/stacks/clarinet/examples/validate-a-contract.mdx diff --git a/content/docs/stacks/clarinet/guides/working-with-sbtc.mdx b/content/docs/stacks/clarinet/examples/working-with-sbtc.mdx similarity index 100% rename from content/docs/stacks/clarinet/guides/working-with-sbtc.mdx rename to content/docs/stacks/clarinet/examples/working-with-sbtc.mdx diff --git a/content/docs/stacks/clarinet/meta.json b/content/docs/stacks/clarinet/meta.json index ce65026d8..82bdbf0a7 100644 --- a/content/docs/stacks/clarinet/meta.json +++ b/content/docs/stacks/clarinet/meta.json @@ -1,12 +1,9 @@ { "title": "Clarinet", - "root": true, "pages": [ - "---Clarinet---", "index", "quickstart", "concepts", - "---Guides---", - "...guides" + "...examples" ] } diff --git a/content/docs/stacks/clarinet/quickstart.mdx b/content/docs/stacks/clarinet/quickstart.mdx index b78e63eb2..cfc5971a3 100644 --- a/content/docs/stacks/clarinet/quickstart.mdx +++ b/content/docs/stacks/clarinet/quickstart.mdx @@ -1,6 +1,7 @@ --- title: Quickstart description: Learn how to create a simple counter contract using Clarinet. +llm: true --- import { Clarinet, Js } from '@/components/ui/icon'; diff --git a/content/docs/stacks/clarity/index.mdx b/content/docs/stacks/clarity/index.mdx index cbe05b0c3..e324b2647 100644 --- a/content/docs/stacks/clarity/index.mdx +++ b/content/docs/stacks/clarity/index.mdx @@ -1,6 +1,7 @@ --- title: Introduction description: Explore and master Clarity's built-in functions for smart contract development. +full: true --- import { Code } from 'lucide-react'; diff --git a/content/docs/stacks/clarity/meta.json b/content/docs/stacks/clarity/meta.json index 70a25476b..6c4bca401 100644 --- a/content/docs/stacks/clarity/meta.json +++ b/content/docs/stacks/clarity/meta.json @@ -2,7 +2,6 @@ "title": "Clarity", "root": true, "pages": [ - "---Clarity---", "index", "---Guides---", "basic-arithmetic", diff --git a/content/docs/stacks/connect/guides/authenticate-users.mdx b/content/docs/stacks/connect/examples/authenticate-users.mdx similarity index 100% rename from content/docs/stacks/connect/guides/authenticate-users.mdx rename to content/docs/stacks/connect/examples/authenticate-users.mdx diff --git a/content/docs/stacks/connect/guides/broadcast-transactions.mdx b/content/docs/stacks/connect/examples/broadcast-transactions.mdx similarity index 100% rename from content/docs/stacks/connect/guides/broadcast-transactions.mdx rename to content/docs/stacks/connect/examples/broadcast-transactions.mdx diff --git a/content/docs/stacks/connect/guides/migration.mdx b/content/docs/stacks/connect/examples/migration.mdx similarity index 100% rename from content/docs/stacks/connect/guides/migration.mdx rename to content/docs/stacks/connect/examples/migration.mdx diff --git a/content/docs/stacks/connect/guides/sign-messages.mdx b/content/docs/stacks/connect/examples/sign-messages.mdx similarity index 100% rename from content/docs/stacks/connect/guides/sign-messages.mdx rename to content/docs/stacks/connect/examples/sign-messages.mdx diff --git a/content/docs/stacks/connect/meta.json b/content/docs/stacks/connect/meta.json index 85203efaa..317021fdf 100644 --- a/content/docs/stacks/connect/meta.json +++ b/content/docs/stacks/connect/meta.json @@ -1,17 +1,9 @@ { "title": "Stacks Connect", - "root": true, "pages": [ - "---Stacks Connect---", "index", "quickstart", - "support", - "---Guides---", - "guides/migration", - "guides/authenticate-users", - "guides/broadcast-transactions", - "guides/sign-messages", - "---Reference---", - "...packages" + "...examples", + "support" ] } diff --git a/content/docs/stacks/connect/packages/connect.mdx b/content/docs/stacks/connect/packages/connect.mdx index 9341051e7..b508a5069 100644 --- a/content/docs/stacks/connect/packages/connect.mdx +++ b/content/docs/stacks/connect/packages/connect.mdx @@ -1,10 +1,10 @@ --- title: '@stacks/connect' description: Connect is a JavaScript library for building web applications connected to Stacks. -toc: false +full: true --- -import { Root, API, APIExample } from '@/components/layout'; +import { Root, API, APIExample } from 'fumadocs-openapi/ui'; import { Property } from 'fumadocs-openapi/ui' import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; diff --git a/content/docs/stacks/contributors-guide.mdx b/content/docs/stacks/contributors-guide.mdx index 1848ec856..0178a8f40 100644 --- a/content/docs/stacks/contributors-guide.mdx +++ b/content/docs/stacks/contributors-guide.mdx @@ -3,6 +3,6 @@ title: Contributors guide description: Learn how to contribute to Hiro's documentation and content. --- -import ContributorsGuideContent from '@/snippets/contributors-guide.mdx'; +import ContributorsGuideContent from '@/content/_shared/contributors-guide.mdx'; -<ContributorsGuideContent /> +<ContributorsGuideContent components={props.components} /> diff --git a/content/docs/stacks/explorer/index.mdx b/content/docs/stacks/explorer/index.mdx index 83218217c..591ceeea3 100644 --- a/content/docs/stacks/explorer/index.mdx +++ b/content/docs/stacks/explorer/index.mdx @@ -1,7 +1,7 @@ --- title: Overview description: Explore and verify data on the Stacks blockchain. -toc: false +full: true --- import Link from "next/link"; diff --git a/content/docs/stacks/get-started.mdx b/content/docs/stacks/get-started.mdx index 566d3d918..471b9b5e7 100644 --- a/content/docs/stacks/get-started.mdx +++ b/content/docs/stacks/get-started.mdx @@ -1,117 +1,20 @@ --- -title: Get started -description: The following guides cover ways to use Hiro tools to build apps on Stacks. -icon: Play -toc: false +title: Introduction +description: Get started with the Stacks ecosystem. --- -import { Database, Ticket } from 'lucide-react'; -import { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon'; -import { SecondaryCard, SmallCard } from '@/components/card'; +import { SecondaryCard } from '@/components/card'; -<div className='flex flex-col space-y-10'> +LFG! -<Cards> - <SecondaryCard - icon={<Clarinet />} - href="/stacks/clarinet/quickstart" - title="Create your first smart contract" - description="Build a simple counter contract using Clarinet." - tag='Clarinet' - /> - <SecondaryCard - icon={<Blockchain />} - href="/stacks/clarinet-js-sdk/quickstart" - title="Write unit tests for your smart contracts" - description="Learn how run unit tests with Clarinet JS SDK." - tag='Clarinet JS SDK' - /> - <SecondaryCard - icon={<Js />} - href="/stacks/stacks.js/quickstart" - title="Make a contract call with Stacks.js" - description="Learn how to integrate smart contracts into your app." - tag='Stacks.js' - /> - <SecondaryCard - icon={<Database />} - href="/stacks/chainhook/quickstart" - title="Stream custom blockchain events" - description="Use Chainhook to filter & stream for contract deployments." - tag='Chainhook' - /> -</Cards> +## Related tools -<div className='flex flex-col'> +- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks. +- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality. +- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API. -<h4 id="learn-by-example" className="text-[#595650] dark:text-[#8c877d] scroll-m-20"> - <a href="#learn-by-example" className="not-prose group text-sm uppercase">Learn by example</a> -</h4> +<br /> ---- - -<Cards> - <SmallCard - icon={<Shapes />} - href="/guides/build-an-nft-marketplace" - title="Build an NFT Marketplace" - description="Learn how to create and deploy your own NFT marketplace." - /> - {/* <SmallCard - icon={<DAO />} - href="/stacks/clarinet" - title="Launch a Decentralized Autonomous Organization (DAO)" - description="Discover the steps to creating your own DAO." - /> */} - <SmallCard - icon={<Ticket />} - href="/guides/no-loss-lottery" - title="Create a no-loss lottery pool" - description="Build a no-loss lottery pool that leverages stacking yield." - /> - <SmallCard - icon={<Plant />} - href="/guides/build-a-decentralized-kickstarter" - title="Build a decentralized Kickstarter" - description="Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party." - /> -</Cards> - -</div> - -<div className='flex flex-col'> - -<h4 id="installation-guides" className="text-[#595650] dark:text-[#8c877d] scroll-m-20"> - <a href="#installation-guides" className="not-prose group text-sm uppercase">Installation guides</a> -</h4> - ---- - -<Cards> - <SmallCard - icon={<BitcoinIcon />} - href="/guides/sync-a-bitcoin-node" - title="Sync a Bitcoin node" - description="Set up and run a Bitcoin node to run tools like Chainhook as a service." - /> - <SmallCard - icon={<StacksIcon />} - href="/guides/sync-a-stacks-node" - title="Sync a Stacks node" - description="Set up and run a Stacks node to use tools like Chainhook or spin up your own API." - /> - <SmallCard - icon={<Container />} - href="/guides/installing-docker" - title="Install and run Docker on your machine" - description="Essential for running a local development with Clarinet" - /> -</Cards> - -</div> - -<Callout type="tip"> -For more, check out our [guides](/guides) section. -</Callout> - -</div> +<Callout title="Need help building with Clarinet JS SDK?" type="help"> +Reach out to us on the <span className="font-bold">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET. +</Callout> \ No newline at end of file diff --git a/content/docs/stacks/hacks/build-with-sbtc.mdx b/content/docs/stacks/hacks/build-with-sbtc.mdx deleted file mode 100644 index 2d81be2f8..000000000 --- a/content/docs/stacks/hacks/build-with-sbtc.mdx +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Interact with sBTC -description: Build an app or feature that integrates with sBTC. Compete for your scholarship. ---- - -**Timeline**: March 26 - April 1, 2025 - -This month's challenge is to build with [sBTC](https://www.stacks.co/sbtc), the new programmable Bitcoin-backed asset on Stacks. Since its launch in December, sBTC has brought $260M+ of BTC liquidity directly to Stacks. With sBTC withdrawals going live on March 31st, there's never been a better time to start building with sBTC, and this is your perfect opportunity to get started. - -We will be awarding 2 developer scholarships to 2 different winners this month. Each scholarship will receive **hotel accommodations**, a **$1,000 travel stipend**, and tickets to **Bitcoin 2025** in Las Vegas. - -Submit your project [here](https://hirohacks25.paperform.co/). - -Your submission can be a full-fledged application, or a new feature in your existing project. The only requirements are that it has to interact with sBTC in some way and that you build something new during the window of this hack. - -## Some hack ideas to get you started - -- A cli command for transferring sBTC -- An analytics dashboard for sBTC activity -- Any kind of smart contract functionality that interacts with sBTC ---- - -## Resources - -- [Working with sBTC in Clarinet](/stacks/clarinet/guides/working-with-sbtc) -- [sBTC package](/stacks/stacks.js/packages/sbtc) -- [Submission form](https://hirohacks25.paperform.co/) -- [Stacks Discord](https://stacks.chat) diff --git a/content/docs/stacks/hacks/index.mdx b/content/docs/stacks/hacks/index.mdx index 0c1cb49a1..47949e851 100644 --- a/content/docs/stacks/hacks/index.mdx +++ b/content/docs/stacks/hacks/index.mdx @@ -8,7 +8,7 @@ import { SecondaryCard } from '@/components/card'; Hiro Hacks are monthly hackathons designed to bring together the most innovative builders in the Stacks ecosystem. Each month features a unique theme, challenging you to stretch your creativity, show off your skills, and learn from other devs in the process. -Have fun. Build something new. Compete against other devs for a scholarship to Bitcoin 2025 in Las Vegas this May (scroll down for details). +Have fun. Build something new. Compete against other devs for Hiro swag and your seat in a [hacker house](#prizes) coming later this year. To submit your projects each month, [complete this form](https://hirohacks25.paperform.co/) before midnight ET on the last day of that month's hack. @@ -18,7 +18,7 @@ To submit your projects each month, [complete this form](https://hirohacks25.pap | --- | --- | --- | | Jan 22-28 | [AI x Stacks](/stacks/hacks/archive/ai) | Build something that combines AI capabilities with Stacks. | | Feb 19-25 | [Create your own recipe](/stacks/hacks/recipes) | Create your own recipe for the Hiro Cookbook and share it with the community. | -| Mar 26 - Apr 1 | [Build with sBTC](/stacks/hacks/build-with-sbtc) | Build an app or feature that interacts with sBTC. | +| Mar 19-25 | TBA | Coming soon | | Apr 23-29 | TBA | Coming soon | | May 21-27 | TBA | Coming soon | | Jun 18-24 | TBA | Coming soon | @@ -26,9 +26,9 @@ To submit your projects each month, [complete this form](https://hirohacks25.pap ## Prizes -For March's hack, we will be awarding 2 developer scholarships to 2 different winners. Each developer scholarship includes **hotel accommodations**, a **$1,000 travel stipend**, and **tickets to [Bitcoin 2025](https://b.tc/conference/2025)** in Las Vegas this May. +At the end of each monthly hack, Hiro will host a livestream on X going over submissions and announcing that month's winning developer. The prize? Fame, glory and Hiro swag. -Code your way to Vegas and spend time with Stacks builders while diving into the zany world of the biggest Bitcoin conference of the year. +Top developers from these monthly hacks will be invited to participate in a Hiro hacker house tied to one of the year's biggest conferences, key expenses covered. We'll share more details on that house soon, so stay tuned. ## Resources diff --git a/content/docs/stacks/hacks/meta.json b/content/docs/stacks/hacks/meta.json index e42d126f1..eb0996557 100644 --- a/content/docs/stacks/hacks/meta.json +++ b/content/docs/stacks/hacks/meta.json @@ -5,9 +5,8 @@ "---Hiro Hacks---", "index", "---Hacks---", - "build-with-sbtc", + "recipes", "---Archive---", - "archive/recipes", "archive/ai", "archive/build-a-friend-tech-clone", "archive/build-a-decentralized-grants-program", diff --git a/content/docs/stacks/hacks/archive/recipes.mdx b/content/docs/stacks/hacks/recipes.mdx similarity index 100% rename from content/docs/stacks/hacks/archive/recipes.mdx rename to content/docs/stacks/hacks/recipes.mdx diff --git a/content/docs/stacks/index.mdx b/content/docs/stacks/index.mdx index e70cf7344..5cf272eff 100644 --- a/content/docs/stacks/index.mdx +++ b/content/docs/stacks/index.mdx @@ -1,7 +1,7 @@ --- title: Home icon: StacksIcon -toc: false +full: true --- import { Card as MainCard, SmallCard } from '@/components/card'; diff --git a/content/docs/stacks/clarinet-js-sdk/guides/integration-testing.mdx b/content/docs/stacks/integration-testing.mdx similarity index 100% rename from content/docs/stacks/clarinet-js-sdk/guides/integration-testing.mdx rename to content/docs/stacks/integration-testing.mdx diff --git a/content/docs/stacks/meta.json b/content/docs/stacks/meta.json index 69801d3da..ea5d5c812 100644 --- a/content/docs/stacks/meta.json +++ b/content/docs/stacks/meta.json @@ -3,27 +3,29 @@ "root": true, "pages": [ "index", + "quickstarts", + "api", + "reference", + "clarity", + "---Get started---", "get-started", - "---Tools---", + "setup", + "---Build with Hiro---", + "smart-contract-development", + "web-app-development", + "blockchain-development", + "token-development", + "---Testing---", + "unit-testing", + "integration-testing", + "testing-environments", + "testing-best-practices", + "migration-guide", + "---Explore by tool---", "clarinet", - "clarinet-js-sdk", - "stacks.js", - "connect", "chainhook", "platform", - "---APIs---", - "api", - "token-metadata-api", - "platform-api", - "rpc-api", - "signer-metrics-api", - "api-keys", - "rate-limiting", - "------", - "clarity", - "nakamoto", - "archive", - "hacks", - "contributors-guide" + "stacks.js", + "connect" ] } diff --git a/content/docs/stacks/clarinet-js-sdk/guides/migrate-to-the-clarinet-sdk.mdx b/content/docs/stacks/migration-guide.mdx similarity index 99% rename from content/docs/stacks/clarinet-js-sdk/guides/migrate-to-the-clarinet-sdk.mdx rename to content/docs/stacks/migration-guide.mdx index 73562daac..50048055b 100644 --- a/content/docs/stacks/clarinet-js-sdk/guides/migrate-to-the-clarinet-sdk.mdx +++ b/content/docs/stacks/migration-guide.mdx @@ -1,5 +1,5 @@ --- -title: How to migrate to the SDK +title: Migration guide description: Learn how to migrate your existing Clarinet projects to the Clarinet SDK. --- diff --git a/content/docs/stacks/platform/guides/archive-project.mdx b/content/docs/stacks/platform/examples/archive-project.mdx similarity index 100% rename from content/docs/stacks/platform/guides/archive-project.mdx rename to content/docs/stacks/platform/examples/archive-project.mdx diff --git a/content/docs/stacks/platform/guides/contract-monitoring.mdx b/content/docs/stacks/platform/examples/contract-monitoring.mdx similarity index 99% rename from content/docs/stacks/platform/guides/contract-monitoring.mdx rename to content/docs/stacks/platform/examples/contract-monitoring.mdx index 4928c3dbf..359dff235 100644 --- a/content/docs/stacks/platform/guides/contract-monitoring.mdx +++ b/content/docs/stacks/platform/examples/contract-monitoring.mdx @@ -3,6 +3,8 @@ title: Monitor contracts description: Learn how to monitor your contract with custom alerts after you deploy to mainnet. --- +import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; + This feature goes beyond just security—it's also a way to better understand how your contracts are being used. You can also set up alerts for various public functions in your smart contract to gain insight on which functions are receiving the most calls and how users are interacting with your contract. ## Set up contract monitoring diff --git a/content/docs/stacks/platform/guides/create-chainhooks.mdx b/content/docs/stacks/platform/examples/create-chainhooks.mdx similarity index 100% rename from content/docs/stacks/platform/guides/create-chainhooks.mdx rename to content/docs/stacks/platform/examples/create-chainhooks.mdx diff --git a/content/docs/stacks/platform/guides/create-project.mdx b/content/docs/stacks/platform/examples/create-project.mdx similarity index 100% rename from content/docs/stacks/platform/guides/create-project.mdx rename to content/docs/stacks/platform/examples/create-project.mdx diff --git a/content/docs/stacks/platform/guides/deploy-contracts.mdx b/content/docs/stacks/platform/examples/deploy-contracts.mdx similarity index 100% rename from content/docs/stacks/platform/guides/deploy-contracts.mdx rename to content/docs/stacks/platform/examples/deploy-contracts.mdx diff --git a/content/docs/stacks/platform/guides/devnet.mdx b/content/docs/stacks/platform/examples/devnet.mdx similarity index 100% rename from content/docs/stacks/platform/guides/devnet.mdx rename to content/docs/stacks/platform/examples/devnet.mdx diff --git a/content/docs/stacks/platform/guides/faucet.mdx b/content/docs/stacks/platform/examples/faucet.mdx similarity index 97% rename from content/docs/stacks/platform/guides/faucet.mdx rename to content/docs/stacks/platform/examples/faucet.mdx index 2942c7535..240f0a2c0 100644 --- a/content/docs/stacks/platform/guides/faucet.mdx +++ b/content/docs/stacks/platform/examples/faucet.mdx @@ -3,6 +3,8 @@ title: Request testnet STX description: Easily request testnet STX, so you can deploy and interact with Stacks testnet. --- +import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; + The Stacks Testnet Faucet is a dedicated utility for developers building on the Stacks blockchain. To aid you in deploying and running smart contracts on Stacks testnet, we've provided this faucet that offers easy access to testnet STX tokens. ![Create Chainhook Window](../images/faucet/request.png) diff --git a/content/docs/stacks/platform/meta.json b/content/docs/stacks/platform/meta.json index 4c00d0361..1bafd2d33 100644 --- a/content/docs/stacks/platform/meta.json +++ b/content/docs/stacks/platform/meta.json @@ -1,17 +1,8 @@ { "title": "Hiro Platform", - "root": true, "pages": [ - "---Hiro Platform---", "index", "quickstart", - "---Guides---", - "guides/create-project", - "guides/devnet", - "guides/faucet", - "guides/create-chainhooks", - "guides/deploy-contracts", - "guides/contract-monitoring", - "guides/archive-project" + "...examples" ] } diff --git a/content/docs/stacks/quickstarts/app-templates.mdx b/content/docs/stacks/quickstarts/app-templates.mdx new file mode 100644 index 000000000..cac5429dd --- /dev/null +++ b/content/docs/stacks/quickstarts/app-templates.mdx @@ -0,0 +1,22 @@ +--- +title: App templates +description: Build your app with a template. +--- + +import { Accordion, Accordions } from "fumadocs-ui/components/accordion"; +import { Blocks, Braces, CircleUserRound } from 'lucide-react'; +import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; + +The `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints. + +The client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming. + +```ts +import { AccountsApi } from '@stacks/blockchain-api-client'; + +const accounts = new AccountsApi(apiConfig); + +await accounts.getAccountTransactions({ + principal: 'ST000000000000000000002AMW42H', +}); +``` \ No newline at end of file diff --git a/content/docs/stacks/quickstarts/contract-templates.mdx b/content/docs/stacks/quickstarts/contract-templates.mdx new file mode 100644 index 000000000..2d771a53d --- /dev/null +++ b/content/docs/stacks/quickstarts/contract-templates.mdx @@ -0,0 +1,22 @@ +--- +title: Contract templates +description: Build your contract with a template. +--- + +import { Accordion, Accordions } from "fumadocs-ui/components/accordion"; +import { Blocks, Braces, CircleUserRound } from 'lucide-react'; +import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; + +The `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints. + +The client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming. + +```ts +import { AccountsApi } from '@stacks/blockchain-api-client'; + +const accounts = new AccountsApi(apiConfig); + +await accounts.getAccountTransactions({ + principal: 'ST000000000000000000002AMW42H', +}); +``` \ No newline at end of file diff --git a/content/docs/stacks/quickstarts/event-streaming.mdx b/content/docs/stacks/quickstarts/event-streaming.mdx new file mode 100644 index 000000000..c89cbb0cd --- /dev/null +++ b/content/docs/stacks/quickstarts/event-streaming.mdx @@ -0,0 +1,22 @@ +--- +title: Event streaming +description: Stream events. +--- + +import { Accordion, Accordions } from "fumadocs-ui/components/accordion"; +import { Blocks, Braces, CircleUserRound } from 'lucide-react'; +import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; + +The `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints. + +The client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming. + +```ts +import { AccountsApi } from '@stacks/blockchain-api-client'; + +const accounts = new AccountsApi(apiConfig); + +await accounts.getAccountTransactions({ + principal: 'ST000000000000000000002AMW42H', +}); +``` \ No newline at end of file diff --git a/content/docs/stacks/quickstarts/index.mdx b/content/docs/stacks/quickstarts/index.mdx new file mode 100644 index 000000000..6ed08f3c5 --- /dev/null +++ b/content/docs/stacks/quickstarts/index.mdx @@ -0,0 +1,117 @@ +--- +title: Quickstarts +description: The following guides cover ways to use Hiro tools to build apps on Stacks. +icon: Play +full: true +--- + +import { Database, Ticket } from 'lucide-react'; +import { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon'; +import { SecondaryCard, SmallCard } from '@/components/card'; + +<div className='flex flex-col space-y-10'> + +<Cards> + <SecondaryCard + icon={<Clarinet />} + href="/stacks/clarinet/quickstart" + title="Create your first smart contract" + description="Build a simple counter contract using Clarinet." + tag='Clarinet' + /> + <SecondaryCard + icon={<Blockchain />} + href="/stacks/clarinet-js-sdk/quickstart" + title="Write unit tests for your smart contracts" + description="Learn how run unit tests with Clarinet JS SDK." + tag='Clarinet JS SDK' + /> + <SecondaryCard + icon={<Js />} + href="/stacks/stacks.js/quickstart" + title="Make a contract call with Stacks.js" + description="Learn how to integrate smart contracts into your app." + tag='Stacks.js' + /> + <SecondaryCard + icon={<Database />} + href="/stacks/chainhook/quickstart" + title="Stream custom blockchain events" + description="Use Chainhook to filter & stream for contract deployments." + tag='Chainhook' + /> +</Cards> + +<div className='flex flex-col'> + +<h4 id="learn-by-example" className="text-[#595650] dark:text-[#8c877d] scroll-m-20"> + <a href="#learn-by-example" className="not-prose group text-sm uppercase">Learn by example</a> +</h4> + +--- + +<Cards> + <SmallCard + icon={<Shapes />} + href="/guides/build-an-nft-marketplace" + title="Build an NFT Marketplace" + description="Learn how to create and deploy your own NFT marketplace." + /> + {/* <SmallCard + icon={<DAO />} + href="/stacks/clarinet" + title="Launch a Decentralized Autonomous Organization (DAO)" + description="Discover the steps to creating your own DAO." + /> */} + <SmallCard + icon={<Ticket />} + href="/guides/no-loss-lottery" + title="Create a no-loss lottery pool" + description="Build a no-loss lottery pool that leverages stacking yield." + /> + <SmallCard + icon={<Plant />} + href="/guides/build-a-decentralized-kickstarter" + title="Build a decentralized Kickstarter" + description="Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party." + /> +</Cards> + +</div> + +<div className='flex flex-col'> + +<h4 id="installation-guides" className="text-[#595650] dark:text-[#8c877d] scroll-m-20"> + <a href="#installation-guides" className="not-prose group text-sm uppercase">Installation guides</a> +</h4> + +--- + +<Cards> + <SmallCard + icon={<BitcoinIcon />} + href="/guides/sync-a-bitcoin-node" + title="Sync a Bitcoin node" + description="Set up and run a Bitcoin node to run tools like Chainhook as a service." + /> + <SmallCard + icon={<StacksIcon />} + href="/guides/sync-a-stacks-node" + title="Sync a Stacks node" + description="Set up and run a Stacks node to use tools like Chainhook or spin up your own API." + /> + <SmallCard + icon={<Container />} + href="/guides/installing-docker" + title="Install and run Docker on your machine" + description="Essential for running a local development with Clarinet" + /> +</Cards> + +</div> + +<Callout type="tip"> +For more, check out our [guides](/guides) section. +</Callout> + +</div> diff --git a/content/docs/stacks/quickstarts/meta.json b/content/docs/stacks/quickstarts/meta.json new file mode 100644 index 000000000..0f5e3cf83 --- /dev/null +++ b/content/docs/stacks/quickstarts/meta.json @@ -0,0 +1,14 @@ +{ + "title": "Quickstarts", + "root": true, + "pages": [ + "---Starter templates---", + "app-templates", + "contract-templates", + "---Examples---", + "wallet-integration", + "nft-minting", + "token-transfers", + "event-streaming" + ] +} \ No newline at end of file diff --git a/content/docs/stacks/quickstarts/nft-minting.mdx b/content/docs/stacks/quickstarts/nft-minting.mdx new file mode 100644 index 000000000..9a6b5215e --- /dev/null +++ b/content/docs/stacks/quickstarts/nft-minting.mdx @@ -0,0 +1,22 @@ +--- +title: NFT minting +description: Mint an NFT. +--- + +import { Accordion, Accordions } from "fumadocs-ui/components/accordion"; +import { Blocks, Braces, CircleUserRound } from 'lucide-react'; +import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; + +The `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints. + +The client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming. + +```ts +import { AccountsApi } from '@stacks/blockchain-api-client'; + +const accounts = new AccountsApi(apiConfig); + +await accounts.getAccountTransactions({ + principal: 'ST000000000000000000002AMW42H', +}); +``` \ No newline at end of file diff --git a/content/docs/stacks/quickstarts/token-transfers.mdx b/content/docs/stacks/quickstarts/token-transfers.mdx new file mode 100644 index 000000000..ab186ba90 --- /dev/null +++ b/content/docs/stacks/quickstarts/token-transfers.mdx @@ -0,0 +1,22 @@ +--- +title: Token transfers +description: Transfer tokens. +--- + +import { Accordion, Accordions } from "fumadocs-ui/components/accordion"; +import { Blocks, Braces, CircleUserRound } from 'lucide-react'; +import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; + +The `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints. + +The client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming. + +```ts +import { AccountsApi } from '@stacks/blockchain-api-client'; + +const accounts = new AccountsApi(apiConfig); + +await accounts.getAccountTransactions({ + principal: 'ST000000000000000000002AMW42H', +}); +``` \ No newline at end of file diff --git a/content/docs/stacks/quickstarts/wallet-integration.mdx b/content/docs/stacks/quickstarts/wallet-integration.mdx new file mode 100644 index 000000000..19a920ffb --- /dev/null +++ b/content/docs/stacks/quickstarts/wallet-integration.mdx @@ -0,0 +1,22 @@ +--- +title: Wallet integration +description: Integrate with a wallet. +--- + +import { Accordion, Accordions } from "fumadocs-ui/components/accordion"; +import { Blocks, Braces, CircleUserRound } from 'lucide-react'; +import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; + +The `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints. + +The client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming. + +```ts +import { AccountsApi } from '@stacks/blockchain-api-client'; + +const accounts = new AccountsApi(apiConfig); + +await accounts.getAccountTransactions({ + principal: 'ST000000000000000000002AMW42H', +}); +``` \ No newline at end of file diff --git a/content/docs/stacks/rate-limiting.mdx b/content/docs/stacks/rate-limiting.mdx index 8f07a848b..c42dd9c59 100644 --- a/content/docs/stacks/rate-limiting.mdx +++ b/content/docs/stacks/rate-limiting.mdx @@ -1,8 +1,8 @@ --- title: Rate limiting -description: Understand the rate limits for Hiro APIs and testnet faucets. +description: Understand the rate limits for Hiro APIs and the STX Faucet. --- -import RateLimitingContent from '@/snippets/rate-limiting.mdx'; +import RateLimitingContent from '@/content/_shared/rate-limiting.mdx'; -<RateLimitingContent /> +<RateLimitingContent components={props.components} /> diff --git a/content/docs/stacks/reference.mdx b/content/docs/stacks/reference.mdx new file mode 100644 index 000000000..62821e48d --- /dev/null +++ b/content/docs/stacks/reference.mdx @@ -0,0 +1,117 @@ +--- +title: SDKs & Libraries +description: The following guides cover ways to use Hiro tools to build apps on Stacks. +icon: Code +full: true +--- + +import { Database, Ticket } from 'lucide-react'; +import { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon'; +import { SecondaryCard, SmallCard } from '@/components/card'; + +<div className='flex flex-col space-y-10'> + +<Cards> + <SecondaryCard + icon={<Clarinet />} + href="/stacks/clarinet/quickstart" + title="Create your first smart contract" + description="Build a simple counter contract using Clarinet." + tag='Clarinet' + /> + <SecondaryCard + icon={<Blockchain />} + href="/stacks/clarinet-js-sdk/quickstart" + title="Write unit tests for your smart contracts" + description="Learn how run unit tests with Clarinet JS SDK." + tag='Clarinet JS SDK' + /> + <SecondaryCard + icon={<Js />} + href="/stacks/stacks.js/quickstart" + title="Make a contract call with Stacks.js" + description="Learn how to integrate smart contracts into your app." + tag='Stacks.js' + /> + <SecondaryCard + icon={<Database />} + href="/stacks/chainhook/quickstart" + title="Stream custom blockchain events" + description="Use Chainhook to filter & stream for contract deployments." + tag='Chainhook' + /> +</Cards> + +<div className='flex flex-col'> + +<h4 id="learn-by-example" className="text-[#595650] dark:text-[#8c877d] scroll-m-20"> + <a href="#learn-by-example" className="not-prose group text-sm uppercase">Learn by example</a> +</h4> + +--- + +<Cards> + <SmallCard + icon={<Shapes />} + href="/guides/build-an-nft-marketplace" + title="Build an NFT Marketplace" + description="Learn how to create and deploy your own NFT marketplace." + /> + {/* <SmallCard + icon={<DAO />} + href="/stacks/clarinet" + title="Launch a Decentralized Autonomous Organization (DAO)" + description="Discover the steps to creating your own DAO." + /> */} + <SmallCard + icon={<Ticket />} + href="/guides/no-loss-lottery" + title="Create a no-loss lottery pool" + description="Build a no-loss lottery pool that leverages stacking yield." + /> + <SmallCard + icon={<Plant />} + href="/guides/build-a-decentralized-kickstarter" + title="Build a decentralized Kickstarter" + description="Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party." + /> +</Cards> + +</div> + +<div className='flex flex-col'> + +<h4 id="installation-guides" className="text-[#595650] dark:text-[#8c877d] scroll-m-20"> + <a href="#installation-guides" className="not-prose group text-sm uppercase">Installation guides</a> +</h4> + +--- + +<Cards> + <SmallCard + icon={<BitcoinIcon />} + href="/guides/sync-a-bitcoin-node" + title="Sync a Bitcoin node" + description="Set up and run a Bitcoin node to run tools like Chainhook as a service." + /> + <SmallCard + icon={<StacksIcon />} + href="/guides/sync-a-stacks-node" + title="Sync a Stacks node" + description="Set up and run a Stacks node to use tools like Chainhook or spin up your own API." + /> + <SmallCard + icon={<Container />} + href="/guides/installing-docker" + title="Install and run Docker on your machine" + description="Essential for running a local development with Clarinet" + /> +</Cards> + +</div> + +<Callout type="tip"> +For more, check out our [guides](/guides) section. +</Callout> + +</div> diff --git a/content/docs/stacks/reference/clarinet-js-sdk/clarinet-sdk.mdx b/content/docs/stacks/reference/clarinet-js-sdk/clarinet-sdk.mdx new file mode 100644 index 000000000..801b14b1e --- /dev/null +++ b/content/docs/stacks/reference/clarinet-js-sdk/clarinet-sdk.mdx @@ -0,0 +1,58 @@ +--- +title: '@hirosystems/clarinet-sdk' +description: The main entry point for the Clarinet JS SDK. It provides properties and methods for interacting with the Clarinet network. +full: true +--- + +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion" +import { Badge } from '@/components/ui/badge'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; + +# `initSimnet` + +The `initSimnet` function initializes a simulated network. It will often be the first function you call when using the SDK. + +## Parameters + +The `manifestPath` is the path to the `Clarinet.toml` manifest file. + + <Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='transition-colors'>Creating a new instance of simnet</Badge> + </TabsTrigger> + <TabsTrigger value="custom" className='tab group'> + <Badge className='badge transition-colors'>With a custom config path</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + import { initSimnet } from '@hirosystems/clarinet-sdk'; + + const simnet = await initSimnet(); + ``` + </TabsContent> + <TabsContent value="custom"> + ```ts + import { initSimnet } from '@hirosystems/clarinet-sdk'; + + const simnet = await initSimnet('./config/Clarinet.toml'); + ``` + </TabsContent> + </Tabs> + + <Accordion type="single" collapsible className="w-full"> + <AccordionItem value="schema"> + <AccordionTrigger>Schema</AccordionTrigger> + <AccordionContent> + ```ts + initSimnet(manifestPath?: string): Promise<Simnet> + ``` + </AccordionContent> + </AccordionItem> + </Accordion> \ No newline at end of file diff --git a/content/docs/stacks/reference/clarinet-js-sdk/custom-matchers.mdx b/content/docs/stacks/reference/clarinet-js-sdk/custom-matchers.mdx new file mode 100644 index 000000000..27329f3ec --- /dev/null +++ b/content/docs/stacks/reference/clarinet-js-sdk/custom-matchers.mdx @@ -0,0 +1,828 @@ +--- +title: Custom Matchers +description: A set of Vitest matchers that can be used to make assertions on Clarity values with the Clarinet JS SDK. +full: true +--- + +import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; +import { Badge } from '@/components/ui/badge'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; + + + +# `toHaveClarityType` + +Check that a value has the right Clarity type, without checking its value. + +## Parameters + + +The Clarity type that the expected value should have. + + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Checking for an ok response</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const { result } = simnet.callPublicFn( + 'counter', + 'increment', + [], + simnet.deployer + ); + + expect(result).toHaveClarityType(ClarityType.ResponseOk); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity counter.clar + (define-data-var count uint u0) + + (define-public (increment) + (begin + (var-set count (+ (var-get count) u1)) + (ok (var-get count)) + ) + ) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + toHaveClarityType(expectedType: ClarityType) + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + + +# `toBeOk` + +Check that a response is `(ok <ok-type>)` and has the expected value. Any Clarity value can be passed. + +## Parameters + + +The `ClarityValue` that the expected value should have. + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Checking for an ok response with a specific value</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const { result } = simnet.callPublicFn( + 'counter', + 'increment', + [], + simnet.deployer + ); + + expect(result).toBeOk(Cl.uint(1)); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity counter.clar + (define-data-var count uint u0) + + (define-public (increment) + (begin + (var-set count (+ (var-get count) u1)) + (ok (var-get count)) + ) + ) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + toBeOk(expected: ClarityValue) + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + + +# `toBeErr` + +Check that a response is `(err <error-type>)` and has the expected value. Any Clarity value can be passed. + +## Parameters + + +The `ClarityValue` that the expected value should have. + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Checking for an err response with a specific value</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const { result } = simnet.callPublicFn( + 'counter', + 'add', + [Cl.uint(19)], + simnet.deployer + ); + + expect(result).toBeErr(Cl.uint(500)); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity counter.clar + (define-constant TOO_BIG u10) + (define-data-var count uint u0) + + (define-public (add (amount uint)) + (begin + (let ((new-count (+ (var-get count) amount))) + (if (<= new-count TOO_BIG) + (begin + (var-set count new-count) + (ok (var-get count)) + ) + (err u500) + ) + ) + ) + ) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + toBeErr(expected: ClarityValue) + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + +# `toBeSome` + +Check that a response is `(some <value>)` and has the expected value. Any Clarity value can be passed. + +## Parameters + + +The `ClarityValue` that the expected value should have. + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Checking for an optional value</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const { result } = simnet.callReadOnlyFn( + 'pool', + 'get-participant', + [Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5')], + simnet.deployer + ); + + expect(result).toBeSome(Cl.bool(true)); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + + (define-read-only (get-participant (who principal)) + (map-get? ParticipantStatus who) + ) + + (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true) + (map-set ParticipantStatus 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 { enrollmentBlock: u1, contributionAmount: u19000000 }) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + toBeSome(expected: ClarityValue) + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + +# `toBeNone` + +Check that a response is `(none)`. + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Checking for a none value</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const { result } = simnet.callReadOnlyFn( + 'pool', + 'get-participant', + [Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5')], + simnet.deployer + ); + + expect(result).toBeNone(); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + + (define-read-only (get-participant (who principal)) + (map-get? ParticipantStatus who) + ) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + toBeNone() + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + +# `toBeBool` + +Asserts the value of Clarity boolean (`true` or `false`). + +## Parameters + + +The `boolean` that the expected value should have. + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Checking for a boolean value</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const { result } = simnet.callReadOnlyFn( + 'pool', + 'has-contributed', + [Cl.standardPrincipal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM')], + simnet.deployer + ); + + expect(result).toBeBool(true); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + + (define-read-only (has-contributed (who principal)) + (is-some (get contributionAmount (map-get? ParticipantStatus who))) + ) + + (map-set ParticipantStatus tx-sender { enrollmentBlock: u1, contributionAmount: u19000000 }) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + toBeBool(expected: boolean) + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + +# `toBeInt` + +Asserts the value of a Clarity integer. + +## Parameters + + +The `integer` that the expected value should have. + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Checking for an integer value</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const { result } = simnet.callReadOnlyFn( + 'counter', + 'increment', + [], + simnet.deployer + ); + + expect(result).toBeInt(1); // or `1n` + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity counter.clar + (define-data-var count int 0) + + (define-public (increment) + (begin + (var-set count (+ (var-get count) 1)) + (ok (var-get count)) + ) + ) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + toBeInt(expected: number | bigint) + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + + +# `toBeUint` + +Asserts the value of a Clarity unsigned integer. + +## Parameters + + +The `unsigned integer` that the expected value should have. + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Checking for an unsigned integer value</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const { result } = simnet.callReadOnlyFn( + 'counter', + 'increment', + [], + simnet.deployer + ); + + expect(result).toBeUint(1); // or `1n` + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity counter.clar + (define-data-var count uint u0) + + (define-public (increment) + (begin + (var-set count (+ (var-get count) u1)) + (ok (var-get count)) + ) + ) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + toBeUint(expected: number | bigint) + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + + +# `toBeAscii` + +Asserts the value of a Clarity string-ascii. + +## Parameters + + +The `string` that the expected value should have. + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Checking for a string-ascii value</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const { result } = simnet.callReadOnlyFn( + 'hello-world', + 'say-hi', + [], + simnet.deployer + ); + + expect(result).toBeAscii('Hello World'); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity hello-world.clar + (define-read-only (say-hi) + "Hello World" + ) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + toBeAscii(expected: string) + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + + +# `toBeUtf8` + +Asserts the value of a Clarity string-utf8. + +## Parameters + + +The `string` that the expected value should have. + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Checking for a string-utf8 value</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const { result } = simnet.callReadOnlyFn( + 'hello-world', + 'say-hi', + [], + simnet.deployer + ); + + expect(result).toBeUtf8('Hello World'); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity hello-world.clar + (define-read-only (say-hi) + u"Hello World" + ) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + toBeUtf8(expected: string) + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + + +# `toBePrincipal` + +Asserts the value of a Clarity principal. + +The principal can be a standard or a contract principal. + +## Parameters + + +The `string` that the expected value should have. + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Checking for a standard principal</Badge> + </TabsTrigger> + <TabsTrigger value="options" className='tab group'> + <Badge className='badge transition-colors'>Checking for a contract principal</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const deployer = simnet.deployer; + + expect(Cl.standardPrincipal(deployer)).toBePrincipal(deployer); + ``` + + <Accordions> + <Accordion title="Schema"> + ```ts + toBePrincipal(expected: string) + ``` + </Accordion> + </Accordions> + </TabsContent> + <TabsContent value="options"> + ```ts + const contract = `${simnet.deployer}.hello-world`; + + expect(Cl.contractPrincipal(contract)).toBePrincipal(contract); + ``` + + <Accordions> + <Accordion title="Schema"> + ```ts + toBePrincipal(expected: string) + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + + +# `toBeBuff` + +Asserts the value of a Clarity buffer. It takes an ArrayBuffer as an input. + +For building a buffer, `@stacks/transactions` provides some helper functions: + +- `bufferFromAscii` +- `bufferFromUtf8` +- `bufferFromHex` + +## Parameters + + +The `Uint8Array` buffer that the expected value should have. + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Checking for a Uint8Array buffer</Badge> + </TabsTrigger> + <TabsTrigger value="ascii" className='tab group'> + <Badge className='badge transition-colors'>Checking for an ASCII string buffer</Badge> + </TabsTrigger> + <TabsTrigger value="hex" className='tab group'> + <Badge className='badge transition-colors'>Checking for a hex string buffer</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const { result } = simnet.callReadOnlyFn( + 'helpers', + 'get-byte-array', + [], + simnet.deployer + ); + + const buffer = Uint8Array.from([1, 2, 3, 4]); + expect(result).toBeBuff(buffer); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity helpers.clar + (define-constant BUFFER 0x01020304) + + (define-read-only (get-byte-array) + BUFFER + ) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + toBeBuff(expected: Uint8Array) + ``` + </Accordion> + </Accordions> + </TabsContent> + <TabsContent value="ascii"> + ```ts + import { Cl } from '@stacks/transactions'; + + const { result } = simnet.callReadOnlyFn( + 'helpers', + 'get-btc-buffer', + [], + simnet.deployer + ); + + const btc = Cl.bufferFromAscii('btc'); // or Cl.bufferFromUtf8('btc') + + expect(result).toBeBuff(btc.buffer); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity helpers.clar + (define-constant ASCII_BTC 0x627463) + + (define-read-only (get-btc-buffer) + ASCII_BTC + ) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + toBeBuff(expected: Uint8Array) + ``` + </Accordion> + </Accordions> + </TabsContent> + <TabsContent value="hex"> + ```ts + import { Cl } from '@stacks/transactions'; + + const { result } = simnet.callReadOnlyFn( + "helpers", + "get-tx-hash", + [], + simnet.deployer + ); + + const tx = Cl.bufferFromHex( + "73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e" + ); + + expect(result).toBeBuff(tx.buffer); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity helpers.clar + (define-constant TX_HASH 0x73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e) + + (define-read-only (get-tx-hash) + TX_HASH + ) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + toBeBuff(expected: Uint8Array) + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + + +# `toBeList` + +Asserts the value of a Clarity list containing an array of Clarity values. + +## Parameters + + +The `Uint8Array` buffer that the expected value should have. + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Checking for a list of Clarity values</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + import { Cl } from '@stacks/transactions'; + + const { result } = simnet.callReadOnlyFn( + 'helpers', + 'get-addresses', + [], + simnet.deployer + ); + + expect(result).toBeList( + [ + Cl.standardPrincipal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM'), + Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'), + Cl.standardPrincipal('ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG') + ] + ); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity helpers.clar + (define-read-only (get-addresses) + (list + 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 + 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG + ) + ) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + toBeList(expected: ClarityValue[]) + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + + +# `toBeTuple` + +Asserts the value of a Clarity tuple. + +## Parameters + + +The `object` of Clarity values that the expected value should have. + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Checking for a tuple</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + import { Cl } from '@stacks/transactions'; + + const { result } = simnet.callReadOnlyFn( + 'pool', + 'get-participant-data', + [Cl.standardPrincipal(simnet.deployer)], + simnet.deployer + ); + + expect(result).toBeTuple({ + enrollmentBlock: Cl.some(Cl.uint(1)), + contributionAmount: Cl.some(Cl.uint(19000000)), + }); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + + (define-read-only (get-participant (who principal)) + (map-get? ParticipantStatus who) + ) + + (define-read-only (get-participant-data (who principal)) + { + enrollmentBlock: (get enrollmentBlock (map-get? ParticipantStatus who)), + contributionAmount: (get contributionAmount (map-get? ParticipantStatus who)) + } + ) + + (map-set ParticipantStatus tx-sender { enrollmentBlock: u1, contributionAmount: u19000000 }) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + toBeTuple(expected: Record<string, ClarityValue>) + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> diff --git a/content/docs/stacks/reference/clarinet-js-sdk/methods.mdx b/content/docs/stacks/reference/clarinet-js-sdk/methods.mdx new file mode 100644 index 000000000..961fa1319 --- /dev/null +++ b/content/docs/stacks/reference/clarinet-js-sdk/methods.mdx @@ -0,0 +1,2091 @@ +--- +title: Methods +description: The Clarinet JS SDK provides several methods that can be used to interact with simnet. +full: true +--- + +import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; +import { Badge } from '@/components/ui/badge'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; + + + +# `getAccounts` + +Retrieve a list of all Stacks addresses configured within the project, including wallets, deployers, and faucets. + + + + +<Tabs defaultValue="get-accounts"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="get-accounts" className='tab group'> + <Badge className='badge transition-colors'>Getting your accounts</Badge> + </TabsTrigger> + <TabsTrigger value="get-account" className='tab group'> + <Badge className='badge transition-colors'>Selecting a specific account</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="get-accounts"> + ```ts + const accounts = simnet.getAccounts(); + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + Map(10) { + "wallet_7": "ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ", + "wallet_1": "ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5", + "wallet_3": "ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC", + "wallet_5": "ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB", + "wallet_8": "ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP", + "wallet_4": "ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND", + "deployer": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM", + "wallet_6": "ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0", + "wallet_2": "ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG", + "faucet": "STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6", + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + getAccounts(): Map<string, string> + ``` + </Accordion> + </Accordions> + </TabsContent> + <TabsContent value="get-account"> + ```ts + const accounts = simnet.getAccounts(); + + const wallet = accounts.get('wallet_1')!; + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + getAccounts(): Map<string, string> + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + + +# `getAssetsMap` + +Retrieve a list of asset balances associated with Stacks addresses, including fungible and non-fungible tokens. + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Getting STX account balances</Badge> + </TabsTrigger> + <TabsTrigger value="get-ft-balance" className='tab group'> + <Badge className='badge transition-colors'>Getting ft balances</Badge> + </TabsTrigger> + <TabsTrigger value="get-nft-balance" className='tab group'> + <Badge className='badge transition-colors'>Getting nft balances</Badge> + </TabsTrigger> + <TabsTrigger value="get-deployer-balance" className='tab group'> + <Badge className='badge transition-colors'>Filtering for an account</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const assets = simnet.getAssetsMap(); + + const stxBalances = assets.get('STX')!; + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + Map(10) { + "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM": 100000000000000n, + "ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5": 100000000000000n, + "ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG": 100000000000000n, + "ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC": 100000000000000n, + "ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND": 100000000000000n, + "ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB": 100000000000000n, + "ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0": 100000000000000n, + "ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP": 100000000000000n, + "ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ": 100000000000000n, + "STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6": 100000000000000n, + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + getAssetsMap(): Map<string, Map<string, bigint>> + ``` + </Accordion> + </Accordions> + + </TabsContent> + <TabsContent value="get-ft-balance"> + ```ts + const contractName = 'token'; + const sourceCode = ` + (define-fungible-token sbtc) + (ft-mint? sbtc u19 tx-sender) + `; + + simnet.deployContract( + contractName, + sourceCode, + null, + simnet.deployer + ); + + const assets = simnet.getAssetsMap(); + + const tokenBalance = assets.get('.token.sbtc')!; + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + Map(1) { + "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM": 19n, + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + getAssetsMap(): Map<string, Map<string, bigint>> + ``` + </Accordion> + </Accordions> + + </TabsContent> + <TabsContent value="get-nft-balance"> + ```ts + const contractName = 'nft'; + const sourceCode = ` + (define-non-fungible-token ticket uint) + (nft-mint? ticket u42 tx-sender) + `; + + simnet.deployContract( + contractName, + sourceCode, + null, + simnet.deployer + ); + + const assets = simnet.getAssetsMap(); + + const nftBalance = assets.get('.nft.ticket')!; + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + Map(1) { + "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM": 1n, + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + getAssetsMap(): Map<string, Map<string, bigint>> + ``` + </Accordion> + </Accordions> + + </TabsContent> + <TabsContent value="get-deployer-balance"> + ```ts + const assets = simnet.getAssetsMap(); + const stxBalances = assets.get('STX')!; + + const deployerBalance = stxBalances.get('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM')!; + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + 100000000000000n + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + getAssetsMap(): Map<string, Map<string, bigint>> + ``` + </Accordion> + </Accordions> + + </TabsContent> +</Tabs> + + + +# `getDataVar` + +Get the value of a `data-var` defined in a contract. + +## Parameters + +The contract identifier of the contract. + +<span>Example: `counter`</span> + +The name of the `data-var` for the contract. + +<span>Example: `count`</span> + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Getting the value of a data variable</Badge> + </TabsTrigger> + <TabsTrigger value="clarity-value" className='tab group'> + <Badge className='badge transition-colors'>Converting Clarity values</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const currentCount = simnet.getDataVar('counter', 'count'); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity counter.clar + (define-data-var count uint u0) + (define-data-var contractOwner principal tx-sender) + + (var-set count (+ (var-get count) u1)) + (var-set contractOwner 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + { + type: 1, + value: 1n + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + getDataVar(contract: string, dataVar: string): ClarityValue + ``` + </Accordion> + </Accordions> + + </TabsContent> + <TabsContent value="clarity-value"> + ```ts + import { cvToValue } from '@stacks/transactions'; + + const contractOwner = simnet.getDataVar("counter", "contractOwner"); + + const response = cvToValue(contractOwner); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity counter.clar + (define-data-var count uint u0) + (define-data-var contractOwner principal tx-sender) + + (var-set count (+ (var-get count) u1)) + (var-set contractOwner 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + getDataVar(contract: string, dataVar: string): ClarityValue + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + + +# `getMapEntry` + +Get the value of a map entry by its key. Note that this method will always return an optional value `some` or `none`, just like Clarity `map-get?`. + +## Parameters + +The contract identifier of the contract. + +<span>Example: `pool`</span> + +The name of the map within the contract. + +<span>Example: `Participants`</span> + +The key to access the value in the map. + +<span>Example: `Cl.standardPrincipal( + 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5' +)`</span> + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Getting the value of an entry</Badge> + </TabsTrigger> + <TabsTrigger value="clarity-value" className='tab group'> + <Badge className='badge transition-colors'>Converting Clarity values</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + import { Cl } from '@stacks/transactions'; + + const accounts = simnet.getAccounts(); + const wallet = accounts.get('wallet_1')!; + + const hasParticipated = simnet.getMapEntry( + "pool", + "Participants", + Cl.standardPrincipal(wallet) + ); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + + (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + { + type: 10, + value: { + type: 3, + }, + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + getMapEntry( + contract: string, + mapName: string, + mapKey: ClarityValue + ): ClarityValue + ``` + </Accordion> + </Accordions> + + </TabsContent> + <TabsContent value="clarity-value"> + ```ts + import { Cl, cvToValue } from '@stacks/transactions'; + + const accounts = simnet.getAccounts(); + const wallet = accounts.get('wallet_1')!; + + const hasParticipated = simnet.getMapEntry( + "pool", + "Participants", + Cl.standardPrincipal(wallet) + ); + + const response = cvToValue(hasParticipated); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + + (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + { + type: "bool", + value: true, + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + getMapEntry( + contract: string, + mapName: string, + mapKey: ClarityValue + ): ClarityValue + ``` + </Accordion> + </Accordions> + + </TabsContent> +</Tabs> + + +# `callReadOnlyFn` + +Call read-only functions exposed by a contract. + +This method returns an object with the result of the function call as a `ClarityValue`. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions). + +## Parameters + +The contract identifier of the contract. + +<span>Example: `pool`</span> + +The name of the read-only function within the contract. + +<span>Example: `get-participant`</span> + +The arguments to pass to the read-only function. If no arguments are needed, pass an empty array. + +<span>Example: `[Cl.standardPrincipal( + 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5' +)]`</span> + +The Stacks address of the sender. + +<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span> + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Making a function call</Badge> + </TabsTrigger> + <TabsTrigger value="with-no-arguments" className='tab group'> + <Badge className='badge transition-colors'>With no arguments</Badge> + </TabsTrigger> + <TabsTrigger value="deployer" className='tab group'> + <Badge className='badge transition-colors'>With an explicit contract address</Badge> + </TabsTrigger> + <TabsTrigger value="clarity-value" className='tab group'> + <Badge className='badge transition-colors'>Converting Clarity values</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + import { Cl } from '@stacks/transactions'; + + const accounts = simnet.getAccounts(); + const wallet = accounts.get('wallet_1')!; + + const getContributionAmount = simnet.callReadOnlyFn( + 'pool', + 'get-contribution-amount', + [Cl.standardPrincipal(wallet)], + wallet + ); + + const response = getContributionAmount.result + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + + (define-read-only (get-participant (who principal)) + (map-get? ParticipantStatus who) + ) + + (define-read-only (get-contribution-amount (who principal)) + (default-to u0 (get contributionAmount (get-participant who))) + ) + + (define-read-only (is-active) + (map-get? Participants tx-sender) + ) + + (map-set Participants tx-sender true) + (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 }) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + { + type: 1, + value: 420000000n, + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + callReadOnlyFn( + contract: string, + method: string, + args: ClarityValue[], + sender: string + ): ParsedTransactionResult + ``` + </Accordion> + </Accordions> + + </TabsContent> + <TabsContent value="with-no-arguments"> + ```ts + import { Cl } from '@stacks/transactions'; + + const accounts = simnet.getAccounts(); + const wallet = accounts.get('wallet_1')!; + + const isActive = simnet.callReadOnlyFn( + 'pool', + 'is-active', + [], + wallet + ); + + const response = isActive.result + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + + (define-read-only (get-participant (who principal)) + (map-get? ParticipantStatus who) + ) + + (define-read-only (get-contribution-amount (who principal)) + (default-to u0 (get contributionAmount (get-participant who))) + ) + + (define-read-only (is-active) + (map-get? Participants tx-sender) + ) + + (map-set Participants tx-sender true) + (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 }) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + { + type: 10, + value: { + type: 3, + }, + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + callReadOnlyFn( + contract: string, + method: string, + args: ClarityValue[], + sender: string + ): ParsedTransactionResult + ``` + </Accordion> + </Accordions> + + </TabsContent> + <TabsContent value="deployer"> + ```ts + import { Cl } from '@stacks/transactions'; + + const accounts = simnet.getAccounts(); + const wallet = accounts.get('deployer')!; + const contractAddress = `${wallet}.pool`; + + const getParticipant = simnet.callReadOnlyFn( + contractAddress, + 'get-participant', + [Cl.standardPrincipal(wallet)], + wallet + ); + + const response = getParticipant.result; + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + + (define-read-only (get-participant (who principal)) + (map-get? ParticipantStatus who) + ) + + (define-read-only (get-contribution-amount (who principal)) + (default-to u0 (get contributionAmount (get-participant who))) + ) + + (define-read-only (is-active) + (map-get? Participants tx-sender) + ) + + (map-set Participants tx-sender true) + (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 }) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + { + type: 9, + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + callReadOnlyFn( + contract: string, + method: string, + args: ClarityValue[], + sender: string + ): ParsedTransactionResult + ``` + </Accordion> + </Accordions> + + </TabsContent> + <TabsContent value="clarity-value"> + ```ts + import { Cl, cvToValue } from '@stacks/transactions'; + + const accounts = simnet.getAccounts(); + const wallet = accounts.get('deployer')!; + + const getContributionAmount = simnet.callReadOnlyFn( + 'pool', + 'get-contribution-amount', + [Cl.standardPrincipal(wallet)], + wallet + ); + + const response = cvToValue(getContributionAmount.result); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + + (define-read-only (get-participant (who principal)) + (map-get? ParticipantStatus who) + ) + + (define-read-only (get-contribution-amount (who principal)) + (default-to u0 (get contributionAmount (get-participant who))) + ) + + (define-read-only (is-active) + (map-get? Participants tx-sender) + ) + + (map-set Participants tx-sender true) + (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 }) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + 42000000n + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + callReadOnlyFn( + contract: string, + method: string, + args: ClarityValue[], + sender: string + ): ParsedTransactionResult + ``` + </Accordion> + </Accordions> + + </TabsContent> +</Tabs> + + +# `callPublicFn` + +Call public functions exposed by a contract. + +This method returns an object with the result of the function call as a `ClarityValue` and the events fired during the function execution. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions). + +This method will simulate a block being mined and increase the block height by one. + +## Parameters + +The contract identifier of the contract. + +<span>Example: `pool`</span> + +The name of the public function within the contract. + +<span>Example: `register-participant`</span> + +The arguments to pass to the public function. If no arguments are needed, pass an empty array. + +<span>Example: `[Cl.standardPrincipal( + 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5' +)]`</span> + +The Stacks address of the sender. + +<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span> + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Broadcasting your transaction</Badge> + </TabsTrigger> + <TabsTrigger value="clarity-value" className='tab group'> + <Badge className='badge transition-colors'>Converting Clarity values</Badge> + </TabsTrigger> + <TabsTrigger value="events" className='tab group'> + <Badge className='badge transition-colors'>Filtering for contract events</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + import { Cl } from '@stacks/transactions'; + + const accounts = simnet.getAccounts(); + const wallet = accounts.get('deployer')!; + + const registerParticipant = simnet.callPublicFn( + 'pool', + 'register-participant', + [Cl.standardPrincipal(wallet)], + wallet + ); + + const response = registerParticipant.result; + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + + (define-public (register-participant (who principal)) + (begin + (map-set Participants who true) + (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 }) + (print { message: "Registered", who: who, at: block-height }) + (ok true) + ) + ) + + (map-set Participants tx-sender true) + (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 }) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + { + type: 7, + value: { + type: 3, + }, + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + callPublicFn( + contract: string, + method: string, + args: ClarityValue[], + sender: string + ): ParsedTransactionResult + ``` + </Accordion> + </Accordions> + + </TabsContent> + <TabsContent value="clarity-value"> + ```ts + import { Cl, cvToValue } from '@stacks/transactions'; + + const accounts = simnet.getAccounts(); + const wallet = accounts.get('deployer')!; + + const registerParticipant = simnet.callPublicFn( + 'pool', + 'register-participant', + [Cl.standardPrincipal(wallet)], + wallet + ); + + const response = cvToValue(registerParticipant.result); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + + (define-public (register-participant (who principal)) + (begin + (map-set Participants who true) + (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 }) + (print { message: "Registered", who: who, at: block-height }) + (ok true) + ) + ) + + (map-set Participants tx-sender true) + (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 }) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + { + type: "bool", + value: true, + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + callPublicFn( + contract: string, + method: string, + args: ClarityValue[], + sender: string + ): ParsedTransactionResult + ``` + </Accordion> + </Accordions> + + </TabsContent> + <TabsContent value="events"> + ```ts + import { Cl, cvToValue, type ClarityValue } from '@stacks/transactions'; + + const accounts = simnet.getAccounts(); + const wallet = accounts.get('deployer')!; + + const registerParticipant = simnet.callPublicFn( + 'pool', + 'register-participant', + [Cl.standardPrincipal(wallet)], + wallet + ); + + const eventValues = registerParticipant.events.map((event) => + cvToValue(event.data.value as ClarityValue) + ); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + + (define-public (register-participant (who principal)) + (begin + (map-set Participants who true) + (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 }) + (print { message: "Registered", who: who, at: block-height }) + (ok true) + ) + ) + + (map-set Participants tx-sender true) + (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 }) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + [ + { + at: { + type: "uint", + value: "2", + }, + message: { + type: "(string-ascii 10)", + value: "Registered", + }, + who: { + type: "principal", + value: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM", + }, + } + ] + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + callPublicFn( + contract: string, + method: string, + args: ClarityValue[], + sender: string + ): ParsedTransactionResult + ``` + </Accordion> + </Accordions> + + </TabsContent> +</Tabs> + + + +# `callPrivateFn` + +Call private functions exposed by a contract. + +This method returns an object with the result of the function call as a `ClarityValue` and the events, if any, fired during the function execution. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions). + +This method will simulate a block being mined and increase the block height by one. + +## Parameters + +The contract identifier of the contract. + +<span>Example: `pool`</span> + +The name of the private function within the contract. + +<span>Example: `reward-participant-points`</span> + +The arguments to pass to the private function. If no arguments are needed, pass an empty array. + +<span>Example: `[Cl.standardPrincipal( + 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5' +)]`</span> + +The Stacks address of the sender. + +<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span> + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Broadcasting your transaction</Badge> + </TabsTrigger> + <TabsTrigger value="clarity-value" className='tab group'> + <Badge className='badge transition-colors'>Converting Clarity values</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + import { Cl } from '@stacks/transactions'; + + const accounts = simnet.getAccounts(); + const wallet = accounts.get('deployer')!; + const address1 = accounts.get("wallet_1")! + + const rewardParticipantPoints = simnet.callPrivateFn( + "pool", + "reward-participant-points", + [Cl.standardPrincipal(address1)], + wallet + ); + + const response = rewardParticipantPoints.result; + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + (define-map ParticipantPoints principal int) + + (define-public (register-participant (who principal)) + (begin + (map-set Participants who true) + (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 }) + (reward-participant-points who) + (print { message: "Registered", who: who, at: block-height }) + (ok true) + ) + ) + + (define-private (reward-participant-points (who principal)) + (map-insert ParticipantPoints who 100) + ) + + (map-set Participants tx-sender true) + (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 }) + (map-set ParticipantPoints tx-sender 1000) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + { + type: 3, + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + callPrivateFn( + contract: string, + method: string, + args: ClarityValue[], + sender: string + ): ParsedTransactionResult + ``` + </Accordion> + </Accordions> + + </TabsContent> + <TabsContent value="clarity-value"> + ```ts + import { Cl, cvToValue } from '@stacks/transactions'; + + const accounts = simnet.getAccounts(); + const wallet = accounts.get('deployer')!; + const address1 = accounts.get("wallet_1")! + + const rewardParticipantPoints = simnet.callPrivateFn( + "pool", + "reward-participant-points", + [Cl.standardPrincipal(address1)], + wallet + ); + + const response = cvToValue(registerParticipant.result); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + (define-map ParticipantPoints principal int) + + (define-public (register-participant (who principal)) + (begin + (map-set Participants who true) + (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 }) + (reward-participant-points who) + (print { message: "Registered", who: who, at: block-height }) + (ok true) + ) + ) + + (define-private (reward-participant-points (who principal)) + (map-insert ParticipantPoints who 100) + ) + + (map-set Participants tx-sender true) + (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 }) + (map-set ParticipantPoints tx-sender 1000) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + { + type: "bool", + value: true, + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + callPrivateFn( + contract: string, + method: string, + args: ClarityValue[], + sender: string + ): ParsedTransactionResult + ``` + </Accordion> + </Accordions> + + </TabsContent> + +</Tabs> + + + +# `transferSTX` + +Transfer STX from one address to another. The amount transferred is in `uSTX`. + +This method will simulate a block being mined and increase the block height by one. + +## Parameters + +The amount of `uSTX` to transfer. + +<span>Example: `1000000` equals 1 STX</span> + +The Stacks address of the recipient. + +<span>Example: `ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5`</span> + +The Stacks address of the sender. + +<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span> + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Transferring STX</Badge> + </TabsTrigger> + <TabsTrigger value="clarity-value" className='tab group'> + <Badge className='badge transition-colors'>Converting Clarity values</Badge> + </TabsTrigger> + <TabsTrigger value="events" className='tab group'> + <Badge className='badge transition-colors'>Filtering for contract events</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const accounts = simnet.getAccounts(); + const recipient = accounts.get('wallet_1')!; + + const transfer = simnet.transferSTX( + 42000000, // 42 STX + recipient, + simnet.deployer + ); + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + { + result: { + type: 7, + value: { + type: 3, + }, + }, + events: [ + { + event: "stx_transfer_event", + data: [ + { + amount: "42000000", + memo: "", + recipient: "ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5", + sender: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM", + }, + ], + } + ], + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + transferSTX( + amount: number | bigint, + recipient: string, + sender: string + ): ParsedTransactionResult + ``` + </Accordion> + </Accordions> + + </TabsContent> + <TabsContent value="clarity-value"> + ```ts + import { cvToValue } from '@stacks/transactions'; + + const accounts = simnet.getAccounts(); + const recipient = accounts.get('wallet_1')!; + + const transfer = simnet.transferSTX( + 42000000, // 42 STX + recipient, + simnet.deployer + ); + + const response = cvToValue(transfer.result); + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + { + type: "bool", + value: true, + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + transferSTX( + amount: number | bigint, + recipient: string, + sender: string + ): ParsedTransactionResult + ``` + </Accordion> + </Accordions> + + </TabsContent> + <TabsContent value="events"> + ```ts + const accounts = simnet.getAccounts(); + const recipient = accounts.get('wallet_1')!; + + const transfer = simnet.transferSTX( + 42000000, // 42 STX + recipient, + simnet.deployer + ); + + const events = transfer.events.map((event) => event); + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + [ + { + event: "stx_transfer_event", + data: { + amount: "42000000", + memo: "", + recipient: "ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5", + sender: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM", + }, + } + ] + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + transferSTX( + amount: number | bigint, + recipient: string, + sender: string + ): ParsedTransactionResult + ``` + </Accordion> + </Accordions> + + </TabsContent> +</Tabs> + + + +# `deployContract` + +Deploy a contract to simnet. + +This method will simulate a block being mined and increase the block height by one. + +## Parameters + +The name of the contract to be deployed. + +<span>Example: `hello-world`</span> + +The Clarity source code (or content) of the contract. + +<span>Example: `(define-read-only (say-hi) (ok "Hello World"))`</span> + +An object to specify options, such as the Clarity version. + +<span>Example: `{ clarityVersion: 2 }` | `null`</span> + +The Stacks address of the sender. + +<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span> + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Deploying your contract</Badge> + </TabsTrigger> + <TabsTrigger value="options" className='tab group'> + <Badge className='badge transition-colors'>Specifying a Clarity version</Badge> + </TabsTrigger> + <TabsTrigger value="interact" className='tab group'> + <Badge className='badge transition-colors'>Interacting with your contract</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + import { cvToValue } from '@stacks/transactions'; + + const sourceCode = '(define-read-only (say-hi) (ok "Hello World"))'; + + const contract = simnet.deployContract( + 'hello-world', + sourceCode, + null, + simnet.deployer + ); + + const response = cvToValue(contract.result); + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + true + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + deployContract( + name: string, + content: string, + options: DeployContractOptions | null, + sender: string + ): ParsedTransactionResult + ``` + </Accordion> + </Accordions> + + </TabsContent> + <TabsContent value="options"> + ```ts + import { cvToValue } from '@stacks/transactions'; + + const sourceCode = '(define-read-only (say-hi) (ok "Hello World"))'; + + const contract = simnet.deployContract( + 'hello-world', + sourceCode, + { clarityVersion: 2 }, + simnet.deployer + ); + + const response = cvToValue(contract.result); + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + true + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + deployContract( + name: string, + content: string, + options: DeployContractOptions | null, + sender: string + ): ParsedTransactionResult + ``` + </Accordion> + </Accordions> + + </TabsContent> + <TabsContent value="interact"> + ```ts + import { cvToValue } from '@stacks/transactions'; + + const sourceCode = '(define-read-only (say-hi) (ok "Hello World"))'; + + simnet.deployContract( + 'hello-world', + sourceCode, + null, + simnet.deployer + ); + + const sayHi = simnet.callReadOnlyFn("hello-world", "say-hi", [], simnet.deployer); + + const response = sayHi.result + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + { + type: "(string-ascii 11)", + value: "Hello World", + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + deployContract( + name: string, + content: string, + options: DeployContractOptions | null, + sender: string + ): ParsedTransactionResult + ``` + </Accordion> + </Accordions> + + </TabsContent> +</Tabs> + + + +# `mineBlock` + +The `callPublicFn`, `transferSTX`, and `deployContract` methods all mine one block with only one transaction. It can also be useful to mine a block with multiple transactions. + +This is what `mineBlock` is for. + +This method takes an array of transaction objects. The transactions can be built with the `tx` helper exported by the SDK. + +The `tx` helper has three methods: +- `callPublicFn` +- `transferSTX` +- `deployContract` + +These methods have the same interface as simnet methods but instead of performing a transaction, they will build a transaction object that can be passed to the `mineBlock` function. + +In epochs from 3.0 on, the stacks chaintip is advanced separately from the burn chaintip. This means `mineBlock` will only affect the stacks chaintip. If you'd like to also mine burn blocks, use the `mineEmptyBurnBlock` function. + +## Parameters + +An array of transactions to be included in the block. + +<span>Example: `[tx.transferSTX(100, recipient, sender), ...]`</span> + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Mining multiple transactions in a single block</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + import { tx } from '@hirosystems/clarinet-sdk'; + import { Cl, cvToValue } from '@stacks/transactions'; + + const accounts = simnet.getAccounts(); + const wallet = accounts.get("wallet_1")!; + + const block = simnet.mineBlock([ + tx.callPublicFn("counter", "increment", [], simnet.deployer), + tx.callPublicFn("counter", "add", [Cl.uint(10)], simnet.deployer), + tx.transferSTX(19000000, wallet, simnet.deployer), + ]); + + block.forEach((transaction) => { + console.log(cvToValue(transaction.result)); + if (transaction.events.length > 0) console.log(transaction.events); + }); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity counter.clar + (define-data-var count uint u0) + + (define-public (increment) + (begin + (var-set count (+ (var-get count) u1)) + (ok (var-get count)) + ) + ) + + (define-public (add (amount uint)) + (begin + (var-set count (+ (var-get count) amount)) + (ok (var-get count)) + ) + ) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + { + type: "uint", + value: "1", + } + { + type: "uint", + value: "11", + } + { + type: "bool", + value: true, + } + [ + { + event: "stx_transfer_event", + data: { + amount: "19000000", + memo: "", + recipient: "ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5", + sender: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM", + }, + } + ] + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + type ParsedTransactionResult = { + result: ClarityValue; + events: ClarityEvent[]; + } + + mineBlock(txs: Tx[]): ParsedTransactionResult[] + ``` + </Accordion> + </Accordions> + + </TabsContent> +</Tabs> + + + +# `mineEmptyBlock` + +Mine one empty block and increase the block height by one. + +Returns the new block height. + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Mining an empty block</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + simnet.mineEmptyBlock(); + + const response = simnet.blockHeight; + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + 2 + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + mineEmptyBlock(): number + ``` + </Accordion> + </Accordions> + + </TabsContent> +</Tabs> + + + +# `mineEmptyBlocks` + +Mine multiple empty blocks to reach a certain block height. + +Returns the new block height. + +## Parameters + +The number of empty blocks to mine. This parameter is optional. + +<span>Example: `5`</span> + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Mining multiple empty blocks</Badge> + </TabsTrigger> + <TabsTrigger value="options" className='tab group'> + <Badge className='badge transition-colors'>Mining an empty block without a count</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + simnet.mineEmptyBlocks(5); + + const response = simnet.blockHeight; + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + 6 + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + mineEmptyBlocks(count?: number): number + ``` + </Accordion> + </Accordions> + </TabsContent> + <TabsContent value="options"> + ```ts + simnet.mineEmptyBlocks(); + + const response = simnet.blockHeight; + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + 2 + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + mineEmptyBlocks(count?: number): number + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + + +# `runSnippet` + +Execute arbitrary Clarity code directly, which allows you to test and interact with smart contract functions without deploying them. + +## Parameters + +The Clarity code snippet to be executed. + +<span>Example: `(define-read-only (get-balance) (ok stx-balance))`</span> + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Executing arbitrary Clarity code</Badge> + </TabsTrigger> + <TabsTrigger value="transfer" className='tab group'> + <Badge className='badge transition-colors'>Running a snippet for a STX transfer</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + import { Cl } from '@stacks/transactions'; + + const codeSnippet = simnet.runSnippet( + '(stx-account tx-sender)' + ); + + const response = Cl.prettyPrint(codeSnippet, 2); + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + { + locked: u0, + unlock-height: u0, + unlocked: u100000000000000 + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + runSnippet(snippet: string): string | ClarityValue + ``` + </Accordion> + </Accordions> + </TabsContent> + <TabsContent value="transfer"> + ```ts + import { cvToValue } from "@stacks/transactions"; + + const accounts = simnet.getAccounts(); + const recipient = accounts.get("wallet_1")!; + + const codeSnippet = simnet.runSnippet( + `(stx-transfer? u19000000 tx-sender '${recipient})` + ); + + const response = cvToValue(codeSnippet); + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + { + type: "bool", + value: true, + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + runSnippet(snippet: string): string | ClarityValue + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + +# `getContractsInterfaces` + +Returns the interfaces of the project contracts as a Map of Contracts, with the keys being the contract addresses. + +These interfaces contain information such as the available `functions`, `data-vars`, `maps`, `NFTs`, and `FTs` defined in the contract. + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Getting a specific contract interface</Badge> + </TabsTrigger> + <TabsTrigger value="filter" className='tab group'> + <Badge className='badge transition-colors'>Filtering for contract functions</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const contractInterfaces = simnet.getContractsInterfaces(); + + const response = contractInterfaces.get(`${simnet.deployer}.pool`); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + + (define-read-only (get-participant (who principal)) + (map-get? ParticipantStatus who) + ) + + (define-read-only (is-active) + (map-get? Participants tx-sender) + ) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + { + functions: [ + { + name: "get-participant", + access: "read_only", + args: [ + [Object ...] + ], + outputs: [Object ...], + }, { + name: "is-active", + access: "read_only", + args: [], + outputs: [Object ...], + } + ], + variables: [], + maps: [ + { + name: "ParticipantStatus", + key: "principal", + value: [Object ...], + }, { + name: "Participants", + key: "principal", + value: "bool", + } + ], + fungible_tokens: [], + non_fungible_tokens: [], + epoch: "Epoch25", + clarity_version: "Clarity2", + } + + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + getContractsInterfaces(): Map<string, ContractInterface> + ``` + </Accordion> + </Accordions> + </TabsContent> + <TabsContent value="filter"> + ```ts + const poolContract = contractInterfaces.get(`${simnet.deployer}.pool`); + + const response = poolContract?.functions; + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + + (define-read-only (get-participant (who principal)) + (map-get? ParticipantStatus who) + ) + + (define-read-only (is-active) + (map-get? Participants tx-sender) + ) + ``` + </Accordion> + <Accordion title="Response"> + ```ts + [ + { + name: "get-participant", + access: "read_only", + args: [ + [Object ...] + ], + outputs: [Object ...], + }, { + name: "is-active", + access: "read_only", + args: [], + outputs: [Object ...], + } + ] + + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + getContractsInterfaces(): Map<string, ContractInterface> + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + + +# `getContractSource` + +Get the source code of a contract as a string. + +## Parameters + +The identifier of the contract for which the source code is requested. + +<span>Example: `pool`</span> + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Getting the source code of a contract</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const contractSource = simnet.getContractSource('pool'); + ``` + + <Accordions> + <Accordion title="Source code"> + ```clarity pool.clar + (define-map Participants principal bool) + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + + (define-read-only (get-participant (who principal)) + (map-get? ParticipantStatus who) + ) + + (define-read-only (is-active) + (map-get? Participants tx-sender) + ) + ``` + </Accordion> + <Accordion title="Response"> + ```clarity + (define-map Participants principal bool) + (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint }) + + (define-read-only (get-participant (who principal)) + (map-get? ParticipantStatus who) + ) + + (define-read-only (is-active) + (map-get? Participants tx-sender) + ) + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + getContractSource(contract: string): string | undefined + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + +# `getContractAST` + +Get the full AST (Abstract Syntax Tree) of a Clarity contract. + +This method throws an error if it fails to get the AST or to encode it. + +## Parameters + +The identifier of the contract for which the AST (Abstract Syntax Tree) is requested. + +<span>Example: `pool`</span> + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Getting the source code of a contract</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const contractAST = simnet.getContractAST('pool'); + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + { + contract_identifier: { + issuer: [ 26, [ + 109, 120, 222, 123, 6, 37, 223, 191, 193, 108, 58, 138, 87, 53, 246, 220, + 61, 195, 242, 206 + ] ], + name: "pool", + }, + pre_expressions: [], + expressions: [ + { + expr: [Object ...], + id: 1, + span: [Object ...], + pre_comments: [], + end_line_comment: undefined, + post_comments: [], + }, + ... + ], + top_level_expression_sorting: [ 0, 1, 2, 3 ], + referenced_traits: Map {}, + implemented_traits: [], + wasm_module: undefined, + } + ``` + </Accordion> + <Accordion title="Schema"> + ```ts + getContractAST(contractId: string): ContractAST + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + diff --git a/content/docs/stacks/reference/clarinet-js-sdk/properties.mdx b/content/docs/stacks/reference/clarinet-js-sdk/properties.mdx new file mode 100644 index 000000000..60ec44d2c --- /dev/null +++ b/content/docs/stacks/reference/clarinet-js-sdk/properties.mdx @@ -0,0 +1,113 @@ +--- +title: Properties +description: The Clarinet JS SDK provides properties that can be used to interact with simnet. +full: true +--- + +import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; +import { Badge } from '@/components/ui/badge'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; + + + +# `blockHeight` + +Returns the current block height of simnet. + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Getting the current block height</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const currentBlockHeight = simnet.blockHeight; + ``` + </TabsContent> +</Tabs> + +<Accordions> + <Accordion title="Response"> + ```ts + 1 + ``` + </Accordion> +</Accordions> + + +# `deployer` + +Returns the default deployer address as defined in the project file. + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Getting the deployer address</Badge> + </TabsTrigger> + <TabsTrigger value="set-deployer" className='tab group'> + <Badge className='badge transition-colors'>Setting the deployer to a new address</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const currentDeployerAddress = simnet.deployer; + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + ``` + </Accordion> + </Accordions> + </TabsContent> + <TabsContent value="set-deployer"> + ```ts + simnet.deployer = 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'; + const newDeployer = simnet.deployer + ``` + + <Accordions> + <Accordion title="Response"> + ```ts + ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 + ``` + </Accordion> + </Accordions> + </TabsContent> +</Tabs> + + +# `currentEpoch` + +Returns the current epoch of simnet. + +This represents the Stacks blockchain's progress through discrete time periods, cycles, or upgrades. + + + +<Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='badge transition-colors'>Getting the current epoch of simnet</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + const epoch = simnet.currentEpoch; + ``` + </TabsContent> +</Tabs> + +<Accordions> + <Accordion title="Response"> + ```ts + 2.5 + ``` + </Accordion> +</Accordions> + diff --git a/content/docs/stacks/reference/clarinet-js-sdk/simnet.mdx b/content/docs/stacks/reference/clarinet-js-sdk/simnet.mdx new file mode 100644 index 000000000..2d2dde1b0 --- /dev/null +++ b/content/docs/stacks/reference/clarinet-js-sdk/simnet.mdx @@ -0,0 +1,58 @@ +--- +title: Simnet +description: The Simnet class is the main entry point for the Clarinet JS SDK. It provides properties and methods for interacting with the Clarinet network. +full: true +--- + +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion" +import { Badge } from '@/components/ui/badge'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; + +# `initSimnet` + +The `initSimnet` function initializes a simulated network. It will often be the first function you call when using the SDK. + +## Parameters + +The `manifestPath` is the path to the `Clarinet.toml` manifest file. + + <Tabs defaultValue="default"> + <TabsList className='flex flex-wrap'> + <TabsTrigger value="default" className='tab group'> + <Badge className='transition-colors'>Creating a new instance of simnet</Badge> + </TabsTrigger> + <TabsTrigger value="custom" className='tab group'> + <Badge className='badge transition-colors'>With a custom config path</Badge> + </TabsTrigger> + </TabsList> + <TabsContent value="default"> + ```ts + import { initSimnet } from '@hirosystems/clarinet-sdk'; + + const simnet = await initSimnet(); + ``` + </TabsContent> + <TabsContent value="custom"> + ```ts + import { initSimnet } from '@hirosystems/clarinet-sdk'; + + const simnet = await initSimnet('./config/Clarinet.toml'); + ``` + </TabsContent> + </Tabs> + + <Accordion type="single" collapsible className="w-full"> + <AccordionItem value="schema"> + <AccordionTrigger>Schema</AccordionTrigger> + <AccordionContent> + ```ts + initSimnet(manifestPath?: string): Promise<Simnet> + ``` + </AccordionContent> + </AccordionItem> + </Accordion> \ No newline at end of file diff --git a/content/docs/stacks/reference/cli/clarinet.mdx b/content/docs/stacks/reference/cli/clarinet.mdx new file mode 100644 index 000000000..a65005f5d --- /dev/null +++ b/content/docs/stacks/reference/cli/clarinet.mdx @@ -0,0 +1,5 @@ +--- +title: Clarinet CLI +description: The Clarinet CLI is a command-line tool for interacting with the Clarinet network. +full: true +--- diff --git a/content/docs/stacks/reference/cli/stacks-js.mdx b/content/docs/stacks/reference/cli/stacks-js.mdx new file mode 100644 index 000000000..5f9cbb434 --- /dev/null +++ b/content/docs/stacks/reference/cli/stacks-js.mdx @@ -0,0 +1,10 @@ +--- +title: Stacks.js CLI +description: The Stacks.js CLI is a command-line tool for creating new Stacks.js projects. +full: true +--- + + +```package-install +create stacks +``` \ No newline at end of file diff --git a/content/docs/stacks/reference/index.mdx b/content/docs/stacks/reference/index.mdx new file mode 100644 index 000000000..62821e48d --- /dev/null +++ b/content/docs/stacks/reference/index.mdx @@ -0,0 +1,117 @@ +--- +title: SDKs & Libraries +description: The following guides cover ways to use Hiro tools to build apps on Stacks. +icon: Code +full: true +--- + +import { Database, Ticket } from 'lucide-react'; +import { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon'; +import { SecondaryCard, SmallCard } from '@/components/card'; + +<div className='flex flex-col space-y-10'> + +<Cards> + <SecondaryCard + icon={<Clarinet />} + href="/stacks/clarinet/quickstart" + title="Create your first smart contract" + description="Build a simple counter contract using Clarinet." + tag='Clarinet' + /> + <SecondaryCard + icon={<Blockchain />} + href="/stacks/clarinet-js-sdk/quickstart" + title="Write unit tests for your smart contracts" + description="Learn how run unit tests with Clarinet JS SDK." + tag='Clarinet JS SDK' + /> + <SecondaryCard + icon={<Js />} + href="/stacks/stacks.js/quickstart" + title="Make a contract call with Stacks.js" + description="Learn how to integrate smart contracts into your app." + tag='Stacks.js' + /> + <SecondaryCard + icon={<Database />} + href="/stacks/chainhook/quickstart" + title="Stream custom blockchain events" + description="Use Chainhook to filter & stream for contract deployments." + tag='Chainhook' + /> +</Cards> + +<div className='flex flex-col'> + +<h4 id="learn-by-example" className="text-[#595650] dark:text-[#8c877d] scroll-m-20"> + <a href="#learn-by-example" className="not-prose group text-sm uppercase">Learn by example</a> +</h4> + +--- + +<Cards> + <SmallCard + icon={<Shapes />} + href="/guides/build-an-nft-marketplace" + title="Build an NFT Marketplace" + description="Learn how to create and deploy your own NFT marketplace." + /> + {/* <SmallCard + icon={<DAO />} + href="/stacks/clarinet" + title="Launch a Decentralized Autonomous Organization (DAO)" + description="Discover the steps to creating your own DAO." + /> */} + <SmallCard + icon={<Ticket />} + href="/guides/no-loss-lottery" + title="Create a no-loss lottery pool" + description="Build a no-loss lottery pool that leverages stacking yield." + /> + <SmallCard + icon={<Plant />} + href="/guides/build-a-decentralized-kickstarter" + title="Build a decentralized Kickstarter" + description="Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party." + /> +</Cards> + +</div> + +<div className='flex flex-col'> + +<h4 id="installation-guides" className="text-[#595650] dark:text-[#8c877d] scroll-m-20"> + <a href="#installation-guides" className="not-prose group text-sm uppercase">Installation guides</a> +</h4> + +--- + +<Cards> + <SmallCard + icon={<BitcoinIcon />} + href="/guides/sync-a-bitcoin-node" + title="Sync a Bitcoin node" + description="Set up and run a Bitcoin node to run tools like Chainhook as a service." + /> + <SmallCard + icon={<StacksIcon />} + href="/guides/sync-a-stacks-node" + title="Sync a Stacks node" + description="Set up and run a Stacks node to use tools like Chainhook or spin up your own API." + /> + <SmallCard + icon={<Container />} + href="/guides/installing-docker" + title="Install and run Docker on your machine" + description="Essential for running a local development with Clarinet" + /> +</Cards> + +</div> + +<Callout type="tip"> +For more, check out our [guides](/guides) section. +</Callout> + +</div> diff --git a/content/docs/stacks/reference/meta.json b/content/docs/stacks/reference/meta.json new file mode 100644 index 000000000..1f6ce7d92 --- /dev/null +++ b/content/docs/stacks/reference/meta.json @@ -0,0 +1,19 @@ +{ + "title": "SDKs & Libraries", + "root": true, + "pages": [ + "---Stacks Blockchain API---", + "stacks-blockchain-api/client", + "---Stacks.js---", + "stacks/js/common", + "stacks.js/connect", + "stacks.js/network", + "stacks.js/transactions", + "stacks.js/sbtc", + "---Clarinet JS SDK---", + "clarinet-js-sdk/clarinet-sdk", + "---CLI tools---", + "cli/clarinet", + "cli/stacks-js" + ] +} diff --git a/content/docs/stacks/reference/stacks-blockchain-api/client.mdx b/content/docs/stacks/reference/stacks-blockchain-api/client.mdx new file mode 100644 index 000000000..1f8a818f3 --- /dev/null +++ b/content/docs/stacks/reference/stacks-blockchain-api/client.mdx @@ -0,0 +1,35 @@ +--- +title: '@stacks/blockchain-api-client' +description: Interact with the Stacks blockchain using a JavaScript client library. +full: true +--- + +import { Accordion, Accordions } from "fumadocs-ui/components/accordion"; +import { Blocks, Braces, CircleUserRound } from 'lucide-react'; +import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; + +The `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints. + +The client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming. + +```ts +import { AccountsApi } from '@stacks/blockchain-api-client'; + +const accounts = new AccountsApi(apiConfig); + +await accounts.getAccountTransactions({ + principal: 'ST000000000000000000002AMW42H', +}); +``` + +### Using WebSockets + +```ts +import { connectWebSocketClient } from '@stacks/blockchain-api-client'; +const client = await connectWebSocketClient('ws://api.hiro.so/'); +const sub = await client.subscribeAddressTransactions(contractCall.txId, event => { + console.log(event); +}); + +await sub.unsubscribe(); +``` diff --git a/content/docs/stacks/reference/stacks.js/common.mdx b/content/docs/stacks/reference/stacks.js/common.mdx new file mode 100644 index 000000000..cb8e99970 --- /dev/null +++ b/content/docs/stacks/reference/stacks.js/common.mdx @@ -0,0 +1,108 @@ +--- +title: '@stacks/common' +description: Common utilities for working with Stacks. +full: true +--- + +import { Root, API, APIExample } from 'fumadocs-openapi/ui'; +import { Property } from 'fumadocs-openapi/ui' +import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; + +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; +import { Badge } from '@/components/ui/badge'; + +import { InlineCode } from '@/components/inline-code'; +import { Callout } from "@/components/callout"; + +<Callout type="info"> +This reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release. +Read the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version. +</Callout> + +The `@stacks/common` package contains common utilities for working with Stacks. +This includes fetch helpers, middleware, and various other functions. + +## Installation + +```package-install +@stacks/common@latest +``` + + +## Use the built-in API key middleware + +Some Stacks APIs make use API keys to provide less rate-limited plans. + +```typescript +import { createApiKeyMiddleware, createFetchFn, StacksMainnet } from '@stacks/network'; +import { broadcastTransaction, getNonce, makeSTXTokenTransfer } from '@stacks/transactions'; + +const myApiMiddleware = createApiKeyMiddleware('example_e8e044a3_41d8b0fe_3dd3988ef302'); +const myFetchFn = createFetchFn(myApiMiddleware); // middlewares can be used to create a new fetch function + +const txOptions = { + recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', + amount: 12345n, + senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01', + memo: 'some memo', + anchorMode: AnchorMode.Any, + client: { + fetch: myFetchFn, + } +}; +const transaction = await makeSTXTokenTransfer(txOptions); // fee-estimation will use the custom fetchFn + +const response = await broadcastTransaction(transaction, myMainnet); // make sure to broadcast via the custom network object + +// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn +const nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', myMainnet); +``` + +## Use custom middleware + +Middleware can be used to hook into network calls before sending a request or after receiving a response. + +```typescript +import { createFetchFn, RequestContext, ResponseContext } from '@stacks/common'; + +const preMiddleware = (ctx: RequestContext) => { + ctx.init.headers = new Headers(); + ctx.init.headers.set('x-foo', 'bar'); // override headers and set new `x-foo` header +}; +const postMiddleware = (ctx: ResponseContext) => { + console.log(await ctx.response.json()); // log response body as json +}; + +const fetchFn = createFetchFn({ pre: preMiddleware, post: preMiddleware }); // a middleware can contain `pre`, `post`, or both +const network = new StacksTestnet({ fetchFn }); + +// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn +const nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', network); +``` + +## Get various API URLs + +```typescript +const txBroadcastUrl = network.getBroadcastApiUrl(); + +const feeEstimateUrl = network.getTransferFeeEstimateApiUrl(); + +const address = 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26'; +const accountInfoUrl = network.getAccountApiUrl(address); + +const contractName = 'hello_world'; +const abiUrl = network.getAbiApiUrl(address, contractName); + +const functionName = 'hello'; +const readOnlyFunctionCallUrl = network.getReadOnlyFunctionCallApiUrl( + address, + contractName, + functionName +); + +const nodeInfoUrl = network.getInfoUrl(); + +const blockTimeUrl = network.getBlockTimeInfoUrl(); + +const poxInfoUrl = network.getPoxInfoUrl(); +``` diff --git a/content/docs/stacks/reference/stacks.js/connect.mdx b/content/docs/stacks/reference/stacks.js/connect.mdx new file mode 100644 index 000000000..b508a5069 --- /dev/null +++ b/content/docs/stacks/reference/stacks.js/connect.mdx @@ -0,0 +1,356 @@ +--- +title: '@stacks/connect' +description: Connect is a JavaScript library for building web applications connected to Stacks. +full: true +--- + +import { Root, API, APIExample } from 'fumadocs-openapi/ui'; +import { Property } from 'fumadocs-openapi/ui' +import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; + +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; +import { Badge } from '@/components/ui/badge'; + +import { InlineCode } from '@/components/inline-code'; + +Stacks Connect enables you to authenticate your users and connect your app to their wallet. This reference contains more detailed information on how you can authenticate users, sign and broadcast transactions on their behalf, and enable users to sign messages. + +<Callout title="Migration Note"> +Please be patient during the migration to version 8.x.x. There has been a long-running effort together with wallets to modernize the Stacks web ecosystem, culminating in [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) and the new `request` method in Stacks Connect 8.x.x. For the legacy version of `@stacks/connect` using JWT tokens, please use version 7.10.1. See the [Migration Guide](/docs/stacks/connect/guides/migration) for more details. +</Callout> + +### Installation + +```package-install +@stacks/connect +``` + +### Connect to a wallet + +Initiate a wallet connection and request addresses: + +```typescript +import { connect } from '@stacks/connect'; + +const response = await connect(); // stores users address in local storage by default +``` + +Get the local storage data (stored by a connect call): + +```typescript +import { getLocalStorage } from '@stacks/connect'; + +const data = getLocalStorage(); +// { +// "addresses": { +// "stx": [ +// { "address": "SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN" }, +// ], +// "btc": [ +// { "address": "bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae" }, +// ] +// } +``` + +Managing the connection state: + +```typescript +import { connect, disconnect, isConnected } from '@stacks/connect'; + +isConnected(); // false +await connect(); // similar to the `getAddresses` method +isConnected(); // true +disconnect(); // clears local storage and selected wallet +isConnected(); // false +``` + +### Use request to trigger wallet interactions + +```typescript +import { request } from '@stacks/connect'; + +// CONNECT +const response = await request({ forceWalletSelect: true }, 'getAddresses'); +``` + +### Available methods + +- [getAddresses](#getaddresses) +- [sendTransfer](#sendtransfer) +- [signPsbt](#signpsbt) +- [stx_getAddresses](#stx_getaddresses) +- [stx_getAccounts](#stx_getaccounts) +- [stx_transferStx](#stx_transferstx) +- [stx_callContract](#stx_callcontract) +- [stx_deployContract](#stx_deploycontract) +- [stx_signMessage](#stx_signmessage) +- [stx_signStructuredMessage](#stx_signstructuredmessage) + +#### getAddresses + +```typescript +const response = await request('getAddresses'); +// { +// "addresses": [ +// { +// "address": "bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae", +// "publicKey": "062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69", +// }, +// { +// "address": "bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr", +// "publicKey": "025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114", +// }, +// { +// "address": "SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN", +// "publicKey": "02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304", +// } +// ] +// } +``` + +#### sendTransfer + +```typescript +const response = await request('sendTransfer', { + recipients: [ + { + address: 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4', // recipient address + amount: '1000', // amount in sats + }, + // You can specify multiple recipients + { + address: 'bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh', + amount: '2000', + }, + ], +}); +// { +// "txid": "0x1234...", // The transaction ID +// } +``` + +#### signPsbt + +```typescript +const response = await request('signPsbt', { + psbt: 'cHNidP...', // base64 encoded PSBT string + signInputs: [{ index: 0, address }], // indices of inputs to sign (optional) + broadcast: false, // whether to broadcast the transaction after signing (optional) +}); +// { +// "txid": "0x1234...", // The transaction ID (if broadcast is true) +// "psbt": "cHNidP..." // The signed PSBT in base64 format +// } +``` + +#### stx_getAddresses + +```typescript +const response = await request('stx_getAddresses'); +// { +// "addresses": [ +// { +// "address": "bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae", +// "publicKey": "062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69", +// }, +// { +// "address": "bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr", +// "publicKey": "025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114", +// }, +// { +// "address": "SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN", +// "publicKey": "02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304", +// } +// ] +// } +``` + +#### stx_getAccounts + +```typescript +const response = await request('stx_getAccounts'); +// { +// "addresses": [ +// { +// "address": "SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN", +// "publicKey": "02d3331cbb9f72fe635e6f87c2cf1a13cd...", +// "gaiaHubUrl": "https://hub.hiro.so", +// "gaiaAppKey": "0488ade4040658015580000000dc81e3a5..." +// } +// ] +// } +``` + +#### stx_transferStx + +```typescript +const response = await request('stx_transferStx', { + amount: '1000', // amount in micro-STX (1 STX = 1,000,000 micro-STX) + recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN', // recipient address + network: 'mainnet', // optional, defaults to mainnet + memo: 'Optional memo', // optional memo field +}); +// { +// "txid": "0x1234...", // The transaction ID +// } +``` + +#### stx_callContract + +```typescript +const response = await request('stx_callContract', { + contract: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN.counters', // contract in format: address.contract-name + functionName: 'count', // name of the function to call + functionArgs: [Cl.int(3)], // array of Clarity values as arguments + network: 'mainnet', // optional, defaults to mainnet +}); +// { +// "txid": "0x1234...", // The transaction ID +// } +``` + +#### stx_deployContract + +```typescript +const response = await request('stx_deployContract', { + name: 'counters', // name of the contract + clarityCode: `(define-map counters principal int) + +(define-public (count (change int)) + (ok (map-set counters tx-sender (+ (get-count tx-sender) change))) +) + +(define-read-only (get-count (who principal)) + (default-to 0 (map-get? counters who)) +)`, // Clarity code as string + clarityVersion: '2', // optional, defaults to latest version + network: 'mainnet', // optional, defaults to mainnet +}); +// { +// "txid": "0x1234...", // The transaction ID +// } +``` + +#### stx_signMessage + +```typescript +const response = await request('stx_signMessage', { + message: 'Hello, World!', // message to sign +}); +// { +// "signature": "0x1234...", // The signature of the message +// "publicKey": "02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304" // The public key that signed the message +// } +``` + +#### stx_signStructuredMessage + +```typescript +const clarityMessage = Cl.parse('{ structured: "message", num: u3 }'); +const clarityDomain = Cl.tuple({ + domain: Cl.stringAscii('example.com'), + version: Cl.stringAscii('1.0.0'), + 'chain-id': Cl.uint(1), +}); + +const response = await request('stx_signStructuredMessage', { + message: clarityMessage, // Clarity value representing the structured message + domain: clarityDomain, // domain object for SIP-018 style signing +}); +// { +// "signature": "0x1234...", // The signature of the structured message +// "publicKey": "02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304" // The public key that signed the message +// } +``` + +### Error Handling + +The `request` method returns a Promise, allowing you to handle errors using standard Promise-based error handling patterns. You can use either `try/catch` with `async/await` or the `.catch()` method with Promise chains. + +#### Using try/catch with async/await + +```typescript +import { request } from '@stacks/connect'; + +try { + const response = await request('stx_transferStx', { + amount: '1000', + recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN', + }); + // SUCCESS + console.log('Transaction successful:', response.txid); +} catch (error) { + // ERROR + console.error('Wallet returned an error:', error); +} +``` + +### Compatibility + +The `request` method by default adds a layer of auto-compatibility for different wallet providers. This is meant to unify the interface where wallet providers may not implement methods and results the same way. + +<Callout title="Wallet Support"> +For a complete list of wallet compatibility and support status, see the [Wallet Support](/docs/stacks/connect/support) page. +</Callout> + +### Advanced Usage + +#### request + +The `request` method is called with an optional options object as the first parameter: + +```typescript +import { request } from '@stacks/connect'; + +// WITH options +const response = await request( + { + provider?: StacksProvider; // Custom provider to use for the request + + forceWalletSelect?: boolean; // Force user to select a wallet (default: false) + persistWalletSelect?: boolean; // Persist selected wallet (default: true) + enableOverrides?: boolean; // Enable provider compatibility (default: true) + enableLocalStorage?: boolean; // Store address in local storage (default: true) + + defaultProviders?: WbipProvider[]; // Default wallets to display in modal + approvedProviderIds?: string[]; // List of approved provider IDs to show in modal + }, + 'method', + params +); + +// WITHOUT options +const response = await request('method', params); +``` + +<Callout title="Provider Compatibility"> +The `enableOverrides` option enables automatic compatibility fixes for different wallet providers. For example, it handles converting numeric types between string and number formats as needed by different wallets, and remaps certain method names to match wallet-specific implementations. This ensures consistent behavior across different wallet providers without requiring manual adjustments. +</Callout> + +<Callout title="Approved Providers"> +The `approvedProviderIds` option allows you to filter which wallet providers are shown in the connect modal. This is useful when you want to limit the available wallet options to specific providers. For example, you might only want to support Leather wallet: + +```typescript +connect({ approvedProviderIds: ['LeatherProvider'] }); +``` + +Or multiple specific wallets: + +```typescript +connect({ approvedProviderIds: ['LeatherProvider', 'xverse'] }); +``` +</Callout> + +#### requestRaw + +The `requestRaw` method provides direct access to wallet providers without the additional features of `request`: + +```typescript +import { requestRaw } from '@stacks/connect'; + +const response = await requestRaw(provider, 'method', params); +``` + +<Callout title="Raw Request"> +`requestRaw` bypasses the UI wallet selector, automatic provider compatibility fixes, and other features that come with `request`. Use this when you need more manual control over the wallet interaction process. +</Callout> diff --git a/content/docs/stacks/reference/stacks.js/network.mdx b/content/docs/stacks/reference/stacks.js/network.mdx new file mode 100644 index 000000000..dcc1b974a --- /dev/null +++ b/content/docs/stacks/reference/stacks.js/network.mdx @@ -0,0 +1,71 @@ +--- +title: '@stacks/network' +description: Network and API library for working with Stacks blockchain nodes. +full: true +--- + +import { Root, API, APIExample } from 'fumadocs-openapi/ui'; +import { Property } from 'fumadocs-openapi/ui' +import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; + +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; +import { Badge } from '@/components/ui/badge'; + +import { InlineCode } from '@/components/inline-code'; +import { Callout } from "@/components/callout"; + +<Callout type="info"> +This reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release. +Read the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version. +</Callout> + +The `@stacks/network` package contains default network configurations for Stacks. + +## Installation + +<Callout type="tip"> +Before you install: most of the time you don't need to use or even install this library directly. +For example, instead of `STACKS_MAINNET`, simply use the string `"mainnet"` as the network parameter. +</Callout> + +```package-install +@stacks/network@latest +``` + +## Usage + +## The network object + +A network in Stacks.js is an object defining several properties. + +```ts +import { STACKS_MAINNET, STACKS_TESTNET, STACKS_DEVNET } from '@stacks/network'; + +console.log(STACKS_MAINNET); +// { +// chainId: 1, +// transactionVersion: 0, +// peerNetworkId: 385875968, +// magicBytes: 'X2', +// bootAddress: 'SP000000000000000000002Q6VF78', +// addressVersion: { singleSig: 22, multiSig: 20 } +// } +``` + +## Network usage in transaction building + +```ts +import { STACKS_MAINNET } from '@stacks/network'; +import { makeSTXTokenTransfer } from '@stacks/transactions'; + +const txOptions = { + recipient: 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26', + amount: 100, + // ... + network: 'mainnet', // 'mainnet', 'testnet', or 'devnet', (defaults to mainnet) + // OR + network: STACKS_MAINNET, // any compatible network object +}; + +const transaction = await makeSTXTokenTransfer(txOptions); +``` diff --git a/content/docs/stacks/reference/stacks.js/sbtc.mdx b/content/docs/stacks/reference/stacks.js/sbtc.mdx new file mode 100644 index 000000000..a0b042340 --- /dev/null +++ b/content/docs/stacks/reference/stacks.js/sbtc.mdx @@ -0,0 +1,232 @@ +--- +title: sbtc +description: A JS/TS helper package for interacting with sBTC. +--- + +import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; +import { Badge } from '@/components/ui/badge'; + +import { InlineCode } from '@/components/inline-code'; +import { Callout } from "@/components/callout"; + + +## Installation + +```package-install +sbtc +``` + +## Architecture + +The sBTC protocol operates across multiple layers: + +- **Bitcoin**: The original funds are sourced from Bitcoin. A depositor sends these funds to a group of signers, which manage a (rotating) multisignature address formatted for sBTC transactions. + +- **sBTC API (Emily)**: This API is responsible for tracking deposits and notifying the signers about pending deposits. + +- **Stacks**: The network where sBTC is minted. Once the deposit is confirmed, the signers mint the corresponding amount of sBTC to the depositor's specified address on the Stacks network. + +## Deposit Flow + +- **Create Deposit (Bitcoin) Transaction**: + - Structure a Bitcoin transaction to send funds to the group of signers. + - Use a specialized format that includes: + - Deposit Script: Identifies which Stacks address the sBTC will be minted to and what the maximum fee (in satoshis) the signers may take in exchange for minting. + - Reclaim Script: Allows the sender to reclaim their funds if the transaction is not processed by the signers. + +- **Sign and Broadcast the Transaction**: + - Sign the transaction with the sender's private key. + - Broadcast the transaction to the Bitcoin network (Bitcoin Regtest for Stacks Testnet). + +- **Notify the sBTC API (Emily)**: + - Inform the API about the transaction by submitting its details. This step ensures that the signers are aware of the deposit and can track it. + +- **Processing by Signers**: (no action required) + - The signers retrieve and verify the deposit transaction from the Bitcoin blockchain. + - Once verified, the signers mint the equivalent amount of sBTC on the Stacks network. + +- **Receive sBTC (Stacks)**: (no action required) + - The minted sBTC is sent to the depositor's designated Stacks address, completing the deposit process. + - sBTC is SIP-010 compatible and will show up in Stacks wallets and explorers. + +## Withdrawal Flow +_Coming soon_ + +## sBTC Package Functions + +The sBTC package exports high-level functions for building addresses and transactions for deposits. + +### Examples + + +#### buildSbtcDepositAddress +Build a deposit address and metadata using `buildSbtcDepositAddress` with a wallet provider using `sendTransfer`. + +```ts +import { buildSbtcDepositAddress, SbtcApiClientTestnet } from 'sbtc'; + +const client = new SbtcApiClientTestnet(); + +// 1. BUILD THE DEPOSIT ADDRESS AND METADATA +const deposit = buildSbtcDepositAddress({ + stacksAddress: TARGET_STX_ADDRESS, + signersPublicKey: await client.fetchSignersPublicKey(), + + // OPTIONAL DEFAULTS + // maxSignerFee: 80_000, // optional: fee to pay for the deposit transaction (taken from the signers from the sats) + // reclaimLockTime: 6_000, // optional: lock time for the reclaim script + // network: REGTEST, // optional: which bitcoin network to use +}); + +// `deposit.address` is the deposit address (send funds here, aka the deposit address as an output) + +// 2. DEPOSIT USING YOUR FAVORITE WALLET (TYPICALLY ALSO BROADCASTED BY THE WALLET) +const txid = await WalletProvider.sendTransfer({ + recipient: deposit.address, + amount: 100_000, // the amount to deposit; <=maxSignerFee is taken from this amount +}); + +// 3. NOTIFY THE SIGNERS +await client.notifySbtc({ txid, ...deposit }); +``` + +#### buildSbtcDepositTx +The `buildSbtcDepositTx` function is similar to `buildSbtcDepositAddress`, but instead of returning just a deposit address, it constructs a complete Bitcoin transaction for depositing sBTC. + +```ts +import { buildSbtcDepositTx } from 'sbtc'; + +// 1. BUILD THE DEPOSIT TRANSACTION AND METADATA +const deposit = buildSbtcDepositTx({ + amountSats: DEPOSIT_AMOUNT, // the amount in sats/sBTC to deposit; <=maxSignerFee is taken from this amount + + // same options as `buildSbtcDepositAddress` + network, + stacksAddress, + signersPublicKey, + maxSignerFee, + reclaimLockTime, +}); + +// `deposit.transaction` has one output, which is the combined taproot of the deposit and reclaim scripts + +// 2. SIGN THE TRANSACTION +deposit.transaction.sign(YOUR_BTC_PRIVATE_KEY); +deposit.transaction.finalize(); + +// 2. OR SIGN VIA EXTERNAL WALLET +const psbtBytes = deposit.transaction.toPSBT(); + +// 3. BROADCAST THE TRANSACTION +const txid = await client.broadcastTx(deposit.transaction); + +// 4. NOTIFY THE SIGNERS +await client.notifySbtc(deposit); +``` + + +#### sbtcDepositHelper +Create a fully-formed deposit transaction (assuming an address with spendable bitcoin UTXOs) + +<Callout>Use this helper function if you are not using a wallet provider</Callout> + +```ts +import { sbtcDepositHelper, SbtcApiClientTestnet } from 'sbtc'; + +const client = new SbtcApiClientTestnet(); + +// 1. BUILD THE DEPOSIT TRANSACTION AND METADATA (GIVEN UTXOS FOR AN ADDRESS) +const deposit = await sbtcDepositHelper({ + stacksAddress: TARGET_STX_ADDRESS, // where to send/mint the sBTC + amountSats: 5_000_000, // (maximum) amount of sBTC to deposit + + signersPublicKey: pub, // the aggregated public key of the signers + + feeRate: await client.fetchFeeRate('medium'), + utxos: await client.fetchUtxos(YOUR_BTC_ADDRESS), + + bitcoinChangeAddress: YOUR_BTC_ADDRESS, +}); + +// 2. SIGN THE TRANSACTION +deposit.transaction.sign(YOUR_BTC_PRIVATE_KEY); +deposit.transaction.finalize(); + +// 2. OR SIGN VIA EXTERNAL WALLET +const psbtBytes = deposit.transaction.toPSBT(); + +// 3. BROADCAST TRANSACTION +const txid = await client.broadcastTx(deposit.transaction); +console.log('txid', txid); + +// 4. NOTIFY THE SIGNERS +const res = await client.notifySbtc(deposit); +console.log('res', res.status, res.statusMessage); +``` + + +## HTTP Clients + +Additionally, there are two API helpers, which make it easier to get all the data needed to create the above transactions: + +- **SbtcApiClientMainnet** — a client for communicating with the different pieces of the sBTC deployment +- **SbtcApiClientTestnet** — a client for communicating with the different pieces of the sBTC deployment on Testnet +- **SbtcApiClientDevenv** — a client for developing against a local deployment of sBTC + +While the final adjustments are still being made in the pre-release phase, this package may change default URLs and contract addresses on every minor release. + +| Version | Purpose | Functionality | +| --- | --- | --- | +| 0.1.x | Developer release (hackathon) | | +| 0.2.x | Regtest/Testnet release | Deposit only | +| 0.3.x | Mainnet pre-release | Deposit only | + +### Examples + +```ts +import { SbtcApiClientMainnet, SbtcApiClientTestnet, SbtcApiClientDevenv } from 'sbtc'; + +const client = new SbtcApiClientMainnet(); +// const client = new SbtcApiClientTestnet(); +// const client = new SbtcApiClientDevenv(); + +const pub = await client.fetchSignersPublicKey(); // fetches the aggregated public key of the signers +const address = await client.fetchSignersAddress(); // fetches the p2tr address of the aggregated public key of the signers + +const feeRate = await client.fetchFeeRate('low'); // or 'medium', 'high' +const unspents = await client.fetchUtxos(BTC_ADDRESS); +const hex = await client.fetchTxHex(TXID); + +await client.broadcastTx(DEPOSIT_BTC_TX); // broadcast a deposit BTC transaction +await client.notifySbtc(DEPOSIT_BTC_TX); // notify the sBTC API about the deposit (otherwise it won't be processed) + +const sbtcBalance = await client.fetchSbtcBalance(STX_ADDRESS); // fetch the sBTC balance of an Stacks address +``` + +## API Reference + +### sbtcDepositHelper + +| Parameter | Description | Type | Default | +| --- | --- | --- | --- | +| signersPublicKey | Signers public key (aggregated schnorr) | string 32 byte hex | — | +| amountSats | Bitcoin amount denominated in sats (* 10^8) | number, bigint | — | +| stacksAddress | The deposit recipient Stacks address | string | — | +| bitcoinChangeAddress | Bitcoin change address | string | — | +| feeRate | Fee rate in sat/vbyte | number | — | +| utxos | UTXOs to "fund" the transaction | UtxoWithTx[] | — | +| reclaimPublicKey | Public key (schnorr, x-only) for reclaiming failed deposits | string | — | +| reclaimLockTime | Optional reclaim lock time | number | 144 | +| maxSignerFee | Optional maximum fee to pay to signers for the sBTC mint | number | 80_000 | +| network | Optional Bitcoin network | BitcoinNetwork | MAINNET | +| utxoToSpendable | Optional function to convert p2wpk and p2sh utxos to spendable inputs | Function | Best effort default implementation to make utxos spendable | +| paymentPublicKey | Optional payment public key (currently only used for default utxoToSpendable.sh implementation) | string hex | — | + +### SbtcApiClient Configuration + +| Parameter | Description | Type | +| --- | --- | --- | +| sbtcContract | The multisig address of the initial sBTC contract | string | +| sbtcApiUrl | The base URL of the sBTC API (Emily) | string | +| btcApiUrl | The base URL of the Bitcoin mempool/electrs API | string | +| stxApiUrl | The base URL of the Stacks API | string | diff --git a/content/docs/stacks/reference/stacks.js/transactions.mdx b/content/docs/stacks/reference/stacks.js/transactions.mdx new file mode 100644 index 000000000..8c0a78bdf --- /dev/null +++ b/content/docs/stacks/reference/stacks.js/transactions.mdx @@ -0,0 +1,498 @@ +--- +title: '@stacks/transactions' +description: Construct, decode transactions and work with Clarity smart contracts on the Stacks blockchain. +full: true +--- + +import { Root, API, APIExample } from 'fumadocs-openapi/ui'; +import { Property } from 'fumadocs-openapi/ui' +import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; + +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; +import { Badge } from '@/components/ui/badge'; + +import { InlineCode } from '@/components/inline-code'; + +<Callout type="info"> +This reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release. +Read the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version. +</Callout> + +## Installation + +```package-install +@stacks/transactions +``` + +This library supports the creation of the following Stacks transaction types: + +1. STX token transfer +2. Smart contract deploy +3. Smart contract function call + +## Key Generation + +```typescript -n +import { randomPrivateKey, privateKeyToPublicKey } from '@stacks/transactions'; + +// Random key +const privateKey = randomPrivateKey(); +const publicKey = privateKeyToPublicKey(privateKey); + +// Private key from hex string +const privateKey = 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01'; +``` + +## STX Token Transfer Transaction + +Use the [`makeSTXTokenTransfer`](https://stacks.js.org/functions/_stacks_transactions.makeSTXTokenTransfer) (with a sender private key), or the "unsigned" version [`makeUnsignedSTXTokenTransfer`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedSTXTokenTransfer) (with a sender public key, without yet signing) to create a STX token transfer transaction. + +```ts -n +import { makeSTXTokenTransfer, broadcastTransaction } from '@stacks/transactions'; + +const txOptions = { + recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', + amount: 12345n, + memo: 'test memo', + + senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01', + network: 'testnet', // for mainnet, use 'mainnet' +}; + +const transaction = await makeSTXTokenTransfer(txOptions); + +// to see the raw serialized tx +const serializedTx = transaction.serialize(); // hex string + +// broadcast to the network +const response = await broadcastTransaction({ transaction, network: 'testnet' }); +console.log(response.txid); +``` + +## Smart Contract Deploy Transaction + +Use the [`makeContractDeploy`](https://stacks.js.org/functions/_stacks_transactions.makeContractDeploy), or the "unsigned" version [`makeUnsignedContractDeploy`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedContractDeploy) to create a smart contract deploy transaction. + +```ts -n +import { makeContractDeploy, broadcastTransaction } from '@stacks/transactions'; +import { readFileSync } from 'fs'; + +const clarityCode = readFileSync('/path/to/contract.clar').toString(); + +const txOptions = { + contractName: 'contract_name', + codeBody: clarityCode, + clarityVersion: 3, // optional, defaults to latest deployed version + + senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01', + network: 'testnet', // for mainnet, use 'mainnet' +}; + +const transaction = await makeContractDeploy(txOptions); + +// broadcast to the network +const response = await broadcastTransaction({ transaction, network: 'testnet' }); +console.log(response.txid); +``` + +## Smart Contract Function Call (On-chain) + +If you want to call a readonly function, use [`fetchCallReadOnlyFunction`](https://stacks.js.org/functions/_stacks_transactions.fetchCallReadOnlyFunction) instead. + +Use the [`makeContractCall`](https://stacks.js.org/functions/_stacks_transactions.makeContractCall) or the "unsigned" version [`makeUnsignedContractCall`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedContractCall) to create a smart contract function call transaction. + +```ts -n +import { makeContractCall, broadcastTransaction, Cl, Pc } from '@stacks/transactions'; + +// Add an optional post condition +const condition01 = Pc.principal('SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE') + .willSendGte(1000000n) + .ustx(); + +const txOptions = { + contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X', + contractName: 'contract_name', + functionName: 'contract_function', + functionArgs: [Cl.bufferFromUtf8('foo string')], + postConditions: [condition01], + + validateWithAbi: true, // check if the arguments given are compatible with the function + + senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01', + network: 'testnet', // for mainnet, use 'mainnet' +}; + +const transaction = await makeContractCall(txOptions); + +// broadcast to the network +const response = await broadcastTransaction({ transaction, network: 'testnet' }); +console.log(response.txid); +``` + +In this example we construct a `contract-call` transaction with a post condition. We have set the `validateWithAbi` option to `true`, so the `makeContractCall` builder will attempt to fetch this contracts ABI from the specified Stacks network, and validate that the provided functionArgs match what is described in the ABI. This should help you avoid constructing invalid contract-call transactions. If you would prefer to provide your own ABI instead of fetching it from the network, the `validateWithAbi` option also accepts [ClarityABI](https://stacks.js.org/interfaces/_stacks_transactions.ClarityAbi) objects. + +## Sponsoring Transactions + +To generate a sponsored transaction, first create and sign the transaction as the origin. The `sponsored` property in the options object must be set to true. + +```ts -n +import { makeContractCall, Cl } from '@stacks/transactions'; + +const txOptions = { + contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X', + contractName: 'contract_name', + functionName: 'contract_function', + functionArgs: [Cl.bufferFromUtf8('foo string')], + validateWithAbi: true, + + senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01', + network: 'testnet', // for mainnet, use 'mainnet' + sponsored: true, +}; + +const transaction = await makeContractCall(txOptions); +const serializedTx = transaction.serialize(); + +// can't broadcast sponsored transactions before they are sponsored +``` + +The serialized transaction can now be passed to the sponsoring party which will sign the sponsor portion of the transaction and set the fee. + +```ts -n +import { sponsorTransaction, broadcastTransaction } from '@stacks/transactions'; + +const deserializedTx = deserializeTransaction(serializedTx); +const sponsorKey = '770287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01'; +const fee = 1000n; + +const sponsorOptions = { + transaction: deserializedTx, + sponsorPrivateKey: sponsorKey, + sponsorNonce: 0, + fee, +}; + +const sponsoredTx = await sponsorTransaction(sponsorOptions); + +// broadcast to the network +const response = await broadcastTransaction({ transaction: sponsoredTx, network: 'testnet' }); +console.log(response.txid); +``` + +## Supporting multi-signature transactions + +To generate a multi-sig transaction, first create an unsigned transaction. +The `numSignatures` and `publicKeys` properties in the options object must be set: + +```ts -n +import { + makeUnsignedSTXTokenTransfer, + createStacksPrivateKey, + deserializeTransaction, + pubKeyfromPrivKey, + publicKeyToString, + TransactionSigner, + standardPrincipalCV, + BytesReader, + AnchorMode, +} from '@stacks/transactions'; + +const recipient = standardPrincipalCV('SP3FGQ8...'); +const amount = 2500000n; +const fee = 0n; +const memo = 'test memo'; + +// private keys of the participants in the transaction +const privKeyStrings = ['6d430bb9...', '2a584d89...', 'd5200dee...']; + +// create private key objects from string array +const privKeys = privKeyStrings.map(createStacksPrivateKey); + +// corresponding public keys +const pubKeys = privKeyStrings.map(pubKeyfromPrivKey); + +// create public key string array from objects +const pubKeyStrings = pubKeys.map(publicKeyToString); + +const transaction = await makeUnsignedSTXTokenTransfer({ + recipient, + amount, + fee, + memo, + numSignatures: 2, // number of signature required + publicKeys: pubKeyStrings, // public key string array with >= numSignatures elements + anchorMode: AnchorMode.Any, +}); + +const serializedTx = transaction.serialize(); +``` + +This transaction payload can be passed along to other participants to sign. In addition to +meeting the numSignatures requirement, the public keys of the parties who did not sign the +transaction must be appended to the signature. + +```ts -n +// deserialize and sign transaction +const bytesReader = new BytesReader(serializedTx); +// Partially signed or unsigned multi-sig tx can be deserialized to add the required signatures +const deserializedTx = deserializeTransaction(bytesReader); + +const signer = new TransactionSigner(deserializedTx); + +// first signature +signer.signOrigin(privKeys[0]); + +// second signature +signer.signOrigin(privKeys[1]); + +// after meeting the numSignatures requirement, the public +// keys of the participants who did not sign must be appended +signer.appendOrigin(pubKeys[2]); + +// the serialized multi-sig tx +const serializedSignedTx = deserializedTx.serialize(); +``` + +## Calling Read-only Contract Functions + +Read-only contract functions can be called without generating or broadcasting a transaction. Instead it works via a direct API call to a Stacks node. + +```ts -n +import { bufferCVFromString, callReadOnlyFunction } from '@stacks/transactions'; +import { StacksTestnet } from '@stacks/network'; + +const contractAddress = 'ST3KC0MTNW34S1ZXD36JYKFD3JJMWA01M55DSJ4JE'; +const contractName = 'kv-store'; +const functionName = 'get-value'; +const buffer = bufferCVFromString('foo'); +const network = new StacksTestnet(); +const senderAddress = 'ST2F4BK4GZH6YFBNHYDDGN4T1RKBA7DA1BJZPJEJJ'; + +const options = { + contractAddress, + contractName, + functionName, + functionArgs: [buffer], + network, + senderAddress, +}; + +const result = await callReadOnlyFunction(options); +``` + +## Constructing Clarity Values + +Building transactions that call functions in deployed clarity contracts requires you to construct valid Clarity Values to pass to the function as arguments. The [Clarity type system](https://github.com/stacksgov/sips/blob/master/sip/sip-002-smart-contract-language.md#clarity-type-system) contains the following types: + +- `(tuple (key-name-0 key-type-0) (key-name-1 key-type-1) ...)` : a typed tuple with named fields. +- `(list max-len entry-type)` : a list of maximum length max-len, with entries of type entry-type +- `(response ok-type err-type)` : object used by public functions to commit their changes or abort. May be returned or used by other functions as well, however, only public functions have the commit/abort behavior. +- `(optional some-type)` : an option type for objects that can either be (some value) or none +- `(buff max-len)` : byte buffer or maximum length max-len. +- `principal` : object representing a principal (whether a contract principal or standard principal). +- `bool` : boolean value (`true` or `false`) +- `int` : signed 128-bit integer +- `uint`: unsigned 128-bit integer + +This library contains Typescript types and classes that map to the Clarity types, in order to make it easy to construct well-typed Clarity values in Javascript. These types all extend the abstract class `ClarityValue`. + +```ts -n +import { + trueCV, + falseCV, + noneCV, + someCV, + intCV, + uintCV, + standardPrincipalCV, + contractPrincipalCV, + responseErrorCV, + responseOkCV, + listCV, + tupleCV, + bufferCV, +} from '@stacks/transactions'; +import { utf8ToBytes } from '@stacks/common'; + +// construct boolean clarity values +const t = trueCV(); +const f = falseCV(); + +// construct optional clarity values +const nothing = noneCV(); +const something = someCV(t); + +// construct a buffer clarity value from an existing byte array +const bytes = utf8ToBytes('foo'); // Uint8Array(3) [ 102, 111, 111 ] +const bufCV = bufferCV(bytes); + +// construct signed and unsigned integer clarity values +const i = intCV(-10); +const u = uintCV(10); + +// construct principal clarity values +const address = 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B'; +const contractName = 'contract-name'; +const spCV = standardPrincipalCV(address); +const cpCV = contractPrincipalCV(address, contractName); + +// construct response clarity values +const errCV = responseErrorCV(trueCV()); +const okCV = responseOkCV(falseCV()); + +// construct tuple clarity values +const tupCV = tupleCV({ + a: intCV(1), + b: trueCV(), + c: falseCV(), +}); + +// construct list clarity values +const l = listCV([trueCV(), falseCV()]); +``` + +If you develop in Typescript, the type checker can help prevent you from creating wrongly-typed Clarity values. For example, the following code won't compile since in Clarity lists are homogeneous, meaning they can only contain values of a single type. It is important to include the type variable `BooleanCV` in this example, otherwise the typescript type checker won't know which type the list is of and won't enforce homogeneity. + +```ts -n +const l = listCV<BooleanCV>([trueCV(), intCV(1)]); +``` + +## Post Conditions + +Three types of post conditions can be added to transactions: + +1. STX post condition +2. Fungible token post condition +3. Non-Fungible token post condition + +For details see: https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-post-conditions + +## STX post condition + +```ts -n +import { + FungibleConditionCode, + makeStandardSTXPostCondition, + makeContractSTXPostCondition, +} from '@stacks/transactions'; + +// With a standard principal +const postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE'; +const postConditionCode = FungibleConditionCode.GreaterEqual; +const postConditionAmount = 12345n; + +const standardSTXPostCondition = makeStandardSTXPostCondition( + postConditionAddress, + postConditionCode, + postConditionAmount +); + +// With a contract principal +const contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X'; +const contractName = 'test-contract'; + +const contractSTXPostCondition = makeContractSTXPostCondition( + contractAddress, + contractName, + postConditionCode, + postConditionAmount +); +``` + +## Fungible token post condition + +```ts -n +import { + FungibleConditionCode, + createAssetInfo, + makeStandardFungiblePostCondition, +} from '@stacks/transactions'; + +// With a standard principal +const postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE'; +const postConditionCode = FungibleConditionCode.GreaterEqual; +const postConditionAmount = 12345n; +const assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ'; +const assetContractName = 'test-asset-contract'; +const assetName = 'test-token'; +const fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName); + +const standardFungiblePostCondition = makeStandardFungiblePostCondition( + postConditionAddress, + postConditionCode, + postConditionAmount, + fungibleAssetInfo +); + +// With a contract principal +const contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X'; +const contractName = 'test-contract'; +const assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ'; +const assetContractName = 'test-asset-contract'; +const assetName = 'test-token'; +const fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName); + +const contractFungiblePostCondition = makeContractFungiblePostCondition( + contractAddress, + contractName, + postConditionCode, + postConditionAmount, + fungibleAssetInfo +); +``` + +## Non-fungible token post condition + +> **Warning** +> The Stacks blockchain's post-condition processor can NOT check ownership. +> It checks whether or not a principal **will send** or **will not send** an NFT. +> Post-conditions can NOT verify anything about the recipient of an asset. +> If you want to verify conditions about asset recipients, you will need to use [Clarity](https://docs.stacks.co/docs/write-smart-contracts/). + +```ts -n +import { + NonFungibleConditionCode, + createAssetInfo, + makeStandardNonFungiblePostCondition, + makeContractNonFungiblePostCondition, + bufferCVFromString, +} from '@stacks/transactions'; + +// With a standard principal +const postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE'; +const postConditionCode = NonFungibleConditionCode.DoesNotSend; +const assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ'; +const assetContractName = 'test-asset-contract'; +const assetName = 'test-asset'; +const assetId = bufferCVFromString('test-token-asset-id'); +const nonFungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName); + +const standardNonFungiblePostCondition = makeStandardNonFungiblePostCondition( + postConditionAddress, + postConditionCode, + nonFungibleAssetInfo, + assetId +); + +// With a contract principal +const contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X'; +const contractName = 'test-contract'; + +const contractNonFungiblePostCondition = makeContractNonFungiblePostCondition( + contractAddress, + contractName, + postConditionCode, + nonFungibleAssetInfo, + assetId +); +``` + +## Conversion of Clarity Values to JSON + +Clarity Values represent values of Clarity contracts. If a JSON format is required the helper function `cvToJSON` can be used. + +```ts -n +import { cvToJSON, hexToCV } from '@stacks/transactions'; + +cvToJSON(hexToCV(tx.tx_result.hex)); +``` diff --git a/content/docs/stacks/setup.mdx b/content/docs/stacks/setup.mdx new file mode 100644 index 000000000..d2f382106 --- /dev/null +++ b/content/docs/stacks/setup.mdx @@ -0,0 +1,20 @@ +--- +title: Developer environment setup +description: Set up your development environment for Stacks. +--- + +import { SecondaryCard } from '@/components/card'; + +LFG! + +## Related tools + +- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks. +- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality. +- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API. + +<br /> + +<Callout title="Need help building with Clarinet JS SDK?" type="help"> +Reach out to us on the <span className="font-bold">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET. +</Callout> \ No newline at end of file diff --git a/content/docs/stacks/smart-contract-development.mdx b/content/docs/stacks/smart-contract-development.mdx new file mode 100644 index 000000000..38142be42 --- /dev/null +++ b/content/docs/stacks/smart-contract-development.mdx @@ -0,0 +1,20 @@ +--- +title: Smart contract development +description: Build your smart contracts on Stacks. +--- + +import { SecondaryCard } from '@/components/card'; + +LFG! + +## Related tools + +- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks. +- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality. +- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API. + +<br /> + +<Callout title="Need help building with Clarinet JS SDK?" type="help"> +Reach out to us on the <span className="font-bold">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET. +</Callout> \ No newline at end of file diff --git a/content/docs/stacks/stacks.js/guides/broadcast-transactions.mdx b/content/docs/stacks/stacks.js/examples/broadcast-transactions.mdx similarity index 100% rename from content/docs/stacks/stacks.js/guides/broadcast-transactions.mdx rename to content/docs/stacks/stacks.js/examples/broadcast-transactions.mdx diff --git a/content/docs/stacks/stacks.js/guides/post-conditions.mdx b/content/docs/stacks/stacks.js/examples/post-conditions.mdx similarity index 100% rename from content/docs/stacks/stacks.js/guides/post-conditions.mdx rename to content/docs/stacks/stacks.js/examples/post-conditions.mdx diff --git a/content/docs/stacks/stacks.js/guides/use-with-react-native.mdx b/content/docs/stacks/stacks.js/examples/use-with-react-native.mdx similarity index 100% rename from content/docs/stacks/stacks.js/guides/use-with-react-native.mdx rename to content/docs/stacks/stacks.js/examples/use-with-react-native.mdx diff --git a/content/docs/stacks/stacks.js/meta.json b/content/docs/stacks/stacks.js/meta.json index f8a0ea015..f4f9dc750 100644 --- a/content/docs/stacks/stacks.js/meta.json +++ b/content/docs/stacks/stacks.js/meta.json @@ -1,26 +1,11 @@ { "title": "Stacks.js", - "root": true, "pages": [ - "---Stacks.js---", "index", "installation", "quickstart", "roadmap", - "---Concepts---", - "concepts/private-keys", - "concepts/networks", - "concepts/accounts-and-addresses", - "concepts/transactions", - "concepts/post-conditions", - "concepts/broadcasting", - "---Guides---", - "guides/broadcast-transactions", - "guides/post-conditions", - "guides/use-with-react-native", - "---Reference (latest)---", - "...packages", - "---Reference (6.x.x)---", - "...v6" + "...concepts", + "...examples" ] } diff --git a/content/docs/stacks/stacks.js/packages/common.mdx b/content/docs/stacks/stacks.js/packages/common.mdx index 562cf2802..cb8e99970 100644 --- a/content/docs/stacks/stacks.js/packages/common.mdx +++ b/content/docs/stacks/stacks.js/packages/common.mdx @@ -1,10 +1,10 @@ --- title: '@stacks/common' description: Common utilities for working with Stacks. -toc: false +full: true --- -import { Root, API, APIExample } from '@/components/layout'; +import { Root, API, APIExample } from 'fumadocs-openapi/ui'; import { Property } from 'fumadocs-openapi/ui' import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; diff --git a/content/docs/stacks/stacks.js/packages/network.mdx b/content/docs/stacks/stacks.js/packages/network.mdx index e4969c41b..dcc1b974a 100644 --- a/content/docs/stacks/stacks.js/packages/network.mdx +++ b/content/docs/stacks/stacks.js/packages/network.mdx @@ -1,10 +1,10 @@ --- title: '@stacks/network' description: Network and API library for working with Stacks blockchain nodes. -toc: false +full: true --- -import { Root, API, APIExample } from '@/components/layout'; +import { Root, API, APIExample } from 'fumadocs-openapi/ui'; import { Property } from 'fumadocs-openapi/ui' import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; diff --git a/content/docs/stacks/stacks.js/packages/transactions.mdx b/content/docs/stacks/stacks.js/packages/transactions.mdx index 430a582fb..8c0a78bdf 100644 --- a/content/docs/stacks/stacks.js/packages/transactions.mdx +++ b/content/docs/stacks/stacks.js/packages/transactions.mdx @@ -1,10 +1,10 @@ --- title: '@stacks/transactions' description: Construct, decode transactions and work with Clarity smart contracts on the Stacks blockchain. -toc: false +full: true --- -import { Root, API, APIExample } from '@/components/layout'; +import { Root, API, APIExample } from 'fumadocs-openapi/ui'; import { Property } from 'fumadocs-openapi/ui' import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; diff --git a/content/docs/stacks/stacks.js/v6/network.mdx b/content/docs/stacks/stacks.js/v6/network.mdx index 3d2191f16..4649d8cca 100644 --- a/content/docs/stacks/stacks.js/v6/network.mdx +++ b/content/docs/stacks/stacks.js/v6/network.mdx @@ -1,10 +1,10 @@ --- title: '@stacks/network' description: Network and API library for working with Stacks blockchain nodes. -toc: false +full: true --- -import { Root, API, APIExample } from '@/components/layout'; +import { Root, API, APIExample } from 'fumadocs-openapi/ui'; import { Property } from 'fumadocs-openapi/ui' import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; diff --git a/content/docs/stacks/stacks.js/v6/transactions.mdx b/content/docs/stacks/stacks.js/v6/transactions.mdx index e7c1809a3..c26e39a42 100644 --- a/content/docs/stacks/stacks.js/v6/transactions.mdx +++ b/content/docs/stacks/stacks.js/v6/transactions.mdx @@ -1,10 +1,10 @@ --- title: '@stacks/transactions' description: Construct, decode transactions and work with Clarity smart contracts on the Stacks blockchain. -toc: false +full: true --- -import { Root, API, APIExample } from '@/components/layout'; +import { Root, API, APIExample } from 'fumadocs-openapi/ui'; import { Property } from 'fumadocs-openapi/ui' import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; diff --git a/content/docs/stacks/testing-best-practices.mdx b/content/docs/stacks/testing-best-practices.mdx new file mode 100644 index 000000000..7dc108416 --- /dev/null +++ b/content/docs/stacks/testing-best-practices.mdx @@ -0,0 +1,241 @@ +--- +title: Best practices +description: Learn best practices for writing and running tests for your Clarity smart contracts using the Clarinet JS SDK and Vitest. +--- + +Integration testing is a crucial step in smart contract development that involves testing how different components of your system work together. The Clarinet JS SDK provides powerful tools for writing and running integration tests, allowing you to simulate complex scenarios and interactions between multiple contracts. + +By using integration tests, you can ensure that your smart contracts function correctly as part of a larger system and catch potential issues that might not be apparent in unit tests alone. + +In this guide, you will: + +1. [Set up a Clarinet project with a `defi` contract.](#set-up-a-clarinet-project) +2. [Write an integration test for the smart contract.](#test-the-deposit-and-borrow-functionality) +3. [Run tests and generate coverage reports.](#run-tests-and-generate-coverage-reports) + +--- + +## Set up a Clarinet project + +Start by creating a new Clarinet project. This command will create a new directory named `defi` and set up a basic Clarinet project inside it. + +```terminal +$ clarinet new stx-defi +$ cd stx-defi +``` + +After changing into your project directory, run `npm install` to install the package dependencies for testing. + +```terminal +$ npm install +``` + +We are going to use the same `defi` contract that we used in the [unit testing guide](/stacks/clarinet-js-sdk/guides/unit-testing), but with some additional functionality - the ability to `borrow` STX from the contract. If you don't have this project set up already, follow the steps below: + +```terminal +$ clarinet contract new defi +``` + +Then, inside your `defi.clar` file, copy and paste the following contract code: + +```clarity +;; Error constants for various failure scenarios. +(define-constant err-overborrow (err u300)) + +;; The interest rate for loans, represented as 10% (out of a base of 100). +(define-data-var loan-interest-rate uint u10) ;; Representing 10% interest rate + + +;; Holds the total amount of deposits in the contract, initialized to 0. +(define-data-var total-deposits uint u0) + +;; Maps a user's principal address to their deposited amount. +(define-map deposits { owner: principal } { amount: uint }) + +;; Maps a borrower's principal address to their loan details: amount and the last interaction block. +(define-map loans principal { amount: uint, last-interaction-block: uint }) + +;; Public function for users to deposit STX into the contract. +;; Updates their balance and the total deposits in the contract. +(define-public (deposit (amount uint)) + (let + ( + ;; Fetch the current balance or default to 0 if none exists. + (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender })))) + ) + ;; Transfer the STX from sender = "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM" to recipient = "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)". + (try! (stx-transfer? amount tx-sender (as-contract tx-sender))) + ;; Update the user's deposit amount in the map. + (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) }) + ;; Update the total deposits variable. + (var-set total-deposits (+ (var-get total-deposits) amount)) + ;; Return success. + (ok true) + ) +) + +;; Public function for users to borrow STX based on their deposits. +(define-public (borrow (amount uint)) + (let + ( + ;; Fetch user's deposit or default to 0. + (user-deposit (default-to u0 (get amount (map-get? deposits { owner: tx-sender })))) + ;; Calculate the maximum amount the user is allowed to borrow. (which will be upto HALF of what they deposited) + (allowed-borrow (/ user-deposit u2)) + ;; Fetch current loan details or default to initial values. + (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender ))) + ;; Calculate accrued interest on the current loan. + (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details))) + ;; Calculate the total amount due including interest. + (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest))) + ;; Calculate the new loan total after borrowing additional amount. + (new-loan (+ amount)) + ) + ;; Ensure the requested borrow amount does not exceed the allowed amount. + (asserts! (<= new-loan allowed-borrow) err-overborrow) + ;; Transfer the borrowed STX to the user. + (let + ( + (recipient tx-sender) + ) + (try! (as-contract (stx-transfer? amount tx-sender recipient))) + ) + ;; Update the user's loan details in the map. + (map-set loans tx-sender { amount: new-loan, last-interaction-block: block-height }) + ;; Return success. + (ok true) + ) +) + +;; Read-only function to get the total balance by tx-sender +(define-read-only (get-balance-by-sender) + (ok (map-get? deposits { owner: tx-sender })) +) + +;; Read-only function to get the total amount owed by the user. +(define-read-only (get-amount-owed) + (let + ( + ;; Fetch current loan details or default to initial values. + (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender ))) + ;; Calculate accrued interest on the current loan. + (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details))) + ;; Calculate the total amount due including interest. + (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest))) + ) + ;; Return the total amount due. + (ok total-due) + ) +) + +;; Private function to calculate the accrued interest on a loan. +(define-private (calculate-accrued-interest (principal uint) (start-block uint)) + (let + ( + ;; Calculate the number of blocks elapsed since the last interaction. + (elapsed-blocks (- block-height start-block)) + ;; Calculate the interest based on the principal, rate, and elapsed time. + (interest (/ (* principal (var-get loan-interest-rate) elapsed-blocks) u10000)) + ) + ;; Ensure the loan started in the past (not at block 0). + (asserts! (not (is-eq start-block u0)) (ok u0)) + ;; Return the calculated interest. + (ok interest) + ) +) +``` + +Run `clarinet check` to ensure that your smart contract is valid and ready for testing. + +<Callout> +You can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi). +</Callout> + +## Test the deposit and borrow functionality + +In order to `borrow` STX from the contract, users must first `deposit` STX into it. Therefore, we need to write an integration test that simulates the interaction between these two functions. + +Inside of your `defi.test.ts` file, replace the boilerplate code and add the following: + +```typescript +import { describe, it, expect } from 'vitest'; +import { Cl } from '@stacks/transactions'; + +const accounts = simnet.getAccounts(); +const wallet1 = accounts.get('wallet_1')!; + +describe('stx-defi', () => { + it('borrows 10 and verifies the amount owed to be 10', () => { + simnet.callPublicFn('defi', 'deposit', [Cl.uint(1000)], wallet1); + const totalDeposits = simnet.getDataVar('defi', 'total-deposits'); + expect(totalDeposits).toBeUint(1000); + + simnet.callPublicFn('defi', 'borrow', [Cl.uint(10)], wallet1); + const { result } = simnet.callReadOnlyFn('defi', 'get-amount-owed', [], wallet1); + expect(result).toBeOk(Cl.uint(10)); + }); +}); +``` + +In this integration test, we're simulating a scenario where a user deposits STX into the DeFi contract and then borrows against that deposit. Let's walk through the process step by step. + +We start by simulating a deposit of 1000 STX from `wallet1`. To do this, we use the `callPublicFn` method from the Clarinet JS SDK `simnet` object, which allows us to call public functions in our smart contract just as we would on the actual blockchain. + +After making the deposit, we want to verify that it was successful. We do this by checking the total deposits in the contract using `getDataVar`. + +This handy method lets us peek at the value of data variables defined in your contract. + +<Callout> +To learn more about available methods for integration testing, check out the [reference page](/stacks/clarinet-js-sdk/references/methods). +</Callout> + +To ensure the deposit was recorded correctly, we use a custom matcher, `toBeUint`. This matcher is specifically designed to check if a value is a Clarity unsigned integer with the exact value we expect. + +With the deposit confirmed, we simulate `wallet1` borrowing 10 STX. We do this with another call to `callPublicFn`, this time invoking the `borrow` function of our contract. + +After the borrowing operation, we want to check how much `wallet1` owes. We use `callReadOnlyFn` to call a read-only function named `get-amount-owed` in our contract. + +Finally, we verify the amount owed using another custom matcher, `toBeOk(Cl.uint(10))`. This matcher is particularly useful because it checks two things at once: + +1. That our contract returned a successful Clarity response type. +2. That the value returned is a Clarity unsigned integer with the exact value we expect (`10`). + +These custom matchers and simnet methods are powerful tools and allow you to simulate complex interactions with your smart contracts and make detailed assertions about the results. + +## Run tests and generate coverage reports + +To run your tests, use: + +```terminal +$ npm run test +``` + +To generate a coverage report, use: + +```terminal +$ npm run coverage +``` + +This will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract. + +--- + +## Next steps + +<Cards> + <Card + href="/stacks/clarinet-js-sdk/references/simnet" + title="API reference" + description="Dive deeper into the properties and methods available in the Clarinet JS SDK." + /> + <Card + href="/stacks/clarinet-js-sdk/references/custom-matchers" + title="Custom matchers" + description="Learn about the custom matchers that are available in the Clarinet JS SDK." + /> + <Card + href="/stacks/clarinet-js-sdk/references/methods" + title="SDK methods" + description="Learn about the methods available in the Clarinet JS SDK." + /> +</Cards> diff --git a/content/docs/stacks/testing-environments.mdx b/content/docs/stacks/testing-environments.mdx new file mode 100644 index 000000000..0c11704d9 --- /dev/null +++ b/content/docs/stacks/testing-environments.mdx @@ -0,0 +1,241 @@ +--- +title: Testing environments +description: Setup and configure testing environments for your Clarity smart contracts. +--- + +Integration testing is a crucial step in smart contract development that involves testing how different components of your system work together. The Clarinet JS SDK provides powerful tools for writing and running integration tests, allowing you to simulate complex scenarios and interactions between multiple contracts. + +By using integration tests, you can ensure that your smart contracts function correctly as part of a larger system and catch potential issues that might not be apparent in unit tests alone. + +In this guide, you will: + +1. [Set up a Clarinet project with a `defi` contract.](#set-up-a-clarinet-project) +2. [Write an integration test for the smart contract.](#test-the-deposit-and-borrow-functionality) +3. [Run tests and generate coverage reports.](#run-tests-and-generate-coverage-reports) + +--- + +## Set up a Clarinet project + +Start by creating a new Clarinet project. This command will create a new directory named `defi` and set up a basic Clarinet project inside it. + +```terminal +$ clarinet new stx-defi +$ cd stx-defi +``` + +After changing into your project directory, run `npm install` to install the package dependencies for testing. + +```terminal +$ npm install +``` + +We are going to use the same `defi` contract that we used in the [unit testing guide](/stacks/clarinet-js-sdk/guides/unit-testing), but with some additional functionality - the ability to `borrow` STX from the contract. If you don't have this project set up already, follow the steps below: + +```terminal +$ clarinet contract new defi +``` + +Then, inside your `defi.clar` file, copy and paste the following contract code: + +```clarity +;; Error constants for various failure scenarios. +(define-constant err-overborrow (err u300)) + +;; The interest rate for loans, represented as 10% (out of a base of 100). +(define-data-var loan-interest-rate uint u10) ;; Representing 10% interest rate + + +;; Holds the total amount of deposits in the contract, initialized to 0. +(define-data-var total-deposits uint u0) + +;; Maps a user's principal address to their deposited amount. +(define-map deposits { owner: principal } { amount: uint }) + +;; Maps a borrower's principal address to their loan details: amount and the last interaction block. +(define-map loans principal { amount: uint, last-interaction-block: uint }) + +;; Public function for users to deposit STX into the contract. +;; Updates their balance and the total deposits in the contract. +(define-public (deposit (amount uint)) + (let + ( + ;; Fetch the current balance or default to 0 if none exists. + (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender })))) + ) + ;; Transfer the STX from sender = "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM" to recipient = "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)". + (try! (stx-transfer? amount tx-sender (as-contract tx-sender))) + ;; Update the user's deposit amount in the map. + (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) }) + ;; Update the total deposits variable. + (var-set total-deposits (+ (var-get total-deposits) amount)) + ;; Return success. + (ok true) + ) +) + +;; Public function for users to borrow STX based on their deposits. +(define-public (borrow (amount uint)) + (let + ( + ;; Fetch user's deposit or default to 0. + (user-deposit (default-to u0 (get amount (map-get? deposits { owner: tx-sender })))) + ;; Calculate the maximum amount the user is allowed to borrow. (which will be upto HALF of what they deposited) + (allowed-borrow (/ user-deposit u2)) + ;; Fetch current loan details or default to initial values. + (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender ))) + ;; Calculate accrued interest on the current loan. + (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details))) + ;; Calculate the total amount due including interest. + (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest))) + ;; Calculate the new loan total after borrowing additional amount. + (new-loan (+ amount)) + ) + ;; Ensure the requested borrow amount does not exceed the allowed amount. + (asserts! (<= new-loan allowed-borrow) err-overborrow) + ;; Transfer the borrowed STX to the user. + (let + ( + (recipient tx-sender) + ) + (try! (as-contract (stx-transfer? amount tx-sender recipient))) + ) + ;; Update the user's loan details in the map. + (map-set loans tx-sender { amount: new-loan, last-interaction-block: block-height }) + ;; Return success. + (ok true) + ) +) + +;; Read-only function to get the total balance by tx-sender +(define-read-only (get-balance-by-sender) + (ok (map-get? deposits { owner: tx-sender })) +) + +;; Read-only function to get the total amount owed by the user. +(define-read-only (get-amount-owed) + (let + ( + ;; Fetch current loan details or default to initial values. + (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender ))) + ;; Calculate accrued interest on the current loan. + (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details))) + ;; Calculate the total amount due including interest. + (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest))) + ) + ;; Return the total amount due. + (ok total-due) + ) +) + +;; Private function to calculate the accrued interest on a loan. +(define-private (calculate-accrued-interest (principal uint) (start-block uint)) + (let + ( + ;; Calculate the number of blocks elapsed since the last interaction. + (elapsed-blocks (- block-height start-block)) + ;; Calculate the interest based on the principal, rate, and elapsed time. + (interest (/ (* principal (var-get loan-interest-rate) elapsed-blocks) u10000)) + ) + ;; Ensure the loan started in the past (not at block 0). + (asserts! (not (is-eq start-block u0)) (ok u0)) + ;; Return the calculated interest. + (ok interest) + ) +) +``` + +Run `clarinet check` to ensure that your smart contract is valid and ready for testing. + +<Callout> +You can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi). +</Callout> + +## Test the deposit and borrow functionality + +In order to `borrow` STX from the contract, users must first `deposit` STX into it. Therefore, we need to write an integration test that simulates the interaction between these two functions. + +Inside of your `defi.test.ts` file, replace the boilerplate code and add the following: + +```typescript +import { describe, it, expect } from 'vitest'; +import { Cl } from '@stacks/transactions'; + +const accounts = simnet.getAccounts(); +const wallet1 = accounts.get('wallet_1')!; + +describe('stx-defi', () => { + it('borrows 10 and verifies the amount owed to be 10', () => { + simnet.callPublicFn('defi', 'deposit', [Cl.uint(1000)], wallet1); + const totalDeposits = simnet.getDataVar('defi', 'total-deposits'); + expect(totalDeposits).toBeUint(1000); + + simnet.callPublicFn('defi', 'borrow', [Cl.uint(10)], wallet1); + const { result } = simnet.callReadOnlyFn('defi', 'get-amount-owed', [], wallet1); + expect(result).toBeOk(Cl.uint(10)); + }); +}); +``` + +In this integration test, we're simulating a scenario where a user deposits STX into the DeFi contract and then borrows against that deposit. Let's walk through the process step by step. + +We start by simulating a deposit of 1000 STX from `wallet1`. To do this, we use the `callPublicFn` method from the Clarinet JS SDK `simnet` object, which allows us to call public functions in our smart contract just as we would on the actual blockchain. + +After making the deposit, we want to verify that it was successful. We do this by checking the total deposits in the contract using `getDataVar`. + +This handy method lets us peek at the value of data variables defined in your contract. + +<Callout> +To learn more about available methods for integration testing, check out the [reference page](/stacks/clarinet-js-sdk/references/methods). +</Callout> + +To ensure the deposit was recorded correctly, we use a custom matcher, `toBeUint`. This matcher is specifically designed to check if a value is a Clarity unsigned integer with the exact value we expect. + +With the deposit confirmed, we simulate `wallet1` borrowing 10 STX. We do this with another call to `callPublicFn`, this time invoking the `borrow` function of our contract. + +After the borrowing operation, we want to check how much `wallet1` owes. We use `callReadOnlyFn` to call a read-only function named `get-amount-owed` in our contract. + +Finally, we verify the amount owed using another custom matcher, `toBeOk(Cl.uint(10))`. This matcher is particularly useful because it checks two things at once: + +1. That our contract returned a successful Clarity response type. +2. That the value returned is a Clarity unsigned integer with the exact value we expect (`10`). + +These custom matchers and simnet methods are powerful tools and allow you to simulate complex interactions with your smart contracts and make detailed assertions about the results. + +## Run tests and generate coverage reports + +To run your tests, use: + +```terminal +$ npm run test +``` + +To generate a coverage report, use: + +```terminal +$ npm run coverage +``` + +This will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract. + +--- + +## Next steps + +<Cards> + <Card + href="/stacks/clarinet-js-sdk/references/simnet" + title="API reference" + description="Dive deeper into the properties and methods available in the Clarinet JS SDK." + /> + <Card + href="/stacks/clarinet-js-sdk/references/custom-matchers" + title="Custom matchers" + description="Learn about the custom matchers that are available in the Clarinet JS SDK." + /> + <Card + href="/stacks/clarinet-js-sdk/references/methods" + title="SDK methods" + description="Learn about the methods available in the Clarinet JS SDK." + /> +</Cards> diff --git a/content/docs/stacks/token-development.mdx b/content/docs/stacks/token-development.mdx new file mode 100644 index 000000000..aa5b3c416 --- /dev/null +++ b/content/docs/stacks/token-development.mdx @@ -0,0 +1,20 @@ +--- +title: Token development +description: Build your tokens on Stacks. +--- + +import { SecondaryCard } from '@/components/card'; + +LFG! + +## Related tools + +- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks. +- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality. +- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API. + +<br /> + +<Callout title="Need help building with Clarinet JS SDK?" type="help"> +Reach out to us on the <span className="font-bold">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET. +</Callout> \ No newline at end of file diff --git a/content/docs/stacks/clarinet-js-sdk/guides/unit-testing.mdx b/content/docs/stacks/unit-testing.mdx similarity index 100% rename from content/docs/stacks/clarinet-js-sdk/guides/unit-testing.mdx rename to content/docs/stacks/unit-testing.mdx diff --git a/content/docs/stacks/web-app-development.mdx b/content/docs/stacks/web-app-development.mdx new file mode 100644 index 000000000..fce9c4a66 --- /dev/null +++ b/content/docs/stacks/web-app-development.mdx @@ -0,0 +1,20 @@ +--- +title: Web app development +description: Build your web apps on Stacks. +--- + +import { SecondaryCard } from '@/components/card'; + +LFG! + +## Related tools + +- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks. +- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality. +- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API. + +<br /> + +<Callout title="Need help building with Clarinet JS SDK?" type="help"> +Reach out to us on the <span className="font-bold">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET. +</Callout> \ No newline at end of file From ae3083ec1469d71a8b552ff4a16bd59be77a6120 Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 11:54:17 -0500 Subject: [PATCH 07/21] remove unused files --- .github/PULL_REQUEST_TEMPLATE.md | 16 --- .github/mlc_config.json | 42 ------- .github/workflows/board-automation.yaml | 16 --- .github/workflows/linkcheck-prs.yml | 14 --- .github/workflows/stylecheck-prs.yml | 26 ---- hooks/use-mobile.tsx | 19 --- mdx-components.tsx | 54 -------- postcss.config.js | 6 - scripts/clean-urls.js | 44 ------- scripts/fetch-guides.js | 67 ---------- scripts/fetch-openapi-specs.js | 26 ---- scripts/generate-docs.mjs | 37 ------ scripts/split.js | 50 -------- scripts/update-index.mts | 37 ------ snippets/api-keys.mdx | 59 --------- snippets/contributors-guide.mdx | 62 --------- snippets/rate-limiting.mdx | 40 ------ tailwind.config.js | 159 ------------------------ types/recipes.ts | 71 ----------- 19 files changed, 845 deletions(-) delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/mlc_config.json delete mode 100644 .github/workflows/board-automation.yaml delete mode 100644 .github/workflows/linkcheck-prs.yml delete mode 100644 .github/workflows/stylecheck-prs.yml delete mode 100644 hooks/use-mobile.tsx delete mode 100644 mdx-components.tsx delete mode 100644 postcss.config.js delete mode 100644 scripts/clean-urls.js delete mode 100644 scripts/fetch-guides.js delete mode 100644 scripts/fetch-openapi-specs.js delete mode 100644 scripts/generate-docs.mjs delete mode 100644 scripts/split.js delete mode 100644 scripts/update-index.mts delete mode 100644 snippets/api-keys.mdx delete mode 100644 snippets/contributors-guide.mdx delete mode 100644 snippets/rate-limiting.mdx delete mode 100644 tailwind.config.js delete mode 100644 types/recipes.ts diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 00dbe2e98..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,16 +0,0 @@ -## Description - -Describe the changes that were made in this pull request. When possible start with the motivations behind the change. Be sure to also include the following information: - -1. Motivation for change? -2. What was changed? -3. Link to relevant issues? - -## Checklist - -- [ ] [Conventional commits were used](https://www.conventionalcommits.org/en/v1.0.0/) -- [ ] New links to files and images were verified -- [ ] For fixes/refactors: all existing references were identified and replaced -- [ ] [Style guide](https://developers.google.com/style) was reviewed and applied -- [ ] Clear code samples were provided -- [ ] People were tagged for review diff --git a/.github/mlc_config.json b/.github/mlc_config.json deleted file mode 100644 index 9ec46cca3..000000000 --- a/.github/mlc_config.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "ignorePatterns": [ - { - "pattern": "^http://localhost" - }, - { - "pattern": "^https://banter.pub" - }, - { - "pattern": "^/img" - }, - { - "pattern": "(gaia|hub).blockstack.org" - }, - { - "pattern": "explorer.hiro.so/txid" - }, - { - "pattern": "explorer-api.legacy.blockstack.org" - }, - { - "pattern": "archive.hiro.so" - }, - { - "pattern": "identity.foundation" - }, - { - "pattern": "stackoverflow.com/questions/tagged/stacks\\-blockchain\\+or\\+clarity\\-lang", - "comment": "// Returns a 403 sometimes" - } - ], - "replacementPatterns": [ - { - "pattern": "^/", - "replacement": "https://docs.hiro.so/" - } - ], - "timeout": "10s", - "retryOn429": true, - "retryCount": 5, - "aliveStatusCodes": [200, 206, 406, 400] -} diff --git a/.github/workflows/board-automation.yaml b/.github/workflows/board-automation.yaml deleted file mode 100644 index 470904311..000000000 --- a/.github/workflows/board-automation.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: Board automation for Docs project - -on: - issues: - types: - - opened - -jobs: - add-to-project: - name: Add issue to project Docs - runs-on: ubuntu-latest - steps: - - uses: actions/add-to-project@main - with: - project-url: https://github.com/orgs/hirosystems/projects/43 - github-token: ${{ secrets.GH_TOKEN }} diff --git a/.github/workflows/linkcheck-prs.yml b/.github/workflows/linkcheck-prs.yml deleted file mode 100644 index 91d71fb23..000000000 --- a/.github/workflows/linkcheck-prs.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: linkcheck -on: - pull_request: - branches: [main] - -jobs: - linkcheck: - runs-on: ubuntu-latest - if: github.event.pull_request.head.repo.full_name == github.repository - steps: - - uses: actions/checkout@v3 - - uses: gaurav-nelson/github-action-markdown-link-check@v1 - with: - config-file: ".github/mlc_config.json" diff --git a/.github/workflows/stylecheck-prs.yml b/.github/workflows/stylecheck-prs.yml deleted file mode 100644 index e37c69e9a..000000000 --- a/.github/workflows/stylecheck-prs.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: stylecheck -on: - pull_request: - branches: [main] - paths: - - '**.md' - -jobs: - stylecheck: - runs-on: ubuntu-latest - if: github.event.pull_request.head.repo.full_name == github.repository - steps: - - name: checkout - uses: actions/checkout@v4 - - name: get changed Files - id: get_changed_files - uses: lots0logs/gh-action-get-changed-files@2.1.4 - with: - token: ${{ secrets.GITHUB_TOKEN }} - - name: run vale - uses: errata-ai/vale-action@reviewdog - with: - files: '${{ steps.get_changed_files.outputs.all }}' - onlyAnnotateModifiedLines: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/hooks/use-mobile.tsx b/hooks/use-mobile.tsx deleted file mode 100644 index 2b0fe1dfe..000000000 --- a/hooks/use-mobile.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import * as React from "react" - -const MOBILE_BREAKPOINT = 768 - -export function useIsMobile() { - const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined) - - React.useEffect(() => { - const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) - const onChange = () => { - setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) - } - mql.addEventListener("change", onChange) - setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) - return () => mql.removeEventListener("change", onChange) - }, []) - - return !!isMobile -} diff --git a/mdx-components.tsx b/mdx-components.tsx deleted file mode 100644 index 95a59da17..000000000 --- a/mdx-components.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import type { MDXComponents } from "mdx/types"; -import { Accordion, Accordions } from "fumadocs-ui/components/accordion"; -import { Callout } from "@/components/callout"; -import { Cards, Card, SecondaryCard } from "@/components/card"; -import { Tab, Tabs } from "fumadocs-ui/components/tabs"; -import { TypeTable } from "fumadocs-ui/components/type-table"; -import defaultComponents from "fumadocs-ui/mdx"; -import { docskit } from "@/components/docskit/components"; -import { CustomTable as Table, TableProps } from "@/components/table"; -import { OrderedList, UnorderedList } from "@/components/lists"; - -export function useMDXComponents(components: MDXComponents): MDXComponents { - return { - ...defaultComponents, - h1: (props) => { - const H1 = defaultComponents.h1 as React.ComponentType<any>; - - const id = - typeof props.children === "string" - ? props.children - : (props.children as React.ReactElement)?.props?.children; - - return ( - <H1 id={id} {...props}> - {props.children} - </H1> - ); - }, - Accordion, - Accordions, - blockquote: (props) => <Callout>{props.children}</Callout>, - Callout, - Cards, - Card, - SecondaryCard, - code: (props: React.PropsWithChildren) => ( - <code - {...props} - className={`border border-border rounded-md p-1 bg-code text-sm text-muted-foreground [h1_&]:text-xl`} - /> - ), - hr: (props: React.PropsWithChildren) => ( - <hr {...props} className="border-t border-border/50 mt-0 mb-6" /> - ), - Tab, - Tabs, - table: (props: TableProps) => <Table {...props} />, - TypeTable, - ol: OrderedList, - ul: UnorderedList, - ...components, - ...docskit, - }; -} diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index 12a703d90..000000000 --- a/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/scripts/clean-urls.js b/scripts/clean-urls.js deleted file mode 100644 index e748c2a31..000000000 --- a/scripts/clean-urls.js +++ /dev/null @@ -1,44 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -// Path to the generated JSON file -const filePath = path.join(process.cwd(), '.next', 'server', 'chunks', 'fumadocs_search.json'); - -// Check if the file exists -if (!fs.existsSync(filePath)) { - console.error('File does not exist:', filePath); - process.exit(1); -} - -// Read the JSON file -fs.readFile(filePath, 'utf8', (err, data) => { - if (err) { - console.error('Error reading the file:', err); - return; - } - - // Parse the JSON data - let jsonData; - try { - jsonData = JSON.parse(data); - } catch (parseErr) { - console.error('Error parsing JSON:', parseErr); - return; - } - - // Modify the URLs - jsonData.forEach((entry) => { - if (entry.url.startsWith('/docs/')) { - entry.url = entry.url.replace(/^\/docs\//, '/'); - } - }); - - // Write the updated JSON back to the file - fs.writeFile(filePath, JSON.stringify(jsonData, null, 2), 'utf8', (writeErr) => { - if (writeErr) { - console.error('Error writing the file:', writeErr); - return; - } - console.log('URLs updated successfully.'); - }); -}); \ No newline at end of file diff --git a/scripts/fetch-guides.js b/scripts/fetch-guides.js deleted file mode 100644 index 113a4a4ce..000000000 --- a/scripts/fetch-guides.js +++ /dev/null @@ -1,67 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const matter = require('gray-matter'); - -const baseDir = path.join(__dirname, '../content/docs'); - -const categories = { - stacks: [], - ordinals: [], - guides: [] -}; - -const stacksSubDirs = [ - 'api', 'archive', 'chainhook', 'clarinet', 'clarinet-js-sdk', 'connect', - 'explorer', 'nakamoto', 'platform', 'stacks.js', 'token-metadata-api' -]; - -const ordinalsSubDirs = ['api', 'explorer', 'indexer']; - -function categorizeFiles(dir, category, subDirs = []) { - if (subDirs.length > 0) { - subDirs.forEach(subDir => { - const guidesDir = path.join(dir, subDir, 'guides'); - if (fs.existsSync(guidesDir)) { - collectMarkdownFiles(guidesDir, category, subDir); - } - }); - } else { - collectMarkdownFiles(dir, category); - } -} - -function collectMarkdownFiles(dir, category, subDir = '') { - const files = fs.readdirSync(dir); - - files.forEach(file => { - const filePath = path.join(dir, file); - const stat = fs.statSync(filePath); - - if (stat.isDirectory()) { - collectMarkdownFiles(filePath, category, subDir); - } else if (file.endsWith('.md') || file.endsWith('.mdx')) { - const fileContent = fs.readFileSync(filePath, 'utf8'); - const { data } = matter(fileContent); - - categories[category].push({ - title: data.title || toReadableTitle(path.basename(file, path.extname(file))), - href: filePath.replace(baseDir, '').replace(/\\/g, '/').replace(path.extname(filePath), ''), - description: data.description || '', - category: subDir - }); - } - }); -} - -function toReadableTitle(slug) { - return slug - .replace(/-/g, ' ') - .replace(/\b\w/g, char => char.toUpperCase()); -} - -categorizeFiles(path.join(baseDir, 'stacks'), 'stacks', stacksSubDirs); -categorizeFiles(path.join(baseDir, 'ordinals'), 'ordinals', ordinalsSubDirs); -categorizeFiles(baseDir, 'guides'); - -fs.writeFileSync(path.join(__dirname, '../utils/all-guides.json'), JSON.stringify(categories, null, 2)); -console.log('Guides data generated successfully.'); \ No newline at end of file diff --git a/scripts/fetch-openapi-specs.js b/scripts/fetch-openapi-specs.js deleted file mode 100644 index f05ac6599..000000000 --- a/scripts/fetch-openapi-specs.js +++ /dev/null @@ -1,26 +0,0 @@ -const fetch = require('node-fetch'); -const fs = require('fs'); -const path = require('path'); - -const filesToDownload = [ - { - url: 'https://raw.githubusercontent.com/hirosystems/stacks-blockchain-api/develop/docs/stacks-api.yaml', - outputPath: './specs/stacks-api.yaml' - } - // Add more files here if needed -]; - -async function downloadFile(fileUrl, outputPath) { - const response = await fetch(fileUrl); - const data = await response.text(); - fs.writeFileSync(outputPath, data); - console.log(`Downloaded ${path.basename(outputPath)}`); -} - -async function main() { - for (const file of filesToDownload) { - await downloadFile(file.url, file.outputPath); - } -} - -main().catch(console.error); \ No newline at end of file diff --git a/scripts/generate-docs.mjs b/scripts/generate-docs.mjs deleted file mode 100644 index cc2192b4a..000000000 --- a/scripts/generate-docs.mjs +++ /dev/null @@ -1,37 +0,0 @@ -import { generateFiles } from "fumadocs-openapi" - -// void generateFiles({ -// input: ["./openapi/stacks-api.json"], -// output: "./content/docs/stacks/api", -// groupBy: "tag", -// }) - -// void generateFiles({ -// input: ["./openapi/stacks-rpc-api.json"], -// output: "./content/docs/stacks/rpc-api", -// groupBy: "tag", -// }) - -// void generateFiles({ -// input: ["./openapi/runes-api.json"], -// output: "./content/docs/bitcoin/runes/api", -// groupBy: "tag" -// }) - -// void generateFiles({ -// input: ["./openapi/ordinals-api.json"], -// output: "./content/docs/bitcoin/ordinals/api", -// groupBy: "tag", -// }) - -// void generateFiles({ -// input: ["./openapi/token-metadata-api.json"], -// output: "./content/docs/stacks/token-metadata-api", -// groupBy: "tag", -// }) - -// void generateFiles({ -// input: ["./openapi/platform-api.json"], -// output: "./content/docs/stacks/platform-api", -// groupBy: "tag", -// }) \ No newline at end of file diff --git a/scripts/split.js b/scripts/split.js deleted file mode 100644 index 1cc21d833..000000000 --- a/scripts/split.js +++ /dev/null @@ -1,50 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -// Get the arguments from the command line -const args = process.argv.slice(2); -const fileName = args[0]; // The name of the file to process (e.g., 'stacks-api') - -// Define the input file path and output directory -const inputFilePath = path.join(__dirname, `../openapi/spec/${fileName}.mdx`); -const outputBaseDir = path.join(__dirname, '../tmp'); - -// Read the content of the input MDX file -let content = fs.readFileSync(inputFilePath, 'utf8'); - -// Remove any </Root> component tags from the content -content = content.replace(/<\/Root>/g, ''); - -// Split the content into sections based on the <API> tags -const sections = content.split('<API>').slice(1); // Remove the first item if it's empty - -// Ensure the output directory exists -if (!fs.existsSync(outputBaseDir)) { - fs.mkdirSync(outputBaseDir, { recursive: true }); -} - -// Process each section -sections.forEach((section, index) => { - // Re-add the <API> tag to the section - section = `<API>${section}`; - - // Find the route for naming the file and directory structure - const routeMatch = section.match(/route={"([^"]+)"}/); - if (!routeMatch) { - console.error('Could not find route for a section'); - return; - } - const routeParts = routeMatch[1].split('/').filter(Boolean); // Split and remove any empty strings - const specificEndpoint = routeParts.join('-'); // Join parts with hyphens - - // Add syntax to left-align the content of each markdown table - section = section.replace(/\| ([-:]+) \| ([-:]+) \|/g, '| :------ | :------ |'); - - // Write the section to a new MDX file, ensuring space between frontmatter and content - const outputFileName = `${specificEndpoint}.mdx`; - const outputPath = path.join(outputBaseDir, outputFileName); - fs.writeFileSync(outputPath, section); - console.log(`Generated ${outputPath}`); -}); - -console.log('Splitting complete.'); \ No newline at end of file diff --git a/scripts/update-index.mts b/scripts/update-index.mts deleted file mode 100644 index 13fa4c521..000000000 --- a/scripts/update-index.mts +++ /dev/null @@ -1,37 +0,0 @@ -import { readFileSync } from "node:fs"; -import { resolve } from "node:path"; -import env from "@next/env"; -import algosearch from "algoliasearch"; -import { sync } from "fumadocs-core/search-algolia/server"; -import type { SearchIndex } from "fumadocs-mdx"; - -env.loadEnvConfig(process.cwd()); - -const indexes = JSON.parse( - readFileSync(resolve("./.next/server/chunks/fumadocs_search.json")).toString() -) as SearchIndex[]; - -if (!process.env.NEXT_PUBLIC_ALGOLIA_API_KEY) { - console.warn("Algolia API Key not found, skip updating search index."); -} else { - const client = algosearch( - process.env.NEXT_PUBLIC_ALGOLIA_APP_ID || "", - process.env.NEXT_PUBLIC_ALGOLIA_API_KEY || "" - ); - - void sync(client, { - document: process.env.NEXT_PUBLIC_ALGOLIA_INDEX, - documents: indexes.map((docs) => ({ - _id: docs.id, - title: docs.title, - url: docs.url, - structured: docs.structuredData, - })), - }) - .then(() => { - console.log("search updated"); - }) - .catch((e) => { - console.error(e); - }); -} diff --git a/snippets/api-keys.mdx b/snippets/api-keys.mdx deleted file mode 100644 index dfefe937a..000000000 --- a/snippets/api-keys.mdx +++ /dev/null @@ -1,59 +0,0 @@ -Developers have open access to Hiro's APIs without the use of an API key, but are subject to [Hiro's rate limit policy](./rate-limiting). For developers who need access beyond these rate limits, we provide API keys. - -<Callout title='Where can I get an API key?'> -If you're interested in obtaining an API key, you can generate one for free in the [Hiro Platform](https://platform.hiro.so) by creating an account. - -All API keys are set by default to the free "starter" account tier, which comes with a 900RPM rate limit. For builders who need access to higher API rate limits, dedicated support channels, and reliability guarantees through SLAs, you can upgrade your account tier through the Hiro Platform. -</Callout> - -## Usage with cURL - -The API key is passed in the `header` of your HTTP API request with `x-api-key`. - -```terminal -$ curl https://api.hiro.so/... -H 'x-api-key: <your-api-key>' -``` - -## Usage with Node - -This snippet shows how to perform a `fetch` request with your API key by including it in the request headers. - -```ts fetch.ts -async function makeApiRequest(apiKey: string) { - const url = `https://api.hiro.so/<your-api-endpoint>`; - const response = await fetch(url, { - headers: { - "x-api-key": apiKey - } - }); - return response.json(); -} -``` - -## Usage with Stacks.js - -```ts client.ts -import { createApiKeyMiddleware, createFetchFn } from "@stacks/common"; -import { makeContractCall } from '@stacks/transactions'; - -const apiMiddleware = createApiKeyMiddleware({ - apiKey: "<your-middleware>", -}); - -const customFetchFn = createFetchFn(apiMiddleware); - -const txOptions = { - // ... standard transaction options - client: { - fetch: customFetchFn, - }, -}; - -const transaction = await makeContractCall(txOptions); -``` - -<Callout title="Caution" type="warn"> -The API key is passed in the header of your HTTP API request and is used only for private use, like in server-side applications. - -If you use the API key in your client-side application, attackers can capture it using the client tools (E.g., browser console) and abuse your API key. -</Callout> diff --git a/snippets/contributors-guide.mdx b/snippets/contributors-guide.mdx deleted file mode 100644 index 48d9139fa..000000000 --- a/snippets/contributors-guide.mdx +++ /dev/null @@ -1,62 +0,0 @@ -import { Steps, Step } from 'fumadocs-ui/components/steps'; - -<Callout title="Install the GitHub CLI"> -Some examples use the `gh` CLI package for creating issues and forking. To install that package, [click here](https://github.com/cli/cli). -</Callout> - -## Issues - -If you find content that is obsolete, technically inaccurate, or unclear, start by creating an issue. - -This is a great way to give specific feedback and ensure the technical content is up-to-date and technically accurate. - -```terminal -$ gh issue create -``` - -<Callout> -For creating an issue via the web, go [here](https://github.com/hirosystems/docs/issues/new). -</Callout> - -## Pull requests - -<Steps> - <Step> - To suggest more comprehensive changes or make updates yourself, feel free to make documentation changes by forking the repo and then submitting a pull request. - - Fork the repo and clone it. - - ```terminal - $ gh repo fork hirosystems/docs - ``` - - <Callout> - For forking via the web, go [here](https://github.com/hirosystems/docs/fork). - </Callout> - </Step> - <Step> - Create a new branch and make your changes. - - ```terminal - $ git checkout -b my-branch - ``` - </Step> - <Step> - Commit your changes with a message with a brief summary message: - - ```terminal - $ git commit -m "commit message" - ``` - </Step> - <Step> - Push up your branch: - - ```terminal - $ git push origin my-branch - ``` - </Step> -</Steps> - -<Callout title="Pull Request Guidelines"> -PR titles should be descriptive enough for reviewers to understand *what* is being changed and have a description that explains *why* the change is being made. -</Callout> diff --git a/snippets/rate-limiting.mdx b/snippets/rate-limiting.mdx deleted file mode 100644 index 198f3183a..000000000 --- a/snippets/rate-limiting.mdx +++ /dev/null @@ -1,40 +0,0 @@ -## API rate limits - -You can access all of Hiro's API services without an API key, but you are subject to rate limits of 25 RPM, per client IP. To build with higher rate limits, you can generate a free API key in the Hiro Platform that is set to the free "starter" plan as a default, and you can upgrade your account to a [higher tier](https://www.hiro.so/pricing) as needed: - -| Tiers | API RPM | Stacks L2 requests / month | Bitcoin L1 requests / month | -|:---------------|:--------|:---------------------------|:----------------------------| -| No API key | 25 | n/a | n/a | -| Free / Starter | 900 | 150K | 50K | -| $99 / Build | 3K | 15M | 500K | -| $599 / Scale | 7K | 75M | 5M | -| Enterprise | Custom | Custom | Custom | - -With a single API key, you gain access to Hiro's suite of API services that span Bitcoin and Stacks: - -**Bitcoin L1 API services** - -- [Ordinals API](/bitcoin/ordinals/api) (includes BRC-20 support) -- [Runes API](/bitcoin/runes/api) - -**Stacks L2 API services** - -- [Stacks Blockchain API](/stacks/api) -- [Token Metadata API](/stacks/token-metadata-api) - -These new rate limits help us ensure fair usage of Hiro APIs and provide the best possible service as our community of developers and applications grow. - -<Callout title='Need an API key?'> -You can create one for free in the [Hiro Platform](https://platform.hiro.so) by creating an account. -</Callout> - -## STX / sBTC testnet faucet rate limits - -Note: these faucets are for Stacks and sBTC testnet tokens, which have no monetary value. - -| Type | Rate Limit | -|:-----------------------------|:-----------------------------| -| Stacking requests | 1 request per 2 days | -| Regular STX / sBTC requests | 1 request per minute (RPM) | - -To use the faucets, visit the [Hiro Platform Faucet](https://platform.hiro.so/faucet). diff --git a/tailwind.config.js b/tailwind.config.js deleted file mode 100644 index 960db91b4..000000000 --- a/tailwind.config.js +++ /dev/null @@ -1,159 +0,0 @@ -const { createPreset } = require('fumadocs-ui/tailwind-plugin'); - -/** @type {import('tailwindcss').Config} */ -module.exports = { - darkMode: ['class'], - content: [ - './components/**/*.{ts,tsx}', - './app/**/*.{ts,tsx}', - './content/**/*.mdx', - './mdx-components.tsx', - './node_modules/fumadocs-ui/dist/**/*.js', - './node_modules/fumadocs-openapi/dist/**/*.js', - ], - presets: [createPreset({ - preset: 'default' - })], - theme: { - extend: { - colors: { - 'ch-border': 'hsl(var(--border))', - 'ch-selection': 'var(--ch-22)', - 'ch-tabs-background': 'hsl(var(--card))', - 'ch-tab-active-foreground': 'hsl(var(--card-foreground))', - 'ch-tab-inactive-foreground': 'hsl(var(--muted-foreground))', - 'ch-code': 'hsl(var(--code))', - 'ch-active-border': 'hsl(var(--hiro))', - 'ch-line-number': 'var(--ch-26)', - background: 'hsl(var(--background))', - foreground: 'hsl(var(--foreground))', - card: { - DEFAULT: 'hsl(var(--card))', - foreground: 'hsl(var(--card-foreground))' - }, - popover: { - DEFAULT: 'hsl(var(--popover))', - foreground: 'hsl(var(--popover-foreground))' - }, - primary: { - DEFAULT: 'hsl(var(--primary))', - foreground: 'hsl(var(--primary-foreground))' - }, - secondary: { - DEFAULT: 'hsl(var(--secondary))', - foreground: 'hsl(var(--secondary-foreground))' - }, - muted: { - DEFAULT: 'hsl(var(--muted))', - foreground: 'var(--muted-foreground)' - }, - accent: { - DEFAULT: 'hsl(var(--accent))', - foreground: 'hsl(var(--accent-foreground))' - }, - destructive: { - DEFAULT: 'hsl(var(--destructive))', - foreground: 'hsl(var(--destructive-foreground))' - }, - border: 'hsl(var(--border))', - input: 'hsl(var(--input))', - ring: 'hsl(var(--ring))', - hiro: 'hsl(var(--hiro) / <alpha-value>)', - 'card-hover': 'hsl(var(--card-hover) / <alpha-value>)', - icon: '(var(--icon)', - inverted: 'var(--inverted)', - code: 'hsl(var(--code) / <alpha-value>)', - highlight: 'hsl(var(--highlight) / <alpha-value>)', - content: 'hsl(var(--content) / <alpha-value>)', - dark: 'var(--dark)', - gradient: 'var(--gradient)', - contrast: 'hsl(var(--contrast) / <alpha-value>)', - chart: { - '1': 'hsl(var(--chart-1))', - '2': 'hsl(var(--chart-2))', - '3': 'hsl(var(--chart-3))', - '4': 'hsl(var(--chart-4))', - '5': 'hsl(var(--chart-5))' - }, - sidebar: { - DEFAULT: 'hsl(var(--sidebar-background))', - foreground: 'hsl(var(--sidebar-foreground))', - primary: 'hsl(var(--sidebar-primary))', - 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))', - accent: 'hsl(var(--sidebar-accent))', - 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))', - border: 'hsl(var(--sidebar-border))', - ring: 'hsl(var(--sidebar-ring))' - } - }, - fontFamily: { - sans: ['var(--font-geist-sans)'], - mono: ["var(--font-aeonikMono)"], - aeonik: ['var(--font-aeonik)'], - aeonikFono: ['var(--font-aeonikFono)'], - inter: ['var(--font-inter)'] - }, - backgroundImage: { - 'gradient-radial': 'radial-gradient(circle, var(--tw-gradient-stops))', - 'repeat-gradient-to-r': 'repeating-linear-gradient(to right, var(--tw-gradient-stops))', - 'repeat-gradient-to-br': 'repeating-linear-gradient(to bottom right, var(--tw-gradient-stops))' - }, - keyframes: { - updown: { - 'from, to': { - transform: 'translateY(-20px)' - }, - '50%': { - transform: 'translateY(20px)' - } - }, - light: { - 'from, to': { - opacity: '0.7' - }, - '50%': { - opacity: '1' - } - }, - stroke: { - from: { - 'stroke-dasharray': '1000' - }, - to: { - 'stroke-dasharray': '1000', - 'stroke-dashoffset': '2000' - } - }, - marquee: { - from: { - transform: 'translateX(0)' - }, - to: { - transform: 'translateX(calc(-100% - var(--gap)))' - } - }, - 'marquee-vertical': { - from: { - transform: 'translateY(0)' - }, - to: { - transform: 'translateY(calc(-100% - var(--gap)))' - } - } - }, - animation: { - stroke: 'stroke 5s linear infinite', - light: 'light 2s ease-in-out infinite', - updown: 'updown 3s ease-in-out infinite', - marquee: 'marquee var(--duration) linear infinite', - 'marquee-vertical': 'marquee-vertical var(--duration) linear infinite' - }, - borderRadius: { - lg: 'var(--radius)', - md: 'calc(var(--radius) - 2px)', - sm: 'calc(var(--radius) - 4px)' - } - } - }, - plugins: [require('tailwindcss-animate')], -}; diff --git a/types/recipes.ts b/types/recipes.ts deleted file mode 100644 index f199211c9..000000000 --- a/types/recipes.ts +++ /dev/null @@ -1,71 +0,0 @@ -export type RecipeType = "typescript" | "bash" | "clarity"; - -export type RecipeCategory = - | "stacks-js" - | "clarity" - | "bitcoin" - | "chainhook" - | "api" - | "clarinet"; - -export const CategorySubTags = { - "stacks-js": [ - "web", - "authentication", - "transactions", - "signing", - "smart-contracts", - "utils", - ] as const, - - clarity: [] as const, - - bitcoin: ["transactions", "signing"] as const, - - chainhook: [] as const, - - api: [ - "token-metadata", - "signer-metrics", - "rpc", - "platform", - "ordinals", - "runes", - ] as const, - - clarinet: ["testing", "deployment"] as const, -} as const; - -export type SubTagsForCategory = { - [K in RecipeCategory]: (typeof CategorySubTags)[K][number]; -}; - -export type RecipeSubTag = SubTagsForCategory[RecipeCategory]; - -// Base metadata from front matter -export interface RecipeMetadata { - id: string; - title: string; - description: string; - date: string; - categories: RecipeCategory[]; - tags: SubTagsForCategory[RecipeCategory][]; - dependencies?: Record<string, string>; - external_url?: string; -} - -// Code blocks extracted from markdown content -export interface RecipeFile { - name: string; - path: string; - type: RecipeType; - content: string; - snippet?: string; - preview?: any; -} - -// Complete recipe with content and extracted files -export interface Recipe extends RecipeMetadata { - content: string; // The full markdown content - files: RecipeFile[]; // Extracted code blocks -} From 6f12db7fcde6d217011cb9e8af8e6aa847aeee82 Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 11:55:15 -0500 Subject: [PATCH 08/21] update config files --- .github/workflows/linkcheck.yml | 27 + .source/index.ts | 522 ++++++ .source/source.config.mjs | 35 + bun.lock | 1386 ++++++++++++++ components.json | 5 +- next-env.d.ts | 2 +- next.config.mjs | 130 +- package.json | 142 +- postcss.config.mjs | 5 + public/orama.json | 1 + public/search-index.json | 3110 +++++++++++++++++++++++++++++++ scripts/build-search-index.ts | 135 ++ scripts/fetch-recipes.mts | 9 - source.config.ts | 33 + tsconfig.json | 3 +- 15 files changed, 5320 insertions(+), 225 deletions(-) create mode 100644 .github/workflows/linkcheck.yml create mode 100644 .source/index.ts create mode 100644 .source/source.config.mjs create mode 100644 bun.lock create mode 100644 postcss.config.mjs create mode 100644 public/orama.json create mode 100644 public/search-index.json create mode 100644 scripts/build-search-index.ts create mode 100644 source.config.ts diff --git a/.github/workflows/linkcheck.yml b/.github/workflows/linkcheck.yml new file mode 100644 index 000000000..f754f014a --- /dev/null +++ b/.github/workflows/linkcheck.yml @@ -0,0 +1,27 @@ +name: linkcheck + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + workflow_dispatch: + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Run link validation + run: bun run lint diff --git a/.source/index.ts b/.source/index.ts new file mode 100644 index 000000000..2c4b37160 --- /dev/null +++ b/.source/index.ts @@ -0,0 +1,522 @@ +// @ts-nocheck -- skip type checking +import * as docs_517 from "../content/docs/stacks/token-metadata-api/client/tokens/index.mdx?collection=docs&hash=1744048693706" +import * as docs_516 from "../content/docs/stacks/token-metadata-api/client/tokens/get-ft-metadata.mdx?collection=docs&hash=1744048693706" +import * as docs_515 from "../content/docs/stacks/chainhook/references/scopes/stacks.mdx?collection=docs&hash=1744048693706" +import * as docs_514 from "../content/docs/stacks/chainhook/references/scopes/bitcoin.mdx?collection=docs&hash=1744048693706" +import * as docs_513 from "../content/docs/stacks/api/token-metadata/tokens/semi-fungible-token-metadata.mdx?collection=docs&hash=1744048693706" +import * as docs_512 from "../content/docs/stacks/api/token-metadata/tokens/non-fungible-token-metadata.mdx?collection=docs&hash=1744048693706" +import * as docs_511 from "../content/docs/stacks/api/token-metadata/tokens/index.mdx?collection=docs&hash=1744048693706" +import * as docs_510 from "../content/docs/stacks/api/token-metadata/tokens/fungible-tokens.mdx?collection=docs&hash=1744048693706" +import * as docs_509 from "../content/docs/stacks/api/token-metadata/tokens/fungible-token-metadata.mdx?collection=docs&hash=1744048693706" +import * as docs_508 from "../content/docs/stacks/api/token-metadata/info/status.mdx?collection=docs&hash=1744048693706" +import * as docs_507 from "../content/docs/stacks/api/token-metadata/info/index.mdx?collection=docs&hash=1744048693706" +import * as docs_506 from "../content/docs/stacks/api/stacks-blockchain/transactions/transactions-for-address.mdx?collection=docs&hash=1744048693706" +import * as docs_505 from "../content/docs/stacks/api/stacks-blockchain/transactions/transactions-by-block.mdx?collection=docs&hash=1744048693706" +import * as docs_504 from "../content/docs/stacks/api/stacks-blockchain/transactions/transaction-events.mdx?collection=docs&hash=1744048693706" +import * as docs_503 from "../content/docs/stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions.mdx?collection=docs&hash=1744048693706" +import * as docs_502 from "../content/docs/stacks/api/stacks-blockchain/transactions/recent-transactions.mdx?collection=docs&hash=1744048693706" +import * as docs_501 from "../content/docs/stacks/api/stacks-blockchain/transactions/mempool-transactions.mdx?collection=docs&hash=1744048693706" +import * as docs_500 from "../content/docs/stacks/api/stacks-blockchain/transactions/index.mdx?collection=docs&hash=1744048693706" +import * as docs_499 from "../content/docs/stacks/api/stacks-blockchain/transactions/get-transaction.mdx?collection=docs&hash=1744048693706" +import * as docs_498 from "../content/docs/stacks/api/stacks-blockchain/transactions/get-raw-transaction.mdx?collection=docs&hash=1744048693706" +import * as docs_497 from "../content/docs/stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction.mdx?collection=docs&hash=1744048693706" +import * as docs_496 from "../content/docs/stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions.mdx?collection=docs&hash=1744048693706" +import * as docs_495 from "../content/docs/stacks/api/stacks-blockchain/transactions/details-for-transactions.mdx?collection=docs&hash=1744048693706" +import * as docs_494 from "../content/docs/stacks/api/stacks-blockchain/transactions/address-transactions.mdx?collection=docs&hash=1744048693706" +import * as docs_493 from "../content/docs/stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient.mdx?collection=docs&hash=1744048693706" +import * as docs_492 from "../content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders.mdx?collection=docs&hash=1744048693706" +import * as docs_491 from "../content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries.mdx?collection=docs&hash=1744048693706" +import * as docs_490 from "../content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients.mdx?collection=docs&hash=1744048693706" +import * as docs_489 from "../content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient.mdx?collection=docs&hash=1744048693706" +import * as docs_488 from "../content/docs/stacks/api/stacks-blockchain/stacking-rewards/index.mdx?collection=docs&hash=1744048693706" +import * as docs_487 from "../content/docs/stacks/api/stacks-blockchain/tokens/index.mdx?collection=docs&hash=1744048693706" +import * as docs_486 from "../content/docs/stacks/api/stacks-blockchain/tokens/holders.mdx?collection=docs&hash=1744048693706" +import * as docs_485 from "../content/docs/stacks/api/stacks-blockchain/stacking-pool/members.mdx?collection=docs&hash=1744048693706" +import * as docs_484 from "../content/docs/stacks/api/stacks-blockchain/stacking-pool/index.mdx?collection=docs&hash=1744048693706" +import * as docs_483 from "../content/docs/stacks/api/stacks-blockchain/smart-contracts/status.mdx?collection=docs&hash=1744048693706" +import * as docs_482 from "../content/docs/stacks/api/stacks-blockchain/smart-contracts/info.mdx?collection=docs&hash=1744048693706" +import * as docs_481 from "../content/docs/stacks/api/stacks-blockchain/smart-contracts/index.mdx?collection=docs&hash=1744048693706" +import * as docs_480 from "../content/docs/stacks/api/stacks-blockchain/smart-contracts/events.mdx?collection=docs&hash=1744048693706" +import * as docs_479 from "../content/docs/stacks/api/stacks-blockchain/smart-contracts/by-trait.mdx?collection=docs&hash=1744048693706" +import * as docs_478 from "../content/docs/stacks/api/stacks-blockchain/search/search-by-id.mdx?collection=docs&hash=1744048693706" +import * as docs_477 from "../content/docs/stacks/api/stacks-blockchain/search/index.mdx?collection=docs&hash=1744048693706" +import * as docs_476 from "../content/docs/stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle.mdx?collection=docs&hash=1744048693706" +import * as docs_475 from "../content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle.mdx?collection=docs&hash=1744048693706" +import * as docs_474 from "../content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle.mdx?collection=docs&hash=1744048693706" +import * as docs_473 from "../content/docs/stacks/api/stacks-blockchain/proof-of-transfer/index.mdx?collection=docs&hash=1744048693706" +import * as docs_472 from "../content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycles.mdx?collection=docs&hash=1744048693706" +import * as docs_471 from "../content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycle.mdx?collection=docs&hash=1744048693706" +import * as docs_470 from "../content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/mints.mdx?collection=docs&hash=1744048693706" +import * as docs_469 from "../content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/index.mdx?collection=docs&hash=1744048693706" +import * as docs_468 from "../content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/holdings.mdx?collection=docs&hash=1744048693706" +import * as docs_467 from "../content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/history.mdx?collection=docs&hash=1744048693706" +import * as docs_466 from "../content/docs/stacks/api/stacks-blockchain/names/owned-by-address.mdx?collection=docs&hash=1744048693706" +import * as docs_465 from "../content/docs/stacks/api/stacks-blockchain/names/namespaces.mdx?collection=docs&hash=1744048693706" +import * as docs_464 from "../content/docs/stacks/api/stacks-blockchain/names/namespace-names.mdx?collection=docs&hash=1744048693706" +import * as docs_463 from "../content/docs/stacks/api/stacks-blockchain/names/names.mdx?collection=docs&hash=1744048693706" +import * as docs_462 from "../content/docs/stacks/api/stacks-blockchain/names/name-zonefile.mdx?collection=docs&hash=1744048693706" +import * as docs_461 from "../content/docs/stacks/api/stacks-blockchain/names/name-subdomains.mdx?collection=docs&hash=1744048693706" +import * as docs_460 from "../content/docs/stacks/api/stacks-blockchain/names/name-details.mdx?collection=docs&hash=1744048693706" +import * as docs_459 from "../content/docs/stacks/api/stacks-blockchain/names/index.mdx?collection=docs&hash=1744048693706" +import * as docs_458 from "../content/docs/stacks/api/stacks-blockchain/names/historical-zonefile.mdx?collection=docs&hash=1744048693706" +import * as docs_457 from "../content/docs/stacks/api/stacks-blockchain/mempool/transaction-fee-priorities.mdx?collection=docs&hash=1744048693706" +import * as docs_456 from "../content/docs/stacks/api/stacks-blockchain/mempool/index.mdx?collection=docs&hash=1744048693706" +import * as docs_455 from "../content/docs/stacks/api/stacks-blockchain/fees/index.mdx?collection=docs&hash=1744048693706" +import * as docs_454 from "../content/docs/stacks/api/stacks-blockchain/fees/fee-rate.mdx?collection=docs&hash=1744048693706" +import * as docs_453 from "../content/docs/stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text.mdx?collection=docs&hash=1744048693706" +import * as docs_452 from "../content/docs/stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply.mdx?collection=docs&hash=1744048693706" +import * as docs_451 from "../content/docs/stacks/api/stacks-blockchain/info/status.mdx?collection=docs&hash=1744048693706" +import * as docs_450 from "../content/docs/stacks/api/stacks-blockchain/info/network-given-block-time.mdx?collection=docs&hash=1744048693706" +import * as docs_449 from "../content/docs/stacks/api/stacks-blockchain/info/network-block-time.mdx?collection=docs&hash=1744048693706" +import * as docs_448 from "../content/docs/stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply.mdx?collection=docs&hash=1744048693706" +import * as docs_447 from "../content/docs/stacks/api/stacks-blockchain/info/index.mdx?collection=docs&hash=1744048693706" +import * as docs_446 from "../content/docs/stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text.mdx?collection=docs&hash=1744048693706" +import * as docs_445 from "../content/docs/stacks/api/stacks-blockchain/faucets/stx.mdx?collection=docs&hash=1744048693706" +import * as docs_444 from "../content/docs/stacks/api/stacks-blockchain/faucets/index.mdx?collection=docs&hash=1744048693706" +import * as docs_443 from "../content/docs/stacks/api/stacks-blockchain/burn-blocks/index.mdx?collection=docs&hash=1744048693706" +import * as docs_442 from "../content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks.mdx?collection=docs&hash=1744048693706" +import * as docs_441 from "../content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-block.mdx?collection=docs&hash=1744048693706" +import * as docs_440 from "../content/docs/stacks/api/stacks-blockchain/blocks/recent-blocks.mdx?collection=docs&hash=1744048693706" +import * as docs_439 from "../content/docs/stacks/api/stacks-blockchain/blocks/index.mdx?collection=docs&hash=1744048693706" +import * as docs_438 from "../content/docs/stacks/api/stacks-blockchain/blocks/get-blocks.mdx?collection=docs&hash=1744048693706" +import * as docs_437 from "../content/docs/stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block.mdx?collection=docs&hash=1744048693706" +import * as docs_436 from "../content/docs/stacks/api/stacks-blockchain/blocks/get-block.mdx?collection=docs&hash=1744048693706" +import * as docs_435 from "../content/docs/stacks/api/stacks-blockchain/blocks/block-by-height.mdx?collection=docs&hash=1744048693706" +import * as docs_434 from "../content/docs/stacks/api/stacks-blockchain/blocks/block-by-hash.mdx?collection=docs&hash=1744048693706" +import * as docs_433 from "../content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-height.mdx?collection=docs&hash=1744048693706" +import * as docs_432 from "../content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash.mdx?collection=docs&hash=1744048693706" +import * as docs_431 from "../content/docs/stacks/api/stacks-blockchain/blocks/average-times.mdx?collection=docs&hash=1744048693706" +import * as docs_430 from "../content/docs/stacks/api/stacks-blockchain/accounts/transactions.mdx?collection=docs&hash=1744048693706" +import * as docs_429 from "../content/docs/stacks/api/stacks-blockchain/accounts/transactions-with-transfers.mdx?collection=docs&hash=1744048693706" +import * as docs_428 from "../content/docs/stacks/api/stacks-blockchain/accounts/transaction-with-transfers.mdx?collection=docs&hash=1744048693706" +import * as docs_427 from "../content/docs/stacks/api/stacks-blockchain/accounts/stx-balances.mdx?collection=docs&hash=1744048693706" +import * as docs_426 from "../content/docs/stacks/api/stacks-blockchain/accounts/nft-events.mdx?collection=docs&hash=1744048693706" +import * as docs_425 from "../content/docs/stacks/api/stacks-blockchain/accounts/latest-nonce.mdx?collection=docs&hash=1744048693706" +import * as docs_424 from "../content/docs/stacks/api/stacks-blockchain/accounts/inbound-stx-transfers.mdx?collection=docs&hash=1744048693706" +import * as docs_423 from "../content/docs/stacks/api/stacks-blockchain/accounts/balances.mdx?collection=docs&hash=1744048693706" +import * as docs_422 from "../content/docs/stacks/api/stacks-blockchain/accounts/assets.mdx?collection=docs&hash=1744048693706" +import * as docs_421 from "../content/docs/bitcoin/runes/explorer/guides/build-explorer.mdx?collection=docs&hash=1744048693706" +import * as docs_420 from "../content/docs/bitcoin/runes/api/info/status.mdx?collection=docs&hash=1744048693706" +import * as docs_419 from "../content/docs/bitcoin/runes/api/info/index.mdx?collection=docs&hash=1744048693706" +import * as docs_418 from "../content/docs/bitcoin/runes/api/etchings/index.mdx?collection=docs&hash=1744048693706" +import * as docs_417 from "../content/docs/bitcoin/runes/api/etchings/get-etchings.mdx?collection=docs&hash=1744048693706" +import * as docs_416 from "../content/docs/bitcoin/runes/api/etchings/get-etching.mdx?collection=docs&hash=1744048693706" +import * as docs_415 from "../content/docs/bitcoin/runes/api/balances/index.mdx?collection=docs&hash=1744048693706" +import * as docs_414 from "../content/docs/bitcoin/runes/api/balances/holders.mdx?collection=docs&hash=1744048693706" +import * as docs_413 from "../content/docs/bitcoin/runes/api/balances/holder-balance.mdx?collection=docs&hash=1744048693706" +import * as docs_412 from "../content/docs/bitcoin/runes/api/balances/address.mdx?collection=docs&hash=1744048693706" +import * as docs_411 from "../content/docs/bitcoin/runes/api/activities/index.mdx?collection=docs&hash=1744048693706" +import * as docs_410 from "../content/docs/bitcoin/runes/api/activities/for-transaction.mdx?collection=docs&hash=1744048693706" +import * as docs_409 from "../content/docs/bitcoin/runes/api/activities/for-block.mdx?collection=docs&hash=1744048693706" +import * as docs_408 from "../content/docs/bitcoin/runes/api/activities/for-address.mdx?collection=docs&hash=1744048693706" +import * as docs_407 from "../content/docs/bitcoin/runes/api/activities/activity.mdx?collection=docs&hash=1744048693706" +import * as docs_406 from "../content/docs/bitcoin/ordinals/api/statistics/index.mdx?collection=docs&hash=1744048693706" +import * as docs_405 from "../content/docs/bitcoin/ordinals/api/statistics/get-stats-inscription-count.mdx?collection=docs&hash=1744048693706" +import * as docs_404 from "../content/docs/bitcoin/ordinals/api/satoshis/index.mdx?collection=docs&hash=1744048693706" +import * as docs_403 from "../content/docs/bitcoin/ordinals/api/satoshis/get-satoshi.mdx?collection=docs&hash=1744048693706" +import * as docs_402 from "../content/docs/bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions.mdx?collection=docs&hash=1744048693706" +import * as docs_401 from "../content/docs/bitcoin/ordinals/api/inscriptions/index.mdx?collection=docs&hash=1744048693706" +import * as docs_400 from "../content/docs/bitcoin/ordinals/api/inscriptions/get-transfers-per-block.mdx?collection=docs&hash=1744048693706" +import * as docs_399 from "../content/docs/bitcoin/ordinals/api/inscriptions/get-inscriptions.mdx?collection=docs&hash=1744048693706" +import * as docs_398 from "../content/docs/bitcoin/ordinals/api/inscriptions/get-inscription.mdx?collection=docs&hash=1744048693706" +import * as docs_397 from "../content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-transfers.mdx?collection=docs&hash=1744048693706" +import * as docs_396 from "../content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-content.mdx?collection=docs&hash=1744048693706" +import * as docs_395 from "../content/docs/bitcoin/ordinals/api/info/status.mdx?collection=docs&hash=1744048693706" +import * as docs_394 from "../content/docs/bitcoin/ordinals/api/info/index.mdx?collection=docs&hash=1744048693706" +import * as docs_393 from "../content/docs/bitcoin/ordinals/api/brc20/index.mdx?collection=docs&hash=1744048693706" +import * as docs_392 from "../content/docs/bitcoin/ordinals/api/brc20/get-brc20-tokens.mdx?collection=docs&hash=1744048693706" +import * as docs_391 from "../content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-holders.mdx?collection=docs&hash=1744048693706" +import * as docs_390 from "../content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-details.mdx?collection=docs&hash=1744048693706" +import * as docs_389 from "../content/docs/bitcoin/ordinals/api/brc20/get-brc20-balances.mdx?collection=docs&hash=1744048693706" +import * as docs_388 from "../content/docs/bitcoin/ordinals/api/brc20/get-brc20-activity.mdx?collection=docs&hash=1744048693706" +import * as docs_387 from "../content/docs/bitcoin/ordinals/explorer/guides/build-explorer.mdx?collection=docs&hash=1744048693706" +import * as docs_386 from "../content/docs/bitcoin/api/runes/info/status.mdx?collection=docs&hash=1744048693706" +import * as docs_385 from "../content/docs/bitcoin/api/runes/info/index.mdx?collection=docs&hash=1744048693706" +import * as docs_384 from "../content/docs/bitcoin/api/runes/etchings/index.mdx?collection=docs&hash=1744048693706" +import * as docs_383 from "../content/docs/bitcoin/api/runes/etchings/get-etchings.mdx?collection=docs&hash=1744048693706" +import * as docs_382 from "../content/docs/bitcoin/api/runes/etchings/get-etching.mdx?collection=docs&hash=1744048693706" +import * as docs_381 from "../content/docs/bitcoin/api/runes/balances/index.mdx?collection=docs&hash=1744048693706" +import * as docs_380 from "../content/docs/bitcoin/api/runes/balances/holders.mdx?collection=docs&hash=1744048693706" +import * as docs_379 from "../content/docs/bitcoin/api/runes/balances/holder-balance.mdx?collection=docs&hash=1744048693706" +import * as docs_378 from "../content/docs/bitcoin/api/runes/balances/address.mdx?collection=docs&hash=1744048693706" +import * as docs_377 from "../content/docs/bitcoin/api/ordinals/satoshis/index.mdx?collection=docs&hash=1744048693706" +import * as docs_376 from "../content/docs/bitcoin/api/ordinals/satoshis/get-satoshi.mdx?collection=docs&hash=1744048693706" +import * as docs_375 from "../content/docs/bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions.mdx?collection=docs&hash=1744048693706" +import * as docs_374 from "../content/docs/bitcoin/api/ordinals/info/status.mdx?collection=docs&hash=1744048693706" +import * as docs_373 from "../content/docs/bitcoin/api/ordinals/info/index.mdx?collection=docs&hash=1744048693706" +import * as docs_372 from "../content/docs/bitcoin/api/runes/activities/index.mdx?collection=docs&hash=1744048693706" +import * as docs_371 from "../content/docs/bitcoin/api/runes/activities/for-transaction.mdx?collection=docs&hash=1744048693706" +import * as docs_370 from "../content/docs/bitcoin/api/runes/activities/for-block.mdx?collection=docs&hash=1744048693706" +import * as docs_369 from "../content/docs/bitcoin/api/runes/activities/for-address.mdx?collection=docs&hash=1744048693706" +import * as docs_368 from "../content/docs/bitcoin/api/runes/activities/activity.mdx?collection=docs&hash=1744048693706" +import * as docs_367 from "../content/docs/bitcoin/api/ordinals/statistics/index.mdx?collection=docs&hash=1744048693706" +import * as docs_366 from "../content/docs/bitcoin/api/ordinals/statistics/get-stats-inscription-count.mdx?collection=docs&hash=1744048693706" +import * as docs_365 from "../content/docs/bitcoin/api/ordinals/inscriptions/index.mdx?collection=docs&hash=1744048693706" +import * as docs_364 from "../content/docs/bitcoin/api/ordinals/inscriptions/get-transfers-per-block.mdx?collection=docs&hash=1744048693706" +import * as docs_363 from "../content/docs/bitcoin/api/ordinals/inscriptions/get-inscriptions.mdx?collection=docs&hash=1744048693706" +import * as docs_362 from "../content/docs/bitcoin/api/ordinals/inscriptions/get-inscription.mdx?collection=docs&hash=1744048693706" +import * as docs_361 from "../content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-transfers.mdx?collection=docs&hash=1744048693706" +import * as docs_360 from "../content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-content.mdx?collection=docs&hash=1744048693706" +import * as docs_359 from "../content/docs/bitcoin/api/ordinals/brc20/index.mdx?collection=docs&hash=1744048693706" +import * as docs_358 from "../content/docs/bitcoin/api/ordinals/brc20/get-brc20-tokens.mdx?collection=docs&hash=1744048693706" +import * as docs_357 from "../content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-holders.mdx?collection=docs&hash=1744048693706" +import * as docs_356 from "../content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-details.mdx?collection=docs&hash=1744048693706" +import * as docs_355 from "../content/docs/bitcoin/api/ordinals/brc20/get-brc20-balances.mdx?collection=docs&hash=1744048693706" +import * as docs_354 from "../content/docs/bitcoin/api/ordinals/brc20/get-brc20-activity.mdx?collection=docs&hash=1744048693706" +import * as docs_353 from "../content/docs/stacks/token-metadata-api/tokens/semi-fungible-token-metadata.mdx?collection=docs&hash=1744048693706" +import * as docs_352 from "../content/docs/stacks/token-metadata-api/tokens/non-fungible-token-metadata.mdx?collection=docs&hash=1744048693706" +import * as docs_351 from "../content/docs/stacks/token-metadata-api/tokens/index.mdx?collection=docs&hash=1744048693706" +import * as docs_350 from "../content/docs/stacks/token-metadata-api/tokens/fungible-tokens.mdx?collection=docs&hash=1744048693706" +import * as docs_349 from "../content/docs/stacks/token-metadata-api/tokens/fungible-token-metadata.mdx?collection=docs&hash=1744048693706" +import * as docs_348 from "../content/docs/stacks/token-metadata-api/info/status.mdx?collection=docs&hash=1744048693706" +import * as docs_347 from "../content/docs/stacks/token-metadata-api/info/index.mdx?collection=docs&hash=1744048693706" +import * as docs_346 from "../content/docs/stacks/token-metadata-api/client/quickstart.mdx?collection=docs&hash=1744048693706" +import * as docs_345 from "../content/docs/stacks/token-metadata-api/client/index.mdx?collection=docs&hash=1744048693706" +import * as docs_344 from "../content/docs/stacks/stacks.js/v6/transactions.mdx?collection=docs&hash=1744048693706" +import * as docs_343 from "../content/docs/stacks/stacks.js/v6/network.mdx?collection=docs&hash=1744048693706" +import * as docs_342 from "../content/docs/stacks/stacks.js/packages/transactions.mdx?collection=docs&hash=1744048693706" +import * as docs_341 from "../content/docs/stacks/stacks.js/packages/sbtc.mdx?collection=docs&hash=1744048693706" +import * as docs_340 from "../content/docs/stacks/stacks.js/packages/network.mdx?collection=docs&hash=1744048693706" +import * as docs_339 from "../content/docs/stacks/stacks.js/packages/common.mdx?collection=docs&hash=1744048693706" +import * as docs_338 from "../content/docs/stacks/stacks.js/examples/use-with-react-native.mdx?collection=docs&hash=1744048693706" +import * as docs_337 from "../content/docs/stacks/stacks.js/examples/post-conditions.mdx?collection=docs&hash=1744048693706" +import * as docs_336 from "../content/docs/stacks/stacks.js/examples/broadcast-transactions.mdx?collection=docs&hash=1744048693706" +import * as docs_335 from "../content/docs/stacks/stacks.js/concepts/transactions.mdx?collection=docs&hash=1744048693706" +import * as docs_334 from "../content/docs/stacks/stacks.js/concepts/private-keys.mdx?collection=docs&hash=1744048693706" +import * as docs_333 from "../content/docs/stacks/stacks.js/concepts/post-conditions.mdx?collection=docs&hash=1744048693706" +import * as docs_332 from "../content/docs/stacks/stacks.js/concepts/networks.mdx?collection=docs&hash=1744048693706" +import * as docs_331 from "../content/docs/stacks/stacks.js/concepts/broadcasting.mdx?collection=docs&hash=1744048693706" +import * as docs_330 from "../content/docs/stacks/stacks.js/concepts/accounts-and-addresses.mdx?collection=docs&hash=1744048693706" +import * as docs_329 from "../content/docs/stacks/rpc-api/v3/tenure-metadata.mdx?collection=docs&hash=1744048693706" +import * as docs_328 from "../content/docs/stacks/rpc-api/v3/tenure-blocks.mdx?collection=docs&hash=1744048693706" +import * as docs_327 from "../content/docs/stacks/rpc-api/v3/nakamoto-block.mdx?collection=docs&hash=1744048693706" +import * as docs_326 from "../content/docs/stacks/rpc-api/v3/index.mdx?collection=docs&hash=1744048693706" +import * as docs_325 from "../content/docs/stacks/rpc-api/transactions/index.mdx?collection=docs&hash=1744048693706" +import * as docs_324 from "../content/docs/stacks/rpc-api/transactions/broadcast-transaction.mdx?collection=docs&hash=1744048693706" +import * as docs_323 from "../content/docs/stacks/rpc-api/smart-contracts/traits.mdx?collection=docs&hash=1744048693706" +import * as docs_322 from "../content/docs/stacks/rpc-api/smart-contracts/source.mdx?collection=docs&hash=1744048693706" +import * as docs_321 from "../content/docs/stacks/rpc-api/smart-contracts/read-only.mdx?collection=docs&hash=1744048693706" +import * as docs_320 from "../content/docs/stacks/rpc-api/smart-contracts/map-entry.mdx?collection=docs&hash=1744048693706" +import * as docs_319 from "../content/docs/stacks/rpc-api/smart-contracts/interface.mdx?collection=docs&hash=1744048693706" +import * as docs_318 from "../content/docs/stacks/rpc-api/smart-contracts/index.mdx?collection=docs&hash=1744048693706" +import * as docs_317 from "../content/docs/stacks/rpc-api/smart-contracts/constants.mdx?collection=docs&hash=1744048693706" +import * as docs_316 from "../content/docs/stacks/rpc-api/pox/stacker-set.mdx?collection=docs&hash=1744048693706" +import * as docs_315 from "../content/docs/stacks/rpc-api/pox/pox-details.mdx?collection=docs&hash=1744048693706" +import * as docs_314 from "../content/docs/stacks/rpc-api/pox/index.mdx?collection=docs&hash=1744048693706" +import * as docs_313 from "../content/docs/stacks/rpc-api/names/namespace-price.mdx?collection=docs&hash=1744048693706" +import * as docs_312 from "../content/docs/stacks/rpc-api/names/name-price.mdx?collection=docs&hash=1744048693706" +import * as docs_311 from "../content/docs/stacks/rpc-api/names/index.mdx?collection=docs&hash=1744048693706" +import * as docs_310 from "../content/docs/stacks/rpc-api/info/index.mdx?collection=docs&hash=1744048693706" +import * as docs_309 from "../content/docs/stacks/rpc-api/info/core-api.mdx?collection=docs&hash=1744048693706" +import * as docs_308 from "../content/docs/stacks/rpc-api/fees/transfer-estimate.mdx?collection=docs&hash=1744048693706" +import * as docs_307 from "../content/docs/stacks/rpc-api/fees/index.mdx?collection=docs&hash=1744048693706" +import * as docs_306 from "../content/docs/stacks/rpc-api/fees/estimate.mdx?collection=docs&hash=1744048693706" +import * as docs_305 from "../content/docs/stacks/rpc-api/burn-ops/index.mdx?collection=docs&hash=1744048693706" +import * as docs_304 from "../content/docs/stacks/rpc-api/burn-ops/get-burn-operations.mdx?collection=docs&hash=1744048693706" +import * as docs_303 from "../content/docs/stacks/rpc-api/blocks/index.mdx?collection=docs&hash=1744048693706" +import * as docs_302 from "../content/docs/stacks/rpc-api/blocks/block-proposal.mdx?collection=docs&hash=1744048693706" +import * as docs_301 from "../content/docs/stacks/rpc-api/accounts/info.mdx?collection=docs&hash=1744048693706" +import * as docs_300 from "../content/docs/stacks/rpc-api/accounts/index.mdx?collection=docs&hash=1744048693706" +import * as docs_299 from "../content/docs/stacks/signer-metrics-api/signers/pox-cycle-signers.mdx?collection=docs&hash=1744048693706" +import * as docs_298 from "../content/docs/stacks/signer-metrics-api/signers/pox-cycle-signer.mdx?collection=docs&hash=1744048693706" +import * as docs_297 from "../content/docs/stacks/signer-metrics-api/signers/index.mdx?collection=docs&hash=1744048693706" +import * as docs_296 from "../content/docs/stacks/signer-metrics-api/prometheus/metrics.mdx?collection=docs&hash=1744048693706" +import * as docs_295 from "../content/docs/stacks/signer-metrics-api/prometheus/index.mdx?collection=docs&hash=1744048693706" +import * as docs_294 from "../content/docs/stacks/signer-metrics-api/info/status.mdx?collection=docs&hash=1744048693706" +import * as docs_293 from "../content/docs/stacks/signer-metrics-api/info/index.mdx?collection=docs&hash=1744048693706" +import * as docs_292 from "../content/docs/stacks/signer-metrics-api/blocks/index.mdx?collection=docs&hash=1744048693706" +import * as docs_291 from "../content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks.mdx?collection=docs&hash=1744048693706" +import * as docs_290 from "../content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block.mdx?collection=docs&hash=1744048693706" +import * as docs_289 from "../content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals.mdx?collection=docs&hash=1744048693706" +import * as docs_288 from "../content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-a-block.mdx?collection=docs&hash=1744048693706" +import * as docs_287 from "../content/docs/stacks/signer-metrics-api/block-proposals/index.mdx?collection=docs&hash=1744048693706" +import * as docs_286 from "../content/docs/stacks/reference/stacks.js/transactions.mdx?collection=docs&hash=1744048693706" +import * as docs_285 from "../content/docs/stacks/reference/stacks.js/sbtc.mdx?collection=docs&hash=1744048693706" +import * as docs_284 from "../content/docs/stacks/reference/stacks.js/network.mdx?collection=docs&hash=1744048693706" +import * as docs_283 from "../content/docs/stacks/reference/stacks.js/connect.mdx?collection=docs&hash=1744048693706" +import * as docs_282 from "../content/docs/stacks/reference/stacks.js/common.mdx?collection=docs&hash=1744048693706" +import * as docs_281 from "../content/docs/stacks/reference/stacks-blockchain-api/client.mdx?collection=docs&hash=1744048693706" +import * as docs_280 from "../content/docs/stacks/reference/cli/stacks-js.mdx?collection=docs&hash=1744048693706" +import * as docs_279 from "../content/docs/stacks/reference/cli/clarinet.mdx?collection=docs&hash=1744048693706" +import * as docs_278 from "../content/docs/stacks/reference/clarinet-js-sdk/simnet.mdx?collection=docs&hash=1744048693706" +import * as docs_277 from "../content/docs/stacks/reference/clarinet-js-sdk/properties.mdx?collection=docs&hash=1744048693706" +import * as docs_276 from "../content/docs/stacks/reference/clarinet-js-sdk/methods.mdx?collection=docs&hash=1744048693706" +import * as docs_275 from "../content/docs/stacks/reference/clarinet-js-sdk/custom-matchers.mdx?collection=docs&hash=1744048693706" +import * as docs_274 from "../content/docs/stacks/reference/clarinet-js-sdk/clarinet-sdk.mdx?collection=docs&hash=1744048693706" +import * as docs_273 from "../content/docs/stacks/platform-api/devnet/stop.mdx?collection=docs&hash=1744048693706" +import * as docs_272 from "../content/docs/stacks/platform-api/devnet/start.mdx?collection=docs&hash=1744048693706" +import * as docs_271 from "../content/docs/stacks/platform-api/devnet/stacks-blockchain-api.mdx?collection=docs&hash=1744048693706" +import * as docs_270 from "../content/docs/stacks/platform-api/devnet/index.mdx?collection=docs&hash=1744048693706" +import * as docs_269 from "../content/docs/stacks/platform-api/devnet/bitcoin-node.mdx?collection=docs&hash=1744048693706" +import * as docs_268 from "../content/docs/stacks/platform-api/chainhooks/update.mdx?collection=docs&hash=1744048693706" +import * as docs_267 from "../content/docs/stacks/platform-api/chainhooks/status.mdx?collection=docs&hash=1744048693706" +import * as docs_266 from "../content/docs/stacks/platform-api/chainhooks/list.mdx?collection=docs&hash=1744048693706" +import * as docs_265 from "../content/docs/stacks/platform-api/chainhooks/index.mdx?collection=docs&hash=1744048693706" +import * as docs_264 from "../content/docs/stacks/platform-api/chainhooks/get.mdx?collection=docs&hash=1744048693706" +import * as docs_263 from "../content/docs/stacks/platform-api/chainhooks/delete.mdx?collection=docs&hash=1744048693706" +import * as docs_262 from "../content/docs/stacks/platform-api/chainhooks/create.mdx?collection=docs&hash=1744048693706" +import * as docs_261 from "../content/docs/stacks/platform/examples/faucet.mdx?collection=docs&hash=1744048693706" +import * as docs_260 from "../content/docs/stacks/platform/examples/devnet.mdx?collection=docs&hash=1744048693706" +import * as docs_259 from "../content/docs/stacks/platform/examples/deploy-contracts.mdx?collection=docs&hash=1744048693706" +import * as docs_258 from "../content/docs/stacks/platform/examples/create-project.mdx?collection=docs&hash=1744048693706" +import * as docs_257 from "../content/docs/stacks/platform/examples/create-chainhooks.mdx?collection=docs&hash=1744048693706" +import * as docs_256 from "../content/docs/stacks/platform/examples/contract-monitoring.mdx?collection=docs&hash=1744048693706" +import * as docs_255 from "../content/docs/stacks/platform/examples/archive-project.mdx?collection=docs&hash=1744048693706" +import * as docs_254 from "../content/docs/stacks/nakamoto/guides/stacks-js.mdx?collection=docs&hash=1744048693706" +import * as docs_253 from "../content/docs/stacks/nakamoto/guides/stacks-api.mdx?collection=docs&hash=1744048693706" +import * as docs_252 from "../content/docs/stacks/nakamoto/guides/explorer.mdx?collection=docs&hash=1744048693706" +import * as docs_251 from "../content/docs/stacks/nakamoto/guides/clarinet.mdx?collection=docs&hash=1744048693706" +import * as docs_250 from "../content/docs/stacks/hacks/archive/build-a-friend-tech-clone.mdx?collection=docs&hash=1744048693706" +import * as docs_249 from "../content/docs/stacks/hacks/archive/build-a-decentralized-grants-program.mdx?collection=docs&hash=1744048693706" +import * as docs_248 from "../content/docs/stacks/hacks/archive/build-a-custom-api.mdx?collection=docs&hash=1744048693706" +import * as docs_247 from "../content/docs/stacks/hacks/archive/ai.mdx?collection=docs&hash=1744048693706" +import * as docs_246 from "../content/docs/stacks/explorer/guides/build-explorer.mdx?collection=docs&hash=1744048693706" +import * as docs_245 from "../content/docs/stacks/clarity/functions/xor.mdx?collection=docs&hash=1744048693706" +import * as docs_244 from "../content/docs/stacks/clarity/functions/var-set.mdx?collection=docs&hash=1744048693706" +import * as docs_243 from "../content/docs/stacks/clarity/functions/var-get.mdx?collection=docs&hash=1744048693706" +import * as docs_242 from "../content/docs/stacks/clarity/functions/use-trait.mdx?collection=docs&hash=1744048693706" +import * as docs_241 from "../content/docs/stacks/clarity/functions/unwrap.mdx?collection=docs&hash=1744048693706" +import * as docs_240 from "../content/docs/stacks/clarity/functions/unwrap-panic.mdx?collection=docs&hash=1744048693706" +import * as docs_239 from "../content/docs/stacks/clarity/functions/unwrap-err.mdx?collection=docs&hash=1744048693706" +import * as docs_238 from "../content/docs/stacks/clarity/functions/unwrap-err-panic.mdx?collection=docs&hash=1744048693706" +import * as docs_237 from "../content/docs/stacks/clarity/functions/tuple.mdx?collection=docs&hash=1744048693706" +import * as docs_236 from "../content/docs/stacks/clarity/functions/try.mdx?collection=docs&hash=1744048693706" +import * as docs_235 from "../content/docs/stacks/clarity/functions/to-uint.mdx?collection=docs&hash=1744048693706" +import * as docs_234 from "../content/docs/stacks/clarity/functions/to-int.mdx?collection=docs&hash=1744048693706" +import * as docs_233 from "../content/docs/stacks/clarity/functions/to-consensus-buff.mdx?collection=docs&hash=1744048693706" +import * as docs_232 from "../content/docs/stacks/clarity/functions/subtract.mdx?collection=docs&hash=1744048693706" +import * as docs_231 from "../content/docs/stacks/clarity/functions/stx-transfer.mdx?collection=docs&hash=1744048693706" +import * as docs_230 from "../content/docs/stacks/clarity/functions/stx-transfer-memo.mdx?collection=docs&hash=1744048693706" +import * as docs_229 from "../content/docs/stacks/clarity/functions/stx-get-balance.mdx?collection=docs&hash=1744048693706" +import * as docs_228 from "../content/docs/stacks/clarity/functions/stx-burn.mdx?collection=docs&hash=1744048693706" +import * as docs_227 from "../content/docs/stacks/clarity/functions/stx-account.mdx?collection=docs&hash=1744048693706" +import * as docs_226 from "../content/docs/stacks/clarity/functions/string-to-uint.mdx?collection=docs&hash=1744048693706" +import * as docs_225 from "../content/docs/stacks/clarity/functions/string-to-int.mdx?collection=docs&hash=1744048693706" +import * as docs_224 from "../content/docs/stacks/clarity/functions/sqrti.mdx?collection=docs&hash=1744048693706" +import * as docs_223 from "../content/docs/stacks/clarity/functions/some.mdx?collection=docs&hash=1744048693706" +import * as docs_222 from "../content/docs/stacks/clarity/functions/slice.mdx?collection=docs&hash=1744048693706" +import * as docs_221 from "../content/docs/stacks/clarity/functions/sha512.mdx?collection=docs&hash=1744048693706" +import * as docs_220 from "../content/docs/stacks/clarity/functions/sha512-256.mdx?collection=docs&hash=1744048693706" +import * as docs_219 from "../content/docs/stacks/clarity/functions/sha256.mdx?collection=docs&hash=1744048693706" +import * as docs_218 from "../content/docs/stacks/clarity/functions/secp256k1-verify.mdx?collection=docs&hash=1744048693706" +import * as docs_217 from "../content/docs/stacks/clarity/functions/secp256k1-recover.mdx?collection=docs&hash=1744048693706" +import * as docs_216 from "../content/docs/stacks/clarity/functions/replace-at.mdx?collection=docs&hash=1744048693706" +import * as docs_215 from "../content/docs/stacks/clarity/functions/print.mdx?collection=docs&hash=1744048693706" +import * as docs_214 from "../content/docs/stacks/clarity/functions/principal-of.mdx?collection=docs&hash=1744048693706" +import * as docs_213 from "../content/docs/stacks/clarity/functions/principal-destruct.mdx?collection=docs&hash=1744048693706" +import * as docs_212 from "../content/docs/stacks/clarity/functions/principal-construct.mdx?collection=docs&hash=1744048693706" +import * as docs_211 from "../content/docs/stacks/clarity/functions/pow.mdx?collection=docs&hash=1744048693706" +import * as docs_210 from "../content/docs/stacks/clarity/functions/or.mdx?collection=docs&hash=1744048693706" +import * as docs_209 from "../content/docs/stacks/clarity/functions/ok.mdx?collection=docs&hash=1744048693706" +import * as docs_208 from "../content/docs/stacks/clarity/functions/not.mdx?collection=docs&hash=1744048693706" +import * as docs_207 from "../content/docs/stacks/clarity/functions/nft-transfer.mdx?collection=docs&hash=1744048693706" +import * as docs_206 from "../content/docs/stacks/clarity/functions/nft-mint.mdx?collection=docs&hash=1744048693706" +import * as docs_205 from "../content/docs/stacks/clarity/functions/nft-get-owner.mdx?collection=docs&hash=1744048693706" +import * as docs_204 from "../content/docs/stacks/clarity/functions/nft-burn.mdx?collection=docs&hash=1744048693706" +import * as docs_203 from "../content/docs/stacks/clarity/functions/multiply.mdx?collection=docs&hash=1744048693706" +import * as docs_202 from "../content/docs/stacks/clarity/functions/mod.mdx?collection=docs&hash=1744048693706" +import * as docs_201 from "../content/docs/stacks/clarity/functions/merge.mdx?collection=docs&hash=1744048693706" +import * as docs_200 from "../content/docs/stacks/clarity/functions/match.mdx?collection=docs&hash=1744048693706" +import * as docs_199 from "../content/docs/stacks/clarity/functions/map.mdx?collection=docs&hash=1744048693706" +import * as docs_198 from "../content/docs/stacks/clarity/functions/map-set.mdx?collection=docs&hash=1744048693706" +import * as docs_197 from "../content/docs/stacks/clarity/functions/map-insert.mdx?collection=docs&hash=1744048693706" +import * as docs_196 from "../content/docs/stacks/clarity/functions/map-get.mdx?collection=docs&hash=1744048693706" +import * as docs_195 from "../content/docs/stacks/clarity/functions/map-delete.mdx?collection=docs&hash=1744048693706" +import * as docs_194 from "../content/docs/stacks/clarity/functions/log2.mdx?collection=docs&hash=1744048693706" +import * as docs_193 from "../content/docs/stacks/clarity/functions/list.mdx?collection=docs&hash=1744048693706" +import * as docs_192 from "../content/docs/stacks/clarity/functions/let.mdx?collection=docs&hash=1744048693706" +import * as docs_191 from "../content/docs/stacks/clarity/functions/less-than.mdx?collection=docs&hash=1744048693706" +import * as docs_190 from "../content/docs/stacks/clarity/functions/less-than-or-equal.mdx?collection=docs&hash=1744048693706" +import * as docs_189 from "../content/docs/stacks/clarity/functions/len.mdx?collection=docs&hash=1744048693706" +import * as docs_188 from "../content/docs/stacks/clarity/functions/keccak256.mdx?collection=docs&hash=1744048693706" +import * as docs_187 from "../content/docs/stacks/clarity/functions/is-standard.mdx?collection=docs&hash=1744048693706" +import * as docs_186 from "../content/docs/stacks/clarity/functions/is-some.mdx?collection=docs&hash=1744048693706" +import * as docs_185 from "../content/docs/stacks/clarity/functions/is-ok.mdx?collection=docs&hash=1744048693706" +import * as docs_184 from "../content/docs/stacks/clarity/functions/is-none.mdx?collection=docs&hash=1744048693706" +import * as docs_183 from "../content/docs/stacks/clarity/functions/is-err.mdx?collection=docs&hash=1744048693706" +import * as docs_182 from "../content/docs/stacks/clarity/functions/is-eq.mdx?collection=docs&hash=1744048693706" +import * as docs_181 from "../content/docs/stacks/clarity/functions/int-to-utf8.mdx?collection=docs&hash=1744048693706" +import * as docs_180 from "../content/docs/stacks/clarity/functions/int-to-ascii.mdx?collection=docs&hash=1744048693706" +import * as docs_179 from "../content/docs/stacks/clarity/functions/index-of.mdx?collection=docs&hash=1744048693706" +import * as docs_178 from "../content/docs/stacks/clarity/functions/impl-trait.mdx?collection=docs&hash=1744048693706" +import * as docs_177 from "../content/docs/stacks/clarity/functions/if.mdx?collection=docs&hash=1744048693706" +import * as docs_176 from "../content/docs/stacks/clarity/functions/hash160.mdx?collection=docs&hash=1744048693706" +import * as docs_175 from "../content/docs/stacks/clarity/functions/greater-than.mdx?collection=docs&hash=1744048693706" +import * as docs_174 from "../content/docs/stacks/clarity/functions/greater-than-or-equal.mdx?collection=docs&hash=1744048693706" +import * as docs_173 from "../content/docs/stacks/clarity/functions/get.mdx?collection=docs&hash=1744048693706" +import * as docs_172 from "../content/docs/stacks/clarity/functions/get-tenure-info.mdx?collection=docs&hash=1744048693706" +import * as docs_171 from "../content/docs/stacks/clarity/functions/get-stacks-block-info.mdx?collection=docs&hash=1744048693706" +import * as docs_170 from "../content/docs/stacks/clarity/functions/get-burn-block-info.mdx?collection=docs&hash=1744048693706" +import * as docs_169 from "../content/docs/stacks/clarity/functions/get-block-info.mdx?collection=docs&hash=1744048693706" +import * as docs_168 from "../content/docs/stacks/clarity/functions/ft-transfer.mdx?collection=docs&hash=1744048693706" +import * as docs_167 from "../content/docs/stacks/clarity/functions/ft-mint.mdx?collection=docs&hash=1744048693706" +import * as docs_166 from "../content/docs/stacks/clarity/functions/ft-get-supply.mdx?collection=docs&hash=1744048693706" +import * as docs_165 from "../content/docs/stacks/clarity/functions/ft-get-balance.mdx?collection=docs&hash=1744048693706" +import * as docs_164 from "../content/docs/stacks/clarity/functions/ft-burn.mdx?collection=docs&hash=1744048693706" +import * as docs_163 from "../content/docs/stacks/clarity/functions/from-consensus-buff.mdx?collection=docs&hash=1744048693706" +import * as docs_162 from "../content/docs/stacks/clarity/functions/fold.mdx?collection=docs&hash=1744048693706" +import * as docs_161 from "../content/docs/stacks/clarity/functions/filter.mdx?collection=docs&hash=1744048693706" +import * as docs_160 from "../content/docs/stacks/clarity/functions/err.mdx?collection=docs&hash=1744048693706" +import * as docs_159 from "../content/docs/stacks/clarity/functions/element-at.mdx?collection=docs&hash=1744048693706" +import * as docs_158 from "../content/docs/stacks/clarity/functions/divide.mdx?collection=docs&hash=1744048693706" +import * as docs_157 from "../content/docs/stacks/clarity/functions/define-trait.mdx?collection=docs&hash=1744048693706" +import * as docs_156 from "../content/docs/stacks/clarity/functions/define-read-only.mdx?collection=docs&hash=1744048693706" +import * as docs_155 from "../content/docs/stacks/clarity/functions/define-public.mdx?collection=docs&hash=1744048693706" +import * as docs_154 from "../content/docs/stacks/clarity/functions/define-private.mdx?collection=docs&hash=1744048693706" +import * as docs_153 from "../content/docs/stacks/clarity/functions/define-non-fungible-token.mdx?collection=docs&hash=1744048693706" +import * as docs_152 from "../content/docs/stacks/clarity/functions/define-map.mdx?collection=docs&hash=1744048693706" +import * as docs_151 from "../content/docs/stacks/clarity/functions/define-fungible-token.mdx?collection=docs&hash=1744048693706" +import * as docs_150 from "../content/docs/stacks/clarity/functions/define-data-var.mdx?collection=docs&hash=1744048693706" +import * as docs_149 from "../content/docs/stacks/clarity/functions/define-constant.mdx?collection=docs&hash=1744048693706" +import * as docs_148 from "../content/docs/stacks/clarity/functions/default-to.mdx?collection=docs&hash=1744048693706" +import * as docs_147 from "../content/docs/stacks/clarity/functions/contract-of.mdx?collection=docs&hash=1744048693706" +import * as docs_146 from "../content/docs/stacks/clarity/functions/contract-call.mdx?collection=docs&hash=1744048693706" +import * as docs_145 from "../content/docs/stacks/clarity/functions/concat.mdx?collection=docs&hash=1744048693706" +import * as docs_144 from "../content/docs/stacks/clarity/functions/buff-to-uint-le.mdx?collection=docs&hash=1744048693706" +import * as docs_143 from "../content/docs/stacks/clarity/functions/buff-to-uint-be.mdx?collection=docs&hash=1744048693706" +import * as docs_142 from "../content/docs/stacks/clarity/functions/buff-to-int-le.mdx?collection=docs&hash=1744048693706" +import * as docs_141 from "../content/docs/stacks/clarity/functions/buff-to-int-be.mdx?collection=docs&hash=1744048693706" +import * as docs_140 from "../content/docs/stacks/clarity/functions/bit-xor.mdx?collection=docs&hash=1744048693706" +import * as docs_139 from "../content/docs/stacks/clarity/functions/bit-shift-right.mdx?collection=docs&hash=1744048693706" +import * as docs_138 from "../content/docs/stacks/clarity/functions/bit-shift-left.mdx?collection=docs&hash=1744048693706" +import * as docs_137 from "../content/docs/stacks/clarity/functions/bit-or.mdx?collection=docs&hash=1744048693706" +import * as docs_136 from "../content/docs/stacks/clarity/functions/bit-not.mdx?collection=docs&hash=1744048693706" +import * as docs_135 from "../content/docs/stacks/clarity/functions/bit-and.mdx?collection=docs&hash=1744048693706" +import * as docs_134 from "../content/docs/stacks/clarity/functions/begin.mdx?collection=docs&hash=1744048693706" +import * as docs_133 from "../content/docs/stacks/clarity/functions/at-block.mdx?collection=docs&hash=1744048693706" +import * as docs_132 from "../content/docs/stacks/clarity/functions/asserts.mdx?collection=docs&hash=1744048693706" +import * as docs_131 from "../content/docs/stacks/clarity/functions/as-max-len.mdx?collection=docs&hash=1744048693706" +import * as docs_130 from "../content/docs/stacks/clarity/functions/as-contract.mdx?collection=docs&hash=1744048693706" +import * as docs_129 from "../content/docs/stacks/clarity/functions/append.mdx?collection=docs&hash=1744048693706" +import * as docs_128 from "../content/docs/stacks/clarity/functions/and.mdx?collection=docs&hash=1744048693706" +import * as docs_127 from "../content/docs/stacks/clarity/functions/add.mdx?collection=docs&hash=1744048693706" +import * as docs_126 from "../content/docs/stacks/connect/packages/connect.mdx?collection=docs&hash=1744048693706" +import * as docs_125 from "../content/docs/stacks/connect/examples/sign-messages.mdx?collection=docs&hash=1744048693706" +import * as docs_124 from "../content/docs/stacks/connect/examples/migration.mdx?collection=docs&hash=1744048693706" +import * as docs_123 from "../content/docs/stacks/connect/examples/broadcast-transactions.mdx?collection=docs&hash=1744048693706" +import * as docs_122 from "../content/docs/stacks/connect/examples/authenticate-users.mdx?collection=docs&hash=1744048693706" +import * as docs_121 from "../content/docs/stacks/clarinet-js-sdk/references/simnet.mdx?collection=docs&hash=1744048693706" +import * as docs_120 from "../content/docs/stacks/clarinet-js-sdk/references/properties.mdx?collection=docs&hash=1744048693706" +import * as docs_119 from "../content/docs/stacks/clarinet-js-sdk/references/methods.mdx?collection=docs&hash=1744048693706" +import * as docs_118 from "../content/docs/stacks/clarinet-js-sdk/references/custom-matchers.mdx?collection=docs&hash=1744048693706" +import * as docs_117 from "../content/docs/stacks/clarinet/examples/working-with-sbtc.mdx?collection=docs&hash=1744048693706" +import * as docs_116 from "../content/docs/stacks/clarinet/examples/validate-a-contract.mdx?collection=docs&hash=1744048693706" +import * as docs_115 from "../content/docs/stacks/clarinet/examples/start-a-development-console.mdx?collection=docs&hash=1744048693706" +import * as docs_114 from "../content/docs/stacks/clarinet/examples/run-a-local-devnet.mdx?collection=docs&hash=1744048693706" +import * as docs_113 from "../content/docs/stacks/clarinet/examples/estimate-costs.mdx?collection=docs&hash=1744048693706" +import * as docs_112 from "../content/docs/stacks/clarinet/examples/deploy-a-contract.mdx?collection=docs&hash=1744048693706" +import * as docs_111 from "../content/docs/stacks/clarinet/examples/debug-a-contract.mdx?collection=docs&hash=1744048693706" +import * as docs_110 from "../content/docs/stacks/clarinet/examples/create-deployment-plans.mdx?collection=docs&hash=1744048693706" +import * as docs_109 from "../content/docs/stacks/clarinet/examples/create-a-new-project.mdx?collection=docs&hash=1744048693706" +import * as docs_108 from "../content/docs/stacks/clarinet/examples/add-a-contract.mdx?collection=docs&hash=1744048693706" +import * as docs_107 from "../content/docs/stacks/chainhook/examples/register-chainhooks-on-devnet.mdx?collection=docs&hash=1744048693706" +import * as docs_106 from "../content/docs/stacks/chainhook/examples/observing-contract-calls.mdx?collection=docs&hash=1744048693706" +import * as docs_105 from "../content/docs/stacks/chainhook/examples/chainhook-as-a-service.mdx?collection=docs&hash=1744048693706" +import * as docs_104 from "../content/docs/stacks/chainhook/examples/chainhook-as-a-service-with-stacks-node.mdx?collection=docs&hash=1744048693706" +import * as docs_103 from "../content/docs/stacks/archive/guides/verify-archive-data.mdx?collection=docs&hash=1744048693706" +import * as docs_102 from "../content/docs/stacks/archive/guides/token-metadata-api.mdx?collection=docs&hash=1744048693706" +import * as docs_101 from "../content/docs/stacks/archive/guides/stacks-blockchain.mdx?collection=docs&hash=1744048693706" +import * as docs_100 from "../content/docs/stacks/archive/guides/stacks-api.mdx?collection=docs&hash=1744048693706" +import * as docs_99 from "../content/docs/bitcoin/runes/runehook/quickstart.mdx?collection=docs&hash=1744048693706" +import * as docs_98 from "../content/docs/bitcoin/runes/runehook/installation.mdx?collection=docs&hash=1744048693706" +import * as docs_97 from "../content/docs/bitcoin/runes/runehook/index.mdx?collection=docs&hash=1744048693706" +import * as docs_96 from "../content/docs/bitcoin/runes/explorer/index.mdx?collection=docs&hash=1744048693706" +import * as docs_95 from "../content/docs/bitcoin/runes/api/usage.mdx?collection=docs&hash=1744048693706" +import * as docs_94 from "../content/docs/bitcoin/runes/api/index.mdx?collection=docs&hash=1744048693706" +import * as docs_93 from "../content/docs/bitcoin/ordinals/api/usage.mdx?collection=docs&hash=1744048693706" +import * as docs_92 from "../content/docs/bitcoin/ordinals/api/index.mdx?collection=docs&hash=1744048693706" +import * as docs_91 from "../content/docs/bitcoin/ordinals/explorer/index.mdx?collection=docs&hash=1744048693706" +import * as docs_90 from "../content/docs/bitcoin/indexer/guides/run-indexer.mdx?collection=docs&hash=1744048693706" +import * as docs_89 from "../content/docs/stacks/token-metadata-api/usage.mdx?collection=docs&hash=1744048693706" +import * as docs_88 from "../content/docs/stacks/token-metadata-api/index.mdx?collection=docs&hash=1744048693706" +import * as docs_87 from "../content/docs/stacks/token-metadata-api/architecture.mdx?collection=docs&hash=1744048693706" +import * as docs_86 from "../content/docs/stacks/stacks.js/roadmap.mdx?collection=docs&hash=1744048693706" +import * as docs_85 from "../content/docs/stacks/stacks.js/quickstart.mdx?collection=docs&hash=1744048693706" +import * as docs_84 from "../content/docs/stacks/stacks.js/installation.mdx?collection=docs&hash=1744048693706" +import * as docs_83 from "../content/docs/stacks/stacks.js/index.mdx?collection=docs&hash=1744048693706" +import * as docs_82 from "../content/docs/stacks/rpc-api/index.mdx?collection=docs&hash=1744048693706" +import * as docs_81 from "../content/docs/stacks/signer-metrics-api/index.mdx?collection=docs&hash=1744048693706" +import * as docs_80 from "../content/docs/stacks/reference/index.mdx?collection=docs&hash=1744048693706" +import * as docs_79 from "../content/docs/stacks/quickstarts/wallet-integration.mdx?collection=docs&hash=1744048693706" +import * as docs_78 from "../content/docs/stacks/quickstarts/token-transfers.mdx?collection=docs&hash=1744048693706" +import * as docs_77 from "../content/docs/stacks/quickstarts/nft-minting.mdx?collection=docs&hash=1744048693706" +import * as docs_76 from "../content/docs/stacks/quickstarts/index.mdx?collection=docs&hash=1744048693706" +import * as docs_75 from "../content/docs/stacks/quickstarts/event-streaming.mdx?collection=docs&hash=1744048693706" +import * as docs_74 from "../content/docs/stacks/quickstarts/contract-templates.mdx?collection=docs&hash=1744048693706" +import * as docs_73 from "../content/docs/stacks/quickstarts/app-templates.mdx?collection=docs&hash=1744048693706" +import * as docs_72 from "../content/docs/stacks/platform-api/index.mdx?collection=docs&hash=1744048693706" +import * as docs_71 from "../content/docs/stacks/platform/quickstart.mdx?collection=docs&hash=1744048693706" +import * as docs_70 from "../content/docs/stacks/platform/index.mdx?collection=docs&hash=1744048693706" +import * as docs_69 from "../content/docs/stacks/nakamoto/index.mdx?collection=docs&hash=1744048693706" +import * as docs_68 from "../content/docs/stacks/hacks/recipes.mdx?collection=docs&hash=1744048693706" +import * as docs_67 from "../content/docs/stacks/hacks/index.mdx?collection=docs&hash=1744048693706" +import * as docs_66 from "../content/docs/stacks/explorer/index.mdx?collection=docs&hash=1744048693706" +import * as docs_65 from "../content/docs/stacks/connect/support.mdx?collection=docs&hash=1744048693706" +import * as docs_64 from "../content/docs/stacks/connect/quickstart.mdx?collection=docs&hash=1744048693706" +import * as docs_63 from "../content/docs/stacks/connect/index.mdx?collection=docs&hash=1744048693706" +import * as docs_62 from "../content/docs/stacks/clarity/time-and-blocks.mdx?collection=docs&hash=1744048693706" +import * as docs_61 from "../content/docs/stacks/clarity/optimizations.mdx?collection=docs&hash=1744048693706" +import * as docs_60 from "../content/docs/stacks/clarity/index.mdx?collection=docs&hash=1744048693706" +import * as docs_59 from "../content/docs/stacks/clarity/handling-optionals-and-errors.mdx?collection=docs&hash=1744048693706" +import * as docs_58 from "../content/docs/stacks/clarity/cryptographic-functions.mdx?collection=docs&hash=1744048693706" +import * as docs_57 from "../content/docs/stacks/clarity/bit-manipulation.mdx?collection=docs&hash=1744048693706" +import * as docs_56 from "../content/docs/stacks/clarity/basic-arithmetic.mdx?collection=docs&hash=1744048693706" +import * as docs_55 from "../content/docs/stacks/clarity/access-control.mdx?collection=docs&hash=1744048693706" +import * as docs_54 from "../content/docs/stacks/clarinet-js-sdk/quickstart.mdx?collection=docs&hash=1744048693706" +import * as docs_53 from "../content/docs/stacks/clarinet-js-sdk/installation.mdx?collection=docs&hash=1744048693706" +import * as docs_52 from "../content/docs/stacks/clarinet-js-sdk/index.mdx?collection=docs&hash=1744048693706" +import * as docs_51 from "../content/docs/stacks/clarinet/quickstart.mdx?collection=docs&hash=1744048693706" +import * as docs_50 from "../content/docs/stacks/clarinet/index.mdx?collection=docs&hash=1744048693706" +import * as docs_49 from "../content/docs/stacks/clarinet/concepts.mdx?collection=docs&hash=1744048693706" +import * as docs_48 from "../content/docs/stacks/chainhook/quickstart.mdx?collection=docs&hash=1744048693706" +import * as docs_47 from "../content/docs/stacks/chainhook/predicate-design.mdx?collection=docs&hash=1744048693706" +import * as docs_46 from "../content/docs/stacks/chainhook/installation.mdx?collection=docs&hash=1744048693706" +import * as docs_45 from "../content/docs/stacks/chainhook/index.mdx?collection=docs&hash=1744048693706" +import * as docs_44 from "../content/docs/stacks/archive/index.mdx?collection=docs&hash=1744048693706" +import * as docs_43 from "../content/docs/stacks/api/requesting-proofs.mdx?collection=docs&hash=1744048693706" +import * as docs_42 from "../content/docs/stacks/api/pagination.mdx?collection=docs&hash=1744048693706" +import * as docs_41 from "../content/docs/stacks/api/nonce-handling.mdx?collection=docs&hash=1744048693706" +import * as docs_40 from "../content/docs/stacks/api/index.mdx?collection=docs&hash=1744048693706" +import * as docs_39 from "../content/docs/stacks/api/getting-started.mdx?collection=docs&hash=1744048693706" +import * as docs_38 from "../content/docs/stacks/api/authentication.mdx?collection=docs&hash=1744048693706" +import * as docs_37 from "../content/docs/stacks/api/architecture.mdx?collection=docs&hash=1744048693706" +import * as docs_36 from "../content/docs/bitcoin/quickstarts/index.mdx?collection=docs&hash=1744048693706" +import * as docs_35 from "../content/docs/bitcoin/indexer/quickstart.mdx?collection=docs&hash=1744048693706" +import * as docs_34 from "../content/docs/bitcoin/indexer/index.mdx?collection=docs&hash=1744048693706" +import * as docs_33 from "../content/docs/bitcoin/api/index.mdx?collection=docs&hash=1744048693706" +import * as docs_32 from "../content/docs/guides/using-clarity-values.mdx?collection=docs&hash=1744048693706" +import * as docs_31 from "../content/docs/guides/sync-a-stacks-node.mdx?collection=docs&hash=1744048693706" +import * as docs_30 from "../content/docs/guides/sync-a-bitcoin-node.mdx?collection=docs&hash=1744048693706" +import * as docs_29 from "../content/docs/guides/rate-limiting.mdx?collection=docs&hash=1744048693706" +import * as docs_28 from "../content/docs/guides/no-loss-lottery.mdx?collection=docs&hash=1744048693706" +import * as docs_27 from "../content/docs/guides/installing-docker.mdx?collection=docs&hash=1744048693706" +import * as docs_26 from "../content/docs/guides/index.mdx?collection=docs&hash=1744048693706" +import * as docs_25 from "../content/docs/guides/docskit.mdx?collection=docs&hash=1744048693706" +import * as docs_24 from "../content/docs/guides/contributors-guide.mdx?collection=docs&hash=1744048693706" +import * as docs_23 from "../content/docs/guides/build-an-nft-marketplace.mdx?collection=docs&hash=1744048693706" +import * as docs_22 from "../content/docs/guides/build-a-decentralized-kickstarter.mdx?collection=docs&hash=1744048693706" +import * as docs_21 from "../content/docs/guides/api-keys.mdx?collection=docs&hash=1744048693706" +import * as docs_20 from "../content/docs/stacks/web-app-development.mdx?collection=docs&hash=1744048693706" +import * as docs_19 from "../content/docs/stacks/unit-testing.mdx?collection=docs&hash=1744048693706" +import * as docs_18 from "../content/docs/stacks/token-development.mdx?collection=docs&hash=1744048693706" +import * as docs_17 from "../content/docs/stacks/testing-environments.mdx?collection=docs&hash=1744048693706" +import * as docs_16 from "../content/docs/stacks/testing-best-practices.mdx?collection=docs&hash=1744048693706" +import * as docs_15 from "../content/docs/stacks/smart-contract-development.mdx?collection=docs&hash=1744048693706" +import * as docs_14 from "../content/docs/stacks/setup.mdx?collection=docs&hash=1744048693706" +import * as docs_13 from "../content/docs/stacks/reference.mdx?collection=docs&hash=1744048693706" +import * as docs_12 from "../content/docs/stacks/rate-limiting.mdx?collection=docs&hash=1744048693706" +import * as docs_11 from "../content/docs/stacks/migration-guide.mdx?collection=docs&hash=1744048693706" +import * as docs_10 from "../content/docs/stacks/integration-testing.mdx?collection=docs&hash=1744048693706" +import * as docs_9 from "../content/docs/stacks/index.mdx?collection=docs&hash=1744048693706" +import * as docs_8 from "../content/docs/stacks/get-started.mdx?collection=docs&hash=1744048693706" +import * as docs_7 from "../content/docs/stacks/contributors-guide.mdx?collection=docs&hash=1744048693706" +import * as docs_6 from "../content/docs/stacks/blockchain-development.mdx?collection=docs&hash=1744048693706" +import * as docs_5 from "../content/docs/stacks/api-keys.mdx?collection=docs&hash=1744048693706" +import * as docs_4 from "../content/docs/bitcoin/rate-limiting.mdx?collection=docs&hash=1744048693706" +import * as docs_3 from "../content/docs/bitcoin/index.mdx?collection=docs&hash=1744048693706" +import * as docs_2 from "../content/docs/bitcoin/get-started.mdx?collection=docs&hash=1744048693706" +import * as docs_1 from "../content/docs/bitcoin/contributors-guide.mdx?collection=docs&hash=1744048693706" +import * as docs_0 from "../content/docs/bitcoin/api-keys.mdx?collection=docs&hash=1744048693706" +import { _runtime } from "fumadocs-mdx" +import * as _source from "../source.config" +export const docs = _runtime.docs<typeof _source.docs>([{ info: {"path":"bitcoin/api-keys.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api-keys.mdx"}, data: docs_0 }, { info: {"path":"bitcoin/contributors-guide.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/contributors-guide.mdx"}, data: docs_1 }, { info: {"path":"bitcoin/get-started.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/get-started.mdx"}, data: docs_2 }, { info: {"path":"bitcoin/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/index.mdx"}, data: docs_3 }, { info: {"path":"bitcoin/rate-limiting.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/rate-limiting.mdx"}, data: docs_4 }, { info: {"path":"stacks/api-keys.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api-keys.mdx"}, data: docs_5 }, { info: {"path":"stacks/blockchain-development.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/blockchain-development.mdx"}, data: docs_6 }, { info: {"path":"stacks/contributors-guide.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/contributors-guide.mdx"}, data: docs_7 }, { info: {"path":"stacks/get-started.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/get-started.mdx"}, data: docs_8 }, { info: {"path":"stacks/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/index.mdx"}, data: docs_9 }, { info: {"path":"stacks/integration-testing.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/integration-testing.mdx"}, data: docs_10 }, { info: {"path":"stacks/migration-guide.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/migration-guide.mdx"}, data: docs_11 }, { info: {"path":"stacks/rate-limiting.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rate-limiting.mdx"}, data: docs_12 }, { info: {"path":"stacks/reference.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference.mdx"}, data: docs_13 }, { info: {"path":"stacks/setup.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/setup.mdx"}, data: docs_14 }, { info: {"path":"stacks/smart-contract-development.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/smart-contract-development.mdx"}, data: docs_15 }, { info: {"path":"stacks/testing-best-practices.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/testing-best-practices.mdx"}, data: docs_16 }, { info: {"path":"stacks/testing-environments.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/testing-environments.mdx"}, data: docs_17 }, { info: {"path":"stacks/token-development.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-development.mdx"}, data: docs_18 }, { info: {"path":"stacks/unit-testing.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/unit-testing.mdx"}, data: docs_19 }, { info: {"path":"stacks/web-app-development.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/web-app-development.mdx"}, data: docs_20 }, { info: {"path":"guides/api-keys.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/api-keys.mdx"}, data: docs_21 }, { info: {"path":"guides/build-a-decentralized-kickstarter.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/build-a-decentralized-kickstarter.mdx"}, data: docs_22 }, { info: {"path":"guides/build-an-nft-marketplace.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/build-an-nft-marketplace.mdx"}, data: docs_23 }, { info: {"path":"guides/contributors-guide.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/contributors-guide.mdx"}, data: docs_24 }, { info: {"path":"guides/docskit.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/docskit.mdx"}, data: docs_25 }, { info: {"path":"guides/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/index.mdx"}, data: docs_26 }, { info: {"path":"guides/installing-docker.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/installing-docker.mdx"}, data: docs_27 }, { info: {"path":"guides/no-loss-lottery.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/no-loss-lottery.mdx"}, data: docs_28 }, { info: {"path":"guides/rate-limiting.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/rate-limiting.mdx"}, data: docs_29 }, { info: {"path":"guides/sync-a-bitcoin-node.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/sync-a-bitcoin-node.mdx"}, data: docs_30 }, { info: {"path":"guides/sync-a-stacks-node.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/sync-a-stacks-node.mdx"}, data: docs_31 }, { info: {"path":"guides/using-clarity-values.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/using-clarity-values.mdx"}, data: docs_32 }, { info: {"path":"bitcoin/api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/index.mdx"}, data: docs_33 }, { info: {"path":"bitcoin/indexer/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/indexer/index.mdx"}, data: docs_34 }, { info: {"path":"bitcoin/indexer/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/indexer/quickstart.mdx"}, data: docs_35 }, { info: {"path":"bitcoin/quickstarts/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/quickstarts/index.mdx"}, data: docs_36 }, { info: {"path":"stacks/api/architecture.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/architecture.mdx"}, data: docs_37 }, { info: {"path":"stacks/api/authentication.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/authentication.mdx"}, data: docs_38 }, { info: {"path":"stacks/api/getting-started.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/getting-started.mdx"}, data: docs_39 }, { info: {"path":"stacks/api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/index.mdx"}, data: docs_40 }, { info: {"path":"stacks/api/nonce-handling.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/nonce-handling.mdx"}, data: docs_41 }, { info: {"path":"stacks/api/pagination.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/pagination.mdx"}, data: docs_42 }, { info: {"path":"stacks/api/requesting-proofs.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/requesting-proofs.mdx"}, data: docs_43 }, { info: {"path":"stacks/archive/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/archive/index.mdx"}, data: docs_44 }, { info: {"path":"stacks/chainhook/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/index.mdx"}, data: docs_45 }, { info: {"path":"stacks/chainhook/installation.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/installation.mdx"}, data: docs_46 }, { info: {"path":"stacks/chainhook/predicate-design.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/predicate-design.mdx"}, data: docs_47 }, { info: {"path":"stacks/chainhook/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/quickstart.mdx"}, data: docs_48 }, { info: {"path":"stacks/clarinet/concepts.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/concepts.mdx"}, data: docs_49 }, { info: {"path":"stacks/clarinet/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/index.mdx"}, data: docs_50 }, { info: {"path":"stacks/clarinet/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/quickstart.mdx"}, data: docs_51 }, { info: {"path":"stacks/clarinet-js-sdk/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/index.mdx"}, data: docs_52 }, { info: {"path":"stacks/clarinet-js-sdk/installation.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/installation.mdx"}, data: docs_53 }, { info: {"path":"stacks/clarinet-js-sdk/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/quickstart.mdx"}, data: docs_54 }, { info: {"path":"stacks/clarity/access-control.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/access-control.mdx"}, data: docs_55 }, { info: {"path":"stacks/clarity/basic-arithmetic.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/basic-arithmetic.mdx"}, data: docs_56 }, { info: {"path":"stacks/clarity/bit-manipulation.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/bit-manipulation.mdx"}, data: docs_57 }, { info: {"path":"stacks/clarity/cryptographic-functions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/cryptographic-functions.mdx"}, data: docs_58 }, { info: {"path":"stacks/clarity/handling-optionals-and-errors.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/handling-optionals-and-errors.mdx"}, data: docs_59 }, { info: {"path":"stacks/clarity/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/index.mdx"}, data: docs_60 }, { info: {"path":"stacks/clarity/optimizations.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/optimizations.mdx"}, data: docs_61 }, { info: {"path":"stacks/clarity/time-and-blocks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/time-and-blocks.mdx"}, data: docs_62 }, { info: {"path":"stacks/connect/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/index.mdx"}, data: docs_63 }, { info: {"path":"stacks/connect/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/quickstart.mdx"}, data: docs_64 }, { info: {"path":"stacks/connect/support.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/support.mdx"}, data: docs_65 }, { info: {"path":"stacks/explorer/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/explorer/index.mdx"}, data: docs_66 }, { info: {"path":"stacks/hacks/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/hacks/index.mdx"}, data: docs_67 }, { info: {"path":"stacks/hacks/recipes.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/hacks/recipes.mdx"}, data: docs_68 }, { info: {"path":"stacks/nakamoto/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/nakamoto/index.mdx"}, data: docs_69 }, { info: {"path":"stacks/platform/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/index.mdx"}, data: docs_70 }, { info: {"path":"stacks/platform/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/quickstart.mdx"}, data: docs_71 }, { info: {"path":"stacks/platform-api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/index.mdx"}, data: docs_72 }, { info: {"path":"stacks/quickstarts/app-templates.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/app-templates.mdx"}, data: docs_73 }, { info: {"path":"stacks/quickstarts/contract-templates.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/contract-templates.mdx"}, data: docs_74 }, { info: {"path":"stacks/quickstarts/event-streaming.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/event-streaming.mdx"}, data: docs_75 }, { info: {"path":"stacks/quickstarts/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/index.mdx"}, data: docs_76 }, { info: {"path":"stacks/quickstarts/nft-minting.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/nft-minting.mdx"}, data: docs_77 }, { info: {"path":"stacks/quickstarts/token-transfers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/token-transfers.mdx"}, data: docs_78 }, { info: {"path":"stacks/quickstarts/wallet-integration.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/wallet-integration.mdx"}, data: docs_79 }, { info: {"path":"stacks/reference/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/index.mdx"}, data: docs_80 }, { info: {"path":"stacks/signer-metrics-api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/index.mdx"}, data: docs_81 }, { info: {"path":"stacks/rpc-api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/index.mdx"}, data: docs_82 }, { info: {"path":"stacks/stacks.js/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/index.mdx"}, data: docs_83 }, { info: {"path":"stacks/stacks.js/installation.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/installation.mdx"}, data: docs_84 }, { info: {"path":"stacks/stacks.js/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/quickstart.mdx"}, data: docs_85 }, { info: {"path":"stacks/stacks.js/roadmap.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/roadmap.mdx"}, data: docs_86 }, { info: {"path":"stacks/token-metadata-api/architecture.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/architecture.mdx"}, data: docs_87 }, { info: {"path":"stacks/token-metadata-api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/index.mdx"}, data: docs_88 }, { info: {"path":"stacks/token-metadata-api/usage.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/usage.mdx"}, data: docs_89 }, { info: {"path":"bitcoin/indexer/guides/run-indexer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/indexer/guides/run-indexer.mdx"}, data: docs_90 }, { info: {"path":"bitcoin/ordinals/explorer/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/explorer/index.mdx"}, data: docs_91 }, { info: {"path":"bitcoin/ordinals/api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/index.mdx"}, data: docs_92 }, { info: {"path":"bitcoin/ordinals/api/usage.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/usage.mdx"}, data: docs_93 }, { info: {"path":"bitcoin/runes/api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/index.mdx"}, data: docs_94 }, { info: {"path":"bitcoin/runes/api/usage.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/usage.mdx"}, data: docs_95 }, { info: {"path":"bitcoin/runes/explorer/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/explorer/index.mdx"}, data: docs_96 }, { info: {"path":"bitcoin/runes/runehook/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/runehook/index.mdx"}, data: docs_97 }, { info: {"path":"bitcoin/runes/runehook/installation.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/runehook/installation.mdx"}, data: docs_98 }, { info: {"path":"bitcoin/runes/runehook/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/runehook/quickstart.mdx"}, data: docs_99 }, { info: {"path":"stacks/archive/guides/stacks-api.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/archive/guides/stacks-api.mdx"}, data: docs_100 }, { info: {"path":"stacks/archive/guides/stacks-blockchain.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/archive/guides/stacks-blockchain.mdx"}, data: docs_101 }, { info: {"path":"stacks/archive/guides/token-metadata-api.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/archive/guides/token-metadata-api.mdx"}, data: docs_102 }, { info: {"path":"stacks/archive/guides/verify-archive-data.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/archive/guides/verify-archive-data.mdx"}, data: docs_103 }, { info: {"path":"stacks/chainhook/examples/chainhook-as-a-service-with-stacks-node.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/examples/chainhook-as-a-service-with-stacks-node.mdx"}, data: docs_104 }, { info: {"path":"stacks/chainhook/examples/chainhook-as-a-service.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/examples/chainhook-as-a-service.mdx"}, data: docs_105 }, { info: {"path":"stacks/chainhook/examples/observing-contract-calls.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/examples/observing-contract-calls.mdx"}, data: docs_106 }, { info: {"path":"stacks/chainhook/examples/register-chainhooks-on-devnet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/examples/register-chainhooks-on-devnet.mdx"}, data: docs_107 }, { info: {"path":"stacks/clarinet/examples/add-a-contract.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/add-a-contract.mdx"}, data: docs_108 }, { info: {"path":"stacks/clarinet/examples/create-a-new-project.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/create-a-new-project.mdx"}, data: docs_109 }, { info: {"path":"stacks/clarinet/examples/create-deployment-plans.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/create-deployment-plans.mdx"}, data: docs_110 }, { info: {"path":"stacks/clarinet/examples/debug-a-contract.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/debug-a-contract.mdx"}, data: docs_111 }, { info: {"path":"stacks/clarinet/examples/deploy-a-contract.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/deploy-a-contract.mdx"}, data: docs_112 }, { info: {"path":"stacks/clarinet/examples/estimate-costs.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/estimate-costs.mdx"}, data: docs_113 }, { info: {"path":"stacks/clarinet/examples/run-a-local-devnet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/run-a-local-devnet.mdx"}, data: docs_114 }, { info: {"path":"stacks/clarinet/examples/start-a-development-console.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/start-a-development-console.mdx"}, data: docs_115 }, { info: {"path":"stacks/clarinet/examples/validate-a-contract.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/validate-a-contract.mdx"}, data: docs_116 }, { info: {"path":"stacks/clarinet/examples/working-with-sbtc.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/working-with-sbtc.mdx"}, data: docs_117 }, { info: {"path":"stacks/clarinet-js-sdk/references/custom-matchers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/references/custom-matchers.mdx"}, data: docs_118 }, { info: {"path":"stacks/clarinet-js-sdk/references/methods.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/references/methods.mdx"}, data: docs_119 }, { info: {"path":"stacks/clarinet-js-sdk/references/properties.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/references/properties.mdx"}, data: docs_120 }, { info: {"path":"stacks/clarinet-js-sdk/references/simnet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/references/simnet.mdx"}, data: docs_121 }, { info: {"path":"stacks/connect/examples/authenticate-users.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/examples/authenticate-users.mdx"}, data: docs_122 }, { info: {"path":"stacks/connect/examples/broadcast-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/examples/broadcast-transactions.mdx"}, data: docs_123 }, { info: {"path":"stacks/connect/examples/migration.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/examples/migration.mdx"}, data: docs_124 }, { info: {"path":"stacks/connect/examples/sign-messages.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/examples/sign-messages.mdx"}, data: docs_125 }, { info: {"path":"stacks/connect/packages/connect.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/packages/connect.mdx"}, data: docs_126 }, { info: {"path":"stacks/clarity/functions/add.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/add.mdx"}, data: docs_127 }, { info: {"path":"stacks/clarity/functions/and.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/and.mdx"}, data: docs_128 }, { info: {"path":"stacks/clarity/functions/append.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/append.mdx"}, data: docs_129 }, { info: {"path":"stacks/clarity/functions/as-contract.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/as-contract.mdx"}, data: docs_130 }, { info: {"path":"stacks/clarity/functions/as-max-len.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/as-max-len.mdx"}, data: docs_131 }, { info: {"path":"stacks/clarity/functions/asserts.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/asserts.mdx"}, data: docs_132 }, { info: {"path":"stacks/clarity/functions/at-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/at-block.mdx"}, data: docs_133 }, { info: {"path":"stacks/clarity/functions/begin.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/begin.mdx"}, data: docs_134 }, { info: {"path":"stacks/clarity/functions/bit-and.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/bit-and.mdx"}, data: docs_135 }, { info: {"path":"stacks/clarity/functions/bit-not.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/bit-not.mdx"}, data: docs_136 }, { info: {"path":"stacks/clarity/functions/bit-or.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/bit-or.mdx"}, data: docs_137 }, { info: {"path":"stacks/clarity/functions/bit-shift-left.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/bit-shift-left.mdx"}, data: docs_138 }, { info: {"path":"stacks/clarity/functions/bit-shift-right.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/bit-shift-right.mdx"}, data: docs_139 }, { info: {"path":"stacks/clarity/functions/bit-xor.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/bit-xor.mdx"}, data: docs_140 }, { info: {"path":"stacks/clarity/functions/buff-to-int-be.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/buff-to-int-be.mdx"}, data: docs_141 }, { info: {"path":"stacks/clarity/functions/buff-to-int-le.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/buff-to-int-le.mdx"}, data: docs_142 }, { info: {"path":"stacks/clarity/functions/buff-to-uint-be.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/buff-to-uint-be.mdx"}, data: docs_143 }, { info: {"path":"stacks/clarity/functions/buff-to-uint-le.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/buff-to-uint-le.mdx"}, data: docs_144 }, { info: {"path":"stacks/clarity/functions/concat.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/concat.mdx"}, data: docs_145 }, { info: {"path":"stacks/clarity/functions/contract-call.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/contract-call.mdx"}, data: docs_146 }, { info: {"path":"stacks/clarity/functions/contract-of.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/contract-of.mdx"}, data: docs_147 }, { info: {"path":"stacks/clarity/functions/default-to.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/default-to.mdx"}, data: docs_148 }, { info: {"path":"stacks/clarity/functions/define-constant.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-constant.mdx"}, data: docs_149 }, { info: {"path":"stacks/clarity/functions/define-data-var.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-data-var.mdx"}, data: docs_150 }, { info: {"path":"stacks/clarity/functions/define-fungible-token.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-fungible-token.mdx"}, data: docs_151 }, { info: {"path":"stacks/clarity/functions/define-map.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-map.mdx"}, data: docs_152 }, { info: {"path":"stacks/clarity/functions/define-non-fungible-token.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-non-fungible-token.mdx"}, data: docs_153 }, { info: {"path":"stacks/clarity/functions/define-private.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-private.mdx"}, data: docs_154 }, { info: {"path":"stacks/clarity/functions/define-public.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-public.mdx"}, data: docs_155 }, { info: {"path":"stacks/clarity/functions/define-read-only.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-read-only.mdx"}, data: docs_156 }, { info: {"path":"stacks/clarity/functions/define-trait.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-trait.mdx"}, data: docs_157 }, { info: {"path":"stacks/clarity/functions/divide.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/divide.mdx"}, data: docs_158 }, { info: {"path":"stacks/clarity/functions/element-at.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/element-at.mdx"}, data: docs_159 }, { info: {"path":"stacks/clarity/functions/err.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/err.mdx"}, data: docs_160 }, { info: {"path":"stacks/clarity/functions/filter.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/filter.mdx"}, data: docs_161 }, { info: {"path":"stacks/clarity/functions/fold.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/fold.mdx"}, data: docs_162 }, { info: {"path":"stacks/clarity/functions/from-consensus-buff.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/from-consensus-buff.mdx"}, data: docs_163 }, { info: {"path":"stacks/clarity/functions/ft-burn.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/ft-burn.mdx"}, data: docs_164 }, { info: {"path":"stacks/clarity/functions/ft-get-balance.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/ft-get-balance.mdx"}, data: docs_165 }, { info: {"path":"stacks/clarity/functions/ft-get-supply.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/ft-get-supply.mdx"}, data: docs_166 }, { info: {"path":"stacks/clarity/functions/ft-mint.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/ft-mint.mdx"}, data: docs_167 }, { info: {"path":"stacks/clarity/functions/ft-transfer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/ft-transfer.mdx"}, data: docs_168 }, { info: {"path":"stacks/clarity/functions/get-block-info.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/get-block-info.mdx"}, data: docs_169 }, { info: {"path":"stacks/clarity/functions/get-burn-block-info.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/get-burn-block-info.mdx"}, data: docs_170 }, { info: {"path":"stacks/clarity/functions/get-stacks-block-info.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/get-stacks-block-info.mdx"}, data: docs_171 }, { info: {"path":"stacks/clarity/functions/get-tenure-info.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/get-tenure-info.mdx"}, data: docs_172 }, { info: {"path":"stacks/clarity/functions/get.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/get.mdx"}, data: docs_173 }, { info: {"path":"stacks/clarity/functions/greater-than-or-equal.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/greater-than-or-equal.mdx"}, data: docs_174 }, { info: {"path":"stacks/clarity/functions/greater-than.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/greater-than.mdx"}, data: docs_175 }, { info: {"path":"stacks/clarity/functions/hash160.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/hash160.mdx"}, data: docs_176 }, { info: {"path":"stacks/clarity/functions/if.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/if.mdx"}, data: docs_177 }, { info: {"path":"stacks/clarity/functions/impl-trait.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/impl-trait.mdx"}, data: docs_178 }, { info: {"path":"stacks/clarity/functions/index-of.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/index-of.mdx"}, data: docs_179 }, { info: {"path":"stacks/clarity/functions/int-to-ascii.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/int-to-ascii.mdx"}, data: docs_180 }, { info: {"path":"stacks/clarity/functions/int-to-utf8.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/int-to-utf8.mdx"}, data: docs_181 }, { info: {"path":"stacks/clarity/functions/is-eq.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/is-eq.mdx"}, data: docs_182 }, { info: {"path":"stacks/clarity/functions/is-err.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/is-err.mdx"}, data: docs_183 }, { info: {"path":"stacks/clarity/functions/is-none.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/is-none.mdx"}, data: docs_184 }, { info: {"path":"stacks/clarity/functions/is-ok.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/is-ok.mdx"}, data: docs_185 }, { info: {"path":"stacks/clarity/functions/is-some.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/is-some.mdx"}, data: docs_186 }, { info: {"path":"stacks/clarity/functions/is-standard.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/is-standard.mdx"}, data: docs_187 }, { info: {"path":"stacks/clarity/functions/keccak256.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/keccak256.mdx"}, data: docs_188 }, { info: {"path":"stacks/clarity/functions/len.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/len.mdx"}, data: docs_189 }, { info: {"path":"stacks/clarity/functions/less-than-or-equal.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/less-than-or-equal.mdx"}, data: docs_190 }, { info: {"path":"stacks/clarity/functions/less-than.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/less-than.mdx"}, data: docs_191 }, { info: {"path":"stacks/clarity/functions/let.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/let.mdx"}, data: docs_192 }, { info: {"path":"stacks/clarity/functions/list.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/list.mdx"}, data: docs_193 }, { info: {"path":"stacks/clarity/functions/log2.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/log2.mdx"}, data: docs_194 }, { info: {"path":"stacks/clarity/functions/map-delete.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/map-delete.mdx"}, data: docs_195 }, { info: {"path":"stacks/clarity/functions/map-get.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/map-get.mdx"}, data: docs_196 }, { info: {"path":"stacks/clarity/functions/map-insert.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/map-insert.mdx"}, data: docs_197 }, { info: {"path":"stacks/clarity/functions/map-set.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/map-set.mdx"}, data: docs_198 }, { info: {"path":"stacks/clarity/functions/map.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/map.mdx"}, data: docs_199 }, { info: {"path":"stacks/clarity/functions/match.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/match.mdx"}, data: docs_200 }, { info: {"path":"stacks/clarity/functions/merge.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/merge.mdx"}, data: docs_201 }, { info: {"path":"stacks/clarity/functions/mod.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/mod.mdx"}, data: docs_202 }, { info: {"path":"stacks/clarity/functions/multiply.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/multiply.mdx"}, data: docs_203 }, { info: {"path":"stacks/clarity/functions/nft-burn.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/nft-burn.mdx"}, data: docs_204 }, { info: {"path":"stacks/clarity/functions/nft-get-owner.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/nft-get-owner.mdx"}, data: docs_205 }, { info: {"path":"stacks/clarity/functions/nft-mint.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/nft-mint.mdx"}, data: docs_206 }, { info: {"path":"stacks/clarity/functions/nft-transfer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/nft-transfer.mdx"}, data: docs_207 }, { info: {"path":"stacks/clarity/functions/not.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/not.mdx"}, data: docs_208 }, { info: {"path":"stacks/clarity/functions/ok.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/ok.mdx"}, data: docs_209 }, { info: {"path":"stacks/clarity/functions/or.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/or.mdx"}, data: docs_210 }, { info: {"path":"stacks/clarity/functions/pow.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/pow.mdx"}, data: docs_211 }, { info: {"path":"stacks/clarity/functions/principal-construct.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/principal-construct.mdx"}, data: docs_212 }, { info: {"path":"stacks/clarity/functions/principal-destruct.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/principal-destruct.mdx"}, data: docs_213 }, { info: {"path":"stacks/clarity/functions/principal-of.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/principal-of.mdx"}, data: docs_214 }, { info: {"path":"stacks/clarity/functions/print.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/print.mdx"}, data: docs_215 }, { info: {"path":"stacks/clarity/functions/replace-at.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/replace-at.mdx"}, data: docs_216 }, { info: {"path":"stacks/clarity/functions/secp256k1-recover.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/secp256k1-recover.mdx"}, data: docs_217 }, { info: {"path":"stacks/clarity/functions/secp256k1-verify.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/secp256k1-verify.mdx"}, data: docs_218 }, { info: {"path":"stacks/clarity/functions/sha256.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/sha256.mdx"}, data: docs_219 }, { info: {"path":"stacks/clarity/functions/sha512-256.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/sha512-256.mdx"}, data: docs_220 }, { info: {"path":"stacks/clarity/functions/sha512.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/sha512.mdx"}, data: docs_221 }, { info: {"path":"stacks/clarity/functions/slice.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/slice.mdx"}, data: docs_222 }, { info: {"path":"stacks/clarity/functions/some.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/some.mdx"}, data: docs_223 }, { info: {"path":"stacks/clarity/functions/sqrti.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/sqrti.mdx"}, data: docs_224 }, { info: {"path":"stacks/clarity/functions/string-to-int.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/string-to-int.mdx"}, data: docs_225 }, { info: {"path":"stacks/clarity/functions/string-to-uint.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/string-to-uint.mdx"}, data: docs_226 }, { info: {"path":"stacks/clarity/functions/stx-account.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/stx-account.mdx"}, data: docs_227 }, { info: {"path":"stacks/clarity/functions/stx-burn.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/stx-burn.mdx"}, data: docs_228 }, { info: {"path":"stacks/clarity/functions/stx-get-balance.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/stx-get-balance.mdx"}, data: docs_229 }, { info: {"path":"stacks/clarity/functions/stx-transfer-memo.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/stx-transfer-memo.mdx"}, data: docs_230 }, { info: {"path":"stacks/clarity/functions/stx-transfer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/stx-transfer.mdx"}, data: docs_231 }, { info: {"path":"stacks/clarity/functions/subtract.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/subtract.mdx"}, data: docs_232 }, { info: {"path":"stacks/clarity/functions/to-consensus-buff.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/to-consensus-buff.mdx"}, data: docs_233 }, { info: {"path":"stacks/clarity/functions/to-int.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/to-int.mdx"}, data: docs_234 }, { info: {"path":"stacks/clarity/functions/to-uint.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/to-uint.mdx"}, data: docs_235 }, { info: {"path":"stacks/clarity/functions/try.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/try.mdx"}, data: docs_236 }, { info: {"path":"stacks/clarity/functions/tuple.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/tuple.mdx"}, data: docs_237 }, { info: {"path":"stacks/clarity/functions/unwrap-err-panic.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/unwrap-err-panic.mdx"}, data: docs_238 }, { info: {"path":"stacks/clarity/functions/unwrap-err.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/unwrap-err.mdx"}, data: docs_239 }, { info: {"path":"stacks/clarity/functions/unwrap-panic.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/unwrap-panic.mdx"}, data: docs_240 }, { info: {"path":"stacks/clarity/functions/unwrap.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/unwrap.mdx"}, data: docs_241 }, { info: {"path":"stacks/clarity/functions/use-trait.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/use-trait.mdx"}, data: docs_242 }, { info: {"path":"stacks/clarity/functions/var-get.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/var-get.mdx"}, data: docs_243 }, { info: {"path":"stacks/clarity/functions/var-set.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/var-set.mdx"}, data: docs_244 }, { info: {"path":"stacks/clarity/functions/xor.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/xor.mdx"}, data: docs_245 }, { info: {"path":"stacks/explorer/guides/build-explorer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/explorer/guides/build-explorer.mdx"}, data: docs_246 }, { info: {"path":"stacks/hacks/archive/ai.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/hacks/archive/ai.mdx"}, data: docs_247 }, { info: {"path":"stacks/hacks/archive/build-a-custom-api.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/hacks/archive/build-a-custom-api.mdx"}, data: docs_248 }, { info: {"path":"stacks/hacks/archive/build-a-decentralized-grants-program.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/hacks/archive/build-a-decentralized-grants-program.mdx"}, data: docs_249 }, { info: {"path":"stacks/hacks/archive/build-a-friend-tech-clone.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/hacks/archive/build-a-friend-tech-clone.mdx"}, data: docs_250 }, { info: {"path":"stacks/nakamoto/guides/clarinet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/nakamoto/guides/clarinet.mdx"}, data: docs_251 }, { info: {"path":"stacks/nakamoto/guides/explorer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/nakamoto/guides/explorer.mdx"}, data: docs_252 }, { info: {"path":"stacks/nakamoto/guides/stacks-api.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/nakamoto/guides/stacks-api.mdx"}, data: docs_253 }, { info: {"path":"stacks/nakamoto/guides/stacks-js.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/nakamoto/guides/stacks-js.mdx"}, data: docs_254 }, { info: {"path":"stacks/platform/examples/archive-project.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/examples/archive-project.mdx"}, data: docs_255 }, { info: {"path":"stacks/platform/examples/contract-monitoring.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/examples/contract-monitoring.mdx"}, data: docs_256 }, { info: {"path":"stacks/platform/examples/create-chainhooks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/examples/create-chainhooks.mdx"}, data: docs_257 }, { info: {"path":"stacks/platform/examples/create-project.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/examples/create-project.mdx"}, data: docs_258 }, { info: {"path":"stacks/platform/examples/deploy-contracts.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/examples/deploy-contracts.mdx"}, data: docs_259 }, { info: {"path":"stacks/platform/examples/devnet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/examples/devnet.mdx"}, data: docs_260 }, { info: {"path":"stacks/platform/examples/faucet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/examples/faucet.mdx"}, data: docs_261 }, { info: {"path":"stacks/platform-api/chainhooks/create.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/create.mdx"}, data: docs_262 }, { info: {"path":"stacks/platform-api/chainhooks/delete.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/delete.mdx"}, data: docs_263 }, { info: {"path":"stacks/platform-api/chainhooks/get.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/get.mdx"}, data: docs_264 }, { info: {"path":"stacks/platform-api/chainhooks/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/index.mdx"}, data: docs_265 }, { info: {"path":"stacks/platform-api/chainhooks/list.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/list.mdx"}, data: docs_266 }, { info: {"path":"stacks/platform-api/chainhooks/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/status.mdx"}, data: docs_267 }, { info: {"path":"stacks/platform-api/chainhooks/update.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/update.mdx"}, data: docs_268 }, { info: {"path":"stacks/platform-api/devnet/bitcoin-node.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/devnet/bitcoin-node.mdx"}, data: docs_269 }, { info: {"path":"stacks/platform-api/devnet/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/devnet/index.mdx"}, data: docs_270 }, { info: {"path":"stacks/platform-api/devnet/stacks-blockchain-api.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/devnet/stacks-blockchain-api.mdx"}, data: docs_271 }, { info: {"path":"stacks/platform-api/devnet/start.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/devnet/start.mdx"}, data: docs_272 }, { info: {"path":"stacks/platform-api/devnet/stop.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/devnet/stop.mdx"}, data: docs_273 }, { info: {"path":"stacks/reference/clarinet-js-sdk/clarinet-sdk.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/clarinet-js-sdk/clarinet-sdk.mdx"}, data: docs_274 }, { info: {"path":"stacks/reference/clarinet-js-sdk/custom-matchers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/clarinet-js-sdk/custom-matchers.mdx"}, data: docs_275 }, { info: {"path":"stacks/reference/clarinet-js-sdk/methods.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/clarinet-js-sdk/methods.mdx"}, data: docs_276 }, { info: {"path":"stacks/reference/clarinet-js-sdk/properties.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/clarinet-js-sdk/properties.mdx"}, data: docs_277 }, { info: {"path":"stacks/reference/clarinet-js-sdk/simnet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/clarinet-js-sdk/simnet.mdx"}, data: docs_278 }, { info: {"path":"stacks/reference/cli/clarinet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/cli/clarinet.mdx"}, data: docs_279 }, { info: {"path":"stacks/reference/cli/stacks-js.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/cli/stacks-js.mdx"}, data: docs_280 }, { info: {"path":"stacks/reference/stacks-blockchain-api/client.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/stacks-blockchain-api/client.mdx"}, data: docs_281 }, { info: {"path":"stacks/reference/stacks.js/common.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/stacks.js/common.mdx"}, data: docs_282 }, { info: {"path":"stacks/reference/stacks.js/connect.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/stacks.js/connect.mdx"}, data: docs_283 }, { info: {"path":"stacks/reference/stacks.js/network.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/stacks.js/network.mdx"}, data: docs_284 }, { info: {"path":"stacks/reference/stacks.js/sbtc.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/stacks.js/sbtc.mdx"}, data: docs_285 }, { info: {"path":"stacks/reference/stacks.js/transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/stacks.js/transactions.mdx"}, data: docs_286 }, { info: {"path":"stacks/signer-metrics-api/block-proposals/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/block-proposals/index.mdx"}, data: docs_287 }, { info: {"path":"stacks/signer-metrics-api/block-proposals/signer-information-for-a-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-a-block.mdx"}, data: docs_288 }, { info: {"path":"stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals.mdx"}, data: docs_289 }, { info: {"path":"stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block.mdx"}, data: docs_290 }, { info: {"path":"stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks.mdx"}, data: docs_291 }, { info: {"path":"stacks/signer-metrics-api/blocks/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/blocks/index.mdx"}, data: docs_292 }, { info: {"path":"stacks/signer-metrics-api/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/info/index.mdx"}, data: docs_293 }, { info: {"path":"stacks/signer-metrics-api/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/info/status.mdx"}, data: docs_294 }, { info: {"path":"stacks/signer-metrics-api/prometheus/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/prometheus/index.mdx"}, data: docs_295 }, { info: {"path":"stacks/signer-metrics-api/prometheus/metrics.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/prometheus/metrics.mdx"}, data: docs_296 }, { info: {"path":"stacks/signer-metrics-api/signers/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/signers/index.mdx"}, data: docs_297 }, { info: {"path":"stacks/signer-metrics-api/signers/pox-cycle-signer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/signers/pox-cycle-signer.mdx"}, data: docs_298 }, { info: {"path":"stacks/signer-metrics-api/signers/pox-cycle-signers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/signers/pox-cycle-signers.mdx"}, data: docs_299 }, { info: {"path":"stacks/rpc-api/accounts/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/accounts/index.mdx"}, data: docs_300 }, { info: {"path":"stacks/rpc-api/accounts/info.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/accounts/info.mdx"}, data: docs_301 }, { info: {"path":"stacks/rpc-api/blocks/block-proposal.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/blocks/block-proposal.mdx"}, data: docs_302 }, { info: {"path":"stacks/rpc-api/blocks/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/blocks/index.mdx"}, data: docs_303 }, { info: {"path":"stacks/rpc-api/burn-ops/get-burn-operations.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/burn-ops/get-burn-operations.mdx"}, data: docs_304 }, { info: {"path":"stacks/rpc-api/burn-ops/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/burn-ops/index.mdx"}, data: docs_305 }, { info: {"path":"stacks/rpc-api/fees/estimate.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/fees/estimate.mdx"}, data: docs_306 }, { info: {"path":"stacks/rpc-api/fees/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/fees/index.mdx"}, data: docs_307 }, { info: {"path":"stacks/rpc-api/fees/transfer-estimate.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/fees/transfer-estimate.mdx"}, data: docs_308 }, { info: {"path":"stacks/rpc-api/info/core-api.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/info/core-api.mdx"}, data: docs_309 }, { info: {"path":"stacks/rpc-api/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/info/index.mdx"}, data: docs_310 }, { info: {"path":"stacks/rpc-api/names/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/names/index.mdx"}, data: docs_311 }, { info: {"path":"stacks/rpc-api/names/name-price.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/names/name-price.mdx"}, data: docs_312 }, { info: {"path":"stacks/rpc-api/names/namespace-price.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/names/namespace-price.mdx"}, data: docs_313 }, { info: {"path":"stacks/rpc-api/pox/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/pox/index.mdx"}, data: docs_314 }, { info: {"path":"stacks/rpc-api/pox/pox-details.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/pox/pox-details.mdx"}, data: docs_315 }, { info: {"path":"stacks/rpc-api/pox/stacker-set.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/pox/stacker-set.mdx"}, data: docs_316 }, { info: {"path":"stacks/rpc-api/smart-contracts/constants.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/constants.mdx"}, data: docs_317 }, { info: {"path":"stacks/rpc-api/smart-contracts/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/index.mdx"}, data: docs_318 }, { info: {"path":"stacks/rpc-api/smart-contracts/interface.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/interface.mdx"}, data: docs_319 }, { info: {"path":"stacks/rpc-api/smart-contracts/map-entry.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/map-entry.mdx"}, data: docs_320 }, { info: {"path":"stacks/rpc-api/smart-contracts/read-only.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/read-only.mdx"}, data: docs_321 }, { info: {"path":"stacks/rpc-api/smart-contracts/source.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/source.mdx"}, data: docs_322 }, { info: {"path":"stacks/rpc-api/smart-contracts/traits.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/traits.mdx"}, data: docs_323 }, { info: {"path":"stacks/rpc-api/transactions/broadcast-transaction.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/transactions/broadcast-transaction.mdx"}, data: docs_324 }, { info: {"path":"stacks/rpc-api/transactions/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/transactions/index.mdx"}, data: docs_325 }, { info: {"path":"stacks/rpc-api/v3/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/v3/index.mdx"}, data: docs_326 }, { info: {"path":"stacks/rpc-api/v3/nakamoto-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/v3/nakamoto-block.mdx"}, data: docs_327 }, { info: {"path":"stacks/rpc-api/v3/tenure-blocks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/v3/tenure-blocks.mdx"}, data: docs_328 }, { info: {"path":"stacks/rpc-api/v3/tenure-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/v3/tenure-metadata.mdx"}, data: docs_329 }, { info: {"path":"stacks/stacks.js/concepts/accounts-and-addresses.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/concepts/accounts-and-addresses.mdx"}, data: docs_330 }, { info: {"path":"stacks/stacks.js/concepts/broadcasting.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/concepts/broadcasting.mdx"}, data: docs_331 }, { info: {"path":"stacks/stacks.js/concepts/networks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/concepts/networks.mdx"}, data: docs_332 }, { info: {"path":"stacks/stacks.js/concepts/post-conditions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/concepts/post-conditions.mdx"}, data: docs_333 }, { info: {"path":"stacks/stacks.js/concepts/private-keys.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/concepts/private-keys.mdx"}, data: docs_334 }, { info: {"path":"stacks/stacks.js/concepts/transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/concepts/transactions.mdx"}, data: docs_335 }, { info: {"path":"stacks/stacks.js/examples/broadcast-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/examples/broadcast-transactions.mdx"}, data: docs_336 }, { info: {"path":"stacks/stacks.js/examples/post-conditions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/examples/post-conditions.mdx"}, data: docs_337 }, { info: {"path":"stacks/stacks.js/examples/use-with-react-native.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/examples/use-with-react-native.mdx"}, data: docs_338 }, { info: {"path":"stacks/stacks.js/packages/common.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/packages/common.mdx"}, data: docs_339 }, { info: {"path":"stacks/stacks.js/packages/network.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/packages/network.mdx"}, data: docs_340 }, { info: {"path":"stacks/stacks.js/packages/sbtc.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/packages/sbtc.mdx"}, data: docs_341 }, { info: {"path":"stacks/stacks.js/packages/transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/packages/transactions.mdx"}, data: docs_342 }, { info: {"path":"stacks/stacks.js/v6/network.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/v6/network.mdx"}, data: docs_343 }, { info: {"path":"stacks/stacks.js/v6/transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/v6/transactions.mdx"}, data: docs_344 }, { info: {"path":"stacks/token-metadata-api/client/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/client/index.mdx"}, data: docs_345 }, { info: {"path":"stacks/token-metadata-api/client/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/client/quickstart.mdx"}, data: docs_346 }, { info: {"path":"stacks/token-metadata-api/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/info/index.mdx"}, data: docs_347 }, { info: {"path":"stacks/token-metadata-api/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/info/status.mdx"}, data: docs_348 }, { info: {"path":"stacks/token-metadata-api/tokens/fungible-token-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/tokens/fungible-token-metadata.mdx"}, data: docs_349 }, { info: {"path":"stacks/token-metadata-api/tokens/fungible-tokens.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/tokens/fungible-tokens.mdx"}, data: docs_350 }, { info: {"path":"stacks/token-metadata-api/tokens/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/tokens/index.mdx"}, data: docs_351 }, { info: {"path":"stacks/token-metadata-api/tokens/non-fungible-token-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/tokens/non-fungible-token-metadata.mdx"}, data: docs_352 }, { info: {"path":"stacks/token-metadata-api/tokens/semi-fungible-token-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/tokens/semi-fungible-token-metadata.mdx"}, data: docs_353 }, { info: {"path":"bitcoin/api/ordinals/brc20/get-brc20-activity.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/brc20/get-brc20-activity.mdx"}, data: docs_354 }, { info: {"path":"bitcoin/api/ordinals/brc20/get-brc20-balances.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/brc20/get-brc20-balances.mdx"}, data: docs_355 }, { info: {"path":"bitcoin/api/ordinals/brc20/get-brc20-token-details.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-details.mdx"}, data: docs_356 }, { info: {"path":"bitcoin/api/ordinals/brc20/get-brc20-token-holders.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-holders.mdx"}, data: docs_357 }, { info: {"path":"bitcoin/api/ordinals/brc20/get-brc20-tokens.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/brc20/get-brc20-tokens.mdx"}, data: docs_358 }, { info: {"path":"bitcoin/api/ordinals/brc20/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/brc20/index.mdx"}, data: docs_359 }, { info: {"path":"bitcoin/api/ordinals/inscriptions/get-inscription-content.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-content.mdx"}, data: docs_360 }, { info: {"path":"bitcoin/api/ordinals/inscriptions/get-inscription-transfers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-transfers.mdx"}, data: docs_361 }, { info: {"path":"bitcoin/api/ordinals/inscriptions/get-inscription.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/inscriptions/get-inscription.mdx"}, data: docs_362 }, { info: {"path":"bitcoin/api/ordinals/inscriptions/get-inscriptions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/inscriptions/get-inscriptions.mdx"}, data: docs_363 }, { info: {"path":"bitcoin/api/ordinals/inscriptions/get-transfers-per-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/inscriptions/get-transfers-per-block.mdx"}, data: docs_364 }, { info: {"path":"bitcoin/api/ordinals/inscriptions/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/inscriptions/index.mdx"}, data: docs_365 }, { info: {"path":"bitcoin/api/ordinals/statistics/get-stats-inscription-count.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/statistics/get-stats-inscription-count.mdx"}, data: docs_366 }, { info: {"path":"bitcoin/api/ordinals/statistics/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/statistics/index.mdx"}, data: docs_367 }, { info: {"path":"bitcoin/api/runes/activities/activity.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/activities/activity.mdx"}, data: docs_368 }, { info: {"path":"bitcoin/api/runes/activities/for-address.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/activities/for-address.mdx"}, data: docs_369 }, { info: {"path":"bitcoin/api/runes/activities/for-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/activities/for-block.mdx"}, data: docs_370 }, { info: {"path":"bitcoin/api/runes/activities/for-transaction.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/activities/for-transaction.mdx"}, data: docs_371 }, { info: {"path":"bitcoin/api/runes/activities/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/activities/index.mdx"}, data: docs_372 }, { info: {"path":"bitcoin/api/ordinals/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/info/index.mdx"}, data: docs_373 }, { info: {"path":"bitcoin/api/ordinals/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/info/status.mdx"}, data: docs_374 }, { info: {"path":"bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions.mdx"}, data: docs_375 }, { info: {"path":"bitcoin/api/ordinals/satoshis/get-satoshi.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/satoshis/get-satoshi.mdx"}, data: docs_376 }, { info: {"path":"bitcoin/api/ordinals/satoshis/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/satoshis/index.mdx"}, data: docs_377 }, { info: {"path":"bitcoin/api/runes/balances/address.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/balances/address.mdx"}, data: docs_378 }, { info: {"path":"bitcoin/api/runes/balances/holder-balance.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/balances/holder-balance.mdx"}, data: docs_379 }, { info: {"path":"bitcoin/api/runes/balances/holders.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/balances/holders.mdx"}, data: docs_380 }, { info: {"path":"bitcoin/api/runes/balances/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/balances/index.mdx"}, data: docs_381 }, { info: {"path":"bitcoin/api/runes/etchings/get-etching.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/etchings/get-etching.mdx"}, data: docs_382 }, { info: {"path":"bitcoin/api/runes/etchings/get-etchings.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/etchings/get-etchings.mdx"}, data: docs_383 }, { info: {"path":"bitcoin/api/runes/etchings/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/etchings/index.mdx"}, data: docs_384 }, { info: {"path":"bitcoin/api/runes/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/info/index.mdx"}, data: docs_385 }, { info: {"path":"bitcoin/api/runes/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/info/status.mdx"}, data: docs_386 }, { info: {"path":"bitcoin/ordinals/explorer/guides/build-explorer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/explorer/guides/build-explorer.mdx"}, data: docs_387 }, { info: {"path":"bitcoin/ordinals/api/brc20/get-brc20-activity.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/brc20/get-brc20-activity.mdx"}, data: docs_388 }, { info: {"path":"bitcoin/ordinals/api/brc20/get-brc20-balances.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/brc20/get-brc20-balances.mdx"}, data: docs_389 }, { info: {"path":"bitcoin/ordinals/api/brc20/get-brc20-token-details.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-details.mdx"}, data: docs_390 }, { info: {"path":"bitcoin/ordinals/api/brc20/get-brc20-token-holders.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-holders.mdx"}, data: docs_391 }, { info: {"path":"bitcoin/ordinals/api/brc20/get-brc20-tokens.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/brc20/get-brc20-tokens.mdx"}, data: docs_392 }, { info: {"path":"bitcoin/ordinals/api/brc20/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/brc20/index.mdx"}, data: docs_393 }, { info: {"path":"bitcoin/ordinals/api/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/info/index.mdx"}, data: docs_394 }, { info: {"path":"bitcoin/ordinals/api/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/info/status.mdx"}, data: docs_395 }, { info: {"path":"bitcoin/ordinals/api/inscriptions/get-inscription-content.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-content.mdx"}, data: docs_396 }, { info: {"path":"bitcoin/ordinals/api/inscriptions/get-inscription-transfers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-transfers.mdx"}, data: docs_397 }, { info: {"path":"bitcoin/ordinals/api/inscriptions/get-inscription.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription.mdx"}, data: docs_398 }, { info: {"path":"bitcoin/ordinals/api/inscriptions/get-inscriptions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/inscriptions/get-inscriptions.mdx"}, data: docs_399 }, { info: {"path":"bitcoin/ordinals/api/inscriptions/get-transfers-per-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/inscriptions/get-transfers-per-block.mdx"}, data: docs_400 }, { info: {"path":"bitcoin/ordinals/api/inscriptions/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/inscriptions/index.mdx"}, data: docs_401 }, { info: {"path":"bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions.mdx"}, data: docs_402 }, { info: {"path":"bitcoin/ordinals/api/satoshis/get-satoshi.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/satoshis/get-satoshi.mdx"}, data: docs_403 }, { info: {"path":"bitcoin/ordinals/api/satoshis/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/satoshis/index.mdx"}, data: docs_404 }, { info: {"path":"bitcoin/ordinals/api/statistics/get-stats-inscription-count.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/statistics/get-stats-inscription-count.mdx"}, data: docs_405 }, { info: {"path":"bitcoin/ordinals/api/statistics/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/statistics/index.mdx"}, data: docs_406 }, { info: {"path":"bitcoin/runes/api/activities/activity.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/activities/activity.mdx"}, data: docs_407 }, { info: {"path":"bitcoin/runes/api/activities/for-address.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/activities/for-address.mdx"}, data: docs_408 }, { info: {"path":"bitcoin/runes/api/activities/for-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/activities/for-block.mdx"}, data: docs_409 }, { info: {"path":"bitcoin/runes/api/activities/for-transaction.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/activities/for-transaction.mdx"}, data: docs_410 }, { info: {"path":"bitcoin/runes/api/activities/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/activities/index.mdx"}, data: docs_411 }, { info: {"path":"bitcoin/runes/api/balances/address.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/balances/address.mdx"}, data: docs_412 }, { info: {"path":"bitcoin/runes/api/balances/holder-balance.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/balances/holder-balance.mdx"}, data: docs_413 }, { info: {"path":"bitcoin/runes/api/balances/holders.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/balances/holders.mdx"}, data: docs_414 }, { info: {"path":"bitcoin/runes/api/balances/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/balances/index.mdx"}, data: docs_415 }, { info: {"path":"bitcoin/runes/api/etchings/get-etching.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/etchings/get-etching.mdx"}, data: docs_416 }, { info: {"path":"bitcoin/runes/api/etchings/get-etchings.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/etchings/get-etchings.mdx"}, data: docs_417 }, { info: {"path":"bitcoin/runes/api/etchings/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/etchings/index.mdx"}, data: docs_418 }, { info: {"path":"bitcoin/runes/api/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/info/index.mdx"}, data: docs_419 }, { info: {"path":"bitcoin/runes/api/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/info/status.mdx"}, data: docs_420 }, { info: {"path":"bitcoin/runes/explorer/guides/build-explorer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/explorer/guides/build-explorer.mdx"}, data: docs_421 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/assets.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/assets.mdx"}, data: docs_422 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/balances.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/balances.mdx"}, data: docs_423 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/inbound-stx-transfers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/inbound-stx-transfers.mdx"}, data: docs_424 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/latest-nonce.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/latest-nonce.mdx"}, data: docs_425 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/nft-events.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/nft-events.mdx"}, data: docs_426 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/stx-balances.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/stx-balances.mdx"}, data: docs_427 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/transaction-with-transfers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/transaction-with-transfers.mdx"}, data: docs_428 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/transactions-with-transfers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/transactions-with-transfers.mdx"}, data: docs_429 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/transactions.mdx"}, data: docs_430 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/average-times.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/average-times.mdx"}, data: docs_431 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash.mdx"}, data: docs_432 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/block-by-burn-block-height.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-height.mdx"}, data: docs_433 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/block-by-hash.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/block-by-hash.mdx"}, data: docs_434 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/block-by-height.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/block-by-height.mdx"}, data: docs_435 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/get-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/get-block.mdx"}, data: docs_436 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block.mdx"}, data: docs_437 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/get-blocks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/get-blocks.mdx"}, data: docs_438 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/index.mdx"}, data: docs_439 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/recent-blocks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/recent-blocks.mdx"}, data: docs_440 }, { info: {"path":"stacks/api/stacks-blockchain/burn-blocks/get-burn-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-block.mdx"}, data: docs_441 }, { info: {"path":"stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks.mdx"}, data: docs_442 }, { info: {"path":"stacks/api/stacks-blockchain/burn-blocks/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/burn-blocks/index.mdx"}, data: docs_443 }, { info: {"path":"stacks/api/stacks-blockchain/faucets/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/faucets/index.mdx"}, data: docs_444 }, { info: {"path":"stacks/api/stacks-blockchain/faucets/stx.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/faucets/stx.mdx"}, data: docs_445 }, { info: {"path":"stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text.mdx"}, data: docs_446 }, { info: {"path":"stacks/api/stacks-blockchain/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/index.mdx"}, data: docs_447 }, { info: {"path":"stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply.mdx"}, data: docs_448 }, { info: {"path":"stacks/api/stacks-blockchain/info/network-block-time.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/network-block-time.mdx"}, data: docs_449 }, { info: {"path":"stacks/api/stacks-blockchain/info/network-given-block-time.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/network-given-block-time.mdx"}, data: docs_450 }, { info: {"path":"stacks/api/stacks-blockchain/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/status.mdx"}, data: docs_451 }, { info: {"path":"stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply.mdx"}, data: docs_452 }, { info: {"path":"stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text.mdx"}, data: docs_453 }, { info: {"path":"stacks/api/stacks-blockchain/fees/fee-rate.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/fees/fee-rate.mdx"}, data: docs_454 }, { info: {"path":"stacks/api/stacks-blockchain/fees/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/fees/index.mdx"}, data: docs_455 }, { info: {"path":"stacks/api/stacks-blockchain/mempool/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/mempool/index.mdx"}, data: docs_456 }, { info: {"path":"stacks/api/stacks-blockchain/mempool/transaction-fee-priorities.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/mempool/transaction-fee-priorities.mdx"}, data: docs_457 }, { info: {"path":"stacks/api/stacks-blockchain/names/historical-zonefile.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/historical-zonefile.mdx"}, data: docs_458 }, { info: {"path":"stacks/api/stacks-blockchain/names/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/index.mdx"}, data: docs_459 }, { info: {"path":"stacks/api/stacks-blockchain/names/name-details.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/name-details.mdx"}, data: docs_460 }, { info: {"path":"stacks/api/stacks-blockchain/names/name-subdomains.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/name-subdomains.mdx"}, data: docs_461 }, { info: {"path":"stacks/api/stacks-blockchain/names/name-zonefile.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/name-zonefile.mdx"}, data: docs_462 }, { info: {"path":"stacks/api/stacks-blockchain/names/names.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/names.mdx"}, data: docs_463 }, { info: {"path":"stacks/api/stacks-blockchain/names/namespace-names.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/namespace-names.mdx"}, data: docs_464 }, { info: {"path":"stacks/api/stacks-blockchain/names/namespaces.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/namespaces.mdx"}, data: docs_465 }, { info: {"path":"stacks/api/stacks-blockchain/names/owned-by-address.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/owned-by-address.mdx"}, data: docs_466 }, { info: {"path":"stacks/api/stacks-blockchain/non-fungible-tokens/history.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/history.mdx"}, data: docs_467 }, { info: {"path":"stacks/api/stacks-blockchain/non-fungible-tokens/holdings.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/holdings.mdx"}, data: docs_468 }, { info: {"path":"stacks/api/stacks-blockchain/non-fungible-tokens/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/index.mdx"}, data: docs_469 }, { info: {"path":"stacks/api/stacks-blockchain/non-fungible-tokens/mints.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/mints.mdx"}, data: docs_470 }, { info: {"path":"stacks/api/stacks-blockchain/proof-of-transfer/cycle.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycle.mdx"}, data: docs_471 }, { info: {"path":"stacks/api/stacks-blockchain/proof-of-transfer/cycles.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycles.mdx"}, data: docs_472 }, { info: {"path":"stacks/api/stacks-blockchain/proof-of-transfer/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/index.mdx"}, data: docs_473 }, { info: {"path":"stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle.mdx"}, data: docs_474 }, { info: {"path":"stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle.mdx"}, data: docs_475 }, { info: {"path":"stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle.mdx"}, data: docs_476 }, { info: {"path":"stacks/api/stacks-blockchain/search/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/search/index.mdx"}, data: docs_477 }, { info: {"path":"stacks/api/stacks-blockchain/search/search-by-id.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/search/search-by-id.mdx"}, data: docs_478 }, { info: {"path":"stacks/api/stacks-blockchain/smart-contracts/by-trait.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/smart-contracts/by-trait.mdx"}, data: docs_479 }, { info: {"path":"stacks/api/stacks-blockchain/smart-contracts/events.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/smart-contracts/events.mdx"}, data: docs_480 }, { info: {"path":"stacks/api/stacks-blockchain/smart-contracts/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/smart-contracts/index.mdx"}, data: docs_481 }, { info: {"path":"stacks/api/stacks-blockchain/smart-contracts/info.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/smart-contracts/info.mdx"}, data: docs_482 }, { info: {"path":"stacks/api/stacks-blockchain/smart-contracts/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/smart-contracts/status.mdx"}, data: docs_483 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-pool/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-pool/index.mdx"}, data: docs_484 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-pool/members.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-pool/members.mdx"}, data: docs_485 }, { info: {"path":"stacks/api/stacks-blockchain/tokens/holders.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/tokens/holders.mdx"}, data: docs_486 }, { info: {"path":"stacks/api/stacks-blockchain/tokens/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/tokens/index.mdx"}, data: docs_487 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-rewards/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-rewards/index.mdx"}, data: docs_488 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient.mdx"}, data: docs_489 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients.mdx"}, data: docs_490 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries.mdx"}, data: docs_491 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders.mdx"}, data: docs_492 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient.mdx"}, data: docs_493 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/address-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/address-transactions.mdx"}, data: docs_494 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/details-for-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/details-for-transactions.mdx"}, data: docs_495 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions.mdx"}, data: docs_496 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction.mdx"}, data: docs_497 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/get-raw-transaction.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/get-raw-transaction.mdx"}, data: docs_498 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/get-transaction.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/get-transaction.mdx"}, data: docs_499 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/index.mdx"}, data: docs_500 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/mempool-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/mempool-transactions.mdx"}, data: docs_501 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/recent-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/recent-transactions.mdx"}, data: docs_502 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions.mdx"}, data: docs_503 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/transaction-events.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/transaction-events.mdx"}, data: docs_504 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/transactions-by-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/transactions-by-block.mdx"}, data: docs_505 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/transactions-for-address.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/transactions-for-address.mdx"}, data: docs_506 }, { info: {"path":"stacks/api/token-metadata/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/info/index.mdx"}, data: docs_507 }, { info: {"path":"stacks/api/token-metadata/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/info/status.mdx"}, data: docs_508 }, { info: {"path":"stacks/api/token-metadata/tokens/fungible-token-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/tokens/fungible-token-metadata.mdx"}, data: docs_509 }, { info: {"path":"stacks/api/token-metadata/tokens/fungible-tokens.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/tokens/fungible-tokens.mdx"}, data: docs_510 }, { info: {"path":"stacks/api/token-metadata/tokens/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/tokens/index.mdx"}, data: docs_511 }, { info: {"path":"stacks/api/token-metadata/tokens/non-fungible-token-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/tokens/non-fungible-token-metadata.mdx"}, data: docs_512 }, { info: {"path":"stacks/api/token-metadata/tokens/semi-fungible-token-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/tokens/semi-fungible-token-metadata.mdx"}, data: docs_513 }, { info: {"path":"stacks/chainhook/references/scopes/bitcoin.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/references/scopes/bitcoin.mdx"}, data: docs_514 }, { info: {"path":"stacks/chainhook/references/scopes/stacks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/references/scopes/stacks.mdx"}, data: docs_515 }, { info: {"path":"stacks/token-metadata-api/client/tokens/get-ft-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/client/tokens/get-ft-metadata.mdx"}, data: docs_516 }, { info: {"path":"stacks/token-metadata-api/client/tokens/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/client/tokens/index.mdx"}, data: docs_517 }], [{ info: {"path":"bitcoin/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/meta.json"}, data: {"title":"bitcoin","pages":["index","quickstarts","api","---Get started---","indexer/index"],"root":true} }, { info: {"path":"stacks/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/meta.json"}, data: {"title":"stacks","pages":["index","quickstarts","api","reference","clarity","---Get started---","get-started","setup","---Build with Hiro---","smart-contract-development","web-app-development","blockchain-development","token-development","---Testing---","unit-testing","integration-testing","testing-environments","testing-best-practices","migration-guide","---Explore by tool---","clarinet","chainhook","platform","stacks.js","connect"],"root":true} }, { info: {"path":"guides/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/meta.json"}, data: {"title":"guides","pages":["index","-------","build-an-nft-marketplace","build-a-decentralized-kickstarter","using-clarity-values","no-loss-lottery","---Other---","installing-docker","sync-a-bitcoin-node","sync-a-stacks-node","------","api-keys","rate-limiting","contributors-guide"],"root":true} }, { info: {"path":"bitcoin/api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/meta.json"}, data: {"title":"APIs","pages":["---Ordinals API---","...ordinals","---Runes API---","...runes"],"root":true} }, { info: {"path":"bitcoin/indexer/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/indexer/meta.json"}, data: {"title":"Bitcoin Indexer","pages":["---Bitcoin Indexer---","index","installation","quickstart"],"root":true} }, { info: {"path":"bitcoin/quickstarts/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/quickstarts/meta.json"}, data: {"title":"Quickstarts","pages":["---Get started---","../get-started"],"root":true} }, { info: {"path":"stacks/api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/meta.json"}, data: {"title":"APIs","pages":["---Stacks Blockchain API---","...stacks-blockchain","---Token Metadata API---","...token-metadata"],"root":true} }, { info: {"path":"stacks/archive/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/archive/meta.json"}, data: {"title":"Hiro Archive","pages":["---Hiro Archive---","index","---Guides---","guides/verify-archive-data","guides/stacks-blockchain","guides/stacks-api","guides/token-metadata-api"],"root":true} }, { info: {"path":"stacks/clarinet/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/meta.json"}, data: {"title":"Clarinet","pages":["index","quickstart","concepts","...examples"]} }, { info: {"path":"stacks/chainhook/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/meta.json"}, data: {"title":"Chainhook","pages":["index","installation","quickstart","predicate-design","...examples"]} }, { info: {"path":"stacks/clarinet-js-sdk/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/meta.json"}, data: {"title":"Clarinet JS SDK","pages":["---Clarinet JS SDK---","index","installation","quickstart","---Guides---","guides/unit-testing","guides/integration-testing","guides/migrate-to-the-clarinet-sdk","---Reference---","references/simnet","references/properties","references/methods","references/custom-matchers"],"root":true} }, { info: {"path":"stacks/connect/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/meta.json"}, data: {"title":"Stacks Connect","pages":["index","quickstart","...examples","support"]} }, { info: {"path":"stacks/clarity/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/meta.json"}, data: {"title":"Clarity","pages":["index","---Guides---","basic-arithmetic","access-control","handling-optionals-and-errors","---Functions---","...functions"],"root":true} }, { info: {"path":"stacks/explorer/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/explorer/meta.json"}, data: {"title":"Explorer","pages":["---Stacks Explorer---","index"],"root":true} }, { info: {"path":"stacks/hacks/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/hacks/meta.json"}, data: {"title":"Hiro Hacks","pages":["---Hiro Hacks---","index","---Hacks---","recipes","---Archive---","archive/ai","archive/build-a-friend-tech-clone","archive/build-a-decentralized-grants-program","archive/build-a-custom-api"],"root":true} }, { info: {"path":"stacks/platform/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/meta.json"}, data: {"title":"Hiro Platform","pages":["index","quickstart","...examples"]} }, { info: {"path":"stacks/nakamoto/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/nakamoto/meta.json"}, data: {"title":"Nakamoto support","pages":["---Nakamoto---","index","---Nakamoto Updates By Product---","guides/clarinet","guides/explorer","guides/stacks-js","guides/stacks-api"],"root":true} }, { info: {"path":"stacks/platform-api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/meta.json"}, data: {"title":"Platform API","pages":["---Platform API---","index","---API Reference---","chainhooks","devnet"],"root":true} }, { info: {"path":"stacks/quickstarts/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/meta.json"}, data: {"title":"Quickstarts","pages":["---Starter templates---","app-templates","contract-templates","---Examples---","wallet-integration","nft-minting","token-transfers","event-streaming"],"root":true} }, { info: {"path":"stacks/reference/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/meta.json"}, data: {"title":"SDKs & Libraries","pages":["---Stacks Blockchain API---","stacks-blockchain-api/client","---Stacks.js---","stacks/js/common","stacks.js/connect","stacks.js/network","stacks.js/transactions","stacks.js/sbtc","---Clarinet JS SDK---","clarinet-js-sdk/clarinet-sdk","---CLI tools---","cli/clarinet","cli/stacks-js"],"root":true} }, { info: {"path":"stacks/rpc-api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/meta.json"}, data: {"title":"Stacks Node RPC","pages":["---Stacks Node RPC---","index","---API Reference---","accounts","transactions","blocks","pox","fees","burn-ops","smart-contracts","names","v3","info"],"root":true} }, { info: {"path":"stacks/signer-metrics-api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/meta.json"}, data: {"title":"Signer Metrics API","pages":["---Signer Metrics API---","index","---API Reference---","info","signers","blocks","block-proposals","prometheus"],"root":true} }, { info: {"path":"stacks/stacks.js/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/meta.json"}, data: {"title":"Stacks.js","pages":["index","installation","quickstart","roadmap","...concepts","...examples"]} }, { info: {"path":"stacks/token-metadata-api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/meta.json"}, data: {"title":"Token Metadata API","pages":["---Token Metadata API---","index","usage","architecture","---API Reference---","info","tokens"],"root":true} }, { info: {"path":"bitcoin/ordinals/api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/meta.json"}, data: {"title":"Ordinals API","pages":["---Ordinals API---","index","---API Reference---","inscriptions","satoshis","statistics","brc20","info"],"root":true} }, { info: {"path":"bitcoin/ordinals/explorer/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/explorer/meta.json"}, data: {"title":"Explorer","pages":["---Ordinals Explorer---","index"],"root":true} }, { info: {"path":"bitcoin/runes/api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/meta.json"}, data: {"title":"Runes API","pages":["---Runes API---","index","---API Reference---","etchings","activities","balances","info"],"root":true} }, { info: {"path":"bitcoin/runes/explorer/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/explorer/meta.json"}, data: {"title":"Explorer","pages":["---Ordinals Explorer---","index"],"root":true} }, { info: {"path":"bitcoin/runes/runehook/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/runehook/meta.json"}, data: {"title":"Runehook","pages":["---Runehook---","index","installation","quickstart","---Guides---"],"root":true} }, { info: {"path":"stacks/platform-api/chainhooks/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/meta.json"}, data: {"title":"Chainhooks","pages":["list","get","status","create","update","delete"],"defaultOpen":false} }, { info: {"path":"stacks/platform-api/devnet/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/devnet/meta.json"}, data: {"title":"Devnet","pages":["start","stop","stacks-blockchain-api","bitcoin-node"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/accounts/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/accounts/meta.json"}, data: {"title":"Accounts","pages":["info"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/blocks/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/blocks/meta.json"}, data: {"title":"Blocks","pages":["block-proposal"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/burn-ops/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/burn-ops/meta.json"}, data: {"title":"Burn operations","pages":["get-burn-operations"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/fees/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/fees/meta.json"}, data: {"title":"Fees","pages":["estimate","transfer-estimate"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/info/meta.json"}, data: {"title":"Info","pages":["core-api"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/names/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/names/meta.json"}, data: {"title":"Names","pages":["namespace-price","name-price"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/pox/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/pox/meta.json"}, data: {"title":"Proof of Transfer","pages":["pox-details","stacker-set"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/smart-contracts/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/meta.json"}, data: {"title":"Smart Contracts","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/transactions/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/transactions/meta.json"}, data: {"title":"Transactions","pages":["broadcast-transaction"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/v3/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/v3/meta.json"}, data: {"title":"v3","pages":["nakamoto-block","tenure-metadata","tenure-blocks"],"defaultOpen":false} }, { info: {"path":"stacks/signer-metrics-api/block-proposals/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/block-proposals/meta.json"}, data: {"title":"Block proposals","pages":["..."]} }, { info: {"path":"stacks/signer-metrics-api/blocks/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/blocks/meta.json"}, data: {"title":"Blocks","pages":["..."]} }, { info: {"path":"stacks/signer-metrics-api/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/info/meta.json"}, data: {"title":"Info","pages":["..."]} }, { info: {"path":"stacks/signer-metrics-api/prometheus/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/prometheus/meta.json"}, data: {"title":"Prometheus Metrics","pages":["..."]} }, { info: {"path":"stacks/signer-metrics-api/signers/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/signers/meta.json"}, data: {"title":"Signers","pages":["..."]} }, { info: {"path":"stacks/stacks.js/packages/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/packages/meta.json"}, data: {"title":"Packages","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/stacks.js/v6/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/v6/meta.json"}, data: {"title":"Packages","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/token-metadata-api/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/info/meta.json"}, data: {"title":"Info","pages":["status"],"defaultOpen":false} }, { info: {"path":"stacks/token-metadata-api/tokens/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/tokens/meta.json"}, data: {"title":"Tokens","pages":["fungible-tokens","fungible-token-metadata","non-fungible-token-metadata","semi-fungible-token-metadata"],"defaultOpen":false} }, { info: {"path":"bitcoin/api/ordinals/brc20/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/brc20/meta.json"}, data: {"title":"BRC-20","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/ordinals/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/info/meta.json"}, data: {"title":"Status","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/ordinals/inscriptions/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/inscriptions/meta.json"}, data: {"title":"Inscriptions","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/ordinals/statistics/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/statistics/meta.json"}, data: {"title":"Statistics","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/ordinals/satoshis/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/satoshis/meta.json"}, data: {"title":"Satoshis","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/runes/activities/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/activities/meta.json"}, data: {"title":"Activities","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/runes/balances/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/balances/meta.json"}, data: {"title":"Balances","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/runes/etchings/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/etchings/meta.json"}, data: {"title":"Etchings","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/runes/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/info/meta.json"}, data: {"title":"Status","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/ordinals/api/brc20/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/brc20/meta.json"}, data: {"title":"BRC-20","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/ordinals/api/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/info/meta.json"}, data: {"title":"Status","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/ordinals/api/satoshis/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/satoshis/meta.json"}, data: {"title":"Satoshis","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/ordinals/api/inscriptions/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/inscriptions/meta.json"}, data: {"title":"Inscriptions","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/ordinals/api/statistics/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/statistics/meta.json"}, data: {"title":"Statistics","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/runes/api/balances/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/balances/meta.json"}, data: {"title":"Balances","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/runes/api/activities/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/activities/meta.json"}, data: {"title":"Activities","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/runes/api/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/info/meta.json"}, data: {"title":"Status","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/runes/api/etchings/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/etchings/meta.json"}, data: {"title":"Etchings","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/accounts/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/meta.json"}, data: {"title":"Accounts","pages":["info","assets","balances","stx-balances","inbound-stx-transfers","transactions","transactions-with-transfers","transaction-with-transfers","nft-events","latest-nonce"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/burn-blocks/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/burn-blocks/meta.json"}, data: {"title":"Burn Blocks","pages":["get-burn-blocks","get-burn-block"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/blocks/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/meta.json"}, data: {"title":"Blocks","pages":["get-block","get-blocks","get-blocks-by-burn-block","average-times","recent-blocks","block-by-hash","block-by-height","block-by-burn-block-hash","block-by-burn-block-height"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/faucets/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/faucets/meta.json"}, data: {"title":"Faucets","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/fees/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/fees/meta.json"}, data: {"title":"Fees","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/meta.json"}, data: {"title":"Info","pages":["status","core-api","network-block-time","network-given-block-time","total-and-unlocked-stx-supply","legacy-total-and-unlocked-stx-supply","total-stx-supply-in-plain-text","circulating-stx-supply-in-plain-text","pox-details"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/mempool/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/mempool/meta.json"}, data: {"title":"Mempool","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/names/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/meta.json"}, data: {"title":"Names","pages":["namespaces","names","namespace-names","namespace-price","name-price","name-details","name-subdomains","name-zonefile","historical-zonefile","owned-by-address"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/non-fungible-tokens/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/meta.json"}, data: {"title":"Non-fungible tokens","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/proof-of-transfer/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/meta.json"}, data: {"title":"Proof of Transfer","pages":["cycles","cycle","signers-in-cycle","signer-in-cycle","stackers-for-signer-in-cycle"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/search/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/search/meta.json"}, data: {"title":"Search","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/stacking-pool/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-pool/meta.json"}, data: {"title":"Stacking Pool","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/smart-contracts/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/smart-contracts/meta.json"}, data: {"title":"Smart Contracts","pages":["status","info","source","by-trait","interface","map-entry","read-only","events"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/stacking-rewards/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-rewards/meta.json"}, data: {"title":"Stacking Rewards","pages":["recent-reward-slot-holders","recent-reward-slot-holder-entries","recent-burnchain-reward-recipients","recent-burnchain-reward-recipient","total-burnchain-rewards-for-recipient"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/tokens/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/tokens/meta.json"}, data: {"title":"Tokens","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/transactions/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/meta.json"}, data: {"title":"Transactions","pages":["recent-transactions","get-transaction","get-raw-transaction","address-transactions","transactions-by-block","events-for-an-address-transaction","transaction-events","transaction-fee-priorities","mempool-transactions","dropped-mempool-transactions","statistics-for-mempool-transactions","details-for-transactions","broadcast-transaction"],"defaultOpen":false} }, { info: {"path":"stacks/api/token-metadata/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/info/meta.json"}, data: {"title":"Info","pages":["status"],"defaultOpen":false} }, { info: {"path":"stacks/api/token-metadata/tokens/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/tokens/meta.json"}, data: {"title":"Tokens","pages":["fungible-tokens","fungible-token-metadata","non-fungible-token-metadata","semi-fungible-token-metadata"],"defaultOpen":false} }, { info: {"path":"stacks/token-metadata-api/client/tokens/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/client/tokens/meta.json"}, data: {"title":"Tokens","pages":["..."],"root":false,"defaultOpen":false} }]) \ No newline at end of file diff --git a/.source/source.config.mjs b/.source/source.config.mjs new file mode 100644 index 000000000..b97cb980c --- /dev/null +++ b/.source/source.config.mjs @@ -0,0 +1,35 @@ +// source.config.ts +import { + defineConfig, + defineDocs, + frontmatterSchema +} from "fumadocs-mdx/config"; +import { remarkCodeHike, recmaCodeHike } from "codehike/mdx"; +import { z } from "zod"; +var docs = defineDocs({ + dir: "content/docs", + docs: { + schema: frontmatterSchema.extend({ + llm: z.boolean().optional() + }) + }, + meta: { + // options for `meta` collection + } +}); +var chConfig = { + components: { + code: "DocsKitCode", + inlineCode: "DocsKitInlineCode" + } +}; +var source_config_default = defineConfig({ + mdxOptions: { + remarkPlugins: (v) => [[remarkCodeHike, chConfig], ...v], + recmaPlugins: [[recmaCodeHike, chConfig]] + } +}); +export { + source_config_default as default, + docs +}; diff --git a/bun.lock b/bun.lock new file mode 100644 index 000000000..13c2e5b87 --- /dev/null +++ b/bun.lock @@ -0,0 +1,1386 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "docs-v4", + "dependencies": { + "@apidevtools/swagger-parser": "^10.1.1", + "@fumadocs/cli": "^0.0.8", + "@hirosystems/clarinet-sdk-browser": "^2.15.2", + "@orama/orama": "^3.1.6", + "@orama/plugin-data-persistence": "^3.1.6", + "@radix-ui/react-avatar": "^1.1.3", + "@radix-ui/react-checkbox": "^1.1.4", + "@radix-ui/react-collapsible": "^1.1.3", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-dropdown-menu": "^2.1.6", + "@radix-ui/react-icons": "^1.3.2", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-navigation-menu": "^1.2.5", + "@radix-ui/react-popover": "^1.1.6", + "@radix-ui/react-scroll-area": "^1.2.3", + "@radix-ui/react-separator": "^1.1.2", + "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-tabs": "^1.1.3", + "@radix-ui/react-toggle": "^1.1.2", + "@radix-ui/react-toggle-group": "^1.1.2", + "@radix-ui/react-tooltip": "^1.1.8", + "@stacks/connect": "^8.1.6", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "codehike": "^1.0.5", + "date-fns": "^4.1.0", + "embla-carousel-react": "^8.6.0", + "fumadocs-core": "15.2.12", + "fumadocs-mdx": "11.5.6", + "fumadocs-openapi": "^7.0.1", + "fumadocs-ui": "15.0.16", + "fuse.js": "^7.1.0", + "gray-matter": "^4.0.3", + "lucide-react": "^0.482.0", + "next": "15.3.1", + "next-themes": "^0.4.4", + "next-validate-link": "^1.5.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "seti-icons": "^0.0.4", + "shiki": "^3.2.1", + "tailwind-merge": "^3.0.2", + "timeago.js": "^4.0.2", + "vaul": "^1.1.2", + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.0.12", + "@types/mdx": "^2.0.13", + "@types/node": "22.13.10", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "postcss": "^8.5.3", + "tailwindcss": "^4.0.12", + "typescript": "^5.8.2", + }, + }, + }, + "packages": { + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + + "@apidevtools/json-schema-ref-parser": ["@apidevtools/json-schema-ref-parser@11.7.2", "", { "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.0" } }, "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA=="], + + "@apidevtools/openapi-schemas": ["@apidevtools/openapi-schemas@2.1.0", "", {}, "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ=="], + + "@apidevtools/swagger-methods": ["@apidevtools/swagger-methods@3.0.2", "", {}, "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg=="], + + "@apidevtools/swagger-parser": ["@apidevtools/swagger-parser@10.1.1", "", { "dependencies": { "@apidevtools/json-schema-ref-parser": "11.7.2", "@apidevtools/openapi-schemas": "^2.1.0", "@apidevtools/swagger-methods": "^3.0.2", "@jsdevtools/ono": "^7.1.3", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "call-me-maybe": "^1.0.2" }, "peerDependencies": { "openapi-types": ">=7" } }, "sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA=="], + + "@clack/core": ["@clack/core@0.4.2", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg=="], + + "@clack/prompts": ["@clack/prompts@0.10.1", "", { "dependencies": { "@clack/core": "0.4.2", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-Q0T02vx8ZM9XSv9/Yde0jTmmBQufZhPJfYAg2XrrrxWWaZgq1rr8nU8Hv710BQ1dhoP8rtY7YUdpGej2Qza/cw=="], + + "@code-hike/lighter": ["@code-hike/lighter@1.0.1", "", { "dependencies": { "ansi-sequence-parser": "1.1.1" } }, "sha512-mccvcsk5UTScRrE02oBz1/qzckyhD8YE3VQlQv++2bSVVZgNuCUX8MpokSCi5OmfRAAxbj6kmNiqq1Um8eXPrw=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.4.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.2", "", { "os": "android", "cpu": "arm" }, "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.2", "", { "os": "android", "cpu": "arm64" }, "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.2", "", { "os": "android", "cpu": "x64" }, "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.2", "", { "os": "linux", "cpu": "arm" }, "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.2", "", { "os": "linux", "cpu": "x64" }, "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.2", "", { "os": "none", "cpu": "arm64" }, "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.2", "", { "os": "none", "cpu": "x64" }, "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.2", "", { "os": "win32", "cpu": "x64" }, "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA=="], + + "@floating-ui/core": ["@floating-ui/core@1.6.9", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.6.13", "", { "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.9" } }, "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.2", "", { "dependencies": { "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="], + + "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.6.1", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg=="], + + "@fumadocs/cli": ["@fumadocs/cli@0.0.8", "", { "dependencies": { "@clack/prompts": "^0.10.0", "commander": "^13.1.0", "execa": "^9.5.2", "package-manager-detector": "^0.2.9", "picocolors": "^1.1.1", "ts-morph": "^25.0.1" }, "bin": { "fumadocs": "dist/index.js" } }, "sha512-Cykk6jVDt1wHVOfas9S64TrF1uLgtV0ESLsXV5dgm1K5S9kyX+Nycogy/YTBqq05wuG7SI20byuUvX2QrUozSg=="], + + "@fumari/json-schema-to-typescript": ["@fumari/json-schema-to-typescript@1.1.3", "", { "dependencies": { "@apidevtools/json-schema-ref-parser": "^11.9.3", "js-yaml": "^4.1.0", "prettier": "^3.5.3" } }, "sha512-KnaZAo5W769nOaxhPqEMTdjHdngugxmPpNS+Yr2U90iVxgmNAWwhSr8Nx3l+CUehJKNFzJi2C7clQXOfuPJegA=="], + + "@hirosystems/clarinet-sdk-browser": ["@hirosystems/clarinet-sdk-browser@2.15.2", "", { "dependencies": { "@hirosystems/clarinet-sdk-wasm-browser": "2.15.1", "@stacks/transactions": "^6.13.0" } }, "sha512-IYXbbrDlEOUDnVbRgizLrLF/nN9/NitSKWU4mZaQ5NG2xpbbFYKqmhZy6WuCYyd8efyLyucnhk1xFpl8/Y8tNA=="], + + "@hirosystems/clarinet-sdk-wasm-browser": ["@hirosystems/clarinet-sdk-wasm-browser@2.15.1", "", {}, "sha512-64C/PC2CW98DkaOCpH2gtLpzaEcOWOWxrev98AyuMqKiBM/oi6DJIHgVqzR0ilN+XmHpt2H9NrG4UVQJpWR1Hw=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.1.0" }, "os": "darwin", "cpu": "arm64" }, "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.1.0" }, "os": "darwin", "cpu": "x64" }, "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.1.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.1.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.1.0", "", { "os": "linux", "cpu": "arm" }, "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew=="], + + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.1.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.1.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.1.0" }, "os": "linux", "cpu": "arm" }, "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.1.0" }, "os": "linux", "cpu": "arm64" }, "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.1.0" }, "os": "linux", "cpu": "s390x" }, "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.1.0" }, "os": "linux", "cpu": "x64" }, "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" }, "os": "linux", "cpu": "arm64" }, "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.1.0" }, "os": "linux", "cpu": "x64" }, "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.1", "", { "dependencies": { "@emnapi/runtime": "^1.4.0" }, "cpu": "none" }, "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.1", "", { "os": "win32", "cpu": "x64" }, "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw=="], + + "@jsdevtools/ono": ["@jsdevtools/ono@7.1.3", "", {}, "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="], + + "@mdx-js/mdx": ["@mdx-js/mdx@3.1.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw=="], + + "@msgpack/msgpack": ["@msgpack/msgpack@2.8.0", "", {}, "sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ=="], + + "@next/env": ["@next/env@15.3.1", "", {}, "sha512-cwK27QdzrMblHSn9DZRV+DQscHXRuJv6MydlJRpFSqJWZrTYMLzKDeyueJNN9MGd8NNiUKzDQADAf+dMLXX7YQ=="], + + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.3.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-hjDw4f4/nla+6wysBL07z52Gs55Gttp5Bsk5/8AncQLJoisvTBP0pRIBK/B16/KqQyH+uN4Ww8KkcAqJODYH3w=="], + + "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.3.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-q+aw+cJ2ooVYdCEqZVk+T4Ni10jF6Fo5DfpEV51OupMaV5XL6pf3GCzrk6kSSZBsMKZtVC1Zm/xaNBFpA6bJ2g=="], + + "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-wBQ+jGUI3N0QZyWmmvRHjXjTWFy8o+zPFLSOyAyGFI94oJi+kK/LIZFJXeykvgXUk1NLDAEFDZw/NVINhdk9FQ=="], + + "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-IIxXEXRti/AulO9lWRHiCpUUR8AR/ZYLPALgiIg/9ENzMzLn3l0NSxVdva7R/VDcuSEBo0eGVCe3evSIHNz0Hg=="], + + "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-bfI4AMhySJbyXQIKH5rmLJ5/BP7bPwuxauTvVEiJ/ADoddaA9fgyNNCcsbu9SlqfHDoZmfI6g2EjzLwbsVTr5A=="], + + "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-FeAbR7FYMWR+Z+M5iSGytVryKHiAsc0x3Nc3J+FD5NVbD5Mqz7fTSy8CYliXinn7T26nDMbpExRUI/4ekTvoiA=="], + + "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.3.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-yP7FueWjphQEPpJQ2oKmshk/ppOt+0/bB8JC8svPUZNy0Pi3KbPx2Llkzv1p8CoQa+D2wknINlJpHf3vtChVBw=="], + + "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.3.1", "", { "os": "win32", "cpu": "x64" }, "sha512-3PMvF2zRJAifcRNni9uMk/gulWfWS+qVI/pagd+4yLF5bcXPZPPH2xlYRYOsUjmCJOXSTAC2PjRzbhsRzR2fDQ=="], + + "@noble/hashes": ["@noble/hashes@1.1.5", "", {}, "sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ=="], + + "@noble/secp256k1": ["@noble/secp256k1@1.7.1", "", {}, "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@orama/orama": ["@orama/orama@3.1.6", "", {}, "sha512-qtSrqCqRU93SjEBedz987tvWao1YQSELjBhGkHYGVP7Dg0lBWP6d+uZEIt5gxTAYio/YWWlhivmRABvRfPLmnQ=="], + + "@orama/plugin-data-persistence": ["@orama/plugin-data-persistence@3.1.6", "", { "dependencies": { "@msgpack/msgpack": "^2.7.2", "@orama/orama": "3.1.6", "dpack": "^0.6.22" } }, "sha512-6he5bwPZUzC7D7WSaLg3kdIRjk/DsedpnJQDPuiDBL+TYBD9heBVZx19C9aypys7vojFj+3t0brHhccoM0vReA=="], + + "@radix-ui/number": ["@radix-ui/number@1.1.0", "", {}, "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ=="], + + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.1", "", {}, "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA=="], + + "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collapsible": "1.1.3", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-RIQ15mrcvqIkDARJeERSuXSry2N8uYnxkdDetpfmalT/+0ntOXLkFOsh9iwlAsCv+qcmhZjbdJogIm6WBa6c4A=="], + + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg=="], + + "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.3", "", { "dependencies": { "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Paen00T4P8L8gd9bNsRMw7Cbaz85oxiv+hzomsRZgFm2byltPFDtfcoqlWJ8GyZlIBWgLssJlzLCnKU0G0302g=="], + + "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.1.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-use-size": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw=="], + + "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-jFSerheto1X03MUC0g6R7LedNW9EEGWdg9W1+MlpkMLwGkgkbUXLPBH/KIuWKXUoeYRVY11llqbTBDzuLg7qrw=="], + + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw=="], + + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q=="], + + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw=="], + + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg=="], + + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-escape-keydown": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg=="], + + "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-menu": "2.1.6", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA=="], + + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg=="], + + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA=="], + + "@radix-ui/react-icons": ["@radix-ui/react-icons@1.3.2", "", { "peerDependencies": { "react": "^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc" } }, "sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g=="], + + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA=="], + + "@radix-ui/react-label": ["@radix-ui/react-label@2.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw=="], + + "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-callback-ref": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg=="], + + "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-myMHHQUZ3ZLTi8W381/Vu43Ia0NqakkQZ2vzynMmTUtQQ9kNkjzhOwkZC9TAM5R07OZUVIQyHC06f/9JZJpvvA=="], + + "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg=="], + + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.2", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-rect": "1.1.0", "@radix-ui/react-use-size": "1.1.0", "@radix-ui/rect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA=="], + + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA=="], + + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg=="], + + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.0.2", "", { "dependencies": { "@radix-ui/react-slot": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w=="], + + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw=="], + + "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.3", "", { "dependencies": { "@radix-ui/number": "1.1.0", "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-l7+NNBfBYYJa9tNqVcP2AGvxdE3lmE6kFTBXdvHgUaZuy+4wGCL1Cl2AfaR7RKyimj7lZURGLwFO59k4eBnDJQ=="], + + "@radix-ui/react-select": ["@radix-ui/react-select@2.1.6", "", { "dependencies": { "@radix-ui/number": "1.1.0", "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.2", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.2", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-previous": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg=="], + + "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ=="], + + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng=="], + + "@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-lntKchNWx3aCHuWKiDY+8WudiegQvBpDRAYL8dKLRvKEH8VOpl0XX6SSU/bUBqIRJbcTy4+MW06Wv8vgp10rzQ=="], + + "@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-roving-focus": "1.1.2", "@radix-ui/react-toggle": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-JBm6s6aVG/nwuY5eadhU2zDi/IwYS0sDM5ZWb4nymv/hn3hZdkw+gENn0LP4iY1yCd7+bgJaCwueMYJIU3vk4A=="], + + "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.1.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.5", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.2", "@radix-ui/react-portal": "1.1.4", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.2", "@radix-ui/react-slot": "1.1.2", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA=="], + + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw=="], + + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw=="], + + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw=="], + + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w=="], + + "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og=="], + + "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.0", "", { "dependencies": { "@radix-ui/rect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ=="], + + "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw=="], + + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.1.2", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q=="], + + "@radix-ui/rect": ["@radix-ui/rect@1.1.0", "", {}, "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg=="], + + "@scalar/openapi-parser": ["@scalar/openapi-parser@0.10.14", "", { "dependencies": { "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "jsonpointer": "^5.0.1", "leven": "^4.0.0", "yaml": "^2.4.5" } }, "sha512-VXr979NMx6wZ+kpFKor2eyCJZOjyMwcBRc6c4Gc92ZMOC7ZNYqjwbw+Ubh2ELJyP5cWAjOFSrNwtylema0pw5w=="], + + "@scure/base": ["@scure/base@1.2.4", "", {}, "sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ=="], + + "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], + + "@shikijs/core": ["@shikijs/core@3.2.1", "", { "dependencies": { "@shikijs/types": "3.2.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-FhsdxMWYu/C11sFisEp7FMGBtX/OSSbnXZDMBhGuUDBNTdsoZlMSgQv5f90rwvzWAdWIW6VobD+G3IrazxA6dQ=="], + + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.2.1", "", { "dependencies": { "@shikijs/types": "3.2.1", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.1.0" } }, "sha512-eMdcUzN3FMQYxOmRf2rmU8frikzoSHbQDFH2hIuXsrMO+IBOCI9BeeRkCiBkcLDHeRKbOCtYMJK3D6U32ooU9Q=="], + + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.2.1", "", { "dependencies": { "@shikijs/types": "3.2.1", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-wZZAkayEn6qu2+YjenEoFqj0OyQI64EWsNR6/71d1EkG4sxEOFooowKivsWPpaWNBu3sxAG+zPz5kzBL/SsreQ=="], + + "@shikijs/langs": ["@shikijs/langs@3.2.1", "", { "dependencies": { "@shikijs/types": "3.2.1" } }, "sha512-If0iDHYRSGbihiA8+7uRsgb1er1Yj11pwpX1c6HLYnizDsKAw5iaT3JXj5ZpaimXSWky/IhxTm7C6nkiYVym+A=="], + + "@shikijs/rehype": ["@shikijs/rehype@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@types/hast": "^3.0.4", "hast-util-to-string": "^3.0.1", "shiki": "3.3.0", "unified": "^11.0.5", "unist-util-visit": "^5.0.0" } }, "sha512-m9clrxedJHyKDwYoAkIUJ7thWGSZwZbA0PeGDST7NHCTGeS227BFn8Hoq2olAtxXo14k5T1JcUCDgyaRZfI4Hw=="], + + "@shikijs/themes": ["@shikijs/themes@3.2.1", "", { "dependencies": { "@shikijs/types": "3.2.1" } }, "sha512-k5DKJUT8IldBvAm8WcrDT5+7GA7se6lLksR+2E3SvyqGTyFMzU2F9Gb7rmD+t+Pga1MKrYFxDIeyWjMZWM6uBQ=="], + + "@shikijs/transformers": ["@shikijs/transformers@3.3.0", "", { "dependencies": { "@shikijs/core": "3.3.0", "@shikijs/types": "3.3.0" } }, "sha512-PIknEyxfkT7i7at/78ynVmuZEv4+7IcS37f6abxMjQ0pVIPEya8n+KNl7XtfbhNL+U9ElR3UzfSzuD5l5Iu+nw=="], + + "@shikijs/types": ["@shikijs/types@3.2.1", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-/NTWAk4KE2M8uac0RhOsIhYQf4pdU0OywQuYDGIGAJ6Mjunxl2cGiuLkvu4HLCMn+OTTLRWkjZITp+aYJv60yA=="], + + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], + + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], + + "@stacks/common": ["@stacks/common@7.0.2", "", {}, "sha512-+RSecHdkxOtswmE4tDDoZlYEuULpnTQVeDIG5eZ32opK8cFxf4EugAcK9CsIsHx/Se1yTEaQ21WGATmJGK84lQ=="], + + "@stacks/connect": ["@stacks/connect@8.1.8", "", { "dependencies": { "@scure/base": "^1.2.4", "@stacks/common": "^7.0.0", "@stacks/connect-ui": "8.0.0", "@stacks/network": "^7.0.0", "@stacks/network-v6": "npm:@stacks/network@^6.16.0", "@stacks/profile": "^7.0.0", "@stacks/transactions": "^7.0.0", "@stacks/transactions-v6": "npm:@stacks/transactions@^6.16.0" } }, "sha512-RmnguqBilsRKjUqqrPFp7QwnB+Ae8eCFlHWtDMZLtUKTbRHa2ZjOGLNFB6rT2iOPf90hTspomACXvaO+6ZFkWg=="], + + "@stacks/connect-ui": ["@stacks/connect-ui@8.0.0", "", { "dependencies": { "@stencil/core": "^2.17.1" } }, "sha512-m8yqg28EWQCATkVxILotzbqvcnk0n+qhyncTTNEYXVe4VnfV0eRXvxX88nbA/fot1k+MuQlMu3WhrBFLHJ/xzA=="], + + "@stacks/network": ["@stacks/network@7.0.2", "", { "dependencies": { "@stacks/common": "^7.0.2", "cross-fetch": "^3.1.5" } }, "sha512-XzHnoWqku/jRrTgMXhmh3c+I0O9vDH24KlhzGDZtBu+8CGGyHNPAZzGwvoUShonMXrXjEnfO9IYQwV5aJhfv6g=="], + + "@stacks/network-v6": ["@stacks/network@6.17.0", "", { "dependencies": { "@stacks/common": "^6.16.0", "cross-fetch": "^3.1.5" } }, "sha512-numHbfKjwco/rbkGPOEz8+FcJ2nBnS/tdJ8R422Q70h3SiA9eqk9RjSzB8p4JP8yW1SZvW+eihADHfMpBuZyfw=="], + + "@stacks/profile": ["@stacks/profile@7.0.5", "", { "dependencies": { "@stacks/common": "^7.0.2", "@stacks/network": "^7.0.2", "@stacks/transactions": "^7.0.5", "jsontokens": "^4.0.1", "schema-inspector": "^2.0.2", "zone-file": "^2.0.0-beta.3" } }, "sha512-XZfIkq2DkEaCT5mKTFhiQ1WF4CGH6LEnUHz9UPGQdlWRsUR9T3ZhTCuKvLinFoZ049JEXcsaUYLhxAihVcmjlA=="], + + "@stacks/transactions": ["@stacks/transactions@6.17.0", "", { "dependencies": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", "@stacks/common": "^6.16.0", "@stacks/network": "^6.17.0", "c32check": "^2.0.0", "lodash.clonedeep": "^4.5.0" } }, "sha512-FUah2BRgV66ApLcEXGNGhwyFTRXqX5Zco3LpiM3essw8PF0NQlHwwdPgtDko5RfrJl3LhGXXe/30nwsfNnB3+g=="], + + "@stacks/transactions-v6": ["@stacks/transactions@6.17.0", "", { "dependencies": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", "@stacks/common": "^6.16.0", "@stacks/network": "^6.17.0", "c32check": "^2.0.0", "lodash.clonedeep": "^4.5.0" } }, "sha512-FUah2BRgV66ApLcEXGNGhwyFTRXqX5Zco3LpiM3essw8PF0NQlHwwdPgtDko5RfrJl3LhGXXe/30nwsfNnB3+g=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], + + "@stencil/core": ["@stencil/core@2.22.3", "", { "bin": { "stencil": "bin/stencil" } }, "sha512-kmVA0M/HojwsfkeHsifvHVIYe4l5tin7J5+DLgtl8h6WWfiMClND5K3ifCXXI2ETDNKiEk21p6jql3Fx9o2rng=="], + + "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], + + "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.1.3", "", { "dependencies": { "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.29.2", "tailwindcss": "4.1.3" } }, "sha512-H/6r6IPFJkCfBJZ2dKZiPJ7Ueb2wbL592+9bQEl2r73qbX6yGnmQVIfiUvDRB2YI0a3PWDrzUwkvQx1XW1bNkA=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.3", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.3", "@tailwindcss/oxide-darwin-arm64": "4.1.3", "@tailwindcss/oxide-darwin-x64": "4.1.3", "@tailwindcss/oxide-freebsd-x64": "4.1.3", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.3", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.3", "@tailwindcss/oxide-linux-arm64-musl": "4.1.3", "@tailwindcss/oxide-linux-x64-gnu": "4.1.3", "@tailwindcss/oxide-linux-x64-musl": "4.1.3", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.3", "@tailwindcss/oxide-win32-x64-msvc": "4.1.3" } }, "sha512-t16lpHCU7LBxDe/8dCj9ntyNpXaSTAgxWm1u2XQP5NiIu4KGSyrDJJRlK9hJ4U9yJxx0UKCVI67MJWFNll5mOQ=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.3", "", { "os": "android", "cpu": "arm64" }, "sha512-cxklKjtNLwFl3mDYw4XpEfBY+G8ssSg9ADL4Wm6//5woi3XGqlxFsnV5Zb6v07dxw1NvEX2uoqsxO/zWQsgR+g=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-mqkf2tLR5VCrjBvuRDwzKNShRu99gCAVMkVsaEOFvv6cCjlEKXRecPu9DEnxp6STk5z+Vlbh1M5zY3nQCXMXhw=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-7sGraGaWzXvCLyxrc7d+CCpUN3fYnkkcso3rCzwUmo/LteAl2ZGCDlGvDD8Y/1D3ngxT8KgDj1DSwOnNewKhmg=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-E2+PbcbzIReaAYZe997wb9rId246yDkCwAakllAWSGqe6VTg9hHle67hfH6ExjpV2LSK/siRzBUs5wVff3RW9w=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.3", "", { "os": "linux", "cpu": "arm" }, "sha512-GvfbJ8wjSSjbLFFE3UYz4Eh8i4L6GiEYqCtA8j2Zd2oXriPuom/Ah/64pg/szWycQpzRnbDiJozoxFU2oJZyfg=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-35UkuCWQTeG9BHcBQXndDOrpsnt3Pj9NVIB4CgNiKmpG8GnCNXeMczkUpOoqcOhO6Cc/mM2W7kaQ/MTEENDDXg=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-dm18aQiML5QCj9DQo7wMbt1Z2tl3Giht54uVR87a84X8qRtuXxUqnKQkRDK5B4bCOmcZ580lF9YcoMkbDYTXHQ=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.3", "", { "os": "linux", "cpu": "x64" }, "sha512-LMdTmGe/NPtGOaOfV2HuO7w07jI3cflPrVq5CXl+2O93DCewADK0uW1ORNAcfu2YxDUS035eY2W38TxrsqngxA=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.3", "", { "os": "linux", "cpu": "x64" }, "sha512-aalNWwIi54bbFEizwl1/XpmdDrOaCjRFQRgtbv9slWjmNPuJJTIKPHf5/XXDARc9CneW9FkSTqTbyvNecYAEGw=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-PEj7XR4OGTGoboTIAdXicKuWl4EQIjKHKuR+bFy9oYN7CFZo0eu74+70O4XuERX4yjqVZGAkCdglBODlgqcCXg=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.3", "", { "os": "win32", "cpu": "x64" }, "sha512-T8gfxECWDBENotpw3HR9SmNiHC9AOJdxs+woasRZ8Q/J4VHN0OMs7F+4yVNZ9EVN26Wv6mZbK0jv7eHYuLJLwA=="], + + "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.3", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.3", "@tailwindcss/oxide": "4.1.3", "postcss": "^8.4.41", "tailwindcss": "4.1.3" } }, "sha512-6s5nJODm98F++QT49qn8xJKHQRamhYHfMi3X7/ltxiSQ9dyRsaFSfFkfaMsanWzf+TMYQtbk8mt5f6cCVXJwfg=="], + + "@ts-morph/common": ["@ts-morph/common@0.26.1", "", { "dependencies": { "fast-glob": "^3.3.2", "minimatch": "^9.0.4", "path-browserify": "^1.0.1" } }, "sha512-Sn28TGl/4cFpcM+jwsH1wLncYq3FtN/BIpem+HOygfBWPT5pAeS5dB4VFVzV8FbnOKHpDLZmvAl4AjPEev5idA=="], + + "@types/bn.js": ["@types/bn.js@5.1.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w=="], + + "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], + + "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="], + + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/node": ["@types/node@22.13.10", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw=="], + + "@types/q": ["@types/q@1.5.8", "", {}, "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw=="], + + "@types/react": ["@types/react@19.1.0", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w=="], + + "@types/react-dom": ["@types/react-dom@19.1.1", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-jFf/woGTVTjUJsl2O7hcopJ1r0upqoq/vIOoCj0yLh3RIXxWcljlpuZ+vEBRXsymD1jhfeJrlyTy/S1UW+4y1w=="], + + "@types/svgo": ["@types/svgo@1.3.6", "", {}, "sha512-AZU7vQcy/4WFEuwnwsNsJnFwupIpbllH1++LXScN6uxT1Z4zPzdrWG97w4/I7eFKFTvfy/bHFStWjdBAg2Vjug=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="], + + "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], + + "ansi-sequence-parser": ["ansi-sequence-parser@1.1.1", "", {}, "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg=="], + + "ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-hidden": ["aria-hidden@1.2.4", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A=="], + + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], + + "array.prototype.reduce": ["array.prototype.reduce@1.0.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-array-method-boxes-properly": "^1.0.0", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "is-string": "^1.1.1" } }, "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw=="], + + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], + + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], + + "async": ["async@2.6.4", "", { "dependencies": { "lodash": "^4.17.14" } }, "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA=="], + + "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base-x": ["base-x@4.0.1", "", {}, "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="], + + "c32check": ["c32check@2.0.0", "", { "dependencies": { "@noble/hashes": "^1.1.2", "base-x": "^4.0.0" } }, "sha512-rpwfAcS/CMqo0oCqDf3r9eeLgScRE3l/xHDCXhM3UyrfvIn7PrLq63uHh7yYbv8NzaZn5MVsVhIRpQ+5GZ5HyA=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "call-me-maybe": ["call-me-maybe@1.0.2", "", {}, "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001712", "", {}, "sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + + "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "cmdk": ["cmdk@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "^1.1.1", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-id": "^1.1.0", "@radix-ui/react-primitive": "^2.0.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg=="], + + "coa": ["coa@2.0.2", "", { "dependencies": { "@types/q": "^1.5.1", "chalk": "^2.4.1", "q": "^1.1.2" } }, "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA=="], + + "code-block-writer": ["code-block-writer@13.0.3", "", {}, "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg=="], + + "codehike": ["codehike@1.0.5", "", { "dependencies": { "@code-hike/lighter": "1.0.1", "diff": "^5.1.0", "estree-util-visit": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-y3lL/3nPcvT7GNuEKw687AIip1Mg864lA/knWcCGn7Yp2FBQovsPqPTCpf/aodzWZ12HjWGfli+oxaSeuSyFXg=="], + + "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], + + "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "commander": ["commander@13.1.0", "", {}, "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw=="], + + "compute-scroll-into-view": ["compute-scroll-into-view@3.1.1", "", {}, "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw=="], + + "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "css-select": ["css-select@2.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^3.2.1", "domutils": "^1.7.0", "nth-check": "^1.0.2" } }, "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ=="], + + "css-select-base-adapter": ["css-select-base-adapter@0.1.1", "", {}, "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="], + + "css-tree": ["css-tree@1.0.0-alpha.37", "", { "dependencies": { "mdn-data": "2.0.4", "source-map": "^0.6.1" } }, "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg=="], + + "css-what": ["css-what@3.4.2", "", {}, "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csso": ["csso@4.2.0", "", { "dependencies": { "css-tree": "^1.1.2" } }, "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], + + "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], + + "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], + + "date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="], + + "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + + "decode-named-character-reference": ["decode-named-character-reference@1.1.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="], + + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "diff": ["diff@5.2.0", "", {}, "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A=="], + + "dom-serializer": ["dom-serializer@0.2.2", "", { "dependencies": { "domelementtype": "^2.0.1", "entities": "^2.0.0" } }, "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g=="], + + "domelementtype": ["domelementtype@1.3.1", "", {}, "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="], + + "domutils": ["domutils@1.7.0", "", { "dependencies": { "dom-serializer": "0", "domelementtype": "1" } }, "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg=="], + + "dpack": ["dpack@0.6.22", "", {}, "sha512-WGPNlW2OAE7Bj0eODMpAHUcEqxrlg01e9OFZDxQodminIgC194/cRHT7K04Z1j7AUEWTeeplYGrIv/xRdwU9Hg=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "embla-carousel": ["embla-carousel@8.6.0", "", {}, "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA=="], + + "embla-carousel-react": ["embla-carousel-react@8.6.0", "", { "dependencies": { "embla-carousel": "8.6.0", "embla-carousel-reactive-utils": "8.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA=="], + + "embla-carousel-reactive-utils": ["embla-carousel-reactive-utils@8.6.0", "", { "peerDependencies": { "embla-carousel": "8.6.0" } }, "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A=="], + + "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="], + + "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], + + "entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], + + "es-abstract": ["es-abstract@1.23.9", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-regex": "^1.2.1", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.0", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.18" } }, "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA=="], + + "es-array-method-boxes-properly": ["es-array-method-boxes-properly@1.0.0", "", {}, "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], + + "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], + + "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], + + "esbuild": ["esbuild@0.25.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.2", "@esbuild/android-arm": "0.25.2", "@esbuild/android-arm64": "0.25.2", "@esbuild/android-x64": "0.25.2", "@esbuild/darwin-arm64": "0.25.2", "@esbuild/darwin-x64": "0.25.2", "@esbuild/freebsd-arm64": "0.25.2", "@esbuild/freebsd-x64": "0.25.2", "@esbuild/linux-arm": "0.25.2", "@esbuild/linux-arm64": "0.25.2", "@esbuild/linux-ia32": "0.25.2", "@esbuild/linux-loong64": "0.25.2", "@esbuild/linux-mips64el": "0.25.2", "@esbuild/linux-ppc64": "0.25.2", "@esbuild/linux-riscv64": "0.25.2", "@esbuild/linux-s390x": "0.25.2", "@esbuild/linux-x64": "0.25.2", "@esbuild/netbsd-arm64": "0.25.2", "@esbuild/netbsd-x64": "0.25.2", "@esbuild/openbsd-arm64": "0.25.2", "@esbuild/openbsd-x64": "0.25.2", "@esbuild/sunos-x64": "0.25.2", "@esbuild/win32-arm64": "0.25.2", "@esbuild/win32-ia32": "0.25.2", "@esbuild/win32-x64": "0.25.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ=="], + + "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], + + "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], + + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], + + "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="], + + "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="], + + "estree-util-value-to-estree": ["estree-util-value-to-estree@3.3.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-Db+m1WSD4+mUO7UgMeKkAwdbfNWwIxLt48XF2oFU9emPfXkIu+k5/nlOj313v7wqtAPo0f9REhUvznFrPkG8CQ=="], + + "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "execa": ["execa@9.5.2", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.3", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.0", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.0.0" } }, "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="], + + "fast-xml-parser": ["fast-xml-parser@4.5.3", "", { "dependencies": { "strnum": "^1.1.1" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + + "foreach": ["foreach@2.0.6", "", {}, "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg=="], + + "fumadocs-core": ["fumadocs-core@15.2.12", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.6.1", "@orama/orama": "^3.1.6", "@shikijs/rehype": "^3.3.0", "@shikijs/transformers": "^3.3.0", "github-slugger": "^2.0.0", "hast-util-to-estree": "^3.1.3", "hast-util-to-jsx-runtime": "^2.3.6", "image-size": "^2.0.2", "negotiator": "^1.0.0", "react-remove-scroll": "^2.6.3", "remark": "^15.0.0", "remark-gfm": "^4.0.1", "scroll-into-view-if-needed": "^3.1.0", "shiki": "^3.3.0", "unist-util-visit": "^5.0.0" }, "peerDependencies": { "@oramacloud/client": "1.x.x || 2.x.x", "algoliasearch": "4.24.0", "next": "14.x.x || 15.x.x", "react": "18.x.x || 19.x.x", "react-dom": "18.x.x || 19.x.x" }, "optionalPeers": ["@oramacloud/client", "algoliasearch", "next", "react", "react-dom"] }, "sha512-Edqq/HkrbEtHM0kfvpn5jPPpNxcHEyFDc+KYnfKACOzNHRsxkANC6/U5w6XbXM38YfnTzvSnQFU63qwXm0A8xQ=="], + + "fumadocs-mdx": ["fumadocs-mdx@11.5.6", "", { "dependencies": { "@mdx-js/mdx": "^3.1.0", "@standard-schema/spec": "^1.0.0", "chokidar": "^4.0.3", "cross-spawn": "^7.0.6", "esbuild": "^0.25.0", "estree-util-value-to-estree": "^3.3.2", "fast-glob": "^3.3.3", "gray-matter": "^4.0.3", "unist-util-visit": "^5.0.0", "zod": "^3.24.2" }, "peerDependencies": { "@fumadocs/mdx-remote": "^1.2.0", "fumadocs-core": "^14.0.0 || ^15.0.0", "next": "14.x.x || 15.x.x" }, "optionalPeers": ["@fumadocs/mdx-remote"], "bin": { "fumadocs-mdx": "bin.js" } }, "sha512-XhzfR7WsI4qO9EdmRZQc/mRxMkSY2HQ7Fg2fv7ia4R3LN0Km7X8KSEry9lU2c0XmSHcospniW5o1FFgsAq4+mQ=="], + + "fumadocs-openapi": ["fumadocs-openapi@7.0.13", "", { "dependencies": { "@fumari/json-schema-to-typescript": "^1.1.3", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-select": "^2.1.6", "@radix-ui/react-slot": "^1.1.2", "@scalar/openapi-parser": "0.10.14", "ajv-draft-04": "^1.0.0", "class-variance-authority": "^0.7.1", "fast-glob": "^3.3.3", "fumadocs-core": "15.2.5", "fumadocs-ui": "15.2.5", "github-slugger": "^2.0.0", "hast-util-to-jsx-runtime": "^2.3.6", "js-yaml": "^4.1.0", "lucide-react": "^0.487.0", "next-themes": "^0.4.6", "openapi-sampler": "^1.6.1", "react-hook-form": "^7.55.0", "remark": "^15.0.1", "remark-rehype": "^11.1.2", "shiki": "^3.2.1", "xml-js": "^1.6.11" }, "peerDependencies": { "@scalar/api-client-react": "*", "next": "14.x.x || 15.x.x", "react": "18.x.x || 19.x.x", "react-dom": "18.x.x || 19.x.x" }, "optionalPeers": ["@scalar/api-client-react"] }, "sha512-S1I/OiyP6dpkvlUINSoYr2KsXgbky1VypbzYGYLki764EMwYWsdYo5KGbbehJHFHKQh0bRjBIcaczrOVV9pNfw=="], + + "fumadocs-ui": ["fumadocs-ui@15.0.16", "", { "dependencies": { "@radix-ui/react-accordion": "^1.2.3", "@radix-ui/react-collapsible": "^1.1.3", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-direction": "^1.1.0", "@radix-ui/react-navigation-menu": "^1.2.5", "@radix-ui/react-popover": "^1.1.6", "@radix-ui/react-scroll-area": "^1.2.3", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-tabs": "^1.1.3", "class-variance-authority": "^0.7.1", "lodash.merge": "^4.6.2", "lucide-react": "^0.479.0", "next-themes": "^0.4.4", "postcss-selector-parser": "^7.1.0", "react-medium-image-zoom": "^5.2.14", "tailwind-merge": "^3.0.2" }, "peerDependencies": { "fumadocs-core": "15.0.16", "next": "14.x.x || 15.x.x", "react": "18.x.x || 19.x.x", "react-dom": "18.x.x || 19.x.x", "tailwindcss": "^3.4.14 || ^4.0.0" }, "optionalPeers": ["tailwindcss"] }, "sha512-j/fTDaEPObpEV2ABrSpEWdmETMZiLreMGmNz9Ui+4uUD/FSNtf4X5D2PyfSjh2NONg0uq/1hbNuMv7vyCv+Zxg=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], + + "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + + "fuse.js": ["fuse.js@7.1.0", "", {}, "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], + + "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], + + "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="], + + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + + "has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], + + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], + + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], + + "hast-util-to-string": ["hast-util-to-string@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + + "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="], + + "image-size": ["image-size@2.0.2", "", { "bin": { "image-size": "bin/image-size.js" } }, "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w=="], + + "inline-style-parser": ["inline-style-parser@0.2.4", "", {}, "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q=="], + + "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], + + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + + "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], + + "is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], + + "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], + + "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], + + "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], + + "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], + + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + + "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], + + "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], + + "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], + + "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="], + + "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], + + "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], + + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], + + "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], + + "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], + + "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "json-pointer": ["json-pointer@0.6.2", "", { "dependencies": { "foreach": "^2.0.4" } }, "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw=="], + + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "jsonpointer": ["jsonpointer@5.0.1", "", {}, "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ=="], + + "jsontokens": ["jsontokens@4.0.1", "", { "dependencies": { "@noble/hashes": "^1.1.2", "@noble/secp256k1": "^1.6.3", "base64-js": "^1.5.1" } }, "sha512-+MO415LEN6M+3FGsRz4wU20g7N2JA+2j9d9+pGaNJHviG4L8N0qzavGyENw6fJqsq9CcrHOIL6iWX5yeTZ86+Q=="], + + "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], + + "leven": ["leven@4.0.0", "", {}, "sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw=="], + + "lightningcss": ["lightningcss@1.29.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.29.2", "lightningcss-darwin-x64": "1.29.2", "lightningcss-freebsd-x64": "1.29.2", "lightningcss-linux-arm-gnueabihf": "1.29.2", "lightningcss-linux-arm64-gnu": "1.29.2", "lightningcss-linux-arm64-musl": "1.29.2", "lightningcss-linux-x64-gnu": "1.29.2", "lightningcss-linux-x64-musl": "1.29.2", "lightningcss-win32-arm64-msvc": "1.29.2", "lightningcss-win32-x64-msvc": "1.29.2" } }, "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.29.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.29.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.29.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.29.2", "", { "os": "linux", "cpu": "arm" }, "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.29.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.29.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.29.2", "", { "os": "linux", "cpu": "x64" }, "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.29.2", "", { "os": "linux", "cpu": "x64" }, "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.29.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.29.2", "", { "os": "win32", "cpu": "x64" }, "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash.clonedeep": ["lodash.clonedeep@4.5.0", "", {}, "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + + "lucide-react": ["lucide-react@0.482.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-XM8PzHzSrg8ATmmO+fzf+JyYlVVdQnJjuyLDj2p4V2zEtcKeBNAqAoJIGFv1x2HSBa7kT8gpYUxwdQ0g7nypfw=="], + + "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], + + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], + + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="], + + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], + + "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], + + "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], + + "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="], + + "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], + + "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + + "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], + + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="], + + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], + + "mdn-data": ["mdn-data@2.0.4", "", {}, "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], + + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], + + "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], + + "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], + + "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], + + "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="], + + "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], + + "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + + "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], + + "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], + + "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], + + "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], + + "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], + + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + + "next": ["next@15.3.1", "", { "dependencies": { "@next/env": "15.3.1", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.1", "@next/swc-darwin-x64": "15.3.1", "@next/swc-linux-arm64-gnu": "15.3.1", "@next/swc-linux-arm64-musl": "15.3.1", "@next/swc-linux-x64-gnu": "15.3.1", "@next/swc-linux-x64-musl": "15.3.1", "@next/swc-win32-arm64-msvc": "15.3.1", "@next/swc-win32-x64-msvc": "15.3.1", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-8+dDV0xNLOgHlyBxP1GwHGVaNXsmp+2NhZEYrXr24GWLHtt27YrBPbPuHvzlhi7kZNYjeJNR93IF5zfFu5UL0g=="], + + "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], + + "next-validate-link": ["next-validate-link@1.5.2", "", { "dependencies": { "fast-glob": "^3.3.3", "gray-matter": "^4.0.3", "picocolors": "^1.1.1", "remark": "^15.0.1", "remark-gfm": "^4.0.1", "unist-util-visit": "^5.0.0" } }, "sha512-BMGyo0qJqscSJw0gSCUy3gDrF7LEID6qkVhHtLSIdPPtOYONq0+fidWvLteUzEUqHeKz1GBI9QN3bpfT6Me42A=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], + + "nth-check": ["nth-check@1.0.2", "", { "dependencies": { "boolbase": "~1.0.0" } }, "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "object.getownpropertydescriptors": ["object.getownpropertydescriptors@2.1.8", "", { "dependencies": { "array.prototype.reduce": "^1.0.6", "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0", "gopd": "^1.0.1", "safe-array-concat": "^1.1.2" } }, "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A=="], + + "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], + + "oniguruma-parser": ["oniguruma-parser@0.5.4", "", {}, "sha512-yNxcQ8sKvURiTwP0mV6bLQCYE7NKfKRRWunhbZnXgxSmB1OXa1lHrN3o4DZd+0Si0kU5blidK7BcROO8qv5TZA=="], + + "oniguruma-to-es": ["oniguruma-to-es@4.1.0", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "oniguruma-parser": "^0.5.4", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-SNwG909cSLo4vPyyPbU/VJkEc9WOXqu2ycBlfd1UCXLqk1IijcQktSBb2yRQ2UFPsDhpkaf+C1dtT3PkLK/yWA=="], + + "openapi-sampler": ["openapi-sampler@1.6.1", "", { "dependencies": { "@types/json-schema": "^7.0.7", "fast-xml-parser": "^4.5.0", "json-pointer": "0.6.2" } }, "sha512-s1cIatOqrrhSj2tmJ4abFYZQK6l5v+V4toO5q1Pa0DyN8mtyqy2I+Qrj5W9vOELEtybIMQs/TBZGVO/DtTFK8w=="], + + "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], + + "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + + "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], + + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + + "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], + + "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + + "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], + + "postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], + + "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], + + "pretty-ms": ["pretty-ms@9.2.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg=="], + + "property-information": ["property-information@7.0.0", "", {}, "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg=="], + + "q": ["q@1.5.1", "", {}, "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw=="], + + "quansync": ["quansync@0.2.10", "", {}, "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="], + + "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="], + + "react-hook-form": ["react-hook-form@7.55.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-XRnjsH3GVMQz1moZTW53MxfoWN7aDpUg/GpVNc4A3eXRVNdGXfbzJ4vM4aLQ8g6XCUh1nIbx70aaNCl7kxnjog=="], + + "react-medium-image-zoom": ["react-medium-image-zoom@5.2.14", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-nfTVYcAUnBzXQpPDcZL+cG/e6UceYUIG+zDcnemL7jtAqbJjVVkA85RgneGtJeni12dTyiRPZVM6Szkmwd/o8w=="], + + "react-remove-scroll": ["react-remove-scroll@2.6.3", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ=="], + + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], + + "recma-jsx": ["recma-jsx@1.0.0", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" } }, "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q=="], + + "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="], + + "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], + + "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], + + "regex": ["regex@6.0.1", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA=="], + + "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], + + "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], + + "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], + + "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="], + + "remark": ["remark@15.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A=="], + + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + + "remark-mdx": ["remark-mdx@3.1.0", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], + + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], + + "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + + "sax": ["sax@1.4.1", "", {}, "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="], + + "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], + + "schema-inspector": ["schema-inspector@2.1.0", "", { "dependencies": { "async": "~2.6.3" } }, "sha512-3bmQVhbA01/EW8cZin4vIpqlpNU2SIy4BhKCfCgogJ3T/L76dLx3QAE+++4o+dNT33sa+SN9vOJL7iHiHFjiNg=="], + + "scroll-into-view-if-needed": ["scroll-into-view-if-needed@3.1.0", "", { "dependencies": { "compute-scroll-into-view": "^3.0.2" } }, "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ=="], + + "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="], + + "semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], + + "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], + + "seti-icons": ["seti-icons@0.0.4", "", { "dependencies": { "@types/svgo": "^1.3.2", "svgo": "^1.3.2" } }, "sha512-DXP6OzUzPtfSHQHKQ++U4mFByATGlN/fs5e43W3EAUtWf1FKauA3Li6Z2SQDB70l1m1Kr0mYzCtP6TsvRYT4Uw=="], + + "sharp": ["sharp@0.34.1", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.7.1" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.1", "@img/sharp-darwin-x64": "0.34.1", "@img/sharp-libvips-darwin-arm64": "1.1.0", "@img/sharp-libvips-darwin-x64": "1.1.0", "@img/sharp-libvips-linux-arm": "1.1.0", "@img/sharp-libvips-linux-arm64": "1.1.0", "@img/sharp-libvips-linux-ppc64": "1.1.0", "@img/sharp-libvips-linux-s390x": "1.1.0", "@img/sharp-libvips-linux-x64": "1.1.0", "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", "@img/sharp-libvips-linuxmusl-x64": "1.1.0", "@img/sharp-linux-arm": "0.34.1", "@img/sharp-linux-arm64": "0.34.1", "@img/sharp-linux-s390x": "0.34.1", "@img/sharp-linux-x64": "0.34.1", "@img/sharp-linuxmusl-arm64": "0.34.1", "@img/sharp-linuxmusl-x64": "0.34.1", "@img/sharp-wasm32": "0.34.1", "@img/sharp-win32-ia32": "0.34.1", "@img/sharp-win32-x64": "0.34.1" } }, "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shiki": ["shiki@3.2.1", "", { "dependencies": { "@shikijs/core": "3.2.1", "@shikijs/engine-javascript": "3.2.1", "@shikijs/engine-oniguruma": "3.2.1", "@shikijs/langs": "3.2.1", "@shikijs/themes": "3.2.1", "@shikijs/types": "3.2.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-VML/2o1/KGYkEf/stJJ+s9Ypn7jUKQPomGLGYso4JJFMFxVDyPNsjsI3MB3KLjlMOeH44gyaPdXC6rik2WXvUQ=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "stable": ["stable@0.1.8", "", {}, "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="], + + "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], + + "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], + + "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], + + "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], + + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="], + + "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="], + + "strnum": ["strnum@1.1.2", "", {}, "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA=="], + + "style-to-js": ["style-to-js@1.1.16", "", { "dependencies": { "style-to-object": "1.0.8" } }, "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw=="], + + "style-to-object": ["style-to-object@1.0.8", "", { "dependencies": { "inline-style-parser": "0.2.4" } }, "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g=="], + + "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + + "supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "svgo": ["svgo@1.3.2", "", { "dependencies": { "chalk": "^2.4.1", "coa": "^2.0.2", "css-select": "^2.0.0", "css-select-base-adapter": "^0.1.1", "css-tree": "1.0.0-alpha.37", "csso": "^4.0.2", "js-yaml": "^3.13.1", "mkdirp": "~0.5.1", "object.values": "^1.1.0", "sax": "~1.2.4", "stable": "^0.1.8", "unquote": "~1.1.1", "util.promisify": "~1.0.0" }, "bin": { "svgo": "./bin/svgo" } }, "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw=="], + + "tailwind-merge": ["tailwind-merge@3.2.0", "", {}, "sha512-FQT/OVqCD+7edmmJpsgCsY820RTD5AkBryuG5IUqR5YQZSdj5xlH5nLgH7YPths7WsLPSpSBNneJdM8aS8aeFA=="], + + "tailwindcss": ["tailwindcss@4.1.3", "", {}, "sha512-2Q+rw9vy1WFXu5cIxlvsabCwhU2qUwodGq03ODhLJ0jW4ek5BUtoCsnLB0qG+m8AHgEsSJcJGDSDe06FXlP74g=="], + + "tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="], + + "timeago.js": ["timeago.js@4.0.2", "", {}, "sha512-a7wPxPdVlQL7lqvitHGGRsofhdwtkoSXPGATFuSOA2i1ZNQEPLrGnj68vOp2sOJTCFAQVXPeNMX/GctBaO9L2w=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "ts-morph": ["ts-morph@25.0.1", "", { "dependencies": { "@ts-morph/common": "~0.26.0", "code-block-writer": "^13.0.3" } }, "sha512-QJEiTdnz1YjrB3JFhd626gX4rKHDLSjSVMvGGG4v7ONc3RBwa0Eei98G9AT9uNFDMtV54JyuXsFeC+OH0n6bXQ=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], + + "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], + + "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], + + "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], + + "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + + "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], + + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + + "unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="], + + "unquote": ["unquote@1.1.1", "", {}, "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg=="], + + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "util.promisify": ["util.promisify@1.0.1", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.2", "has-symbols": "^1.0.1", "object.getownpropertydescriptors": "^2.1.0" } }, "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA=="], + + "vaul": ["vaul@1.1.2", "", { "dependencies": { "@radix-ui/react-dialog": "^1.1.1" }, "peerDependencies": { "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-message": ["vfile-message@4.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], + + "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], + + "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], + + "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], + + "xml-js": ["xml-js@1.6.11", "", { "dependencies": { "sax": "^1.2.4" }, "bin": { "xml-js": "./bin/cli.js" } }, "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g=="], + + "yaml": ["yaml@2.7.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ=="], + + "yoctocolors": ["yoctocolors@2.1.1", "", {}, "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ=="], + + "zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], + + "zone-file": ["zone-file@2.0.0-beta.3", "", {}, "sha512-6tE3PSRcpN5lbTTLlkLez40WkNPc9vw/u1J2j6DBiy0jcVX48nCkWrx2EC+bWHqC2SLp069Xw4AdnYn/qp/W5g=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@fumari/json-schema-to-typescript/@apidevtools/json-schema-ref-parser": ["@apidevtools/json-schema-ref-parser@11.9.3", "", { "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.0" } }, "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ=="], + + "@shikijs/rehype/@shikijs/types": ["@shikijs/types@3.3.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-KPCGnHG6k06QG/2pnYGbFtFvpVJmC3uIpXrAiPrawETifujPBv0Se2oUxm5qYgjCvGJS9InKvjytOdN+bGuX+Q=="], + + "@shikijs/rehype/shiki": ["shiki@3.3.0", "", { "dependencies": { "@shikijs/core": "3.3.0", "@shikijs/engine-javascript": "3.3.0", "@shikijs/engine-oniguruma": "3.3.0", "@shikijs/langs": "3.3.0", "@shikijs/themes": "3.3.0", "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-j0Z1tG5vlOFGW8JVj0Cpuatzvshes7VJy5ncDmmMaYcmnGW0Js1N81TOW98ivTFNZfKRn9uwEg/aIm638o368g=="], + + "@shikijs/transformers/@shikijs/core": ["@shikijs/core@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-CovkFL2WVaHk6PCrwv6ctlmD4SS1qtIfN8yEyDXDYWh4ONvomdM9MaFw20qHuqJOcb8/xrkqoWQRJ//X10phOQ=="], + + "@shikijs/transformers/@shikijs/types": ["@shikijs/types@3.3.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-KPCGnHG6k06QG/2pnYGbFtFvpVJmC3uIpXrAiPrawETifujPBv0Se2oUxm5qYgjCvGJS9InKvjytOdN+bGuX+Q=="], + + "@stacks/connect/@stacks/transactions": ["@stacks/transactions@7.0.5", "", { "dependencies": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", "@stacks/common": "^7.0.2", "@stacks/network": "^7.0.2", "c32check": "^2.0.0", "lodash.clonedeep": "^4.5.0" } }, "sha512-mHsv7lUbZ5w4MKJ3NAirtdClIXLNKMqWIqT2rLjbIHzlYBqvZaELJSYD+km6E7Cm9G3yUYszorhruQmSTgilbg=="], + + "@stacks/network-v6/@stacks/common": ["@stacks/common@6.16.0", "", { "dependencies": { "@types/bn.js": "^5.1.0", "@types/node": "^18.0.4" } }, "sha512-PnzvhrdGRMVZvxTulitlYafSK4l02gPCBBoI9QEoTqgSnv62oaOXhYAUUkTMFKxdHW1seVEwZsrahuXiZPIAwg=="], + + "@stacks/profile/@stacks/transactions": ["@stacks/transactions@7.0.5", "", { "dependencies": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", "@stacks/common": "^7.0.2", "@stacks/network": "^7.0.2", "c32check": "^2.0.0", "lodash.clonedeep": "^4.5.0" } }, "sha512-mHsv7lUbZ5w4MKJ3NAirtdClIXLNKMqWIqT2rLjbIHzlYBqvZaELJSYD+km6E7Cm9G3yUYszorhruQmSTgilbg=="], + + "@stacks/transactions/@stacks/common": ["@stacks/common@6.16.0", "", { "dependencies": { "@types/bn.js": "^5.1.0", "@types/node": "^18.0.4" } }, "sha512-PnzvhrdGRMVZvxTulitlYafSK4l02gPCBBoI9QEoTqgSnv62oaOXhYAUUkTMFKxdHW1seVEwZsrahuXiZPIAwg=="], + + "@stacks/transactions/@stacks/network": ["@stacks/network@6.17.0", "", { "dependencies": { "@stacks/common": "^6.16.0", "cross-fetch": "^3.1.5" } }, "sha512-numHbfKjwco/rbkGPOEz8+FcJ2nBnS/tdJ8R422Q70h3SiA9eqk9RjSzB8p4JP8yW1SZvW+eihADHfMpBuZyfw=="], + + "@stacks/transactions-v6/@stacks/common": ["@stacks/common@6.16.0", "", { "dependencies": { "@types/bn.js": "^5.1.0", "@types/node": "^18.0.4" } }, "sha512-PnzvhrdGRMVZvxTulitlYafSK4l02gPCBBoI9QEoTqgSnv62oaOXhYAUUkTMFKxdHW1seVEwZsrahuXiZPIAwg=="], + + "@stacks/transactions-v6/@stacks/network": ["@stacks/network@6.17.0", "", { "dependencies": { "@stacks/common": "^6.16.0", "cross-fetch": "^3.1.5" } }, "sha512-numHbfKjwco/rbkGPOEz8+FcJ2nBnS/tdJ8R422Q70h3SiA9eqk9RjSzB8p4JP8yW1SZvW+eihADHfMpBuZyfw=="], + + "ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "css-tree/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "csso/css-tree": ["css-tree@1.1.3", "", { "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" } }, "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q=="], + + "dom-serializer/domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "fumadocs-core/shiki": ["shiki@3.3.0", "", { "dependencies": { "@shikijs/core": "3.3.0", "@shikijs/engine-javascript": "3.3.0", "@shikijs/engine-oniguruma": "3.3.0", "@shikijs/langs": "3.3.0", "@shikijs/themes": "3.3.0", "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-j0Z1tG5vlOFGW8JVj0Cpuatzvshes7VJy5ncDmmMaYcmnGW0Js1N81TOW98ivTFNZfKRn9uwEg/aIm638o368g=="], + + "fumadocs-openapi/fumadocs-core": ["fumadocs-core@15.2.5", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.6.1", "@orama/orama": "^3.1.4", "@shikijs/rehype": "^3.2.1", "@shikijs/transformers": "^3.2.1", "github-slugger": "^2.0.0", "hast-util-to-estree": "^3.1.3", "hast-util-to-jsx-runtime": "^2.3.6", "image-size": "^2.0.2", "negotiator": "^1.0.0", "react-remove-scroll": "^2.6.3", "remark": "^15.0.0", "remark-gfm": "^4.0.1", "scroll-into-view-if-needed": "^3.1.0", "shiki": "^3.2.1", "unist-util-visit": "^5.0.0" }, "peerDependencies": { "@oramacloud/client": "1.x.x || 2.x.x", "algoliasearch": "4.24.0", "next": "14.x.x || 15.x.x", "react": "18.x.x || 19.x.x", "react-dom": "18.x.x || 19.x.x" }, "optionalPeers": ["@oramacloud/client", "algoliasearch", "next", "react", "react-dom"] }, "sha512-vSeyFdbuUCx8H27wrnv6bm7Z5ZGjI7L3mkjSZfbS4oh3qWHWs+L+qEX2lSGmL2IMRIXXrUZGSwe0xohz5uAwAg=="], + + "fumadocs-openapi/fumadocs-ui": ["fumadocs-ui@15.2.5", "", { "dependencies": { "@radix-ui/react-accordion": "^1.2.3", "@radix-ui/react-collapsible": "^1.1.3", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-direction": "^1.1.0", "@radix-ui/react-navigation-menu": "^1.2.5", "@radix-ui/react-popover": "^1.1.6", "@radix-ui/react-scroll-area": "^1.2.3", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-tabs": "^1.1.3", "class-variance-authority": "^0.7.1", "fumadocs-core": "15.2.5", "lodash.merge": "^4.6.2", "lucide-react": "^0.487.0", "next-themes": "^0.4.6", "postcss-selector-parser": "^7.1.0", "react-medium-image-zoom": "^5.2.14", "tailwind-merge": "^3.1.0" }, "peerDependencies": { "next": "14.x.x || 15.x.x", "react": "18.x.x || 19.x.x", "react-dom": "18.x.x || 19.x.x", "tailwindcss": "^3.4.14 || ^4.0.0" }, "optionalPeers": ["tailwindcss"] }, "sha512-obzCoLYVXAPTFBqyRz/a81D8q+SPgNCNvOB79Jqgyp4B47gtjaDdObrayKHYYfdiJGjlyfp98wCAVpQiTJI1gQ=="], + + "fumadocs-openapi/lucide-react": ["lucide-react@0.487.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-aKqhOQ+YmFnwq8dWgGjOuLc8V1R9/c/yOd+zDY4+ohsR2Jo05lSGc3WsstYPIzcTpeosN7LoCkLReUUITvaIvw=="], + + "fumadocs-ui/lucide-react": ["lucide-react@0.479.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-aBhNnveRhorBOK7uA4gDjgaf+YlHMdMhQ/3cupk6exM10hWlEU+2QtWYOfhXhjAsmdb6LeKR+NZnow4UxRRiTQ=="], + + "gray-matter/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], + + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "svgo/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "svgo/sax": ["sax@1.2.4", "", {}, "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="], + + "@shikijs/rehype/shiki/@shikijs/core": ["@shikijs/core@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-CovkFL2WVaHk6PCrwv6ctlmD4SS1qtIfN8yEyDXDYWh4ONvomdM9MaFw20qHuqJOcb8/xrkqoWQRJ//X10phOQ=="], + + "@shikijs/rehype/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.2.0" } }, "sha512-XlhnFGv0glq7pfsoN0KyBCz9FJU678LZdQ2LqlIdAj6JKsg5xpYKay3DkazXWExp3DTJJK9rMOuGzU2911pg7Q=="], + + "@shikijs/rehype/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-l0vIw+GxeNU7uGnsu6B+Crpeqf+WTQ2Va71cHb5ZYWEVEPdfYwY5kXwYqRJwHrxz9WH+pjSpXQz+TJgAsrkA5A=="], + + "@shikijs/rehype/shiki/@shikijs/langs": ["@shikijs/langs@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0" } }, "sha512-zt6Kf/7XpBQKSI9eqku+arLkAcDQ3NHJO6zFjiChI8w0Oz6Jjjay7pToottjQGjSDCFk++R85643WbyINcuL+g=="], + + "@shikijs/rehype/shiki/@shikijs/themes": ["@shikijs/themes@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0" } }, "sha512-tXeCvLXBnqq34B0YZUEaAD1lD4lmN6TOHAhnHacj4Owh7Ptb/rf5XCDeROZt2rEOk5yuka3OOW2zLqClV7/SOg=="], + + "@stacks/network-v6/@stacks/common/@types/node": ["@types/node@18.19.86", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ=="], + + "@stacks/transactions-v6/@stacks/common/@types/node": ["@types/node@18.19.86", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ=="], + + "@stacks/transactions/@stacks/common/@types/node": ["@types/node@18.19.86", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ=="], + + "ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "csso/css-tree/mdn-data": ["mdn-data@2.0.14", "", {}, "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="], + + "csso/css-tree/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "fumadocs-core/shiki/@shikijs/core": ["@shikijs/core@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-CovkFL2WVaHk6PCrwv6ctlmD4SS1qtIfN8yEyDXDYWh4ONvomdM9MaFw20qHuqJOcb8/xrkqoWQRJ//X10phOQ=="], + + "fumadocs-core/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.2.0" } }, "sha512-XlhnFGv0glq7pfsoN0KyBCz9FJU678LZdQ2LqlIdAj6JKsg5xpYKay3DkazXWExp3DTJJK9rMOuGzU2911pg7Q=="], + + "fumadocs-core/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-l0vIw+GxeNU7uGnsu6B+Crpeqf+WTQ2Va71cHb5ZYWEVEPdfYwY5kXwYqRJwHrxz9WH+pjSpXQz+TJgAsrkA5A=="], + + "fumadocs-core/shiki/@shikijs/langs": ["@shikijs/langs@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0" } }, "sha512-zt6Kf/7XpBQKSI9eqku+arLkAcDQ3NHJO6zFjiChI8w0Oz6Jjjay7pToottjQGjSDCFk++R85643WbyINcuL+g=="], + + "fumadocs-core/shiki/@shikijs/themes": ["@shikijs/themes@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0" } }, "sha512-tXeCvLXBnqq34B0YZUEaAD1lD4lmN6TOHAhnHacj4Owh7Ptb/rf5XCDeROZt2rEOk5yuka3OOW2zLqClV7/SOg=="], + + "fumadocs-core/shiki/@shikijs/types": ["@shikijs/types@3.3.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-KPCGnHG6k06QG/2pnYGbFtFvpVJmC3uIpXrAiPrawETifujPBv0Se2oUxm5qYgjCvGJS9InKvjytOdN+bGuX+Q=="], + + "fumadocs-openapi/fumadocs-core/@orama/orama": ["@orama/orama@3.1.4", "", {}, "sha512-7tTuIdkzgRscJ7sGHVsoK9GtXSpwbfrj3WYnuSu/SepXHhshYiQaOeXc/aeLh4MfgIre6tEs/caIop8wrhMi3g=="], + + "fumadocs-openapi/fumadocs-core/@shikijs/rehype": ["@shikijs/rehype@3.2.1", "", { "dependencies": { "@shikijs/types": "3.2.1", "@types/hast": "^3.0.4", "hast-util-to-string": "^3.0.1", "shiki": "3.2.1", "unified": "^11.0.5", "unist-util-visit": "^5.0.0" } }, "sha512-wj4TXI1PQ3TNPyXudUzKfdFIMneTxFym3HKKfWRzbOSAS8P4mECR+ttdUPhYU1dxrXrsatWxTJezOcEjiA0z8g=="], + + "fumadocs-openapi/fumadocs-core/@shikijs/transformers": ["@shikijs/transformers@3.2.1", "", { "dependencies": { "@shikijs/core": "3.2.1", "@shikijs/types": "3.2.1" } }, "sha512-oIT40p8LOPV/6XLnUrVPeRtJtbu0Mpl+BjGFuMXw870eX9zTSQlidg7CsksFDVyUiSAOC/CH1RQm+ldZp0/6eQ=="], + + "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "svgo/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "@shikijs/rehype/shiki/@shikijs/engine-javascript/oniguruma-to-es": ["oniguruma-to-es@4.3.1", "", { "dependencies": { "oniguruma-parser": "^0.12.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-VtX1kepWO+7HG7IWV5v72JhiqofK7XsiHmtgnvurnNOTdIvE5mrdWYtsOrQyrXCv1L2Ckm08hywp+MFO7rC4Ug=="], + + "@stacks/network-v6/@stacks/common/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "@stacks/transactions-v6/@stacks/common/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "@stacks/transactions/@stacks/common/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "fumadocs-core/shiki/@shikijs/engine-javascript/oniguruma-to-es": ["oniguruma-to-es@4.3.1", "", { "dependencies": { "oniguruma-parser": "^0.12.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-VtX1kepWO+7HG7IWV5v72JhiqofK7XsiHmtgnvurnNOTdIvE5mrdWYtsOrQyrXCv1L2Ckm08hywp+MFO7rC4Ug=="], + + "@shikijs/rehype/shiki/@shikijs/engine-javascript/oniguruma-to-es/oniguruma-parser": ["oniguruma-parser@0.12.0", "", {}, "sha512-fD9o5ebCmEAA9dLysajdQvuKzLL7cj+w7DQjuO3Cb6IwafENfx6iL+RGkmyW82pVRsvgzixsWinHvgxTMJvdIA=="], + + "fumadocs-core/shiki/@shikijs/engine-javascript/oniguruma-to-es/oniguruma-parser": ["oniguruma-parser@0.12.0", "", {}, "sha512-fD9o5ebCmEAA9dLysajdQvuKzLL7cj+w7DQjuO3Cb6IwafENfx6iL+RGkmyW82pVRsvgzixsWinHvgxTMJvdIA=="], + } +} diff --git a/components.json b/components.json index ae87dd825..4cfe35539 100644 --- a/components.json +++ b/components.json @@ -4,7 +4,7 @@ "rsc": true, "tsx": true, "tailwind": { - "config": "tailwind.config.js", + "config": "", "css": "app/global.css", "baseColor": "neutral", "cssVariables": true, @@ -16,5 +16,6 @@ "ui": "@/components/ui", "lib": "@/lib", "hooks": "@/hooks" - } + }, + "iconLibrary": "lucide" } \ No newline at end of file diff --git a/next-env.d.ts b/next-env.d.ts index 4f11a03dc..1b3be0840 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// <reference types="next/image-types/global" /> // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/next.config.mjs b/next.config.mjs index d15b2f30a..07577c10c 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,138 +1,14 @@ -import createBundleAnalyzer from '@next/bundle-analyzer'; -import createMDX from 'fumadocs-mdx/config'; -import { - remarkDynamicContent, - remarkInstall, - rehypeCodeDefaultOptions, -} from 'fumadocs-core/mdx-plugins'; -import rehypeKatex from 'rehype-katex'; -import remarkMath from 'remark-math'; -import { recmaCodeHike, remarkCodeHike } from "codehike/mdx"; -import theme from "./components/docskit/theme.mjs"; +import { createMDX } from 'fumadocs-mdx/next'; -const withAnalyzer = createBundleAnalyzer({ - enabled: process.env.ANALYZE === 'true', -}); +const withMDX = createMDX(); /** @type {import('next').NextConfig} */ const config = { reactStrictMode: true, - eslint: { - // Replaced by root workspace command - ignoreDuringBuilds: true, - }, - images: { - domains: [], - }, - swcMinify: false, webpack: (config) => { config.optimization.minimize = false; return config; }, - redirects: () => [ - { - source: "/address", - destination: "/stacks/stacks.js/concepts/accounts-and-addresses", - permanent: true, - }, - { - source: "/what-is-a-wallet", - destination: "/stacks/stacks.js/concepts/private-keys", - permanent: true, - }, - { - source: "/intro", - destination: "/", - permanent: true, - }, - { - source: "/chainhooks/overview", - destination: "/stacks/chainhook", - permanent: true, - }, - { - source: "/roadmap", - destination: "/", - permanent: true, - }, - { - source: "/stacks/api-keys/rate-limiting", - destination: "/stacks/rate-limiting", - permanent: true, - }, - { - source: "/txid", - destination: "/stacks/stacks.js/concepts/transactions", - permanent: true, - }, - { - source: "/smart-contracts/clarinet", - destination: "/stacks/clarinet", - permanent: true, - }, - { - source: "/stacks/platform/guides/deploy-project/build-contracts", - destination: "/stacks/platform", - permanent: true, - }, - { - source: "/stacks/platform/guides/deploy-project/create-project", - destination: "/stacks/platform", - permanent: true, - }, - { - source: "/stacks/platform/guides/deployment-plans", - destination: "/stacks/platform", - permanent: true, - }, - { - source: "/stacks/platform/guides/deploy-project", - destination: "/stacks/platform/guides/deploy-contracts", - permanent: true, - }, - { - source: "/stacks/connect/guides/sign-transactions", - destination: "/stacks/connect/guides/broadcast-transactions", - permanent: true, - }, - ], }; -/** - * @type {import('codehike/mdx').CodeHikeConfig} - */ -const chConfig = { - components: { - code: "DocsKitCode", - inlineCode: "DocsKitInlineCode", - }, - ignoreCode: ({ lang, meta }) => - meta?.startsWith("title") -}; - -const withMDX = createMDX({ - mdxOptions: { - rehypeCodeOptions: { - themes: { - light: 'catppuccin-latte', - dark: 'catppuccin-mocha', - }, - transformers: [ - ...rehypeCodeDefaultOptions.transformers, - ], - }, - lastModifiedTime: 'git', - remarkPlugins: (v) => [ - [remarkCodeHike, chConfig], - remarkMath, - remarkDynamicContent, - [remarkInstall], - ...v, - ], - rehypePlugins: (v) => [rehypeKatex, ...v], - recmaPlugins: [[recmaCodeHike, chConfig]], - }, - buildSearchIndex: {}, -}); - -export default withAnalyzer(withMDX(config)); +export default withMDX(config); diff --git a/package.json b/package.json index 1de64ba95..d2042c650 100644 --- a/package.json +++ b/package.json @@ -1,98 +1,70 @@ { - "name": "docs", - "version": "0.1.3", + "name": "docs-v4", + "version": "0.0.0", "private": true, "scripts": { - "prebuild": "bun run build:recipes", - "build": "next build", - "postbuild": "bun run ./scripts/clean-urls.js && bun run build:index", - "build:index": "bun run ./scripts/update-index.mts", - "build:openapi": "bun run ./scripts/generate-docs.mjs", - "build:recipes": "bun run ./scripts/fetch-recipes.mts", "dev": "next dev", - "lint": "next lint", - "start": "next start" + "build": "next build", + "start": "next start", + "postinstall": "fumadocs-mdx", + "lint": "bun run ./lint.ts", + "build:recipes": "bun run ./scripts/fetch-recipes.mts" }, "dependencies": { - "@codesandbox/sandpack-client": "^2.19.8", - "@hirosystems/clarinet-sdk-browser": "^2.13.0", - "@next/env": "^14.0.0", - "@next/third-parties": "^14.2.4", - "@radix-ui/react-avatar": "^1.0.4", - "@radix-ui/react-checkbox": "^1.1.2", - "@radix-ui/react-collapsible": "^1.1.1", - "@radix-ui/react-dialog": "^1.1.2", - "@radix-ui/react-dropdown-menu": "^2.0.6", - "@radix-ui/react-icons": "^1.3.1", - "@radix-ui/react-label": "^2.1.0", - "@radix-ui/react-popover": "^1.1.1", - "@radix-ui/react-scroll-area": "^1.2.0", - "@radix-ui/react-separator": "^1.1.0", - "@radix-ui/react-slot": "^1.1.1", - "@radix-ui/react-tabs": "^1.0.4", - "@radix-ui/react-toggle": "^1.1.0", - "@radix-ui/react-toggle-group": "^1.1.0", - "@radix-ui/react-tooltip": "^1.1.3", - "@stacks/auth": "^6.11.3", - "@stacks/blockchain-api-client": "^7.10.0", - "@stacks/connect": "8.1.3", - "@stacks/network": "^6.11.3", - "@stacks/transactions": "^6.11.3", - "ajv": "^8.12.0", - "ajv-draft-04": "^1.0.0", - "algoliasearch": "^4.20.0", - "class-variance-authority": "^0.7.0", + "@apidevtools/swagger-parser": "^10.1.1", + "@fumadocs/cli": "^0.0.8", + "@hirosystems/clarinet-sdk-browser": "^2.15.2", + "@orama/orama": "^3.1.6", + "@orama/plugin-data-persistence": "^3.1.6", + "@radix-ui/react-avatar": "^1.1.3", + "@radix-ui/react-checkbox": "^1.1.4", + "@radix-ui/react-collapsible": "^1.1.3", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-dropdown-menu": "^2.1.6", + "@radix-ui/react-icons": "^1.3.2", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-navigation-menu": "^1.2.5", + "@radix-ui/react-popover": "^1.1.6", + "@radix-ui/react-scroll-area": "^1.2.3", + "@radix-ui/react-separator": "^1.1.2", + "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-tabs": "^1.1.3", + "@radix-ui/react-toggle": "^1.1.2", + "@radix-ui/react-toggle-group": "^1.1.2", + "@radix-ui/react-tooltip": "^1.1.8", + "@stacks/connect": "^8.1.6", + "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "cmdk": "^0.2.1", - "cobe": "^0.6.3", - "codehike": "1.0.4", - "date-fns": "^3.3.1", - "embla-carousel-react": "^8.5.2", - "eslint": "^9.16.0", - "eslint-config-next": "^15.0.3", - "framer-motion": "^11.0.25", - "fumadocs-core": "9.1.0", - "fumadocs-mdx": "8.2.26", - "fumadocs-typescript": "^1.0.1", - "fumadocs-ui": "9.1.0", - "geist": "^1.2.0", + "cmdk": "^1.1.1", + "codehike": "^1.0.5", + "date-fns": "^4.1.0", + "embla-carousel-react": "^8.6.0", + "fumadocs-core": "15.2.12", + "fumadocs-mdx": "11.5.6", + "fumadocs-openapi": "^7.0.1", + "fumadocs-ui": "15.0.16", + "fuse.js": "^7.1.0", "gray-matter": "^4.0.3", - "katex": "^0.16.8", - "lucide-react": "^0.454.0", - "next": "14.1.0", - "phenomenon": "^1.6.0", - "react": "18.2.0", - "react-day-picker": "^8.10.0", - "react-dom": "18.2.0", - "react-spring": "^9.7.3", - "rehype-katex": "^7.0.0", - "remark-math": "^6.0.0", + "lucide-react": "^0.482.0", + "next": "15.3.1", + "next-themes": "^0.4.4", + "next-validate-link": "^1.5.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", "seti-icons": "^0.0.4", - "shiki": "^1.1.2", - "statuspage.io": "^3.2.9", - "tailwind-merge": "^2.5.4", + "shiki": "^3.2.1", + "tailwind-merge": "^3.0.2", "timeago.js": "^4.0.2", - "vaul": "^0.9.0", - "zod": "^3.22.4" + "vaul": "^1.1.2" }, "devDependencies": { - "@next/bundle-analyzer": "^14.0.0", - "@next/eslint-plugin-next": "^14.0.0", - "@types/mdx": "^2.0.8", - "@types/node": "18.17.5", - "@types/react": "18.2.8", - "@types/react-dom": "18.2.1", - "@vercel/style-guide": "^5.1.0", - "autoprefixer": "10.4.17", - "eslint-config-turbo": "^1.10.12", - "eslint-plugin-tailwindcss": "^3.13.0", - "fumadocs-openapi": "4.0.2", - "postcss": "8.4.35", - "postcss-import": "^16.0.0", - "tailwindcss": "3.4.1", - "tailwindcss-animate": "^1.0.7", - "tsx": "^4.7.0", - "typescript": "^5.2.2", - "webpack": "^5.89.0" + "@tailwindcss/postcss": "^4.0.12", + "@types/mdx": "^2.0.13", + "@types/node": "22.13.10", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "postcss": "^8.5.3", + "tailwindcss": "^4.0.12", + "typescript": "^5.8.2" } -} +} \ No newline at end of file diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 000000000..a34a3d560 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,5 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + }, +}; diff --git a/public/orama.json b/public/orama.json new file mode 100644 index 000000000..fbff30b87 --- /dev/null +++ b/public/orama.json @@ -0,0 +1 @@ +{"internalDocumentIDStore":{"internalIdToId":["/docs/stacks/contributors-guide","/docs/stacks/get-started","/docs/stacks/rate-limiting","/docs/stacks/clarinet-js-sdk/references/simnet","/docs/stacks/clarinet-js-sdk/references/properties","/docs/stacks/clarinet-js-sdk/references/custom-matchers","/docs/stacks/clarinet-js-sdk/references/methods","/docs/stacks/clarinet-js-sdk","/docs/stacks/clarinet-js-sdk/quickstart","/docs/stacks/clarinet-js-sdk/installation","/docs/stacks/reference","/docs/stacks/testing-best-practices","/docs/stacks/archive","/docs/stacks/archive/guides/stacks-api","/docs/stacks/archive/guides/token-metadata-api","/docs/stacks/archive/guides/verify-archive-data","/docs/stacks/archive/guides/stacks-blockchain","/docs/stacks/clarinet","/docs/stacks/clarinet/concepts","/docs/stacks/clarinet/examples/add-a-contract","/docs/stacks/clarinet/examples/validate-a-contract","/docs/stacks/clarinet/examples/estimate-costs","/docs/stacks/clarinet/examples/start-a-development-console","/docs/stacks/clarinet/examples/run-a-local-devnet","/docs/stacks/clarinet/examples/deploy-a-contract","/docs/stacks/clarinet/examples/debug-a-contract","/docs/stacks/clarinet/examples/create-deployment-plans","/docs/stacks/clarinet/examples/working-with-sbtc","/docs/stacks/clarinet/examples/create-a-new-project","/docs/stacks/clarinet/quickstart","/docs/stacks/platform-api","/docs/stacks/platform-api/devnet/bitcoin-node","/docs/stacks/platform-api/devnet","/docs/stacks/platform-api/devnet/stop","/docs/stacks/platform-api/devnet/start","/docs/stacks/platform-api/devnet/stacks-blockchain-api","/docs/stacks/platform-api/chainhooks/list","/docs/stacks/platform-api/chainhooks/create","/docs/stacks/platform-api/chainhooks/get","/docs/stacks/platform-api/chainhooks","/docs/stacks/platform-api/chainhooks/update","/docs/stacks/platform-api/chainhooks/delete","/docs/stacks/platform-api/chainhooks/status","/docs/stacks","/docs/stacks/platform","/docs/stacks/platform/examples/deploy-contracts","/docs/stacks/platform/examples/create-project","/docs/stacks/platform/examples/archive-project","/docs/stacks/platform/examples/faucet","/docs/stacks/platform/examples/devnet","/docs/stacks/platform/examples/contract-monitoring","/docs/stacks/platform/examples/create-chainhooks","/docs/stacks/platform/quickstart","/docs/stacks/token-metadata-api","/docs/stacks/token-metadata-api/architecture","/docs/stacks/token-metadata-api/info","/docs/stacks/token-metadata-api/info/status","/docs/stacks/token-metadata-api/usage","/docs/stacks/token-metadata-api/tokens","/docs/stacks/token-metadata-api/tokens/fungible-token-metadata","/docs/stacks/token-metadata-api/tokens/semi-fungible-token-metadata","/docs/stacks/token-metadata-api/tokens/fungible-tokens","/docs/stacks/token-metadata-api/tokens/non-fungible-token-metadata","/docs/stacks/token-metadata-api/client","/docs/stacks/token-metadata-api/client/quickstart","/docs/stacks/token-metadata-api/client/tokens","/docs/stacks/token-metadata-api/client/tokens/get-ft-metadata","/docs/stacks/hacks/archive/build-a-custom-api","/docs/stacks/hacks/archive/build-a-decentralized-grants-program","/docs/stacks/hacks/archive/ai","/docs/stacks/hacks/archive/build-a-friend-tech-clone","/docs/stacks/hacks/recipes","/docs/stacks/hacks","/docs/stacks/explorer","/docs/stacks/explorer/guides/build-explorer","/docs/stacks/clarity/bit-manipulation","/docs/stacks/clarity/basic-arithmetic","/docs/stacks/clarity","/docs/stacks/clarity/optimizations","/docs/stacks/clarity/cryptographic-functions","/docs/stacks/clarity/access-control","/docs/stacks/clarity/functions/list","/docs/stacks/clarity/functions/tuple","/docs/stacks/clarity/functions/sha256","/docs/stacks/clarity/functions/unwrap","/docs/stacks/clarity/functions/contract-call","/docs/stacks/clarity/functions/buff-to-int-be","/docs/stacks/clarity/functions/int-to-ascii","/docs/stacks/clarity/functions/map-delete","/docs/stacks/clarity/functions/contract-of","/docs/stacks/clarity/functions/keccak256","/docs/stacks/clarity/functions/define-constant","/docs/stacks/clarity/functions/xor","/docs/stacks/clarity/functions/principal-of","/docs/stacks/clarity/functions/get-burn-block-info","/docs/stacks/clarity/functions/fold","/docs/stacks/clarity/functions/define-map","/docs/stacks/clarity/functions/stx-account","/docs/stacks/clarity/functions/define-public","/docs/stacks/clarity/functions/define-data-var","/docs/stacks/clarity/functions/nft-transfer","/docs/stacks/clarity/functions/multiply","/docs/stacks/clarity/functions/default-to","/docs/stacks/clarity/functions/get-stacks-block-info","/docs/stacks/clarity/functions/map","/docs/stacks/clarity/functions/sqrti","/docs/stacks/clarity/functions/log2","/docs/stacks/clarity/functions/and","/docs/stacks/clarity/functions/replace-at","/docs/stacks/clarity/functions/len","/docs/stacks/clarity/functions/sha512-256","/docs/stacks/clarity/functions/divide","/docs/stacks/clarity/functions/bit-and","/docs/stacks/clarity/functions/less-than","/docs/stacks/clarity/functions/ft-burn","/docs/stacks/clarity/functions/get","/docs/stacks/clarity/functions/use-trait","/docs/stacks/clarity/functions/to-uint","/docs/stacks/clarity/functions/define-trait","/docs/stacks/clarity/functions/int-to-utf8","/docs/stacks/clarity/functions/ok","/docs/stacks/clarity/functions/define-non-fungible-token","/docs/stacks/clarity/functions/ft-transfer","/docs/stacks/clarity/functions/is-err","/docs/stacks/clarity/functions/ft-get-supply","/docs/stacks/clarity/functions/as-max-len","/docs/stacks/clarity/functions/get-tenure-info","/docs/stacks/clarity/functions/bit-xor","/docs/stacks/clarity/functions/define-private","/docs/stacks/clarity/functions/bit-or","/docs/stacks/clarity/functions/var-get","/docs/stacks/clarity/functions/map-set","/docs/stacks/clarity/functions/buff-to-uint-be","/docs/stacks/clarity/functions/define-read-only","/docs/stacks/clarity/functions/nft-burn","/docs/stacks/clarity/functions/is-ok","/docs/stacks/clarity/functions/add","/docs/stacks/clarity/functions/string-to-int","/docs/stacks/clarity/functions/is-none","/docs/stacks/clarity/functions/subtract","/docs/stacks/clarity/functions/principal-destruct","/docs/stacks/clarity/functions/to-consensus-buff","/docs/stacks/clarity/functions/stx-burn","/docs/stacks/clarity/functions/from-consensus-buff","/docs/stacks/clarity/functions/bit-shift-right","/docs/stacks/clarity/functions/is-some","/docs/stacks/clarity/functions/is-standard","/docs/stacks/clarity/functions/unwrap-err-panic","/docs/stacks/clarity/functions/append","/docs/stacks/clarity/functions/stx-transfer","/docs/stacks/clarity/functions/unwrap-panic","/docs/stacks/clarity/functions/impl-trait","/docs/stacks/clarity/functions/to-int","/docs/stacks/clarity/functions/greater-than","/docs/stacks/clarity/functions/not","/docs/stacks/clarity/functions/get-block-info","/docs/stacks/clarity/functions/string-to-uint","/docs/stacks/clarity/functions/buff-to-uint-le","/docs/stacks/clarity/functions/unwrap-err","/docs/stacks/clarity/functions/define-fungible-token","/docs/stacks/clarity/functions/at-block","/docs/stacks/clarity/functions/secp256k1-recover","/docs/stacks/clarity/functions/begin","/docs/stacks/clarity/functions/err","/docs/stacks/clarity/functions/or","/docs/stacks/clarity/functions/try","/docs/stacks/clarity/functions/map-insert","/docs/stacks/clarity/functions/some","/docs/stacks/clarity/functions/secp256k1-verify","/docs/stacks/clarity/functions/match","/docs/stacks/clarity/functions/let","/docs/stacks/clarity/functions/map-get","/docs/stacks/clarity/functions/is-eq","/docs/stacks/clarity/functions/bit-shift-left","/docs/stacks/clarity/functions/var-set","/docs/stacks/clarity/functions/less-than-or-equal","/docs/stacks/clarity/functions/filter","/docs/stacks/clarity/functions/ft-mint","/docs/stacks/clarity/functions/buff-to-int-le","/docs/stacks/clarity/functions/element-at","/docs/stacks/clarity/functions/sha512","/docs/stacks/clarity/functions/concat","/docs/stacks/clarity/functions/index-of","/docs/stacks/clarity/functions/stx-transfer-memo","/docs/stacks/clarity/functions/pow","/docs/stacks/clarity/functions/nft-mint","/docs/stacks/clarity/functions/bit-not","/docs/stacks/clarity/functions/hash160","/docs/stacks/clarity/functions/merge","/docs/stacks/clarity/functions/ft-get-balance","/docs/stacks/clarity/functions/greater-than-or-equal","/docs/stacks/clarity/functions/as-contract","/docs/stacks/clarity/functions/asserts","/docs/stacks/clarity/functions/slice","/docs/stacks/clarity/functions/nft-get-owner","/docs/stacks/clarity/functions/if","/docs/stacks/clarity/functions/mod","/docs/stacks/clarity/functions/stx-get-balance","/docs/stacks/clarity/functions/print","/docs/stacks/clarity/functions/principal-construct","/docs/stacks/clarity/handling-optionals-and-errors","/docs/stacks/clarity/time-and-blocks","/docs/stacks/web-app-development","/docs/stacks/token-development","/docs/stacks/signer-metrics-api/blocks","/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block","/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks","/docs/stacks/signer-metrics-api","/docs/stacks/signer-metrics-api/info","/docs/stacks/signer-metrics-api/info/status","/docs/stacks/signer-metrics-api/prometheus","/docs/stacks/signer-metrics-api/prometheus/metrics","/docs/stacks/signer-metrics-api/signers","/docs/stacks/signer-metrics-api/signers/pox-cycle-signer","/docs/stacks/signer-metrics-api/signers/pox-cycle-signers","/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-a-block","/docs/stacks/signer-metrics-api/block-proposals","/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals","/docs/stacks/nakamoto","/docs/stacks/nakamoto/guides/explorer","/docs/stacks/nakamoto/guides/clarinet","/docs/stacks/nakamoto/guides/stacks-api","/docs/stacks/nakamoto/guides/stacks-js","/docs/stacks/unit-testing","/docs/stacks/smart-contract-development","/docs/stacks/stacks.js/v6/transactions","/docs/stacks/stacks.js/v6/network","/docs/stacks/stacks.js","/docs/stacks/stacks.js/roadmap","/docs/stacks/stacks.js/examples/broadcast-transactions","/docs/stacks/stacks.js/examples/post-conditions","/docs/stacks/stacks.js/examples/use-with-react-native","/docs/stacks/stacks.js/packages/sbtc","/docs/stacks/stacks.js/packages/transactions","/docs/stacks/stacks.js/packages/network","/docs/stacks/stacks.js/packages/common","/docs/stacks/stacks.js/concepts/transactions","/docs/stacks/stacks.js/concepts/post-conditions","/docs/stacks/stacks.js/concepts/private-keys","/docs/stacks/stacks.js/concepts/accounts-and-addresses","/docs/stacks/stacks.js/concepts/networks","/docs/stacks/stacks.js/concepts/broadcasting","/docs/stacks/stacks.js/quickstart","/docs/stacks/stacks.js/installation","/docs/stacks/integration-testing","/docs/stacks/migration-guide","/docs/stacks/api-keys","/docs/stacks/api/token-metadata/info","/docs/stacks/api/token-metadata/info/status","/docs/stacks/api/token-metadata/tokens","/docs/stacks/api/token-metadata/tokens/fungible-token-metadata","/docs/stacks/api/token-metadata/tokens/semi-fungible-token-metadata","/docs/stacks/api/token-metadata/tokens/fungible-tokens","/docs/stacks/api/token-metadata/tokens/non-fungible-token-metadata","/docs/stacks/api/pagination","/docs/stacks/api","/docs/stacks/api/authentication","/docs/stacks/api/nonce-handling","/docs/stacks/api/architecture","/docs/stacks/api/stacks-blockchain/blocks/get-block","/docs/stacks/api/stacks-blockchain/blocks/recent-blocks","/docs/stacks/api/stacks-blockchain/blocks/block-by-hash","/docs/stacks/api/stacks-blockchain/blocks","/docs/stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block","/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-height","/docs/stacks/api/stacks-blockchain/blocks/average-times","/docs/stacks/api/stacks-blockchain/blocks/get-blocks","/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash","/docs/stacks/api/stacks-blockchain/blocks/block-by-height","/docs/stacks/api/stacks-blockchain/names/names","/docs/stacks/api/stacks-blockchain/names/name-subdomains","/docs/stacks/api/stacks-blockchain/names/name-zonefile","/docs/stacks/api/stacks-blockchain/names","/docs/stacks/api/stacks-blockchain/names/owned-by-address","/docs/stacks/api/stacks-blockchain/names/namespace-names","/docs/stacks/api/stacks-blockchain/names/namespaces","/docs/stacks/api/stacks-blockchain/names/name-details","/docs/stacks/api/stacks-blockchain/names/historical-zonefile","/docs/stacks/api/stacks-blockchain/fees/fee-rate","/docs/stacks/api/stacks-blockchain/fees","/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients","/docs/stacks/api/stacks-blockchain/stacking-rewards","/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient","/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders","/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries","/docs/stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient","/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycles","/docs/stacks/api/stacks-blockchain/proof-of-transfer","/docs/stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle","/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycle","/docs/stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle","/docs/stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle","/docs/stacks/api/stacks-blockchain/search/search-by-id","/docs/stacks/api/stacks-blockchain/search","/docs/stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply","/docs/stacks/api/stacks-blockchain/info/network-given-block-time","/docs/stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text","/docs/stacks/api/stacks-blockchain/info/network-block-time","/docs/stacks/api/stacks-blockchain/info","/docs/stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text","/docs/stacks/api/stacks-blockchain/info/status","/docs/stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply","/docs/stacks/api/stacks-blockchain/transactions/address-transactions","/docs/stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction","/docs/stacks/api/stacks-blockchain/transactions/transaction-events","/docs/stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions","/docs/stacks/api/stacks-blockchain/transactions","/docs/stacks/api/stacks-blockchain/transactions/transactions-for-address","/docs/stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions","/docs/stacks/api/stacks-blockchain/transactions/get-transaction","/docs/stacks/api/stacks-blockchain/transactions/details-for-transactions","/docs/stacks/api/stacks-blockchain/transactions/recent-transactions","/docs/stacks/api/stacks-blockchain/transactions/mempool-transactions","/docs/stacks/api/stacks-blockchain/transactions/transactions-by-block","/docs/stacks/api/stacks-blockchain/transactions/get-raw-transaction","/docs/stacks/api/stacks-blockchain/stacking-pool/members","/docs/stacks/api/stacks-blockchain/stacking-pool","/docs/stacks/api/stacks-blockchain/faucets","/docs/stacks/api/stacks-blockchain/faucets/stx","/docs/stacks/api/stacks-blockchain/accounts/transactions-with-transfers","/docs/stacks/api/stacks-blockchain/accounts/balances","/docs/stacks/api/stacks-blockchain/accounts/transactions","/docs/stacks/api/stacks-blockchain/accounts/nft-events","/docs/stacks/api/stacks-blockchain/accounts/assets","/docs/stacks/api/stacks-blockchain/accounts/transaction-with-transfers","/docs/stacks/api/stacks-blockchain/accounts/latest-nonce","/docs/stacks/api/stacks-blockchain/accounts/stx-balances","/docs/stacks/api/stacks-blockchain/accounts/inbound-stx-transfers","/docs/stacks/api/stacks-blockchain/smart-contracts/events","/docs/stacks/api/stacks-blockchain/smart-contracts/by-trait","/docs/stacks/api/stacks-blockchain/smart-contracts","/docs/stacks/api/stacks-blockchain/smart-contracts/info","/docs/stacks/api/stacks-blockchain/smart-contracts/status","/docs/stacks/api/stacks-blockchain/mempool","/docs/stacks/api/stacks-blockchain/mempool/transaction-fee-priorities","/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-block","/docs/stacks/api/stacks-blockchain/burn-blocks","/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks","/docs/stacks/api/stacks-blockchain/tokens","/docs/stacks/api/stacks-blockchain/tokens/holders","/docs/stacks/api/stacks-blockchain/non-fungible-tokens","/docs/stacks/api/stacks-blockchain/non-fungible-tokens/holdings","/docs/stacks/api/stacks-blockchain/non-fungible-tokens/mints","/docs/stacks/api/stacks-blockchain/non-fungible-tokens/history","/docs/stacks/api/getting-started","/docs/stacks/api/requesting-proofs","/docs/stacks/setup","/docs/stacks/testing-environments","/docs/stacks/blockchain-development","/docs/stacks/connect","/docs/stacks/connect/support","/docs/stacks/connect/examples/authenticate-users","/docs/stacks/connect/examples/broadcast-transactions","/docs/stacks/connect/examples/sign-messages","/docs/stacks/connect/examples/migration","/docs/stacks/connect/packages/connect","/docs/stacks/connect/quickstart","/docs/stacks/reference/clarinet-js-sdk/simnet","/docs/stacks/reference/clarinet-js-sdk/properties","/docs/stacks/reference/clarinet-js-sdk/custom-matchers","/docs/stacks/reference/clarinet-js-sdk/methods","/docs/stacks/reference/clarinet-js-sdk/clarinet-sdk","/docs/stacks/reference/cli/clarinet","/docs/stacks/reference/cli/stacks-js","/docs/stacks/reference/stacks-blockchain-api/client","/docs/stacks/reference/stacks.js/connect","/docs/stacks/reference/stacks.js/sbtc","/docs/stacks/reference/stacks.js/transactions","/docs/stacks/reference/stacks.js/network","/docs/stacks/reference/stacks.js/common","/docs/stacks/chainhook/references/scopes/bitcoin","/docs/stacks/chainhook/references/scopes/stacks","/docs/stacks/chainhook","/docs/stacks/chainhook/examples/chainhook-as-a-service-with-stacks-node","/docs/stacks/chainhook/examples/register-chainhooks-on-devnet","/docs/stacks/chainhook/examples/chainhook-as-a-service","/docs/stacks/chainhook/examples/observing-contract-calls","/docs/stacks/chainhook/quickstart","/docs/stacks/chainhook/predicate-design","/docs/stacks/chainhook/installation","/docs/stacks/quickstarts","/docs/stacks/quickstarts/event-streaming","/docs/stacks/quickstarts/wallet-integration","/docs/stacks/quickstarts/app-templates","/docs/stacks/quickstarts/nft-minting","/docs/stacks/quickstarts/contract-templates","/docs/stacks/quickstarts/token-transfers","/docs/stacks/rpc-api/blocks","/docs/stacks/rpc-api/blocks/block-proposal","/docs/stacks/rpc-api/pox","/docs/stacks/rpc-api/pox/stacker-set","/docs/stacks/rpc-api/pox/pox-details","/docs/stacks/rpc-api/names/namespace-price","/docs/stacks/rpc-api/names","/docs/stacks/rpc-api/names/name-price","/docs/stacks/rpc-api/fees/estimate","/docs/stacks/rpc-api/fees","/docs/stacks/rpc-api/fees/transfer-estimate","/docs/stacks/rpc-api","/docs/stacks/rpc-api/info","/docs/stacks/rpc-api/info/core-api","/docs/stacks/rpc-api/transactions/broadcast-transaction","/docs/stacks/rpc-api/transactions","/docs/stacks/rpc-api/accounts","/docs/stacks/rpc-api/accounts/info","/docs/stacks/rpc-api/v3","/docs/stacks/rpc-api/v3/tenure-metadata","/docs/stacks/rpc-api/v3/nakamoto-block","/docs/stacks/rpc-api/v3/tenure-blocks","/docs/stacks/rpc-api/smart-contracts/interface","/docs/stacks/rpc-api/smart-contracts/traits","/docs/stacks/rpc-api/smart-contracts","/docs/stacks/rpc-api/smart-contracts/map-entry","/docs/stacks/rpc-api/smart-contracts/read-only","/docs/stacks/rpc-api/smart-contracts/source","/docs/stacks/rpc-api/smart-contracts/constants","/docs/stacks/rpc-api/burn-ops","/docs/stacks/rpc-api/burn-ops/get-burn-operations","/docs/bitcoin/contributors-guide","/docs/bitcoin/get-started","/docs/bitcoin/rate-limiting","/docs/bitcoin/runes/runehook","/docs/bitcoin/runes/runehook/quickstart","/docs/bitcoin/runes/runehook/installation","/docs/bitcoin/runes/explorer","/docs/bitcoin/runes/explorer/guides/build-explorer","/docs/bitcoin/runes/api","/docs/bitcoin/runes/api/info","/docs/bitcoin/runes/api/info/status","/docs/bitcoin/runes/api/balances/address","/docs/bitcoin/runes/api/balances","/docs/bitcoin/runes/api/balances/holder-balance","/docs/bitcoin/runes/api/balances/holders","/docs/bitcoin/runes/api/activities","/docs/bitcoin/runes/api/activities/for-transaction","/docs/bitcoin/runes/api/activities/for-address","/docs/bitcoin/runes/api/activities/for-block","/docs/bitcoin/runes/api/activities/activity","/docs/bitcoin/runes/api/usage","/docs/bitcoin/runes/api/etchings","/docs/bitcoin/runes/api/etchings/get-etchings","/docs/bitcoin/runes/api/etchings/get-etching","/docs/bitcoin/ordinals/explorer","/docs/bitcoin/ordinals/explorer/guides/build-explorer","/docs/bitcoin/ordinals/api/statistics","/docs/bitcoin/ordinals/api/statistics/get-stats-inscription-count","/docs/bitcoin/ordinals/api/brc20/get-brc20-token-holders","/docs/bitcoin/ordinals/api/brc20","/docs/bitcoin/ordinals/api/brc20/get-brc20-balances","/docs/bitcoin/ordinals/api/brc20/get-brc20-token-details","/docs/bitcoin/ordinals/api/brc20/get-brc20-tokens","/docs/bitcoin/ordinals/api/brc20/get-brc20-activity","/docs/bitcoin/ordinals/api/inscriptions","/docs/bitcoin/ordinals/api/inscriptions/get-inscription-transfers","/docs/bitcoin/ordinals/api/inscriptions/get-inscriptions","/docs/bitcoin/ordinals/api/inscriptions/get-inscription-content","/docs/bitcoin/ordinals/api/inscriptions/get-transfers-per-block","/docs/bitcoin/ordinals/api/inscriptions/get-inscription","/docs/bitcoin/ordinals/api","/docs/bitcoin/ordinals/api/info","/docs/bitcoin/ordinals/api/info/status","/docs/bitcoin/ordinals/api/usage","/docs/bitcoin/ordinals/api/satoshis","/docs/bitcoin/ordinals/api/satoshis/get-satoshi","/docs/bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions","/docs/bitcoin","/docs/bitcoin/api-keys","/docs/bitcoin/api/runes/info","/docs/bitcoin/api/runes/info/status","/docs/bitcoin/api/runes/balances/address","/docs/bitcoin/api/runes/balances","/docs/bitcoin/api/runes/balances/holder-balance","/docs/bitcoin/api/runes/balances/holders","/docs/bitcoin/api/runes/activities","/docs/bitcoin/api/runes/activities/for-transaction","/docs/bitcoin/api/runes/activities/for-address","/docs/bitcoin/api/runes/activities/for-block","/docs/bitcoin/api/runes/activities/activity","/docs/bitcoin/api/runes/etchings","/docs/bitcoin/api/runes/etchings/get-etchings","/docs/bitcoin/api/runes/etchings/get-etching","/docs/bitcoin/api/ordinals/statistics","/docs/bitcoin/api/ordinals/statistics/get-stats-inscription-count","/docs/bitcoin/api/ordinals/brc20/get-brc20-token-holders","/docs/bitcoin/api/ordinals/brc20","/docs/bitcoin/api/ordinals/brc20/get-brc20-balances","/docs/bitcoin/api/ordinals/brc20/get-brc20-token-details","/docs/bitcoin/api/ordinals/brc20/get-brc20-tokens","/docs/bitcoin/api/ordinals/brc20/get-brc20-activity","/docs/bitcoin/api/ordinals/inscriptions","/docs/bitcoin/api/ordinals/inscriptions/get-inscription-transfers","/docs/bitcoin/api/ordinals/inscriptions/get-inscriptions","/docs/bitcoin/api/ordinals/inscriptions/get-inscription-content","/docs/bitcoin/api/ordinals/inscriptions/get-transfers-per-block","/docs/bitcoin/api/ordinals/inscriptions/get-inscription","/docs/bitcoin/api/ordinals/info","/docs/bitcoin/api/ordinals/info/status","/docs/bitcoin/api/ordinals/satoshis","/docs/bitcoin/api/ordinals/satoshis/get-satoshi","/docs/bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions","/docs/bitcoin/api","/docs/bitcoin/indexer","/docs/bitcoin/indexer/guides/run-indexer","/docs/bitcoin/indexer/quickstart","/docs/bitcoin/quickstarts","/docs/guides/contributors-guide","/docs/guides/rate-limiting","/docs/guides","/docs/guides/sync-a-stacks-node","/docs/guides/installing-docker","/docs/guides/build-a-decentralized-kickstarter","/docs/guides/api-keys","/docs/guides/build-an-nft-marketplace","/docs/guides/using-clarity-values","/docs/guides/sync-a-bitcoin-node","/docs/guides/no-loss-lottery","/docs/guides/docskit"]},"index":{"indexes":{"id":{"type":"Radix","node":{"w":"","s":"","e":false,"k":"","d":[],"c":[["d",{"w":"d","s":"d","e":false,"k":"d","d":[],"c":[["o",{"w":"docs","s":"ocs","e":true,"k":"o","d":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517],"c":[["k",{"w":"docskit","s":"kit","e":true,"k":"k","d":[517],"c":[]}]]}],["e",{"w":"de","s":"e","e":false,"k":"e","d":[],"c":[["p",{"w":"deploy-","s":"ploy-","e":false,"k":"p","d":[],"c":[["a",{"w":"deploy-a-contract","s":"a-contract","e":true,"k":"a","d":[25],"c":[]}],["c",{"w":"deploy-contracts","s":"contracts","e":true,"k":"c","d":[46],"c":[]}]]}],["b",{"w":"debug-a-contract","s":"bug-a-contract","e":true,"k":"b","d":[26],"c":[]}],["v",{"w":"devnet","s":"vnet","e":true,"k":"v","d":[32,33,34,35,36,50],"c":[]}],["l",{"w":"delete","s":"lete","e":true,"k":"l","d":[42],"c":[]}],["f",{"w":"def","s":"f","e":false,"k":"f","d":[],"c":[["i",{"w":"define-","s":"ine-","e":false,"k":"i","d":[],"c":[["c",{"w":"define-constant","s":"constant","e":true,"k":"c","d":[92],"c":[]}],["m",{"w":"define-map","s":"map","e":true,"k":"m","d":[97],"c":[]}],["p",{"w":"define-p","s":"p","e":false,"k":"p","d":[],"c":[["u",{"w":"define-public","s":"ublic","e":true,"k":"u","d":[99],"c":[]}],["r",{"w":"define-private","s":"rivate","e":true,"k":"r","d":[129],"c":[]}]]}],["d",{"w":"define-data-var","s":"data-var","e":true,"k":"d","d":[100],"c":[]}],["t",{"w":"define-trait","s":"trait","e":true,"k":"t","d":[119],"c":[]}],["n",{"w":"define-non-fungible-token","s":"non-fungible-token","e":true,"k":"n","d":[122],"c":[]}],["r",{"w":"define-read-only","s":"read-only","e":true,"k":"r","d":[134],"c":[]}],["f",{"w":"define-fungible-token","s":"fungible-token","e":true,"k":"f","d":[160],"c":[]}]]}],["a",{"w":"default-to","s":"ault-to","e":true,"k":"a","d":[103],"c":[]}]]}],["t",{"w":"details-for-transactions","s":"tails-for-transactions","e":true,"k":"t","d":[311],"c":[]}]]}],["i",{"w":"divide","s":"ivide","e":true,"k":"i","d":[112],"c":[]}],["r",{"w":"dropped-mempool-transactions","s":"ropped-mempool-transactions","e":true,"k":"r","d":[309],"c":[]}]]}],["s",{"w":"s","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"st","s":"t","e":false,"k":"t","d":[],"c":[["a",{"w":"sta","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"stack","s":"ck","e":false,"k":"c","d":[],"c":[["s",{"w":"stacks","s":"s","e":true,"k":"s","d":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418],"c":[["-",{"w":"stacks-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"stacks-api","s":"api","e":true,"k":"a","d":[14,222],"c":[]}],["b",{"w":"stacks-blockchain","s":"blockchain","e":true,"k":"b","d":[17,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344],"c":[["-",{"w":"stacks-blockchain-api","s":"-api","e":true,"k":"-","d":[36,365],"c":[]}]]}],["j",{"w":"stacks-js","s":"js","e":true,"k":"j","d":[223,364],"c":[]}]]}]]}],["i",{"w":"stacking-","s":"ing-","e":false,"k":"i","d":[],"c":[["r",{"w":"stacking-rewards","s":"rewards","e":true,"k":"r","d":[281,282,283,284,285,286],"c":[]}],["p",{"w":"stacking-pool","s":"pool","e":true,"k":"p","d":[316,317],"c":[]}]]}],["e",{"w":"stacker","s":"er","e":false,"k":"e","d":[],"c":[["s",{"w":"stackers-for-signer-in-cycle","s":"s-for-signer-in-cycle","e":true,"k":"s","d":[292],"c":[]}],["-",{"w":"stacker-set","s":"-set","e":true,"k":"-","d":[391],"c":[]}]]}]]}],["r",{"w":"start","s":"rt","e":true,"k":"r","d":[35],"c":[["-",{"w":"start-a-development-console","s":"-a-development-console","e":true,"k":"-","d":[23],"c":[]}]]}],["t",{"w":"stat","s":"t","e":false,"k":"t","d":[],"c":[["u",{"w":"status","s":"us","e":true,"k":"u","d":[43,57,210,249,301,333,429,461,469,497],"c":[]}],["i",{"w":"statistics","s":"istics","e":true,"k":"i","d":[445,446,482,483],"c":[["-",{"w":"statistics-for-mempool-transactions","s":"-for-mempool-transactions","e":true,"k":"-","d":[306],"c":[]}]]}]]}]]}],["o",{"w":"stop","s":"op","e":true,"k":"o","d":[34],"c":[]}],["x",{"w":"stx","s":"x","e":true,"k":"x","d":[319],"c":[["-",{"w":"stx-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"stx-account","s":"account","e":true,"k":"a","d":[98],"c":[]}],["b",{"w":"stx-b","s":"b","e":false,"k":"b","d":[],"c":[["u",{"w":"stx-burn","s":"urn","e":true,"k":"u","d":[143],"c":[]}],["a",{"w":"stx-balances","s":"alances","e":true,"k":"a","d":[327],"c":[]}]]}],["t",{"w":"stx-transfer","s":"transfer","e":true,"k":"t","d":[150],"c":[["-",{"w":"stx-transfer-memo","s":"-memo","e":true,"k":"-","d":[184],"c":[]}]]}],["g",{"w":"stx-get-balance","s":"get-balance","e":true,"k":"g","d":[198],"c":[]}]]}]]}],["r",{"w":"string-to-","s":"ring-to-","e":false,"k":"r","d":[],"c":[["i",{"w":"string-to-int","s":"int","e":true,"k":"i","d":[138],"c":[]}],["u",{"w":"string-to-uint","s":"uint","e":true,"k":"u","d":[157],"c":[]}]]}]]}],["i",{"w":"si","s":"i","e":false,"k":"i","d":[],"c":[["m",{"w":"simnet","s":"mnet","e":true,"k":"m","d":[4,358],"c":[]}],["g",{"w":"sign","s":"gn","e":false,"k":"g","d":[],"c":[["e",{"w":"signer","s":"er","e":false,"k":"e","d":[],"c":[["-",{"w":"signer-","s":"-","e":false,"k":"-","d":[],"c":[["m",{"w":"signer-metrics-api","s":"metrics-api","e":true,"k":"m","d":[205,206,207,208,209,210,211,212,213,214,215,216,217,218],"c":[]}],["i",{"w":"signer-in","s":"in","e":false,"k":"i","d":[],"c":[["f",{"w":"signer-information-for-","s":"formation-for-","e":false,"k":"f","d":[],"c":[["a",{"w":"signer-information-for-a-block","s":"a-block","e":true,"k":"a","d":[216],"c":[]}],["m",{"w":"signer-information-for-most-recent-block-proposals","s":"most-recent-block-proposals","e":true,"k":"m","d":[218],"c":[]}]]}],["-",{"w":"signer-in-cycle","s":"-cycle","e":true,"k":"-","d":[289],"c":[]}]]}]]}],["s",{"w":"signers","s":"s","e":true,"k":"s","d":[213,214,215],"c":[["-",{"w":"signers-in-cycle","s":"-in-cycle","e":true,"k":"-","d":[291],"c":[]}]]}]]}],["-",{"w":"sign-messages","s":"-messages","e":true,"k":"-","d":[354],"c":[]}]]}]]}],["e",{"w":"se","s":"e","e":false,"k":"e","d":[],"c":[["m",{"w":"semi-fungible-token-metadata","s":"mi-fungible-token-metadata","e":true,"k":"m","d":[61,252],"c":[]}],["c",{"w":"secp256k1-","s":"cp256k1-","e":false,"k":"c","d":[],"c":[["r",{"w":"secp256k1-recover","s":"recover","e":true,"k":"r","d":[162],"c":[]}],["v",{"w":"secp256k1-verify","s":"verify","e":true,"k":"v","d":[169],"c":[]}]]}],["a",{"w":"search","s":"arch","e":true,"k":"a","d":[293,294],"c":[["-",{"w":"search-by-id","s":"-by-id","e":true,"k":"-","d":[293],"c":[]}]]}],["t",{"w":"setup","s":"tup","e":true,"k":"t","d":[347],"c":[]}]]}],["h",{"w":"sha","s":"ha","e":false,"k":"h","d":[],"c":[["2",{"w":"sha256","s":"256","e":true,"k":"2","d":[84],"c":[]}],["5",{"w":"sha512","s":"512","e":true,"k":"5","d":[181],"c":[["-",{"w":"sha512-256","s":"-256","e":true,"k":"-","d":[111],"c":[]}]]}]]}],["q",{"w":"sqrti","s":"qrti","e":true,"k":"q","d":[106],"c":[]}],["u",{"w":"su","s":"u","e":false,"k":"u","d":[],"c":[["b",{"w":"subtract","s":"btract","e":true,"k":"b","d":[140],"c":[]}],["p",{"w":"support","s":"pport","e":true,"k":"p","d":[351],"c":[]}]]}],["o",{"w":"so","s":"o","e":false,"k":"o","d":[],"c":[["m",{"w":"some","s":"me","e":true,"k":"m","d":[168],"c":[]}],["u",{"w":"source","s":"urce","e":true,"k":"u","d":[415],"c":[]}]]}],["l",{"w":"slice","s":"lice","e":true,"k":"l","d":[194],"c":[]}],["m",{"w":"smart-contract","s":"mart-contract","e":false,"k":"m","d":[],"c":[["-",{"w":"smart-contract-development","s":"-development","e":true,"k":"-","d":[225],"c":[]}],["s",{"w":"smart-contracts","s":"s","e":true,"k":"s","d":[329,330,331,332,333,410,411,412,413,414,415,416],"c":[]}]]}],["b",{"w":"sbtc","s":"btc","e":true,"k":"b","d":[233,367],"c":[]}],["c",{"w":"scopes","s":"copes","e":true,"k":"c","d":[371,372],"c":[]}],["a",{"w":"satoshis","s":"atoshis","e":true,"k":"a","d":[463,464,465,498,499,500],"c":[]}],["y",{"w":"sync-a-","s":"ync-a-","e":false,"k":"y","d":[],"c":[["s",{"w":"sync-a-stacks-node","s":"stacks-node","e":true,"k":"s","d":[509],"c":[]}],["b",{"w":"sync-a-bitcoin-node","s":"bitcoin-node","e":true,"k":"b","d":[515],"c":[]}]]}]]}],["c",{"w":"c","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"co","s":"o","e":false,"k":"o","d":[],"c":[["n",{"w":"con","s":"n","e":false,"k":"n","d":[],"c":[["t",{"w":"contr","s":"tr","e":false,"k":"t","d":[],"c":[["i",{"w":"contributors-guide","s":"ibutors-guide","e":true,"k":"i","d":[1,419,506],"c":[]}],["a",{"w":"contract-","s":"act-","e":false,"k":"a","d":[],"c":[["m",{"w":"contract-monitoring","s":"monitoring","e":true,"k":"m","d":[51],"c":[]}],["c",{"w":"contract-call","s":"call","e":true,"k":"c","d":[86],"c":[]}],["o",{"w":"contract-of","s":"of","e":true,"k":"o","d":[90],"c":[]}],["t",{"w":"contract-templates","s":"templates","e":true,"k":"t","d":[386],"c":[]}]]}]]}],["c",{"w":"conc","s":"c","e":false,"k":"c","d":[],"c":[["e",{"w":"concepts","s":"epts","e":true,"k":"e","d":[19,237,238,239,240,241,242],"c":[]}],["a",{"w":"concat","s":"at","e":true,"k":"a","d":[182],"c":[]}]]}],["n",{"w":"connect","s":"nect","e":true,"k":"n","d":[350,351,352,353,354,355,356,357,366],"c":[]}],["s",{"w":"constants","s":"stants","e":true,"k":"s","d":[416],"c":[]}]]}],["m",{"w":"common","s":"mmon","e":true,"k":"m","d":[236,370],"c":[]}],["r",{"w":"core-api","s":"re-api","e":true,"k":"r","d":[401],"c":[]}]]}],["l",{"w":"cl","s":"l","e":false,"k":"l","d":[],"c":[["a",{"w":"clari","s":"ari","e":false,"k":"a","d":[],"c":[["n",{"w":"clarinet","s":"net","e":true,"k":"n","d":[18,19,20,21,22,23,24,25,26,27,28,29,30,221,363],"c":[["-",{"w":"clarinet-","s":"-","e":false,"k":"-","d":[],"c":[["j",{"w":"clarinet-js-sdk","s":"js-sdk","e":true,"k":"j","d":[4,5,6,7,8,9,10,358,359,360,361,362],"c":[]}],["s",{"w":"clarinet-sdk","s":"sdk","e":true,"k":"s","d":[362],"c":[]}]]}]]}],["t",{"w":"clarity","s":"ty","e":true,"k":"t","d":[76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202],"c":[]}]]}],["i",{"w":"cli","s":"i","e":true,"k":"i","d":[363,364],"c":[["e",{"w":"client","s":"ent","e":true,"k":"e","d":[64,65,66,67,365],"c":[]}]]}]]}],["u",{"w":"custom-matchers","s":"ustom-matchers","e":true,"k":"u","d":[6,360],"c":[]}],["r",{"w":"cr","s":"r","e":false,"k":"r","d":[],"c":[["e",{"w":"create","s":"eate","e":true,"k":"e","d":[38],"c":[["-",{"w":"create-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"create-deployment-plans","s":"deployment-plans","e":true,"k":"d","d":[27],"c":[]}],["a",{"w":"create-a-new-project","s":"a-new-project","e":true,"k":"a","d":[29],"c":[]}],["p",{"w":"create-project","s":"project","e":true,"k":"p","d":[47],"c":[]}],["c",{"w":"create-chainhooks","s":"chainhooks","e":true,"k":"c","d":[52],"c":[]}]]}]]}],["y",{"w":"cryptographic-functions","s":"yptographic-functions","e":true,"k":"y","d":[80],"c":[]}]]}],["h",{"w":"chainhook","s":"hainhook","e":true,"k":"h","d":[371,372,373,374,375,376,377,378,379,380],"c":[["s",{"w":"chainhooks","s":"s","e":true,"k":"s","d":[37,38,39,40,41,42,43],"c":[]}],["-",{"w":"chainhook-as-a-service","s":"-as-a-service","e":true,"k":"-","d":[376],"c":[["-",{"w":"chainhook-as-a-service-with-stacks-node","s":"-with-stacks-node","e":true,"k":"-","d":[374],"c":[]}]]}]]}],["y",{"w":"cycle","s":"ycle","e":true,"k":"y","d":[290],"c":[["s",{"w":"cycles","s":"s","e":true,"k":"s","d":[287],"c":[]}]]}],["i",{"w":"circulating-stx-supply-in-plain-text","s":"irculating-stx-supply-in-plain-text","e":true,"k":"i","d":[297],"c":[]}]]}],["g",{"w":"g","s":"g","e":false,"k":"g","d":[],"c":[["e",{"w":"get","s":"et","e":true,"k":"e","d":[39,116],"c":[["-",{"w":"get-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"get-s","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"get-sta","s":"ta","e":false,"k":"t","d":[],"c":[["r",{"w":"get-started","s":"rted","e":true,"k":"r","d":[2,420],"c":[]}],["c",{"w":"get-stacks-block-info","s":"cks-block-info","e":true,"k":"c","d":[104],"c":[]}],["t",{"w":"get-stats-inscription-count","s":"ts-inscription-count","e":true,"k":"t","d":[446,483],"c":[]}]]}],["a",{"w":"get-satoshi","s":"atoshi","e":true,"k":"a","d":[464,499],"c":[["-",{"w":"get-satoshi-inscriptions","s":"-inscriptions","e":true,"k":"-","d":[465,500],"c":[]}]]}]]}],["f",{"w":"get-ft-metadata","s":"ft-metadata","e":true,"k":"f","d":[67],"c":[]}],["b",{"w":"get-b","s":"b","e":false,"k":"b","d":[],"c":[["u",{"w":"get-burn-","s":"urn-","e":false,"k":"u","d":[],"c":[["b",{"w":"get-burn-block","s":"block","e":true,"k":"b","d":[336],"c":[["-",{"w":"get-burn-block-info","s":"-info","e":true,"k":"-","d":[95],"c":[]}],["s",{"w":"get-burn-blocks","s":"s","e":true,"k":"s","d":[338],"c":[]}]]}],["o",{"w":"get-burn-operations","s":"operations","e":true,"k":"o","d":[418],"c":[]}]]}],["l",{"w":"get-block","s":"lock","e":true,"k":"l","d":[260],"c":[["-",{"w":"get-block-info","s":"-info","e":true,"k":"-","d":[156],"c":[]}],["s",{"w":"get-blocks","s":"s","e":true,"k":"s","d":[267],"c":[["-",{"w":"get-blocks-by-burn-block","s":"-by-burn-block","e":true,"k":"-","d":[264],"c":[]}]]}]]}],["r",{"w":"get-brc20-","s":"rc20-","e":false,"k":"r","d":[],"c":[["t",{"w":"get-brc20-token","s":"token","e":false,"k":"t","d":[],"c":[["-",{"w":"get-brc20-token-","s":"-","e":false,"k":"-","d":[],"c":[["h",{"w":"get-brc20-token-holders","s":"holders","e":true,"k":"h","d":[447,484],"c":[]}],["d",{"w":"get-brc20-token-details","s":"details","e":true,"k":"d","d":[450,487],"c":[]}]]}],["s",{"w":"get-brc20-tokens","s":"s","e":true,"k":"s","d":[451,488],"c":[]}]]}],["b",{"w":"get-brc20-balances","s":"balances","e":true,"k":"b","d":[449,486],"c":[]}],["a",{"w":"get-brc20-activity","s":"activity","e":true,"k":"a","d":[452,489],"c":[]}]]}]]}],["t",{"w":"get-t","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"get-tenure-info","s":"enure-info","e":true,"k":"e","d":[127],"c":[]}],["r",{"w":"get-trans","s":"rans","e":false,"k":"r","d":[],"c":[["a",{"w":"get-transaction","s":"action","e":true,"k":"a","d":[310],"c":[]}],["f",{"w":"get-transfers-per-block","s":"fers-per-block","e":true,"k":"f","d":[457,494],"c":[]}]]}]]}],["r",{"w":"get-raw-transaction","s":"raw-transaction","e":true,"k":"r","d":[315],"c":[]}],["e",{"w":"get-etching","s":"etching","e":true,"k":"e","d":[442,481],"c":[["s",{"w":"get-etchings","s":"s","e":true,"k":"s","d":[441,480],"c":[]}]]}],["i",{"w":"get-inscription","s":"inscription","e":true,"k":"i","d":[458,495],"c":[["-",{"w":"get-inscription-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"get-inscription-transfers","s":"transfers","e":true,"k":"t","d":[454,491],"c":[]}],["c",{"w":"get-inscription-content","s":"content","e":true,"k":"c","d":[456,493],"c":[]}]]}],["s",{"w":"get-inscriptions","s":"s","e":true,"k":"s","d":[455,492],"c":[]}]]}]]}],["t",{"w":"getting-started","s":"ting-started","e":true,"k":"t","d":[345],"c":[]}]]}],["u",{"w":"guides","s":"uides","e":true,"k":"u","d":[14,15,16,17,75,220,221,222,223,426,444,503,506,507,508,509,510,511,512,513,514,515,516,517],"c":[]}],["r",{"w":"greater-than","s":"reater-than","e":true,"k":"r","d":[154],"c":[["-",{"w":"greater-than-or-equal","s":"-or-equal","e":true,"k":"-","d":[191],"c":[]}]]}]]}],["r",{"w":"r","s":"r","e":false,"k":"r","d":[],"c":[["a",{"w":"rate-limiting","s":"ate-limiting","e":true,"k":"a","d":[3,421,507],"c":[]}],["e",{"w":"re","s":"e","e":false,"k":"e","d":[],"c":[["f",{"w":"reference","s":"ference","e":true,"k":"f","d":[11,358,359,360,361,362,363,364,365,366,367,368,369,370],"c":[["s",{"w":"references","s":"s","e":true,"k":"s","d":[4,5,6,7,371,372],"c":[]}]]}],["c",{"w":"rec","s":"c","e":false,"k":"c","d":[],"c":[["i",{"w":"recipes","s":"ipes","e":true,"k":"i","d":[72],"c":[]}],["e",{"w":"recent-","s":"ent-","e":false,"k":"e","d":[],"c":[["b",{"w":"recent-b","s":"b","e":false,"k":"b","d":[],"c":[["l",{"w":"recent-blocks","s":"locks","e":true,"k":"l","d":[261],"c":[]}],["u",{"w":"recent-burnchain-reward-recipient","s":"urnchain-reward-recipient","e":true,"k":"u","d":[283],"c":[["s",{"w":"recent-burnchain-reward-recipients","s":"s","e":true,"k":"s","d":[281],"c":[]}]]}]]}],["r",{"w":"recent-reward-slot-holder","s":"reward-slot-holder","e":false,"k":"r","d":[],"c":[["s",{"w":"recent-reward-slot-holders","s":"s","e":true,"k":"s","d":[284],"c":[]}],["-",{"w":"recent-reward-slot-holder-entries","s":"-entries","e":true,"k":"-","d":[285],"c":[]}]]}],["t",{"w":"recent-transactions","s":"transactions","e":true,"k":"t","d":[312],"c":[]}]]}]]}],["p",{"w":"replace-at","s":"place-at","e":true,"k":"p","d":[109],"c":[]}],["q",{"w":"requesting-proofs","s":"questing-proofs","e":true,"k":"q","d":[346],"c":[]}],["g",{"w":"register-chainhooks-on-devnet","s":"gister-chainhooks-on-devnet","e":true,"k":"g","d":[375],"c":[]}],["a",{"w":"read-only","s":"ad-only","e":true,"k":"a","d":[414],"c":[]}]]}],["u",{"w":"run","s":"un","e":false,"k":"u","d":[],"c":[["-",{"w":"run-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"run-a-local-devnet","s":"a-local-devnet","e":true,"k":"a","d":[24],"c":[]}],["i",{"w":"run-indexer","s":"indexer","e":true,"k":"i","d":[503],"c":[]}]]}],["e",{"w":"rune","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"runes","s":"s","e":true,"k":"s","d":[422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,468,469,470,471,472,473,474,475,476,477,478,479,480,481],"c":[]}],["h",{"w":"runehook","s":"hook","e":true,"k":"h","d":[422,423,424],"c":[]}]]}]]}],["o",{"w":"roadmap","s":"oadmap","e":true,"k":"o","d":[229],"c":[]}],["p",{"w":"rpc-api","s":"pc-api","e":true,"k":"p","d":[388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418],"c":[]}]]}],["p",{"w":"p","s":"p","e":false,"k":"p","d":[],"c":[["r",{"w":"pr","s":"r","e":false,"k":"r","d":[],"c":[["o",{"w":"pro","s":"o","e":false,"k":"o","d":[],"c":[["p",{"w":"properties","s":"perties","e":true,"k":"p","d":[5,359],"c":[]}],["m",{"w":"prometheus","s":"metheus","e":true,"k":"m","d":[211,212],"c":[]}],["o",{"w":"proof-of-transfer","s":"of-of-transfer","e":true,"k":"o","d":[287,288,289,290,291,292],"c":[]}]]}],["i",{"w":"pri","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"prin","s":"n","e":false,"k":"n","d":[],"c":[["c",{"w":"principal-","s":"cipal-","e":false,"k":"c","d":[],"c":[["o",{"w":"principal-of","s":"of","e":true,"k":"o","d":[94],"c":[]}],["d",{"w":"principal-destruct","s":"destruct","e":true,"k":"d","d":[141],"c":[]}],["c",{"w":"principal-construct","s":"construct","e":true,"k":"c","d":[200],"c":[]}]]}],["t",{"w":"print","s":"t","e":true,"k":"t","d":[199],"c":[]}]]}],["v",{"w":"private-keys","s":"vate-keys","e":true,"k":"v","d":[239],"c":[]}]]}],["e",{"w":"predicate-design","s":"edicate-design","e":true,"k":"e","d":[379],"c":[]}]]}],["l",{"w":"platform","s":"latform","e":true,"k":"l","d":[45,46,47,48,49,50,51,52,53],"c":[["-",{"w":"platform-api","s":"-api","e":true,"k":"-","d":[31,32,33,34,35,36,37,38,39,40,41,42,43],"c":[]}]]}],["o",{"w":"po","s":"o","e":false,"k":"o","d":[],"c":[["w",{"w":"pow","s":"w","e":true,"k":"w","d":[185],"c":[]}],["x",{"w":"pox","s":"x","e":true,"k":"x","d":[390,391,392],"c":[["-",{"w":"pox-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"pox-cycle-signer","s":"cycle-signer","e":true,"k":"c","d":[214],"c":[["s",{"w":"pox-cycle-signers","s":"s","e":true,"k":"s","d":[215],"c":[]}]]}],["d",{"w":"pox-details","s":"details","e":true,"k":"d","d":[392],"c":[]}]]}]]}],["s",{"w":"post-conditions","s":"st-conditions","e":true,"k":"s","d":[231,238],"c":[]}]]}],["a",{"w":"pa","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"packages","s":"ckages","e":true,"k":"c","d":[233,234,235,236,356],"c":[]}],["g",{"w":"pagination","s":"gination","e":true,"k":"g","d":[255],"c":[]}]]}]]}],["m",{"w":"m","s":"m","e":false,"k":"m","d":[],"c":[["e",{"w":"me","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"met","s":"t","e":false,"k":"t","d":[],"c":[["h",{"w":"methods","s":"hods","e":true,"k":"h","d":[7,361],"c":[]}],["r",{"w":"metrics","s":"rics","e":true,"k":"r","d":[212],"c":[]}]]}],["r",{"w":"merge","s":"rge","e":true,"k":"r","d":[189],"c":[]}],["m",{"w":"mem","s":"m","e":false,"k":"m","d":[],"c":[["p",{"w":"mempool","s":"pool","e":true,"k":"p","d":[334,335],"c":[["-",{"w":"mempool-transactions","s":"-transactions","e":true,"k":"-","d":[313],"c":[]}]]}],["b",{"w":"members","s":"bers","e":true,"k":"b","d":[316],"c":[]}]]}]]}],["a",{"w":"ma","s":"a","e":false,"k":"a","d":[],"c":[["p",{"w":"map","s":"p","e":true,"k":"p","d":[105],"c":[["-",{"w":"map-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"map-delete","s":"delete","e":true,"k":"d","d":[89],"c":[]}],["s",{"w":"map-set","s":"set","e":true,"k":"s","d":[132],"c":[]}],["i",{"w":"map-insert","s":"insert","e":true,"k":"i","d":[167],"c":[]}],["g",{"w":"map-get","s":"get","e":true,"k":"g","d":[172],"c":[]}],["e",{"w":"map-entry","s":"entry","e":true,"k":"e","d":[413],"c":[]}]]}]]}],["t",{"w":"match","s":"tch","e":true,"k":"t","d":[170],"c":[]}]]}],["u",{"w":"multiply","s":"ultiply","e":true,"k":"u","d":[102],"c":[]}],["o",{"w":"mod","s":"od","e":true,"k":"o","d":[197],"c":[]}],["i",{"w":"mi","s":"i","e":false,"k":"i","d":[],"c":[["g",{"w":"migration","s":"gration","e":true,"k":"g","d":[355],"c":[["-",{"w":"migration-guide","s":"-guide","e":true,"k":"-","d":[246],"c":[]}]]}],["n",{"w":"mints","s":"nts","e":true,"k":"n","d":[343],"c":[]}]]}]]}],["q",{"w":"quickstart","s":"quickstart","e":true,"k":"q","d":[9,30,53,65,243,357,378,423,504],"c":[["s",{"w":"quickstarts","s":"s","e":true,"k":"s","d":[381,382,383,384,385,386,387,505],"c":[]}]]}],["i",{"w":"i","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"in","s":"n","e":false,"k":"n","d":[],"c":[["s",{"w":"ins","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"install","s":"tall","e":false,"k":"t","d":[],"c":[["a",{"w":"installation","s":"ation","e":true,"k":"a","d":[10,244,380,424],"c":[]}],["i",{"w":"installing-docker","s":"ing-docker","e":true,"k":"i","d":[510],"c":[]}]]}],["c",{"w":"inscriptions","s":"criptions","e":true,"k":"c","d":[453,454,455,456,457,458,490,491,492,493,494,495],"c":[]}]]}],["f",{"w":"info","s":"fo","e":true,"k":"f","d":[56,57,209,210,248,249,295,296,297,298,299,300,301,302,332,400,401,405,428,429,460,461,468,469,496,497],"c":[]}],["t",{"w":"int","s":"t","e":false,"k":"t","d":[],"c":[["-",{"w":"int-to-","s":"-to-","e":false,"k":"-","d":[],"c":[["a",{"w":"int-to-ascii","s":"ascii","e":true,"k":"a","d":[88],"c":[]}],["u",{"w":"int-to-utf8","s":"utf8","e":true,"k":"u","d":[120],"c":[]}]]}],["e",{"w":"inte","s":"e","e":false,"k":"e","d":[],"c":[["g",{"w":"integration-testing","s":"gration-testing","e":true,"k":"g","d":[245],"c":[]}],["r",{"w":"interface","s":"rface","e":true,"k":"r","d":[410],"c":[]}]]}]]}],["d",{"w":"index","s":"dex","e":false,"k":"d","d":[],"c":[["-",{"w":"index-of","s":"-of","e":true,"k":"-","d":[183],"c":[]}],["e",{"w":"indexer","s":"er","e":true,"k":"e","d":[502,503,504],"c":[]}]]}],["b",{"w":"inbound-stx-transfers","s":"bound-stx-transfers","e":true,"k":"b","d":[328],"c":[]}]]}],["s",{"w":"is-","s":"s-","e":false,"k":"s","d":[],"c":[["e",{"w":"is-e","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"is-err","s":"rr","e":true,"k":"r","d":[124],"c":[]}],["q",{"w":"is-eq","s":"q","e":true,"k":"q","d":[173],"c":[]}]]}],["o",{"w":"is-ok","s":"ok","e":true,"k":"o","d":[136],"c":[]}],["n",{"w":"is-none","s":"none","e":true,"k":"n","d":[139],"c":[]}],["s",{"w":"is-s","s":"s","e":false,"k":"s","d":[],"c":[["o",{"w":"is-some","s":"ome","e":true,"k":"o","d":[146],"c":[]}],["t",{"w":"is-standard","s":"tandard","e":true,"k":"t","d":[147],"c":[]}]]}]]}],["m",{"w":"impl-trait","s":"mpl-trait","e":true,"k":"m","d":[152],"c":[]}],["f",{"w":"if","s":"f","e":true,"k":"f","d":[196],"c":[]}]]}],["t",{"w":"t","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"te","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"testing-","s":"sting-","e":false,"k":"s","d":[],"c":[["b",{"w":"testing-best-practices","s":"best-practices","e":true,"k":"b","d":[12],"c":[]}],["e",{"w":"testing-environments","s":"environments","e":true,"k":"e","d":[348],"c":[]}]]}],["n",{"w":"tenure-","s":"nure-","e":false,"k":"n","d":[],"c":[["m",{"w":"tenure-metadata","s":"metadata","e":true,"k":"m","d":[407],"c":[]}],["b",{"w":"tenure-blocks","s":"blocks","e":true,"k":"b","d":[409],"c":[]}]]}]]}],["o",{"w":"to","s":"o","e":false,"k":"o","d":[],"c":[["k",{"w":"token","s":"ken","e":false,"k":"k","d":[],"c":[["-",{"w":"token-","s":"-","e":false,"k":"-","d":[],"c":[["m",{"w":"token-metadata","s":"metadata","e":true,"k":"m","d":[248,249,250,251,252,253,254],"c":[["-",{"w":"token-metadata-api","s":"-api","e":true,"k":"-","d":[15,54,55,56,57,58,59,60,61,62,63,64,65,66,67],"c":[]}]]}],["d",{"w":"token-development","s":"development","e":true,"k":"d","d":[204],"c":[]}],["t",{"w":"token-transfers","s":"transfers","e":true,"k":"t","d":[387],"c":[]}]]}],["s",{"w":"tokens","s":"s","e":true,"k":"s","d":[59,60,61,62,63,66,67,250,251,252,253,254,339,340],"c":[]}]]}],["-",{"w":"to-","s":"-","e":false,"k":"-","d":[],"c":[["u",{"w":"to-uint","s":"uint","e":true,"k":"u","d":[118],"c":[]}],["c",{"w":"to-consensus-buff","s":"consensus-buff","e":true,"k":"c","d":[142],"c":[]}],["i",{"w":"to-int","s":"int","e":true,"k":"i","d":[153],"c":[]}]]}],["t",{"w":"total-","s":"tal-","e":false,"k":"t","d":[],"c":[["b",{"w":"total-burnchain-rewards-for-recipient","s":"burnchain-rewards-for-recipient","e":true,"k":"b","d":[286],"c":[]}],["a",{"w":"total-and-unlocked-stx-supply","s":"and-unlocked-stx-supply","e":true,"k":"a","d":[295],"c":[]}],["s",{"w":"total-stx-supply-in-plain-text","s":"stx-supply-in-plain-text","e":true,"k":"s","d":[300],"c":[]}]]}]]}],["u",{"w":"tuple","s":"uple","e":true,"k":"u","d":[83],"c":[]}],["r",{"w":"tr","s":"r","e":false,"k":"r","d":[],"c":[["y",{"w":"try","s":"y","e":true,"k":"y","d":[166],"c":[]}],["a",{"w":"tra","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"trans","s":"ns","e":false,"k":"n","d":[],"c":[["a",{"w":"transaction","s":"action","e":false,"k":"a","d":[],"c":[["s",{"w":"transactions","s":"s","e":true,"k":"s","d":[226,234,237,303,304,305,306,307,308,309,310,311,312,313,314,315,322,368,402,403],"c":[["-",{"w":"transactions-","s":"-","e":false,"k":"-","d":[],"c":[["f",{"w":"transactions-for-address","s":"for-address","e":true,"k":"f","d":[308],"c":[]}],["b",{"w":"transactions-by-block","s":"by-block","e":true,"k":"b","d":[314],"c":[]}],["w",{"w":"transactions-with-transfers","s":"with-transfers","e":true,"k":"w","d":[320],"c":[]}]]}]]}],["-",{"w":"transaction-","s":"-","e":false,"k":"-","d":[],"c":[["e",{"w":"transaction-events","s":"events","e":true,"k":"e","d":[305],"c":[]}],["w",{"w":"transaction-with-transfers","s":"with-transfers","e":true,"k":"w","d":[325],"c":[]}],["f",{"w":"transaction-fee-priorities","s":"fee-priorities","e":true,"k":"f","d":[335],"c":[]}]]}]]}],["f",{"w":"transfer-estimate","s":"fer-estimate","e":true,"k":"f","d":[398],"c":[]}]]}],["i",{"w":"traits","s":"its","e":true,"k":"i","d":[411],"c":[]}]]}]]}],["i",{"w":"time-and-blocks","s":"ime-and-blocks","e":true,"k":"i","d":[202],"c":[]}]]}],["a",{"w":"a","s":"a","e":false,"k":"a","d":[],"c":[["r",{"w":"archi","s":"rchi","e":false,"k":"r","d":[],"c":[["v",{"w":"archive","s":"ve","e":true,"k":"v","d":[13,14,15,16,17,68,69,70,71],"c":[["-",{"w":"archive-project","s":"-project","e":true,"k":"-","d":[48],"c":[]}]]}],["t",{"w":"architecture","s":"tecture","e":true,"k":"t","d":[55,259],"c":[]}]]}],["d",{"w":"add","s":"dd","e":true,"k":"d","d":[137],"c":[["-",{"w":"add-a-contract","s":"-a-contract","e":true,"k":"-","d":[20],"c":[]}],["r",{"w":"address","s":"ress","e":true,"k":"r","d":[430,470],"c":[["-",{"w":"address-transactions","s":"-transactions","e":true,"k":"-","d":[303],"c":[]}]]}]]}],["i",{"w":"ai","s":"i","e":true,"k":"i","d":[70],"c":[]}],["c",{"w":"ac","s":"c","e":false,"k":"c","d":[],"c":[["c",{"w":"acc","s":"c","e":false,"k":"c","d":[],"c":[["e",{"w":"access-control","s":"ess-control","e":true,"k":"e","d":[81],"c":[]}],["o",{"w":"accounts","s":"ounts","e":true,"k":"o","d":[320,321,322,323,324,325,326,327,328,404,405],"c":[["-",{"w":"accounts-and-addresses","s":"-and-addresses","e":true,"k":"-","d":[240],"c":[]}]]}]]}],["t",{"w":"activit","s":"tivit","e":false,"k":"t","d":[],"c":[["i",{"w":"activities","s":"ies","e":true,"k":"i","d":[434,435,436,437,438,474,475,476,477,478],"c":[]}],["y",{"w":"activity","s":"y","e":true,"k":"y","d":[438,478],"c":[]}]]}]]}],["n",{"w":"and","s":"nd","e":true,"k":"n","d":[108],"c":[]}],["s",{"w":"as","s":"s","e":false,"k":"s","d":[],"c":[["-",{"w":"as-","s":"-","e":false,"k":"-","d":[],"c":[["m",{"w":"as-max-len","s":"max-len","e":true,"k":"m","d":[126],"c":[]}],["c",{"w":"as-contract","s":"contract","e":true,"k":"c","d":[192],"c":[]}]]}],["s",{"w":"asse","s":"se","e":false,"k":"s","d":[],"c":[["r",{"w":"asserts","s":"rts","e":true,"k":"r","d":[193],"c":[]}],["t",{"w":"assets","s":"ts","e":true,"k":"t","d":[324],"c":[]}]]}]]}],["p",{"w":"ap","s":"p","e":false,"k":"p","d":[],"c":[["p",{"w":"app","s":"p","e":false,"k":"p","d":[],"c":[["e",{"w":"append","s":"end","e":true,"k":"e","d":[149],"c":[]}],["-",{"w":"app-templates","s":"-templates","e":true,"k":"-","d":[384],"c":[]}]]}],["i",{"w":"api","s":"i","e":true,"k":"i","d":[248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501],"c":[["-",{"w":"api-keys","s":"-keys","e":true,"k":"-","d":[247,467,512],"c":[]}]]}]]}],["t",{"w":"at-block","s":"t-block","e":true,"k":"t","d":[161],"c":[]}],["g",{"w":"aggregated-signer-information-for-","s":"ggregated-signer-information-for-","e":false,"k":"g","d":[],"c":[["a",{"w":"aggregated-signer-information-for-a-block","s":"a-block","e":true,"k":"a","d":[206],"c":[]}],["m",{"w":"aggregated-signer-information-for-most-recent-blocks","s":"most-recent-blocks","e":true,"k":"m","d":[207],"c":[]}]]}],["u",{"w":"authenticat","s":"uthenticat","e":false,"k":"u","d":[],"c":[["i",{"w":"authentication","s":"ion","e":true,"k":"i","d":[257],"c":[]}],["e",{"w":"authenticate-users","s":"e-users","e":true,"k":"e","d":[352],"c":[]}]]}],["v",{"w":"average-times","s":"verage-times","e":true,"k":"v","d":[266],"c":[]}]]}],["v",{"w":"v","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"verify-archive-data","s":"erify-archive-data","e":true,"k":"e","d":[16],"c":[]}],["a",{"w":"va","s":"a","e":false,"k":"a","d":[],"c":[["l",{"w":"validate-a-contract","s":"lidate-a-contract","e":true,"k":"l","d":[21],"c":[]}],["r",{"w":"var-","s":"r-","e":false,"k":"r","d":[],"c":[["g",{"w":"var-get","s":"get","e":true,"k":"g","d":[131],"c":[]}],["s",{"w":"var-set","s":"set","e":true,"k":"s","d":[175],"c":[]}]]}]]}],["6",{"w":"v6","s":"6","e":true,"k":"6","d":[226,227],"c":[]}],["3",{"w":"v3","s":"3","e":true,"k":"3","d":[406,407,408,409],"c":[]}]]}],["e",{"w":"e","s":"e","e":false,"k":"e","d":[],"c":[["x",{"w":"ex","s":"x","e":false,"k":"x","d":[],"c":[["a",{"w":"examples","s":"amples","e":true,"k":"a","d":[20,21,22,23,24,25,26,27,28,29,46,47,48,49,50,51,52,230,231,232,352,353,354,355,374,375,376,377],"c":[]}],["p",{"w":"explorer","s":"plorer","e":true,"k":"p","d":[74,75,220,425,426,443,444],"c":[]}]]}],["s",{"w":"estimate","s":"stimate","e":true,"k":"s","d":[396],"c":[["-",{"w":"estimate-costs","s":"-costs","e":true,"k":"-","d":[22],"c":[]}]]}],["r",{"w":"err","s":"rr","e":true,"k":"r","d":[164],"c":[]}],["l",{"w":"element-at","s":"lement-at","e":true,"k":"l","d":[180],"c":[]}],["v",{"w":"event","s":"vent","e":false,"k":"v","d":[],"c":[["s",{"w":"events","s":"s","e":true,"k":"s","d":[329],"c":[["-",{"w":"events-for-an-address-transaction","s":"-for-an-address-transaction","e":true,"k":"-","d":[304],"c":[]}]]}],["-",{"w":"event-streaming","s":"-streaming","e":true,"k":"-","d":[382],"c":[]}]]}],["t",{"w":"etchings","s":"tchings","e":true,"k":"t","d":[440,441,442,479,480,481],"c":[]}]]}],["w",{"w":"w","s":"w","e":false,"k":"w","d":[],"c":[["o",{"w":"working-with-sbtc","s":"orking-with-sbtc","e":true,"k":"o","d":[28],"c":[]}],["e",{"w":"web-app-development","s":"eb-app-development","e":true,"k":"e","d":[203],"c":[]}],["a",{"w":"wallet-integration","s":"allet-integration","e":true,"k":"a","d":[383],"c":[]}]]}],["b",{"w":"b","s":"b","e":false,"k":"b","d":[],"c":[["i",{"w":"bit","s":"it","e":false,"k":"i","d":[],"c":[["c",{"w":"bitcoin","s":"coin","e":true,"k":"c","d":[371,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505],"c":[["-",{"w":"bitcoin-node","s":"-node","e":true,"k":"-","d":[32],"c":[]}]]}],["-",{"w":"bit-","s":"-","e":false,"k":"-","d":[],"c":[["m",{"w":"bit-manipulation","s":"manipulation","e":true,"k":"m","d":[76],"c":[]}],["a",{"w":"bit-and","s":"and","e":true,"k":"a","d":[113],"c":[]}],["x",{"w":"bit-xor","s":"xor","e":true,"k":"x","d":[128],"c":[]}],["o",{"w":"bit-or","s":"or","e":true,"k":"o","d":[130],"c":[]}],["s",{"w":"bit-shift-","s":"shift-","e":false,"k":"s","d":[],"c":[["r",{"w":"bit-shift-right","s":"right","e":true,"k":"r","d":[145],"c":[]}],["l",{"w":"bit-shift-left","s":"left","e":true,"k":"l","d":[174],"c":[]}]]}],["n",{"w":"bit-not","s":"not","e":true,"k":"n","d":[187],"c":[]}]]}]]}],["u",{"w":"bu","s":"u","e":false,"k":"u","d":[],"c":[["i",{"w":"build-","s":"ild-","e":false,"k":"i","d":[],"c":[["a",{"w":"build-a","s":"a","e":false,"k":"a","d":[],"c":[["-",{"w":"build-a-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"build-a-custom-api","s":"custom-api","e":true,"k":"c","d":[68],"c":[]}],["d",{"w":"build-a-decentralized-","s":"decentralized-","e":false,"k":"d","d":[],"c":[["g",{"w":"build-a-decentralized-grants-program","s":"grants-program","e":true,"k":"g","d":[69],"c":[]}],["k",{"w":"build-a-decentralized-kickstarter","s":"kickstarter","e":true,"k":"k","d":[511],"c":[]}]]}],["f",{"w":"build-a-friend-tech-clone","s":"friend-tech-clone","e":true,"k":"f","d":[71],"c":[]}]]}],["n",{"w":"build-an-nft-marketplace","s":"n-nft-marketplace","e":true,"k":"n","d":[513],"c":[]}]]}],["e",{"w":"build-explorer","s":"explorer","e":true,"k":"e","d":[75,426,444],"c":[]}]]}],["f",{"w":"buff-to-","s":"ff-to-","e":false,"k":"f","d":[],"c":[["i",{"w":"buff-to-int-","s":"int-","e":false,"k":"i","d":[],"c":[["b",{"w":"buff-to-int-be","s":"be","e":true,"k":"b","d":[87],"c":[]}],["l",{"w":"buff-to-int-le","s":"le","e":true,"k":"l","d":[179],"c":[]}]]}],["u",{"w":"buff-to-uint-","s":"uint-","e":false,"k":"u","d":[],"c":[["b",{"w":"buff-to-uint-be","s":"be","e":true,"k":"b","d":[133],"c":[]}],["l",{"w":"buff-to-uint-le","s":"le","e":true,"k":"l","d":[158],"c":[]}]]}]]}],["r",{"w":"burn-","s":"rn-","e":false,"k":"r","d":[],"c":[["b",{"w":"burn-blocks","s":"blocks","e":true,"k":"b","d":[336,337,338],"c":[]}],["o",{"w":"burn-ops","s":"ops","e":true,"k":"o","d":[417,418],"c":[]}]]}]]}],["a",{"w":"ba","s":"a","e":false,"k":"a","d":[],"c":[["s",{"w":"basic-arithmetic","s":"sic-arithmetic","e":true,"k":"s","d":[77],"c":[]}],["l",{"w":"balances","s":"lances","e":true,"k":"l","d":[321,430,431,432,433,470,471,472,473],"c":[]}]]}],["e",{"w":"begin","s":"egin","e":true,"k":"e","d":[163],"c":[]}],["l",{"w":"block","s":"lock","e":false,"k":"l","d":[],"c":[["s",{"w":"blocks","s":"s","e":true,"k":"s","d":[205,206,207,260,261,262,263,264,265,266,267,268,269,388,389],"c":[]}],["-",{"w":"block-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"block-proposal","s":"proposal","e":true,"k":"p","d":[389],"c":[["s",{"w":"block-proposals","s":"s","e":true,"k":"s","d":[216,217,218],"c":[]}]]}],["b",{"w":"block-by-","s":"by-","e":false,"k":"b","d":[],"c":[["h",{"w":"block-by-h","s":"h","e":false,"k":"h","d":[],"c":[["a",{"w":"block-by-hash","s":"ash","e":true,"k":"a","d":[262],"c":[]}],["e",{"w":"block-by-height","s":"eight","e":true,"k":"e","d":[269],"c":[]}]]}],["b",{"w":"block-by-burn-block-h","s":"burn-block-h","e":false,"k":"b","d":[],"c":[["e",{"w":"block-by-burn-block-height","s":"eight","e":true,"k":"e","d":[265],"c":[]}],["a",{"w":"block-by-burn-block-hash","s":"ash","e":true,"k":"a","d":[268],"c":[]}]]}]]}]]}],["c",{"w":"blockchain-development","s":"chain-development","e":true,"k":"c","d":[349],"c":[]}]]}],["r",{"w":"br","s":"r","e":false,"k":"r","d":[],"c":[["o",{"w":"broadcast","s":"oadcast","e":false,"k":"o","d":[],"c":[["-",{"w":"broadcast-transaction","s":"-transaction","e":true,"k":"-","d":[402],"c":[["s",{"w":"broadcast-transactions","s":"s","e":true,"k":"s","d":[230,353],"c":[]}]]}],["i",{"w":"broadcasting","s":"ing","e":true,"k":"i","d":[242],"c":[]}]]}],["c",{"w":"brc20","s":"c20","e":true,"k":"c","d":[447,448,449,450,451,452,484,485,486,487,488,489],"c":[]}]]}],["y",{"w":"by-trait","s":"y-trait","e":true,"k":"y","d":[330],"c":[]}]]}],["l",{"w":"l","s":"l","e":false,"k":"l","d":[],"c":[["i",{"w":"list","s":"ist","e":true,"k":"i","d":[37,82],"c":[]}],["o",{"w":"log2","s":"og2","e":true,"k":"o","d":[107],"c":[]}],["e",{"w":"le","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"len","s":"n","e":true,"k":"n","d":[110],"c":[]}],["s",{"w":"less-than","s":"ss-than","e":true,"k":"s","d":[114],"c":[["-",{"w":"less-than-or-equal","s":"-or-equal","e":true,"k":"-","d":[176],"c":[]}]]}],["t",{"w":"let","s":"t","e":true,"k":"t","d":[171],"c":[]}],["g",{"w":"legacy-total-and-unlocked-stx-supply","s":"gacy-total-and-unlocked-stx-supply","e":true,"k":"g","d":[302],"c":[]}]]}],["a",{"w":"latest-nonce","s":"atest-nonce","e":true,"k":"a","d":[326],"c":[]}]]}],["u",{"w":"u","s":"u","e":false,"k":"u","d":[],"c":[["p",{"w":"update","s":"pdate","e":true,"k":"p","d":[41],"c":[]}],["s",{"w":"us","s":"s","e":false,"k":"s","d":[],"c":[["a",{"w":"usage","s":"age","e":true,"k":"a","d":[58,439,462],"c":[]}],["e",{"w":"use-","s":"e-","e":false,"k":"e","d":[],"c":[["t",{"w":"use-trait","s":"trait","e":true,"k":"t","d":[117],"c":[]}],["w",{"w":"use-with-react-native","s":"with-react-native","e":true,"k":"w","d":[232],"c":[]}]]}],["i",{"w":"using-clarity-values","s":"ing-clarity-values","e":true,"k":"i","d":[514],"c":[]}]]}],["n",{"w":"un","s":"n","e":false,"k":"n","d":[],"c":[["w",{"w":"unwrap","s":"wrap","e":true,"k":"w","d":[85],"c":[["-",{"w":"unwrap-","s":"-","e":false,"k":"-","d":[],"c":[["e",{"w":"unwrap-err","s":"err","e":true,"k":"e","d":[159],"c":[["-",{"w":"unwrap-err-panic","s":"-panic","e":true,"k":"-","d":[148],"c":[]}]]}],["p",{"w":"unwrap-panic","s":"panic","e":true,"k":"p","d":[151],"c":[]}]]}]]}],["i",{"w":"unit-testing","s":"it-testing","e":true,"k":"i","d":[224],"c":[]}]]}]]}],["f",{"w":"f","s":"f","e":false,"k":"f","d":[],"c":[["a",{"w":"faucet","s":"aucet","e":true,"k":"a","d":[49],"c":[["s",{"w":"faucets","s":"s","e":true,"k":"s","d":[318,319],"c":[]}]]}],["u",{"w":"fun","s":"un","e":false,"k":"u","d":[],"c":[["g",{"w":"fungible-token","s":"gible-token","e":false,"k":"g","d":[],"c":[["-",{"w":"fungible-token-metadata","s":"-metadata","e":true,"k":"-","d":[60,251],"c":[]}],["s",{"w":"fungible-tokens","s":"s","e":true,"k":"s","d":[62,253],"c":[]}]]}],["c",{"w":"functions","s":"ctions","e":true,"k":"c","d":[82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200],"c":[]}]]}],["o",{"w":"fo","s":"o","e":false,"k":"o","d":[],"c":[["l",{"w":"fold","s":"ld","e":true,"k":"l","d":[96],"c":[]}],["r",{"w":"for-","s":"r-","e":false,"k":"r","d":[],"c":[["t",{"w":"for-transaction","s":"transaction","e":true,"k":"t","d":[435,475],"c":[]}],["a",{"w":"for-address","s":"address","e":true,"k":"a","d":[436,476],"c":[]}],["b",{"w":"for-block","s":"block","e":true,"k":"b","d":[437,477],"c":[]}]]}]]}],["t",{"w":"ft-","s":"t-","e":false,"k":"t","d":[],"c":[["b",{"w":"ft-burn","s":"burn","e":true,"k":"b","d":[115],"c":[]}],["t",{"w":"ft-transfer","s":"transfer","e":true,"k":"t","d":[123],"c":[]}],["g",{"w":"ft-get-","s":"get-","e":false,"k":"g","d":[],"c":[["s",{"w":"ft-get-supply","s":"supply","e":true,"k":"s","d":[125],"c":[]}],["b",{"w":"ft-get-balance","s":"balance","e":true,"k":"b","d":[190],"c":[]}]]}],["m",{"w":"ft-mint","s":"mint","e":true,"k":"m","d":[178],"c":[]}]]}],["r",{"w":"from-consensus-buff","s":"rom-consensus-buff","e":true,"k":"r","d":[144],"c":[]}],["i",{"w":"filter","s":"ilter","e":true,"k":"i","d":[177],"c":[]}],["e",{"w":"fee","s":"ee","e":false,"k":"e","d":[],"c":[["s",{"w":"fees","s":"s","e":true,"k":"s","d":[279,280,396,397,398],"c":[]}],["-",{"w":"fee-rate","s":"-rate","e":true,"k":"-","d":[279],"c":[]}]]}]]}],["n",{"w":"n","s":"n","e":false,"k":"n","d":[],"c":[["o",{"w":"no","s":"o","e":false,"k":"o","d":[],"c":[["n",{"w":"non","s":"n","e":false,"k":"n","d":[],"c":[["-",{"w":"non-fungible-token","s":"-fungible-token","e":false,"k":"-","d":[],"c":[["-",{"w":"non-fungible-token-metadata","s":"-metadata","e":true,"k":"-","d":[63,254],"c":[]}],["s",{"w":"non-fungible-tokens","s":"s","e":true,"k":"s","d":[341,342,343,344],"c":[]}]]}],["c",{"w":"nonce-handling","s":"ce-handling","e":true,"k":"c","d":[258],"c":[]}]]}],["t",{"w":"not","s":"t","e":true,"k":"t","d":[155],"c":[]}],["-",{"w":"no-loss-lottery","s":"-loss-lottery","e":true,"k":"-","d":[516],"c":[]}]]}],["f",{"w":"nft-","s":"ft-","e":false,"k":"f","d":[],"c":[["t",{"w":"nft-transfer","s":"transfer","e":true,"k":"t","d":[101],"c":[]}],["b",{"w":"nft-burn","s":"burn","e":true,"k":"b","d":[135],"c":[]}],["m",{"w":"nft-mint","s":"mint","e":true,"k":"m","d":[186],"c":[["i",{"w":"nft-minting","s":"ing","e":true,"k":"i","d":[385],"c":[]}]]}],["g",{"w":"nft-get-owner","s":"get-owner","e":true,"k":"g","d":[195],"c":[]}],["e",{"w":"nft-events","s":"events","e":true,"k":"e","d":[323],"c":[]}]]}],["a",{"w":"na","s":"a","e":false,"k":"a","d":[],"c":[["k",{"w":"nakamoto","s":"kamoto","e":true,"k":"k","d":[219,220,221,222,223],"c":[["-",{"w":"nakamoto-block","s":"-block","e":true,"k":"-","d":[408],"c":[]}]]}],["m",{"w":"name","s":"me","e":false,"k":"m","d":[],"c":[["s",{"w":"names","s":"s","e":true,"k":"s","d":[270,271,272,273,274,275,276,277,278,393,394,395],"c":[["p",{"w":"namespace","s":"pace","e":false,"k":"p","d":[],"c":[["-",{"w":"namespace-","s":"-","e":false,"k":"-","d":[],"c":[["n",{"w":"namespace-names","s":"names","e":true,"k":"n","d":[275],"c":[]}],["p",{"w":"namespace-price","s":"price","e":true,"k":"p","d":[393],"c":[]}]]}],["s",{"w":"namespaces","s":"s","e":true,"k":"s","d":[276],"c":[]}]]}]]}],["-",{"w":"name-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"name-subdomains","s":"subdomains","e":true,"k":"s","d":[271],"c":[]}],["z",{"w":"name-zonefile","s":"zonefile","e":true,"k":"z","d":[272],"c":[]}],["d",{"w":"name-details","s":"details","e":true,"k":"d","d":[277],"c":[]}],["p",{"w":"name-price","s":"price","e":true,"k":"p","d":[395],"c":[]}]]}]]}]]}],["e",{"w":"network","s":"etwork","e":true,"k":"e","d":[227,235,369],"c":[["s",{"w":"networks","s":"s","e":true,"k":"s","d":[241],"c":[]}],["-",{"w":"network-","s":"-","e":false,"k":"-","d":[],"c":[["g",{"w":"network-given-block-time","s":"given-block-time","e":true,"k":"g","d":[296],"c":[]}],["b",{"w":"network-block-time","s":"block-time","e":true,"k":"b","d":[298],"c":[]}]]}]]}]]}],["h",{"w":"h","s":"h","e":false,"k":"h","d":[],"c":[["a",{"w":"ha","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"hacks","s":"cks","e":true,"k":"c","d":[68,69,70,71,72,73],"c":[]}],["s",{"w":"hash160","s":"sh160","e":true,"k":"s","d":[188],"c":[]}],["n",{"w":"handling-optionals-and-errors","s":"ndling-optionals-and-errors","e":true,"k":"n","d":[201],"c":[]}]]}],["i",{"w":"histor","s":"istor","e":false,"k":"i","d":[],"c":[["i",{"w":"historical-zonefile","s":"ical-zonefile","e":true,"k":"i","d":[278],"c":[]}],["y",{"w":"history","s":"y","e":true,"k":"y","d":[344],"c":[]}]]}],["o",{"w":"hold","s":"old","e":false,"k":"o","d":[],"c":[["e",{"w":"holder","s":"er","e":false,"k":"e","d":[],"c":[["s",{"w":"holders","s":"s","e":true,"k":"s","d":[340,433,473],"c":[]}],["-",{"w":"holder-balance","s":"-balance","e":true,"k":"-","d":[432,472],"c":[]}]]}],["i",{"w":"holdings","s":"ings","e":true,"k":"i","d":[342],"c":[]}]]}]]}],["o",{"w":"o","s":"o","e":false,"k":"o","d":[],"c":[["p",{"w":"optimizations","s":"ptimizations","e":true,"k":"p","d":[79],"c":[]}],["k",{"w":"ok","s":"k","e":true,"k":"k","d":[121],"c":[]}],["r",{"w":"or","s":"r","e":true,"k":"r","d":[165],"c":[["d",{"w":"ordinals","s":"dinals","e":true,"k":"d","d":[443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500],"c":[]}]]}],["w",{"w":"owned-by-address","s":"wned-by-address","e":true,"k":"w","d":[274],"c":[]}],["b",{"w":"observing-contract-calls","s":"bserving-contract-calls","e":true,"k":"b","d":[377],"c":[]}]]}],["k",{"w":"keccak256","s":"keccak256","e":true,"k":"k","d":[91],"c":[]}],["x",{"w":"xor","s":"xor","e":true,"k":"x","d":[93],"c":[]}],["j",{"w":"js","s":"js","e":true,"k":"j","d":[226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,366,367,368,369,370],"c":[]}]]},"isArray":false},"title":{"type":"Radix","node":{"w":"","s":"","e":false,"k":"","d":[],"c":[["c",{"w":"c","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"co","s":"o","e":false,"k":"o","d":[],"c":[["n",{"w":"con","s":"n","e":false,"k":"n","d":[],"c":[["t",{"w":"cont","s":"t","e":false,"k":"t","d":[],"c":[["r",{"w":"contr","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"contributors","s":"ibutors","e":true,"k":"i","d":[1,419,506],"c":[]}],["a",{"w":"contract","s":"act","e":true,"k":"a","d":[20,21,22,25,26,225,329,332,377,386,410,413,415],"c":[["s",{"w":"contracts","s":"s","e":true,"k":"s","d":[46,51,330,331,333,412],"c":[]}],["-",{"w":"contract-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"contract-call","s":"call","e":true,"k":"c","d":[86],"c":[]}],["o",{"w":"contract-of","s":"of","e":true,"k":"o","d":[90],"c":[]}]]}]]}],["o",{"w":"control","s":"ol","e":true,"k":"o","d":[81],"c":[]}]]}],["e",{"w":"content","s":"ent","e":true,"k":"e","d":[456,493],"c":[]}]]}],["c",{"w":"conc","s":"c","e":false,"k":"c","d":[],"c":[["e",{"w":"concepts","s":"epts","e":true,"k":"e","d":[19],"c":[]}],["a",{"w":"concat","s":"at","e":true,"k":"a","d":[182],"c":[]}]]}],["s",{"w":"cons","s":"s","e":false,"k":"s","d":[],"c":[["o",{"w":"console","s":"ole","e":true,"k":"o","d":[23],"c":[]}],["t",{"w":"constant","s":"tant","e":true,"k":"t","d":[416],"c":[]}]]}],["n",{"w":"connect","s":"nect","e":true,"k":"n","d":[356,366],"c":[]}]]}],["s",{"w":"costs","s":"sts","e":true,"k":"s","d":[22],"c":[]}],["o",{"w":"cookbook","s":"okbook","e":true,"k":"o","d":[72],"c":[]}],["m",{"w":"common","s":"mmon","e":true,"k":"m","d":[236,370],"c":[]}],["r",{"w":"core","s":"re","e":true,"k":"r","d":[401],"c":[]}],["u",{"w":"count","s":"unt","e":true,"k":"u","d":[446,483],"c":[]}]]}],["u",{"w":"custom","s":"ustom","e":true,"k":"u","d":[6,68,360],"c":[]}],["r",{"w":"cr","s":"r","e":false,"k":"r","d":[],"c":[["e",{"w":"create","s":"eate","e":true,"k":"e","d":[27,29,38,47,52,72],"c":[]}],["y",{"w":"cryptographic","s":"yptographic","e":true,"k":"y","d":[80],"c":[]}]]}],["h",{"w":"chainhook","s":"hainhook","e":true,"k":"h","d":[38,39,41,42,43,52,374,376,377],"c":[["s",{"w":"chainhooks","s":"s","e":true,"k":"s","d":[37,40,375],"c":[]}]]}],["l",{"w":"cl","s":"l","e":false,"k":"l","d":[],"c":[["o",{"w":"clone","s":"one","e":true,"k":"o","d":[71],"c":[]}],["a",{"w":"clari","s":"ari","e":false,"k":"a","d":[],"c":[["n",{"w":"clarinet","s":"net","e":true,"k":"n","d":[221,363],"c":[["-",{"w":"clarinet-sdk","s":"-sdk","e":true,"k":"-","d":[362],"c":[]}]]}],["t",{"w":"clarity","s":"ty","e":true,"k":"t","d":[514],"c":[]}]]}],["i",{"w":"cli","s":"i","e":true,"k":"i","d":[363,364],"c":[]}]]}],["y",{"w":"cycle","s":"ycle","e":true,"k":"y","d":[214,215,289,290,291,292],"c":[["s",{"w":"cycles","s":"s","e":true,"k":"s","d":[287],"c":[]}]]}],["i",{"w":"circulating","s":"irculating","e":true,"k":"i","d":[297],"c":[]}],["a",{"w":"call","s":"all","e":true,"k":"a","d":[414],"c":[["s",{"w":"calls","s":"s","e":true,"k":"s","d":[377],"c":[]}]]}]]}],["g",{"w":"g","s":"g","e":false,"k":"g","d":[],"c":[["u",{"w":"guide","s":"uide","e":true,"k":"u","d":[1,246,355,419,506],"c":[]}],["e",{"w":"get","s":"et","e":true,"k":"e","d":[37,39,43,57,60,61,62,63,67,116,249,251,252,253,254,260,261,262,264,265,266,267,268,269,270,271,272,274,275,276,277,278,279,281,283,284,285,286,287,289,290,291,292,295,296,297,298,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,320,321,322,323,324,325,326,327,328,329,330,332,333,335,336,338,340,342,343,344,391,392,393,395,396,398,401,405,407,408,409,410,411,413,415,416,418,420,429,430,432,433,435,436,437,438,441,442,446,447,449,450,451,452,454,455,456,457,458,461,464,465,469,470,472,473,475,476,477,478,480,481,483,484,486,487,488,489,491,492,493,494,495,497,499,500],"c":[["-",{"w":"get-","s":"-","e":false,"k":"-","d":[],"c":[["b",{"w":"get-b","s":"b","e":false,"k":"b","d":[],"c":[["u",{"w":"get-burn-block-info","s":"urn-block-info","e":true,"k":"u","d":[95],"c":[]}],["l",{"w":"get-block-info","s":"lock-info","e":true,"k":"l","d":[156],"c":[]}]]}],["s",{"w":"get-stacks-block-info","s":"stacks-block-info","e":true,"k":"s","d":[104],"c":[]}],["t",{"w":"get-tenure-info","s":"tenure-info","e":true,"k":"t","d":[127],"c":[]}]]}],["t",{"w":"getting","s":"ting","e":true,"k":"t","d":[345],"c":[]}]]}],["r",{"w":"gr","s":"r","e":false,"k":"r","d":[],"c":[["a",{"w":"grants","s":"ants","e":true,"k":"a","d":[69],"c":[]}],["e",{"w":"greater","s":"eater","e":true,"k":"e","d":[154,191],"c":[]}]]}],["i",{"w":"given","s":"iven","e":true,"k":"i","d":[283,286,296,396],"c":[]}]]}],["i",{"w":"i","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"in","s":"n","e":true,"k":"n","d":[289,291,292,297,300],"c":[["t",{"w":"int","s":"t","e":false,"k":"t","d":[],"c":[["r",{"w":"introduction","s":"roduction","e":true,"k":"r","d":[2,78],"c":[]}],["-",{"w":"int-to-","s":"-to-","e":false,"k":"-","d":[],"c":[["a",{"w":"int-to-ascii","s":"ascii","e":true,"k":"a","d":[88],"c":[]}],["u",{"w":"int-to-utf8","s":"utf8","e":true,"k":"u","d":[120],"c":[]}]]}],["o",{"w":"into","s":"o","e":true,"k":"o","d":[231],"c":[]}],["e",{"w":"inte","s":"e","e":false,"k":"e","d":[],"c":[["g",{"w":"integration","s":"gration","e":true,"k":"g","d":[245,383],"c":[]}],["r",{"w":"interface","s":"rface","e":true,"k":"r","d":[410],"c":[]}]]}]]}],["s",{"w":"ins","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"install","s":"tall","e":true,"k":"t","d":[510],"c":[["a",{"w":"installation","s":"ation","e":true,"k":"a","d":[10,244,380,424],"c":[]}]]}],["c",{"w":"inscription","s":"cription","e":true,"k":"c","d":[446,454,456,458,483,491,493,495],"c":[["s",{"w":"inscriptions","s":"s","e":true,"k":"s","d":[453,455,465,490,492,500],"c":[]}]]}]]}],["f",{"w":"info","s":"fo","e":true,"k":"f","d":[56,209,248,299,332,400,401,405],"c":[["r",{"w":"information","s":"rmation","e":true,"k":"r","d":[206,207,216,218,391],"c":[]}]]}],["d",{"w":"index-of","s":"dex-of","e":true,"k":"d","d":[183],"c":[]}],["b",{"w":"inbound","s":"bound","e":true,"k":"b","d":[328],"c":[]}]]}],["s",{"w":"is-","s":"s-","e":false,"k":"s","d":[],"c":[["e",{"w":"is-e","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"is-err","s":"rr","e":true,"k":"r","d":[124],"c":[]}],["q",{"w":"is-eq","s":"q","e":true,"k":"q","d":[173],"c":[]}]]}],["o",{"w":"is-ok","s":"ok","e":true,"k":"o","d":[136],"c":[]}],["n",{"w":"is-none","s":"none","e":true,"k":"n","d":[139],"c":[]}],["s",{"w":"is-s","s":"s","e":false,"k":"s","d":[],"c":[["o",{"w":"is-some","s":"ome","e":true,"k":"o","d":[146],"c":[]}],["t",{"w":"is-standard","s":"tandard","e":true,"k":"t","d":[147],"c":[]}]]}]]}],["m",{"w":"impl","s":"mpl","e":false,"k":"m","d":[],"c":[["-",{"w":"impl-trait","s":"-trait","e":true,"k":"-","d":[152],"c":[]}],["e",{"w":"implementation","s":"ementation","e":true,"k":"e","d":[411],"c":[]}]]}],["f",{"w":"if","s":"f","e":true,"k":"f","d":[196],"c":[]}],["d",{"w":"id","s":"d","e":true,"k":"d","d":[293],"c":[]}]]}],["r",{"w":"r","s":"r","e":false,"k":"r","d":[],"c":[["a",{"w":"ra","s":"a","e":false,"k":"a","d":[],"c":[["t",{"w":"rate","s":"te","e":true,"k":"t","d":[3,279,421,507],"c":[]}],["w",{"w":"raw","s":"w","e":true,"k":"w","d":[315],"c":[]}]]}],["u",{"w":"run","s":"un","e":true,"k":"u","d":[24,374,376],"c":[["e",{"w":"rune","s":"e","e":true,"k":"e","d":[433,473],"c":[]}]]}],["e",{"w":"re","s":"e","e":false,"k":"e","d":[],"c":[["q",{"w":"request","s":"quest","e":true,"k":"q","d":[49],"c":[["i",{"w":"requesting","s":"ing","e":true,"k":"i","d":[346],"c":[]}]]}],["c",{"w":"rec","s":"c","e":false,"k":"c","d":[],"c":[["i",{"w":"recip","s":"ip","e":false,"k":"i","d":[],"c":[["e",{"w":"recipe","s":"e","e":true,"k":"e","d":[72],"c":[]}],["i",{"w":"recipient","s":"ient","e":true,"k":"i","d":[283,286],"c":[["s",{"w":"recipients","s":"s","e":true,"k":"s","d":[281],"c":[]}]]}]]}],["e",{"w":"recent","s":"ent","e":true,"k":"e","d":[207,218,261,281,283,284,285,312],"c":[]}]]}],["p",{"w":"replace-at","s":"place-at","e":true,"k":"p","d":[109],"c":[]}],["a",{"w":"rea","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"react","s":"ct","e":true,"k":"c","d":[232],"c":[]}],["d",{"w":"read-only","s":"d-only","e":true,"k":"d","d":[414],"c":[]}]]}],["w",{"w":"reward","s":"ward","e":true,"k":"w","d":[281,283,284,285],"c":[["s",{"w":"rewards","s":"s","e":true,"k":"s","d":[282,286],"c":[]}]]}],["g",{"w":"register","s":"gister","e":true,"k":"g","d":[375],"c":[]}]]}]]}],["l",{"w":"l","s":"l","e":false,"k":"l","d":[],"c":[["i",{"w":"li","s":"i","e":false,"k":"i","d":[],"c":[["m",{"w":"limiting","s":"miting","e":true,"k":"m","d":[3,421,507],"c":[]}],["b",{"w":"libraries","s":"braries","e":true,"k":"b","d":[11],"c":[]}],["s",{"w":"list","s":"st","e":true,"k":"s","d":[82],"c":[]}]]}],["o",{"w":"lo","s":"o","e":false,"k":"o","d":[],"c":[["c",{"w":"local","s":"cal","e":true,"k":"c","d":[24],"c":[]}],["g",{"w":"log","s":"g","e":false,"k":"g","d":[],"c":[["2",{"w":"log2","s":"2","e":true,"k":"2","d":[107],"c":[]}],["i",{"w":"logic","s":"ic","e":true,"k":"i","d":[202],"c":[]}]]}],["t",{"w":"lottery","s":"ttery","e":true,"k":"t","d":[516],"c":[]}]]}],["e",{"w":"le","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"len","s":"n","e":true,"k":"n","d":[110],"c":[]}],["s",{"w":"less","s":"ss","e":true,"k":"s","d":[114,176],"c":[]}],["t",{"w":"let","s":"t","e":true,"k":"t","d":[171],"c":[]}],["g",{"w":"legacy","s":"gacy","e":true,"k":"g","d":[302],"c":[]}]]}],["a",{"w":"latest","s":"atest","e":true,"k":"a","d":[326],"c":[]}]]}],["s",{"w":"s","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"si","s":"i","e":false,"k":"i","d":[],"c":[["m",{"w":"simnet","s":"mnet","e":true,"k":"m","d":[4,358],"c":[]}],["g",{"w":"sign","s":"gn","e":true,"k":"g","d":[354],"c":[["e",{"w":"signer","s":"er","e":true,"k":"e","d":[206,207,214,216,218,289,292,391],"c":[["s",{"w":"signers","s":"s","e":true,"k":"s","d":[213,215,291],"c":[]}]]}]]}]]}],["d",{"w":"sdks","s":"dks","e":true,"k":"d","d":[11],"c":[]}],["t",{"w":"st","s":"t","e":false,"k":"t","d":[],"c":[["a",{"w":"sta","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"stack","s":"ck","e":false,"k":"c","d":[],"c":[["s",{"w":"stacks","s":"s","e":true,"k":"s","d":[14,17,36,70,75,220,222,223,226,227,229,232,234,235,236,356,364,365,366,368,369,370,372,374,509],"c":[]}],["i",{"w":"stacking","s":"ing","e":true,"k":"i","d":[282,316,317],"c":[]}],["e",{"w":"stacker","s":"er","e":true,"k":"e","d":[391],"c":[["s",{"w":"stackers","s":"s","e":true,"k":"s","d":[292],"c":[]}]]}]]}],["r",{"w":"start","s":"rt","e":true,"k":"r","d":[23,35],"c":[["e",{"w":"started","s":"ed","e":true,"k":"e","d":[345,420],"c":[]}]]}],["t",{"w":"stat","s":"t","e":false,"k":"t","d":[],"c":[["u",{"w":"status","s":"us","e":true,"k":"u","d":[43,57,210,249,301,333,428,429,460,461,468,469,496,497],"c":[]}],["i",{"w":"statistics","s":"istics","e":true,"k":"i","d":[306,445,482],"c":[]}]]}]]}],["o",{"w":"stop","s":"op","e":true,"k":"o","d":[34],"c":[]}],["x",{"w":"stx","s":"x","e":true,"k":"x","d":[49,295,297,300,302,319,327,328],"c":[["-",{"w":"stx-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"stx-account","s":"account","e":true,"k":"a","d":[98],"c":[]}],["b",{"w":"stx-burn","s":"burn","e":true,"k":"b","d":[143],"c":[]}],["t",{"w":"stx-transfer","s":"transfer","e":true,"k":"t","d":[150],"c":[["-",{"w":"stx-transfer-memo","s":"-memo","e":true,"k":"-","d":[184],"c":[]}]]}],["g",{"w":"stx-get-balance","s":"get-balance","e":true,"k":"g","d":[198],"c":[]}]]}]]}],["r",{"w":"str","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"string-to-","s":"ing-to-","e":false,"k":"i","d":[],"c":[["i",{"w":"string-to-int","s":"int","e":true,"k":"i","d":[138],"c":[]}],["u",{"w":"string-to-uint","s":"uint","e":true,"k":"u","d":[157],"c":[]}]]}],["e",{"w":"streaming","s":"eaming","e":true,"k":"e","d":[382],"c":[]}]]}]]}],["b",{"w":"sbtc","s":"btc","e":true,"k":"b","d":[28,233,367],"c":[]}],["p",{"w":"specific","s":"pecific","e":true,"k":"p","d":[39],"c":[]}],["e",{"w":"se","s":"e","e":false,"k":"e","d":[],"c":[["m",{"w":"semi-fungible","s":"mi-fungible","e":true,"k":"m","d":[61,252],"c":[]}],["c",{"w":"secp256k1-","s":"cp256k1-","e":false,"k":"c","d":[],"c":[["r",{"w":"secp256k1-recover","s":"recover","e":true,"k":"r","d":[162],"c":[]}],["v",{"w":"secp256k1-verify","s":"verify","e":true,"k":"v","d":[169],"c":[]}]]}],["a",{"w":"search","s":"arch","e":true,"k":"a","d":[293,294],"c":[]}],["t",{"w":"set","s":"t","e":true,"k":"t","d":[391],"c":[["u",{"w":"setup","s":"up","e":true,"k":"u","d":[347],"c":[]}]]}],["r",{"w":"service","s":"rvice","e":true,"k":"r","d":[374,376],"c":[]}]]}],["h",{"w":"sha","s":"ha","e":false,"k":"h","d":[],"c":[["2",{"w":"sha256","s":"256","e":true,"k":"2","d":[84],"c":[]}],["5",{"w":"sha512","s":"512","e":true,"k":"5","d":[111,181],"c":[]}]]}],["q",{"w":"sqrti","s":"qrti","e":true,"k":"q","d":[106],"c":[]}],["u",{"w":"su","s":"u","e":false,"k":"u","d":[],"c":[["b",{"w":"sub","s":"b","e":false,"k":"b","d":[],"c":[["t",{"w":"subtract","s":"tract","e":true,"k":"t","d":[140],"c":[]}],["d",{"w":"subdomains","s":"domains","e":true,"k":"d","d":[271],"c":[]}]]}],["p",{"w":"supp","s":"pp","e":false,"k":"p","d":[],"c":[["l",{"w":"supply","s":"ly","e":true,"k":"l","d":[295,297,300,302],"c":[]}],["o",{"w":"support","s":"ort","e":true,"k":"o","d":[351],"c":[]}]]}]]}],["o",{"w":"so","s":"o","e":false,"k":"o","d":[],"c":[["m",{"w":"some","s":"me","e":true,"k":"m","d":[168],"c":[]}],["u",{"w":"source","s":"urce","e":true,"k":"u","d":[415],"c":[]}]]}],["l",{"w":"sl","s":"l","e":false,"k":"l","d":[],"c":[["i",{"w":"slice","s":"ice","e":true,"k":"i","d":[194],"c":[]}],["o",{"w":"slot","s":"ot","e":true,"k":"o","d":[284,285],"c":[]}]]}],["m",{"w":"smart","s":"mart","e":true,"k":"m","d":[225,331,412],"c":[]}],["c",{"w":"scopes","s":"copes","e":true,"k":"c","d":[371,372],"c":[]}],["a",{"w":"satoshi","s":"atoshi","e":true,"k":"a","d":[464,465,499,500],"c":[["s",{"w":"satoshis","s":"s","e":true,"k":"s","d":[463,498],"c":[]}]]}],["y",{"w":"sync","s":"ync","e":true,"k":"y","d":[509,515],"c":[]}]]}],["p",{"w":"p","s":"p","e":false,"k":"p","d":[],"c":[["r",{"w":"pr","s":"r","e":false,"k":"r","d":[],"c":[["o",{"w":"pro","s":"o","e":false,"k":"o","d":[],"c":[["p",{"w":"prop","s":"p","e":false,"k":"p","d":[],"c":[["e",{"w":"properties","s":"erties","e":true,"k":"e","d":[5,359],"c":[]}],["o",{"w":"propos","s":"os","e":false,"k":"o","d":[],"c":[["a",{"w":"proposals","s":"als","e":true,"k":"a","d":[217,218],"c":[]}],["e",{"w":"proposed","s":"ed","e":true,"k":"e","d":[389],"c":[]}]]}]]}],["j",{"w":"project","s":"ject","e":true,"k":"j","d":[29,47,48],"c":[]}],["g",{"w":"program","s":"gram","e":true,"k":"g","d":[69],"c":[]}],["m",{"w":"prometheus","s":"metheus","e":true,"k":"m","d":[211,212],"c":[]}],["o",{"w":"proof","s":"of","e":true,"k":"o","d":[288,390],"c":[["s",{"w":"proofs","s":"s","e":true,"k":"s","d":[346],"c":[]}],["-",{"w":"proof-of-transfer","s":"-of-transfer","e":true,"k":"-","d":[392],"c":[]}]]}]]}],["a",{"w":"practices","s":"actices","e":true,"k":"a","d":[12],"c":[]}],["i",{"w":"pri","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"prin","s":"n","e":false,"k":"n","d":[],"c":[["c",{"w":"principal-","s":"cipal-","e":false,"k":"c","d":[],"c":[["o",{"w":"principal-of","s":"of","e":true,"k":"o","d":[94],"c":[]}],["d",{"w":"principal-destruct","s":"destruct","e":true,"k":"d","d":[141],"c":[]}],["c",{"w":"principal-construct","s":"construct","e":true,"k":"c","d":[200],"c":[]}]]}],["t",{"w":"print","s":"t","e":true,"k":"t","d":[199],"c":[]}]]}],["v",{"w":"private","s":"vate","e":true,"k":"v","d":[239],"c":[]}],["o",{"w":"priorities","s":"orities","e":true,"k":"o","d":[335],"c":[]}],["c",{"w":"price","s":"ce","e":true,"k":"c","d":[393,395],"c":[]}]]}],["e",{"w":"predicate","s":"edicate","e":true,"k":"e","d":[379],"c":[]}]]}],["l",{"w":"pla","s":"la","e":false,"k":"l","d":[],"c":[["n",{"w":"plans","s":"ns","e":true,"k":"n","d":[27],"c":[]}],["i",{"w":"plain","s":"in","e":true,"k":"i","d":[297,300],"c":[]}]]}],["o",{"w":"po","s":"o","e":false,"k":"o","d":[],"c":[["w",{"w":"pow","s":"w","e":true,"k":"w","d":[185],"c":[]}],["x",{"w":"pox","s":"x","e":true,"k":"x","d":[214,215,287,289,290,291,292],"c":[]}],["s",{"w":"post-conditions","s":"st-conditions","e":true,"k":"s","d":[231,238],"c":[]}],["o",{"w":"pool","s":"ol","e":true,"k":"o","d":[316,317,516],"c":[]}]]}],["a",{"w":"pagination","s":"agination","e":true,"k":"a","d":[255],"c":[]}],["e",{"w":"per","s":"er","e":true,"k":"e","d":[446,457,483,494],"c":[]}]]}],["m",{"w":"m","s":"m","e":false,"k":"m","d":[],"c":[["a",{"w":"ma","s":"a","e":false,"k":"a","d":[],"c":[["t",{"w":"match","s":"tch","e":true,"k":"t","d":[170],"c":[["e",{"w":"matchers","s":"ers","e":true,"k":"e","d":[6,360],"c":[]}]]}],["n",{"w":"manipulation","s":"nipulation","e":true,"k":"n","d":[76],"c":[]}],["p",{"w":"map","s":"p","e":true,"k":"p","d":[79,105,413],"c":[["-",{"w":"map-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"map-delete","s":"delete","e":true,"k":"d","d":[89],"c":[]}],["s",{"w":"map-set","s":"set","e":true,"k":"s","d":[132],"c":[]}],["i",{"w":"map-insert","s":"insert","e":true,"k":"i","d":[167],"c":[]}],["g",{"w":"map-get","s":"get","e":true,"k":"g","d":[172],"c":[]}]]}]]}],["r",{"w":"marketplace","s":"rketplace","e":true,"k":"r","d":[513],"c":[]}]]}],["e",{"w":"me","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"met","s":"t","e":false,"k":"t","d":[],"c":[["h",{"w":"methods","s":"hods","e":true,"k":"h","d":[7,361],"c":[]}],["a",{"w":"metadata","s":"adata","e":true,"k":"a","d":[15,60,61,63,67,251,252,254,407],"c":[]}],["r",{"w":"metrics","s":"rics","e":true,"k":"r","d":[211,212],"c":[]}]]}],["r",{"w":"merge","s":"rge","e":true,"k":"r","d":[189],"c":[]}],["m",{"w":"mem","s":"m","e":false,"k":"m","d":[],"c":[["p",{"w":"mempool","s":"pool","e":true,"k":"p","d":[306,309,313,334],"c":[]}],["b",{"w":"members","s":"bers","e":true,"k":"b","d":[316],"c":[]}]]}],["s",{"w":"messages","s":"ssages","e":true,"k":"s","d":[354],"c":[]}]]}],["o",{"w":"mo","s":"o","e":false,"k":"o","d":[],"c":[["n",{"w":"monitor","s":"nitor","e":true,"k":"n","d":[51],"c":[]}],["d",{"w":"mod","s":"d","e":true,"k":"d","d":[197],"c":[]}],["s",{"w":"most","s":"st","e":true,"k":"s","d":[207,218],"c":[]}]]}],["u",{"w":"multiply","s":"ultiply","e":true,"k":"u","d":[102],"c":[]}],["i",{"w":"mi","s":"i","e":false,"k":"i","d":[],"c":[["g",{"w":"migration","s":"gration","e":true,"k":"g","d":[246,355],"c":[]}],["n",{"w":"mint","s":"nt","e":false,"k":"n","d":[],"c":[["s",{"w":"mints","s":"s","e":true,"k":"s","d":[343],"c":[]}],["i",{"w":"minting","s":"ing","e":true,"k":"i","d":[385],"c":[]}]]}]]}]]}],["o",{"w":"o","s":"o","e":false,"k":"o","d":[],"c":[["v",{"w":"overview","s":"verview","e":true,"k":"v","d":[8,13,18,31,45,54,64,73,74,208,219,228,350,373,399,422,425,427,443,459,502],"c":[]}],["k",{"w":"ok","s":"k","e":true,"k":"k","d":[121],"c":[]}],["r",{"w":"or","s":"r","e":true,"k":"r","d":[165,176,191],"c":[["d",{"w":"ordinal","s":"dinal","e":true,"k":"d","d":[464,499],"c":[["s",{"w":"ordinals","s":"s","e":true,"k":"s","d":[426,444],"c":[]}]]}]]}],["p",{"w":"op","s":"p","e":false,"k":"p","d":[],"c":[["t",{"w":"optional","s":"tional","e":true,"k":"t","d":[201],"c":[]}],["e",{"w":"operations","s":"erations","e":true,"k":"e","d":[417,418],"c":[]}]]}],["w",{"w":"owned","s":"wned","e":true,"k":"w","d":[274],"c":[]}],["f",{"w":"of","s":"f","e":true,"k":"f","d":[288,390],"c":[]}],["n",{"w":"on","s":"n","e":true,"k":"n","d":[375],"c":[]}],["b",{"w":"observing","s":"bserving","e":true,"k":"b","d":[377],"c":[]}]]}],["q",{"w":"quickstart","s":"quickstart","e":true,"k":"q","d":[9,30,53,65,243,357,378,423,504],"c":[["s",{"w":"quickstarts","s":"s","e":true,"k":"s","d":[381,505],"c":[]}]]}],["b",{"w":"b","s":"b","e":false,"k":"b","d":[],"c":[["e",{"w":"be","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"best","s":"st","e":true,"k":"s","d":[12],"c":[]}],["g",{"w":"begin","s":"gin","e":true,"k":"g","d":[163],"c":[]}]]}],["l",{"w":"block","s":"lock","e":true,"k":"l","d":[206,216,217,218,260,262,264,265,266,268,269,296,298,314,336,389,408,437,446,457,477,483,494],"c":[["c",{"w":"blockchain","s":"chain","e":true,"k":"c","d":[14,17,36,68,349],"c":[["-",{"w":"blockchain-api-client","s":"-api-client","e":true,"k":"-","d":[365],"c":[]}]]}],["s",{"w":"blocks","s":"s","e":true,"k":"s","d":[205,207,261,263,264,267,337,338,388,409],"c":[]}]]}],["i",{"w":"bit","s":"it","e":true,"k":"i","d":[76],"c":[["c",{"w":"bitcoin","s":"coin","e":true,"k":"c","d":[32,371,515],"c":[]}],["-",{"w":"bit-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"bit-and","s":"and","e":true,"k":"a","d":[113],"c":[]}],["x",{"w":"bit-xor","s":"xor","e":true,"k":"x","d":[128],"c":[]}],["o",{"w":"bit-or","s":"or","e":true,"k":"o","d":[130],"c":[]}],["s",{"w":"bit-shift-","s":"shift-","e":false,"k":"s","d":[],"c":[["r",{"w":"bit-shift-right","s":"right","e":true,"k":"r","d":[145],"c":[]}],["l",{"w":"bit-shift-left","s":"left","e":true,"k":"l","d":[174],"c":[]}]]}],["n",{"w":"bit-not","s":"not","e":true,"k":"n","d":[187],"c":[]}]]}]]}],["u",{"w":"bu","s":"u","e":false,"k":"u","d":[],"c":[["i",{"w":"build","s":"ild","e":true,"k":"i","d":[68,69,71,75,426,444,511,513,516],"c":[]}],["f",{"w":"buff-to-","s":"ff-to-","e":false,"k":"f","d":[],"c":[["i",{"w":"buff-to-int-","s":"int-","e":false,"k":"i","d":[],"c":[["b",{"w":"buff-to-int-be","s":"be","e":true,"k":"b","d":[87],"c":[]}],["l",{"w":"buff-to-int-le","s":"le","e":true,"k":"l","d":[179],"c":[]}]]}],["u",{"w":"buff-to-uint-","s":"uint-","e":false,"k":"u","d":[],"c":[["b",{"w":"buff-to-uint-be","s":"be","e":true,"k":"b","d":[133],"c":[]}],["l",{"w":"buff-to-uint-le","s":"le","e":true,"k":"l","d":[158],"c":[]}]]}]]}],["r",{"w":"burn","s":"rn","e":true,"k":"r","d":[264,336,337,338,417,418],"c":[["c",{"w":"burnchain","s":"chain","e":true,"k":"c","d":[265,268,281,283,286],"c":[]}]]}]]}],["a",{"w":"ba","s":"a","e":false,"k":"a","d":[],"c":[["s",{"w":"basic","s":"sic","e":true,"k":"s","d":[77],"c":[]}],["l",{"w":"balance","s":"lance","e":true,"k":"l","d":[327,432,472],"c":[["s",{"w":"balances","s":"s","e":true,"k":"s","d":[321,430,431,449,470,471,486],"c":[]}]]}]]}],["r",{"w":"br","s":"r","e":false,"k":"r","d":[],"c":[["o",{"w":"broadcast","s":"oadcast","e":true,"k":"o","d":[230,353,402],"c":[["i",{"w":"broadcasting","s":"ing","e":true,"k":"i","d":[242],"c":[]}]]}],["c",{"w":"brc-20","s":"c-20","e":true,"k":"c","d":[447,448,449,450,451,452,484,485,486,487,488,489],"c":[]}]]}],["y",{"w":"by","s":"y","e":true,"k":"y","d":[262,264,265,268,269,274,293,314,330],"c":[]}]]}],["u",{"w":"u","s":"u","e":false,"k":"u","d":[],"c":[["s",{"w":"us","s":"s","e":false,"k":"s","d":[],"c":[["e",{"w":"use","s":"e","e":true,"k":"e","d":[14,15,17],"c":[["-",{"w":"use-trait","s":"-trait","e":true,"k":"-","d":[117],"c":[]}],["r",{"w":"user","s":"r","e":true,"k":"r","d":[321],"c":[["s",{"w":"users","s":"s","e":true,"k":"s","d":[352],"c":[]}]]}]]}],["i",{"w":"using","s":"ing","e":true,"k":"i","d":[50,232,514],"c":[]}],["a",{"w":"usage","s":"age","e":true,"k":"a","d":[58,439,462],"c":[]}]]}],["p",{"w":"update","s":"pdate","e":true,"k":"p","d":[41],"c":[["s",{"w":"updates","s":"s","e":true,"k":"s","d":[220,221,222,223],"c":[]}]]}],["n",{"w":"un","s":"n","e":false,"k":"n","d":[],"c":[["w",{"w":"unwrap","s":"wrap","e":true,"k":"w","d":[85],"c":[["-",{"w":"unwrap-","s":"-","e":false,"k":"-","d":[],"c":[["e",{"w":"unwrap-err","s":"err","e":true,"k":"e","d":[159],"c":[["-",{"w":"unwrap-err-panic","s":"-panic","e":true,"k":"-","d":[148],"c":[]}]]}],["p",{"w":"unwrap-panic","s":"panic","e":true,"k":"p","d":[151],"c":[]}]]}]]}],["i",{"w":"unit","s":"it","e":true,"k":"i","d":[224],"c":[]}],["l",{"w":"unlocked","s":"locked","e":true,"k":"l","d":[295,302],"c":[]}]]}]]}],["t",{"w":"t","s":"t","e":false,"k":"t","d":[],"c":[["h",{"w":"th","s":"h","e":false,"k":"h","d":[],"c":[["e",{"w":"the","s":"e","e":true,"k":"e","d":[14,15,17,72,283,286,298,326,396],"c":[]}],["a",{"w":"than","s":"an","e":true,"k":"a","d":[114,154,176,191],"c":[]}]]}],["o",{"w":"to","s":"o","e":true,"k":"o","d":[509,510,515],"c":[["k",{"w":"token","s":"ken","e":true,"k":"k","d":[15,60,61,63,67,204,251,252,254,340,342,343,344,387,447,450,484,487],"c":[["s",{"w":"tokens","s":"s","e":true,"k":"s","d":[59,62,66,250,253,319,339,341,451,488],"c":[]}]]}],["-",{"w":"to-","s":"-","e":false,"k":"-","d":[],"c":[["u",{"w":"to-uint","s":"uint","e":true,"k":"u","d":[118],"c":[]}],["c",{"w":"to-consensus-buff","s":"consensus-buff","e":true,"k":"c","d":[142],"c":[]}],["i",{"w":"to-int","s":"int","e":true,"k":"i","d":[153],"c":[]}]]}],["t",{"w":"total","s":"tal","e":true,"k":"t","d":[286,295,300,302],"c":[]}]]}],["e",{"w":"te","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"test","s":"st","e":false,"k":"s","d":[],"c":[["n",{"w":"testnet","s":"net","e":true,"k":"n","d":[49,319],"c":[]}],["i",{"w":"testing","s":"ing","e":true,"k":"i","d":[224,245,348],"c":[]}]]}],["c",{"w":"tech","s":"ch","e":true,"k":"c","d":[71],"c":[]}],["x",{"w":"text","s":"xt","e":true,"k":"x","d":[297,300],"c":[]}],["m",{"w":"templates","s":"mplates","e":true,"k":"m","d":[384,386],"c":[]}],["n",{"w":"tenure","s":"nure","e":true,"k":"n","d":[407,409],"c":[]}]]}],["u",{"w":"tuple","s":"uple","e":true,"k":"u","d":[83],"c":[]}],["r",{"w":"tr","s":"r","e":false,"k":"r","d":[],"c":[["y",{"w":"try","s":"y","e":true,"k":"y","d":[166],"c":[]}],["a",{"w":"tra","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"trans","s":"ns","e":false,"k":"n","d":[],"c":[["a",{"w":"transaction","s":"action","e":true,"k":"a","d":[304,305,310,315,325,335,396,402,435,475],"c":[["s",{"w":"transactions","s":"s","e":true,"k":"s","d":[226,230,234,237,303,306,307,308,309,311,312,313,314,320,322,353,368,403],"c":[]}]]}],["f",{"w":"transfer","s":"fer","e":true,"k":"f","d":[288,390,398],"c":[["s",{"w":"transfers","s":"s","e":true,"k":"s","d":[320,325,328,387,454,457,491,494],"c":[]}]]}]]}],["i",{"w":"trait","s":"it","e":true,"k":"i","d":[330,411],"c":[]}]]}]]}],["i",{"w":"time","s":"ime","e":true,"k":"i","d":[296,298],"c":[["-",{"w":"time-based","s":"-based","e":true,"k":"-","d":[202],"c":[]}],["s",{"w":"times","s":"s","e":true,"k":"s","d":[266],"c":[]}]]}],["a",{"w":"target","s":"arget","e":true,"k":"a","d":[296,298],"c":[]}],["b",{"w":"tbd","s":"bd","e":true,"k":"b","d":[503],"c":[]}]]}],["a",{"w":"a","s":"a","e":true,"k":"a","d":[20,21,24,25,26,29,38,39,41,42,43,47,48,52,68,69,71,72,75,206,216,296,374,376,435,437,475,477,509,511,515,516],"c":[["p",{"w":"ap","s":"p","e":false,"k":"p","d":[],"c":[["i",{"w":"api","s":"i","e":true,"k":"i","d":[14,15,36,68,210,222,247,301,401,429,461,467,469,497,512],"c":[["s",{"w":"apis","s":"s","e":true,"k":"s","d":[256,501],"c":[]}]]}],["p",{"w":"app","s":"p","e":true,"k":"p","d":[203,384],"c":[["e",{"w":"append","s":"end","e":true,"k":"e","d":[149],"c":[]}],["r",{"w":"approximate","s":"roximate","e":true,"k":"r","d":[396],"c":[]}]]}]]}],["r",{"w":"ar","s":"r","e":false,"k":"r","d":[],"c":[["c",{"w":"archi","s":"chi","e":false,"k":"c","d":[],"c":[["v",{"w":"archive","s":"ve","e":true,"k":"v","d":[14,15,16,17,48],"c":[]}],["t",{"w":"architecture","s":"tecture","e":true,"k":"t","d":[55,259],"c":[]}]]}],["i",{"w":"arithmetic","s":"ithmetic","e":true,"k":"i","d":[77],"c":[]}]]}],["d",{"w":"add","s":"dd","e":true,"k":"d","d":[20,137],"c":[["r",{"w":"address","s":"ress","e":true,"k":"r","d":[274,303,304,308,430,436,470,476],"c":[["e",{"w":"addresses","s":"es","e":true,"k":"e","d":[240],"c":[]}]]}]]}],["l",{"w":"all","s":"ll","e":true,"k":"l","d":[37,270,276,438,478],"c":[]}],["i",{"w":"ai","s":"i","e":true,"k":"i","d":[70],"c":[]}],["c",{"w":"ac","s":"c","e":false,"k":"c","d":[],"c":[["c",{"w":"acc","s":"c","e":false,"k":"c","d":[],"c":[["e",{"w":"access","s":"ess","e":true,"k":"e","d":[81],"c":[]}],["o",{"w":"account","s":"ount","e":true,"k":"o","d":[320,322,324,325,327,405],"c":[["s",{"w":"accounts","s":"s","e":true,"k":"s","d":[240,404],"c":[]}]]}]]}],["t",{"w":"activit","s":"tivit","e":false,"k":"t","d":[],"c":[["i",{"w":"activities","s":"ies","e":true,"k":"i","d":[434,474],"c":[]}],["y",{"w":"activity","s":"y","e":true,"k":"y","d":[435,436,437,438,452,475,476,477,478,489],"c":[]}]]}]]}],["n",{"w":"an","s":"n","e":true,"k":"n","d":[304,436,476,513],"c":[["d",{"w":"and","s":"d","e":true,"k":"d","d":[108,201,295,302,391],"c":[]}],["n",{"w":"announcing","s":"nouncing","e":true,"k":"n","d":[229],"c":[]}]]}],["s",{"w":"as","s":"s","e":true,"k":"s","d":[374,376],"c":[["-",{"w":"as-","s":"-","e":false,"k":"-","d":[],"c":[["m",{"w":"as-max-len","s":"max-len","e":true,"k":"m","d":[126],"c":[]}],["c",{"w":"as-contract","s":"contract","e":true,"k":"c","d":[192],"c":[]}]]}],["s",{"w":"asse","s":"se","e":false,"k":"s","d":[],"c":[["r",{"w":"asserts","s":"rts","e":true,"k":"r","d":[193],"c":[]}],["t",{"w":"assets","s":"ts","e":true,"k":"t","d":[324],"c":[]}]]}]]}],["t",{"w":"at-block","s":"t-block","e":true,"k":"t","d":[161],"c":[]}],["g",{"w":"aggregated","s":"ggregated","e":true,"k":"g","d":[206,207],"c":[]}],["u",{"w":"authenticat","s":"uthenticat","e":false,"k":"u","d":[],"c":[["i",{"w":"authentication","s":"ion","e":true,"k":"i","d":[257],"c":[]}],["e",{"w":"authenticate","s":"e","e":true,"k":"e","d":[352],"c":[]}]]}],["v",{"w":"average","s":"verage","e":true,"k":"v","d":[266],"c":[]}]]}],["v",{"w":"v","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"verify","s":"erify","e":true,"k":"e","d":[16],"c":[]}],["a",{"w":"va","s":"a","e":false,"k":"a","d":[],"c":[["l",{"w":"val","s":"l","e":false,"k":"l","d":[],"c":[["i",{"w":"validate","s":"idate","e":true,"k":"i","d":[21,389],"c":[]}],["u",{"w":"value","s":"ue","e":true,"k":"u","d":[416],"c":[["s",{"w":"values","s":"s","e":true,"k":"s","d":[201,514],"c":[]}]]}]]}],["r",{"w":"var-","s":"r-","e":false,"k":"r","d":[],"c":[["g",{"w":"var-get","s":"get","e":true,"k":"g","d":[131],"c":[]}],["s",{"w":"var-set","s":"set","e":true,"k":"s","d":[175],"c":[]}]]}]]}],["7",{"w":"v7","s":"7","e":true,"k":"7","d":[229],"c":[]}],["3",{"w":"v3","s":"3","e":true,"k":"3","d":[406],"c":[]}]]}],["d",{"w":"d","s":"d","e":false,"k":"d","d":[],"c":[["a",{"w":"data","s":"ata","e":true,"k":"a","d":[16],"c":[]}],["e",{"w":"de","s":"e","e":false,"k":"e","d":[],"c":[["v",{"w":"dev","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"develop","s":"elop","e":false,"k":"e","d":[],"c":[["m",{"w":"development","s":"ment","e":true,"k":"m","d":[23,203,204,225,349],"c":[]}],["e",{"w":"developer","s":"er","e":true,"k":"e","d":[347],"c":[]}]]}],["n",{"w":"devnet","s":"net","e":true,"k":"n","d":[24,33,34,35,50,375],"c":[]}]]}],["p",{"w":"deploy","s":"ploy","e":true,"k":"p","d":[25,46],"c":[["m",{"w":"deployment","s":"ment","e":true,"k":"m","d":[27],"c":[]}]]}],["b",{"w":"debug","s":"bug","e":true,"k":"b","d":[26],"c":[]}],["l",{"w":"delete","s":"lete","e":true,"k":"l","d":[42],"c":[]}],["c",{"w":"decentralized","s":"centralized","e":true,"k":"c","d":[69,511],"c":[]}],["f",{"w":"def","s":"f","e":false,"k":"f","d":[],"c":[["i",{"w":"define-","s":"ine-","e":false,"k":"i","d":[],"c":[["c",{"w":"define-constant","s":"constant","e":true,"k":"c","d":[92],"c":[]}],["m",{"w":"define-map","s":"map","e":true,"k":"m","d":[97],"c":[]}],["p",{"w":"define-p","s":"p","e":false,"k":"p","d":[],"c":[["u",{"w":"define-public","s":"ublic","e":true,"k":"u","d":[99],"c":[]}],["r",{"w":"define-private","s":"rivate","e":true,"k":"r","d":[129],"c":[]}]]}],["d",{"w":"define-data-var","s":"data-var","e":true,"k":"d","d":[100],"c":[]}],["t",{"w":"define-trait","s":"trait","e":true,"k":"t","d":[119],"c":[]}],["n",{"w":"define-non-fungible-token","s":"non-fungible-token","e":true,"k":"n","d":[122],"c":[]}],["r",{"w":"define-read-only","s":"read-only","e":true,"k":"r","d":[134],"c":[]}],["f",{"w":"define-fungible-token","s":"fungible-token","e":true,"k":"f","d":[160],"c":[]}]]}],["a",{"w":"default-to","s":"ault-to","e":true,"k":"a","d":[103],"c":[]}]]}],["e",{"w":"deep","s":"ep","e":true,"k":"e","d":[231],"c":[]}],["t",{"w":"details","s":"tails","e":true,"k":"t","d":[277,311,392,411,450,487],"c":[]}],["s",{"w":"design","s":"sign","e":true,"k":"s","d":[379],"c":[]}]]}],["i",{"w":"div","s":"iv","e":false,"k":"i","d":[],"c":[["i",{"w":"divide","s":"ide","e":true,"k":"i","d":[112],"c":[]}],["e",{"w":"dive","s":"e","e":true,"k":"e","d":[231],"c":[]}]]}],["r",{"w":"dropped","s":"ropped","e":true,"k":"r","d":[309],"c":[]}],["o",{"w":"doc","s":"oc","e":false,"k":"o","d":[],"c":[["k",{"w":"docker","s":"ker","e":true,"k":"k","d":[510],"c":[]}],["s",{"w":"docskit","s":"skit","e":true,"k":"s","d":[517],"c":[]}]]}]]}],["e",{"w":"e","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"estimat","s":"stimat","e":false,"k":"s","d":[],"c":[["i",{"w":"estimating","s":"ing","e":true,"k":"i","d":[22],"c":[]}],["e",{"w":"estimate","s":"e","e":true,"k":"e","d":[398],"c":[]}]]}],["x",{"w":"explorer","s":"xplorer","e":true,"k":"x","d":[75,220,426,444],"c":[]}],["r",{"w":"err","s":"rr","e":true,"k":"r","d":[164],"c":[["o",{"w":"error","s":"or","e":true,"k":"o","d":[201],"c":[]}]]}],["q",{"w":"equal","s":"qual","e":true,"k":"q","d":[176,191],"c":[]}],["l",{"w":"element-at","s":"lement-at","e":true,"k":"l","d":[180],"c":[]}],["n",{"w":"en","s":"n","e":false,"k":"n","d":[],"c":[["t",{"w":"entr","s":"tr","e":false,"k":"t","d":[],"c":[["i",{"w":"entries","s":"ies","e":true,"k":"i","d":[285],"c":[]}],["y",{"w":"entry","s":"y","e":true,"k":"y","d":[413],"c":[]}]]}],["v",{"w":"environment","s":"vironment","e":true,"k":"v","d":[347],"c":[["s",{"w":"environments","s":"s","e":true,"k":"s","d":[348],"c":[]}]]}]]}],["v",{"w":"event","s":"vent","e":true,"k":"v","d":[382],"c":[["s",{"w":"events","s":"s","e":true,"k":"s","d":[304,305,323,329],"c":[]}]]}],["t",{"w":"etching","s":"tching","e":true,"k":"t","d":[442,481],"c":[["s",{"w":"etchings","s":"s","e":true,"k":"s","d":[440,441,479,480],"c":[]}]]}]]}],["w",{"w":"w","s":"w","e":false,"k":"w","d":[],"c":[["o",{"w":"working","s":"orking","e":true,"k":"o","d":[28],"c":[]}],["i",{"w":"with","s":"ith","e":true,"k":"i","d":[28,232,320,325,374,377],"c":[]}],["e",{"w":"web","s":"eb","e":true,"k":"e","d":[203],"c":[]}],["a",{"w":"wallet","s":"allet","e":true,"k":"a","d":[351,383],"c":[["s",{"w":"wallets","s":"s","e":true,"k":"s","d":[239],"c":[]}]]}]]}],["n",{"w":"n","s":"n","e":false,"k":"n","d":[],"c":[["e",{"w":"ne","s":"e","e":false,"k":"e","d":[],"c":[["w",{"w":"new","s":"w","e":true,"k":"w","d":[29],"c":[]}],["t",{"w":"network","s":"twork","e":true,"k":"t","d":[227,235,298,369],"c":[["s",{"w":"networks","s":"s","e":true,"k":"s","d":[241],"c":[]}],["'",{"w":"network's","s":"'s","e":true,"k":"'","d":[296],"c":[]}]]}]]}],["o",{"w":"no","s":"o","e":false,"k":"o","d":[],"c":[["d",{"w":"node","s":"de","e":true,"k":"d","d":[32,374,509,515],"c":[]}],["n",{"w":"non","s":"n","e":false,"k":"n","d":[],"c":[["-",{"w":"non-fungible","s":"-fungible","e":true,"k":"-","d":[63,254,341,342,343,344],"c":[]}],["c",{"w":"nonce","s":"ce","e":true,"k":"c","d":[258,326],"c":[]}]]}],["t",{"w":"not","s":"t","e":true,"k":"t","d":[155],"c":[]}],["-",{"w":"no-loss","s":"-loss","e":true,"k":"-","d":[516],"c":[]}]]}],["f",{"w":"nft","s":"ft","e":true,"k":"f","d":[323,385,513],"c":[["-",{"w":"nft-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"nft-transfer","s":"transfer","e":true,"k":"t","d":[101],"c":[]}],["b",{"w":"nft-burn","s":"burn","e":true,"k":"b","d":[135],"c":[]}],["m",{"w":"nft-mint","s":"mint","e":true,"k":"m","d":[186],"c":[]}],["g",{"w":"nft-get-owner","s":"get-owner","e":true,"k":"g","d":[195],"c":[]}]]}]]}],["a",{"w":"na","s":"a","e":false,"k":"a","d":[],"c":[["t",{"w":"native","s":"tive","e":true,"k":"t","d":[232],"c":[]}],["m",{"w":"name","s":"me","e":true,"k":"m","d":[271,272,277,395],"c":[["s",{"w":"names","s":"s","e":true,"k":"s","d":[270,273,274,275,394],"c":[["p",{"w":"namespace","s":"pace","e":true,"k":"p","d":[275,393],"c":[["s",{"w":"namespaces","s":"s","e":true,"k":"s","d":[276],"c":[]}]]}]]}]]}],["k",{"w":"nakamoto","s":"kamoto","e":true,"k":"k","d":[407,408,409],"c":[]}]]}]]}],["h",{"w":"h","s":"h","e":false,"k":"h","d":[],"c":[["o",{"w":"ho","s":"o","e":false,"k":"o","d":[],"c":[["m",{"w":"home","s":"me","e":true,"k":"m","d":[44,466,508],"c":[]}],["l",{"w":"hold","s":"ld","e":false,"k":"l","d":[],"c":[["e",{"w":"holder","s":"er","e":true,"k":"e","d":[285,432,472],"c":[["s",{"w":"holders","s":"s","e":true,"k":"s","d":[284,340,433,447,473,484],"c":[]}]]}],["i",{"w":"holdings","s":"ings","e":true,"k":"i","d":[342],"c":[]}]]}],["w",{"w":"how","s":"w","e":true,"k":"w","d":[509,510,515],"c":[]}]]}],["i",{"w":"hi","s":"i","e":false,"k":"i","d":[],"c":[["r",{"w":"hiro","s":"ro","e":true,"k":"r","d":[72],"c":[["s",{"w":"hirosystems","s":"systems","e":true,"k":"s","d":[362],"c":[]}]]}],["s",{"w":"histor","s":"stor","e":false,"k":"s","d":[],"c":[["i",{"w":"historical","s":"ical","e":true,"k":"i","d":[278],"c":[]}],["y",{"w":"history","s":"y","e":true,"k":"y","d":[344],"c":[]}]]}]]}],["a",{"w":"ha","s":"a","e":false,"k":"a","d":[],"c":[["s",{"w":"hash","s":"sh","e":true,"k":"s","d":[262,268],"c":[["1",{"w":"hash160","s":"160","e":true,"k":"1","d":[188],"c":[]}]]}],["n",{"w":"handling","s":"ndling","e":true,"k":"n","d":[201,258],"c":[]}]]}],["e",{"w":"height","s":"eight","e":true,"k":"e","d":[265,269],"c":[]}]]}],["f",{"w":"f","s":"f","e":false,"k":"f","d":[],"c":[["u",{"w":"fun","s":"un","e":false,"k":"u","d":[],"c":[["g",{"w":"fungible","s":"gible","e":true,"k":"g","d":[60,62,67,251,253,340],"c":[]}],["c",{"w":"function","s":"ction","e":true,"k":"c","d":[414],"c":[["s",{"w":"functions","s":"s","e":true,"k":"s","d":[79,80],"c":[]}]]}]]}],["r",{"w":"fr","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"friend","s":"iend","e":true,"k":"i","d":[71],"c":[]}],["o",{"w":"from-consensus-buff","s":"om-consensus-buff","e":true,"k":"o","d":[144],"c":[]}]]}],["o",{"w":"fo","s":"o","e":false,"k":"o","d":[],"c":[["r",{"w":"for","s":"r","e":true,"k":"r","d":[72,206,207,216,218,220,221,222,223,283,286,292,304,306,308,311,396,435,436,437,475,476,477],"c":[["m",{"w":"format","s":"mat","e":true,"k":"m","d":[297,300],"c":[]}]]}],["l",{"w":"fold","s":"ld","e":true,"k":"l","d":[96],"c":[]}]]}],["t",{"w":"ft-","s":"t-","e":false,"k":"t","d":[],"c":[["b",{"w":"ft-burn","s":"burn","e":true,"k":"b","d":[115],"c":[]}],["t",{"w":"ft-transfer","s":"transfer","e":true,"k":"t","d":[123],"c":[]}],["g",{"w":"ft-get-","s":"get-","e":false,"k":"g","d":[],"c":[["s",{"w":"ft-get-supply","s":"supply","e":true,"k":"s","d":[125],"c":[]}],["b",{"w":"ft-get-balance","s":"balance","e":true,"k":"b","d":[190],"c":[]}]]}],["m",{"w":"ft-mint","s":"mint","e":true,"k":"m","d":[178],"c":[]}]]}],["i",{"w":"fil","s":"il","e":false,"k":"i","d":[],"c":[["t",{"w":"filter","s":"ter","e":true,"k":"t","d":[177],"c":[]}],["e",{"w":"file","s":"e","e":true,"k":"e","d":[272,278],"c":[]}]]}],["e",{"w":"fee","s":"ee","e":true,"k":"e","d":[279,335,398],"c":[["s",{"w":"fees","s":"s","e":true,"k":"s","d":[280,396,397],"c":[]}]]}],["a",{"w":"faucets","s":"aucets","e":true,"k":"a","d":[318],"c":[]}]]}],["x",{"w":"x","s":"x","e":true,"k":"x","d":[70],"c":[["o",{"w":"xor","s":"or","e":true,"k":"o","d":[93],"c":[]}]]}],["k",{"w":"k","s":"k","e":false,"k":"k","d":[],"c":[["e",{"w":"ke","s":"e","e":false,"k":"e","d":[],"c":[["c",{"w":"keccak256","s":"ccak256","e":true,"k":"c","d":[91],"c":[]}],["y",{"w":"keys","s":"ys","e":true,"k":"y","d":[239,247,467,512],"c":[]}]]}],["i",{"w":"kickstarter","s":"ickstarter","e":true,"k":"i","d":[511],"c":[]}]]}],["2",{"w":"256","s":"256","e":true,"k":"2","d":[111],"c":[]}],["j",{"w":"js","s":"js","e":true,"k":"j","d":[223,229,232,364],"c":[]}],["z",{"w":"zone","s":"zone","e":true,"k":"z","d":[272,278],"c":[]}]]},"isArray":false},"description":{"type":"Radix","node":{"w":"","s":"","e":false,"k":"","d":[],"c":[["l",{"w":"l","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"le","s":"e","e":false,"k":"e","d":[],"c":[["a",{"w":"learn","s":"arn","e":true,"k":"a","d":[1,9,12,19,27,30,46,47,51,68,69,71,224,232,237,239,240,241,242,243,245,246,255,258,357,374,375,376,377,378,419,423,504,506,509,511,513,514,515,516],"c":[]}],["v",{"w":"leverage","s":"verage","e":true,"k":"v","d":[31],"c":[["s",{"w":"leverages","s":"s","e":true,"k":"s","d":[516],"c":[]}]]}],["s",{"w":"less","s":"ss","e":true,"k":"s","d":[65,114,176,439,462],"c":[]}],["n",{"w":"length","s":"ngth","e":true,"k":"n","d":[110,149],"c":[["s",{"w":"lengths","s":"s","e":true,"k":"s","d":[126],"c":[]}]]}],["f",{"w":"left","s":"ft","e":true,"k":"f","d":[174],"c":[]}],["g",{"w":"legacy","s":"gacy","e":true,"k":"g","d":[302],"c":[]}]]}],["i",{"w":"li","s":"i","e":false,"k":"i","d":[],"c":[["m",{"w":"limit","s":"mit","e":true,"k":"m","d":[126],"c":[["s",{"w":"limits","s":"s","e":true,"k":"s","d":[3,247,421,467,507,512],"c":[]}]]}],["b",{"w":"librar","s":"brar","e":false,"k":"b","d":[],"c":[["y",{"w":"library","s":"y","e":true,"k":"y","d":[8,64,227,235,350,356,365,366,369],"c":[]}],["i",{"w":"libraries","s":"ies","e":true,"k":"i","d":[228],"c":[]}]]}],["n",{"w":"line","s":"ne","e":true,"k":"n","d":[26],"c":[]}],["s",{"w":"list","s":"st","e":true,"k":"s","d":[67,105,149,177,180,183,215,261,264,267,270,271,274,275,276,281,283,284,285,287,291,292,311,316,317,323,324,328,329,330,338,340,342,343,410,430,433,435,437,441,447,455,457,470,473,475,477,480,484,492,494,513],"c":[["s",{"w":"lists","s":"s","e":true,"k":"s","d":[82,149,255],"c":[]}],["e",{"w":"listed","s":"ed","e":true,"k":"e","d":[330],"c":[]}]]}],["t",{"w":"little-endian","s":"ttle-endian","e":true,"k":"t","d":[158,179],"c":[]}],["g",{"w":"lightweight","s":"ghtweight","e":true,"k":"g","d":[422,502],"c":[]}]]}],["o",{"w":"lo","s":"o","e":false,"k":"o","d":[],"c":[["c",{"w":"local","s":"cal","e":true,"k":"c","d":[18,24,75,509,510],"c":[]}],["g",{"w":"log","s":"g","e":false,"k":"g","d":[],"c":[["a",{"w":"logarithm","s":"arithm","e":true,"k":"a","d":[107],"c":[]}],["i",{"w":"logic","s":"ic","e":true,"k":"i","d":[202],"c":[["a",{"w":"logical","s":"al","e":true,"k":"a","d":[108,155,165],"c":[]}]]}]]}],["t",{"w":"lottery","s":"ttery","e":true,"k":"t","d":[516],"c":[]}]]}],["a",{"w":"la","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"language","s":"nguage","e":true,"k":"n","d":[21],"c":[]}],["u",{"w":"launch","s":"unch","e":true,"k":"u","d":[23],"c":[]}],["s",{"w":"last","s":"st","e":true,"k":"s","d":[277],"c":[]}],["t",{"w":"latest","s":"test","e":true,"k":"t","d":[326],"c":[]}]]}]]}],["h",{"w":"h","s":"h","e":false,"k":"h","d":[],"c":[["o",{"w":"ho","s":"o","e":false,"k":"o","d":[],"c":[["w",{"w":"how","s":"w","e":true,"k":"w","d":[1,9,14,15,17,27,30,46,47,48,51,68,69,71,224,231,232,237,239,240,241,242,243,245,246,255,258,355,357,374,375,376,377,378,419,423,504,506,509,511,513,514,515,516],"c":[]}],["l",{"w":"holder","s":"lder","e":true,"k":"l","d":[285,432,472],"c":[["s",{"w":"holders","s":"s","e":true,"k":"s","d":[340,433,447,450,473,484,487],"c":[]}]]}]]}],["i",{"w":"hi","s":"i","e":false,"k":"i","d":[],"c":[["r",{"w":"hiro","s":"ro","e":true,"k":"r","d":[3,11,13,14,15,17,37,38,39,41,42,43,46,47,48,52,53,72,219,256,345,381,420,421,501,505,507],"c":[["'",{"w":"hiro's","s":"'s","e":true,"k":"'","d":[1,419,506],"c":[]}]]}],["s",{"w":"histor","s":"stor","e":false,"k":"s","d":[],"c":[["i",{"w":"historical","s":"ical","e":true,"k":"i","d":[278],"c":[]}],["y",{"w":"history","s":"y","e":true,"k":"y","d":[344],"c":[]}]]}]]}],["a",{"w":"ha","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"handl","s":"ndl","e":false,"k":"n","d":[],"c":[["e",{"w":"handle","s":"e","e":true,"k":"e","d":[20,166,170,258,263,422,502],"c":[]}],["i",{"w":"handling","s":"ing","e":true,"k":"i","d":[201],"c":[]}]]}],["s",{"w":"hash","s":"sh","e":true,"k":"s","d":[84,91,111,162,169,181,188,268,293,408],"c":[]}],["v",{"w":"have","s":"ve","e":true,"k":"v","d":[309,313,329],"c":[]}]]}],["e",{"w":"he","s":"e","e":false,"k":"e","d":[],"c":[["l",{"w":"help","s":"lp","e":false,"k":"l","d":[],"c":[["s",{"w":"helps","s":"s","e":true,"k":"s","d":[28],"c":[]}],["e",{"w":"helper","s":"er","e":true,"k":"e","d":[233,367],"c":[]}]]}],["i",{"w":"height","s":"ight","e":true,"k":"i","d":[262,265,269,415,452,489],"c":[]}],["x",{"w":"hex","s":"x","e":true,"k":"x","d":[315],"c":[]}]]}]]}],["t",{"w":"t","s":"t","e":false,"k":"t","d":[],"c":[["o",{"w":"to","s":"o","e":true,"k":"o","d":[1,5,6,7,8,9,11,14,15,17,18,20,22,25,27,29,30,31,46,47,48,51,58,68,69,71,73,83,87,88,96,105,118,120,126,133,138,149,153,157,158,161,163,171,179,192,219,220,221,222,223,224,228,230,231,232,237,239,240,241,242,243,245,246,255,256,258,270,276,313,318,319,328,339,341,352,353,354,355,356,357,359,360,361,366,373,374,375,376,377,378,380,381,419,420,422,423,424,455,492,501,502,504,505,506,509,510,511,513,514,515,516],"c":[["o",{"w":"tool","s":"ol","e":true,"k":"o","d":[363,364,380],"c":[["s",{"w":"tools","s":"s","e":true,"k":"s","d":[11,219,256,381,420,501,505],"c":[]}]]}],["k",{"w":"token","s":"ken","e":true,"k":"k","d":[15,54,55,56,57,58,60,63,66,101,122,125,135,160,186,190,195,248,249,251,254,327,339,340,341,343,344,447,449,450,484,486,487],"c":[["s",{"w":"tokens","s":"s","e":true,"k":"s","d":[59,61,62,115,123,178,204,243,250,252,253,318,319,321,330,342,357,387,410,448,451,459,485,488],"c":[]}]]}],["t",{"w":"total","s":"tal","e":true,"k":"t","d":[125,282,286,295,300,302],"c":[]}]]}],["h",{"w":"th","s":"h","e":false,"k":"h","d":[],"c":[["e",{"w":"the","s":"e","e":true,"k":"e","d":[2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,19,21,23,25,26,32,33,36,37,38,39,40,41,42,43,46,47,48,52,53,55,56,57,58,59,64,72,74,75,84,90,91,102,106,107,108,110,111,112,113,114,125,126,128,130,131,137,140,145,149,154,161,162,163,166,174,175,176,181,183,185,187,188,190,191,192,193,195,197,198,208,210,211,212,213,219,220,221,222,223,224,226,229,230,234,242,245,246,247,248,249,250,256,257,259,263,270,271,272,274,276,277,278,281,283,284,285,286,295,296,297,298,299,300,301,302,306,307,309,313,316,317,326,327,328,330,333,334,335,340,342,344,353,358,359,360,361,362,363,364,365,368,373,376,378,379,381,393,395,396,399,400,401,402,403,405,406,407,415,416,420,421,423,424,427,428,429,445,446,456,459,460,461,467,468,469,482,483,493,496,497,501,502,504,505,507,512],"c":[["i",{"w":"their","s":"ir","e":true,"k":"i","d":[77,80,447,484,511],"c":[]}],["s",{"w":"these","s":"se","e":true,"k":"s","d":[313],"c":[]}],["m",{"w":"them","s":"m","e":true,"k":"m","d":[353,513],"c":[]}],["y",{"w":"they","s":"y","e":true,"k":"y","d":[354],"c":[]}],["n",{"w":"then","s":"n","e":true,"k":"n","d":[376],"c":[]}]]}],["a",{"w":"tha","s":"a","e":false,"k":"a","d":[],"c":[["t",{"w":"that","s":"t","e":true,"k":"t","d":[5,6,7,18,28,70,284,285,309,313,329,335,359,360,361,376,380,422,457,494,502,513,516],"c":[]}],["n",{"w":"than","s":"n","e":true,"k":"n","d":[65,114,154,176,191,439,462],"c":[]}]]}],["r",{"w":"thro","s":"ro","e":false,"k":"r","d":[],"c":[["u",{"w":"through","s":"ugh","e":true,"k":"u","d":[26,37,38,39,41,42,43,255],"c":[]}],["w",{"w":"throwing","s":"wing","e":true,"k":"w","d":[148,151],"c":[]}]]}],["i",{"w":"thi","s":"i","e":false,"k":"i","d":[],"c":[["s",{"w":"this","s":"s","e":true,"k":"s","d":[231,376],"c":[]}],["r",{"w":"third","s":"rd","e":true,"k":"r","d":[511],"c":[]}]]}],["o",{"w":"those","s":"ose","e":true,"k":"o","d":[373],"c":[]}]]}],["e",{"w":"te","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"test","s":"st","e":true,"k":"s","d":[9,18,50],"c":[["s",{"w":"tests","s":"s","e":true,"k":"s","d":[8,12,224,245],"c":[]}],["n",{"w":"testnet","s":"net","e":true,"k":"n","d":[25,49,298,318,319],"c":[]}],["i",{"w":"testing","s":"ing","e":true,"k":"i","d":[28,348],"c":[]}]]}],["n",{"w":"tenure","s":"nure","e":true,"k":"n","d":[407,409],"c":[["s",{"w":"tenures","s":"s","e":true,"k":"s","d":[127],"c":[]}]]}],["x",{"w":"text","s":"xt","e":true,"k":"x","d":[297,300],"c":[]}],["m",{"w":"template","s":"mplate","e":true,"k":"m","d":[384,386],"c":[]}]]}],["r",{"w":"tr","s":"r","e":false,"k":"r","d":[],"c":[["a",{"w":"tra","s":"a","e":false,"k":"a","d":[],"c":[["i",{"w":"trait","s":"it","e":true,"k":"i","d":[90,411],"c":[["s",{"w":"traits","s":"s","e":true,"k":"s","d":[66,117,119,152,330],"c":[]}]]}],["n",{"w":"trans","s":"ns","e":false,"k":"n","d":[],"c":[["f",{"w":"transfer","s":"fer","e":true,"k":"f","d":[101,123,150,184,243,357,387,398],"c":[["s",{"w":"transfers","s":"s","e":true,"k":"s","d":[320,325,328,454,457,491,494],"c":[]}]]}],["a",{"w":"transaction","s":"action","e":true,"k":"a","d":[277,280,304,305,307,310,315,320,325,334,335,396,397,403,435,475],"c":[["s",{"w":"transactions","s":"s","e":true,"k":"s","d":[226,230,234,237,242,279,293,303,306,308,309,311,312,313,314,320,322,326,335,350,353,368,378,398,399,402],"c":[]}]]}]]}]]}],["y",{"w":"try","s":"y","e":true,"k":"y","d":[166],"c":[]}],["i",{"w":"trigger","s":"igger","e":true,"k":"i","d":[373],"c":[["e",{"w":"triggered","s":"ed","e":true,"k":"e","d":[329],"c":[]}]]}]]}],["u",{"w":"tuple","s":"uple","e":true,"k":"u","d":[116],"c":[["s",{"w":"tuples","s":"s","e":true,"k":"s","d":[83,189],"c":[]}]]}],["y",{"w":"type","s":"ype","e":true,"k":"y","d":[121,168,335,417,418],"c":[["s",{"w":"types","s":"s","e":true,"k":"s","d":[85,103,151],"c":[]}]]}],["i",{"w":"ti","s":"i","e":false,"k":"i","d":[],"c":[["m",{"w":"time","s":"me","e":true,"k":"m","d":[296],"c":[["-",{"w":"time-based","s":"-based","e":true,"k":"-","d":[202],"c":[]}],["s",{"w":"times","s":"s","e":true,"k":"s","d":[266,298],"c":[]}]]}],["c",{"w":"ticker","s":"cker","e":true,"k":"c","d":[452,489],"c":[]}]]}],["s",{"w":"ts","s":"s","e":true,"k":"s","d":[233,367],"c":[]}],["a",{"w":"target","s":"arget","e":true,"k":"a","d":[296,298,373],"c":[]}],["b",{"w":"tbd","s":"bd","e":true,"k":"b","d":[503],"c":[]}]]}],["c",{"w":"c","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"co","s":"o","e":false,"k":"o","d":[],"c":[["n",{"w":"con","s":"n","e":false,"k":"n","d":[],"c":[["t",{"w":"cont","s":"t","e":false,"k":"t","d":[],"c":[["r",{"w":"contr","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"contribute","s":"ibute","e":true,"k":"i","d":[1,419,506],"c":[]}],["a",{"w":"contract","s":"act","e":true,"k":"a","d":[9,20,21,22,30,51,67,77,78,80,86,90,192,303,323,324,327,329,332,342,377,386,405,410,411,413,414,415,416],"c":[["s",{"w":"contracts","s":"s","e":true,"k":"s","d":[8,12,18,24,25,26,28,46,76,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,224,225,226,231,234,245,293,330,331,333,348,368,399,412,514],"c":[]}]]}],["o",{"w":"control","s":"ol","e":true,"k":"o","d":[81,354],"c":[]}]]}],["e",{"w":"content","s":"ent","e":true,"k":"e","d":[1,419,456,493,506],"c":[]}]]}],["c",{"w":"conc","s":"c","e":false,"k":"c","d":[],"c":[["e",{"w":"concepts","s":"epts","e":true,"k":"e","d":[19],"c":[]}],["a",{"w":"concatenate","s":"atenate","e":true,"k":"a","d":[182],"c":[]}]]}],["f",{"w":"confi","s":"fi","e":false,"k":"f","d":[],"c":[["g",{"w":"configur","s":"gur","e":false,"k":"g","d":[],"c":[["i",{"w":"configuring","s":"ing","e":true,"k":"i","d":[20],"c":[]}],["e",{"w":"configure","s":"e","e":true,"k":"e","d":[348],"c":[]}]]}],["r",{"w":"confirm","s":"rm","e":false,"k":"r","d":[],"c":[["e",{"w":"confirmed","s":"ed","e":true,"k":"e","d":[264,314],"c":[]}],["a",{"w":"confirmation","s":"ation","e":true,"k":"a","d":[313],"c":[]}]]}]]}],["s",{"w":"cons","s":"s","e":false,"k":"s","d":[],"c":[["o",{"w":"console","s":"ole","e":true,"k":"o","d":[23],"c":[]}],["t",{"w":"const","s":"t","e":false,"k":"t","d":[],"c":[["r",{"w":"construct","s":"ruct","e":true,"k":"r","d":[82,121,164,168,200,226,234,368],"c":[]}],["a",{"w":"constant","s":"ant","e":true,"k":"a","d":[416],"c":[["s",{"w":"constants","s":"s","e":true,"k":"s","d":[92],"c":[]}]]}]]}],["e",{"w":"consensus","s":"ensus","e":true,"k":"e","d":[142],"c":[]}],["i",{"w":"considerations","s":"iderations","e":true,"k":"i","d":[149],"c":[]}]]}],["v",{"w":"convert","s":"vert","e":true,"k":"v","d":[87,88,118,120,133,138,153,157,158,179],"c":[]}],["d",{"w":"conditional","s":"ditional","e":true,"k":"d","d":[193,196],"c":[]}],["n",{"w":"connect","s":"nect","e":true,"k":"n","d":[352,355,356,357,366],"c":[["e",{"w":"connected","s":"ed","e":true,"k":"e","d":[356,366],"c":[]}]]}]]}],["u",{"w":"count","s":"unt","e":false,"k":"u","d":[],"c":[["e",{"w":"counter","s":"er","e":true,"k":"e","d":[9,30],"c":[]}],["s",{"w":"counts","s":"s","e":true,"k":"s","d":[306],"c":[]}]]}],["v",{"w":"cover","s":"ver","e":true,"k":"v","d":[11,256,381,420,501,505],"c":[]}],["s",{"w":"costs","s":"sts","e":true,"k":"s","d":[22,280,397],"c":[]}],["m",{"w":"com","s":"m","e":false,"k":"m","d":[],"c":[["m",{"w":"comm","s":"m","e":false,"k":"m","d":[],"c":[["a",{"w":"command","s":"and","e":true,"k":"a","d":[26],"c":[["-",{"w":"command-line","s":"-line","e":true,"k":"-","d":[363,364],"c":[]}]]}],["u",{"w":"community","s":"unity","e":true,"k":"u","d":[72],"c":[]}],["o",{"w":"common","s":"on","e":true,"k":"o","d":[236,370],"c":[]}],["i",{"w":"commitments","s":"itments","e":true,"k":"i","d":[284,285],"c":[]}]]}],["b",{"w":"combines","s":"bines","e":true,"k":"b","d":[70],"c":[]}],["p",{"w":"comp","s":"p","e":false,"k":"p","d":[],"c":[["a",{"w":"compa","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"compact","s":"ct","e":true,"k":"c","d":[76],"c":[]}],["r",{"w":"compar","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"comparisons","s":"isons","e":true,"k":"i","d":[114,154,176,191],"c":[]}],["e",{"w":"compare","s":"e","e":true,"k":"e","d":[173],"c":[]}]]}],["t",{"w":"compatibility","s":"tibility","e":true,"k":"t","d":[351],"c":[]}]]}],["u",{"w":"compute","s":"ute","e":true,"k":"u","d":[84,91,111,181,188],"c":[]}],["o",{"w":"components","s":"onents","e":true,"k":"o","d":[141],"c":[]}],["l",{"w":"complement","s":"lement","e":true,"k":"l","d":[187],"c":[]}]]}]]}],["d",{"w":"cod","s":"d","e":false,"k":"d","d":[],"c":[["e",{"w":"code","s":"e","e":true,"k":"e","d":[50,415],"c":[]}],["i",{"w":"coding","s":"ing","e":true,"k":"i","d":[73],"c":[]}]]}],["o",{"w":"cookbook","s":"okbook","e":true,"k":"o","d":[72],"c":[]}],["l",{"w":"collection","s":"llection","e":true,"k":"l","d":[228],"c":[]}],["r",{"w":"core","s":"re","e":true,"k":"r","d":[299,400,401],"c":[]}]]}],["l",{"w":"cl","s":"l","e":false,"k":"l","d":[],"c":[["a",{"w":"cla","s":"a","e":false,"k":"a","d":[],"c":[["s",{"w":"class","s":"ss","e":true,"k":"s","d":[4,122,358],"c":[]}],["r",{"w":"clari","s":"ri","e":false,"k":"r","d":[],"c":[["n",{"w":"clarinet","s":"net","e":true,"k":"n","d":[4,5,6,7,8,9,10,12,18,19,20,21,23,25,28,29,30,221,224,245,246,358,359,360,361,362,363],"c":[]}],["t",{"w":"clarity","s":"ty","e":true,"k":"t","d":[6,8,12,21,76,77,79,80,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,224,226,234,245,348,360,368,415,513,514],"c":[["'",{"w":"clarity's","s":"'s","e":true,"k":"'","d":[78],"c":[]}]]}]]}]]}],["i",{"w":"cli","s":"i","e":true,"k":"i","d":[363,364,380],"c":[["e",{"w":"client","s":"ent","e":true,"k":"e","d":[64,365],"c":[]}]]}]]}],["a",{"w":"ca","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"can","s":"n","e":true,"k":"n","d":[5,6,7,10,20,29,49,359,360,361,422,502],"c":[]}],["p",{"w":"capabilities","s":"pabilities","e":true,"k":"p","d":[70],"c":[]}],["l",{"w":"cal","s":"l","e":false,"k":"l","d":[],"c":[["c",{"w":"calculat","s":"culat","e":false,"k":"c","d":[],"c":[["e",{"w":"calculate","s":"e","e":true,"k":"e","d":[106,107,185,197],"c":[]}],["i",{"w":"calculations","s":"ions","e":true,"k":"i","d":[280,397],"c":[]}]]}],["l",{"w":"call","s":"l","e":true,"k":"l","d":[377],"c":[["s",{"w":"calls","s":"s","e":true,"k":"s","d":[414],"c":[]}]]}]]}],["s",{"w":"case","s":"se","e":true,"k":"s","d":[373],"c":[["s",{"w":"cases","s":"s","e":true,"k":"s","d":[170,201],"c":[]}]]}]]}],["r",{"w":"cr","s":"r","e":false,"k":"r","d":[],"c":[["e",{"w":"creat","s":"eat","e":false,"k":"e","d":[],"c":[["e",{"w":"create","s":"e","e":true,"k":"e","d":[18,27,29,30,38,47,52,53,65,72,230,237,380,422,439,462,502,511,513,516],"c":[]}],["i",{"w":"creating","s":"ing","e":true,"k":"i","d":[364],"c":[]}],["o",{"w":"creators","s":"ors","e":true,"k":"o","d":[511],"c":[]}]]}],["y",{"w":"cryptographic","s":"yptographic","e":true,"k":"y","d":[80],"c":[]}],["o",{"w":"crowdfunding","s":"owdfunding","e":true,"k":"o","d":[511],"c":[]}]]}],["h",{"w":"ch","s":"h","e":false,"k":"h","d":[],"c":[["e",{"w":"check","s":"eck","e":true,"k":"e","d":[124,126,136,139,146,147],"c":[["e",{"w":"checkers","s":"ers","e":true,"k":"e","d":[21],"c":[]}]]}],["a",{"w":"cha","s":"a","e":false,"k":"a","d":[],"c":[["i",{"w":"chain","s":"in","e":true,"k":"i","d":[262,269],"c":[["h",{"w":"chainhook","s":"hook","e":true,"k":"h","d":[38,39,41,42,43,52,68,373,374,376,377,379,380],"c":[["s",{"w":"chainhooks","s":"s","e":true,"k":"s","d":[31,37,40,375],"c":[]}]]}]]}],["l",{"w":"challenges","s":"llenges","e":true,"k":"l","d":[73],"c":[]}],["n",{"w":"changes","s":"nges","e":true,"k":"n","d":[223],"c":[]}]]}]]}],["u",{"w":"cu","s":"u","e":false,"k":"u","d":[],"c":[["s",{"w":"custom","s":"stom","e":true,"k":"s","d":[51,68],"c":[]}],["r",{"w":"current","s":"rrent","e":true,"k":"r","d":[210],"c":[["l",{"w":"currently","s":"ly","e":true,"k":"l","d":[335],"c":[]}]]}]]}],["y",{"w":"cycle","s":"ycle","e":true,"k":"y","d":[214,215,289,290,291,292,391],"c":[["s",{"w":"cycles","s":"s","e":true,"k":"s","d":[287,288],"c":[]}]]}],["i",{"w":"circulating","s":"irculating","e":true,"k":"i","d":[297],"c":[]}]]}],["d",{"w":"d","s":"d","e":false,"k":"d","d":[],"c":[["o",{"w":"doc","s":"oc","e":false,"k":"o","d":[],"c":[["u",{"w":"documentation","s":"umentation","e":true,"k":"u","d":[1,419,506],"c":[]}],["k",{"w":"docker","s":"ker","e":true,"k":"k","d":[510],"c":[]}],["s",{"w":"docskit","s":"skit","e":true,"k":"s","d":[517],"c":[]}]]}],["a",{"w":"data","s":"ata","e":true,"k":"a","d":[13,16,54,74,76,83,97,131,175,263,307,403,405,413,415,425,427,443,459],"c":[["b",{"w":"databases","s":"bases","e":true,"k":"b","d":[422,502],"c":[]}]]}],["i",{"w":"di","s":"i","e":false,"k":"i","d":[],"c":[["s",{"w":"dis","s":"s","e":false,"k":"s","d":[],"c":[["c",{"w":"discover","s":"cover","e":true,"k":"c","d":[14,15,17,48,219,220,221,222,223,229],"c":[]}],["j",{"w":"disjunction","s":"junction","e":true,"k":"j","d":[165],"c":[]}],["p",{"w":"displays","s":"plays","e":true,"k":"p","d":[210],"c":[]}],["t",{"w":"distribute","s":"tribute","e":true,"k":"t","d":[318],"c":[]}]]}],["v",{"w":"division","s":"vision","e":true,"k":"v","d":[112,197],"c":[]}],["f",{"w":"different","s":"fferent","e":true,"k":"f","d":[170,241,351,424],"c":[]}]]}],["e",{"w":"de","s":"e","e":false,"k":"e","d":[],"c":[["v",{"w":"dev","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"develop","s":"elop","e":false,"k":"e","d":[],"c":[["m",{"w":"development","s":"ment","e":true,"k":"m","d":[18,23,24,32,34,35,36,77,78,80,347],"c":[]}],["e",{"w":"develope","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"developer","s":"r","e":true,"k":"r","d":[45],"c":[["s",{"w":"developers","s":"s","e":true,"k":"s","d":[247,467,512],"c":[]}]]}],["d",{"w":"developed","s":"d","e":true,"k":"d","d":[424],"c":[]}]]}]]}],["n",{"w":"devnet","s":"net","e":true,"k":"n","d":[25,31,32,33,34,35,36,375,509,510],"c":[["'",{"w":"devnet's","s":"'s","e":true,"k":"'","d":[50],"c":[]}]]}]]}],["p",{"w":"deploy","s":"ploy","e":true,"k":"p","d":[18,46,49,51,53],"c":[["m",{"w":"deployment","s":"ment","e":true,"k":"m","d":[27,333],"c":[]}],["i",{"w":"deploying","s":"ing","e":true,"k":"i","d":[28,45],"c":[]}]]}],["b",{"w":"debug","s":"bug","e":true,"k":"b","d":[26],"c":[]}],["l",{"w":"del","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"dele","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"delete","s":"te","e":true,"k":"t","d":[42],"c":[]}],["g",{"w":"delegator","s":"gator","e":true,"k":"g","d":[316,317],"c":[]}]]}],["i",{"w":"delivers","s":"ivers","e":true,"k":"i","d":[319],"c":[]}]]}],["c",{"w":"dec","s":"c","e":false,"k":"c","d":[],"c":[["e",{"w":"decentralized","s":"entralized","e":true,"k":"e","d":[69,71],"c":[]}],["o",{"w":"deco","s":"o","e":false,"k":"o","d":[],"c":[["m",{"w":"decompose","s":"mpose","e":true,"k":"m","d":[141],"c":[]}],["d",{"w":"decode","s":"de","e":true,"k":"d","d":[226,234,368],"c":[]}]]}]]}],["f",{"w":"def","s":"f","e":false,"k":"f","d":[],"c":[["i",{"w":"define","s":"ine","e":true,"k":"i","d":[92,97,99,100,119,122,129,134,160],"c":[]}],["a",{"w":"default","s":"ault","e":true,"k":"a","d":[103],"c":[]}]]}],["r",{"w":"derive","s":"rive","e":true,"k":"r","d":[94],"c":[]}],["s",{"w":"deserialize","s":"serialize","e":true,"k":"s","d":[144],"c":[]}],["t",{"w":"det","s":"t","e":false,"k":"t","d":[],"c":[["a",{"w":"details","s":"ails","e":true,"k":"a","d":[262,265,268,269,273,277,289,290,310,311,325,332,339,341,394],"c":[]}],["e",{"w":"determine","s":"ermine","e":true,"k":"e","d":[411],"c":[]}]]}]]}],["r",{"w":"dropped","s":"ropped","e":true,"k":"r","d":[309],"c":[]}]]}],["a",{"w":"a","s":"a","e":true,"k":"a","d":[6,8,9,13,14,15,16,17,18,20,24,29,30,32,34,35,36,38,39,41,42,43,45,47,52,60,63,64,67,68,69,71,73,75,84,86,87,89,90,91,93,94,96,97,101,103,105,106,107,109,110,111,116,118,121,122,124,125,131,132,133,135,136,138,141,142,143,144,147,153,157,158,160,161,162,167,168,169,172,175,177,179,180,181,183,184,185,186,190,194,195,198,200,206,214,215,216,228,233,251,254,260,261,262,264,265,267,268,269,270,271,272,274,275,276,277,278,281,283,284,285,286,287,289,290,291,292,294,296,303,304,305,308,310,311,314,315,316,317,319,320,322,323,324,325,327,328,329,330,332,336,338,340,342,343,344,350,354,356,357,360,363,364,365,366,367,374,376,377,380,383,384,386,389,391,393,395,399,405,408,409,410,411,413,414,415,416,430,432,433,435,436,437,438,441,442,447,449,450,454,455,456,457,458,464,465,470,472,473,475,476,477,478,480,481,484,486,487,491,492,493,494,495,499,500,509,510,511,515,516],"c":[["n",{"w":"an","s":"n","e":true,"k":"n","d":[67,89,109,118,124,132,133,138,139,146,153,157,158,167,168,172,180,183,240,279,323,324,326,354,385,396,398,427,459,513],"c":[["d",{"w":"and","s":"d","e":true,"k":"d","d":[1,3,4,12,18,20,21,26,28,31,33,45,49,50,53,54,66,69,72,74,76,77,78,79,80,81,85,108,117,126,148,151,162,169,199,201,208,210,224,226,227,230,234,235,237,245,263,273,277,280,281,282,283,288,295,298,299,302,306,307,321,326,330,331,334,348,350,352,353,358,362,368,369,373,376,380,391,394,397,399,400,403,410,412,415,419,420,421,422,424,425,443,447,450,455,459,484,487,492,502,506,507,513],"c":[]}],["a",{"w":"analyze","s":"alyze","e":true,"k":"a","d":[22,208],"c":[]}],["y",{"w":"any","s":"y","e":true,"k":"y","d":[54],"c":[]}],["c",{"w":"anchored","s":"chored","e":true,"k":"c","d":[326],"c":[]}]]}],["p",{"w":"ap","s":"p","e":false,"k":"p","d":[],"c":[["i",{"w":"api","s":"i","e":true,"k":"i","d":[14,15,31,33,36,40,55,56,57,58,68,210,211,212,222,227,235,247,248,249,257,259,299,301,302,346,369,399,400,401,406,427,428,429,459,460,461,467,468,469,496,497,512],"c":[["s",{"w":"apis","s":"s","e":true,"k":"s","d":[3,345,421,507],"c":[]}]]}],["p",{"w":"app","s":"p","e":true,"k":"p","d":[53,384,511],"c":[["s",{"w":"apps","s":"s","e":true,"k":"s","d":[11,45,203,256,381,501,505],"c":[]}],["l",{"w":"appl","s":"l","e":false,"k":"l","d":[],"c":[["y",{"w":"apply","s":"y","e":true,"k":"y","d":[105],"c":[]}],["i",{"w":"applications","s":"ications","e":true,"k":"i","d":[228,356,366,515],"c":[]}]]}],["e",{"w":"append","s":"end","e":true,"k":"e","d":[149],"c":[]}],["r",{"w":"approximate","s":"roximate","e":true,"k":"r","d":[280,397],"c":[]}]]}]]}],["s",{"w":"as","s":"s","e":true,"k":"s","d":[33,192,297,300,306,350,374,376],"c":[["s",{"w":"ass","s":"s","e":false,"k":"s","d":[],"c":[["e",{"w":"asse","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"assert","s":"rt","e":false,"k":"r","d":[],"c":[["i",{"w":"assertions","s":"ions","e":true,"k":"i","d":[6,193,360],"c":[]}],["s",{"w":"asserts","s":"s","e":true,"k":"s","d":[193],"c":[]}]]}],["t",{"w":"asset","s":"t","e":true,"k":"t","d":[324,343],"c":[["s",{"w":"assets","s":"s","e":true,"k":"s","d":[67],"c":[]}]]}]]}],["o",{"w":"associated","s":"ociated","e":true,"k":"o","d":[67,281,283,323,324,465,500],"c":[]}]]}],["c",{"w":"ascii","s":"cii","e":true,"k":"c","d":[88],"c":[]}],["-",{"w":"as-","s":"-","e":false,"k":"-","d":[],"c":[["m",{"w":"as-max-len","s":"max-len","e":true,"k":"m","d":[126],"c":[]}],["c",{"w":"as-contract","s":"contract","e":true,"k":"c","d":[192],"c":[]}]]}]]}],["r",{"w":"ar","s":"r","e":false,"k":"r","d":[],"c":[["c",{"w":"archi","s":"chi","e":false,"k":"c","d":[],"c":[["v",{"w":"archive","s":"ve","e":true,"k":"v","d":[13,14,15,17,48],"c":[]}],["t",{"w":"architecture","s":"tecture","e":true,"k":"t","d":[55,259],"c":[]}]]}],["i",{"w":"arithmetic","s":"ithmetic","e":true,"k":"i","d":[77,102,112,137,140],"c":[]}],["e",{"w":"are","s":"e","e":true,"k":"e","d":[313,335,379,424],"c":[]}],["o",{"w":"around","s":"ound","e":true,"k":"o","d":[334],"c":[]}]]}],["b",{"w":"about","s":"bout","e":true,"k":"b","d":[19,33,40,56,57,59,61,62,95,104,127,156,213,217,248,249,250,252,253,299,337,400,401,407,428,431,434,440,448,453,460,468,471,474,479,485,490,496],"c":[]}],["d",{"w":"add","s":"dd","e":true,"k":"d","d":[149],"c":[["i",{"w":"addi","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"adding","s":"ng","e":true,"k":"n","d":[20],"c":[]}],["t",{"w":"addition","s":"tion","e":true,"k":"t","d":[137],"c":[]}]]}],["r",{"w":"address","s":"ress","e":true,"k":"r","d":[240,274,277,285,286,303,308,319,327,342,354,430,436,449,452,470,476,486,489],"c":[["e",{"w":"addresses","s":"es","e":true,"k":"e","d":[284,285,318],"c":[]}]]}]]}],["c",{"w":"ac","s":"c","e":false,"k":"c","d":[],"c":[["c",{"w":"acc","s":"c","e":false,"k":"c","d":[],"c":[["e",{"w":"access","s":"ess","e":true,"k":"e","d":[31,81],"c":[]}],["o",{"w":"account","s":"ount","e":true,"k":"o","d":[67,98,143,240,320,321,322,323,324,326,404,405],"c":[["s",{"w":"accounts","s":"s","e":true,"k":"s","d":[293],"c":[]}]]}],["u",{"w":"accurate","s":"urate","e":true,"k":"u","d":[422,502],"c":[]}]]}],["t",{"w":"acti","s":"ti","e":false,"k":"t","d":[],"c":[["o",{"w":"action","s":"on","e":true,"k":"o","d":[354],"c":[["s",{"w":"actions","s":"s","e":true,"k":"s","d":[373],"c":[]}]]}],["v",{"w":"activit","s":"vit","e":false,"k":"v","d":[],"c":[["y",{"w":"activity","s":"y","e":true,"k":"y","d":[423,435,436,437,438,452,475,476,477,478,489,504],"c":[]}],["i",{"w":"activities","s":"ies","e":true,"k":"i","d":[434,474],"c":[]}]]}]]}]]}],["l",{"w":"al","s":"l","e":false,"k":"l","d":[],"c":[["l",{"w":"all","s":"l","e":true,"k":"l","d":[37,67,270,276,309,312,313,323,324,335,399,418,436,438,454,465,476,478,491,500],"c":[["o",{"w":"allows","s":"ows","e":true,"k":"o","d":[380,513],"c":[]}]]}],["e",{"w":"alerts","s":"erts","e":true,"k":"e","d":[51],"c":[]}],["s",{"w":"also","s":"so","e":true,"k":"s","d":[335],"c":[]}],["o",{"w":"along","s":"ong","e":true,"k":"o","d":[415],"c":[]}]]}],["f",{"w":"after","s":"fter","e":true,"k":"f","d":[51],"c":[]}],["i",{"w":"ai","s":"i","e":true,"k":"i","d":[70],"c":[]}],["t",{"w":"at","s":"t","e":true,"k":"t","d":[109,161,180,417,418,457,494],"c":[["-",{"w":"at-block","s":"-block","e":true,"k":"-","d":[161],"c":[]}]]}],["g",{"w":"ag","s":"g","e":false,"k":"g","d":[],"c":[["a",{"w":"against","s":"ainst","e":true,"k":"a","d":[169,374,376],"c":[]}],["g",{"w":"aggregated","s":"gregated","e":true,"k":"g","d":[205,206,207],"c":[]}],["e",{"w":"ages","s":"es","e":true,"k":"e","d":[306],"c":[]}]]}],["u",{"w":"auth","s":"uth","e":false,"k":"u","d":[],"c":[["e",{"w":"authenticat","s":"enticat","e":false,"k":"e","d":[],"c":[["e",{"w":"authenticate","s":"e","e":true,"k":"e","d":[257,352],"c":[]}],["i",{"w":"authenticating","s":"ing","e":true,"k":"i","d":[350],"c":[]}]]}],["o",{"w":"authorize","s":"orize","e":true,"k":"o","d":[354],"c":[]}]]}],["v",{"w":"av","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"average","s":"erage","e":true,"k":"e","d":[266],"c":[]}],["a",{"w":"available","s":"ailable","e":true,"k":"a","d":[371,372],"c":[]}]]}],["m",{"w":"amounts","s":"mounts","e":true,"k":"m","d":[281,282,283],"c":[]}],["w",{"w":"awaiting","s":"waiting","e":true,"k":"w","d":[313],"c":[]}]]}],["g",{"w":"g","s":"g","e":true,"k":"g","d":[281,283,286],"c":[["e",{"w":"get","s":"et","e":true,"k":"e","d":[2,37,39,110,205,206,207,211,212,213,214,215,216,217,218,240,345,388,396,404,416,417,418],"c":[]}],["u",{"w":"guide","s":"uide","e":true,"k":"u","d":[231,371,372],"c":[["s",{"w":"guides","s":"s","e":true,"k":"s","d":[11,256,381,420,501,505],"c":[]}]]}],["o",{"w":"go","s":"o","e":true,"k":"o","d":[58],"c":[["v",{"w":"governance","s":"vernance","e":true,"k":"v","d":[69],"c":[]}]]}],["r",{"w":"gr","s":"r","e":false,"k":"r","d":[],"c":[["a",{"w":"gra","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"grants","s":"nts","e":true,"k":"n","d":[69],"c":[]}],["c",{"w":"gracefully","s":"cefully","e":true,"k":"c","d":[422,502],"c":[]}]]}],["o",{"w":"group","s":"oup","e":true,"k":"o","d":[83],"c":[]}],["e",{"w":"greater","s":"eater","e":true,"k":"e","d":[154,191],"c":[]}]]}],["i",{"w":"given","s":"iven","e":true,"k":"i","d":[214,215,262,265,268,269,275,277,283,285,286,296,315,316,317,328,329,340,342,343,391,405,410,411,414,415],"c":[]}]]}],["s",{"w":"s","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"st","s":"t","e":false,"k":"t","d":[],"c":[["a",{"w":"sta","s":"a","e":false,"k":"a","d":[],"c":[["r",{"w":"start","s":"rt","e":true,"k":"r","d":[35],"c":[["e",{"w":"started","s":"ed","e":true,"k":"e","d":[2,345],"c":[]}]]}],["c",{"w":"stack","s":"ck","e":false,"k":"c","d":[],"c":[["s",{"w":"stacks","s":"s","e":true,"k":"s","d":[2,11,13,14,17,18,33,36,49,54,59,64,70,74,75,104,127,156,203,204,208,213,220,222,223,225,226,227,228,229,230,232,234,235,236,237,239,242,243,244,250,256,257,258,259,299,301,347,349,352,353,355,356,357,364,365,366,368,369,370,372,373,374,376,378,380,381,389,399,400,501,505,509],"c":[]}],["e",{"w":"stacker","s":"er","e":true,"k":"e","d":[391],"c":[["s",{"w":"stackers","s":"s","e":true,"k":"s","d":[288,292],"c":[]}]]}],["i",{"w":"stacking","s":"ing","e":true,"k":"i","d":[316,317,516],"c":[]}]]}],["t",{"w":"stat","s":"t","e":false,"k":"t","d":[],"c":[["u",{"w":"status","s":"us","e":true,"k":"u","d":[43,209,210,277,301,333,428,429,460,461,468,469,496,497],"c":[]}],["s",{"w":"stats","s":"s","e":true,"k":"s","d":[214,445,482],"c":[]}],["i",{"w":"statistics","s":"istics","e":true,"k":"i","d":[306,446,483],"c":[]}]]}],["n",{"w":"standard","s":"ndard","e":true,"k":"n","d":[147,247,467,512],"c":[]}]]}],["x",{"w":"stx","s":"x","e":true,"k":"x","d":[3,49,98,143,150,184,198,243,295,297,300,302,303,319,320,321,325,327,328,342,357,378,398,421,507],"c":[]}],["e",{"w":"step","s":"ep","e":true,"k":"e","d":[26],"c":[]}],["o",{"w":"sto","s":"o","e":false,"k":"o","d":[],"c":[["p",{"w":"stop","s":"p","e":true,"k":"p","d":[34],"c":[]}],["r",{"w":"storage","s":"rage","e":true,"k":"r","d":[76,79],"c":[]}]]}],["r",{"w":"str","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"string","s":"ing","e":true,"k":"i","d":[88,120,138,157],"c":[]}],["e",{"w":"stream","s":"eam","e":true,"k":"e","d":[382],"c":[["s",{"w":"streams","s":"s","e":true,"k":"s","d":[380,422,502],"c":[]}]]}]]}]]}],["i",{"w":"si","s":"i","e":false,"k":"i","d":[],"c":[["m",{"w":"sim","s":"m","e":false,"k":"m","d":[],"c":[["n",{"w":"simnet","s":"net","e":true,"k":"n","d":[4,5,7,358,359,361],"c":[]}],["p",{"w":"simple","s":"ple","e":true,"k":"p","d":[9,30],"c":[]}]]}],["p",{"w":"sip-0","s":"p-0","e":false,"k":"p","d":[],"c":[["1",{"w":"sip-010","s":"10","e":true,"k":"1","d":[60,251],"c":[]}],["0",{"w":"sip-009","s":"09","e":true,"k":"0","d":[63,254],"c":[]}]]}],["g",{"w":"sign","s":"gn","e":true,"k":"g","d":[353,354],"c":[["e",{"w":"signe","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"signed","s":"d","e":true,"k":"d","d":[87,118,153,179],"c":[]}],["r",{"w":"signer","s":"r","e":true,"k":"r","d":[205,206,207,208,211,212,214,216,218,289,292,391],"c":[["s",{"w":"signers","s":"s","e":true,"k":"s","d":[213,215,288,291],"c":[]}]]}]]}],["a",{"w":"signature","s":"ature","e":true,"k":"a","d":[162,169],"c":[]}],["i",{"w":"signing","s":"ing","e":true,"k":"i","d":[350],"c":[]}]]}],["n",{"w":"single","s":"ngle","e":true,"k":"n","d":[96,260,314,336,454,456,458,464,465,491,493,495,499,500],"c":[]}]]}],["d",{"w":"sdk","s":"dk","e":true,"k":"d","d":[4,5,6,7,8,9,10,12,224,245,246,358,359,360,361,362],"c":[]}],["e",{"w":"se","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"set","s":"t","e":true,"k":"t","d":[6,132,175,347,360,391],"c":[["u",{"w":"setup","s":"up","e":true,"k":"u","d":[348],"c":[]}]]}],["v",{"w":"several","s":"veral","e":true,"k":"v","d":[7,361],"c":[]}],["r",{"w":"ser","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"seri","s":"i","e":false,"k":"i","d":[],"c":[["e",{"w":"series","s":"es","e":true,"k":"e","d":[13,73],"c":[]}],["a",{"w":"serialize","s":"alize","e":true,"k":"a","d":[142],"c":[["d",{"w":"serialized","s":"d","e":true,"k":"d","d":[315],"c":[]}]]}]]}],["v",{"w":"serv","s":"v","e":false,"k":"v","d":[],"c":[["i",{"w":"service","s":"ice","e":true,"k":"i","d":[209,374,376],"c":[["s",{"w":"services","s":"s","e":true,"k":"s","d":[13,33],"c":[]}]]}],["e",{"w":"server","s":"er","e":true,"k":"e","d":[56,57,248,249,401,460,496],"c":[]}]]}]]}],["m",{"w":"sem","s":"m","e":false,"k":"m","d":[],"c":[["a",{"w":"semantics","s":"antics","e":true,"k":"a","d":[21],"c":[]}],["i",{"w":"semi-fungible","s":"i-fungible","e":true,"k":"i","d":[54,61,252],"c":[]}]]}],["a",{"w":"sea","s":"a","e":false,"k":"a","d":[],"c":[["m",{"w":"seamlessly","s":"mlessly","e":true,"k":"m","d":[31],"c":[]}],["r",{"w":"search","s":"rch","e":true,"k":"r","d":[293,294],"c":[]}]]}],["q",{"w":"sequence","s":"quence","e":true,"k":"q","d":[96,109,110,126,163,194,409],"c":[["s",{"w":"sequences","s":"s","e":true,"k":"s","d":[182],"c":[]}]]}],["c",{"w":"sec","s":"c","e":false,"k":"c","d":[],"c":[["u",{"w":"secure","s":"ure","e":true,"k":"u","d":[231],"c":[]}],["r",{"w":"secrets","s":"rets","e":true,"k":"r","d":[239],"c":[]}]]}],["n",{"w":"sent","s":"nt","e":true,"k":"n","d":[303],"c":[]}],["p",{"w":"separated","s":"parated","e":true,"k":"p","d":[335],"c":[]}]]}],["m",{"w":"smart","s":"mart","e":true,"k":"m","d":[8,12,18,21,76,77,78,80,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,224,225,226,231,234,245,303,329,331,332,333,342,348,368,399,410,412,414,514],"c":[]}],["n",{"w":"snapshot","s":"napshot","e":true,"k":"n","d":[16],"c":[["s",{"w":"snapshots","s":"s","e":true,"k":"s","d":[13],"c":[]}]]}],["p",{"w":"sp","s":"p","e":false,"k":"p","d":[],"c":[["i",{"w":"spin","s":"in","e":true,"k":"i","d":[14,15,17],"c":[]}],["e",{"w":"specifi","s":"ecifi","e":false,"k":"e","d":[],"c":[["c",{"w":"specific","s":"c","e":true,"k":"c","d":[39,43,109,161,180,206,214,216,262,264,265,268,269,271,272,274,278,304,305,308,310,320,322,325,332,337,413,432,457,472,494],"c":[]}],["e",{"w":"specified","s":"ed","e":true,"k":"e","d":[318,319,327,411],"c":[]}]]}]]}],["y",{"w":"syn","s":"yn","e":false,"k":"y","d":[],"c":[["t",{"w":"syntax","s":"tax","e":true,"k":"t","d":[21],"c":[]}],["c",{"w":"sync","s":"c","e":true,"k":"c","d":[509,515],"c":[]}]]}],["b",{"w":"sbtc","s":"btc","e":true,"k":"b","d":[28,233,367],"c":[]}],["u",{"w":"su","s":"u","e":false,"k":"u","d":[],"c":[["c",{"w":"suc","s":"c","e":false,"k":"c","d":[],"c":[["h",{"w":"such","s":"h","e":true,"k":"h","d":[33,306],"c":[]}],["c",{"w":"successful","s":"cessful","e":true,"k":"c","d":[121],"c":[["l",{"w":"successfully","s":"ly","e":true,"k":"l","d":[417,418],"c":[]}]]}]]}],["b",{"w":"sub","s":"b","e":false,"k":"b","d":[],"c":[["m",{"w":"submissions","s":"missions","e":true,"k":"m","d":[69],"c":[]}],["t",{"w":"subtraction","s":"traction","e":true,"k":"t","d":[140],"c":[]}],["-",{"w":"sub-sequence","s":"-sequence","e":true,"k":"-","d":[194],"c":[]}],["d",{"w":"subdomains","s":"domains","e":true,"k":"d","d":[271],"c":[]}]]}],["p",{"w":"suppl","s":"ppl","e":false,"k":"p","d":[],"c":[["y",{"w":"supply","s":"y","e":true,"k":"y","d":[125,295,297,300,302,450,487],"c":[]}],["i",{"w":"supplied","s":"ied","e":true,"k":"i","d":[396],"c":[]}]]}]]}],["c",{"w":"sc","s":"c","e":false,"k":"c","d":[],"c":[["a",{"w":"sca","s":"a","e":false,"k":"a","d":[],"c":[["l",{"w":"scaling","s":"ling","e":true,"k":"l","d":[45],"c":[]}],["n",{"w":"scan","s":"n","e":true,"k":"n","d":[378,423,504],"c":[]}]]}],["o",{"w":"scopes","s":"opes","e":true,"k":"o","d":[371,372],"c":[]}]]}],["o",{"w":"so","s":"o","e":true,"k":"o","d":[49,422,502],"c":[["m",{"w":"some","s":"me","e":true,"k":"m","d":[146],"c":[["t",{"w":"something","s":"thing","e":true,"k":"t","d":[70],"c":[]}]]}],["c",{"w":"social","s":"cial","e":true,"k":"c","d":[71],"c":[]}],["u",{"w":"source","s":"urce","e":true,"k":"u","d":[415],"c":[]}],["r",{"w":"sort","s":"rt","e":true,"k":"r","d":[455,492],"c":[]}]]}],["h",{"w":"sh","s":"h","e":false,"k":"h","d":[],"c":[["a",{"w":"sha","s":"a","e":false,"k":"a","d":[],"c":[["r",{"w":"shar","s":"r","e":false,"k":"r","d":[],"c":[["e",{"w":"share","s":"e","e":true,"k":"e","d":[72],"c":[]}],["p",{"w":"sharpen","s":"pen","e":true,"k":"p","d":[73],"c":[]}]]}],["-",{"w":"sha-","s":"-","e":false,"k":"-","d":[],"c":[["2",{"w":"sha-256","s":"256","e":true,"k":"2","d":[84],"c":[]}],["5",{"w":"sha-512","s":"512","e":true,"k":"5","d":[111,181],"c":[]}]]}],["2",{"w":"sha256","s":"256","e":true,"k":"2","d":[188],"c":[]}]]}],["i",{"w":"shift","s":"ift","e":true,"k":"i","d":[145,174],"c":[]}]]}],["k",{"w":"skills","s":"kills","e":true,"k":"k","d":[73],"c":[]}],["q",{"w":"square","s":"quare","e":true,"k":"q","d":[106],"c":[]}],["a",{"w":"sa","s":"a","e":false,"k":"a","d":[],"c":[["f",{"w":"safely","s":"fely","e":true,"k":"f","d":[201],"c":[]}],["t",{"w":"satoshi","s":"toshi","e":true,"k":"t","d":[464,465,499,500],"c":[["s",{"w":"satoshis","s":"s","e":true,"k":"s","d":[463,498],"c":[]}]]}],["l",{"w":"sale","s":"le","e":true,"k":"l","d":[513],"c":[]}]]}],["l",{"w":"slot","s":"lot","e":true,"k":"l","d":[285],"c":[]}]]}],["w",{"w":"w","s":"w","e":false,"k":"w","d":[],"c":[["i",{"w":"with","s":"ith","e":true,"k":"i","d":[2,4,5,6,7,24,28,31,49,51,64,67,68,69,70,72,79,81,83,149,184,202,226,227,232,233,234,235,236,237,239,257,281,283,323,324,328,331,345,358,359,360,361,362,363,365,367,368,369,370,374,383,384,386,399,412,415,420,427,455,459,465,492,500],"c":[["i",{"w":"within","s":"in","e":true,"k":"i","d":[86,275,411],"c":[]}],["o",{"w":"without","s":"out","e":true,"k":"o","d":[511],"c":[]}]]}],["r",{"w":"writ","s":"rit","e":false,"k":"r","d":[],"c":[["e",{"w":"write","s":"e","e":true,"k":"e","d":[8,224,245],"c":[]}],["i",{"w":"writing","s":"ing","e":true,"k":"i","d":[12],"c":[]}]]}],["a",{"w":"wa","s":"a","e":false,"k":"a","d":[],"c":[["y",{"w":"ways","s":"ys","e":true,"k":"y","d":[11,58,256,381,420,424,501,505],"c":[]}],["l",{"w":"wallet","s":"llet","e":true,"k":"l","d":[351,357,383],"c":[["s",{"w":"wallets","s":"s","e":true,"k":"s","d":[352],"c":[]}]]}],["s",{"w":"was","s":"s","e":true,"k":"s","d":[415,424],"c":[]}]]}],["e",{"w":"we","s":"e","e":false,"k":"e","d":[],"c":[["b",{"w":"web","s":"b","e":true,"k":"b","d":[203,228,356,357,366],"c":[]}],["l",{"w":"well","s":"ll","e":true,"k":"l","d":[350],"c":[]}]]}],["o",{"w":"wo","s":"o","e":false,"k":"o","d":[],"c":[["r",{"w":"work","s":"rk","e":true,"k":"r","d":[226,234,368],"c":[["l",{"w":"workload","s":"load","e":true,"k":"l","d":[210],"c":[]}],["i",{"w":"working","s":"ing","e":true,"k":"i","d":[227,235,236,369,370],"c":[]}]]}],["u",{"w":"would","s":"uld","e":true,"k":"u","d":[284,285],"c":[]}]]}],["h",{"w":"wh","s":"h","e":false,"k":"h","d":[],"c":[["o",{"w":"who","s":"o","e":true,"k":"o","d":[247,467,512],"c":[]}],["e",{"w":"whether","s":"ether","e":true,"k":"e","d":[411],"c":[]}]]}]]}],["e",{"w":"e","s":"e","e":true,"k":"e","d":[281,283,286],"c":[["c",{"w":"ecosystem","s":"cosystem","e":true,"k":"c","d":[2,13],"c":[]}],["n",{"w":"en","s":"n","e":false,"k":"n","d":[],"c":[["t",{"w":"entry","s":"try","e":true,"k":"t","d":[4,89,132,167,172,358,362,413],"c":[]}],["v",{"w":"environment","s":"vironment","e":true,"k":"v","d":[18,24,50,347],"c":[["s",{"w":"environments","s":"s","e":true,"k":"s","d":[348],"c":[]}],["-",{"w":"environment-agnostic","s":"-agnostic","e":true,"k":"-","d":[424],"c":[]}]]}],["c",{"w":"encod","s":"cod","e":false,"k":"c","d":[],"c":[["i",{"w":"encoding","s":"ing","e":true,"k":"i","d":[87,133,158,179],"c":[]}],["e",{"w":"encoded","s":"ed","e":true,"k":"e","d":[315],"c":[]}]]}],["d",{"w":"endpoints","s":"dpoints","e":true,"k":"d","d":[209,339,341,346],"c":[]}],["a",{"w":"enabl","s":"abl","e":false,"k":"a","d":[],"c":[["e",{"w":"enables","s":"es","e":true,"k":"e","d":[373,422,502],"c":[]}],["i",{"w":"enabling","s":"ing","e":true,"k":"i","d":[511],"c":[]}]]}]]}],["v",{"w":"ev","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"eve","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"everything","s":"rything","e":true,"k":"r","d":[18],"c":[]}],["n",{"w":"event","s":"nt","e":true,"k":"n","d":[380,422,502],"c":[["s",{"w":"events","s":"s","e":true,"k":"s","d":[67,304,305,323,324,329,373,382],"c":[]}]]}]]}],["a",{"w":"evaluat","s":"aluat","e":false,"k":"a","d":[],"c":[["e",{"w":"evaluate","s":"e","e":true,"k":"e","d":[161,163,199,374,376],"c":[]}],["i",{"w":"evaluation","s":"ion","e":true,"k":"i","d":[196],"c":[]}]]}]]}],["x",{"w":"ex","s":"x","e":false,"k":"x","d":[],"c":[["e",{"w":"execut","s":"ecut","e":false,"k":"e","d":[],"c":[["i",{"w":"execution","s":"ion","e":true,"k":"i","d":[22],"c":[]}],["e",{"w":"execute","s":"e","e":true,"k":"e","d":[86,192],"c":[]}]]}],["p",{"w":"exp","s":"p","e":false,"k":"p","d":[],"c":[["l",{"w":"expl","s":"l","e":false,"k":"l","d":[],"c":[["o",{"w":"explore","s":"ore","e":true,"k":"o","d":[74,78,425,443],"c":[["r",{"w":"explorer","s":"r","e":true,"k":"r","d":[75,220],"c":[]}]]}],["a",{"w":"explains","s":"ains","e":true,"k":"a","d":[231],"c":[]}],["i",{"w":"explicitly","s":"icitly","e":true,"k":"i","d":[411],"c":[]}]]}],["r",{"w":"expressions","s":"ressions","e":true,"k":"r","d":[161,163,171,192,199],"c":[]}]]}],["c",{"w":"exclusive","s":"clusive","e":true,"k":"c","d":[93,128],"c":[]}],["t",{"w":"extract","s":"tract","e":true,"k":"t","d":[194],"c":[]}],["i",{"w":"existing","s":"isting","e":true,"k":"i","d":[246],"c":[]}]]}],["a",{"w":"ea","s":"a","e":false,"k":"a","d":[],"c":[["s",{"w":"eas","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"easily","s":"ily","e":true,"k":"i","d":[49],"c":[]}],["y",{"w":"easy-to-use","s":"y-to-use","e":true,"k":"y","d":[427,459],"c":[]}]]}],["c",{"w":"each","s":"ch","e":true,"k":"c","d":[105,320,325],"c":[]}],["r",{"w":"earned","s":"rned","e":true,"k":"r","d":[282],"c":[]}]]}],["l",{"w":"element","s":"lement","e":true,"k":"l","d":[105,109,180,183],"c":[["s",{"w":"elements","s":"s","e":true,"k":"s","d":[149,177],"c":[]}]]}],["r",{"w":"error","s":"rror","e":true,"k":"r","d":[124,148,159,164,201],"c":[["s",{"w":"errors","s":"s","e":true,"k":"s","d":[148,151,166],"c":[]}]]}],["q",{"w":"equal","s":"qual","e":true,"k":"q","d":[176,191],"c":[["i",{"w":"equality","s":"ity","e":true,"k":"i","d":[173],"c":[]}]]}],["s",{"w":"estimate","s":"stimate","e":false,"k":"s","d":[],"c":[["d",{"w":"estimated","s":"d","e":true,"k":"d","d":[279,335,396,398],"c":[]}],["s",{"w":"estimates","s":"s","e":true,"k":"s","d":[280,397],"c":[]}]]}],["i",{"w":"either","s":"ither","e":true,"k":"i","d":[411],"c":[]}],["t",{"w":"etching","s":"tching","e":true,"k":"t","d":[442,481],"c":[["s",{"w":"etchings","s":"s","e":true,"k":"s","d":[440,441,479,480],"c":[]}]]}]]}],["u",{"w":"u","s":"u","e":false,"k":"u","d":[],"c":[["n",{"w":"un","s":"n","e":false,"k":"n","d":[],"c":[["d",{"w":"understand","s":"derstand","e":true,"k":"d","d":[3,55,259,346,421,507],"c":[]}],["i",{"w":"unit","s":"it","e":true,"k":"i","d":[8,224],"c":[]}],["p",{"w":"unpack","s":"pack","e":true,"k":"p","d":[85,148,151,159],"c":[]}],["s",{"w":"unsigned","s":"signed","e":true,"k":"s","d":[118,133,153,157,158],"c":[]}],["l",{"w":"unlocked","s":"locked","e":true,"k":"l","d":[295,302],"c":[]}]]}],["s",{"w":"us","s":"s","e":false,"k":"s","d":[],"c":[["e",{"w":"use","s":"e","e":true,"k":"e","d":[11,14,15,17,25,28,29,83,102,108,112,113,114,117,126,128,130,137,140,145,149,154,161,163,174,176,187,191,192,193,231,232,241,256,373,377,381,420,501,505,514],"c":[["d",{"w":"used","s":"d","e":true,"k":"d","d":[5,6,7,8,326,359,360,361],"c":[]}],["r",{"w":"user","s":"r","e":true,"k":"r","d":[352],"c":[["s",{"w":"users","s":"s","e":true,"k":"s","d":[350,352,353,354,513],"c":[]}]]}]]}],["i",{"w":"using","s":"ing","e":true,"k":"i","d":[9,10,12,30,50,52,64,76,87,133,158,166,179,224,230,243,245,263,352,357,365,513],"c":[]}],["a",{"w":"usage","s":"age","e":true,"k":"a","d":[517],"c":[]}]]}],["p",{"w":"up","s":"p","e":true,"k":"p","d":[14,15,17,347],"c":[["d",{"w":"update","s":"date","e":true,"k":"d","d":[41],"c":[["s",{"w":"updates","s":"s","e":true,"k":"s","d":[219,220,222],"c":[]}]]}],["g",{"w":"upgrade","s":"grade","e":true,"k":"g","d":[219,220,222,223],"c":[["s",{"w":"upgrades","s":"s","e":true,"k":"s","d":[221],"c":[]}]]}]]}],["r",{"w":"uris","s":"ris","e":true,"k":"r","d":[66],"c":[]}],["t",{"w":"ut","s":"t","e":false,"k":"t","d":[],"c":[["f",{"w":"utf-8","s":"f-8","e":true,"k":"f","d":[120],"c":[]}],["i",{"w":"utilities","s":"ilities","e":true,"k":"i","d":[236,370],"c":[]}]]}]]}],["r",{"w":"r","s":"r","e":false,"k":"r","d":[],"c":[["a",{"w":"ra","s":"a","e":false,"k":"a","d":[],"c":[["t",{"w":"rate","s":"te","e":true,"k":"t","d":[3,247,279,398,421,467,507,512],"c":[["s",{"w":"rates","s":"s","e":true,"k":"s","d":[280,397],"c":[]}]]}],["w",{"w":"raw","s":"w","e":true,"k":"w","d":[402],"c":[]}]]}],["u",{"w":"run","s":"un","e":true,"k":"u","d":[75,224,245,374,376,510],"c":[["n",{"w":"running","s":"ning","e":true,"k":"n","d":[12,301,461,497,509],"c":[]}],["t",{"w":"runtime","s":"time","e":true,"k":"t","d":[148,151],"c":[]}],["e",{"w":"rune","s":"e","e":true,"k":"e","d":[422,428,431,432,433,434,435,436,437,438,440,441,442,468,471,472,473,474,475,476,477,478,479,480,481],"c":[["s",{"w":"runes","s":"s","e":true,"k":"s","d":[420,423,427],"c":[]}],["h",{"w":"runehook","s":"hook","e":true,"k":"h","d":[422,424],"c":[]}]]}]]}],["e",{"w":"re","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"ret","s":"t","e":false,"k":"t","d":[],"c":[["r",{"w":"retriev","s":"riev","e":false,"k":"r","d":[],"c":[["e",{"w":"retrieve","s":"e","e":true,"k":"e","d":[43,90,116,125,131,172,180,190,195,273,288,307,317,334,337,394,403],"c":[["s",{"w":"retrieves","s":"s","e":true,"k":"s","d":[33,40,56,57,59,60,61,62,63,67,248,249,250,251,252,253,254,260,261,262,264,265,266,267,268,269,270,271,272,274,275,276,277,278,279,281,283,284,285,286,287,289,290,291,292,295,296,297,298,299,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,320,321,322,323,324,325,326,327,328,329,330,332,333,335,336,338,340,342,343,344,390,391,392,393,395,398,400,401,405,410,413,415,428,429,430,431,432,433,434,435,436,437,438,440,441,442,445,446,447,448,449,450,451,452,453,454,455,456,457,458,460,461,463,464,465,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500],"c":[]}]]}],["a",{"w":"retrieval","s":"al","e":true,"k":"a","d":[79,263],"c":[]}]]}],["u",{"w":"returns","s":"urns","e":true,"k":"u","d":[335],"c":[]}]]}],["q",{"w":"request","s":"quest","e":true,"k":"q","d":[49],"c":[["s",{"w":"requests","s":"s","e":true,"k":"s","d":[58,247,346,467,512],"c":[]}]]}],["c",{"w":"rec","s":"c","e":false,"k":"c","d":[],"c":[["i",{"w":"recip","s":"ip","e":false,"k":"i","d":[],"c":[["e",{"w":"recipe","s":"e","e":true,"k":"e","d":[72],"c":[]}],["i",{"w":"recipient","s":"ient","e":true,"k":"i","d":[283,285,286],"c":[["s",{"w":"recipients","s":"s","e":true,"k":"s","d":[281,282],"c":[]}]]}]]}],["o",{"w":"recover","s":"over","e":true,"k":"o","d":[162],"c":[]}],["e",{"w":"rece","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"recent","s":"nt","e":true,"k":"n","d":[207,218,281,282,283,338],"c":[["l",{"w":"recently","s":"ly","e":true,"k":"l","d":[261,267,312,313],"c":[["-",{"w":"recently-broadcast","s":"-broadcast","e":true,"k":"-","d":[309],"c":[]}]]}]]}],["i",{"w":"receive","s":"ive","e":true,"k":"i","d":[284,285],"c":[["d",{"w":"received","s":"d","e":true,"k":"d","d":[303],"c":[]}]]}]]}]]}],["s",{"w":"res","s":"s","e":false,"k":"s","d":[],"c":[["p",{"w":"response","s":"ponse","e":true,"k":"p","d":[85,121,124,136,151],"c":[["s",{"w":"responses","s":"s","e":true,"k":"s","d":[148,159,164],"c":[]}]]}],["t",{"w":"rest","s":"t","e":true,"k":"t","d":[399,427,459],"c":[]}],["u",{"w":"results","s":"ults","e":true,"k":"u","d":[455,492],"c":[]}]]}],["p",{"w":"rep","s":"p","e":false,"k":"p","d":[],"c":[["r",{"w":"representations","s":"resentations","e":true,"k":"r","d":[88,120],"c":[]}],["l",{"w":"replace","s":"lace","e":true,"k":"l","d":[109],"c":[]}]]}],["m",{"w":"rem","s":"m","e":false,"k":"m","d":[],"c":[["o",{"w":"remove","s":"ove","e":true,"k":"o","d":[89],"c":[]}],["a",{"w":"remainder","s":"ainder","e":true,"k":"a","d":[197],"c":[]}]]}],["d",{"w":"reduce","s":"duce","e":true,"k":"d","d":[96],"c":[]}],["a",{"w":"rea","s":"a","e":false,"k":"a","d":[],"c":[["d",{"w":"read","s":"d","e":true,"k":"d","d":[417,418],"c":[["-",{"w":"read-only","s":"-only","e":true,"k":"-","d":[134,339,341,414],"c":[]}]]}],["c",{"w":"react","s":"ct","e":true,"k":"c","d":[232],"c":[]}]]}],["l",{"w":"rel","s":"l","e":false,"k":"l","d":[],"c":[["a",{"w":"related","s":"ated","e":true,"k":"a","d":[219,220,221,222,223,273,394],"c":[]}],["e",{"w":"release","s":"ease","e":true,"k":"e","d":[221],"c":[]}],["i",{"w":"reliable","s":"iable","e":true,"k":"i","d":[427,459],"c":[]}]]}],["w",{"w":"reward","s":"ward","e":true,"k":"w","d":[281,285],"c":[["s",{"w":"rewards","s":"s","e":true,"k":"s","d":[282,283,286],"c":[]}]]}],["f",{"w":"reference","s":"ference","e":true,"k":"f","d":[371,372],"c":[]}],["g",{"w":"register","s":"gister","e":true,"k":"g","d":[375],"c":[]}],["o",{"w":"reorgs","s":"orgs","e":true,"k":"o","d":[422,502],"c":[]}],["v",{"w":"revealed","s":"vealed","e":true,"k":"v","d":[446,483],"c":[]}]]}],["o",{"w":"root","s":"oot","e":true,"k":"o","d":[106],"c":[]}],["i",{"w":"ri","s":"i","e":false,"k":"i","d":[],"c":[["g",{"w":"right","s":"ght","e":true,"k":"g","d":[145],"c":[]}],["p",{"w":"ripemd160","s":"pemd160","e":true,"k":"p","d":[188],"c":[]}]]}],["p",{"w":"rpc","s":"pc","e":true,"k":"p","d":[399,406],"c":[]}]]}],["f",{"w":"f","s":"f","e":false,"k":"f","d":[],"c":[["o",{"w":"fo","s":"o","e":false,"k":"o","d":[],"c":[["r",{"w":"for","s":"r","e":true,"k":"r","d":[3,4,8,12,13,21,23,32,36,45,54,60,63,72,76,78,102,103,108,112,113,114,119,128,130,137,140,142,145,149,154,173,174,176,187,190,191,193,205,206,207,211,212,214,216,218,224,227,233,235,236,245,247,251,254,262,265,268,269,271,272,278,279,280,283,285,286,289,290,292,294,296,298,304,305,306,308,310,311,315,316,317,320,322,325,327,332,335,340,343,347,348,350,351,356,358,362,363,364,366,367,369,370,371,372,377,378,380,391,396,397,398,405,410,415,421,423,427,432,433,435,436,437,438,442,447,449,450,451,454,459,463,464,467,472,473,475,476,477,478,481,484,486,487,488,491,498,499,504,507,509,512,513,515],"c":[["m",{"w":"format","s":"mat","e":true,"k":"m","d":[302,330],"c":[]}],["k",{"w":"forks","s":"ks","e":true,"k":"k","d":[422,502],"c":[]}]]}],["l",{"w":"following","s":"llowing","e":true,"k":"l","d":[11,256,330,381,420,501,505],"c":[]}]]}],["a",{"w":"fa","s":"a","e":false,"k":"a","d":[],"c":[["u",{"w":"faucet","s":"ucet","e":true,"k":"u","d":[3,421,507],"c":[]}],["c",{"w":"facilitate","s":"cilitate","e":true,"k":"c","d":[331,412],"c":[]}],["m",{"w":"familiar","s":"miliar","e":true,"k":"m","d":[399],"c":[]}],["s",{"w":"fast","s":"st","e":true,"k":"s","d":[427,459],"c":[]}]]}],["i",{"w":"fi","s":"i","e":false,"k":"i","d":[],"c":[["r",{"w":"first","s":"rst","e":true,"k":"r","d":[53,65,439,462],"c":[]}],["e",{"w":"field","s":"eld","e":true,"k":"e","d":[184],"c":[["s",{"w":"fields","s":"s","e":true,"k":"s","d":[83],"c":[]}]]}],["l",{"w":"fil","s":"l","e":false,"k":"l","d":[],"c":[["t",{"w":"filter","s":"ter","e":true,"k":"t","d":[177,455,492],"c":[["e",{"w":"filtered","s":"ed","e":true,"k":"e","d":[452,489],"c":[]}]]}],["e",{"w":"file","s":"e","e":true,"k":"e","d":[272,278],"c":[]}]]}],["n",{"w":"find","s":"nd","e":true,"k":"n","d":[183],"c":[]}]]}],["e",{"w":"fe","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"fetch","s":"tch","e":true,"k":"t","d":[54,95,104,127,156,407,408,409],"c":[]}],["e",{"w":"fee","s":"e","e":true,"k":"e","d":[279,335,396,398],"c":[["s",{"w":"fees","s":"s","e":true,"k":"s","d":[306,334],"c":[]}]]}]]}],["u",{"w":"fu","s":"u","e":false,"k":"u","d":[],"c":[["n",{"w":"fun","s":"n","e":false,"k":"n","d":[],"c":[["g",{"w":"fungible","s":"gible","e":true,"k":"g","d":[54,60,62,115,123,125,160,178,190,251,253,321,330,340,410],"c":[]}],["c",{"w":"function","s":"ction","e":true,"k":"c","d":[102,105,108,112,113,114,126,128,130,137,140,145,149,154,161,163,166,174,176,177,187,191,192,193,377,414],"c":[["s",{"w":"functions","s":"s","e":true,"k":"s","d":[78,79,80,81,86,99,129,134,202,330,410],"c":[]}]]}],["d",{"w":"fund","s":"d","e":true,"k":"d","d":[511],"c":[]}]]}],["t",{"w":"future","s":"ture","e":true,"k":"t","d":[229],"c":[]}]]}],["l",{"w":"flags","s":"lags","e":true,"k":"l","d":[76],"c":[]}],["r",{"w":"from","s":"rom","e":true,"k":"r","d":[86,89,94,116,117,143,162,168,172,177,180,194,240,309,346,355,413],"c":[]}]]}],["i",{"w":"i","s":"i","e":false,"k":"i","d":[],"c":[["s",{"w":"is","s":"s","e":true,"k":"s","d":[4,8,13,18,124,136,139,146,147,356,358,363,364,366,380,411],"c":[]}],["t",{"w":"it","s":"t","e":true,"k":"t","d":[4,72,358,362,415],"c":[["s",{"w":"its","s":"s","e":true,"k":"s","d":[141,210,408],"c":[]}]]}],["n",{"w":"in","s":"n","e":true,"k":"n","d":[13,16,31,46,47,48,53,65,76,77,79,80,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,214,215,289,291,292,302,306,314,330,334,335,373,409,415,439,462,514],"c":[["t",{"w":"int","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"inte","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"inter","s":"r","e":false,"k":"r","d":[],"c":[["a",{"w":"interact","s":"act","e":true,"k":"a","d":[5,7,31,49,64,359,361,365,399],"c":[["i",{"w":"interacti","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"interacting","s":"ng","e":true,"k":"n","d":[4,233,358,362,363,367],"c":[]}],["v",{"w":"interactive","s":"ve","e":true,"k":"v","d":[23],"c":[]}],["o",{"w":"interactions","s":"ons","e":true,"k":"o","d":[331,412],"c":[]}]]}]]}],["f",{"w":"interface","s":"face","e":true,"k":"f","d":[399,427,459],"c":[["-",{"w":"interface-like","s":"-like","e":true,"k":"-","d":[119],"c":[]}]]}]]}],["g",{"w":"integ","s":"g","e":false,"k":"g","d":[],"c":[["r",{"w":"integr","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"integrity","s":"ity","e":true,"k":"i","d":[16],"c":[]}],["a",{"w":"integrat","s":"at","e":false,"k":"a","d":[],"c":[["e",{"w":"integrate","s":"e","e":true,"k":"e","d":[24,383],"c":[]}],["i",{"w":"integration","s":"ion","e":true,"k":"i","d":[245],"c":[]}]]}]]}],["e",{"w":"integer","s":"er","e":true,"k":"e","d":[87,106,118,133,138,153,157,158,179,197],"c":[["s",{"w":"integers","s":"s","e":true,"k":"s","d":[88,120],"c":[]}]]}]]}]]}],["o",{"w":"into","s":"o","e":true,"k":"o","d":[141,142,144,167],"c":[]}]]}],["s",{"w":"ins","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"insta","s":"ta","e":false,"k":"t","d":[],"c":[["l",{"w":"install","s":"ll","e":true,"k":"l","d":[29,424,510],"c":[["e",{"w":"installed","s":"ed","e":true,"k":"e","d":[10],"c":[]}],["i",{"w":"installing","s":"ing","e":true,"k":"i","d":[244],"c":[]}]]}],["n",{"w":"instance","s":"nce","e":true,"k":"n","d":[75],"c":[]}]]}],["i",{"w":"inside","s":"ide","e":true,"k":"i","d":[26,416],"c":[]}],["e",{"w":"insert","s":"ert","e":true,"k":"e","d":[167],"c":[]}],["p",{"w":"inspecting","s":"pecting","e":true,"k":"p","d":[326],"c":[]}],["c",{"w":"inscription","s":"cription","e":true,"k":"c","d":[454,456,457,458,491,493,494,495],"c":[["s",{"w":"inscriptions","s":"s","e":true,"k":"s","d":[445,446,453,455,465,482,483,490,492,500],"c":[]}]]}]]}],["f",{"w":"info","s":"fo","e":true,"k":"f","d":[202,281,283],"c":[["r",{"w":"information","s":"rmation","e":true,"k":"r","d":[33,40,56,57,59,61,62,95,98,104,127,156,205,206,207,213,216,217,218,248,249,250,252,253,273,282,288,299,321,331,334,337,351,388,390,391,392,394,400,401,404,412,428,431,434,440,442,448,450,451,453,460,463,464,468,471,474,479,481,485,487,488,490,496,498,499],"c":[]}]]}],["c",{"w":"including","s":"cluding","e":true,"k":"c","d":[56,57,66,248,249,277,320,321,325,401,450,460,487,496],"c":[]}],["d",{"w":"index","s":"dex","e":true,"k":"d","d":[109,180,183,408],"c":[["e",{"w":"indexer","s":"er","e":true,"k":"e","d":[424,502],"c":[]}]]}],["-",{"w":"in-app","s":"-app","e":true,"k":"-","d":[354],"c":[]}]]}],["m",{"w":"im","s":"m","e":false,"k":"m","d":[],"c":[["p",{"w":"imp","s":"p","e":false,"k":"p","d":[],"c":[["o",{"w":"import","s":"ort","e":true,"k":"o","d":[47,117],"c":[["a",{"w":"importan","s":"an","e":false,"k":"a","d":[],"c":[["c",{"w":"importance","s":"ce","e":true,"k":"c","d":[77,80],"c":[]}],["t",{"w":"important","s":"t","e":true,"k":"t","d":[373],"c":[]}]]}]]}],["l",{"w":"impl","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"implement","s":"ement","e":true,"k":"e","d":[152],"c":[["i",{"w":"implementing","s":"ing","e":true,"k":"i","d":[90,202],"c":[]}],["e",{"w":"implemented","s":"ed","e":true,"k":"e","d":[411],"c":[]}]]}],["i",{"w":"implicitly","s":"icitly","e":true,"k":"i","d":[411],"c":[]}]]}]]}],["m",{"w":"immutable","s":"mutable","e":true,"k":"m","d":[92],"c":[]}]]}],["d",{"w":"id","s":"d","e":true,"k":"d","d":[277,293,294,303,315,340,342],"c":[["s",{"w":"ids","s":"s","e":true,"k":"s","d":[66],"c":[]}],["e",{"w":"identifier","s":"entifier","e":true,"k":"e","d":[67,323,324,327,343,405],"c":[["s",{"w":"identifiers","s":"s","e":true,"k":"s","d":[263],"c":[]}]]}]]}],["f",{"w":"if","s":"f","e":true,"k":"f","d":[124,136,139,146,147,376],"c":[]}]]}],["m",{"w":"m","s":"m","e":false,"k":"m","d":[],"c":[["a",{"w":"ma","s":"a","e":false,"k":"a","d":[],"c":[["i",{"w":"main","s":"in","e":true,"k":"i","d":[4,358,362],"c":[["n",{"w":"mainnet","s":"net","e":true,"k":"n","d":[25,51,298,509],"c":[]}]]}],["t",{"w":"matchers","s":"tchers","e":true,"k":"t","d":[6,360],"c":[]}],["k",{"w":"make","s":"ke","e":true,"k":"k","d":[6,58,360],"c":[]}],["n",{"w":"man","s":"n","e":false,"k":"n","d":[],"c":[["a",{"w":"manage","s":"age","e":true,"k":"a","d":[31,66,81,239,307,403],"c":[["r",{"w":"manager","s":"r","e":true,"k":"r","d":[10],"c":[]}],["m",{"w":"management","s":"ment","e":true,"k":"m","d":[263],"c":[]}],["s",{"w":"manages","s":"s","e":true,"k":"s","d":[273,394],"c":[]}]]}],["i",{"w":"manipulation","s":"ipulation","e":true,"k":"i","d":[76],"c":[]}]]}],["s",{"w":"master","s":"ster","e":true,"k":"s","d":[78],"c":[]}],["p",{"w":"map","s":"p","e":true,"k":"p","d":[79,89,97,132,167,172,413],"c":[["s",{"w":"maps","s":"s","e":true,"k":"s","d":[330,410],"c":[]}]]}],["x",{"w":"maximum","s":"ximum","e":true,"k":"x","d":[149],"c":[]}],["r",{"w":"mar","s":"r","e":false,"k":"r","d":[],"c":[["f",{"w":"marf","s":"f","e":true,"k":"f","d":[415],"c":[]}],["k",{"w":"marketplace","s":"ketplace","e":true,"k":"k","d":[513],"c":[]}]]}],["c",{"w":"machine","s":"chine","e":true,"k":"c","d":[424],"c":[]}]]}],["e",{"w":"me","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"met","s":"t","e":false,"k":"t","d":[],"c":[["h",{"w":"methods","s":"hods","e":true,"k":"h","d":[4,7,358,361,362],"c":[]}],["a",{"w":"metadata","s":"adata","e":true,"k":"a","d":[15,55,56,57,58,60,63,66,248,249,251,254,407],"c":[]}],["r",{"w":"metrics","s":"rics","e":true,"k":"r","d":[211,212],"c":[]}]]}],["s",{"w":"message","s":"ssage","e":true,"k":"s","d":[162,169,354],"c":[["s",{"w":"messages","s":"s","e":true,"k":"s","d":[350],"c":[]}]]}],["m",{"w":"mem","s":"m","e":false,"k":"m","d":[],"c":[["o",{"w":"memo","s":"o","e":true,"k":"o","d":[184],"c":[["s",{"w":"memos","s":"s","e":true,"k":"s","d":[328],"c":[]}]]}],["p",{"w":"mempool","s":"pool","e":true,"k":"p","d":[306,309,313,326,334,335],"c":[]}],["b",{"w":"members","s":"bers","e":true,"k":"b","d":[316,317],"c":[]}]]}],["r",{"w":"merge","s":"rge","e":true,"k":"r","d":[189],"c":[]}]]}],["o",{"w":"mo","s":"o","e":false,"k":"o","d":[],"c":[["r",{"w":"more","s":"re","e":true,"k":"r","d":[33],"c":[]}],["n",{"w":"monitor","s":"nitor","e":true,"k":"n","d":[51,208],"c":[]}],["s",{"w":"most","s":"st","e":true,"k":"s","d":[207,218],"c":[]}]]}],["u",{"w":"mu","s":"u","e":false,"k":"u","d":[],"c":[["l",{"w":"multipl","s":"ltipl","e":false,"k":"l","d":[],"c":[["e",{"w":"multiple","s":"e","e":true,"k":"e","d":[58,163,333],"c":[]}],["i",{"w":"multiplication","s":"ication","e":true,"k":"i","d":[102],"c":[]}]]}],["t",{"w":"mutable","s":"table","e":true,"k":"t","d":[100],"c":[]}]]}],["i",{"w":"mi","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"min","s":"n","e":false,"k":"n","d":[],"c":[["u",{"w":"minutes","s":"utes","e":true,"k":"u","d":[65,439,462],"c":[]}],["t",{"w":"mint","s":"t","e":true,"k":"t","d":[178,186,385],"c":[["s",{"w":"mints","s":"s","e":true,"k":"s","d":[343],"c":[]}]]}],["e",{"w":"mined","s":"ed","e":true,"k":"e","d":[261,267,312],"c":[]}]]}],["g",{"w":"migrate","s":"grate","e":true,"k":"g","d":[246,355],"c":[]}],["c",{"w":"micro-stx","s":"cro-stx","e":true,"k":"c","d":[335],"c":[]}]]}]]}],["p",{"w":"p","s":"p","e":false,"k":"p","d":[],"c":[["o",{"w":"po","s":"o","e":false,"k":"o","d":[],"c":[["i",{"w":"point","s":"int","e":true,"k":"i","d":[4,358,362],"c":[]}],["w",{"w":"power","s":"wer","e":true,"k":"w","d":[185],"c":[]}],["x",{"w":"pox","s":"x","e":true,"k":"x","d":[214,215,287,288,289,290,291,292,390,392],"c":[]}],["s",{"w":"post-conditions","s":"st-conditions","e":true,"k":"s","d":[231],"c":[]}],["o",{"w":"pool","s":"ol","e":true,"k":"o","d":[316,317,516],"c":[]}]]}],["r",{"w":"pr","s":"r","e":false,"k":"r","d":[],"c":[["o",{"w":"pro","s":"o","e":false,"k":"o","d":[],"c":[["v",{"w":"prov","s":"v","e":false,"k":"v","d":[],"c":[["i",{"w":"provide","s":"ide","e":true,"k":"i","d":[103,280,331,397,412],"c":[["s",{"w":"provides","s":"s","e":true,"k":"s","d":[4,5,7,21,282,358,359,361,362,427,459],"c":[]}],["r",{"w":"providers","s":"rs","e":true,"k":"r","d":[351],"c":[]}]]}],["e",{"w":"prove","s":"e","e":true,"k":"e","d":[354],"c":[]}]]}],["p",{"w":"prop","s":"p","e":false,"k":"p","d":[],"c":[["e",{"w":"properties","s":"erties","e":true,"k":"e","d":[4,5,358,359,362],"c":[]}],["o",{"w":"propos","s":"os","e":false,"k":"o","d":[],"c":[["a",{"w":"proposal","s":"al","e":true,"k":"a","d":[388],"c":[["s",{"w":"proposals","s":"s","e":true,"k":"s","d":[217,218],"c":[]}]]}],["e",{"w":"proposed","s":"ed","e":true,"k":"e","d":[389],"c":[]}]]}]]}],["j",{"w":"project","s":"ject","e":true,"k":"j","d":[20,29,47,65,439,462],"c":[["s",{"w":"projects","s":"s","e":true,"k":"s","d":[48,246,364,511],"c":[]}]]}],["g",{"w":"program","s":"gram","e":true,"k":"g","d":[69],"c":[["m",{"w":"programmatic","s":"matic","e":true,"k":"m","d":[31],"c":[]}]]}],["x",{"w":"proxy","s":"xy","e":true,"k":"x","d":[32,36],"c":[]}],["m",{"w":"prom","s":"m","e":false,"k":"m","d":[],"c":[["e",{"w":"prometheus","s":"etheus","e":true,"k":"e","d":[211,212],"c":[]}],["p",{"w":"prompt","s":"pt","e":true,"k":"p","d":[353,354],"c":[]}]]}],["o",{"w":"proof","s":"of","e":true,"k":"o","d":[346,415],"c":[["-",{"w":"proof-of-transfer","s":"-of-transfer","e":true,"k":"-","d":[284,285,390,392],"c":[]}]]}]]}],["e",{"w":"pre","s":"e","e":false,"k":"e","d":[],"c":[["f",{"w":"preferred","s":"ferred","e":true,"k":"f","d":[10],"c":[]}],["d",{"w":"predicate","s":"dicate","e":true,"k":"d","d":[177],"c":[["s",{"w":"predicates","s":"s","e":true,"k":"s","d":[374,376,379],"c":[]}]]}]]}],["a",{"w":"practices","s":"actices","e":true,"k":"a","d":[12],"c":[]}],["i",{"w":"pri","s":"i","e":false,"k":"i","d":[],"c":[["v",{"w":"private","s":"vate","e":true,"k":"v","d":[50,129],"c":[]}],["n",{"w":"prin","s":"n","e":false,"k":"n","d":[],"c":[["c",{"w":"principal","s":"cipal","e":true,"k":"c","d":[81,90,94,141,147,190,192,198,200,294,316,317,328,342],"c":[["s",{"w":"principals","s":"s","e":true,"k":"s","d":[123,150],"c":[]}],["'",{"w":"principal's","s":"'s","e":true,"k":"'","d":[143],"c":[]}]]}],["t",{"w":"printing","s":"ting","e":true,"k":"t","d":[199],"c":[]}]]}],["o",{"w":"priorities","s":"orities","e":true,"k":"o","d":[334,335],"c":[]}],["c",{"w":"price","s":"ce","e":true,"k":"c","d":[393,395],"c":[]}]]}]]}],["a",{"w":"pa","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"package","s":"ckage","e":true,"k":"c","d":[10,233,367],"c":[["s",{"w":"packages","s":"s","e":true,"k":"s","d":[244],"c":[]}]]}],["r",{"w":"part","s":"rt","e":false,"k":"r","d":[],"c":[["i",{"w":"particular","s":"icular","e":true,"k":"i","d":[16,447,484],"c":[]}],["y",{"w":"party","s":"y","e":true,"k":"y","d":[511],"c":[]}]]}],["g",{"w":"paginate","s":"ginate","e":true,"k":"g","d":[255],"c":[["d",{"w":"paginated","s":"d","e":true,"k":"d","d":[430,433,435,437,441,470,473,475,477,480],"c":[]}]]}]]}],["e",{"w":"pe","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"per","s":"r","e":true,"k":"r","d":[445,446,482,483],"c":[["t",{"w":"pertaining","s":"taining","e":true,"k":"t","d":[22],"c":[]}],["m",{"w":"permissions","s":"missions","e":true,"k":"m","d":[81],"c":[]}],["f",{"w":"perform","s":"form","e":true,"k":"f","d":[93],"c":[]}]]}],["n",{"w":"pending","s":"nding","e":true,"k":"n","d":[313],"c":[]}]]}],["u",{"w":"pu","s":"u","e":false,"k":"u","d":[],"c":[["b",{"w":"publi","s":"bli","e":false,"k":"b","d":[],"c":[["s",{"w":"publish","s":"sh","e":true,"k":"s","d":[25],"c":[["e",{"w":"published","s":"ed","e":true,"k":"e","d":[415],"c":[]}]]}],["c",{"w":"public","s":"c","e":true,"k":"c","d":[86,94,99,134,162,169,414],"c":[]}]]}],["r",{"w":"purchase","s":"rchase","e":true,"k":"r","d":[513],"c":[]}]]}],["l",{"w":"pla","s":"la","e":false,"k":"l","d":[],"c":[["n",{"w":"plans","s":"ns","e":true,"k":"n","d":[27],"c":[]}],["t",{"w":"platform","s":"tform","e":true,"k":"t","d":[33,37,38,39,40,41,42,43,45,46,47,48,52,53],"c":[]}],["i",{"w":"plain","s":"in","e":true,"k":"i","d":[297,300],"c":[]}]]}]]}],["j",{"w":"j","s":"j","e":false,"k":"j","d":[],"c":[["s",{"w":"js","s":"s","e":true,"k":"s","d":[4,5,6,7,8,9,10,12,223,224,229,230,232,233,237,239,243,244,245,358,359,360,361,362,364,367],"c":[["o",{"w":"json","s":"on","e":true,"k":"o","d":[330],"c":[]}]]}],["a",{"w":"javascript","s":"avascript","e":true,"k":"a","d":[8,64,228,350,356,365,366],"c":[]}]]}],["n",{"w":"n","s":"n","e":false,"k":"n","d":[],"c":[["e",{"w":"ne","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"network","s":"twork","e":true,"k":"t","d":[4,32,34,35,36,71,208,227,230,235,242,296,299,358,362,363,369,400,402],"c":[["s",{"w":"networks","s":"s","e":true,"k":"s","d":[25,241],"c":[]}]]}],["e",{"w":"need","s":"ed","e":true,"k":"e","d":[18,247,467,512],"c":[]}],["w",{"w":"new","s":"w","e":true,"k":"w","d":[20,29,122,160,178,364],"c":[]}],["g",{"w":"negation","s":"gation","e":true,"k":"g","d":[155],"c":[]}]]}],["o",{"w":"no","s":"o","e":false,"k":"o","d":[],"c":[["d",{"w":"node","s":"de","e":true,"k":"d","d":[17,32,33,270,276,374,399,509,515],"c":[["s",{"w":"nodes","s":"s","e":true,"k":"s","d":[227,235,369,380],"c":[]}]]}],["n",{"w":"non","s":"n","e":false,"k":"n","d":[],"c":[["-",{"w":"non-fungible","s":"-fungible","e":true,"k":"-","d":[54,63,101,122,135,186,195,254,321,330,341,342,343,344,410],"c":[]}],["e",{"w":"none","s":"e","e":true,"k":"e","d":[139],"c":[]}],["c",{"w":"nonce","s":"ce","e":true,"k":"c","d":[326],"c":[["s",{"w":"nonces","s":"s","e":true,"k":"s","d":[258],"c":[]}]]}]]}],["t",{"w":"not","s":"t","e":true,"k":"t","d":[411],"c":[]}],["-",{"w":"no-loss","s":"-loss","e":true,"k":"-","d":[516],"c":[]}]]}],["a",{"w":"na","s":"a","e":false,"k":"a","d":[],"c":[["m",{"w":"name","s":"me","e":true,"k":"m","d":[271,272,277,278,395],"c":[["d",{"w":"named","s":"d","e":true,"k":"d","d":[83],"c":[]}],["s",{"w":"names","s":"s","e":true,"k":"s","d":[270,273,274,275,394],"c":[["p",{"w":"namespace","s":"pace","e":true,"k":"p","d":[275,393],"c":[["s",{"w":"namespaces","s":"s","e":true,"k":"s","d":[273,276,394],"c":[]}]]}]]}]]}],["k",{"w":"nakamoto","s":"kamoto","e":true,"k":"k","d":[219,220,221,222,223,407,408,409],"c":[]}],["t",{"w":"native","s":"tive","e":true,"k":"t","d":[232],"c":[]}]]}],["f",{"w":"nft","s":"ft","e":true,"k":"f","d":[101,135,186,195,323,385,513],"c":[["s",{"w":"nfts","s":"s","e":true,"k":"s","d":[513],"c":[]}]]}],["u",{"w":"number","s":"umber","e":true,"k":"u","d":[106,107,185,445,446,482,483],"c":[]}]]}],["b",{"w":"b","s":"b","e":false,"k":"b","d":[],"c":[["e",{"w":"be","s":"e","e":true,"k":"e","d":[5,6,7,10,359,360,361,424],"c":[["s",{"w":"best","s":"st","e":true,"k":"s","d":[12],"c":[]}],["h",{"w":"beh","s":"h","e":false,"k":"h","d":[],"c":[["i",{"w":"behind","s":"ind","e":true,"k":"i","d":[19],"c":[]}],["a",{"w":"behavior","s":"avior","e":true,"k":"a","d":[119,208],"c":[]}]]}],["t",{"w":"between","s":"tween","e":true,"k":"t","d":[123,150],"c":[]}],["g",{"w":"begin","s":"gin","e":true,"k":"g","d":[163],"c":[]}],["y",{"w":"beyond","s":"yond","e":true,"k":"y","d":[247,467,512],"c":[]}],["e",{"w":"been","s":"en","e":true,"k":"e","d":[309,313,329],"c":[]}],["l",{"w":"below","s":"low","e":true,"k":"l","d":[424],"c":[]}]]}],["u",{"w":"bu","s":"u","e":false,"k":"u","d":[],"c":[["i",{"w":"buil","s":"il","e":false,"k":"i","d":[],"c":[["d",{"w":"build","s":"d","e":true,"k":"d","d":[11,68,69,70,71,203,204,225,228,256,349,381,384,386,420,422,424,501,502,505],"c":[["i",{"w":"building","s":"ing","e":true,"k":"i","d":[28,45,356,366,379,515],"c":[]}]]}],["t",{"w":"built-in","s":"t-in","e":true,"k":"t","d":[78],"c":[]}]]}],["f",{"w":"buffer","s":"ffer","e":true,"k":"f","d":[87,91,133,142,144,158,179],"c":[]}],["r",{"w":"burn","s":"rn","e":true,"k":"r","d":[115,135,143,264,336,338,417,418],"c":[["c",{"w":"burnchain","s":"chain","e":true,"k":"c","d":[95,265,268,281,283,286],"c":[]}],["e",{"w":"burned","s":"ed","e":true,"k":"e","d":[337],"c":[]}],["_",{"w":"burn_height","s":"_height","e":true,"k":"_","d":[417,418],"c":[]}]]}]]}],["l",{"w":"block","s":"lock","e":true,"k":"l","d":[161,202,206,216,217,218,260,262,263,264,265,266,268,269,281,283,296,298,314,336,388,389,408,415,437,445,446,452,457,477,482,483,489,494],"c":[["c",{"w":"blockchain","s":"chain","e":true,"k":"c","d":[14,33,36,50,59,64,74,213,222,226,227,230,234,235,250,257,259,273,301,307,349,353,365,368,369,373,378,394,403,423,504],"c":[["s",{"w":"blockchains","s":"s","e":true,"k":"s","d":[376],"c":[]}]]}],["s",{"w":"blocks","s":"s","e":true,"k":"s","d":[95,104,156,205,207,261,264,267,293,337,338,374,379,409],"c":[]}]]}],["i",{"w":"bi","s":"i","e":false,"k":"i","d":[],"c":[["t",{"w":"bit","s":"t","e":true,"k":"t","d":[76],"c":[["c",{"w":"bitcoin","s":"coin","e":true,"k":"c","d":[32,33,45,281,283,284,285,286,371,373,376,380,422,423,424,425,427,436,443,449,457,459,476,486,494,502,504,515],"c":[]}],["w",{"w":"bitwise","s":"wise","e":true,"k":"w","d":[93,113,128,130,145,174,187],"c":[]}],["-",{"w":"bit-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"bit-and","s":"and","e":true,"k":"a","d":[113],"c":[]}],["x",{"w":"bit-xor","s":"xor","e":true,"k":"x","d":[128],"c":[]}],["o",{"w":"bit-or","s":"or","e":true,"k":"o","d":[130],"c":[]}],["s",{"w":"bit-shift-","s":"shift-","e":false,"k":"s","d":[],"c":[["r",{"w":"bit-shift-right","s":"right","e":true,"k":"r","d":[145],"c":[]}],["l",{"w":"bit-shift-left","s":"left","e":true,"k":"l","d":[174],"c":[]}]]}],["n",{"w":"bit-not","s":"not","e":true,"k":"n","d":[187],"c":[]}]]}]]}],["g",{"w":"big-endian","s":"g-endian","e":true,"k":"g","d":[87,133],"c":[]}],["n",{"w":"bind","s":"nd","e":true,"k":"n","d":[171],"c":[]}]]}],["r",{"w":"br","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"brief","s":"ief","e":true,"k":"i","d":[77,80],"c":[]}],["a",{"w":"branches","s":"anches","e":true,"k":"a","d":[170],"c":[]}],["o",{"w":"broadcast","s":"oadcast","e":true,"k":"o","d":[230,237,242,307,313,353,399,403],"c":[["s",{"w":"broadcasts","s":"s","e":true,"k":"s","d":[402],"c":[]}]]}],["c",{"w":"brc-20","s":"c-20","e":true,"k":"c","d":[420,425,443,447,448,449,450,451,452,459,484,485,486,487,488,489],"c":[]}]]}],["y",{"w":"by","s":"y","e":true,"k":"y","d":[264,274,293,294,303,326,329,335,342,408,452,489],"c":[["t",{"w":"byte","s":"te","e":true,"k":"t","d":[87,133,158,179],"c":[]}]]}],["a",{"w":"ba","s":"a","e":false,"k":"a","d":[],"c":[["s",{"w":"base","s":"se","e":false,"k":"s","d":[],"c":[["-",{"w":"base-2","s":"-2","e":true,"k":"-","d":[107],"c":[]}],["d",{"w":"based","s":"d","e":true,"k":"d","d":[177,330,373],"c":[]}]]}],["l",{"w":"balance","s":"lance","e":true,"k":"l","d":[190,198,321,327,432,472],"c":[["s",{"w":"balances","s":"s","e":true,"k":"s","d":[430,431,447,449,470,471,484,486],"c":[]}]]}]]}]]}],["o",{"w":"o","s":"o","e":false,"k":"o","d":[],"c":[["f",{"w":"of","s":"f","e":true,"k":"f","d":[6,13,16,37,43,55,67,73,75,77,80,84,90,91,101,105,106,107,110,111,125,131,175,181,183,185,190,195,197,198,210,215,228,229,259,261,262,263,264,265,267,268,269,270,271,274,275,276,277,281,283,284,285,287,291,292,301,311,316,317,323,324,328,329,330,333,338,340,342,343,344,355,360,379,393,395,406,409,410,415,416,417,418,429,430,433,435,437,441,445,446,447,455,456,457,461,469,470,473,475,477,480,482,483,484,492,493,494,497],"c":[["f",{"w":"offers","s":"fers","e":true,"k":"f","d":[18],"c":[]}]]}],["n",{"w":"on","s":"n","e":true,"k":"n","d":[6,11,18,32,36,54,59,74,177,203,204,208,213,225,226,228,234,250,256,258,273,282,288,307,330,349,360,368,373,375,381,394,402,403,414,424,425,443,445,446,482,483,501,505],"c":[["c",{"w":"once","s":"ce","e":true,"k":"c","d":[29],"c":[]}],["g",{"w":"ongoing","s":"going","e":true,"k":"g","d":[407],"c":[]}]]}],["r",{"w":"or","s":"r","e":true,"k":"r","d":[25,47,67,93,128,130,170,176,191,293,303,323,324,327,342,354,405,411,452,489,509],"c":[["d",{"w":"ord","s":"d","e":false,"k":"d","d":[],"c":[["e",{"w":"order","s":"er","e":true,"k":"e","d":[31,373],"c":[]}],["i",{"w":"ordinal","s":"inal","e":true,"k":"i","d":[463,464,498,499],"c":[["s",{"w":"ordinals","s":"s","e":true,"k":"s","d":[420,425,443,453,459,460,461,490,496,497,502,504],"c":[]}]]}]]}]]}],["v",{"w":"over","s":"ver","e":true,"k":"v","d":[58],"c":[["v",{"w":"overview","s":"view","e":true,"k":"v","d":[77,80],"c":[]}]]}],["w",{"w":"own","s":"wn","e":true,"k":"w","d":[72],"c":[["e",{"w":"owne","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"owner","s":"r","e":true,"k":"r","d":[195],"c":[["s",{"w":"ownership","s":"ship","e":true,"k":"s","d":[101],"c":[]}]]}],["d",{"w":"owned","s":"d","e":true,"k":"d","d":[274,342],"c":[]}]]}]]}],["p",{"w":"op","s":"p","e":false,"k":"p","d":[],"c":[["e",{"w":"operation","s":"eration","e":true,"k":"e","d":[93,452,489],"c":[["s",{"w":"operations","s":"s","e":true,"k":"s","d":[77,102,108,112,113,128,130,137,140,145,174,187,417,418],"c":[]}]]}],["t",{"w":"opti","s":"ti","e":false,"k":"t","d":[],"c":[["m",{"w":"optimizing","s":"mizing","e":true,"k":"m","d":[79],"c":[]}],["o",{"w":"option","s":"on","e":false,"k":"o","d":[],"c":[["a",{"w":"optional","s":"al","e":true,"k":"a","d":[85,103,138,139,146,151,157,168,201],"c":[]}],["s",{"w":"options","s":"s","e":true,"k":"s","d":[455,492],"c":[]}]]}]]}],["_",{"w":"op_type","s":"_type","e":true,"k":"_","d":[417,418],"c":[]}]]}],["t",{"w":"other","s":"ther","e":true,"k":"t","d":[86,117],"c":[]}],["k",{"w":"ok","s":"k","e":true,"k":"k","d":[136],"c":[]}],["b",{"w":"ob","s":"b","e":false,"k":"b","d":[],"c":[["t",{"w":"obtain","s":"tain","e":true,"k":"t","d":[339,341],"c":[]}],["s",{"w":"observe","s":"serve","e":true,"k":"s","d":[377],"c":[]}]]}],["c",{"w":"ocurred","s":"curred","e":true,"k":"c","d":[457,494],"c":[]}]]}],["v",{"w":"v","s":"v","e":false,"k":"v","d":[],"c":[["i",{"w":"vi","s":"i","e":false,"k":"i","d":[],"c":[["t",{"w":"vitest","s":"test","e":true,"k":"t","d":[6,12,224,245,360],"c":[]}],["a",{"w":"via","s":"a","e":true,"k":"a","d":[357,399,427,459],"c":[]}]]}],["a",{"w":"va","s":"a","e":false,"k":"a","d":[],"c":[["l",{"w":"val","s":"l","e":false,"k":"l","d":[],"c":[["u",{"w":"value","s":"ue","e":true,"k":"u","d":[84,96,103,111,116,131,139,142,144,146,147,168,175,181,416],"c":[["s",{"w":"values","s":"s","e":true,"k":"s","d":[6,83,173,201,326,360,514],"c":[]}]]}],["i",{"w":"valid","s":"id","e":false,"k":"i","d":[],"c":[["a",{"w":"validate","s":"ate","e":true,"k":"a","d":[50,389],"c":[]}],["l",{"w":"validly","s":"ly","e":true,"k":"l","d":[284,285],"c":[]}]]}]]}],["r",{"w":"vari","s":"ri","e":false,"k":"r","d":[],"c":[["a",{"w":"variable","s":"able","e":true,"k":"a","d":[131,175],"c":[["s",{"w":"variables","s":"s","e":true,"k":"s","d":[100,171,330,410],"c":[]}]]}],["o",{"w":"various","s":"ous","e":true,"k":"o","d":[263],"c":[]}]]}]]}],["e",{"w":"ver","s":"er","e":false,"k":"e","d":[],"c":[["i",{"w":"verify","s":"ify","e":true,"k":"i","d":[16,74,169,425,443],"c":[]}],["s",{"w":"version","s":"sion","e":true,"k":"s","d":[56,57,248,249,401,406,460,496],"c":[]}]]}],["o",{"w":"voting","s":"oting","e":true,"k":"o","d":[69,377],"c":[]}],["7",{"w":"v7","s":"7","e":true,"k":"7","d":[355],"c":[]}],["8",{"w":"v8","s":"8","e":true,"k":"8","d":[355],"c":[]}]]}],["y",{"w":"y","s":"y","e":false,"k":"y","d":[],"c":[["o",{"w":"you","s":"ou","e":true,"k":"o","d":[18,29,49,51,373,380,422,427,459,502],"c":[["r",{"w":"your","s":"r","e":true,"k":"r","d":[10,12,20,22,24,25,26,37,48,50,51,53,65,72,73,203,204,224,225,231,245,246,347,348,349,352,373,374,376,380,384,386,424,439,462,514],"c":[]}]]}],["i",{"w":"yield","s":"ield","e":true,"k":"i","d":[516],"c":[]}]]}],["2",{"w":"2","s":"2","e":true,"k":"2","d":[65,439,462],"c":[["5",{"w":"256","s":"56","e":true,"k":"5","d":[111],"c":[]}]]}],["k",{"w":"k","s":"k","e":false,"k":"k","d":[],"c":[["e",{"w":"ke","s":"e","e":false,"k":"e","d":[],"c":[["c",{"w":"keccak-256","s":"ccak-256","e":true,"k":"c","d":[91],"c":[]}],["y",{"w":"key","s":"y","e":true,"k":"y","d":[94,162,169],"c":[]}]]}],["n",{"w":"known","s":"nown","e":true,"k":"n","d":[270,276],"c":[]}]]}],["q",{"w":"query","s":"query","e":true,"k":"q","d":[98,198,399],"c":[]}],["x",{"w":"x","s":"x","e":true,"k":"x","d":[188,355],"c":[]}],["z",{"w":"zone","s":"zone","e":true,"k":"z","d":[272,278],"c":[]}],["1",{"w":"1","s":"1","e":true,"k":"1","d":[302],"c":[]}],["0",{"w":"0","s":"0","e":true,"k":"0","d":[302],"c":[]}],["-",{"w":"-","s":"-","e":true,"k":"-","d":[330],"c":[]}],["3",{"w":"3","s":"3","e":true,"k":"3","d":[406],"c":[]}]]},"isArray":false},"content":{"type":"Radix","node":{"w":"","s":"","e":false,"k":"","d":[],"c":[["i",{"w":"i","s":"i","e":true,"k":"i","d":[49,75,147,226,234,368],"c":[["m",{"w":"im","s":"m","e":false,"k":"m","d":[],"c":[["p",{"w":"imp","s":"p","e":false,"k":"p","d":[],"c":[["o",{"w":"import","s":"ort","e":true,"k":"o","d":[1,2,3,4,5,6,7,8,9,11,12,13,14,15,18,20,21,22,23,26,27,29,30,31,44,45,46,47,49,51,53,54,55,58,64,65,67,68,69,71,73,74,78,117,119,203,204,208,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,256,257,259,345,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,365,366,367,368,369,370,371,372,373,375,377,378,381,382,383,384,385,386,387,399,419,420,421,422,423,425,443,459,466,467,501,502,504,505,506,507,508,509,510,511,512,513,514,515,516,517],"c":[["i",{"w":"importing","s":"ing","e":true,"k":"i","d":[9,47,117],"c":[]}],["e",{"w":"imported","s":"ed","e":true,"k":"e","d":[47,117],"c":[]}],["a",{"w":"important","s":"ant","e":true,"k":"a","d":[48,49,68,76,77,81,100,104,110,114,154,176,191,201,222,224,226,228,234,368,377,515],"c":[]}],["s",{"w":"imports","s":"s","e":true,"k":"s","d":[117,224,232],"c":[]}]]}],["l",{"w":"impl","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"impleme","s":"eme","e":false,"k":"e","d":[],"c":[["n",{"w":"implement","s":"nt","e":true,"k":"n","d":[28,68,69,71,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,351,356,366,516],"c":[["e",{"w":"implemented","s":"ed","e":true,"k":"e","d":[51,69,152],"c":[["_",{"w":"implemented_traits","s":"_traits","e":true,"k":"_","d":[7,361],"c":[]}]]}],["i",{"w":"implementing","s":"ing","e":true,"k":"i","d":[69,77,80,81,83,84,85,86,87,89,90,91,93,94,95,96,97,98,99,100,101,102,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,121,122,123,124,125,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,165,166,167,168,169,170,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,202],"c":[]}],["a",{"w":"implementation","s":"ation","e":true,"k":"a","d":[71,73,76,78,93,115,122,128,130,152,160,178,187,233,355,367,511,513],"c":[["s",{"w":"implementations","s":"s","e":true,"k":"s","d":[119,152,356,366],"c":[]}]]}],["s",{"w":"implements","s":"s","e":true,"k":"s","d":[117,119,170,171,259],"c":[]}],["_",{"w":"implement_trait","s":"_trait","e":true,"k":"_","d":[372],"c":[]}]]}],["m",{"w":"implemement","s":"ment","e":true,"k":"m","d":[71],"c":[]}]]}],["-",{"w":"impl-trait","s":"-trait","e":true,"k":"-","d":[27,69,117,119,152],"c":[]}],["i",{"w":"implications","s":"ications","e":true,"k":"i","d":[86,89,91,96,100,103,105,116,132,155,165,170,183,185,189,197],"c":[]}]]}],["r",{"w":"improv","s":"rov","e":false,"k":"r","d":[],"c":[["e",{"w":"improve","s":"e","e":true,"k":"e","d":[70,92,96,113,129,163,171,177,379],"c":[["m",{"w":"improvement","s":"ment","e":true,"k":"m","d":[27],"c":[["s",{"w":"improvements","s":"s","e":true,"k":"s","d":[70,73,229,355],"c":[]}]]}]]}],["i",{"w":"improving","s":"ing","e":true,"k":"i","d":[92,103,129,171,193,201,219,222],"c":[]}]]}],["a",{"w":"impact","s":"act","e":true,"k":"a","d":[100,116,126,161,183],"c":[["s",{"w":"impacts","s":"s","e":true,"k":"s","d":[219,229],"c":[]}]]}]]}],["a",{"w":"image","s":"age","e":false,"k":"a","d":[],"c":[["z",{"w":"imagezoom","s":"zoom","e":true,"k":"z","d":[44,259,466,508],"c":[]}],["-",{"w":"image-zoom'","s":"-zoom'","e":true,"k":"-","d":[44,259,466,508],"c":[]}],["s",{"w":"images","s":"s","e":true,"k":"s","d":[45,46,47,48,49,50,51,52,53,55,219,220,259,502],"c":[]}]]}],["m",{"w":"imm","s":"m","e":false,"k":"m","d":[],"c":[["e",{"w":"immediate","s":"ediate","e":true,"k":"e","d":[50,81],"c":[]}],["u",{"w":"immutable","s":"utable","e":true,"k":"u","d":[92,100],"c":[]}]]}],["b",{"w":"imbalances","s":"balances","e":true,"k":"b","d":[178],"c":[]}],["g",{"w":"img","s":"g","e":true,"k":"g","d":[229],"c":[]}]]}],["n",{"w":"in","s":"n","e":true,"k":"n","d":[2,5,7,8,9,12,13,14,15,16,17,18,19,20,21,22,26,27,28,29,30,31,45,47,48,49,50,51,52,53,55,58,67,68,69,70,71,72,73,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,208,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,237,238,239,241,243,245,246,257,258,259,345,346,347,348,349,350,351,352,353,354,355,356,357,359,361,366,367,368,369,371,372,373,374,375,376,377,378,379,422,423,427,459,502,504,509,510,511,513,514,515,516,517],"c":[["i",{"w":"init","s":"it","e":true,"k":"i","d":[227,236,370],"c":[["s",{"w":"initsimnet","s":"simnet","e":true,"k":"s","d":[4,358,362],"c":[]}],["i",{"w":"initia","s":"ia","e":false,"k":"i","d":[],"c":[["l",{"w":"initial","s":"l","e":true,"k":"l","d":[8,12,19,29,68,69,71,96,100,233,245,348,367,509,516],"c":[["i",{"w":"initiali","s":"i","e":false,"k":"i","d":[],"c":[["z",{"w":"initializ","s":"z","e":false,"k":"z","d":[],"c":[["e",{"w":"initialize","s":"e","e":true,"k":"e","d":[9,69,100,102],"c":[["s",{"w":"initializes","s":"s","e":true,"k":"s","d":[4,358,362],"c":[]}],["d",{"w":"initialized","s":"d","e":true,"k":"d","d":[12,69,71,90,149,224,245,246,348],"c":[]}],["r",{"w":"initializer","s":"r","e":true,"k":"r","d":[231],"c":[]}]]}],["a",{"w":"initialization","s":"ation","e":true,"k":"a","d":[67],"c":[]}],["i",{"w":"initializing","s":"ing","e":true,"k":"i","d":[69],"c":[]}]]}],["s",{"w":"initialise","s":"se","e":true,"k":"s","d":[246],"c":[]}]]}],["l",{"w":"initially","s":"ly","e":true,"k":"l","d":[50,69,125],"c":[]}],["-",{"w":"initial-value","s":"-value","e":true,"k":"-","d":[96],"c":[]}]]}],["t",{"w":"initiat","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"initiati","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"initiating","s":"ng","e":true,"k":"n","d":[71,140,231],"c":[]}],["o",{"w":"initiation","s":"on","e":true,"k":"o","d":[377],"c":[]}]]}],["e",{"w":"initiate","s":"e","e":true,"k":"e","d":[140,352,353,354,356,357,366,374,376],"c":[["d",{"w":"initiated","s":"d","e":true,"k":"d","d":[147],"c":[]}],["-",{"w":"initiate-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"initiate-chainhook-as-a-service","s":"chainhook-as-a-service","e":true,"k":"c","d":[374],"c":[]}],["a",{"w":"initiate-a-chainhook-service-to-watch-for-matching-transactions","s":"a-chainhook-service-to-watch-for-matching-transactions","e":true,"k":"a","d":[376],"c":[]}]]}],["s",{"w":"initiates","s":"s","e":true,"k":"s","d":[375],"c":[]}]]}]]}]]}],["o",{"w":"initoverrides","s":"overrides","e":true,"k":"o","d":[67],"c":[]}]]}],["s",{"w":"ins","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"inst","s":"t","e":false,"k":"t","d":[],"c":[["a",{"w":"insta","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"instan","s":"n","e":false,"k":"n","d":[],"c":[["c",{"w":"instance","s":"ce","e":true,"k":"c","d":[4,13,27,45,50,54,68,74,226,227,231,259,358,362,376,425,443],"c":[["s",{"w":"instances","s":"s","e":true,"k":"s","d":[229,376],"c":[]}],["d",{"w":"instancedatastore","s":"datastore","e":true,"k":"d","d":[355],"c":[]}]]}],["t",{"w":"instantiation","s":"tiation","e":true,"k":"t","d":[229],"c":[]}]]}],["l",{"w":"install","s":"ll","e":true,"k":"l","d":[9,11,12,18,75,219,223,224,229,230,232,235,243,245,256,348,352,353,354,355,357,369,374,375,376,380,381,423,424,501,504,505,510,517],"c":[["e",{"w":"installed","s":"ed","e":true,"k":"e","d":[8,10,46,58,71,226,227,228,244,377,379,423],"c":[]}],["a",{"w":"installation","s":"ation","e":true,"k":"a","d":[11,18,71,75,226,227,228,230,233,234,235,236,256,350,353,354,356,366,367,368,369,370,373,375,376,377,379,381,423,501,502,505,510],"c":[["-",{"w":"installation-guides","s":"-guides","e":true,"k":"-","d":[11,256,381,501,505],"c":[]}]]}],["i",{"w":"installing","s":"ing","e":true,"k":"i","d":[24,75,352,426,444],"c":[["-",{"w":"installing-docker","s":"-docker","e":true,"k":"-","d":[11,256,381,501,505],"c":[]}]]}],["-",{"w":"install-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"install-docker","s":"docker","e":true,"k":"d","d":[24],"c":[]}],["e",{"w":"install-extension","s":"extension","e":true,"k":"e","d":[71],"c":[]}],["n",{"w":"install-necessary-dependencies","s":"necessary-dependencies","e":true,"k":"n","d":[232],"c":[]}],["t",{"w":"install-the-stacksconnect-package","s":"the-stacksconnect-package","e":true,"k":"t","d":[352],"c":[]}]]}]]}]]}],["e",{"w":"instead","s":"ead","e":true,"k":"e","d":[7,27,71,90,92,96,100,104,112,133,149,156,158,161,174,176,180,191,193,226,233,234,235,239,351,355,361,367,368,369,371,374,376],"c":[]}],["r",{"w":"instru","s":"ru","e":false,"k":"r","d":[],"c":[["c",{"w":"instructions","s":"ctions","e":true,"k":"c","d":[15,47,53,65,439,462],"c":[]}],["m",{"w":"instruments","s":"ments","e":true,"k":"m","d":[160],"c":[]}]]}]]}],["i",{"w":"insi","s":"i","e":false,"k":"i","d":[],"c":[["d",{"w":"inside","s":"de","e":true,"k":"d","d":[12,19,20,22,26,30,68,69,71,224,245,246,348,509,515,516,517],"c":[]}],["g",{"w":"insight","s":"ght","e":true,"k":"g","d":[51],"c":[["s",{"w":"insights","s":"s","e":true,"k":"s","d":[70,95,156],"c":[]}]]}]]}],["p",{"w":"insp","s":"p","e":false,"k":"p","d":[],"c":[["e",{"w":"inspect","s":"ect","e":true,"k":"e","d":[50,229,378,517],"c":[["i",{"w":"inspecting","s":"ing","e":true,"k":"i","d":[258],"c":[]}]]}],["i",{"w":"inspired","s":"ired","e":true,"k":"i","d":[231],"c":[]}]]}],["e",{"w":"inse","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"insert","s":"rt","e":true,"k":"r","d":[68,97,167],"c":[["i",{"w":"inserti","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"inserting","s":"ng","e":true,"k":"n","d":[68,79,167],"c":[]}],["o",{"w":"insertion","s":"on","e":true,"k":"o","d":[167],"c":[]}]]}],["s",{"w":"inserts","s":"s","e":true,"k":"s","d":[69,89,132,167,172,189],"c":[]}],["-",{"w":"insert-user-data","s":"-user-data","e":true,"k":"-","d":[167],"c":[]}],["e",{"w":"inserted","s":"ed","e":true,"k":"e","d":[167],"c":[]}]]}],["t",{"w":"inset-x-0","s":"t-x-0","e":true,"k":"t","d":[352],"c":[]}]]}],["u",{"w":"insufficient","s":"ufficient","e":true,"k":"u","d":[164,193],"c":[]}],["c",{"w":"inscription","s":"cription","e":true,"k":"c","d":[371,459],"c":[["_",{"w":"inscription_feed","s":"_feed","e":true,"k":"_","d":[371,379],"c":[]}],["s",{"w":"inscriptions","s":"s","e":true,"k":"s","d":[422,423,425,427,443,454,456,457,458,459,491,493,494,495,502,504],"c":[["'",{"w":"inscriptions'","s":"'","e":true,"k":"'","d":[446,455,465,483,492,500],"c":[]}]]}]]}]]}],["c",{"w":"inc","s":"c","e":false,"k":"c","d":[],"c":[["r",{"w":"incre","s":"re","e":false,"k":"r","d":[],"c":[["m",{"w":"increment","s":"ment","e":true,"k":"m","d":[6,7,9,27,30,100,137,246,360,361,375,511,513,517],"c":[["s",{"w":"increments","s":"s","e":true,"k":"s","d":[9,22,30,137],"c":[]}],["e",{"w":"incremented","s":"ed","e":true,"k":"e","d":[30,99,516],"c":[]}],["-",{"w":"increment-c","s":"-c","e":false,"k":"-","d":[],"c":[["o",{"w":"increment-counter","s":"ounter","e":true,"k":"o","d":[99,137],"c":[]}],["u",{"w":"increment-cursor","s":"ursor","e":true,"k":"u","d":[175],"c":[]}]]}],["i",{"w":"incrementing","s":"ing","e":true,"k":"i","d":[99,122,137],"c":[]}],["a",{"w":"incrementally","s":"ally","e":true,"k":"a","d":[149],"c":[]}],["r",{"w":"incrementresponse","s":"response","e":true,"k":"r","d":[246],"c":[]}]]}],["a",{"w":"increas","s":"as","e":false,"k":"a","d":[],"c":[["e",{"w":"increase","s":"e","e":true,"k":"e","d":[7,77,178,361],"c":[["s",{"w":"increases","s":"s","e":true,"k":"s","d":[22,102],"c":[]}],["d",{"w":"increased","s":"d","e":true,"k":"d","d":[22],"c":[]}]]}],["i",{"w":"increasing","s":"ing","e":true,"k":"i","d":[115,125,178,190,255],"c":[]}]]}]]}],["l",{"w":"inclu","s":"lu","e":false,"k":"l","d":[],"c":[["d",{"w":"includ","s":"d","e":false,"k":"d","d":[],"c":[["i",{"w":"including","s":"ing","e":true,"k":"i","d":[7,12,19,27,29,44,45,52,65,67,68,86,127,176,191,219,222,224,243,245,257,345,348,350,361,372,399,439,462,515,516],"c":[]}],["e",{"w":"include","s":"e","e":true,"k":"e","d":[9,25,27,47,51,52,69,176,191,226,232,234,259,368,378,379,515,516],"c":[["d",{"w":"included","s":"d","e":true,"k":"d","d":[7,27,95,229,258,361],"c":[]}],["s",{"w":"includes","s":"s","e":true,"k":"s","d":[27,52,64,65,69,71,75,176,191,233,236,255,259,365,367,370,377,382,383,384,385,386,387,439,462,511,513,517],"c":[]}],["_",{"w":"include_","s":"_","e":false,"k":"_","d":[],"c":[["p",{"w":"include_proof","s":"proof","e":true,"k":"p","d":[379],"c":[]}],["i",{"w":"include_inputs","s":"inputs","e":true,"k":"i","d":[379],"c":[]}],["o",{"w":"include_outputs","s":"outputs","e":true,"k":"o","d":[379],"c":[]}],["w",{"w":"include_witness","s":"witness","e":true,"k":"w","d":[379],"c":[]}],["c",{"w":"include_contract_abi","s":"contract_abi","e":true,"k":"c","d":[379],"c":[]}]]}]]}]]}],["s",{"w":"inclusive","s":"sive","e":true,"k":"s","d":[114,154,176,191,372],"c":[]}]]}],["o",{"w":"inco","s":"o","e":false,"k":"o","d":[],"c":[["m",{"w":"incom","s":"m","e":false,"k":"m","d":[],"c":[["i",{"w":"incoming","s":"ing","e":true,"k":"i","d":[67,68,226,227],"c":[]}],["p",{"w":"incomp","s":"p","e":false,"k":"p","d":[],"c":[["l",{"w":"incomplete","s":"lete","e":true,"k":"l","d":[82,83,84,85,89,93,94,98,101,105,106,107,109,110,111,117,118,121,124,131,132,135,136,138,139,141,142,143,146,147,148,150,151,153,155,157,159,162,165,166,167,168,169,170,171,172,175,181,184,185,186,189,194,195,197,198,200],"c":[]}],["a",{"w":"incompatible","s":"atible","e":true,"k":"a","d":[105,110,183,189],"c":[]}]]}]]}],["r",{"w":"incor","s":"r","e":false,"k":"r","d":[],"c":[["p",{"w":"incorporat","s":"porat","e":false,"k":"p","d":[],"c":[["i",{"w":"incorporating","s":"ing","e":true,"k":"i","d":[68],"c":[]}],["e",{"w":"incorporate","s":"e","e":true,"k":"e","d":[71,95,156],"c":[]}]]}],["r",{"w":"incorrect","s":"rect","e":true,"k":"r","d":[89,93,107,121,144,155,158,165,171,172,179,195,197],"c":[["l",{"w":"incorrectly","s":"ly","e":true,"k":"l","d":[84,94,98,111,117,131,132,138,141,142,157,162,167,169,175,181,198,200],"c":[]}]]}]]}],["n",{"w":"inconsisten","s":"nsisten","e":false,"k":"n","d":[],"c":[["t",{"w":"inconsistent","s":"t","e":true,"k":"t","d":[152,164],"c":[]}],["c",{"w":"inconsistencies","s":"cies","e":true,"k":"c","d":[161],"c":[]}]]}]]}],["u",{"w":"incurring","s":"urring","e":true,"k":"u","d":[134],"c":[]}]]}],["t",{"w":"int","s":"t","e":true,"k":"t","d":[6,7,77,84,87,88,93,99,102,105,106,107,109,110,111,112,113,114,118,120,121,128,130,131,137,138,140,142,145,148,153,154,155,159,165,168,170,171,174,175,176,177,179,181,183,185,187,188,189,191,197,199,226,234,356,360,361,366,368],"c":[["e",{"w":"inte","s":"e","e":false,"k":"e","d":[],"c":[["g",{"w":"integ","s":"g","e":false,"k":"g","d":[],"c":[["e",{"w":"integer","s":"er","e":true,"k":"e","d":[6,12,76,77,87,88,102,105,106,107,112,113,114,118,120,122,128,130,133,137,138,140,142,145,153,154,157,158,160,168,174,176,179,180,185,187,188,191,197,226,234,245,258,348,360,368,371,372],"c":[["s",{"w":"integers","s":"s","e":true,"k":"s","d":[76,77,82,87,93,102,105,110,112,113,114,118,128,130,133,137,138,140,142,145,153,154,157,158,176,177,179,183,187,188,191,229,371,372],"c":[]}]]}],["r",{"w":"integr","s":"r","e":false,"k":"r","d":[],"c":[["a",{"w":"integrat","s":"at","e":false,"k":"a","d":[],"c":[["e",{"w":"integrate","s":"e","e":true,"k":"e","d":[11,68,69,71,228,232,352,381,420,423,459,505],"c":[["d",{"w":"integrated","s":"d","e":true,"k":"d","d":[259],"c":[]}]]}],["i",{"w":"integrati","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"integration","s":"on","e":true,"k":"o","d":[12,19,50,68,69,71,224,245,348],"c":[]}],["n",{"w":"integrating","s":"ng","e":true,"k":"n","d":[68,71,459],"c":[]}]]}]]}],["i",{"w":"integrity","s":"ity","e":true,"k":"i","d":[13,16,80,83,84,85,89,91,94,98,101,106,109,110,111,115,118,121,125,131,132,135,138,141,142,143,148,150,151,153,157,159,162,166,167,168,169,172,173,175,180,181,184,186,189,190,194,195,198,200],"c":[]}]]}]]}],["r",{"w":"inter","s":"r","e":false,"k":"r","d":[],"c":[["a",{"w":"interact","s":"act","e":true,"k":"a","d":[7,8,9,23,30,31,44,50,53,86,99,104,119,144,152,208,228,230,239,244,257,345,350,355,361,399,466,504,509],"c":[["i",{"w":"interacti","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"interacting","s":"ng","e":true,"k":"n","d":[7,44,50,51,64,81,86,230,244,353,361,365,382,383,384,385,386,387,466],"c":[]}],["o",{"w":"interaction","s":"on","e":true,"k":"o","d":[12,27,99,245,259,348,355,356,366],"c":[["s",{"w":"interactions","s":"s","e":true,"k":"s","d":[9,12,27,30,81,90,119,123,192,229,245,348,356,357,366,372],"c":[]}]]}],["v",{"w":"interactive","s":"ve","e":true,"k":"v","d":[23,68,99],"c":[]}]]}],["s",{"w":"interacts","s":"s","e":true,"k":"s","d":[55],"c":[]}],["e",{"w":"interacted","s":"ed","e":true,"k":"e","d":[90],"c":[]}]]}],["f",{"w":"interface","s":"face","e":true,"k":"f","d":[7,18,31,44,49,50,51,64,68,75,90,119,152,208,244,351,353,355,356,361,365,366,374,376,377,382,383,384,385,386,387,410],"c":[["s",{"w":"interfaces","s":"s","e":true,"k":"s","d":[7,8,117,119,134,152,229,234,259,361,368],"c":[]}],["'",{"w":"interface'","s":"'","e":true,"k":"'","d":[51],"c":[]}]]}],["e",{"w":"interest","s":"est","e":true,"k":"e","d":[12,77,102,245,348],"c":[["i",{"w":"interesting","s":"ing","e":true,"k":"i","d":[70],"c":[]}]]}],["m",{"w":"intermediate","s":"mediate","e":true,"k":"m","d":[22,68,69,71,100,199],"c":[]}],["n",{"w":"intern","s":"n","e":false,"k":"n","d":[],"c":[["a",{"w":"internal","s":"al","e":true,"k":"a","d":[55,129,229],"c":[["s",{"w":"internals","s":"s","e":true,"k":"s","d":[229],"c":[]}],["l",{"w":"internally","s":"ly","e":true,"k":"l","d":[229,259],"c":[]}]]}],["e",{"w":"internet","s":"et","e":true,"k":"e","d":[55],"c":[]}]]}],["s",{"w":"intersection","s":"section","e":true,"k":"s","d":[70],"c":[]}],["o",{"w":"interopera","s":"opera","e":false,"k":"o","d":[],"c":[["b",{"w":"interoperab","s":"b","e":false,"k":"b","d":[],"c":[["i",{"w":"interoperability","s":"ility","e":true,"k":"i","d":[76,80,90,119,144],"c":[]}],["l",{"w":"interoperable","s":"le","e":true,"k":"l","d":[90,119,152],"c":[]}]]}],["t",{"w":"interoperating","s":"ting","e":true,"k":"t","d":[87,133,158,179],"c":[]}]]}],["-",{"w":"inter-contract","s":"-contract","e":true,"k":"-","d":[86],"c":[]}],["p",{"w":"interpret","s":"pret","e":false,"k":"p","d":[],"c":[["s",{"w":"interprets","s":"s","e":true,"k":"s","d":[87,133],"c":[]}],["e",{"w":"interprete","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"interpreted","s":"d","e":true,"k":"d","d":[193],"c":[]}],["r",{"w":"interpreter","s":"r","e":true,"k":"r","d":[219],"c":[]}]]}]]}],["v",{"w":"interval","s":"val","e":true,"k":"v","d":[191],"c":[["s",{"w":"intervals","s":"s","e":true,"k":"s","d":[202],"c":[]}]]}]]}],["l",{"w":"intelligence","s":"lligence","e":true,"k":"l","d":[70],"c":[]}],["n",{"w":"inten","s":"n","e":false,"k":"n","d":[],"c":[["d",{"w":"intended","s":"ded","e":true,"k":"d","d":[108,121,168,224,239,511,513],"c":[["-",{"w":"intended-taker","s":"-taker","e":true,"k":"-","d":[511,513],"c":[]}]]}],["t",{"w":"intent","s":"t","e":true,"k":"t","d":[201],"c":[["i",{"w":"intentionally","s":"ionally","e":true,"k":"i","d":[257,345],"c":[]}]]}]]}]]}],["o",{"w":"into","s":"o","e":true,"k":"o","d":[8,9,11,12,14,15,17,18,22,26,47,48,50,51,52,68,69,71,72,76,79,86,89,94,95,96,108,113,129,130,132,141,142,144,156,163,167,171,172,182,189,190,219,220,224,227,228,230,231,232,236,244,245,246,258,259,348,352,353,354,357,370,377,381,420,423,459,505],"c":[]}],["r",{"w":"intro","s":"ro","e":false,"k":"r","d":[],"c":[["s",{"w":"introspection","s":"spection","e":true,"k":"s","d":[19],"c":[]}],["d",{"w":"introduc","s":"duc","e":false,"k":"d","d":[],"c":[["t",{"w":"introduction","s":"tion","e":true,"k":"t","d":[68,69,71,515],"c":[]}],["e",{"w":"introduce","s":"e","e":true,"k":"e","d":[71],"c":[["d",{"w":"introduced","s":"d","e":true,"k":"d","d":[104,127,229],"c":[]}],["s",{"w":"introduces","s":"s","e":true,"k":"s","d":[221],"c":[]}]]}],["i",{"w":"introducing","s":"ing","e":true,"k":"i","d":[78,219,220],"c":[]}]]}]]}],["u",{"w":"intuitive","s":"uitive","e":true,"k":"u","d":[50],"c":[]}],["-",{"w":"int-to-","s":"-to-","e":false,"k":"-","d":[],"c":[["a",{"w":"int-to-ascii","s":"ascii","e":true,"k":"a","d":[87,88,118,138,153,157,179],"c":[]}],["u",{"w":"int-to-utf8","s":"utf8","e":true,"k":"u","d":[118,120,138,153,157],"c":[]}]]}],["1",{"w":"int1","s":"1","e":true,"k":"1","d":[93],"c":[]}],["2",{"w":"int2","s":"2","e":true,"k":"2","d":[93],"c":[]}],["c",{"w":"intcv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}],["t",{"w":"inttobigint","s":"tobigint","e":true,"k":"t","d":[229],"c":[]}]]}],["p",{"w":"input","s":"put","e":true,"k":"p","d":[6,52,80,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,360,371,514],"c":[["s",{"w":"inputs","s":"s","e":true,"k":"s","d":[52,87,102,103,108,112,113,114,128,130,133,137,138,140,154,157,158,165,176,179,188,191,193,233,356,366,367,379],"c":[]}]]}],["f",{"w":"inf","s":"f","e":false,"k":"f","d":[],"c":[["o",{"w":"info","s":"o","e":true,"k":"o","d":[9,17,47,48,49,51,52,53,55,68,71,78,83,202,219,222,234,235,236,238,242,246,257,296,298,345,368,369,370,371,375,377,379,444,504,509],"c":[["r",{"w":"inform","s":"rm","e":true,"k":"r","d":[233,367],"c":[["a",{"w":"information","s":"ation","e":true,"k":"a","d":[7,19,22,24,50,52,58,65,67,68,69,71,76,83,90,95,98,103,104,116,125,127,143,156,161,164,177,190,195,198,202,208,219,222,226,227,243,259,351,352,353,356,357,361,366,371,372,377,378,379,439,462,510,516,517],"c":[]}],["e",{"w":"informed","s":"ed","e":true,"k":"e","d":[70],"c":[]}]]}],["'",{"w":"info'","s":"'","e":true,"k":"'","d":[401,407],"c":[]}]]}],["r",{"w":"infra","s":"ra","e":true,"k":"r","d":[427,459],"c":[["s",{"w":"infrastructure","s":"structure","e":true,"k":"s","d":[50,422,502],"c":[]}]]}],["e",{"w":"inferred","s":"erred","e":true,"k":"e","d":[229],"c":[]}]]}],["v",{"w":"inv","s":"v","e":false,"k":"v","d":[],"c":[["o",{"w":"invo","s":"o","e":false,"k":"o","d":[],"c":[["l",{"w":"involv","s":"lv","e":false,"k":"l","d":[],"c":[["e",{"w":"involve","s":"e","e":true,"k":"e","d":[68,102,112,137,140,180,372],"c":[["d",{"w":"involved","s":"d","e":true,"k":"d","d":[9],"c":[]}],["s",{"w":"involves","s":"s","e":true,"k":"s","d":[12,67,68,69,116,226,227,245,348,352],"c":[]}]]}],["i",{"w":"involving","s":"ing","e":true,"k":"i","d":[77,107,130,144,145,174,372],"c":[]}]]}],["k",{"w":"invok","s":"k","e":false,"k":"k","d":[],"c":[["i",{"w":"invoking","s":"ing","e":true,"k":"i","d":[12,245,348,377],"c":[]}],["e",{"w":"invoked","s":"ed","e":true,"k":"e","d":[99,377],"c":[]}]]}]]}],["i",{"w":"invite","s":"ite","e":false,"k":"i","d":[],"c":[["s",{"w":"invites","s":"s","e":true,"k":"s","d":[70,72],"c":[]}],["d",{"w":"invited","s":"d","e":true,"k":"d","d":[73],"c":[]}]]}],["e",{"w":"inve","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"invert","s":"rt","e":true,"k":"r","d":[113,155,187],"c":[["i",{"w":"inverting","s":"ing","e":true,"k":"i","d":[76,155],"c":[]}]]}],["s",{"w":"investment","s":"stment","e":true,"k":"s","d":[516],"c":[]}]]}],["a",{"w":"inva","s":"a","e":false,"k":"a","d":[],"c":[["l",{"w":"invalid","s":"lid","e":true,"k":"l","d":[84,87,91,94,95,98,99,101,104,111,117,121,127,131,133,138,142,156,157,158,162,169,175,179,181,193,198,226,234,368],"c":[]}],["r",{"w":"invariants","s":"riants","e":true,"k":"r","d":[193],"c":[]}]]}]]}],["d",{"w":"ind","s":"d","e":false,"k":"d","d":[],"c":[["e",{"w":"inde","s":"e","e":false,"k":"e","d":[],"c":[["x",{"w":"index","s":"x","e":true,"k":"x","d":[9,104,109,122,156,180,183,194,232,239,351,356,366,373,377,422,423,466,502,504,517],"c":[["-",{"w":"index-of","s":"-of","e":true,"k":"-","d":[109,183,194],"c":[]}],["i",{"w":"indexing","s":"ing","e":true,"k":"i","d":[180,504],"c":[]}],["e",{"w":"indexe","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"indexes","s":"s","e":true,"k":"s","d":[257,345,371,373],"c":[]}],["r",{"w":"indexer","s":"r","e":true,"k":"r","d":[373,377,378,420,422,427,459,466,502,504],"c":[["'",{"w":"indexer'","s":"'","e":true,"k":"'","d":[420],"c":[]}]]}]]}],["_",{"w":"index_block_hash","s":"_block_hash","e":true,"k":"_","d":[377],"c":[]}]]}],["p",{"w":"independent","s":"pendent","e":true,"k":"p","d":[219,220],"c":[["l",{"w":"independently","s":"ly","e":true,"k":"l","d":[31,45],"c":[]}]]}],["e",{"w":"indeed","s":"ed","e":true,"k":"e","d":[71],"c":[]}]]}],["i",{"w":"indi","s":"i","e":false,"k":"i","d":[],"c":[["c",{"w":"indic","s":"c","e":false,"k":"c","d":[],"c":[["a",{"w":"indicat","s":"at","e":false,"k":"a","d":[],"c":[["i",{"w":"indicati","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"indicating","s":"ng","e":true,"k":"n","d":[16,21,121,164,510],"c":[]}],["o",{"w":"indication","s":"on","e":true,"k":"o","d":[258],"c":[]}]]}],["e",{"w":"indicate","s":"e","e":true,"k":"e","d":[21,99,121,129,134,164,229,516],"c":[["s",{"w":"indicates","s":"s","e":true,"k":"s","d":[258],"c":[]}]]}],["o",{"w":"indicator","s":"or","e":true,"k":"o","d":[50],"c":[]}]]}],["e",{"w":"indices","s":"es","e":true,"k":"e","d":[180,194,356,366],"c":[]}]]}],["v",{"w":"individual","s":"vidual","e":true,"k":"v","d":[76,103,122,128,134,174,208,224,379,459],"c":[["l",{"w":"individually","s":"ly","e":true,"k":"l","d":[228,244],"c":[]}]]}],["s",{"w":"indistinguishable","s":"stinguishable","e":true,"k":"s","d":[103],"c":[]}]]}]]}],["g",{"w":"ingest","s":"gest","e":true,"k":"g","d":[14],"c":[["i",{"w":"ingestion","s":"ion","e":true,"k":"i","d":[219,222,427,459],"c":[]}]]}],["l",{"w":"inline","s":"line","e":true,"k":"l","d":[18,27,377,517],"c":[["c",{"w":"inlinecode","s":"code","e":true,"k":"c","d":[226,227,233,234,235,236,356,366,367,368,369,370,371,372,509,515],"c":[]}],["-",{"w":"inline-code","s":"-code","e":true,"k":"-","d":[517],"c":[["'",{"w":"inline-code'","s":"'","e":true,"k":"'","d":[226,227,233,234,235,236,356,366,367,368,369,370,371,372,509,515],"c":[]}]]}]]}],["-",{"w":"in-","s":"-","e":false,"k":"-","d":[],"c":[["m",{"w":"in-memory","s":"memory","e":true,"k":"m","d":[19,27],"c":[]}],["p",{"w":"in-place","s":"place","e":true,"k":"p","d":[149],"c":[]}],["a",{"w":"in-app","s":"app","e":true,"k":"a","d":[350],"c":[]}]]}],["h",{"w":"inherent","s":"herent","e":true,"k":"h","d":[27],"c":[]}],["a",{"w":"inac","s":"ac","e":false,"k":"a","d":[],"c":[["t",{"w":"inactive","s":"tive","e":true,"k":"t","d":[50,52,68,69,71],"c":[]}],["c",{"w":"inaccurate","s":"curate","e":true,"k":"c","d":[156],"c":[]}]]}],["e",{"w":"inefficient","s":"efficient","e":true,"k":"e","d":[68,125,190],"c":[["l",{"w":"inefficiently","s":"ly","e":true,"k":"l","d":[149],"c":[]}]]}],["n",{"w":"inn","s":"n","e":false,"k":"n","d":[],"c":[["o",{"w":"innovati","s":"ovati","e":false,"k":"o","d":[],"c":[["v",{"w":"innovative","s":"ve","e":true,"k":"v","d":[69,70,73],"c":[]}],["o",{"w":"innovation","s":"on","e":true,"k":"o","d":[73],"c":[]}]]}],["e",{"w":"inner","s":"er","e":true,"k":"e","d":[85,148,151,159],"c":[]}]]}]]}],["t",{"w":"it","s":"t","e":true,"k":"t","d":[4,6,7,9,12,14,15,17,22,27,28,30,45,47,48,49,50,51,52,55,67,68,69,71,72,73,75,76,79,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,219,221,224,226,227,229,230,233,234,237,241,243,245,246,258,259,348,352,355,356,357,358,360,361,362,366,367,368,371,377,378,379,509,511,513,515,516,517],"c":[["s",{"w":"its","s":"s","e":true,"k":"s","d":[6,7,9,16,22,27,51,52,80,82,87,91,94,100,102,104,105,108,112,114,133,137,140,141,145,149,154,158,161,174,176,179,180,182,183,191,229,233,259,360,361,367,377,379,511,513],"c":[["e",{"w":"itself","s":"elf","e":true,"k":"e","d":[69,90,128,176,191,192,224,238],"c":[]}]]}],["'",{"w":"it's","s":"'s","e":true,"k":"'","d":[9,28,30,49,51,68,69,77,79,80,81,92,99,102,108,112,113,114,122,137,140,154,160,176,188,191,224,228,234,235,236,241,246,368,369,370,377,515,516],"c":[]}],["e",{"w":"ite","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"itera","s":"ra","e":false,"k":"r","d":[],"c":[["t",{"w":"iterat","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"iterate","s":"e","e":true,"k":"e","d":[18,45,96,177],"c":[]}],["i",{"w":"iterations","s":"ions","e":true,"k":"i","d":[50,378],"c":[]}]]}],["b",{"w":"iterable","s":"ble","e":true,"k":"b","d":[97],"c":[]}]]}],["m",{"w":"item","s":"m","e":true,"k":"m","d":[68,77,109,126,180,194],"c":[["s",{"w":"items","s":"s","e":true,"k":"s","d":[18,51,109,255,510,515],"c":[["-",{"w":"items-end'","s":"-end'","e":true,"k":"-","d":[44,466,508],"c":[]}]]}],["n",{"w":"itemname","s":"name","e":true,"k":"n","d":[18],"c":[]}],["c",{"w":"itemcount","s":"count","e":true,"k":"c","d":[77],"c":[]}],["-",{"w":"item-1","s":"-1","e":true,"k":"-","d":[379],"c":[]}]]}]]}]]}],["s",{"w":"is","s":"s","e":true,"k":"s","d":[4,6,7,8,9,12,13,14,15,16,17,19,21,22,27,28,30,45,46,47,48,49,50,51,52,53,54,55,58,65,67,68,69,71,72,75,76,77,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,219,220,221,222,223,224,226,227,228,229,230,231,233,234,235,239,240,241,244,245,246,255,258,259,346,348,350,352,353,354,355,356,358,360,361,362,366,367,368,369,371,372,373,374,376,377,378,379,399,422,427,439,459,462,502,504,509,510,511,513,515,516,517],"c":[["-",{"w":"is-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"is-s","s":"s","e":false,"k":"s","d":[],"c":[["o",{"w":"is-some","s":"ome","e":true,"k":"o","d":[6,79,139,146,168,173,201,360],"c":[]}],["e",{"w":"is-self-or-extension","s":"elf-or-extension","e":true,"k":"e","d":[69],"c":[]}],["t",{"w":"is-standard","s":"tandard","e":true,"k":"t","d":[147],"c":[]}]]}],["a",{"w":"is-a","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"is-active","s":"ctive","e":true,"k":"c","d":[7,361],"c":[]}],["d",{"w":"is-admin","s":"dmin","e":true,"k":"d","d":[173],"c":[]}]]}],["e",{"w":"is-e","s":"e","e":false,"k":"e","d":[],"c":[["q",{"w":"is-eq","s":"q","e":true,"k":"q","d":[12,69,71,76,79,80,81,90,95,102,104,108,113,115,122,123,128,130,155,160,165,173,174,176,177,178,187,191,192,193,202,245,348,511,513,516],"c":[]}],["x",{"w":"is-extension","s":"xtension","e":true,"k":"x","d":[69,90],"c":[]}],["r",{"w":"is-err","s":"rr","e":true,"k":"r","d":[124,136,166],"c":[]}],["v",{"w":"is-even","s":"ven","e":true,"k":"v","d":[177],"c":[]}]]}],["d",{"w":"is-dao-or-extension","s":"dao-or-extension","e":true,"k":"d","d":[69],"c":[]}],["n",{"w":"is-no","s":"no","e":false,"k":"n","d":[],"c":[["n",{"w":"is-none","s":"ne","e":true,"k":"n","d":[69,79,139,146,163,168,173,201,377],"c":[]}],["t",{"w":"is-not-zero","s":"t-zero","e":true,"k":"t","d":[155],"c":[]}]]}],["k",{"w":"is-keyholder","s":"keyholder","e":true,"k":"k","d":[71],"c":[]}],["o",{"w":"is-ok","s":"ok","e":true,"k":"o","d":[124,136],"c":[]}],["p",{"w":"is-profile-","s":"profile-","e":false,"k":"p","d":[],"c":[["m",{"w":"is-profile-missing","s":"missing","e":true,"k":"m","d":[139],"c":[]}],["e",{"w":"is-profile-existing","s":"existing","e":true,"k":"e","d":[146],"c":[]}]]}],["z",{"w":"is-zero-or-negative","s":"zero-or-negative","e":true,"k":"z","d":[165],"c":[]}],["w",{"w":"is-whitelisted","s":"whitelisted","e":true,"k":"w","d":[511,513],"c":[]}]]}],["a",{"w":"isa","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"isactive","s":"ctive","e":true,"k":"c","d":[7,97,108,361],"c":[]}],["d",{"w":"isadmin","s":"dmin","e":true,"k":"d","d":[108],"c":[]}]]}],["s",{"w":"iss","s":"s","e":false,"k":"s","d":[],"c":[["u",{"w":"issu","s":"u","e":false,"k":"u","d":[],"c":[["e",{"w":"issue","s":"e","e":true,"k":"e","d":[46,164,229],"c":[["r",{"w":"issuer","s":"r","e":true,"k":"r","d":[7,361],"c":[]}],["s",{"w":"issues","s":"s","e":true,"k":"s","d":[12,16,46,87,122,145,161,174,179,224,229,232,245,348],"c":[]}],["d",{"w":"issued","s":"d","e":true,"k":"d","d":[516],"c":[]}]]}],["a",{"w":"issuance","s":"ance","e":true,"k":"a","d":[178],"c":[]}],["i",{"w":"issuing","s":"ing","e":true,"k":"i","d":[258],"c":[]}]]}],["i",{"w":"issign","s":"ign","e":false,"k":"i","d":[],"c":[["i",{"w":"issigninpending","s":"inpending","e":true,"k":"i","d":[67,226,227],"c":[]}],["e",{"w":"issignedin","s":"edin","e":true,"k":"e","d":[67,226,227,355],"c":[]}]]}]]}],["o",{"w":"isolat","s":"olat","e":false,"k":"o","d":[],"c":[["e",{"w":"isolate","s":"e","e":true,"k":"e","d":[76],"c":[["d",{"w":"isolated","s":"d","e":true,"k":"d","d":[50],"c":[]}]]}],["i",{"w":"isolating","s":"ing","e":true,"k":"i","d":[113],"c":[]}]]}],["u",{"w":"isusersignedin","s":"usersignedin","e":true,"k":"u","d":[67,226,227],"c":[]}],["p",{"w":"ispending","s":"pending","e":true,"k":"p","d":[67,226,227],"c":[]}],["k",{"w":"iskeyholder","s":"keyholder","e":true,"k":"k","d":[71],"c":[]}],["m",{"w":"ismainnet","s":"mainnet","e":true,"k":"m","d":[227],"c":[]}],["n",{"w":"isn't","s":"n't","e":true,"k":"n","d":[241],"c":[]}],["c",{"w":"isconnected","s":"connected","e":true,"k":"c","d":[352,353,354,355,356,357,366],"c":[]}],["w",{"w":"iswinner","s":"winner","e":true,"k":"w","d":[516],"c":[]}]]}],["f",{"w":"if","s":"f","e":true,"k":"f","d":[6,7,12,14,15,16,17,21,22,24,46,47,49,50,51,52,53,58,65,67,68,69,71,72,73,75,76,77,79,80,81,83,85,87,89,90,95,96,97,99,100,102,108,110,113,114,124,125,126,129,131,132,133,136,137,139,140,146,147,148,149,150,151,152,154,155,156,158,159,160,161,164,165,166,167,168,170,171,172,173,174,175,176,177,178,179,180,183,184,189,190,191,193,196,198,201,202,219,224,226,227,229,230,233,234,238,243,245,257,258,345,348,352,353,354,356,360,361,366,367,368,371,372,373,374,375,376,377,378,423,425,426,439,443,444,462,510,511,513,515,516,517],"c":[["t",{"w":"ifttt","s":"ttt","e":true,"k":"t","d":[52],"c":[]}],["_",{"w":"if_this","s":"_this","e":true,"k":"_","d":[52,68,371,372,374,376,377,378,379],"c":[]}],["-",{"w":"if-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"if-this","s":"this","e":true,"k":"t","d":[52],"c":[]}],["e",{"w":"if-else","s":"else","e":true,"k":"e","d":[201],"c":[]}]]}],["r",{"w":"iframe","s":"rame","e":true,"k":"r","d":[70,72],"c":[]}]]}],["d",{"w":"id","s":"d","e":true,"k":"d","d":[7,11,27,44,101,135,186,189,195,219,222,230,256,293,353,356,361,366,371,372,381,454,456,458,466,491,493,495,501,505,510,511,513,516],"c":[["e",{"w":"ide","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"identi","s":"nti","e":false,"k":"n","d":[],"c":[["f",{"w":"identif","s":"f","e":false,"k":"f","d":[],"c":[["i",{"w":"identifie","s":"ie","e":false,"k":"i","d":[],"c":[["r",{"w":"identifier","s":"r","e":true,"k":"r","d":[7,12,67,80,97,104,117,122,188,224,245,348,361,372,377],"c":[["s",{"w":"identifiers","s":"s","e":true,"k":"s","d":[80,91,104,117,122,188],"c":[]}]]}],["s",{"w":"identifies","s":"s","e":true,"k":"s","d":[89,172,233,367,377,379],"c":[]}],["d",{"w":"identified","s":"d","e":true,"k":"d","d":[226,227,240],"c":[]}]]}],["y",{"w":"identify","s":"y","e":true,"k":"y","d":[12,51,81,224,245,348,371,379],"c":[["i",{"w":"identifying","s":"ing","e":true,"k":"i","d":[81,372],"c":[]}]]}]]}],["t",{"w":"identit","s":"t","e":false,"k":"t","d":[],"c":[["y",{"w":"identity","s":"y","e":true,"k":"y","d":[67,94,141,200,226,227,240,350],"c":[["_",{"w":"identity_","s":"_","e":true,"k":"_","d":[71],"c":[]}]]}],["i",{"w":"identities","s":"ies","e":true,"k":"i","d":[94,141,200],"c":[]}]]}]]}],["a",{"w":"idea","s":"a","e":true,"k":"a","d":[71,229],"c":[["l",{"w":"ideal","s":"l","e":true,"k":"l","d":[19,79],"c":[]}],["s",{"w":"ideas","s":"s","e":true,"k":"s","d":[69,70,72],"c":[]}]]}]]}],["-",{"w":"id-","s":"-","e":false,"k":"-","d":[],"c":[["h",{"w":"id-header-hash","s":"header-hash","e":true,"k":"h","d":[104,156,161,202],"c":[]}],["b",{"w":"id-block-hash","s":"block-hash","e":true,"k":"b","d":[161],"c":[]}]]}],["s",{"w":"ids","s":"s","e":true,"k":"s","d":[356,366,511,513],"c":[]}]]}],["c",{"w":"icon","s":"con","e":true,"k":"c","d":[11,22,26,27,30,44,228,239,256,381,420,423,466,501,505,510,515],"c":[["'",{"w":"icon'","s":"'","e":true,"k":"'","d":[11,22,26,27,30,44,256,352,381,420,466,501,505],"c":[]}]]}],["e",{"w":"ie","s":"e","e":true,"k":"e","d":[12,71,224,230,245,348,376],"c":[]}],["o",{"w":"io","s":"o","e":true,"k":"o","d":[46,71,75,259,374,376],"c":[]}],["l",{"w":"illustrate","s":"llustrate","e":true,"k":"l","d":[68],"c":[["s",{"w":"illustrates","s":"s","e":true,"k":"s","d":[514],"c":[]}]]}],["g",{"w":"ignor","s":"gnor","e":false,"k":"g","d":[],"c":[["i",{"w":"ignoring","s":"ing","e":true,"k":"i","d":[68],"c":[]}],["e",{"w":"ignore","s":"e","e":true,"k":"e","d":[231,379],"c":[]}]]}],["1",{"w":"i1","s":"1","e":true,"k":"1","d":[76,102,112,113,128,130,137,140,145,174,187,197],"c":[]}],["2",{"w":"i2","s":"2","e":true,"k":"2","d":[76,102,112,113,128,130,137,140,197],"c":[]}],["r",{"w":"irre","s":"rre","e":false,"k":"r","d":[],"c":[["l",{"w":"irrelevant","s":"levant","e":true,"k":"l","d":[177],"c":[]}],["v",{"w":"irreversible","s":"versible","e":true,"k":"v","d":[229],"c":[]}]]}],["p",{"w":"ipsum","s":"psum","e":true,"k":"p","d":[517],"c":[]}]]}],["c",{"w":"c","s":"c","e":true,"k":"c","d":[26,85,159,170,226,234,368],"c":[["o",{"w":"co","s":"o","e":true,"k":"o","d":[17,68,70,72,73,74,219,221,226,234,259,353,368,374,425,443,514],"c":[["n",{"w":"con","s":"n","e":false,"k":"n","d":[],"c":[["t",{"w":"cont","s":"t","e":false,"k":"t","d":[],"c":[["r",{"w":"contr","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"contribut","s":"ibut","e":false,"k":"i","d":[],"c":[["o",{"w":"contributors","s":"ors","e":false,"k":"o","d":[],"c":[["g",{"w":"contributorsguidecontent","s":"guidecontent","e":true,"k":"g","d":[1,419,506],"c":[]}],["-",{"w":"contributors-guide","s":"-guide","e":true,"k":"-","d":[1,419,506],"c":[]}]]}],["i",{"w":"contribution","s":"ion","e":false,"k":"i","d":[],"c":[["a",{"w":"contributionamount","s":"amount","e":true,"k":"a","d":[6,7,360,361],"c":[]}],["s",{"w":"contributions","s":"s","e":true,"k":"s","d":[53],"c":[]}]]}],["e",{"w":"contributes","s":"es","e":true,"k":"e","d":[164],"c":[]}]]}],["a",{"w":"contract","s":"act","e":true,"k":"a","d":[6,7,8,9,11,12,18,19,20,21,22,25,26,27,28,30,44,45,47,49,50,51,52,55,64,67,68,69,70,71,72,76,77,78,79,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,97,98,99,100,101,102,103,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,126,127,129,131,132,133,134,135,136,137,138,139,140,141,142,143,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,175,176,179,180,181,183,184,185,186,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,219,221,222,223,224,226,230,231,233,234,237,244,245,246,256,259,329,330,332,348,353,356,360,361,365,366,367,368,372,375,377,379,381,382,383,384,385,386,387,399,420,501,505,511,513,514,516],"c":[["p",{"w":"contractprincipal","s":"principal","e":true,"k":"p","d":[6,229,360],"c":[["c",{"w":"contractprincipalcv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}],["w",{"w":"contractprincipalwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}],["n",{"w":"contractn","s":"n","e":false,"k":"n","d":[],"c":[["a",{"w":"contractname","s":"ame","e":true,"k":"a","d":[7,69,71,226,227,230,234,236,353,361,368,370,514],"c":[]}],["o",{"w":"contractnonfungiblepostcondition","s":"onfungiblepostcondition","e":true,"k":"o","d":[226,234,368],"c":[]}]]}],["o",{"w":"contractowner","s":"owner","e":true,"k":"o","d":[7,71,81,361],"c":[]}],["a",{"w":"contracta","s":"a","e":false,"k":"a","d":[],"c":[["d",{"w":"contractaddress","s":"ddress","e":true,"k":"d","d":[7,69,71,226,230,234,353,361,368,514],"c":[]}],["s",{"w":"contractast","s":"st","e":true,"k":"s","d":[7,361],"c":[]}]]}],["s",{"w":"contracts","s":"s","e":true,"k":"s","d":[7,8,9,11,12,15,18,19,20,21,22,23,25,26,27,28,29,30,44,45,46,47,49,50,51,53,55,68,69,70,71,74,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,208,219,221,222,224,226,228,230,234,244,245,257,259,345,348,350,352,353,354,357,361,368,372,375,379,381,399,410,414,415,505,511,513,516],"c":[["o",{"w":"contractsource","s":"ource","e":true,"k":"o","d":[7,9,361],"c":[]}],["t",{"w":"contractstxpostcondition","s":"txpostcondition","e":true,"k":"t","d":[226,234,368],"c":[]}],["a",{"w":"contractsapi","s":"api","e":true,"k":"a","d":[514],"c":[]}]]}],["i",{"w":"contracti","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"contractinterface","s":"nterface","e":true,"k":"n","d":[7,361],"c":[["s",{"w":"contractinterfaces","s":"s","e":true,"k":"s","d":[7,361],"c":[]}]]}],["d",{"w":"contractid","s":"d","e":true,"k":"d","d":[7,361],"c":[]}]]}],["_",{"w":"contract_","s":"_","e":false,"k":"_","d":[],"c":[["i",{"w":"contract_id","s":"id","e":true,"k":"i","d":[9,51,329,332],"c":[["e",{"w":"contract_identifier","s":"entifier","e":true,"k":"e","d":[7,68,361,372,374,377,378,379],"c":[]}]]}],["_",{"w":"contract__increments","s":"_increments","e":true,"k":"_","d":[9],"c":[]}],["c",{"w":"contract_call","s":"call","e":true,"k":"c","d":[51,68,372,377,379,517],"c":[["s",{"w":"contract_calls_stack","s":"s_stack","e":true,"k":"s","d":[377],"c":[]}]]}],["d",{"w":"contract_deployment","s":"deployment","e":true,"k":"d","d":[52,372],"c":[]}],["o",{"w":"contract_owner","s":"owner","e":true,"k":"o","d":[108,178,192],"c":[]}],["n",{"w":"contract_name","s":"name","e":true,"k":"n","d":[230,410,411,413,414,415,416],"c":[]}],["f",{"w":"contract_function","s":"function","e":true,"k":"f","d":[230],"c":[]}],["a",{"w":"contract_address","s":"address","e":true,"k":"a","d":[410,411,413,414,415,416],"c":[]}]]}],["'",{"w":"contract'","s":"'","e":true,"k":"'","d":[51],"c":[["s",{"w":"contract's","s":"s","e":true,"k":"s","d":[22,51,71,86,90,92,99,100,103,116,144,177,178,192,198,224,511,513],"c":[]}]]}],["-",{"w":"contract-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"contract-call","s":"call","e":true,"k":"c","d":[22,25,26,27,28,30,69,71,86,90,99,119,152,226,234,368,516,517],"c":[["e",{"w":"contract-caller","s":"er","e":true,"k":"e","d":[69,81,90,94,141,147,192,200],"c":[]}],["-",{"w":"contract-call-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"contract-call-chainhook","s":"chainhook","e":true,"k":"c","d":[377,379],"c":[]}],["p",{"w":"contract-call-payload","s":"payload","e":true,"k":"p","d":[377],"c":[]}]]}]]}],["p",{"w":"contract-p","s":"p","e":false,"k":"p","d":[],"c":[["r",{"w":"contract-principal","s":"rincipal","e":true,"k":"r","d":[25],"c":[]}],["u",{"w":"contract-publish","s":"ublish","e":true,"k":"u","d":[25,27],"c":[]}]]}],["n",{"w":"contract-name","s":"name","e":true,"k":"n","d":[25,27,86,200,221,356,366],"c":[]}],["i",{"w":"contract-id","s":"id","e":true,"k":"i","d":[25,27],"c":[]}],["m",{"w":"contract-m","s":"m","e":false,"k":"m","d":[],"c":[["o",{"w":"contract-monitoring","s":"onitoring","e":true,"k":"o","d":[45,51],"c":[]}],["a",{"w":"contract-managed","s":"anaged","e":true,"k":"a","d":[192],"c":[]}]]}],["o",{"w":"contract-o","s":"o","e":false,"k":"o","d":[],"c":[["n",{"w":"contract-only","s":"nly","e":true,"k":"n","d":[47],"c":[]}],["f",{"w":"contract-of","s":"f","e":true,"k":"f","d":[69,90,117,119,511,513],"c":[]}],["w",{"w":"contract-owne","s":"wne","e":false,"k":"w","d":[],"c":[["d",{"w":"contract-owned","s":"d","e":true,"k":"d","d":[192],"c":[]}],["r",{"w":"contract-owner","s":"r","e":true,"k":"r","d":[511,513],"c":[]}]]}]]}],["t",{"w":"contract-to-contract","s":"to-contract","e":true,"k":"t","d":[81],"c":[]}],["a",{"w":"contract-a","s":"a","e":false,"k":"a","d":[],"c":[["g",{"w":"contract-agnostic","s":"gnostic","e":true,"k":"g","d":[90],"c":[]}],["b",{"w":"contract-abi","s":"bi","e":true,"k":"b","d":[226],"c":[]}]]}],["w",{"w":"contract-wide","s":"wide","e":true,"k":"w","d":[92,100],"c":[]}],["s",{"w":"contract-specific","s":"specific","e":true,"k":"s","d":[97],"c":[]}],["d",{"w":"contract-deploy","s":"deploy","e":true,"k":"d","d":[230],"c":[]}]]}],["c",{"w":"contractcall","s":"call","e":true,"k":"c","d":[51,65,365],"c":[]}],["f",{"w":"contractfungiblepostcondition","s":"fungiblepostcondition","e":true,"k":"f","d":[226,234,368],"c":[]}]]}],["o",{"w":"control","s":"ol","e":true,"k":"o","d":[69,71,78,81,90,99,100,108,113,160,170,171,178,192,196,239,354,355,356,366],"c":[["l",{"w":"controll","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"controlle","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"controlled","s":"d","e":true,"k":"d","d":[18,69,178,201],"c":[]}],["r",{"w":"controller","s":"r","e":true,"k":"r","d":[259],"c":[]}]]}],["i",{"w":"controlling","s":"ing","e":true,"k":"i","d":[196],"c":[]}]]}],["s",{"w":"controls","s":"s","e":true,"k":"s","d":[79,99,115,122,123,160,178,192],"c":[]}]]}]]}],["e",{"w":"conte","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"content","s":"nt","e":true,"k":"n","d":[1,3,7,247,361,374,419,421,459,467,506,507,512,517],"c":[["s",{"w":"contents","s":"s","e":true,"k":"s","d":[50,376],"c":[]}],["b",{"w":"contentbackground","s":"background","e":true,"k":"b","d":[352],"c":[]}],["-",{"w":"content-type","s":"-type","e":true,"k":"-","d":[374,376],"c":[]}],["'",{"w":"content'","s":"'","e":true,"k":"'","d":[456,493],"c":[]}]]}],["x",{"w":"context","s":"xt","e":true,"k":"x","d":[68,69,94,102,103,141,147,192,200],"c":[["s",{"w":"contexts","s":"s","e":true,"k":"s","d":[88,120],"c":[]}]]}]]}],["a",{"w":"contain","s":"ain","e":true,"k":"a","d":[7,27,68,226,227,234,236,361,368,370,377,379],"c":[["i",{"w":"containing","s":"ing","e":true,"k":"i","d":[6,47,52,67,87,95,133,144,158,177,179,183,226,227,229,230,259,353,360,372,377],"c":[]}],["s",{"w":"contains","s":"s","e":true,"k":"s","d":[9,14,29,67,68,168,201,226,227,234,235,236,243,352,356,366,368,369,370,372,374,377,378,379],"c":[]}],["e",{"w":"containe","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"container","s":"r","e":true,"k":"r","d":[11,24,256,381,420,501,505],"c":[]}],["d",{"w":"contained","s":"d","e":true,"k":"d","d":[19,168,377],"c":[]}]]}]]}],["i",{"w":"contin","s":"in","e":false,"k":"i","d":[],"c":[["u",{"w":"continu","s":"u","e":false,"k":"u","d":[],"c":[["a",{"w":"continually","s":"ally","e":true,"k":"a","d":[14,15,17,219,222],"c":[]}],["e",{"w":"continue","s":"e","e":true,"k":"e","d":[22,26,68,69,71,219,222,258,355],"c":[]}]]}],["o",{"w":"continously","s":"ously","e":true,"k":"o","d":[376],"c":[]}]]}]]}],["f",{"w":"conf","s":"f","e":true,"k":"f","d":[17,374,376,515],"c":[["i",{"w":"confi","s":"i","e":false,"k":"i","d":[],"c":[["g",{"w":"config","s":"g","e":true,"k":"g","d":[4,9,17,20,29,30,58,226,227,232,246,358,362,374,375,376,504],"c":[["u",{"w":"configur","s":"ur","e":false,"k":"u","d":[],"c":[["e",{"w":"configure","s":"e","e":true,"k":"e","d":[17,19,27,50,51,219,374,376,377,423,504,515],"c":[["d",{"w":"configured","s":"d","e":true,"k":"d","d":[7,15,18,27,68,241,361,376],"c":[]}],["-",{"w":"configure-","s":"-","e":false,"k":"-","d":[],"c":[["y",{"w":"configure-your-stacks-node","s":"your-stacks-node","e":true,"k":"y","d":[374],"c":[]}],["c",{"w":"configure-chainhook","s":"chainhook","e":true,"k":"c","d":[374],"c":[]}],["a",{"w":"configure-an-existing-bitcoin-node-to-work-with-chainhook","s":"an-existing-bitcoin-node-to-work-with-chainhook","e":true,"k":"a","d":[376],"c":[]}]]}]]}],["a",{"w":"configura","s":"a","e":false,"k":"a","d":[],"c":[["t",{"w":"configuration","s":"tion","e":true,"k":"t","d":[17,20,29,47,58,67,92,224,226,227,232,233,241,367,374,375,376,377,378,399,504,514,515,517],"c":[["s",{"w":"configurations","s":"s","e":true,"k":"s","d":[27,235,369,374,376,377,379],"c":[]}]]}],["b",{"w":"configurable","s":"ble","e":true,"k":"b","d":[100],"c":[]}]]}],["i",{"w":"configuring","s":"ing","e":true,"k":"i","d":[27,67,75,226,227,426,444],"c":[]}]]}]]}],["r",{"w":"confirm","s":"rm","e":true,"k":"r","d":[52,224,375],"c":[["e",{"w":"confirmed","s":"ed","e":true,"k":"e","d":[12,51,233,245,348,367],"c":[]}],["a",{"w":"confirmation","s":"ation","e":true,"k":"a","d":[52,219,222,346,375,515],"c":[]}],["s",{"w":"confirms","s":"s","e":true,"k":"s","d":[224],"c":[]}]]}],["d",{"w":"confidential","s":"dential","e":true,"k":"d","d":[50],"c":[]}]]}],["e",{"w":"conferences","s":"erences","e":true,"k":"e","d":[73],"c":[]}],["u",{"w":"confusi","s":"usi","e":false,"k":"u","d":[],"c":[["o",{"w":"confusion","s":"on","e":true,"k":"o","d":[81,83,103,229],"c":[]}],["n",{"w":"confusing","s":"ng","e":true,"k":"n","d":[158,176,179,191,229],"c":[]}]]}],["o",{"w":"conform","s":"orm","e":true,"k":"o","d":[152],"c":[["a",{"w":"conformance","s":"ance","e":true,"k":"a","d":[117],"c":[]}]]}],["l",{"w":"conflicting","s":"licting","e":true,"k":"l","d":[238],"c":[]}]]}],["s",{"w":"cons","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"const","s":"t","e":true,"k":"t","d":[4,5,6,7,9,12,58,64,65,67,68,69,71,223,224,226,227,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,245,246,348,352,353,354,356,357,358,359,360,361,362,365,366,367,368,369,370,382,383,384,385,386,387,514,517],"c":[["a",{"w":"constant","s":"ant","e":true,"k":"a","d":[92,125,173,185,190,516,517],"c":[["s",{"w":"constants","s":"s","e":true,"k":"s","d":[12,22,69,76,92,100,102,112,113,114,140,154,173,176,191,229,245,348,511,513,516],"c":[]}],["_",{"w":"constant_","s":"_","e":false,"k":"_","d":[],"c":[["v",{"w":"constant_val","s":"val","e":true,"k":"v","d":[416],"c":[]}],["n",{"w":"constant_name","s":"name","e":true,"k":"n","d":[416],"c":[]}]]}]]}],["r",{"w":"constr","s":"r","e":false,"k":"r","d":[],"c":[["u",{"w":"construct","s":"uct","e":true,"k":"u","d":[69,72,82,121,149,164,168,226,228,231,234,244,353,368,378],"c":[["i",{"w":"constructi","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"constructing","s":"ng","e":true,"k":"n","d":[82,121,149,168,182,200,226,228,231,234,368],"c":[["-",{"w":"constructing-post-conditions","s":"-post-conditions","e":true,"k":"-","d":[231],"c":[]}]]}],["o",{"w":"construction","s":"on","e":true,"k":"o","d":[164,168,182,200],"c":[]}]]}],["s",{"w":"constructs","s":"s","e":true,"k":"s","d":[94,121,124,136,141,168,182,200,233,367],"c":[]}],["e",{"w":"constructed","s":"ed","e":true,"k":"e","d":[226,231,243],"c":[]}]]}],["a",{"w":"constraints","s":"aints","e":true,"k":"a","d":[126,160,259],"c":[]}]]}]]}],["o",{"w":"console","s":"ole","e":true,"k":"o","d":[7,22,23,25,26,28,29,30,65,68,71,219,227,230,233,234,235,236,237,239,246,353,354,356,361,365,366,367,368,369,370,514,516,517],"c":[["'",{"w":"console's","s":"'s","e":true,"k":"'","d":[515],"c":[]}]]}],["i",{"w":"consi","s":"i","e":false,"k":"i","d":[],"c":[["s",{"w":"consist","s":"st","e":false,"k":"s","d":[],"c":[["s",{"w":"consists","s":"s","e":true,"k":"s","d":[14],"c":[]}],["e",{"w":"consistent","s":"ent","e":true,"k":"e","d":[77,80,202,229,356,366,427],"c":[["l",{"w":"consistently","s":"ly","e":true,"k":"l","d":[126],"c":[]}]]}]]}],["d",{"w":"consider","s":"der","e":true,"k":"d","d":[71,76,77,79,80,81,86,87,90,92,95,96,97,99,100,102,103,104,108,112,114,115,116,119,122,123,125,126,127,128,130,134,137,140,145,149,154,156,160,164,176,177,178,179,180,182,183,187,188,190,191,193,201,202],"c":[["a",{"w":"considerations","s":"ations","e":true,"k":"a","d":[76,77,79,80,81,104,201,202],"c":[]}],["i",{"w":"considering","s":"ing","e":true,"k":"i","d":[86,88,93,97,100,102,104,108,114,116,119,120,125,128,130,133,137,140,145,154,158,163,174,177,178,182,183,187,188],"c":[]}],["e",{"w":"considered","s":"ed","e":true,"k":"e","d":[229],"c":[]}]]}]]}],["u",{"w":"consum","s":"um","e":false,"k":"u","d":[],"c":[["e",{"w":"consume","s":"e","e":true,"k":"e","d":[22,134],"c":[["d",{"w":"consumed","s":"d","e":true,"k":"d","d":[22],"c":[]}],["r",{"w":"consumer-f","s":"r-f","e":false,"k":"r","d":[],"c":[["a",{"w":"consumer-facing","s":"acing","e":true,"k":"a","d":[68],"c":[]}],["r",{"w":"consumer-friendly","s":"riendly","e":true,"k":"r","d":[68],"c":[]}]]}]]}],["p",{"w":"consumption","s":"ption","e":true,"k":"p","d":[125,126,190],"c":[]}]]}],["e",{"w":"conse","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"consensus","s":"nsus","e":true,"k":"n","d":[77,80,142],"c":[]}],["c",{"w":"consectetur","s":"ctetur","e":true,"k":"c","d":[517],"c":[]}]]}]]}],["v",{"w":"conve","s":"ve","e":false,"k":"v","d":[],"c":[["r",{"w":"conver","s":"r","e":false,"k":"r","d":[],"c":[["t",{"w":"convert","s":"t","e":true,"k":"t","d":[72,77,87,88,118,120,133,138,144,153,157,158,179,233,367],"c":[["i",{"w":"converting","s":"ing","e":true,"k":"i","d":[7,87,88,118,120,133,138,142,144,153,157,158,179,185,229,356,361,366],"c":[]}],["e",{"w":"converted","s":"ed","e":true,"k":"e","d":[87,133,158,179,259],"c":[]}],["s",{"w":"converts","s":"s","e":true,"k":"s","d":[87,118,133,138,142,153,157,158,179,351],"c":[]}],["-",{"w":"convert-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"convert-to-","s":"to-","e":false,"k":"t","d":[],"c":[["u",{"w":"convert-to-uint","s":"uint","e":true,"k":"u","d":[118],"c":[]}],["i",{"w":"convert-to-int","s":"int","e":true,"k":"i","d":[153],"c":[]}]]}],["s",{"w":"convert-string-to-","s":"string-to-","e":false,"k":"s","d":[],"c":[["i",{"w":"convert-string-to-int","s":"int","e":true,"k":"i","d":[138],"c":[]}],["u",{"w":"convert-string-to-uint","s":"uint","e":true,"k":"u","d":[157],"c":[]}]]}]]}]]}],["s",{"w":"conversion","s":"sion","e":true,"k":"s","d":[87,94,118,138,153,157,179,226,229,234,368],"c":[["s",{"w":"conversions","s":"s","e":true,"k":"s","d":[118,138,153,157],"c":[]}]]}]]}],["n",{"w":"convenience","s":"nience","e":true,"k":"n","d":[50],"c":[]}]]}],["n",{"w":"connect","s":"nect","e":true,"k":"n","d":[46,50,51,70,71,78,226,227,228,230,232,237,239,240,242,243,244,350,351,352,353,354,355,356,357,366,376,511,513,517],"c":[["e",{"w":"connected","s":"ed","e":true,"k":"e","d":[46,55,352,353,355],"c":[]}],["w",{"w":"connectw","s":"w","e":false,"k":"w","d":[],"c":[["e",{"w":"connectwebsocketclient","s":"ebsocketclient","e":true,"k":"e","d":[65,365],"c":[]}],["a",{"w":"connectwallet","s":"allet","e":true,"k":"a","d":[353,354],"c":[["b",{"w":"connectwalletbutton","s":"button","e":true,"k":"b","d":[352],"c":[]}]]}]]}],["'",{"w":"connect'","s":"'","e":true,"k":"'","d":[237,240,352,353,354,356,357,366],"c":[]}],["-",{"w":"connect-","s":"-","e":false,"k":"-","d":[],"c":[["w",{"w":"connect-wallet-button'","s":"wallet-button'","e":true,"k":"w","d":[352],"c":[]}],["t",{"w":"connect-to-a-users-wallet","s":"to-a-users-wallet","e":true,"k":"t","d":[352,353,354],"c":[]}],["r",{"w":"connect-react","s":"react","e":true,"k":"r","d":[355],"c":[]}]]}],["i",{"w":"connecti","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"connecting","s":"ng","e":true,"k":"n","d":[352,357],"c":[]}],["o",{"w":"connection","s":"on","e":true,"k":"o","d":[352,353,354,355,356,366],"c":[["'",{"w":"connection's","s":"'s","e":true,"k":"'","d":[357],"c":[]}]]}]]}]]}],["d",{"w":"condition","s":"dition","e":true,"k":"d","d":[52,81,99,108,161,163,164,166,173,176,183,191,196,226,229,234,238,368],"c":[["s",{"w":"conditions","s":"s","e":true,"k":"s","d":[51,68,69,73,81,82,83,84,85,89,93,94,98,99,101,105,106,107,108,109,110,111,114,117,118,121,123,131,132,135,138,139,141,142,143,146,147,148,150,151,153,154,155,157,159,161,162,163,165,166,167,168,169,170,171,172,173,175,176,177,178,181,184,185,186,189,191,193,194,195,196,197,198,200,226,234,368,371],"c":[]}],["_",{"w":"condition_code","s":"_code","e":true,"k":"_","d":[51,517],"c":[]}],["a",{"w":"conditional","s":"al","e":true,"k":"a","d":[93,108,110,114,124,128,130,136,139,146,147,154,155,165,170,171,173,176,183,190,191,193,196],"c":[["s",{"w":"conditionals","s":"s","e":true,"k":"s","d":[103],"c":[]}]]}],["0",{"w":"condition01","s":"01","e":true,"k":"0","d":[234,368],"c":[]}]]}],["c",{"w":"conc","s":"c","e":false,"k":"c","d":[],"c":[["e",{"w":"conce","s":"e","e":false,"k":"e","d":[],"c":[["p",{"w":"concept","s":"pt","e":true,"k":"p","d":[119,240,379],"c":[["s",{"w":"concepts","s":"s","e":true,"k":"s","d":[52,229,371,372,373,377,378,517],"c":[]}]]}],["r",{"w":"concern","s":"rn","e":true,"k":"r","d":[188],"c":[]}],["a",{"w":"concealing","s":"aling","e":true,"k":"a","d":[371],"c":[]}],["n",{"w":"concensus","s":"nsus","e":true,"k":"n","d":[371],"c":[]}]]}],["l",{"w":"conclu","s":"lu","e":false,"k":"l","d":[],"c":[["d",{"w":"conclude","s":"de","e":true,"k":"d","d":[69],"c":[["d",{"w":"concluded","s":"d","e":true,"k":"d","d":[69],"c":[]}],["s",{"w":"concludes","s":"s","e":true,"k":"s","d":[69],"c":[]}]]}],["s",{"w":"conclusion","s":"sion","e":true,"k":"s","d":[69,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202],"c":[]}]]}],["a",{"w":"concat","s":"at","e":true,"k":"a","d":[80,82,88,91,110,120,126,149,182,194],"c":[["e",{"w":"concatenat","s":"enat","e":false,"k":"e","d":[],"c":[["e",{"w":"concatenate","s":"e","e":true,"k":"e","d":[88,120,182],"c":[["s",{"w":"concatenates","s":"s","e":true,"k":"s","d":[82,91,110,194],"c":[]}],["d",{"w":"concatenated","s":"d","e":true,"k":"d","d":[182],"c":[]}]]}],["i",{"w":"concatenation","s":"ion","e":true,"k":"i","d":[88,120,182],"c":[["s",{"w":"concatenations","s":"s","e":true,"k":"s","d":[182],"c":[]}]]}]]}]]}],["i",{"w":"concise","s":"ise","e":true,"k":"i","d":[82,83,84,85,89,94,96,98,101,103,105,106,107,109,111,117,118,121,126,131,132,135,138,141,142,143,148,150,151,153,155,157,159,162,165,166,167,168,169,170,171,172,175,181,184,185,186,189,194,195,197,198,199,200],"c":[]}]]}],["g",{"w":"congrat","s":"grat","e":false,"k":"g","d":[],"c":[["u",{"w":"congratulations","s":"ulations","e":true,"k":"u","d":[68,69,71],"c":[]}],["s",{"w":"congrats","s":"s","e":true,"k":"s","d":[515],"c":[]}]]}],["j",{"w":"conjunction","s":"junction","e":true,"k":"j","d":[79,81,115,125,144,155,161,165,180],"c":[]}]]}],["m",{"w":"com","s":"m","e":true,"k":"m","d":[2,8,9,12,14,17,18,27,28,31,45,54,67,68,69,70,71,72,75,203,204,208,219,221,224,225,226,227,228,229,230,232,234,235,236,243,245,257,259,345,346,347,348,349,350,352,355,356,366,368,369,370,373,374,379,380,399,424,459,502,504,509,510,517],"c":[["p",{"w":"comp","s":"p","e":false,"k":"p","d":[],"c":[["o",{"w":"compo","s":"o","e":false,"k":"o","d":[],"c":[["n",{"w":"component","s":"nent","e":true,"k":"n","d":[115,123,141,355,517],"c":[["s",{"w":"components","s":"s","e":true,"k":"s","d":[1,2,3,4,5,6,7,8,9,11,12,13,18,20,21,22,23,26,27,29,30,31,44,45,47,49,51,53,54,64,65,67,68,69,71,73,74,78,94,141,182,203,204,208,224,225,226,227,228,230,231,232,233,234,235,236,239,243,244,245,247,256,257,259,345,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,365,366,367,368,369,370,371,372,373,375,377,378,381,382,383,384,385,386,387,399,419,420,421,422,423,425,443,459,466,467,501,502,504,505,506,507,508,509,510,511,512,513,515,517],"c":[]}]]}],["s",{"w":"compos","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"composit","s":"it","e":false,"k":"i","d":[],"c":[["e",{"w":"composite","s":"e","e":true,"k":"e","d":[79,97],"c":[]}],["i",{"w":"composition","s":"ion","e":true,"k":"i","d":[201],"c":[]}]]}],["a",{"w":"composab","s":"ab","e":false,"k":"a","d":[],"c":[["i",{"w":"composability","s":"ility","e":true,"k":"i","d":[86,90,119,201],"c":[]}],["l",{"w":"composable","s":"le","e":true,"k":"l","d":[90,99],"c":[]}]]}]]}],["u",{"w":"compound","s":"und","e":true,"k":"u","d":[102],"c":[]}]]}],["l",{"w":"compl","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"comple","s":"e","e":false,"k":"e","d":[],"c":[["x",{"w":"complex","s":"x","e":true,"k":"x","d":[12,22,68,76,77,79,81,83,86,87,88,91,93,96,97,99,100,102,108,112,113,116,119,120,123,128,129,130,133,134,137,140,144,155,158,163,165,170,171,173,177,179,182,183,187,192,193,196,202,245,348,371],"c":[["i",{"w":"complexit","s":"it","e":false,"k":"i","d":[],"c":[["y",{"w":"complexity","s":"y","e":true,"k":"y","d":[22,27],"c":[]}],["i",{"w":"complexities","s":"ies","e":true,"k":"i","d":[161],"c":[]}]]}]]}],["t",{"w":"complet","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"completi","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"completion","s":"on","e":true,"k":"o","d":[18,26],"c":[["s",{"w":"completions","s":"s","e":true,"k":"s","d":[18],"c":[]}]]}],["n",{"w":"completing","s":"ng","e":true,"k":"n","d":[26,140,233,367],"c":[]}]]}],["e",{"w":"complete","s":"e","e":true,"k":"e","d":[26,73,79,80,124,136,139,140,146,233,356,366,367,376,427,459,515],"c":[["-",{"w":"complete-escrow","s":"-escrow","e":true,"k":"-","d":[140],"c":[]}],["n",{"w":"completeness","s":"ness","e":true,"k":"n","d":[241],"c":[]}],["d",{"w":"completed","s":"d","e":true,"k":"d","d":[375],"c":[]}]]}]]}],["m",{"w":"complement","s":"ment","e":true,"k":"m","d":[187,229],"c":[]}]]}],["i",{"w":"compliance","s":"iance","e":true,"k":"i","d":[372],"c":[]}]]}],["a",{"w":"compa","s":"a","e":false,"k":"a","d":[],"c":[["t",{"w":"compatib","s":"tib","e":false,"k":"t","d":[],"c":[["l",{"w":"compatible","s":"le","e":true,"k":"l","d":[14,67,105,110,183,189,219,222,226,227,229,233,234,235,355,367,368,369,515],"c":[]}],["i",{"w":"compatibility","s":"ility","e":true,"k":"i","d":[80,87,119,133,158,179,229,351,355,356,366],"c":[]}]]}],["r",{"w":"compar","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"compari","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"comparing","s":"ng","e":true,"k":"n","d":[14,17,81,95,104,114,154,156,173,176,191,219],"c":[]}],["s",{"w":"comparison","s":"son","e":true,"k":"s","d":[108,114,154,176,191],"c":[["s",{"w":"comparisons","s":"s","e":true,"k":"s","d":[114,154,173,176,191],"c":[]}]]}]]}],["e",{"w":"compare","s":"e","e":true,"k":"e","d":[90,114,128,154,173,176,191],"c":[["d",{"w":"compared","s":"d","e":true,"k":"d","d":[79,80,145,173,180],"c":[]}],["s",{"w":"compares","s":"s","e":true,"k":"s","d":[114,154,176,191],"c":[]}]]}]]}],["c",{"w":"compact","s":"ct","e":true,"k":"c","d":[76,113,188,255,371],"c":[["l",{"w":"compactly","s":"ly","e":true,"k":"l","d":[76],"c":[]}],["n",{"w":"compactness","s":"ness","e":true,"k":"n","d":[188],"c":[]}]]}]]}],["u",{"w":"comput","s":"ut","e":false,"k":"u","d":[],"c":[["e",{"w":"compute","s":"e","e":true,"k":"e","d":[84,91,111,181],"c":[["d",{"w":"computed","s":"d","e":true,"k":"d","d":[16,92,134,188],"c":[]}],["s",{"w":"computes","s":"s","e":true,"k":"s","d":[80,84,91,111,162,169,181,188],"c":[]}],["-",{"w":"compute-sha","s":"-sha","e":false,"k":"-","d":[],"c":[["2",{"w":"compute-sha256","s":"256","e":true,"k":"2","d":[84],"c":[]}],["5",{"w":"compute-sha512","s":"512","e":true,"k":"5","d":[181],"c":[["-",{"w":"compute-sha512-256","s":"-256","e":true,"k":"-","d":[111],"c":[]}]]}]]}],["r",{"w":"computer","s":"r","e":true,"k":"r","d":[510],"c":[]}]]}],["a",{"w":"computation","s":"ation","e":true,"k":"a","d":[84,111,134,181,346],"c":[["a",{"w":"computational","s":"al","e":true,"k":"a","d":[50],"c":[["l",{"w":"computationally","s":"ly","e":true,"k":"l","d":[161,177,188],"c":[]}]]}],["s",{"w":"computations","s":"s","e":true,"k":"s","d":[92,96,108],"c":[]}]]}],["i",{"w":"computing","s":"ing","e":true,"k":"i","d":[84,91,111,181],"c":[]}]]}],["r",{"w":"compr","s":"r","e":false,"k":"r","d":[],"c":[["e",{"w":"compre","s":"e","e":false,"k":"e","d":[],"c":[["h",{"w":"comprehensive","s":"hensive","e":true,"k":"h","d":[18,50,64,67,81,82,83,84,85,89,94,98,101,105,106,107,109,110,111,117,118,121,124,125,131,132,135,136,138,139,141,142,143,146,147,148,150,151,153,155,157,159,162,164,165,166,167,168,169,170,172,175,181,184,185,186,189,190,194,195,197,198,200,365,382,383,384,385,386,387],"c":[["l",{"w":"comprehensively","s":"ly","e":true,"k":"l","d":[224],"c":[]}]]}],["s",{"w":"compressed","s":"ssed","e":true,"k":"s","d":[229],"c":[]}]]}],["i",{"w":"comprising","s":"ising","e":true,"k":"i","d":[27],"c":[]}]]}],["e",{"w":"compete","s":"ete","e":true,"k":"e","d":[73],"c":[]}],["i",{"w":"compile","s":"ile","e":true,"k":"i","d":[226,234,368],"c":[]}]]}],["e",{"w":"come","s":"e","e":true,"k":"e","d":[51,224,356,366],"c":[["s",{"w":"comes","s":"s","e":true,"k":"s","d":[9,22,53,68,71,224,229],"c":[]}]]}],["m",{"w":"comm","s":"m","e":false,"k":"m","d":[],"c":[["a",{"w":"command","s":"and","e":true,"k":"a","d":[9,12,18,20,21,22,26,27,28,30,58,68,69,71,75,224,244,245,246,258,348,374,375,376,377,378,379,426,444,504,509,515,517],"c":[["s",{"w":"commands","s":"s","e":true,"k":"s","d":[18,23,26,378,379,423],"c":[]}]]}],["u",{"w":"commu","s":"u","e":false,"k":"u","d":[],"c":[["n",{"w":"communi","s":"ni","e":false,"k":"n","d":[],"c":[["t",{"w":"community","s":"ty","e":true,"k":"t","d":[13,69,72,73,74,355,425,443],"c":[]}],["c",{"w":"communicat","s":"cat","e":false,"k":"c","d":[],"c":[["i",{"w":"communicati","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"communication","s":"on","e":true,"k":"o","d":[86,144,355],"c":[]}],["n",{"w":"communicating","s":"ng","e":true,"k":"n","d":[233,367],"c":[]}]]}],["e",{"w":"communicate","s":"e","e":true,"k":"e","d":[164,355,374],"c":[]}]]}]]}],["t",{"w":"commutative","s":"tative","e":true,"k":"t","d":[96],"c":[]}]]}],["o",{"w":"common","s":"on","e":true,"k":"o","d":[18,24,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,229,236,239,244,259,370],"c":[["l",{"w":"commonly","s":"ly","e":true,"k":"l","d":[144,188,244],"c":[]}],["'",{"w":"common'","s":"'","e":true,"k":"'","d":[226,234,236,368,370],"c":[]}]]}],["i",{"w":"commit","s":"it","e":true,"k":"i","d":[19,226,234,368],"c":[]}],["e",{"w":"comment","s":"ent","e":true,"k":"e","d":[199],"c":[["s",{"w":"comments","s":"s","e":true,"k":"s","d":[128,130,517],"c":[]}],["i",{"w":"commenting","s":"ing","e":true,"k":"i","d":[199],"c":[]}]]}]]}],["'",{"w":"com'","s":"'","e":true,"k":"'","d":[67,226,227,356,366],"c":[]}],["b",{"w":"combin","s":"bin","e":false,"k":"b","d":[],"c":[["e",{"w":"combine","s":"e","e":true,"k":"e","d":[76,77,80,82,83,84,85,88,89,91,93,94,98,101,103,105,106,107,108,109,110,111,113,116,117,118,120,121,124,126,130,131,132,135,136,138,139,141,142,143,146,148,149,150,151,153,155,157,159,162,165,166,167,168,169,170,171,172,173,175,181,182,184,185,186,189,192,193,194,195,196,197,198,200],"c":[["s",{"w":"combines","s":"s","e":true,"k":"s","d":[70,73,188,202],"c":[]}],["d",{"w":"combined","s":"d","e":true,"k":"d","d":[102,122,160,233,367],"c":[]}]]}],["i",{"w":"combining","s":"ing","e":true,"k":"i","d":[76,79,88,97,102,108,113,114,120,125,126,128,130,137,140,145,149,154,161,174,176,182,187,189,190,191,192,196],"c":[]}],["a",{"w":"combination","s":"ation","e":true,"k":"a","d":[77,80,81,86,90,103,108,113,116,119,124,125,128,130,134,136,139,145,146,147,164,174,177,180,182,187,190,193,201,514],"c":[]}]]}],["i",{"w":"coming","s":"ing","e":true,"k":"i","d":[73,219,220,222],"c":[]}]]}],["l",{"w":"col","s":"l","e":false,"k":"l","d":[],"c":[["l",{"w":"coll","s":"l","e":false,"k":"l","d":[],"c":[["a",{"w":"collaps","s":"aps","e":false,"k":"a","d":[],"c":[["i",{"w":"collapsible","s":"ible","e":true,"k":"i","d":[4,358,362,377,379],"c":[]}],["e",{"w":"collapse","s":"e","e":true,"k":"e","d":[517],"c":[["d",{"w":"collapsed","s":"d","e":true,"k":"d","d":[517],"c":[]}]]}]]}],["e",{"w":"collecti","s":"ecti","e":false,"k":"e","d":[],"c":[["o",{"w":"collection","s":"on","e":true,"k":"o","d":[27,44,228,350],"c":[["s",{"w":"collections","s":"s","e":true,"k":"s","d":[82,96],"c":[]}]]}],["b",{"w":"collectibles","s":"bles","e":true,"k":"b","d":[122],"c":[]}]]}],["i",{"w":"collision","s":"ision","e":true,"k":"i","d":[188],"c":[["-",{"w":"collision-resistant","s":"-resistant","e":true,"k":"-","d":[91,188],"c":[]}],["s",{"w":"collisions","s":"s","e":true,"k":"s","d":[122],"c":[]}]]}]]}],["u",{"w":"column","s":"umn","e":true,"k":"u","d":[22,52],"c":[["s",{"w":"columns","s":"s","e":true,"k":"s","d":[52,517],"c":[]}]]}],["o",{"w":"color","s":"or","e":true,"k":"o","d":[517],"c":[["s",{"w":"colors","s":"s","e":true,"k":"s","d":[517],"c":[]}]]}]]}],["d",{"w":"code","s":"de","e":true,"k":"d","d":[6,7,9,12,18,21,22,28,30,31,44,47,50,53,67,68,69,71,72,73,76,78,82,83,84,85,86,88,89,90,91,92,93,94,96,98,99,101,103,105,106,107,109,110,111,116,117,118,120,121,124,128,129,131,132,134,135,136,138,139,141,142,143,146,147,148,150,151,152,153,155,157,159,162,163,164,165,166,167,168,169,170,171,172,173,175,180,181,183,184,185,186,187,189,192,193,194,195,196,197,198,199,200,201,224,226,227,229,230,231,232,234,239,240,243,245,246,259,348,351,352,353,354,355,356,357,360,361,366,368,374,376,378,423,509,511,513,516,517],"c":[["s",{"w":"codes","s":"s","e":true,"k":"s","d":[65,69,124,136,164,193,439,462],"c":[["n",{"w":"codesnippet","s":"nippet","e":true,"k":"n","d":[7,361],"c":[]}],["p",{"w":"codespaces","s":"paces","e":true,"k":"p","d":[53],"c":[]}]]}],["x",{"w":"codex","s":"x","e":true,"k":"x","d":[70],"c":[]}],["'",{"w":"code's","s":"'s","e":true,"k":"'","d":[201],"c":[]}],["b",{"w":"codeb","s":"b","e":false,"k":"b","d":[],"c":[["o",{"w":"codebody","s":"ody","e":true,"k":"o","d":[226,230,234,353,368],"c":[]}],["a",{"w":"codebase","s":"ase","e":true,"k":"a","d":[229],"c":[]}],["l",{"w":"codeblock","s":"lock","e":true,"k":"l","d":[517],"c":[["s",{"w":"codeblocks","s":"s","e":true,"k":"s","d":[517],"c":[]}]]}]]}],["t",{"w":"codetabs","s":"tabs","e":true,"k":"t","d":[517],"c":[]}],["h",{"w":"codehike","s":"hike","e":true,"k":"h","d":[517],"c":[]}],["y",{"w":"codeyou","s":"you","e":true,"k":"y","d":[517],"c":[]}]]}],["u",{"w":"cou","s":"u","e":false,"k":"u","d":[],"c":[["n",{"w":"count","s":"nt","e":true,"k":"n","d":[6,7,9,22,30,55,79,246,356,360,361,366,517],"c":[["e",{"w":"counter","s":"er","e":true,"k":"e","d":[6,7,9,11,22,26,27,30,99,100,137,246,360,361,375,381,505,516,517],"c":[["s",{"w":"counters","s":"s","e":true,"k":"s","d":[22,26,30,100,137,140,356,366,517],"c":[["'",{"w":"counters'","s":"'","e":true,"k":"'","d":[356,366],"c":[]}]]}],["_",{"w":"counter_test","s":"_test","e":true,"k":"_","d":[246],"c":[]}]]}],["-",{"w":"count-","s":"-","e":false,"k":"-","d":[],"c":[["u",{"w":"count-up","s":"up","e":true,"k":"u","d":[9,22,26,30,517],"c":[]}],["t",{"w":"count-twice","s":"twice","e":true,"k":"t","d":[26],"c":[]}]]}],["u",{"w":"countupcall","s":"upcall","e":true,"k":"u","d":[9],"c":[]}],["s",{"w":"counts","s":"s","e":true,"k":"s","d":[79],"c":[]}],["1",{"w":"count1","s":"1","e":true,"k":"1","d":[246],"c":[]}],["2",{"w":"count2","s":"2","e":true,"k":"2","d":[246],"c":[]}]]}],["l",{"w":"could","s":"ld","e":true,"k":"l","d":[13,68,71,87,133,158,177,179,192,196,201,257,345],"c":[]}],["r",{"w":"course","s":"rse","e":true,"k":"r","d":[69,511,513],"c":[]}],["p",{"w":"couple","s":"ple","e":true,"k":"p","d":[515],"c":[]}]]}],["v",{"w":"cover","s":"ver","e":true,"k":"v","d":[69,224],"c":[["a",{"w":"coverage","s":"age","e":true,"k":"a","d":[9,12,224,245,348],"c":[]}],["e",{"w":"covered","s":"ed","e":true,"k":"e","d":[73,170],"c":[]}],["s",{"w":"covers","s":"s","e":true,"k":"s","d":[73,78],"c":[]}],["i",{"w":"covering","s":"ing","e":true,"k":"i","d":[170,224],"c":[]}]]}],["s",{"w":"cost","s":"st","e":true,"k":"s","d":[9,22,25,27,50,161,259],"c":[["s",{"w":"costs","s":"s","e":true,"k":"s","d":[22,26,27,76,79,86,92,95,97,99,122,127,134,144,156,177,178,202],"c":[["-",{"w":"costs-reports","s":"-reports","e":true,"k":"-","d":[9],"c":[]}]]}],["_",{"w":"cost_result","s":"_result","e":true,"k":"_","d":[9],"c":[]}],["-",{"w":"cost-efficiency","s":"-efficiency","e":true,"k":"-","d":[50],"c":[]}]]}],["r",{"w":"cor","s":"r","e":false,"k":"r","d":[],"c":[["r",{"w":"corre","s":"re","e":false,"k":"r","d":[],"c":[["c",{"w":"correct","s":"ct","e":true,"k":"c","d":[91,124,136,139,144,146,147,161,171,259],"c":[["l",{"w":"correctly","s":"ly","e":true,"k":"l","d":[12,68,84,86,94,95,98,111,115,117,131,132,138,141,142,144,156,157,162,167,169,175,181,185,186,195,198,200,224,245,258,348],"c":[]}]]}],["s",{"w":"correspond","s":"spond","e":true,"k":"s","d":[14],"c":[["i",{"w":"corresponding","s":"ing","e":true,"k":"i","d":[27,52,69,71,226,233,234,354,367,368],"c":[]}]]}]]}],["e",{"w":"core","s":"e","e":true,"k":"e","d":[27,69,71,76,77,79,80,99,201,202,226,227,379,515,516],"c":[["n",{"w":"corenode","s":"node","e":true,"k":"n","d":[226,227],"c":[]}]]}]]}],["p",{"w":"copy","s":"py","e":true,"k":"p","d":[12,27,47,52,224,245,348,517],"c":[]}],["o",{"w":"cookbook","s":"okbook","e":true,"k":"o","d":[72,73],"c":[]}],["i",{"w":"coinbase","s":"inbase","e":true,"k":"i","d":[255,259],"c":[["p",{"w":"coinbasepayload","s":"payload","e":true,"k":"p","d":[229],"c":[["w",{"w":"coinbasepayloadwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}],["_",{"w":"coinbase_payload","s":"_payload","e":true,"k":"_","d":[255],"c":[]}]]}]]}],["a",{"w":"ca","s":"a","e":false,"k":"a","d":[],"c":[["r",{"w":"car","s":"r","e":false,"k":"r","d":[],"c":[["d",{"w":"card","s":"d","e":true,"k":"d","d":[9,12,13,18,44,45,47,53,224,228,230,231,232,239,243,245,246,348,352,353,354,357,374,376,377,378,379,427,466,504,508,509,510,511,513,515,516],"c":[["'",{"w":"card'","s":"'","e":true,"k":"'","d":[2,8,9,11,31,44,54,73,78,203,204,208,225,228,239,243,256,257,345,347,349,350,373,381,399,420,423,459,466,501,502,505,509,511,513],"c":[]}],["s",{"w":"cards","s":"s","e":true,"k":"s","d":[8,9,11,12,13,18,22,26,27,30,31,44,45,47,53,54,78,208,224,228,230,231,232,243,245,246,256,348,350,352,353,354,357,373,374,376,377,378,379,381,399,420,423,427,459,466,501,502,504,505,508,509,510,511,513,515,516],"c":[]}]]}],["g",{"w":"cargo","s":"go","e":true,"k":"g","d":[18,380,424,502,504,517],"c":[]}],["e",{"w":"care","s":"e","e":true,"k":"e","d":[28],"c":[["f",{"w":"careful","s":"ful","e":true,"k":"f","d":[86],"c":[["l",{"w":"carefully","s":"ly","e":true,"k":"l","d":[76,100,129,160,187],"c":[]}]]}]]}]]}],["l",{"w":"cal","s":"l","e":false,"k":"l","d":[],"c":[["l",{"w":"call","s":"l","e":true,"k":"l","d":[2,4,7,8,9,11,12,18,19,22,27,28,30,31,45,50,54,68,71,81,86,90,99,123,129,134,152,164,201,203,204,208,219,222,224,225,226,228,230,234,245,257,345,347,348,349,350,353,356,358,361,362,366,368,372,373,376,377,381,399,459,502,505,514],"c":[["o",{"w":"callout","s":"out","e":true,"k":"o","d":[2,8,9,10,11,12,16,18,20,21,22,24,25,26,27,31,45,47,48,49,50,51,52,53,54,68,69,71,78,104,156,203,204,208,221,222,224,225,228,229,230,231,232,233,234,235,236,238,241,242,243,245,246,256,257,345,347,348,349,350,352,353,354,355,356,366,367,368,369,370,371,373,374,375,376,377,378,379,381,399,420,426,444,459,501,502,504,505,510,515,516,517],"c":[["s",{"w":"callouts","s":"s","e":true,"k":"s","d":[517],"c":[]}]]}],["p",{"w":"callp","s":"p","e":false,"k":"p","d":[],"c":[["u",{"w":"callpublicfn","s":"ublicfn","e":true,"k":"u","d":[6,7,9,12,224,245,246,348,360,361],"c":[]}],["r",{"w":"callprivatefn","s":"rivatefn","e":true,"k":"r","d":[7,361],"c":[]}]]}],["r",{"w":"callreadonlyf","s":"readonlyf","e":false,"k":"r","d":[],"c":[["n",{"w":"callreadonlyfn","s":"n","e":true,"k":"n","d":[6,7,9,12,224,245,348,360,361],"c":[]}],["u",{"w":"callreadonlyfunction","s":"unction","e":true,"k":"u","d":[69,71,226,229,234,368,514],"c":[]}]]}],["e",{"w":"calle","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"called","s":"d","e":true,"k":"d","d":[9,30,51,52,68,69,71,81,86,90,99,123,129,134,152,178,226,229,234,246,356,366,368,377,515,516],"c":[]}],["r",{"w":"caller","s":"r","e":true,"k":"r","d":[69,71,81,90,94,123,141,147,164,192,200,511,513],"c":[["s",{"w":"callers","s":"s","e":true,"k":"s","d":[129,164],"c":[]}]]}]]}],["s",{"w":"calls","s":"s","e":true,"k":"s","d":[19,26,30,50,51,55,65,68,69,86,90,119,124,136,139,146,152,182,192,227,231,236,237,353,370,372,377,379,439,462,514,516],"c":[]}],["i",{"w":"calling","s":"ing","e":true,"k":"i","d":[22,30,71,81,86,129,193,224,226,230,234,259,357,368,377,516],"c":[]}],["b",{"w":"callback","s":"back","e":true,"k":"b","d":[69,90],"c":[["s",{"w":"callbacks","s":"s","e":true,"k":"s","d":[355],"c":[]}]]}],["a",{"w":"callable","s":"able","e":true,"k":"a","d":[129],"c":[]}],["-",{"w":"call-","s":"-","e":false,"k":"-","d":[],"c":[["r",{"w":"call-read","s":"read","e":true,"k":"r","d":[259,414],"c":[]}],["c",{"w":"call-cast-vote","s":"cast-vote","e":true,"k":"c","d":[377],"c":[]}]]}],["c",{"w":"callcontract","s":"contract","e":true,"k":"c","d":[353],"c":[]}],["_",{"w":"call_read_only_function","s":"_read_only_function","e":true,"k":"_","d":[514],"c":[]}]]}],["c",{"w":"calculat","s":"culat","e":false,"k":"c","d":[],"c":[["e",{"w":"calculate","s":"e","e":true,"k":"e","d":[12,77,96,102,106,107,112,140,176,185,191,197,245,348],"c":[["-",{"w":"calculate-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"calculate-accrued-interest","s":"accrued-interest","e":true,"k":"a","d":[12,245,348],"c":[]}],["r",{"w":"calculate-re","s":"re","e":false,"k":"r","d":[],"c":[["w",{"w":"calculate-rewards","s":"wards","e":true,"k":"w","d":[77],"c":[]}],["m",{"w":"calculate-remainder","s":"mainder","e":true,"k":"m","d":[197],"c":[]}]]}],["p",{"w":"calculate-price-per-item","s":"price-per-item","e":true,"k":"p","d":[77],"c":[]}],["i",{"w":"calculate-interest","s":"interest","e":true,"k":"i","d":[77],"c":[]}],["s",{"w":"calculate-s","s":"s","e":false,"k":"s","d":[],"c":[["q",{"w":"calculate-sqrti","s":"qrti","e":true,"k":"q","d":[106],"c":[]}],["u",{"w":"calculate-sum","s":"um","e":true,"k":"u","d":[171],"c":[]}]]}],["l",{"w":"calculate-log2","s":"log2","e":true,"k":"l","d":[107],"c":[]}]]}],["d",{"w":"calculated","s":"d","e":true,"k":"d","d":[12,245,348,516],"c":[]}],["s",{"w":"calculates","s":"s","e":true,"k":"s","d":[71,106,107,171,185,197],"c":[]}]]}],["i",{"w":"calculati","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"calculating","s":"ng","e":true,"k":"n","d":[22,71,77,102,106,107,112,140,171,185,197],"c":[]}],["o",{"w":"calculation","s":"on","e":true,"k":"o","d":[77,106],"c":[["s",{"w":"calculations","s":"s","e":true,"k":"s","d":[77,78,102,106,107,112,134,137,140,185,197],"c":[]}]]}]]}],["o",{"w":"calculator","s":"or","e":true,"k":"o","d":[77],"c":[]}]]}]]}],["n",{"w":"can","s":"n","e":true,"k":"n","d":[6,7,8,9,12,14,15,16,17,18,19,20,22,23,25,26,27,28,29,30,31,45,46,47,49,50,51,52,53,54,58,67,68,69,71,72,73,74,75,76,77,79,80,81,86,87,88,90,92,95,96,97,99,100,102,103,108,109,112,113,114,115,116,119,120,123,125,126,128,129,130,133,134,137,140,147,149,152,153,154,156,158,161,163,171,176,177,178,179,180,182,188,190,191,192,193,194,201,202,208,219,221,223,224,226,227,228,229,230,231,232,233,234,236,237,238,239,241,242,243,244,245,246,255,259,346,348,350,352,353,354,355,356,357,360,361,366,367,368,370,371,373,374,375,376,377,378,379,422,425,426,427,443,444,459,502,509,511,513,515,516,517],"c":[["n",{"w":"cann","s":"n","e":false,"k":"n","d":[],"c":[["o",{"w":"cannot","s":"ot","e":true,"k":"o","d":[14,49,71,86,100,115,142,259],"c":[]}],["y",{"w":"canny","s":"y","e":true,"k":"y","d":[46],"c":[]}]]}],["'",{"w":"can't","s":"'t","e":true,"k":"'","d":[77,79,97,193,202,234,238,368],"c":[]}],["o",{"w":"canonical","s":"onical","e":true,"k":"o","d":[219,222,255],"c":[]}],["c",{"w":"cancel","s":"cel","e":true,"k":"c","d":[511,513],"c":[["e",{"w":"canceled'","s":"ed'","e":true,"k":"e","d":[237],"c":[]}],["l",{"w":"cancell","s":"l","e":false,"k":"l","d":[],"c":[["i",{"w":"cancelling","s":"ing","e":true,"k":"i","d":[511,513],"c":[]}],["e",{"w":"cancelled","s":"ed","e":true,"k":"e","d":[511,513],"c":[]}]]}],["-",{"w":"cancel-listing","s":"-listing","e":true,"k":"-","d":[511,513],"c":[]}]]}]]}],["s",{"w":"cas","s":"s","e":false,"k":"s","d":[],"c":[["e",{"w":"case","s":"e","e":true,"k":"e","d":[19,68,69,76,77,79,80,81,88,89,91,95,100,101,104,110,120,121,126,127,132,135,139,144,146,147,149,156,167,172,173,178,180,183,186,190,193,195,201,202,224,229,238,346,376,377,378,423],"c":[["s",{"w":"cases","s":"s","e":true,"k":"s","d":[9,78,82,83,84,85,88,89,91,93,94,97,98,99,101,102,105,106,109,110,111,112,114,116,117,118,119,120,121,123,124,131,132,133,135,136,137,138,139,140,141,142,143,144,146,147,148,150,151,153,154,155,157,158,159,162,164,165,166,167,168,169,170,172,173,175,176,180,181,183,184,186,189,191,193,194,195,196,198,200,201,224,229,354],"c":[]}],["-",{"w":"case-sensitive","s":"-sensitive","e":true,"k":"-","d":[116],"c":[]}]]}],["t",{"w":"cast","s":"t","e":true,"k":"t","d":[79,202,377],"c":[["-",{"w":"cast-vote","s":"-vote","e":true,"k":"-","d":[79,202,377,379],"c":[]}]]}]]}],["t",{"w":"cat","s":"t","e":true,"k":"t","d":[16],"c":[["c",{"w":"catch","s":"ch","e":true,"k":"c","d":[12,14,17,224,245,348,355,356,366,514,517],"c":[]}],["e",{"w":"cate","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"cater","s":"r","e":true,"k":"r","d":[19],"c":[]}],["g",{"w":"categor","s":"gor","e":false,"k":"g","d":[],"c":[["i",{"w":"categories","s":"ies","e":true,"k":"i","d":[22],"c":[]}],["y",{"w":"category","s":"y","e":true,"k":"y","d":[22,44],"c":[]}]]}]]}]]}],["c",{"w":"cach","s":"ch","e":false,"k":"c","d":[],"c":[["e",{"w":"cache","s":"e","e":true,"k":"e","d":[27,127,202,355,374,376],"c":[["s",{"w":"caches","s":"s","e":true,"k":"s","d":[355],"c":[]}],["d",{"w":"cached","s":"d","e":true,"k":"d","d":[378,427,459],"c":[]}]]}],["i",{"w":"caching","s":"ing","e":true,"k":"i","d":[95,104,125,156,190],"c":[]}]]}],["m",{"w":"campaign","s":"mpaign","e":true,"k":"m","d":[53],"c":[]}],["p",{"w":"cap","s":"p","e":true,"k":"p","d":[125,178],"c":[["t",{"w":"capture","s":"ture","e":true,"k":"t","d":[68,376],"c":[["s",{"w":"captures","s":"s","e":true,"k":"s","d":[377],"c":[]}]]}],["a",{"w":"capabilit","s":"abilit","e":false,"k":"a","d":[],"c":[["i",{"w":"capabilities","s":"ies","e":true,"k":"i","d":[70,73,177],"c":[]}],["y",{"w":"capability","s":"y","e":true,"k":"y","d":[163],"c":[]}]]}]]}],["u",{"w":"cau","s":"u","e":false,"k":"u","d":[],"c":[["t",{"w":"cautio","s":"tio","e":false,"k":"t","d":[],"c":[["u",{"w":"cautious","s":"us","e":true,"k":"u","d":[79,81,113,115,174,178],"c":[]}],["n",{"w":"caution","s":"n","e":true,"k":"n","d":[115,144],"c":[]}]]}],["s",{"w":"caus","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"causing","s":"ing","e":true,"k":"i","d":[82,83,84,85,89,91,93,94,98,101,105,106,107,109,110,111,116,117,118,121,131,132,135,138,139,141,142,143,146,147,148,150,151,153,155,157,159,162,165,166,167,168,169,170,172,175,180,181,184,186,189,194,195,197,198,200],"c":[]}],["e",{"w":"cause","s":"e","e":true,"k":"e","d":[99,134,164,185,229],"c":[["s",{"w":"causes","s":"s","e":true,"k":"s","d":[112,118,166,193],"c":[]}],["d",{"w":"caused","s":"d","e":true,"k":"d","d":[229],"c":[]}]]}]]}]]}],["k",{"w":"cake","s":"ke","e":true,"k":"k","d":[239],"c":[]}]]}],["l",{"w":"cl","s":"l","e":true,"k":"l","d":[6,7,9,12,72,224,229,230,231,234,238,245,246,348,353,354,356,360,361,366,368],"c":[["a",{"w":"cla","s":"a","e":false,"k":"a","d":[],"c":[["r",{"w":"clar","s":"r","e":true,"k":"r","d":[6,7,9,12,20,21,25,27,30,47,69,71,221,224,245,348,360,361,375,377,517],"c":[["i",{"w":"clari","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"clarinet","s":"net","e":true,"k":"n","d":[2,4,8,9,11,12,18,19,20,21,22,23,24,25,26,27,28,29,30,44,45,47,50,69,71,203,204,219,221,224,225,228,241,245,246,256,347,348,349,350,358,362,373,375,381,501,505,516,517],"c":[["-",{"w":"clarinet-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"clarinet-sdk","s":"sdk","e":true,"k":"s","d":[10,246],"c":[["'",{"w":"clarinet-sdk'","s":"'","e":true,"k":"'","d":[4,7,358,361,362],"c":[]}]]}],["j",{"w":"clarinet-js-sdk","s":"js-sdk","e":true,"k":"j","d":[8,9,11,12,18,22,26,27,30,224,245,246,348,381,505],"c":[]}],["l",{"w":"clarinet-linux-x64","s":"linux-x64","e":true,"k":"l","d":[18,517],"c":[["-",{"w":"clarinet-linux-x64-glibc","s":"-glibc","e":true,"k":"-","d":[18,517],"c":[]}]]}],["c",{"w":"clarinet-cli","s":"cli","e":true,"k":"c","d":[27],"c":[]}],["g",{"w":"clarinet-generated","s":"generated","e":true,"k":"g","d":[47],"c":[]}]]}],["'",{"w":"clarinet's","s":"'s","e":true,"k":"'","d":[219],"c":[]}]]}],["t",{"w":"clarity","s":"ty","e":true,"k":"t","d":[6,7,8,9,12,18,21,22,26,27,28,30,52,64,69,70,71,72,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,219,221,224,226,229,234,244,245,259,348,351,353,355,356,360,361,365,366,368,377,379,382,383,384,385,386,387,511,513,514,516,517],"c":[["t",{"w":"claritytype","s":"type","e":true,"k":"t","d":[6,229,360,514],"c":[]}],["v",{"w":"clarityv","s":"v","e":false,"k":"v","d":[],"c":[["a",{"w":"clarityvalue","s":"alue","e":true,"k":"a","d":[6,7,226,234,360,361,368],"c":[]}],["e",{"w":"clarityversion","s":"ersion","e":true,"k":"e","d":[7,234,353,356,361,366,368],"c":[]}]]}],["-",{"w":"clarity-","s":"-","e":false,"k":"-","d":[],"c":[["v",{"w":"clarity-v","s":"v","e":false,"k":"v","d":[],"c":[["a",{"w":"clarity-value","s":"alue","e":true,"k":"a","d":[7,361],"c":[]}],["e",{"w":"clarity-version","s":"ersion","e":true,"k":"e","d":[25,27],"c":[]}]]}],["e",{"w":"clarity-examples","s":"examples","e":true,"k":"e","d":[12,224,245,348],"c":[]}],["l",{"w":"clarity-l","s":"l","e":false,"k":"l","d":[],"c":[["s",{"w":"clarity-lsp","s":"sp","e":true,"k":"s","d":[18],"c":[]}],["a",{"w":"clarity-lang","s":"ang","e":true,"k":"a","d":[22,27],"c":[]}]]}],["c",{"w":"clarity-codex","s":"codex","e":true,"k":"c","d":[70],"c":[]}],["t",{"w":"clarity-type-system","s":"type-system","e":true,"k":"t","d":[226,234,368],"c":[]}],["r",{"w":"clarity-representation","s":"representation","e":true,"k":"r","d":[229],"c":[]}]]}],["e",{"w":"clarityevent","s":"event","e":true,"k":"e","d":[7,361],"c":[]}],["_",{"w":"clarity_","s":"_","e":true,"k":"_","d":[26],"c":[["v",{"w":"clarity_version","s":"version","e":true,"k":"v","d":[7,20,30,221,361],"c":[]}]]}],["2",{"w":"clarity2","s":"2","e":true,"k":"2","d":[7,361],"c":[]}],["'",{"w":"clarity's","s":"'s","e":true,"k":"'","d":[71,76,77,79,80,81,201,202],"c":[]}],["a",{"w":"clarityabi","s":"abi","e":true,"k":"a","d":[226,234,368],"c":[]}],["w",{"w":"claritywiretype","s":"wiretype","e":true,"k":"w","d":[229],"c":[]}],["c",{"w":"claritycode","s":"code","e":true,"k":"c","d":[234,356,366,368],"c":[]}],["m",{"w":"claritymessage","s":"message","e":true,"k":"m","d":[356,366],"c":[]}],["d",{"w":"claritydomain","s":"domain","e":true,"k":"d","d":[356,366],"c":[]}]]}]]}],["'",{"w":"clar'","s":"'","e":true,"k":"'","d":[20,27,30,221,226,234,368],"c":[]}]]}],["s",{"w":"class","s":"ss","e":true,"k":"s","d":[122,226,227,234,355,368],"c":[["n",{"w":"classname","s":"name","e":true,"k":"n","d":[2,4,5,6,7,8,9,11,13,18,20,27,29,30,31,44,45,54,67,74,203,204,208,225,226,227,228,229,230,239,244,246,256,257,259,345,347,349,350,352,353,358,359,360,361,362,371,372,373,375,377,379,381,399,420,423,425,443,459,466,501,502,505,508,517],"c":[]}],["e",{"w":"classes","s":"es","e":true,"k":"e","d":[122,226,234,355,368],"c":[]}],["i",{"w":"classic","s":"ic","e":true,"k":"i","d":[219,222],"c":[]}]]}],["i",{"w":"claim","s":"im","e":true,"k":"i","d":[71,102,176,191,352,516],"c":[["-",{"w":"claim-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"claim-tokens","s":"tokens","e":true,"k":"t","d":[102,176,191,202],"c":[]}],["p",{"w":"claim-period-reward","s":"period-reward","e":true,"k":"p","d":[202],"c":[]}],["r",{"w":"claim-rewards","s":"rewards","e":true,"k":"r","d":[516],"c":[]}],["s",{"w":"claim-stacking-reward","s":"stacking-reward","e":true,"k":"s","d":[516],"c":[]}]]}],["a",{"w":"claimable","s":"able","e":true,"k":"a","d":[191],"c":[["-",{"w":"claimable-amount","s":"-amount","e":true,"k":"-","d":[176],"c":[]}],["a",{"w":"claimableamount","s":"amount","e":true,"k":"a","d":[191],"c":[]}]]}],["e",{"w":"claimed","s":"ed","e":true,"k":"e","d":[176,191],"c":[]}],["s",{"w":"claims","s":"s","e":true,"k":"s","d":[516],"c":[]}]]}],["u",{"w":"clauses","s":"uses","e":true,"k":"u","d":[193],"c":[]}]]}],["o",{"w":"clo","s":"o","e":false,"k":"o","d":[],"c":[["s",{"w":"close","s":"se","e":true,"k":"s","d":[14,17],"c":[]}],["u",{"w":"cloud","s":"ud","e":true,"k":"u","d":[44],"c":[]}],["n",{"w":"clone","s":"ne","e":true,"k":"n","d":[47,53,69,71,75,380,424,502,504,509],"c":[["-",{"w":"clone-the-sta","s":"-the-sta","e":false,"k":"-","d":[],"c":[["r",{"w":"clone-the-starter-template","s":"rter-template","e":true,"k":"r","d":[71],"c":[]}],["c",{"w":"clone-the-stacks-blockchain-docker-repository","s":"cks-blockchain-docker-repository","e":true,"k":"c","d":[509],"c":[]}]]}],["d",{"w":"cloned","s":"d","e":true,"k":"d","d":[75],"c":[]}]]}]]}],["i",{"w":"cli","s":"i","e":true,"k":"i","d":[30,224,229,239,244,378],"c":[["-",{"w":"cli-commands","s":"-commands","e":true,"k":"-","d":[22,26,27],"c":[]}],["c",{"w":"click","s":"ck","e":true,"k":"c","d":[46,47,48,49,50,51,53,68,243,378,515],"c":[["i",{"w":"clicking","s":"ing","e":true,"k":"i","d":[47,49,51,52,53],"c":[]}]]}],["e",{"w":"client","s":"ent","e":true,"k":"e","d":[58,64,65,223,229,233,236,244,258,346,365,367,370,382,383,384,385,386,387],"c":[["s",{"w":"clients","s":"s","e":true,"k":"s","d":[233,258,259,367],"c":[]}]]}],["p",{"w":"clipboard-write","s":"pboard-write","e":true,"k":"p","d":[70,72],"c":[]}]]}],["e",{"w":"clea","s":"ea","e":false,"k":"e","d":[],"c":[["r",{"w":"clear","s":"r","e":true,"k":"r","d":[73,76,82,83,84,85,89,94,98,100,101,105,106,107,109,111,113,117,118,119,121,131,132,135,138,141,142,143,148,150,151,153,155,157,159,162,165,166,167,168,169,170,171,172,175,181,184,185,186,189,193,194,195,196,197,198,199,200,201],"c":[["i",{"w":"clearing","s":"ing","e":true,"k":"i","d":[76,113],"c":[]}],["l",{"w":"clearly","s":"ly","e":true,"k":"l","d":[96,99,113,121,129,134,229],"c":[]}],["-",{"w":"clear-all-flags-except","s":"-all-flags-except","e":true,"k":"-","d":[187],"c":[]}],["s",{"w":"clears","s":"s","e":true,"k":"s","d":[352,356,357,366],"c":[]}]]}],["n",{"w":"clean","s":"n","e":true,"k":"n","d":[89,103,189,201,511,513],"c":[["e",{"w":"cleaner","s":"er","e":true,"k":"e","d":[96],"c":[]}],["s",{"w":"cleans","s":"s","e":true,"k":"s","d":[257,345],"c":[]}]]}]]}],["u",{"w":"cluttered","s":"uttered","e":true,"k":"u","d":[199],"c":[]}]]}],["h",{"w":"ch","s":"h","e":false,"k":"h","d":[],"c":[["a",{"w":"cha","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"chan","s":"n","e":false,"k":"n","d":[],"c":[["n",{"w":"channel","s":"nel","e":true,"k":"n","d":[2,8,18,31,45,46,49,54,73,74,78,203,204,208,225,228,257,345,347,349,350,373,399,422,425,427,443,459,502],"c":[]}],["g",{"w":"chang","s":"g","e":false,"k":"g","d":[],"c":[["i",{"w":"changing","s":"ing","e":true,"k":"i","d":[12,86,101,202,224,245,348],"c":[]}],["e",{"w":"change","s":"e","e":true,"k":"e","d":[27,50,51,71,92,100,101,125,134,190,233,356,366,367,516,517],"c":[["s",{"w":"changes","s":"s","e":true,"k":"s","d":[27,52,67,71,125,128,134,164,192,202,219,226,229,234,355,368,376],"c":[]}],["a",{"w":"changeable","s":"able","e":true,"k":"a","d":[100],"c":[]}]]}]]}],["c",{"w":"chance","s":"ce","e":true,"k":"c","d":[516],"c":[]}]]}],["t",{"w":"chat","s":"t","e":true,"k":"t","d":[2,8,18,31,45,46,49,54,70,72,73,74,78,203,204,208,225,228,229,257,345,347,349,350,373,399,425,443,459,502],"c":[["r",{"w":"chatroom","s":"room","e":true,"k":"r","d":[71],"c":[["s",{"w":"chatrooms","s":"s","e":true,"k":"s","d":[71],"c":[]}]]}]]}],["i",{"w":"chain","s":"in","e":true,"k":"i","d":[12,19,22,27,28,52,68,70,95,127,156,161,193,201,202,219,220,222,224,245,348,374,376,377,378,379,422,502],"c":[["t",{"w":"chaintip","s":"tip","e":true,"k":"t","d":[7,361],"c":[]}],["h",{"w":"chainhook","s":"hook","e":true,"k":"h","d":[11,31,44,45,49,52,53,68,70,256,371,372,373,374,375,376,377,378,379,380,381,420,422,466,501,505,509,510,515],"c":[["s",{"w":"chainhooks","s":"s","e":true,"k":"s","d":[31,39,41,42,43,52,53,68,373,374,375,376],"c":[["'",{"w":"chainhooks'","s":"'","e":true,"k":"'","d":[37,38],"c":[]}]]}],["u",{"w":"chainhookuuid","s":"uuid","e":true,"k":"u","d":[39,41,42,43],"c":[]}],["-",{"w":"chainhook-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"chainhook-as-a-service","s":"as-a-service","e":true,"k":"a","d":[52,373,378,509,515],"c":[["-",{"w":"chainhook-as-a-service-with-stacks-node","s":"-with-stacks-node","e":true,"k":"-","d":[52,373],"c":[]}]]}],["p",{"w":"chainhook-payload","s":"payload","e":true,"k":"p","d":[377],"c":[]}],["i",{"w":"chainhook-install","s":"install","e":true,"k":"i","d":[380],"c":[]}]]}],["_",{"w":"chainhook_","s":"_","e":true,"k":"_","d":[68],"c":[]}]]}],["i",{"w":"chaini","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"chaining","s":"ng","e":true,"k":"n","d":[27,201],"c":[]}],["d",{"w":"chainid","s":"d","e":true,"k":"d","d":[235,369],"c":[]}]]}],["s",{"w":"chains","s":"s","e":true,"k":"s","d":[81,356,366],"c":[["t",{"w":"chainstate","s":"tate","e":true,"k":"t","d":[378,515],"c":[]}]]}]]}],["r",{"w":"char","s":"r","e":false,"k":"r","d":[],"c":[["t",{"w":"chart","s":"t","e":true,"k":"t","d":[22],"c":[]}],["a",{"w":"characters","s":"acters","e":true,"k":"a","d":[88,120,371],"c":[]}]]}],["l",{"w":"challeng","s":"lleng","e":false,"k":"l","d":[],"c":[["i",{"w":"challenging","s":"ing","e":true,"k":"i","d":[68,73],"c":[]}],["e",{"w":"challenge","s":"e","e":true,"k":"e","d":[68,70,72],"c":[["s",{"w":"challenges","s":"s","e":true,"k":"s","d":[68,69,71],"c":[]}]]}]]}]]}],["e",{"w":"che","s":"e","e":false,"k":"e","d":[],"c":[["c",{"w":"check","s":"ck","e":true,"k":"c","d":[6,9,11,12,16,21,22,30,58,67,68,69,71,76,77,79,80,81,86,90,95,100,108,112,113,114,115,122,123,124,125,126,136,139,146,147,149,154,155,156,160,161,165,172,173,174,176,177,178,180,183,190,191,193,196,201,202,219,224,226,227,228,230,232,234,238,243,245,256,257,345,348,352,357,360,368,373,374,377,378,379,381,420,423,501,505,511,513],"c":[["i",{"w":"checki","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"checking","s":"ng","e":true,"k":"n","d":[6,12,76,82,108,110,112,113,115,122,124,125,127,134,136,139,144,146,147,149,160,163,164,169,172,173,176,190,191,198,201,226,227,230,245,348,360,375],"c":[]}],["s",{"w":"checkiskeyholder","s":"skeyholder","e":true,"k":"s","d":[71],"c":[]}]]}],["s",{"w":"checks","s":"s","e":true,"k":"s","d":[12,67,69,71,80,81,82,90,103,108,110,115,122,123,124,125,126,130,136,139,146,147,155,156,161,163,165,166,168,173,190,192,193,195,201,224,226,227,230,234,245,246,348,368,511,513],"c":[["u",{"w":"checksum","s":"um","e":true,"k":"u","d":[16],"c":[]}]]}],["e",{"w":"checke","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"checked","s":"d","e":true,"k":"d","d":[21,30,102,124,136,137,139,140,146,147,163,238,510],"c":[]}],["r",{"w":"checker","s":"r","e":true,"k":"r","d":[134,226,234,368],"c":[]}]]}],["p",{"w":"checkpoint","s":"point","e":false,"k":"p","d":[],"c":[["s",{"w":"checkpoints","s":"s","e":true,"k":"s","d":[161],"c":[]}],["-",{"w":"checkpoint-based","s":"-based","e":true,"k":"-","d":[161],"c":[]}]]}],["-",{"w":"check-","s":"-","e":false,"k":"-","d":[],"c":[["f",{"w":"check-flag","s":"flag","e":true,"k":"f","d":[174],"c":[]}],["b",{"w":"check-balance","s":"balance","e":true,"k":"b","d":[201],"c":[]}],["s",{"w":"check-sufficient-balance","s":"sufficient-balance","e":true,"k":"s","d":[201],"c":[]}]]}]]}],["v",{"w":"chevronright","s":"vronright","e":true,"k":"v","d":[9,44,230,231,232,243,353,354,357,423],"c":[]}]]}],["o",{"w":"cho","s":"o","e":false,"k":"o","d":[],"c":[["k",{"w":"chokidar","s":"kidar","e":true,"k":"k","d":[9],"c":[]}],["o",{"w":"choos","s":"os","e":false,"k":"o","d":[],"c":[["e",{"w":"choose","s":"e","e":true,"k":"e","d":[46,51,52,53,68,77,79,97,103,122,229,425,443],"c":[]}],["i",{"w":"choosing","s":"ing","e":true,"k":"i","d":[80,122,379],"c":[]}]]}],["s",{"w":"chosen","s":"sen","e":true,"k":"s","d":[52,122,511,513],"c":[]}]]}],["m",{"w":"chmod","s":"mod","e":true,"k":"m","d":[18,517],"c":[]}],["1",{"w":"ch12-00-runtime-cost-analysis","s":"12-00-runtime-cost-analysis","e":true,"k":"1","d":[22],"c":[]}],["0",{"w":"ch02-02-sequence-types","s":"02-02-sequence-types","e":true,"k":"0","d":[27],"c":[]}],["n",{"w":"chnidp","s":"nidp","e":true,"k":"n","d":[356,366],"c":[]}],["i",{"w":"child","s":"ild","e":true,"k":"i","d":[377],"c":[["r",{"w":"children","s":"ren","e":true,"k":"r","d":[377],"c":[]}]]}]]}],["r",{"w":"cr","s":"r","e":false,"k":"r","d":[],"c":[["e",{"w":"creat","s":"eat","e":false,"k":"e","d":[],"c":[["i",{"w":"creati","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"creating","s":"ng","e":true,"k":"n","d":[4,9,11,12,30,47,51,53,67,68,69,71,72,76,79,80,82,86,88,90,91,92,97,99,100,103,108,116,119,120,122,128,129,134,149,160,161,163,164,174,178,186,187,188,189,200,202,219,222,224,226,227,231,232,234,237,245,256,259,348,358,362,368,377,381,501,505],"c":[["-",{"w":"creating-the-predicate","s":"-the-predicate","e":true,"k":"-","d":[377],"c":[]}]]}],["o",{"w":"creation","s":"on","e":true,"k":"o","d":[69,71,80,82,90,123,160,167,178,186,188,200,226,234,368],"c":[]}],["v",{"w":"creativity","s":"vity","e":true,"k":"v","d":[73],"c":[]}]]}],["e",{"w":"create","s":"e","e":true,"k":"e","d":[11,12,18,24,29,30,31,44,45,46,47,49,51,52,53,68,69,70,71,72,73,76,77,79,80,81,82,88,90,92,97,99,100,103,108,113,114,115,116,119,120,122,123,125,126,128,129,134,154,160,161,163,164,167,174,176,177,178,180,183,186,187,188,190,191,193,200,201,202,221,224,226,227,228,230,232,233,234,236,237,245,246,256,348,353,354,364,367,368,370,373,374,375,377,379,381,422,501,502,505,511,513,515,516],"c":[["d",{"w":"created","s":"d","e":true,"k":"d","d":[14,22,52,68,69,71,132,174,178,186,230,246,258,374,376,511,513],"c":[]}],["-",{"w":"create-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"create-a","s":"a","e":false,"k":"a","d":[],"c":[["-",{"w":"create-a-","s":"-","e":false,"k":"-","d":[],"c":[["n",{"w":"create-a-new-project","s":"new-project","e":true,"k":"n","d":[18,30,516],"c":[]}],["t",{"w":"create-a-transaction","s":"transaction","e":true,"k":"t","d":[230],"c":[]}],["p",{"w":"create-a-predicate","s":"predicate","e":true,"k":"p","d":[374],"c":[]}]]}],["l",{"w":"create-alert-form","s":"lert-form","e":true,"k":"l","d":[51],"c":[]}]]}],["d",{"w":"create-deployment-plans","s":"deployment-plans","e":true,"k":"d","d":[18],"c":[]}],["c",{"w":"create-chainhook","s":"chainhook","e":false,"k":"c","d":[],"c":[["s",{"w":"create-chainhooks","s":"s","e":true,"k":"s","d":[45,53,68,377,379],"c":[]}],["-",{"w":"create-chainhook-window","s":"-window","e":true,"k":"-","d":[52],"c":[]}]]}],["p",{"w":"create-pro","s":"pro","e":false,"k":"p","d":[],"c":[["j",{"w":"create-project","s":"ject","e":true,"k":"j","d":[46,47,50],"c":[]}],["p",{"w":"create-proposal","s":"posal","e":true,"k":"p","d":[81],"c":[]}]]}],["l",{"w":"create-list","s":"list","e":true,"k":"l","d":[82],"c":[]}],["f",{"w":"create-flag","s":"flag","e":true,"k":"f","d":[174],"c":[]}],["g",{"w":"create-greeting","s":"greeting","e":true,"k":"g","d":[182],"c":[]}],["s",{"w":"create-standard-principal","s":"standard-principal","e":true,"k":"s","d":[200],"c":[]}],["e",{"w":"create-expo-app","s":"expo-app","e":true,"k":"e","d":[232],"c":[]}],["n",{"w":"create-next-app","s":"next-app","e":true,"k":"n","d":[517],"c":[]}]]}],["c",{"w":"createclient","s":"client","e":true,"k":"c","d":[68],"c":[]}],["s",{"w":"creates","s":"s","e":true,"k":"s","d":[82,100,149,177,259],"c":[["t",{"w":"createstacksprivatekey","s":"tacksprivatekey","e":true,"k":"t","d":[226,229,234,368],"c":[]}]]}],["a",{"w":"createa","s":"a","e":false,"k":"a","d":[],"c":[["s",{"w":"createasset","s":"sset","e":true,"k":"s","d":[229],"c":[["i",{"w":"createassetinfo","s":"info","e":true,"k":"i","d":[226,229,234,368],"c":[]}]]}],["p",{"w":"createapikeymiddleware","s":"pikeymiddleware","e":true,"k":"p","d":[227,236,370],"c":[]}]]}],["f",{"w":"createfetchfn","s":"fetchfn","e":true,"k":"f","d":[227,236,370],"c":[]}]]}],["o",{"w":"creator","s":"or","e":true,"k":"o","d":[511,513],"c":[["s",{"w":"creators","s":"s","e":true,"k":"s","d":[11,256,381,501,505],"c":[]}],["'",{"w":"creator's","s":"'s","e":true,"k":"'","d":[511,513],"c":[]}]]}]]}],["o",{"w":"cro","s":"o","e":false,"k":"o","d":[],"c":[["w",{"w":"crowdfunding","s":"wdfunding","e":true,"k":"w","d":[11,256,381,501,505],"c":[]}],["s",{"w":"cross-c","s":"ss-c","e":false,"k":"s","d":[],"c":[["h",{"w":"cross-chain","s":"hain","e":true,"k":"h","d":[95],"c":[]}],["o",{"w":"cross-contract","s":"ontract","e":true,"k":"o","d":[144],"c":[]}]]}]]}],["u",{"w":"crucial","s":"ucial","e":true,"k":"u","d":[12,68,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,245,348,372,377,509,516],"c":[]}],["i",{"w":"crit","s":"it","e":false,"k":"i","d":[],"c":[["e",{"w":"criteria","s":"eria","e":true,"k":"e","d":[14,177],"c":[]}],["i",{"w":"critical","s":"ical","e":true,"k":"i","d":[27,126,137,140,193,372],"c":[]}]]}],["y",{"w":"crypto","s":"ypto","e":true,"k":"y","d":[232],"c":[["c",{"w":"cryptocurrency","s":"currency","e":true,"k":"c","d":[50],"c":[]}],["g",{"w":"cryptographic","s":"graphic","e":true,"k":"g","d":[52,80,84,87,91,93,111,128,133,145,158,162,169,174,179,181,187,188,354],"c":[]}],["-",{"w":"crypto-browserify","s":"-browserify","e":true,"k":"-","d":[232],"c":[]}]]}],["a",{"w":"crash","s":"ash","e":true,"k":"a","d":[201],"c":[]}]]}],["u",{"w":"cu","s":"u","e":false,"k":"u","d":[],"c":[["s",{"w":"custom","s":"stom","e":true,"k":"s","d":[4,9,11,12,44,51,53,67,68,122,123,160,183,201,223,224,226,227,229,236,239,245,246,256,348,355,356,358,362,366,370,381,420,501,505,509,515],"c":[["-",{"w":"custom-matchers","s":"-matchers","e":true,"k":"-","d":[9,12,224,245,246,348],"c":[]}],["i",{"w":"customiz","s":"iz","e":false,"k":"i","d":[],"c":[["a",{"w":"customiza","s":"a","e":false,"k":"a","d":[],"c":[["b",{"w":"customizable","s":"ble","e":true,"k":"b","d":[18,44,45,229,355,379],"c":[]}],["t",{"w":"customization","s":"tion","e":true,"k":"t","d":[69],"c":[]}]]}],["e",{"w":"customize","s":"e","e":true,"k":"e","d":[27,72,232,352,422,502],"c":[["d",{"w":"customized","s":"d","e":true,"k":"d","d":[51],"c":[]}]]}]]}]]}],["r",{"w":"cur","s":"r","e":false,"k":"r","d":[],"c":[["r",{"w":"current","s":"rent","e":true,"k":"r","d":[5,12,26,27,52,69,71,81,86,94,95,100,104,114,115,117,122,123,125,126,127,141,147,149,156,160,164,178,190,192,200,202,219,221,222,224,226,227,245,259,348,355,359,376],"c":[["b",{"w":"currentb","s":"b","e":false,"k":"b","d":[],"c":[["l",{"w":"currentblockheight","s":"lockheight","e":true,"k":"l","d":[5,359],"c":[]}],["a",{"w":"currentbalance","s":"alance","e":true,"k":"a","d":[140,201],"c":[]}]]}],["d",{"w":"currentdeployeraddress","s":"deployeraddress","e":true,"k":"d","d":[5,359],"c":[]}],["e",{"w":"currentepoch","s":"epoch","e":true,"k":"e","d":[5,359],"c":[]}],["c",{"w":"currentcount","s":"count","e":true,"k":"c","d":[7,361],"c":[]}],["-",{"w":"current-","s":"-","e":false,"k":"-","d":[],"c":[["b",{"w":"current-b","s":"b","e":false,"k":"b","d":[],"c":[["a",{"w":"current-balance","s":"alance","e":true,"k":"a","d":[12,224,245,348],"c":[]}],["l",{"w":"current-block-height","s":"lock-height","e":true,"k":"l","d":[114],"c":[]}]]}],["l",{"w":"current-lo","s":"lo","e":false,"k":"l","d":[],"c":[["a",{"w":"current-loan-details","s":"an-details","e":true,"k":"a","d":[12,245,348],"c":[]}],["g",{"w":"current-log","s":"g","e":true,"k":"g","d":[149],"c":[]}]]}],["p",{"w":"current-permissions","s":"permissions","e":true,"k":"p","d":[76],"c":[]}],["s",{"w":"current-settings","s":"settings","e":true,"k":"s","d":[76],"c":[]}],["w",{"w":"current-winner","s":"winner","e":true,"k":"w","d":[202],"c":[]}],["v",{"w":"current-votes","s":"votes","e":true,"k":"v","d":[202],"c":[]}]]}],["l",{"w":"currentl","s":"l","e":false,"k":"l","d":[],"c":[["y",{"w":"currently","s":"y","e":true,"k":"y","d":[27,233,355,367],"c":[]}],["i",{"w":"currentlist","s":"ist","e":true,"k":"i","d":[180],"c":[]}]]}],["r",{"w":"currentr","s":"r","e":false,"k":"r","d":[],"c":[["e",{"w":"currentrewards","s":"ewards","e":true,"k":"e","d":[77],"c":[]}],["o",{"w":"currentro","s":"o","e":false,"k":"o","d":[],"c":[["u",{"w":"currentround","s":"und","e":true,"k":"u","d":[112],"c":[]}],["l",{"w":"currentrole","s":"le","e":true,"k":"l","d":[113],"c":[]}]]}]]}],["p",{"w":"currentp","s":"p","e":false,"k":"p","d":[],"c":[["o",{"w":"currentpoints","s":"oints","e":true,"k":"o","d":[77],"c":[]}],["a",{"w":"currentparticipants","s":"articipants","e":true,"k":"a","d":[112],"c":[]}],["e",{"w":"currentpermissions","s":"ermissions","e":true,"k":"e","d":[130],"c":[]}]]}],["h",{"w":"currenthighestbid","s":"highestbid","e":true,"k":"h","d":[114],"c":[]}],["s",{"w":"currentsupply","s":"supply","e":true,"k":"s","d":[125],"c":[]}],["f",{"w":"currentflags","s":"flags","e":true,"k":"f","d":[174],"c":[]}],["_",{"w":"current_burn_block_height","s":"_burn_block_height","e":true,"k":"_","d":[223],"c":[]}]]}],["i",{"w":"curious","s":"ious","e":true,"k":"i","d":[49],"c":[]}],["l",{"w":"curl","s":"l","e":true,"k":"l","d":[58,258,374,376],"c":[]}],["s",{"w":"cursor","s":"sor","e":true,"k":"s","d":[131,175],"c":[]}]]}],["m",{"w":"cum","s":"m","e":false,"k":"m","d":[],"c":[["b",{"w":"cumbersome","s":"bersome","e":true,"k":"b","d":[49],"c":[]}],["u",{"w":"cumulative","s":"ulative","e":true,"k":"u","d":[77,346],"c":[]}]]}],["l",{"w":"culminating","s":"lminating","e":true,"k":"l","d":[355,356,366],"c":[]}]]}],["y",{"w":"cycle","s":"ycle","e":true,"k":"y","d":[208,219,221,222,516],"c":[["s",{"w":"cycles","s":"s","e":true,"k":"s","d":[5,214,215,219,221,222,223,289,290,291,292,359,399],"c":[["'",{"w":"cycles'","s":"'","e":true,"k":"'","d":[287],"c":[]}]]}],["_",{"w":"cycle_number","s":"_number","e":true,"k":"_","d":[214,215,219,222,289,290,291,292,391],"c":[]}],["a",{"w":"cycleamount","s":"amount","e":true,"k":"a","d":[516],"c":[]}]]}],["v",{"w":"cvto","s":"vto","e":false,"k":"v","d":[],"c":[["v",{"w":"cvtovalue","s":"value","e":true,"k":"v","d":[7,361],"c":[]}],["j",{"w":"cvtojson","s":"json","e":true,"k":"j","d":[226,234,368],"c":[]}],["h",{"w":"cvtohex","s":"hex","e":true,"k":"h","d":[514],"c":[]}]]}],["e",{"w":"certain","s":"ertain","e":true,"k":"e","d":[7,19,49,69,76,79,81,82,90,92,93,99,105,110,113,114,125,126,128,130,145,147,154,156,161,170,174,176,177,178,187,191,193,201,231,259,356,361,366],"c":[]}],["d",{"w":"cd","s":"d","e":true,"k":"d","d":[12,30,69,71,224,245,348,380,424,502,504,509],"c":[]}],["b",{"w":"cbtc","s":"btc","e":true,"k":"b","d":[27,115,123,125,190,372],"c":[["-",{"w":"cbtc-token","s":"-token","e":true,"k":"-","d":[372],"c":[]}]]}],["i",{"w":"ci","s":"i","e":true,"k":"i","d":[31],"c":[["r",{"w":"circ","s":"rc","e":false,"k":"r","d":[],"c":[["l",{"w":"circleuserround","s":"leuserround","e":true,"k":"l","d":[64,365,382,383,384,385,386,387],"c":[]}],["u",{"w":"circulati","s":"ulati","e":false,"k":"u","d":[],"c":[["o",{"w":"circulation","s":"on","e":true,"k":"o","d":[71],"c":[]}],["n",{"w":"circulating","s":"ng","e":true,"k":"n","d":[115,125,135,143,160,297],"c":[]}]]}]]}],["p",{"w":"ciphertext","s":"phertext","e":true,"k":"p","d":[67,226,227],"c":[]}],["t",{"w":"city","s":"ty","e":true,"k":"t","d":[516],"c":[["c",{"w":"citycoin","s":"coin","e":false,"k":"c","d":[],"c":[["s",{"w":"citycoins","s":"s","e":true,"k":"s","d":[516],"c":[]}],["-",{"w":"citycoin-vrf-v2","s":"-vrf-v2","e":true,"k":"-","d":[516],"c":[]}]]}],["n",{"w":"cityname","s":"name","e":true,"k":"n","d":[516],"c":[]}],["i",{"w":"cityid","s":"id","e":true,"k":"i","d":[516],"c":[]}]]}]]}],["2",{"w":"c2","s":"2","e":true,"k":"2","d":[47],"c":[]}],["1",{"w":"c1","s":"1","e":true,"k":"1","d":[47],"c":[]}],["3",{"w":"c3","s":"3","e":true,"k":"3","d":[47],"c":[]}],["p",{"w":"cp","s":"p","e":false,"k":"p","d":[],"c":[["c",{"w":"cpcv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}],["u",{"w":"cpu","s":"u","e":true,"k":"u","d":[502],"c":[]}]]}],["t",{"w":"ctx","s":"tx","e":true,"k":"t","d":[227,236,370],"c":[]}],["n",{"w":"cn389ncoiwuencr","s":"n389ncoiwuencr","e":true,"k":"n","d":[374,379],"c":[]}],["c",{"w":"ccd0","s":"cd0","e":false,"k":"c","d":[],"c":[["0",{"w":"ccd00","s":"0","e":false,"k":"0","d":[],"c":[["7",{"w":"ccd007-citycoin-stacking","s":"7-citycoin-stacking","e":true,"k":"7","d":[516],"c":[]}],["4",{"w":"ccd004-city-registry","s":"4-city-registry","e":true,"k":"4","d":[516],"c":[]}],["2",{"w":"ccd002-treasury-","s":"2-treasury-","e":false,"k":"2","d":[],"c":[["m",{"w":"ccd002-treasury-mia-stacking","s":"mia-stacking","e":true,"k":"m","d":[516],"c":[]}],["n",{"w":"ccd002-treasury-nyc-stacking","s":"nyc-stacking","e":true,"k":"n","d":[516],"c":[]}]]}]]}],["1",{"w":"ccd011-stacking-payouts","s":"11-stacking-payouts","e":true,"k":"1","d":[516],"c":[]}]]}],["s",{"w":"css","s":"ss","e":true,"k":"s","d":[517],"c":[]}]]}],["f",{"w":"f","s":"f","e":true,"k":"f","d":[26,226,234,368],"c":[["r",{"w":"fr","s":"r","e":false,"k":"r","d":[],"c":[["o",{"w":"fro","s":"o","e":false,"k":"o","d":[],"c":[["m",{"w":"from","s":"m","e":true,"k":"m","d":[1,2,3,4,5,6,7,8,9,11,12,13,14,17,18,19,20,21,22,23,26,27,28,29,30,31,44,45,46,47,48,49,50,51,52,53,54,55,58,64,65,67,68,69,71,73,74,76,77,78,79,80,81,83,85,86,87,88,89,90,92,94,95,96,97,98,99,100,101,102,103,106,108,109,112,113,115,116,117,119,120,123,126,129,131,132,133,134,137,138,140,141,143,145,150,151,152,157,158,161,162,163,164,167,168,169,172,177,179,180,182,184,185,188,189,192,193,194,197,198,199,200,201,202,203,204,208,219,221,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,255,256,257,258,259,345,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,381,382,383,384,385,386,387,399,419,420,421,422,423,425,443,459,466,467,501,502,504,505,506,507,508,509,510,511,512,513,514,515,516,517],"c":[["-",{"w":"from-consensus-buff","s":"-consensus-buff","e":true,"k":"-","d":[142,144],"c":[]}]]}],["n",{"w":"front","s":"nt","e":true,"k":"n","d":[74,399,425,427,443],"c":[["-",{"w":"front-end","s":"-end","e":true,"k":"-","d":[9,44],"c":[]}],["e",{"w":"frontend","s":"end","e":true,"k":"e","d":[19,44,47,53,68,69,71,75],"c":[]}]]}]]}],["a",{"w":"fra","s":"a","e":false,"k":"a","d":[],"c":[["m",{"w":"framework","s":"mework","e":true,"k":"m","d":[8,224,422],"c":[]}],["c",{"w":"fractions","s":"ctions","e":true,"k":"c","d":[77,102,112],"c":[]}]]}],["e",{"w":"fre","s":"e","e":false,"k":"e","d":[],"c":[["e",{"w":"free","s":"e","e":true,"k":"e","d":[13,49,68,69,71,355],"c":[]}],["q",{"w":"frequent","s":"quent","e":true,"k":"q","d":[89,126,132,189,197],"c":[["l",{"w":"frequently","s":"ly","e":true,"k":"l","d":[49,92,95,104,116,125,127,156,190],"c":[]}]]}],["s",{"w":"fresh","s":"sh","e":true,"k":"s","d":[219,220],"c":[]}]]}],["i",{"w":"frie","s":"ie","e":false,"k":"i","d":[],"c":[["n",{"w":"friend","s":"nd","e":true,"k":"n","d":[71],"c":[["s",{"w":"friends","s":"s","e":true,"k":"s","d":[71],"c":[["h",{"w":"friendship","s":"hip","e":true,"k":"h","d":[71],"c":[]}]]}],["t",{"w":"friendtech","s":"tech","e":true,"k":"t","d":[71],"c":[]}]]}],["d",{"w":"friedg","s":"dg","e":false,"k":"d","d":[],"c":[["a",{"w":"friedgar","s":"ar","e":true,"k":"a","d":[376],"c":[]}],["e",{"w":"friedger","s":"er","e":true,"k":"e","d":[376],"c":[]}]]}]]}]]}],["a",{"w":"fa","s":"a","e":false,"k":"a","d":[],"c":[["s",{"w":"fast","s":"st","e":true,"k":"s","d":[19,221],"c":[["e",{"w":"faster","s":"er","e":true,"k":"e","d":[2,8,19,45,71,76,203,204,219,225,347,349,373,422,502],"c":[]}]]}],["l",{"w":"fal","s":"l","e":false,"k":"l","d":[],"c":[["s",{"w":"false","s":"se","e":true,"k":"s","d":[6,22,32,34,35,36,37,38,39,41,42,43,51,57,60,61,62,63,67,69,71,76,81,90,95,97,104,108,113,114,128,130,139,146,154,155,156,165,166,167,173,174,176,191,196,206,207,210,212,214,215,216,218,226,227,234,249,251,252,253,254,255,260,261,262,264,265,266,267,268,269,270,271,272,274,275,276,277,278,279,281,283,284,285,286,287,289,290,291,292,293,295,296,297,298,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,319,320,321,322,323,324,325,326,327,328,329,330,332,333,335,336,338,340,342,343,344,356,357,360,366,368,371,372,379,389,391,392,393,395,396,398,401,402,405,407,408,409,410,411,413,414,415,416,418,429,430,432,433,435,436,437,438,441,442,446,447,449,450,451,452,454,455,456,457,458,461,464,465,469,470,472,473,475,476,477,478,480,481,483,484,486,487,488,489,491,492,493,494,495,497,499,500,511,513,516,517],"c":[["c",{"w":"falsecv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}]]}],["l",{"w":"fallback","s":"lback","e":true,"k":"l","d":[103,193],"c":[["f",{"w":"fallbackfee","s":"fee","e":true,"k":"f","d":[515],"c":[]}]]}]]}],["u",{"w":"faucet","s":"ucet","e":true,"k":"u","d":[7,28,49,68,361],"c":[["s",{"w":"faucets","s":"s","e":true,"k":"s","d":[7,319,361],"c":[]}]]}],["i",{"w":"fai","s":"i","e":false,"k":"i","d":[],"c":[["l",{"w":"fail","s":"l","e":true,"k":"l","d":[84,89,94,98,101,106,107,108,109,111,132,135,141,142,143,150,162,167,169,172,181,184,186,193,194,198,200,201,238],"c":[["s",{"w":"fails","s":"s","e":true,"k":"s","d":[7,16,85,107,108,126,144,148,151,159,178,193,201,361],"c":[]}],["u",{"w":"failure","s":"ure","e":true,"k":"u","d":[12,16,99,119,124,136,144,164,196,201,245,348],"c":[["s",{"w":"failures","s":"s","e":true,"k":"s","d":[123,144,193],"c":[]}]]}],["e",{"w":"failed","s":"ed","e":true,"k":"e","d":[16,58,144,164,230,233,367],"c":[]}]]}],["r",{"w":"fair","s":"r","e":true,"k":"r","d":[49,516],"c":[["l",{"w":"fairly","s":"ly","e":true,"k":"l","d":[516],"c":[]}]]}]]}],["m",{"w":"fam","s":"m","e":false,"k":"m","d":[],"c":[["i",{"w":"familiar","s":"iliar","e":true,"k":"i","d":[31,44,208,355,422],"c":[]}],["e",{"w":"fame","s":"e","e":true,"k":"e","d":[73],"c":[]}]]}],["r",{"w":"far","s":"r","e":true,"k":"r","d":[48,202],"c":[["-",{"w":"far-right","s":"-right","e":true,"k":"-","d":[48],"c":[]}]]}],["c",{"w":"fac","s":"c","e":false,"k":"c","d":[],"c":[["i",{"w":"facilitat","s":"ilitat","e":false,"k":"i","d":[],"c":[["e",{"w":"facilitate","s":"e","e":true,"k":"e","d":[49,76],"c":[]}],["i",{"w":"facilitating","s":"ing","e":true,"k":"i","d":[82,88,107,119,120,123,144],"c":[]}]]}],["t",{"w":"fact","s":"t","e":true,"k":"t","d":[95],"c":[["o",{"w":"facto","s":"o","e":true,"k":"o","d":[69],"c":[["r",{"w":"factor","s":"r","e":true,"k":"r","d":[71],"c":[]}]]}]]}]]}],["v",{"w":"favor","s":"vor","e":true,"k":"v","d":[355],"c":[["i",{"w":"favorite","s":"ite","e":true,"k":"i","d":[233,239,367,427],"c":[]}]]}],["k",{"w":"fake","s":"ke","e":true,"k":"k","d":[517],"c":[]}]]}],["u",{"w":"fu","s":"u","e":false,"k":"u","d":[],"c":[["n",{"w":"fun","s":"n","e":true,"k":"n","d":[73],"c":[["c",{"w":"func","s":"c","e":false,"k":"c","d":[],"c":[["t",{"w":"function","s":"tion","e":true,"k":"t","d":[4,7,9,12,22,26,27,28,30,50,51,67,68,69,71,72,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,219,222,224,226,227,229,230,232,233,234,236,243,245,246,259,348,352,353,354,355,356,357,358,361,362,366,367,368,370,377,399,511,513,514,516,517],"c":[["a",{"w":"functiona","s":"a","e":false,"k":"a","d":[],"c":[["l",{"w":"functional","s":"l","e":true,"k":"l","d":[96],"c":[["i",{"w":"functionalit","s":"it","e":false,"k":"i","d":[],"c":[["y",{"w":"functionality","s":"y","e":true,"k":"y","d":[2,8,9,12,53,68,71,81,86,93,97,99,100,123,160,183,192,203,204,219,225,233,245,347,348,349,351,352,355,367,516],"c":[]}],["i",{"w":"functionalities","s":"ies","e":true,"k":"i","d":[69,95,123,192,232,511,513],"c":[]}]]}]]}],["r",{"w":"functionarg","s":"rg","e":true,"k":"r","d":[51],"c":[["s",{"w":"functionargs","s":"s","e":true,"k":"s","d":[69,71,226,230,234,353,356,366,368],"c":[]}]]}]]}],["s",{"w":"functions","s":"s","e":true,"k":"s","d":[6,7,8,9,12,18,19,22,25,27,30,45,50,51,67,69,71,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,224,226,227,228,229,230,233,234,236,241,244,245,348,350,352,353,360,361,367,368,370,372,377],"c":[]}],["_",{"w":"function_","s":"_","e":false,"k":"_","d":[],"c":[["n",{"w":"function_name","s":"name","e":true,"k":"n","d":[51,414,517],"c":[]}],["s",{"w":"function_signature","s":"signature","e":true,"k":"s","d":[51,517],"c":[]}],["a",{"w":"function_args","s":"args","e":true,"k":"a","d":[51,517],"c":[]}]]}],["i",{"w":"functioning","s":"ing","e":true,"k":"i","d":[69],"c":[]}],["n",{"w":"functionname","s":"name","e":true,"k":"n","d":[69,71,226,227,230,234,236,353,356,366,368,370,514],"c":[]}],["-",{"w":"function-","s":"-","e":false,"k":"-","d":[],"c":[["n",{"w":"function-name","s":"name","e":true,"k":"n","d":[86,99,129,134],"c":[]}],["b",{"w":"function-body","s":"body","e":true,"k":"b","d":[99,129,134],"c":[]}],["c",{"w":"function-call","s":"call","e":true,"k":"c","d":[230],"c":[]}]]}],["'",{"w":"function'","s":"'","e":true,"k":"'","d":[246],"c":[["s",{"w":"function's","s":"s","e":true,"k":"s","d":[119],"c":[]}]]}]]}],["1",{"w":"func1-name","s":"1-name","e":true,"k":"1","d":[119],"c":[]}]]}],["g",{"w":"fungible","s":"gible","e":true,"k":"g","d":[7,28,31,54,115,123,125,160,178,190,208,226,229,234,238,361,368,372,399,511,513],"c":[["_",{"w":"fungible_token","s":"_token","e":false,"k":"_","d":[],"c":[["s",{"w":"fungible_tokens","s":"s","e":true,"k":"s","d":[7,361],"c":[]}],["_",{"w":"fungible_token_event","s":"_event","e":true,"k":"_","d":[52],"c":[]}]]}],["-",{"w":"fungible-token-metadata","s":"-token-metadata","e":true,"k":"-","d":[54],"c":[]}],["c",{"w":"fungibleconditioncode","s":"conditioncode","e":true,"k":"c","d":[226,234,368],"c":[]}],["a",{"w":"fungibleassetinfo","s":"assetinfo","e":true,"k":"a","d":[226,234,368],"c":[]}],["p",{"w":"fungiblepostcondition","s":"postcondition","e":true,"k":"p","d":[229,238],"c":[["w",{"w":"fungiblepostconditionwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}]]}],["d",{"w":"fund","s":"d","e":true,"k":"d","d":[11,28,69,233,256,367,381,501,505],"c":[["i",{"w":"funding","s":"ing","e":true,"k":"i","d":[28,69],"c":[]}],["s",{"w":"funds","s":"s","e":true,"k":"s","d":[52,69,140,190,192,233,367,371],"c":[["_",{"w":"funds_","s":"_","e":true,"k":"_","d":[69],"c":[]}]]}],["r",{"w":"fundrais","s":"rais","e":false,"k":"r","d":[],"c":[["i",{"w":"fundraising","s":"ing","e":true,"k":"i","d":[53],"c":[]}],["e",{"w":"fundraiser","s":"er","e":true,"k":"e","d":[53],"c":[]}]]}],["a",{"w":"fundamental","s":"amental","e":true,"k":"a","d":[82,83,84,85,86,89,94,98,99,101,102,105,106,107,108,109,110,111,112,114,116,117,118,121,122,123,124,131,132,135,136,137,138,139,140,141,142,143,146,147,148,150,151,153,154,155,157,159,160,162,163,164,165,166,167,168,169,170,171,172,173,175,176,178,181,184,185,186,189,190,191,194,195,196,197,198,199,200,230,352,353],"c":[]}]]}]]}],["l",{"w":"ful","s":"l","e":false,"k":"l","d":[],"c":[["l",{"w":"full","s":"l","e":true,"k":"l","d":[7,12,53,67,128,130,133,158,187,224,226,227,230,232,237,239,243,245,348,352,361,374,377,378,379],"c":[["-",{"w":"full-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"full-stack","s":"stack","e":true,"k":"s","d":[44],"c":[]}],["p",{"w":"full-predicate","s":"predicate","e":true,"k":"p","d":[377],"c":[]}]]}],["y",{"w":"fully","s":"y","e":true,"k":"y","d":[372,504,515],"c":[["-",{"w":"fully-formed","s":"-formed","e":true,"k":"-","d":[233,367],"c":[]}]]}]]}],["f",{"w":"fulfil","s":"fil","e":true,"k":"f","d":[511,513],"c":[["l",{"w":"fulfill","s":"l","e":true,"k":"l","d":[511,513],"c":[["i",{"w":"fulfilling","s":"ing","e":true,"k":"i","d":[511,513],"c":[]}],["e",{"w":"fulfilled","s":"ed","e":true,"k":"e","d":[511,513],"c":[]}]]}],["-",{"w":"fulfil-listing-","s":"-listing-","e":false,"k":"-","d":[],"c":[["s",{"w":"fulfil-listing-stx","s":"stx","e":true,"k":"s","d":[511,513],"c":[]}],["f",{"w":"fulfil-listing-ft","s":"ft","e":true,"k":"f","d":[511,513],"c":[]}]]}]]}]]}],["m",{"w":"fumadocs-","s":"madocs-","e":false,"k":"m","d":[],"c":[["u",{"w":"fumadocs-ui","s":"ui","e":true,"k":"u","d":[22,64,243,365,377,378,382,383,384,385,386,387],"c":[]}],["c",{"w":"fumadocs-core","s":"core","e":true,"k":"c","d":[508],"c":[]}]]}],["r",{"w":"further","s":"rther","e":true,"k":"r","d":[51,68,69,71,177,375],"c":[]}],["t",{"w":"future","s":"ture","e":true,"k":"t","d":[69,73,95,104,127,156,355],"c":[]}]]}],["e",{"w":"fe","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"fetch","s":"tch","e":true,"k":"t","d":[2,8,12,22,31,54,55,203,204,208,224,225,226,227,228,229,233,234,236,243,244,245,259,347,348,349,350,367,368,370,399,427,459,466,514,516,517],"c":[["i",{"w":"fetching","s":"ing","e":true,"k":"i","d":[44,55,226,229,234,368],"c":[]}],["e",{"w":"fetches","s":"es","e":true,"k":"e","d":[208,233,367],"c":[]}],["f",{"w":"fetchf","s":"f","e":false,"k":"f","d":[],"c":[["n",{"w":"fetchfn","s":"n","e":true,"k":"n","d":[227,229,236,370],"c":[]}],["e",{"w":"fetchfee","s":"ee","e":false,"k":"e","d":[],"c":[["e",{"w":"fetchfeeestimate","s":"estimate","e":true,"k":"e","d":[229],"c":[["t",{"w":"fetchfeeestimatetrans","s":"trans","e":false,"k":"t","d":[],"c":[["f",{"w":"fetchfeeestimatetransfer","s":"fer","e":true,"k":"f","d":[229],"c":[]}],["a",{"w":"fetchfeeestimatetransaction","s":"action","e":true,"k":"a","d":[229],"c":[]}]]}]]}],["r",{"w":"fetchfeerate","s":"rate","e":true,"k":"r","d":[233,367],"c":[]}]]}]]}],["_",{"w":"fetch_api","s":"_api","e":true,"k":"_","d":[229],"c":[]}],["a",{"w":"fetcha","s":"a","e":false,"k":"a","d":[],"c":[["b",{"w":"fetchabi","s":"bi","e":true,"k":"b","d":[229],"c":[]}],["p",{"w":"fetchapi","s":"pi","e":true,"k":"p","d":[514,517],"c":[]}]]}],["n",{"w":"fetchnonce","s":"nonce","e":true,"k":"n","d":[229],"c":[]}],["c",{"w":"fetchc","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"fetchcontractmapentry","s":"ontractmapentry","e":true,"k":"o","d":[229],"c":[]}],["a",{"w":"fetchcallreadonlyfunction","s":"allreadonlyfunction","e":true,"k":"a","d":[229,234,368],"c":[]}]]}],["s",{"w":"fetchs","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"fetchsigners","s":"igners","e":false,"k":"i","d":[],"c":[["p",{"w":"fetchsignerspublickey","s":"publickey","e":true,"k":"p","d":[233,367],"c":[]}],["a",{"w":"fetchsignersaddress","s":"address","e":true,"k":"a","d":[233,367],"c":[]}]]}],["b",{"w":"fetchsbtcbalance","s":"btcbalance","e":true,"k":"b","d":[233,367],"c":[]}]]}],["u",{"w":"fetchutxos","s":"utxos","e":true,"k":"u","d":[233,367],"c":[]}],["t",{"w":"fetchtxhex","s":"txhex","e":true,"k":"t","d":[233,367],"c":[]}]]}],["e",{"w":"fee","s":"e","e":true,"k":"e","d":[22,71,140,226,232,233,234,243,259,367,368],"c":[["d",{"w":"feedback","s":"dback","e":true,"k":"d","d":[8,19,45,50,71,193,201,378],"c":[]}],["s",{"w":"fees","s":"s","e":true,"k":"s","d":[22,71,102,140,219,222,259,396,398],"c":[["'",{"w":"fees'","s":"'","e":true,"k":"'","d":[335],"c":[]}]]}],["l",{"w":"feel","s":"l","e":true,"k":"l","d":[49,68,69,71],"c":[]}],["_",{"w":"fee_rate","s":"_rate","e":true,"k":"_","d":[51,219,222,255,279,517],"c":[]}],["p",{"w":"feepercent","s":"percent","e":true,"k":"p","d":[71],"c":[]}],["-",{"w":"fee-estimation","s":"-estimation","e":true,"k":"-","d":[227,236,370],"c":[]}],["e",{"w":"feeestimateurl","s":"estimateurl","e":true,"k":"e","d":[227,236,370],"c":[]}],["r",{"w":"feerate","s":"rate","e":true,"k":"r","d":[233,367],"c":[]}]]}],["w",{"w":"few","s":"w","e":true,"k":"w","d":[14,15,17,50,69,71,243,246,515],"c":[]}],["a",{"w":"feature","s":"ature","e":true,"k":"a","d":[22,47,51,71,115,229,371,375],"c":[["s",{"w":"features","s":"s","e":true,"k":"s","d":[27,28,50,53,68,69,71,73,77,79,122,160,161,201,202,219,220,229,354,356,366,517],"c":[]}]]}],["b",{"w":"feb","s":"b","e":true,"k":"b","d":[73,375],"c":[["r",{"w":"february","s":"ruary","e":true,"k":"r","d":[72],"c":[]}]]}]]}],["o",{"w":"fo","s":"o","e":false,"k":"o","d":[],"c":[["n",{"w":"font-bold","s":"nt-bold","e":true,"k":"n","d":[2,8,18,31,45,54,203,204,208,225,228,257,345,347,349,350,373,399,459,502],"c":[]}],["r",{"w":"for","s":"r","e":true,"k":"r","d":[6,7,8,9,11,12,13,14,15,16,17,18,19,20,22,23,24,25,26,27,28,29,30,31,44,45,46,48,49,50,51,52,53,54,55,58,64,65,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,208,219,220,221,222,223,224,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,255,256,257,258,259,345,346,348,351,352,353,354,355,356,357,360,361,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,381,382,383,384,385,386,387,399,420,422,423,425,426,427,439,443,444,459,462,466,501,502,504,505,509,510,511,513,514,515,516,517],"c":[["m",{"w":"form","s":"m","e":true,"k":"m","d":[7,27,51,69,71,72,73,361,377,515],"c":[["a",{"w":"format","s":"at","e":true,"k":"a","d":[9,65,68,87,88,91,113,120,133,142,158,179,185,226,229,233,234,351,356,366,367,368,377,439,462],"c":[["t",{"w":"formatted","s":"ted","e":true,"k":"t","d":[68,84,94,98,111,117,131,132,138,141,142,157,162,167,169,175,181,185,186,195,198,200,233,367],"c":[]}],["s",{"w":"formats","s":"s","e":true,"k":"s","d":[356,366],"c":[]}]]}],["u",{"w":"formula","s":"ula","e":true,"k":"u","d":[71,77,102],"c":[["s",{"w":"formulas","s":"s","e":true,"k":"s","d":[102,112,137,140],"c":[]}]]}]]}],["e",{"w":"foreach","s":"each","e":true,"k":"e","d":[7,68,361],"c":[]}],["g",{"w":"forget","s":"get","e":true,"k":"g","d":[73],"c":[["t",{"w":"forgetting","s":"ting","e":true,"k":"t","d":[86,87,88,90,96,97,99,100,102,103,108,112,113,115,116,119,120,122,123,126,128,129,130,133,134,137,140,145,149,152,160,163,164,177,178,180,182,187,188,192,193,196],"c":[]}]]}],["w",{"w":"forward","s":"ward","e":true,"k":"w","d":[355,377],"c":[["-",{"w":"forward-get-balance","s":"-get-balance","e":true,"k":"-","d":[117],"c":[]}]]}],["c",{"w":"forc","s":"c","e":false,"k":"c","d":[],"c":[["i",{"w":"forci","s":"i","e":false,"k":"i","d":[],"c":[["b",{"w":"forcibly","s":"bly","e":true,"k":"b","d":[144],"c":[]}],["n",{"w":"forcing","s":"ng","e":true,"k":"n","d":[352],"c":[]}]]}],["e",{"w":"force","s":"e","e":true,"k":"e","d":[201,356,366],"c":[["w",{"w":"forcewalletselect","s":"walletselect","e":true,"k":"w","d":[355,356,366],"c":[]}]]}]]}],["k",{"w":"fork","s":"k","e":true,"k":"k","d":[221,373],"c":[["s",{"w":"forks","s":"s","e":true,"k":"s","d":[161,422,502],"c":[]}]]}]]}],["l",{"w":"fol","s":"l","e":false,"k":"l","d":[],"c":[["d",{"w":"fold","s":"d","e":true,"k":"d","d":[96,105,177,180,202,517],"c":[["e",{"w":"folder","s":"er","e":true,"k":"e","d":[9,20,21,22,23,26,27,29,30,47,48,75,230,231,232,243,353,354,357,375,423,510,515],"c":[["s",{"w":"folders","s":"s","e":true,"k":"s","d":[224],"c":[]}],["i",{"w":"foldericon","s":"icon","e":true,"k":"i","d":[243,357],"c":[]}]]}],["i",{"w":"folding","s":"ing","e":true,"k":"i","d":[96],"c":[]}]]}],["l",{"w":"follow","s":"low","e":true,"k":"l","d":[12,14,15,46,48,68,245,246,348,355,375,377,509,510,516],"c":[["i",{"w":"following","s":"ing","e":true,"k":"i","d":[9,12,13,14,15,17,26,27,28,29,46,52,55,58,68,69,71,75,222,224,226,229,231,234,237,238,245,246,258,348,352,354,355,357,368,371,374,376,377,379,426,444,504,509,511,513,515,516],"c":[]}],["s",{"w":"follows","s":"s","e":true,"k":"s","d":[9,14,15,17,28,54,69,232,355,376,511,513],"c":[]}],["e",{"w":"followed","s":"ed","e":true,"k":"e","d":[374],"c":[]}],["n",{"w":"followning","s":"ning","e":true,"k":"n","d":[426,444],"c":[]}]]}]]}],["u",{"w":"found","s":"und","e":true,"k":"u","d":[14,15,17,52,85,109,159,183,194,201,258,259,379,517],"c":[["a",{"w":"foundation","s":"ation","e":true,"k":"a","d":[68,122,160],"c":[["s",{"w":"foundations","s":"s","e":true,"k":"s","d":[69],"c":[]}]]}]]}],["o",{"w":"foo","s":"o","e":true,"k":"o","d":[141,230,517],"c":[["t",{"w":"footer'","s":"ter'","e":true,"k":"t","d":[44,466],"c":[]}]]}],["c",{"w":"focus","s":"cus","e":true,"k":"c","d":[65,68,377,439,462],"c":[["i",{"w":"focusing","s":"ing","e":true,"k":"i","d":[78],"c":[]}],["e",{"w":"focuse","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"focused","s":"d","e":true,"k":"d","d":[119,129,219],"c":[]}],["s",{"w":"focuses","s":"s","e":true,"k":"s","d":[219,220],"c":[]}]]}]]}],["s",{"w":"fostering","s":"stering","e":true,"k":"s","d":[119],"c":[]}]]}],["i",{"w":"fi","s":"i","e":false,"k":"i","d":[],"c":[["r",{"w":"fir","s":"r","e":false,"k":"r","d":[],"c":[["s",{"w":"first","s":"st","e":true,"k":"s","d":[4,9,11,12,14,15,22,50,53,68,69,71,75,77,90,108,109,114,154,176,191,194,224,226,234,245,246,258,348,356,358,362,366,368,371,374,375,376,377,378,379,381,505,511,513,515,516],"c":[["-",{"w":"first-line","s":"-line","e":true,"k":"-","d":[44,259,466,508],"c":[]}]]}],["e",{"w":"fired","s":"ed","e":true,"k":"e","d":[7,361],"c":[]}]]}],["l",{"w":"fil","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"file","s":"e","e":true,"k":"e","d":[4,5,9,12,14,15,16,17,18,20,21,22,23,26,27,29,30,46,47,50,52,67,68,221,224,226,227,230,231,232,243,245,246,348,353,354,357,358,359,362,374,375,376,377,378,423,502,504,510,515],"c":[["s",{"w":"files","s":"s","e":true,"k":"s","d":[9,17,19,20,21,22,23,26,27,29,30,47,55,75,224,226,230,231,232,243,244,353,354,357,375,376,423],"c":[["'",{"w":"files'","s":"'","e":true,"k":"'","d":[9,20,21,23,26,29,30,230,231,232,243,353,354,357,375,423],"c":[]}],["i",{"w":"filesignature","s":"ignature","e":true,"k":"i","d":[239],"c":[]}]]}],["_",{"w":"file_append","s":"_append","e":true,"k":"_","d":[374,375,376,377,378,379],"c":[]}]]}],["t",{"w":"filter","s":"ter","e":true,"k":"t","d":[7,11,96,105,177,183,256,356,361,366,381,420,501,505],"c":[["i",{"w":"filtering","s":"ing","e":true,"k":"i","d":[7,68,177,361],"c":[]}],["s",{"w":"filters","s":"s","e":true,"k":"s","d":[51,105,177,219,222,425,443],"c":[]}],["e",{"w":"filtered","s":"ed","e":true,"k":"e","d":[68,177],"c":[]}]]}]]}],["n",{"w":"fin","s":"n","e":false,"k":"n","d":[],"c":[["d",{"w":"find","s":"d","e":true,"k":"d","d":[12,44,46,48,49,52,53,128,183,219,224,245,348,377,466],"c":[["i",{"w":"finding","s":"ing","e":true,"k":"i","d":[77,183],"c":[]}],["s",{"w":"finds","s":"s","e":true,"k":"s","d":[183,258],"c":[]}],["-",{"w":"find-index","s":"-index","e":true,"k":"-","d":[183],"c":[]}],["e",{"w":"finder","s":"er","e":true,"k":"e","d":[515],"c":[]}]]}],["a",{"w":"fina","s":"a","e":false,"k":"a","d":[],"c":[["l",{"w":"final","s":"l","e":true,"k":"l","d":[19,68,96,163,233,367],"c":[["l",{"w":"finally","s":"ly","e":true,"k":"l","d":[12,245,348,377],"c":[]}],["i",{"w":"finalize","s":"ize","e":true,"k":"i","d":[233,367],"c":[["d",{"w":"finalized","s":"d","e":true,"k":"d","d":[242,377],"c":[]}]]}]]}],["n",{"w":"financial","s":"ncial","e":true,"k":"n","d":[77,102,114,140,154,160,176,191],"c":[]}]]}],["i",{"w":"finish","s":"ish","e":true,"k":"i","d":[26],"c":[["i",{"w":"finishing","s":"ing","e":true,"k":"i","d":[68],"c":[]}],["e",{"w":"finished","s":"ed","e":true,"k":"e","d":[376,515],"c":[]}]]}],["g",{"w":"fingertips","s":"gertips","e":true,"k":"g","d":[257,345],"c":[]}]]}],["s",{"w":"fish","s":"sh","e":true,"k":"s","d":[18],"c":[]}],["e",{"w":"field","s":"eld","e":true,"k":"e","d":[27,52,68,116,184,356,357,366,374,376,515],"c":[["s",{"w":"fields","s":"s","e":true,"k":"s","d":[51,52,69,83,103,116,189,226,234,243,346,368,515],"c":[]}]]}],["x",{"w":"fixe","s":"xe","e":false,"k":"x","d":[],"c":[["d",{"w":"fixed","s":"d","e":true,"k":"d","d":[92,160,516],"c":[["-",{"w":"fixed-size","s":"-size","e":true,"k":"-","d":[80],"c":[]}]]}],["s",{"w":"fixes","s":"s","e":true,"k":"s","d":[356,366],"c":[]}]]}],["t",{"w":"fit","s":"t","e":true,"k":"t","d":[88,120],"c":[]}],["g",{"w":"figure","s":"gure","e":true,"k":"g","d":[239],"c":[]}]]}],["l",{"w":"fl","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"flex","s":"ex","e":true,"k":"e","d":[74,425,443],"c":[["-",{"w":"flex-","s":"-","e":false,"k":"-","d":[],"c":[["w",{"w":"flex-wrap","s":"wrap","e":true,"k":"w","d":[230,244,353],"c":[["'",{"w":"flex-wrap'","s":"'","e":true,"k":"'","d":[4,5,6,7,67,226,227,358,359,360,361,362,371,372],"c":[]}]]}],["c",{"w":"flex-col","s":"col","e":true,"k":"c","d":[11,44,256,381,420,466,501,505,508],"c":[["'",{"w":"flex-col'","s":"'","e":true,"k":"'","d":[11,44,256,381,466,501,505],"c":[]}]]}]]}],["i",{"w":"flexib","s":"ib","e":false,"k":"i","d":[],"c":[["l",{"w":"flexible","s":"le","e":true,"k":"l","d":[69,81,90,119,149,180,355],"c":[]}],["i",{"w":"flexibility","s":"ility","e":true,"k":"i","d":[79,100,152,202],"c":[]}]]}]]}],["a",{"w":"flag","s":"ag","e":true,"k":"a","d":[9,76,113,128,174,187,378,517],"c":[["s",{"w":"flags","s":"s","e":true,"k":"s","d":[76,100,113,128,130,174,187,517],"c":[["-",{"w":"flags-example","s":"-example","e":true,"k":"-","d":[517],"c":[]}]]}],["-",{"w":"flag-based","s":"-based","e":true,"k":"-","d":[113],"c":[]}],["p",{"w":"flagposition","s":"position","e":true,"k":"p","d":[128,174],"c":[]}],["_",{"w":"flag_","s":"_","e":false,"k":"_","d":[],"c":[["r",{"w":"flag_read","s":"read","e":true,"k":"r","d":[174],"c":[]}],["w",{"w":"flag_write","s":"write","e":true,"k":"w","d":[174],"c":[]}],["e",{"w":"flag_execute","s":"execute","e":true,"k":"e","d":[174],"c":[]}],["a",{"w":"flag_a","s":"a","e":true,"k":"a","d":[187],"c":[]}],["b",{"w":"flag_b","s":"b","e":true,"k":"b","d":[187],"c":[]}],["c",{"w":"flag_c","s":"c","e":true,"k":"c","d":[187],"c":[]}],["d",{"w":"flag_d","s":"d","e":true,"k":"d","d":[187],"c":[]}]]}]]}],["o",{"w":"flow","s":"ow","e":true,"k":"o","d":[170,171,196,219,220,233,367],"c":[["s",{"w":"flows","s":"s","e":true,"k":"s","d":[51,108,114,154,163,176,191],"c":[]}],["c",{"w":"flowchart","s":"chart","e":true,"k":"c","d":[55],"c":[]}]]}],["u",{"w":"fluid","s":"uid","e":true,"k":"u","d":[69],"c":[]}],["i",{"w":"flip","s":"ip","e":true,"k":"i","d":[76],"c":[]}]]}],["t",{"w":"ft","s":"t","e":true,"k":"t","d":[7,58,60,219,222,231,251,340,361,372],"c":[["-",{"w":"ft-","s":"-","e":true,"k":"-","d":[190],"c":[["m",{"w":"ft-mint","s":"mint","e":true,"k":"m","d":[7,69,115,123,125,160,178,190,361],"c":[]}],["b",{"w":"ft-burn","s":"burn","e":true,"k":"b","d":[69,115,123,125,160,178,190],"c":[]}],["g",{"w":"ft-get-","s":"get-","e":false,"k":"g","d":[],"c":[["b",{"w":"ft-get-balance","s":"balance","e":true,"k":"b","d":[69,92,115,123,125,160,178,190],"c":[]}],["s",{"w":"ft-get-supply","s":"supply","e":true,"k":"s","d":[69,115,123,125,160,178,190],"c":[]}]]}],["t",{"w":"ft-tra","s":"tra","e":false,"k":"t","d":[],"c":[["n",{"w":"ft-transfer","s":"nsfer","e":true,"k":"n","d":[115,123,160,178,190],"c":[]}],["i",{"w":"ft-trait","s":"it","e":true,"k":"i","d":[511,513],"c":[]}]]}]]}],["s",{"w":"fts","s":"s","e":true,"k":"s","d":[7,238,361],"c":[]}],["'",{"w":"ft'","s":"'","e":true,"k":"'","d":[62,253],"c":[]}],["p",{"w":"ftpostcondition","s":"postcondition","e":true,"k":"p","d":[229,238],"c":[]}],["_",{"w":"ft_transfer","s":"_transfer","e":true,"k":"_","d":[372],"c":[]}]]}],["5",{"w":"f5a3","s":"5a3","e":true,"k":"5","d":[229],"c":[]}],["n",{"w":"fncall","s":"ncall","e":true,"k":"n","d":[514],"c":[]}]]}],["'",{"w":"'","s":"'","e":true,"k":"'","d":[1,2,3,4,5,6,7,8,9,11,12,16,20,22,26,27,30,31,32,34,35,36,37,38,39,41,42,43,44,54,57,58,60,61,62,63,64,65,67,73,78,203,204,206,207,208,210,212,214,215,216,218,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,243,244,245,246,247,249,251,252,253,254,256,257,259,260,261,262,264,265,266,267,268,269,270,271,272,274,275,276,277,278,279,281,283,284,285,286,287,289,290,291,292,293,295,296,297,298,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,319,320,321,322,323,324,325,326,327,328,329,330,332,333,335,336,338,340,342,343,344,345,347,348,349,350,352,353,354,356,357,358,359,360,361,362,365,366,367,368,369,370,371,372,373,375,381,382,383,384,385,386,387,389,391,392,393,395,396,398,399,401,402,405,407,408,409,410,411,413,414,415,416,418,419,420,421,423,429,430,432,433,435,436,437,438,441,442,446,447,449,450,451,452,454,455,456,457,458,459,461,464,465,466,467,469,470,472,473,475,476,477,478,480,481,483,484,486,487,488,489,491,492,493,494,495,497,499,500,501,502,505,506,507,508,509,511,512,513,514,515],"c":[["f",{"w":"'f","s":"f","e":false,"k":"f","d":[],"c":[["l",{"w":"'flex","s":"lex","e":true,"k":"l","d":[4,5,6,7,11,44,67,226,227,230,244,256,353,358,359,360,361,362,371,372,381,420,466,501,505,508],"c":[["-",{"w":"'flex-1'","s":"-1'","e":true,"k":"-","d":[67,226,227,371,372],"c":[]}]]}],["u",{"w":"'fumadocs-","s":"umadocs-","e":false,"k":"u","d":[],"c":[["u",{"w":"'fumadocs-ui","s":"ui","e":true,"k":"u","d":[5,6,7,9,20,21,23,26,29,30,44,49,51,64,67,224,226,227,230,231,232,233,234,235,236,243,244,259,353,354,355,356,357,359,360,361,365,366,367,368,369,370,371,375,378,382,383,384,385,386,387,422,423,466,502,504,508,510,515],"c":[]}],["o",{"w":"'fumadocs-openapi","s":"openapi","e":true,"k":"o","d":[67,226,227,234,235,236,356,366,368,369,370,371,372],"c":[]}]]}],["s",{"w":"'fs'","s":"s'","e":true,"k":"s","d":[226,234,368],"c":[]}],["o",{"w":"'foo","s":"oo","e":true,"k":"o","d":[234,368],"c":[["'",{"w":"'foo'","s":"'","e":true,"k":"'","d":[226,234,368],"c":[]}]]}],["t",{"w":"'ft-postcondition'","s":"t-postcondition'","e":true,"k":"t","d":[229,238],"c":[]}],["5",{"w":"'f5a31c1268a1e37d4edaa05c7d11183c5fbfdcdc48aae36ea4d8cd5cb709932801'","s":"5a31c1268a1e37d4edaa05c7d11183c5fbfdcdc48aae36ea4d8cd5cb709932801'","e":true,"k":"5","d":[239],"c":[]}]]}],["t",{"w":"'t","s":"t","e":false,"k":"t","d":[],"c":[["a",{"w":"'tab","s":"ab","e":true,"k":"a","d":[4,5,6,7,67,226,227,230,244,353,358,359,360,361,362,371,372],"c":[]}],["r",{"w":"'trans","s":"rans","e":false,"k":"r","d":[],"c":[["i",{"w":"'transition-colors","s":"ition-colors","e":true,"k":"i","d":[44,239,420,466],"c":[["'",{"w":"'transition-colors'","s":"'","e":true,"k":"'","d":[4,358,362],"c":[]}]]}],["a",{"w":"'transaction","s":"action","e":true,"k":"a","d":[230,353,356,366],"c":[]}]]}],["o",{"w":"'to","s":"o","e":false,"k":"o","d":[],"c":[["k",{"w":"'token'","s":"ken'","e":true,"k":"k","d":[7,231,361],"c":[]}],["t",{"w":"'total-deposits'","s":"tal-deposits'","e":true,"k":"t","d":[12,224,245,348],"c":[]}]]}],["e",{"w":"'te","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"'test","s":"st","e":true,"k":"s","d":[226,234,246,368],"c":[["n",{"w":"'testnet'","s":"net'","e":true,"k":"n","d":[226,227,229,234,235,237,241,368,369],"c":[]}],["-",{"w":"'test-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"'test-contract'","s":"contract'","e":true,"k":"c","d":[226,234,368],"c":[]}],["a",{"w":"'test-asset","s":"asset","e":false,"k":"a","d":[],"c":[["-",{"w":"'test-asset-contract'","s":"-contract'","e":true,"k":"-","d":[226,234,368],"c":[]}],["'",{"w":"'test-asset'","s":"'","e":true,"k":"'","d":[226,234,368],"c":[]}]]}],["t",{"w":"'test-token","s":"token","e":false,"k":"t","d":[],"c":[["'",{"w":"'test-token'","s":"'","e":true,"k":"'","d":[226,234,368],"c":[]}],["-",{"w":"'test-token-asset-id'","s":"-asset-id'","e":true,"k":"-","d":[226,234,368],"c":[]}]]}]]}]]}],["x",{"w":"'text-lg'","s":"xt-lg'","e":true,"k":"x","d":[246],"c":[]}]]}],["x",{"w":"'txid'","s":"xid'","e":true,"k":"x","d":[233,367],"c":[]}]]}],["b",{"w":"'b","s":"b","e":false,"k":"b","d":[],"c":[["a",{"w":"'ba","s":"a","e":false,"k":"a","d":[],"c":[["d",{"w":"'badge","s":"dge","e":true,"k":"d","d":[4,5,6,7,67,226,227,230,244,353,358,359,360,361,362,371,372],"c":[]}],["r",{"w":"'bar'","s":"r'","e":true,"k":"r","d":[227,236,370],"c":[]}]]}],["t",{"w":"'btc'","s":"tc'","e":true,"k":"t","d":[6,360],"c":[]}],["g",{"w":"'bg-","s":"g-","e":true,"k":"g","d":[9,20,375],"c":[]}],["o",{"w":"'borrow","s":"orrow","e":false,"k":"o","d":[],"c":[["s",{"w":"'borrows","s":"s","e":true,"k":"s","d":[12,245,348],"c":[]}],["'",{"w":"'borrow'","s":"'","e":true,"k":"'","d":[12,245,348],"c":[]}]]}],["2",{"w":"'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01'","s":"244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01'","e":true,"k":"2","d":[226,227,234,236,368,370],"c":[]}],["c",{"w":"'bc1q","s":"c1q","e":false,"k":"c","d":[],"c":[["w",{"w":"'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'","s":"w508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'","e":true,"k":"w","d":[356,366],"c":[]}],["x",{"w":"'bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh'","s":"xy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh'","e":true,"k":"x","d":[356,366],"c":[]}]]}],["i",{"w":"'bitcoin","s":"itcoin","e":true,"k":"i","d":[420],"c":[]}]]}],["s",{"w":"'s","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"'st","s":"t","e":false,"k":"t","d":[],"c":[["1",{"w":"'st1","s":"1","e":false,"k":"1","d":[],"c":[["s",{"w":"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5","s":"sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5","e":true,"k":"s","d":[6,7,71,81,103,193,360,361],"c":[["'",{"w":"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5'","s":"'","e":true,"k":"'","d":[5,6,7,359,360,361],"c":[]}]]}],["p",{"w":"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm","s":"pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm","e":true,"k":"p","d":[6,27,86,94,164,193,360,516],"c":[["'",{"w":"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm'","s":"'","e":true,"k":"'","d":[6,7,360,361],"c":[]}]]}]]}],["2",{"w":"'st2","s":"2","e":false,"k":"2","d":[],"c":[["c",{"w":"'st2cy5v39nhdpwsxmw9qdt3hc3gd6q6xx4cfrk9ag","s":"cy5v39nhdpwsxmw9qdt3hc3gd6q6xx4cfrk9ag","e":true,"k":"c","d":[6,81,360],"c":[["'",{"w":"'st2cy5v39nhdpwsxmw9qdt3hc3gd6q6xx4cfrk9ag'","s":"'","e":true,"k":"'","d":[6,360],"c":[]}]]}],["f",{"w":"'st2f4bk4gzh6yfbnhyddgn4t1rkba7da1bjzpjejj'","s":"f4bk4gzh6yfbnhyddgn4t1rkba7da1bjzpjejj'","e":true,"k":"f","d":[226,234,368],"c":[]}],["e",{"w":"'st2eb9weqnr9p0k28d2dc352tm75yg3k0gt7v13cv'","s":"eb9weqnr9p0k28d2dc352tm75yg3k0gt7v13cv'","e":true,"k":"e","d":[353],"c":[]}],["2",{"w":"'st22t6zs7hvwemzhhfk77h4gtndtwnpqax8wzakhj'","s":"2t6zs7hvwemzhhfk77h4gtndtwnpqax8wzakhj'","e":true,"k":"2","d":[353],"c":[]}]]}],["x",{"w":"'stx","s":"x","e":false,"k":"x","d":[],"c":[["'",{"w":"'stx'","s":"'","e":true,"k":"'","d":[7,361],"c":[]}],["-",{"w":"'stx-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"'stx-defi'","s":"defi'","e":true,"k":"d","d":[12,224,245,348],"c":[]}],["p",{"w":"'stx-postcondition'","s":"postcondition'","e":true,"k":"p","d":[229,238],"c":[]}]]}],["_",{"w":"'stx_","s":"_","e":false,"k":"_","d":[],"c":[["g",{"w":"'stx_geta","s":"geta","e":false,"k":"g","d":[],"c":[["c",{"w":"'stx_getaccounts'","s":"ccounts'","e":true,"k":"c","d":[352,356,366],"c":[]}],["d",{"w":"'stx_getaddresses'","s":"ddresses'","e":true,"k":"d","d":[356,366],"c":[]}]]}],["t",{"w":"'stx_transferstx'","s":"transferstx'","e":true,"k":"t","d":[353,356,357,366],"c":[]}],["d",{"w":"'stx_deploycontract'","s":"deploycontract'","e":true,"k":"d","d":[353,356,366],"c":[]}],["c",{"w":"'stx_callcontract'","s":"callcontract'","e":true,"k":"c","d":[353,356,366],"c":[]}],["s",{"w":"'stx_sign","s":"sign","e":false,"k":"s","d":[],"c":[["m",{"w":"'stx_signmessage'","s":"message'","e":true,"k":"m","d":[354,356,366],"c":[]}],["s",{"w":"'stx_signstructuredmessage'","s":"structuredmessage'","e":true,"k":"s","d":[354,356,366],"c":[]}]]}]]}]]}],["a",{"w":"'sta","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"'stacks","s":"cks","e":true,"k":"c","d":[11,381,505],"c":[]}],["t",{"w":"'status'","s":"tus'","e":true,"k":"t","d":[67,226,227],"c":[]}]]}],["0",{"w":"'st000000000000000000002amw42h'","s":"000000000000000000002amw42h'","e":true,"k":"0","d":[64,67,365,382,383,384,385,386,387,514],"c":[]}],["o",{"w":"'store_write'","s":"ore_write'","e":true,"k":"o","d":[67,226,227],"c":[]}],["3",{"w":"'st3","s":"3","e":false,"k":"3","d":[],"c":[["x",{"w":"'st3x6qwwetnbzwgbk6drgtr1kx50s74d3425q1tpk","s":"x6qwwetnbzwgbk6drgtr1kx50s74d3425q1tpk","e":true,"k":"x","d":[141,200],"c":[]}],["k",{"w":"'st3kc0mtnw34s1zxd36jykfd3jjmwa01m55dsj4je'","s":"kc0mtnw34s1zxd36jykfd3jjmwa01m55dsj4je'","e":true,"k":"k","d":[226,234,368],"c":[]}],["9",{"w":"'st39mj145br6s8c315ag2bd61sj16e208p1fdk3ak'","s":"9mj145br6s8c315ag2bd61sj16e208p1fdk3ak'","e":true,"k":"9","d":[237],"c":[]}]]}],["b",{"w":"'stb44hypyat2bb2qe513nsp81htmywbjp02hpgk6","s":"b44hypyat2bb2qe513nsp81htmywbjp02hpgk6","e":true,"k":"b","d":[231],"c":[["'",{"w":"'stb44hypyat2bb2qe513nsp81htmywbjp02hpgk6'","s":"'","e":true,"k":"'","d":[231,238],"c":[]}]]}]]}],["a",{"w":"'sa","s":"a","e":false,"k":"a","d":[],"c":[["y",{"w":"'say-hi'","s":"y-hi'","e":true,"k":"y","d":[6,353,360],"c":[]}],["m",{"w":"'sample","s":"mple","e":true,"k":"m","d":[51],"c":[]}]]}],["p",{"w":"'sp","s":"p","e":false,"k":"p","d":[],"c":[["1",{"w":"'sp1","s":"1","e":false,"k":"1","d":[],"c":[["h",{"w":"'sp1h","s":"h","e":false,"k":"h","d":[],"c":[["t",{"w":"'sp1htbvd3jg9c05j7hbjthgr0ggw7kxw28m5js8qe","s":"tbvd3jg9c05j7hbjthgr0ggw7kxw28m5js8qe","e":true,"k":"t","d":[27],"c":[]}],["1",{"w":"'sp1h1733v5mz3sz9xrw9fkygezt0jdgeb8y634c7r","s":"1733v5mz3sz9xrw9fkygezt0jdgeb8y634c7r","e":true,"k":"1","d":[58,516],"c":[]}]]}],["2",{"w":"'sp12","s":"2","e":true,"k":"2","d":[147],"c":[]}],["m",{"w":"'sp1mxszf4nfc8jq1ttygec2wadmc7y3ghvzyrx6rf'","s":"mxszf4nfc8jq1ttygec2wadmc7y3ghvzyrx6rf'","e":true,"k":"m","d":[240],"c":[]}]]}],["2",{"w":"'sp2","s":"2","e":false,"k":"2","d":[],"c":[["j",{"w":"'sp2j","s":"j","e":false,"k":"j","d":[],"c":[["4",{"w":"'sp2j4zq6zq6zq6zq6zq6zq6zq6zq6zq6zq6zq6zq6","s":"4zq6zq6zq6zq6zq6zq6zq6zq6zq6zq6zq6zq6","e":true,"k":"4","d":[90],"c":[]}],["6",{"w":"'sp2j6zy48gv1ez5v2v5rb9mp66sw86pykkq9h6dpr","s":"6zy48gv1ez5v2v5rb9mp66sw86pykkq9h6dpr","e":true,"k":"6","d":[117],"c":[]}],["x",{"w":"'sp2jxkmsh007npyaqhkjpqmaqyad90nqgtvjvq02b'","s":"xkmsh007npyaqhkjpqmaqyad90nqgtvjvq02b'","e":true,"k":"x","d":[226,229,234,238,368],"c":[]}]]}],["z",{"w":"'sp2zd731anqzt6j4k3f5n8a40zxwxc1xfxhvvqfke'","s":"zd731anqzt6j4k3f5n8a40zxwxc1xfxhvvqfke'","e":true,"k":"z","d":[226,234,368],"c":[]}],["b",{"w":"'sp2bs6hd7tn34v8z5bnf8q2aw3k8k2dpv4264cf26'","s":"bs6hd7tn34v8z5bnf8q2aw3k8k2dpv4264cf26'","e":true,"k":"b","d":[227,235,236,369,370],"c":[]}],["m",{"w":"'sp2mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn","s":"mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn","e":true,"k":"m","d":[356,366],"c":[["'",{"w":"'sp2mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn'","s":"'","e":true,"k":"'","d":[356,357,366],"c":[]}]]}]]}],["a",{"w":"'spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf","s":"axya5xs51713fdtq8h94ej4v579cxmtrnbzksf","e":true,"k":"a","d":[101,123,124,136,139,146,147,172,178,189,190],"c":[]}],["3",{"w":"'sp3","s":"3","e":false,"k":"3","d":[],"c":[["f",{"w":"'sp3fgq8","s":"fgq8","e":true,"k":"f","d":[226,234,368],"c":[["z",{"w":"'sp3fgq8z7jy9bwyz5wm53e0m9nk7whjf0691nz159'","s":"z7jy9bwyz5wm53e0m9nk7whjf0691nz159'","e":true,"k":"z","d":[226,227,234,236,368,370],"c":[]}]]}],["d",{"w":"'sp3d6pv2acbpekyjtcmh7hen02kp87qsp8kteh335","s":"d6pv2acbpekyjtcmh7hen02kp87qsp8kteh335","e":true,"k":"d","d":[229,238],"c":[]}]]}],["b",{"w":"'spbmrfrppgcde3f384wcjpk8pqjgz8k9qkk7f59x'","s":"bmrfrppgcde3f384wcjpk8pqjgz8k9qkk7f59x'","e":true,"k":"b","d":[226,234,368],"c":[]}],["6",{"w":"'sp62m8mefh32wgsb7xsf9wjzd7tqb48vqb5anwsj'","s":"62m8mefh32wgsb7xsf9wjzd7tqb48vqb5anwsj'","e":true,"k":"6","d":[226,234,368],"c":[]}],["0",{"w":"'sp000000000000000000002q6vf78'","s":"000000000000000000002q6vf78'","e":true,"k":"0","d":[235,369],"c":[]}],["8",{"w":"'sp8a9hz3pkst0s42vm9523z9nv42sz026v4k39wh","s":"8a9hz3pkst0s42vm9523z9nv42sz026v4k39wh","e":true,"k":"8","d":[516],"c":[]}],["s",{"w":"'spscwdv3rkv5zrn1fqd84ye1nqfedj9r1f4dyq11","s":"scwdv3rkv5zrn1fqd84ye1nqfedj9r1f4dyq11","e":true,"k":"s","d":[516],"c":[]}]]}],["m",{"w":"'sm","s":"m","e":true,"k":"m","d":[423],"c":[["3",{"w":"'sm3vdxk3wzzsa84xxfkafaf15nnzx32ctsg82jfq4","s":"3vdxk3wzzsa84xxfkafaf15nnzx32ctsg82jfq4","e":true,"k":"3","d":[28],"c":[]}]]}],["i",{"w":"'sign","s":"ign","e":false,"k":"i","d":[],"c":[["-",{"w":"'sign-out'","s":"-out'","e":true,"k":"-","d":[67,226,227],"c":[]}],["a",{"w":"'signature","s":"ature","e":true,"k":"a","d":[354],"c":[]}],["p",{"w":"'signpsbt'","s":"psbt'","e":true,"k":"p","d":[356,366],"c":[]}]]}],["z",{"w":"'sz2j6zy48gv1ez5v2v5rb9mp66sw86pykkq9h6dpr","s":"z2j6zy48gv1ez5v2v5rb9mp66sw86pykkq9h6dpr","e":true,"k":"z","d":[85,98,150,151,166,184,198],"c":[]}],["o",{"w":"'some","s":"ome","e":true,"k":"o","d":[227,236,370],"c":[]}],["e",{"w":"'se","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"'sen","s":"n","e":false,"k":"n","d":[],"c":[["t",{"w":"'sent'","s":"t'","e":true,"k":"t","d":[229,238],"c":[]}],["d",{"w":"'send","s":"d","e":false,"k":"d","d":[],"c":[["s",{"w":"'sends","s":"s","e":true,"k":"s","d":[246],"c":[]}],["t",{"w":"'sendtransfer'","s":"transfer'","e":true,"k":"t","d":[356,366],"c":[]}]]}]]}],["c",{"w":"'secret'","s":"cret'","e":true,"k":"c","d":[240],"c":[]}]]}],["b",{"w":"'sbtc'","s":"btc'","e":true,"k":"b","d":[233,367],"c":[]}]]}],["c",{"w":"'c","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"'co","s":"o","e":false,"k":"o","d":[],"c":[["u",{"w":"'count","s":"unt","e":false,"k":"u","d":[],"c":[["e",{"w":"'counter","s":"er","e":false,"k":"e","d":[],"c":[["'",{"w":"'counter'","s":"'","e":true,"k":"'","d":[6,7,246,360,361],"c":[]}],["s",{"w":"'counters'","s":"s'","e":true,"k":"s","d":[356,366],"c":[]}]]}],["'",{"w":"'count'","s":"'","e":true,"k":"'","d":[7,246,356,361,366],"c":[]}]]}],["n",{"w":"'con","s":"n","e":false,"k":"n","d":[],"c":[["t",{"w":"'contract","s":"tract","e":false,"k":"t","d":[],"c":[["s",{"w":"'contracts","s":"s","e":true,"k":"s","d":[20,30,221],"c":[]}],["_",{"w":"'contract_","s":"_","e":false,"k":"_","d":[],"c":[["n",{"w":"'contract_name'","s":"name'","e":true,"k":"n","d":[226,234,368],"c":[]}],["f",{"w":"'contract_function'","s":"function'","e":true,"k":"f","d":[226,234,368],"c":[]}]]}],["-",{"w":"'contract-name'","s":"-name'","e":true,"k":"-","d":[226,234,368],"c":[]}]]}],["n",{"w":"'connected","s":"nected","e":true,"k":"n","d":[353,354],"c":[]}]]}]]}],["l",{"w":"'clarinet","s":"larinet","e":true,"k":"l","d":[11,22,26,27,30,381,505],"c":[["'",{"w":"'clarinet'","s":"'","e":true,"k":"'","d":[11,22,26,27,30,381,505],"c":[]}]]}],["h",{"w":"'ch","s":"h","e":false,"k":"h","d":[],"c":[["a",{"w":"'chain","s":"ain","e":false,"k":"a","d":[],"c":[["h",{"w":"'chainhook'","s":"hook'","e":true,"k":"h","d":[11,256,381,501,505],"c":[]}],["-",{"w":"'chain-id'","s":"-id'","e":true,"k":"-","d":[354,356,366],"c":[]}]]}],["n",{"w":"'chnidp","s":"nidp","e":true,"k":"n","d":[356,366],"c":[]}]]}],["u",{"w":"'cursor-default","s":"ursor-default","e":true,"k":"u","d":[18,27,377],"c":[]}],["f",{"w":"'cf8a5c7142d842bb38f30c5ab626f7996dd7494236edf21ba00349bb09b9558d'","s":"f8a5c7142d842bb38f30c5ab626f7996dd7494236edf21ba00349bb09b9558d'","e":true,"k":"f","d":[239],"c":[]}]]}],["i",{"w":"'i","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"'increment","s":"ncrement","e":false,"k":"n","d":[],"c":[["'",{"w":"'increment'","s":"'","e":true,"k":"'","d":[6,246,360],"c":[]}],["s",{"w":"'increments","s":"s","e":true,"k":"s","d":[246],"c":[]}],["e",{"w":"'incremented'","s":"ed'","e":true,"k":"e","d":[246],"c":[]}]]}],["s",{"w":"'is-","s":"s-","e":false,"k":"s","d":[],"c":[["a",{"w":"'is-active'","s":"active'","e":true,"k":"a","d":[7,361],"c":[]}],["p",{"w":"'is-pox-active'","s":"pox-active'","e":true,"k":"p","d":[514],"c":[]}]]}]]}],["a",{"w":"'a","s":"a","e":false,"k":"a","d":[],"c":[["d",{"w":"'add","s":"dd","e":true,"k":"d","d":[51],"c":[["'",{"w":"'add'","s":"'","e":true,"k":"'","d":[6,360],"c":[]}]]}],["p",{"w":"'api","s":"pi","e":true,"k":"p","d":[67],"c":[["'",{"w":"'api'","s":"'","e":true,"k":"'","d":[22],"c":[]}]]}],["c",{"w":"'ac","s":"c","e":false,"k":"c","d":[],"c":[["t",{"w":"'active'","s":"tive'","e":true,"k":"t","d":[50],"c":[]}],["c",{"w":"'accept","s":"cept","e":true,"k":"c","d":[58],"c":[]}]]}],["l",{"w":"'al","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"'alert","s":"ert","e":true,"k":"e","d":[51],"c":[]}],["l",{"w":"'allows","s":"lows","e":true,"k":"l","d":[224],"c":[]}]]}],["b",{"w":"'abi","s":"bi","e":true,"k":"b","d":[226],"c":[]}]]}],["p",{"w":"'p","s":"p","e":false,"k":"p","d":[],"c":[["o",{"w":"'po","s":"o","e":false,"k":"o","d":[],"c":[["o",{"w":"'pool'","s":"ol'","e":true,"k":"o","d":[6,7,360,361],"c":[]}],["i",{"w":"'pointer-events-none'","s":"inter-events-none'","e":true,"k":"i","d":[9,20,29,375],"c":[]}],["s",{"w":"'post'","s":"st'","e":true,"k":"s","d":[38,279,319,389,396,402,413,414],"c":[]}],["x",{"w":"'pox'","s":"x'","e":true,"k":"x","d":[514],"c":[]}]]}],["u",{"w":"'pu","s":"u","e":false,"k":"u","d":[],"c":[["t",{"w":"'put'","s":"t'","e":true,"k":"t","d":[35,41],"c":[]}],["b",{"w":"'publi","s":"bli","e":false,"k":"b","d":[],"c":[["s",{"w":"'publish_data'","s":"sh_data'","e":true,"k":"s","d":[226,227],"c":[]}],["c",{"w":"'public","s":"c","e":true,"k":"c","d":[354],"c":[]}]]}]]}],["r",{"w":"'print_event'","s":"rint_event'","e":true,"k":"r","d":[246],"c":[]}]]}],["g",{"w":"'g","s":"g","e":false,"k":"g","d":[],"c":[["e",{"w":"'get","s":"et","e":false,"k":"e","d":[],"c":[["-",{"w":"'get-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"'get-participant","s":"participant","e":false,"k":"p","d":[],"c":[["'",{"w":"'get-participant'","s":"'","e":true,"k":"'","d":[6,7,360,361],"c":[]}],["-",{"w":"'get-participant-data'","s":"-data'","e":true,"k":"-","d":[6,360],"c":[]}]]}],["b",{"w":"'get-b","s":"b","e":false,"k":"b","d":[],"c":[["y",{"w":"'get-byte-array'","s":"yte-array'","e":true,"k":"y","d":[6,360],"c":[]}],["t",{"w":"'get-btc-buffer'","s":"tc-buffer'","e":true,"k":"t","d":[6,360],"c":[]}],["a",{"w":"'get-balance-by-sender'","s":"alance-by-sender'","e":true,"k":"a","d":[224],"c":[]}]]}],["a",{"w":"'get-a","s":"a","e":false,"k":"a","d":[],"c":[["d",{"w":"'get-addresses'","s":"ddresses'","e":true,"k":"d","d":[6,360],"c":[]}],["m",{"w":"'get-amount-owed'","s":"mount-owed'","e":true,"k":"m","d":[12,245,348],"c":[]}]]}],["c",{"w":"'get-contribution-amount'","s":"contribution-amount'","e":true,"k":"c","d":[7,361],"c":[]}],["v",{"w":"'get-value'","s":"value'","e":true,"k":"v","d":[226,234,368],"c":[]}]]}],["'",{"w":"'get'","s":"'","e":true,"k":"'","d":[32,36,37,39,43,57,60,61,62,63,206,207,210,212,214,215,216,218,249,251,252,253,254,260,261,262,264,265,266,267,268,269,270,271,272,274,275,276,277,278,281,283,284,285,286,287,289,290,291,292,293,295,296,297,298,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,320,321,322,323,324,325,326,327,328,329,330,332,333,335,336,338,340,342,343,344,391,392,393,395,398,401,405,407,408,409,410,411,415,416,418,429,430,432,433,435,436,437,438,441,442,446,447,449,450,451,452,454,455,456,457,458,461,464,465,469,470,472,473,475,476,477,478,480,481,483,484,486,487,488,489,491,492,493,494,495,497,499,500],"c":[]}],["a",{"w":"'getaddresses'","s":"addresses'","e":true,"k":"a","d":[355,356,366],"c":[]}]]}],["r",{"w":"'group","s":"roup","e":true,"k":"r","d":[44,466],"c":[]}],["t",{"w":"'gt","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"'gte'","s":"e'","e":true,"k":"e","d":[229,238],"c":[]}],["'",{"w":"'gt'","s":"'","e":true,"k":"'","d":[238],"c":[]}]]}]]}],["h",{"w":"'h","s":"h","e":false,"k":"h","d":[],"c":[["a",{"w":"'has-contributed'","s":"as-contributed'","e":true,"k":"a","d":[6,360],"c":[]}],["e",{"w":"'he","s":"e","e":false,"k":"e","d":[],"c":[["l",{"w":"'hel","s":"l","e":false,"k":"l","d":[],"c":[["l",{"w":"'hello","s":"lo","e":true,"k":"l","d":[6,354,356,360,366],"c":[["-",{"w":"'hello-world'","s":"-world'","e":true,"k":"-","d":[6,7,230,360,361],"c":[]}],["_",{"w":"'hello_world'","s":"_world'","e":true,"k":"_","d":[227,236,370],"c":[]}],["'",{"w":"'hello'","s":"'","e":true,"k":"'","d":[227,236,370],"c":[]}]]}],["p",{"w":"'helpers'","s":"pers'","e":true,"k":"p","d":[6,360],"c":[]}]]}],["x",{"w":"'hex'","s":"x'","e":true,"k":"x","d":[226],"c":[]}]]}],["t",{"w":"'https","s":"ttps","e":true,"k":"t","d":[58,67,226,227,258,514],"c":[]}],["i",{"w":"'high'","s":"igh'","e":true,"k":"i","d":[233,367],"c":[]}]]}],["w",{"w":"'w","s":"w","e":false,"k":"w","d":[],"c":[["a",{"w":"'wallet","s":"allet","e":true,"k":"a","d":[356,366],"c":[["_",{"w":"'wallet_1'","s":"_1'","e":true,"k":"_","d":[7,12,224,245,246,348,361],"c":[]}]]}],["s",{"w":"'ws","s":"s","e":true,"k":"s","d":[65,365],"c":[]}],["-",{"w":"'w-full'","s":"-full'","e":true,"k":"-","d":[371,372],"c":[]}],["i",{"w":"'windows'","s":"indows'","e":true,"k":"i","d":[510],"c":[]}]]}],["n",{"w":"'n","s":"n","e":false,"k":"n","d":[],"c":[["f",{"w":"'nft","s":"ft","e":false,"k":"f","d":[],"c":[["'",{"w":"'nft'","s":"'","e":true,"k":"'","d":[7,361],"c":[]}],["-",{"w":"'nft-postcondition'","s":"-postcondition'","e":true,"k":"-","d":[229,238],"c":[]}]]}],["o",{"w":"'not-sent'","s":"ot-sent'","e":true,"k":"o","d":[238],"c":[]}]]}],["d",{"w":"'d","s":"d","e":false,"k":"d","d":[],"c":[["e",{"w":"'de","s":"e","e":false,"k":"e","d":[],"c":[["p",{"w":"'dep","s":"p","e":false,"k":"p","d":[],"c":[["l",{"w":"'deployer'","s":"loyer'","e":true,"k":"l","d":[7,361],"c":[]}],["o",{"w":"'deposit'","s":"osit'","e":true,"k":"o","d":[12,224,245,348],"c":[]}]]}],["f",{"w":"'defi'","s":"fi'","e":true,"k":"f","d":[12,224,245,348],"c":[]}],["l",{"w":"'delete'","s":"lete'","e":true,"k":"l","d":[34,42],"c":[]}],["c",{"w":"'decrypt'","s":"crypt'","e":true,"k":"c","d":[67,226,227],"c":[]}],["v",{"w":"'devnet'","s":"vnet'","e":true,"k":"v","d":[226,227,229,235,241,369],"c":[]}]]}],["5",{"w":"'d5200dee","s":"5200dee","e":true,"k":"5","d":[226,234,368],"c":[]}]]}],["r",{"w":"'r","s":"r","e":false,"k":"r","d":[],"c":[["e",{"w":"'re","s":"e","e":false,"k":"e","d":[],"c":[["g",{"w":"'register-participant'","s":"gister-participant'","e":true,"k":"g","d":[7,361],"c":[]}],["s",{"w":"'res'","s":"s'","e":true,"k":"s","d":[233,367],"c":[]}],["i",{"w":"'reimbursement'","s":"imbursement'","e":true,"k":"i","d":[353],"c":[]}]]}],["u",{"w":"'runes","s":"unes","e":true,"k":"u","d":[420,423],"c":[]}]]}],["l",{"w":"'l","s":"l","e":false,"k":"l","d":[],"c":[["u",{"w":"'lucide-react'","s":"ucide-react'","e":true,"k":"u","d":[9,11,44,64,73,78,228,230,231,232,239,241,243,256,353,354,357,365,381,382,383,384,385,386,387,423,466,501,505,509,511,513,516],"c":[]}],["o",{"w":"'low'","s":"ow'","e":true,"k":"o","d":[233,367],"c":[]}],["t",{"w":"'lt","s":"t","e":false,"k":"t","d":[],"c":[["'",{"w":"'lt'","s":"'","e":true,"k":"'","d":[238],"c":[]}],["e",{"w":"'lte'","s":"e'","e":true,"k":"e","d":[238],"c":[]}]]}],["e",{"w":"'leatherprovider'","s":"eatherprovider'","e":true,"k":"e","d":[356,366],"c":[]}]]}],["v",{"w":"'vi","s":"vi","e":false,"k":"v","d":[],"c":[["t",{"w":"'vitest'","s":"test'","e":true,"k":"t","d":[12,224,245,246,348],"c":[]}],["e",{"w":"'view","s":"ew","e":true,"k":"e","d":[353],"c":[]}]]}],["0",{"w":"'0x01'","s":"0x01'","e":true,"k":"0","d":[25,27],"c":[]}],["x",{"w":"'x","s":"x","e":false,"k":"x","d":[],"c":[["-",{"w":"'x-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"'x-api-key","s":"api-key","e":true,"k":"a","d":[58],"c":[]}],["f",{"w":"'x-foo'","s":"foo'","e":true,"k":"f","d":[227,236,370],"c":[]}]]}],["2",{"w":"'x2'","s":"2'","e":true,"k":"2","d":[235,369],"c":[]}],["p",{"w":"'xprva19evfhuzrzf3wulusv1uvcqnrp7xj2vn2myakauhbt8svjrrkkhanrg2bewmxhaedsouvubrpiztdc8wwgtz9ero2gxw5rk3vhhxmutb4v'","s":"prva19evfhuzrzf3wulusv1uvcqnrp7xj2vn2myakauhbt8svjrrkkhanrg2bewmxhaedsouvubrpiztdc8wwgtz9ero2gxw5rk3vhhxmutb4v'","e":true,"k":"p","d":[239],"c":[]}],["v",{"w":"'xverse'","s":"verse'","e":true,"k":"v","d":[356,366],"c":[]}]]}],["m",{"w":"'m","s":"m","e":false,"k":"m","d":[],"c":[["t",{"w":"'mt-0'","s":"t-0'","e":true,"k":"t","d":[67,226,227,371,372],"c":[]}],["y",{"w":"'my","s":"y","e":true,"k":"y","d":[67,226,227,354],"c":[["-",{"w":"'my-","s":"-","e":false,"k":"-","d":[],"c":[["2",{"w":"'my-20'","s":"20'","e":true,"k":"2","d":[226,227,371,372],"c":[]}],["c",{"w":"'my-contract'","s":"contract'","e":true,"k":"c","d":[353],"c":[]}]]}]]}],["a",{"w":"'ma","s":"a","e":false,"k":"a","d":[],"c":[["i",{"w":"'mainnet'","s":"innet'","e":true,"k":"i","d":[226,227,229,234,235,240,241,356,357,366,368,369],"c":[]}],["c",{"w":"'macos'","s":"cos'","e":true,"k":"c","d":[510],"c":[]}]]}],["o",{"w":"'mocknet'","s":"ocknet'","e":true,"k":"o","d":[226,227,229,241],"c":[]}],["e",{"w":"'me","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"'medium'","s":"dium'","e":true,"k":"d","d":[233,367],"c":[]}],["s",{"w":"'message'","s":"ssage'","e":true,"k":"s","d":[354],"c":[]}],["t",{"w":"'method'","s":"thod'","e":true,"k":"t","d":[356,366],"c":[]}]]}]]}],["u",{"w":"'user","s":"user","e":true,"k":"u","d":[237],"c":[["-",{"w":"'user-data'","s":"-data'","e":true,"k":"-","d":[67,226,227],"c":[]}]]}],["e",{"w":"'e","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"'encrypt'","s":"ncrypt'","e":true,"k":"n","d":[67,226,227],"c":[]}],["m",{"w":"'email'","s":"mail'","e":true,"k":"m","d":[226,227],"c":[]}],["x",{"w":"'example","s":"xample","e":true,"k":"x","d":[356,366],"c":[["_",{"w":"'example_e8e044a3_41d8b0fe_3dd3988ef302'","s":"_e8e044a3_41d8b0fe_3dd3988ef302'","e":true,"k":"_","d":[227,236,370],"c":[]}]]}],["q",{"w":"'eq'","s":"q'","e":true,"k":"q","d":[229,238],"c":[]}]]}],["7",{"w":"'7","s":"7","e":false,"k":"7","d":[],"c":[["7",{"w":"'770287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01'","s":"70287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01'","e":true,"k":"7","d":[226,234,368],"c":[]}],["5",{"w":"'753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601'","s":"53b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601'","e":true,"k":"5","d":[230],"c":[]}]]}],["6",{"w":"'6","s":"6","e":false,"k":"6","d":[],"c":[["d",{"w":"'6d430bb9","s":"d430bb9","e":true,"k":"d","d":[226,234,368],"c":[]}],["7",{"w":"'676dc36d89ba04cf1789552fc35f3a6279b4b5f13f3d49fb469b0afecea9698f'","s":"76dc36d89ba04cf1789552fc35f3a6279b4b5f13f3d49fb469b0afecea9698f'","e":true,"k":"7","d":[239],"c":[]}]]}],["2",{"w":"'2","s":"2","e":false,"k":"2","d":[],"c":[["a",{"w":"'2a584d89","s":"a584d89","e":true,"k":"a","d":[226,234,368],"c":[]}],["0",{"w":"'2000'","s":"000'","e":true,"k":"0","d":[356,366],"c":[]}],["'",{"w":"'2'","s":"'","e":true,"k":"'","d":[356,366],"c":[]}]]}],["k",{"w":"'kv-store'","s":"kv-store'","e":true,"k":"k","d":[226,234,368],"c":[]}],["1",{"w":"'1","s":"1","e":true,"k":"1","d":[354,356,366],"c":[["0",{"w":"'100","s":"00","e":false,"k":"0","d":[],"c":[["'",{"w":"'100'","s":"'","e":true,"k":"'","d":[229,238,353],"c":[]}],["0",{"w":"'1000'","s":"0'","e":true,"k":"0","d":[356,357,366],"c":[]}]]}]]}],["o",{"w":"'o","s":"o","e":false,"k":"o","d":[],"c":[["u",{"w":"'outline'","s":"utline'","e":true,"k":"u","d":[230],"c":[]}],["p",{"w":"'optional","s":"ptional","e":true,"k":"p","d":[356,357,366],"c":[]}],["r",{"w":"'ordinals","s":"rdinals","e":true,"k":"r","d":[420],"c":[]}]]}],["8",{"w":"'893fc4936c5350394bbe0053d2c31a4b5a44680f6dceb4be2aacaaa3c12e45ff01'","s":"893fc4936c5350394bbe0053d2c31a4b5a44680f6dceb4be2aacaaa3c12e45ff01'","e":true,"k":"8","d":[239],"c":[]}]]}],["_",{"w":"_","s":"_","e":true,"k":"_","d":[21,25,26,29,30,52,68,70,71,72,75,219,221,222,231,355,375,377,422,517],"c":[["s",{"w":"_s","s":"s","e":false,"k":"s","d":[],"c":[["h",{"w":"_shared","s":"hared","e":true,"k":"h","d":[1,3,247,419,421,467,506,507,512],"c":[]}],["u",{"w":"_subject_","s":"ubject_","e":true,"k":"u","d":[71],"c":[]}],["t",{"w":"_stacks_transactions","s":"tacks_transactions","e":true,"k":"t","d":[234,368],"c":[]}]]}],["b",{"w":"_blank","s":"blank","e":true,"k":"b","d":[13,45,74,425,443],"c":[]}],["t",{"w":"_t","s":"t","e":false,"k":"t","d":[],"c":[["x",{"w":"_txt","s":"xt","e":true,"k":"x","d":[21,29,30],"c":[]}],["o",{"w":"_token","s":"oken","e":true,"k":"o","d":[68],"c":[]}]]}],["c",{"w":"_c","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"_co","s":"o","e":false,"k":"o","d":[],"c":[["n",{"w":"_console","s":"nsole","e":true,"k":"n","d":[21,26,30],"c":[]}],["m",{"w":"_coming","s":"ming","e":true,"k":"m","d":[233,367],"c":[]}]]}],["l",{"w":"_clarity","s":"larity","e":true,"k":"l","d":[26,30,377,517],"c":[]}],["h",{"w":"_chainhooks_","s":"hainhooks_","e":true,"k":"h","d":[68],"c":[]}]]}],["h",{"w":"_h","s":"h","e":false,"k":"h","d":[],"c":[["2",{"w":"_h2","s":"2","e":true,"k":"2","d":[44,466],"c":[]}],["o",{"w":"_holder_","s":"older_","e":true,"k":"o","d":[71],"c":[]}]]}],["p",{"w":"_p","s":"p","e":true,"k":"p","d":[44,466],"c":[["r",{"w":"_pro","s":"ro","e":false,"k":"r","d":[],"c":[["p",{"w":"_proposing","s":"posing","e":true,"k":"p","d":[69],"c":[]}],["o",{"w":"_proof","s":"of","e":true,"k":"o","d":[71],"c":[]}]]}]]}],["r",{"w":"_re","s":"re","e":false,"k":"r","d":[],"c":[["f",{"w":"_refer","s":"fer","e":true,"k":"f","d":[52],"c":[]}],["v",{"w":"_review","s":"view","e":true,"k":"v","d":[70],"c":[]}]]}],["u",{"w":"_upload","s":"upload","e":true,"k":"u","d":[68],"c":[]}],["v",{"w":"_voting","s":"voting","e":true,"k":"v","d":[69],"c":[]}],["d",{"w":"_distributing","s":"distributing","e":true,"k":"d","d":[69],"c":[]}],["l",{"w":"_login_","s":"login_","e":true,"k":"l","d":[71],"c":[]}],["f",{"w":"_f","s":"f","e":false,"k":"f","d":[],"c":[["o",{"w":"_for","s":"or","e":true,"k":"o","d":[72],"c":[]}],["e",{"w":"_feel","s":"eel","e":true,"k":"e","d":[355],"c":[]}]]}],["n",{"w":"_n","s":"n","e":false,"k":"n","d":[],"c":[["o",{"w":"_note","s":"ote","e":true,"k":"o","d":[75,219],"c":[]}],["e",{"w":"_need","s":"eed","e":true,"k":"e","d":[422],"c":[]}]]}],["a",{"w":"_aka","s":"aka","e":true,"k":"a","d":[229],"c":[]}],["i",{"w":"_instead_","s":"instead_","e":true,"k":"i","d":[229],"c":[]}],["w",{"w":"_wire-format_","s":"wire-format_","e":true,"k":"w","d":[229],"c":[]}],["_",{"w":"__dirname","s":"_dirname","e":true,"k":"_","d":[232],"c":[]}],["j",{"w":"_json","s":"json","e":true,"k":"j","d":[375,377],"c":[]}]]}],["m",{"w":"m","s":"m","e":true,"k":"m","d":[27],"c":[["d",{"w":"md","s":"d","e":true,"k":"d","d":[27,28,226,230,234,235,236,244,259,346,353,355,356,366,368,369,370,517],"c":[["x",{"w":"mdx","s":"x","e":true,"k":"x","d":[517],"c":[["'",{"w":"mdx'","s":"'","e":true,"k":"'","d":[1,3,247,419,421,467,506,507,512],"c":[]}]]}]]}],["a",{"w":"ma","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"man","s":"n","e":false,"k":"n","d":[],"c":[["i",{"w":"mani","s":"i","e":false,"k":"i","d":[],"c":[["f",{"w":"manifest","s":"fest","e":true,"k":"f","d":[4,67,221,226,227,358,362],"c":[["p",{"w":"manifestpath","s":"path","e":true,"k":"p","d":[4,226,227,358,362],"c":[]}],["u",{"w":"manifesturi","s":"uri","e":true,"k":"u","d":[67,226,227],"c":[]}]]}],["p",{"w":"manipulat","s":"pulat","e":false,"k":"p","d":[],"c":[["i",{"w":"manipulati","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"manipulation","s":"on","e":true,"k":"o","d":[76,82,116,128,177,182,187],"c":[["s",{"w":"manipulations","s":"s","e":true,"k":"s","d":[76,88,113,120,128,130,145,174,187,202],"c":[]}]]}],["n",{"w":"manipulating","s":"ng","e":true,"k":"n","d":[130,145,149,174,187,244],"c":[]}]]}],["e",{"w":"manipulate","s":"e","e":true,"k":"e","d":[82,97],"c":[]}]]}]]}],["a",{"w":"manag","s":"ag","e":false,"k":"a","d":[],"c":[["e",{"w":"manage","s":"e","e":true,"k":"e","d":[45,50,52,53,67,69,71,77,78,82,89,90,94,105,107,116,125,132,135,140,141,149,155,165,167,170,171,176,185,186,189,191,195,197,200,226,227,232,233,239,352,355,357,367,509,511,513,516],"c":[["r",{"w":"manager","s":"r","e":true,"k":"r","d":[9,243,246,354,357],"c":[["s",{"w":"managers","s":"s","e":true,"k":"s","d":[517],"c":[]}]]}],["m",{"w":"management","s":"ment","e":true,"k":"m","d":[44,45,50,69,71,76,79,81,83,84,85,89,90,93,94,98,101,109,111,113,116,117,118,125,130,131,132,135,138,141,142,143,148,150,151,153,157,159,162,166,167,168,169,172,174,175,178,181,184,186,189,190,194,195,198,200,355],"c":[]}],["d",{"w":"managed","s":"d","e":true,"k":"d","d":[69,100,129,516],"c":[]}],["a",{"w":"manageable","s":"able","e":true,"k":"a","d":[129],"c":[]}],["-",{"w":"manage-authentication-state","s":"-authentication-state","e":true,"k":"-","d":[352],"c":[]}]]}],["i",{"w":"managing","s":"ing","e":true,"k":"i","d":[50,68,69,89,94,100,115,125,126,132,135,141,167,178,189,190,200,244,352,356,366,516],"c":[]}]]}],["y",{"w":"many","s":"y","e":true,"k":"y","d":[18,22,50,102,108,112,114,137,140,154,176,191,228,229,244,259,352],"c":[]}],["u",{"w":"manual","s":"ual","e":true,"k":"u","d":[237,355,356,366],"c":[["l",{"w":"manually","s":"ly","e":true,"k":"l","d":[19,20,27,71,160,221,226,238,243,355],"c":[]}]]}],["n",{"w":"manner","s":"ner","e":true,"k":"n","d":[79,96,180,189],"c":[]}]]}],["p",{"w":"map","s":"p","e":true,"k":"p","d":[7,12,26,30,69,79,80,81,83,85,89,90,96,97,103,105,113,116,131,132,151,161,167,172,175,177,180,183,189,201,202,224,226,234,245,348,361,368,377,508,511,513,516],"c":[["-",{"w":"map-","s":"-","e":false,"k":"-","d":[],"c":[["g",{"w":"map-get","s":"get","e":true,"k":"g","d":[6,7,12,22,26,30,69,71,76,77,79,80,81,83,85,88,89,90,91,97,103,112,113,116,120,124,130,131,132,134,136,139,140,146,147,151,152,161,163,164,167,172,173,189,193,196,201,202,224,245,348,356,360,361,366,377,511,513,517],"c":[]}],["s",{"w":"map-set","s":"set","e":true,"k":"s","d":[6,7,12,22,26,30,69,71,76,77,79,80,81,83,85,88,89,90,91,97,103,112,113,116,120,124,130,132,136,139,140,146,147,151,152,161,163,164,167,172,173,175,189,193,196,201,202,224,245,348,356,360,361,366,377,511,513,516,517],"c":[]}],["i",{"w":"map-insert","s":"insert","e":true,"k":"i","d":[7,69,89,97,132,167,172,189,361,516],"c":[]}],["n",{"w":"map-name","s":"name","e":true,"k":"n","d":[79,89,97,132,167,172],"c":[]}],["d",{"w":"map-delete","s":"delete","e":true,"k":"d","d":[79,89,97,132,167,172,511,513],"c":[]}],["v",{"w":"map-values","s":"values","e":true,"k":"v","d":[202],"c":[]}]]}],["n",{"w":"mapname","s":"name","e":true,"k":"n","d":[7,89,132,167,172,361],"c":[]}],["k",{"w":"mapkey","s":"key","e":true,"k":"k","d":[7,361],"c":[]}],["s",{"w":"maps","s":"s","e":true,"k":"s","d":[7,8,12,22,71,79,81,89,92,97,100,116,132,134,167,172,224,245,348,351,361],"c":[]}],["'",{"w":"map's","s":"'s","e":true,"k":"'","d":[97],"c":[]}],["p",{"w":"mappings","s":"pings","e":true,"k":"p","d":[97],"c":[]}],["_",{"w":"map_","s":"_","e":false,"k":"_","d":[],"c":[["e",{"w":"map_entry","s":"entry","e":true,"k":"e","d":[413],"c":[]}],["n",{"w":"map_name","s":"name","e":true,"k":"n","d":[413],"c":[]}]]}]]}],["k",{"w":"mak","s":"k","e":false,"k":"k","d":[],"c":[["i",{"w":"making","s":"ing","e":true,"k":"i","d":[7,12,58,65,69,79,108,113,124,136,152,188,196,224,245,348,352,357,361,376,439,462],"c":[]}],["e",{"w":"make","s":"e","e":true,"k":"e","d":[11,12,22,24,26,28,46,49,50,51,58,65,68,70,71,75,86,96,103,113,163,164,193,201,202,219,221,226,227,229,233,234,236,245,255,258,348,352,355,367,368,370,374,377,378,381,439,462,505,515],"c":[["a",{"w":"makeauthrequest","s":"authrequest","e":true,"k":"a","d":[67,226,227],"c":[]}],["s",{"w":"makes","s":"s","e":true,"k":"s","d":[68,224,229,355,377,514],"c":[["t",{"w":"makest","s":"t","e":false,"k":"t","d":[],"c":[["x",{"w":"makestxtokentransfer","s":"xtokentransfer","e":true,"k":"x","d":[226,227,229,230,232,234,235,236,237,241,242,243,368,369,370],"c":[]}],["a",{"w":"makestandard","s":"andard","e":false,"k":"a","d":[],"c":[["s",{"w":"makestandardstxpostcondition","s":"stxpostcondition","e":true,"k":"s","d":[226,231,234,368],"c":[]}],["f",{"w":"makestandardfungiblepostcondition","s":"fungiblepostcondition","e":true,"k":"f","d":[226,231,234,368],"c":[]}],["n",{"w":"makestandardnonfungiblepostcondition","s":"nonfungiblepostcondition","e":true,"k":"n","d":[226,234,368],"c":[]}]]}]]}]]}],["r",{"w":"maker","s":"r","e":true,"k":"r","d":[511,513],"c":[["a",{"w":"makerandomprivkey","s":"andomprivkey","e":true,"k":"a","d":[226,229],"c":[]}]]}],["c",{"w":"makecontract","s":"contract","e":false,"k":"c","d":[],"c":[["d",{"w":"makecontractdeploy","s":"deploy","e":true,"k":"d","d":[226,230,234,368],"c":[]}],["c",{"w":"makecontractcall","s":"call","e":true,"k":"c","d":[226,230,231,234,238,368],"c":[]}],["s",{"w":"makecontractstxpostcondition","s":"stxpostcondition","e":true,"k":"s","d":[226,234,368],"c":[]}],["f",{"w":"makecontractfungiblepostcondition","s":"fungiblepostcondition","e":true,"k":"f","d":[226,234,368],"c":[]}],["n",{"w":"makecontractnonfungiblepostcondition","s":"nonfungiblepostcondition","e":true,"k":"n","d":[226,234,368],"c":[]}]]}],["u",{"w":"makeunsigned","s":"unsigned","e":false,"k":"u","d":[],"c":[["s",{"w":"makeunsignedstxtokentransfer","s":"stxtokentransfer","e":true,"k":"s","d":[226,234,368],"c":[]}],["c",{"w":"makeunsignedcontract","s":"contract","e":false,"k":"c","d":[],"c":[["d",{"w":"makeunsignedcontractdeploy","s":"deploy","e":true,"k":"d","d":[234,368],"c":[]}],["c",{"w":"makeunsignedcontractcall","s":"call","e":true,"k":"c","d":[234,368],"c":[]}]]}]]}]]}]]}],["t",{"w":"mat","s":"t","e":false,"k":"t","d":[],"c":[["c",{"w":"match","s":"ch","e":true,"k":"c","d":[16,17,50,68,71,80,95,97,104,116,121,123,124,127,136,139,144,146,147,149,156,170,171,173,177,180,183,196,202,219,223,226,234,356,366,368,371,372,374,376,377,511,513,516],"c":[["e",{"w":"matche","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"matcher","s":"r","e":true,"k":"r","d":[12,224,245,348],"c":[["s",{"w":"matchers","s":"s","e":true,"k":"s","d":[9,12,224,245,246,348],"c":[]}]]}],["s",{"w":"matches","s":"s","e":true,"k":"s","d":[14,16,17,68,81,90,95,224,372,374,377],"c":[["_",{"w":"matches_regex","s":"_regex","e":true,"k":"_","d":[372],"c":[]}]]}],["d",{"w":"matched","s":"d","e":true,"k":"d","d":[374],"c":[]}]]}],["i",{"w":"matching","s":"ing","e":true,"k":"i","d":[81,139,146,171,196,371,372,374,376],"c":[]}],["-",{"w":"match-resp","s":"-resp","e":true,"k":"-","d":[170],"c":[]}]]}],["t",{"w":"matter","s":"ter","e":true,"k":"t","d":[76,77,79,80,81,96,201,202],"c":[["s",{"w":"matters","s":"s","e":true,"k":"s","d":[82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200],"c":[]}]]}],["h",{"w":"mathematical","s":"hematical","e":true,"k":"h","d":[87,102,106,107,112,113,133,137,140,158,179,185,197],"c":[]}],["u",{"w":"matur","s":"ur","e":false,"k":"u","d":[],"c":[["i",{"w":"maturity","s":"ity","e":true,"k":"i","d":[127],"c":[]}],["e",{"w":"mature","s":"e","e":true,"k":"e","d":[156],"c":[]}]]}]]}],["r",{"w":"mar","s":"r","e":true,"k":"r","d":[73],"c":[["k",{"w":"mark","s":"k","e":true,"k":"k","d":[26,180,243,517],"c":[["e",{"w":"market","s":"et","e":true,"k":"e","d":[459],"c":[["p",{"w":"marketplace","s":"place","e":true,"k":"p","d":[11,18,256,381,459,501,505,511,513],"c":[]}]]}]]}],["v",{"w":"marvinjanssen","s":"vinjanssen","e":true,"k":"v","d":[69],"c":[]}],["f",{"w":"marf","s":"f","e":true,"k":"f","d":[346],"c":[["-",{"w":"marf-merkle-proofs","s":"-merkle-proofs","e":true,"k":"-","d":[346],"c":[]}]]}]]}],["c",{"w":"mac","s":"c","e":true,"k":"c","d":[510],"c":[["h",{"w":"machine","s":"hine","e":true,"k":"h","d":[11,31,50,53,75,226,227,256,381,424,501,505,515],"c":[]}],["o",{"w":"macos","s":"os","e":true,"k":"o","d":[18,380,510,515,517],"c":[]}]]}],["x",{"w":"max","s":"x","e":true,"k":"x","d":[149],"c":[["i",{"w":"maximum","s":"imum","e":true,"k":"i","d":[12,82,88,110,114,120,126,130,149,176,178,182,226,233,234,245,348,367,368],"c":[]}],["_",{"w":"max_","s":"_","e":false,"k":"_","d":[],"c":[["b",{"w":"max_bid","s":"bid","e":true,"k":"b","d":[114],"c":[]}],["s",{"w":"max_supply","s":"supply","e":true,"k":"s","d":[125],"c":[]}],["l",{"w":"max_length","s":"length","e":true,"k":"l","d":[126],"c":[]}],["n",{"w":"max_number_of_","s":"number_of_","e":false,"k":"n","d":[],"c":[["b",{"w":"max_number_of_bitcoin_predicates","s":"bitcoin_predicates","e":true,"k":"b","d":[374,376],"c":[]}],["c",{"w":"max_number_of_concurrent_","s":"concurrent_","e":false,"k":"c","d":[],"c":[["b",{"w":"max_number_of_concurrent_bitcoin_scans","s":"bitcoin_scans","e":true,"k":"b","d":[374,376],"c":[]}],["s",{"w":"max_number_of_concurrent_stacks_scans","s":"stacks_scans","e":true,"k":"s","d":[374,376],"c":[]}]]}],["s",{"w":"max_number_of_stacks_predicates","s":"stacks_predicates","e":true,"k":"s","d":[374,376],"c":[]}],["p",{"w":"max_number_of_processing_threads","s":"processing_threads","e":true,"k":"p","d":[374,376],"c":[]}],["n",{"w":"max_number_of_networking_threads","s":"networking_threads","e":true,"k":"n","d":[374,376],"c":[]}]]}],["c",{"w":"max_caching_memory_size_mb","s":"caching_memory_size_mb","e":true,"k":"c","d":[374,376],"c":[]}]]}],["a",{"w":"maxamount","s":"amount","e":true,"k":"a","d":[223],"c":[]}],["-",{"w":"max-","s":"-","e":false,"k":"-","d":[],"c":[["l",{"w":"max-len","s":"len","e":true,"k":"l","d":[226,234,368],"c":[]}],["w",{"w":"max-w-","s":"w-","e":true,"k":"w","d":[229],"c":[]}]]}],["s",{"w":"maxsignerfee","s":"signerfee","e":true,"k":"s","d":[233,367],"c":[]}]]}],["i",{"w":"main","s":"in","e":true,"k":"i","d":[12,27,28,47,49,68,69,90,99,224,226,232,234,235,236,243,245,346,348,355,356,366,368,369,370,377],"c":[["n",{"w":"mainnet","s":"net","e":true,"k":"n","d":[13,14,15,17,18,19,25,27,28,29,30,46,47,50,51,53,127,219,220,226,227,229,232,233,234,235,240,241,355,356,357,366,367,368,369,374,376,378,379,509,514,517],"c":[["-",{"w":"mainnet-stacks-blockchain-api-latest","s":"-stacks-blockchain-api-latest","e":true,"k":"-","d":[16,374,376],"c":[]}]]}],["t",{"w":"maintain","s":"tain","e":true,"k":"t","d":[27,50,58,74,77,79,80,89,100,108,113,125,132,161,193,351,425,443],"c":[["e",{"w":"maintained","s":"ed","e":true,"k":"e","d":[16],"c":[]}],["i",{"w":"maintaining","s":"ing","e":true,"k":"i","d":[79,89,96,100,132,149,180,511,513],"c":[]}],["a",{"w":"maintainab","s":"ab","e":false,"k":"a","d":[],"c":[["i",{"w":"maintainability","s":"ility","e":true,"k":"i","d":[82,83,84,85,89,92,94,98,101,105,106,107,109,110,111,113,117,118,121,124,129,131,132,135,136,138,139,141,142,143,146,147,148,150,151,152,153,155,157,159,162,165,166,167,168,169,170,171,172,173,175,181,183,184,185,186,189,194,195,196,197,198,199,200,201],"c":[]}],["l",{"w":"maintainable","s":"le","e":true,"k":"l","d":[116,129,164,201],"c":[]}]]}]]}],["c",{"w":"maincard","s":"card","e":true,"k":"c","d":[44],"c":[]}]]}],["y",{"w":"may","s":"y","e":true,"k":"y","d":[14,15,16,17,18,21,48,52,55,68,73,75,95,100,103,122,129,180,226,233,234,259,351,355,356,366,367,368,426,444,510,511,513],"c":[]}],["s",{"w":"mas","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"master","s":"ter","e":true,"k":"t","d":[17,58,78,226,234,259,368],"c":[["i",{"w":"mastering","s":"ing","e":true,"k":"i","d":[77,113],"c":[]}]]}],["k",{"w":"mask","s":"k","e":false,"k":"k","d":[],"c":[["i",{"w":"masking","s":"ing","e":true,"k":"i","d":[145,174],"c":[]}],["s",{"w":"masks","s":"s","e":true,"k":"s","d":[174],"c":[]}]]}]]}],["d",{"w":"made","s":"de","e":true,"k":"d","d":[51,233,367],"c":[]}],["g",{"w":"magic","s":"gic","e":true,"k":"g","d":[92,229],"c":[["b",{"w":"magicbytes","s":"bytes","e":true,"k":"b","d":[235,369],"c":[]}]]}]]}],["e",{"w":"me","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"met","s":"t","e":true,"k":"t","d":[69,81,193],"c":[["h",{"w":"method","s":"hod","e":true,"k":"h","d":[7,9,12,14,25,27,32,34,35,36,37,38,39,41,42,43,52,57,60,61,62,63,68,206,207,210,212,214,215,216,218,224,229,245,249,251,252,253,254,260,261,262,264,265,266,267,268,269,270,271,272,274,275,276,277,278,279,281,283,284,285,286,287,289,290,291,292,293,295,296,297,298,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,319,320,321,322,323,324,325,326,327,328,329,330,332,333,335,336,338,340,342,343,344,348,351,352,353,354,355,356,357,361,366,371,372,377,379,389,391,392,393,395,396,398,401,402,405,407,408,409,410,411,413,414,415,416,418,429,430,432,433,435,436,437,438,441,442,446,447,449,450,451,452,454,455,456,457,458,461,464,465,469,470,472,473,475,476,477,478,480,481,483,484,486,487,488,489,491,492,493,494,495,497,499,500],"c":[["s",{"w":"methods","s":"s","e":true,"k":"s","d":[7,8,9,12,14,64,67,68,79,224,226,227,229,231,245,246,348,351,352,355,356,361,365,366,372,382,383,384,385,386,387],"c":[]}]]}],["a",{"w":"meta","s":"a","e":false,"k":"a","d":[],"c":[["d",{"w":"metadata","s":"data","e":true,"k":"d","d":[13,15,31,44,54,55,57,58,60,61,62,63,68,208,233,249,251,252,253,254,367,377,399,427,459,511,513],"c":[]}],["-",{"w":"meta-protocols","s":"-protocols","e":true,"k":"-","d":[466],"c":[]}],["p",{"w":"metaprotocols","s":"protocols","e":true,"k":"p","d":[504],"c":[]}]]}],["r",{"w":"metr","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"metrics","s":"ics","e":true,"k":"i","d":[208],"c":[["'",{"w":"metrics'","s":"'","e":true,"k":"'","d":[212],"c":[]}]]}],["o",{"w":"metro","s":"o","e":true,"k":"o","d":[232],"c":[["-",{"w":"metro-config","s":"-config","e":true,"k":"-","d":[232],"c":[]}]]}]]}],["d",{"w":"metdata","s":"data","e":true,"k":"d","d":[377],"c":[]}]]}],["s",{"w":"message","s":"ssage","e":true,"k":"s","d":[7,67,68,71,72,80,162,169,182,201,226,227,229,243,354,356,361,366,375,515],"c":[["c",{"w":"messagecircle","s":"circle","e":true,"k":"c","d":[44],"c":[]}],["'",{"w":"message'","s":"'","e":true,"k":"'","d":[67,226,227],"c":[]}],["s",{"w":"messages","s":"s","e":true,"k":"s","d":[71,80,124,136,162,193,243,350,353,354,356,357,366],"c":[["i",{"w":"messagesignature","s":"ignature","e":true,"k":"i","d":[229],"c":[["w",{"w":"messagesignaturewire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}]]}],["-",{"w":"message-hash","s":"-hash","e":true,"k":"-","d":[80,162,169],"c":[]}],["h",{"w":"messagehash","s":"hash","e":true,"k":"h","d":[162,169],"c":[]}]]}],["m",{"w":"mem","s":"m","e":false,"k":"m","d":[],"c":[["o",{"w":"memo","s":"o","e":true,"k":"o","d":[7,25,27,69,90,150,184,226,227,234,236,243,353,356,357,361,366,368,370],"c":[["r",{"w":"memory","s":"ry","e":true,"k":"r","d":[9,22,502],"c":[["_",{"w":"memory_limit","s":"_limit","e":true,"k":"_","d":[9],"c":[]}]]}],["s",{"w":"memos","s":"s","e":true,"k":"s","d":[184],"c":[]}],["'",{"w":"memo'","s":"'","e":true,"k":"'","d":[226,227,234,236,356,357,366,368,370],"c":[]}]]}],["p",{"w":"mempool","s":"pool","e":true,"k":"p","d":[51,219,222,229,233,258,306,309,335,367],"c":[["'",{"w":"mempool'","s":"'","e":true,"k":"'","d":[308,313],"c":[]}]]}],["b",{"w":"member","s":"ber","e":true,"k":"b","d":[69,81],"c":[["s",{"w":"members","s":"s","e":true,"k":"s","d":[69,81],"c":[["h",{"w":"membership","s":"hip","e":true,"k":"h","d":[69],"c":[["-",{"w":"membership-token","s":"-token","e":true,"k":"-","d":[69],"c":[]}]]}]]}],["-",{"w":"member-total-votes","s":"-total-votes","e":true,"k":"-","d":[69],"c":[]}]]}],["e",{"w":"meme","s":"e","e":true,"k":"e","d":[229],"c":[]}]]}],["a",{"w":"mea","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"mean","s":"n","e":false,"k":"n","d":[],"c":[["s",{"w":"means","s":"s","e":true,"k":"s","d":[7,48,52,238,361,373,376],"c":[]}],["i",{"w":"meaning","s":"ing","e":true,"k":"i","d":[226,234,368],"c":[["f",{"w":"meaningful","s":"ful","e":true,"k":"f","d":[68,82,84,85,88,89,91,92,93,94,96,97,98,100,101,103,105,106,107,109,110,111,116,118,120,121,122,124,126,131,132,135,136,138,139,141,142,143,146,147,148,150,151,152,153,155,157,159,160,162,164,165,166,167,168,169,170,171,172,173,175,180,181,183,184,185,186,189,193,194,195,196,197,198,199,200],"c":[]}],["s",{"w":"meanings","s":"s","e":true,"k":"s","d":[113],"c":[]}]]}],["t",{"w":"meant","s":"t","e":true,"k":"t","d":[356,366],"c":[]}]]}],["s",{"w":"measure","s":"sure","e":false,"k":"s","d":[],"c":[["s",{"w":"measures","s":"s","e":true,"k":"s","d":[188,192],"c":[]}],["m",{"w":"measurements","s":"ments","e":true,"k":"m","d":[202],"c":[]}]]}]]}],["e",{"w":"meet","s":"et","e":true,"k":"e","d":[14,177],"c":[["s",{"w":"meets","s":"s","e":true,"k":"s","d":[99,502],"c":[]}],["i",{"w":"meeting","s":"ing","e":true,"k":"i","d":[226,234,368],"c":[]}]]}],["r",{"w":"mer","s":"r","e":false,"k":"r","d":[],"c":[["g",{"w":"merg","s":"g","e":false,"k":"g","d":[],"c":[["e",{"w":"merge","s":"e","e":true,"k":"e","d":[69,79,81,97,116,182,189,511,513],"c":[["d",{"w":"merged","s":"d","e":true,"k":"d","d":[189],"c":[]}],["s",{"w":"merges","s":"s","e":true,"k":"s","d":[189],"c":[]}]]}],["i",{"w":"merging","s":"ing","e":true,"k":"i","d":[189],"c":[]}]]}],["k",{"w":"merkel","s":"kel","e":true,"k":"k","d":[346],"c":[]}]]}],["c",{"w":"mechanism","s":"chanism","e":true,"k":"c","d":[91,93,115,128,178,183,202,219,222,371,516],"c":[["s",{"w":"mechanisms","s":"s","e":true,"k":"s","d":[81,90,93,108,115,123,128,161,164,178,201],"c":[]}]]}],["n",{"w":"men","s":"n","e":false,"k":"n","d":[],"c":[["t",{"w":"mention","s":"tion","e":true,"k":"t","d":[241],"c":[["e",{"w":"mentioned","s":"ed","e":true,"k":"e","d":[374,376],"c":[]}]]}],["u",{"w":"menu","s":"u","e":true,"k":"u","d":[510],"c":[]}]]}]]}],["i",{"w":"mi","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"min","s":"n","e":false,"k":"n","d":[],"c":[["e",{"w":"mine","s":"e","e":true,"k":"e","d":[7,361],"c":[["d",{"w":"mined","s":"d","e":true,"k":"d","d":[7,68,69,156,258,361],"c":[]}],["b",{"w":"mineblock","s":"block","e":true,"k":"b","d":[7,361],"c":[]}],["e",{"w":"mineemptyb","s":"emptyb","e":false,"k":"e","d":[],"c":[["u",{"w":"mineemptyburnblock","s":"urnblock","e":true,"k":"u","d":[7,361],"c":[]}],["l",{"w":"mineemptyblock","s":"lock","e":true,"k":"l","d":[7,361],"c":[["s",{"w":"mineemptyblocks","s":"s","e":true,"k":"s","d":[7,361],"c":[]}]]}]]}],["r",{"w":"miner","s":"r","e":true,"k":"r","d":[127,156],"c":[["s",{"w":"miners","s":"s","e":true,"k":"s","d":[50,127,156],"c":[]}],["-",{"w":"miner-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"miner-spend-","s":"spend-","e":false,"k":"s","d":[],"c":[["w",{"w":"miner-spend-winner","s":"winner","e":true,"k":"w","d":[127],"c":[]}],["t",{"w":"miner-spend-total","s":"total","e":true,"k":"t","d":[127,156],"c":[]}]]}],["a",{"w":"miner-address","s":"address","e":true,"k":"a","d":[127,156],"c":[]}]]}],["'",{"w":"miner's","s":"'s","e":true,"k":"'","d":[127,156],"c":[]}]]}]]}],["i",{"w":"mini","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"mining","s":"ng","e":true,"k":"n","d":[7,219,222,361],"c":[]}],["m",{"w":"minim","s":"m","e":false,"k":"m","d":[],"c":[["i",{"w":"minimize","s":"ize","e":true,"k":"i","d":[27,192],"c":[]}],["u",{"w":"minimum","s":"um","e":true,"k":"u","d":[27,154,191,502],"c":[]}],["a",{"w":"minimal","s":"al","e":true,"k":"a","d":[257,259,345],"c":[["i",{"w":"minimalist","s":"ist","e":true,"k":"i","d":[399],"c":[]}]]}]]}]]}],["u",{"w":"minute","s":"ute","e":true,"k":"u","d":[69],"c":[["s",{"w":"minutes","s":"s","e":true,"k":"s","d":[14,15,17,49,69,509],"c":[]}]]}],["t",{"w":"mint","s":"t","e":true,"k":"t","d":[28,50,51,69,122,125,154,160,178,186,233,367,372,378,516],"c":[["-",{"w":"mint-","s":"-","e":false,"k":"-","d":[],"c":[["o",{"w":"mint-one-with-sbtc","s":"one-with-sbtc","e":true,"k":"o","d":[28],"c":[]}],["r",{"w":"mint-reward","s":"reward","e":true,"k":"r","d":[178],"c":[]}],["n",{"w":"mint-nft","s":"nft","e":true,"k":"n","d":[186],"c":[]}]]}],["s",{"w":"mints","s":"s","e":true,"k":"s","d":[67,101,125,135,178,186,195],"c":[["'",{"w":"mints'","s":"'","e":true,"k":"'","d":[343],"c":[]}]]}],["i",{"w":"minting","s":"ing","e":true,"k":"i","d":[69,122,125,160,178,186,233,367,372],"c":[]}],["e",{"w":"minted","s":"ed","e":true,"k":"e","d":[178,186,233,367,516],"c":[]}]]}],["d",{"w":"mind","s":"d","e":true,"k":"d","d":[50,76,77,79,80,81,99,201,202],"c":[["f",{"w":"mindful","s":"ful","e":true,"k":"f","d":[96,97,100,128,130,145,149,163,177,180,187],"c":[]}]]}],["_",{"w":"min_purchase","s":"_purchase","e":true,"k":"_","d":[154],"c":[]}],["o",{"w":"minor","s":"or","e":true,"k":"o","d":[233,367],"c":[]}]]}],["g",{"w":"mig","s":"g","e":false,"k":"g","d":[],"c":[["r",{"w":"migrat","s":"rat","e":false,"k":"r","d":[],"c":[["e",{"w":"migrate","s":"e","e":true,"k":"e","d":[8,9,229,246],"c":[["-",{"w":"migrate-to-the-clarinet-sdk","s":"-to-the-clarinet-sdk","e":true,"k":"-","d":[8,9,246],"c":[]}]]}],["i",{"w":"migrati","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"migrating","s":"ng","e":true,"k":"n","d":[9,180,229,246,355],"c":[]}],["o",{"w":"migration","s":"on","e":true,"k":"o","d":[234,235,236,246,355,356,366,368,369,370],"c":[]}]]}]]}],["h",{"w":"might","s":"ht","e":true,"k":"h","d":[12,68,71,77,79,81,87,90,92,96,97,100,103,108,116,133,134,139,146,149,158,173,179,188,190,201,245,348,356,366,377,510,515],"c":[]}]]}],["c",{"w":"micro","s":"cro","e":true,"k":"c","d":[185],"c":[["s",{"w":"microstacks","s":"stacks","e":true,"k":"s","d":[27],"c":[]}],["-",{"w":"micro-stx","s":"-stx","e":true,"k":"-","d":[71,237,353,356,357,366],"c":[]}],["_",{"w":"micro_tokens","s":"_tokens","e":true,"k":"_","d":[185],"c":[]}],["b",{"w":"microblock_","s":"block_","e":false,"k":"b","d":[],"c":[["h",{"w":"microblock_hash","s":"hash","e":true,"k":"h","d":[255],"c":[]}],["s",{"w":"microblock_sequence","s":"sequence","e":true,"k":"s","d":[255],"c":[]}],["c",{"w":"microblock_canonical","s":"canonical","e":true,"k":"c","d":[255],"c":[]}]]}]]}],["a",{"w":"mia","s":"a","e":true,"k":"a","d":[516],"c":[["m",{"w":"miamicoin-token-v2","s":"micoin-token-v2","e":true,"k":"m","d":[516],"c":[["'",{"w":"miamicoin-token-v2'","s":"'","e":true,"k":"'","d":[58],"c":[]}]]}]]}],["l",{"w":"mil","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"milestone","s":"estone","e":true,"k":"e","d":[69],"c":[["-",{"w":"milestone-based","s":"-based","e":true,"k":"-","d":[69],"c":[]}],["s",{"w":"milestones","s":"s","e":true,"k":"s","d":[69,202],"c":[]}]]}],["l",{"w":"million","s":"lion","e":true,"k":"l","d":[92,176,191],"c":[]}],["k",{"w":"milk","s":"k","e":true,"k":"k","d":[180],"c":[]}]]}],["d",{"w":"mid","s":"d","e":false,"k":"d","d":[],"c":[["n",{"w":"midnight","s":"night","e":true,"k":"n","d":[73],"c":[]}],["d",{"w":"middleware","s":"dleware","e":true,"k":"d","d":[227,236,370],"c":[["s",{"w":"middlewares","s":"s","e":true,"k":"s","d":[227,236,370],"c":[]}]]}]]}],["s",{"w":"mis","s":"s","e":false,"k":"s","d":[],"c":[["u",{"w":"misunderst","s":"underst","e":false,"k":"u","d":[],"c":[["a",{"w":"misunderstanding","s":"anding","e":true,"k":"a","d":[93],"c":[]}],["o",{"w":"misunderstood","s":"ood","e":true,"k":"o","d":[229],"c":[]}]]}],["i",{"w":"misinterpreting","s":"interpreting","e":true,"k":"i","d":[95],"c":[]}],["s",{"w":"missing","s":"sing","e":true,"k":"s","d":[103,139,232,258],"c":[]}]]}],["x",{"w":"mix","s":"x","e":true,"k":"x","d":[229],"c":[["i",{"w":"mixing","s":"ing","e":true,"k":"i","d":[128,130],"c":[]}]]}]]}],["u",{"w":"mu","s":"u","e":false,"k":"u","d":[],"c":[["l",{"w":"mul","s":"l","e":false,"k":"l","d":[],"c":[["t",{"w":"mult","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"multi","s":"i","e":false,"k":"i","d":[],"c":[["p",{"w":"multipl","s":"pl","e":false,"k":"p","d":[],"c":[["e",{"w":"multiple","s":"e","e":true,"k":"e","d":[7,12,19,47,76,77,79,82,86,88,90,91,92,100,108,110,113,119,120,129,130,137,139,146,155,163,165,171,173,182,193,196,201,219,220,222,224,233,245,348,356,361,366,367,374,376],"c":[["'",{"w":"multiple'","s":"'","e":true,"k":"'","d":[311],"c":[]}]]}],["i",{"w":"multipli","s":"i","e":false,"k":"i","d":[],"c":[["c",{"w":"multiplicati","s":"cati","e":false,"k":"c","d":[],"c":[["o",{"w":"multiplication","s":"on","e":true,"k":"o","d":[77,102,112,137,140,174],"c":[]}],["v",{"w":"multiplicative","s":"ve","e":true,"k":"v","d":[77],"c":[]}]]}],["e",{"w":"multiplies","s":"es","e":true,"k":"e","d":[77,106,185,197,199],"c":[]}]]}],["y",{"w":"multiplying","s":"ying","e":true,"k":"y","d":[102,112],"c":[]}]]}],["s",{"w":"multisig","s":"sig","e":true,"k":"s","d":[72,233,235,240,367,369],"c":[["n",{"w":"multisignature","s":"nature","e":true,"k":"n","d":[233,367],"c":[]}],["-",{"w":"multisig-wallet","s":"-wallet","e":true,"k":"-","d":[371],"c":[]}]]}],["-",{"w":"multi-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"multi-s","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"multi-sig","s":"ig","e":true,"k":"i","d":[226,234,368],"c":[["n",{"w":"multi-signature","s":"nature","e":true,"k":"n","d":[81,226,234,368,371],"c":[]}]]}],["t",{"w":"multi-step","s":"tep","e":true,"k":"t","d":[163],"c":[]}]]}],["f",{"w":"multi-factor","s":"factor","e":true,"k":"f","d":[108],"c":[]}],["c",{"w":"multi-core","s":"core","e":true,"k":"c","d":[502],"c":[]}]]}]]}],["p",{"w":"multple","s":"ple","e":true,"k":"p","d":[379],"c":[]}]]}],["-",{"w":"mul-overflow","s":"-overflow","e":true,"k":"-","d":[102],"c":[]}]]}],["s",{"w":"must","s":"st","e":true,"k":"s","d":[12,14,20,52,55,69,73,75,86,90,104,122,126,196,221,226,231,234,238,245,258,348,368,374,377,511,513],"c":[]}],["c",{"w":"much","s":"ch","e":true,"k":"c","d":[12,22,245,348,514],"c":[]}],["t",{"w":"muta","s":"ta","e":false,"k":"t","d":[],"c":[["b",{"w":"mutable","s":"ble","e":true,"k":"b","d":[92,100],"c":[]}],["t",{"w":"mutat","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"mutating","s":"ing","e":true,"k":"i","d":[189],"c":[]}],["e",{"w":"mutated_","s":"ed_","e":false,"k":"e","d":[],"c":[["a",{"w":"mutated_assets_radius","s":"assets_radius","e":true,"k":"a","d":[377],"c":[]}],["c",{"w":"mutated_contracts_radius","s":"contracts_radius","e":true,"k":"c","d":[377],"c":[]}]]}]]}]]}],["y",{"w":"muydxkmx9bbyauede6kffhd5ff1gdn9erg","s":"ydxkmx9bbyauede6kffhd5ff1gdn9erg","e":true,"k":"y","d":[221],"c":[]}]]}],["o",{"w":"mo","s":"o","e":false,"k":"o","d":[],"c":[["s",{"w":"most","s":"st","e":true,"k":"s","d":[9,14,15,17,51,73,104,108,223,228,229,235,239,241,244,350,369,459,514,515],"c":[]}],["r",{"w":"more","s":"re","e":true,"k":"r","d":[9,11,12,24,27,31,47,49,50,52,58,68,69,71,73,74,76,77,78,79,81,88,90,91,96,97,100,102,103,106,108,112,113,115,116,119,120,123,126,128,129,130,134,137,140,149,152,163,164,170,171,173,174,180,182,183,185,188,192,193,196,199,201,202,208,219,221,224,228,229,230,238,239,241,243,245,246,255,256,259,346,348,352,353,354,355,356,366,371,372,376,377,378,381,420,423,427,459,501,505,517],"c":[]}],["v",{"w":"mov","s":"v","e":false,"k":"v","d":[],"c":[["i",{"w":"moving","s":"ing","e":true,"k":"i","d":[18,123,150,377],"c":[]}],["e",{"w":"move","s":"e","e":true,"k":"e","d":[48,123,355],"c":[["d",{"w":"moved","s":"d","e":true,"k":"d","d":[18],"c":[]}],["m",{"w":"movements","s":"ments","e":true,"k":"m","d":[67,372],"c":[]}]]}]]}],["n",{"w":"mon","s":"n","e":false,"k":"n","d":[],"c":[["i",{"w":"monitor","s":"itor","e":true,"k":"i","d":[45,50,51,208,371,372,375,509],"c":[["i",{"w":"monitoring","s":"ing","e":true,"k":"i","d":[45,50,51,372,377],"c":[]}],["-",{"w":"monitor-the-nodes-synchronization-process","s":"-the-nodes-synchronization-process","e":true,"k":"-","d":[509],"c":[]}]]}],["t",{"w":"month","s":"th","e":true,"k":"t","d":[73],"c":[["l",{"w":"monthly","s":"ly","e":true,"k":"l","d":[50,73],"c":[]}],["'",{"w":"month's","s":"'s","e":true,"k":"'","d":[70,72,73],"c":[]}],["s",{"w":"months","s":"s","e":true,"k":"s","d":[219,222],"c":[]}]]}],["k",{"w":"monkey","s":"key","e":true,"k":"k","d":[372],"c":[["-",{"w":"monkey-sip09","s":"-sip09","e":true,"k":"-","d":[372],"c":[]}],["s",{"w":"monkeys","s":"s","e":true,"k":"s","d":[372],"c":[]}]]}],["d",{"w":"monday","s":"day","e":true,"k":"d","d":[422,427],"c":[]}]]}],["m",{"w":"moments","s":"ments","e":true,"k":"m","d":[50],"c":[]}],["d",{"w":"mod","s":"d","e":true,"k":"d","d":[177,197,516],"c":[["a",{"w":"modal","s":"al","e":true,"k":"a","d":[51,356,366],"c":[]}],["u",{"w":"modul","s":"ul","e":false,"k":"u","d":[],"c":[["a",{"w":"modular","s":"ar","e":true,"k":"a","d":[90,119,197],"c":[["i",{"w":"modularity","s":"ity","e":true,"k":"i","d":[69,86,90,117,152],"c":[]}]]}],["o",{"w":"modulo","s":"o","e":true,"k":"o","d":[77,145,174],"c":[]}],["e",{"w":"module","s":"e","e":true,"k":"e","d":[232,259],"c":[["s",{"w":"modules","s":"s","e":true,"k":"s","d":[232],"c":[]}]]}],["u",{"w":"modulus","s":"us","e":true,"k":"u","d":[516],"c":[]}]]}],["e",{"w":"mode","s":"e","e":true,"k":"e","d":[219,231,238,374,376,517],"c":[["l",{"w":"model","s":"l","e":true,"k":"l","d":[69],"c":[["s",{"w":"models","s":"s","e":true,"k":"s","d":[115],"c":[]}]]}],["s",{"w":"modes","s":"s","e":true,"k":"s","d":[219,220],"c":[]}],["r",{"w":"modern","s":"rn","e":true,"k":"r","d":[219,222],"c":[["i",{"w":"modernize","s":"ize","e":true,"k":"i","d":[355,356,366],"c":[]}]]}]]}],["i",{"w":"modif","s":"if","e":false,"k":"i","d":[],"c":[["y",{"w":"modify","s":"y","e":true,"k":"y","d":[92,99,100,109,129,134,149,161,177,232],"c":[["i",{"w":"modifying","s":"ing","e":true,"k":"i","d":[100,109,134,177],"c":[]}]]}],["i",{"w":"modifi","s":"i","e":false,"k":"i","d":[],"c":[["e",{"w":"modified","s":"ed","e":true,"k":"e","d":[100],"c":[]}],["c",{"w":"modification","s":"cation","e":true,"k":"c","d":[109],"c":[["s",{"w":"modifications","s":"s","e":true,"k":"s","d":[109],"c":[]}]]}]]}]]}]]}],["c",{"w":"mocknet","s":"cknet","e":true,"k":"c","d":[227,509],"c":[]}],["z",{"w":"mozilla","s":"zilla","e":true,"k":"z","d":[229],"c":[]}],["b",{"w":"mobile","s":"bile","e":true,"k":"b","d":[232],"c":[]}],["u",{"w":"mounted","s":"unted","e":true,"k":"u","d":[515],"c":[]}]]}],["v",{"w":"mv","s":"v","e":true,"k":"v","d":[18,517],"c":[["z",{"w":"mvztbibdaaa3wlpy7zxxfqra3t4xsknbx7","s":"ztbibdaaa3wlpy7zxxfqra3t4xsknbx7","e":true,"k":"z","d":[221],"c":[]}]]}],["y",{"w":"my","s":"y","e":true,"k":"y","d":[49],"c":[["-",{"w":"my-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"my-contract","s":"contract","e":true,"k":"c","d":[20,21,25,26,27],"c":[]}],["f",{"w":"my-f","s":"f","e":false,"k":"f","d":[],"c":[["u",{"w":"my-function","s":"unction","e":true,"k":"u","d":[25,26],"c":[]}],["t",{"w":"my-ft-token","s":"t-token","e":true,"k":"t","d":[229,238],"c":[]}]]}],["p",{"w":"my-pro","s":"pro","e":false,"k":"p","d":[],"c":[["j",{"w":"my-project","s":"ject","e":true,"k":"j","d":[29],"c":[]}],["t",{"w":"my-protocol","s":"tocol","e":true,"k":"t","d":[379],"c":[]}]]}],["3",{"w":"my-3'","s":"3'","e":true,"k":"3","d":[67],"c":[]}],["t",{"w":"my-token'","s":"token'","e":true,"k":"t","d":[229,238],"c":[]}],["n",{"w":"my-nft","s":"nft","e":true,"k":"n","d":[229,238],"c":[]}],["a",{"w":"my-a","s":"a","e":false,"k":"a","d":[],"c":[["s",{"w":"my-asset'","s":"sset'","e":true,"k":"s","d":[229,238],"c":[]}],["p",{"w":"my-app","s":"pp","e":true,"k":"p","d":[517],"c":[]}]]}]]}],["a",{"w":"myap","s":"ap","e":false,"k":"a","d":[],"c":[["p",{"w":"myapp","s":"p","e":true,"k":"p","d":[67,226,227],"c":[]}],["i",{"w":"myapimiddleware","s":"imiddleware","e":true,"k":"i","d":[227,236,370],"c":[]}]]}],["l",{"w":"mylist","s":"list","e":true,"k":"l","d":[126],"c":[]}],["_",{"w":"my_","s":"_","e":false,"k":"_","d":[],"c":[["a",{"w":"my_address","s":"address","e":true,"k":"a","d":[223],"c":[]}],["b",{"w":"my_btc_address","s":"btc_address","e":true,"k":"b","d":[223],"c":[]}],["s",{"w":"my_s","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"my_signer_p","s":"igner_p","e":false,"k":"i","d":[],"c":[["r",{"w":"my_signer_private_key","s":"rivate_key","e":true,"k":"r","d":[223],"c":[]}],["u",{"w":"my_signer_public_key","s":"ublic_key","e":true,"k":"u","d":[223],"c":[]}]]}],["t",{"w":"my_stx_private_key","s":"tx_private_key","e":true,"k":"t","d":[223],"c":[]}]]}]]}],["s",{"w":"mystacksnode","s":"stacksnode","e":true,"k":"s","d":[227],"c":[]}],["f",{"w":"myfetch","s":"fetch","e":true,"k":"f","d":[229],"c":[["f",{"w":"myfetchfn","s":"fn","e":true,"k":"f","d":[227,236,370],"c":[]}],["o",{"w":"myfetchoptional","s":"optional","e":true,"k":"o","d":[229],"c":[]}]]}],["m",{"w":"mymainnet","s":"mainnet","e":true,"k":"m","d":[227,236,370],"c":[]}],["n",{"w":"mynode","s":"node","e":true,"k":"n","d":[229],"c":[["-",{"w":"mynode-optional","s":"-optional","e":true,"k":"-","d":[229],"c":[]}]]}]]}],["s",{"w":"mstx-amount","s":"stx-amount","e":true,"k":"s","d":[25,27],"c":[]}],["j",{"w":"mjsrb3ws4xab3kyqfktwbzftdpg367zj2d","s":"jsrb3ws4xab3kyqfktwbzftdpg367zj2d","e":true,"k":"j","d":[25,27],"c":[]}],["n",{"w":"mnemonic","s":"nemonic","e":true,"k":"n","d":[27,232,240],"c":[["s",{"w":"mnemonics","s":"s","e":true,"k":"s","d":[229],"c":[]}]]}],["t",{"w":"mt-0","s":"t-0","e":true,"k":"t","d":[44,259,466,508],"c":[]}],["b",{"w":"mb-","s":"b-","e":false,"k":"b","d":[],"c":[["6",{"w":"mb-6","s":"6","e":true,"k":"6","d":[44,259,466,508],"c":[["'",{"w":"mb-6'","s":"'","e":true,"k":"'","d":[44,466],"c":[]}]]}],["2",{"w":"mb-2","s":"2","e":true,"k":"2","d":[44,466],"c":[]}]]}],["r",{"w":"mr1ipkd9n3rjzzxxrk7xf9d36gffa6exnc","s":"r1ipkd9n3rjzzxxrk7xf9d36gffa6exnc","e":true,"k":"r","d":[221],"c":[]}],["x",{"w":"mx-auto","s":"x-auto","e":true,"k":"x","d":[229],"c":[]}],["g",{"w":"mg","s":"g","e":true,"k":"g","d":[243,517],"c":[]}]]}],["p",{"w":"p","s":"p","e":true,"k":"p","d":[9,24,379],"c":[["r",{"w":"pr","s":"r","e":true,"k":"r","d":[72,73],"c":[["o",{"w":"pro","s":"o","e":false,"k":"o","d":[],"c":[["p",{"w":"prop","s":"p","e":true,"k":"p","d":[517],"c":[["s",{"w":"props","s":"s","e":true,"k":"s","d":[1,3,247,419,421,467,506,507,512],"c":[]}],["e",{"w":"proper","s":"er","e":true,"k":"e","d":[9,30,83,84,85,89,91,93,94,98,99,100,101,105,106,107,109,111,115,117,118,121,122,123,131,132,135,138,141,142,143,144,148,150,151,152,153,155,157,159,160,162,165,166,167,168,169,170,171,172,175,178,181,184,185,186,189,190,192,194,195,197,198,200,201,515],"c":[["t",{"w":"propert","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"properties","s":"ies","e":true,"k":"i","d":[8,9,12,95,104,127,156,224,226,229,234,235,245,246,255,348,368,369],"c":[]}],["y",{"w":"property","s":"y","e":true,"k":"y","d":[15,17,67,95,104,127,156,161,221,226,227,229,234,235,236,258,356,366,368,369,370,371,372,377],"c":[["-",{"w":"property-name","s":"-name","e":true,"k":"-","d":[202],"c":[]}]]}]]}],["l",{"w":"properly","s":"ly","e":true,"k":"l","d":[90,126,127,144,163,192,221,515,516],"c":[]}]]}],["o",{"w":"propo","s":"o","e":false,"k":"o","d":[],"c":[["s",{"w":"propos","s":"s","e":false,"k":"s","d":[],"c":[["a",{"w":"proposal","s":"al","e":true,"k":"a","d":[27,68,69,79,81],"c":[["s",{"w":"proposals","s":"s","e":true,"k":"s","d":[68,69,81,208],"c":[]}],["-",{"w":"proposal-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"proposal-submission","s":"submission","e":true,"k":"s","d":[68,69],"c":[]}],["t",{"w":"proposal-trait","s":"trait","e":true,"k":"t","d":[69],"c":[]}],["d",{"w":"proposal-d","s":"d","e":false,"k":"d","d":[],"c":[["u",{"w":"proposal-duration","s":"uration","e":true,"k":"u","d":[69],"c":[]}],["a",{"w":"proposal-data","s":"ata","e":true,"k":"a","d":[69],"c":[]}]]}],["v",{"w":"proposal-vot","s":"vot","e":false,"k":"v","d":[],"c":[["i",{"w":"proposal-voting","s":"ing","e":true,"k":"i","d":[69],"c":[]}],["e",{"w":"proposal-votes","s":"es","e":true,"k":"e","d":[79],"c":[]}]]}]]}],["c",{"w":"proposalcounter","s":"counter","e":true,"k":"c","d":[81],"c":[]}],["i",{"w":"proposalid","s":"id","e":true,"k":"i","d":[81],"c":[]}]]}],["e",{"w":"propose","s":"e","e":true,"k":"e","d":[68,69],"c":[["r",{"w":"proposer","s":"r","e":true,"k":"r","d":[69,81],"c":[]}],["d",{"w":"proposed","s":"d","e":true,"k":"d","d":[69],"c":[]}]]}],["i",{"w":"proposition","s":"ition","e":true,"k":"i","d":[69],"c":[]}]]}],["r",{"w":"proportion","s":"rtion","e":false,"k":"r","d":[],"c":[["s",{"w":"proportions","s":"s","e":true,"k":"s","d":[77,112],"c":[]}],["a",{"w":"proportionally","s":"ally","e":true,"k":"a","d":[102],"c":[]}]]}]]}],["a",{"w":"propagat","s":"agat","e":false,"k":"a","d":[],"c":[["i",{"w":"propagati","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"propagating","s":"ng","e":true,"k":"n","d":[86,123,193],"c":[]}],["o",{"w":"propagation","s":"on","e":true,"k":"o","d":[166,201],"c":[]}]]}],["e",{"w":"propagate","s":"e","e":true,"k":"e","d":[164,201],"c":[]}]]}],["-",{"w":"prop-name","s":"-name","e":true,"k":"-","d":[95,104,127,156],"c":[]}]]}],["m",{"w":"prom","s":"m","e":false,"k":"m","d":[],"c":[["i",{"w":"promise","s":"ise","e":true,"k":"i","d":[4,356,358,362,366],"c":[["-",{"w":"promise-based","s":"-based","e":true,"k":"-","d":[356,366],"c":[]}]]}],["p",{"w":"prompt","s":"pt","e":true,"k":"p","d":[239,350],"c":[["s",{"w":"prompts","s":"s","e":true,"k":"s","d":[27,246],"c":[]}],["e",{"w":"prompted","s":"ed","e":true,"k":"e","d":[53,510],"c":[]}]]}],["o",{"w":"promot","s":"ot","e":false,"k":"o","d":[],"c":[["e",{"w":"promotes","s":"es","e":true,"k":"e","d":[86],"c":[]}],["i",{"w":"promoting","s":"ing","e":true,"k":"i","d":[152],"c":[]}]]}],["e",{"w":"prometheus","s":"etheus","e":true,"k":"e","d":[208],"c":[]}]]}],["j",{"w":"project","s":"ject","e":true,"k":"j","d":[5,7,9,12,18,19,20,21,22,27,28,29,30,45,46,47,48,50,53,68,69,70,71,72,73,75,221,224,232,243,245,246,348,357,359,361,375,516,517],"c":[["s",{"w":"projects","s":"s","e":true,"k":"s","d":[9,11,27,45,46,47,48,53,68,69,71,73,221,246,256,355,381,501,505],"c":[]}],["'",{"w":"project's","s":"'s","e":true,"k":"'","d":[27,50,69,71,232],"c":[]}],["n",{"w":"projectname","s":"name","e":true,"k":"n","d":[35],"c":[]}]]}],["g",{"w":"progr","s":"gr","e":false,"k":"g","d":[],"c":[["e",{"w":"progress","s":"ess","e":true,"k":"e","d":[5,50,69,219,220,359],"c":[["i",{"w":"progression","s":"ion","e":true,"k":"i","d":[202],"c":[]}]]}],["a",{"w":"program","s":"am","e":true,"k":"a","d":[68,69,515],"c":[["m",{"w":"programmatic","s":"matic","e":true,"k":"m","d":[50,52],"c":[["a",{"w":"programmatically","s":"ally","e":true,"k":"a","d":[27,31,50],"c":[]}]]}]]}]]}],["v",{"w":"prov","s":"v","e":false,"k":"v","d":[],"c":[["i",{"w":"provid","s":"id","e":false,"k":"i","d":[],"c":[["e",{"w":"provide","s":"e","e":true,"k":"e","d":[49,52,67,68,69,70,71,72,76,79,80,81,88,96,103,120,125,134,164,180,190,193,201,202,224,226,227,231,234,236,237,259,368,370,371,517],"c":[["s",{"w":"provides","s":"s","e":true,"k":"s","d":[6,12,45,47,49,50,64,67,68,69,80,83,85,95,104,110,116,123,125,127,131,139,144,146,156,161,170,173,174,175,182,183,190,201,202,224,226,227,245,258,348,351,352,356,360,365,366,382,383,384,385,386,387],"c":[]}],["d",{"w":"provided","s":"d","e":true,"k":"d","d":[49,69,71,226,230,234,346,368,372],"c":[]}],["r",{"w":"provider","s":"r","e":true,"k":"r","d":[233,356,366,367],"c":[["s",{"w":"providers","s":"s","e":true,"k":"s","d":[351,352,356,366],"c":[]}]]}]]}],["i",{"w":"providing","s":"ing","e":true,"k":"i","d":[50,65,82,83,84,85,89,91,94,98,101,103,105,106,107,109,111,117,118,121,125,131,132,134,135,138,141,142,143,148,150,151,152,153,155,157,159,162,164,165,166,167,168,169,170,171,172,173,175,180,181,183,184,185,186,188,189,190,193,194,195,197,198,199,200,371,379],"c":[]}]]}],["e",{"w":"prove","s":"e","e":true,"k":"e","d":[354],"c":[]}]]}],["c",{"w":"proce","s":"ce","e":false,"k":"c","d":[],"c":[["s",{"w":"process","s":"ss","e":true,"k":"s","d":[9,12,14,46,67,68,69,73,83,84,85,87,88,89,93,94,96,98,101,105,106,107,109,111,116,117,118,120,121,131,132,133,135,138,141,142,143,144,148,150,151,153,155,157,158,159,162,165,166,167,168,169,172,175,177,179,180,181,184,185,186,189,194,195,197,198,200,224,226,227,230,232,233,245,348,353,356,357,366,367,375,376,509,516],"c":[["i",{"w":"processing","s":"ing","e":true,"k":"i","d":[49,116,126,133,158,177,180,202,233,367,502],"c":[]}],["e",{"w":"processe","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"processes","s":"s","e":true,"k":"s","d":[50,67,69,87,96,133,148,158,159,179,196,226,227,259],"c":[]}],["d",{"w":"processed","s":"d","e":true,"k":"d","d":[55,68,224,233,367],"c":[]}]]}],["-",{"w":"process-e","s":"-e","e":false,"k":"-","d":[],"c":[["x",{"w":"process-external-data","s":"xternal-data","e":true,"k":"x","d":[87,133],"c":[["-",{"w":"process-external-data-le","s":"-le","e":true,"k":"-","d":[158,179],"c":[]}]]}],["r",{"w":"process-error-response","s":"rror-response","e":true,"k":"r","d":[148,159],"c":[]}]]}],["o",{"w":"processor","s":"or","e":true,"k":"o","d":[226,234,368],"c":[]}]]}],["e",{"w":"proceed","s":"ed","e":true,"k":"e","d":[27,81],"c":[["i",{"w":"proceeding","s":"ing","e":true,"k":"i","d":[81,193,201],"c":[]}]]}],["d",{"w":"procedure","s":"dure","e":true,"k":"d","d":[515],"c":[]}]]}],["d",{"w":"produc","s":"duc","e":false,"k":"d","d":[],"c":[["e",{"w":"produce","s":"e","e":true,"k":"e","d":[9,12,224,245,348],"c":[["s",{"w":"produces","s":"s","e":true,"k":"s","d":[50,371],"c":[]}]]}],["t",{"w":"product","s":"t","e":true,"k":"t","d":[96],"c":[["i",{"w":"production","s":"ion","e":true,"k":"i","d":[18,19,50,75,199,241,426,444],"c":[["-",{"w":"production-ready","s":"-ready","e":true,"k":"-","d":[45],"c":[]}]]}],["s",{"w":"products","s":"s","e":true,"k":"s","d":[510],"c":[]}]]}]]}],["t",{"w":"prot","s":"t","e":false,"k":"t","d":[],"c":[["o",{"w":"proto","s":"o","e":false,"k":"o","d":[],"c":[["t",{"w":"prototyping","s":"typing","e":true,"k":"t","d":[50],"c":[]}],["c",{"w":"protocol","s":"col","e":true,"k":"c","d":[69,71,233,367,399,466,516],"c":[["f",{"w":"protocolfee","s":"fee","e":false,"k":"f","d":[],"c":[["p",{"w":"protocolfeepercent","s":"percent","e":true,"k":"p","d":[71],"c":[]}],["d",{"w":"protocolfeedestination","s":"destination","e":true,"k":"d","d":[71],"c":[]}]]}],["s",{"w":"protocols","s":"s","e":true,"k":"s","d":[87,133,144,158,179],"c":[]}]]}]]}],["e",{"w":"protect","s":"ect","e":true,"k":"e","d":[193],"c":[["i",{"w":"protection","s":"ion","e":true,"k":"i","d":[77,174],"c":[]}],["e",{"w":"protected","s":"ed","e":true,"k":"e","d":[202],"c":[]}]]}]]}],["o",{"w":"proof","s":"of","e":true,"k":"o","d":[52,95,259,346,371,399,516],"c":[["-",{"w":"proof-of-transfer","s":"-of-transfer","e":true,"k":"-","d":[219,222],"c":[]}],["s",{"w":"proofs","s":"s","e":true,"k":"s","d":[379],"c":[]}]]}],["f",{"w":"profi","s":"fi","e":false,"k":"f","d":[],"c":[["l",{"w":"profile","s":"le","e":true,"k":"l","d":[67,76,97,103,116,139,146,226,227,240,244],"c":[["s",{"w":"profiles","s":"s","e":true,"k":"s","d":[103,244],"c":[]}]]}],["t",{"w":"profit","s":"t","e":true,"k":"t","d":[71],"c":[]}]]}],["b",{"w":"problem","s":"blem","e":true,"k":"b","d":[73,229],"c":[["s",{"w":"problems","s":"s","e":true,"k":"s","d":[73],"c":[]}]]}],["x",{"w":"proxy","s":"xy","e":true,"k":"x","d":[90],"c":[["i",{"w":"proxying","s":"ing","e":true,"k":"i","d":[259],"c":[]}]]}],["s",{"w":"prose","s":"se","e":true,"k":"s","d":[517],"c":[]}]]}],["i",{"w":"pri","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"prin","s":"n","e":false,"k":"n","d":[],"c":[["c",{"w":"principal","s":"cipal","e":true,"k":"c","d":[6,7,9,12,22,26,27,30,51,60,61,63,64,67,69,71,76,77,79,80,81,83,85,86,88,89,90,91,92,94,97,98,101,102,103,112,113,114,115,116,117,119,120,122,123,124,125,127,129,130,132,134,135,136,139,140,141,143,146,147,150,151,152,156,160,162,163,164,166,167,172,173,178,184,185,186,189,190,192,193,195,196,198,200,201,202,219,222,224,226,230,231,234,238,245,251,252,254,258,320,321,322,323,324,325,326,327,328,348,356,360,361,365,366,368,382,383,384,385,386,387,405,511,513,514,516,517],"c":[["_",{"w":"principal_standard","s":"_standard","e":true,"k":"_","d":[51,517],"c":[]}],["-",{"w":"principal-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"principal-a","s":"a","e":true,"k":"a","d":[71],"c":[["d",{"w":"principal-address","s":"ddress","e":true,"k":"d","d":[141],"c":[]}]]}],["b",{"w":"principal-b","s":"b","e":true,"k":"b","d":[71],"c":[]}],["o",{"w":"principal-of","s":"of","e":true,"k":"o","d":[80,94,141,162,200],"c":[]}],["c",{"w":"principal-construct","s":"construct","e":true,"k":"c","d":[94,141,200],"c":[]}],["d",{"w":"principal-destruct","s":"destruct","e":true,"k":"d","d":[94,141],"c":[]}]]}],["s",{"w":"principals","s":"s","e":true,"k":"s","d":[81,94,101,115,123,141,147,150,160,178,184,190,200,258],"c":[]}],["'",{"w":"principal's","s":"'s","e":true,"k":"'","d":[98,143,150,184,198,258],"c":[]}]]}],["t",{"w":"print","s":"t","e":true,"k":"t","d":[7,16,69,88,120,163,199,246,353,361,372,377],"c":[["e",{"w":"printe","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"printed","s":"d","e":true,"k":"d","d":[16],"c":[]}],["v",{"w":"printevent","s":"vent","e":true,"k":"v","d":[246],"c":[]}]]}],["_",{"w":"print_event","s":"_event","e":true,"k":"_","d":[52,246,372,374],"c":[]}],["s",{"w":"prints","s":"s","e":true,"k":"s","d":[69,199],"c":[]}],["i",{"w":"printing","s":"ing","e":true,"k":"i","d":[163,199],"c":[]}],["-",{"w":"print-event","s":"-event","e":true,"k":"-","d":[374],"c":[["-",{"w":"print-event-post","s":"-post","e":true,"k":"-","d":[374],"c":[]}]]}]]}]]}],["v",{"w":"priv","s":"v","e":false,"k":"v","d":[],"c":[["a",{"w":"priva","s":"a","e":false,"k":"a","d":[],"c":[["t",{"w":"private","s":"te","e":true,"k":"t","d":[7,12,27,45,50,52,53,67,69,99,105,129,134,177,226,227,229,230,233,234,237,239,240,243,245,348,361,367,368,511,513],"c":[["k",{"w":"privatekey","s":"key","e":true,"k":"k","d":[223,226,229,234,237,239,241,368],"c":[["t",{"w":"privatekeyto","s":"to","e":false,"k":"t","d":[],"c":[["a",{"w":"privatekeytoaddress","s":"address","e":true,"k":"a","d":[229,240,241],"c":[]}],["p",{"w":"privatekeytopublickey","s":"publickey","e":true,"k":"p","d":[234,368],"c":[]}]]}]]}],["-",{"w":"private-keys","s":"-keys","e":true,"k":"-","d":[229],"c":[]}]]}],["c",{"w":"privacy","s":"cy","e":true,"k":"c","d":[50,371],"c":[]}]]}],["i",{"w":"privilege","s":"ilege","e":false,"k":"i","d":[],"c":[["d",{"w":"privileged","s":"d","e":true,"k":"d","d":[192],"c":[]}],["s",{"w":"privileges","s":"s","e":true,"k":"s","d":[516],"c":[]}]]}],["k",{"w":"privkeys","s":"keys","e":true,"k":"k","d":[226,234,368],"c":[["t",{"w":"privkeystrings","s":"trings","e":true,"k":"t","d":[226,234,368],"c":[]}]]}]]}],["m",{"w":"prim","s":"m","e":false,"k":"m","d":[],"c":[["i",{"w":"primitive","s":"itive","e":true,"k":"i","d":[19],"c":[["s",{"w":"primitives","s":"s","e":true,"k":"s","d":[19,80],"c":[]}]]}],["a",{"w":"primar","s":"ar","e":false,"k":"a","d":[],"c":[["i",{"w":"primarily","s":"ily","e":true,"k":"i","d":[199],"c":[]}],["y",{"w":"primary","s":"y","e":true,"k":"y","d":[379],"c":[]}]]}]]}],["o",{"w":"prior","s":"or","e":true,"k":"o","d":[171],"c":[["i",{"w":"priorit","s":"it","e":false,"k":"i","d":[],"c":[["y",{"w":"priority","s":"y","e":true,"k":"y","d":[44,259,466,508],"c":[]}],["i",{"w":"priorities","s":"ies","e":true,"k":"i","d":[219,222],"c":[]}]]}]]}],["c",{"w":"price","s":"ce","e":true,"k":"c","d":[71,77,161,511,513],"c":[["s",{"w":"prices","s":"s","e":true,"k":"s","d":[71,393,395],"c":[]}],["-",{"w":"price-change-factor","s":"-change-factor","e":true,"k":"-","d":[71],"c":[]}]]}],["z",{"w":"prize","s":"ze","e":true,"k":"z","d":[73],"c":[["s",{"w":"prizes","s":"s","e":true,"k":"s","d":[73],"c":[]}]]}]]}],["e",{"w":"pre","s":"e","e":true,"k":"e","d":[227,236,370],"c":[["t",{"w":"pretty","s":"tty","e":true,"k":"t","d":[68,515],"c":[["p",{"w":"prettyprint","s":"print","e":true,"k":"p","d":[7,246,361],"c":[]}]]}],["_",{"w":"pre_","s":"_","e":false,"k":"_","d":[],"c":[["e",{"w":"pre_expressions","s":"expressions","e":true,"k":"e","d":[7,361],"c":[]}],["c",{"w":"pre_comments","s":"comments","e":true,"k":"c","d":[7,361],"c":[]}]]}],["f",{"w":"pref","s":"f","e":false,"k":"f","d":[],"c":[["e",{"w":"prefer","s":"er","e":true,"k":"e","d":[68,202,226,234,238,368],"c":[["r",{"w":"preferred","s":"red","e":true,"k":"r","d":[9,174,243,246,354,357],"c":[]}],["e",{"w":"preferences","s":"ences","e":true,"k":"e","d":[51],"c":[]}]]}],["i",{"w":"prefixes","s":"ixes","e":true,"k":"i","d":[229],"c":[]}]]}],["-",{"w":"pre-","s":"-","e":false,"k":"-","d":[],"c":[["l",{"w":"pre-loaded","s":"loaded","e":true,"k":"l","d":[13],"c":[]}],["b",{"w":"pre-built","s":"built","e":true,"k":"b","d":[18,47],"c":[]}],["p",{"w":"pre-production","s":"production","e":true,"k":"p","d":[19],"c":[]}],["f",{"w":"pre-fixed","s":"fixed","e":true,"k":"f","d":[27],"c":[]}],["c",{"w":"pre-configured","s":"configured","e":true,"k":"c","d":[47],"c":[]}],["e",{"w":"pre-e","s":"e","e":false,"k":"e","d":[],"c":[["p",{"w":"pre-epoch","s":"poch","e":true,"k":"p","d":[104],"c":[]}],["x",{"w":"pre-existing","s":"xisting","e":true,"k":"x","d":[224],"c":[]}]]}],["r",{"w":"pre-release","s":"release","e":true,"k":"r","d":[233,367],"c":[]}]]}],["r",{"w":"prerequisites","s":"requisites","e":true,"k":"r","d":[14,15,46,423],"c":[]}],["v",{"w":"prev","s":"v","e":false,"k":"v","d":[],"c":[["i",{"w":"previ","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"previous","s":"ous","e":true,"k":"o","d":[52,68,104,229,230,231,258,374,515,516],"c":[["l",{"w":"previously","s":"ly","e":true,"k":"l","d":[51,144,229,355],"c":[]}]]}],["e",{"w":"previewing","s":"ewing","e":true,"k":"e","d":[232],"c":[]}]]}],["e",{"w":"prevent","s":"ent","e":true,"k":"e","d":[80,100,123,154,178,186,192,193,201,202,226,234,258,368],"c":[["s",{"w":"prevents","s":"s","e":true,"k":"s","d":[77],"c":[]}],["i",{"w":"preventing","s":"ing","e":true,"k":"i","d":[126,167,186,379],"c":[]}]]}]]}],["d",{"w":"pred","s":"d","e":false,"k":"d","d":[],"c":[["i",{"w":"predic","s":"ic","e":false,"k":"i","d":[],"c":[["a",{"w":"predicate","s":"ate","e":true,"k":"a","d":[52,68,96,105,177,371,372,374,375,376,377,378,379],"c":[["s",{"w":"predicates","s":"s","e":true,"k":"s","d":[52,373,374,375,376,377,378,379],"c":[]}],["-",{"w":"predicate-design","s":"-design","e":true,"k":"-","d":[371,372,377],"c":[]}],["_",{"w":"predicate_","s":"_","e":false,"k":"_","d":[],"c":[["1",{"w":"predicate_1","s":"1","e":true,"k":"1","d":[374,376],"c":[]}],["2",{"w":"predicate_2","s":"2","e":true,"k":"2","d":[374,376],"c":[]}]]}],["'",{"w":"predicate's","s":"'s","e":true,"k":"'","d":[377],"c":[]}]]}],["t",{"w":"predict","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"predictive","s":"ive","e":true,"k":"i","d":[70],"c":[]}],["a",{"w":"predictable","s":"able","e":true,"k":"a","d":[119,164,201,202],"c":[]}]]}]]}],["e",{"w":"prede","s":"e","e":false,"k":"e","d":[],"c":[["f",{"w":"predefined","s":"fined","e":true,"k":"f","d":[149,152],"c":[]}],["c",{"w":"predecessor","s":"cessor","e":true,"k":"c","d":[180],"c":[]}]]}]]}],["p",{"w":"prepare","s":"pare","e":true,"k":"p","d":[52,88,120,177,219],"c":[["d",{"w":"prepared","s":"d","e":true,"k":"d","d":[69,71],"c":[]}]]}],["s",{"w":"prese","s":"se","e":false,"k":"s","d":[],"c":[["n",{"w":"presen","s":"n","e":false,"k":"n","d":[],"c":[["t",{"w":"present","s":"t","e":true,"k":"t","d":[68,89,139,146,172,201,378],"c":[["e",{"w":"presented","s":"ed","e":true,"k":"e","d":[53],"c":[]}],["s",{"w":"presents","s":"s","e":true,"k":"s","d":[68],"c":[]}],["a",{"w":"presentation","s":"ation","e":true,"k":"a","d":[73],"c":[]}]]}],["c",{"w":"presence","s":"ce","e":true,"k":"c","d":[139,146,172,183],"c":[]}]]}],["r",{"w":"preserve","s":"rve","e":false,"k":"r","d":[],"c":[["d",{"w":"preserved","s":"d","e":true,"k":"d","d":[145],"c":[]}],["s",{"w":"preserves","s":"s","e":true,"k":"s","d":[145],"c":[]}]]}]]}],["c",{"w":"prec","s":"c","e":false,"k":"c","d":[],"c":[["i",{"w":"precis","s":"is","e":false,"k":"i","d":[],"c":[["e",{"w":"precise","s":"e","e":true,"k":"e","d":[69,78,106,112,202],"c":[["l",{"w":"precisely","s":"ly","e":true,"k":"l","d":[238],"c":[]}]]}],["i",{"w":"precision","s":"ion","e":true,"k":"i","d":[77,112],"c":[]}]]}],["e",{"w":"precedence","s":"edence","e":true,"k":"e","d":[77],"c":[]}],["o",{"w":"preconditions","s":"onditions","e":true,"k":"o","d":[193],"c":[]}]]}],["m",{"w":"premiddleware","s":"middleware","e":true,"k":"m","d":[227,236,370],"c":[]}]]}],["a",{"w":"practic","s":"actic","e":false,"k":"a","d":[],"c":[["a",{"w":"practical","s":"al","e":true,"k":"a","d":[65,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,439,462],"c":[]}],["e",{"w":"practices","s":"es","e":true,"k":"e","d":[65,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,439,462],"c":[]}]]}]]}],["a",{"w":"pa","s":"a","e":false,"k":"a","d":[],"c":[["r",{"w":"par","s":"r","e":false,"k":"r","d":[],"c":[["a",{"w":"para","s":"a","e":false,"k":"a","d":[],"c":[["m",{"w":"param","s":"m","e":false,"k":"m","d":[],"c":[["e",{"w":"parameter","s":"eter","e":true,"k":"e","d":[7,68,69,126,160,229,233,235,241,346,356,361,366,367,369],"c":[["s",{"w":"parameters","s":"s","e":true,"k":"s","d":[4,6,7,25,27,65,67,69,72,92,100,103,226,227,230,358,360,361,362,371,372,374,376,439,462],"c":[]}]]}],["s",{"w":"params","s":"s","e":true,"k":"s","d":[355,356,366],"c":[]}]]}],["l",{"w":"parallel","s":"llel","e":true,"k":"l","d":[502],"c":[]}]]}],["t",{"w":"part","s":"t","e":true,"k":"t","d":[12,52,102,123,178,229,243,245,348,352,377],"c":[["i",{"w":"parti","s":"i","e":false,"k":"i","d":[],"c":[["c",{"w":"partic","s":"c","e":false,"k":"c","d":[],"c":[["i",{"w":"participa","s":"ipa","e":false,"k":"i","d":[],"c":[["n",{"w":"participant","s":"nt","e":true,"k":"n","d":[112,516],"c":[["s",{"w":"participants","s":"s","e":true,"k":"s","d":[6,7,112,226,234,360,361,368,516],"c":[["t",{"w":"participantstatus","s":"tatus","e":true,"k":"t","d":[6,7,360,361],"c":[]}],["h",{"w":"participantshares","s":"hares","e":true,"k":"h","d":[112],"c":[]}],["c",{"w":"participantscount","s":"count","e":true,"k":"c","d":[112],"c":[]}]]}],["p",{"w":"participantpoints","s":"points","e":true,"k":"p","d":[7,361],"c":[]}],["'",{"w":"participant's","s":"'s","e":true,"k":"'","d":[112,516],"c":[]}]]}],["t",{"w":"participat","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"participate","s":"e","e":true,"k":"e","d":[73],"c":[]}],["i",{"w":"participation","s":"ion","e":true,"k":"i","d":[127],"c":[]}]]}]]}],["u",{"w":"particular","s":"ular","e":true,"k":"u","d":[13,14,15,17,31,51,208,226,227,354,427,459],"c":[["l",{"w":"particularly","s":"ly","e":true,"k":"l","d":[9,12,71,188,245,348,371,372],"c":[]}]]}]]}],["e",{"w":"parties","s":"es","e":true,"k":"e","d":[81,100,226,234,368],"c":[]}],["a",{"w":"partial","s":"al","e":true,"k":"a","d":[194,351],"c":[["l",{"w":"partially","s":"ly","e":true,"k":"l","d":[226,234,368],"c":[]}]]}]]}],["y",{"w":"party","s":"y","e":true,"k":"y","d":[11,226,234,256,368,381,501,505],"c":[]}],["s",{"w":"parts","s":"s","e":true,"k":"s","d":[12,68,71,92,141,171,182,192,224,245,348],"c":[]}]]}],["s",{"w":"pars","s":"s","e":false,"k":"s","d":[],"c":[["e",{"w":"parse","s":"e","e":true,"k":"e","d":[68,72,226,356,366],"c":[["d",{"w":"parsedtransactionresult","s":"dtransactionresult","e":true,"k":"d","d":[7,361],"c":[]}],["a",{"w":"parseasset","s":"asset","e":false,"k":"a","d":[],"c":[["i",{"w":"parseassetinfostring","s":"infostring","e":true,"k":"i","d":[229],"c":[]}],["s",{"w":"parseassetstring","s":"string","e":true,"k":"s","d":[229],"c":[]}]]}]]}],["i",{"w":"parsing","s":"ing","e":true,"k":"i","d":[68],"c":[]}]]}],["e",{"w":"parent","s":"ent","e":true,"k":"e","d":[26],"c":[["h",{"w":"parentheses","s":"heses","e":true,"k":"h","d":[77,108],"c":[]}],["_",{"w":"parent_block_hash","s":"_block_hash","e":true,"k":"_","d":[255],"c":[]}]]}],["q",{"w":"parquet-based","s":"quet-based","e":true,"k":"q","d":[219,222],"c":[]}]]}],["t",{"w":"pat","s":"t","e":false,"k":"t","d":[],"c":[["h",{"w":"path","s":"h","e":true,"k":"h","d":[4,14,15,20,21,25,27,30,32,34,35,36,37,38,39,41,42,43,57,60,61,62,63,206,207,210,212,214,215,216,218,221,226,227,234,249,251,252,253,254,260,261,262,264,265,266,267,268,269,270,271,272,274,275,276,277,278,279,281,283,284,285,286,287,289,290,291,292,293,295,296,297,298,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,319,320,321,322,323,324,325,326,327,328,329,330,332,333,335,336,338,340,342,343,344,358,362,368,374,376,377,378,379,389,391,392,393,395,396,398,401,402,405,407,408,409,410,411,413,414,415,416,418,429,430,432,433,435,436,437,438,441,442,446,447,449,450,451,452,454,455,456,457,458,461,464,465,469,470,472,473,475,476,477,478,480,481,483,484,486,487,488,489,491,492,493,494,495,497,499,500,504,515],"c":[["s",{"w":"paths","s":"s","e":true,"k":"s","d":[196],"c":[]}]]}],["t",{"w":"pattern","s":"tern","e":true,"k":"t","d":[71,139,146,171,196,229,355,376,517],"c":[["s",{"w":"patterns","s":"s","e":true,"k":"s","d":[14,15,17,70,86,119,127,128,145,174,356,366],"c":[]}]]}],["i",{"w":"patient","s":"ient","e":true,"k":"i","d":[355,356,366],"c":[]}]]}],["s",{"w":"pas","s":"s","e":false,"k":"s","d":[],"c":[["s",{"w":"pass","s":"s","e":true,"k":"s","d":[7,27,82,86,147,226,227,230,234,241,361,368,517],"c":[["e",{"w":"passe","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"passed","s":"d","e":true,"k":"d","d":[6,7,27,69,96,121,168,199,221,226,227,234,360,361,368,377,379],"c":[]}],["s",{"w":"passes","s":"s","e":true,"k":"s","d":[81,126,224],"c":[]}]]}],["w",{"w":"password","s":"word","e":true,"k":"w","d":[14,15,232,239,240,374,376,504,515],"c":[]}],["i",{"w":"passing","s":"ing","e":true,"k":"i","d":[69,86,352,372,374,376],"c":[]}],["a",{"w":"passage","s":"age","e":true,"k":"a","d":[202],"c":[]}]]}],["t",{"w":"past","s":"t","e":true,"k":"t","d":[12,127,156,161,202,245,348],"c":[["e",{"w":"paste","s":"e","e":true,"k":"e","d":[12,58,224,245,348],"c":[]}],["p",{"w":"pastprice","s":"price","e":true,"k":"p","d":[161],"c":[]}]]}]]}],["c",{"w":"pack","s":"ck","e":true,"k":"c","d":[76],"c":[["a",{"w":"package","s":"age","e":true,"k":"a","d":[7,9,12,20,29,30,58,224,229,230,231,232,233,235,236,241,243,245,246,348,352,354,355,357,361,367,369,370,375,511,513,517],"c":[["s",{"w":"packages","s":"s","e":true,"k":"s","d":[7,69,71,226,228,229,230,231,232,241,243,244,352,353,354,357,361],"c":[]}],["-",{"w":"package-install","s":"-install","e":true,"k":"-","d":[10,58,226,227,229,230,233,234,235,236,243,244,350,352,353,354,356,357,364,366,367,368,369,370,517],"c":[]}]]}],["i",{"w":"packing","s":"ing","e":true,"k":"i","d":[113],"c":[]}]]}],["g",{"w":"pag","s":"g","e":false,"k":"g","d":[],"c":[["e",{"w":"page","s":"e","e":true,"k":"e","d":[9,12,46,47,48,49,50,51,52,53,67,68,72,78,224,226,227,230,237,243,245,348,351,352,355,356,357,366,375,510,517],"c":[["f",{"w":"pagefooter","s":"footer","e":true,"k":"f","d":[44,466],"c":[]}],["s",{"w":"pages","s":"s","e":true,"k":"s","d":[377,379],"c":[]}]]}],["i",{"w":"paginate","s":"inate","e":true,"k":"i","d":[255],"c":[["d",{"w":"paginated","s":"d","e":true,"k":"d","d":[255],"c":[]}]]}]]}],["y",{"w":"pay","s":"y","e":true,"k":"y","d":[233,367],"c":[["l",{"w":"payload","s":"load","e":true,"k":"l","d":[51,52,67,68,226,227,234,368,371,375,376,377,379],"c":[["'",{"w":"payload'","s":"'","e":true,"k":"'","d":[51],"c":[]}],["s",{"w":"payloads","s":"s","e":true,"k":"s","d":[52,67,226,227],"c":[]}]]}],["o",{"w":"payout","s":"out","e":true,"k":"o","d":[95,219,222],"c":[["s",{"w":"payouts","s":"s","e":true,"k":"s","d":[95],"c":[]}]]}],["m",{"w":"payment","s":"ment","e":true,"k":"m","d":[123,154,233,367,511,513],"c":[["p",{"w":"paymentpublickey","s":"publickey","e":true,"k":"p","d":[233,367],"c":[]}],["-",{"w":"payment-asset","s":"-asset","e":true,"k":"-","d":[511,513],"c":[["-",{"w":"payment-asset-contract","s":"-contract","e":true,"k":"-","d":[511,513],"c":[]}]]}],["s",{"w":"payments","s":"s","e":true,"k":"s","d":[511,513],"c":[]}],["'",{"w":"payment's","s":"'s","e":true,"k":"'","d":[511,513],"c":[]}]]}],["-",{"w":"pay-to-","s":"-to-","e":false,"k":"-","d":[],"c":[["p",{"w":"pay-to-public-key-hash","s":"public-key-hash","e":true,"k":"p","d":[371],"c":[]}],["s",{"w":"pay-to-script-hash","s":"script-hash","e":true,"k":"s","d":[371],"c":[]}],["w",{"w":"pay-to-witness-","s":"witness-","e":false,"k":"w","d":[],"c":[["p",{"w":"pay-to-witness-public-key-hash","s":"public-key-hash","e":true,"k":"p","d":[371],"c":[]}],["s",{"w":"pay-to-witness-script-hash","s":"script-hash","e":true,"k":"s","d":[371],"c":[]}]]}]]}]]}],["n",{"w":"pan","s":"n","e":false,"k":"n","d":[],"c":[["e",{"w":"pane","s":"e","e":true,"k":"e","d":[52],"c":[["l",{"w":"panel","s":"l","e":true,"k":"l","d":[52],"c":[]}]]}],["i",{"w":"panic","s":"ic","e":true,"k":"i","d":[193],"c":[]}]]}],["p",{"w":"paperform","s":"perform","e":true,"k":"p","d":[70,72,73],"c":[]}],["i",{"w":"pai","s":"i","e":false,"k":"i","d":[],"c":[["d",{"w":"paid","s":"d","e":true,"k":"d","d":[95],"c":[]}],["r",{"w":"pair","s":"r","e":true,"k":"r","d":[97,164],"c":[["s",{"w":"pairs","s":"s","e":true,"k":"s","d":[97,167],"c":[]}],["i",{"w":"pairing","s":"ing","e":true,"k":"i","d":[164],"c":[]}]]}]]}],["u",{"w":"pausing","s":"using","e":true,"k":"u","d":[160],"c":[]}],["v",{"w":"paves","s":"ves","e":true,"k":"v","d":[219],"c":[]}]]}],["e",{"w":"pe","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"per","s":"r","e":true,"k":"r","d":[49,50,71,77,154,191,219,222,255,371],"c":[["i",{"w":"period","s":"iod","e":true,"k":"i","d":[69,127,176,202,223,516],"c":[["s",{"w":"periods","s":"s","e":true,"k":"s","d":[5,176,202,359],"c":[]}],["-",{"w":"period-end-height","s":"-end-height","e":true,"k":"-","d":[202],"c":[]}]]}],["f",{"w":"perf","s":"f","e":false,"k":"f","d":[],"c":[["o",{"w":"perform","s":"orm","e":true,"k":"o","d":[19,30,67,77,81,82,90,93,102,105,107,108,112,113,129,130,134,137,140,145,154,163,174,185,187,188,192,197,226,227,239],"c":[["i",{"w":"performing","s":"ing","e":true,"k":"i","d":[7,68,77,81,93,96,102,105,112,128,130,137,140,145,147,163,174,185,187,190,193,197,201,361],"c":[]}],["s",{"w":"performs","s":"s","e":true,"k":"s","d":[18,76,77,93,102,108,112,113,137,140,163,516],"c":[]}],["a",{"w":"performance","s":"ance","e":true,"k":"a","d":[76,79,89,96,105,108,116,126,132,155,161,165,170,183,185,189,197,379,427,459],"c":[["-",{"w":"performance-critical","s":"-critical","e":true,"k":"-","d":[88,120],"c":[]}]]}],["-",{"w":"perform-sensitive-action","s":"-sensitive-action","e":true,"k":"-","d":[108],"c":[]}],["e",{"w":"performed","s":"ed","e":true,"k":"e","d":[147],"c":[]}]]}],["e",{"w":"perfect","s":"ect","e":true,"k":"e","d":[238],"c":[]}]]}],["s",{"w":"pers","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"persist","s":"ist","e":true,"k":"i","d":[16,259,352,356,357,366],"c":[["w",{"w":"persistwalletselect","s":"walletselect","e":true,"k":"w","d":[356,366],"c":[]}]]}],["o",{"w":"personal","s":"onal","e":true,"k":"o","d":[50],"c":[["i",{"w":"personalized","s":"ized","e":true,"k":"i","d":[70,182],"c":[]}],["l",{"w":"personally","s":"ly","e":true,"k":"l","d":[517],"c":[]}]]}]]}],["c",{"w":"percentage","s":"centage","e":true,"k":"c","d":[22,77],"c":[["s",{"w":"percentages","s":"s","e":true,"k":"s","d":[77,112],"c":[]}]]}],["t",{"w":"pertaining","s":"taining","e":true,"k":"t","d":[22],"c":[]}],["m",{"w":"perm","s":"m","e":false,"k":"m","d":[],"c":[["i",{"w":"permi","s":"i","e":false,"k":"i","d":[],"c":[["t",{"w":"permit","s":"t","e":false,"k":"t","d":[],"c":[["s",{"w":"permits","s":"s","e":true,"k":"s","d":[27],"c":[]}],["t",{"w":"permitted","s":"ted","e":true,"k":"t","d":[231],"c":[]}]]}],["s",{"w":"permission","s":"ssion","e":true,"k":"s","d":[76,81,113,130],"c":[["s",{"w":"permissions","s":"s","e":true,"k":"s","d":[67,76,78,81,94,108,113,130,141,200,226,227,510],"c":[]}],["_",{"w":"permission_","s":"_","e":false,"k":"_","d":[],"c":[["r",{"w":"permission_read","s":"read","e":true,"k":"r","d":[76,130],"c":[]}],["w",{"w":"permission_write","s":"write","e":true,"k":"w","d":[76,130],"c":[]}],["e",{"w":"permission_exec","s":"exec","e":true,"k":"e","d":[76],"c":[["u",{"w":"permission_execute","s":"ute","e":true,"k":"u","d":[130],"c":[]}]]}],["a",{"w":"permission_admin","s":"admin","e":true,"k":"a","d":[130],"c":[]}]]}],["-",{"w":"permission-to-remove","s":"-to-remove","e":true,"k":"-","d":[76],"c":[]}]]}]]}],["a",{"w":"permanently","s":"anently","e":true,"k":"a","d":[115],"c":[]}]]}]]}],["e",{"w":"pee","s":"e","e":false,"k":"e","d":[],"c":[["k",{"w":"peek","s":"k","e":true,"k":"k","d":[12,245,348],"c":[]}],["r",{"w":"peer","s":"r","e":false,"k":"r","d":[],"c":[["n",{"w":"peernetworkid","s":"networkid","e":true,"k":"n","d":[235,369],"c":[]}],["_",{"w":"peer_","s":"_","e":false,"k":"_","d":[],"c":[["h",{"w":"peer_host","s":"host","e":true,"k":"h","d":[374],"c":[]}],["p",{"w":"peer_port","s":"port","e":true,"k":"p","d":[374],"c":[]}]]}]]}]]}],["n",{"w":"pending","s":"nding","e":true,"k":"n","d":[51,67,74,226,227,233,258,367,517],"c":[]}],["o",{"w":"people","s":"ople","e":true,"k":"o","d":[71],"c":[]}],["c",{"w":"peculiar","s":"culiar","e":true,"k":"c","d":[232],"c":[]}]]}],["o",{"w":"po","s":"o","e":false,"k":"o","d":[],"c":[["o",{"w":"pool","s":"ol","e":true,"k":"o","d":[6,7,11,256,259,360,361,376,381,501,505,516],"c":[["c",{"w":"poolcontract","s":"contract","e":true,"k":"c","d":[7,361],"c":[]}],["_",{"w":"pool_principal","s":"_principal","e":true,"k":"_","d":[316],"c":[]}]]}],["s",{"w":"pos","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"post","s":"t","e":true,"k":"t","d":[52,68,226,227,234,236,259,368,370,374,376,377,379],"c":[["_",{"w":"post_co","s":"_co","e":false,"k":"_","d":[],"c":[["m",{"w":"post_comments","s":"mments","e":true,"k":"m","d":[7,361],"c":[]}],["n",{"w":"post_condition","s":"ndition","e":false,"k":"n","d":[],"c":[["_",{"w":"post_condition_mode","s":"_mode","e":true,"k":"_","d":[51,255,517],"c":[]}],["s",{"w":"post_conditions","s":"s","e":true,"k":"s","d":[51,255,517],"c":[]}]]}]]}],["g",{"w":"postgres","s":"gres","e":true,"k":"g","d":[14,15,55,259,502,504],"c":[["q",{"w":"postgresql","s":"ql","e":true,"k":"q","d":[259],"c":[]}]]}],["c",{"w":"postcondition","s":"condition","e":true,"k":"c","d":[51,229,230,231],"c":[["a",{"w":"postconditiona","s":"a","e":false,"k":"a","d":[],"c":[["d",{"w":"postconditionaddress","s":"ddress","e":true,"k":"d","d":[226,234,368],"c":[]}],["m",{"w":"postconditionamount","s":"mount","e":true,"k":"m","d":[226,234,368],"c":[]}]]}],["c",{"w":"postconditioncode","s":"code","e":true,"k":"c","d":[226,234,368],"c":[]}],["s",{"w":"postconditions","s":"s","e":true,"k":"s","d":[226,230,234,238,351,368],"c":[]}],["w",{"w":"postconditionwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}],["p",{"w":"postconditionprincipal","s":"principal","e":true,"k":"p","d":[229],"c":[["w",{"w":"postconditionprincipalwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}],["m",{"w":"postconditionmode","s":"mode","e":true,"k":"m","d":[231],"c":[]}],["f",{"w":"postconditionfor","s":"for","e":false,"k":"f","d":[],"c":[["n",{"w":"postconditionfornft","s":"nft","e":true,"k":"n","d":[231],"c":[]}],["f",{"w":"postconditionforft","s":"ft","e":true,"k":"f","d":[231],"c":[]}]]}]]}],["i",{"w":"posting","s":"ing","e":true,"k":"i","d":[52],"c":[]}],["-",{"w":"post-","s":"-","e":false,"k":"-","d":[],"c":[["e",{"w":"post-epoch","s":"epoch","e":true,"k":"e","d":[104],"c":[]}],["u",{"w":"post-upgrade","s":"upgrade","e":true,"k":"u","d":[219],"c":[]}],["c",{"w":"post-condition","s":"condition","e":true,"k":"c","d":[226,229,231,234,238,368],"c":[["s",{"w":"post-conditions","s":"s","e":true,"k":"s","d":[226,228,229,230,231,234,238,352,353,354,368],"c":[]}]]}]]}],["p",{"w":"postpended","s":"pended","e":true,"k":"p","d":[226,227],"c":[]}],["m",{"w":"postmiddleware","s":"middleware","e":true,"k":"m","d":[227,236,370],"c":[]}],["s",{"w":"posts","s":"s","e":true,"k":"s","d":[374,376],"c":[]}]]}],["s",{"w":"possib","s":"sib","e":false,"k":"s","d":[],"c":[["l",{"w":"possible","s":"le","e":true,"k":"l","d":[77,82,83,84,85,89,93,94,98,101,105,106,107,109,110,111,117,118,121,123,124,131,132,133,135,136,138,139,141,142,143,146,147,148,150,151,153,155,157,158,159,162,165,166,167,168,169,170,171,172,175,181,184,185,186,189,194,195,196,197,198,200,201,202,229],"c":[["_",{"w":"possible_next_nonce","s":"_next_nonce","e":true,"k":"_","d":[258],"c":[]}]]}],["i",{"w":"possibility","s":"ility","e":true,"k":"i","d":[86,102,112,137,140],"c":[]}]]}],["i",{"w":"positi","s":"iti","e":false,"k":"i","d":[],"c":[["v",{"w":"positive","s":"ve","e":true,"k":"v","d":[87,118,137,143,145,150,168,179,184,187,197],"c":[]}],["o",{"w":"position","s":"on","e":true,"k":"o","d":[128,180,183,377],"c":[["s",{"w":"positions","s":"s","e":true,"k":"s","d":[180,183],"c":[]}]]}]]}]]}],["w",{"w":"pow","s":"w","e":true,"k":"w","d":[107,174,185],"c":[["e",{"w":"power","s":"er","e":true,"k":"e","d":[52,107,145,185,202],"c":[["f",{"w":"powerful","s":"ful","e":true,"k":"f","d":[12,31,69,76,79,80,81,87,88,90,91,92,93,95,96,97,103,108,113,115,119,120,127,128,129,130,133,144,145,149,152,156,158,161,174,177,179,183,187,188,192,193,202,245,348],"c":[]}],["s",{"w":"powers","s":"s","e":true,"k":"s","d":[145,174,427,459],"c":[["h",{"w":"powershell","s":"hell","e":true,"k":"h","d":[18],"c":[]}]]}],["e",{"w":"powered","s":"ed","e":true,"k":"e","d":[422,502],"c":[]}]]}]]}],["t",{"w":"pot","s":"t","e":true,"k":"t","d":[371],"c":[["e",{"w":"potential","s":"ential","e":true,"k":"e","d":[12,81,87,90,95,99,102,112,114,115,125,126,133,137,140,144,145,154,156,158,161,174,176,177,178,179,180,187,191,192,201,202,245,348],"c":[["l",{"w":"potentially","s":"ly","e":true,"k":"l","d":[76,99,103,112,116,123,154,176,178,182,191,192,516],"c":[]}]]}]]}],["i",{"w":"poi","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"point","s":"nt","e":true,"k":"n","d":[68,232,375],"c":[["s",{"w":"points","s":"s","e":true,"k":"s","d":[14,15,17,77,99],"c":[]}],["e",{"w":"pointer-events-none","s":"er-events-none","e":true,"k":"e","d":[30],"c":[]}]]}],["s",{"w":"poisonpayload","s":"sonpayload","e":true,"k":"s","d":[229],"c":[["w",{"w":"poisonpayloadwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}]]}],["r",{"w":"port","s":"rt","e":true,"k":"r","d":[68,374,376,504],"c":[["a",{"w":"portability","s":"ability","e":true,"k":"a","d":[19],"c":[]}],["s",{"w":"ports","s":"s","e":true,"k":"s","d":[27],"c":[]}],["i",{"w":"portion","s":"ion","e":true,"k":"i","d":[226,234,368,376],"c":[]}],["f",{"w":"portfolios","s":"folios","e":true,"k":"f","d":[427,459],"c":[]}]]}],["p",{"w":"popu","s":"pu","e":false,"k":"p","d":[],"c":[["l",{"w":"popula","s":"la","e":false,"k":"l","d":[],"c":[["r",{"w":"popular","s":"r","e":true,"k":"r","d":[31,54,208,257,345,399,427,459],"c":[]}],["t",{"w":"populated","s":"ted","e":true,"k":"t","d":[52],"c":[]}]]}],["p",{"w":"popup","s":"p","e":true,"k":"p","d":[352],"c":[]}]]}],["l",{"w":"pol","s":"l","e":false,"k":"l","d":[],"c":[["i",{"w":"policies","s":"icies","e":true,"k":"i","d":[49],"c":[]}],["y",{"w":"poly","s":"y","e":false,"k":"y","d":[],"c":[["m",{"w":"polymorphic","s":"morphic","e":true,"k":"m","d":[119],"c":[]}],["f",{"w":"polyfill","s":"fill","e":true,"k":"f","d":[232],"c":[["s",{"w":"polyfills","s":"s","e":true,"k":"s","d":[232],"c":[]}],["i",{"w":"polyfilling","s":"ing","e":true,"k":"i","d":[232],"c":[]}]]}]]}]]}],["x",{"w":"pox","s":"x","e":true,"k":"x","d":[95,208,219,221,222,244,259,287,289,290,291,292,372,399,514],"c":[["-",{"w":"pox-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"pox-addrs","s":"addrs","e":true,"k":"a","d":[95],"c":[]}],["r",{"w":"pox-related","s":"related","e":true,"k":"r","d":[95],"c":[]}],["c",{"w":"pox-cycle-signers","s":"cycle-signers","e":true,"k":"c","d":[208],"c":[]}],["4",{"w":"pox-4","s":"4","e":true,"k":"4","d":[219,221,223],"c":[]}],["d",{"w":"pox-details","s":"details","e":true,"k":"d","d":[399],"c":[]}]]}],["4",{"w":"pox4","s":"4","e":true,"k":"4","d":[316,516],"c":[["s",{"w":"pox4signaturetopic","s":"signaturetopic","e":true,"k":"s","d":[219,223],"c":[]}]]}],["_",{"w":"pox_stacking_orders","s":"_stacking_orders","e":true,"k":"_","d":[221],"c":[]}],["a",{"w":"poxaddress","s":"address","e":true,"k":"a","d":[223],"c":[]}],["i",{"w":"poxinfourl","s":"infourl","e":true,"k":"i","d":[227,236,370],"c":[]}],["'",{"w":"pox'","s":"'","e":true,"k":"'","d":[392],"c":[]}]]}]]}],["u",{"w":"pu","s":"u","e":false,"k":"u","d":[],"c":[["b",{"w":"pub","s":"b","e":true,"k":"b","d":[233,367],"c":[["l",{"w":"publi","s":"li","e":false,"k":"l","d":[],"c":[["c",{"w":"public","s":"c","e":true,"k":"c","d":[7,8,9,12,13,19,27,30,44,50,51,55,80,84,85,86,89,90,91,93,94,98,99,101,106,109,111,117,118,123,129,131,132,134,135,137,138,141,142,143,148,150,152,153,157,159,162,164,166,167,168,169,175,181,184,186,188,189,194,198,199,200,224,226,229,233,234,237,240,241,245,246,348,356,361,366,367,368,371,399,466,508,511,513,517],"c":[["a",{"w":"publication","s":"ation","e":true,"k":"a","d":[27],"c":[]}],["k",{"w":"publickey","s":"key","e":true,"k":"k","d":[71,169,226,234,240,352,354,356,366,368],"c":[["s",{"w":"publickeys","s":"s","e":true,"k":"s","d":[226,234,368],"c":[]}],["t",{"w":"publickeyto","s":"to","e":false,"k":"t","d":[],"c":[["s",{"w":"publickeytostring","s":"string","e":true,"k":"s","d":[226,234,368],"c":[]}],["a",{"w":"publickeytoaddress","s":"address","e":true,"k":"a","d":[240],"c":[]}]]}],["f",{"w":"publickeyfromsignature","s":"fromsignature","e":false,"k":"f","d":[],"c":[["v",{"w":"publickeyfromsignaturevrs","s":"vrs","e":true,"k":"v","d":[229],"c":[]}],["r",{"w":"publickeyfromsignaturersv","s":"rsv","e":true,"k":"r","d":[229],"c":[]}]]}],["w",{"w":"publickeywire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}],["-",{"w":"public-key","s":"-key","e":true,"k":"-","d":[80,94,169],"c":[]}]]}],["s",{"w":"publish","s":"sh","e":true,"k":"s","d":[19,52],"c":[["e",{"w":"publishe","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"published","s":"d","e":true,"k":"d","d":[27,228,244],"c":[]}],["s",{"w":"publishes","s":"s","e":true,"k":"s","d":[27],"c":[]}]]}],["_",{"w":"publish_data","s":"_data","e":true,"k":"_","d":[226,227],"c":[]}]]}]]}],["k",{"w":"pubkey","s":"key","e":true,"k":"k","d":[371],"c":[["f",{"w":"pubkeyfromprivkey","s":"fromprivkey","e":true,"k":"f","d":[226,234,368],"c":[]}],["s",{"w":"pubkeys","s":"s","e":true,"k":"s","d":[226,234,368],"c":[["t",{"w":"pubkeystrings","s":"trings","e":true,"k":"t","d":[226,234,368],"c":[]}]]}]]}]]}],["r",{"w":"pur","s":"r","e":false,"k":"r","d":[],"c":[["p",{"w":"purpose","s":"pose","e":true,"k":"p","d":[69,78,97,99,128,129,130,134,152,233,367],"c":[["s",{"w":"purposes","s":"s","e":true,"k":"s","d":[19,27,28,49,80,104,156,174,187,199,237,351,372],"c":[]}]]}],["c",{"w":"purchase","s":"chase","e":true,"k":"c","d":[71,154,511,513],"c":[["-",{"w":"purchase-tokens","s":"-tokens","e":true,"k":"-","d":[154],"c":[]}],["s",{"w":"purchases","s":"s","e":true,"k":"s","d":[511,513],"c":[]}],["r",{"w":"purchaser","s":"r","e":true,"k":"r","d":[511,513],"c":[]}],["d",{"w":"purchased","s":"d","e":true,"k":"d","d":[511,513],"c":[]}]]}]]}],["l",{"w":"pul","s":"l","e":false,"k":"l","d":[],"c":[["s",{"w":"pulse","s":"se","e":true,"k":"s","d":[44,466],"c":[]}],["l",{"w":"pull","s":"l","e":true,"k":"l","d":[54,374,459],"c":[]}]]}],["t",{"w":"put","s":"t","e":true,"k":"t","d":[68,257,345],"c":[]}],["s",{"w":"push","s":"sh","e":true,"k":"s","d":[208],"c":[]}]]}],["l",{"w":"pl","s":"l","e":false,"k":"l","d":[],"c":[["a",{"w":"pla","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"plan","s":"n","e":true,"k":"n","d":[19,25,27,28,46,49,50,51,515],"c":[["t",{"w":"plant","s":"t","e":true,"k":"t","d":[11,256,381,501,505],"c":[]}],["s",{"w":"plans","s":"s","e":true,"k":"s","d":[18,19,25,27,45,53,227,236,370],"c":[]}],["'",{"w":"plan's","s":"'s","e":true,"k":"'","d":[27],"c":[]}],["n",{"w":"planning","s":"ning","e":true,"k":"n","d":[71,202],"c":[]}]]}],["t",{"w":"platform","s":"tform","e":true,"k":"t","d":[18,31,44,45,46,47,48,49,50,51,52,53,68,228,373,377,379],"c":[["-",{"w":"platform-","s":"-","e":false,"k":"-","d":[],"c":[["h",{"w":"platform-hosted","s":"hosted","e":true,"k":"h","d":[31,50],"c":[]}],["a",{"w":"platform-api","s":"api","e":true,"k":"a","d":[31,32,34,35,36,37,38,39,41,42,43,50,52],"c":[]}]]}],["'",{"w":"platform's","s":"'s","e":true,"k":"'","d":[50],"c":[]}],["s",{"w":"platforms","s":"s","e":true,"k":"s","d":[226,227],"c":[]}]]}],["y",{"w":"play","s":"y","e":true,"k":"y","d":[44,239,466],"c":[["e",{"w":"player","s":"er","e":true,"k":"e","d":[70],"c":[]}]]}],["c",{"w":"place","s":"ce","e":true,"k":"c","d":[48,92,114,122,160,228,229,515],"c":[["d",{"w":"placed","s":"d","e":true,"k":"d","d":[52],"c":[]}],["-",{"w":"place-","s":"-","e":false,"k":"-","d":[],"c":[["b",{"w":"place-bid","s":"bid","e":true,"k":"b","d":[114],"c":[]}],["i",{"w":"place-items-center","s":"items-center","e":true,"k":"i","d":[352],"c":[]}]]}],["s",{"w":"places","s":"s","e":true,"k":"s","d":[145,174,185],"c":[]}],["h",{"w":"placeholder","s":"holder","e":true,"k":"h","d":[509],"c":[]}]]}],["i",{"w":"plain","s":"in","e":false,"k":"i","d":[],"c":[["t",{"w":"plaintext","s":"text","e":true,"k":"t","d":[67,226,227],"c":[]}],["'",{"w":"plain'","s":"'","e":true,"k":"'","d":[297,300],"c":[]}]]}]]}],["u",{"w":"plus","s":"us","e":true,"k":"u","d":[69],"c":[]}],["e",{"w":"please","s":"ease","e":true,"k":"e","d":[229,355,356,366,371,372],"c":[]}]]}],["g",{"w":"pg","s":"g","e":false,"k":"g","d":[],"c":[["_",{"w":"pg_","s":"_","e":false,"k":"_","d":[],"c":[["d",{"w":"pg_dump","s":"dump","e":true,"k":"d","d":[14],"c":[]}],["r",{"w":"pg_restore","s":"restore","e":true,"k":"r","d":[14,15],"c":[]}]]}],["p",{"w":"pgpassword","s":"password","e":true,"k":"p","d":[14,15],"c":[]}]]}],["k",{"w":"pkg-config","s":"kg-config","e":true,"k":"k","d":[18,517],"c":[]}],["2",{"w":"p2","s":"2","e":false,"k":"2","d":[],"c":[["p",{"w":"p2p","s":"p","e":false,"k":"p","d":[],"c":[["k",{"w":"p2pkh","s":"kh","e":true,"k":"k","d":[19,27,371],"c":[]}],["_",{"w":"p2p_bind","s":"_bind","e":true,"k":"_","d":[374],"c":[]}]]}],["t",{"w":"p2tr","s":"tr","e":true,"k":"t","d":[233,367],"c":[]}],["w",{"w":"p2w","s":"w","e":false,"k":"w","d":[],"c":[["p",{"w":"p2wpk","s":"pk","e":true,"k":"p","d":[233,367],"c":[["h",{"w":"p2wpkh","s":"h","e":true,"k":"h","d":[371,376],"c":[]}]]}],["s",{"w":"p2wsh","s":"sh","e":true,"k":"s","d":[371],"c":[]}]]}],["s",{"w":"p2sh","s":"sh","e":true,"k":"s","d":[233,367,371],"c":[]}],["k",{"w":"p2kph","s":"kph","e":true,"k":"k","d":[371],"c":[]}]]}],["i",{"w":"pi","s":"i","e":false,"k":"i","d":[],"c":[["e",{"w":"piece","s":"ece","e":true,"k":"e","d":[22],"c":[["s",{"w":"pieces","s":"s","e":true,"k":"s","d":[76,129,233,367],"c":[]}]]}],["c",{"w":"pic","s":"c","e":false,"k":"c","d":[],"c":[["t",{"w":"picture-in-picture","s":"ture-in-picture","e":true,"k":"t","d":[70,72],"c":[]}],["k",{"w":"picker","s":"ker","e":true,"k":"k","d":[517],"c":[]}]]}],["t",{"w":"pitfalls","s":"tfalls","e":true,"k":"t","d":[82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200],"c":[]}]]}],["h",{"w":"ph","s":"h","e":false,"k":"h","d":[],"c":[["r",{"w":"phrase","s":"rase","e":true,"k":"r","d":[232,239,240],"c":[["s",{"w":"phrases","s":"s","e":true,"k":"s","d":[29],"c":[]}]]}],["a",{"w":"phase","s":"ase","e":true,"k":"a","d":[233,367],"c":[["s",{"w":"phases","s":"s","e":true,"k":"s","d":[95],"c":[]}],["d",{"w":"phased","s":"d","e":true,"k":"d","d":[202],"c":[]}]]}]]}],["t",{"w":"pt-0'","s":"t-0'","e":true,"k":"t","d":[44],"c":[]}],["n",{"w":"pn","s":"n","e":false,"k":"n","d":[],"c":[["g",{"w":"png","s":"g","e":true,"k":"g","d":[45,46,47,48,49,50,51,52,53,219,220,229],"c":[]}],["p",{"w":"pnpm","s":"pm","e":true,"k":"p","d":[75],"c":[]}]]}],["c",{"w":"pc","s":"c","e":true,"k":"c","d":[230,231,234,238,368,515],"c":[]}],["s",{"w":"psbt","s":"sbt","e":true,"k":"s","d":[351,356,366],"c":[["b",{"w":"psbtbytes","s":"bytes","e":true,"k":"b","d":[233,367],"c":[]}]]}],["-",{"w":"p-8","s":"-8","e":true,"k":"-","d":[352],"c":[]}]]}],["s",{"w":"s","s":"s","e":true,"k":"s","d":[26,27,51,52,74,219,229,425,427,443,459],"c":[["e",{"w":"se","s":"e","e":false,"k":"e","d":[],"c":[["c",{"w":"sec","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"second","s":"ond","e":true,"k":"o","d":[69,114,154,176,191,226,227,234,246,368],"c":[["a",{"w":"secondarycard","s":"arycard","e":true,"k":"a","d":[2,8,11,13,18,22,26,27,30,31,54,73,78,203,204,208,225,228,256,257,345,347,349,350,373,381,399,420,459,501,502,505,508],"c":[]}],["s",{"w":"seconds","s":"s","e":true,"k":"s","d":[104,176,246],"c":[]}]]}],["t",{"w":"section","s":"tion","e":true,"k":"t","d":[2,8,11,18,22,27,31,45,46,54,55,65,68,69,73,74,78,203,204,208,225,228,256,257,345,347,349,350,352,373,374,376,378,381,399,420,422,425,439,443,459,462,501,502,505],"c":[["s",{"w":"sections","s":"s","e":true,"k":"s","d":[69,88,120,240],"c":[]}]]}],["r",{"w":"secret","s":"ret","e":true,"k":"r","d":[52,58,67,226,227,237,239,517],"c":[["s",{"w":"secrets","s":"s","e":true,"k":"s","d":[19],"c":[]}],["k",{"w":"secretkey","s":"key","e":true,"k":"k","d":[232,239,240],"c":[]}]]}],["u",{"w":"secur","s":"ur","e":false,"k":"u","d":[],"c":[["e",{"w":"secure","s":"e","e":true,"k":"e","d":[49,50,67,77,80,81,123,126,129,193,201,226,227,230,352,353,354,371,376],"c":[["l",{"w":"securely","s":"ly","e":true,"k":"l","d":[49,77,352,516],"c":[]}],["d",{"w":"secured","s":"d","e":true,"k":"d","d":[192],"c":[]}]]}],["i",{"w":"securi","s":"i","e":false,"k":"i","d":[],"c":[["t",{"w":"security","s":"ty","e":true,"k":"t","d":[51,70,71,77,80,81,84,91,93,99,104,111,156,162,169,181,188,192,193,202,231,238,355,371,509],"c":[]}],["n",{"w":"securing-web3-apps-through-bitcoin-an-overview-of-stacks-consensus-mechanism","s":"ng-web3-apps-through-bitcoin-an-overview-of-stacks-consensus-mechanism","e":true,"k":"n","d":[371],"c":[]}]]}]]}],["p",{"w":"secp256k1-","s":"p256k1-","e":false,"k":"p","d":[],"c":[["r",{"w":"secp256k1-recover","s":"recover","e":true,"k":"r","d":[80,162,169],"c":[]}],["v",{"w":"secp256k1-verify","s":"verify","e":true,"k":"v","d":[80,169],"c":[]}]]}]]}],["t",{"w":"set","s":"t","e":true,"k":"t","d":[11,12,18,19,26,27,29,30,45,51,52,53,67,68,69,74,76,83,88,90,91,92,97,103,113,120,130,132,139,173,174,175,187,193,202,219,221,222,224,226,227,231,232,234,236,238,243,245,255,256,259,348,354,357,368,370,374,376,377,378,381,399,423,425,427,443,459,501,504,505,511,513,515,516,517],"c":[["-",{"w":"set-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"set-deployer","s":"deployer","e":true,"k":"d","d":[5,359],"c":[]}],["u",{"w":"set-u","s":"u","e":false,"k":"u","d":[],"c":[["p",{"w":"set-up-","s":"p-","e":false,"k":"p","d":[],"c":[["a",{"w":"set-up-a-","s":"a-","e":false,"k":"a","d":[],"c":[["c",{"w":"set-up-a-clarinet-project","s":"clarinet-project","e":true,"k":"c","d":[12,245,348],"c":[]}],["n",{"w":"set-up-a-new-clarinet-project","s":"new-clarinet-project","e":true,"k":"n","d":[224],"c":[]}]]}],["t",{"w":"set-up-the-expo-project","s":"the-expo-project","e":true,"k":"t","d":[232],"c":[]}]]}],["s",{"w":"set-user-","s":"ser-","e":false,"k":"s","d":[],"c":[["i",{"w":"set-user-info","s":"info","e":true,"k":"i","d":[83],"c":[]}],["d",{"w":"set-user-data","s":"data","e":true,"k":"d","d":[132],"c":[]}]]}]]}],["c",{"w":"set-contract-owner","s":"contract-owner","e":true,"k":"c","d":[51],"c":[]}],["e",{"w":"set-extension","s":"extension","e":true,"k":"e","d":[69,90],"c":[]}],["f",{"w":"set-f","s":"f","e":false,"k":"f","d":[],"c":[["e",{"w":"set-fee","s":"ee","e":true,"k":"e","d":[71],"c":[]}],["l",{"w":"set-flag","s":"lag","e":true,"k":"l","d":[174],"c":[]}]]}],["p",{"w":"set-pr","s":"pr","e":false,"k":"p","d":[],"c":[["o",{"w":"set-pro","s":"o","e":false,"k":"o","d":[],"c":[["t",{"w":"set-protocol-fee-percent","s":"tocol-fee-percent","e":true,"k":"t","d":[71],"c":[]}],["f",{"w":"set-profile","s":"file","e":true,"k":"f","d":[97,116],"c":[]}]]}],["i",{"w":"set-price","s":"ice","e":true,"k":"i","d":[161],"c":[]}]]}],["v",{"w":"set-value","s":"value","e":true,"k":"v","d":[99],"c":[]}],["a",{"w":"set-a","s":"a","e":false,"k":"a","d":[],"c":[["d",{"w":"set-admin","s":"dmin","e":true,"k":"d","d":[108],"c":[]}],["l",{"w":"set-all","s":"ll","e":false,"k":"l","d":[],"c":[["-",{"w":"set-all-flags-except","s":"-flags-except","e":true,"k":"-","d":[187],"c":[]}],["o",{"w":"set-allowed","s":"owed","e":true,"k":"o","d":[516],"c":[]}]]}]]}],["w",{"w":"set-whitelisted","s":"whitelisted","e":true,"k":"w","d":[511,513],"c":[]}]]}],["t",{"w":"sett","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"setting","s":"ing","e":true,"k":"i","d":[5,50,51,67,68,69,71,76,99,114,132,154,175,176,191,221,226,227,231,241,346,359,373,374,376,516],"c":[["s",{"w":"settings","s":"s","e":true,"k":"s","d":[9,20,27,29,30,50,67,76,221,375],"c":[]}],["_",{"w":"setting_","s":"_","e":false,"k":"_","d":[],"c":[["n",{"w":"setting_newsletter","s":"newsletter","e":true,"k":"n","d":[76],"c":[]}],["2",{"w":"setting_2fa","s":"2fa","e":true,"k":"2","d":[76],"c":[]}],["p",{"w":"setting_private_profile","s":"private_profile","e":true,"k":"p","d":[76],"c":[]}],["d",{"w":"setting_dark_mode","s":"dark_mode","e":true,"k":"d","d":[76],"c":[]}]]}],["-",{"w":"setting-the-post-condition-mode","s":"-the-post-condition-mode","e":true,"k":"-","d":[231],"c":[]}]]}],["l",{"w":"settling","s":"ling","e":true,"k":"l","d":[219,220],"c":[]}]]}],["u",{"w":"setup","s":"up","e":true,"k":"u","d":[46,50,54,68,230,259,353,354,422,502],"c":[["-",{"w":"setup-and-installation","s":"-and-installation","e":true,"k":"-","d":[230,353,354],"c":[]}]]}],["s",{"w":"sets","s":"s","e":true,"k":"s","d":[69,79,83,89,99,131,132,167,172,175,189],"c":[]}],["m",{"w":"setmnemonic","s":"mnemonic","e":true,"k":"m","d":[232],"c":[]}],["w",{"w":"setwallet","s":"wallet","e":true,"k":"w","d":[232],"c":[]}],["l",{"w":"setlog","s":"log","e":true,"k":"l","d":[232],"c":[]}],["_",{"w":"set_tx_sender","s":"_tx_sender","e":true,"k":"_","d":[516],"c":[]}]]}],["l",{"w":"sel","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"select","s":"ect","e":true,"k":"e","d":[46,47,48,49,50,52,53,68,69,352,356,366,377,515,516],"c":[["i",{"w":"selecti","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"selecting","s":"ng","e":true,"k":"n","d":[7,73,361],"c":[]}],["o",{"w":"selection","s":"on","e":true,"k":"o","d":[47,177,352,516],"c":[["e",{"w":"selectionerror","s":"error","e":true,"k":"e","d":[516],"c":[]}]]}],["v",{"w":"selectively","s":"vely","e":true,"k":"v","d":[177],"c":[]}]]}],["-",{"w":"select-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"select-chainhook-tab","s":"chainhook-tab","e":true,"k":"c","d":[52],"c":[]}],["w",{"w":"select-winner","s":"winner","e":true,"k":"w","d":[516],"c":[]}]]}],["e",{"w":"selected","s":"ed","e":true,"k":"e","d":[52,53,352,356,357,366,516,517],"c":[]}],["s",{"w":"selects","s":"s","e":true,"k":"s","d":[96,516],"c":[]}],["o",{"w":"selector","s":"or","e":true,"k":"o","d":[356,366],"c":[]}]]}],["l",{"w":"sell","s":"l","e":true,"k":"l","d":[71,511,513],"c":[["i",{"w":"selling","s":"ing","e":true,"k":"i","d":[71],"c":[]}],["-",{"w":"sell-keys","s":"-keys","e":true,"k":"-","d":[71],"c":[]}],["e",{"w":"seller","s":"er","e":true,"k":"e","d":[71],"c":[]}],["s",{"w":"sells","s":"s","e":true,"k":"s","d":[71],"c":[]}]]}],["f",{"w":"self","s":"f","e":true,"k":"f","d":[193],"c":[["-",{"w":"self-host","s":"-host","e":true,"k":"-","d":[399],"c":[]}]]}]]}],["n",{"w":"sen","s":"n","e":false,"k":"n","d":[],"c":[["d",{"w":"send","s":"d","e":true,"k":"d","d":[19,51,68,71,123,192,193,221,226,231,233,234,238,239,367,368,371,374,376,516],"c":[["e",{"w":"sender","s":"er","e":true,"k":"e","d":[7,12,52,69,71,81,90,101,108,115,122,123,135,143,147,150,152,160,164,166,184,192,193,196,200,224,233,234,245,348,361,367,368,377,514],"c":[["_",{"w":"sender_address","s":"_address","e":true,"k":"_","d":[51,255],"c":[]}],["a",{"w":"senderaddress","s":"address","e":true,"k":"a","d":[69,71,226,234,368],"c":[]}],["b",{"w":"senderbalance","s":"balance","e":true,"k":"b","d":[81,124,136,140,147,152,164,190,193,196,201],"c":[]}],["'",{"w":"sender's","s":"'s","e":true,"k":"'","d":[123,190,193,230,233,237,367],"c":[]}],["k",{"w":"senderkey","s":"key","e":true,"k":"k","d":[226,227,230,232,234,236,237,242,243,368,370],"c":[]}]]}],["s",{"w":"sends","s":"s","e":true,"k":"s","d":[49,230,233,367],"c":[]}],["i",{"w":"sending","s":"ing","e":true,"k":"i","d":[69,123,193,227,231,236,237,238,370,374,376],"c":[]}],["t",{"w":"sendtransfer","s":"transfer","e":true,"k":"t","d":[233,351,356,366,367],"c":[]}],["-",{"w":"send-stacking-reward-","s":"-stacking-reward-","e":false,"k":"-","d":[],"c":[["m",{"w":"send-stacking-reward-mia","s":"mia","e":true,"k":"m","d":[516],"c":[]}],["n",{"w":"send-stacking-reward-nyc","s":"nyc","e":true,"k":"n","d":[516],"c":[]}]]}]]}],["s",{"w":"sens","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"sensitive","s":"itive","e":true,"k":"i","d":[19,81,99,108,160,188,193],"c":[]}],["e",{"w":"sense","s":"e","e":true,"k":"e","d":[68,96,103],"c":[]}]]}],["t",{"w":"sent","s":"t","e":true,"k":"t","d":[52,68,229,231,233,367],"c":[["_",{"w":"sent_equal_to","s":"_equal_to","e":true,"k":"_","d":[51,517],"c":[]}]]}]]}],["p",{"w":"separat","s":"parat","e":false,"k":"p","d":[],"c":[["e",{"w":"separate","s":"e","e":true,"k":"e","d":[27,108,134,241,371,375],"c":[["l",{"w":"separately","s":"ly","e":true,"k":"l","d":[7,361],"c":[]}],["d",{"w":"separated","s":"d","e":true,"k":"d","d":[228,244],"c":[]}]]}],["i",{"w":"separating","s":"ing","e":true,"k":"i","d":[129,371],"c":[]}]]}],["r",{"w":"ser","s":"r","e":false,"k":"r","d":[],"c":[["v",{"w":"serv","s":"v","e":false,"k":"v","d":[],"c":[["i",{"w":"service","s":"ice","e":true,"k":"i","d":[11,13,14,15,24,31,52,54,55,74,256,354,374,375,376,378,379,381,399,423,425,427,443,459,501,504,505,509,510,515],"c":[["s",{"w":"services","s":"s","e":true,"k":"s","d":[13,24,49],"c":[]}]]}],["e",{"w":"serve","s":"e","e":true,"k":"e","d":[71,259],"c":[["r",{"w":"server","s":"r","e":true,"k":"r","d":[68,259,374,376,515],"c":[["_",{"w":"server_version","s":"_version","e":true,"k":"_","d":[58],"c":[]}]]}],["s",{"w":"serves","s":"s","e":true,"k":"s","d":[373],"c":[]}]]}]]}],["i",{"w":"seri","s":"i","e":false,"k":"i","d":[],"c":[["e",{"w":"series","s":"es","e":true,"k":"e","d":[78,163,219,222],"c":[]}],["a",{"w":"serializ","s":"aliz","e":false,"k":"a","d":[],"c":[["i",{"w":"serializing","s":"ing","e":true,"k":"i","d":[142],"c":[]}],["a",{"w":"serialization","s":"ation","e":true,"k":"a","d":[142,229],"c":[["-",{"w":"serialization-deserialization","s":"-deserialization","e":true,"k":"-","d":[144],"c":[]}]]}],["e",{"w":"serialize","s":"e","e":true,"k":"e","d":[142,144,226,229,234,368],"c":[["s",{"w":"serializes","s":"s","e":true,"k":"s","d":[142],"c":[["t",{"w":"serializestacks","s":"tacks","e":false,"k":"t","d":[],"c":[["m",{"w":"serializestacksmessage","s":"message","e":true,"k":"m","d":[229],"c":[["b",{"w":"serializestacksmessagebytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}],["w",{"w":"serializestackswirebytes","s":"wirebytes","e":true,"k":"w","d":[229],"c":[]}]]}]]}],["-",{"w":"serialize-","s":"-","e":false,"k":"-","d":[],"c":[["i",{"w":"serialize-int","s":"int","e":true,"k":"i","d":[142],"c":[]}],["t",{"w":"serialize-tuple","s":"tuple","e":true,"k":"t","d":[142],"c":[]}]]}],["d",{"w":"serialized","s":"d","e":true,"k":"d","d":[142,144,226,234,242,368,514],"c":[["d",{"w":"serializeddata","s":"data","e":true,"k":"d","d":[144],"c":[]}],["t",{"w":"serializedtx","s":"tx","e":true,"k":"t","d":[226,234,368],"c":[["h",{"w":"serializedtxhex","s":"hex","e":true,"k":"h","d":[226],"c":[]}]]}],["s",{"w":"serializedsignedtx","s":"signedtx","e":true,"k":"s","d":[226,234,368],"c":[]}]]}],["b",{"w":"serializebytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}],["c",{"w":"serializecv","s":"cv","e":true,"k":"c","d":[229],"c":[["b",{"w":"serializecvbytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}],["a",{"w":"serializeaddress","s":"address","e":true,"k":"a","d":[229],"c":[["b",{"w":"serializeaddressbytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}],["l",{"w":"serializelp","s":"lp","e":false,"k":"l","d":[],"c":[["l",{"w":"serializelplist","s":"list","e":true,"k":"l","d":[229],"c":[["b",{"w":"serializelplistbytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}],["s",{"w":"serializelpstring","s":"string","e":true,"k":"s","d":[229],"c":[["b",{"w":"serializelpstringbytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}]]}],["p",{"w":"serializep","s":"p","e":false,"k":"p","d":[],"c":[["a",{"w":"serializepayload","s":"ayload","e":true,"k":"a","d":[229],"c":[["b",{"w":"serializepayloadbytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}],["u",{"w":"serializepublickey","s":"ublickey","e":true,"k":"u","d":[229],"c":[["b",{"w":"serializepublickeybytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}],["o",{"w":"serializepostcondition","s":"ostcondition","e":true,"k":"o","d":[229],"c":[["b",{"w":"serializepostconditionbytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}]]}],["m",{"w":"serializeme","s":"me","e":false,"k":"m","d":[],"c":[["m",{"w":"serializememostring","s":"mostring","e":true,"k":"m","d":[229],"c":[["b",{"w":"serializememostringbytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}],["s",{"w":"serializemessagesignature","s":"ssagesignature","e":true,"k":"s","d":[229],"c":[["b",{"w":"serializemessagesignaturebytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}]]}],["t",{"w":"serializetransactionauthfield","s":"transactionauthfield","e":true,"k":"t","d":[229],"c":[["b",{"w":"serializetransactionauthfieldbytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}]]}]]}]]}]]}],["e",{"w":"see","s":"e","e":true,"k":"e","d":[14,22,24,26,27,28,46,47,48,49,50,52,53,68,69,72,73,219,221,224,226,230,232,234,237,259,352,353,354,355,356,366,368,375,377,510,515],"c":[["d",{"w":"seed","s":"d","e":true,"k":"d","d":[29,127,232,239,240],"c":[["s",{"w":"seeds","s":"s","e":true,"k":"s","d":[127],"c":[]}],["p",{"w":"seedphrase","s":"phrase","e":true,"k":"p","d":[239],"c":[]}],["-",{"w":"seed-","s":"-","e":false,"k":"-","d":[],"c":[["0",{"w":"seed-0","s":"0","e":true,"k":"0","d":[374],"c":[]}],["1",{"w":"seed-1","s":"1","e":true,"k":"1","d":[374],"c":[]}],["2",{"w":"seed-2","s":"2","e":true,"k":"2","d":[374],"c":[]}]]}]]}],["m",{"w":"seems","s":"ms","e":true,"k":"m","d":[49],"c":[]}],["n",{"w":"seen","s":"n","e":true,"k":"n","d":[377],"c":[]}]]}],["v",{"w":"several","s":"veral","e":true,"k":"v","d":[14,50,68,76,80,161,201,230,235,346,369,374,376,509],"c":[]}],["m",{"w":"sem","s":"m","e":false,"k":"m","d":[],"c":[["a",{"w":"semantics","s":"antics","e":true,"k":"a","d":[21],"c":[]}],["i",{"w":"semi-","s":"i-","e":false,"k":"i","d":[],"c":[["f",{"w":"semi-fungible","s":"fungible","e":true,"k":"f","d":[54,231],"c":[["-",{"w":"semi-fungible-token","s":"-token","e":true,"k":"-","d":[231],"c":[["-",{"w":"semi-fungible-token-","s":"-","e":false,"k":"-","d":[],"c":[["m",{"w":"semi-fungible-token-metadata","s":"metadata","e":true,"k":"m","d":[54],"c":[]}],["i",{"w":"semi-fungible-token-id","s":"id","e":true,"k":"i","d":[231],"c":[]}]]}]]}]]}],["b",{"w":"semi-backwards","s":"backwards","e":true,"k":"b","d":[355],"c":[]}],["s",{"w":"semi-standardized","s":"standardized","e":true,"k":"s","d":[371],"c":[]}]]}]]}],["s",{"w":"session","s":"ssion","e":true,"k":"s","d":[23,50,352,357],"c":[["s",{"w":"sessions","s":"s","e":true,"k":"s","d":[50,352,357],"c":[]}],["o",{"w":"sessionoptions","s":"options","e":true,"k":"o","d":[355],"c":[]}],["d",{"w":"sessiondata","s":"data","e":true,"k":"d","d":[355],"c":[["s",{"w":"sessiondatastore","s":"store","e":true,"k":"s","d":[355],"c":[]}]]}]]}],["a",{"w":"sea","s":"a","e":false,"k":"a","d":[],"c":[["m",{"w":"seamless","s":"mless","e":true,"k":"m","d":[50],"c":[["l",{"w":"seamlessly","s":"ly","e":true,"k":"l","d":[50,352],"c":[]}]]}],["r",{"w":"search","s":"rch","e":true,"k":"r","d":[50,52,71,183,293],"c":[["i",{"w":"searching","s":"ing","e":true,"k":"i","d":[183],"c":[]}]]}],["t",{"w":"seat","s":"t","e":true,"k":"t","d":[73],"c":[]}]]}],["q",{"w":"sequen","s":"quen","e":false,"k":"q","d":[],"c":[["c",{"w":"sequence","s":"ce","e":true,"k":"c","d":[96,109,110,126,149,163,177,182,194],"c":[["s",{"w":"sequences","s":"s","e":true,"k":"s","d":[82,96,109,110,126,182,194],"c":[]}],["_",{"w":"sequence_a","s":"_a","e":true,"k":"_","d":[109,110,126,182,194],"c":[]}],["1",{"w":"sequence1","s":"1","e":true,"k":"1","d":[182],"c":[]}],["2",{"w":"sequence2","s":"2","e":true,"k":"2","d":[182],"c":[]}]]}],["t",{"w":"sequential","s":"tial","e":true,"k":"t","d":[171],"c":[["l",{"w":"sequentially","s":"ly","e":true,"k":"l","d":[163,171],"c":[]}]]}]]}],["g",{"w":"seg","s":"g","e":false,"k":"g","d":[],"c":[["r",{"w":"segregated","s":"regated","e":true,"k":"r","d":[371],"c":[]}],["w",{"w":"segwit","s":"wit","e":true,"k":"w","d":[371],"c":[]}]]}]]}],["t",{"w":"st","s":"t","e":true,"k":"t","d":[240],"c":[["a",{"w":"sta","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"stack","s":"ck","e":true,"k":"c","d":[164,194,201,219,223,516],"c":[["s",{"w":"stacks","s":"s","e":true,"k":"s","d":[2,5,6,7,8,9,11,12,13,14,15,17,18,19,22,26,27,28,30,31,44,45,46,47,49,50,51,52,53,54,55,58,64,65,67,68,69,70,71,72,73,74,75,78,86,95,104,119,122,123,127,156,160,178,202,203,204,208,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,256,257,258,259,345,347,348,349,350,351,352,353,354,355,356,357,359,360,361,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,381,382,383,384,385,386,387,399,425,443,459,501,502,505,509,510,511,513,514,515,516,517],"c":[["i",{"w":"stacksicon","s":"icon","e":true,"k":"i","d":[11,256,381,501,505],"c":[]}],["-",{"w":"stacks-","s":"-","e":false,"k":"-","d":[],"c":[["b",{"w":"stacks-block","s":"block","e":false,"k":"b","d":[],"c":[["c",{"w":"stacks-blockchain","s":"chain","e":true,"k":"c","d":[13,14,15,17,259,374],"c":[["-",{"w":"stacks-blockchain-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"stacks-blockchain-api","s":"api","e":true,"k":"a","d":[14,31,36,259,260,261,262,264,265,266,267,268,269,270,271,272,274,275,276,277,278,279,281,283,284,285,286,287,289,290,291,292,293,295,296,297,298,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,319,320,321,322,323,324,325,326,327,328,329,330,332,333,335,336,338,340,342,343,344,374,376],"c":[["-",{"w":"stacks-blockchain-api-pg","s":"-pg","e":true,"k":"-","d":[14],"c":[["-",{"w":"stacks-blockchain-api-pg-","s":"-","e":true,"k":"-","d":[14],"c":[]}]]}]]}],["d",{"w":"stacks-blockchain-docker","s":"docker","e":true,"k":"d","d":[509],"c":[]}]]}]]}],["-",{"w":"stacks-block-height","s":"-height","e":true,"k":"-","d":[221],"c":[]}]]}],["a",{"w":"stacks-api","s":"api","e":true,"k":"a","d":[13],"c":[["-",{"w":"stacks-api-architecture","s":"-architecture","e":true,"k":"-","d":[259],"c":[]}]]}],["n",{"w":"stacks-n","s":"n","e":false,"k":"n","d":[],"c":[["o",{"w":"stacks-node","s":"ode","e":true,"k":"o","d":[17,27,259],"c":[["-",{"w":"stacks-node-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"stacks-node-configuration","s":"configuration","e":true,"k":"c","d":[17],"c":[]}],["r",{"w":"stacks-node-rpc-api","s":"rpc-api","e":true,"k":"r","d":[389,391,392,393,395,396,398,401,402,405,407,408,409,410,411,413,414,415,416,418],"c":[]}]]}],["s",{"w":"stacks-nodes","s":"s","e":true,"k":"s","d":[259],"c":[]}]]}],["e",{"w":"stacks-network","s":"etwork","e":true,"k":"e","d":[17],"c":[]}]]}],["h",{"w":"stacks-hero","s":"hero","e":true,"k":"h","d":[44],"c":[]}],["p",{"w":"stacks-predicates","s":"predicates","e":true,"k":"p","d":[52,373,378],"c":[]}],["e",{"w":"stacks-explorer","s":"explorer","e":true,"k":"e","d":[74],"c":[]}],["j",{"w":"stacks-js","s":"js","e":true,"k":"j","d":[219,228,229,350],"c":[]}],["t",{"w":"stacks-transactions-js","s":"transactions-js","e":true,"k":"t","d":[226],"c":[]}],["c",{"w":"stacks-connect-example","s":"connect-example","e":true,"k":"c","d":[230,352,374],"c":[]}],["r",{"w":"stacks-re","s":"re","e":false,"k":"r","d":[],"c":[["a",{"w":"stacks-ready","s":"ady","e":true,"k":"a","d":[244],"c":[]}],["l",{"w":"stacks-related","s":"lated","e":true,"k":"l","d":[378],"c":[]}]]}]]}],["_",{"w":"stacks_","s":"_","e":false,"k":"_","d":[],"c":[["b",{"w":"stacks_block","s":"block","e":false,"k":"b","d":[],"c":[["c",{"w":"stacks_blockchain_api","s":"chain_api","e":true,"k":"c","d":[14],"c":[]}],["_",{"w":"stacks_block_hash","s":"_hash","e":true,"k":"_","d":[377],"c":[]}]]}],["p",{"w":"stacks_protocol","s":"protocol","e":true,"k":"p","d":[371],"c":[["s",{"w":"stacks_protocols","s":"s","e":true,"k":"s","d":[52],"c":[]}]]}],["t",{"w":"stacks_testnet","s":"testnet","e":true,"k":"t","d":[229,235,243,369],"c":[]}],["m",{"w":"stacks_mainnet","s":"mainnet","e":true,"k":"m","d":[235,369],"c":[]}],["d",{"w":"stacks_devnet","s":"devnet","e":true,"k":"d","d":[235,369],"c":[]}],["n",{"w":"stacks_node_rpc_url","s":"node_rpc_url","e":true,"k":"n","d":[374,376],"c":[]}],["e",{"w":"stacks_events_ingestion_port","s":"events_ingestion_port","e":true,"k":"e","d":[374],"c":[]}]]}],["g",{"w":"stacksgov","s":"gov","e":true,"k":"g","d":[27,28,226,234,346,368],"c":[]}],["m",{"w":"stacksm","s":"m","e":false,"k":"m","d":[],"c":[["o",{"w":"stacksmocknet","s":"ocknet","e":true,"k":"o","d":[71,227],"c":[]}],["a",{"w":"stacksmainnet","s":"ainnet","e":true,"k":"a","d":[226,227,236,370],"c":[]}],["e",{"w":"stacksmessage","s":"essage","e":true,"k":"e","d":[229],"c":[["t",{"w":"stacksmessagetype","s":"type","e":true,"k":"t","d":[229],"c":[]}]]}]]}],["b",{"w":"stacksblockinfopropertyname","s":"blockinfopropertyname","e":true,"k":"b","d":[104],"c":[]}],["t",{"w":"stackst","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"stackstestnet","s":"estnet","e":true,"k":"e","d":[223,226,227,229,234,236,368,370],"c":[]}],["r",{"w":"stackstransaction","s":"ransaction","e":true,"k":"r","d":[229,243],"c":[]}]]}],["n",{"w":"stacksnetwork","s":"network","e":true,"k":"n","d":[226,227,236,370],"c":[]}],["w",{"w":"stackswire","s":"wire","e":true,"k":"w","d":[229],"c":[["t",{"w":"stackswiretype","s":"type","e":true,"k":"t","d":[229],"c":[]}]]}],["p",{"w":"stacksp","s":"p","e":false,"k":"p","d":[],"c":[["u",{"w":"stackspublickey","s":"ublickey","e":true,"k":"u","d":[229],"c":[]}],["r",{"w":"stacksprovider","s":"rovider","e":true,"k":"r","d":[356,366],"c":[]}]]}],["a",{"w":"stacksaddress","s":"address","e":true,"k":"a","d":[233,367],"c":[]}],["j",{"w":"stacksjs-5xx--7xx","s":"js-5xx--7xx","e":true,"k":"j","d":[234,235,236,368,369,370],"c":[]}]]}],["i",{"w":"stackin","s":"in","e":false,"k":"i","d":[],"c":[["g",{"w":"stacking","s":"g","e":true,"k":"g","d":[11,27,77,95,219,221,223,244,256,376,381,399,501,505,516],"c":[["r",{"w":"stackingrewards","s":"rewards","e":true,"k":"r","d":[77],"c":[]}],["c",{"w":"stackingclient","s":"client","e":true,"k":"c","d":[219,223],"c":[]}],["-",{"w":"stacking-pool","s":"-pool","e":true,"k":"-","d":[376],"c":[["-",{"w":"stacking-pool-api","s":"-api","e":true,"k":"-","d":[376],"c":[]}]]}]]}],["c",{"w":"stackincrease","s":"crease","e":true,"k":"c","d":[219,223],"c":[]}]]}],["e",{"w":"stacke","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"stacker","s":"r","e":true,"k":"r","d":[77],"c":[["s",{"w":"stackers","s":"s","e":true,"k":"s","d":[219,221,222],"c":[["'",{"w":"stackers'","s":"'","e":true,"k":"'","d":[292],"c":[]}]]}],["_",{"w":"stacker_set","s":"_set","e":true,"k":"_","d":[391],"c":[]}]]}],["d",{"w":"stacked","s":"d","e":true,"k":"d","d":[77,219,221,222,516],"c":[]}],["x",{"w":"stackextend","s":"xtend","e":true,"k":"x","d":[219,223],"c":[]}]]}],["a",{"w":"stacka","s":"a","e":false,"k":"a","d":[],"c":[["r",{"w":"stackaroo","s":"roo","e":true,"k":"r","d":[101,135,186,195],"c":[]}],["g",{"w":"stackaggregation","s":"ggregation","e":false,"k":"g","d":[],"c":[["c",{"w":"stackaggregationcommit","s":"commit","e":true,"k":"c","d":[219,223],"c":[["i",{"w":"stackaggregationcommitindexed","s":"indexed","e":true,"k":"i","d":[219,223],"c":[]}]]}],["i",{"w":"stackaggregationincrease","s":"increase","e":true,"k":"i","d":[223],"c":[]}]]}]]}],["-",{"w":"stack-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"stack-stx","s":"stx","e":true,"k":"s","d":[221,223,372],"c":[]}],["e",{"w":"stack-extend","s":"extend","e":true,"k":"e","d":[221],"c":[]}]]}]]}],["n",{"w":"standa","s":"nda","e":false,"k":"n","d":[],"c":[["r",{"w":"standar","s":"r","e":false,"k":"r","d":[],"c":[["d",{"w":"standard","s":"d","e":true,"k":"d","d":[6,28,69,86,144,147,200,226,234,259,355,356,360,366,368,511,513],"c":[["p",{"w":"standardprincipal","s":"principal","e":true,"k":"p","d":[6,7,229,360,361],"c":[["c",{"w":"standardprincipalcv","s":"cv","e":true,"k":"c","d":[69,71,226,234,353,368],"c":[]}],["w",{"w":"standardprincipalwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}],["s",{"w":"standards","s":"s","e":true,"k":"s","d":[54,119,152,355],"c":[["t",{"w":"standardstxpostcondition","s":"txpostcondition","e":true,"k":"t","d":[226,234,368],"c":[]}]]}],["i",{"w":"standardized","s":"ized","e":true,"k":"i","d":[86,119,142,164],"c":[]}],["f",{"w":"standardfungiblepostcondition","s":"fungiblepostcondition","e":true,"k":"f","d":[226,234,368],"c":[]}],["n",{"w":"standardnonfungiblepostcondition","s":"nonfungiblepostcondition","e":true,"k":"n","d":[226,234,368],"c":[]}]]}],["i",{"w":"standarized","s":"ized","e":true,"k":"i","d":[377],"c":[]}]]}],["l",{"w":"standalone","s":"lone","e":true,"k":"l","d":[58,259],"c":[]}]]}],["r",{"w":"star","s":"r","e":true,"k":"r","d":[44,241],"c":[["t",{"w":"start","s":"t","e":true,"k":"t","d":[9,12,22,24,27,30,31,47,50,51,52,53,68,69,71,176,191,194,219,221,224,229,230,231,232,239,245,348,353,372,374,375,376,377,379,459,504,509,510,515,517],"c":[["-",{"w":"start-","s":"-","e":false,"k":"-","d":[],"c":[["b",{"w":"start-block","s":"block","e":true,"k":"b","d":[12,245,348,379],"c":[]}],["m",{"w":"start-monitoring","s":"monitoring","e":true,"k":"m","d":[51],"c":[]}],["v",{"w":"start-vesting","s":"vesting","e":true,"k":"v","d":[102,176],"c":[]}],["e",{"w":"start-escrow","s":"escrow","e":true,"k":"e","d":[140],"c":[]}],["u",{"w":"start-unlock-schedule","s":"unlock-schedule","e":true,"k":"u","d":[191],"c":[]}],["t",{"w":"start-the-service","s":"the-service","e":true,"k":"t","d":[509],"c":[]}]]}],["e",{"w":"starte","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"started","s":"d","e":true,"k":"d","d":[12,44,45,47,52,53,65,245,348,373,439,462,466,502,515],"c":[]}],["r",{"w":"starter","s":"r","e":true,"k":"r","d":[53,68,69,71],"c":[["-",{"w":"starter-kits","s":"-kits","e":true,"k":"-","d":[44],"c":[]}]]}]]}],["i",{"w":"starting","s":"ing","e":true,"k":"i","d":[14,47,50,68,96,232,255,371,423],"c":[]}],["s",{"w":"starts","s":"s","e":true,"k":"s","d":[23,69,219,240,374,375,515],"c":[["_",{"w":"starts_with","s":"_with","e":true,"k":"_","d":[371],"c":[]}]]}],["_",{"w":"start_","s":"_","e":false,"k":"_","d":[],"c":[["b",{"w":"start_block","s":"block","e":true,"k":"b","d":[68,374,376,377,378,379],"c":[]}],["a",{"w":"start_at_cycle","s":"at_cycle","e":true,"k":"a","d":[221],"c":[]}]]}],["t",{"w":"starttime","s":"time","e":true,"k":"t","d":[102],"c":[]}],["b",{"w":"startblock","s":"block","e":true,"k":"b","d":[191],"c":[]}]]}]]}],["t",{"w":"stat","s":"t","e":false,"k":"t","d":[],"c":[["u",{"w":"status","s":"us","e":true,"k":"u","d":[14,48,49,50,51,52,58,65,67,68,69,90,219,222,226,227,230,233,351,355,356,366,367,374,376,377,439,462,514,516],"c":[["'",{"w":"status'","s":"'","e":true,"k":"'","d":[43,333],"c":[]}],["-",{"w":"status-info","s":"-info","e":true,"k":"-","d":[52],"c":[]}],["m",{"w":"statusmessage","s":"message","e":true,"k":"m","d":[233,367],"c":[]}]]}],["e",{"w":"state","s":"e","e":true,"k":"e","d":[22,52,69,79,89,95,96,99,100,104,127,129,132,134,137,140,156,161,164,193,196,202,232,241,244,352,355,356,357,366,377,516],"c":[["m",{"w":"statement","s":"ment","e":true,"k":"m","d":[27,92,97,100,119,122,129,134,160,377],"c":[["s",{"w":"statements","s":"s","e":true,"k":"s","d":[155,165,196,199,201],"c":[]}]]}],["s",{"w":"states","s":"s","e":true,"k":"s","d":[93,103,121,156,193,202],"c":[]}]]}],["i",{"w":"stati","s":"i","e":false,"k":"i","d":[],"c":[["c",{"w":"static","s":"c","e":true,"k":"c","d":[182,229],"c":[]}],["s",{"w":"statistics","s":"stics","e":true,"k":"s","d":[219,222],"c":[]}]]}],["s",{"w":"stats","s":"s","e":true,"k":"s","d":[446,483],"c":[["'",{"w":"stats'","s":"'","e":true,"k":"'","d":[306],"c":[]}]]}]]}],["y",{"w":"stay","s":"y","e":true,"k":"y","d":[73,219,220],"c":[]}],["b",{"w":"stab","s":"b","e":false,"k":"b","d":[],"c":[["l",{"w":"stable","s":"le","e":true,"k":"l","d":[202],"c":[]}],["i",{"w":"stabilize","s":"ilize","e":true,"k":"i","d":[355],"c":[]}]]}],["m",{"w":"stamp","s":"mp","e":true,"k":"m","d":[377],"c":[]}],["k",{"w":"staking","s":"king","e":true,"k":"k","d":[516],"c":[]}]]}],["r",{"w":"str","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"stri","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"string","s":"ng","e":true,"k":"n","d":[4,6,7,51,67,72,87,88,96,110,120,138,157,177,179,182,194,226,227,229,231,233,234,235,241,351,353,355,356,358,360,361,362,366,367,368,369,371,372,514],"c":[["-",{"w":"string-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"string-ascii","s":"ascii","e":true,"k":"a","d":[6,7,69,81,83,85,88,97,101,103,114,116,118,126,135,138,139,141,142,144,146,149,151,153,154,157,170,173,176,180,182,186,189,191,194,195,197,200,360,361,516],"c":[]}],["u",{"w":"string-utf8","s":"utf8","e":true,"k":"u","d":[6,69,114,118,119,120,122,126,138,153,154,157,176,191,197,360],"c":[]}],["t",{"w":"string-to-","s":"to-","e":false,"k":"t","d":[],"c":[["i",{"w":"string-to-int","s":"int","e":true,"k":"i","d":[138,157],"c":[["e",{"w":"string-to-integer","s":"eger","e":true,"k":"e","d":[138],"c":[]}]]}],["u",{"w":"string-to-u","s":"u","e":false,"k":"u","d":[],"c":[["i",{"w":"string-to-uint","s":"int","e":true,"k":"i","d":[138,157],"c":[]}],["n",{"w":"string-to-unsigned-integer","s":"nsigned-integer","e":true,"k":"n","d":[157],"c":[]}]]}]]}],["m",{"w":"string-meme","s":"meme","e":true,"k":"m","d":[229],"c":[]}]]}],["s",{"w":"strings","s":"s","e":true,"k":"s","d":[27,88,110,114,120,154,176,182,191,226,227,229,239,372],"c":[]}],["'",{"w":"string'","s":"'","e":true,"k":"'","d":[234,368],"c":[]}],["a",{"w":"stringascii","s":"ascii","e":true,"k":"a","d":[246,353,354,356,366],"c":[]}]]}],["c",{"w":"strict","s":"ct","e":true,"k":"c","d":[176,191],"c":[["-",{"w":"strict-origin-when-cross-origin","s":"-origin-when-cross-origin","e":true,"k":"-","d":[70,72],"c":[]}]]}]]}],["u",{"w":"struc","s":"uc","e":false,"k":"u","d":[],"c":[["t",{"w":"structure","s":"ture","e":true,"k":"t","d":[20,29,47,65,68,83,96,129,144,224,229,233,367,439,462,511,513],"c":[["d",{"w":"structured","s":"d","e":true,"k":"d","d":[9,69,79,97,116,354,356,366],"c":[]}],["s",{"w":"structures","s":"s","e":true,"k":"s","d":[76,79,83,96,97,100,116,130,134,144,145,149,174,182,188,189,511,513],"c":[]}]]}],["u",{"w":"strucure","s":"ure","e":true,"k":"u","d":[379],"c":[]}]]}],["e",{"w":"stre","s":"e","e":false,"k":"e","d":[],"c":[["a",{"w":"stream","s":"am","e":true,"k":"a","d":[11,70,232,256,376,381,420,423,501,505],"c":[["l",{"w":"streamline","s":"line","e":true,"k":"l","d":[18],"c":[["d",{"w":"streamlined","s":"d","e":true,"k":"d","d":[516],"c":[]}]]}],["s",{"w":"streams","s":"s","e":true,"k":"s","d":[31,44,45,53,373,422],"c":[]}],["i",{"w":"streaming","s":"ing","e":true,"k":"i","d":[44,64,365,382,383,384,385,386,387],"c":[]}]]}],["t",{"w":"stretch","s":"tch","e":true,"k":"t","d":[69,71,73],"c":[]}]]}],["a",{"w":"stra","s":"a","e":false,"k":"a","d":[],"c":[["i",{"w":"straight","s":"ight","e":true,"k":"i","d":[68],"c":[["f",{"w":"straightforward","s":"forward","e":true,"k":"f","d":[49,116,123,125,173,182,183,190],"c":[]}]]}],["t",{"w":"strategy","s":"tegy","e":true,"k":"t","d":[79],"c":[]}]]}],["o",{"w":"strong","s":"ong","e":true,"k":"o","d":[188,258],"c":[]}]]}],["1",{"w":"st1","s":"1","e":false,"k":"1","d":[],"c":[["p",{"w":"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm","s":"pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm","e":true,"k":"p","d":[5,7,9,12,25,27,69,71,224,231,245,348,359,361,372],"c":[]}],["s",{"w":"st1s","s":"s","e":false,"k":"s","d":[],"c":[["j",{"w":"st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5","s":"j3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5","e":true,"k":"j","d":[5,7,242,243,359,361],"c":[]}],["v",{"w":"st1sva0sst0edt4mfygwgp6gnsxmmqjdvp1g8qttc","s":"va0sst0edt4mfygwgp6gnsxmmqjdvp1g8qttc","e":true,"k":"v","d":[374],"c":[]}]]}],["f",{"w":"st1f7qa2mdf17s807epa36tss8amefy4ka9tvgwxt","s":"f7qa2mdf17s807epa36tss8amefy4ka9tvgwxt","e":true,"k":"f","d":[28],"c":[]}],["x",{"w":"st1x","s":"x","e":true,"k":"x","d":[353],"c":[]}]]}],["3",{"w":"st3","s":"3","e":false,"k":"3","d":[],"c":[["p",{"w":"st3pf13w7z0rrm42a8vzrvfq75sv1k26rxep8ygkj","s":"pf13w7z0rrm42a8vzrvfq75sv1k26rxep8ygkj","e":true,"k":"p","d":[7,361],"c":[]}],["n",{"w":"st3nbrsfkx28fq2zj1makx58hkhsdgnv5n7r21xcp","s":"nbrsfkx28fq2zj1makx58hkhsdgnv5n7r21xcp","e":true,"k":"n","d":[7,241,361],"c":[]}],["a",{"w":"st3am1a56ak2c1xafj4115zsv26eb49bvq10mgcs0","s":"am1a56ak2c1xafj4115zsv26eb49bvq10mgcs0","e":true,"k":"a","d":[7,361],"c":[]}],["9",{"w":"st39f7sa0akh7rb363w3ne2dthd3p32zhnx2ke7j9","s":"9f7sa0akh7rb363w3ne2dthd3p32zhnx2ke7j9","e":true,"k":"9","d":[255],"c":[]}]]}],["2",{"w":"st2","s":"2","e":false,"k":"2","d":[],"c":[["j",{"w":"st2jhg361zxg51qtky2nqcvbpprre2kzb1hr05nnc","s":"jhg361zxg51qtky2nqcvbpprre2kzb1hr05nnc","e":true,"k":"j","d":[7,361],"c":[]}],["r",{"w":"st2rehhs5j3cercrbepmgh7921q6pykaadt7jp2vb","s":"rehhs5j3cercrbepmgh7921q6pykaadt7jp2vb","e":true,"k":"r","d":[7,361],"c":[]}],["n",{"w":"st2neb84asendxkygjpqw86yxqcefex2zqpg87nd","s":"neb84asendxkygjpqw86yxqcefex2zqpg87nd","e":true,"k":"n","d":[7,361],"c":[]}],["c",{"w":"st2cy5v39nhdpwsxmw9qdt3hc3gd6q6xx4cfrk9ag","s":"cy5v39nhdpwsxmw9qdt3hc3gd6q6xx4cfrk9ag","e":true,"k":"c","d":[7,361],"c":[]}],["b",{"w":"st2bsv94a650wgz2yz5y8hm93w01ngt4gy0mgjecg","s":"bsv94a650wgz2yz5y8hm93w01ngt4gy0mgjecg","e":true,"k":"b","d":[68],"c":[]}],["f",{"w":"st2f4bk4gzh6yfbnhyddgn4t1rkba7da1bjzpjejj","s":"f4bk4gzh6yfbnhyddgn4t1rkba7da1bjzpjejj","e":true,"k":"f","d":[240],"c":[]}]]}],["n",{"w":"stnhkepyepj8et55zz0m5a34j0r3n5fm2cmmmaz6","s":"nhkepyepj8et55zz0m5a34j0r3n5fm2cmmmaz6","e":true,"k":"n","d":[7,361],"c":[]}],["x",{"w":"stx","s":"x","e":true,"k":"x","d":[7,12,19,27,49,51,68,98,114,143,150,154,166,184,192,198,201,219,220,221,222,224,226,229,230,231,234,237,238,241,243,245,259,348,352,353,356,357,361,366,368,372,378,511,513,517],"c":[["b",{"w":"stxbalances","s":"balances","e":true,"k":"b","d":[7,361],"c":[]}],["_",{"w":"stx_","s":"_","e":false,"k":"_","d":[],"c":[["t",{"w":"stx_transfer","s":"transfer","e":true,"k":"t","d":[372],"c":[["_",{"w":"stx_transfer_","s":"_","e":false,"k":"_","d":[],"c":[["e",{"w":"stx_transfer_event","s":"event","e":true,"k":"e","d":[7,361],"c":[]}],["p",{"w":"stx_transfer_predicate","s":"predicate","e":true,"k":"p","d":[379],"c":[]}]]}],["s",{"w":"stx_transfers","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"stx_transferstx","s":"tx","e":true,"k":"t","d":[351,353,356,357,366],"c":[]}],["i",{"w":"stx_transfersip","s":"ip","e":false,"k":"i","d":[],"c":[["1",{"w":"stx_transfersip10ft","s":"10ft","e":true,"k":"1","d":[351],"c":[]}],["9",{"w":"stx_transfersip9nft","s":"9nft","e":true,"k":"9","d":[351],"c":[]}]]}]]}],["r",{"w":"stx_transferred","s":"red","e":true,"k":"r","d":[371],"c":[]}]]}],["e",{"w":"stx_event","s":"event","e":true,"k":"e","d":[52,378],"c":[]}],["a",{"w":"stx_a","s":"a","e":false,"k":"a","d":[],"c":[["d",{"w":"stx_address","s":"ddress","e":true,"k":"d","d":[233,367],"c":[]}],["c",{"w":"stx_accountchange","s":"ccountchange","e":true,"k":"c","d":[351],"c":[]}]]}],["s",{"w":"stx_s","s":"s","e":false,"k":"s","d":[],"c":[["u",{"w":"stx_supply","s":"upply","e":true,"k":"u","d":[295,297,300,302],"c":[]}],["i",{"w":"stx_sign","s":"ign","e":false,"k":"i","d":[],"c":[["t",{"w":"stx_signtransaction","s":"transaction","e":true,"k":"t","d":[351],"c":[]}],["m",{"w":"stx_signmessage","s":"message","e":true,"k":"m","d":[351,354,356,366],"c":[]}],["s",{"w":"stx_signstructuredmessage","s":"structuredmessage","e":true,"k":"s","d":[351,354,356,366],"c":[]}]]}]]}],["i",{"w":"stx_inbound'","s":"inbound'","e":true,"k":"i","d":[328],"c":[]}],["g",{"w":"stx_get","s":"get","e":false,"k":"g","d":[],"c":[["a",{"w":"stx_geta","s":"a","e":false,"k":"a","d":[],"c":[["d",{"w":"stx_getaddresses","s":"ddresses","e":true,"k":"d","d":[351,356,366],"c":[]}],["c",{"w":"stx_getaccounts","s":"ccounts","e":true,"k":"c","d":[351,356,366],"c":[]}]]}],["n",{"w":"stx_getnetworks","s":"networks","e":true,"k":"n","d":[351],"c":[]}]]}],["c",{"w":"stx_callcontract","s":"callcontract","e":true,"k":"c","d":[351,355,356,366],"c":[]}],["d",{"w":"stx_deploycontract","s":"deploycontract","e":true,"k":"d","d":[351,353,355,356,366],"c":[]}],["u",{"w":"stx_updateprofile","s":"updateprofile","e":true,"k":"u","d":[351],"c":[]}],["n",{"w":"stx_networkchange","s":"networkchange","e":true,"k":"n","d":[351],"c":[]}],["l",{"w":"stx_locked","s":"locked","e":true,"k":"l","d":[371],"c":[]}]]}],["-",{"w":"stx-","s":"-","e":false,"k":"-","d":[],"c":[["b",{"w":"stx-b","s":"b","e":false,"k":"b","d":[],"c":[["a",{"w":"stx-balance","s":"alance","e":true,"k":"a","d":[7,361],"c":[]}],["u",{"w":"stx-burn","s":"urn","e":true,"k":"u","d":[98,143,150,184,198],"c":[]}]]}],["a",{"w":"stx-account","s":"account","e":true,"k":"a","d":[7,98,143,198,361],"c":[]}],["t",{"w":"stx-transfer","s":"transfer","e":true,"k":"t","d":[7,12,25,27,71,98,114,140,143,150,154,166,184,192,198,201,224,230,243,245,348,361,378,511,513],"c":[["-",{"w":"stx-transfer-memo","s":"-memo","e":true,"k":"-","d":[150,184],"c":[]}],["s",{"w":"stx-transfers","s":"s","e":true,"k":"s","d":[378],"c":[]}]]}],["d",{"w":"stx-defi","s":"defi","e":true,"k":"d","d":[12,224,245,348],"c":[]}],["l",{"w":"stx-locked","s":"locked","e":true,"k":"l","d":[98],"c":[]}],["g",{"w":"stx-get-balance","s":"get-balance","e":true,"k":"g","d":[98,143,150,184,198],"c":[]}]]}],["'",{"w":"stx'","s":"'","e":true,"k":"'","d":[224,319,327],"c":[]}],["p",{"w":"stxp","s":"p","e":false,"k":"p","d":[],"c":[["o",{"w":"stxpostcondition","s":"ostcondition","e":true,"k":"o","d":[229,238],"c":[["w",{"w":"stxpostconditionwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}],["r",{"w":"stxprivatekey","s":"rivatekey","e":true,"k":"r","d":[232,239,240],"c":[]}]]}],["a",{"w":"stxa","s":"a","e":false,"k":"a","d":[],"c":[["p",{"w":"stxapiurl","s":"piurl","e":true,"k":"p","d":[233,367],"c":[]}],["d",{"w":"stxaddress","s":"ddress","e":true,"k":"d","d":[240],"c":[]}]]}]]}],["e",{"w":"step","s":"ep","e":true,"k":"e","d":[9,12,26,30,68,69,229,230,233,243,245,348,355,357,367,377,378,422,423,502,504,516],"c":[["s",{"w":"steps","s":"s","e":true,"k":"s","d":[9,11,12,18,26,27,30,46,47,48,53,69,224,230,231,232,243,245,246,256,348,352,353,354,355,357,374,375,376,377,378,379,381,422,423,501,502,504,505,509,510,511,513,515,516],"c":[["'",{"w":"steps'","s":"'","e":true,"k":"'","d":[9,30,243,355,357,378,422,423,502,504],"c":[]}]]}],["-",{"w":"step-","s":"-","e":false,"k":"-","d":[],"c":[["i",{"w":"step-in","s":"in","e":true,"k":"i","d":[26],"c":[]}],["o",{"w":"step-o","s":"o","e":false,"k":"o","d":[],"c":[["u",{"w":"step-out","s":"ut","e":true,"k":"u","d":[26],"c":[]}],["v",{"w":"step-over","s":"ver","e":true,"k":"v","d":[26],"c":[]}]]}]]}],["p",{"w":"stepping","s":"ping","e":true,"k":"p","d":[26],"c":[]}]]}],["o",{"w":"sto","s":"o","e":false,"k":"o","d":[],"c":[["r",{"w":"stor","s":"r","e":false,"k":"r","d":[],"c":[["e",{"w":"store","s":"e","e":true,"k":"e","d":[9,30,69,79,80,81,82,83,88,97,100,113,120,202,244,356,366,377,511,513,515,516,517],"c":[["s",{"w":"stores","s":"s","e":true,"k":"s","d":[55,71,76,79,83,90,97,100,259,352,356,357,366],"c":[]}],["d",{"w":"stored","s":"d","e":true,"k":"d","d":[68,79,89,116,131,132,144,161,172,175,180,224,229,352,356,366,375,516],"c":[["v",{"w":"storedvalue","s":"value","e":true,"k":"v","d":[99],"c":[]}]]}]]}],["a",{"w":"storage","s":"age","e":true,"k":"a","d":[18,67,76,79,82,88,97,113,120,128,130,144,187,226,227,244,352,355,356,357,366,374,376,502,515,517],"c":[["-",{"w":"storage-efficient","s":"-efficient","e":true,"k":"-","d":[76],"c":[]}]]}],["m",{"w":"storm","s":"m","e":true,"k":"m","d":[71],"c":[]}],["i",{"w":"storing","s":"ing","e":true,"k":"i","d":[76,79,97,100,371,377,515],"c":[]}]]}],["p",{"w":"stop","s":"p","e":true,"k":"p","d":[50,68,379,515],"c":[]}]]}],["u",{"w":"stuck","s":"uck","e":true,"k":"u","d":[49,258],"c":[]}],["i",{"w":"still","s":"ill","e":true,"k":"i","d":[50,114,134,188,202,229,233,238,355,367,378,517],"c":[]}],["y",{"w":"style","s":"yle","e":true,"k":"y","d":[356,366],"c":[["s",{"w":"styles","s":"s","e":true,"k":"s","d":[517],"c":[]}]]}],["j",{"w":"stj81c2wpqhfb6xtg518jkpabwm639r2x37vfkjv","s":"j81c2wpqhfb6xtg518jkpabwm639r2x37vfkjv","e":true,"k":"j","d":[377,379],"c":[]}],["d",{"w":"stdout","s":"dout","e":true,"k":"d","d":[515],"c":[]}]]}],["d",{"w":"sdk","s":"dk","e":true,"k":"d","d":[2,4,7,8,9,10,11,12,18,22,26,27,30,44,203,204,224,225,228,245,246,347,348,349,358,361,362,373,381,505],"c":[["'",{"w":"sdk'","s":"'","e":true,"k":"'","d":[11,22,26,27,30,381,505],"c":[]}]]}],["p",{"w":"sp","s":"p","e":true,"k":"p","d":[240],"c":[["a",{"w":"spa","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"span","s":"n","e":true,"k":"n","d":[2,7,8,18,27,31,45,54,203,204,208,225,226,227,228,257,345,347,349,350,361,373,377,399,459,502,517],"c":[]}],["c",{"w":"space","s":"ce","e":true,"k":"c","d":[76,188],"c":[["-",{"w":"space-","s":"-","e":false,"k":"-","d":[],"c":[["y",{"w":"space-y-1","s":"y-1","e":false,"k":"y","d":[],"c":[["0",{"w":"space-y-10","s":"0","e":true,"k":"0","d":[44],"c":[["'",{"w":"space-y-10'","s":"'","e":true,"k":"'","d":[11,256,381,420,466,501,505,508],"c":[]}]]}],["'",{"w":"space-y-1'","s":"'","e":true,"k":"'","d":[44,466],"c":[]}]]}],["x",{"w":"space-x-6","s":"x-6","e":true,"k":"x","d":[44,466,508],"c":[]}]]}]]}],["m",{"w":"spam","s":"m","e":true,"k":"m","d":[154],"c":[]}],["x",{"w":"spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf","s":"xya5xs51713fdtq8h94ej4v579cxmtrnbzksf","e":true,"k":"x","d":[189],"c":[]}],["r",{"w":"sparingly","s":"ringly","e":true,"k":"r","d":[192,201],"c":[]}]]}],["e",{"w":"spe","s":"e","e":false,"k":"e","d":[],"c":[["c",{"w":"spec","s":"c","e":false,"k":"c","d":[],"c":[["i",{"w":"speci","s":"i","e":false,"k":"i","d":[],"c":[["f",{"w":"specif","s":"f","e":false,"k":"f","d":[],"c":[["i",{"w":"specifi","s":"i","e":false,"k":"i","d":[],"c":[["c",{"w":"specific","s":"c","e":true,"k":"c","d":[6,7,26,46,47,51,52,65,67,68,69,71,72,76,79,80,81,87,90,95,97,109,113,116,117,119,125,128,130,133,145,152,156,158,160,161,163,164,173,174,177,178,179,180,187,202,208,224,231,352,356,360,361,366,371,372,374,375,376,377,378,379,459],"c":[["a",{"w":"specifica","s":"a","e":false,"k":"a","d":[],"c":[["l",{"w":"specifically","s":"lly","e":true,"k":"l","d":[12,71,185,219,245,348],"c":[]}],["t",{"w":"specification","s":"tion","e":true,"k":"t","d":[259,371,372,377,379],"c":[["s",{"w":"specifications","s":"s","e":true,"k":"s","d":[19,27,379],"c":[]}]]}]]}]]}],["e",{"w":"specifie","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"specifies","s":"s","e":true,"k":"s","d":[27,68,371,372,377,379],"c":[]}],["d",{"w":"specified","s":"d","e":true,"k":"d","d":[27,51,52,67,68,69,79,126,143,144,149,161,178,224,226,227,231,232,233,234,238,243,367,368,371,372,377,379,516],"c":[]}]]}]]}],["y",{"w":"specify","s":"y","e":true,"k":"y","d":[7,9,27,52,68,103,144,160,226,227,231,238,356,361,366,371,372,376,377,378,379,511,513,517],"c":[["i",{"w":"specifying","s":"ing","e":true,"k":"i","d":[7,27,52,119,144,352,361,376,516],"c":[]}]]}]]}],["a",{"w":"special","s":"al","e":true,"k":"a","d":[517],"c":[["i",{"w":"specialized","s":"ized","e":true,"k":"i","d":[233,367],"c":[]}]]}]]}],["s",{"w":"specs","s":"s","e":true,"k":"s","d":[14,15],"c":[]}],["f",{"w":"specfied","s":"fied","e":true,"k":"f","d":[379],"c":[]}]]}],["n",{"w":"spen","s":"n","e":false,"k":"n","d":[],"c":[["d",{"w":"spend","s":"d","e":true,"k":"d","d":[52],"c":[["i",{"w":"spending","s":"ing","e":true,"k":"i","d":[28,70,127,156],"c":[]}],["a",{"w":"spendable","s":"able","e":true,"k":"a","d":[233,367],"c":[]}]]}],["t",{"w":"spent","s":"t","e":true,"k":"t","d":[52,127,156,346],"c":[]}]]}],["e",{"w":"speed","s":"ed","e":true,"k":"e","d":[219,222],"c":[["i",{"w":"speeding","s":"ing","e":true,"k":"i","d":[378],"c":[]}]]}],["a",{"w":"speak","s":"ak","e":true,"k":"a","d":[241],"c":[]}]]}],["i",{"w":"spin","s":"in","e":true,"k":"i","d":[11,13,50,256,381,501,505],"c":[]}],["2",{"w":"sp2","s":"2","e":false,"k":"2","d":[],"c":[["p",{"w":"sp2pabaf9ftajynfzh93xenaj8fvy99rrm50d2jg9","s":"pabaf9ftajynfzh93xenaj8fvy99rrm50d2jg9","e":true,"k":"p","d":[25,27],"c":[]}],["w",{"w":"sp2w9qyahjns7ytqy9ek2mstqgx9e2ndmv766jp9z","s":"w9qyahjns7ytqy9ek2mstqgx9e2ndmv766jp9z","e":true,"k":"w","d":[51],"c":[]}],["z",{"w":"sp2zd731anqzt6j4k3f5n8a40zxwxc1xfxhvvqfke","s":"zd731anqzt6j4k3f5n8a40zxwxc1xfxhvvqfke","e":true,"k":"z","d":[230],"c":[]}],["m",{"w":"sp2mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn","s":"mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn","e":true,"k":"m","d":[352,356,366],"c":[]}],["c",{"w":"sp2c2yfp12ajzb4mabjbaj55xecvs7e4pmmz89yzr","s":"c2yfp12ajzb4mabjbaj55xecvs7e4pmmz89yzr","e":true,"k":"c","d":[374],"c":[]}]]}],["3",{"w":"sp3","s":"3","e":false,"k":"3","d":[],"c":[["f",{"w":"sp3f","s":"f","e":false,"k":"f","d":[],"c":[["b",{"w":"sp3fbr2agk5h9qbdh3een6df8ek8jy7rx8qj5svte","s":"br2agk5h9qbdh3een6df8ek8jy7rx8qj5svte","e":true,"k":"b","d":[27],"c":[]}],["g",{"w":"sp3fgq8z7jy9bwyz5wm53e0m9nk7whjf0691nz159","s":"gq8z7jy9bwyz5wm53e0m9nk7whjf0691nz159","e":true,"k":"g","d":[230,240],"c":[]}]]}],["w",{"w":"sp3w993d3brdyb284cy3sbfdegtc5xedjpdea21cn","s":"w993d3brdyb284cy3sbfdegtc5xedjpdea21cn","e":true,"k":"w","d":[232],"c":[]}]]}],["o",{"w":"spo","s":"o","e":false,"k":"o","d":[],"c":[["n",{"w":"sponsor","s":"nsor","e":true,"k":"n","d":[226,234,368],"c":[["e",{"w":"sponsored","s":"ed","e":true,"k":"e","d":[51,226,234,255,368,517],"c":[["t",{"w":"sponsoredtx","s":"tx","e":true,"k":"t","d":[226,234,368],"c":[]}]]}],["i",{"w":"sponsoring","s":"ing","e":true,"k":"i","d":[226,234,368],"c":[]}],["t",{"w":"sponsortransaction","s":"transaction","e":true,"k":"t","d":[226,234,368],"c":[]}],["k",{"w":"sponsorkey","s":"key","e":true,"k":"k","d":[226,234,368],"c":[]}],["o",{"w":"sponsoroptions","s":"options","e":true,"k":"o","d":[226,234,368],"c":[]}],["p",{"w":"sponsorprivatekey","s":"privatekey","e":true,"k":"p","d":[226,234,368],"c":[]}],["n",{"w":"sponsornonce","s":"nonce","e":true,"k":"n","d":[226,234,368],"c":[]}]]}],["r",{"w":"sport","s":"rt","e":true,"k":"r","d":[239],"c":[]}]]}],["h",{"w":"sphw0ejk5kpdmk03zx792emp0q5j3a39zmtvzzcy","s":"hw0ejk5kpdmk03zx792emp0q5j3a39zmtvzzcy","e":true,"k":"h","d":[51],"c":[]}],["l",{"w":"split","s":"lit","e":true,"k":"l","d":[86],"c":[]}],["c",{"w":"spcv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}],["1",{"w":"sp1mxszf4nfc8jq1ttygec2wadmc7y3ghvzyrx6rf","s":"1mxszf4nfc8jq1ttygec2wadmc7y3ghvzyrx6rf","e":true,"k":"1","d":[229],"c":[]}],["b",{"w":"spbmrfrppgcde3f384wcjpk8pqjgz8k9qkk7f59x","s":"bmrfrppgcde3f384wcjpk8pqjgz8k9qkk7f59x","e":true,"k":"b","d":[230],"c":[]}],["0",{"w":"sp000000000000000000002q6vf78","s":"000000000000000000002q6vf78","e":true,"k":"0","d":[372],"c":[]}],["m",{"w":"spm113ay78vcmjj0sdfj4xjxfhhq6r9kb3710x7d","s":"m113ay78vcmjj0sdfj4xjxfhhq6r9kb3710x7d","e":true,"k":"m","d":[378],"c":[]}]]}],["i",{"w":"si","s":"i","e":true,"k":"i","d":[70],"c":[["m",{"w":"sim","s":"m","e":false,"k":"m","d":[],"c":[["u",{"w":"simul","s":"ul","e":false,"k":"u","d":[],"c":[["a",{"w":"simulat","s":"at","e":false,"k":"a","d":[],"c":[["e",{"w":"simulate","s":"e","e":true,"k":"e","d":[7,8,9,12,224,245,348,361],"c":[["d",{"w":"simulated","s":"d","e":true,"k":"d","d":[4,8,9,19,27,358,362],"c":[]}],["s",{"w":"simulates","s":"s","e":true,"k":"s","d":[12,224,245,348],"c":[]}]]}],["i",{"w":"simulating","s":"ing","e":true,"k":"i","d":[12,245,348],"c":[]}]]}],["t",{"w":"simultaneously","s":"taneously","e":true,"k":"t","d":[108],"c":[]}]]}],["n",{"w":"simnet","s":"net","e":true,"k":"n","d":[4,5,6,7,8,9,12,19,25,27,28,224,245,246,348,358,359,360,361,362],"c":[["'",{"w":"simnet's","s":"'s","e":true,"k":"'","d":[8],"c":[]}]]}],["p",{"w":"simpl","s":"pl","e":false,"k":"p","d":[],"c":[["i",{"w":"simpli","s":"i","e":false,"k":"i","d":[],"c":[["f",{"w":"simplif","s":"f","e":false,"k":"f","d":[],"c":[["i",{"w":"simplifie","s":"ie","e":false,"k":"i","d":[],"c":[["s",{"w":"simplifies","s":"s","e":true,"k":"s","d":[9,49,93,173,183,196,201],"c":[]}],["d",{"w":"simplified","s":"d","e":true,"k":"d","d":[196,355],"c":[]}]]}],["y",{"w":"simplify","s":"y","e":true,"k":"y","d":[18,96,103,105,107,121,155,165,166,169,170,171,173,183,185,189,196,197,259,373],"c":[["i",{"w":"simplifying","s":"ing","e":true,"k":"i","d":[82,83,84,85,88,89,93,94,98,101,103,105,106,107,109,110,111,117,118,120,121,124,131,132,135,136,138,139,141,142,143,146,147,148,150,151,153,155,157,159,162,165,166,167,168,169,170,171,172,173,175,181,183,184,185,186,189,194,195,196,197,198,200],"c":[]}]]}]]}],["c",{"w":"simplicity","s":"city","e":true,"k":"c","d":[102,176,191],"c":[]}]]}],["e",{"w":"simple","s":"e","e":true,"k":"e","d":[11,18,19,22,27,30,53,77,79,81,92,93,97,99,100,102,108,112,113,114,115,116,119,122,128,130,137,140,149,152,154,160,161,163,164,171,173,174,176,178,187,188,191,192,193,201,202,237,353,381,505],"c":[["r",{"w":"simpler","s":"r","e":true,"k":"r","d":[54,182,258,514],"c":[]}],["-",{"w":"simple-vote-v0","s":"-vote-v0","e":true,"k":"-","d":[377,379],"c":[]}]]}],["y",{"w":"simply","s":"y","e":true,"k":"y","d":[47,49,50,75,235,369,426,444],"c":[]}]]}],["i",{"w":"similar","s":"ilar","e":true,"k":"i","d":[9,68,71,90,96,182,193,233,356,357,366,367],"c":[]}]]}],["n",{"w":"sin","s":"n","e":false,"k":"n","d":[],"c":[["g",{"w":"single","s":"gle","e":true,"k":"g","d":[4,7,27,52,53,69,76,96,102,105,108,112,113,119,128,129,130,137,140,149,163,177,180,182,188,189,224,226,229,234,358,361,362,368,372,377,379],"c":[["-",{"w":"single-address","s":"-address","e":true,"k":"-","d":[69],"c":[]}],["s",{"w":"singlesig","s":"sig","e":true,"k":"s","d":[235,369],"c":[]}]]}],["c",{"w":"since","s":"ce","e":true,"k":"c","d":[9,12,14,15,142,224,226,234,238,239,245,258,348,368,377],"c":[]}]]}],["g",{"w":"sign","s":"gn","e":true,"k":"g","d":[48,76,80,87,113,145,179,187,221,226,230,232,233,234,239,243,350,352,353,354,356,357,366,367,368,511,513],"c":[["i",{"w":"signi","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"signin","s":"n","e":false,"k":"n","d":[],"c":[["g",{"w":"signing","s":"g","e":true,"k":"g","d":[18,67,71,72,226,227,234,237,241,351,353,354,356,366,368],"c":[]}],["p",{"w":"signinputs","s":"puts","e":true,"k":"p","d":[351,356,366],"c":[]}]]}],["f",{"w":"significant","s":"ficant","e":true,"k":"f","d":[68,79],"c":[["l",{"w":"significantly","s":"ly","e":true,"k":"l","d":[79,90,97,103,134,163,177],"c":[]}]]}]]}],["a",{"w":"signa","s":"a","e":false,"k":"a","d":[],"c":[["t",{"w":"signature","s":"ture","e":true,"k":"t","d":[52,71,80,82,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,223,226,229,234,354,356,366,368],"c":[["s",{"w":"signatures","s":"s","e":true,"k":"s","d":[52,80,119,152,162,169,226,229,234,354,368],"c":[]}]]}],["l",{"w":"signal","s":"l","e":true,"k":"l","d":[71],"c":[]}]]}],["e",{"w":"signe","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"signed","s":"d","e":true,"k":"d","d":[53,67,71,72,76,80,87,113,114,118,128,130,133,145,153,154,157,158,176,179,187,191,226,227,229,230,232,234,353,356,366,368],"c":[]}],["r",{"w":"signer","s":"r","e":true,"k":"r","d":[80,208,219,222,226,234,368],"c":[["s",{"w":"signers","s":"s","e":true,"k":"s","d":[80,208,214,219,222,233,289,292,367],"c":[["'",{"w":"signers'","s":"'","e":true,"k":"'","d":[215,291],"c":[]}],["i",{"w":"signersignature","s":"ignature","e":true,"k":"i","d":[223],"c":[]}],["p",{"w":"signerspublickey","s":"publickey","e":true,"k":"p","d":[233,367],"c":[]}]]}],["-",{"w":"signer-metrics","s":"-metrics","e":true,"k":"-","d":[206,207,210,212,214,215,216,218],"c":[["-",{"w":"signer-metrics-api","s":"-api","e":true,"k":"-","d":[206,207,208,210,212,214,215,216,218],"c":[]}]]}],["_",{"w":"signer_","s":"_","e":false,"k":"_","d":[],"c":[["i",{"w":"signer_id","s":"id","e":true,"k":"i","d":[214],"c":[]}],["k",{"w":"signer_key","s":"key","e":true,"k":"k","d":[219,222,289,292],"c":[]}]]}],["p",{"w":"signerprivatekey","s":"privatekey","e":true,"k":"p","d":[223],"c":[]}],["k",{"w":"signerkey","s":"key","e":true,"k":"k","d":[223],"c":[]}]]}]]}],["-",{"w":"sign-","s":"-","e":false,"k":"-","d":[],"c":[["i",{"w":"sign-in","s":"in","e":true,"k":"i","d":[67,226,227],"c":[]}],["o",{"w":"sign-out","s":"out","e":true,"k":"o","d":[67,226,227],"c":[]}],["m",{"w":"sign-messages","s":"messages","e":true,"k":"m","d":[71,243,350,353,354,357],"c":[]}],["d",{"w":"sign-document","s":"document","e":true,"k":"d","d":[80],"c":[]}],["a",{"w":"sign-and-broadcast-transactions","s":"and-broadcast-transactions","e":true,"k":"a","d":[353],"c":[]}]]}],["u",{"w":"signuserout","s":"userout","e":true,"k":"u","d":[67,226,227,355],"c":[]}],["p",{"w":"signp","s":"p","e":false,"k":"p","d":[],"c":[["o",{"w":"signpoxsignature","s":"oxsignature","e":true,"k":"o","d":[219,223],"c":[]}],["s",{"w":"signpsbt","s":"sbt","e":true,"k":"s","d":[351,356,366],"c":[]}]]}],["o",{"w":"signorigin","s":"origin","e":true,"k":"o","d":[226,234,368],"c":[]}],["m",{"w":"signmessage","s":"message","e":true,"k":"m","d":[354],"c":[["h",{"w":"signmessagehashrsv","s":"hashrsv","e":true,"k":"h","d":[229],"c":[]}]]}],["w",{"w":"signwithkey","s":"withkey","e":true,"k":"w","d":[229],"c":[]}],["s",{"w":"signs","s":"s","e":true,"k":"s","d":[354],"c":[["t",{"w":"signstructuredmessage","s":"tructuredmessage","e":true,"k":"t","d":[354],"c":[]}]]}]]}],["z",{"w":"size","s":"ze","e":true,"k":"z","d":[22,27,110,149,346],"c":[["s",{"w":"sizes","s":"s","e":true,"k":"s","d":[87,126,133,158,179],"c":[]}]]}],["p",{"w":"sip","s":"p","e":true,"k":"p","d":[54,226,234,368],"c":[["s",{"w":"sips","s":"s","e":true,"k":"s","d":[27,28,226,234,346,355,356,366,368],"c":[]}],["-",{"w":"sip-0","s":"-0","e":false,"k":"-","d":[],"c":[["1",{"w":"sip-01","s":"1","e":false,"k":"1","d":[],"c":[["0",{"w":"sip-010","s":"0","e":true,"k":"0","d":[27,28,58,233,367,511,513],"c":[["-",{"w":"sip-010-","s":"-","e":false,"k":"-","d":[],"c":[["f",{"w":"sip-010-fungible-token-standard","s":"fungible-token-standard","e":true,"k":"f","d":[27,28],"c":[]}],["t",{"w":"sip-010-trait-ft-standard","s":"trait-ft-standard","e":true,"k":"t","d":[27],"c":[]}]]}]]}],["3",{"w":"sip-013","s":"3","e":true,"k":"3","d":[58],"c":[]}],["8",{"w":"sip-018","s":"8","e":true,"k":"8","d":[356,366],"c":[]}]]}],["0",{"w":"sip-00","s":"0","e":false,"k":"0","d":[],"c":[["9",{"w":"sip-009","s":"9","e":true,"k":"9","d":[28,58],"c":[]}],["5",{"w":"sip-005","s":"5","e":true,"k":"5","d":[144,226,234,368],"c":[["-",{"w":"sip-005-blocks-and-transactions","s":"-blocks-and-transactions","e":true,"k":"-","d":[226,234,368],"c":[]}]]}],["2",{"w":"sip-002-smart-contract-language","s":"2-smart-contract-language","e":true,"k":"2","d":[226,234,368],"c":[]}],["4",{"w":"sip-004","s":"4","e":true,"k":"4","d":[346],"c":[["-",{"w":"sip-004-materialized-view","s":"-materialized-view","e":true,"k":"-","d":[346],"c":[]}]]}]]}],["3",{"w":"sip-030","s":"30","e":true,"k":"3","d":[355,356,366],"c":[["-",{"w":"sip-030-wallet-interface","s":"-wallet-interface","e":true,"k":"-","d":[355,356,366],"c":[]}]]}]]}],["0",{"w":"sip0","s":"0","e":false,"k":"0","d":[],"c":[["9",{"w":"sip09-protocol","s":"9-protocol","e":true,"k":"9","d":[372],"c":[]}],["1",{"w":"sip010","s":"10","e":true,"k":"1","d":[511,513],"c":[]}]]}]]}],["d",{"w":"side","s":"de","e":true,"k":"d","d":[108,163],"c":[["-",{"w":"side-by-side","s":"-by-side","e":true,"k":"-","d":[219],"c":[]}],["b",{"w":"sidebar","s":"bar","e":true,"k":"b","d":[515],"c":[]}]]}],["t",{"w":"sit","s":"t","e":true,"k":"t","d":[517],"c":[["u",{"w":"situat","s":"uat","e":false,"k":"u","d":[],"c":[["i",{"w":"situations","s":"ions","e":true,"k":"i","d":[201],"c":[]}],["e",{"w":"situated","s":"ed","e":true,"k":"e","d":[375],"c":[]}]]}],["e",{"w":"site","s":"e","e":true,"k":"e","d":[379],"c":[]}]]}]]}],["c",{"w":"sc","s":"c","e":false,"k":"c","d":[],"c":[["h",{"w":"sch","s":"h","e":false,"k":"h","d":[],"c":[["e",{"w":"sche","s":"e","e":false,"k":"e","d":[],"c":[["m",{"w":"schem","s":"m","e":false,"k":"m","d":[],"c":[["a",{"w":"schema","s":"a","e":true,"k":"a","d":[4,6,7,259,358,360,361,362],"c":[["s",{"w":"schemas","s":"s","e":true,"k":"s","d":[64,259,365,382,383,384,385,386,387],"c":[]}]]}],["e",{"w":"schemes","s":"es","e":true,"k":"e","d":[80,81],"c":[]}]]}],["d",{"w":"schedule","s":"dule","e":true,"k":"d","d":[50,73,102,191,202],"c":[["d",{"w":"scheduled","s":"d","e":true,"k":"d","d":[202],"c":[]}]]}]]}],["n",{"w":"schnorr","s":"norr","e":true,"k":"n","d":[233,367],"c":[]}]]}],["a",{"w":"sca","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"scan","s":"n","e":true,"k":"n","d":[9,52,374,376,377,378,379,423,502],"c":[["n",{"w":"scann","s":"n","e":false,"k":"n","d":[],"c":[["i",{"w":"scanning","s":"ing","e":true,"k":"i","d":[52,376,378,379],"c":[]}],["e",{"w":"scanned","s":"ed","e":true,"k":"e","d":[376],"c":[]}]]}],["-",{"w":"scan-the-bitcoin-blockchain-for-transactions-that-match-your-predicate","s":"-the-bitcoin-blockchain-for-transactions-that-match-your-predicate","e":true,"k":"-","d":[376],"c":[]}],["s",{"w":"scans","s":"s","e":true,"k":"s","d":[378],"c":[]}]]}],["l",{"w":"scal","s":"l","e":false,"k":"l","d":[],"c":[["i",{"w":"scaling","s":"ing","e":true,"k":"i","d":[18,31,44,45,77,102,107,228,373],"c":[]}],["e",{"w":"scale","s":"e","e":true,"k":"e","d":[77,102],"c":[["d",{"w":"scaled-rate","s":"d-rate","e":true,"k":"d","d":[77],"c":[]}]]}],["a",{"w":"scalab","s":"ab","e":false,"k":"a","d":[],"c":[["i",{"w":"scalability","s":"ility","e":true,"k":"i","d":[79,122,371],"c":[]}],["l",{"w":"scalable","s":"le","e":true,"k":"l","d":[79],"c":[]}]]}]]}]]}],["r",{"w":"scr","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"script","s":"ipt","e":true,"k":"i","d":[233,246,367,371],"c":[["s",{"w":"scripts","s":"s","e":true,"k":"s","d":[9,18,31,233,239,367,371],"c":[]}]]}],["o",{"w":"scroll-m-20","s":"oll-m-20","e":true,"k":"o","d":[11,44,256,381,466,501,505],"c":[]}],["a",{"w":"scratch","s":"atch","e":true,"k":"a","d":[47,52],"c":[]}],["e",{"w":"screen","s":"een","e":true,"k":"e","d":[53,68],"c":[]}]]}],["e",{"w":"scenario","s":"enario","e":true,"k":"e","d":[12,14,245,348],"c":[["s",{"w":"scenarios","s":"s","e":true,"k":"s","d":[12,14,90,108,174,176,188,191,245,348],"c":[]}]]}],["o",{"w":"scop","s":"op","e":false,"k":"o","d":[],"c":[["e",{"w":"scope","s":"e","e":true,"k":"e","d":[68,163,170,171,224,228,244,371,372,374,376,377,378,379],"c":[["s",{"w":"scopes","s":"s","e":true,"k":"s","d":[52,226,227,371,372,374,375,376,377,379],"c":[]}]]}],["i",{"w":"scoping","s":"ing","e":true,"k":"i","d":[372],"c":[]}]]}]]}],["h",{"w":"sh","s":"h","e":true,"k":"h","d":[75,233,355,367,509,517],"c":[["o",{"w":"sho","s":"o","e":false,"k":"o","d":[],"c":[["u",{"w":"should","s":"uld","e":true,"k":"u","d":[6,14,17,18,47,49,50,58,65,67,68,71,72,92,99,100,112,115,119,126,161,174,187,192,221,226,227,229,231,234,246,258,360,368,372,374,375,439,462,510,515,517],"c":[["n",{"w":"shouldn't","s":"n't","e":true,"k":"n","d":[77,129,229],"c":[]}]]}],["w",{"w":"show","s":"w","e":true,"k":"w","d":[71,73,229,233,355,356,366,367,517],"c":[["s",{"w":"shows","s":"s","e":true,"k":"s","d":[22,55,219,220,237],"c":[]}],["i",{"w":"showing","s":"ing","e":true,"k":"i","d":[53,246],"c":[]}],["n",{"w":"shown","s":"n","e":true,"k":"n","d":[67,68,226,227,232,356,366,376,514],"c":[]}],["c",{"w":"showc","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"showconnect","s":"onnect","e":true,"k":"o","d":[240,355],"c":[]}],["a",{"w":"showcase","s":"ase","e":true,"k":"a","d":[427,459],"c":[]}]]}],["x",{"w":"showxyz","s":"xyz","e":true,"k":"x","d":[355],"c":[]}]]}],["r",{"w":"short","s":"rt","e":true,"k":"r","d":[188,202],"c":[["e",{"w":"shorter","s":"er","e":true,"k":"e","d":[87,133,158,179,188],"c":[]}],["-",{"w":"short-circuit","s":"-circuit","e":true,"k":"-","d":[173],"c":[["i",{"w":"short-circuiting","s":"ing","e":true,"k":"i","d":[108],"c":[]}],["s",{"w":"short-circuits","s":"s","e":true,"k":"s","d":[108,173],"c":[]}]]}]]}]]}],["a",{"w":"sha","s":"a","e":false,"k":"a","d":[],"c":[["p",{"w":"shapes","s":"pes","e":true,"k":"p","d":[11,256,259,381,501,505],"c":[]}],["s",{"w":"shasum","s":"sum","e":true,"k":"s","d":[14,15,16,17],"c":[]}],["2",{"w":"sha256","s":"256","e":true,"k":"2","d":[14,15,16,17,80,84,91,111,162,169,181,188],"c":[]}],["r",{"w":"shar","s":"r","e":false,"k":"r","d":[],"c":[["e",{"w":"share","s":"e","e":true,"k":"e","d":[19,67,72,73,112,226,227],"c":[["d",{"w":"shared","s":"d","e":true,"k":"d","d":[49],"c":[]}]]}],["p",{"w":"sharpening","s":"pening","e":true,"k":"p","d":[69],"c":[]}],["i",{"w":"sharing","s":"ing","e":true,"k":"i","d":[77],"c":[]}],["k",{"w":"sharkobarko","s":"kobarko","e":true,"k":"k","d":[122],"c":[]}]]}],["5",{"w":"sha512","s":"512","e":true,"k":"5","d":[22,84,111,181],"c":[]}],["-",{"w":"sha-","s":"-","e":false,"k":"-","d":[],"c":[["2",{"w":"sha-256","s":"256","e":true,"k":"2","d":[84,91,111,162,169,181],"c":[]}],["5",{"w":"sha-512","s":"512","e":true,"k":"5","d":[84,111,181],"c":[]}]]}],["m",{"w":"shamt","s":"mt","e":true,"k":"m","d":[145,174],"c":[]}]]}],["e",{"w":"shell","s":"ell","e":true,"k":"e","d":[18,27],"c":[["s",{"w":"shells","s":"s","e":true,"k":"s","d":[18],"c":[]}]]}],["i",{"w":"shi","s":"i","e":false,"k":"i","d":[],"c":[["f",{"w":"shift","s":"ft","e":true,"k":"f","d":[145,174],"c":[["i",{"w":"shifting","s":"ing","e":true,"k":"i","d":[145,174],"c":[]}],["s",{"w":"shifts","s":"s","e":true,"k":"s","d":[145],"c":[]}]]}],["p",{"w":"shipping","s":"pping","e":true,"k":"p","d":[219],"c":[]}]]}],["u",{"w":"shut","s":"ut","e":true,"k":"u","d":[515],"c":[["d",{"w":"shutdown","s":"down","e":true,"k":"d","d":[515],"c":[]}],["t",{"w":"shutting","s":"ting","e":true,"k":"t","d":[515],"c":[]}]]}]]}],["o",{"w":"so","s":"o","e":true,"k":"o","d":[13,14,15,16,17,22,23,26,27,28,31,45,48,49,50,51,54,55,58,65,67,68,71,72,73,74,112,123,202,219,220,223,226,227,234,238,258,352,355,356,365,366,368,371,374,376,377,399,422,425,427,443,459,466,502,514,517],"c":[["u",{"w":"sourc","s":"urc","e":false,"k":"u","d":[],"c":[["e",{"w":"source","s":"e","e":true,"k":"e","d":[6,7,22,360,361,415],"c":[["c",{"w":"sourcecode","s":"code","e":true,"k":"c","d":[7,361],"c":[]}],["s",{"w":"sources","s":"s","e":true,"k":"s","d":[87,104,126,133,158,179],"c":[]}],["d",{"w":"sourced","s":"d","e":true,"k":"d","d":[233,367],"c":[]}]]}],["i",{"w":"sourcing","s":"ing","e":true,"k":"i","d":[49],"c":[]}]]}],["m",{"w":"some","s":"me","e":true,"k":"m","d":[6,7,8,12,16,22,27,28,30,68,69,71,72,77,80,83,103,109,114,123,127,138,139,141,142,146,157,168,170,172,173,183,189,194,195,201,202,224,226,227,228,229,234,236,245,348,350,351,355,360,361,368,370,378,511,513,514,516],"c":[["t",{"w":"somet","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"sometimes","s":"imes","e":true,"k":"i","d":[48],"c":[]}],["h",{"w":"something","s":"hing","e":true,"k":"h","d":[67,68,70,71,73,226,227,234,258,368,375],"c":[]}]]}],["o",{"w":"someone","s":"one","e":true,"k":"o","d":[71],"c":[]}],["-",{"w":"some-","s":"-","e":false,"k":"-","d":[],"c":[["b",{"w":"some-b","s":"b","e":false,"k":"b","d":[],"c":[["i",{"w":"some-binding-name","s":"inding-name","e":true,"k":"i","d":[170],"c":[]}],["r",{"w":"some-branch","s":"ranch","e":true,"k":"r","d":[170],"c":[]}]]}],["t",{"w":"some-type","s":"type","e":true,"k":"t","d":[226,234,368],"c":[]}],["i",{"w":"some-id","s":"id","e":true,"k":"i","d":[517],"c":[]}]]}],["c",{"w":"somecv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}],["w",{"w":"somewh","s":"wh","e":false,"k":"w","d":[],"c":[["a",{"w":"somewhat","s":"at","e":true,"k":"a","d":[229],"c":[]}],["e",{"w":"somewhere","s":"ere","e":true,"k":"e","d":[229],"c":[]}]]}]]}],["l",{"w":"sol","s":"l","e":true,"k":"l","d":[517],"c":[["u",{"w":"solution","s":"ution","e":true,"k":"u","d":[45,229],"c":[["s",{"w":"solutions","s":"s","e":true,"k":"s","d":[70],"c":[]}]]}],["d",{"w":"sold","s":"d","e":true,"k":"d","d":[49,154],"c":[]}],["e",{"w":"sole","s":"e","e":true,"k":"e","d":[69],"c":[["l",{"w":"solely","s":"ly","e":true,"k":"l","d":[81],"c":[]}]]}],["v",{"w":"solved","s":"ved","e":true,"k":"v","d":[73],"c":[]}],["i",{"w":"solidity","s":"idity","e":true,"k":"i","d":[517],"c":[]}]]}],["'",{"w":"so'","s":"'","e":true,"k":"'","d":[67,514],"c":[]}],["c",{"w":"social","s":"cial","e":true,"k":"c","d":[71],"c":[]}],["o",{"w":"soon","s":"on","e":true,"k":"o","d":[73,219,220],"c":[["_",{"w":"soon_","s":"_","e":true,"k":"_","d":[233,367],"c":[]}]]}],["f",{"w":"soft","s":"ft","e":true,"k":"f","d":[79],"c":[["w",{"w":"software","s":"ware","e":true,"k":"w","d":[515],"c":[]}]]}],["p",{"w":"sophisticated","s":"phisticated","e":true,"k":"p","d":[95,108,113,115,122,127,156,160,161,178],"c":[]}],["r",{"w":"sort","s":"rt","e":true,"k":"r","d":[114,154,176,191],"c":[["i",{"w":"sorting","s":"ing","e":true,"k":"i","d":[114,154,176,191],"c":[]}]]}]]}],["a",{"w":"sa","s":"a","e":false,"k":"a","d":[],"c":[["y",{"w":"say","s":"y","e":true,"k":"y","d":[28,238,371],"c":[["-",{"w":"say-hi","s":"-hi","e":true,"k":"-","d":[6,7,353,360,361],"c":[]}],["h",{"w":"sayhi","s":"hi","e":true,"k":"h","d":[7,361],"c":[]}],["i",{"w":"saying","s":"ing","e":true,"k":"i","d":[515],"c":[]}]]}],["m",{"w":"sam","s":"m","e":false,"k":"m","d":[],"c":[["e",{"w":"same","s":"e","e":true,"k":"e","d":[7,12,14,15,27,48,68,71,81,82,86,90,101,114,128,130,145,154,173,174,176,182,187,188,191,196,233,241,245,259,348,356,361,366,367,374,376,377,511,513,517],"c":[]}],["p",{"w":"sample","s":"ple","e":true,"k":"p","d":[51,67,226,227,246,255,374,376,517],"c":[["-",{"w":"sample-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"sample-alert-","s":"alert-","e":false,"k":"a","d":[],"c":[["p",{"w":"sample-alert-payload","s":"payload","e":true,"k":"p","d":[51,517],"c":[]}],["i",{"w":"sample-alert-interface","s":"interface","e":true,"k":"i","d":[51],"c":[]}]]}],["c",{"w":"sample-contract","s":"contract","e":true,"k":"c","d":[51],"c":[]}]]}],["s",{"w":"samples","s":"s","e":true,"k":"s","d":[78],"c":[]}]]}]]}],["f",{"w":"safe","s":"fe","e":true,"k":"f","d":[103,126,134,174,201,515],"c":[["t",{"w":"safety","s":"ty","e":true,"k":"t","d":[18,100,103,180,201],"c":[]}],["l",{"w":"safely","s":"ly","e":true,"k":"l","d":[78,103,126,144,180,201,246,515],"c":[]}],["r",{"w":"safer","s":"r","e":true,"k":"r","d":[116,180,515],"c":[]}],["-",{"w":"safe-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"safe-append","s":"append","e":true,"k":"a","d":[126],"c":[]}],["g",{"w":"safe-guard","s":"guard","e":true,"k":"g","d":[228],"c":[]}]]}],["g",{"w":"safeguards","s":"guards","e":true,"k":"g","d":[149],"c":[]}]]}],["v",{"w":"sav","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"save","s":"e","e":true,"k":"e","d":[22,54,68,95,156,202],"c":[["d",{"w":"saved","s":"d","e":true,"k":"d","d":[27],"c":[]}],["s",{"w":"saves","s":"s","e":true,"k":"s","d":[246],"c":[]}]]}],["i",{"w":"saving","s":"ing","e":true,"k":"i","d":[76],"c":[["s",{"w":"savings","s":"s","e":true,"k":"s","d":[50],"c":[]}]]}]]}],["t",{"w":"sat","s":"t","e":true,"k":"t","d":[233,367],"c":[["s",{"w":"sats","s":"s","e":true,"k":"s","d":[28,233,356,366,367,464,465,499,500],"c":[["-",{"w":"sats-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"sats-amount","s":"amount","e":true,"k":"a","d":[25,27],"c":[]}],["p",{"w":"sats-per-byte","s":"per-byte","e":true,"k":"p","d":[25,27],"c":[]}],["s",{"w":"sats-sbtc-mint-price","s":"sbtc-mint-price","e":true,"k":"s","d":[28],"c":[]}]]}]]}],["o",{"w":"satoshi","s":"oshi","e":true,"k":"o","d":[27,459],"c":[["s",{"w":"satoshis","s":"s","e":true,"k":"s","d":[233,367,459],"c":[]}]]}],["i",{"w":"satisfied","s":"isfied","e":true,"k":"i","d":[193],"c":[]}]]}],["n",{"w":"sandbox","s":"ndbox","e":true,"k":"n","d":[50,68,74],"c":[]}],["l",{"w":"sal","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"sale","s":"e","e":true,"k":"e","d":[154,511,513],"c":[]}],["t",{"w":"salt","s":"t","e":true,"k":"t","d":[239],"c":[["i",{"w":"salting","s":"ing","e":true,"k":"i","d":[188],"c":[]}]]}]]}]]}],["b",{"w":"sbtc","s":"btc","e":true,"k":"b","d":[7,28,49,219,233,361,367],"c":[["'",{"w":"sbtc'","s":"'","e":true,"k":"'","d":[7,361],"c":[]}],["-",{"w":"sbtc-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"sbtc-deposit","s":"deposit","e":true,"k":"d","d":[28],"c":[]}],["t",{"w":"sbtc-token","s":"token","e":true,"k":"t","d":[28],"c":[]}],["r",{"w":"sbtc-registry","s":"registry","e":true,"k":"r","d":[28],"c":[]}],["c",{"w":"sbtc-contract","s":"contract","e":true,"k":"c","d":[28],"c":[]}]]}],["s",{"w":"sbtcs","s":"s","e":true,"k":"s","d":[28],"c":[]}],["a",{"w":"sbtcapi","s":"api","e":false,"k":"a","d":[],"c":[["c",{"w":"sbtcapiclient","s":"client","e":true,"k":"c","d":[233,367],"c":[["t",{"w":"sbtcapiclienttestnet","s":"testnet","e":true,"k":"t","d":[233,367],"c":[]}],["m",{"w":"sbtcapiclientmainnet","s":"mainnet","e":true,"k":"m","d":[233,367],"c":[]}],["d",{"w":"sbtcapiclientdevenv","s":"devenv","e":true,"k":"d","d":[233,367],"c":[]}]]}],["u",{"w":"sbtcapiurl","s":"url","e":true,"k":"u","d":[233,367],"c":[]}]]}],["d",{"w":"sbtcdeposithelper","s":"deposithelper","e":true,"k":"d","d":[233,367],"c":[]}],["b",{"w":"sbtcbalance","s":"balance","e":true,"k":"b","d":[233,367],"c":[]}],["c",{"w":"sbtccontract","s":"contract","e":true,"k":"c","d":[233,367],"c":[]}]]}],["u",{"w":"su","s":"u","e":false,"k":"u","d":[],"c":[["c",{"w":"suc","s":"c","e":false,"k":"c","d":[],"c":[["h",{"w":"such","s":"h","e":true,"k":"h","d":[7,18,27,68,69,90,102,208,259,352,361,372,511,513],"c":[]}],["c",{"w":"succe","s":"ce","e":false,"k":"c","d":[],"c":[["s",{"w":"success","s":"ss","e":true,"k":"s","d":[12,21,71,86,99,119,121,123,124,127,136,144,149,164,196,224,230,243,245,255,348,356,366,377],"c":[["f",{"w":"successful","s":"ful","e":true,"k":"f","d":[12,14,15,17,65,83,84,85,93,94,98,101,109,111,117,121,123,131,135,136,141,142,143,144,148,150,159,162,164,166,169,175,181,184,186,194,198,200,224,230,245,348,356,366,375,439,462],"c":[["l",{"w":"successfully","s":"ly","e":true,"k":"l","d":[47,51,68,69,71,121,167,224,232,377],"c":[]}]]}]]}],["e",{"w":"succeed","s":"ed","e":true,"k":"e","d":[85,117,118,131,138,142,143,148,149,150,151,153,157,159,166,169,175,184,198],"c":[["s",{"w":"succeeds","s":"s","e":true,"k":"s","d":[71],"c":[]}],["e",{"w":"succeeded","s":"ed","e":true,"k":"e","d":[246],"c":[]}]]}]]}]]}],["p",{"w":"sup","s":"p","e":false,"k":"p","d":[],"c":[["p",{"w":"supp","s":"p","e":false,"k":"p","d":[],"c":[["o",{"w":"support","s":"ort","e":true,"k":"o","d":[18,49,74,219,221,222,229,259,351,356,366,425,443,502],"c":[["s",{"w":"supports","s":"s","e":true,"k":"s","d":[8,19,226,229,234,368,514],"c":[]}],["e",{"w":"supported","s":"ed","e":true,"k":"e","d":[13,25,185,351,355],"c":[]}],["i",{"w":"supporting","s":"ing","e":true,"k":"i","d":[226,234,368],"c":[]}]]}],["l",{"w":"supply","s":"ly","e":true,"k":"l","d":[69,71,115,123,125,135,143,160,178,190],"c":[["-",{"w":"supply-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"supply-dependent","s":"dependent","e":true,"k":"d","d":[125],"c":[]}],["l",{"w":"supply-limited","s":"limited","e":true,"k":"l","d":[125],"c":[]}]]}]]}]]}],["a",{"w":"supabase","s":"abase","e":true,"k":"a","d":[68],"c":[]}]]}],["m",{"w":"sum","s":"m","e":true,"k":"m","d":[96,137,171],"c":[["m",{"w":"summ","s":"m","e":false,"k":"m","d":[],"c":[["a",{"w":"summary","s":"ary","e":true,"k":"a","d":[9,219,222],"c":[]}],["i",{"w":"summing","s":"ing","e":true,"k":"i","d":[96],"c":[]}]]}],["s",{"w":"sums","s":"s","e":true,"k":"s","d":[96],"c":[]}],["-",{"w":"sum-list","s":"-list","e":true,"k":"-","d":[96],"c":[]}]]}],["i",{"w":"suit","s":"it","e":false,"k":"i","d":[],"c":[["a",{"w":"suitable","s":"able","e":true,"k":"a","d":[14,80],"c":[]}],["e",{"w":"suite","s":"e","e":true,"k":"e","d":[224],"c":[["d",{"w":"suited","s":"d","e":true,"k":"d","d":[97,134],"c":[]}]]}]]}],["d",{"w":"sudo","s":"do","e":true,"k":"d","d":[18,380,517],"c":[]}],["r",{"w":"sure","s":"re","e":true,"k":"r","d":[24,28,46,51,68,71,75,219,221,227,229,236,370,377],"c":[]}],["b",{"w":"sub","s":"b","e":true,"k":"b","d":[65,365],"c":[["-",{"w":"sub-","s":"-","e":false,"k":"-","d":[],"c":[["e",{"w":"sub-expressions","s":"expressions","e":true,"k":"e","d":[26],"c":[]}],["s",{"w":"sub-sequence","s":"sequence","e":true,"k":"s","d":[194],"c":[["s",{"w":"sub-sequences","s":"s","e":true,"k":"s","d":[194],"c":[]}]]}]]}],["s",{"w":"subs","s":"s","e":false,"k":"s","d":[],"c":[["c",{"w":"subscribe","s":"cribe","e":true,"k":"c","d":[65],"c":[["a",{"w":"subscribeaddresstransactions","s":"addresstransactions","e":true,"k":"a","d":[65,365],"c":[]}]]}],["e",{"w":"subse","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"subset","s":"t","e":true,"k":"t","d":[177],"c":[["s",{"w":"subsets","s":"s","e":true,"k":"s","d":[177],"c":[]}]]}],["q",{"w":"subsequent","s":"quent","e":true,"k":"q","d":[378],"c":[]}]]}],["t",{"w":"substitute","s":"titute","e":true,"k":"t","d":[376],"c":[]}],["y",{"w":"subsystem","s":"ystem","e":true,"k":"y","d":[510],"c":[]}]]}],["m",{"w":"submi","s":"mi","e":false,"k":"m","d":[],"c":[["s",{"w":"submission","s":"ssion","e":true,"k":"s","d":[68,69,70,72,73],"c":[["s",{"w":"submissions","s":"s","e":true,"k":"s","d":[73],"c":[]}],["-",{"w":"submission-id","s":"-id","e":true,"k":"-","d":[80],"c":[]}]]}],["t",{"w":"submit","s":"t","e":true,"k":"t","d":[69,70,72,73,80,517],"c":[["t",{"w":"submitt","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"submitted","s":"ed","e":true,"k":"e","d":[68,69],"c":[]}],["i",{"w":"submitting","s":"ing","e":true,"k":"i","d":[73,233,367],"c":[]}]]}],["-",{"w":"submit-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"submit-document","s":"document","e":true,"k":"d","d":[80],"c":[["-",{"w":"submit-document-hash","s":"-hash","e":true,"k":"-","d":[80],"c":[]}]]}],["v",{"w":"submit-vote","s":"vote","e":true,"k":"v","d":[80],"c":[]}]]}]]}]]}],["j",{"w":"subject","s":"ject","e":true,"k":"j","d":[71],"c":[["s",{"w":"subjects","s":"s","e":true,"k":"s","d":[71],"c":[]}],["f",{"w":"subjectfeepercent","s":"feepercent","e":true,"k":"f","d":[71],"c":[]}]]}],["t",{"w":"subt","s":"t","e":false,"k":"t","d":[],"c":[["r",{"w":"subtract","s":"ract","e":false,"k":"r","d":[],"c":[["i",{"w":"subtracti","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"subtraction","s":"on","e":true,"k":"o","d":[77,102,112,137,140],"c":[]}],["v",{"w":"subtractive","s":"ve","e":true,"k":"v","d":[77],"c":[]}],["n",{"w":"subtracting","s":"ng","e":true,"k":"n","d":[140],"c":[]}]]}],["s",{"w":"subtracts","s":"s","e":true,"k":"s","d":[77,106,185,197,199],"c":[]}]]}],["i",{"w":"subtitle","s":"itle","e":true,"k":"i","d":[232],"c":[]}]]}],["d",{"w":"subdomains'","s":"domains'","e":true,"k":"d","d":[271],"c":[]}]]}],["g",{"w":"suggest","s":"ggest","e":false,"k":"g","d":[],"c":[["i",{"w":"suggestions","s":"ions","e":true,"k":"i","d":[70],"c":[]}],["s",{"w":"suggests","s":"s","e":true,"k":"s","d":[241],"c":[]}],["e",{"w":"suggested","s":"ed","e":true,"k":"e","d":[258],"c":[]}]]}],["f",{"w":"sufficient","s":"fficient","e":true,"k":"f","d":[81,115,123,143,150,184,190,193,196],"c":[]}]]}],["m",{"w":"sm","s":"m","e":false,"k":"m","d":[],"c":[["a",{"w":"sma","s":"a","e":false,"k":"a","d":[],"c":[["r",{"w":"smart","s":"rt","e":true,"k":"r","d":[7,8,9,11,12,19,22,26,27,28,29,30,44,45,47,49,50,51,53,55,64,68,69,70,72,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,208,219,222,224,226,228,230,231,234,237,244,245,257,345,348,350,352,353,354,357,361,365,368,372,375,377,381,382,383,384,385,386,387,399,505],"c":[["-",{"w":"smart-contract","s":"-contract","e":true,"k":"-","d":[259],"c":[["s",{"w":"smart-contracts","s":"s","e":true,"k":"s","d":[219,222,333,399],"c":[]}]]}],["c",{"w":"smartcontract","s":"contract","e":false,"k":"c","d":[],"c":[["p",{"w":"smartcontractpayload","s":"payload","e":true,"k":"p","d":[229],"c":[["w",{"w":"smartcontractpayloadwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}],["e",{"w":"smartcontractevent","s":"event","e":true,"k":"e","d":[377],"c":[]}],["s",{"w":"smartcontractsapi","s":"sapi","e":true,"k":"s","d":[514],"c":[["i",{"w":"smartcontractsapiinterface","s":"interface","e":true,"k":"i","d":[514],"c":[]}]]}]]}]]}],["l",{"w":"small","s":"ll","e":true,"k":"l","d":[49,105,106,107,114,140,153,154,197,199],"c":[["c",{"w":"smallcard","s":"card","e":true,"k":"c","d":[9,11,44,47,53,239,243,256,381,420,423,466,501,505,509,511,513],"c":[]}],["e",{"w":"smaller","s":"er","e":true,"k":"e","d":[87,114,128,129,130,133,158,171,176,179,182,187,228,244],"c":[]}]]}]]}],["3",{"w":"sm3vdxk3wzzsa84xxfkafaf15nnzx32ctsg82jfq4","s":"3vdxk3wzzsa84xxfkafaf15nnzx32ctsg82jfq4","e":true,"k":"3","d":[28],"c":[]}]]}],["n",{"w":"sn","s":"n","e":false,"k":"n","d":[],"c":[["i",{"w":"snippet","s":"ippet","e":true,"k":"i","d":[7,72,224,361],"c":[["s",{"w":"snippets","s":"s","e":true,"k":"s","d":[223],"c":[]}]]}],["a",{"w":"snap","s":"ap","e":true,"k":"a","d":[380],"c":[["s",{"w":"snapshot","s":"shot","e":true,"k":"s","d":[13,202],"c":[["s",{"w":"snapshots","s":"s","e":true,"k":"s","d":[13],"c":[]}],["-",{"w":"snapshot-","s":"-","e":false,"k":"-","d":[],"c":[["h",{"w":"snapshot-height","s":"height","e":true,"k":"h","d":[202],"c":[]}],["b",{"w":"snapshot-b","s":"b","e":false,"k":"b","d":[],"c":[["l",{"w":"snapshot-block","s":"lock","e":true,"k":"l","d":[202],"c":[]}],["a",{"w":"snapshot-balance","s":"alance","e":true,"k":"a","d":[202],"c":[]}]]}]]}]]}]]}]]}],["y",{"w":"sy","s":"y","e":false,"k":"y","d":[],"c":[["n",{"w":"syn","s":"n","e":false,"k":"n","d":[],"c":[["t",{"w":"syntax","s":"tax","e":true,"k":"t","d":[7,18,21,361,517],"c":[]}],["c",{"w":"sync","s":"c","e":true,"k":"c","d":[11,256,378,381,501,505,509,510,515,517],"c":[["-",{"w":"sync-a-","s":"-a-","e":false,"k":"-","d":[],"c":[["b",{"w":"sync-a-bitcoin-node","s":"bitcoin-node","e":true,"k":"b","d":[11,256,376,381,501,505,509,510],"c":[]}],["s",{"w":"sync-a-stacks-node","s":"stacks-node","e":true,"k":"s","d":[11,256,378,381,501,505,510,515],"c":[]}]]}],["i",{"w":"syncing","s":"ing","e":true,"k":"i","d":[13,374,515],"c":[]}],["h",{"w":"synchroniz","s":"hroniz","e":false,"k":"h","d":[],"c":[["i",{"w":"synchronizing","s":"ing","e":true,"k":"i","d":[202],"c":[]}],["a",{"w":"synchronization","s":"ation","e":true,"k":"a","d":[509],"c":[]}]]}],["e",{"w":"synced","s":"ed","e":true,"k":"e","d":[504],"c":[]}]]}]]}],["s",{"w":"system","s":"stem","e":true,"k":"s","d":[12,76,77,79,80,90,97,113,114,115,116,122,128,130,149,160,174,176,178,187,191,192,201,202,226,229,234,244,245,259,348,368,502,510,516],"c":[["s",{"w":"systems","s":"s","e":true,"k":"s","d":[55,76,80,81,86,87,113,115,122,123,133,144,158,160,179,188,190],"c":[]}]]}],["m",{"w":"symbol","s":"mbol","e":true,"k":"m","d":[69],"c":[]}]]}],["l",{"w":"sl","s":"l","e":false,"k":"l","d":[],"c":[["o",{"w":"slo","s":"o","e":false,"k":"o","d":[],"c":[["w",{"w":"slow","s":"w","e":true,"k":"w","d":[68],"c":[["e",{"w":"slower","s":"er","e":true,"k":"e","d":[14],"c":[]}]]}],["t",{"w":"slots","s":"ts","e":true,"k":"t","d":[221],"c":[]}]]}],["i",{"w":"sli","s":"i","e":false,"k":"i","d":[],"c":[["d",{"w":"slideout","s":"deout","e":true,"k":"d","d":[51],"c":[]}],["c",{"w":"slic","s":"c","e":false,"k":"c","d":[],"c":[["e",{"w":"slice","s":"e","e":true,"k":"e","d":[80,182,194],"c":[]}],["i",{"w":"slicing","s":"ing","e":true,"k":"i","d":[194],"c":[]}]]}],["g",{"w":"slightly","s":"ghtly","e":true,"k":"g","d":[180],"c":[]}]]}]]}],["w",{"w":"sw","s":"w","e":false,"k":"w","d":[],"c":[["i",{"w":"switch","s":"itch","e":true,"k":"i","d":[16,221,355,517],"c":[["e",{"w":"switche","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"switched","s":"d","e":true,"k":"d","d":[229],"c":[]}],["r",{"w":"switcher","s":"r","e":true,"k":"r","d":[517],"c":[]}]]}]]}],["a",{"w":"swa","s":"a","e":false,"k":"a","d":[],"c":[["p",{"w":"swap","s":"p","e":true,"k":"p","d":[68],"c":[]}],["g",{"w":"swag","s":"g","e":true,"k":"g","d":[73],"c":[]}]]}]]}],["v",{"w":"svg","s":"vg","e":true,"k":"v","d":[55],"c":[["'",{"w":"svg'","s":"'","e":true,"k":"'","d":[44,259,466,508],"c":[]}]]}],["r",{"w":"src","s":"rc","e":true,"k":"r","d":[44,70,72,226,229,259,466,508],"c":[]}],["f",{"w":"sft","s":"ft","e":true,"k":"f","d":[58,61,231,252],"c":[]}],["k",{"w":"ski","s":"ki","e":false,"k":"k","d":[],"c":[["l",{"w":"skills","s":"lls","e":true,"k":"l","d":[69,71,73,78],"c":[]}],["p",{"w":"skip","s":"p","e":true,"k":"p","d":[229,255,422,502],"c":[]}]]}],["g",{"w":"sg","s":"g","e":false,"k":"g","d":[],"c":[["r",{"w":"sgrant","s":"rant","e":true,"k":"r","d":[69],"c":[]}],["t",{"w":"sgt","s":"t","e":true,"k":"t","d":[69],"c":[]}]]}],["q",{"w":"sq","s":"q","e":false,"k":"q","d":[],"c":[["r",{"w":"sqrt","s":"rt","e":true,"k":"r","d":[107],"c":[["i",{"w":"sqrti","s":"i","e":true,"k":"i","d":[106,107],"c":[]}]]}],["u",{"w":"square","s":"uare","e":true,"k":"u","d":[106,107],"c":[]}],["l",{"w":"sql","s":"l","e":true,"k":"l","d":[259],"c":[]}]]}],["s",{"w":"ssd","s":"sd","e":true,"k":"s","d":[502,515],"c":[]}]]}],["l",{"w":"l","s":"l","e":true,"k":"l","d":[226,234,368],"c":[["f",{"w":"lfg","s":"fg","e":true,"k":"f","d":[2,203,204,225,347,349],"c":[]}],["o",{"w":"lo","s":"o","e":false,"k":"o","d":[],"c":[["c",{"w":"loc","s":"c","e":false,"k":"c","d":[],"c":[["a",{"w":"loca","s":"a","e":false,"k":"a","d":[],"c":[["l",{"w":"local","s":"l","e":true,"k":"l","d":[2,8,11,14,15,16,17,18,19,24,27,30,31,47,50,53,55,68,163,170,171,203,204,225,228,233,241,256,347,349,352,355,356,357,366,367,373,375,378,381,424,501,505,510,515,517],"c":[["h",{"w":"localhost","s":"host","e":true,"k":"h","d":[14,15,17,27,68,374,376,379,504,514],"c":[]}],["l",{"w":"locally","s":"ly","e":true,"k":"l","d":[18,24,30,45,47,50,71,75,374,375,376,379,426,444,515],"c":[]}],["t",{"w":"localtunnel","s":"tunnel","e":true,"k":"t","d":[68,379],"c":[]}],["s",{"w":"localstoragestore","s":"storagestore","e":true,"k":"s","d":[355],"c":[]}]]}],["t",{"w":"locat","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"locati","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"location","s":"on","e":true,"k":"o","d":[67,226,227],"c":[["s",{"w":"locations","s":"s","e":true,"k":"s","d":[14,15,17],"c":[]}]]}],["n",{"w":"locating","s":"ng","e":true,"k":"n","d":[183],"c":[]}]]}],["e",{"w":"locate","s":"e","e":true,"k":"e","d":[21],"c":[["d",{"w":"located","s":"d","e":true,"k":"d","d":[377,515],"c":[]}]]}]]}]]}],["k",{"w":"lock","s":"k","e":true,"k":"k","d":[233,367,372,378,516],"c":[["e",{"w":"locked","s":"ed","e":true,"k":"e","d":[7,98,361,516],"c":[]}],["i",{"w":"locking","s":"ing","e":true,"k":"i","d":[372],"c":[]}],["p",{"w":"lockperiod","s":"period","e":true,"k":"p","d":[516],"c":[]}]]}]]}],["g",{"w":"log","s":"g","e":true,"k":"g","d":[7,16,50,65,68,71,88,90,120,149,199,227,230,232,233,234,235,236,237,239,246,259,350,353,354,356,361,365,366,367,368,369,370,514],"c":[["g",{"w":"logg","s":"g","e":false,"k":"g","d":[],"c":[["i",{"w":"logging","s":"ing","e":true,"k":"i","d":[51,88,115,120,163,178,199,229,230],"c":[]}],["e",{"w":"logged","s":"ed","e":true,"k":"e","d":[68],"c":[]}]]}],["i",{"w":"logi","s":"i","e":false,"k":"i","d":[],"c":[["c",{"w":"logic","s":"c","e":true,"k":"c","d":[52,68,71,77,81,85,86,90,93,95,98,100,101,102,103,104,107,108,109,110,112,113,114,116,117,118,124,125,126,127,128,129,131,136,137,138,139,140,142,143,146,147,148,149,150,151,153,154,155,156,157,159,161,163,165,166,168,170,171,172,173,175,176,177,178,180,183,184,185,190,191,192,194,195,196,197,198,202,229,371,372,373],"c":[["a",{"w":"logical","s":"al","e":true,"k":"a","d":[69,93,108,130,155,165,173,187,196],"c":[]}]]}],["n",{"w":"login","s":"n","e":true,"k":"n","d":[52,53,71],"c":[]}]]}],["o",{"w":"logout","s":"out","e":true,"k":"o","d":[67],"c":[]}],["s",{"w":"logs","s":"s","e":true,"k":"s","d":[88,120,163,219,230,375,377,509,515],"c":[]}],["-",{"w":"log-","s":"-","e":false,"k":"-","d":[],"c":[["b",{"w":"log-balance","s":"balance","e":true,"k":"b","d":[88,120],"c":[]}],["e",{"w":"log-event","s":"event","e":true,"k":"e","d":[149],"c":[]}]]}],["2",{"w":"log2","s":"2","e":true,"k":"2","d":[107],"c":[]}],["a",{"w":"logarithm","s":"arithm","e":true,"k":"a","d":[107],"c":[["i",{"w":"logarithmic","s":"ic","e":true,"k":"i","d":[107],"c":[]}],["s",{"w":"logarithms","s":"s","e":true,"k":"s","d":[107],"c":[]}]]}]]}],["o",{"w":"loo","s":"o","e":false,"k":"o","d":[],"c":[["p",{"w":"loop","s":"p","e":true,"k":"p","d":[8,68,97,149,180,219,220,378],"c":[["s",{"w":"loops","s":"s","e":true,"k":"s","d":[19,45,96,125,183,190],"c":[]}]]}],["k",{"w":"look","s":"k","e":true,"k":"k","d":[9,30,51,68,69,71,226,227,246,374,377,515],"c":[["i",{"w":"looking","s":"ing","e":true,"k":"i","d":[54,68,74,257,345,371,372,425,427,443],"c":[]}],["u",{"w":"lookup","s":"up","e":true,"k":"u","d":[79,97,103,226,227],"c":[["s",{"w":"lookups","s":"s","e":true,"k":"s","d":[97,103,161],"c":[]}],["p",{"w":"lookupprofile","s":"profile","e":true,"k":"p","d":[226,227],"c":[]}]]}],["s",{"w":"looks","s":"s","e":true,"k":"s","d":[221,515],"c":[]}]]}]]}],["t",{"w":"lot","s":"t","e":true,"k":"t","d":[68,229],"c":[["t",{"w":"lottery","s":"tery","e":true,"k":"t","d":[11,256,381,501,505,516],"c":[["p",{"w":"lotterypool","s":"pool","e":true,"k":"p","d":[516],"c":[]}],["t",{"w":"lotteryticket","s":"ticket","e":true,"k":"t","d":[516],"c":[]}]]}]]}],["a",{"w":"loa","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"loan","s":"n","e":true,"k":"n","d":[12,245,348],"c":[["s",{"w":"loans","s":"s","e":true,"k":"s","d":[12,245,348],"c":[]}],["-",{"w":"loan-interest-rate","s":"-interest-rate","e":true,"k":"-","d":[12,245,348],"c":[]}]]}],["d",{"w":"load","s":"d","e":true,"k":"d","d":[67],"c":[["u",{"w":"loaduserdata","s":"userdata","e":true,"k":"u","d":[67,226,227,240,355],"c":[]}],["i",{"w":"loading","s":"ing","e":true,"k":"i","d":[226,227],"c":[]}],["-",{"w":"load-balanced","s":"-balanced","e":true,"k":"-","d":[259],"c":[]}]]}]]}],["n",{"w":"long","s":"ng","e":true,"k":"n","d":[49,229],"c":[["e",{"w":"longer","s":"er","e":true,"k":"e","d":[52,79,101,135,182,188,229],"c":[]}],["-",{"w":"long-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"long-term","s":"term","e":true,"k":"t","d":[202],"c":[]}],["r",{"w":"long-running","s":"running","e":true,"k":"r","d":[355,356,366,376],"c":[]}]]}]]}],["w",{"w":"low","s":"w","e":true,"k":"w","d":[71],"c":[["-",{"w":"low-level","s":"-level","e":true,"k":"-","d":[76,113,130,145,174,187],"c":[]}],["e",{"w":"lower_than","s":"er_than","e":true,"k":"e","d":[372],"c":[]}]]}],["s",{"w":"los","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"losing","s":"ing","e":true,"k":"i","d":[112,516],"c":[]}],["s",{"w":"lossy","s":"sy","e":true,"k":"s","d":[351],"c":[]}],["e",{"w":"lose","s":"e","e":true,"k":"e","d":[351],"c":[]}]]}],["r",{"w":"lorem","s":"rem","e":true,"k":"r","d":[517],"c":[]}]]}],["i",{"w":"li","s":"i","e":false,"k":"i","d":[],"c":[["b",{"w":"lib","s":"b","e":true,"k":"b","d":[508],"c":[["r",{"w":"librar","s":"rar","e":false,"k":"r","d":[],"c":[["y",{"w":"library","s":"y","e":true,"k":"y","d":[2,8,18,44,45,64,203,204,225,226,227,234,235,244,347,349,350,365,368,369,382,383,384,385,386,387,514,517],"c":[]}],["i",{"w":"libraries","s":"ies","e":true,"k":"i","d":[44,75,228,232,239,350],"c":[]}]]}],["s",{"w":"libssl-dev","s":"ssl-dev","e":true,"k":"s","d":[18,517],"c":[]}]]}],["s",{"w":"list","s":"st","e":true,"k":"s","d":[6,7,8,25,27,46,47,48,52,53,67,69,82,95,96,105,109,110,126,149,177,180,182,183,208,219,222,226,229,234,255,352,356,360,361,366,368,373,427,511,513,515],"c":[["s",{"w":"lists","s":"s","e":true,"k":"s","d":[22,82,105,110,126,149,177,180,182,183,208,226,234,255,368,377],"c":[]}],["e",{"w":"liste","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"listen","s":"n","e":true,"k":"n","d":[55,68,515],"c":[["s",{"w":"listens","s":"s","e":true,"k":"s","d":[68,259],"c":[]}],["i",{"w":"listening","s":"ing","e":true,"k":"i","d":[68],"c":[]}],["o",{"w":"listenonion","s":"onion","e":true,"k":"o","d":[515],"c":[]}]]}],["d",{"w":"listed","s":"d","e":true,"k":"d","d":[515],"c":[]}]]}],["'",{"w":"list's","s":"'s","e":true,"k":"'","d":[149,180],"c":[]}],["-",{"w":"list-","s":"-","e":false,"k":"-","d":[],"c":[["b",{"w":"list-based","s":"based","e":true,"k":"b","d":[177],"c":[]}],["e",{"w":"list-expr","s":"expr","e":true,"k":"e","d":[180],"c":[]}],["a",{"w":"list-asset","s":"asset","e":true,"k":"a","d":[511,513],"c":[]}]]}],["c",{"w":"listcv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}],["i",{"w":"listing","s":"ing","e":true,"k":"i","d":[511,513],"c":[["s",{"w":"listings","s":"s","e":true,"k":"s","d":[511,513],"c":[]}],["-",{"w":"listing-","s":"-","e":false,"k":"-","d":[],"c":[["n",{"w":"listing-nonce","s":"nonce","e":true,"k":"n","d":[511,513],"c":[]}],["i",{"w":"listing-id","s":"id","e":true,"k":"i","d":[511,513],"c":[]}]]}],["'",{"w":"listing's","s":"'s","e":true,"k":"'","d":[511,513],"c":[]}]]}]]}],["k",{"w":"like","s":"ke","e":true,"k":"k","d":[7,9,11,16,19,27,28,50,51,68,69,71,77,80,90,96,97,103,113,119,122,124,127,128,130,136,139,146,149,160,173,177,188,192,196,201,202,221,223,226,230,256,355,357,361,374,375,376,379,381,501,505,510,514,515,517],"c":[["l",{"w":"likely","s":"ly","e":true,"k":"l","d":[108,229,258],"c":[]}]]}],["m",{"w":"limit","s":"mit","e":true,"k":"m","d":[9,22,49,50,52,125,178,202,255,356,366],"c":[["e",{"w":"limited","s":"ed","e":true,"k":"e","d":[22,163],"c":[]}],["s",{"w":"limits","s":"s","e":true,"k":"s","d":[22,27,65,114,125,126,149,154,176,191,374,376,439,462],"c":[]}],["i",{"w":"limiting","s":"ing","e":true,"k":"i","d":[49],"c":[]}],["a",{"w":"limitations","s":"ations","e":true,"k":"a","d":[91,104,149,182],"c":[]}]]}],["n",{"w":"lin","s":"n","e":false,"k":"n","d":[],"c":[["u",{"w":"linux","s":"ux","e":true,"k":"u","d":[380,510],"c":[["-",{"w":"linux-test-project","s":"-test-project","e":true,"k":"-","d":[9],"c":[]}]]}],["e",{"w":"line","s":"e","e":true,"k":"e","d":[18,26,50,244,517],"c":[["a",{"w":"linear","s":"ar","e":true,"k":"a","d":[102],"c":[]}],["s",{"w":"lines","s":"s","e":true,"k":"s","d":[374,376,517],"c":[]}]]}],["k",{"w":"link","s":"k","e":true,"k":"k","d":[45,72,73,74,353,425,443,508,517],"c":[["e",{"w":"linked","s":"ed","e":true,"k":"e","d":[28],"c":[]}],["s",{"w":"links","s":"s","e":true,"k":"s","d":[516],"c":[]}]]}]]}],["g",{"w":"light","s":"ght","e":false,"k":"g","d":[],"c":[["w",{"w":"lightweight","s":"weight","e":true,"k":"w","d":[44,422,502],"c":[]}],["e",{"w":"lighter","s":"er","e":true,"k":"e","d":[373],"c":[]}]]}],["f",{"w":"life","s":"fe","e":true,"k":"f","d":[45],"c":[["c",{"w":"lifecycle","s":"cycle","e":true,"k":"c","d":[92,100,135],"c":[]}]]}],["t",{"w":"lit","s":"t","e":false,"k":"t","d":[],"c":[["t",{"w":"little","s":"tle","e":true,"k":"t","d":[69],"c":[["-",{"w":"little-endian","s":"-endian","e":true,"k":"-","d":[87,133,142,158,179,188],"c":[]}]]}],["e",{"w":"literal","s":"eral","e":true,"k":"e","d":[126,229],"c":[["s",{"w":"literals","s":"s","e":true,"k":"s","d":[229],"c":[]}]]}]]}],["v",{"w":"live","s":"ve","e":true,"k":"v","d":[219,220,232],"c":[["s",{"w":"livestream","s":"stream","e":true,"k":"s","d":[73],"c":[]}]]}]]}],["e",{"w":"le","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"let","s":"t","e":true,"k":"t","d":[6,12,22,28,69,71,76,77,79,80,81,82,85,87,88,90,91,102,103,110,112,113,114,120,122,123,124,125,126,127,130,133,136,140,147,148,149,151,152,154,158,159,161,163,164,170,171,173,176,179,180,189,190,191,193,196,201,202,224,229,239,245,348,360,511,513,516],"c":[["'",{"w":"let's","s":"'s","e":true,"k":"'","d":[12,22,26,28,68,69,71,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,197,198,199,200,201,202,224,239,245,348,371],"c":[]}],["s",{"w":"lets","s":"s","e":true,"k":"s","d":[12,31,50,74,208,245,348,373,425,427,443,459,517],"c":[]}]]}],["n",{"w":"len","s":"n","e":true,"k":"n","d":[82,105,110,126,149,177,180,182,183,194],"c":[["g",{"w":"length","s":"gth","e":true,"k":"g","d":[7,22,82,87,88,91,105,110,120,126,133,149,158,177,179,180,182,183,188,194,226,234,239,255,361,368],"c":[["s",{"w":"lengths","s":"s","e":true,"k":"s","d":[110,126],"c":[]}],["p",{"w":"lengthprefixedstring","s":"prefixedstring","e":true,"k":"p","d":[229],"c":[["w",{"w":"lengthprefixedstringwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}]]}]]}],["v",{"w":"leve","s":"ve","e":false,"k":"v","d":[],"c":[["r",{"w":"leverag","s":"rag","e":false,"k":"r","d":[],"c":[["e",{"w":"leverage","s":"e","e":true,"k":"e","d":[18,31,45,49,70,74,86,108,425,427,443],"c":[["s",{"w":"leverages","s":"s","e":true,"k":"s","d":[8,11,256,381,501,505,511,513],"c":[]}]]}],["i",{"w":"leveraging","s":"ing","e":true,"k":"i","d":[108,117,201,516],"c":[]}]]}],["l",{"w":"level","s":"l","e":true,"k":"l","d":[71,122,130,145,152,160,174,187,377],"c":[]}]]}],["a",{"w":"lea","s":"a","e":false,"k":"a","d":[],"c":[["r",{"w":"learn","s":"rn","e":true,"k":"r","d":[8,9,11,12,22,26,27,30,47,50,52,53,73,219,224,230,231,232,234,235,236,241,243,245,246,256,348,352,353,354,357,368,369,370,374,376,377,378,379,381,423,501,502,504,505,509,510,511,513,515,516,517],"c":[["-",{"w":"learn-by-example","s":"-by-example","e":true,"k":"-","d":[11,256,381,501,505],"c":[]}],["i",{"w":"learning","s":"ing","e":true,"k":"i","d":[71],"c":[]}]]}],["v",{"w":"leav","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"leave","s":"e","e":true,"k":"e","d":[52,160],"c":[]}],["i",{"w":"leaving","s":"ing","e":true,"k":"i","d":[113],"c":[]}]]}],["s",{"w":"least","s":"st","e":true,"k":"s","d":[69,108,221],"c":[]}],["h",{"w":"leahjlou","s":"hjlou","e":true,"k":"h","d":[70],"c":[]}],["t",{"w":"leather","s":"ther","e":true,"k":"t","d":[71,351,356,366],"c":[]}],["d",{"w":"lead","s":"d","e":true,"k":"d","d":[86,87,100,108,112,122,129,133,158,161,177,179,192],"c":[["i",{"w":"leading","s":"ing","e":true,"k":"i","d":[82,83,84,85,89,93,94,98,101,103,105,106,107,109,110,111,116,117,118,121,123,124,129,131,132,135,136,138,139,141,142,143,144,146,147,148,150,151,152,153,155,157,158,159,162,165,166,167,168,169,170,171,172,173,175,178,179,180,181,182,183,184,185,186,189,192,194,195,196,197,198,199,200],"c":[]}],["e",{"w":"leader_registered","s":"er_registered","e":true,"k":"e","d":[371],"c":[]}]]}]]}],["s",{"w":"less","s":"ss","e":true,"k":"s","d":[22,71,106,107,114,145,154,176,180,191,227,231,236,370,372],"c":[]}],["f",{"w":"left","s":"ft","e":true,"k":"f","d":[87,96,133,174],"c":[["-",{"w":"left-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"left-p","s":"p","e":false,"k":"p","d":[],"c":[["a",{"w":"left-padding","s":"adding","e":true,"k":"a","d":[87,133],"c":[]}],["o",{"w":"left-position","s":"osition","e":true,"k":"o","d":[194],"c":[]}]]}],["s",{"w":"left-shifting","s":"shifting","e":true,"k":"s","d":[130,145,187],"c":[]}]]}]]}],["x",{"w":"lexicographical","s":"xicographical","e":true,"k":"x","d":[114,154,176,191],"c":[]}],["g",{"w":"leg","s":"g","e":false,"k":"g","d":[],"c":[["a",{"w":"legacy","s":"acy","e":true,"k":"a","d":[229,355,356,366],"c":[["_",{"w":"legacy_format'","s":"_format'","e":true,"k":"_","d":[302],"c":[]}]]}],["e",{"w":"legend","s":"end","e":true,"k":"e","d":[351],"c":[]}]]}]]}],["c",{"w":"lcov","s":"cov","e":true,"k":"c","d":[9],"c":[]}],["a",{"w":"la","s":"a","e":false,"k":"a","d":[],"c":[["u",{"w":"launch","s":"unch","e":true,"k":"u","d":[11,14,15,17,23,24,256,381,501,505],"c":[]}],["r",{"w":"large","s":"rge","e":true,"k":"r","d":[16,79,89,96,97,102,105,106,107,116,129,132,133,137,144,145,153,154,158,174,177,178,183,185,187,189,197,199,515,517],"c":[["r",{"w":"larger","s":"r","e":true,"k":"r","d":[12,87,102,113,133,154,158,179,191,245,348,516],"c":[]}],["s",{"w":"largest","s":"st","e":true,"k":"s","d":[106,107,258],"c":[]}]]}],["s",{"w":"last","s":"st","e":true,"k":"s","d":[12,52,73,163,171,241,245,348],"c":[["-",{"w":"last-interaction-block","s":"-interaction-block","e":true,"k":"-","d":[12,245,348],"c":[]}],["l",{"w":"lastly","s":"ly","e":true,"k":"l","d":[224,232,516],"c":[]}],["_",{"w":"last_","s":"_","e":false,"k":"_","d":[],"c":[["e",{"w":"last_executed_tx_nonce","s":"executed_tx_nonce","e":true,"k":"e","d":[258],"c":[]}],["m",{"w":"last_mempool_tx_nonce","s":"mempool_tx_nonce","e":true,"k":"m","d":[258],"c":[]}]]}]]}],["i",{"w":"laid","s":"id","e":true,"k":"i","d":[27,71],"c":[]}],["t",{"w":"late","s":"te","e":false,"k":"t","d":[],"c":[["r",{"w":"later","s":"r","e":true,"k":"r","d":[28,69,73,79,80,108,161],"c":[]}],["s",{"w":"latest","s":"st","e":true,"k":"s","d":[219,221,223,229,232,234,235,236,246,258,353,355,356,366,368,369,370,376,378,517],"c":[]}]]}],["y",{"w":"lay","s":"y","e":false,"k":"y","d":[],"c":[["o",{"w":"layout","s":"out","e":true,"k":"o","d":[29],"c":[]}],["e",{"w":"layer","s":"er","e":true,"k":"e","d":[68,231,351,356,366],"c":[["s",{"w":"layers","s":"s","e":true,"k":"s","d":[233,367],"c":[]}]]}]]}],["n",{"w":"language","s":"nguage","e":true,"k":"n","d":[517],"c":[["s",{"w":"languages","s":"s","e":true,"k":"s","d":[77,96,517],"c":[]}],["-",{"w":"language-switcher","s":"-switcher","e":true,"k":"-","d":[517],"c":[]}]]}],["b",{"w":"label-","s":"bel-","e":false,"k":"b","d":[],"c":[["0",{"w":"label-0","s":"0","e":true,"k":"0","d":[83],"c":[]}],["1",{"w":"label-1","s":"1","e":true,"k":"1","d":[83],"c":[]}]]}]]}],["u",{"w":"lucide-react","s":"ucide-react","e":true,"k":"u","d":[18,47,53],"c":[]}],["l",{"w":"llms","s":"lms","e":true,"k":"l","d":[70],"c":[]}],["2",{"w":"l231","s":"231","e":true,"k":"2","d":[226],"c":[]}]]}],["r",{"w":"r","s":"r","e":true,"k":"r","d":[502],"c":[["e",{"w":"re","s":"e","e":false,"k":"e","d":[],"c":[["l",{"w":"rel","s":"l","e":false,"k":"l","d":[],"c":[["a",{"w":"relat","s":"at","e":false,"k":"a","d":[],"c":[["e",{"w":"related","s":"ed","e":true,"k":"e","d":[2,8,18,31,45,52,54,74,78,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,203,204,208,225,228,347,349,350,355,371,373,377,399,422,425,427,443,459,502],"c":[]}],["i",{"w":"relati","s":"i","e":false,"k":"i","d":[],"c":[["v",{"w":"relative","s":"ve","e":true,"k":"v","d":[226,227,352],"c":[["l",{"w":"relatively","s":"ly","e":true,"k":"l","d":[14,17],"c":[]}]]}],["o",{"w":"relation","s":"on","e":false,"k":"o","d":[],"c":[["s",{"w":"relationships","s":"ships","e":true,"k":"s","d":[79,97],"c":[]}],["a",{"w":"relational","s":"al","e":true,"k":"a","d":[259],"c":[]}]]}]]}]]}],["e",{"w":"rele","s":"e","e":false,"k":"e","d":[],"c":[["a",{"w":"release","s":"ase","e":true,"k":"a","d":[14,202,233,234,235,236,355,367,368,369,370],"c":[["s",{"w":"releases","s":"s","e":true,"k":"s","d":[14,18,191,219,221,517],"c":[]}],["d",{"w":"released","s":"d","e":true,"k":"d","d":[69],"c":[]}],["-",{"w":"release-","s":"-","e":false,"k":"-","d":[],"c":[["h",{"w":"release-height","s":"height","e":true,"k":"h","d":[202],"c":[]}],["t",{"w":"release-tokens","s":"tokens","e":true,"k":"t","d":[202],"c":[]}]]}]]}],["v",{"w":"relevant","s":"vant","e":true,"k":"v","d":[27,68,73,219,222,259,376,377],"c":[]}]]}],["y",{"w":"rely","s":"y","e":true,"k":"y","d":[81,371],"c":[["i",{"w":"relying","s":"ing","e":true,"k":"i","d":[127,156,161,163,202,515],"c":[]}]]}],["i",{"w":"reli","s":"i","e":false,"k":"i","d":[],"c":[["a",{"w":"reliab","s":"ab","e":false,"k":"a","d":[],"c":[["i",{"w":"reliability","s":"ility","e":true,"k":"i","d":[82,83,84,85,89,91,94,98,101,105,106,107,109,110,111,117,118,121,124,131,132,135,136,138,139,141,142,143,146,147,148,150,151,153,155,157,159,162,165,166,167,168,169,170,171,172,175,181,184,185,186,189,194,195,197,198,199,200],"c":[]}],["l",{"w":"reliable","s":"le","e":true,"k":"l","d":[104,164,201,257,345,373,420,423,427,459],"c":[]}]]}],["e",{"w":"relies","s":"es","e":true,"k":"e","d":[100,221],"c":[]}]]}],["o",{"w":"reload","s":"oad","e":true,"k":"o","d":[355],"c":[["s",{"w":"reloads","s":"s","e":true,"k":"s","d":[352,357],"c":[]}],["i",{"w":"reloading","s":"ing","e":true,"k":"i","d":[355],"c":[]}]]}]]}],["i",{"w":"rein","s":"in","e":false,"k":"i","d":[],"c":[["v",{"w":"reinvent","s":"vent","e":true,"k":"v","d":[2,8,45,203,204,225,347,349],"c":[]}],["d",{"w":"reindexing","s":"dexing","e":true,"k":"d","d":[373,422,502],"c":[]}]]}],["a",{"w":"rea","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"reac","s":"c","e":false,"k":"c","d":[],"c":[["h",{"w":"reach","s":"h","e":true,"k":"h","d":[2,7,8,18,31,45,46,49,54,73,74,203,204,208,225,228,255,257,345,347,349,350,361,373,399,422,425,427,443,459,502],"c":[["e",{"w":"reache","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"reached","s":"d","e":true,"k":"d","d":[52],"c":[]}],["s",{"w":"reaches","s":"s","e":true,"k":"s","d":[221],"c":[]}]]}],["i",{"w":"reaching","s":"ing","e":true,"k":"i","d":[68],"c":[]}]]}],["t",{"w":"react","s":"t","e":true,"k":"t","d":[31,45,69,71,75,95,232,355],"c":[["j",{"w":"reactjs","s":"js","e":true,"k":"j","d":[68,75],"c":[]}],["-",{"w":"react-native-get-random-values","s":"-native-get-random-values","e":true,"k":"-","d":[232],"c":[]}]]}]]}],["d",{"w":"read","s":"d","e":true,"k":"d","d":[9,22,50,73,100,108,134,174,193,196,229,234,235,236,241,368,369,370,517],"c":[["-",{"w":"read-only","s":"-only","e":true,"k":"-","d":[7,8,12,25,27,30,55,69,71,90,99,105,107,121,129,134,139,146,155,161,165,172,173,185,195,197,224,226,234,245,348,361,368,399,511,513,514],"c":[]}],["_",{"w":"read_","s":"_","e":false,"k":"_","d":[],"c":[["o",{"w":"read_only","s":"only","e":true,"k":"o","d":[7,361],"c":[]}],["l",{"w":"read_length","s":"length","e":true,"k":"l","d":[9],"c":[]}],["c",{"w":"read_count","s":"count","e":true,"k":"c","d":[9],"c":[]}]]}],["y",{"w":"ready","s":"y","e":true,"k":"y","d":[12,19,47,50,53,58,68,78,224,245,348,375],"c":[]}],["i",{"w":"reading","s":"ing","e":true,"k":"i","d":[22,79],"c":[]}],["e",{"w":"readers","s":"ers","e":true,"k":"e","d":[72],"c":[]}],["m",{"w":"readme","s":"me","e":true,"k":"m","d":[73],"c":[]}],["a",{"w":"readab","s":"ab","e":false,"k":"a","d":[],"c":[["i",{"w":"readability","s":"ility","e":true,"k":"i","d":[76,82,83,84,85,88,89,91,92,93,94,96,98,100,101,103,105,106,107,108,109,110,111,113,116,117,118,120,121,124,128,129,130,131,132,135,136,138,139,141,142,143,146,147,148,150,151,153,155,157,159,162,163,165,166,167,168,169,170,171,172,173,175,181,183,184,185,186,187,189,194,195,196,197,198,199,200,201],"c":[]}],["l",{"w":"readable","s":"le","e":true,"k":"l","d":[103,185,229,511,513],"c":[["-",{"w":"readable-stream","s":"-stream","e":true,"k":"-","d":[232],"c":[]}]]}]]}],["f",{"w":"readfilesync","s":"filesync","e":true,"k":"f","d":[226,234,368],"c":[]}],["o",{"w":"readonly","s":"only","e":true,"k":"o","d":[234,368],"c":[["f",{"w":"readonlyfunction","s":"function","e":false,"k":"f","d":[],"c":[["c",{"w":"readonlyfunctioncallurl","s":"callurl","e":true,"k":"c","d":[227,236,370],"c":[]}],["s",{"w":"readonlyfunctionsuccessresponse","s":"successresponse","e":true,"k":"s","d":[514],"c":[]}],["a",{"w":"readonlyfunctionargs","s":"args","e":true,"k":"a","d":[514],"c":[]}]]}]]}],["s",{"w":"reads","s":"s","e":true,"k":"s","d":[371],"c":[]}]]}],["s",{"w":"reason","s":"son","e":true,"k":"s","d":[14,16,258],"c":[["s",{"w":"reasons","s":"s","e":true,"k":"s","d":[188,355],"c":[]}]]}],["l",{"w":"real","s":"l","e":true,"k":"l","d":[19,31,45,50,224,241],"c":[["i",{"w":"realistic","s":"istic","e":true,"k":"i","d":[19],"c":[]}],["-",{"w":"real-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"real-time","s":"time","e":true,"k":"t","d":[44,50,64,65,70,219,220,365,382,383,384,385,386,387],"c":[]}],["w",{"w":"real-world","s":"world","e":true,"k":"w","d":[49,71],"c":[]}]]}]]}]]}],["t",{"w":"ret","s":"t","e":false,"k":"t","d":[],"c":[["u",{"w":"return","s":"urn","e":true,"k":"u","d":[7,9,12,22,26,51,69,71,80,86,91,95,99,102,103,104,105,107,115,119,121,123,124,129,134,136,138,139,146,156,157,163,164,165,166,170,172,180,195,196,197,199,201,224,229,239,243,245,255,259,348,361,377,508,509,511,513,514,516,517],"c":[["s",{"w":"returns","s":"s","e":true,"k":"s","d":[5,7,9,30,69,76,79,82,83,84,85,86,87,89,90,91,93,94,95,96,97,98,101,103,104,105,106,107,108,109,110,111,113,114,116,117,118,121,123,124,125,126,127,128,130,131,132,133,135,136,138,139,141,142,143,144,145,146,147,148,149,150,151,153,154,155,156,157,158,159,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,186,188,189,190,191,193,194,195,197,198,199,200,202,221,224,229,230,246,353,355,356,359,361,366,516,517],"c":[]}],["e",{"w":"returned","s":"ed","e":true,"k":"e","d":[12,86,90,95,116,123,127,156,177,180,193,226,229,234,245,255,346,348,355,356,366,368,371,377,379],"c":[]}],["i",{"w":"returning","s":"ing","e":true,"k":"i","d":[82,85,86,96,99,102,121,137,148,151,159,163,164,168,171,176,178,180,191,193,199,201,233,367],"c":[]}],["-",{"w":"return-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"return-type","s":"type","e":true,"k":"t","d":[119],"c":[]}],["c",{"w":"return-contract-data-with-the-clarity-function","s":"contract-data-with-the-clarity-function","e":true,"k":"c","d":[377],"c":[]}]]}]]}],["r",{"w":"retr","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"retriev","s":"iev","e":false,"k":"i","d":[],"c":[["e",{"w":"retrieve","s":"e","e":true,"k":"e","d":[7,9,54,67,79,90,92,95,97,100,103,104,116,131,134,156,161,172,180,183,195,233,259,361,367,377,399,427,459,511,513,516],"c":[["d",{"w":"retrieved","s":"d","e":true,"k":"d","d":[9,67,90,95,172,202,516],"c":[]}],["s",{"w":"retrieves","s":"s","e":true,"k":"s","d":[67,69,79,83,85,89,90,101,103,109,131,132,135,151,167,172,175,180,186,189,195,202,226,227,427],"c":[]}]]}],["a",{"w":"retrieval","s":"al","e":true,"k":"a","d":[79,97,116,131,172,189],"c":[]}],["i",{"w":"retrieving","s":"ing","e":true,"k":"i","d":[79,90,95,97,104,127,131,172,180,195,201],"c":[]}]]}],["y",{"w":"retry_count","s":"y_count","e":true,"k":"y","d":[374],"c":[]}]]}],["a",{"w":"retaining","s":"aining","e":true,"k":"a","d":[516],"c":[]}]]}],["s",{"w":"res","s":"s","e":true,"k":"s","d":[68,233,367],"c":[["p",{"w":"resp","s":"p","e":false,"k":"p","d":[],"c":[["o",{"w":"respon","s":"on","e":false,"k":"o","d":[],"c":[["s",{"w":"respons","s":"s","e":false,"k":"s","d":[],"c":[["e",{"w":"response","s":"e","e":true,"k":"e","d":[5,6,7,12,21,51,52,58,65,67,68,69,85,86,90,94,99,101,109,115,119,121,123,124,129,135,136,141,143,148,150,151,152,159,162,163,164,166,170,178,184,186,200,201,224,226,227,230,234,236,237,245,255,346,348,352,353,354,356,357,359,360,361,366,368,370,377,439,462,514],"c":[["o",{"w":"responseok","s":"ok","e":true,"k":"o","d":[6,360],"c":[["c",{"w":"responseokcv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}]]}],["s",{"w":"responses","s":"s","e":true,"k":"s","d":[65,86,121,136,148,151,159,163,164,166,180,193,201,255,259,422,427,439,459,462,502],"c":[]}],["t",{"w":"responsetype","s":"type","e":true,"k":"t","d":[99],"c":[]}],["-",{"w":"response-input","s":"-input","e":true,"k":"-","d":[148,159],"c":[]}],["e",{"w":"responseerrorcv","s":"errorcv","e":true,"k":"e","d":[226,234,368],"c":[]}],["c",{"w":"responsecontext","s":"context","e":true,"k":"c","d":[227,236,370],"c":[]}]]}],["i",{"w":"responsi","s":"i","e":false,"k":"i","d":[],"c":[["b",{"w":"responsib","s":"b","e":false,"k":"b","d":[],"c":[["l",{"w":"responsibl","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"responsible","s":"e","e":true,"k":"e","d":[69,233,367],"c":[]}],["y",{"w":"responsibly","s":"y","e":true,"k":"y","d":[178],"c":[]}]]}],["i",{"w":"responsibility","s":"ility","e":true,"k":"i","d":[119],"c":[]}]]}],["v",{"w":"responsive","s":"ve","e":true,"k":"v","d":[149,196],"c":[]}]]}]]}],["d",{"w":"respond","s":"d","e":true,"k":"d","d":[14,15,17,68,202],"c":[["s",{"w":"responds","s":"s","e":true,"k":"s","d":[55],"c":[]}],["i",{"w":"responding","s":"ing","e":true,"k":"i","d":[230],"c":[]}]]}]]}],["e",{"w":"respective","s":"ective","e":true,"k":"e","d":[52],"c":[["l",{"w":"respectively","s":"ly","e":true,"k":"l","d":[69],"c":[]}]]}]]}],["u",{"w":"result","s":"ult","e":true,"k":"u","d":[6,7,9,12,26,58,68,96,106,107,114,121,125,133,137,144,154,155,158,161,165,170,171,174,176,177,178,182,185,187,191,192,196,197,199,224,226,234,245,246,258,259,348,360,361,368,374,375,376,377,514],"c":[["s",{"w":"results","s":"s","e":true,"k":"s","d":[9,12,22,87,95,108,112,113,124,128,130,133,136,139,140,146,156,158,173,179,187,190,230,245,255,259,348,351,353,356,366,373,376],"c":[]}],["i",{"w":"resulting","s":"ing","e":true,"k":"i","d":[82,83,84,85,87,88,89,93,94,98,101,105,106,107,109,110,111,117,118,120,121,124,131,132,133,135,136,138,139,141,142,143,146,147,148,150,151,153,155,157,158,159,162,165,166,167,168,169,170,171,172,175,177,179,181,182,184,185,186,189,194,195,197,198,199,200,377],"c":[]}],["e",{"w":"resulted","s":"ed","e":true,"k":"e","d":[124,229],"c":[]}]]}],["t",{"w":"rest","s":"t","e":true,"k":"t","d":[31,44,54,64,208,231,239,365,382,383,384,385,386,387,427,459],"c":[["o",{"w":"restor","s":"or","e":false,"k":"o","d":[],"c":[["e",{"w":"restore","s":"e","e":true,"k":"e","d":[14],"c":[]}],["i",{"w":"restoring","s":"ing","e":true,"k":"i","d":[14,15,17],"c":[]}],["a",{"w":"restoration","s":"ation","e":true,"k":"a","d":[14,15,17],"c":[]}]]}],["a",{"w":"restart","s":"art","e":true,"k":"a","d":[50,510,515],"c":[["i",{"w":"restarting","s":"ing","e":true,"k":"i","d":[515],"c":[]}]]}],["r",{"w":"restr","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"restrict","s":"ict","e":true,"k":"i","d":[90,178],"c":[["i",{"w":"restricting","s":"ing","e":true,"k":"i","d":[81,90,147],"c":[]}],["e",{"w":"restricted-function","s":"ed-function","e":true,"k":"e","d":[81],"c":[]}],["s",{"w":"restricts","s":"s","e":true,"k":"s","d":[147],"c":[]}]]}],["u",{"w":"restructure","s":"ucture","e":true,"k":"u","d":[351],"c":[]}]]}]]}],["o",{"w":"reso","s":"o","e":false,"k":"o","d":[],"c":[["u",{"w":"resource","s":"urce","e":true,"k":"u","d":[126],"c":[["s",{"w":"resources","s":"s","e":true,"k":"s","d":[44,70,72,73,112,192,346,422,466,502],"c":[]}],["-",{"w":"resource-efficient","s":"-efficient","e":true,"k":"-","d":[50],"c":[]}]]}],["l",{"w":"resolve","s":"lve","e":true,"k":"l","d":[232],"c":[["r",{"w":"resolver","s":"r","e":true,"k":"r","d":[232],"c":[]}]]}]]}],["e",{"w":"resembles","s":"embles","e":true,"k":"e","d":[58],"c":[]}],["i",{"w":"resi","s":"i","e":false,"k":"i","d":[],"c":[["s",{"w":"resistance","s":"stance","e":true,"k":"s","d":[188],"c":[]}],["d",{"w":"reside","s":"de","e":true,"k":"d","d":[226,227],"c":[["s",{"w":"resides","s":"s","e":true,"k":"s","d":[377],"c":[]}]]}]]}]]}],["p",{"w":"rep","s":"p","e":false,"k":"p","d":[],"c":[["r",{"w":"repr","s":"r","e":true,"k":"r","d":[51,517],"c":[["e",{"w":"repre","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"represent","s":"sent","e":true,"k":"s","d":[52,69,79,83,219,222,226,234,240,368,516],"c":[["s",{"w":"represents","s":"s","e":true,"k":"s","d":[5,69,81,87,124,133,136,138,157,158,179,192,224,226,227,359,377],"c":[]}],["e",{"w":"represented","s":"ed","e":true,"k":"e","d":[12,88,120,153,229,239,245,348],"c":[]}],["i",{"w":"representing","s":"ing","e":true,"k":"i","d":[12,52,95,104,126,127,145,156,160,161,174,180,226,227,234,245,348,356,366,368,371,377,516],"c":[]}],["a",{"w":"representation","s":"ation","e":true,"k":"a","d":[87,88,118,120,133,138,153,157,158,179,187,188,229,242,514],"c":[["s",{"w":"representations","s":"s","e":true,"k":"s","d":[76,80,88,113,120,138,157,185,229],"c":[]}]]}]]}],["n",{"w":"reprented","s":"nted","e":true,"k":"n","d":[185],"c":[]}]]}],["o",{"w":"reproducible","s":"oducible","e":true,"k":"o","d":[27],"c":[]}]]}],["o",{"w":"repo","s":"o","e":true,"k":"o","d":[12,72,224,230,245,259,348,380],"c":[["r",{"w":"report","s":"rt","e":true,"k":"r","d":[9,12,21,224,245,246,348,376],"c":[["s",{"w":"reports","s":"s","e":true,"k":"s","d":[12,70,224,245,348,377],"c":[]}],["i",{"w":"reporting","s":"ing","e":true,"k":"i","d":[164],"c":[]}]]}],["s",{"w":"repositor","s":"sitor","e":false,"k":"s","d":[],"c":[["y",{"w":"repository","s":"y","e":true,"k":"y","d":[47,69,71,75,374,424,504,509],"c":[]}],["i",{"w":"repositories","s":"ies","e":true,"k":"i","d":[47,53,75],"c":[]}]]}]]}],["l",{"w":"repl","s":"l","e":true,"k":"l","d":[23],"c":[["a",{"w":"repla","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"replac","s":"c","e":false,"k":"c","d":[],"c":[["e",{"w":"replace","s":"e","e":true,"k":"e","d":[12,58,180,224,245,348,355,376,514,517],"c":[["s",{"w":"replaces","s":"s","e":true,"k":"s","d":[104,109],"c":[]}],["-",{"w":"replace-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"replace-at","s":"at","e":true,"k":"a","d":[109],"c":[]}],["e",{"w":"replace-element","s":"element","e":true,"k":"e","d":[109],"c":[]}]]}],["m",{"w":"replacement","s":"ment","e":true,"k":"m","d":[109],"c":[]}],["d",{"w":"replaced","s":"d","e":true,"k":"d","d":[229,509],"c":[]}]]}],["i",{"w":"replacing","s":"ing","e":true,"k":"i","d":[109,377],"c":[]}]]}],["y",{"w":"replay","s":"y","e":true,"k":"y","d":[219,222],"c":[]}]]}]]}],["u",{"w":"reputation","s":"utation","e":true,"k":"u","d":[71],"c":[]}],["e",{"w":"repe","s":"e","e":false,"k":"e","d":[],"c":[["a",{"w":"repeated","s":"ated","e":true,"k":"a","d":[92],"c":[["l",{"w":"repeatedly","s":"ly","e":true,"k":"l","d":[149],"c":[]}]]}],["t",{"w":"repetitive","s":"titive","e":true,"k":"t","d":[105],"c":[]}]]}]]}],["c",{"w":"rec","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"reco","s":"o","e":false,"k":"o","d":[],"c":[["r",{"w":"record","s":"rd","e":true,"k":"r","d":[6,13,79,81,351,360,379],"c":[["e",{"w":"recorded","s":"ed","e":true,"k":"e","d":[12,245,348,516],"c":[]}],["s",{"w":"records","s":"s","e":true,"k":"s","d":[101,135,195,377],"c":[]}],["i",{"w":"recording","s":"ing","e":true,"k":"i","d":[184],"c":[]}]]}],["m",{"w":"recommend","s":"mmend","e":true,"k":"m","d":[14],"c":[["e",{"w":"recommended","s":"ed","e":true,"k":"e","d":[14,52,55,75,234,235,236,368,369,370,502],"c":[]}],["a",{"w":"recommendations","s":"ations","e":true,"k":"a","d":[22,70],"c":[]}]]}],["g",{"w":"recognize","s":"gnize","e":true,"k":"g","d":[20],"c":[]}],["v",{"w":"recover","s":"ver","e":true,"k":"v","d":[162],"c":[["e",{"w":"recovered","s":"ed","e":true,"k":"e","d":[79,115],"c":[]}],["s",{"w":"recovers","s":"s","e":true,"k":"s","d":[80,162,169],"c":[]}],["i",{"w":"recovering","s":"ing","e":true,"k":"i","d":[162],"c":[]}],["-",{"w":"recover-public-key","s":"-public-key","e":true,"k":"-","d":[162],"c":[]}],["y",{"w":"recovery","s":"y","e":true,"k":"y","d":[162],"c":[]}]]}]]}],["i",{"w":"recip","s":"ip","e":false,"k":"i","d":[],"c":[["i",{"w":"recipient","s":"ient","e":true,"k":"i","d":[7,12,25,27,69,71,81,86,101,102,122,123,124,125,129,136,140,147,150,152,160,164,166,178,184,186,190,192,193,196,224,226,227,230,232,233,234,235,236,237,242,243,245,348,353,356,357,361,366,367,368,369,370],"c":[["s",{"w":"recipients","s":"s","e":true,"k":"s","d":[69,178,226,234,356,366,368],"c":[["'",{"w":"recipients'","s":"'","e":true,"k":"'","d":[52],"c":[]}]]}],["b",{"w":"recipientbalance","s":"balance","e":true,"k":"b","d":[124,136,147,152,201],"c":[]}],["'",{"w":"recipient's","s":"'s","e":true,"k":"'","d":[371],"c":[]}]]}],["e",{"w":"recipe","s":"e","e":true,"k":"e","d":[72,73],"c":[["s",{"w":"recipes","s":"s","e":true,"k":"s","d":[72,73],"c":[]}]]}]]}],["e",{"w":"rece","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"recent","s":"nt","e":true,"k":"n","d":[14,15,17,95,156,161,514],"c":[]}],["i",{"w":"recei","s":"i","e":false,"k":"i","d":[],"c":[["v",{"w":"receiv","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"receive","s":"e","e":true,"k":"e","d":[31,49,51,69,71,112,178,192,233,367,376,377,515,516],"c":[["d",{"w":"received","s":"d","e":true,"k":"d","d":[68,95,374,376],"c":[]}]]}],["i",{"w":"receiving","s":"ing","e":true,"k":"i","d":[51,52,123,227,236,370,515],"c":[]}]]}],["p",{"w":"receipt","s":"pt","e":true,"k":"p","d":[68,238,377],"c":[["_",{"w":"receipt_time","s":"_time","e":true,"k":"_","d":[51,517],"c":[["_",{"w":"receipt_time_iso","s":"_iso","e":true,"k":"_","d":[51],"c":[]}]]}]]}]]}]]}],["a",{"w":"recall","s":"all","e":true,"k":"a","d":[27],"c":[]}],["r",{"w":"recreate","s":"reate","e":true,"k":"r","d":[71],"c":[]}],["u",{"w":"recursi","s":"ursi","e":false,"k":"u","d":[],"c":[["v",{"w":"recursive-like","s":"ve-like","e":true,"k":"v","d":[96],"c":[]}],["o",{"w":"recursion","s":"on","e":true,"k":"o","d":[96],"c":[]}]]}],["l",{"w":"reclaim","s":"laim","e":true,"k":"l","d":[233,367],"c":[["l",{"w":"reclaimlocktime","s":"locktime","e":true,"k":"l","d":[233,367],"c":[]}],["p",{"w":"reclaimpublickey","s":"publickey","e":true,"k":"p","d":[233,367],"c":[]}],["i",{"w":"reclaiming","s":"ing","e":true,"k":"i","d":[233,367],"c":[]}]]}]]}],["g",{"w":"reg","s":"g","e":false,"k":"g","d":[],"c":[["i",{"w":"regist","s":"ist","e":false,"k":"i","d":[],"c":[["e",{"w":"register","s":"er","e":true,"k":"e","d":[79,112,374,375,376],"c":[["-",{"w":"register-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"register-participant","s":"participant","e":true,"k":"p","d":[7,112,361],"c":[]}],["v",{"w":"register-voter","s":"voter","e":true,"k":"v","d":[79],"c":[]}],["u",{"w":"register-user","s":"user","e":true,"k":"u","d":[163],"c":[]}],["c",{"w":"register-chainhooks-on-devnet","s":"chainhooks-on-devnet","e":true,"k":"c","d":[373,374,376],"c":[]}]]}],["p",{"w":"registerparticipant","s":"participant","e":true,"k":"p","d":[7,361],"c":[]}],["e",{"w":"registered","s":"ed","e":true,"k":"e","d":[7,149,163,361,375],"c":[]}],["s",{"w":"registers","s":"s","e":true,"k":"s","d":[374,375,376],"c":[]}]]}],["r",{"w":"registration","s":"ration","e":true,"k":"r","d":[79,163,374,375,376],"c":[]}]]}],["t",{"w":"regtest","s":"test","e":true,"k":"t","d":[27,233,367],"c":[]}],["a",{"w":"regard","s":"ard","e":false,"k":"a","d":[],"c":[["l",{"w":"regardless","s":"less","e":true,"k":"l","d":[51,377],"c":[]}],["i",{"w":"regarding","s":"ing","e":true,"k":"i","d":[68],"c":[]}]]}],["u",{"w":"regular","s":"ular","e":true,"k":"u","d":[81,517],"c":[]}],["e",{"w":"regex","s":"ex","e":true,"k":"e","d":[372,517],"c":[]}]]}],["w",{"w":"reward","s":"ward","e":true,"k":"w","d":[71,123,127,156,178,202,516],"c":[["-",{"w":"reward-participant-points","s":"-participant-points","e":true,"k":"-","d":[7,361],"c":[]}],["p",{"w":"rewardparticipantpoints","s":"participantpoints","e":true,"k":"p","d":[7,361],"c":[]}],["i",{"w":"rewarding","s":"ing","e":true,"k":"i","d":[71,178],"c":[]}],["s",{"w":"rewards","s":"s","e":true,"k":"s","d":[77,127,156,178,283,286,516],"c":[["'",{"w":"rewards'","s":"'","e":true,"k":"'","d":[281],"c":[]}]]}],["r",{"w":"rewardrate","s":"rate","e":true,"k":"r","d":[77],"c":[]}],["t",{"w":"rewardtoken","s":"token","e":true,"k":"t","d":[178],"c":[]}],["c",{"w":"rewardcycle","s":"cycle","e":true,"k":"c","d":[223,514,516],"c":[]}],["_",{"w":"reward_","s":"_","e":false,"k":"_","d":[],"c":[["c",{"w":"reward_cycle_id","s":"cycle_id","e":true,"k":"c","d":[223],"c":[]}],["s",{"w":"reward_slot_holders","s":"slot_holders","e":true,"k":"s","d":[285],"c":[["'",{"w":"reward_slot_holders'","s":"'","e":true,"k":"'","d":[284],"c":[]}]]}]]}],["e",{"w":"rewarded","s":"ed","e":true,"k":"e","d":[516],"c":[]}]]}],["q",{"w":"req","s":"q","e":true,"k":"q","d":[68],"c":[["u",{"w":"requ","s":"u","e":false,"k":"u","d":[],"c":[["e",{"w":"request","s":"est","e":true,"k":"e","d":[49,54,58,65,67,68,69,90,226,227,236,346,351,352,353,354,355,356,357,366,370,374,376,427,439,462],"c":[["e",{"w":"requested","s":"ed","e":true,"k":"e","d":[7,12,68,226,227,245,348,361],"c":[]}],["s",{"w":"requests","s":"s","e":true,"k":"s","d":[49,50,58,65,67,68,69,221,226,227,244,259,352,427,439,459,462],"c":[]}],["i",{"w":"requestin","s":"in","e":false,"k":"i","d":[],"c":[["i",{"w":"requestinit","s":"it","e":true,"k":"i","d":[67],"c":[]}],["g",{"w":"requesting","s":"g","e":true,"k":"g","d":[68,226,227,346],"c":[]}]]}],["-",{"w":"request-extension-callback","s":"-extension-callback","e":true,"k":"-","d":[69,90],"c":[]}],["c",{"w":"requestcontext","s":"context","e":true,"k":"c","d":[227,236,370],"c":[]}],["r",{"w":"requestraw","s":"raw","e":true,"k":"r","d":[356,366],"c":[]}]]}],["i",{"w":"requir","s":"ir","e":false,"k":"i","d":[],"c":[["e",{"w":"require","s":"e","e":true,"k":"e","d":[68,87,88,90,96,107,120,133,134,149,158,179,180,188,192,197,229,231,232,379,514],"c":[["m",{"w":"requirement","s":"ment","e":true,"k":"m","d":[226,234,368],"c":[["s",{"w":"requirements","s":"s","e":true,"k":"s","d":[8,25,27,28,70,79,80,81,193,202,354,374,375,376,377,379,502,515],"c":[]}],["-",{"w":"requirement-publish","s":"-publish","e":true,"k":"-","d":[27],"c":[]}]]}],["s",{"w":"requires","s":"s","e":true,"k":"s","d":[8,10,24,47,49,85,93,98,109,117,118,131,138,142,143,148,150,151,153,157,159,166,168,175,184,194,198,226,234,243,346,368,374,375,376,379,511,513],"c":[]}],["d",{"w":"required","s":"d","e":true,"k":"d","d":[9,24,27,31,52,55,67,69,71,75,80,104,152,156,160,226,227,230,233,234,259,346,353,367,368,371,372,374,376,378,379,504],"c":[["-",{"w":"required-permission","s":"-permission","e":true,"k":"-","d":[76],"c":[]}]]}]]}],["i",{"w":"requiring","s":"ing","e":true,"k":"i","d":[81,108,182,231,356,366],"c":[]}]]}]]}]]}],["f",{"w":"ref","s":"f","e":false,"k":"f","d":[],"c":[["e",{"w":"refer","s":"er","e":true,"k":"e","d":[18,52,171,241,374,375,376,515],"c":[["e",{"w":"referenc","s":"enc","e":false,"k":"e","d":[],"c":[["e",{"w":"reference","s":"e","e":true,"k":"e","d":[8,9,12,17,27,44,46,68,69,71,90,95,156,202,219,221,222,224,230,233,234,235,236,243,245,246,348,352,356,366,367,368,369,370,375,466],"c":[["d",{"w":"referenced","s":"d","e":true,"k":"d","d":[79],"c":[["_",{"w":"referenced_traits","s":"_traits","e":true,"k":"_","d":[7,361],"c":[]}]]}],["s",{"w":"references","s":"s","e":true,"k":"s","d":[8,9,12,27,52,90,224,230,231,232,245,246,348,374,375,376,377,379],"c":[]}]]}],["i",{"w":"referencing","s":"ing","e":true,"k":"i","d":[92,355],"c":[]}]]}],["s",{"w":"refers","s":"s","e":true,"k":"s","d":[52,234,235,236,368,369,370],"c":[]}],["r",{"w":"referr","s":"r","e":false,"k":"r","d":[],"c":[["e",{"w":"referre","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"referred","s":"d","e":true,"k":"d","d":[55,259],"c":[]}],["r",{"w":"referrerpolicy","s":"rpolicy","e":true,"k":"r","d":[70,72],"c":[]}]]}],["i",{"w":"referring","s":"ing","e":true,"k":"i","d":[71,376],"c":[]}]]}]]}],["r",{"w":"refresh","s":"resh","e":true,"k":"r","d":[50],"c":[]}],["l",{"w":"reflect","s":"lect","e":true,"k":"l","d":[52,97],"c":[]}],["u",{"w":"refunds","s":"unds","e":true,"k":"u","d":[53],"c":[]}],["i",{"w":"refined","s":"ined","e":true,"k":"i","d":[177],"c":[]}],["a",{"w":"refactorings","s":"actorings","e":true,"k":"a","d":[229],"c":[]}]]}],["-",{"w":"re-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"re-attempt","s":"attempt","e":true,"k":"a","d":[16],"c":[]}],["m",{"w":"re-mapped","s":"mapped","e":true,"k":"m","d":[28],"c":[]}]]}],["d",{"w":"red","s":"d","e":true,"k":"d","d":[517],"c":[["e",{"w":"redeploying","s":"eploying","e":true,"k":"e","d":[27],"c":[]}],["i",{"w":"redi","s":"i","e":false,"k":"i","d":[],"c":[["r",{"w":"redirect","s":"rect","e":true,"k":"r","d":[67,226,227],"c":[["e",{"w":"redirected","s":"ed","e":true,"k":"e","d":[48],"c":[]}],["u",{"w":"redirecturi","s":"uri","e":true,"k":"u","d":[67,226,227],"c":[]}],["p",{"w":"redirectpath","s":"path","e":true,"k":"p","d":[226,227],"c":[]}]]}],["s",{"w":"redis","s":"s","e":true,"k":"s","d":[374,376],"c":[]}]]}],["u",{"w":"reduc","s":"uc","e":false,"k":"u","d":[],"c":[["i",{"w":"reducing","s":"ing","e":true,"k":"i","d":[76,103,123,135,143,160,180,229],"c":[]}],["e",{"w":"reduce","s":"e","e":true,"k":"e","d":[79,96,115,129,135,427,459],"c":[["s",{"w":"reduces","s":"s","e":true,"k":"s","d":[105,177],"c":[]}],["d",{"w":"reduced","s":"d","e":true,"k":"d","d":[199],"c":[]}]]}]]}]]}],["m",{"w":"rem","s":"m","e":false,"k":"m","d":[],"c":[["a",{"w":"rema","s":"a","e":false,"k":"a","d":[],"c":[["p",{"w":"remap","s":"p","e":true,"k":"p","d":[27],"c":[["-",{"w":"remap-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"remap-sender","s":"sender","e":true,"k":"s","d":[27],"c":[]}],["p",{"w":"remap-principals","s":"principals","e":true,"k":"p","d":[27],"c":[]}]]}],["s",{"w":"remaps","s":"s","e":true,"k":"s","d":[356,366],"c":[]}]]}],["i",{"w":"remain","s":"in","e":true,"k":"i","d":[28,92,190],"c":[["d",{"w":"remainder","s":"der","e":true,"k":"d","d":[197],"c":[["s",{"w":"remainders","s":"s","e":true,"k":"s","d":[77,197],"c":[]}]]}],["s",{"w":"remains","s":"s","e":true,"k":"s","d":[125],"c":[]}]]}]]}],["o",{"w":"remov","s":"ov","e":false,"k":"o","d":[],"c":[["e",{"w":"remove","s":"e","e":true,"k":"e","d":[48,89,97,113,135,177,199,355,511,513],"c":[["-",{"w":"remove-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"remove-permission","s":"permission","e":true,"k":"p","d":[76],"c":[]}],["r",{"w":"remove-role","s":"role","e":true,"k":"r","d":[113],"c":[]}]]}],["s",{"w":"removes","s":"s","e":true,"k":"s","d":[79,132,167,172],"c":[]}],["d",{"w":"removed","s":"d","e":true,"k":"d","d":[89,221,229,231,517],"c":[]}]]}],["a",{"w":"removal","s":"al","e":true,"k":"a","d":[69],"c":[]}],["i",{"w":"removing","s":"ing","e":true,"k":"i","d":[79,89,90,135,177,199],"c":[]}]]}],["e",{"w":"remember","s":"ember","e":true,"k":"e","d":[49,90,128,129,130,145,149,164,174,182,187,188,202],"c":[]}]]}],["v",{"w":"rev","s":"v","e":false,"k":"v","d":[],"c":[["i",{"w":"revi","s":"i","e":false,"k":"i","d":[],"c":[["s",{"w":"revisit","s":"sit","e":true,"k":"s","d":[68],"c":[]}],["e",{"w":"review","s":"ew","e":true,"k":"e","d":[72],"c":[]}]]}],["e",{"w":"reve","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"revenue","s":"nue","e":true,"k":"n","d":[71],"c":[]}],["r",{"w":"rever","s":"r","e":false,"k":"r","d":[],"c":[["t",{"w":"revert","s":"t","e":true,"k":"t","d":[164,517],"c":[["e",{"w":"reverted","s":"ed","e":true,"k":"e","d":[164],"c":[]}]]}],["s",{"w":"reversible","s":"sible","e":true,"k":"s","d":[188],"c":[]}]]}],["a",{"w":"reveal","s":"al","e":true,"k":"a","d":[371],"c":[]}]]}],["o",{"w":"revo","s":"o","e":false,"k":"o","d":[],"c":[["k",{"w":"revoke-permission","s":"ke-permission","e":true,"k":"k","d":[130],"c":[]}],["l",{"w":"revolves","s":"lves","e":true,"k":"l","d":[379],"c":[]}]]}]]}],["u",{"w":"reus","s":"us","e":false,"k":"u","d":[],"c":[["a",{"w":"reusab","s":"ab","e":false,"k":"a","d":[],"c":[["l",{"w":"reusable","s":"le","e":true,"k":"l","d":[72,90,177],"c":[]}],["i",{"w":"reusability","s":"ility","e":true,"k":"i","d":[117,129],"c":[]}]]}],["e",{"w":"reuse","s":"e","e":true,"k":"e","d":[86,152],"c":[["d",{"w":"reused","s":"d","e":true,"k":"d","d":[92],"c":[]}]]}]]}],["o",{"w":"reorg","s":"org","e":false,"k":"o","d":[],"c":[["a",{"w":"reorganizations","s":"anizations","e":true,"k":"a","d":[95,156,161],"c":[]}],["-",{"w":"reorg-aware","s":"-aware","e":true,"k":"-","d":[373,422,502],"c":[]}]]}],["n",{"w":"ren","s":"n","e":false,"k":"n","d":[],"c":[["a",{"w":"renam","s":"am","e":false,"k":"a","d":[],"c":[["e",{"w":"renamed","s":"ed","e":true,"k":"e","d":[229],"c":[]}],["i",{"w":"renaming","s":"ing","e":true,"k":"i","d":[229],"c":[]}]]}],["d",{"w":"render","s":"der","e":false,"k":"d","d":[],"c":[["e",{"w":"rendered","s":"ed","e":true,"k":"e","d":[517],"c":[]}],["s",{"w":"renders","s":"s","e":true,"k":"s","d":[517],"c":[]}]]}]]}]]}],["a",{"w":"ra","s":"a","e":false,"k":"a","d":[],"c":[["t",{"w":"rat","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"rate","s":"e","e":true,"k":"e","d":[12,49,65,71,77,102,208,233,245,348,367,439,462],"c":[["l",{"w":"ratelimitingcontent","s":"limitingcontent","e":true,"k":"l","d":[3,421,507],"c":[]}],["-",{"w":"rate-limit","s":"-limit","e":false,"k":"-","d":[],"c":[["i",{"w":"rate-limiting","s":"ing","e":true,"k":"i","d":[3,49,421,507],"c":[]}],["e",{"w":"rate-limited","s":"ed","e":true,"k":"e","d":[227,236,370],"c":[]}]]}],["s",{"w":"rates","s":"s","e":true,"k":"s","d":[77,102,112],"c":[]}]]}],["h",{"w":"rather","s":"her","e":true,"k":"h","d":[202],"c":[]}]]}],["p",{"w":"rapid","s":"pid","e":true,"k":"p","d":[8,45,50],"c":[["l",{"w":"rapidly","s":"ly","e":true,"k":"l","d":[18,422,427,459,502],"c":[]}]]}],["n",{"w":"ran","s":"n","e":true,"k":"n","d":[9,52],"c":[["g",{"w":"range","s":"ge","e":true,"k":"g","d":[69,71,88,93,110,120,123,128,130,133,153,156,158,187,354,371,372,517],"c":[["s",{"w":"ranges","s":"s","e":true,"k":"s","d":[102,112,114,137,140,154,176,185,191,372],"c":[]}]]}],["d",{"w":"random","s":"dom","e":true,"k":"d","d":[226,234,239,368,516],"c":[["n",{"w":"randomness-based","s":"ness-based","e":true,"k":"n","d":[127],"c":[]}],["p",{"w":"randomprivatekey","s":"privatekey","e":true,"k":"p","d":[229,234,237,239,368],"c":[]}],["s",{"w":"randomseedphrase","s":"seedphrase","e":true,"k":"s","d":[229,239,240],"c":[]}],["l",{"w":"randomly","s":"ly","e":true,"k":"l","d":[516],"c":[]}],["t",{"w":"randomticketnumber","s":"ticketnumber","e":true,"k":"t","d":[516],"c":[]}]]}]]}],["w",{"w":"raw","s":"w","e":true,"k":"w","d":[14,68,219,222,226,229,234,239,353,356,366,368],"c":[["'",{"w":"raw'","s":"'","e":true,"k":"'","d":[315],"c":[]}]]}],["i",{"w":"rai","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"rainbow","s":"nbow","e":true,"k":"n","d":[80],"c":[]}],["s",{"w":"rais","s":"s","e":false,"k":"s","d":[],"c":[["e",{"w":"raise","s":"e","e":true,"k":"e","d":[185],"c":[["s",{"w":"raises","s":"s","e":true,"k":"s","d":[107],"c":[]}]]}],["i",{"w":"raising","s":"ing","e":true,"k":"i","d":[185],"c":[]}]]}]]}],["m",{"w":"ram","s":"m","e":true,"k":"m","d":[502],"c":[]}]]}],["i",{"w":"ri","s":"i","e":false,"k":"i","d":[],"c":[["g",{"w":"right","s":"ght","e":true,"k":"g","d":[6,28,46,48,52,53,68,81,96,145,158,179,221,360],"c":[["s",{"w":"rights","s":"s","e":true,"k":"s","d":[69],"c":[]}],["-",{"w":"right-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"right-shifting","s":"shifting","e":true,"k":"s","d":[128,130,145,174,187],"c":[]}],["p",{"w":"right-p","s":"p","e":false,"k":"p","d":[],"c":[["a",{"w":"right-padding","s":"adding","e":true,"k":"a","d":[158,179],"c":[]}],["o",{"w":"right-position","s":"osition","e":true,"k":"o","d":[194],"c":[]}]]}]]}]]}],["c",{"w":"rich","s":"ch","e":true,"k":"c","d":[47],"c":[["e",{"w":"richer","s":"er","e":true,"k":"e","d":[208,399],"c":[]}]]}],["s",{"w":"risk","s":"sk","e":true,"k":"s","d":[516],"c":[["-",{"w":"risk-free","s":"-free","e":true,"k":"-","d":[50],"c":[]}],["i",{"w":"risking","s":"ing","e":true,"k":"i","d":[134,180],"c":[]}],["s",{"w":"risks","s":"s","e":true,"k":"s","d":[174,192],"c":[]}]]}],["p",{"w":"ripemd","s":"pemd","e":false,"k":"p","d":[],"c":[["-",{"w":"ripemd-160","s":"-160","e":true,"k":"-","d":[91,162,169],"c":[]}],["1",{"w":"ripemd160","s":"160","e":true,"k":"1","d":[188],"c":[]}]]}]]}],["u",{"w":"ru","s":"u","e":false,"k":"u","d":[],"c":[["n",{"w":"run","s":"n","e":true,"k":"n","d":[9,11,12,18,20,22,27,28,30,50,52,68,69,71,74,75,221,224,232,239,245,246,256,259,348,374,375,376,377,378,380,381,423,425,426,427,443,444,459,501,504,505,509,510,515,517],"c":[["s",{"w":"runs","s":"s","e":true,"k":"s","d":[219,221],"c":[["n",{"w":"runsnippet","s":"nippet","e":true,"k":"n","d":[7,361],"c":[]}]]}],["n",{"w":"running","s":"ning","e":true,"k":"n","d":[7,8,9,11,12,14,15,19,24,47,49,53,68,71,75,219,222,245,256,348,361,374,375,376,378,381,426,444,501,502,505,509,510,515],"c":[["-",{"w":"running-the-predicate","s":"-the-predicate","e":true,"k":"-","d":[377],"c":[]}]]}],["t",{"w":"runtime","s":"time","e":true,"k":"t","d":[9,22,77,85,93,106,112,114,116,117,118,131,148,151,154,159,166,170,172,175,176,180,185,189,191,195,197,232],"c":[]}],["-",{"w":"run-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"run-tests-and-generate-coverage-reports","s":"tests-and-generate-coverage-reports","e":true,"k":"t","d":[12,224,245,348],"c":[]}],["a",{"w":"run-a-local-devnet","s":"a-local-devnet","e":true,"k":"a","d":[18,27,30,71,241],"c":[]}],["y",{"w":"run-your-tests-with-code-coverage-and-cost-analysis","s":"your-tests-with-code-coverage-and-cost-analysis","e":true,"k":"y","d":[22],"c":[]}]]}],["e",{"w":"rune","s":"e","e":true,"k":"e","d":[422,423,427],"c":[["s",{"w":"runes","s":"s","e":true,"k":"s","d":[420,422,423,427,429,430,432,433,435,436,437,438,441,442,466,469,470,472,473,475,476,477,478,480,481,504],"c":[["h",{"w":"runeshook","s":"hook","e":true,"k":"h","d":[427],"c":[]}],["-",{"w":"runes-api","s":"-api","e":true,"k":"-","d":[429,430,432,433,435,436,437,438,441,442,469,470,472,473,475,476,477,478,480,481],"c":[]}]]}],["h",{"w":"runehook","s":"hook","e":true,"k":"h","d":[422,423,424,427],"c":[["-",{"w":"runehook-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"runehook-as-a-service","s":"as-a-service","e":true,"k":"a","d":[423,427],"c":[]}],["i",{"w":"runehook-install","s":"install","e":true,"k":"i","d":[424],"c":[]}]]}]]}]]}]]}],["l",{"w":"rules","s":"les","e":true,"k":"l","d":[70,73,81],"c":[]}]]}],["o",{"w":"ro","s":"o","e":false,"k":"o","d":[],"c":[["o",{"w":"roo","s":"o","e":true,"k":"o","d":[101,135,186,195],"c":[["t",{"w":"root","s":"t","e":true,"k":"t","d":[9,67,106,107,226,227,234,235,236,246,356,366,368,369,370,371,372,375,380],"c":[["s",{"w":"roots","s":"s","e":true,"k":"s","d":[106],"c":[]}]]}]]}],["c",{"w":"rocket","s":"cket","e":true,"k":"c","d":[44],"c":[]}],["u",{"w":"rou","s":"u","e":false,"k":"u","d":[],"c":[["n",{"w":"round","s":"nd","e":true,"k":"n","d":[69],"c":[["e",{"w":"rounded","s":"ed","e":true,"k":"e","d":[112],"c":[["-",{"w":"rounded-","s":"-","e":false,"k":"-","d":[],"c":[["x",{"w":"rounded-xl","s":"xl","e":true,"k":"x","d":[44,259,466,508],"c":[]}],["l",{"w":"rounded-lg","s":"lg","e":true,"k":"l","d":[352],"c":[]}]]}]]}],["i",{"w":"rounding","s":"ing","e":true,"k":"i","d":[107,112],"c":[]}]]}],["t",{"w":"rout","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"route","s":"e","e":true,"k":"e","d":[68],"c":[["r",{"w":"router","s":"r","e":true,"k":"r","d":[90],"c":[]}],["s",{"w":"routes","s":"s","e":true,"k":"s","d":[259],"c":[]}]]}],["i",{"w":"routing","s":"ing","e":true,"k":"i","d":[90],"c":[]}]]}]]}],["b",{"w":"robust","s":"bust","e":true,"k":"b","d":[64,68,77,80,81,82,83,84,85,91,93,94,98,101,103,104,106,107,109,110,111,114,117,118,121,124,126,131,135,136,138,139,141,142,143,144,146,147,148,150,151,152,153,154,155,157,159,162,164,165,166,168,169,175,176,180,181,184,185,186,190,191,192,193,194,197,198,200,201,365,376,382,383,384,385,386,387],"c":[]}],["l",{"w":"rol","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"role","s":"e","e":true,"k":"e","d":[113,173],"c":[["-",{"w":"role-based","s":"-based","e":true,"k":"-","d":[81,113],"c":[]}],["s",{"w":"roles","s":"s","e":true,"k":"s","d":[81,113],"c":[]}],["_",{"w":"role_","s":"_","e":false,"k":"_","d":[],"c":[["a",{"w":"role_admin","s":"admin","e":true,"k":"a","d":[113],"c":[]}],["m",{"w":"role_moderator","s":"moderator","e":true,"k":"m","d":[113],"c":[]}],["u",{"w":"role_user","s":"user","e":true,"k":"u","d":[113],"c":[]}]]}]]}],["l",{"w":"roll","s":"l","e":false,"k":"l","d":[],"c":[["b",{"w":"rollback","s":"back","e":true,"k":"b","d":[164,377],"c":[]}],["e",{"w":"rolled","s":"ed","e":true,"k":"e","d":[164],"c":[]}],["-",{"w":"roll-the-dice","s":"-the-dice","e":true,"k":"-","d":[516],"c":[]}]]}]]}],["t",{"w":"rotating","s":"tating","e":true,"k":"t","d":[233,367],"c":[]}],["s",{"w":"rosetta","s":"setta","e":true,"k":"s","d":[259],"c":[["-",{"w":"rosetta-api","s":"-api","e":true,"k":"-","d":[259],"c":[]}]]}]]}],["p",{"w":"rpc","s":"pc","e":true,"k":"p","d":[208,257,259,345,355,399],"c":[["-",{"w":"rpc-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"rpc-api","s":"api","e":true,"k":"a","d":[22,208,257,345,399],"c":[]}],["e",{"w":"rpc-endpoints","s":"endpoints","e":true,"k":"e","d":[259],"c":[]}]]}],["_",{"w":"rpc_","s":"_","e":false,"k":"_","d":[],"c":[["b",{"w":"rpc_bind","s":"bind","e":true,"k":"b","d":[374],"c":[]}],["p",{"w":"rpc_port","s":"port","e":true,"k":"p","d":[374],"c":[]}]]}],["u",{"w":"rpcuser","s":"user","e":true,"k":"u","d":[374,376,515],"c":[]}],["p",{"w":"rpcp","s":"p","e":false,"k":"p","d":[],"c":[["a",{"w":"rpcpassword","s":"assword","e":true,"k":"a","d":[374,376,515],"c":[]}],["o",{"w":"rpcport","s":"ort","e":true,"k":"o","d":[374,376,515],"c":[]}]]}],["a",{"w":"rpcallowip","s":"allowip","e":true,"k":"a","d":[515],"c":[]}],["s",{"w":"rpcserialversion","s":"serialversion","e":true,"k":"s","d":[515],"c":[]}],["t",{"w":"rpcthreads","s":"threads","e":true,"k":"t","d":[515],"c":[]}]]}],["y",{"w":"ryan","s":"yan","e":true,"k":"y","d":[97],"c":[]}]]}],["t",{"w":"t","s":"t","e":true,"k":"t","d":[2,8,45,99,144,166,203,204,225,226,234,347,349,368,373,422,517],"c":[["o",{"w":"to","s":"o","e":true,"k":"o","d":[2,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,26,27,28,29,30,31,44,45,46,47,48,49,50,51,52,53,54,55,58,64,65,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,208,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,255,256,257,258,259,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,361,362,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,399,420,422,423,424,425,426,427,439,443,444,459,462,466,501,502,504,505,509,510,511,513,514,515,516,517],"c":[["o",{"w":"too","s":"o","e":true,"k":"o","d":[99,133,158,517],"c":[["l",{"w":"tool","s":"l","e":true,"k":"l","d":[44,70,73,82,83,84,85,87,88,89,90,91,92,93,94,95,96,97,98,101,102,103,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200],"c":[["s",{"w":"tools","s":"s","e":true,"k":"s","d":[2,8,9,11,12,18,31,44,45,46,54,68,73,74,76,79,80,81,201,202,203,204,208,219,225,228,239,245,256,257,345,347,348,349,350,352,373,381,399,422,425,427,443,459,466,501,502,505],"c":[]}],["t",{"w":"tooltip","s":"tip","e":true,"k":"t","d":[18,27,371,377,517],"c":[["c",{"w":"tooltipcontent","s":"content","e":true,"k":"c","d":[18,27,371,377],"c":[]}],["p",{"w":"tooltipprovider","s":"provider","e":true,"k":"p","d":[18,27,371,377],"c":[]}],["t",{"w":"tooltiptrigger","s":"trigger","e":true,"k":"t","d":[18,27,371,377],"c":[]}],["s",{"w":"tooltips","s":"s","e":true,"k":"s","d":[517],"c":[]}]]}],["i",{"w":"tooling","s":"ing","e":true,"k":"i","d":[219],"c":[]}]]}],["_",{"w":"too_big","s":"_big","e":true,"k":"_","d":[6,360,517],"c":[]}],["k",{"w":"took","s":"k","e":true,"k":"k","d":[28,71],"c":[]}]]}],["m",{"w":"toml","s":"ml","e":true,"k":"m","d":[4,9,17,20,21,27,29,30,47,50,221,358,362,374,375,376,504],"c":[["'",{"w":"toml'","s":"'","e":true,"k":"'","d":[4,358,362],"c":[]}]]}],["h",{"w":"tohave","s":"have","e":false,"k":"h","d":[],"c":[["c",{"w":"tohaveclaritytype","s":"claritytype","e":true,"k":"c","d":[6,360],"c":[]}],["l",{"w":"tohavelength","s":"length","e":true,"k":"l","d":[246],"c":[]}]]}],["b",{"w":"tobe","s":"be","e":true,"k":"b","d":[246],"c":[["o",{"w":"tobeok","s":"ok","e":true,"k":"o","d":[6,9,12,224,245,246,348,360],"c":[]}],["e",{"w":"tobeerr","s":"err","e":true,"k":"e","d":[6,360],"c":[]}],["s",{"w":"tobesome","s":"some","e":true,"k":"s","d":[6,360],"c":[]}],["n",{"w":"tobenone","s":"none","e":true,"k":"n","d":[6,360],"c":[]}],["b",{"w":"tobeb","s":"b","e":false,"k":"b","d":[],"c":[["o",{"w":"tobebool","s":"ool","e":true,"k":"o","d":[6,360],"c":[]}],["u",{"w":"tobebuff","s":"uff","e":true,"k":"u","d":[6,360],"c":[]}]]}],["i",{"w":"tobeint","s":"int","e":true,"k":"i","d":[6,360],"c":[]}],["u",{"w":"tobeu","s":"u","e":false,"k":"u","d":[],"c":[["i",{"w":"tobeuint","s":"int","e":true,"k":"i","d":[6,9,12,224,245,246,348,360],"c":[]}],["t",{"w":"tobeutf8","s":"tf8","e":true,"k":"t","d":[6,360],"c":[]}]]}],["a",{"w":"tobeascii","s":"ascii","e":true,"k":"a","d":[6,360],"c":[]}],["p",{"w":"tobeprincipal","s":"principal","e":true,"k":"p","d":[6,360],"c":[]}],["l",{"w":"tobelist","s":"list","e":true,"k":"l","d":[6,360],"c":[]}],["t",{"w":"tobetuple","s":"tuple","e":true,"k":"t","d":[6,246,360],"c":[]}],["d",{"w":"tobedefined","s":"defined","e":true,"k":"d","d":[9],"c":[]}]]}],["k",{"w":"token","s":"ken","e":true,"k":"k","d":[7,13,15,28,31,44,49,54,55,68,69,71,77,86,92,101,102,112,115,119,122,123,124,125,134,135,136,152,154,160,164,176,178,185,186,190,191,192,193,195,196,201,202,208,226,227,229,230,231,234,237,238,243,340,354,357,361,368,372,399,425,443,511,513],"c":[["s",{"w":"tokens","s":"s","e":true,"k":"s","d":[7,15,27,28,49,54,58,65,68,69,74,77,81,86,92,95,101,102,112,115,122,123,125,135,140,154,160,176,178,185,186,190,191,192,193,195,196,201,230,237,238,241,243,340,342,343,344,353,355,356,361,366,420,422,423,439,447,450,459,462,484,487,502,511,513],"c":[["a",{"w":"tokensapi","s":"api","e":true,"k":"a","d":[58],"c":[]}],["y",{"w":"tokensymbol","s":"ymbol","e":true,"k":"y","d":[69],"c":[]}],["p",{"w":"tokensperparticipant","s":"perparticipant","e":true,"k":"p","d":[112],"c":[]}],["s",{"w":"tokenssold","s":"sold","e":true,"k":"s","d":[154],"c":[]}],["t",{"w":"tokenstomint","s":"tomint","e":true,"k":"t","d":[154],"c":[]}],["c",{"w":"tokensclaimed","s":"claimed","e":true,"k":"c","d":[176],"c":[]}],["'",{"w":"tokens'","s":"'","e":true,"k":"'","d":[451,488],"c":[]}]]}],["b",{"w":"tokenbalance","s":"balance","e":true,"k":"b","d":[7,361],"c":[]}],["-",{"w":"token-","s":"-","e":false,"k":"-","d":[],"c":[["m",{"w":"token-metadata-api","s":"metadata-api","e":true,"k":"m","d":[13,31,44,54,55,57,58,60,61,62,63,208,249,251,252,253,254,399],"c":[["-",{"w":"token-metadata-api-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"token-metadata-api-pg","s":"pg","e":true,"k":"p","d":[15],"c":[["-",{"w":"token-metadata-api-pg-","s":"-","e":true,"k":"-","d":[15],"c":[]}]]}],["c",{"w":"token-metadata-api-client","s":"client","e":true,"k":"c","d":[58],"c":[]}]]}]]}],["c",{"w":"token-contract","s":"contract","e":true,"k":"c","d":[86],"c":[]}],["n",{"w":"token-n","s":"n","e":false,"k":"n","d":[],"c":[["a",{"w":"token-name","s":"ame","e":true,"k":"a","d":[115,123,125,160,178,190],"c":[]}],["f",{"w":"token-nft","s":"ft","e":true,"k":"f","d":[231],"c":[]}]]}],["t",{"w":"token-trait","s":"trait","e":true,"k":"t","d":[117,119,152],"c":[]}],["b",{"w":"token-ba","s":"ba","e":false,"k":"b","d":[],"c":[["s",{"w":"token-based","s":"sed","e":true,"k":"s","d":[122,123,160,190],"c":[]}],["l",{"w":"token-balances","s":"lances","e":true,"k":"l","d":[202],"c":[]}]]}],["r",{"w":"token-related","s":"related","e":true,"k":"r","d":[160],"c":[]}],["f",{"w":"token-ft'","s":"ft'","e":true,"k":"f","d":[231],"c":[]}],["i",{"w":"token-id","s":"id","e":true,"k":"i","d":[231,511,513],"c":[]}],["g",{"w":"token-gated","s":"gated","e":true,"k":"g","d":[354],"c":[]}]]}],["_",{"w":"token_","s":"_","e":false,"k":"_","d":[],"c":[["m",{"w":"token_metadata_api","s":"metadata_api","e":true,"k":"m","d":[15],"c":[]}],["c",{"w":"token_contracts","s":"contracts","e":true,"k":"c","d":[58],"c":[]}],["i",{"w":"token_id","s":"id","e":true,"k":"i","d":[61,63,252,254],"c":[]}],["n",{"w":"token_name","s":"name","e":true,"k":"n","d":[92],"c":[]}],["s",{"w":"token_s","s":"s","e":false,"k":"s","d":[],"c":[["y",{"w":"token_symbol","s":"ymbol","e":true,"k":"y","d":[92],"c":[]}],["u",{"w":"token_supply","s":"upply","e":true,"k":"u","d":[92],"c":[]}]]}],["d",{"w":"token_decimals","s":"decimals","e":true,"k":"d","d":[92],"c":[]}],["p",{"w":"token_price","s":"price","e":true,"k":"p","d":[154],"c":[]}]]}],["n",{"w":"tokenname","s":"name","e":true,"k":"n","d":[69,231],"c":[]}],["u",{"w":"tokenuri","s":"uri","e":true,"k":"u","d":[69],"c":[]}],["d",{"w":"tokendecimals","s":"decimals","e":true,"k":"d","d":[69],"c":[]}],["'",{"w":"token'","s":"'","e":true,"k":"'","d":[231],"c":[["s",{"w":"token's","s":"s","e":true,"k":"s","d":[69,125],"c":[]}]]}],["o",{"w":"tokenomics","s":"omics","e":true,"k":"o","d":[115],"c":[]}],["a",{"w":"tokenadmin","s":"admin","e":true,"k":"a","d":[115,160],"c":[]}],["i",{"w":"tokenid","s":"id","e":true,"k":"i","d":[122],"c":[]}],["t",{"w":"tokentransferpayload","s":"transferpayload","e":true,"k":"t","d":[229],"c":[["w",{"w":"tokentransferpayloadwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}]]}],["p",{"w":"top","s":"p","e":true,"k":"p","d":[46,48,53,68,73,92,122,152,160,375],"c":[["_",{"w":"top_level_expression_sorting","s":"_level_expression_sorting","e":true,"k":"_","d":[7,361],"c":[]}],["i",{"w":"topic","s":"ic","e":true,"k":"i","d":[223,377],"c":[]}],["s",{"w":"topsbt","s":"sbt","e":true,"k":"s","d":[233,367],"c":[]}]]}],["t",{"w":"total","s":"tal","e":true,"k":"t","d":[9,12,15,69,71,77,102,115,123,125,127,154,156,160,178,185,190,191,202,224,245,255,300,348,516],"c":[["-",{"w":"total-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"total-d","s":"d","e":false,"k":"d","d":[],"c":[["e",{"w":"total-deposits","s":"eposits","e":true,"k":"e","d":[12,224,245,348],"c":[]}],["u",{"w":"total-due","s":"ue","e":true,"k":"u","d":[12,245,348],"c":[]}]]}],["s",{"w":"total-supply","s":"supply","e":true,"k":"s","d":[160],"c":[]}]]}],["d",{"w":"totaldeposits","s":"deposits","e":true,"k":"d","d":[12,224,245,348],"c":[]}],["p",{"w":"totalprice","s":"price","e":true,"k":"p","d":[77],"c":[]}],["_",{"w":"total_","s":"_","e":false,"k":"_","d":[],"c":[["a",{"w":"total_allocation","s":"allocation","e":true,"k":"a","d":[102,176],"c":[]}],["t",{"w":"total_tokens","s":"tokens","e":true,"k":"t","d":[112],"c":[]}],["u",{"w":"total_unlocks","s":"unlocks","e":true,"k":"u","d":[191],"c":[]}]]}],["s",{"w":"totalspend","s":"spend","e":true,"k":"s","d":[127],"c":[]}],["'",{"w":"total'","s":"'","e":true,"k":"'","d":[286],"c":[]}],["v",{"w":"totalvotes","s":"votes","e":true,"k":"v","d":[377],"c":[]}],["y",{"w":"totalyield","s":"yield","e":true,"k":"y","d":[516],"c":[]}]]}],["g",{"w":"tog","s":"g","e":false,"k":"g","d":[],"c":[["e",{"w":"together","s":"ether","e":true,"k":"e","d":[12,73,126,149,163,182,224,245,348,355,356,366],"c":[]}],["g",{"w":"toggl","s":"gl","e":false,"k":"g","d":[],"c":[["e",{"w":"toggle","s":"e","e":true,"k":"e","d":[22,51,52,93,128],"c":[["_",{"w":"toggle_costs","s":"_costs","e":true,"k":"_","d":[22],"c":[]}],["-",{"w":"toggle-flag","s":"-flag","e":true,"k":"-","d":[128,187],"c":[]}],["s",{"w":"toggles","s":"s","e":true,"k":"s","d":[128],"c":[]}]]}],["i",{"w":"toggling","s":"ing","e":true,"k":"i","d":[22,93,113],"c":[]}]]}]]}],["u",{"w":"touches","s":"uches","e":true,"k":"u","d":[68],"c":[]}],["w",{"w":"towards","s":"wards","e":true,"k":"w","d":[68],"c":[]}],["-",{"w":"to-","s":"-","e":false,"k":"-","d":[],"c":[["u",{"w":"to-uint","s":"uint","e":true,"k":"u","d":[118,153],"c":[]}],["i",{"w":"to-int","s":"int","e":true,"k":"i","d":[118,153],"c":[]}],["c",{"w":"to-consensus-buff","s":"consensus-buff","e":true,"k":"c","d":[142,144],"c":[]}],["a",{"w":"to-add","s":"add","e":true,"k":"a","d":[170],"c":[]}]]}],["d",{"w":"tod","s":"d","e":false,"k":"d","d":[],"c":[["o",{"w":"todo","s":"o","e":true,"k":"o","d":[180,240],"c":[["l",{"w":"todolist","s":"list","e":true,"k":"l","d":[180],"c":[]}]]}],["a",{"w":"today","s":"ay","e":true,"k":"a","d":[459],"c":[]}]]}],["s",{"w":"tostring","s":"string","e":true,"k":"s","d":[226,234,368],"c":[]}]]}],["h",{"w":"th","s":"h","e":false,"k":"h","d":[],"c":[["e",{"w":"the","s":"e","e":true,"k":"e","d":[2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,26,27,28,29,30,31,44,45,46,47,48,49,50,51,52,53,54,55,58,64,65,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,208,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,255,256,257,258,259,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,399,420,422,423,424,425,426,427,439,443,444,459,462,466,501,502,504,505,509,510,511,513,514,515,516,517],"c":[["r",{"w":"there","s":"re","e":true,"k":"r","d":[14,15,17,47,49,50,52,67,68,69,71,74,221,226,227,229,230,233,243,353,355,356,366,367,377,379,425,443],"c":[["'",{"w":"there's","s":"'s","e":true,"k":"'","d":[2,8,18,31,45,49,54,203,204,208,225,228,257,345,347,349,350,373,399,459,502,515],"c":[]}],["f",{"w":"therefore","s":"fore","e":true,"k":"f","d":[12,18,22,245,348],"c":[]}]]}],["s",{"w":"these","s":"se","e":true,"k":"s","d":[7,12,14,15,17,19,26,27,28,31,49,51,52,68,69,71,73,76,77,79,80,81,92,99,100,201,202,219,221,222,224,226,229,231,233,234,238,243,245,259,348,355,361,367,368,371,375,376,377,378,379,502,516],"c":[]}],["y",{"w":"they","s":"y","e":true,"k":"y","d":[7,12,14,52,69,71,76,79,80,81,83,134,161,163,201,219,221,222,224,226,229,231,234,238,245,348,352,354,361,368,516],"c":[]}],["m",{"w":"them","s":"m","e":true,"k":"m","d":[7,18,29,49,51,52,65,68,69,71,79,80,92,108,113,123,171,178,201,229,350,361,439,462,517],"c":[["e",{"w":"theme","s":"e","e":true,"k":"e","d":[73],"c":[["d",{"w":"themed","s":"d","e":false,"k":"d","d":[],"c":[["v",{"w":"themedview","s":"view","e":true,"k":"v","d":[232],"c":[]}],["t",{"w":"themedtext","s":"text","e":true,"k":"t","d":[232],"c":[]}]]}]]}]]}],["o",{"w":"theoretically","s":"oretically","e":true,"k":"o","d":[8],"c":[]}],["n",{"w":"then","s":"n","e":true,"k":"n","d":[9,12,51,52,67,68,69,71,103,226,227,231,239,245,258,348,355,373,379,515],"c":[["_",{"w":"then_that","s":"_that","e":true,"k":"_","d":[52,68,374,375,376,377,378,379],"c":[]}],["-",{"w":"then-that","s":"-that","e":true,"k":"-","d":[52],"c":[]}]]}],["i",{"w":"their","s":"ir","e":true,"k":"i","d":[11,12,27,45,52,68,69,70,71,73,77,78,79,80,85,88,97,99,105,112,115,119,120,129,134,135,141,148,151,152,159,163,183,188,192,208,224,226,227,229,232,233,234,239,245,246,256,258,348,350,352,353,354,356,366,367,368,371,372,376,377,379,381,501,505,511,513,516],"c":[]}],["'",{"w":"the's","s":"'s","e":true,"k":"'","d":[258],"c":[]}]]}],["a",{"w":"tha","s":"a","e":false,"k":"a","d":[],"c":[["t",{"w":"that","s":"t","e":true,"k":"t","d":[2,6,7,8,9,11,12,18,19,22,25,27,28,29,30,45,47,48,49,50,51,52,53,54,55,58,67,68,69,70,71,72,73,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,219,221,222,224,225,226,227,228,231,232,233,234,238,239,241,243,245,246,256,258,259,347,348,349,350,351,352,353,355,356,360,361,366,367,368,371,372,373,374,375,376,377,378,379,381,399,422,426,427,444,459,501,502,505,510,511,513,514,515,516,517],"c":[["'",{"w":"that's","s":"'s","e":true,"k":"'","d":[31,71],"c":[]}]]}],["n",{"w":"than","s":"n","e":true,"k":"n","d":[14,15,22,52,68,69,71,76,87,104,106,107,114,115,123,133,145,154,158,174,176,179,180,188,191,202,231,372,509,511,513,515],"c":[]}]]}],["i",{"w":"thi","s":"i","e":false,"k":"i","d":[],"c":[["s",{"w":"this","s":"s","e":true,"k":"s","d":[5,7,8,9,12,13,14,15,16,17,18,19,21,22,23,27,28,29,30,31,46,47,48,49,50,51,52,53,55,58,65,67,68,69,70,71,72,73,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,208,219,220,222,223,224,226,227,229,230,231,232,233,234,235,236,239,241,243,245,246,257,258,259,345,348,351,352,353,354,355,356,357,359,361,366,367,368,369,370,371,372,373,374,375,376,377,378,379,399,423,439,462,504,509,511,513,515,516,517],"c":[]}],["r",{"w":"third","s":"rd","e":true,"k":"r","d":[11,69,256,381,501,505],"c":[]}],["n",{"w":"thin","s":"n","e":false,"k":"n","d":[],"c":[["g",{"w":"thing","s":"g","e":true,"k":"g","d":[71,259,515],"c":[["s",{"w":"things","s":"s","e":true,"k":"s","d":[12,245,348,355],"c":[]}]]}],["k",{"w":"think","s":"k","e":true,"k":"k","d":[50,71,72],"c":[]}]]}]]}],["r",{"w":"thr","s":"r","e":false,"k":"r","d":[],"c":[["o",{"w":"thro","s":"o","e":false,"k":"o","d":[],"c":[["u",{"w":"through","s":"ugh","e":true,"k":"u","d":[5,12,26,31,47,50,68,69,70,71,73,93,97,99,152,245,255,258,348,350,355,359,374,375,376],"c":[["o",{"w":"throughout","s":"out","e":true,"k":"o","d":[30,92,100,201],"c":[]}]]}],["w",{"w":"throw","s":"w","e":true,"k":"w","d":[148,151],"c":[["s",{"w":"throws","s":"s","e":true,"k":"s","d":[7,81,112,148,151,173,180,361],"c":[]}],["n",{"w":"thrown","s":"n","e":true,"k":"n","d":[148,151,159],"c":[["-",{"w":"thrown-value","s":"-value","e":true,"k":"-","d":[85,159,193],"c":[]}]]}],["i",{"w":"throwing","s":"ing","e":true,"k":"i","d":[85,148,151,159,168],"c":[]}]]}]]}],["e",{"w":"thre","s":"e","e":false,"k":"e","d":[],"c":[["e",{"w":"three","s":"e","e":true,"k":"e","d":[7,48,55,69,226,230,234,353,361,368,517],"c":[["-",{"w":"three-dots","s":"-dots","e":true,"k":"-","d":[48],"c":[]}]]}],["s",{"w":"threshold","s":"shold","e":true,"k":"s","d":[154,161,176,191],"c":[["s",{"w":"thresholds","s":"s","e":true,"k":"s","d":[114,154,176,191,399],"c":[]}]]}]]}]]}],["o",{"w":"tho","s":"o","e":false,"k":"o","d":[],"c":[["u",{"w":"though","s":"ugh","e":true,"k":"u","d":[28,134,219,222],"c":[]}],["s",{"w":"those","s":"se","e":true,"k":"s","d":[51,230,374,376],"c":[]}]]}],["u",{"w":"thursday","s":"ursday","e":true,"k":"u","d":[74,425,443],"c":[]}]]}],["r",{"w":"tr","s":"r","e":false,"k":"r","d":[],"c":[["a",{"w":"tra","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"trans","s":"ns","e":false,"k":"n","d":[],"c":[["a",{"w":"transaction","s":"action","e":true,"k":"a","d":[7,18,19,22,25,27,49,50,51,52,68,70,71,72,80,81,86,115,147,200,219,222,224,226,227,228,229,230,231,232,233,234,235,236,237,238,239,241,242,243,258,259,353,355,356,361,366,367,368,369,370,371,372,377,379,399],"c":[["s",{"w":"transactions","s":"s","e":true,"k":"s","d":[2,6,7,8,9,19,22,25,27,50,51,65,68,69,71,74,79,80,99,123,154,203,204,208,219,221,222,224,225,226,228,229,230,231,232,233,234,237,238,239,240,242,243,244,257,258,259,304,345,347,349,350,352,353,354,356,357,360,361,366,367,368,371,372,374,376,377,378,379,399,435,475,509,511,513,514,515],"c":[["'",{"w":"transactions'","s":"'","e":true,"k":"'","d":[6,7,12,52,224,226,227,230,231,234,235,236,237,238,239,240,245,246,303,314,322,348,353,354,360,361,368,369,370,402,514],"c":[]}],["_",{"w":"transactions_with_transfers","s":"_with_transfers","e":true,"k":"_","d":[219,222],"c":[["'",{"w":"transactions_with_transfers'","s":"'","e":true,"k":"'","d":[320],"c":[]}]]}],["i",{"w":"transactionsigner","s":"igner","e":true,"k":"i","d":[226,234,368],"c":[]}]]}],["'",{"w":"transaction'","s":"'","e":true,"k":"'","d":[396],"c":[["s",{"w":"transaction's","s":"s","e":true,"k":"s","d":[49],"c":[]}]]}],["i",{"w":"transactionid","s":"id","e":true,"k":"i","d":[81],"c":[]}],["-",{"w":"transaction-post-conditions","s":"-post-conditions","e":true,"k":"-","d":[226,234,368],"c":[]}],["a",{"w":"transactionauthfield","s":"authfield","e":true,"k":"a","d":[229],"c":[["w",{"w":"transactionauthfieldwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}],["v",{"w":"transactionversion","s":"version","e":true,"k":"v","d":[232,235,369],"c":[]}],["r",{"w":"transactionresponse","s":"response","e":true,"k":"r","d":[353],"c":[]}],["_",{"w":"transaction_identifier","s":"_identifier","e":true,"k":"_","d":[377],"c":[]}]]}],["i",{"w":"transit","s":"it","e":true,"k":"i","d":[67,226,227],"c":[["i",{"w":"transition","s":"ion","e":true,"k":"i","d":[50,517],"c":[["-",{"w":"transition-colors","s":"-colors","e":true,"k":"-","d":[230,244],"c":[["'",{"w":"transition-colors'","s":"'","e":true,"k":"'","d":[4,5,6,7,67,226,227,353,358,359,360,361,362,371,372],"c":[]}],["0",{"w":"transition-colors0'","s":"0'","e":true,"k":"0","d":[372],"c":[]}]]}]]}],["k",{"w":"transitkey","s":"key","e":true,"k":"k","d":[67,226,227],"c":[]}]]}],["f",{"w":"transf","s":"f","e":false,"k":"f","d":[],"c":[["e",{"w":"transfer","s":"er","e":true,"k":"e","d":[7,12,19,27,28,51,68,81,86,95,101,102,115,119,122,123,124,129,136,140,150,152,154,160,164,166,176,178,184,190,191,193,196,201,224,226,230,231,234,237,238,243,245,259,348,353,357,361,368,371,372,378,399,511,513,516],"c":[["s",{"w":"transfers","s":"s","e":true,"k":"s","d":[25,67,86,98,101,123,135,143,150,166,184,186,190,192,195,198,219,222,231,237,238,259,353,372,423,459,504,511,513],"c":[["t",{"w":"transferstx","s":"tx","e":true,"k":"t","d":[7,353,361],"c":[]}],["'",{"w":"transfers'","s":"'","e":true,"k":"'","d":[454,457,491,494],"c":[]}]]}],["r",{"w":"transferr","s":"r","e":false,"k":"r","d":[],"c":[["e",{"w":"transferre","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"transferred","s":"d","e":true,"k":"d","d":[7,231,238,361,516],"c":[]}],["s",{"w":"transferresult","s":"sult","e":true,"k":"s","d":[124,136],"c":[]}]]}],["i",{"w":"transferring","s":"ing","e":true,"k":"i","d":[7,101,122,123,150,160,184,190,193,196,201,230,353,361],"c":[]}]]}],["_",{"w":"transfer_","s":"_","e":true,"k":"_","d":[68],"c":[]}],["-",{"w":"transfer-","s":"-","e":false,"k":"-","d":[],"c":[["o",{"w":"transfer-ownership","s":"ownership","e":true,"k":"o","d":[81],"c":[]}],["t",{"w":"transfer-tokens","s":"tokens","e":true,"k":"t","d":[86,123,124,136,147,196,202],"c":[]}],["n",{"w":"transfer-nft","s":"nft","e":true,"k":"n","d":[101,511,513],"c":[]}],["s",{"w":"transfer-stx","s":"stx","e":true,"k":"s","d":[150,166],"c":[["-",{"w":"transfer-stx-with-memo","s":"-with-memo","e":true,"k":"-","d":[184],"c":[]}]]}],["f",{"w":"transfer-ft","s":"ft","e":true,"k":"f","d":[511,513],"c":[]}]]}],["'",{"w":"transfer'","s":"'","e":true,"k":"'","d":[398],"c":[]}]]}],["o",{"w":"transform","s":"orm","e":true,"k":"o","d":[96,105,259],"c":[["i",{"w":"transforming","s":"ing","e":true,"k":"i","d":[68,96,105,177,183],"c":[]}],["e",{"w":"transformed","s":"ed","e":true,"k":"e","d":[105],"c":[]}],["a",{"w":"transformations","s":"ations","e":true,"k":"a","d":[105],"c":[]}],["s",{"w":"transforms","s":"s","e":true,"k":"s","d":[351],"c":[]}]]}]]}],["p",{"w":"transparen","s":"paren","e":false,"k":"p","d":[],"c":[["c",{"w":"transparency","s":"cy","e":true,"k":"c","d":[69,115,125,178,190],"c":[]}],["t",{"w":"transparent","s":"t","e":true,"k":"t","d":[134,355,516],"c":[]}]]}],["m",{"w":"transmission","s":"mission","e":true,"k":"m","d":[144],"c":[]}],["l",{"w":"translate","s":"late","e":true,"k":"l","d":[229],"c":[]}]]}],["c",{"w":"trac","s":"c","e":false,"k":"c","d":[],"c":[["k",{"w":"track","s":"k","e":true,"k":"k","d":[45,49,50,71,178,230,233,258,367,371,372,377,378,427],"c":[["e",{"w":"tracke","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"tracked","s":"d","e":true,"k":"d","d":[15],"c":[]}],["r",{"w":"tracker","s":"r","e":true,"k":"r","d":[79],"c":[]}]]}],["i",{"w":"tracking","s":"ing","e":true,"k":"i","d":[67,233,355,367,371,372,516],"c":[]}],["s",{"w":"tracks","s":"s","e":true,"k":"s","d":[69],"c":[]}]]}],["e",{"w":"trace","s":"e","e":true,"k":"e","d":[26],"c":[]}]]}],["i",{"w":"trait","s":"it","e":true,"k":"i","d":[27,69,90,117,119,152,372],"c":[["s",{"w":"traits","s":"s","e":true,"k":"s","d":[27,69,90,117,119,152,411,511,513],"c":[]}],["-",{"w":"trait-","s":"-","e":false,"k":"-","d":[],"c":[["r",{"w":"trait-reference","s":"reference","e":true,"k":"r","d":[90],"c":[]}],["i",{"w":"trait-i","s":"i","e":false,"k":"i","d":[],"c":[["m",{"w":"trait-implementing","s":"mplementing","e":true,"k":"m","d":[90],"c":[]}],["d",{"w":"trait-identifier","s":"dentifier","e":true,"k":"d","d":[117],"c":[]}]]}],["a",{"w":"trait-alias","s":"alias","e":true,"k":"a","d":[117],"c":[]}],["n",{"w":"trait-name","s":"name","e":true,"k":"n","d":[119,152],"c":[]}]]}],["i",{"w":"traitidentifier","s":"identifier","e":true,"k":"i","d":[117],"c":[]}],["_",{"w":"trait_","s":"_","e":false,"k":"_","d":[],"c":[["c",{"w":"trait_contract_","s":"contract_","e":false,"k":"c","d":[],"c":[["a",{"w":"trait_contract_address","s":"address","e":true,"k":"a","d":[411],"c":[]}],["n",{"w":"trait_contract_name","s":"name","e":true,"k":"n","d":[411],"c":[]}]]}],["n",{"w":"trait_name","s":"name","e":true,"k":"n","d":[411],"c":[]}]]}]]}],["d",{"w":"trad","s":"d","e":false,"k":"d","d":[],"c":[["e",{"w":"trade-off","s":"e-off","e":true,"k":"e","d":[76],"c":[]}],["i",{"w":"trading","s":"ing","e":true,"k":"i","d":[427,459],"c":[]}]]}],["y",{"w":"tray","s":"y","e":true,"k":"y","d":[510],"c":[]}]]}],["u",{"w":"tru","s":"u","e":false,"k":"u","d":[],"c":[["e",{"w":"true","s":"e","e":true,"k":"e","d":[6,7,9,12,22,26,27,30,67,69,71,76,77,79,80,81,83,89,90,97,101,102,108,112,113,114,123,124,125,126,128,129,130,132,135,136,139,140,143,146,147,150,152,154,155,156,161,163,164,165,166,167,169,173,174,176,177,178,184,186,189,190,191,192,193,195,196,201,202,221,224,226,227,229,230,234,245,255,348,355,356,357,360,361,366,368,371,372,377,379,511,513,516],"c":[["c",{"w":"truecv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}]]}],["n",{"w":"truncat","s":"ncat","e":false,"k":"n","d":[],"c":[["e",{"w":"truncated","s":"ed","e":true,"k":"e","d":[68],"c":[]}],["i",{"w":"truncation","s":"ion","e":true,"k":"i","d":[182],"c":[]}]]}],["s",{"w":"trustlessness","s":"stlessness","e":true,"k":"s","d":[80],"c":[]}],["l",{"w":"truly","s":"ly","e":true,"k":"l","d":[201],"c":[]}]]}],["e",{"w":"tre","s":"e","e":false,"k":"e","d":[],"c":[["e",{"w":"tree","s":"e","e":true,"k":"e","d":[7,12,17,68,69,224,243,245,348,361],"c":[]}],["a",{"w":"trea","s":"a","e":false,"k":"a","d":[],"c":[["s",{"w":"treasury","s":"sury","e":true,"k":"s","d":[192,516],"c":[["b",{"w":"treasurybalance","s":"balance","e":true,"k":"b","d":[192],"c":[]}]]}],["t",{"w":"treat","s":"t","e":true,"k":"t","d":[237],"c":[]}]]}]]}],["y",{"w":"try","s":"y","e":true,"k":"y","d":[12,16,28,54,68,69,71,85,86,114,122,123,140,148,151,154,159,164,166,192,193,201,224,245,348,355,356,366,399,425,443,511,513,516],"c":[]}],["i",{"w":"tri","s":"i","e":false,"k":"i","d":[],"c":[["g",{"w":"trigger","s":"gger","e":true,"k":"g","d":[26,52,68,202,352,356,357,366,371,375,376,377],"c":[["s",{"w":"triggers","s":"s","e":true,"k":"s","d":[45,379],"c":[]}],["e",{"w":"triggered","s":"ed","e":true,"k":"e","d":[51,68,375,377,379],"c":[]}],["i",{"w":"triggering","s":"ing","e":true,"k":"i","d":[164],"c":[]}]]}],["e",{"w":"tries","s":"es","e":true,"k":"e","d":[69,71],"c":[]}],["p",{"w":"triplesec","s":"plesec","e":true,"k":"p","d":[229],"c":[]}]]}],["o",{"w":"troubleshoot","s":"oubleshoot","e":true,"k":"o","d":[74],"c":[]}]]}],["i",{"w":"ti","s":"i","e":false,"k":"i","d":[],"c":[["t",{"w":"title","s":"tle","e":true,"k":"t","d":[2,5,6,7,8,9,11,12,13,16,18,20,21,22,24,25,26,27,30,31,44,45,47,48,49,50,51,52,53,54,58,67,68,69,70,71,72,78,81,203,204,208,221,222,224,225,226,227,228,230,231,232,238,239,242,243,244,245,246,256,257,345,347,348,349,350,352,353,354,355,356,357,359,360,361,366,371,373,374,375,376,377,378,379,381,399,420,423,427,444,459,466,501,502,504,505,508,509,510,511,513,515,516,517],"c":[]}],["m",{"w":"time","s":"me","e":true,"k":"m","d":[5,9,12,22,27,30,31,45,49,50,51,52,54,68,69,71,77,79,102,104,127,149,156,176,182,191,202,208,229,233,235,239,245,346,348,359,367,369,373,376,377,378,422,502,515,516],"c":[["s",{"w":"times","s":"s","e":true,"k":"s","d":[14,22,50,92,104,127,156,202,219,222],"c":[["t",{"w":"timestamp","s":"tamp","e":true,"k":"t","d":[104,127,156,377],"c":[["s",{"w":"timestamps","s":"s","e":true,"k":"s","d":[104,127],"c":[]}]]}]]}],["r",{"w":"timer","s":"r","e":true,"k":"r","d":[50],"c":[]}],["l",{"w":"timeline","s":"line","e":true,"k":"l","d":[70,72],"c":[]}],["-",{"w":"time-","s":"-","e":false,"k":"-","d":[],"c":[["b",{"w":"time-based","s":"based","e":true,"k":"b","d":[104,156,161,202],"c":[]}],["a",{"w":"time-aware","s":"aware","e":true,"k":"a","d":[156],"c":[]}],["d",{"w":"time-dependent","s":"dependent","e":true,"k":"d","d":[161,202],"c":[]}],["l",{"w":"time-lock","s":"lock","e":false,"k":"l","d":[],"c":[["e",{"w":"time-locked","s":"ed","e":true,"k":"e","d":[161,202],"c":[]}],["s",{"w":"time-locks","s":"s","e":true,"k":"s","d":[202],"c":[]}]]}],["s",{"w":"time-sensitive","s":"sensitive","e":true,"k":"s","d":[202],"c":[]}]]}]]}],["c",{"w":"ticke","s":"cke","e":false,"k":"c","d":[],"c":[["t",{"w":"ticket","s":"t","e":true,"k":"t","d":[7,11,256,361,381,501,505,516],"c":[["'",{"w":"ticket'","s":"'","e":true,"k":"'","d":[7,361],"c":[["s",{"w":"ticket's","s":"s","e":true,"k":"s","d":[516],"c":[]}]]}],["s",{"w":"tickets","s":"s","e":true,"k":"s","d":[516],"c":[]}],["c",{"w":"ticketcount","s":"count","e":true,"k":"c","d":[516],"c":[["e",{"w":"ticketcounter","s":"er","e":true,"k":"e","d":[516],"c":[]}]]}],["i",{"w":"ticketid","s":"id","e":true,"k":"i","d":[516],"c":[]}],["e",{"w":"ticketexpirationatcycle","s":"expirationatcycle","e":true,"k":"e","d":[516],"c":[]}]]}],["r",{"w":"ticker","s":"r","e":true,"k":"r","d":[447,450,484,487],"c":[]}]]}],["p",{"w":"tip","s":"p","e":true,"k":"p","d":[11,235,241,256,369,381,420,501,505],"c":[]}],["e",{"w":"tied","s":"ed","e":true,"k":"e","d":[73],"c":[]}]]}],["y",{"w":"typ","s":"yp","e":false,"k":"y","d":[],"c":[["e",{"w":"type","s":"e","e":true,"k":"e","d":[2,4,6,7,8,10,11,12,16,18,24,27,31,45,47,48,49,51,53,54,67,68,69,71,78,79,80,82,83,85,86,91,96,97,99,100,103,105,110,114,119,121,122,124,126,128,129,130,134,136,139,144,145,146,147,148,149,151,154,155,159,163,164,165,166,168,170,173,174,176,180,182,187,191,196,201,203,204,208,219,222,224,225,226,227,228,229,232,233,234,235,236,238,239,241,245,256,257,345,347,348,349,350,358,360,361,362,367,368,369,370,371,372,373,374,375,376,377,379,381,399,420,444,459,501,502,504,505,514,515,517],"c":[["s",{"w":"types","s":"s","e":true,"k":"s","d":[8,19,25,47,79,82,83,85,86,88,91,93,97,102,103,105,110,112,114,116,119,120,121,124,128,129,130,136,137,139,140,146,147,148,151,154,159,168,170,173,176,182,183,191,193,224,226,229,230,234,237,243,353,355,356,366,368,372],"c":[["c",{"w":"typescript","s":"cript","e":true,"k":"c","d":[12,68,224,226,227,228,234,236,245,259,348,356,366,368,370,517],"c":[]}]]}],["_",{"w":"type_id","s":"_id","e":true,"k":"_","d":[51,517],"c":[]}],["-",{"w":"type-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"type-s","s":"s","e":false,"k":"s","d":[],"c":[["a",{"w":"type-safe","s":"afe","e":true,"k":"a","d":[64,365,382,383,384,385,386,387],"c":[]}],["i",{"w":"type-signature","s":"ignature","e":true,"k":"i","d":[144],"c":[]}]]}],["a",{"w":"type-appropriate","s":"appropriate","e":true,"k":"a","d":[149],"c":[]}]]}],["d",{"w":"typed","s":"d","e":true,"k":"d","d":[144,149,226,234,368,514],"c":[]}]]}],["i",{"w":"typical","s":"ical","e":true,"k":"i","d":[19],"c":[["l",{"w":"typically","s":"ly","e":true,"k":"l","d":[96,102,154,176,191,201,233,239,241,367],"c":[]}]]}],["o",{"w":"typos","s":"os","e":true,"k":"o","d":[30],"c":[]}]]}],["a",{"w":"ta","s":"a","e":false,"k":"a","d":[],"c":[["b",{"w":"tab","s":"b","e":true,"k":"b","d":[18,50,51,64,68,365,382,383,384,385,386,387,510,515],"c":[["s",{"w":"tabs","s":"s","e":true,"k":"s","d":[4,5,6,7,51,64,67,226,227,230,232,234,235,236,244,353,354,356,358,359,360,361,362,365,366,368,369,370,371,372,379,380,382,383,384,385,386,387,510,515,517],"c":[["c",{"w":"tabscontent","s":"content","e":true,"k":"c","d":[4,5,6,7,67,226,227,230,234,235,236,244,353,354,356,358,359,360,361,362,366,368,369,370,371,372,379,380],"c":[]}],["l",{"w":"tabslist","s":"list","e":true,"k":"l","d":[4,5,6,7,67,226,227,230,234,235,236,244,353,354,356,358,359,360,361,362,366,368,369,370,371,372,379,380],"c":[]}],["t",{"w":"tabstrigger","s":"trigger","e":true,"k":"t","d":[4,5,6,7,67,226,227,230,234,235,236,244,353,354,356,358,359,360,361,362,366,368,369,370,371,372,379,380],"c":[]}],["'",{"w":"tabs'","s":"'","e":true,"k":"'","d":[4,5,6,7,51,64,67,226,227,230,234,235,236,244,353,354,356,358,359,360,361,362,365,366,368,369,370,371,372,382,383,384,385,386,387,510,515],"c":[]}],["-",{"w":"tabs-example","s":"-example","e":true,"k":"-","d":[517],"c":[]}]]}],["-",{"w":"tab-separated-values","s":"-separated-values","e":true,"k":"-","d":[14],"c":[]}],["l",{"w":"table","s":"le","e":true,"k":"l","d":[80,351,376,377],"c":[["s",{"w":"tables","s":"s","e":true,"k":"s","d":[97],"c":[]}],["b",{"w":"tablebody","s":"body","e":true,"k":"b","d":[351],"c":[]}],["c",{"w":"tablecell","s":"cell","e":true,"k":"c","d":[351],"c":[]}],["h",{"w":"tablehead","s":"head","e":true,"k":"h","d":[351],"c":[["e",{"w":"tableheader","s":"er","e":true,"k":"e","d":[351],"c":[]}]]}],["r",{"w":"tablerow","s":"row","e":true,"k":"r","d":[351],"c":[]}]]}]]}],["k",{"w":"tak","s":"k","e":false,"k":"k","d":[],"c":[["e",{"w":"take","s":"e","e":true,"k":"e","d":[13,14,15,17,25,26,27,28,49,50,68,71,73,221,227,229,233,236,246,258,353,367,370,509,515],"c":[["s",{"w":"takes","s":"s","e":true,"k":"s","d":[6,7,96,177,188,229,230,360,361,515],"c":[]}],["n",{"w":"taken","s":"n","e":true,"k":"n","d":[14,233,367],"c":[]}],["r",{"w":"taker","s":"r","e":true,"k":"r","d":[511,513],"c":[]}]]}],["i",{"w":"taking","s":"ing","e":true,"k":"i","d":[68,516],"c":[]}]]}],["g",{"w":"tag","s":"g","e":true,"k":"g","d":[11,22,26,27,30,219,221,228,229,256,381,420,423,501,505],"c":[]}],["r",{"w":"tar","s":"r","e":true,"k":"r","d":[17,18,517],"c":[["g",{"w":"target","s":"get","e":true,"k":"g","d":[13,17,45,74,156,376,377,425,443],"c":[["t",{"w":"targettime","s":"time","e":true,"k":"t","d":[156],"c":[]}],["_",{"w":"target_stx_address","s":"_stx_address","e":true,"k":"_","d":[233,367],"c":[]}],["i",{"w":"targeting","s":"ing","e":true,"k":"i","d":[377],"c":[]}]]}]]}],["s",{"w":"task","s":"sk","e":true,"k":"s","d":[75,129,426,444],"c":[["s",{"w":"tasks","s":"s","e":true,"k":"s","d":[29,30,105,174,239],"c":[]}]]}],["m",{"w":"tamper","s":"mper","e":false,"k":"m","d":[],"c":[["-",{"w":"tamper-proof","s":"-proof","e":true,"k":"-","d":[69],"c":[]}],["e",{"w":"tampered","s":"ed","e":true,"k":"e","d":[80],"c":[]}]]}],["i",{"w":"tailored","s":"ilored","e":true,"k":"i","d":[219,220],"c":[]}],["p",{"w":"taproot","s":"proot","e":true,"k":"p","d":[233,367],"c":[]}]]}],["s",{"w":"ts","s":"s","e":true,"k":"s","d":[4,5,6,7,9,12,20,30,51,58,64,65,68,223,224,226,229,230,231,233,234,235,237,238,239,240,241,242,243,245,246,348,352,353,354,357,358,359,360,361,362,365,367,368,369,375,382,383,384,385,386,387,514,517],"c":[["c",{"w":"tsconfig","s":"config","e":true,"k":"c","d":[9,20,29,30,375],"c":[]}],["_",{"w":"ts__counter","s":"__counter","e":true,"k":"_","d":[9],"c":[]}],["v",{"w":"tsv","s":"v","e":true,"k":"v","d":[14,219,222],"c":[["_",{"w":"tsv_file_url","s":"_file_url","e":true,"k":"_","d":[374,376],"c":[]}]]}],["x",{"w":"tsx","s":"x","e":true,"k":"x","d":[67,69,71,223,226,227,232,240,357],"c":[]}]]}],["x",{"w":"tx","s":"x","e":true,"k":"x","d":[6,7,219,222,226,231,234,237,238,241,242,305,306,309,310,311,312,313,315,360,361,368],"c":[["-",{"w":"tx-sender","s":"-sender","e":true,"k":"-","d":[6,7,12,22,26,28,30,69,71,76,77,79,80,81,83,85,86,88,89,90,91,97,101,102,103,108,112,113,114,115,116,117,120,122,123,124,125,130,132,135,136,139,140,143,146,147,150,151,154,160,163,164,166,167,172,173,178,184,185,186,190,192,193,195,196,198,200,201,202,224,245,348,356,360,361,366,377,511,513,516,517],"c":[]}],["_",{"w":"tx_","s":"_","e":false,"k":"_","d":[],"c":[["h",{"w":"tx_hash","s":"hash","e":true,"k":"h","d":[6,360],"c":[]}],["s",{"w":"tx_status","s":"status","e":true,"k":"s","d":[51,255,517],"c":[]}],["i",{"w":"tx_i","s":"i","e":false,"k":"i","d":[],"c":[["d",{"w":"tx_id","s":"d","e":true,"k":"d","d":[51,219,222,255,304,310,315,325,435,475],"c":[]}],["n",{"w":"tx_index","s":"ndex","e":true,"k":"n","d":[255],"c":[]}]]}],["t",{"w":"tx_type","s":"type","e":true,"k":"t","d":[51,255,517],"c":[]}],["r",{"w":"tx_result","s":"result","e":true,"k":"r","d":[226,234,255,368],"c":[]}]]}],["s",{"w":"txs","s":"s","e":true,"k":"s","d":[7,361],"c":[]}],["i",{"w":"txi","s":"i","e":false,"k":"i","d":[],"c":[["d",{"w":"txid","s":"d","e":true,"k":"d","d":[28,52,65,223,226,230,233,234,237,243,353,356,365,366,367,368,371,372,377],"c":[]}],["n",{"w":"txindex","s":"ndex","e":true,"k":"n","d":[515],"c":[]}]]}],["o",{"w":"txoptions","s":"options","e":true,"k":"o","d":[226,227,234,235,236,368,369,370],"c":[]}],["b",{"w":"txbroadcasturl","s":"broadcasturl","e":true,"k":"b","d":[227,236,370],"c":[]}],["r",{"w":"txraw","s":"raw","e":true,"k":"r","d":[353],"c":[]}],["t",{"w":"txt","s":"t","e":true,"k":"t","d":[374,376,378,517],"c":[]}]]}],["u",{"w":"tu","s":"u","e":false,"k":"u","d":[],"c":[["p",{"w":"tup","s":"p","e":false,"k":"p","d":[],"c":[["l",{"w":"tuple","s":"le","e":true,"k":"l","d":[6,83,89,95,98,116,127,141,142,144,172,189,224,226,231,234,354,356,360,366,368],"c":[["s",{"w":"tuples","s":"s","e":true,"k":"s","d":[79,83,97,116,132,167,189],"c":[]}],["_",{"w":"tuple_","s":"_","e":false,"k":"_","d":[],"c":[["a",{"w":"tuple_a","s":"a","e":true,"k":"a","d":[132,167],"c":[]}],["b",{"w":"tuple_b","s":"b","e":true,"k":"b","d":[132,167],"c":[]}]]}],["1",{"w":"tuple1","s":"1","e":true,"k":"1","d":[189],"c":[]}],["2",{"w":"tuple2","s":"2","e":true,"k":"2","d":[189],"c":[]}],["c",{"w":"tuplecv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}]]}],["c",{"w":"tupcv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}]]}],["n",{"w":"tun","s":"n","e":false,"k":"n","d":[],"c":[["i",{"w":"tuning","s":"ing","e":true,"k":"i","d":[14,15],"c":[]}],["e",{"w":"tuned","s":"ed","e":true,"k":"e","d":[73],"c":[]}]]}],["r",{"w":"turn","s":"rn","e":true,"k":"r","d":[22],"c":[]}],["t",{"w":"tutorial","s":"torial","e":true,"k":"t","d":[30],"c":[["s",{"w":"tutorials","s":"s","e":true,"k":"s","d":[44,466],"c":[]}]]}]]}],["e",{"w":"te","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"test","s":"st","e":true,"k":"s","d":[7,8,9,12,19,20,28,30,44,47,49,50,53,68,71,219,223,224,241,243,245,246,348,361,373,375,379,516,517],"c":[["s",{"w":"tests","s":"s","e":true,"k":"s","d":[8,9,11,12,18,19,20,22,26,28,29,30,224,226,245,246,348,375,381,505],"c":[]}],["i",{"w":"testing","s":"ing","e":true,"k":"i","d":[8,9,12,18,19,27,29,30,45,49,50,68,71,224,241,245,348,373,516],"c":[]}],["_",{"w":"test_name","s":"_name","e":true,"k":"_","d":[9],"c":[]}],["-",{"w":"test-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"test-the-deposit-","s":"the-deposit-","e":false,"k":"t","d":[],"c":[["a",{"w":"test-the-deposit-and-borrow-functionality","s":"and-borrow-functionality","e":true,"k":"a","d":[12,245,348],"c":[]}],["f",{"w":"test-the-deposit-function","s":"function","e":true,"k":"f","d":[224],"c":[]}]]}],["a",{"w":"test-abi","s":"abi","e":true,"k":"a","d":[226],"c":[]}],["1",{"w":"test-123","s":"123","e":true,"k":"1","d":[517],"c":[]}]]}],["n",{"w":"testnet","s":"net","e":true,"k":"n","d":[13,14,15,17,19,25,27,28,29,30,46,47,49,50,53,67,68,219,220,223,227,229,230,233,237,240,241,258,355,367,374,377,379,509,514,517],"c":[]}]]}],["r",{"w":"term","s":"rm","e":false,"k":"r","d":[],"c":[["i",{"w":"terminal","s":"inal","e":true,"k":"i","d":[9,12,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29,30,44,47,50,52,53,58,68,69,71,75,224,230,231,232,243,245,246,258,348,353,354,357,374,375,376,377,378,380,423,424,502,504,509,510,511,513,515,516,517],"c":[["p",{"w":"terminalpicker","s":"picker","e":true,"k":"p","d":[18,517],"c":[]}],["-",{"w":"terminal-picker","s":"-picker","e":true,"k":"-","d":[517],"c":[]}]]}],["s",{"w":"terms","s":"s","e":true,"k":"s","d":[73,219,354],"c":[]}]]}],["x",{"w":"text","s":"xt","e":true,"k":"x","d":[18,27,376,517],"c":[["-",{"w":"text-","s":"-","e":true,"k":"-","d":[11,44,256,381,466,501,505],"c":[["s",{"w":"text-sm","s":"sm","e":true,"k":"s","d":[11,44,256,381,466,501,505],"c":[]}],["p",{"w":"text-primary'","s":"primary'","e":true,"k":"p","d":[44,239,420,466],"c":[]}],["n",{"w":"text-neutral-90","s":"neutral-90","e":true,"k":"n","d":[230],"c":[]}],["w",{"w":"text-white'","s":"white'","e":true,"k":"w","d":[230],"c":[]}],["e",{"w":"text-encoding","s":"encoding","e":true,"k":"e","d":[232],"c":[]}],["b",{"w":"text-background","s":"background","e":true,"k":"b","d":[244],"c":[]}],["m",{"w":"text-muted-foreground'","s":"muted-foreground'","e":true,"k":"m","d":[244],"c":[]}]]}],["d",{"w":"textdecoder","s":"decoder","e":true,"k":"d","d":[232],"c":[]}],["e",{"w":"textencoder","s":"encoder","e":true,"k":"e","d":[232],"c":[]}]]}],["c",{"w":"tech","s":"ch","e":true,"k":"c","d":[71],"c":[["n",{"w":"techn","s":"n","e":false,"k":"n","d":[],"c":[["i",{"w":"techni","s":"i","e":false,"k":"i","d":[],"c":[["q",{"w":"techniques","s":"ques","e":true,"k":"q","d":[22,76],"c":[]}],["c",{"w":"technical","s":"cal","e":true,"k":"c","d":[73],"c":[]}]]}],["o",{"w":"technology","s":"ology","e":true,"k":"o","d":[70],"c":[]}]]}]]}],["m",{"w":"temp","s":"mp","e":false,"k":"m","d":[],"c":[["l",{"w":"template","s":"late","e":true,"k":"l","d":[47,53,69,71,374,376,377,378,379],"c":[["s",{"w":"templates","s":"s","e":true,"k":"s","d":[44,45,47,53],"c":[]}]]}],["o",{"w":"temporary","s":"orary","e":true,"k":"o","d":[100],"c":[]}]]}],["n",{"w":"ten","s":"n","e":false,"k":"n","d":[],"c":[["e",{"w":"tenets","s":"ets","e":true,"k":"e","d":[69],"c":[]}],["u",{"w":"tenure","s":"ure","e":true,"k":"u","d":[127],"c":[["s",{"w":"tenures","s":"s","e":true,"k":"s","d":[104,127,221,407,409],"c":[]}],["i",{"w":"tenureinfopropertyname","s":"infopropertyname","e":true,"k":"i","d":[127],"c":[]}],["-",{"w":"tenure-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"tenure-specific","s":"specific","e":true,"k":"s","d":[127],"c":[]}],["h",{"w":"tenure-height","s":"height","e":true,"k":"h","d":[221],"c":[]}]]}],["_",{"w":"tenure_change","s":"_change","e":true,"k":"_","d":[219,222],"c":[]}],["c",{"w":"tenurechangepayload","s":"changepayload","e":true,"k":"c","d":[229],"c":[["w",{"w":"tenurechangepayloadwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}]]}]]}],["a",{"w":"team","s":"am","e":true,"k":"a","d":[73],"c":[]}],["l",{"w":"tell","s":"ll","e":true,"k":"l","d":[378],"c":[["s",{"w":"tells","s":"s","e":true,"k":"s","d":[231],"c":[]}],["i",{"w":"telling","s":"ing","e":true,"k":"i","d":[246],"c":[]}]]}]]}],["w",{"w":"tw","s":"w","e":false,"k":"w","d":[],"c":[["o",{"w":"two","s":"o","e":true,"k":"o","d":[12,14,26,27,52,69,71,76,77,81,93,95,96,97,102,104,106,108,112,113,114,126,127,128,130,137,140,149,154,155,156,163,165,171,176,182,185,189,191,194,197,199,219,220,221,233,245,348,367,372,517],"c":[["-",{"w":"two-hour","s":"-hour","e":true,"k":"-","d":[127],"c":[]}],["'",{"w":"two's","s":"'s","e":true,"k":"'","d":[187,229],"c":[]}],["s",{"w":"twoslash","s":"slash","e":true,"k":"s","d":[226,227],"c":[]}]]}],["i",{"w":"twice","s":"ice","e":true,"k":"i","d":[22,26],"c":[]}]]}],["b",{"w":"tba","s":"ba","e":true,"k":"b","d":[73],"c":[]}],["l",{"w":"tld","s":"ld","e":true,"k":"l","d":[275,393],"c":[]}],["p",{"w":"tprv8zgxmbicqkspepxn6j3tjvb2mbzqkuhggc6orh2wzanczqgxktcnjzj44xdsriw3jnkbvtk9jw6kfhvnrkgamtsyubevmjprskz4ptfmtgv","s":"prv8zgxmbicqkspepxn6j3tjvb2mbzqkuhggc6orh2wzanczqgxktcnjzj44xdsriw3jnkbvtk9jw6kfhvnrkgamtsyubevmjprskz4ptfmtgv","e":true,"k":"p","d":[371],"c":[]}],["c",{"w":"tcp","s":"cp","e":true,"k":"c","d":[374,376,515],"c":[]}],["m",{"w":"tmp","s":"mp","e":true,"k":"m","d":[377,379],"c":[]}]]}],["-",{"w":"-","s":"-","e":true,"k":"-","d":[2,6,7,8,12,14,15,17,18,22,25,26,27,28,31,45,46,47,50,51,52,53,54,68,69,70,71,72,73,74,75,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,208,219,221,222,223,224,225,226,228,229,230,233,234,237,238,239,241,245,246,255,259,347,348,349,350,351,355,356,360,361,366,367,368,373,377,379,399,422,425,427,443,459,502,509,511,513,516,517],"c":[["-",{"w":"--","s":"-","e":true,"k":"-","d":[9,25,27],"c":[["-",{"w":"---","s":"-","e":true,"k":"-","d":[9,11,12,27,30,44,70,72,73,74,219,224,230,231,232,233,243,244,245,246,256,348,352,353,354,357,367,374,376,377,378,381,422,423,425,427,443,466,501,505,509,510,511,513,515,516],"c":[["-",{"w":"----","s":"-","e":true,"k":"-","d":[377],"c":[["-",{"w":"------","s":"--","e":true,"k":"-","d":[351],"c":[["-",{"w":"-------","s":"-","e":true,"k":"-","d":[377],"c":[["-",{"w":"---------","s":"--","e":true,"k":"-","d":[377],"c":[["-",{"w":"----------","s":"-","e":true,"k":"-","d":[377],"c":[["-",{"w":"------------","s":"--","e":true,"k":"-","d":[377],"c":[["-",{"w":"-------------","s":"-","e":true,"k":"-","d":[22,374],"c":[["-",{"w":"--------------","s":"-","e":true,"k":"-","d":[19],"c":[["-",{"w":"---------------","s":"-","e":true,"k":"-","d":[376],"c":[["-",{"w":"----------------","s":"-","e":true,"k":"-","d":[22],"c":[["-",{"w":"-----------------","s":"-","e":true,"k":"-","d":[22],"c":[["-",{"w":"--------------------","s":"---","e":true,"k":"-","d":[374],"c":[["-",{"w":"---------------------","s":"-","e":true,"k":"-","d":[376],"c":[["-",{"w":"----------------------","s":"-","e":true,"k":"-","d":[22],"c":[["-",{"w":"-----------------------","s":"-","e":true,"k":"-","d":[19],"c":[["-",{"w":"---------------------------","s":"----","e":true,"k":"-","d":[351],"c":[["-",{"w":"-----------------------------","s":"--","e":true,"k":"-","d":[374,377],"c":[["-",{"w":"----------------------------------------","s":"-----------","e":true,"k":"-","d":[377],"c":[["-",{"w":"-------------------------------------------------------","s":"---------------","e":true,"k":"-","d":[377],"c":[["-",{"w":"------------------------------------------------------------------","s":"-----------","e":true,"k":"-","d":[377],"c":[["-",{"w":"-------------------------------------------------------------------------------","s":"-------------","e":true,"k":"-","d":[19],"c":[["-",{"w":"--------------------------------------------------------------------------------","s":"-","e":true,"k":"-","d":[19],"c":[["-",{"w":"----------------------------------------------------------------------------------------------------","s":"--------------------","e":true,"k":"-","d":[351],"c":[["-",{"w":"-------------------------------------------------------------------------------------------------------------------------------------------------------","s":"---------------------------------------------------","e":true,"k":"-","d":[377],"c":[["-",{"w":"---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------","s":"--------------------------------------------------------------------","e":true,"k":"-","d":[19],"c":[]}]]}]]}]]}]]}]]}]]}]]}]]}]]}]]}]]}]]}]]}]]}]]}]]}]]}]]}]]}]]}]]}]]}]]}]]}],["c",{"w":"---cut---","s":"cut---","e":true,"k":"c","d":[226,227],"c":[]}]]}],["h",{"w":"--hi","s":"hi","e":false,"k":"h","d":[],"c":[["g",{"w":"--highlight","s":"ghlight","e":true,"k":"g","d":[9,20,375],"c":[]}],["r",{"w":"--hiro","s":"ro","e":true,"k":"r","d":[517],"c":[]}]]}],["s",{"w":"--s","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"--st","s":"t","e":false,"k":"t","d":[],"c":[["a",{"w":"--stacks","s":"acks","e":true,"k":"a","d":[9,374,377,378,379],"c":[]}],["d",{"w":"--stdout","s":"dout","e":true,"k":"d","d":[14],"c":[]}]]}],["a",{"w":"--save-dev","s":"ave-dev","e":true,"k":"a","d":[232],"c":[]}]]}],["b",{"w":"--b","s":"b","e":false,"k":"b","d":[],"c":[["i",{"w":"--bitcoin","s":"itcoin","e":true,"k":"i","d":[9,376,378,379],"c":[]}],["r",{"w":"--branch-coverage","s":"ranch-coverage","e":true,"k":"r","d":[9],"c":[]}]]}],["c",{"w":"--c","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"--co","s":"o","e":false,"k":"o","d":[],"c":[["v",{"w":"--coverage","s":"verage","e":true,"k":"v","d":[9],"c":[]}],["s",{"w":"--costs","s":"sts","e":true,"k":"s","d":[9],"c":[]}],["n",{"w":"--conf","s":"nf","e":true,"k":"n","d":[515],"c":[["i",{"w":"--config-path","s":"ig-path","e":true,"k":"i","d":[374,376,504],"c":[]}]]}]]}],["h",{"w":"--check","s":"heck","e":true,"k":"h","d":[16],"c":[]}]]}],["u",{"w":"--username","s":"username","e":true,"k":"u","d":[14,15],"c":[]}],["v",{"w":"--ver","s":"ver","e":false,"k":"v","d":[],"c":[["b",{"w":"--verbose","s":"bose","e":true,"k":"b","d":[14,15],"c":[]}],["s",{"w":"--version","s":"sion","e":true,"k":"s","d":[510],"c":[]}]]}],["j",{"w":"--jobs","s":"jobs","e":true,"k":"j","d":[14,15],"c":[]}],["d",{"w":"--dbname","s":"dbname","e":true,"k":"d","d":[14,15],"c":[]}],["p",{"w":"--p","s":"p","e":false,"k":"p","d":[],"c":[["o",{"w":"--port","s":"ort","e":true,"k":"o","d":[68],"c":[]}],["r",{"w":"--predicate-path","s":"redicate-path","e":true,"k":"r","d":[374,376],"c":[]}]]}],["e",{"w":"--enable-clarity-wasm","s":"enable-clarity-wasm","e":true,"k":"e","d":[219],"c":[]}],["m",{"w":"--mainnet","s":"mainnet","e":true,"k":"m","d":[374,376,378,379],"c":[]}],["t",{"w":"--testnet","s":"testnet","e":true,"k":"t","d":[377],"c":[]}],["r",{"w":"--rpc","s":"rpc","e":false,"k":"r","d":[],"c":[["u",{"w":"--rpcuser","s":"user","e":true,"k":"u","d":[515],"c":[]}],["p",{"w":"--rpcpassword","s":"password","e":true,"k":"p","d":[515],"c":[]}]]}]]}],["c",{"w":"-c","s":"c","e":true,"k":"c","d":[9,17,30,517],"c":[["n",{"w":"-cn","s":"n","e":true,"k":"n","d":[230,231,232,243],"c":[]}],["o",{"w":"-conf","s":"onf","e":true,"k":"o","d":[515],"c":[]}],["w",{"w":"-cwn","s":"wn","e":true,"k":"w","d":[517],"c":[]}]]}],["o",{"w":"-o","s":"o","e":true,"k":"o","d":[9,18,517],"c":[]}],["s",{"w":"-stacks-blockchain-","s":"stacks-blockchain-","e":true,"k":"s","d":[17],"c":[["a",{"w":"-stacks-blockchain-api-","s":"api-","e":true,"k":"a","d":[14],"c":[["l",{"w":"-stacks-blockchain-api-latest","s":"latest","e":true,"k":"l","d":[14],"c":[]}]]}],["l",{"w":"-stacks-blockchain-latest","s":"latest","e":true,"k":"l","d":[17],"c":[]}],["2",{"w":"-stacks-blockchain-2","s":"2","e":true,"k":"2","d":[17],"c":[]}]]}],["l",{"w":"-l","s":"l","e":true,"k":"l","d":[58],"c":[["a",{"w":"-latest","s":"atest","e":true,"k":"a","d":[14,15],"c":[]}]]}],["d",{"w":"-d","s":"d","e":true,"k":"d","d":[14,374,376],"c":[]}],["z",{"w":"-zxvf","s":"zxvf","e":true,"k":"z","d":[17],"c":[]}],["n",{"w":"-n","s":"n","e":true,"k":"n","d":[231,234,237,238,239,240,242,368,509,517],"c":[["v",{"w":"-nv","s":"v","e":true,"k":"v","d":[18,517],"c":[]}]]}],["x",{"w":"-x","s":"x","e":true,"k":"x","d":[374,376],"c":[["f",{"w":"-xf","s":"f","e":true,"k":"f","d":[18,517],"c":[]}]]}],["f",{"w":"-for","s":"for","e":true,"k":"f","d":[52],"c":[]}],["h",{"w":"-h","s":"h","e":true,"k":"h","d":[58,374,376],"c":[]}],["1",{"w":"-1","s":"1","e":true,"k":"1","d":[118,130,142,168],"c":[["2",{"w":"-128","s":"28","e":true,"k":"2","d":[145],"c":[]}],["6",{"w":"-16","s":"6","e":true,"k":"6","d":[145],"c":[]}],["0",{"w":"-10","s":"0","e":true,"k":"0","d":[226,234,368],"c":[]}]]}],["4",{"w":"-456","s":"456","e":true,"k":"4","d":[138],"c":[]}],["3",{"w":"-3","s":"3","e":true,"k":"3","d":[165],"c":[]}],["a",{"w":"-a","s":"a","e":true,"k":"a","d":[509,517],"c":[]}],["w",{"w":"-w","s":"w","e":true,"k":"w","d":[517],"c":[["n",{"w":"-wn","s":"n","e":true,"k":"n","d":[517],"c":[]}]]}]]}],["b",{"w":"b","s":"b","e":true,"k":"b","d":[85,86,105,121,124,136,148,151,159,164,170,171,197,199,226,229,234,368,517],"c":[["u",{"w":"bu","s":"u","e":false,"k":"u","d":[],"c":[["i",{"w":"buil","s":"il","e":false,"k":"i","d":[],"c":[["d",{"w":"build","s":"d","e":true,"k":"d","d":[2,7,8,11,18,44,45,52,68,69,70,71,72,73,75,95,182,203,204,225,228,230,233,239,243,244,256,347,349,350,352,361,367,373,376,377,381,426,444,466,501,505,509,515],"c":[["i",{"w":"building","s":"ing","e":true,"k":"i","d":[2,6,8,18,31,44,45,47,49,53,54,68,69,71,74,75,77,80,86,99,104,122,156,160,182,203,204,208,219,225,226,227,228,230,233,234,235,239,243,244,257,345,347,349,350,353,360,367,368,369,373,399,422,425,426,427,443,444,459,502,515],"c":[]}],["-",{"w":"build-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"build-a","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"build-an-nft-marketplace","s":"n-nft-marketplace","e":true,"k":"n","d":[11,256,381,501,505],"c":[]}],["-",{"w":"build-a-decentralized-","s":"-decentralized-","e":false,"k":"-","d":[],"c":[["k",{"w":"build-a-decentralized-kickstarter","s":"kickstarter","e":true,"k":"k","d":[11,256,381,501,505],"c":[]}],["g",{"w":"build-a-decentralized-grants-program","s":"grants-program","e":true,"k":"g","d":[68],"c":[]}]]}]]}],["e",{"w":"build-e","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"build-essential","s":"ssential","e":true,"k":"s","d":[18,517],"c":[]}],["x",{"w":"build-explorer","s":"xplorer","e":true,"k":"x","d":[74,425,443],"c":[]}]]}]]}],["e",{"w":"builder","s":"er","e":true,"k":"e","d":[226,228,231,234,243,368,377],"c":[["s",{"w":"builders","s":"s","e":true,"k":"s","d":[70,73,231],"c":[]}],["-",{"w":"builder-general","s":"-general","e":true,"k":"-","d":[73],"c":[]}]]}],["s",{"w":"builds","s":"s","e":true,"k":"s","d":[230],"c":[["b",{"w":"buildsbtcdeposit","s":"btcdeposit","e":false,"k":"b","d":[],"c":[["a",{"w":"buildsbtcdepositaddress","s":"address","e":true,"k":"a","d":[233,367],"c":[]}],["t",{"w":"buildsbtcdeposittx","s":"tx","e":true,"k":"t","d":[233,367],"c":[]}]]}]]}]]}],["t",{"w":"built","s":"t","e":true,"k":"t","d":[7,18,68,75,224,361],"c":[["-",{"w":"built-in","s":"-in","e":true,"k":"-","d":[80,96,174,183,201,227,236,370,377],"c":[]}]]}]]}],["f",{"w":"buf","s":"f","e":false,"k":"f","d":[],"c":[["f",{"w":"buff","s":"f","e":true,"k":"f","d":[69,80,84,87,89,90,91,94,95,104,111,114,126,127,132,133,141,142,144,154,156,158,161,162,167,169,172,176,179,181,184,188,191,197,200,226,234,368],"c":[["e",{"w":"buffer","s":"er","e":true,"k":"e","d":[6,27,84,87,91,95,96,110,111,133,142,144,158,161,177,179,181,182,188,226,229,232,234,360,368],"c":[["f",{"w":"bufferfrom","s":"from","e":false,"k":"f","d":[],"c":[["a",{"w":"bufferfromascii","s":"ascii","e":true,"k":"a","d":[6,230,360],"c":[]}],["u",{"w":"bufferfromutf8","s":"utf8","e":true,"k":"u","d":[6,234,360,368],"c":[]}],["h",{"w":"bufferfromhex","s":"hex","e":true,"k":"h","d":[6,360],"c":[]}]]}],["s",{"w":"buffers","s":"s","e":true,"k":"s","d":[87,91,110,114,133,142,144,154,158,176,179,182,191],"c":[]}],["c",{"w":"buffercv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[["f",{"w":"buffercvfromstring","s":"fromstring","e":true,"k":"f","d":[226,230,234,368],"c":[]}]]}]]}],["-",{"w":"buff-to-","s":"-to-","e":false,"k":"-","d":[],"c":[["h",{"w":"buff-to-hex-string","s":"hex-string","e":true,"k":"h","d":[80],"c":[]}],["i",{"w":"buff-to-int-","s":"int-","e":false,"k":"i","d":[],"c":[["b",{"w":"buff-to-int-be","s":"be","e":true,"k":"b","d":[87,133,142,179],"c":[]}],["l",{"w":"buff-to-int-le","s":"le","e":true,"k":"l","d":[87,158,179],"c":[]}]]}],["u",{"w":"buff-to-uint-","s":"uint-","e":false,"k":"u","d":[],"c":[["b",{"w":"buff-to-uint-be","s":"be","e":true,"k":"b","d":[87,133,158],"c":[]}],["l",{"w":"buff-to-uint-le","s":"le","e":true,"k":"l","d":[133,142,158,179],"c":[]}]]}]]}]]}],["c",{"w":"bufcv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}]]}],["t",{"w":"but","s":"t","e":true,"k":"t","d":[7,8,12,22,28,50,51,68,71,74,92,96,145,188,193,224,229,233,234,235,236,239,241,245,259,348,361,367,368,369,370,374,376,377,378,425,443,516,517],"c":[["t",{"w":"button","s":"ton","e":true,"k":"t","d":[13,45,46,47,48,49,50,51,52,53,68,74,232,425,443,515,517],"c":[]}]]}],["r",{"w":"burn","s":"rn","e":true,"k":"r","d":[7,51,69,95,115,127,135,143,156,202,361,372,378],"c":[["i",{"w":"burning","s":"ing","e":true,"k":"i","d":[69,115,125,135,143,160,372],"c":[]}],["b",{"w":"burnblock","s":"block","e":false,"k":"b","d":[],"c":[["i",{"w":"burnblockinfopropertyname","s":"infopropertyname","e":true,"k":"i","d":[95],"c":[]}],["h",{"w":"burnblockheight","s":"height","e":true,"k":"h","d":[223],"c":[]}]]}],["c",{"w":"burnchain","s":"chain","e":true,"k":"c","d":[95,127,156,281,283,284,285,286,374],"c":[["-",{"w":"burnchain-header-hash","s":"-header-hash","e":true,"k":"-","d":[127,156],"c":[]}]]}],["-",{"w":"burn-","s":"-","e":false,"k":"-","d":[],"c":[["b",{"w":"burn-block","s":"block","e":false,"k":"b","d":[],"c":[["-",{"w":"burn-block-height","s":"-height","e":true,"k":"-","d":[95,127,156,202],"c":[]}],["s",{"w":"burn-blocks","s":"s","e":true,"k":"s","d":[219,222,264,336,338],"c":[]}]]}],["t",{"w":"burn-tokens","s":"tokens","e":true,"k":"t","d":[115],"c":[["-",{"w":"burn-tokens-from","s":"-from","e":true,"k":"-","d":[115],"c":[]}]]}],["n",{"w":"burn-nft","s":"nft","e":true,"k":"n","d":[135],"c":[]}],["s",{"w":"burn-stx","s":"stx","e":true,"k":"s","d":[143],"c":[]}]]}],["s",{"w":"burns","s":"s","e":true,"k":"s","d":[98,101,115,135,143,150,184,186,190,195,198],"c":[]}],["e",{"w":"burned","s":"ed","e":true,"k":"e","d":[115,135],"c":[]}],["_",{"w":"burn_","s":"_","e":false,"k":"_","d":[],"c":[["b",{"w":"burn_block_","s":"block_","e":false,"k":"b","d":[],"c":[["h",{"w":"burn_block_h","s":"h","e":false,"k":"h","d":[],"c":[["a",{"w":"burn_block_hash","s":"ash","e":true,"k":"a","d":[219,222,268],"c":[]}],["e",{"w":"burn_block_height","s":"eight","e":true,"k":"e","d":[219,222,265],"c":[]}]]}],["t",{"w":"burn_block_time","s":"time","e":true,"k":"t","d":[255],"c":[["_",{"w":"burn_block_time_iso","s":"_iso","e":true,"k":"_","d":[255],"c":[]}]]}]]}],["o",{"w":"burn_ops","s":"ops","e":true,"k":"o","d":[418],"c":[]}],["h",{"w":"burn_height","s":"height","e":true,"k":"h","d":[418],"c":[]}]]}]]}],["g",{"w":"bug","s":"g","e":false,"k":"g","d":[],"c":[["i",{"w":"bugicon","s":"icon","e":true,"k":"i","d":[44,466],"c":[]}],["s",{"w":"bugs","s":"s","e":true,"k":"s","d":[224,355],"c":[]}]]}],["s",{"w":"busy","s":"sy","e":true,"k":"s","d":[49],"c":[]}],["y",{"w":"buy","s":"y","e":true,"k":"y","d":[71,180,511,513],"c":[["i",{"w":"buying","s":"ing","e":true,"k":"i","d":[71,77],"c":[]}],["-",{"w":"buy-keys","s":"-keys","e":true,"k":"-","d":[71],"c":[]}],["s",{"w":"buys","s":"s","e":true,"k":"s","d":[71],"c":[]}],["e",{"w":"buyer","s":"er","e":true,"k":"e","d":[154,511,513],"c":[]}]]}],["l",{"w":"bulk","s":"lk","e":true,"k":"l","d":[77,105],"c":[]}],["d",{"w":"budget","s":"dget","e":true,"k":"d","d":[86],"c":[]}]]}],["a",{"w":"ba","s":"a","e":false,"k":"a","d":[],"c":[["s",{"w":"bas","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"basic","s":"ic","e":true,"k":"i","d":[2,8,12,18,27,29,30,45,65,69,71,78,79,80,81,97,100,102,112,122,123,137,140,160,178,203,204,225,226,227,245,347,348,349,350,378,423,439,462,511,513],"c":[["s",{"w":"basics","s":"s","e":true,"k":"s","d":[69,71],"c":[]}],["-",{"w":"basic-arithmetic","s":"-arithmetic","e":true,"k":"-","d":[78],"c":[]}]]}],["e",{"w":"base","s":"e","e":true,"k":"e","d":[12,71,185,229,233,245,348,367],"c":[["d",{"w":"based","s":"d","e":true,"k":"d","d":[12,52,69,71,77,79,87,90,93,95,96,102,105,110,112,114,119,124,133,136,137,139,140,146,147,154,158,161,170,171,172,173,176,177,178,179,183,190,191,195,196,202,239,245,348,371,372,374,376,377],"c":[]}],["p",{"w":"basepath","s":"path","e":true,"k":"p","d":[67,514,517],"c":[]}],["-",{"w":"base-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"base-price","s":"price","e":true,"k":"p","d":[71],"c":[]}],["2",{"w":"base-2","s":"2","e":true,"k":"2","d":[107],"c":[]}]]}],["u",{"w":"baseurl","s":"url","e":true,"k":"u","d":[229],"c":[]}],["6",{"w":"base64","s":"64","e":true,"k":"6","d":[351,356,366],"c":[]}]]}],["h",{"w":"bash","s":"h","e":true,"k":"h","d":[18,515,517],"c":[]}]]}],["d",{"w":"badge","s":"dge","e":true,"k":"d","d":[4,5,6,7,67,68,69,71,226,227,230,231,232,233,234,235,236,244,353,354,356,358,359,360,361,362,366,367,368,369,370,371,372],"c":[["'",{"w":"badge'","s":"'","e":true,"k":"'","d":[4,5,6,7,67,226,227,230,231,232,233,234,235,236,244,353,354,356,358,359,360,361,362,366,367,368,369,370,371,372],"c":[]}]]}],["l",{"w":"balance","s":"lance","e":true,"k":"l","d":[12,27,69,71,79,81,88,98,115,120,123,124,125,134,136,140,143,147,150,152,160,164,166,178,184,185,190,192,193,196,198,201,202,224,233,245,259,348,367,516],"c":[["s",{"w":"balances","s":"s","e":true,"k":"s","d":[7,27,29,71,77,81,123,134,137,140,152,164,185,190,193,198,201,224,361,427,449,486],"c":[["t",{"w":"balancestr","s":"tr","e":true,"k":"t","d":[88,120],"c":[]}],["'",{"w":"balances'","s":"'","e":true,"k":"'","d":[321,430,470],"c":[]}]]}],["-",{"w":"balance-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"balance-dependent","s":"dependent","e":true,"k":"d","d":[190],"c":[]}],["r",{"w":"balance-related","s":"related","e":true,"k":"r","d":[198],"c":[]}]]}]]}],["c",{"w":"back","s":"ck","e":true,"k":"c","d":[48,58,68,141,144,164,202,224,246,511,513,515],"c":[["u",{"w":"backup","s":"up","e":true,"k":"u","d":[14],"c":[]}],["e",{"w":"backend","s":"end","e":true,"k":"e","d":[44,466,510],"c":[["s",{"w":"backends","s":"s","e":true,"k":"s","d":[239],"c":[]}]]}],["-",{"w":"back-end","s":"-end","e":true,"k":"-","d":[44],"c":[]}],["w",{"w":"backwards","s":"wards","e":true,"k":"w","d":[119,219,222,355],"c":[]}],["g",{"w":"background","s":"ground","e":true,"k":"g","d":[375],"c":[]}]]}],["t",{"w":"batches","s":"tches","e":true,"k":"t","d":[27],"c":[]}],["n",{"w":"banner","s":"nner","e":true,"k":"n","d":[44,466,508],"c":[]}],["r",{"w":"bar","s":"r","e":true,"k":"r","d":[510,517],"c":[]}],["z",{"w":"baz","s":"z","e":true,"k":"z","d":[517],"c":[]}]]}],["l",{"w":"bl","s":"l","e":false,"k":"l","d":[],"c":[["o",{"w":"blo","s":"o","e":false,"k":"o","d":[],"c":[["c",{"w":"block","s":"ck","e":true,"k":"c","d":[5,7,9,12,14,17,19,22,27,50,52,68,69,86,95,99,104,114,122,127,156,160,161,163,194,202,208,219,220,221,222,224,245,258,261,262,265,268,269,348,359,361,371,372,374,376,377,379,437,459,477,511,513,516,517],"c":[["c",{"w":"blockchain","s":"chain","e":true,"k":"c","d":[2,8,11,12,13,14,15,17,18,22,27,28,31,44,45,49,50,51,52,53,54,55,64,67,68,69,70,71,74,77,78,80,86,95,104,122,123,127,156,160,161,178,188,202,203,204,208,219,221,222,225,228,230,232,233,240,241,244,245,256,257,258,259,274,345,347,348,349,350,352,357,365,367,371,372,373,374,376,377,378,379,381,382,383,384,385,386,387,399,420,423,425,443,466,501,504,505,509],"c":[["'",{"w":"blockchain's","s":"'s","e":true,"k":"'","d":[5,95,156,226,234,359,368],"c":[]}],["-",{"w":"blockchain-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"blockchain-api-client","s":"api-client","e":true,"k":"a","d":[64,244,259,365,382,383,384,385,386,387],"c":[["'",{"w":"blockchain-api-client'","s":"'","e":true,"k":"'","d":[64,65,67,365,382,383,384,385,386,387,514],"c":[]}]]}],["s",{"w":"blockchain-specific","s":"specific","e":true,"k":"s","d":[77,79,80,81,202],"c":[]}]]}],["s",{"w":"blockchains","s":"s","e":true,"k":"s","d":[68,230,353],"c":[]}]]}],["h",{"w":"blockh","s":"h","e":false,"k":"h","d":[],"c":[["e",{"w":"blockheight","s":"eight","e":true,"k":"e","d":[5,7,104,127,156,359,361],"c":[]}],["a",{"w":"blockhash","s":"ash","e":true,"k":"a","d":[161],"c":[]}]]}],["-",{"w":"block-","s":"-","e":false,"k":"-","d":[],"c":[["h",{"w":"block-height","s":"height","e":true,"k":"h","d":[7,12,69,95,102,104,114,127,156,161,176,191,202,221,245,348,361,511,513,516],"c":[["-",{"w":"block-height-int","s":"-int","e":true,"k":"-","d":[202],"c":[]}]]}],["r",{"w":"block-re","s":"re","e":false,"k":"r","d":[],"c":[["l",{"w":"block-related","s":"lated","e":true,"k":"l","d":[104,156],"c":[]}],["w",{"w":"block-reward","s":"ward","e":true,"k":"w","d":[127,156],"c":[]}]]}],["s",{"w":"block-specific","s":"specific","e":true,"k":"s","d":[156],"c":[]}],["a",{"w":"block-after-time","s":"after-time","e":true,"k":"a","d":[156],"c":[]}]]}],["s",{"w":"blocks","s":"s","e":true,"k":"s","d":[7,12,14,17,19,50,52,64,68,69,95,104,127,156,161,163,191,202,206,208,219,220,221,222,228,245,258,259,260,266,267,314,348,361,365,371,372,374,376,377,379,382,383,384,385,386,387,408,437,477],"c":[["t",{"w":"blockstack","s":"tack","e":true,"k":"t","d":[194,226,229,259,509],"c":[]}],["'",{"w":"blocks'","s":"'","e":true,"k":"'","d":[207,264],"c":[]}],["o",{"w":"blocksonly","s":"only","e":true,"k":"o","d":[515],"c":[]}]]}],["_",{"w":"block_","s":"_","e":false,"k":"_","d":[],"c":[["h",{"w":"block_h","s":"h","e":false,"k":"h","d":[],"c":[["e",{"w":"block_height","s":"eight","e":true,"k":"e","d":[52,219,222,255,372],"c":[]}],["a",{"w":"block_hash","s":"ash","e":true,"k":"a","d":[216,219,222,255],"c":[]}]]}],["p",{"w":"block_proposal","s":"proposal","e":false,"k":"p","d":[],"c":[["s",{"w":"block_proposals","s":"s","e":true,"k":"s","d":[216],"c":[["'",{"w":"block_proposals'","s":"'","e":true,"k":"'","d":[218],"c":[]}]]}],["'",{"w":"block_proposal'","s":"'","e":true,"k":"'","d":[389],"c":[]}]]}],["c",{"w":"block_committed","s":"committed","e":true,"k":"c","d":[371],"c":[]}],["i",{"w":"block_id","s":"id","e":true,"k":"i","d":[408,409],"c":[["e",{"w":"block_identif","s":"entif","e":false,"k":"e","d":[],"c":[["e",{"w":"block_identifer","s":"er","e":true,"k":"e","d":[377],"c":[]}],["i",{"w":"block_identifier","s":"ier","e":true,"k":"i","d":[377],"c":[]}]]}]]}],["t",{"w":"block_time","s":"time","e":true,"k":"t","d":[377],"c":[]}]]}],["'",{"w":"block's","s":"'s","e":true,"k":"'","d":[104,156],"c":[]}],["i",{"w":"blockinfopropertyname","s":"infopropertyname","e":true,"k":"i","d":[156],"c":[]}],["t",{"w":"blocktimeurl","s":"timeurl","e":true,"k":"t","d":[227,236,370],"c":[]}]]}],["b",{"w":"blob","s":"b","e":true,"k":"b","d":[27,28,69,226,234,235,236,259,346,355,356,366,368,369,370],"c":[]}],["g",{"w":"blog","s":"g","e":true,"k":"g","d":[50,371],"c":[]}]]}],["a",{"w":"blank","s":"ank","e":true,"k":"a","d":[52],"c":[]}]]}],["r",{"w":"br","s":"r","e":true,"k":"r","d":[2,8,18,31,45,54,203,204,208,225,228,347,349,350,373,399,459,502],"c":[["o",{"w":"bro","s":"o","e":false,"k":"o","d":[],"c":[["a",{"w":"broadcast","s":"adcast","e":true,"k":"a","d":[2,8,203,204,208,225,227,228,229,230,231,233,234,236,242,243,257,258,259,345,347,349,350,352,353,354,356,357,366,367,368,370,399,511,513],"c":[["i",{"w":"broadcasting","s":"ing","e":true,"k":"i","d":[7,27,226,230,234,242,350,353,361,368],"c":[["-",{"w":"broadcasting-the-transaction","s":"-the-transaction","e":true,"k":"-","d":[230],"c":[]}]]}],["t",{"w":"broadcastt","s":"t","e":false,"k":"t","d":[],"c":[["r",{"w":"broadcasttransaction","s":"ransaction","e":true,"k":"r","d":[226,227,229,230,234,236,242,243,368,370],"c":[]}],["x",{"w":"broadcasttx","s":"x","e":true,"k":"x","d":[233,367],"c":[]}]]}],["r",{"w":"broadcastresponse","s":"response","e":true,"k":"r","d":[226,230,243],"c":[]}],["-",{"w":"broadcast-transaction","s":"-transaction","e":true,"k":"-","d":[399],"c":[["s",{"w":"broadcast-transactions","s":"s","e":true,"k":"s","d":[228,231,243,350,352,354,357,511,513],"c":[]}]]}],["e",{"w":"broadcasted","s":"ed","e":true,"k":"e","d":[233,242,258,367],"c":[]}]]}],["k",{"w":"broken","s":"ken","e":true,"k":"k","d":[22],"c":[]}],["w",{"w":"browser","s":"wser","e":true,"k":"w","d":[53,67,226,227,352,357],"c":[["-",{"w":"browser-specific","s":"-specific","e":true,"k":"-","d":[232],"c":[]}]]}]]}],["e",{"w":"bre","s":"e","e":false,"k":"e","d":[],"c":[["a",{"w":"break","s":"ak","e":true,"k":"a","d":[26,68,129],"c":[["d",{"w":"breakdown","s":"down","e":true,"k":"d","d":[9],"c":[]}],["p",{"w":"breakpoint","s":"point","e":true,"k":"p","d":[26],"c":[["s",{"w":"breakpoints","s":"s","e":true,"k":"s","d":[26],"c":[]}]]}],["i",{"w":"breaking","s":"ing","e":true,"k":"i","d":[50,108,171,219,229,351],"c":[]}],["s",{"w":"breaks","s":"s","e":true,"k":"s","d":[229],"c":[]}]]}],["w",{"w":"brew","s":"w","e":true,"k":"w","d":[9,18,75,380,517],"c":[]}],["v",{"w":"brevity","s":"vity","e":true,"k":"v","d":[229],"c":[]}]]}],["a",{"w":"bra","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"branch","s":"nch","e":true,"k":"n","d":[9,170],"c":[["e",{"w":"branches","s":"es","e":true,"k":"e","d":[121,163,170],"c":[]}],["i",{"w":"branching","s":"ing","e":true,"k":"i","d":[170,196],"c":[]}]]}],["c",{"w":"braces","s":"ces","e":true,"k":"c","d":[44,64,365,382,383,384,385,386,387],"c":[]}]]}],["i",{"w":"bri","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"bring","s":"ng","e":true,"k":"n","d":[45,73,219],"c":[["s",{"w":"brings","s":"s","e":true,"k":"s","d":[219],"c":[]}]]}],["e",{"w":"briefly","s":"efly","e":true,"k":"e","d":[68],"c":[]}]]}],["c",{"w":"brc","s":"c","e":false,"k":"c","d":[],"c":[["-",{"w":"brc-20","s":"-20","e":true,"k":"-","d":[54,74,420,422,423,425,443,447,449,450,451,452,459,484,486,487,488,489,502],"c":[]}],["2",{"w":"brc20","s":"20","e":true,"k":"2","d":[459],"c":[]}]]}]]}],["e",{"w":"be","s":"e","e":true,"k":"e","d":[4,6,7,8,9,10,12,14,15,16,17,18,22,24,28,46,47,48,49,51,52,53,55,58,67,68,69,71,72,73,77,79,80,81,82,83,84,86,87,88,89,90,91,92,94,95,96,97,98,99,100,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,120,121,123,125,126,127,128,129,130,132,133,134,137,139,140,141,142,144,145,146,147,149,152,153,154,155,156,158,161,162,163,164,165,167,168,170,171,172,173,174,176,177,178,179,180,181,182,183,185,186,187,188,189,190,191,192,193,194,196,197,200,202,219,221,222,223,226,227,228,229,230,231,233,234,236,238,241,242,244,245,246,257,258,259,345,348,352,355,356,358,360,361,362,366,367,368,370,372,374,375,376,377,378,379,509,511,513,514,515,516,517],"c":[["g",{"w":"begin","s":"gin","e":true,"k":"g","d":[6,7,26,28,47,69,71,79,81,83,99,100,102,108,115,122,124,128,129,136,137,147,152,160,163,164,166,171,176,178,191,192,196,201,360,361,375,377,511,513,516,517],"c":[]}],["i",{"w":"being","s":"ing","e":true,"k":"i","d":[7,14,17,28,51,52,53,71,73,86,90,105,119,124,136,139,146,147,156,173,189,219,222,223,233,361,367],"c":[]}],["f",{"w":"before","s":"fore","e":true,"k":"f","d":[9,14,18,19,50,53,68,69,71,73,75,77,79,80,81,101,104,112,115,123,125,126,135,147,149,163,178,182,190,193,196,201,227,234,235,236,246,258,353,354,368,369,370,379,423,502,515],"c":[]}],["e",{"w":"been","s":"en","e":true,"k":"e","d":[9,27,30,52,68,69,71,72,80,123,144,219,224,246,355,356,366,374,377,511,513],"c":[]}],["h",{"w":"beh","s":"h","e":false,"k":"h","d":[],"c":[["a",{"w":"beha","s":"a","e":false,"k":"a","d":[],"c":[["v",{"w":"behav","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"behaves","s":"es","e":true,"k":"e","d":[9],"c":[]}],["i",{"w":"behavior","s":"ior","e":true,"k":"i","d":[77,80,83,84,85,86,87,93,94,95,98,100,101,102,106,107,108,109,111,112,114,117,118,119,121,124,129,131,133,135,136,137,138,139,140,141,142,143,145,146,148,149,150,151,153,154,157,158,159,162,164,166,167,168,169,174,175,176,179,180,181,182,184,186,191,192,194,196,198,199,200,201,202,208,226,229,231,234,352,356,366,368],"c":[["s",{"w":"behaviors","s":"s","e":true,"k":"s","d":[149,152,156,192],"c":[]}],["a",{"w":"behavioral","s":"al","e":true,"k":"a","d":[208],"c":[]}]]}]]}],["l",{"w":"behalf","s":"lf","e":true,"k":"l","d":[356,366],"c":[]}]]}],["i",{"w":"behind","s":"ind","e":true,"k":"i","d":[71],"c":[]}]]}],["l",{"w":"below","s":"low","e":true,"k":"l","d":[9,12,14,18,21,22,46,48,51,52,58,67,69,75,219,224,226,227,229,245,348,374,376,377,379,509,514],"c":[]}],["t",{"w":"bet","s":"t","e":false,"k":"t","d":[],"c":[["w",{"w":"between","s":"ween","e":true,"k":"w","d":[12,27,76,81,90,92,93,114,115,121,123,125,128,140,144,145,150,152,154,160,176,178,182,184,187,190,191,201,222,229,245,348,356,366,372,517],"c":[]}],["t",{"w":"better","s":"ter","e":true,"k":"t","d":[26,45,51,82,83,84,85,86,88,89,91,92,94,97,98,101,105,106,107,108,109,110,111,116,117,118,120,121,124,131,132,134,135,136,138,139,141,142,143,146,147,148,150,151,153,155,157,159,162,163,165,166,167,168,169,170,171,172,173,175,181,183,184,185,186,189,194,195,196,197,198,199,200,219,229,240,373,422,502],"c":[]}],["a",{"w":"beta","s":"a","e":true,"k":"a","d":[48],"c":[]}]]}],["c",{"w":"bec","s":"c","e":false,"k":"c","d":[],"c":[["a",{"w":"because","s":"ause","e":true,"k":"a","d":[12,28,51,101,109,135,186,221,224,245,348,374,377],"c":[]}],["o",{"w":"becoming","s":"oming","e":true,"k":"o","d":[100],"c":[]}]]}],["n",{"w":"benefi","s":"nefi","e":false,"k":"n","d":[],"c":[["t",{"w":"benefit","s":"t","e":true,"k":"t","d":[13],"c":[["s",{"w":"benefits","s":"s","e":true,"k":"s","d":[50],"c":[]}]]}],["c",{"w":"beneficiary","s":"ciary","e":true,"k":"c","d":[102],"c":[]}]]}],["y",{"w":"beyond","s":"yond","e":true,"k":"y","d":[27,51,68,174,180],"c":[]}],["s",{"w":"best","s":"st","e":true,"k":"s","d":[65,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,233,367,439,462],"c":[]}],["a",{"w":"bear","s":"ar","e":true,"k":"a","d":[355],"c":[["e",{"w":"bearer","s":"er","e":true,"k":"e","d":[68,374,379],"c":[]}]]}]]}],["o",{"w":"bo","s":"o","e":false,"k":"o","d":[],"c":[["o",{"w":"boo","s":"o","e":false,"k":"o","d":[],"c":[["l",{"w":"bool","s":"l","e":true,"k":"l","d":[6,7,9,69,76,79,81,89,90,97,101,108,115,119,123,124,132,135,136,139,143,146,147,150,152,155,163,165,167,169,173,175,178,184,186,193,196,224,226,234,360,361,368,511,513,516],"c":[["e",{"w":"boolean","s":"ean","e":true,"k":"e","d":[6,22,51,108,113,114,154,155,165,170,171,176,177,191,193,196,224,226,229,234,356,360,366,368],"c":[["-",{"w":"boolean-expression","s":"-expression","e":true,"k":"-","d":[155],"c":[]}],["c",{"w":"booleancv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}]]}],["-",{"w":"bool-expr","s":"-expr","e":true,"k":"-","d":[193],"c":[]}],["t",{"w":"booltrue","s":"true","e":true,"k":"t","d":[514],"c":[]}]]}],["t",{"w":"boot","s":"t","e":false,"k":"t","d":[],"c":[["s",{"w":"bootstrap","s":"strap","e":true,"k":"s","d":[13,54,69,516],"c":[["p",{"w":"bootstrapping","s":"ping","e":true,"k":"p","d":[69],"c":[]}],["_",{"w":"bootstrap_node","s":"_node","e":true,"k":"_","d":[374],"c":[]}]]}],["e",{"w":"booted","s":"ed","e":true,"k":"e","d":[27],"c":[]}],["i",{"w":"booting","s":"ing","e":true,"k":"i","d":[55],"c":[]}],["a",{"w":"bootaddress","s":"address","e":true,"k":"a","d":[235,369],"c":[]}]]}],["k",{"w":"book","s":"k","e":true,"k":"k","d":[22,27],"c":[]}]]}],["x",{"w":"box","s":"x","e":true,"k":"x","d":[8],"c":[]}],["r",{"w":"bor","s":"r","e":false,"k":"r","d":[],"c":[["r",{"w":"borrow","s":"row","e":true,"k":"r","d":[12,245,348],"c":[["e",{"w":"borrowe","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"borrower's","s":"r's","e":true,"k":"r","d":[12,245,348],"c":[]}],["d",{"w":"borrowed","s":"d","e":true,"k":"d","d":[12,245,348],"c":[]}]]}],["i",{"w":"borrowing","s":"ing","e":true,"k":"i","d":[12,245,348],"c":[]}],["s",{"w":"borrows","s":"s","e":true,"k":"s","d":[12,245,348],"c":[]}]]}],["d",{"w":"border","s":"der","e":true,"k":"d","d":[352],"c":[["-",{"w":"border-","s":"-","e":false,"k":"-","d":[],"c":[["b",{"w":"border-b","s":"b","e":true,"k":"b","d":[18,27,377],"c":[["o",{"w":"border-border","s":"order","e":true,"k":"o","d":[352],"c":[]}]]}],["d",{"w":"border-dotted","s":"dotted","e":true,"k":"d","d":[18,27,377],"c":[]}],["p",{"w":"border-primary'","s":"primary'","e":true,"k":"p","d":[18,27,377],"c":[]}]]}]]}]]}],["i",{"w":"boilerplate","s":"ilerplate","e":true,"k":"i","d":[12,69,71,224,232,245,246,348,374,378],"c":[]}],["t",{"w":"bot","s":"t","e":false,"k":"t","d":[],"c":[["h",{"w":"both","s":"h","e":true,"k":"h","d":[14,47,53,70,83,84,85,87,93,94,98,101,105,106,107,109,110,111,114,117,118,124,131,132,134,135,136,138,139,141,142,143,144,145,146,147,148,150,153,154,155,157,159,162,164,165,166,167,168,169,172,175,176,179,181,182,183,184,186,189,191,194,195,196,197,198,199,200,219,220,227,236,355,370,374,376],"c":[]}],["t",{"w":"bottom-0","s":"tom-0","e":true,"k":"t","d":[352],"c":[]}]]}],["d",{"w":"bod","s":"d","e":false,"k":"d","d":[],"c":[["y",{"w":"body","s":"y","e":true,"k":"y","d":[51,68,171,227,236,255,346,370],"c":[]}],["i",{"w":"bodies","s":"ies","e":true,"k":"i","d":[163],"c":[]}]]}],["u",{"w":"bou","s":"u","e":false,"k":"u","d":[],"c":[["g",{"w":"bought","s":"ght","e":true,"k":"g","d":[71],"c":[]}],["n",{"w":"bound","s":"nd","e":false,"k":"n","d":[],"c":[["s",{"w":"bounds","s":"s","e":true,"k":"s","d":[109,180,194],"c":[]}],["a",{"w":"boundary","s":"ary","e":true,"k":"a","d":[176,191],"c":[]}]]}]]}],["a",{"w":"board","s":"ard","e":true,"k":"a","d":[229],"c":[]}]]}],["i",{"w":"bi","s":"i","e":false,"k":"i","d":[],"c":[["g",{"w":"big","s":"g","e":false,"k":"g","d":[],"c":[["i",{"w":"bigint","s":"int","e":true,"k":"i","d":[6,7,229,233,360,361,367],"c":[]}],["g",{"w":"biggest","s":"gest","e":true,"k":"g","d":[73],"c":[]}],["-",{"w":"big-endian","s":"-endian","e":true,"k":"-","d":[87,133,142,158,179],"c":[]}],["n",{"w":"bignum","s":"num","e":true,"k":"n","d":[227],"c":[]}]]}],["t",{"w":"bit","s":"t","e":true,"k":"t","d":[76,113,128,130,145,174,187],"c":[["c",{"w":"bitcoin","s":"coin","e":true,"k":"c","d":[11,18,19,27,31,44,45,52,53,54,74,95,202,219,220,221,222,228,233,256,367,371,373,374,376,378,379,381,420,422,423,425,427,443,459,466,501,502,504,505,509,510,515],"c":[["i",{"w":"bitcoinicon","s":"icon","e":true,"k":"i","d":[11,256,381,420,501,505],"c":[]}],["-",{"w":"bitcoin-","s":"-","e":false,"k":"-","d":[],"c":[["n",{"w":"bitcoin-node","s":"node","e":true,"k":"n","d":[27,32],"c":[]}],["d",{"w":"bitcoin-da","s":"da","e":false,"k":"d","d":[],"c":[["o",{"w":"bitcoin-dao","s":"o","e":true,"k":"o","d":[27],"c":[]}],["t",{"w":"bitcoin-data","s":"ta","e":true,"k":"t","d":[515],"c":[]}]]}],["p",{"w":"bitcoin-predicates","s":"predicates","e":true,"k":"p","d":[52,373],"c":[]}],["s",{"w":"bitcoin-style","s":"style","e":true,"k":"s","d":[188],"c":[]}],["t",{"w":"bitcoin-transactions","s":"transactions","e":true,"k":"t","d":[376],"c":[]}],["h",{"w":"bitcoin-hero","s":"hero","e":true,"k":"h","d":[466],"c":[]}],["i",{"w":"bitcoin-indexer","s":"indexer","e":true,"k":"i","d":[502,504],"c":[["-",{"w":"bitcoin-indexer-install","s":"-install","e":true,"k":"-","d":[502,504],"c":[]}]]}],["c",{"w":"bitcoin-c","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"bitcoin-core-25","s":"ore-25","e":true,"k":"o","d":[515],"c":[]}],["l",{"w":"bitcoin-cli","s":"li","e":true,"k":"l","d":[515],"c":[]}]]}],["2",{"w":"bitcoin-25","s":"25","e":true,"k":"2","d":[515],"c":[]}]]}],["d",{"w":"bitcoind","s":"d","e":true,"k":"d","d":[52,376,515],"c":[["_",{"w":"bitcoind_","s":"_","e":false,"k":"_","d":[],"c":[["u",{"w":"bitcoind_username","s":"username","e":true,"k":"u","d":[374],"c":[]}],["p",{"w":"bitcoind_password","s":"password","e":true,"k":"p","d":[374],"c":[]}],["r",{"w":"bitcoind_rpc_","s":"rpc_","e":false,"k":"r","d":[],"c":[["u",{"w":"bitcoind_rpc_u","s":"u","e":false,"k":"u","d":[],"c":[["s",{"w":"bitcoind_rpc_username","s":"sername","e":true,"k":"s","d":[374,376],"c":[]}],["r",{"w":"bitcoind_rpc_url","s":"rl","e":true,"k":"r","d":[374,376],"c":[]}]]}],["p",{"w":"bitcoind_rpc_password","s":"password","e":true,"k":"p","d":[374,376],"c":[]}]]}],["z",{"w":"bitcoind_zmq_url","s":"zmq_url","e":true,"k":"z","d":[374,376],"c":[]}]]}]]}],["c",{"w":"bitcoinc","s":"c","e":false,"k":"c","d":[],"c":[["h",{"w":"bitcoinchangeaddress","s":"hangeaddress","e":true,"k":"h","d":[233,367],"c":[]}],["o",{"w":"bitcoincore","s":"ore","e":true,"k":"o","d":[515],"c":[]}]]}],["n",{"w":"bitcoinnetwork","s":"network","e":true,"k":"n","d":[233,367],"c":[]}]]}],["f",{"w":"bitfield","s":"field","e":true,"k":"f","d":[76,113],"c":[["s",{"w":"bitfields","s":"s","e":true,"k":"s","d":[76],"c":[]}]]}],["w",{"w":"bitwise","s":"wise","e":true,"k":"w","d":[76,93,113,128,130,145,174,187],"c":[]}],["-",{"w":"bit-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"bit-and","s":"and","e":true,"k":"a","d":[76,113,128,130,145,174,187],"c":[]}],["o",{"w":"bit-or","s":"or","e":true,"k":"o","d":[76,113,128,130,174,187],"c":[]}],["n",{"w":"bit-not","s":"not","e":true,"k":"n","d":[76,113,128,130,187],"c":[]}],["x",{"w":"bit-xor","s":"xor","e":true,"k":"x","d":[113,128,130,187],"c":[]}],["s",{"w":"bit-shift-","s":"shift-","e":false,"k":"s","d":[],"c":[["l",{"w":"bit-shift-left","s":"left","e":true,"k":"l","d":[128,130,145,174,187],"c":[]}],["r",{"w":"bit-shift-right","s":"right","e":true,"k":"r","d":[128,130,145,174,187],"c":[]}]]}],["l",{"w":"bit-level","s":"level","e":true,"k":"l","d":[128,130],"c":[]}]]}],["s",{"w":"bits","s":"s","e":true,"k":"s","d":[76,113,128,130,145,174,187],"c":[]}],["m",{"w":"bitmask","s":"mask","e":true,"k":"m","d":[76,187],"c":[["i",{"w":"bitmasking","s":"ing","e":true,"k":"i","d":[113],"c":[]}],["s",{"w":"bitmasks","s":"s","e":true,"k":"s","d":[130,174,187],"c":[]}]]}]]}],["n",{"w":"bin","s":"n","e":true,"k":"n","d":[18,515,517],"c":[["a",{"w":"binary","s":"ary","e":true,"k":"a","d":[18,128,130,145,174,187],"c":[]}],["d",{"w":"bind","s":"d","e":true,"k":"d","d":[171],"c":[["i",{"w":"binding","s":"ing","e":true,"k":"i","d":[82,171],"c":[["s",{"w":"bindings","s":"s","e":true,"k":"s","d":[163,171],"c":[]}]]}],["s",{"w":"binds","s":"s","e":true,"k":"s","d":[170],"c":[]}]]}]]}],["d",{"w":"bid","s":"d","e":true,"k":"d","d":[114],"c":[]}],["p",{"w":"bip84","s":"p84","e":true,"k":"p","d":[371],"c":[]}]]}],["t",{"w":"btc","s":"tc","e":true,"k":"t","d":[6,19,27,219,220,233,352,356,360,366,367,379],"c":[["-",{"w":"btc-transfer","s":"-transfer","e":true,"k":"-","d":[25,27],"c":[]}],["_",{"w":"btc_address","s":"_address","e":true,"k":"_","d":[221,233,367],"c":[]}],["a",{"w":"btcapiurl","s":"apiurl","e":true,"k":"a","d":[233,367],"c":[]}]]}],["y",{"w":"by","s":"y","e":true,"k":"y","d":[7,9,11,12,14,15,17,18,20,22,27,28,30,44,47,49,51,52,53,64,67,68,69,71,75,76,77,79,80,81,82,83,84,85,86,87,89,90,91,92,94,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,116,117,118,119,121,123,124,125,126,127,129,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,189,191,192,193,194,195,196,197,198,199,200,201,202,219,220,221,222,224,226,227,229,230,231,232,233,234,238,239,240,241,244,245,246,255,256,258,259,346,348,351,352,355,356,357,361,365,366,367,368,371,372,374,375,376,377,379,381,382,383,384,385,386,387,399,422,426,427,444,459,501,502,505,511,513,515,516],"c":[["t",{"w":"byte","s":"te","e":true,"k":"t","d":[87,133,158,179,182,226,229,233,234,242,367,368,371],"c":[["s",{"w":"bytes","s":"s","e":true,"k":"s","d":[22,27,87,133,158,179,188,226,229,234,239,368,372],"c":[["t",{"w":"bytestohex","s":"tohex","e":true,"k":"t","d":[226],"c":[]}],["r",{"w":"bytesreader","s":"reader","e":true,"k":"r","d":[226,234,368],"c":[]}]]}]]}],["_",{"w":"by_","s":"_","e":false,"k":"_","d":[],"c":[["h",{"w":"by_height","s":"height","e":true,"k":"h","d":[219,222,269],"c":[]}],["b",{"w":"by_burn_block_h","s":"burn_block_h","e":false,"k":"b","d":[],"c":[["a",{"w":"by_burn_block_hash","s":"ash","e":true,"k":"a","d":[219,222,268],"c":[]}],["e",{"w":"by_burn_block_height","s":"eight","e":true,"k":"e","d":[219,222,265],"c":[]}]]}],["t",{"w":"by_trait'","s":"trait'","e":true,"k":"t","d":[330],"c":[]}]]}],["p",{"w":"byp","s":"p","e":false,"k":"p","d":[],"c":[["r",{"w":"byproducts","s":"roducts","e":true,"k":"r","d":[259],"c":[]}],["a",{"w":"bypasses","s":"asses","e":true,"k":"a","d":[356,366],"c":[]}]]}]]}],["g",{"w":"bg-","s":"g-","e":false,"k":"g","d":[],"c":[["o",{"w":"bg-orange-","s":"orange-","e":false,"k":"o","d":[],"c":[["5",{"w":"bg-orange-500","s":"500","e":true,"k":"5","d":[13,45,74,425,443],"c":[]}],["6",{"w":"bg-orange-600","s":"600","e":true,"k":"6","d":[13,45,74,425,443],"c":[]}]]}],["b",{"w":"bg-background","s":"background","e":true,"k":"b","d":[44,259,466,508],"c":[]}],["c",{"w":"bg-c","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"bg-contrast","s":"ontrast","e":true,"k":"o","d":[244],"c":[]}],["a",{"w":"bg-card","s":"ard","e":true,"k":"a","d":[352],"c":[]}]]}],["a",{"w":"bg-accent","s":"accent","e":true,"k":"a","d":[244],"c":[]}],["r",{"w":"bg-red-200","s":"red-200","e":true,"k":"r","d":[517],"c":[]}]]}],["c",{"w":"bc","s":"c","e":false,"k":"c","d":[],"c":[["r",{"w":"bcrt1q","s":"rt1q","e":false,"k":"r","d":[],"c":[["n",{"w":"bcrt1qnxknq3wqtphv7sfwy07m7e4sr6ut9yt6ed99jg","s":"nxknq3wqtphv7sfwy07m7e4sr6ut9yt6ed99jg","e":true,"k":"n","d":[25,27],"c":[]}],["z",{"w":"bcrt1qzy2rdyvu8c57qd8exyyp0mw7dk5drsu9ewzdsu","s":"zy2rdyvu8c57qd8exyyp0mw7dk5drsu9ewzdsu","e":true,"k":"z","d":[371],"c":[]}],["s",{"w":"bcrt1qsfsjnagr29m8h3a3vdand2s85cg4cefkcwk2fy","s":"sfsjnagr29m8h3a3vdand2s85cg4cefkcwk2fy","e":true,"k":"s","d":[371],"c":[]}],["a",{"w":"bcrt1qauewfytqe5mtr0xwp786r6fl39kmum2lr65kmj","s":"auewfytqe5mtr0xwp786r6fl39kmum2lr65kmj","e":true,"k":"a","d":[371],"c":[]}]]}],["1",{"w":"bc1","s":"1","e":false,"k":"1","d":[],"c":[["p",{"w":"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae","s":"pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae","e":true,"k":"p","d":[352,356,366],"c":[]}],["q",{"w":"bc1q","s":"q","e":false,"k":"q","d":[],"c":[["t",{"w":"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr","s":"tmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr","e":true,"k":"t","d":[356,366],"c":[]}],["s",{"w":"bc1qs0kkdpsrzh3ngqgth7mkavlwlzr7lms2zv3wxe","s":"s0kkdpsrzh3ngqgth7mkavlwlzr7lms2zv3wxe","e":true,"k":"s","d":[376],"c":[]}]]}]]}]]}],["n",{"w":"bns","s":"ns","e":true,"k":"n","d":[67,226,227,244,259],"c":[]}],["1",{"w":"b1","s":"1","e":true,"k":"1","d":[108,165],"c":[]}],["2",{"w":"b2","s":"2","e":true,"k":"2","d":[108,165],"c":[["4",{"w":"b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01","s":"44296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01","e":true,"k":"4","d":[230],"c":[]}]]}],["d",{"w":"bdd","s":"dd","e":true,"k":"d","d":[231],"c":[]}]]}],["y",{"w":"y","s":"y","e":true,"k":"y","d":[517],"c":[["o",{"w":"you","s":"ou","e":true,"k":"o","d":[4,7,8,9,12,13,14,15,16,17,18,19,20,22,23,24,26,27,28,29,30,31,44,45,46,47,48,49,50,51,52,53,54,55,58,65,67,68,69,70,71,72,73,74,75,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,208,219,221,223,224,226,227,228,229,230,231,232,233,234,235,237,238,239,241,243,245,246,255,257,258,259,345,348,350,352,353,354,355,356,357,358,361,362,366,367,368,369,371,372,373,374,375,376,377,378,379,399,422,423,425,426,427,443,444,459,466,502,504,509,510,511,513,515,516,517],"c":[["r",{"w":"your","s":"r","e":true,"k":"r","d":[2,7,8,9,11,12,14,15,17,18,19,20,21,22,23,25,26,27,28,29,30,31,44,45,46,47,48,49,50,51,52,53,54,58,67,68,69,70,71,72,73,74,75,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,100,101,102,103,105,106,107,109,110,111,112,113,114,115,116,117,118,120,121,122,123,124,125,126,128,129,131,132,133,135,136,137,138,139,140,141,142,143,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,175,176,178,179,180,181,182,183,184,185,186,187,188,189,190,191,194,195,196,197,198,199,200,201,202,203,204,219,224,225,226,227,228,229,230,233,234,243,245,246,256,257,345,347,348,349,350,352,353,354,355,356,357,361,366,367,368,371,372,373,374,375,376,377,378,379,381,399,420,422,423,424,425,426,427,443,444,459,466,501,502,504,505,509,510,515,516,517],"c":[["-",{"w":"your-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"your-p","s":"p","e":false,"k":"p","d":[],"c":[["o",{"w":"your-port-number","s":"ort-number","e":true,"k":"o","d":[68],"c":[]}],["r",{"w":"your-predicate-file","s":"redicate-file","e":true,"k":"r","d":[379],"c":[]}],["a",{"w":"your-path-to","s":"ath-to","e":true,"k":"a","d":[515],"c":[]}]]}],["h",{"w":"your-https-server-url","s":"https-server-url","e":true,"k":"h","d":[68],"c":[]}],["a",{"w":"your-anon-key","s":"anon-key","e":true,"k":"a","d":[68],"c":[]}],["b",{"w":"your-bitcoin-predicate","s":"bitcoin-predicate","e":true,"k":"b","d":[379],"c":[]}],["s",{"w":"your-stacks-predicate","s":"stacks-predicate","e":true,"k":"s","d":[379],"c":[]}],["r",{"w":"your-rpc-","s":"rpc-","e":false,"k":"r","d":[],"c":[["u",{"w":"your-rpc-username","s":"username","e":true,"k":"u","d":[515],"c":[]}],["p",{"w":"your-rpc-password","s":"password","e":true,"k":"p","d":[515],"c":[]}]]}]]}],["_",{"w":"your_btc_","s":"_btc_","e":false,"k":"_","d":[],"c":[["p",{"w":"your_btc_private_key","s":"private_key","e":true,"k":"p","d":[233,367],"c":[]}],["a",{"w":"your_btc_address","s":"address","e":true,"k":"a","d":[233,367],"c":[]}]]}],["s",{"w":"yourself","s":"self","e":true,"k":"s","d":[422,502,515],"c":[]}]]}],["'",{"w":"you'","s":"'","e":false,"k":"'","d":[],"c":[["d",{"w":"you'd","s":"d","e":true,"k":"d","d":[7,361],"c":[]}],["l",{"w":"you'll","s":"ll","e":true,"k":"l","d":[9,14,30,31,47,49,50,52,68,69,71,375],"c":[]}],["v",{"w":"you've","s":"ve","e":true,"k":"v","d":[16,51,68,69,71,243,377],"c":[]}],["r",{"w":"you're","s":"re","e":true,"k":"r","d":[19,47,49,68,73,79,126,180,182,201,230,257,345,353,515],"c":[]}]]}],["t",{"w":"youtube","s":"tube","e":true,"k":"t","d":[70,72],"c":[]}]]}],["i",{"w":"yield","s":"ield","e":true,"k":"i","d":[11,256,381,501,505,516],"c":[["-",{"w":"yield-generating","s":"-generating","e":true,"k":"-","d":[516],"c":[]}]]}],["y",{"w":"yyyymmdd","s":"yyymmdd","e":true,"k":"y","d":[14,15,17],"c":[]}],["a",{"w":"yaml","s":"aml","e":true,"k":"a","d":[25,27,259],"c":[]}],["e",{"w":"ye","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"yet","s":"t","e":true,"k":"t","d":[48,71,234,351,368],"c":[]}],["a",{"w":"year","s":"ar","e":true,"k":"a","d":[73,102,176],"c":[["'",{"w":"year's","s":"'s","e":true,"k":"'","d":[73],"c":[]}]]}],["s",{"w":"yes","s":"s","e":true,"k":"s","d":[79],"c":[]}]]}]]}],["a",{"w":"a","s":"a","e":true,"k":"a","d":[2,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,22,23,24,25,26,27,28,29,30,31,44,45,46,47,48,49,50,51,52,53,54,55,58,64,65,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,208,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,255,256,257,258,259,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,381,382,383,384,385,386,387,399,422,423,425,426,427,443,444,459,466,501,502,504,505,509,510,511,513,514,515,516,517],"c":[["p",{"w":"ap","s":"p","e":false,"k":"p","d":[],"c":[["p",{"w":"app","s":"p","e":true,"k":"p","d":[2,8,11,31,44,45,47,53,67,68,71,203,204,219,225,226,227,228,232,256,347,349,350,352,355,356,357,366,376,379,381,420,423,459,501,505],"c":[["r",{"w":"appro","s":"ro","e":false,"k":"r","d":[],"c":[["a",{"w":"approach","s":"ach","e":true,"k":"a","d":[9,73,79,90,219,220,238,355],"c":[["e",{"w":"approaches","s":"es","e":true,"k":"e","d":[47],"c":[]}]]}],["p",{"w":"appropriate","s":"priate","e":true,"k":"p","d":[14,15,17,20,79,83,86,95,97,100,102,103,112,122,137,140,149,156,170,173,174,180,188,377,516],"c":[["l",{"w":"appropriately","s":"ly","e":true,"k":"l","d":[77,110,124,136,139,146,188,196],"c":[]}]]}],["v",{"w":"approv","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"approve","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"approved","s":"d","e":true,"k":"d","d":[69,356,366],"c":[["p",{"w":"approvedproviderids","s":"providerids","e":true,"k":"p","d":[356,366],"c":[]}]]}],["r",{"w":"approver_","s":"r_","e":false,"k":"r","d":[],"c":[["o",{"w":"approver_one","s":"one","e":true,"k":"o","d":[81],"c":[]}],["t",{"w":"approver_two","s":"two","e":true,"k":"t","d":[81],"c":[]}]]}],["-",{"w":"approve-transaction","s":"-transaction","e":true,"k":"-","d":[81],"c":[]}]]}],["a",{"w":"approval","s":"al","e":true,"k":"a","d":[81],"c":[]}]]}],["x",{"w":"approximately","s":"ximately","e":true,"k":"x","d":[69,191],"c":[]}]]}],["e",{"w":"appe","s":"e","e":false,"k":"e","d":[],"c":[["a",{"w":"appear","s":"ar","e":true,"k":"a","d":[9,51,510],"c":[]}],["n",{"w":"append","s":"nd","e":true,"k":"n","d":[82,109,126,149,180,182],"c":[["i",{"w":"appending","s":"ing","e":true,"k":"i","d":[126,149,374,376],"c":[]}],["s",{"w":"appends","s":"s","e":true,"k":"s","d":[126],"c":[]}],["e",{"w":"appended","s":"ed","e":true,"k":"e","d":[149,226,234,368],"c":[]}],["o",{"w":"appendorigin","s":"origin","e":true,"k":"o","d":[226,234,368],"c":[]}],["a",{"w":"appendation","s":"ation","e":true,"k":"a","d":[376],"c":[]}]]}]]}],["a",{"w":"apparent","s":"arent","e":true,"k":"a","d":[12,245,348],"c":[]}],["s",{"w":"apps","s":"s","e":true,"k":"s","d":[18,31,44,45,67,68,226,227,228,239,244,373],"c":[["k",{"w":"appskey","s":"key","e":true,"k":"k","d":[239],"c":[]}]]}],["l",{"w":"appl","s":"l","e":false,"k":"l","d":[],"c":[["y",{"w":"apply","s":"y","e":true,"k":"y","d":[25,68,76,96,105,377,517],"c":[["i",{"w":"applying","s":"ing","e":true,"k":"i","d":[96,105,177,187],"c":[]}]]}],["i",{"w":"appli","s":"i","e":false,"k":"i","d":[],"c":[["c",{"w":"applica","s":"ca","e":false,"k":"c","d":[],"c":[["t",{"w":"application","s":"tion","e":true,"k":"t","d":[27,31,49,58,68,69,71,79,80,81,93,178,202,229,353,354,374,376,515],"c":[["s",{"w":"applications","s":"s","e":true,"k":"s","d":[44,45,52,68,77,78,80,87,95,99,119,123,125,127,133,134,152,156,158,178,179,190,219,232,242,244,350,352,510],"c":[]}],["'",{"w":"application's","s":"'s","e":true,"k":"'","d":[68],"c":[]}]]}],["b",{"w":"applicable","s":"ble","e":true,"k":"b","d":[65,73,92,97,100,117,119,122,129,134,152,160,439,462,510],"c":[]}]]}],["e",{"w":"applie","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"applies","s":"s","e":true,"k":"s","d":[96,177,183],"c":[]}],["d",{"w":"applied","s":"d","e":true,"k":"d","d":[105],"c":[]}]]}]]}]]}],["c",{"w":"appconfig","s":"config","e":true,"k":"c","d":[67,226,227,355],"c":[]}],["d",{"w":"appd","s":"d","e":false,"k":"d","d":[],"c":[["o",{"w":"appdomain","s":"omain","e":true,"k":"o","d":[67,226,227],"c":[]}],["e",{"w":"appdetails","s":"etails","e":true,"k":"e","d":[240],"c":[]}]]}],["'",{"w":"app'","s":"'","e":true,"k":"'","d":[354],"c":[["s",{"w":"app's","s":"s","e":true,"k":"s","d":[226,227],"c":[]}]]}]]}],["i",{"w":"api","s":"i","e":true,"k":"i","d":[2,8,9,11,12,13,14,15,17,22,27,31,44,45,50,51,52,54,55,58,64,65,67,68,74,203,204,208,219,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,244,245,246,255,256,257,258,259,345,346,347,348,349,350,356,365,366,367,368,369,370,371,372,374,376,377,379,381,382,383,384,385,386,387,399,420,422,423,425,427,439,443,459,462,466,501,502,504,505,509,514,515,517],"c":[["'",{"w":"api'","s":"'","e":true,"k":"'","d":[420,423],"c":[["s",{"w":"api's","s":"s","e":true,"k":"s","d":[14,377],"c":[]}]]}],["-",{"w":"api-key","s":"-key","e":true,"k":"-","d":[58],"c":[["s",{"w":"api-keys","s":"s","e":true,"k":"s","d":[31,247,467,512],"c":[]}]]}],["p",{"w":"apipage","s":"page","e":true,"k":"p","d":[32,34,35,36,37,38,39,41,42,43,57,60,61,62,63,206,207,210,212,214,215,216,218,249,251,252,253,254,260,261,262,264,265,266,267,268,269,270,271,272,274,275,276,277,278,279,281,283,284,285,286,287,289,290,291,292,293,295,296,297,298,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,319,320,321,322,323,324,325,326,327,328,329,330,332,333,335,336,338,340,342,343,344,389,391,392,393,395,396,398,401,402,405,407,408,409,410,411,413,414,415,416,418,429,430,432,433,435,436,437,438,441,442,446,447,449,450,451,452,454,455,456,457,458,461,464,465,469,470,472,473,475,476,477,478,480,481,483,484,486,487,488,489,491,492,493,494,495,497,499,500],"c":[]}],["k",{"w":"apikey","s":"key","e":true,"k":"k","d":[32,34,35,36,37,38,39,41,42,43,517],"c":[["s",{"w":"apikeyscontent","s":"scontent","e":true,"k":"s","d":[247,467,512],"c":[]}]]}],["s",{"w":"apis","s":"s","e":true,"k":"s","d":[44,227,232,236,370,459],"c":[]}],["c",{"w":"apiconfig","s":"config","e":true,"k":"c","d":[64,67,365,382,383,384,385,386,387,514,517],"c":[]}],["e",{"w":"apiexample","s":"example","e":true,"k":"e","d":[67,226,227,234,235,236,356,366,368,369,370,371,372],"c":[]}]]}],["t",{"w":"apt","s":"t","e":true,"k":"t","d":[18,517],"c":[]}],["r",{"w":"apr","s":"r","e":true,"k":"r","d":[73,77],"c":[]}],["a",{"w":"apart","s":"art","e":true,"k":"a","d":[219],"c":[]}]]}],["n",{"w":"an","s":"n","e":true,"k":"n","d":[6,7,9,11,12,14,15,16,19,22,25,26,27,28,31,46,47,48,49,51,52,53,55,58,67,68,69,70,71,76,80,81,82,83,85,86,87,88,89,90,94,95,96,97,98,101,103,105,107,108,109,114,115,118,120,121,122,124,125,126,128,130,131,132,133,134,135,136,138,139,140,142,143,144,145,146,148,149,151,153,157,158,159,160,161,164,166,167,168,170,172,173,174,175,177,179,180,182,183,184,186,187,189,192,193,194,195,196,198,199,201,219,224,226,227,229,231,233,234,235,238,239,240,241,245,246,256,258,259,348,353,354,355,356,360,361,366,367,368,369,371,372,374,375,376,377,379,381,399,501,505,511,513,515,516,517],"c":[["d",{"w":"and","s":"d","e":true,"k":"d","d":[2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,26,27,28,29,30,31,44,45,46,47,48,49,50,51,52,53,54,55,58,64,65,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,208,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,236,237,239,240,241,243,244,245,246,255,256,257,258,259,345,346,347,348,349,350,351,352,353,354,355,356,357,360,361,365,366,367,368,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,399,420,422,423,424,425,426,427,439,443,444,459,462,466,501,502,504,505,509,511,513,514,515,516,517],"c":[]}],["y",{"w":"any","s":"y","e":true,"k":"y","d":[6,7,8,12,14,16,19,27,48,49,51,52,53,54,65,68,69,71,77,90,115,119,123,129,142,163,164,165,167,190,219,224,226,227,229,232,234,235,236,238,245,258,346,348,351,360,361,368,369,370,379,439,462,509,511,513,517],"c":[["t",{"w":"anyt","s":"t","e":false,"k":"t","d":[],"c":[["h",{"w":"anything","s":"hing","e":true,"k":"h","d":[51,55,226,234,238,368],"c":[]}],["y",{"w":"anytype","s":"ype","e":true,"k":"y","d":[171,175],"c":[]}]]}],["o",{"w":"anyone","s":"one","e":true,"k":"o","d":[68,69,71],"c":[]}],["m",{"w":"anymore","s":"more","e":true,"k":"m","d":[229,355],"c":[]}],["w",{"w":"anywhere","s":"where","e":true,"k":"w","d":[515],"c":[]}]]}],["o",{"w":"ano","s":"o","e":false,"k":"o","d":[],"c":[["t",{"w":"another","s":"ther","e":true,"k":"t","d":[7,12,27,28,67,69,80,86,98,106,107,117,123,143,150,180,184,185,188,197,198,199,226,227,245,348,361,376,377,511,513,517],"c":[]}],["n",{"w":"anonymous","s":"nymous","e":true,"k":"n","d":[103],"c":[]}]]}],["a",{"w":"analy","s":"aly","e":false,"k":"a","d":[],"c":[["s",{"w":"analysis","s":"sis","e":true,"k":"s","d":[9,22,26,70,202],"c":[]}],["z",{"w":"analyz","s":"z","e":false,"k":"z","d":[],"c":[["e",{"w":"analyze","s":"e","e":true,"k":"e","d":[21,22,70,127,177,208,377],"c":[["r",{"w":"analyzer","s":"r","e":true,"k":"r","d":[70],"c":[]}],["s",{"w":"analyzes","s":"s","e":true,"k":"s","d":[70],"c":[]}]]}],["i",{"w":"analyzing","s":"ing","e":true,"k":"i","d":[22,127],"c":[]}]]}],["t",{"w":"analytics","s":"tics","e":true,"k":"t","d":[45,70],"c":[]}]]}],["c",{"w":"anchor","s":"chor","e":false,"k":"c","d":[],"c":[["-",{"w":"anchor-block-only","s":"-block-only","e":true,"k":"-","d":[27],"c":[]}],["_",{"w":"anchor_mode","s":"_mode","e":true,"k":"_","d":[51,255,517],"c":[]}],["m",{"w":"anchormode","s":"mode","e":true,"k":"m","d":[226,227,230,232,234,236,368,370],"c":[]}]]}],["n",{"w":"anno","s":"no","e":false,"k":"n","d":[],"c":[["t",{"w":"annotation","s":"tation","e":true,"k":"t","d":[517],"c":[["s",{"w":"annotations","s":"s","e":true,"k":"s","d":[72,517],"c":[["-",{"w":"annotations-example","s":"-example","e":true,"k":"-","d":[517],"c":[]}]]}],["-",{"w":"annotation-comments","s":"-comments","e":true,"k":"-","d":[517],"c":[]}]]}],["u",{"w":"announcing","s":"uncing","e":true,"k":"u","d":[73],"c":[]}]]}],["i",{"w":"animate","s":"imate","e":true,"k":"i","d":[517],"c":[]}],["s",{"w":"ansi","s":"si","e":true,"k":"s","d":[517],"c":[]}]]}],["l",{"w":"al","s":"l","e":false,"k":"l","d":[],"c":[["s",{"w":"also","s":"so","e":true,"k":"s","d":[2,7,8,9,18,20,21,22,26,27,31,45,50,51,52,54,58,68,69,71,73,74,75,203,204,208,221,224,225,226,228,229,233,234,238,239,241,246,257,259,345,347,349,350,361,367,368,373,374,376,377,379,399,422,425,426,443,444,459,502,516,517],"c":[]}],["l",{"w":"all","s":"l","e":true,"k":"l","d":[7,16,21,24,27,44,49,51,52,53,55,67,68,69,71,73,75,76,77,80,82,83,84,85,89,94,95,96,97,98,101,105,106,107,108,109,110,111,117,118,121,123,124,127,128,130,131,132,135,136,138,139,141,142,143,146,147,148,150,151,152,153,155,156,157,159,162,164,165,166,167,168,169,170,171,172,173,175,180,181,184,185,186,187,189,194,195,196,197,198,199,200,201,202,208,219,221,222,226,228,229,231,233,234,238,244,255,258,259,352,361,367,368,372,427,459,466,515,517],"c":[["o",{"w":"allo","s":"o","e":false,"k":"o","d":[],"c":[["w",{"w":"allow","s":"w","e":true,"k":"w","d":[12,52,68,69,70,71,72,76,79,80,81,115,123,152,201,202,219,228,231,238,245,346,348,355,374],"c":[["s",{"w":"allows","s":"s","e":true,"k":"s","d":[7,8,9,12,28,68,69,71,79,81,82,83,84,85,89,90,91,93,94,95,96,97,98,100,101,105,106,107,109,110,111,113,115,117,118,121,122,123,124,131,132,135,136,138,139,141,142,143,146,147,148,150,151,153,155,156,157,159,160,162,165,166,167,168,169,170,171,172,175,177,178,180,181,184,185,186,189,192,194,195,196,197,198,199,200,201,202,224,232,233,245,259,348,352,356,361,366,367,371,372,374,376,377,378,379,399,509,511,513,517],"c":[]}],["i",{"w":"allowing","s":"ing","e":true,"k":"i","d":[12,69,77,86,89,90,99,115,119,132,135,152,161,163,178,192,245,348,356,366,371],"c":[]}],["e",{"w":"allowed","s":"ed","e":true,"k":"e","d":[12,71,81,86,87,92,114,126,129,145,147,160,161,163,174,179,245,348],"c":[["-",{"w":"allowed-borrow","s":"-borrow","e":true,"k":"-","d":[12,245,348],"c":[]}],["c",{"w":"allowedcallers","s":"callers","e":true,"k":"c","d":[81],"c":[]}]]}],["f",{"w":"allowfullscreen","s":"fullscreen","e":true,"k":"f","d":[70,72],"c":[]}]]}],["c",{"w":"allocat","s":"cat","e":false,"k":"c","d":[],"c":[["i",{"w":"allocation","s":"ion","e":true,"k":"i","d":[69],"c":[]}],["e",{"w":"allocate","s":"e","e":true,"k":"e","d":[112],"c":[]}]]}]]}],["-",{"w":"all-","s":"-","e":false,"k":"-","d":[],"c":[["i",{"w":"all-in-one","s":"in-one","e":true,"k":"i","d":[45],"c":[]}],["g",{"w":"all-guides","s":"guides","e":true,"k":"g","d":[508],"c":[]}]]}]]}],["w",{"w":"always","s":"ways","e":true,"k":"w","d":[7,14,15,17,22,28,51,68,76,77,79,80,81,82,83,84,85,86,88,89,94,95,98,99,102,104,105,106,107,109,110,111,112,113,117,118,120,121,123,124,126,127,128,130,131,132,135,136,137,138,139,140,141,142,143,144,146,147,148,149,150,151,153,155,156,157,159,162,165,166,167,168,169,170,172,175,180,181,183,184,185,186,189,194,195,197,198,200,201,202,361],"c":[]}],["o",{"w":"alon","s":"on","e":false,"k":"o","d":[],"c":[["e",{"w":"alone","s":"e","e":true,"k":"e","d":[12,245,348],"c":[]}],["g",{"w":"along","s":"g","e":true,"k":"g","d":[20,28,113,226,232,234,368,374,511,513],"c":[["s",{"w":"alongside","s":"side","e":true,"k":"s","d":[27,52,176,191,219,220,222],"c":[]}]]}]]}],["r",{"w":"already","s":"ready","e":true,"k":"r","d":[12,15,18,27,28,47,52,53,67,69,71,89,97,132,167,172,186,189,224,226,227,229,245,348,377,378,423],"c":[]}],["t",{"w":"alt","s":"t","e":true,"k":"t","d":[44,229,259,466,508],"c":[["e",{"w":"alternative","s":"ernative","e":true,"k":"e","d":[80,180],"c":[["l",{"w":"alternatively","s":"ly","e":true,"k":"l","d":[51,259,377,502],"c":[]}]]}],["h",{"w":"although","s":"hough","e":true,"k":"h","d":[75],"c":[]}]]}],["e",{"w":"alert","s":"ert","e":true,"k":"e","d":[51],"c":[["s",{"w":"alerts","s":"s","e":true,"k":"s","d":[45,51],"c":[]}],["i",{"w":"alerting","s":"ing","e":true,"k":"i","d":[51],"c":[]}]]}],["i",{"w":"ali","s":"i","e":false,"k":"i","d":[],"c":[["g",{"w":"align","s":"gn","e":false,"k":"g","d":[],"c":[["s",{"w":"aligns","s":"s","e":true,"k":"s","d":[68],"c":[]}],["i",{"w":"aligning","s":"ing","e":true,"k":"i","d":[219,220],"c":[]}]]}],["c",{"w":"alice","s":"ce","e":true,"k":"c","d":[83,85,103,116,139,146,151,182],"c":[]}],["a",{"w":"alias","s":"as","e":true,"k":"a","d":[241,355],"c":[["e",{"w":"aliases","s":"es","e":true,"k":"e","d":[117],"c":[]}]]}]]}],["g",{"w":"algorithms","s":"gorithms","e":true,"k":"g","d":[87,96,112,128,130,133,145,158,174,179,180,187],"c":[]}]]}],["d",{"w":"ad","s":"d","e":false,"k":"d","d":[],"c":[["d",{"w":"add","s":"d","e":true,"k":"d","d":[6,7,9,12,18,20,25,26,27,28,29,30,47,51,52,53,68,69,71,76,81,113,123,126,128,130,149,167,180,182,224,226,232,234,240,243,245,348,357,360,361,368,517],"c":[["e",{"w":"adde","s":"e","e":false,"k":"e","d":[],"c":[["v",{"w":"addevent","s":"vent","e":true,"k":"v","d":[2,8,18,31,45,54,203,204,208,225,228,257,345,347,349,350,373,399,459,502],"c":[]}],["d",{"w":"added","s":"d","e":true,"k":"d","d":[27,51,68,219,223,226,231,234,368,517],"c":[["-",{"w":"added-contract","s":"-contract","e":true,"k":"-","d":[51],"c":[]}]]}]]}],["r",{"w":"addr","s":"r","e":false,"k":"r","d":[],"c":[["e",{"w":"address","s":"ess","e":true,"k":"e","d":[5,7,12,19,27,28,49,51,67,71,80,90,95,147,188,189,219,222,224,226,227,229,230,231,232,233,234,236,237,238,240,241,245,258,259,274,283,285,286,303,304,308,320,321,322,323,324,325,326,327,328,348,352,353,354,355,356,357,359,361,366,367,368,370,371,372,376,377,378,427,430,432,436,449,459,470,472,476,486],"c":[["e",{"w":"addresses","s":"es","e":true,"k":"e","d":[7,52,69,90,95,127,188,219,222,233,274,303,304,352,353,354,355,356,357,361,366,367,371,430,459,470],"c":[]}],["1",{"w":"address1","s":"1","e":true,"k":"1","d":[7,246,361],"c":[]}],["w",{"w":"addresswire","s":"wire","e":true,"k":"w","d":[229],"c":[]}],["h",{"w":"addresshashmode","s":"hashmode","e":true,"k":"h","d":[229],"c":[]}],["v",{"w":"addressversion","s":"version","e":true,"k":"v","d":[235,369],"c":[]}]]}],["s",{"w":"addrs","s":"s","e":true,"k":"s","d":[95],"c":[]}]]}],["i",{"w":"addi","s":"i","e":false,"k":"i","d":[],"c":[["t",{"w":"additi","s":"ti","e":false,"k":"t","d":[],"c":[["o",{"w":"addition","s":"on","e":true,"k":"o","d":[9,19,77,102,112,137,140,199,226,234,238,368],"c":[["a",{"w":"additional","s":"al","e":true,"k":"a","d":[9,12,19,31,50,68,69,71,160,184,188,189,226,227,231,238,245,259,346,348,356,366,377,379,510,516],"c":[["l",{"w":"additionally","s":"ly","e":true,"k":"l","d":[233,367,376],"c":[]}]]}]]}],["v",{"w":"additive","s":"ve","e":true,"k":"v","d":[77],"c":[]}]]}],["n",{"w":"adding","s":"ng","e":true,"k":"n","d":[19,20,27,68,76,90,100,125,137,149,160,167,171,224,238],"c":[["-",{"w":"adding-project-contract-requirements","s":"-project-contract-requirements","e":true,"k":"-","d":[27],"c":[]}]]}]]}],["-",{"w":"add-","s":"-","e":false,"k":"-","d":[],"c":[["n",{"w":"add-n","s":"n","e":false,"k":"n","d":[],"c":[["e",{"w":"add-new-member","s":"ew-member","e":true,"k":"e","d":[27],"c":[]}],["o",{"w":"add-nodejs-polyfills","s":"odejs-polyfills","e":true,"k":"o","d":[232],"c":[]}]]}],["a",{"w":"add-a","s":"a","e":false,"k":"a","d":[],"c":[["-",{"w":"add-a-contract","s":"-contract","e":true,"k":"-","d":[30],"c":[]}],["d",{"w":"add-administrator","s":"dministrator","e":true,"k":"d","d":[81],"c":[]}],["n",{"w":"add-and-print","s":"nd-print","e":true,"k":"n","d":[199],"c":[]}]]}],["c",{"w":"add-contract","s":"contract","e":true,"k":"c","d":[51],"c":[]}],["p",{"w":"add-p","s":"p","e":false,"k":"p","d":[],"c":[["r",{"w":"add-proposal","s":"roposal","e":true,"k":"r","d":[69],"c":[]}],["e",{"w":"add-permission","s":"ermission","e":true,"k":"e","d":[76],"c":[]}]]}],["s",{"w":"add-stacking-reward","s":"stacking-reward","e":true,"k":"s","d":[77],"c":[]}],["m",{"w":"add-member","s":"member","e":true,"k":"m","d":[81],"c":[]}],["r",{"w":"add-role","s":"role","e":true,"k":"r","d":[113],"c":[]}],["1",{"w":"add-10","s":"10","e":true,"k":"1","d":[170],"c":[]}],["o",{"w":"add-or-pass-err","s":"or-pass-err","e":true,"k":"o","d":[170],"c":[]}],["t",{"w":"add-todo","s":"todo","e":true,"k":"t","d":[180],"c":[]}],["g",{"w":"add-global-polyfills","s":"global-polyfills","e":true,"k":"g","d":[232],"c":[]}]]}],["s",{"w":"adds","s":"s","e":true,"k":"s","d":[77,82,106,109,185,197,199,229,351,356,366,517],"c":[]}]]}],["v",{"w":"advan","s":"van","e":false,"k":"v","d":[],"c":[["c",{"w":"advance","s":"ce","e":true,"k":"c","d":[80],"c":[["d",{"w":"advanced","s":"d","e":true,"k":"d","d":[7,68,69,71,78,95,226,227,229,241,352,356,361,366,378,423],"c":[["-",{"w":"advanced-usage","s":"-usage","e":true,"k":"-","d":[352],"c":[]}]]}],["_",{"w":"advance_chain_tip","s":"_chain_tip","e":true,"k":"_","d":[516],"c":[]}]]}],["t",{"w":"advantage","s":"tage","e":true,"k":"t","d":[28,73],"c":[["s",{"w":"advantages","s":"s","e":true,"k":"s","d":[50],"c":[]}]]}]]}],["j",{"w":"adjust","s":"just","e":true,"k":"j","d":[71],"c":[["i",{"w":"adjusting","s":"ing","e":true,"k":"i","d":[102],"c":[]}],["m",{"w":"adjustments","s":"ments","e":true,"k":"m","d":[233,356,366,367],"c":[]}]]}],["m",{"w":"admin","s":"min","e":true,"k":"m","d":[108,115,173],"c":[["i",{"w":"administrat","s":"istrat","e":false,"k":"i","d":[],"c":[["o",{"w":"administrator","s":"or","e":true,"k":"o","d":[81],"c":[["s",{"w":"administrators","s":"s","e":true,"k":"s","d":[81],"c":[]}]]}],["i",{"w":"administrative","s":"ive","e":true,"k":"i","d":[516],"c":[]}]]}],["-",{"w":"admin-only","s":"-only","e":true,"k":"-","d":[160],"c":[]}],["_",{"w":"admin_role","s":"_role","e":true,"k":"_","d":[173],"c":[]}]]}],["h",{"w":"adher","s":"her","e":false,"k":"h","d":[],"c":[["i",{"w":"adhering","s":"ing","e":true,"k":"i","d":[90],"c":[]}],["e",{"w":"adhere","s":"e","e":true,"k":"e","d":[119,152],"c":[["s",{"w":"adheres","s":"s","e":true,"k":"s","d":[152],"c":[]}]]}]]}]]}],["t",{"w":"at","s":"t","e":true,"k":"t","d":[2,7,8,12,14,15,17,18,26,27,31,45,46,48,50,51,53,54,68,69,71,73,74,77,92,104,109,122,130,145,149,152,160,161,174,180,182,187,188,194,202,203,204,208,221,223,225,226,227,228,245,246,257,259,345,347,348,349,350,361,373,374,375,376,377,399,422,425,427,443,459,502,515],"c":[["t",{"w":"att","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"attempt","s":"empt","e":true,"k":"e","d":[134,226,234,368],"c":[["i",{"w":"attempting","s":"ing","e":true,"k":"i","d":[14,86,90,92,101,115,116,123,129,134,135,144,149,161,180,182,190,201],"c":[]}],["s",{"w":"attempts","s":"s","e":true,"k":"s","d":[144,201,516],"c":[]}],["e",{"w":"attempted","s":"ed","e":true,"k":"e","d":[238],"c":[]}]]}],["r",{"w":"attribute","s":"ribute","e":true,"k":"r","d":[68],"c":[["s",{"w":"attributes","s":"s","e":true,"k":"s","d":[68],"c":[]}]]}],["a",{"w":"attacks","s":"acks","e":true,"k":"a","d":[80],"c":[]}]]}],["-",{"w":"at-block","s":"-block","e":true,"k":"-","d":[104,161,202],"c":[]}]]}],["c",{"w":"ac","s":"c","e":true,"k":"c","d":[517],"c":[["c",{"w":"acc","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"acco","s":"o","e":false,"k":"o","d":[],"c":[["r",{"w":"accordi","s":"rdi","e":false,"k":"r","d":[],"c":[["o",{"w":"accordion","s":"on","e":true,"k":"o","d":[4,5,6,7,49,64,67,224,226,227,230,231,232,233,234,235,236,243,244,353,354,356,358,359,360,361,362,365,366,367,368,369,370,371,377,378,379,382,383,384,385,386,387,515],"c":[["c",{"w":"accordioncontent","s":"content","e":true,"k":"c","d":[4,358,362,377,379],"c":[]}],["i",{"w":"accordionitem","s":"item","e":true,"k":"i","d":[4,358,362,377,379],"c":[]}],["t",{"w":"accordiontrigger","s":"trigger","e":true,"k":"t","d":[4,358,362,377,379],"c":[]}],["s",{"w":"accordions","s":"s","e":true,"k":"s","d":[5,6,7,49,64,67,224,226,227,230,231,232,233,234,235,236,243,244,353,354,356,359,360,361,365,366,367,368,369,370,371,378,382,383,384,385,386,387,515],"c":[]}],["'",{"w":"accordion'","s":"'","e":true,"k":"'","d":[5,6,7,49,67,224,226,227,230,231,232,233,234,235,236,244,353,354,356,359,360,361,366,367,368,369,370,371,515],"c":[]}]]}],["n",{"w":"accordingly","s":"ngly","e":true,"k":"n","d":[49,50,68,71,230,374,376],"c":[]}]]}],["u",{"w":"account","s":"unt","e":true,"k":"u","d":[7,9,27,31,47,49,50,53,67,68,79,98,115,123,134,143,150,160,184,198,224,239,240,258,259,352,357,361],"c":[["s",{"w":"accounts","s":"s","e":true,"k":"s","d":[7,9,12,27,29,64,65,115,221,224,232,239,240,244,245,246,259,348,352,361,365,382,383,384,385,386,387,405],"c":[["a",{"w":"accountsapi","s":"api","e":true,"k":"a","d":[64,67,365,382,383,384,385,386,387],"c":[]}]]}],["a",{"w":"accountable","s":"able","e":true,"k":"a","d":[69],"c":[]}],["-",{"w":"account-related","s":"-related","e":true,"k":"-","d":[98],"c":[]}],["i",{"w":"accountin","s":"in","e":false,"k":"i","d":[],"c":[["g",{"w":"accounting","s":"g","e":true,"k":"g","d":[112,113,127],"c":[]}],["f",{"w":"accountinfourl","s":"fourl","e":true,"k":"f","d":[227,236,370],"c":[]}]]}],["'",{"w":"account's","s":"'s","e":true,"k":"'","d":[240],"c":[]}]]}]]}],["e",{"w":"acce","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"access","s":"ss","e":true,"k":"s","d":[7,9,49,55,64,71,78,79,81,85,90,95,99,100,104,108,113,115,116,122,123,125,127,147,148,151,156,159,160,161,172,178,180,192,195,202,239,257,259,345,352,355,356,357,361,365,366,382,383,384,385,386,387,516],"c":[["-",{"w":"access-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"access-control","s":"control","e":true,"k":"c","d":[78],"c":[["l",{"w":"access-controlled","s":"led","e":true,"k":"l","d":[192],"c":[]}]]}],["u",{"w":"access-user-data","s":"user-data","e":true,"k":"u","d":[352],"c":[]}]]}],["e",{"w":"accessed","s":"ed","e":true,"k":"e","d":[79,95,97,100,104,116,127,156,180],"c":[]}],["i",{"w":"accessi","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"accessing","s":"ng","e":true,"k":"n","d":[95,97,104,116,127,131,156,161,172,180,195],"c":[]}],["b",{"w":"accessib","s":"b","e":false,"k":"b","d":[],"c":[["l",{"w":"accessible","s":"le","e":true,"k":"l","d":[99,129,219,220],"c":[]}],["i",{"w":"accessibility","s":"ility","e":true,"k":"i","d":[134],"c":[]}]]}]]}]]}],["l",{"w":"accelerometer","s":"lerometer","e":true,"k":"l","d":[70,72],"c":[]}],["p",{"w":"accept","s":"pt","e":true,"k":"p","d":[241],"c":[["a",{"w":"accepta","s":"a","e":false,"k":"a","d":[],"c":[["b",{"w":"acceptable","s":"ble","e":true,"k":"b","d":[185],"c":[]}],["n",{"w":"acceptance","s":"nce","e":true,"k":"n","d":[208],"c":[]}]]}],["e",{"w":"accepted","s":"ed","e":true,"k":"e","d":[224],"c":[]}],["s",{"w":"accepts","s":"s","e":true,"k":"s","d":[226,234,239,368,377],"c":[]}]]}]]}],["u",{"w":"accu","s":"u","e":false,"k":"u","d":[],"c":[["r",{"w":"accura","s":"ra","e":false,"k":"r","d":[],"c":[["t",{"w":"accurate","s":"te","e":true,"k":"t","d":[89,98,104,132,198,202],"c":[["l",{"w":"accurately","s":"ly","e":true,"k":"l","d":[9,89,172,224,516],"c":[]}]]}],["c",{"w":"accuracy","s":"cy","e":true,"k":"c","d":[104,125,127,190],"c":[]}]]}],["m",{"w":"accumulat","s":"mulat","e":false,"k":"m","d":[],"c":[["i",{"w":"accumulation","s":"ion","e":true,"k":"i","d":[96],"c":[]}],["e",{"w":"accumulated","s":"ed","e":true,"k":"e","d":[96,516],"c":[]}],["o",{"w":"accumulator","s":"or","e":true,"k":"o","d":[100],"c":[]}]]}]]}],["r",{"w":"accr","s":"r","e":false,"k":"r","d":[],"c":[["u",{"w":"accrued","s":"ued","e":true,"k":"u","d":[12,245,348],"c":[["-",{"w":"accrued-interest","s":"-interest","e":true,"k":"-","d":[12,245,348],"c":[]}]]}],["o",{"w":"accross","s":"oss","e":true,"k":"o","d":[229],"c":[]}]]}]]}],["h",{"w":"achieve","s":"hieve","e":true,"k":"h","d":[9],"c":[["d",{"w":"achieved","s":"d","e":true,"k":"d","d":[69],"c":[]}]]}],["t",{"w":"act","s":"t","e":true,"k":"t","d":[69,202,224],"c":[["u",{"w":"actual","s":"ual","e":true,"k":"u","d":[9,12,90,190,229,241,245,348,371,377],"c":[["l",{"w":"actuall","s":"l","e":false,"k":"l","d":[],"c":[["y",{"w":"actually","s":"y","e":true,"k":"y","d":[87,133],"c":[]}],["o",{"w":"actuallockperiod","s":"ockperiod","e":true,"k":"o","d":[516],"c":[]}]]}]]}],["i",{"w":"acti","s":"i","e":false,"k":"i","d":[],"c":[["v",{"w":"activ","s":"v","e":false,"k":"v","d":[],"c":[["i",{"w":"activit","s":"it","e":false,"k":"i","d":[],"c":[["y",{"w":"activity","s":"y","e":true,"k":"y","d":[45,70,202,375,399,423,425,427,436,443,459,476,502,504],"c":[["'",{"w":"activity'","s":"'","e":true,"k":"'","d":[435,437,438,452,475,477,478,489],"c":[]}]]}],["i",{"w":"activities","s":"ies","e":true,"k":"i","d":[427],"c":[]}]]}],["e",{"w":"active","s":"e","e":true,"k":"e","d":[48,50,52,108,208,244],"c":[["l",{"w":"actively","s":"ly","e":true,"k":"l","d":[52],"c":[]}]]}]]}],["o",{"w":"action","s":"on","e":true,"k":"o","d":[52,68,108,229,230,232,233,239,246,352,367,372,375],"c":[["s",{"w":"actions","s":"s","e":true,"k":"s","d":[68,81,99,163,192,202,372,375,378],"c":[]}]]}]]}],["s",{"w":"acts","s":"s","e":true,"k":"s","d":[376],"c":[]}]]}],["q",{"w":"acquire","s":"quire","e":true,"k":"q","d":[13,49],"c":[]}],["r",{"w":"across","s":"ross","e":true,"k":"r","d":[19,44,77,79,80,86,104,161,164,202,219,222,229,233,352,356,357,366,367,466],"c":[]}],["k",{"w":"acknowledge","s":"knowledge","e":true,"k":"k","d":[68],"c":[]}]]}],["w",{"w":"aw","s":"w","e":false,"k":"w","d":[],"c":[["a",{"w":"awa","s":"a","e":false,"k":"a","d":[],"c":[["i",{"w":"await","s":"it","e":true,"k":"i","d":[4,58,64,65,67,68,69,71,223,226,227,229,230,231,232,233,234,235,236,237,238,239,240,242,243,352,353,354,355,356,357,358,362,365,366,367,368,369,370,382,383,384,385,386,387,514],"c":[]}],["y",{"w":"away","s":"y","e":true,"k":"y","d":[14,17,54,355,427],"c":[]}],["r",{"w":"aware","s":"re","e":true,"k":"r","d":[80,82,86,87,88,89,90,91,95,102,104,105,107,110,112,114,116,120,123,125,127,132,133,137,140,144,145,154,155,156,158,161,165,170,171,173,174,176,179,182,185,187,188,189,190,191,192,197,202,219,222,233,367],"c":[["n",{"w":"awareness","s":"ness","e":true,"k":"n","d":[202],"c":[]}]]}]]}],["k",{"w":"awk","s":"k","e":true,"k":"k","d":[16],"c":[]}]]}],["s",{"w":"as","s":"s","e":true,"k":"s","d":[5,6,7,9,11,12,13,14,15,16,17,18,22,26,27,28,30,31,44,48,50,51,52,55,58,68,69,71,73,74,76,79,80,82,86,87,88,90,95,102,104,107,112,113,120,122,123,127,128,130,133,140,145,147,153,156,160,161,163,171,174,178,187,188,192,202,208,219,221,224,226,227,229,231,232,233,234,235,236,237,238,239,241,243,245,256,258,259,348,350,351,352,355,356,357,359,360,361,366,367,368,369,370,371,372,374,375,376,378,381,423,425,443,501,505,509,510,511,513,515,517],"c":[["s",{"w":"ass","s":"s","e":false,"k":"s","d":[],"c":[["e",{"w":"asse","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"assert","s":"rt","e":true,"k":"r","d":[9,81],"c":[["s",{"w":"asserts","s":"s","e":true,"k":"s","d":[6,12,69,77,79,80,81,90,100,102,108,112,114,115,122,123,128,140,154,160,163,164,166,173,176,178,191,192,193,202,245,348,360,377,511,513],"c":[]}],["e",{"w":"asserted","s":"ed","e":true,"k":"e","d":[9],"c":[]}],["i",{"w":"assertion","s":"ion","e":true,"k":"i","d":[81,193,224],"c":[["s",{"w":"assertions","s":"s","e":true,"k":"s","d":[12,115,193,245,348],"c":[]}]]}],["-",{"w":"assert-can-fulfil","s":"-can-fulfil","e":true,"k":"-","d":[511,513],"c":[]}]]}],["t",{"w":"asset","s":"t","e":true,"k":"t","d":[7,25,67,101,122,135,186,226,229,231,234,238,259,361,368,372,511,513],"c":[["s",{"w":"assets","s":"s","e":true,"k":"s","d":[7,67,122,160,192,231,361,511,513,516],"c":[["'",{"w":"assets'","s":"'","e":true,"k":"'","d":[324],"c":[]}]]}],["-",{"w":"asset-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"asset-c","s":"c","e":false,"k":"c","d":[],"c":[["l",{"w":"asset-class","s":"lass","e":true,"k":"l","d":[101,135,186,195],"c":[]}],["o",{"w":"asset-contract","s":"ontract","e":true,"k":"o","d":[511,513],"c":[]}]]}],["i",{"w":"asset-identifier","s":"identifier","e":true,"k":"i","d":[101,135,186,195],"c":[["-",{"w":"asset-identifier-type","s":"-type","e":true,"k":"-","d":[122],"c":[]}]]}],["n",{"w":"asset-name","s":"name","e":true,"k":"n","d":[122],"c":[]}]]}],["n",{"w":"assetname","s":"name","e":true,"k":"n","d":[101,135,186,195,226,234,368],"c":[]}],["p",{"w":"assetprices","s":"prices","e":true,"k":"p","d":[161],"c":[]}],["a",{"w":"assetaddress","s":"address","e":true,"k":"a","d":[226,234,368],"c":[]}],["c",{"w":"assetcontractname","s":"contractname","e":true,"k":"c","d":[226,234,368],"c":[]}],["i",{"w":"asseti","s":"i","e":false,"k":"i","d":[],"c":[["d",{"w":"assetid","s":"d","e":true,"k":"d","d":[226,229,234,238,368],"c":[]}],["n",{"w":"assetinfo","s":"nfo","e":true,"k":"n","d":[229],"c":[]}]]}],["w",{"w":"assetwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}],["_",{"w":"asset_identifier","s":"_identifier","e":true,"k":"_","d":[372],"c":[]}]]}],["m",{"w":"assembly","s":"mbly","e":true,"k":"m","d":[50],"c":[]}],["s",{"w":"assess","s":"ss","e":true,"k":"s","d":[377],"c":[]}]]}],["o",{"w":"associate","s":"ociate","e":false,"k":"o","d":[],"c":[["d",{"w":"associated","s":"d","e":true,"k":"d","d":[7,16,30,67,79,81,89,97,116,122,144,167,172,178,189,226,227,361,376],"c":[]}],["s",{"w":"associates","s":"s","e":true,"k":"s","d":[516],"c":[]}]]}],["i",{"w":"assi","s":"i","e":false,"k":"i","d":[],"c":[["s",{"w":"assistant","s":"stant","e":true,"k":"s","d":[70],"c":[]}],["g",{"w":"assign","s":"gn","e":true,"k":"g","d":[123,178,186,232],"c":[["e",{"w":"assigned","s":"ed","e":true,"k":"e","d":[92,516],"c":[]}],["i",{"w":"assigning","s":"ing","e":true,"k":"i","d":[186],"c":[]}],["s",{"w":"assigns","s":"s","e":true,"k":"s","d":[186],"c":[]}]]}]]}],["u",{"w":"assuming","s":"uming","e":true,"k":"u","d":[71,82,83,84,85,87,88,89,91,94,95,98,101,102,104,105,106,107,109,110,111,117,118,120,121,124,125,131,132,133,135,136,138,139,141,142,143,146,147,148,149,150,151,153,155,156,157,158,159,162,165,166,167,168,169,170,172,173,175,179,181,183,184,185,186,188,189,190,194,195,197,198,199,200,233,238,367],"c":[]}]]}],["c",{"w":"asc","s":"c","e":false,"k":"c","d":[],"c":[["i",{"w":"ascii","s":"ii","e":true,"k":"i","d":[6,27,87,179,182,360],"c":[["_",{"w":"ascii_btc","s":"_btc","e":true,"k":"_","d":[6,360],"c":[]}]]}],["h",{"w":"aschild","s":"hild","e":true,"k":"h","d":[18,27,377],"c":[]}]]}],["t",{"w":"ast","s":"t","e":true,"k":"t","d":[7,361],"c":[]}],["-",{"w":"as-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"as-contract","s":"contract","e":true,"k":"c","d":[12,28,69,71,86,90,114,140,154,192,198,201,224,245,348,511,513,516],"c":[]}],["m",{"w":"as-max-len","s":"max-len","e":true,"k":"m","d":[110,126,149,180],"c":[]}]]}],["k",{"w":"asked","s":"ked","e":true,"k":"k","d":[49],"c":[]}],["y",{"w":"async","s":"ync","e":true,"k":"y","d":[68,71,232,352,353,354,355,356,366,514,517],"c":[]}],["p",{"w":"aspects","s":"pects","e":true,"k":"p","d":[69],"c":[]}]]}],["m",{"w":"am","s":"m","e":false,"k":"m","d":[],"c":[["o",{"w":"amo","s":"o","e":false,"k":"o","d":[],"c":[["u",{"w":"amount","s":"unt","e":true,"k":"u","d":[6,7,12,22,49,51,68,69,71,77,81,86,95,102,114,115,123,124,125,127,129,136,137,140,143,145,147,150,152,154,160,164,166,174,176,178,184,185,190,191,192,193,196,201,202,224,226,227,229,230,231,232,233,234,235,236,237,238,242,243,245,348,351,353,356,357,360,361,366,367,368,369,370,516,517],"c":[["s",{"w":"amounts","s":"s","e":true,"k":"s","d":[52,77,79,102,145,174,178,219,222],"c":[["a",{"w":"amountsats","s":"ats","e":true,"k":"a","d":[233,367],"c":[]}]]}],["m",{"w":"amountmicrostx","s":"microstx","e":true,"k":"m","d":[223],"c":[]}]]}],["n",{"w":"among","s":"ng","e":true,"k":"n","d":[112],"c":[]}]]}],["p",{"w":"amp","s":"p","e":true,"k":"p","d":[44],"c":[]}],["e",{"w":"amet","s":"et","e":true,"k":"e","d":[517],"c":[]}]]}],["r",{"w":"ar","s":"r","e":false,"k":"r","d":[],"c":[["r",{"w":"arr","s":"r","e":false,"k":"r","d":[],"c":[["a",{"w":"array","s":"ay","e":true,"k":"a","d":[6,7,52,68,226,227,234,255,351,353,356,360,361,366,368,371,372,377,517],"c":[["b",{"w":"arraybuffer","s":"buffer","e":true,"k":"b","d":[6,360],"c":[]}],["s",{"w":"arrays","s":"s","e":true,"k":"s","d":[229,377],"c":[]}],["'",{"w":"array's","s":"'s","e":true,"k":"'","d":[377],"c":[]}]]}],["o",{"w":"arrowupright","s":"owupright","e":true,"k":"o","d":[18],"c":[]}],["i",{"w":"arrive","s":"ive","e":true,"k":"i","d":[49],"c":[]}]]}],["g",{"w":"arg","s":"g","e":false,"k":"g","d":[],"c":[["u",{"w":"argument","s":"ument","e":true,"k":"u","d":[30,51,77,99,119,129,134,177,226,227,241],"c":[["s",{"w":"arguments","s":"s","e":true,"k":"s","d":[7,25,27,82,86,96,119,219,223,226,227,234,353,356,361,366,368,377,379,514],"c":[]}]]}],["s",{"w":"args","s":"s","e":true,"k":"s","d":[7,9,26,223,361,377],"c":[]}],["0",{"w":"arg0","s":"0","e":true,"k":"0","d":[86],"c":[]}],["1",{"w":"arg1","s":"1","e":true,"k":"1","d":[86],"c":[["-",{"w":"arg1-type","s":"-type","e":true,"k":"-","d":[119],"c":[]}]]}],["-",{"w":"arg-","s":"-","e":false,"k":"-","d":[],"c":[["n",{"w":"arg-name-","s":"name-","e":false,"k":"n","d":[],"c":[["0",{"w":"arg-name-0","s":"0","e":true,"k":"0","d":[99,129,134],"c":[]}],["n",{"w":"arg-name-n","s":"n","e":true,"k":"n","d":[99,129,134],"c":[]}]]}],["t",{"w":"arg-type-","s":"type-","e":false,"k":"t","d":[],"c":[["0",{"w":"arg-type-0","s":"0","e":true,"k":"0","d":[99,129,134],"c":[]}],["n",{"w":"arg-type-n","s":"n","e":true,"k":"n","d":[99,129,134],"c":[]}]]}]]}],["2",{"w":"arg2-type","s":"2-type","e":true,"k":"2","d":[119],"c":[]}]]}],["e",{"w":"are","s":"e","e":true,"k":"e","d":[7,9,12,14,15,16,17,22,24,27,30,46,47,48,51,52,53,58,67,68,69,71,73,75,76,77,79,80,81,82,83,85,86,87,92,93,95,97,99,100,101,103,104,108,110,112,113,114,115,119,124,127,128,129,130,132,133,136,139,146,147,148,151,152,154,155,156,158,159,162,163,164,165,167,169,170,171,173,176,179,180,182,183,185,188,191,193,194,200,201,202,219,221,222,224,226,227,228,229,230,231,233,234,237,238,239,241,243,244,245,246,255,259,348,351,352,353,355,356,361,366,367,368,371,372,374,375,376,377,379,509,515,516,517],"c":[["a",{"w":"area","s":"a","e":true,"k":"a","d":[52],"c":[]}],["n",{"w":"aren't","s":"n't","e":true,"k":"n","d":[238],"c":[]}]]}],["b",{"w":"arbitrary","s":"bitrary","e":true,"k":"b","d":[7,361],"c":[]}],["c",{"w":"archi","s":"chi","e":false,"k":"c","d":[],"c":[["v",{"w":"archiv","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"archive","s":"e","e":true,"k":"e","d":[13,14,15,16,17,48,54,73,374,376,378],"c":[["s",{"w":"archives","s":"s","e":true,"k":"s","d":[14,15,16,17],"c":[]}],["-",{"w":"archive-project","s":"-project","e":true,"k":"-","d":[48],"c":[]}],["d",{"w":"archived","s":"d","e":true,"k":"d","d":[48,68,69,71],"c":[]}]]}],["i",{"w":"archiving","s":"ing","e":true,"k":"i","d":[48],"c":[]}]]}],["t",{"w":"architectur","s":"tectur","e":false,"k":"t","d":[],"c":[["e",{"w":"architecture","s":"e","e":true,"k":"e","d":[55,233,259,367],"c":[["s",{"w":"architectures","s":"s","e":true,"k":"s","d":[119,192],"c":[]}]]}],["a",{"w":"architectural","s":"al","e":true,"k":"a","d":[55],"c":[]}]]}]]}],["o",{"w":"around","s":"ound","e":true,"k":"o","d":[68,192,208,379],"c":[]}],["t",{"w":"art","s":"t","e":true,"k":"t","d":[122],"c":[["i",{"w":"artificial","s":"ificial","e":true,"k":"i","d":[70],"c":[]}],["w",{"w":"artwork","s":"work","e":true,"k":"w","d":[122],"c":[["-",{"w":"artwork-uri","s":"-uri","e":true,"k":"-","d":[122],"c":[]}]]}]]}],["i",{"w":"arithmetic","s":"ithmetic","e":true,"k":"i","d":[77,78,102,112,137,140,197],"c":[]}],["k",{"w":"arkadiko","s":"kadiko","e":true,"k":"k","d":[374],"c":[["-",{"w":"arkadiko-freddie-v1-1","s":"-freddie-v1-1","e":true,"k":"-","d":[374],"c":[]}]]}]]}],["v",{"w":"av","s":"v","e":false,"k":"v","d":[],"c":[["a",{"w":"availab","s":"ailab","e":false,"k":"a","d":[],"c":[["l",{"w":"available","s":"le","e":true,"k":"l","d":[7,8,9,12,14,27,46,48,52,53,58,95,104,127,156,188,224,229,230,244,245,246,255,257,258,259,345,348,352,356,361,366,371,378,379,517],"c":[]}],["i",{"w":"availability","s":"ility","e":true,"k":"i","d":[49,71],"c":[]}]]}],["e",{"w":"average","s":"erage","e":true,"k":"e","d":[49,71,208],"c":[["-",{"w":"average-times'","s":"-times'","e":true,"k":"-","d":[266],"c":[]}]]}],["o",{"w":"avoid","s":"oid","e":true,"k":"o","d":[77,79,87,106,108,114,116,118,128,129,130,133,145,154,158,167,170,172,173,174,176,179,191,195,196,197,199,226,229,232,234,346,368],"c":[["i",{"w":"avoiding","s":"ing","e":true,"k":"i","d":[65,92,201,439,462],"c":[]}]]}]]}],["f",{"w":"af","s":"f","e":false,"k":"f","d":[],"c":[["f",{"w":"affect","s":"fect","e":true,"k":"f","d":[7,113,361],"c":[["e",{"w":"affected","s":"ed","e":true,"k":"e","d":[22,71],"c":[]}],["s",{"w":"affects","s":"s","e":true,"k":"s","d":[76,219,222],"c":[]}],["i",{"w":"affecting","s":"ing","e":true,"k":"i","d":[87,128,130,133,158,179,192],"c":[]}]]}],["t",{"w":"after","s":"ter","e":true,"k":"t","d":[12,16,18,22,45,50,51,52,68,69,75,92,104,127,156,202,221,224,226,227,230,234,236,238,245,258,348,352,356,366,368,370,379,426,444,515],"c":[["w",{"w":"afterwards","s":"wards","e":true,"k":"w","d":[55],"c":[]}]]}]]}],["b",{"w":"ab","s":"b","e":false,"k":"b","d":[],"c":[["s",{"w":"abs","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"abstract","s":"tract","e":true,"k":"t","d":[7,105,155,165,185,189,197,226,234,361,368],"c":[["i",{"w":"abstracti","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"abstracting","s":"ng","e":true,"k":"n","d":[105,155,165,185,189,197],"c":[]}],["o",{"w":"abstractions","s":"ons","e":true,"k":"o","d":[240],"c":[]}]]}],["e",{"w":"abstracted","s":"ed","e":true,"k":"e","d":[355],"c":[]}]]}],["e",{"w":"absen","s":"en","e":false,"k":"e","d":[],"c":[["c",{"w":"absence","s":"ce","e":true,"k":"c","d":[139],"c":[]}],["t",{"w":"absent","s":"t","e":true,"k":"t","d":[139,146],"c":[]}]]}],["o",{"w":"absolute","s":"olute","e":true,"k":"o","d":[352],"c":[]}]]}],["o",{"w":"abo","s":"o","e":false,"k":"o","d":[],"c":[["u",{"w":"about","s":"ut","e":true,"k":"u","d":[9,12,28,50,52,67,68,69,71,73,90,95,98,102,104,125,127,156,161,174,202,208,219,222,224,226,227,229,233,234,238,241,243,245,246,348,351,353,357,367,368,517],"c":[]}],["v",{"w":"above","s":"ve","e":true,"k":"v","d":[9,14,52,55,68,69,71,161,219,233,367,374,376,515],"c":[]}],["r",{"w":"abort","s":"rt","e":true,"k":"r","d":[226,231,234,238,368],"c":[]}]]}],["i",{"w":"abi","s":"i","e":true,"k":"i","d":[68,226,234,368,379],"c":[["l",{"w":"ability","s":"lity","e":true,"k":"l","d":[12,51,69,71,115,116,144,177,245,257,345,348],"c":[]}],["u",{"w":"abiurl","s":"url","e":true,"k":"u","d":[227,236,370],"c":[]}]]}],["l",{"w":"able","s":"le","e":true,"k":"l","d":[53,71,511,513],"c":[]}],["c",{"w":"abc","s":"c","e":true,"k":"c","d":[138,157],"c":[["1",{"w":"abc123456-789e-0fgh-1ijk-23lmno456789","s":"123456-789e-0fgh-1ijk-23lmno456789","e":true,"k":"1","d":[379],"c":[]}]]}]]}],["u",{"w":"au","s":"u","e":false,"k":"u","d":[],"c":[["t",{"w":"aut","s":"t","e":false,"k":"t","d":[],"c":[["o",{"w":"auto","s":"o","e":false,"k":"o","d":[],"c":[["m",{"w":"automat","s":"mat","e":false,"k":"m","d":[],"c":[["i",{"w":"automati","s":"i","e":false,"k":"i","d":[],"c":[["c",{"w":"automatic","s":"c","e":true,"k":"c","d":[164,166,356,366],"c":[["a",{"w":"automatically","s":"ally","e":true,"k":"a","d":[9,18,28,29,31,52,64,219,246,365,375,377,382,383,384,385,386,387,422,502],"c":[]}]]}],["o",{"w":"automation","s":"on","e":true,"k":"o","d":[31,69],"c":[]}]]}],["e",{"w":"automate","s":"e","e":true,"k":"e","d":[19],"c":[["d",{"w":"automated","s":"d","e":true,"k":"d","d":[22,69],"c":[]}]]}]]}],["n",{"w":"autonomous","s":"nomous","e":true,"k":"n","d":[11,69,256,381,501,505],"c":[]}],["p",{"w":"autoplay","s":"play","e":true,"k":"p","d":[70,72],"c":[]}],["-",{"w":"auto-","s":"-","e":false,"k":"-","d":[],"c":[["e",{"w":"auto-extend","s":"extend","e":true,"k":"e","d":[221],"c":[]}],["c",{"w":"auto-comp","s":"comp","e":false,"k":"c","d":[],"c":[["l",{"w":"auto-complete","s":"lete","e":true,"k":"l","d":[231],"c":[]}],["a",{"w":"auto-compatibility","s":"atibility","e":true,"k":"a","d":[351,356,366],"c":[]}]]}],["g",{"w":"auto-generate","s":"generate","e":true,"k":"g","d":[259],"c":[["d",{"w":"auto-generated","s":"d","e":true,"k":"d","d":[246],"c":[]}]]}]]}],["_",{"w":"auto_extend","s":"_extend","e":true,"k":"_","d":[221],"c":[]}]]}],["h",{"w":"auth","s":"h","e":true,"k":"h","d":[67,226,227,244],"c":[["e",{"w":"authentic","s":"entic","e":false,"k":"e","d":[],"c":[["a",{"w":"authenticat","s":"at","e":false,"k":"a","d":[],"c":[["i",{"w":"authenticati","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"authentication","s":"on","e":true,"k":"o","d":[18,65,67,80,81,108,226,227,229,244,352,353,354,355,357,439,462],"c":[]}],["n",{"w":"authenticating","s":"ng","e":true,"k":"n","d":[80],"c":[]}]]}],["e",{"w":"authenticate","s":"e","e":true,"k":"e","d":[65,81,230,243,350,352,355,356,357,366,439,462,511,513],"c":[["d",{"w":"authenticated","s":"d","e":true,"k":"d","d":[48,67,226,227,352],"c":[]}],["-",{"w":"authenticate-users","s":"-users","e":true,"k":"-","d":[243,350,353,354,357,511,513],"c":[]}]]}],["o",{"w":"authenticator","s":"or","e":true,"k":"o","d":[67,226,227,229],"c":[["u",{"w":"authenticatorurl","s":"url","e":true,"k":"u","d":[226,227],"c":[]}]]}]]}],["i",{"w":"authenticity","s":"ity","e":true,"k":"i","d":[71,80,91,162,169],"c":[]}]]}],["o",{"w":"authori","s":"ori","e":false,"k":"o","d":[],"c":[["z",{"w":"authoriz","s":"z","e":false,"k":"z","d":[],"c":[["e",{"w":"authorize","s":"e","e":true,"k":"e","d":[47,53,81],"c":[["d",{"w":"authorized","s":"d","e":true,"k":"d","d":[52,69,71,81,90,100],"c":[]}]]}],["a",{"w":"authorization","s":"ation","e":true,"k":"a","d":[52,69,90],"c":[["_",{"w":"authorization_header","s":"_header","e":true,"k":"_","d":[68,374,376,379],"c":[]}]]}]]}],["t",{"w":"authority","s":"ty","e":true,"k":"t","d":[192],"c":[]}]]}],["'",{"w":"auth'","s":"'","e":true,"k":"'","d":[67,226,227],"c":[]}],["r",{"w":"authrequest","s":"request","e":true,"k":"r","d":[67,226,227],"c":[]}],["i",{"w":"authid","s":"id","e":true,"k":"i","d":[223],"c":[]}],["-",{"w":"auth-request","s":"-request","e":true,"k":"-","d":[226,227],"c":[]}]]}]]}],["d",{"w":"audit","s":"dit","e":true,"k":"d","d":[19,70],"c":[["i",{"w":"auditing","s":"ing","e":true,"k":"i","d":[371,372],"c":[]}]]}],["c",{"w":"auction","s":"ction","e":true,"k":"c","d":[114],"c":[["_",{"w":"auction_end_height","s":"_end_height","e":true,"k":"_","d":[114],"c":[]}],["-",{"w":"auction-ended","s":"-ended","e":true,"k":"-","d":[114],"c":[]}]]}]]}],["g",{"w":"ag","s":"g","e":false,"k":"g","d":[],"c":[["a",{"w":"again","s":"ain","e":true,"k":"a","d":[16,22,28,128,224],"c":[["s",{"w":"against","s":"st","e":true,"k":"s","d":[12,52,69,73,77,103,149,169,193,202,224,233,245,348,367,371,374,375,376,379],"c":[]}]]}],["e",{"w":"age","s":"e","e":true,"k":"e","d":[14,17,83,85,97,103,116,139,142,144,146,151],"c":[]}],["g",{"w":"aggregat","s":"gregat","e":false,"k":"g","d":[],"c":[["i",{"w":"aggregati","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"aggregating","s":"ng","e":true,"k":"n","d":[96],"c":[]}],["o",{"w":"aggregation","s":"on","e":true,"k":"o","d":[96],"c":[]}]]}],["e",{"w":"aggregate","s":"e","e":true,"k":"e","d":[96],"c":[["d",{"w":"aggregated","s":"d","e":true,"k":"d","d":[208,233,367],"c":[["-",{"w":"aggregated-signer-information-for-a-block","s":"-signer-information-for-a-block","e":true,"k":"-","d":[208],"c":[]}]]}]]}]]}],["r",{"w":"agreed","s":"reed","e":true,"k":"r","d":[354],"c":[]}]]}],["i",{"w":"ai","s":"i","e":true,"k":"i","d":[70,73],"c":[["d",{"w":"aid","s":"d","e":true,"k":"d","d":[49],"c":[]}],["-",{"w":"ai-powered","s":"-powered","e":true,"k":"-","d":[70],"c":[]}],["r",{"w":"airdrops","s":"rdrops","e":true,"k":"r","d":[71,178],"c":[]}],["m",{"w":"aiming","s":"ming","e":true,"k":"m","d":[509],"c":[]}]]}],["k",{"w":"aka","s":"ka","e":true,"k":"k","d":[229,233,367],"c":[]}]]}],["e",{"w":"e","s":"e","e":true,"k":"e","d":[52,65,86,99,125,147,156,163,166,178,182,223,239,355,375,439,462],"c":[["n",{"w":"en","s":"n","e":true,"k":"n","d":[75],"c":[["v",{"w":"environment","s":"vironment","e":true,"k":"v","d":[2,8,18,19,27,29,47,50,53,69,71,75,203,204,225,228,241,347,349,350,373,426,444],"c":[["s",{"w":"environments","s":"s","e":true,"k":"s","d":[9,45,237],"c":[]}]]}],["r",{"w":"enr","s":"r","e":false,"k":"r","d":[],"c":[["o",{"w":"enrollmentblock","s":"ollmentblock","e":true,"k":"o","d":[6,7,360,361],"c":[]}],["i",{"w":"enriches","s":"iches","e":true,"k":"i","d":[257,345],"c":[]}]]}],["t",{"w":"ent","s":"t","e":false,"k":"t","d":[],"c":[["r",{"w":"entr","s":"r","e":false,"k":"r","d":[],"c":[["y",{"w":"entry","s":"y","e":true,"k":"y","d":[7,79,89,99,132,167,172,189,232,361,516],"c":[["-",{"w":"entry-type","s":"-type","e":true,"k":"-","d":[226,234,368],"c":[]}]]}],["i",{"w":"entries","s":"ies","e":true,"k":"i","d":[89,97,132,167,172,226,234,368,515,516,517],"c":[]}]]}],["e",{"w":"enter","s":"er","e":true,"k":"e","d":[49,516],"c":[]}],["i",{"w":"enti","s":"i","e":false,"k":"i","d":[],"c":[["t",{"w":"entities","s":"ties","e":true,"k":"t","d":[81],"c":[]}],["r",{"w":"entire","s":"re","e":true,"k":"r","d":[255],"c":[]}]]}]]}],["c",{"w":"enc","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"enco","s":"o","e":false,"k":"o","d":[],"c":[["d",{"w":"encod","s":"d","e":false,"k":"d","d":[],"c":[["e",{"w":"encode","s":"e","e":true,"k":"e","d":[7,361],"c":[["d",{"w":"encoded","s":"d","e":true,"k":"d","d":[87,133,158,179,356,366,371,372],"c":[]}]]}],["i",{"w":"encoding","s":"ing","e":true,"k":"i","d":[87,120,133,158,179],"c":[]}]]}],["u",{"w":"encou","s":"u","e":false,"k":"u","d":[],"c":[["n",{"w":"encounter","s":"nter","e":true,"k":"n","d":[14],"c":[]}],["r",{"w":"encourag","s":"rag","e":false,"k":"r","d":[],"c":[["i",{"w":"encouraging","s":"ing","e":true,"k":"i","d":[69],"c":[]}],["e",{"w":"encourage","s":"e","e":true,"k":"e","d":[219,222],"c":[]}]]}]]}]]}],["r",{"w":"encrypt","s":"rypt","e":true,"k":"r","d":[67,93,226,227],"c":[["e",{"w":"encrypted","s":"ed","e":true,"k":"e","d":[67,226,227,229],"c":[["-",{"w":"encrypted-media","s":"-media","e":true,"k":"-","d":[70,72],"c":[]}],["d",{"w":"encrypteddata","s":"data","e":true,"k":"d","d":[93],"c":[]}]]}],["i",{"w":"encrypti","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"encryption","s":"on","e":true,"k":"o","d":[67,71,93,128,226,227,244,354],"c":[["'",{"w":"encryption'","s":"'","e":true,"k":"'","d":[354],"c":[]}]]}],["n",{"w":"encrypting","s":"ng","e":true,"k":"n","d":[67,226,227,229],"c":[]}]]}],["c",{"w":"encryptcontent","s":"content","e":true,"k":"c","d":[67,226,227],"c":[]}],["s",{"w":"encrypts","s":"s","e":true,"k":"s","d":[67,93,226,227],"c":[]}]]}],["a",{"w":"encapsulating","s":"apsulating","e":true,"k":"a","d":[129],"c":[]}]]}],["d",{"w":"end","s":"d","e":true,"k":"d","d":[52,68,69,71,73,74,82,109,114,149,176,182,194,221,372,379,399,425,427,443],"c":[["_",{"w":"end_","s":"_","e":false,"k":"_","d":[],"c":[["l",{"w":"end_line_comment","s":"line_comment","e":true,"k":"l","d":[7,361],"c":[]}],["b",{"w":"end_block","s":"block","e":true,"k":"b","d":[374,376,379],"c":[]}]]}],["p",{"w":"endpoint","s":"point","e":true,"k":"p","d":[14,15,17,51,67,68,258,374,376,377,379],"c":[["s",{"w":"endpoints","s":"s","e":true,"k":"s","d":[31,44,54,64,68,208,219,222,244,257,259,345,346,365,376,382,383,384,385,386,387,399,427,459,466,509,514],"c":[]}],["'",{"w":"endpoint's","s":"'s","e":true,"k":"'","d":[379],"c":[]}]]}],["-",{"w":"end-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"end-to-end","s":"to-end","e":true,"k":"t","d":[44,466],"c":[]}],["b",{"w":"end-block","s":"block","e":true,"k":"b","d":[379],"c":[["-",{"w":"end-block-height","s":"-height","e":true,"k":"-","d":[69],"c":[]}]]}],["s",{"w":"end-state","s":"state","e":true,"k":"s","d":[238],"c":[]}]]}],["e",{"w":"ended","s":"ed","e":true,"k":"e","d":[114],"c":[]}],["s",{"w":"ends","s":"s","e":true,"k":"s","d":[231],"c":[["_",{"w":"ends_with","s":"_with","e":true,"k":"_","d":[371],"c":[]}]]}],["i",{"w":"ending","s":"ing","e":true,"k":"i","d":[371],"c":[]}]]}],["s",{"w":"ensur","s":"sur","e":false,"k":"s","d":[],"c":[["e",{"w":"ensure","s":"e","e":true,"k":"e","d":[9,12,16,27,49,68,71,81,82,83,84,85,87,88,89,91,92,93,94,96,97,98,100,101,105,106,107,109,110,111,114,115,116,117,118,120,121,123,124,128,130,131,132,133,134,135,136,138,139,141,142,143,144,146,147,148,149,150,151,152,153,154,155,157,158,159,161,162,163,164,165,166,167,168,169,170,171,172,173,175,176,177,179,180,181,182,183,184,185,186,189,190,191,192,193,194,195,196,197,198,199,200,221,224,231,232,238,245,348,374,376,423,502,510],"c":[["s",{"w":"ensures","s":"s","e":true,"k":"s","d":[9,93,110,122,125,190,224,231,233,356,366,367,509,516],"c":[]}]]}],["i",{"w":"ensuring","s":"ing","e":true,"k":"i","d":[18,69,77,80,81,83,84,85,89,91,92,94,98,101,106,109,110,111,117,118,121,124,131,132,135,136,138,139,141,142,143,146,147,148,150,151,152,153,157,159,162,166,167,168,169,170,172,173,175,181,184,186,189,194,195,198,200,202,352,372,516],"c":[]}]]}],["a",{"w":"enabl","s":"abl","e":false,"k":"a","d":[],"c":[["i",{"w":"enabling","s":"ing","e":true,"k":"i","d":[11,18,52,69,71,82,86,88,90,95,97,99,107,110,116,119,120,122,123,124,125,134,136,139,144,146,147,152,155,156,160,165,167,171,173,183,185,190,192,196,197,202,221,256,350,374,381,501,505],"c":[]}],["e",{"w":"enable","s":"e","e":true,"k":"e","d":[18,52,65,69,76,79,80,119,134,152,221,350,356,366,374,376],"c":[["s",{"w":"enables","s":"s","e":true,"k":"s","d":[13,18,26,67,88,90,113,120,122,127,128,130,144,145,149,160,161,164,178,187,192,208,226,227,356,357,366,371,516],"c":[]}],["d",{"w":"enabled","s":"d","e":true,"k":"d","d":[52,69,76,90,108,239],"c":[]}],["o",{"w":"enableoverrides","s":"overrides","e":true,"k":"o","d":[356,366],"c":[]}],["l",{"w":"enablelocalstorage","s":"localstorage","e":true,"k":"l","d":[356,366],"c":[]}]]}]]}],["h",{"w":"enhanc","s":"hanc","e":false,"k":"h","d":[],"c":[["i",{"w":"enhancing","s":"ing","e":true,"k":"i","d":[68,77,90,93,105,144,155,165,170,177,185,189,197,199],"c":[]}],["e",{"w":"enhance","s":"e","e":true,"k":"e","d":[71,78,90,93,97,100,134,170,188],"c":[["d",{"w":"enhanced","s":"d","e":true,"k":"d","d":[81],"c":[]}],["s",{"w":"enhances","s":"s","e":true,"k":"s","d":[82,83,84,85,88,89,91,94,98,101,103,105,106,107,109,110,111,116,117,118,120,121,124,131,132,135,136,138,139,141,142,143,146,147,148,150,151,152,153,155,157,159,162,163,165,166,167,168,169,170,171,172,173,175,181,183,184,185,186,189,194,195,196,197,198,199,200,509],"c":[]}]]}]]}],["o",{"w":"enough","s":"ough","e":true,"k":"o","d":[71,150,166,184,515],"c":[]}],["f",{"w":"enforc","s":"forc","e":false,"k":"f","d":[],"c":[["i",{"w":"enforcing","s":"ing","e":true,"k":"i","d":[81,126,193],"c":[]}],["e",{"w":"enforce","s":"e","e":true,"k":"e","d":[81,114,154,176,191,226,234,368],"c":[]}]]}],["u",{"w":"enum","s":"um","e":true,"k":"u","d":[219,223,229],"c":[]}],["g",{"w":"engouh","s":"gouh","e":true,"k":"g","d":[221],"c":[]}],["-",{"w":"en-us","s":"-us","e":true,"k":"-","d":[229],"c":[]}],["e",{"w":"energy","s":"ergy","e":true,"k":"e","d":[346],"c":[]}]]}],["v",{"w":"ev","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"eve","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"even","s":"n","e":true,"k":"n","d":[28,134,177,229,235,355,369,517],"c":[["t",{"w":"event","s":"t","e":true,"k":"t","d":[2,7,8,18,31,44,45,53,54,65,68,69,74,149,203,204,208,219,222,225,226,227,228,246,257,259,345,347,349,350,351,361,365,372,373,377,399,422,425,443,459,502],"c":[["s",{"w":"events","s":"s","e":true,"k":"s","d":[7,11,14,31,44,45,52,67,68,70,74,95,115,149,178,202,219,222,246,255,256,259,351,361,371,372,373,374,376,377,378,379,381,420,425,443,501,505],"c":[["'",{"w":"events'","s":"'","e":true,"k":"'","d":[304,305,329],"c":[]}],["_",{"w":"events_","s":"_","e":false,"k":"_","d":[],"c":[["o",{"w":"events_observer","s":"observer","e":true,"k":"o","d":[374],"c":[]}],["k",{"w":"events_keys","s":"keys","e":true,"k":"k","d":[374],"c":[]}]]}]]}],["v",{"w":"eventvalues","s":"values","e":true,"k":"v","d":[7,361],"c":[]}],["l",{"w":"eventlog","s":"log","e":true,"k":"l","d":[149],"c":[]}],["u",{"w":"eventually","s":"ually","e":true,"k":"u","d":[221],"c":[]}],["'",{"w":"event'","s":"'","e":true,"k":"'","d":[246],"c":[]}],["_",{"w":"event_","s":"_","e":false,"k":"_","d":[],"c":[["c",{"w":"event_count","s":"count","e":true,"k":"c","d":[255],"c":[]}],["s",{"w":"event_source","s":"source","e":true,"k":"s","d":[374,376],"c":[]}]]}],["-",{"w":"event-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"event-stream","s":"stream","e":true,"k":"s","d":[259],"c":[["i",{"w":"event-streaming","s":"ing","e":true,"k":"i","d":[376],"c":[]}]]}],["d",{"w":"event-driven","s":"driven","e":true,"k":"d","d":[422],"c":[]}]]}]]}],["l",{"w":"evenly","s":"ly","e":true,"k":"l","d":[112],"c":[]}]]}],["r",{"w":"every","s":"ry","e":true,"k":"r","d":[2,8,9,13,18,19,22,27,28,31,45,49,51,54,68,69,74,203,204,208,225,228,233,257,345,347,349,350,367,373,377,399,422,425,427,443,459,502],"c":[["t",{"w":"everything","s":"thing","e":true,"k":"t","d":[45,68,257,345],"c":[]}]]}]]}],["i",{"w":"evidence","s":"idence","e":true,"k":"i","d":[52],"c":[]}],["a",{"w":"evaluat","s":"aluat","e":false,"k":"a","d":[],"c":[["e",{"w":"evaluate","s":"e","e":true,"k":"e","d":[161,165,196,199,208,259,374,379],"c":[["d",{"w":"evaluated","s":"d","e":true,"k":"d","d":[73,161,163,171,173],"c":[]}],["s",{"w":"evaluates","s":"s","e":true,"k":"s","d":[171],"c":[]}]]}],["i",{"w":"evaluati","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"evaluation","s":"on","e":true,"k":"o","d":[171],"c":[["s",{"w":"evaluations","s":"s","e":true,"k":"s","d":[108,171],"c":[]}]]}],["n",{"w":"evaluating","s":"ng","e":true,"k":"n","d":[161,165,199,231,379],"c":[]}]]}]]}]]}],["t",{"w":"et","s":"t","e":true,"k":"t","d":[2,8,18,31,45,54,73,74,203,204,208,225,228,257,345,347,349,350,373,399,422,425,427,443,459,502],"c":[["c",{"w":"etc","s":"c","e":true,"k":"c","d":[55,229,231,355],"c":[["h",{"w":"etching","s":"hing","e":true,"k":"h","d":[432,433,436,438,442,472,473,476,478,481],"c":[["s",{"w":"etchings","s":"s","e":true,"k":"s","d":[427,432,433,436,438,442,472,473,476,478,481],"c":[["'",{"w":"etchings'","s":"'","e":true,"k":"'","d":[441,480],"c":[]}]]}]]}]]}],["h",{"w":"eth","s":"h","e":false,"k":"h","d":[],"c":[["e",{"w":"ethereum","s":"ereum","e":true,"k":"e","d":[80],"c":[["-",{"w":"ethereum-compatible","s":"-compatible","e":true,"k":"-","d":[80],"c":[]}]]}],["-",{"w":"eth-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"eth-compatible-hash","s":"compatible-hash","e":true,"k":"c","d":[80],"c":[]}],["h",{"w":"eth-hash","s":"hash","e":true,"k":"h","d":[80],"c":[]}]]}]]}]]}],["p",{"w":"ep","s":"p","e":false,"k":"p","d":[],"c":[["o",{"w":"epoch","s":"och","e":true,"k":"o","d":[5,7,20,27,30,104,127,156,219,221,359,361],"c":[["s",{"w":"epochs","s":"s","e":true,"k":"s","d":[7,104,361],"c":[]}],["2",{"w":"epoch25","s":"25","e":true,"k":"2","d":[7,361],"c":[]}]]}],["h",{"w":"ephemeral","s":"hemeral","e":true,"k":"h","d":[241],"c":[]}]]}],["x",{"w":"ex","s":"x","e":false,"k":"x","d":[],"c":[["p",{"w":"exp","s":"p","e":false,"k":"p","d":[],"c":[["e",{"w":"expe","s":"e","e":false,"k":"e","d":[],"c":[["c",{"w":"expect","s":"ct","e":true,"k":"c","d":[6,9,12,51,73,87,133,158,179,224,245,246,348,360],"c":[["e",{"w":"expected","s":"ed","e":true,"k":"e","d":[6,9,18,68,71,95,102,112,137,140,144,173,189,219,222,224,231,238,360,372],"c":[["t",{"w":"expectedtype","s":"type","e":true,"k":"t","d":[6,360],"c":[]}],["-",{"w":"expected-sender","s":"-sender","e":true,"k":"-","d":[25,27],"c":[]}],["h",{"w":"expectedhash","s":"hash","e":true,"k":"h","d":[95,104],"c":[]}]]}],["s",{"w":"expects","s":"s","e":true,"k":"s","d":[22,26,351],"c":[]}],["i",{"w":"expecting","s":"ing","e":true,"k":"i","d":[90,375],"c":[]}],["a",{"w":"expectations","s":"ations","e":true,"k":"a","d":[107,197],"c":[]}]]}],["r",{"w":"experi","s":"ri","e":false,"k":"r","d":[],"c":[["m",{"w":"experiment","s":"ment","e":true,"k":"m","d":[71],"c":[["a",{"w":"experimental","s":"al","e":true,"k":"a","d":[27,351],"c":[]}]]}],["e",{"w":"experienc","s":"enc","e":false,"k":"e","d":[],"c":[["e",{"w":"experience","s":"e","e":true,"k":"e","d":[45,68,219,220,373,422,502],"c":[["d",{"w":"experienced","s":"d","e":true,"k":"d","d":[229],"c":[]}]]}],["i",{"w":"experiencing","s":"ing","e":true,"k":"i","d":[219],"c":[]}]]}]]}],["d",{"w":"expedite","s":"dite","e":true,"k":"d","d":[50],"c":[]}],["n",{"w":"expens","s":"ns","e":false,"k":"n","d":[],"c":[["e",{"w":"expenses","s":"es","e":true,"k":"e","d":[50,73],"c":[]}],["i",{"w":"expensive","s":"ive","e":true,"k":"i","d":[161,177,188],"c":[]}]]}]]}],["o",{"w":"expo","s":"o","e":true,"k":"o","d":[232],"c":[["s",{"w":"expos","s":"s","e":false,"k":"s","d":[],"c":[["e",{"w":"expose","s":"e","e":true,"k":"e","d":[68,134,237],"c":[["d",{"w":"exposed","s":"d","e":true,"k":"d","d":[7,361],"c":[]}],["s",{"w":"exposes","s":"s","e":true,"k":"s","d":[376],"c":[]}]]}],["i",{"w":"exposing","s":"ing","e":true,"k":"i","d":[19,68],"c":[]}]]}],["r",{"w":"export","s":"rt","e":true,"k":"r","d":[14,15,232,517],"c":[["e",{"w":"exported","s":"ed","e":true,"k":"e","d":[7,361],"c":[]}],["-",{"w":"export-and-import","s":"-and-import","e":true,"k":"-","d":[14],"c":[]}],["s",{"w":"exports","s":"s","e":true,"k":"s","d":[232,233,367],"c":[]}]]}],["n",{"w":"exponent","s":"nent","e":true,"k":"n","d":[185],"c":[["i",{"w":"exponentiation","s":"iation","e":true,"k":"i","d":[185],"c":[]}],["s",{"w":"exponents","s":"s","e":true,"k":"s","d":[185],"c":[]}]]}],["-",{"w":"expo-router","s":"-router","e":true,"k":"-","d":[232],"c":[]}]]}],["l",{"w":"expl","s":"l","e":false,"k":"l","d":[],"c":[["i",{"w":"explicit","s":"icit","e":true,"k":"i","d":[7,96,103,355,361],"c":[["l",{"w":"explicitly","s":"ly","e":true,"k":"l","d":[77,168],"c":[]}],["n",{"w":"explicitness","s":"ness","e":true,"k":"n","d":[201],"c":[]}]]}],["o",{"w":"explor","s":"or","e":false,"k":"o","d":[],"c":[["e",{"w":"explore","s":"e","e":true,"k":"e","d":[44,68,70,72,74,78,422,423,425,443,466,502,504],"c":[["r",{"w":"explorer","s":"r","e":true,"k":"r","d":[28,49,54,68,74,75,219,220,353,376,377,399,422,425,426,427,443,444,459,466,502,504,515],"c":[["s",{"w":"explorers","s":"s","e":true,"k":"s","d":[233,367],"c":[]}],["u",{"w":"explorerurl","s":"url","e":true,"k":"u","d":[353],"c":[]}]]}],["-",{"w":"explore-b","s":"-b","e":false,"k":"-","d":[],"c":[["y",{"w":"explore-by-","s":"y-","e":false,"k":"y","d":[],"c":[["c",{"w":"explore-by-category","s":"category","e":true,"k":"c","d":[44],"c":[]}],["t",{"w":"explore-by-tool","s":"tool","e":true,"k":"t","d":[44],"c":[]}]]}],["i",{"w":"explore-bitcoin","s":"itcoin","e":true,"k":"i","d":[466],"c":[]}]]}]]}],["i",{"w":"exploring","s":"ing","e":true,"k":"i","d":[50],"c":[]}]]}],["a",{"w":"expla","s":"a","e":false,"k":"a","d":[],"c":[["i",{"w":"explain","s":"in","e":true,"k":"i","d":[65,70,128,130,439,462],"c":[["i",{"w":"explaining","s":"ing","e":true,"k":"i","d":[78],"c":[]}]]}],["n",{"w":"explanation","s":"nation","e":true,"k":"n","d":[90],"c":[]}]]}]]}],["r",{"w":"expr","s":"r","e":true,"k":"r","d":[7,22,161,192,199,361],"c":[["e",{"w":"express","s":"ess","e":true,"k":"e","d":[68,96,259],"c":[["i",{"w":"expressi","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"expression","s":"on","e":true,"k":"o","d":[22,26,92,108,155,161,163,165,166,170,180,192,193,196,199,201,371],"c":[["s",{"w":"expressions","s":"s","e":true,"k":"s","d":[7,108,155,161,163,165,166,170,171,196,199,361,517],"c":[]}],["'",{"w":"expression's","s":"'s","e":true,"k":"'","d":[171],"c":[]}]]}],["v",{"w":"expressive","s":"ve","e":true,"k":"v","d":[163],"c":[["n",{"w":"expressiveness","s":"ness","e":true,"k":"n","d":[163],"c":[]}]]}]]}],["e",{"w":"expressed","s":"ed","e":true,"k":"e","d":[69,96],"c":[]}]]}],["1",{"w":"expr1","s":"1","e":true,"k":"1","d":[82,163,171,175,196],"c":[]}],["2",{"w":"expr2","s":"2","e":true,"k":"2","d":[82,163,171,196],"c":[]}],["3",{"w":"expr3","s":"3","e":true,"k":"3","d":[82,163],"c":[]}],["-",{"w":"expr-","s":"-","e":false,"k":"-","d":[],"c":[["l",{"w":"expr-last","s":"last","e":true,"k":"l","d":[163],"c":[]}],["b",{"w":"expr-body","s":"body","e":false,"k":"b","d":[],"c":[["1",{"w":"expr-body1","s":"1","e":true,"k":"1","d":[171],"c":[]}],["2",{"w":"expr-body2","s":"2","e":true,"k":"2","d":[171],"c":[]}],["-",{"w":"expr-body-last","s":"-last","e":true,"k":"-","d":[171],"c":[]}]]}]]}]]}],["i",{"w":"expir","s":"ir","e":false,"k":"i","d":[],"c":[["e",{"w":"expire","s":"e","e":true,"k":"e","d":[52,379],"c":[["_",{"w":"expire_after_occurrence","s":"_after_occurrence","e":true,"k":"_","d":[374,377,379],"c":[]}],["d",{"w":"expired","s":"d","e":true,"k":"d","d":[511,513],"c":[]}]]}],["y",{"w":"expiry","s":"y","e":true,"k":"y","d":[511,513],"c":[]}],["a",{"w":"expiration","s":"ation","e":true,"k":"a","d":[516],"c":[]}]]}],["a",{"w":"expand","s":"and","e":false,"k":"a","d":[],"c":[["e",{"w":"expanded","s":"ed","e":true,"k":"e","d":[219,222],"c":[]}],["s",{"w":"expands","s":"s","e":true,"k":"s","d":[257,345],"c":[]}]]}]]}],["a",{"w":"exa","s":"a","e":false,"k":"a","d":[],"c":[["m",{"w":"exam","s":"m","e":false,"k":"m","d":[],"c":[["p",{"w":"example","s":"ple","e":true,"k":"p","d":[7,11,17,22,25,26,27,30,52,58,68,69,70,71,72,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,223,226,229,230,232,234,235,238,240,243,246,256,258,352,353,354,356,361,366,368,369,371,374,376,377,378,381,501,505,514,515,516,517],"c":[["s",{"w":"examples","s":"s","e":true,"k":"s","d":[12,27,65,68,99,224,229,231,233,241,243,245,348,355,367,375,376,439,462],"c":[]}],["-",{"w":"example-contracts","s":"-contracts","e":true,"k":"-","d":[259],"c":[]}]]}],["i",{"w":"examin","s":"in","e":false,"k":"i","d":[],"c":[["e",{"w":"examine","s":"e","e":true,"k":"e","d":[377],"c":[]}],["i",{"w":"examining","s":"ing","e":true,"k":"i","d":[377],"c":[]}]]}]]}],["c",{"w":"exact","s":"ct","e":true,"k":"c","d":[12,81,104,127,156,176,191,245,348,371,372],"c":[["l",{"w":"exactly","s":"ly","e":true,"k":"l","d":[72,231],"c":[]}]]}]]}],["e",{"w":"execut","s":"ecut","e":false,"k":"e","d":[],"c":[["i",{"w":"executi","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"execution","s":"on","e":true,"k":"o","d":[7,22,26,52,69,92,95,100,121,127,149,156,163,164,193,196,201,230,259,353,361,372,375,516],"c":[["s",{"w":"executions","s":"s","e":true,"k":"s","d":[49],"c":[]}]]}],["n",{"w":"executing","s":"ng","e":true,"k":"n","d":[7,9,163,192,193,196,230,246,353,361],"c":[]}],["v",{"w":"executive","s":"ve","e":true,"k":"v","d":[69],"c":[]}]]}],["e",{"w":"execute","s":"e","e":true,"k":"e","d":[7,69,86,115,163,174,178,192,196,230,231,353,361,376],"c":[["d",{"w":"executed","s":"d","e":true,"k":"d","d":[7,22,69,99,121,129,134,238,259,361],"c":[["p",{"w":"executedproposals","s":"proposals","e":true,"k":"p","d":[69],"c":[]}],["-",{"w":"executed-at","s":"-at","e":true,"k":"-","d":[69],"c":[]}]]}],["s",{"w":"executes","s":"s","e":true,"k":"s","d":[69],"c":[]}]]}],["o",{"w":"executor","s":"or","e":false,"k":"o","d":[],"c":[["d",{"w":"executordao","s":"dao","e":true,"k":"d","d":[69],"c":[]}],["-",{"w":"executor-dao","s":"-dao","e":true,"k":"-","d":[69],"c":[]}]]}],["a",{"w":"executable","s":"able","e":true,"k":"a","d":[510,515],"c":[]}]]}],["i",{"w":"exist","s":"ist","e":true,"k":"i","d":[79,89,97,101,116,132,135,172,189,195,201,515],"c":[["i",{"w":"existing","s":"ing","e":true,"k":"i","d":[8,9,47,51,53,76,122,132,146,149,167,189,226,229,234,246,368,376],"c":[]}],["s",{"w":"exists","s":"s","e":true,"k":"s","d":[12,27,79,116,135,146,167,183,186,195,201,224,245,348,355,511,513],"c":[]}],["e",{"w":"existence","s":"ence","e":true,"k":"e","d":[172],"c":[]}]]}],["c",{"w":"exc","s":"c","e":false,"k":"c","d":[],"c":[["e",{"w":"exce","s":"e","e":false,"k":"e","d":[],"c":[["e",{"w":"exceed","s":"ed","e":true,"k":"e","d":[12,110,125,126,149,153,245,348],"c":[["s",{"w":"exceeds","s":"s","e":true,"k":"s","d":[149,154],"c":[]}],["i",{"w":"exceeding","s":"ing","e":true,"k":"i","d":[149],"c":[]}]]}],["s",{"w":"excessive","s":"ssive","e":true,"k":"s","d":[126],"c":[["l",{"w":"excessively","s":"ly","e":true,"k":"l","d":[193,199],"c":[]}]]}],["p",{"w":"except","s":"pt","e":true,"k":"p","d":[187],"c":[["i",{"w":"exception","s":"ion","e":true,"k":"i","d":[148,151],"c":[]}]]}],["l",{"w":"excellent","s":"llent","e":true,"k":"l","d":[377],"c":[]}]]}],["l",{"w":"exclu","s":"lu","e":false,"k":"l","d":[],"c":[["s",{"w":"exclusive","s":"sive","e":true,"k":"s","d":[71,93,114,128,154],"c":[]}],["d",{"w":"exclud","s":"d","e":false,"k":"d","d":[],"c":[["i",{"w":"excluding","s":"ing","e":true,"k":"i","d":[176,191],"c":[]}],["e",{"w":"exclude","s":"e","e":true,"k":"e","d":[379],"c":[]}]]}]]}],["h",{"w":"exchange","s":"hange","e":true,"k":"h","d":[71,233,367],"c":[]}]]}],["t",{"w":"ext","s":"t","e":true,"k":"t","d":[32,34,35,36,37,38,39,41,42,43],"c":[["e",{"w":"exte","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"exten","s":"n","e":false,"k":"n","d":[],"c":[["d",{"w":"extend","s":"d","e":true,"k":"d","d":[226,234,368],"c":[["e",{"w":"extended","s":"ed","e":true,"k":"e","d":[14,219,222,258,260,261,262,264,265,266,267,268,269,279,281,283,284,285,286,287,289,290,291,292,293,295,296,297,298,300,302,303,304,305,306,308,309,310,311,312,313,314,315,316,319,320,321,322,323,324,325,326,327,328,329,330,332,333,335,336,338,340,342,343,344,371],"c":[["'",{"w":"extended'","s":"'","e":true,"k":"'","d":[301],"c":[]}]]}],["i",{"w":"extending","s":"ing","e":true,"k":"i","d":[229],"c":[]}]]}],["s",{"w":"extensi","s":"si","e":false,"k":"s","d":[],"c":[["o",{"w":"extension","s":"on","e":true,"k":"o","d":[18,67,69,90,226,227,228],"c":[["-",{"w":"extension-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"extension-trait","s":"trait","e":true,"k":"t","d":[27,69,90],"c":[]}],["c",{"w":"extension-contract","s":"contract","e":true,"k":"c","d":[90],"c":[]}]]}],["s",{"w":"extensions","s":"s","e":true,"k":"s","d":[69,90],"c":[]}],["a",{"w":"extensionaddress","s":"address","e":true,"k":"a","d":[69],"c":[]}],["t",{"w":"extensiontrait","s":"trait","e":true,"k":"t","d":[90],"c":[]}]]}],["v",{"w":"extensive","s":"ve","e":true,"k":"v","d":[170],"c":[["l",{"w":"extensively","s":"ly","e":true,"k":"l","d":[128,130,187],"c":[]}]]}]]}]]}],["r",{"w":"external","s":"rnal","e":true,"k":"r","d":[19,25,27,55,69,86,87,117,126,129,133,144,158,179,233,367,515],"c":[["l",{"w":"externally","s":"ly","e":true,"k":"l","d":[99],"c":[]}]]}]]}],["r",{"w":"extra","s":"ra","e":false,"k":"r","d":[],"c":[["c",{"w":"extract","s":"ct","e":true,"k":"c","d":[14,17,22,68,86,116,145,182,193,194,201,377],"c":[["e",{"w":"extracted","s":"ed","e":true,"k":"e","d":[14,17,68],"c":[]}],["i",{"w":"extracti","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"extracting","s":"ng","e":true,"k":"n","d":[116,145,194],"c":[]}],["o",{"w":"extraction","s":"on","e":true,"k":"o","d":[194,201],"c":[]}]]}],["-",{"w":"extract-","s":"-","e":false,"k":"-","d":[],"c":[["l",{"w":"extract-lowest-bits","s":"lowest-bits","e":true,"k":"l","d":[145],"c":[]}],["s",{"w":"extract-substring","s":"substring","e":true,"k":"s","d":[194],"c":[]}]]}],["s",{"w":"extracts","s":"s","e":true,"k":"s","d":[194],"c":[]}]]}],["n",{"w":"extranodemodules","s":"nodemodules","e":true,"k":"n","d":[232],"c":[]}]]}]]}]]}],["r",{"w":"err","s":"rr","e":true,"k":"r","d":[6,12,69,71,77,79,80,81,85,87,90,97,99,100,101,102,108,110,112,114,115,116,121,122,123,124,125,126,128,129,133,135,136,140,144,147,148,149,150,151,152,154,158,159,160,163,164,166,170,176,178,179,180,184,186,190,191,192,193,196,201,202,245,348,360,377,511,513,516],"c":[["o",{"w":"error","s":"or","e":true,"k":"o","d":[7,12,24,52,65,68,69,71,78,81,82,83,84,85,86,89,91,93,94,98,99,100,101,103,105,106,107,109,110,111,112,114,116,117,118,121,123,124,126,127,131,132,134,135,136,138,139,141,142,143,146,147,148,150,151,152,153,154,155,157,159,162,164,165,166,167,168,169,170,171,172,173,175,176,178,180,181,182,184,185,186,189,191,193,194,195,197,198,200,201,230,245,348,356,361,366,439,462,514,517],"c":[["-",{"w":"error-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"error-type","s":"type","e":true,"k":"t","d":[6,360],"c":[]}],["h",{"w":"error-handling","s":"handling","e":true,"k":"h","d":[164],"c":[]}],["r",{"w":"error-resistant","s":"resistant","e":true,"k":"r","d":[180],"c":[]}],["e",{"w":"error-expr","s":"expr","e":true,"k":"e","d":[201],"c":[]}]]}],["s",{"w":"errors","s":"s","e":true,"k":"s","d":[14,24,30,71,77,78,82,85,86,87,90,91,93,99,105,106,110,114,115,116,117,118,124,131,133,136,139,144,146,147,148,151,152,154,155,158,159,164,165,166,170,172,173,175,176,179,180,185,189,191,193,195,197,201,224,356,366,511,513],"c":[]}],["v",{"w":"errorvalue","s":"value","e":true,"k":"v","d":[148,159],"c":[]}],["_",{"w":"error_code","s":"_code","e":true,"k":"_","d":[200],"c":[]}]]}],["-",{"w":"err-","s":"-","e":false,"k":"-","d":[],"c":[["o",{"w":"err-overborrow","s":"overborrow","e":true,"k":"o","d":[12,245,348],"c":[]}],["b",{"w":"err-b","s":"b","e":false,"k":"b","d":[],"c":[["i",{"w":"err-binding-name","s":"inding-name","e":true,"k":"i","d":[170],"c":[]}],["r",{"w":"err-branch","s":"ranch","e":true,"k":"r","d":[170],"c":[]}]]}],["v",{"w":"err-value","s":"value","e":true,"k":"v","d":[170],"c":[]}],["t",{"w":"err-type","s":"type","e":true,"k":"t","d":[226,234,368],"c":[]}]]}],["_",{"w":"err_","s":"_","e":false,"k":"_","d":[],"c":[["u",{"w":"err_un","s":"un","e":false,"k":"u","d":[],"c":[["a",{"w":"err_unauthori","s":"authori","e":false,"k":"a","d":[],"c":[["z",{"w":"err_unauthorized","s":"zed","e":true,"k":"z","d":[69,516],"c":[]}],["s",{"w":"err_unauthorised","s":"sed","e":true,"k":"s","d":[511,513],"c":[]}]]}],["k",{"w":"err_unknown_","s":"known_","e":false,"k":"k","d":[],"c":[["p",{"w":"err_unknown_p","s":"p","e":false,"k":"p","d":[],"c":[["a",{"w":"err_unknown_parameter","s":"arameter","e":true,"k":"a","d":[69],"c":[]}],["r",{"w":"err_unknown_proposal","s":"roposal","e":true,"k":"r","d":[69],"c":[]}]]}],["l",{"w":"err_unknown_listing","s":"listing","e":true,"k":"l","d":[511,513],"c":[]}]]}],["i",{"w":"err_unintended_taker","s":"intended_taker","e":true,"k":"i","d":[511,513],"c":[]}]]}],["a",{"w":"err_a","s":"a","e":false,"k":"a","d":[],"c":[["l",{"w":"err_already_","s":"lready_","e":false,"k":"l","d":[],"c":[["e",{"w":"err_already_executed","s":"executed","e":true,"k":"e","d":[69],"c":[]}],["v",{"w":"err_already_voted","s":"voted","e":true,"k":"v","d":[377],"c":[]}]]}],["s",{"w":"err_asset_contract_not_whitelisted","s":"sset_contract_not_whitelisted","e":true,"k":"s","d":[511,513],"c":[]}]]}],["i",{"w":"err_invalid_extension","s":"invalid_extension","e":true,"k":"i","d":[69],"c":[]}],["n",{"w":"err_n","s":"n","e":false,"k":"n","d":[],"c":[["o",{"w":"err_no","s":"o","e":false,"k":"o","d":[],"c":[["t",{"w":"err_not_token_owner","s":"t_token_owner","e":true,"k":"t","d":[69],"c":[]}],["_",{"w":"err_no_votes_to_return","s":"_votes_to_return","e":true,"k":"_","d":[69],"c":[]}]]}],["f",{"w":"err_nft_asset_mismatch","s":"ft_asset_mismatch","e":true,"k":"f","d":[511,513],"c":[]}]]}],["m",{"w":"err_m","s":"m","e":false,"k":"m","d":[],"c":[["e",{"w":"err_membership_limit_reached","s":"embership_limit_reached","e":true,"k":"e","d":[69],"c":[]}],["a",{"w":"err_maker_taker_equal","s":"aker_taker_equal","e":true,"k":"a","d":[511,513],"c":[]}]]}],["p",{"w":"err_p","s":"p","e":false,"k":"p","d":[],"c":[["r",{"w":"err_pr","s":"r","e":false,"k":"r","d":[],"c":[["o",{"w":"err_proposal_","s":"oposal_","e":false,"k":"o","d":[],"c":[["a",{"w":"err_proposal_already_","s":"already_","e":false,"k":"a","d":[],"c":[["e",{"w":"err_proposal_already_ex","s":"ex","e":false,"k":"e","d":[],"c":[["e",{"w":"err_proposal_already_executed","s":"ecuted","e":true,"k":"e","d":[69],"c":[]}],["i",{"w":"err_proposal_already_exists","s":"ists","e":true,"k":"i","d":[69],"c":[]}]]}],["c",{"w":"err_proposal_already_concluded","s":"concluded","e":true,"k":"c","d":[69],"c":[]}]]}],["i",{"w":"err_proposal_inactive","s":"inactive","e":true,"k":"i","d":[69],"c":[]}],["n",{"w":"err_proposal_not_concluded","s":"not_concluded","e":true,"k":"n","d":[69],"c":[]}]]}],["i",{"w":"err_price_zero","s":"ice_zero","e":true,"k":"i","d":[511,513],"c":[]}]]}],["a",{"w":"err_payment_","s":"ayment_","e":false,"k":"a","d":[],"c":[["a",{"w":"err_payment_asset_mismatch","s":"asset_mismatch","e":true,"k":"a","d":[511,513],"c":[]}],["c",{"w":"err_payment_contract_not_whitelisted","s":"contract_not_whitelisted","e":true,"k":"c","d":[511,513],"c":[]}]]}]]}],["e",{"w":"err_e","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"err_end_block_height_not_reached","s":"nd_block_height_not_reached","e":true,"k":"n","d":[69],"c":[]}],["x",{"w":"err_expiry_in_past","s":"xpiry_in_past","e":true,"k":"x","d":[511,513],"c":[]}]]}],["d",{"w":"err_disabled","s":"disabled","e":true,"k":"d","d":[69],"c":[]}],["l",{"w":"err_listing_expired","s":"listing_expired","e":true,"k":"l","d":[511,513],"c":[]}]]}],["c",{"w":"errcv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}]]}],["m",{"w":"em","s":"m","e":false,"k":"m","d":[],"c":[["p",{"w":"emp","s":"p","e":false,"k":"p","d":[],"c":[["t",{"w":"empty","s":"ty","e":true,"k":"t","d":[7,25,27,87,91,133,158,168,177,179,201,361,377],"c":[]}],["l",{"w":"employ","s":"loy","e":true,"k":"l","d":[18],"c":[]}]]}],["u",{"w":"emulate","s":"ulate","e":true,"k":"u","d":[27],"c":[["d",{"w":"emulated","s":"d","e":true,"k":"d","d":[27],"c":[["-",{"w":"emulated-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"emulated-contract-","s":"contract-","e":false,"k":"c","d":[],"c":[["p",{"w":"emulated-contract-publish","s":"publish","e":true,"k":"p","d":[25,27],"c":[]}],["c",{"w":"emulated-contract-call","s":"call","e":true,"k":"c","d":[25,27],"c":[]}]]}],["s",{"w":"emulated-sender","s":"sender","e":true,"k":"s","d":[25,27],"c":[]}]]}]]}],["s",{"w":"emulates","s":"s","e":true,"k":"s","d":[27],"c":[]}]]}],["a",{"w":"email","s":"ail","e":true,"k":"a","d":[51,53,226,227],"c":[["s",{"w":"emails","s":"s","e":true,"k":"s","d":[51],"c":[]}]]}],["b",{"w":"embed","s":"bed","e":true,"k":"b","d":[70,72],"c":[]}],["i",{"w":"emi","s":"i","e":false,"k":"i","d":[],"c":[["t",{"w":"emit","s":"t","e":true,"k":"t","d":[178],"c":[["t",{"w":"emitt","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"emitting","s":"ing","e":true,"k":"i","d":[115],"c":[]}],["e",{"w":"emitte","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"emitted","s":"d","e":true,"k":"d","d":[246,372],"c":[]}],["r",{"w":"emitter","s":"r","e":true,"k":"r","d":[259],"c":[]}]]}]]}]]}],["l",{"w":"emily","s":"ly","e":true,"k":"l","d":[233,367],"c":[]}]]}]]}],["q",{"w":"eq","s":"q","e":false,"k":"q","d":[],"c":[["u",{"w":"equ","s":"u","e":false,"k":"u","d":[],"c":[["a",{"w":"equal","s":"al","e":true,"k":"a","d":[22,52,69,71,81,106,107,114,145,154,155,165,173,174,176,191,231],"c":[["s",{"w":"equals","s":"s","e":true,"k":"s","d":[7,255,361,371,372,376],"c":[]}],["i",{"w":"equality","s":"ity","e":true,"k":"i","d":[173,176,191],"c":[]}]]}],["i",{"w":"equi","s":"i","e":false,"k":"i","d":[],"c":[["p",{"w":"equip","s":"p","e":true,"k":"p","d":[65,439,462],"c":[["p",{"w":"equipped","s":"ped","e":true,"k":"p","d":[53],"c":[]}]]}],["v",{"w":"equivalent","s":"valent","e":true,"k":"v","d":[67,145,226,227,233,367],"c":[]}]]}]]}],["7",{"w":"eq74otytsozcpik-","s":"74otytsozcpik-","e":true,"k":"7","d":[70],"c":[]}]]}],["s",{"w":"es","s":"s","e":false,"k":"s","d":[],"c":[["s",{"w":"essential","s":"sential","e":true,"k":"s","d":[11,45,65,67,77,79,80,81,90,93,100,104,125,127,134,145,174,180,201,202,256,381,439,462,501,505,511,513],"c":[["l",{"w":"essentially","s":"ly","e":true,"k":"l","d":[231],"c":[]}]]}],["t",{"w":"est","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"estimat","s":"imat","e":false,"k":"i","d":[],"c":[["e",{"w":"estimate","s":"e","e":true,"k":"e","d":[22,26,226],"c":[["s",{"w":"estimates","s":"s","e":true,"k":"s","d":[22],"c":[]}],["-",{"w":"estimate-costs","s":"-costs","e":true,"k":"-","d":[26],"c":[]}],["f",{"w":"estimatefee","s":"fee","e":true,"k":"f","d":[229],"c":[]}],["t",{"w":"estimatetrans","s":"trans","e":false,"k":"t","d":[],"c":[["f",{"w":"estimatetransfer","s":"fer","e":true,"k":"f","d":[229],"c":[]}],["a",{"w":"estimatetransaction","s":"action","e":true,"k":"a","d":[229],"c":[]}]]}]]}],["i",{"w":"estimation","s":"ion","e":true,"k":"i","d":[259],"c":[["s",{"w":"estimations","s":"s","e":true,"k":"s","d":[202],"c":[]}]]}]]}],["a",{"w":"establish","s":"ablish","e":true,"k":"a","d":[119,122,160],"c":[["i",{"w":"establishing","s":"ing","e":true,"k":"i","d":[69,122,160],"c":[]}],["e",{"w":"established","s":"ed","e":true,"k":"e","d":[355],"c":[]}]]}]]}],["p",{"w":"especially","s":"pecially","e":true,"k":"p","d":[80,90,95,97,100,108,114,154,174,176,177,178,188,191],"c":[]}],["c",{"w":"escrow","s":"crow","e":true,"k":"c","d":[140],"c":[["_",{"w":"escrow_fee","s":"_fee","e":true,"k":"_","d":[140],"c":[]}],["b",{"w":"escrowbalance","s":"balance","e":true,"k":"b","d":[140],"c":[]}],["a",{"w":"escrowamount","s":"amount","e":true,"k":"a","d":[140],"c":[]}],["-",{"w":"escrow-like","s":"-like","e":true,"k":"-","d":[192],"c":[]}]]}]]}],["l",{"w":"el","s":"l","e":false,"k":"l","d":[],"c":[["a",{"w":"elapsed","s":"apsed","e":true,"k":"a","d":[12,102,176,245,348],"c":[["-",{"w":"elapsed-","s":"-","e":false,"k":"-","d":[],"c":[["b",{"w":"elapsed-blocks","s":"blocks","e":true,"k":"b","d":[12,245,348],"c":[]}],["t",{"w":"elapsed-time","s":"time","e":true,"k":"t","d":[102,176],"c":[]}]]}],["b",{"w":"elapsedblocks","s":"blocks","e":true,"k":"b","d":[191],"c":[]}]]}],["v",{"w":"elvish","s":"vish","e":true,"k":"v","d":[18],"c":[]}],["s",{"w":"else","s":"se","e":true,"k":"s","d":[50,51,71,230,231,238],"c":[]}],["i",{"w":"eli","s":"i","e":false,"k":"i","d":[],"c":[["m",{"w":"eliminates","s":"minates","e":true,"k":"m","d":[50],"c":[]}],["g",{"w":"eligible","s":"gible","e":true,"k":"g","d":[73],"c":[]}]]}],["l",{"w":"ellipse","s":"lipse","e":true,"k":"l","d":[52],"c":[]}],["e",{"w":"ele","s":"e","e":false,"k":"e","d":[],"c":[["m",{"w":"element","s":"ment","e":true,"k":"m","d":[52,82,96,105,109,149,177,180,183,377,379],"c":[["s",{"w":"elements","s":"s","e":true,"k":"s","d":[68,81,82,96,105,109,126,149,177,180,182,183,226,234,255,368,377,379],"c":[]}],["-",{"w":"element-at","s":"-at","e":true,"k":"-","d":[180],"c":[]}]]}],["c",{"w":"electrs","s":"ctrs","e":true,"k":"c","d":[233,367],"c":[]}]]}]]}],["a",{"w":"ea","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"each","s":"ch","e":true,"k":"c","d":[14,15,17,19,22,27,30,51,68,69,71,72,73,78,81,95,96,99,105,112,119,122,123,129,134,152,177,183,184,221,239,246,377,379,511,513,516,517],"c":[]}],["s",{"w":"eas","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"easi","s":"i","e":false,"k":"i","d":[],"c":[["e",{"w":"easie","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"easier","s":"r","e":true,"k":"r","d":[28,163,229,233,355,367,399],"c":[]}],["s",{"w":"easiest","s":"st","e":true,"k":"s","d":[259],"c":[]}]]}],["l",{"w":"easily","s":"ly","e":true,"k":"l","d":[54,79,193,208],"c":[]}]]}],["e",{"w":"ease","s":"e","e":true,"k":"e","d":[76],"c":[["-",{"w":"ease-in-out","s":"-in-out","e":true,"k":"-","d":[44,239,420,466],"c":[]}]]}],["y",{"w":"easy","s":"y","e":true,"k":"y","d":[49,226,234,257,345,352,357,368],"c":[["-",{"w":"easy-to-use","s":"-to-use","e":true,"k":"-","d":[399],"c":[]}]]}]]}],["r",{"w":"ear","s":"r","e":false,"k":"r","d":[],"c":[["l",{"w":"earl","s":"l","e":false,"k":"l","d":[],"c":[["y",{"w":"early","s":"y","e":true,"k":"y","d":[71,193,201,224],"c":[]}],["i",{"w":"earlier","s":"ier","e":true,"k":"i","d":[163,219,222,374,376],"c":[]}]]}],["n",{"w":"earn","s":"n","e":true,"k":"n","d":[516],"c":[["i",{"w":"earnings","s":"ings","e":true,"k":"i","d":[516],"c":[]}]]}]]}]]}],["c",{"w":"ec","s":"c","e":false,"k":"c","d":[],"c":[["h",{"w":"echo","s":"ho","e":true,"k":"h","d":[16],"c":[]}],["o",{"w":"eco","s":"o","e":false,"k":"o","d":[],"c":[["s",{"w":"ecosystem","s":"system","e":true,"k":"s","d":[73,90,119,351,355,356,366,515],"c":[["s",{"w":"ecosystems","s":"s","e":true,"k":"s","d":[119],"c":[]}]]}],["n",{"w":"econom","s":"nom","e":false,"k":"n","d":[],"c":[["i",{"w":"economi","s":"i","e":false,"k":"i","d":[],"c":[["c",{"w":"economic","s":"c","e":true,"k":"c","d":[178],"c":[["s",{"w":"economics","s":"s","e":true,"k":"s","d":[77],"c":[]}]]}],["e",{"w":"economies","s":"es","e":true,"k":"e","d":[123,160,178],"c":[]}]]}],["y",{"w":"economy","s":"y","e":true,"k":"y","d":[115,123,160,178],"c":[]}]]}]]}]]}],["d",{"w":"ed","s":"d","e":false,"k":"d","d":[],"c":[["i",{"w":"edit","s":"it","e":true,"k":"i","d":[27,51,52,74,232],"c":[["-",{"w":"edit-","s":"-","e":false,"k":"-","d":[],"c":[["y",{"w":"edit-your-deployment-plan","s":"your-deployment-plan","e":true,"k":"y","d":[27],"c":[]}],["c",{"w":"edit-chainhook","s":"chainhook","e":true,"k":"c","d":[52],"c":[]}]]}],["e",{"w":"edited","s":"ed","e":true,"k":"e","d":[27],"c":[]}],["o",{"w":"editor","s":"or","e":true,"k":"o","d":[50],"c":[]}],["s",{"w":"edits","s":"s","e":true,"k":"s","d":[378],"c":[]}]]}],["p",{"w":"edp000-bootstrap","s":"p000-bootstrap","e":true,"k":"p","d":[69],"c":[]}],["g",{"w":"edge","s":"ge","e":true,"k":"g","d":[93,99,102,112,114,133,137,140,154,158,176,191,193],"c":[]}]]}],["i",{"w":"either","s":"ither","e":true,"k":"i","d":[49,52,69,71,128,130,165,226,234,238,258,356,366,368,374,375,376,511,513],"c":[]}],["f",{"w":"eff","s":"ff","e":false,"k":"f","d":[],"c":[["i",{"w":"efficien","s":"icien","e":false,"k":"i","d":[],"c":[["t",{"w":"efficient","s":"t","e":true,"k":"t","d":[76,77,79,96,97,103,108,113,116,123,128,130,134,144,145,177,180,187,189,371],"c":[["l",{"w":"efficiently","s":"ly","e":true,"k":"l","d":[50,77,79,96,97,116,130,145,189,259],"c":[]}]]}],["c",{"w":"efficiency","s":"cy","e":true,"k":"c","d":[76,79,99,108,144,177,188],"c":[]}]]}],["e",{"w":"effect","s":"ect","e":true,"k":"e","d":[102,130,137,140],"c":[["i",{"w":"effectively","s":"ively","e":true,"k":"i","d":[65,82,83,84,85,87,88,89,90,91,92,93,94,96,97,98,101,102,105,106,107,108,109,110,111,112,116,117,118,120,121,124,125,129,131,132,133,134,135,136,137,138,139,140,141,142,143,146,147,148,149,150,151,152,153,155,157,158,159,162,164,165,166,167,168,169,170,171,172,173,175,177,179,181,182,183,184,185,186,189,190,193,194,195,196,197,198,199,200,439,462],"c":[]}],["s",{"w":"effects","s":"s","e":true,"k":"s","d":[108,128,130,163],"c":[]}]]}],["o",{"w":"effort","s":"ort","e":true,"k":"o","d":[233,355,356,366,367],"c":[]}]]}],["5",{"w":"e5fa09b2-ec3e-4b6a-9a4a-0ebb454f6e19","s":"5fa09b2-ec3e-4b6a-9a4a-0ebb454f6e19","e":true,"k":"5","d":[374],"c":[]}],["j",{"w":"eject","s":"ject","e":true,"k":"j","d":[515],"c":[]}]]}],["o",{"w":"o","s":"o","e":true,"k":"o","d":[79],"c":[["n",{"w":"on","s":"n","e":true,"k":"n","d":[2,7,8,9,11,12,14,15,17,18,19,22,27,28,30,31,44,45,46,47,48,49,50,51,52,53,54,58,65,68,69,71,72,73,74,75,76,77,78,79,81,82,86,87,90,91,93,95,96,100,101,102,104,105,107,108,110,112,113,114,119,122,123,124,125,126,127,128,129,130,133,134,136,137,139,140,146,147,152,154,156,158,160,161,163,170,171,172,173,176,177,178,179,180,183,185,187,190,191,195,196,197,201,202,203,204,208,219,220,221,224,225,226,227,228,229,230,233,239,240,244,245,256,257,259,345,347,348,349,350,353,354,355,356,361,366,367,371,372,373,374,375,376,377,378,381,399,422,423,425,427,439,443,459,462,466,501,502,504,505,511,513,515,516,517],"c":[["e",{"w":"one","s":"e","e":true,"k":"e","d":[7,14,15,17,26,27,28,48,49,50,51,52,53,54,68,73,78,98,106,114,123,143,149,150,154,163,176,177,184,185,187,191,197,198,199,219,220,221,222,228,229,233,239,241,258,361,367,371,427,459,509,511,513,515,517],"c":[["-",{"w":"one-way","s":"-way","e":true,"k":"-","d":[188],"c":[]}],["s",{"w":"ones","s":"s","e":true,"k":"s","d":[189],"c":[["e",{"w":"oneself","s":"elf","e":true,"k":"e","d":[193],"c":[]}]]}]]}],["l",{"w":"only","s":"ly","e":true,"k":"l","d":[7,27,28,50,51,67,71,81,90,92,97,99,103,115,125,126,127,129,134,147,156,161,163,177,182,183,192,201,226,227,229,233,234,238,258,351,355,356,361,366,367,368,373,511,513],"c":[]}],["c",{"w":"onc","s":"c","e":false,"k":"c","d":[],"c":[["e",{"w":"once","s":"e","e":true,"k":"e","d":[12,30,46,47,48,50,51,52,53,68,69,75,79,92,221,224,233,240,243,245,348,352,367,374,375,376,377,515],"c":[]}],["h",{"w":"onchain","s":"hain","e":true,"k":"h","d":[45],"c":[]}],["a",{"w":"oncancel","s":"ancel","e":true,"k":"a","d":[237,355],"c":[]}]]}],["-",{"w":"on-chain","s":"-chain","e":true,"k":"-","d":[31,44,45,52,54,68,70,74,134,234,257,345,350,368,371,372,377,425,427,443,459,466,515],"c":[]}],["b",{"w":"onboarding","s":"boarding","e":true,"k":"b","d":[53],"c":[]}],["f",{"w":"onfinish","s":"finish","e":true,"k":"f","d":[71,237,240,355],"c":[]}],["p",{"w":"onpress","s":"press","e":true,"k":"p","d":[232],"c":[]}],["_",{"w":"on_chain_only","s":"_chain_only","e":true,"k":"_","d":[255],"c":[]}],["g",{"w":"ongoing","s":"going","e":true,"k":"g","d":[376],"c":[]}]]}],["u",{"w":"ou","s":"u","e":false,"k":"u","d":[],"c":[["t",{"w":"out","s":"t","e":true,"k":"t","d":[2,8,9,11,12,18,22,26,27,30,31,45,46,49,52,54,58,67,68,69,73,74,109,171,180,194,199,203,204,208,224,225,226,227,228,230,232,243,245,256,257,345,347,348,349,350,352,357,373,374,376,377,378,379,381,399,420,422,423,425,427,443,459,501,502,505,517],"c":[["p",{"w":"output","s":"put","e":true,"k":"p","d":[9,68,80,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,233,367,371,374,376,377,517],"c":[["s",{"w":"outputs","s":"s","e":true,"k":"s","d":[7,52,88,120,219,361,371,376,379],"c":[]}],["t",{"w":"outputted","s":"ted","e":true,"k":"t","d":[9],"c":[]}]]}],["-",{"w":"out-of-","s":"-of-","e":false,"k":"-","d":[],"c":[["t",{"w":"out-of-the-box","s":"the-box","e":true,"k":"t","d":[29],"c":[]}],["m",{"w":"out-of-memory","s":"memory","e":true,"k":"m","d":[144],"c":[]}],["b",{"w":"out-of-bounds","s":"bounds","e":true,"k":"b","d":[180],"c":[]}]]}],["l",{"w":"outline","s":"line","e":true,"k":"l","d":[74,425,443],"c":[["d",{"w":"outlined","s":"d","e":true,"k":"d","d":[379],"c":[]}]]}],["s",{"w":"outside","s":"side","e":true,"k":"s","d":[99,129,152],"c":[]}],["c",{"w":"outcome","s":"come","e":true,"k":"c","d":[377],"c":[["s",{"w":"outcomes","s":"s","e":true,"k":"s","d":[201],"c":[]}]]}]]}],["r",{"w":"our","s":"r","e":true,"k":"r","d":[9,11,12,22,26,27,44,49,50,69,71,73,182,219,220,222,224,228,230,245,256,257,345,348,373,375,376,377,381,420,422,427,459,466,501,502,504,505,515],"c":[]}]]}],["f",{"w":"of","s":"f","e":true,"k":"f","d":[4,5,6,7,8,9,12,13,14,15,16,17,19,21,22,26,27,28,29,30,44,45,46,47,48,49,50,51,52,53,54,55,65,67,68,69,70,71,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,208,219,220,221,222,224,226,227,228,229,230,231,233,234,235,236,238,240,241,243,245,246,255,258,259,346,348,350,351,352,353,354,355,356,357,358,359,360,361,362,366,367,368,369,370,371,372,373,374,375,376,377,379,399,425,426,427,439,443,444,459,462,509,511,513,515,516,517],"c":[["f",{"w":"off","s":"f","e":true,"k":"f","d":[22,71,73],"c":[["i",{"w":"offic","s":"ic","e":false,"k":"i","d":[],"c":[["e",{"w":"office","s":"e","e":true,"k":"e","d":[2,8,18,31,45,54,74,203,204,208,225,228,257,345,347,349,350,373,399,422,425,427,443,459,502],"c":[]}],["i",{"w":"official","s":"ial","e":true,"k":"i","d":[28],"c":[]}]]}],["e",{"w":"offer","s":"er","e":true,"k":"e","d":[53,70,238],"c":[["s",{"w":"offers","s":"s","e":true,"k":"s","d":[8,13,19,47,49,50,54,104,229,516],"c":[]}],["i",{"w":"offering","s":"ing","e":true,"k":"i","d":[44,49,64,365,382,383,384,385,386,387],"c":[]}]]}],["l",{"w":"offloads","s":"loads","e":true,"k":"l","d":[50],"c":[]}],["-",{"w":"off-chain","s":"-chain","e":true,"k":"-","d":[68,125,134,144,190],"c":[]}],["s",{"w":"offset","s":"set","e":true,"k":"s","d":[255],"c":[]}]]}],["t",{"w":"often","s":"ten","e":true,"k":"t","d":[4,49,77,80,86,90,103,108,113,116,119,128,134,144,145,161,163,164,174,180,192,358,362,515],"c":[]}]]}],["r",{"w":"or","s":"r","e":true,"k":"r","d":[5,6,7,8,11,12,13,14,15,17,19,22,25,26,27,28,46,47,49,50,51,52,53,67,68,69,71,73,76,77,78,79,80,81,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,102,103,104,106,107,108,110,111,112,113,114,115,116,117,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,142,144,145,146,147,148,151,152,154,155,156,157,158,159,160,161,162,163,164,165,166,168,169,170,173,174,175,176,177,178,179,180,181,182,183,185,187,188,190,191,192,193,195,196,198,199,200,201,202,219,222,224,226,227,229,230,231,233,234,235,236,238,239,241,242,245,256,258,259,348,352,353,354,355,356,359,360,361,366,367,368,369,370,371,372,374,375,376,377,379,381,422,427,501,502,504,505,510,511,513,515,516,517],"c":[["d",{"w":"ord","s":"d","e":false,"k":"d","d":[],"c":[["e",{"w":"order","s":"er","e":true,"k":"e","d":[9,12,14,20,51,68,77,87,96,108,114,133,149,154,158,163,171,176,179,183,191,224,226,234,245,258,348,368,376,377,422,427,459,502],"c":[["s",{"w":"orders","s":"s","e":true,"k":"s","d":[27,221],"c":[]}],["i",{"w":"ordering","s":"ing","e":true,"k":"i","d":[114,154,176,191],"c":[]}]]}],["i",{"w":"ordinal","s":"inal","e":true,"k":"i","d":[371,464,465,499,500],"c":[["s",{"w":"ordinals","s":"s","e":true,"k":"s","d":[54,74,379,420,422,425,426,427,443,444,446,447,449,450,451,452,454,455,456,457,458,459,461,464,465,466,483,484,486,487,488,489,491,492,493,494,495,497,499,500,502,504],"c":[["_",{"w":"ordinals_protocol","s":"_protocol","e":true,"k":"_","d":[379],"c":[]}],["-",{"w":"ordinals-api","s":"-api","e":true,"k":"-","d":[446,447,449,450,451,452,454,455,456,457,458,461,464,465,483,484,486,487,488,489,491,492,493,494,495,497,499,500],"c":[]}]]}]]}]]}],["g",{"w":"org","s":"g","e":true,"k":"g","d":[22,27,75,229,234,259,368,515,517],"c":[["a",{"w":"organiz","s":"aniz","e":false,"k":"a","d":[],"c":[["a",{"w":"organization","s":"ation","e":true,"k":"a","d":[11,86,97,129,152,163,256,381,501,505],"c":[["s",{"w":"organizations","s":"s","e":true,"k":"s","d":[69],"c":[]}]]}],["e",{"w":"organize","s":"e","e":true,"k":"e","d":[97],"c":[["d",{"w":"organized","s":"d","e":true,"k":"d","d":[68,116],"c":[]}],["s",{"w":"organizes","s":"s","e":true,"k":"s","d":[224],"c":[]}]]}],["i",{"w":"organizing","s":"ing","e":true,"k":"i","d":[68,97],"c":[]}]]}]]}],["c",{"w":"orchestrating","s":"chestrating","e":true,"k":"c","d":[27],"c":[]}],["i",{"w":"origin","s":"igin","e":true,"k":"i","d":[226,227,234,368],"c":[["a",{"w":"origina","s":"a","e":false,"k":"a","d":[],"c":[["t",{"w":"originating","s":"ting","e":true,"k":"t","d":[27],"c":[]}],["l",{"w":"original","s":"l","e":true,"k":"l","d":[81,128,149,177,189,192,233,367,516],"c":[]}]]}]]}]]}],["k",{"w":"ok","s":"k","e":true,"k":"k","d":[6,7,9,12,16,22,26,28,30,69,71,76,77,79,80,81,83,85,87,89,90,91,92,93,94,97,99,100,101,102,108,110,112,113,114,116,117,121,122,123,124,125,126,128,129,130,131,132,133,135,136,137,140,141,143,144,147,148,149,150,151,152,154,158,159,160,161,162,163,164,166,167,170,171,175,176,178,179,180,182,184,186,187,190,191,192,193,195,196,200,201,202,224,230,245,246,348,353,356,360,361,366,377,511,513,516,517],"c":[["-",{"w":"ok-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"ok-type","s":"type","e":true,"k":"t","d":[6,226,234,360,368],"c":[]}],["b",{"w":"ok-b","s":"b","e":false,"k":"b","d":[],"c":[["i",{"w":"ok-binding-name","s":"inding-name","e":true,"k":"i","d":[170],"c":[]}],["r",{"w":"ok-branch","s":"ranch","e":true,"k":"r","d":[170],"c":[]}]]}]]}],["c",{"w":"okcv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}],["a",{"w":"okay","s":"ay","e":true,"k":"a","d":[514],"c":[]}]]}],["p",{"w":"op","s":"p","e":false,"k":"p","d":[],"c":[["t",{"w":"opt","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"opti","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"option","s":"on","e":true,"k":"o","d":[52,53,68,219,220,226,234,356,366,368],"c":[["a",{"w":"optional","s":"al","e":true,"k":"a","d":[6,7,27,52,67,69,78,80,83,85,88,95,97,103,104,110,114,116,119,120,121,126,127,131,138,139,141,142,144,146,148,151,156,157,159,160,166,168,170,172,173,175,180,183,189,193,194,195,200,201,226,229,233,234,241,243,353,356,357,360,361,366,367,368,374,377,511,513,516],"c":[["s",{"w":"optionals","s":"s","e":true,"k":"s","d":[78,103,193],"c":[]}]]}],["s",{"w":"options","s":"s","e":true,"k":"s","d":[6,7,9,52,68,226,227,233,234,352,356,360,361,366,367,368,378,379],"c":[]}],["-",{"w":"option-","s":"-","e":false,"k":"-","d":[],"c":[["i",{"w":"option-input","s":"input","e":true,"k":"i","d":[85,151],"c":[]}],["v",{"w":"option-value","s":"value","e":true,"k":"v","d":[103],"c":[]}]]}]]}],["m",{"w":"optim","s":"m","e":false,"k":"m","d":[],"c":[["i",{"w":"optimiz","s":"iz","e":false,"k":"i","d":[],"c":[["e",{"w":"optimize","s":"e","e":true,"k":"e","d":[52,92,108,125,127,174,190,219,222,427,459],"c":[["d",{"w":"optimized","s":"d","e":true,"k":"d","d":[19],"c":[]}],["s",{"w":"optimizes","s":"s","e":true,"k":"s","d":[219,222],"c":[]}]]}],["a",{"w":"optimization","s":"ation","e":true,"k":"a","d":[22,79],"c":[["s",{"w":"optimizations","s":"s","e":true,"k":"s","d":[70,113,174,219,222],"c":[]}]]}],["i",{"w":"optimizing","s":"ing","e":true,"k":"i","d":[49,92],"c":[]}]]}],["a",{"w":"optimal","s":"al","e":true,"k":"a","d":[108,113],"c":[]}]]}],["n",{"w":"opting","s":"ng","e":true,"k":"n","d":[517],"c":[]}]]}],["-",{"w":"opt-input","s":"-input","e":true,"k":"-","d":[170],"c":[]}]]}],["e",{"w":"ope","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"open","s":"n","e":true,"k":"n","d":[9,47,50,52,67,69,71,75,114,226,227,229,259,355,502,510,515],"c":[["a",{"w":"openapi","s":"api","e":true,"k":"a","d":[32,34,35,36,37,38,39,41,42,43,57,60,61,62,63,206,207,210,212,214,215,216,218,249,251,252,253,254,259,260,261,262,264,265,266,267,268,269,270,271,272,274,275,276,277,278,279,281,283,284,285,286,287,289,290,291,292,293,295,296,297,298,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,319,320,321,322,323,324,325,326,327,328,329,330,332,333,335,336,338,340,342,343,344,389,391,392,393,395,396,398,401,402,405,407,408,409,410,411,413,414,415,416,418,429,430,432,433,435,436,437,438,441,442,446,447,449,450,451,452,454,455,456,457,458,461,464,465,469,470,472,473,475,476,477,478,480,481,483,484,486,487,488,489,491,492,493,494,495,497,499,500],"c":[]}],["s",{"w":"opens","s":"s","e":true,"k":"s","d":[52,202],"c":[["i",{"w":"opensignaturerequestpopup","s":"ignaturerequestpopup","e":true,"k":"i","d":[71],"c":[]}],["t",{"w":"openstxtransfer","s":"txtransfer","e":true,"k":"t","d":[237],"c":[]}]]}],["x",{"w":"openxyz","s":"xyz","e":true,"k":"x","d":[355],"c":[]}],["c",{"w":"opencontractdeploy","s":"contractdeploy","e":true,"k":"c","d":[355],"c":[]}]]}],["r",{"w":"operat","s":"rat","e":false,"k":"r","d":[],"c":[["i",{"w":"operation","s":"ion","e":true,"k":"i","d":[12,68,76,77,84,93,94,96,98,101,102,106,108,109,111,112,113,114,124,128,129,130,132,135,136,137,138,140,141,142,143,150,154,157,162,164,166,169,176,177,178,181,184,186,191,194,198,199,200,201,245,348,371,379,514],"c":[["s",{"w":"operations","s":"s","e":true,"k":"s","d":[25,32,34,35,36,37,38,39,41,42,43,49,57,60,61,62,63,68,69,71,76,77,78,81,82,84,87,90,91,93,94,95,96,97,98,99,101,102,103,105,106,107,108,109,111,112,113,114,118,122,123,124,125,128,129,130,133,134,135,136,137,140,141,143,145,147,150,153,154,155,158,160,162,163,165,166,169,174,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,197,198,200,201,202,206,207,210,212,214,215,216,218,249,251,252,253,254,260,261,262,264,265,266,267,268,269,270,271,272,274,275,276,277,278,279,281,283,284,285,286,287,289,290,291,292,293,295,296,297,298,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,319,320,321,322,323,324,325,326,327,328,329,330,332,333,335,336,338,340,342,343,344,371,377,389,391,392,393,395,396,398,401,402,405,407,408,409,410,411,413,414,415,416,418,429,430,432,433,435,436,437,438,441,442,446,447,449,450,451,452,454,455,456,457,458,461,464,465,469,470,472,473,475,476,477,478,480,481,483,484,486,487,488,489,491,492,493,494,495,497,499,500,509],"c":[]}]]}],["e",{"w":"operate","s":"e","e":true,"k":"e","d":[75],"c":[["s",{"w":"operates","s":"s","e":true,"k":"s","d":[69,233,367],"c":[]}]]}],["o",{"w":"operator","s":"or","e":true,"k":"o","d":[77,196],"c":[]}]]}]]}],["p",{"w":"opportunities","s":"portunities","e":true,"k":"p","d":[31,71],"c":[]}],["_",{"w":"op_","s":"_","e":false,"k":"_","d":[],"c":[["r",{"w":"op_return","s":"return","e":true,"k":"r","d":[371],"c":[]}],["t",{"w":"op_type","s":"type","e":true,"k":"t","d":[418],"c":[]}]]}],["a",{"w":"opacity-50","s":"acity-50","e":true,"k":"a","d":[517],"c":[]}]]}],["b",{"w":"ob","s":"b","e":false,"k":"b","d":[],"c":[["j",{"w":"object","s":"ject","e":true,"k":"j","d":[6,7,12,52,67,68,226,227,229,230,232,234,235,236,241,243,245,246,259,346,348,353,355,356,360,361,366,368,369,370,371,377,379,517],"c":[["s",{"w":"objects","s":"s","e":true,"k":"s","d":[7,52,226,229,234,244,361,368],"c":[]}],["-",{"w":"object-like","s":"-like","e":true,"k":"-","d":[229],"c":[]}],["'",{"w":"object's","s":"'s","e":true,"k":"'","d":[377,379],"c":[]}]]}],["s",{"w":"obs","s":"s","e":false,"k":"s","d":[],"c":[["e",{"w":"observ","s":"erv","e":false,"k":"e","d":[],"c":[["e",{"w":"observe","s":"e","e":true,"k":"e","d":[52,221,372,377,379],"c":[["r",{"w":"observer","s":"r","e":true,"k":"r","d":[259,376],"c":[]}],["s",{"w":"observes","s":"s","e":true,"k":"s","d":[371],"c":[]}],["d",{"w":"observed","s":"d","e":true,"k":"d","d":[377],"c":[]}]]}],["a",{"w":"observation","s":"ation","e":true,"k":"a","d":[377],"c":[]}],["i",{"w":"observing","s":"ing","e":true,"k":"i","d":[379],"c":[["-",{"w":"observing-contract-calls","s":"-contract-calls","e":true,"k":"-","d":[379],"c":[]}]]}]]}],["o",{"w":"obsolete","s":"olete","e":true,"k":"o","d":[89],"c":[]}]]}],["t",{"w":"obtain","s":"tain","e":true,"k":"t","d":[75,107],"c":[["e",{"w":"obtained","s":"ed","e":true,"k":"e","d":[516],"c":[]}]]}],["v",{"w":"obvious","s":"vious","e":true,"k":"v","d":[229],"c":[]}]]}],["t",{"w":"other","s":"ther","e":true,"k":"t","d":[9,18,28,49,51,52,67,68,70,72,73,76,78,79,80,81,82,83,84,85,86,87,88,89,90,91,93,94,96,97,98,99,100,101,103,105,106,107,109,110,111,113,114,115,116,117,118,119,120,122,123,124,125,126,128,130,131,132,133,134,135,136,138,139,141,142,143,144,145,146,148,149,150,151,152,153,154,155,156,157,158,159,160,162,164,165,166,167,168,169,170,171,172,173,175,176,177,178,179,181,182,184,185,186,187,189,190,191,192,193,194,195,196,197,198,200,202,221,226,227,232,234,236,238,243,350,356,366,368,370,371,372,377,378,379,509,514],"c":[["w",{"w":"otherwise","s":"wise","e":true,"k":"w","d":[13,14,16,196,226,233,234,367,368],"c":[]}],["s",{"w":"others","s":"s","e":true,"k":"s","d":[113,128,130],"c":[]}]]}],["w",{"w":"ow","s":"w","e":false,"k":"w","d":[],"c":[["n",{"w":"own","s":"n","e":true,"k":"n","d":[11,22,51,54,68,69,71,72,73,74,86,115,192,226,232,234,256,259,368,377,378,381,399,425,427,443,459,501,505,509,515],"c":[["e",{"w":"owne","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"owner","s":"r","e":true,"k":"r","d":[12,69,81,101,115,122,135,186,195,198,224,231,245,348,511,513,516],"c":[["s",{"w":"owners","s":"s","e":true,"k":"s","d":[71,516],"c":[["h",{"w":"ownership","s":"hip","e":true,"k":"h","d":[67,69,81,101,122,135,186,195,226,234,354,368,511,513,516],"c":[]}]]}],["'",{"w":"owner's","s":"'s","e":true,"k":"'","d":[195],"c":[]}]]}],["d",{"w":"owned","s":"d","e":true,"k":"d","d":[135],"c":[]}]]}],["a",{"w":"ownable","s":"able","e":true,"k":"a","d":[69],"c":[]}],["s",{"w":"owns","s":"s","e":true,"k":"s","d":[71,101,135],"c":[]}]]}],["e",{"w":"owe","s":"e","e":false,"k":"e","d":[],"c":[["d",{"w":"owed","s":"d","e":true,"k":"d","d":[12,245,348],"c":[]}],["s",{"w":"owes","s":"s","e":true,"k":"s","d":[12,245,348],"c":[]}]]}]]}],["c",{"w":"occur","s":"ccur","e":true,"k":"c","d":[19,201,375,511,513,516],"c":[["r",{"w":"occurrence","s":"rence","e":true,"k":"r","d":[52],"c":[["s",{"w":"occurrences","s":"s","e":true,"k":"s","d":[52,379],"c":[]}]]}],["e",{"w":"occured","s":"ed","e":true,"k":"e","d":[68],"c":[]}],["s",{"w":"occurs","s":"s","e":true,"k":"s","d":[375],"c":[]}]]}],["v",{"w":"over","s":"ver","e":true,"k":"v","d":[26,52,69,71,73,96,177,188,202,224,239,355,356,366,511,513],"c":[["a",{"w":"overall","s":"all","e":true,"k":"a","d":[22,86,378],"c":[]}],["w",{"w":"overwrit","s":"writ","e":false,"k":"w","d":[],"c":[["e",{"w":"overwrite","s":"e","e":true,"k":"e","d":[27],"c":[["s",{"w":"overwrites","s":"s","e":true,"k":"s","d":[79,167],"c":[]}]]}],["t",{"w":"overwritten","s":"ten","e":true,"k":"t","d":[167],"c":[]}],["i",{"w":"overwriting","s":"ing","e":true,"k":"i","d":[167],"c":[]}]]}],["h",{"w":"overhead","s":"head","e":true,"k":"h","d":[50,88,120],"c":[]}],["v",{"w":"overview","s":"view","e":true,"k":"v","d":[52,55,219],"c":[]}],["r",{"w":"override","s":"ride","e":true,"k":"r","d":[227,236,370,515],"c":[["s",{"w":"overrides","s":"s","e":true,"k":"s","d":[67,351],"c":[]}]]}],["f",{"w":"overflow","s":"flow","e":true,"k":"f","d":[77,102,125,126,137,154,174,178,185,202],"c":[["s",{"w":"overflows","s":"s","e":true,"k":"s","d":[174],"c":[]}],["-",{"w":"overflow-","s":"-","e":false,"k":"-","d":[],"c":[["h",{"w":"overflow-hidden","s":"hidden","e":true,"k":"h","d":[352],"c":[]}],["a",{"w":"overflow-auto","s":"auto","e":true,"k":"a","d":[352],"c":[]}]]}]]}],["l",{"w":"overl","s":"l","e":false,"k":"l","d":[],"c":[["o",{"w":"overlooking","s":"ooking","e":true,"k":"o","d":[82,83,84,85,89,91,93,94,95,98,99,101,102,105,106,107,109,110,111,114,117,118,121,124,131,132,135,136,137,138,139,140,141,142,143,144,146,147,148,150,151,152,153,154,155,157,159,160,162,165,166,167,168,169,170,171,172,175,176,178,181,183,184,185,186,187,189,191,194,195,197,198,200],"c":[]}],["y",{"w":"overly","s":"y","e":true,"k":"y","d":[119,129,196],"c":[]}]]}],["u",{"w":"overus","s":"us","e":false,"k":"u","d":[],"c":[["i",{"w":"overusing","s":"ing","e":true,"k":"i","d":[92,96,97,100,103,125,129,134,161,190,196],"c":[]}],["e",{"w":"overuse","s":"e","e":true,"k":"e","d":[199],"c":[]}]]}],["-",{"w":"over-complicating","s":"-complicating","e":true,"k":"-","d":[108],"c":[]}],["c",{"w":"overcomplicating","s":"complicating","e":true,"k":"c","d":[113],"c":[]}]]}],["1",{"w":"o1","s":"1","e":true,"k":"1","d":[45],"c":[]}],["a",{"w":"oauth","s":"auth","e":true,"k":"a","d":[65,439,462],"c":[]}],["m",{"w":"om","s":"m","e":false,"k":"m","d":[],"c":[["i",{"w":"omitting","s":"itting","e":true,"k":"i","d":[160],"c":[]}],["m",{"w":"ommitted","s":"mitted","e":true,"k":"m","d":[243],"c":[]}]]}],["l",{"w":"old","s":"ld","e":true,"k":"l","d":[229],"c":[["e",{"w":"older","s":"er","e":true,"k":"e","d":[219,222],"c":[]}]]}],["s",{"w":"os","s":"s","e":true,"k":"s","d":[502],"c":[]}]]}],["j",{"w":"j","s":"j","e":false,"k":"j","d":[],"c":[["s",{"w":"js","s":"s","e":true,"k":"s","d":[2,7,8,9,10,11,12,18,20,22,26,27,29,30,44,45,69,70,71,75,203,204,219,224,225,226,227,228,229,230,231,232,234,235,236,237,239,241,242,243,244,245,246,256,259,347,348,349,350,352,353,354,357,361,368,369,370,373,375,381,426,444,501,505,511,513,517],"c":[["o",{"w":"json","s":"on","e":true,"k":"o","d":[9,20,29,30,32,34,35,36,37,38,39,41,42,43,51,52,57,58,60,61,62,63,68,206,207,210,212,214,215,216,218,226,227,232,234,236,249,251,252,253,254,255,258,259,260,261,262,264,265,266,267,268,269,270,271,272,274,275,276,277,278,279,281,283,284,285,286,287,289,290,291,292,293,295,296,297,298,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,319,320,321,322,323,324,325,326,327,328,329,330,332,333,335,336,338,340,342,343,344,368,370,371,372,374,375,376,377,378,379,389,391,392,393,395,396,398,401,402,405,407,408,409,410,411,413,414,415,416,418,429,430,432,433,435,436,437,438,441,442,446,447,449,450,451,452,454,455,456,457,458,461,464,465,469,470,472,473,475,476,477,478,480,481,483,484,486,487,488,489,491,492,493,494,495,497,499,500,517],"c":[["s",{"w":"jsons","s":"s","e":true,"k":"s","d":[55],"c":[]}],["'",{"w":"json'","s":"'","e":true,"k":"'","d":[58,67,226,227,508],"c":[]}],["c",{"w":"jsonc","s":"c","e":true,"k":"c","d":[517],"c":[]}]]}],["'",{"w":"js'","s":"'","e":true,"k":"'","d":[11,381,505],"c":[]}],["-",{"w":"js-react-native-expo-51","s":"-react-native-expo-51","e":true,"k":"-","d":[232],"c":[]}],["x",{"w":"jsx","s":"x","e":true,"k":"x","d":[517],"c":[]}]]}],["u",{"w":"ju","s":"u","e":false,"k":"u","d":[],"c":[["s",{"w":"just","s":"st","e":true,"k":"s","d":[7,12,22,28,47,51,68,69,71,102,119,129,147,176,191,219,224,233,245,348,361,367,511,513],"c":[]}],["n",{"w":"jun","s":"n","e":true,"k":"n","d":[73],"c":[]}],["d",{"w":"judiciously","s":"diciously","e":true,"k":"d","d":[100,103,161,163,192],"c":[]}]]}],["a",{"w":"ja","s":"a","e":false,"k":"a","d":[],"c":[["v",{"w":"javascript","s":"vascript","e":true,"k":"v","d":[8,9,18,44,224,226,228,234,239,350,368,517],"c":[]}],["n",{"w":"jan","s":"n","e":true,"k":"n","d":[73],"c":[["u",{"w":"january","s":"uary","e":true,"k":"u","d":[70],"c":[]}],["n",{"w":"janniks","s":"niks","e":true,"k":"n","d":[355,356,366],"c":[]}]]}]]}],["o",{"w":"jo","s":"o","e":false,"k":"o","d":[],"c":[["u",{"w":"journey","s":"urney","e":true,"k":"u","d":[44,68],"c":[]}],["b",{"w":"job_queue","s":"b_queue","e":true,"k":"b","d":[58],"c":[]}],["i",{"w":"join","s":"in","e":true,"k":"i","d":[70,73,78,126,182,427,516],"c":[["i",{"w":"joining","s":"ing","e":true,"k":"i","d":[149],"c":[]}]]}],["h",{"w":"john","s":"hn","e":true,"k":"h","d":[189],"c":[]}],["t",{"w":"jotai","s":"tai","e":true,"k":"t","d":[355],"c":[]}]]}],["w",{"w":"jwt","s":"wt","e":true,"k":"w","d":[355,356,366],"c":[]}]]}],["d",{"w":"d","s":"d","e":false,"k":"d","d":[],"c":[["o",{"w":"do","s":"o","e":true,"k":"o","d":[12,26,53,67,68,69,71,75,81,134,166,219,224,226,227,238,245,246,348,375,378,426,444,515],"c":[["n",{"w":"don","s":"n","e":true,"k":"n","d":[2,8,45,203,204,225,347,349,373,422,517],"c":[["'",{"w":"don't","s":"'t","e":true,"k":"'","d":[12,15,28,31,50,52,68,71,73,81,99,129,134,177,226,229,235,239,243,245,348,369,502,517],"c":[]}],["a",{"w":"donate","s":"ate","e":true,"k":"a","d":[51,517],"c":[]}],["e",{"w":"done","s":"e","e":true,"k":"e","d":[58,71,192,355,374],"c":[]}]]}],["c",{"w":"doc","s":"c","e":false,"k":"c","d":[],"c":[["k",{"w":"docker","s":"ker","e":true,"k":"k","d":[11,19,24,256,381,501,502,505,509,510],"c":[["-",{"w":"docker-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"docker-compose","s":"compose","e":true,"k":"c","d":[259],"c":[]}],["d",{"w":"docker-desktop","s":"desktop","e":true,"k":"d","d":[510],"c":[]}]]}]]}],["s",{"w":"docs","s":"s","e":true,"k":"s","d":[17,68,73,219,221,226,229,234,259,356,366,368,374,376,514,517],"c":[["k",{"w":"docskit","s":"kit","e":true,"k":"k","d":[517],"c":[]}]]}],["u",{"w":"document","s":"ument","e":true,"k":"u","d":[32,34,35,36,37,38,39,41,42,43,57,60,61,62,63,80,113,152,206,207,210,212,214,215,216,218,219,249,251,252,253,254,260,261,262,264,265,266,267,268,269,270,271,272,274,275,276,277,278,279,281,283,284,285,286,287,289,290,291,292,293,295,296,297,298,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,319,320,321,322,323,324,325,326,327,328,329,330,332,333,335,336,338,340,342,343,344,389,391,392,393,395,396,398,401,402,405,407,408,409,410,411,413,414,415,416,418,429,430,432,433,435,436,437,438,441,442,446,447,449,450,451,452,454,455,456,457,458,461,464,465,469,470,472,473,475,476,477,478,480,481,483,484,486,487,488,489,491,492,493,494,495,497,499,500],"c":[["a",{"w":"documentation","s":"ation","e":true,"k":"a","d":[18,58,73,257,259,345,374,376,504],"c":[]}],["s",{"w":"documents","s":"s","e":true,"k":"s","d":[52,80],"c":[]}],["-",{"w":"document-","s":"-","e":false,"k":"-","d":[],"c":[["h",{"w":"document-hash","s":"hash","e":true,"k":"h","d":[80],"c":[]}],["s",{"w":"document-submissions","s":"submissions","e":true,"k":"s","d":[80],"c":[]}]]}],["i",{"w":"documenting","s":"ing","e":true,"k":"i","d":[152],"c":[]}]]}],["-",{"w":"doc-","s":"-","e":false,"k":"-","d":[],"c":[["h",{"w":"doc-hash","s":"hash","e":true,"k":"h","d":[80],"c":[]}],["i",{"w":"doc-info","s":"info","e":true,"k":"i","d":[80],"c":[]}]]}],["o",{"w":"docontractcall","s":"ontractcall","e":true,"k":"o","d":[355],"c":[]}]]}],["e",{"w":"does","s":"es","e":true,"k":"e","d":[12,14,49,89,101,110,132,150,166,172,173,177,184,189,195,219,226,227,245,258,259,348],"c":[["n",{"w":"doesn","s":"n","e":false,"k":"n","d":[],"c":[["'",{"w":"doesn't","s":"'t","e":true,"k":"'","d":[28,71,77,96,97,116,125,149,201,226,227],"c":[]}],["o",{"w":"doesnotsend","s":"otsend","e":true,"k":"o","d":[226,234,368],"c":[]}]]}]]}],["w",{"w":"down","s":"wn","e":true,"k":"w","d":[68,112,129,515],"c":[["l",{"w":"download","s":"load","e":true,"k":"l","d":[14,15,16,17,18,27,510,515,517],"c":[["e",{"w":"downloaded","s":"ed","e":true,"k":"e","d":[16,378,509,510],"c":[]}],["i",{"w":"downloading","s":"ing","e":true,"k":"i","d":[16,509],"c":[]}]]}]]}],["u",{"w":"doubl","s":"ubl","e":false,"k":"u","d":[],"c":[["e",{"w":"double","s":"e","e":true,"k":"e","d":[26,105],"c":[["s",{"w":"doubles","s":"s","e":true,"k":"s","d":[105],"c":[]}],["-",{"w":"double-elements","s":"-elements","e":true,"k":"-","d":[105],"c":[]}]]}],["i",{"w":"doubling","s":"ing","e":true,"k":"i","d":[105],"c":[]}]]}],["t",{"w":"dots","s":"ts","e":true,"k":"t","d":[48],"c":[]}],["m",{"w":"domain","s":"main","e":true,"k":"m","d":[67,226,227,354,356,366],"c":[]}],["g",{"w":"dog","s":"g","e":true,"k":"g","d":[92,142,144,180],"c":[["-",{"w":"dog-go-to-the-moon","s":"-go-to-the-moon","e":true,"k":"-","d":[92,160],"c":[]}]]}],["i",{"w":"doing","s":"ing","e":true,"k":"i","d":[229,515],"c":[]}],["x",{"w":"doxyz","s":"xyz","e":true,"k":"x","d":[355],"c":[]}],["l",{"w":"dolor","s":"lor","e":true,"k":"l","d":[517],"c":[]}]]}],["a",{"w":"da","s":"a","e":false,"k":"a","d":[],"c":[["t",{"w":"dat","s":"t","e":false,"k":"t","d":[],"c":[["a",{"w":"data","s":"a","e":true,"k":"a","d":[2,7,8,12,13,22,31,44,45,49,52,54,64,67,68,69,70,74,76,79,80,81,82,83,84,85,87,88,89,90,91,92,93,94,95,96,97,98,100,101,102,103,104,106,109,110,111,112,113,114,116,118,120,121,126,127,128,130,131,132,133,134,135,138,139,140,141,142,143,144,145,146,148,149,150,151,153,154,156,157,158,159,161,162,166,167,168,169,172,173,174,175,176,177,179,180,181,182,184,186,187,188,189,191,194,195,198,200,202,203,204,208,225,226,227,228,229,233,245,246,257,259,345,347,348,349,350,352,355,356,357,361,365,366,367,371,373,376,377,379,382,383,384,385,386,387,399,420,422,423,425,427,443,459,466,502,504,508,509,511,513,515,516,517],"c":[["-",{"w":"data-var","s":"-var","e":true,"k":"-","d":[7,8,361],"c":[["s",{"w":"data-vars","s":"s","e":true,"k":"s","d":[7,361],"c":[]}]]}],["v",{"w":"datavar","s":"var","e":true,"k":"v","d":[7,361],"c":[]}],["b",{"w":"database","s":"base","e":true,"k":"b","d":[11,14,15,44,55,68,164,256,373,377,381,422,466,501,502,504,505],"c":[["s",{"w":"databases","s":"s","e":true,"k":"s","d":[44,373,422,502],"c":[]}],["_",{"w":"database_uri","s":"_uri","e":true,"k":"_","d":[374,376],"c":[]}]]}],["s",{"w":"dataset","s":"set","e":true,"k":"s","d":[14,16,17],"c":[["s",{"w":"datasets","s":"s","e":true,"k":"s","d":[16,97],"c":[]}]]}],["p",{"w":"dataprivatekey","s":"privatekey","e":true,"k":"p","d":[239],"c":[]}],["d",{"w":"datadir","s":"dir","e":true,"k":"d","d":[515],"c":[]}]]}],["e",{"w":"date","s":"e","e":true,"k":"e","d":[14,15,17],"c":[]}]]}],["o",{"w":"dao","s":"o","e":true,"k":"o","d":[11,27,69,256,381,501,505],"c":[["s",{"w":"daos","s":"s","e":true,"k":"s","d":[69],"c":[]}]]}],["r",{"w":"dark","s":"rk","e":true,"k":"r","d":[11,44,230,256,381,466,501,505],"c":[]}],["y",{"w":"day","s":"y","e":true,"k":"y","d":[49,73,77],"c":[["s",{"w":"days","s":"s","e":true,"k":"s","d":[13,54,69,77,102,191,202,515],"c":[]}]]}],["i",{"w":"daily","s":"ily","e":true,"k":"i","d":[49],"c":[]}],["s",{"w":"dashboard","s":"shboard","e":true,"k":"s","d":[50,517],"c":[]}],["p",{"w":"dapp","s":"pp","e":true,"k":"p","d":[68,122,123,160,182],"c":[["s",{"w":"dapps","s":"s","e":true,"k":"s","d":[355],"c":[]}]]}],["e",{"w":"daemon","s":"emon","e":true,"k":"e","d":[515],"c":[]}]]}],["i",{"w":"di","s":"i","e":false,"k":"i","d":[],"c":[["s",{"w":"dis","s":"s","e":false,"k":"s","d":[],"c":[["c",{"w":"disc","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"disco","s":"o","e":false,"k":"o","d":[],"c":[["r",{"w":"discord","s":"rd","e":true,"k":"r","d":[2,8,18,31,45,46,53,54,70,72,73,74,78,203,204,208,225,228,229,257,345,347,349,350,373,399,422,425,427,443,459,502],"c":[]}],["v",{"w":"discover","s":"ver","e":true,"k":"v","d":[11,70,74,229,256,381,425,427,443,459,501,505,515],"c":[]}],["n",{"w":"disconnect","s":"nnect","e":true,"k":"n","d":[352,355,356,357,366],"c":[]}]]}],["r",{"w":"discrete","s":"rete","e":true,"k":"r","d":[5,359],"c":[]}],["u",{"w":"discuss","s":"uss","e":true,"k":"u","d":[68],"c":[["i",{"w":"discussi","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"discussing","s":"ng","e":true,"k":"n","d":[78],"c":[]}],["o",{"w":"discussion","s":"on","e":true,"k":"o","d":[78],"c":[]}]]}]]}]]}],["p",{"w":"disp","s":"p","e":false,"k":"p","d":[],"c":[["l",{"w":"display","s":"lay","e":true,"k":"l","d":[22,65,68,71,88,120,219,220,246,356,366,377],"c":[["e",{"w":"displayed","s":"ed","e":true,"k":"e","d":[22],"c":[]}],["s",{"w":"displays","s":"s","e":true,"k":"s","d":[52,53],"c":[]}],["i",{"w":"displaying","s":"ing","e":true,"k":"i","d":[68,71,515],"c":[]}]]}],["e",{"w":"dispenses","s":"enses","e":true,"k":"e","d":[49],"c":[]}],["a",{"w":"dispatch","s":"atch","e":true,"k":"a","d":[119],"c":[]}]]}],["k",{"w":"disk","s":"k","e":true,"k":"k","d":[27,515],"c":[]}],["t",{"w":"dist","s":"t","e":false,"k":"t","d":[],"c":[["r",{"w":"distribut","s":"ribut","e":false,"k":"r","d":[],"c":[["i",{"w":"distributi","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"distribution","s":"on","e":true,"k":"o","d":[49,69,71,112,178,516],"c":[["_",{"w":"distribution_rounds","s":"_rounds","e":true,"k":"_","d":[112],"c":[]}]]}],["n",{"w":"distributing","s":"ng","e":true,"k":"n","d":[112],"c":[]}]]}],["e",{"w":"distribute","s":"e","e":true,"k":"e","d":[69,112,192,516],"c":[["d",{"w":"distributed","s":"d","e":true,"k":"d","d":[69,71],"c":[]}],["-",{"w":"distribute-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"distribute-tokens","s":"tokens","e":true,"k":"t","d":[112],"c":[]}],["r",{"w":"distribute-reward","s":"reward","e":true,"k":"r","d":[202],"c":[["s",{"w":"distribute-rewards","s":"s","e":true,"k":"s","d":[516],"c":[]}]]}]]}]]}]]}],["i",{"w":"distin","s":"in","e":false,"k":"i","d":[],"c":[["g",{"w":"distinguish","s":"guish","e":true,"k":"g","d":[81,92,121],"c":[["i",{"w":"distinguishing","s":"ing","e":true,"k":"i","d":[121],"c":[]}],["e",{"w":"distinguishes","s":"es","e":true,"k":"e","d":[182],"c":[]}]]}],["c",{"w":"distinct","s":"ct","e":true,"k":"c","d":[122],"c":[["i",{"w":"distinctive","s":"ive","e":true,"k":"i","d":[219,220],"c":[]}]]}]]}]]}],["a",{"w":"disable","s":"able","e":true,"k":"a","d":[69],"c":[["d",{"w":"disabled","s":"d","e":true,"k":"d","d":[69,90,374,376],"c":[]}],["w",{"w":"disablewallet","s":"wallet","e":true,"k":"w","d":[515],"c":[]}]]}],["j",{"w":"disjunction","s":"junction","e":true,"k":"j","d":[155,165],"c":[]}]]}],["r",{"w":"direct","s":"rect","e":true,"k":"r","d":[14,52,90,226,234,239,257,345,356,366,368,372,377],"c":[["l",{"w":"directly","s":"ly","e":true,"k":"l","d":[7,27,47,68,69,86,99,129,180,188,229,235,239,259,355,361,369,377,379,509],"c":[]}],["o",{"w":"directory","s":"ory","e":true,"k":"o","d":[12,14,17,29,30,47,69,71,224,245,259,348,375,376,380,509,515],"c":[]}],["i",{"w":"directions","s":"ions","e":true,"k":"i","d":[14],"c":[]}]]}],["v",{"w":"div","s":"v","e":true,"k":"v","d":[11,44,67,74,226,227,256,352,371,372,381,420,425,443,466,501,505,508,517],"c":[["e",{"w":"dive","s":"e","e":true,"k":"e","d":[8,9,12,69,224,230,231,232,245,246,348,352,353,354,357,377],"c":[]}],["i",{"w":"divi","s":"i","e":false,"k":"i","d":[],"c":[["d",{"w":"divid","s":"d","e":false,"k":"d","d":[],"c":[["i",{"w":"dividing","s":"ing","e":true,"k":"i","d":[71,112,197],"c":[]}],["e",{"w":"divide","s":"e","e":true,"k":"e","d":[77,145],"c":[["s",{"w":"divides","s":"s","e":true,"k":"s","d":[106,145,185,197,199],"c":[]}],["-",{"w":"divide-by-power-of-2","s":"-by-power-of-2","e":true,"k":"-","d":[145],"c":[]}]]}]]}],["s",{"w":"divis","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"division","s":"ion","e":true,"k":"i","d":[77,102,112,137,140,145,197],"c":[["s",{"w":"divisions","s":"s","e":true,"k":"s","d":[112],"c":[]}]]}],["o",{"w":"divisor","s":"or","e":true,"k":"o","d":[197],"c":[]}]]}]]}]]}],["f",{"w":"diff","s":"ff","e":true,"k":"f","d":[229,517],"c":[["e",{"w":"differ","s":"er","e":true,"k":"e","d":[27],"c":[["e",{"w":"differen","s":"en","e":false,"k":"e","d":[],"c":[["t",{"w":"different","s":"t","e":true,"k":"t","d":[9,12,16,18,19,22,50,81,82,87,90,95,96,101,102,104,114,115,121,123,133,137,140,144,154,158,164,170,173,176,179,180,182,185,191,193,196,221,229,230,233,237,239,243,245,348,351,356,366,367,377,517],"c":[["l",{"w":"differently","s":"ly","e":true,"k":"l","d":[351],"c":[]}]]}],["c",{"w":"difference","s":"ce","e":true,"k":"c","d":[140,219,222],"c":[["s",{"w":"differences","s":"s","e":true,"k":"s","d":[77,80,114,128,140,145,154,176,180,187,191],"c":[]}]]}]]}]]}],["i",{"w":"difficult","s":"icult","e":true,"k":"i","d":[119,164],"c":[]}],["s",{"w":"diffs","s":"s","e":true,"k":"s","d":[229],"c":[]}]]}],["d",{"w":"did","s":"d","e":true,"k":"d","d":[16,226,234,368],"c":[]}],["c",{"w":"dict","s":"ct","e":false,"k":"c","d":[],"c":[["a",{"w":"dictate","s":"ate","e":true,"k":"a","d":[22],"c":[]}],["i",{"w":"dictionaries","s":"ionaries","e":true,"k":"i","d":[97],"c":[]}]]}],["a",{"w":"diag","s":"ag","e":false,"k":"a","d":[],"c":[["r",{"w":"diagram","s":"ram","e":true,"k":"r","d":[55],"c":[["s",{"w":"diagrams","s":"s","e":true,"k":"s","d":[55],"c":[]}]]}],["n",{"w":"diagnose","s":"nose","e":true,"k":"n","d":[164],"c":[]}]]}],["g",{"w":"digital","s":"gital","e":true,"k":"g","d":[122],"c":[]}]]}],["e",{"w":"de","s":"e","e":true,"k":"e","d":[69,376],"c":[["v",{"w":"dev","s":"v","e":true,"k":"v","d":[75,259,426,444,517],"c":[["e",{"w":"develop","s":"elop","e":true,"k":"e","d":[27,53,70,226,234,259,368,375],"c":[["e",{"w":"developer","s":"er","e":true,"k":"e","d":[2,8,18,27,31,44,45,46,54,73,74,203,204,208,225,228,229,233,257,345,347,349,350,367,373,399,422,425,443,459,502,515],"c":[["s",{"w":"developers","s":"s","e":true,"k":"s","d":[9,27,45,49,50,65,70,72,73,76,78,79,80,116,127,201,202,219,222,229,239,241,355,439,462,509],"c":[]}]]}],["m",{"w":"development","s":"ment","e":true,"k":"m","d":[9,11,12,18,19,23,24,27,30,31,44,47,49,50,69,71,78,119,152,163,199,224,231,241,245,256,259,348,350,381,501,505],"c":[["s",{"w":"developments","s":"s","e":true,"k":"s","d":[219,222],"c":[]}]]}],["i",{"w":"developing","s":"ing","e":true,"k":"i","d":[18,233,367],"c":[]}]]}],["n",{"w":"devnet","s":"net","e":true,"k":"n","d":[18,19,24,25,27,28,29,30,31,35,45,46,47,50,53,68,71,219,221,230,241,242,374,375,376,378,510,515],"c":[["s",{"w":"devnets","s":"s","e":true,"k":"s","d":[19],"c":[]}],["-",{"w":"devnet-plan","s":"-plan","e":true,"k":"-","d":[27],"c":[]}],["'",{"w":"devnet'","s":"'","e":true,"k":"'","d":[34],"c":[]}]]}],["i",{"w":"device","s":"ice","e":true,"k":"i","d":[45,232,515],"c":[["s",{"w":"devices","s":"s","e":true,"k":"s","d":[515],"c":[]}]]}],["1",{"w":"dev1","s":"1","e":true,"k":"1","d":[50],"c":[]}],["2",{"w":"dev2","s":"2","e":true,"k":"2","d":[50],"c":[]}],["s",{"w":"devs","s":"s","e":true,"k":"s","d":[73],"c":[]}]]}],["f",{"w":"def","s":"f","e":false,"k":"f","d":[],"c":[["a",{"w":"default","s":"ault","e":true,"k":"a","d":[4,5,6,7,12,19,27,28,52,69,75,77,83,85,88,91,100,103,110,120,131,139,146,170,173,175,219,221,224,226,227,229,232,233,235,238,239,241,245,346,348,352,355,356,357,358,359,360,361,362,366,367,369,371,372,374,376,426,444,515,517],"c":[["v",{"w":"defaultvalue","s":"value","e":true,"k":"v","d":[4,5,6,7,67,226,227,230,244,353,358,359,360,361,362,371,372,379,380],"c":[]}],["-",{"w":"default-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"default-to","s":"to","e":true,"k":"t","d":[7,12,22,26,30,69,71,76,77,79,81,83,85,88,90,91,97,103,110,112,113,120,124,130,131,134,136,139,140,146,147,152,161,164,170,173,175,193,196,201,202,224,245,348,356,361,366,511,513,516,517],"c":[]}],["v",{"w":"default-value","s":"value","e":true,"k":"v","d":[103],"c":[]}]]}],["o",{"w":"defaultopen","s":"open","e":true,"k":"o","d":[9,20,29,30,375],"c":[]}],["s",{"w":"defaults","s":"s","e":true,"k":"s","d":[27,229,233,234,235,353,356,357,366,367,368,369,514],"c":[]}],["e",{"w":"defaulted","s":"ed","e":true,"k":"e","d":[52],"c":[]}],["p",{"w":"defaultproviders","s":"providers","e":true,"k":"p","d":[356,366],"c":[]}],["i",{"w":"defaulting","s":"ing","e":true,"k":"i","d":[516],"c":[]}]]}],["i",{"w":"defi","s":"i","e":true,"k":"i","d":[12,224,245,348],"c":[["n",{"w":"defin","s":"n","e":false,"k":"n","d":[],"c":[["e",{"w":"define","s":"e","e":true,"k":"e","d":[9,30,52,68,69,71,76,77,79,80,81,90,92,99,102,112,113,114,119,122,125,129,134,140,152,154,160,176,185,191,202,224,371,372,375,376,377,379,511,513,516,517],"c":[["d",{"w":"defined","s":"d","e":true,"k":"d","d":[5,7,12,52,69,92,99,117,119,123,245,259,348,359,361,374,376,377],"c":[]}],["-",{"w":"define-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"define-data-var","s":"data-var","e":true,"k":"d","d":[6,7,12,28,69,71,81,92,99,100,102,108,112,114,115,122,126,128,131,137,140,149,154,160,163,175,176,180,185,187,191,192,202,224,245,348,360,361,511,513,516,517],"c":[]}],["p",{"w":"define-p","s":"p","e":false,"k":"p","d":[],"c":[["u",{"w":"define-public","s":"ublic","e":true,"k":"u","d":[6,7,12,22,26,28,30,51,69,71,76,77,79,80,81,83,85,86,88,89,90,91,93,94,97,99,100,101,102,108,112,113,114,115,116,117,120,122,123,124,125,126,128,129,130,131,132,134,135,136,137,140,141,143,147,148,149,150,151,152,154,159,160,161,163,164,166,167,171,175,176,178,180,182,184,186,187,189,190,191,192,193,196,200,201,202,224,230,245,348,353,356,360,361,366,377,511,513,516,517],"c":[]}],["r",{"w":"define-private","s":"rivate","e":true,"k":"r","d":[7,12,26,69,99,105,129,134,170,177,245,348,361,511,513,516],"c":[]}]]}],["c",{"w":"define-constant","s":"constant","e":true,"k":"c","d":[6,12,69,76,81,92,100,102,108,112,113,114,125,130,140,154,173,174,176,178,185,187,191,192,202,245,348,360,511,513,516],"c":[]}],["m",{"w":"define-map","s":"map","e":true,"k":"m","d":[6,7,12,22,26,30,69,71,76,77,79,80,81,83,85,88,89,90,91,92,97,100,103,112,113,116,120,124,130,132,134,136,139,140,146,147,151,152,161,163,164,167,172,173,189,193,196,201,202,224,245,348,356,360,361,366,511,513,516,517],"c":[]}],["r",{"w":"define-read-only","s":"read-only","e":true,"k":"r","d":[6,7,12,22,26,30,69,71,76,77,79,80,81,82,83,84,87,90,92,95,96,97,98,99,100,102,103,104,105,106,107,109,110,111,112,113,114,116,118,121,122,126,127,128,129,130,133,134,138,139,142,144,145,146,149,152,153,154,155,156,157,158,160,161,162,165,168,169,172,173,174,176,177,179,180,181,183,185,187,188,191,194,195,197,198,199,201,202,224,245,348,356,360,361,366,511,513,517],"c":[]}],["f",{"w":"define-fungible-token","s":"fungible-token","e":true,"k":"f","d":[7,69,92,115,123,125,160,178,190,361],"c":[]}],["n",{"w":"define-non-fungible-token","s":"non-fungible-token","e":true,"k":"n","d":[7,28,101,122,135,186,195,361,516],"c":[]}],["t",{"w":"define-trait","s":"trait","e":true,"k":"t","d":[69,90,117,119,152],"c":[]}]]}],["s",{"w":"defines","s":"s","e":true,"k":"s","d":[69,79,90,117,226,227,516],"c":[]}]]}],["i",{"w":"defini","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"defining","s":"ng","e":true,"k":"n","d":[71,92,99,100,105,119,149,152,177,235,369,371,374,377],"c":[]}],["t",{"w":"definition","s":"tion","e":true,"k":"t","d":[83,92,97,100,119,122,129,134,160,374,376],"c":[["s",{"w":"definitions","s":"s","e":true,"k":"s","d":[92,119,229],"c":[]}]]}]]}]]}]]}],["l",{"w":"deflationary","s":"lationary","e":true,"k":"l","d":[115],"c":[]}]]}],["p",{"w":"dep","s":"p","e":false,"k":"p","d":[],"c":[["l",{"w":"deploy","s":"loy","e":true,"k":"l","d":[7,11,18,19,25,27,44,45,46,47,53,68,69,71,74,221,226,230,234,256,353,361,368,379,381,501,505,516],"c":[["e",{"w":"deploye","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"deployer","s":"r","e":true,"k":"r","d":[5,6,7,27,28,51,359,360,361,372],"c":[["s",{"w":"deployers","s":"s","e":true,"k":"s","d":[7,361],"c":[]}],["b",{"w":"deployerbalance","s":"balance","e":true,"k":"b","d":[7,361],"c":[]}]]}],["d",{"w":"deployed","s":"d","e":true,"k":"d","d":[7,9,19,27,28,46,51,52,55,221,226,234,361,368,377],"c":[]}]]}],["c",{"w":"deploycontract","s":"contract","e":true,"k":"c","d":[7,353,361],"c":[["o",{"w":"deploycontractoptions","s":"options","e":true,"k":"o","d":[7,361],"c":[]}]]}],["i",{"w":"deploying","s":"ing","e":true,"k":"i","d":[7,18,19,27,28,31,44,49,50,68,228,230,353,361,373],"c":[]}],["m",{"w":"deployment","s":"ment","e":true,"k":"m","d":[18,19,25,27,28,45,46,51,53,68,152,219,222,230,233,259,353,367,372],"c":[["s",{"w":"deployments","s":"s","e":true,"k":"s","d":[11,18,25,27,49,50,92,237,256,353,372,381,420,501,505],"c":[]}],["-",{"w":"deployment-plan-specifications","s":"-plan-specifications","e":true,"k":"-","d":[27],"c":[]}]]}],["-",{"w":"deploy-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"deploy-contracts","s":"contracts","e":true,"k":"c","d":[45,46,47,53],"c":[]}],["a",{"w":"deploy-a-contract","s":"a-contract","e":true,"k":"a","d":[516],"c":[]}]]}]]}],["e",{"w":"depend","s":"end","e":true,"k":"e","d":[14,107,161],"c":[["e",{"w":"dependencies","s":"encies","e":true,"k":"e","d":[9,12,25,27,28,45,75,224,232,245,348,357],"c":[]}],["s",{"w":"depends","s":"s","e":true,"k":"s","d":[14,15,49,95,101,104,107,110,125,126,127,136,139,146,147,156,161,172,173,180,183,185,195,196,197],"c":[]}],["i",{"w":"depending","s":"ing","e":true,"k":"i","d":[14,15,17,104,127,156,375,515,516],"c":[]}]]}],["o",{"w":"deposit","s":"osit","e":true,"k":"o","d":[12,140,192,201,224,233,245,348,367,516],"c":[["s",{"w":"deposits","s":"s","e":true,"k":"s","d":[12,224,233,245,348,367],"c":[]}],["e",{"w":"deposited","s":"ed","e":true,"k":"e","d":[12,224,245,348],"c":[]}],["o",{"w":"depositor","s":"or","e":true,"k":"o","d":[233,367],"c":[["'",{"w":"depositor's","s":"'s","e":true,"k":"'","d":[233,367],"c":[]}]]}],["i",{"w":"depositing","s":"ing","e":true,"k":"i","d":[233,367,516],"c":[]}],["_",{"w":"deposit_","s":"_","e":false,"k":"_","d":[],"c":[["a",{"w":"deposit_amount","s":"amount","e":true,"k":"a","d":[233,367],"c":[]}],["b",{"w":"deposit_btc_tx","s":"btc_tx","e":true,"k":"b","d":[233,367],"c":[]}]]}],["-",{"w":"deposit-stx","s":"-stx","e":true,"k":"-","d":[516],"c":[]}]]}],["r",{"w":"deprecat","s":"recat","e":false,"k":"r","d":[],"c":[["e",{"w":"deprecated","s":"ed","e":true,"k":"e","d":[67,104,156,219,222,226,227,355,371,372],"c":[]}],["i",{"w":"deprecations","s":"ions","e":true,"k":"i","d":[355],"c":[]}]]}],["t",{"w":"depth","s":"th","e":true,"k":"t","d":[78],"c":[]}]]}],["s",{"w":"des","s":"s","e":false,"k":"s","d":[],"c":[["c",{"w":"descri","s":"cri","e":false,"k":"c","d":[],"c":[["p",{"w":"descript","s":"pt","e":false,"k":"p","d":[],"c":[["i",{"w":"descripti","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"description","s":"on","e":true,"k":"o","d":[8,9,11,12,13,18,19,22,26,27,30,31,44,45,47,53,54,68,69,73,78,208,224,228,230,231,232,233,239,243,245,246,256,348,350,352,353,354,357,367,373,374,376,377,378,379,381,399,420,423,427,459,466,501,502,504,505,508,509,510,511,513,515,516,517],"c":[["s",{"w":"descriptions","s":"s","e":true,"k":"s","d":[69],"c":[]}]]}],["v",{"w":"descriptive","s":"ve","e":true,"k":"v","d":[83,99,100,117,119,122,129,134,152,160,164],"c":[]}]]}],["o",{"w":"descriptor","s":"or","e":true,"k":"o","d":[371],"c":[["s",{"w":"descriptors","s":"s","e":true,"k":"s","d":[371,502],"c":[]}]]}]]}],["b",{"w":"describ","s":"b","e":false,"k":"b","d":[],"c":[["e",{"w":"describe","s":"e","e":true,"k":"e","d":[9,12,224,245,246,348,371],"c":[["s",{"w":"describes","s":"s","e":true,"k":"s","d":[224],"c":[]}],["d",{"w":"described","s":"d","e":true,"k":"d","d":[226,234,368],"c":[]}]]}],["i",{"w":"describing","s":"ing","e":true,"k":"i","d":[371],"c":[]}]]}]]}],["i",{"w":"desi","s":"i","e":false,"k":"i","d":[],"c":[["g",{"w":"design","s":"gn","e":true,"k":"g","d":[99,371,372,377,379],"c":[["e",{"w":"designed","s":"ed","e":true,"k":"e","d":[12,73,76,77,79,80,81,201,202,245,259,348,377],"c":[]}],["a",{"w":"designate","s":"ate","e":true,"k":"a","d":[376],"c":[["d",{"w":"designated","s":"d","e":true,"k":"d","d":[71,90,233,367],"c":[]}]]}],["i",{"w":"designing","s":"ing","e":true,"k":"i","d":[79,92,99],"c":[]}],["s",{"w":"designs","s":"s","e":true,"k":"s","d":[149],"c":[]}]]}],["r",{"w":"desired","s":"red","e":true,"k":"r","d":[14,17,52,371],"c":[]}]]}],["t",{"w":"dest","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"destination","s":"ination","e":true,"k":"i","d":[71,377],"c":[["s",{"w":"destinations","s":"s","e":true,"k":"s","d":[52],"c":[]}]]}],["r",{"w":"destr","s":"r","e":false,"k":"r","d":[],"c":[["o",{"w":"destroy","s":"oy","e":true,"k":"o","d":[115,122,123,125,160,178,190],"c":[["e",{"w":"destroyed","s":"ed","e":true,"k":"e","d":[115],"c":[]}]]}],["u",{"w":"destruct","s":"uct","e":false,"k":"u","d":[],"c":[["i",{"w":"destruction","s":"ion","e":true,"k":"i","d":[135],"c":[]}],["s",{"w":"destructs","s":"s","e":true,"k":"s","d":[141],"c":[]}],["-",{"w":"destruct-principal","s":"-principal","e":true,"k":"-","d":[141],"c":[]}]]}]]}]]}],["e",{"w":"deserializ","s":"erializ","e":false,"k":"e","d":[],"c":[["e",{"w":"deserialize","s":"e","e":true,"k":"e","d":[144,226,234,368],"c":[["s",{"w":"deserializes","s":"s","e":true,"k":"s","d":[142,144],"c":[["t",{"w":"deserializestacks","s":"tacks","e":false,"k":"t","d":[],"c":[["m",{"w":"deserializestacksmessage","s":"message","e":true,"k":"m","d":[229],"c":[["b",{"w":"deserializestacksmessagebytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}],["w",{"w":"deserializestackswirebytes","s":"wirebytes","e":true,"k":"w","d":[229],"c":[]}]]}]]}],["-",{"w":"deserialize-user-data","s":"-user-data","e":true,"k":"-","d":[144],"c":[]}],["t",{"w":"deserializetransaction","s":"transaction","e":true,"k":"t","d":[226,234,368],"c":[["a",{"w":"deserializetransactionauthfield","s":"authfield","e":true,"k":"a","d":[229],"c":[["b",{"w":"deserializetransactionauthfieldbytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}]]}],["d",{"w":"deserialized","s":"d","e":true,"k":"d","d":[226,234,368,514],"c":[["t",{"w":"deserializedtx","s":"tx","e":true,"k":"t","d":[226,234,368],"c":[]}]]}],["a",{"w":"deserializeaddress","s":"address","e":true,"k":"a","d":[229],"c":[["b",{"w":"deserializeaddressbytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}],["l",{"w":"deserializelp","s":"lp","e":false,"k":"l","d":[],"c":[["l",{"w":"deserializelplist","s":"list","e":true,"k":"l","d":[229],"c":[["b",{"w":"deserializelplistbytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}],["s",{"w":"deserializelpstring","s":"string","e":true,"k":"s","d":[229],"c":[["b",{"w":"deserializelpstringbytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}]]}],["p",{"w":"deserializep","s":"p","e":false,"k":"p","d":[],"c":[["a",{"w":"deserializepayload","s":"ayload","e":true,"k":"a","d":[229],"c":[["b",{"w":"deserializepayloadbytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}],["u",{"w":"deserializepublickey","s":"ublickey","e":true,"k":"u","d":[229],"c":[["b",{"w":"deserializepublickeybytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}],["o",{"w":"deserializepostcondition","s":"ostcondition","e":true,"k":"o","d":[229],"c":[["b",{"w":"deserializepostconditionbytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}]]}],["m",{"w":"deserializeme","s":"me","e":false,"k":"m","d":[],"c":[["m",{"w":"deserializememostring","s":"mostring","e":true,"k":"m","d":[229],"c":[["b",{"w":"deserializememostringbytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}],["s",{"w":"deserializemessagesignature","s":"ssagesignature","e":true,"k":"s","d":[229],"c":[["b",{"w":"deserializemessagesignaturebytes","s":"bytes","e":true,"k":"b","d":[229],"c":[]}]]}]]}]]}],["i",{"w":"deserializing","s":"ing","e":true,"k":"i","d":[144],"c":[]}],["a",{"w":"deserialization","s":"ation","e":true,"k":"a","d":[144],"c":[]}]]}],["k",{"w":"desktop","s":"ktop","e":true,"k":"k","d":[510],"c":[]}]]}],["e",{"w":"deep","s":"ep","e":true,"k":"e","d":[230,352,353,354],"c":[["e",{"w":"deeper","s":"er","e":true,"k":"e","d":[8,9,12,30,224,231,245,246,348,357,377],"c":[]}],["l",{"w":"deeply","s":"ly","e":true,"k":"l","d":[196],"c":[]}]]}],["t",{"w":"det","s":"t","e":false,"k":"t","d":[],"c":[["a",{"w":"detail","s":"ail","e":false,"k":"a","d":[],"c":[["s",{"w":"details","s":"s","e":true,"k":"s","d":[9,12,49,50,53,68,69,73,98,219,221,222,226,228,233,234,243,245,246,259,348,352,353,354,355,356,366,367,368,377,399,511,513,516],"c":[]}],["e",{"w":"detailed","s":"ed","e":true,"k":"e","d":[12,47,68,98,127,143,198,224,245,348,351,352,356,366,377],"c":[]}],["i",{"w":"detailing","s":"ing","e":true,"k":"i","d":[377],"c":[]}]]}],["e",{"w":"dete","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"determin","s":"rmin","e":false,"k":"r","d":[],"c":[["e",{"w":"determine","s":"e","e":true,"k":"e","d":[18,72,107,110,114,136,139,146,147,154,176,183,191,377,516],"c":[["s",{"w":"determines","s":"s","e":true,"k":"s","d":[67,226,227,379],"c":[]}],["d",{"w":"determined","s":"d","e":true,"k":"d","d":[202],"c":[]}]]}],["i",{"w":"determini","s":"i","e":false,"k":"i","d":[],"c":[["s",{"w":"determinis","s":"s","e":false,"k":"s","d":[],"c":[["m",{"w":"determinism","s":"m","e":true,"k":"m","d":[77,80,161,202],"c":[]}],["t",{"w":"deterministic","s":"tic","e":true,"k":"t","d":[239],"c":[]}]]}],["n",{"w":"determining","s":"ng","e":true,"k":"n","d":[107,110,124,136,139,146,147],"c":[]}]]}]]}],["c",{"w":"detect","s":"ct","e":false,"k":"c","d":[],"c":[["s",{"w":"detects","s":"s","e":true,"k":"s","d":[28,68],"c":[]}],["i",{"w":"detecti","s":"i","e":false,"k":"i","d":[],"c":[["v",{"w":"detective","s":"ve","e":true,"k":"v","d":[70],"c":[]}],["o",{"w":"detection","s":"on","e":true,"k":"o","d":[102,137,140],"c":[]}],["n",{"w":"detecting","s":"ng","e":true,"k":"n","d":[128],"c":[]}]]}],["e",{"w":"detected","s":"ed","e":true,"k":"e","d":[110,124,136,139,146],"c":[["_",{"w":"detected_missing_nonces","s":"_missing_nonces","e":true,"k":"_","d":[258],"c":[]}]]}]]}]]}]]}],["c",{"w":"dec","s":"c","e":false,"k":"c","d":[],"c":[["e",{"w":"decentralized","s":"entralized","e":true,"k":"e","d":[11,68,69,71,80,99,119,123,152,178,244,256,381,501,505,509],"c":[]}],["o",{"w":"deco","s":"o","e":false,"k":"o","d":[],"c":[["d",{"w":"decod","s":"d","e":false,"k":"d","d":[],"c":[["e",{"w":"decode","s":"e","e":true,"k":"e","d":[52,244],"c":[["_",{"w":"decode_clarity_values","s":"_clarity_values","e":true,"k":"_","d":[377,379],"c":[]}],["d",{"w":"decoded","s":"d","e":true,"k":"d","d":[379],"c":[]}]]}],["i",{"w":"decoding","s":"ing","e":true,"k":"i","d":[87,133,158,179],"c":[]}]]}],["m",{"w":"decompos","s":"mpos","e":false,"k":"m","d":[],"c":[["e",{"w":"decompose","s":"e","e":true,"k":"e","d":[141],"c":[["s",{"w":"decomposes","s":"s","e":true,"k":"s","d":[94],"c":[]}]]}],["i",{"w":"decomposi","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"decomposing","s":"ng","e":true,"k":"n","d":[141],"c":[]}],["t",{"w":"decomposition","s":"tion","e":true,"k":"t","d":[141],"c":[]}]]}]]}],["r",{"w":"decoration","s":"ration","e":true,"k":"r","d":[517],"c":[]}]]}],["r",{"w":"decr","s":"r","e":false,"k":"r","d":[],"c":[["y",{"w":"decrypt","s":"ypt","e":true,"k":"y","d":[67,93,226,227,229],"c":[["c",{"w":"decryptcontent","s":"content","e":true,"k":"c","d":[67,226,227],"c":[]}],["s",{"w":"decrypts","s":"s","e":true,"k":"s","d":[67,93,226,227],"c":[]}],["i",{"w":"decrypti","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"decrypting","s":"ng","e":true,"k":"n","d":[67,226,227,229],"c":[]}],["o",{"w":"decryption","s":"on","e":true,"k":"o","d":[93],"c":[]}]]}],["m",{"w":"decryptmnemonic","s":"mnemonic","e":true,"k":"m","d":[229],"c":[]}],["l",{"w":"decryptlegacy","s":"legacy","e":true,"k":"l","d":[229],"c":[]}]]}],["e",{"w":"decre","s":"e","e":false,"k":"e","d":[],"c":[["a",{"w":"decreas","s":"as","e":false,"k":"a","d":[],"c":[["i",{"w":"decreasing","s":"ing","e":true,"k":"i","d":[77,115,125,140,143,178,190],"c":[]}],["e",{"w":"decrease","s":"e","e":true,"k":"e","d":[77,92,143],"c":[]}]]}],["m",{"w":"decrement","s":"ment","e":true,"k":"m","d":[100,140,375],"c":[["i",{"w":"decrementing","s":"ing","e":true,"k":"i","d":[140],"c":[]}],["s",{"w":"decrements","s":"s","e":true,"k":"s","d":[140],"c":[]}]]}]]}]]}],["i",{"w":"deci","s":"i","e":false,"k":"i","d":[],"c":[["m",{"w":"decimal","s":"mal","e":true,"k":"m","d":[77,185],"c":[["s",{"w":"decimals","s":"s","e":true,"k":"s","d":[69,92],"c":[]}]]}],["s",{"w":"decision","s":"sion","e":false,"k":"s","d":[],"c":[["s",{"w":"decisions","s":"s","e":true,"k":"s","d":[70,196,202],"c":[]}],["-",{"w":"decision-making","s":"-making","e":true,"k":"-","d":[196],"c":[]}]]}]]}],["l",{"w":"declar","s":"lar","e":false,"k":"l","d":[],"c":[["i",{"w":"declaring","s":"ing","e":true,"k":"i","d":[92],"c":[]}],["e",{"w":"declare","s":"e","e":true,"k":"e","d":[92,119],"c":[["d",{"w":"declared","s":"d","e":true,"k":"d","d":[149],"c":[]}]]}]]}]]}],["l",{"w":"del","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"dele","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"delet","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"delete","s":"e","e":true,"k":"e","d":[16,31,52,79,89,511,513],"c":[["d",{"w":"deleted","s":"d","e":true,"k":"d","d":[79,89,246],"c":[]}],["-",{"w":"delete-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"delete-account","s":"account","e":true,"k":"a","d":[79],"c":[]}],["u",{"w":"delete-user-data","s":"user-data","e":true,"k":"u","d":[89],"c":[]}]]}],["s",{"w":"deletes","s":"s","e":true,"k":"s","d":[89],"c":[]}]]}],["i",{"w":"deleti","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"deleting","s":"ng","e":true,"k":"n","d":[48,79,89],"c":[]}],["o",{"w":"deletion","s":"on","e":true,"k":"o","d":[89],"c":[["s",{"w":"deletions","s":"s","e":true,"k":"s","d":[89],"c":[]}]]}]]}]]}],["g",{"w":"delegations","s":"gations","e":true,"k":"g","d":[316],"c":[]}]]}],["i",{"w":"deliver","s":"iver","e":true,"k":"i","d":[68,373,376,377],"c":[["e",{"w":"delivered","s":"ed","e":true,"k":"e","d":[376],"c":[]}],["i",{"w":"delivering","s":"ing","e":true,"k":"i","d":[376],"c":[]}],["s",{"w":"delivers","s":"s","e":true,"k":"s","d":[377,379],"c":[]}]]}]]}],["b",{"w":"debug","s":"bug","e":true,"k":"b","d":[18,26,90,199,373],"c":[["g",{"w":"debugg","s":"g","e":false,"k":"g","d":[],"c":[["i",{"w":"debugging","s":"ing","e":true,"k":"i","d":[26,45,124,136,164,199],"c":[]}],["a",{"w":"debuggable","s":"able","e":true,"k":"a","d":[229],"c":[]}],["e",{"w":"debugger","s":"er","e":true,"k":"e","d":[259],"c":[]}]]}]]}],["r",{"w":"der","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"deriv","s":"iv","e":false,"k":"i","d":[],"c":[["a",{"w":"derivation","s":"ation","e":true,"k":"a","d":[27,94,241],"c":[]}],["i",{"w":"deriving","s":"ing","e":true,"k":"i","d":[94],"c":[]}],["e",{"w":"derive","s":"e","e":true,"k":"e","d":[94],"c":[["d",{"w":"derived","s":"d","e":true,"k":"d","d":[94,141,162,200,240,258,371],"c":[]}],["s",{"w":"derives","s":"s","e":true,"k":"s","d":[94],"c":[]}],["-",{"w":"derive-principal","s":"-principal","e":true,"k":"-","d":[94],"c":[]}]]}]]}],["e",{"w":"deregister","s":"egister","e":true,"k":"e","d":[374,376],"c":[]}]]}],["n",{"w":"den","s":"n","e":false,"k":"n","d":[],"c":[["o",{"w":"denominated","s":"ominated","e":true,"k":"o","d":[27,233,237,367],"c":[]}],["y",{"w":"deny","s":"y","e":true,"k":"y","d":[51,231,238,255,517],"c":[]}]]}],["m",{"w":"dem","s":"m","e":false,"k":"m","d":[],"c":[["o",{"w":"demo","s":"o","e":true,"k":"o","d":[28,517],"c":[["n",{"w":"demonstrat","s":"nstrat","e":false,"k":"n","d":[],"c":[["e",{"w":"demonstrate","s":"e","e":true,"k":"e","d":[79],"c":[["s",{"w":"demonstrates","s":"s","e":true,"k":"s","d":[76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,376],"c":[]}]]}],["i",{"w":"demonstrating","s":"ing","e":true,"k":"i","d":[78],"c":[]}]]}]]}],["a",{"w":"demand","s":"and","e":true,"k":"a","d":[50],"c":[["s",{"w":"demands","s":"s","e":true,"k":"s","d":[50],"c":[]}]]}]]}],["d",{"w":"ded","s":"d","e":false,"k":"d","d":[],"c":[["i",{"w":"dedicated","s":"icated","e":true,"k":"i","d":[45,49],"c":[]}],["u",{"w":"deduct","s":"uct","e":true,"k":"u","d":[71],"c":[["-",{"w":"deduct-points","s":"-points","e":true,"k":"-","d":[77],"c":[]}]]}]]}],["g",{"w":"degr","s":"gr","e":false,"k":"g","d":[],"c":[["e",{"w":"degree","s":"ee","e":true,"k":"e","d":[69],"c":[]}],["a",{"w":"degradation","s":"adation","e":true,"k":"a","d":[79],"c":[]}]]}],["a",{"w":"dea","s":"a","e":false,"k":"a","d":[],"c":[["l",{"w":"dealing","s":"ling","e":true,"k":"l","d":[77,103,114,154,176,191,201],"c":[]}],["c",{"w":"deactivate-profile","s":"ctivate-profile","e":true,"k":"c","d":[97],"c":[]}]]}]]}],["u",{"w":"du","s":"u","e":false,"k":"u","d":[],"c":[["r",{"w":"dur","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"during","s":"ing","e":true,"k":"i","d":[7,22,52,67,69,92,95,100,145,149,163,164,199,226,227,355,356,361,366,372,510,511,513,516],"c":[]}],["a",{"w":"duration","s":"ation","e":true,"k":"a","d":[69,77,192,221,516],"c":[["-",{"w":"duration-500","s":"-500","e":true,"k":"-","d":[44,239,420,466],"c":[]}]]}]]}],["e",{"w":"due","s":"e","e":true,"k":"e","d":[12,26,68,87,125,133,158,161,164,174,178,179,187,191,245,259,348],"c":[]}],["m",{"w":"dump","s":"mp","e":true,"k":"m","d":[14,15],"c":[]}],["p",{"w":"duplicat","s":"plicat","e":false,"k":"p","d":[],"c":[["e",{"w":"duplicate","s":"e","e":true,"k":"e","d":[52,186],"c":[]}],["i",{"w":"duplication","s":"ion","e":true,"k":"i","d":[129],"c":[]}]]}],["t",{"w":"duties","s":"ties","e":true,"k":"t","d":[69],"c":[]}]]}],["1",{"w":"d1","s":"1","e":true,"k":"1","d":[46],"c":[]}],["2",{"w":"d2","s":"2","e":true,"k":"2","d":[46],"c":[]}],["r",{"w":"dr","s":"r","e":false,"k":"r","d":[],"c":[["a",{"w":"drag","s":"ag","e":true,"k":"a","d":[52,510],"c":[]}],["o",{"w":"drop","s":"op","e":true,"k":"o","d":[52],"c":[["d",{"w":"dropdown","s":"down","e":true,"k":"d","d":[219,220],"c":[]}],["p",{"w":"dropped","s":"ped","e":true,"k":"p","d":[258],"c":[["'",{"w":"dropped'","s":"'","e":true,"k":"'","d":[309],"c":[]}]]}]]}],["i",{"w":"drive","s":"ive","e":true,"k":"i","d":[515],"c":[["n",{"w":"driven","s":"n","e":true,"k":"n","d":[231],"c":[]}],["s",{"w":"drives","s":"s","e":true,"k":"s","d":[515],"c":[]}]]}]]}],["b",{"w":"db","s":"b","e":true,"k":"b","d":[55,68,259,504],"c":[["c",{"w":"dbcache","s":"cache","e":true,"k":"c","d":[515],"c":[]}]]}],["y",{"w":"dynamic","s":"ynamic","e":true,"k":"y","d":[68,90,100,119,149,152,182,196],"c":[["a",{"w":"dynamically","s":"ally","e":true,"k":"a","d":[90,149,152,182,202,374,376],"c":[["-",{"w":"dynamically-register-","s":"-register-","e":false,"k":"-","d":[],"c":[["p",{"w":"dynamically-register-predicates","s":"predicates","e":true,"k":"p","d":[374],"c":[]}],["y",{"w":"dynamically-register-your-predicate-with-chainhook","s":"your-predicate-with-chainhook","e":true,"k":"y","d":[376],"c":[]}]]}]]}]]}],["m",{"w":"dmg","s":"mg","e":true,"k":"m","d":[510],"c":[]}],["n",{"w":"dns","s":"ns","e":true,"k":"n","d":[515],"c":[["s",{"w":"dnsseed","s":"seed","e":true,"k":"s","d":[515],"c":[]}]]}]]}],["w",{"w":"w","s":"w","e":true,"k":"w","d":[372],"c":[["h",{"w":"wh","s":"h","e":false,"k":"h","d":[],"c":[["e",{"w":"whe","s":"e","e":false,"k":"e","d":[],"c":[["e",{"w":"wheel","s":"el","e":true,"k":"e","d":[2,8,45,203,204,225,347,349],"c":[]}],["n",{"w":"when","s":"n","e":true,"k":"n","d":[4,13,14,19,22,27,28,29,31,50,51,52,55,68,71,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,229,231,246,258,353,355,356,358,362,366,374,375,376,377,378,379,515,516],"c":[["e",{"w":"whenever","s":"ever","e":true,"k":"e","d":[375],"c":[]}]]}],["r",{"w":"where","s":"re","e":true,"k":"r","d":[9,12,14,15,17,18,19,27,49,50,68,69,71,79,86,88,89,90,91,97,101,103,110,116,120,132,135,139,144,146,147,149,163,164,167,171,172,173,174,176,180,183,186,188,190,191,192,195,201,202,224,229,233,238,245,348,351,355,356,366,367,376,377,379,515,516],"c":[]}],["t",{"w":"whether","s":"ther","e":true,"k":"t","d":[27,47,51,52,69,71,77,139,146,160,173,182,226,230,231,234,353,356,366,368,375],"c":[]}]]}],["o",{"w":"who","s":"o","e":true,"k":"o","d":[6,7,22,26,30,69,71,81,92,122,178,226,234,257,345,352,356,360,361,366,368,517],"c":[["s",{"w":"whose","s":"se","e":true,"k":"s","d":[67,69,115,190],"c":[]}],["l",{"w":"whole","s":"le","e":true,"k":"l","d":[229],"c":[]}],["'",{"w":"who's","s":"'s","e":true,"k":"'","d":[379],"c":[]}]]}],["i",{"w":"whi","s":"i","e":false,"k":"i","d":[],"c":[["c",{"w":"which","s":"ch","e":true,"k":"c","d":[7,12,13,14,15,16,17,26,49,51,52,53,67,68,69,71,86,87,90,92,96,99,100,108,109,112,114,125,126,128,129,130,133,134,145,154,156,158,161,174,176,177,179,180,182,185,190,191,192,193,194,224,226,227,228,230,233,234,236,237,239,240,241,244,245,259,348,351,355,356,357,361,366,367,368,370,373,377,422,427,459,502,515,517],"c":[]}],["l",{"w":"while","s":"le","e":true,"k":"l","d":[49,50,68,77,96,113,149,163,180,192,224,233,259,355,367,516],"c":[]}],["t",{"w":"whitelist","s":"telist","e":true,"k":"t","d":[81,511,513],"c":[["e",{"w":"whitelisted","s":"ed","e":true,"k":"e","d":[511,513],"c":[["-",{"w":"whitelisted-","s":"-","e":false,"k":"-","d":[],"c":[["f",{"w":"whitelisted-function","s":"function","e":true,"k":"f","d":[81],"c":[]}],["a",{"w":"whitelisted-asset-contracts","s":"asset-contracts","e":true,"k":"a","d":[511,513],"c":[]}]]}]]}],["i",{"w":"whitelisting","s":"ing","e":true,"k":"i","d":[511,513],"c":[]}]]}]]}],["a",{"w":"what","s":"at","e":true,"k":"a","d":[7,12,18,22,26,49,50,51,68,71,72,76,77,79,80,81,201,202,219,221,224,226,231,233,234,245,348,361,367,368,371,372,379,422,502],"c":[["'",{"w":"what's","s":"'s","e":true,"k":"'","d":[26,219,220,222,223,229,355],"c":[]}],["e",{"w":"whatever","s":"ever","e":true,"k":"e","d":[258,515],"c":[]}]]}],["y",{"w":"why","s":"y","e":true,"k":"y","d":[49,52,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202],"c":[]}]]}],["i",{"w":"wi","s":"i","e":false,"k":"i","d":[],"c":[["t",{"w":"wit","s":"t","e":false,"k":"t","d":[],"c":[["h",{"w":"with","s":"h","e":true,"k":"h","d":[2,4,6,7,8,9,11,12,13,14,15,17,18,20,21,22,23,24,26,27,28,29,30,31,44,45,46,47,49,50,51,52,53,54,55,58,64,65,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,200,201,202,203,204,208,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,236,239,240,244,245,246,256,257,258,345,346,347,348,349,350,351,352,353,354,355,356,357,358,360,361,362,365,366,367,368,370,371,372,373,374,375,376,377,378,379,381,382,383,384,385,386,387,399,422,425,427,439,443,459,462,466,501,502,504,505,509,511,513,514,515,516,517],"c":[["o",{"w":"without","s":"out","e":true,"k":"o","d":[6,7,8,11,19,74,79,80,88,91,96,101,103,120,124,128,130,134,135,136,149,160,161,163,168,170,174,177,178,180,183,184,189,224,226,227,231,234,239,256,259,356,360,361,366,368,381,425,427,443,501,505,516],"c":[]}],["i",{"w":"within","s":"in","e":true,"k":"i","d":[7,19,27,50,67,82,86,88,93,95,96,97,99,100,102,103,104,105,109,110,112,116,119,120,122,123,125,126,127,129,134,137,140,149,153,156,160,161,163,170,171,176,177,178,183,185,188,190,192,194,361,371,372,374,375,377,379,516],"c":[]}],["-",{"w":"with-no-arguments","s":"-no-arguments","e":true,"k":"-","d":[7,361],"c":[]}],["d",{"w":"withdraw","s":"draw","e":true,"k":"d","d":[192],"c":[["a",{"w":"withdrawal","s":"al","e":true,"k":"a","d":[53,233,367],"c":[]}],["-",{"w":"withdraw-from-vault","s":"-from-vault","e":true,"k":"-","d":[202],"c":[]}]]}],["_",{"w":"with_transfers","s":"_transfers","e":true,"k":"_","d":[219,222],"c":[["'",{"w":"with_transfers'","s":"'","e":true,"k":"'","d":[325],"c":[]}]]}],["n",{"w":"withnotes","s":"notes","e":true,"k":"n","d":[517],"c":[]}]]}],["n",{"w":"witness","s":"ness","e":true,"k":"n","d":[52,371,379],"c":[["e",{"w":"witnesses","s":"es","e":true,"k":"e","d":[379],"c":[]}]]}]]}],["l",{"w":"will","s":"ll","e":true,"k":"l","d":[4,7,9,12,14,15,16,20,21,22,26,27,28,29,30,46,47,48,49,50,51,52,53,55,58,67,68,69,71,72,73,75,80,81,82,83,84,85,88,89,94,95,98,99,100,102,105,106,107,109,110,111,114,115,117,118,120,121,127,131,132,134,135,138,139,141,142,143,146,147,148,149,150,151,153,154,155,156,157,159,162,164,165,166,167,168,169,170,172,174,175,176,181,182,183,184,185,186,187,189,191,194,195,197,198,200,219,221,222,224,226,227,229,230,231,232,233,234,236,238,239,243,245,246,258,346,348,352,353,354,355,357,358,361,362,367,368,370,371,374,375,376,377,378,379,423,504,509,510,511,513,515,516,517],"c":[["s",{"w":"willsend","s":"send","e":false,"k":"s","d":[],"c":[["e",{"w":"willsendeq","s":"eq","e":true,"k":"e","d":[230,231,238],"c":[]}],["g",{"w":"willsendgt","s":"gt","e":true,"k":"g","d":[231],"c":[["e",{"w":"willsendgte","s":"e","e":true,"k":"e","d":[231,234,368],"c":[]}]]}],["l",{"w":"willsendlt","s":"lt","e":true,"k":"l","d":[231],"c":[["e",{"w":"willsendlte","s":"e","e":true,"k":"e","d":[231],"c":[]}]]}],["a",{"w":"willsendasset","s":"asset","e":true,"k":"a","d":[231],"c":[]}]]}],["n",{"w":"willnotsendasset","s":"notsendasset","e":true,"k":"n","d":[231],"c":[]}]]}],["n",{"w":"win","s":"n","e":true,"k":"n","d":[516],"c":[["d",{"w":"window","s":"dow","e":true,"k":"d","d":[49,52,75,127,226,227],"c":[["s",{"w":"windows","s":"s","e":true,"k":"s","d":[18,380,510,515,517],"c":[]}]]}],["g",{"w":"winget","s":"get","e":true,"k":"g","d":[18,380,517],"c":[]}],["n",{"w":"winn","s":"n","e":false,"k":"n","d":[],"c":[["i",{"w":"winning","s":"ing","e":true,"k":"i","d":[73,127,516],"c":[["t",{"w":"winningticketid","s":"ticketid","e":true,"k":"t","d":[516],"c":[]}]]}],["e",{"w":"winner","s":"er","e":true,"k":"e","d":[127,516],"c":[["s",{"w":"winners","s":"s","e":true,"k":"s","d":[73,516],"c":[["p",{"w":"winnerspend","s":"pend","e":true,"k":"p","d":[127],"c":[]}]]}],["-",{"w":"winner-id","s":"-id","e":true,"k":"-","d":[202],"c":[]}],["'",{"w":"winner's","s":"'s","e":true,"k":"'","d":[516],"c":[]}]]}]]}]]}],["s",{"w":"wish","s":"sh","e":true,"k":"s","d":[48,49,52,71,75,426,444],"c":[]}],["d",{"w":"wid","s":"d","e":false,"k":"d","d":[],"c":[["e",{"w":"wide","s":"e","e":true,"k":"e","d":[69,123,156,354],"c":[["l",{"w":"widely","s":"ly","e":true,"k":"l","d":[80],"c":[]}]]}],["t",{"w":"width","s":"th","e":true,"k":"t","d":[70,72,174,259],"c":[]}]]}],["r",{"w":"wire","s":"re","e":true,"k":"r","d":[229],"c":[["t",{"w":"wiretype","s":"type","e":true,"k":"t","d":[229],"c":[]}],["-",{"w":"wire-format","s":"-format","e":true,"k":"-","d":[229],"c":[]}]]}],["z",{"w":"wizard","s":"zard","e":true,"k":"z","d":[510],"c":[]}]]}],["e",{"w":"we","s":"e","e":true,"k":"e","d":[9,12,13,14,22,28,49,52,58,69,71,73,74,219,222,224,226,229,234,237,238,239,240,241,245,348,355,368,371,377,422,425,443,515,517],"c":[["e",{"w":"week","s":"ek","e":true,"k":"e","d":[73],"c":[["l",{"w":"weekly","s":"ly","e":true,"k":"l","d":[2,8,18,31,45,54,74,203,204,208,225,228,257,345,347,349,350,373,399,422,425,427,443,459,502],"c":[]}],["s",{"w":"weeks","s":"s","e":true,"k":"s","d":[13],"c":[]}]]}],["d",{"w":"wednesday","s":"dnesday","e":true,"k":"d","d":[2,8,18,31,45,54,203,204,208,225,228,257,345,347,349,350,373,399,459,502],"c":[]}],["'",{"w":"we'","s":"'","e":false,"k":"'","d":[],"c":[["l",{"w":"we'll","s":"ll","e":true,"k":"l","d":[9,68,69,73,515],"c":[]}],["r",{"w":"we're","s":"re","e":true,"k":"r","d":[12,71,78,102,176,191,224,229,245,348],"c":[]}],["v",{"w":"we've","s":"ve","e":true,"k":"v","d":[49,68,69,71],"c":[]}]]}],["r",{"w":"were","s":"re","e":true,"k":"r","d":[14,68,71,161,229,231,238,355],"c":[]}],["l",{"w":"wel","s":"l","e":false,"k":"l","d":[],"c":[["l",{"w":"well","s":"l","e":true,"k":"l","d":[22,27,31,71,73,145,147,224,226,234,350,355,368],"c":[["-",{"w":"well-","s":"-","e":false,"k":"-","d":[],"c":[["e",{"w":"well-equipped","s":"equipped","e":true,"k":"e","d":[68],"c":[]}],["t",{"w":"well-typed","s":"typed","e":true,"k":"t","d":[226,234,368],"c":[]}]]}]]}],["c",{"w":"welcome","s":"come","e":true,"k":"c","d":[53,69,182],"c":[]}]]}],["b",{"w":"web","s":"b","e":true,"k":"b","d":[44,67,226,227,228,229,239,242,244,350,352,355,356,357,366,376],"c":[["h",{"w":"webhook","s":"hook","e":true,"k":"h","d":[51,379],"c":[["-",{"w":"webhook-like","s":"-like","e":true,"k":"-","d":[45],"c":[]}],["s",{"w":"webhooksite","s":"site","e":true,"k":"s","d":[379],"c":[]}]]}],["s",{"w":"websocket","s":"socket","e":true,"k":"s","d":[64,65,365,382,383,384,385,386,387],"c":[["s",{"w":"websockets","s":"s","e":true,"k":"s","d":[65,365],"c":[]}]]}],["-",{"w":"web-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"web-share","s":"share","e":true,"k":"s","d":[70,72],"c":[]}],["b",{"w":"web-based","s":"based","e":true,"k":"b","d":[226,227],"c":[]}]]}],["3",{"w":"web3","s":"3","e":true,"k":"3","d":[71],"c":[]}],["c",{"w":"webcrypto","s":"crypto","e":true,"k":"c","d":[232],"c":[]}]]}],["i",{"w":"weights","s":"ights","e":true,"k":"i","d":[77,219,222],"c":[]}],["n",{"w":"went","s":"nt","e":true,"k":"n","d":[258],"c":[]}]]}],["w",{"w":"www","s":"ww","e":true,"k":"w","d":[2,8,18,31,45,50,54,67,70,72,73,203,204,208,225,226,227,228,257,259,345,347,349,350,371,373,399,459,502,510],"c":[]}],["-",{"w":"w-","s":"-","e":false,"k":"-","d":[],"c":[["f",{"w":"w-full","s":"full","e":true,"k":"f","d":[4,358,362,377,379],"c":[]}],["m",{"w":"w-max'","s":"max'","e":true,"k":"m","d":[230,244,353],"c":[]}]]}],["o",{"w":"wo","s":"o","e":false,"k":"o","d":[],"c":[["r",{"w":"wor","s":"r","e":false,"k":"r","d":[],"c":[["l",{"w":"world","s":"ld","e":true,"k":"l","d":[6,7,22,68,69,224,230,353,356,360,361,366,374],"c":[["'",{"w":"world'","s":"'","e":true,"k":"'","d":[6,354,360],"c":[]}]]}],["k",{"w":"work","s":"k","e":true,"k":"k","d":[12,14,28,49,50,90,116,168,180,219,224,244,245,348,374,376],"c":[["i",{"w":"working","s":"ing","e":true,"k":"i","d":[68,76,87,90,113,114,116,127,133,144,154,158,161,168,179,180,182,201,236,244,355,370,375],"c":[["_",{"w":"working_dir","s":"_dir","e":true,"k":"_","d":[17,374,376],"c":[]}]]}],["f",{"w":"workflow","s":"flow","e":true,"k":"f","d":[27],"c":[["s",{"w":"workflows","s":"s","e":true,"k":"s","d":[144],"c":[]}]]}],["s",{"w":"works","s":"s","e":true,"k":"s","d":[71,72,103,182,224,226,234,368],"c":[]}]]}],["r",{"w":"worry","s":"ry","e":true,"k":"r","d":[28,50],"c":[]}],["d",{"w":"word","s":"d","e":true,"k":"d","d":[226,227,517],"c":[["s",{"w":"words","s":"s","e":true,"k":"s","d":[238,239,350,371,372],"c":[]}]]}]]}],["u",{"w":"would","s":"uld","e":true,"k":"u","d":[9,12,14,27,68,69,96,102,126,149,154,161,176,191,224,226,234,245,348,368,376,377,515],"c":[["n",{"w":"wouldn't","s":"n't","e":true,"k":"n","d":[71],"c":[]}]]}],["n",{"w":"won't","s":"n't","e":true,"k":"n","d":[92,219,226,233,234,367,368,509],"c":[]}]]}],["a",{"w":"wa","s":"a","e":false,"k":"a","d":[],"c":[["l",{"w":"wal","s":"l","e":false,"k":"l","d":[],"c":[["l",{"w":"wallet","s":"let","e":true,"k":"l","d":[7,9,27,44,46,49,51,70,71,221,228,232,233,239,240,351,352,353,354,355,356,357,361,366,367,371],"c":[["s",{"w":"wallets","s":"s","e":true,"k":"s","d":[7,28,29,50,233,237,241,242,244,350,351,352,355,356,361,366,367],"c":[]}],["_",{"w":"wallet_","s":"_","e":false,"k":"_","d":[],"c":[["7",{"w":"wallet_7","s":"7","e":true,"k":"7","d":[7,361],"c":[]}],["1",{"w":"wallet_1","s":"1","e":true,"k":"1","d":[7,9,221,224,361],"c":[]}],["3",{"w":"wallet_3","s":"3","e":true,"k":"3","d":[7,221,361],"c":[]}],["5",{"w":"wallet_5","s":"5","e":true,"k":"5","d":[7,361],"c":[]}],["8",{"w":"wallet_8","s":"8","e":true,"k":"8","d":[7,361],"c":[]}],["4",{"w":"wallet_4","s":"4","e":true,"k":"4","d":[7,361],"c":[]}],["6",{"w":"wallet_6","s":"6","e":true,"k":"6","d":[7,361],"c":[]}],["2",{"w":"wallet_2","s":"2","e":true,"k":"2","d":[7,221,361],"c":[]}],["c",{"w":"wallet_connect","s":"connect","e":true,"k":"c","d":[351],"c":[]}]]}],["1",{"w":"wallet1","s":"1","e":true,"k":"1","d":[12,224,245,348],"c":[]}],["-",{"w":"wallet-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"wallet-s","s":"s","e":false,"k":"s","d":[],"c":[["d",{"w":"wallet-sdk","s":"dk","e":true,"k":"d","d":[232,240,244],"c":[["'",{"w":"wallet-sdk'","s":"'","e":true,"k":"'","d":[239],"c":[]}]]}],["p",{"w":"wallet-specific","s":"pecific","e":true,"k":"p","d":[356,366],"c":[]}]]}],["t",{"w":"wallet-to-dapp","s":"to-dapp","e":true,"k":"t","d":[355],"c":[]}]]}],["p",{"w":"walletprovider","s":"provider","e":true,"k":"p","d":[233,367],"c":[]}]]}],["k",{"w":"walk","s":"k","e":true,"k":"k","d":[12,47,69,180,245,348],"c":[["t",{"w":"walkthrough","s":"through","e":true,"k":"t","d":[68],"c":[]}],["s",{"w":"walks","s":"s","e":true,"k":"s","d":[69,71],"c":[]}]]}]]}],["s",{"w":"was","s":"s","e":true,"k":"s","d":[9,12,14,15,17,24,68,123,136,144,156,161,180,219,223,224,229,230,238,245,246,258,348,355,375,377,511,513],"c":[["m",{"w":"wasm","s":"m","e":true,"k":"m","d":[219],"c":[["_",{"w":"wasm_module","s":"_module","e":true,"k":"_","d":[7,361],"c":[]}]]}],["n",{"w":"wasn't","s":"n't","e":true,"k":"n","d":[144,229],"c":[]}],["-",{"w":"was-price-above-at-block","s":"-price-above-at-block","e":true,"k":"-","d":[161],"c":[]}],["t",{"w":"waste","s":"te","e":true,"k":"t","d":[373,422,502],"c":[]}]]}],["r",{"w":"war","s":"r","e":false,"k":"r","d":[],"c":[["n",{"w":"warn","s":"n","e":true,"k":"n","d":[8,10,16,24,68,69,71,374,375,376,377,379,515],"c":[["i",{"w":"warning","s":"ing","e":true,"k":"i","d":[16,226,234,368,377],"c":[["s",{"w":"warnings","s":"s","e":true,"k":"s","d":[21],"c":[]}]]}]]}],["r",{"w":"warrior","s":"rior","e":true,"k":"r","d":[239],"c":[]}]]}],["y",{"w":"way","s":"y","e":true,"k":"y","d":[49,51,54,68,69,71,79,82,83,84,85,89,94,96,98,101,103,105,106,107,109,111,116,117,118,119,121,123,125,131,132,134,135,138,141,142,143,144,148,150,151,153,155,157,159,162,164,165,166,167,168,169,170,171,172,173,175,180,181,182,183,184,185,186,188,189,190,194,195,197,198,199,200,219,220,229,259,355,356,366,515,516],"c":[["s",{"w":"ways","s":"s","e":true,"k":"s","d":[9,14,47,52,104],"c":[]}]]}],["n",{"w":"want","s":"nt","e":true,"k":"n","d":[9,12,46,47,48,49,50,51,52,68,71,176,188,191,201,224,226,229,234,239,243,245,348,356,366,368,371,376,377,379,427,459,515,517],"c":[["s",{"w":"wants","s":"s","e":true,"k":"s","d":[27,69],"c":[]}],["e",{"w":"wanted","s":"ed","e":true,"k":"e","d":[371],"c":[]}]]}],["t",{"w":"watch","s":"tch","e":true,"k":"t","d":[9,374,376],"c":[]}],["i",{"w":"wait","s":"it","e":true,"k":"i","d":[19,515],"c":[]}]]}],["r",{"w":"wr","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"writ","s":"it","e":false,"k":"i","d":[],"c":[["e",{"w":"write","s":"e","e":true,"k":"e","d":[8,9,11,12,18,22,26,30,55,134,174,224,238,245,348,381,505,517],"c":[["_",{"w":"write_","s":"_","e":false,"k":"_","d":[],"c":[["l",{"w":"write_length","s":"length","e":true,"k":"l","d":[9],"c":[]}],["c",{"w":"write_count","s":"count","e":true,"k":"c","d":[9],"c":[]}]]}],["-",{"w":"write-smart-contracts","s":"-smart-contracts","e":true,"k":"-","d":[226,234,368],"c":[]}]]}],["i",{"w":"writing","s":"ing","e":true,"k":"i","d":[9,12,22,30,183,201,245,348],"c":[]}],["t",{"w":"written","s":"ten","e":true,"k":"t","d":[72],"c":[]}]]}],["a",{"w":"wrap","s":"ap","e":true,"k":"a","d":[379,517],"c":[["-",{"w":"wrap-","s":"-","e":false,"k":"-","d":[],"c":[["b",{"w":"wrap-btc","s":"btc","e":true,"k":"b","d":[27],"c":[]}],["i",{"w":"wrap-in-optional","s":"in-optional","e":true,"k":"i","d":[168],"c":[]}]]}],["p",{"w":"wrappe","s":"pe","e":false,"k":"p","d":[],"c":[["d",{"w":"wrapped","s":"d","e":true,"k":"d","d":[168,180],"c":[]}],["r",{"w":"wrapper","s":"r","e":true,"k":"r","d":[229],"c":[]}]]}]]}],["o",{"w":"wro","s":"o","e":false,"k":"o","d":[],"c":[["t",{"w":"wrote","s":"te","e":true,"k":"t","d":[69],"c":[]}],["n",{"w":"wrong","s":"ng","e":true,"k":"n","d":[96,149,258],"c":[["l",{"w":"wrongly-typed","s":"ly-typed","e":true,"k":"l","d":[226,234,368],"c":[]}]]}]]}]]}],["g",{"w":"wget","s":"get","e":true,"k":"g","d":[18,517],"c":[]}],["b",{"w":"wbip","s":"bip","e":false,"k":"b","d":[],"c":[["s",{"w":"wbips","s":"s","e":true,"k":"s","d":[355],"c":[]}],["p",{"w":"wbipprovider","s":"provider","e":true,"k":"p","d":[356,366],"c":[]}]]}],["p",{"w":"wpkh","s":"pkh","e":true,"k":"p","d":[371],"c":[]}],["s",{"w":"wsl","s":"sl","e":true,"k":"s","d":[510],"c":[]}]]}],["h",{"w":"h","s":"h","e":false,"k":"h","d":[],"c":[["a",{"w":"ha","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"hand","s":"nd","e":false,"k":"n","d":[],"c":[["l",{"w":"handl","s":"l","e":false,"k":"l","d":[],"c":[["e",{"w":"handle","s":"e","e":true,"k":"e","d":[45,49,65,67,68,77,79,83,84,85,86,87,88,93,94,98,99,101,103,104,106,109,110,111,112,115,117,118,119,120,121,123,124,126,127,131,133,135,136,137,138,139,140,141,142,143,144,146,147,148,150,151,153,157,158,159,162,164,166,167,168,169,170,172,175,178,179,180,181,183,184,186,193,194,195,198,199,200,201,230,239,353,356,366,439,462,511,513,516],"c":[["s",{"w":"handles","s":"s","e":true,"k":"s","d":[2,8,18,45,53,72,121,166,203,204,225,347,349,350,356,366,422,502,516],"c":[]}],["p",{"w":"handlependingsignin","s":"pendingsignin","e":true,"k":"p","d":[67,226,227],"c":[]}],["d",{"w":"handled","s":"d","e":true,"k":"d","d":[103,110,124,136,139,146,160],"c":[]}],["-",{"w":"handle-t","s":"-t","e":false,"k":"-","d":[],"c":[["h",{"w":"handle-the-results","s":"he-results","e":true,"k":"h","d":[230],"c":[]}],["r",{"w":"handle-transaction-results","s":"ransaction-results","e":true,"k":"r","d":[353],"c":[]}]]}],["t",{"w":"handletransaction","s":"transaction","e":true,"k":"t","d":[353],"c":[]}]]}],["i",{"w":"handling","s":"ing","e":true,"k":"i","d":[9,65,67,69,77,78,82,83,84,85,86,87,88,89,90,91,93,94,95,97,98,100,101,103,104,105,106,107,109,110,111,112,116,117,118,120,121,123,124,126,127,131,132,133,135,136,138,139,141,142,143,144,145,146,147,148,149,150,151,152,153,155,156,157,158,159,162,163,164,165,166,167,168,169,170,171,172,173,175,179,180,181,183,184,185,186,189,190,193,194,195,196,197,198,199,200,201,226,227,244,258,356,366,439,462,511,513,516],"c":[["-",{"w":"handling-optionals-and-errors","s":"-optionals-and-errors","e":true,"k":"-","d":[78],"c":[]}]]}]]}],["y",{"w":"handy","s":"y","e":true,"k":"y","d":[12,245,348],"c":[]}],["s",{"w":"hands-on","s":"s-on","e":true,"k":"s","d":[65,439,462],"c":[]}]]}],["s",{"w":"has","s":"s","e":true,"k":"s","d":[6,7,9,18,27,28,30,52,53,68,69,71,72,76,81,88,113,114,115,120,123,130,143,144,150,164,173,184,193,196,198,202,219,222,224,233,258,259,351,355,356,360,361,366,367,374,377,379,511,513,515],"c":[["-",{"w":"has-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"has-contributed","s":"contributed","e":true,"k":"c","d":[6,360],"c":[]}],["p",{"w":"has-permission","s":"permission","e":true,"k":"p","d":[76,130],"c":[]}],["s",{"w":"has-setting","s":"setting","e":true,"k":"s","d":[76],"c":[]}],["r",{"w":"has-role","s":"role","e":true,"k":"r","d":[113],"c":[]}],["f",{"w":"has-flag","s":"flag","e":true,"k":"f","d":[187],"c":[]}]]}],["p",{"w":"hasparticipated","s":"participated","e":true,"k":"p","d":[7,361],"c":[]}],["h",{"w":"hash","s":"h","e":true,"k":"h","d":[16,22,80,84,91,95,104,111,127,128,156,161,162,169,181,188,219,222,262,377],"c":[["e",{"w":"hashe","s":"e","e":false,"k":"e","d":[],"c":[["a",{"w":"hashead","s":"ad","e":true,"k":"a","d":[32,34,35,36,37,38,39,41,42,43,57,60,61,62,63,206,207,210,212,214,215,216,218,249,251,252,253,254,260,261,262,264,265,266,267,268,269,270,271,272,274,275,276,277,278,279,281,283,284,285,286,287,289,290,291,292,293,295,296,297,298,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,319,320,321,322,323,324,325,326,327,328,329,330,332,333,335,336,338,340,342,343,344,389,391,392,393,395,396,398,401,402,405,407,408,409,410,411,413,414,415,416,418,429,430,432,433,435,436,437,438,441,442,446,447,449,450,451,452,454,455,456,457,458,461,464,465,469,470,472,473,475,476,477,478,480,481,483,484,486,487,488,489,491,492,493,494,495,497,499,500],"c":[]}],["s",{"w":"hashes","s":"s","e":true,"k":"s","d":[80,84,91,95,104,111,156,161,162,169,181,188],"c":[]}],["d",{"w":"hashed","s":"d","e":true,"k":"d","d":[188,371],"c":[["-",{"w":"hashed-key","s":"-key","e":true,"k":"-","d":[80],"c":[]}]]}]]}],["i",{"w":"hashing","s":"ing","e":true,"k":"i","d":[80,84,91,111,128,145,174,181,187,188],"c":[]}],["-",{"w":"hash-","s":"-","e":false,"k":"-","d":[],"c":[["u",{"w":"hash-user-data","s":"user-data","e":true,"k":"u","d":[91],"c":[]}],["b",{"w":"hash-b","s":"b","e":false,"k":"b","d":[],"c":[["y",{"w":"hash-bytes","s":"ytes","e":true,"k":"y","d":[141,200],"c":[]}],["a",{"w":"hash-based","s":"ased","e":true,"k":"a","d":[188],"c":[]}]]}]]}],["1",{"w":"hash160","s":"160","e":true,"k":"1","d":[91,162,169,188],"c":[]}],["b",{"w":"hashbytes","s":"bytes","e":true,"k":"b","d":[95,200],"c":[]}]]}],["s",{"w":"hassle-free","s":"sle-free","e":true,"k":"s","d":[49],"c":[]}],["n",{"w":"hasn't","s":"n't","e":true,"k":"n","d":[80,123],"c":[]}],["v",{"w":"hasvoted","s":"voted","e":true,"k":"v","d":[377],"c":[]}]]}],["v",{"w":"hav","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"have","s":"e","e":true,"k":"e","d":[6,7,12,15,16,18,24,28,46,47,49,50,51,52,53,55,68,69,71,73,75,77,78,81,122,144,149,150,161,166,184,189,190,219,221,224,226,227,229,234,238,240,241,245,246,346,348,360,361,368,373,374,376,377,379,423,511,513,515,516,517],"c":[["n",{"w":"haven't","s":"n't","e":true,"k":"n","d":[47,71,423],"c":[]}]]}],["i",{"w":"having","s":"ing","e":true,"k":"i","d":[73],"c":[]}]]}],["l",{"w":"hal","s":"l","e":false,"k":"l","d":[],"c":[["f",{"w":"half","s":"f","e":true,"k":"f","d":[12,245,348],"c":[]}],["t",{"w":"halt","s":"t","e":true,"k":"t","d":[201],"c":[]}]]}],["p",{"w":"happen","s":"ppen","e":false,"k":"p","d":[],"c":[["s",{"w":"happens","s":"s","e":true,"k":"s","d":[22,26,69],"c":[]}],["i",{"w":"happening","s":"ing","e":true,"k":"i","d":[26,355],"c":[]}],["e",{"w":"happened","s":"ed","e":true,"k":"e","d":[68],"c":[]}]]}],["c",{"w":"hack","s":"ck","e":true,"k":"c","d":[68,69,71,73],"c":[["b",{"w":"hackbadge","s":"badge","e":true,"k":"b","d":[68,69,71],"c":[]}],["s",{"w":"hacks","s":"s","e":true,"k":"s","d":[68,70,72,73],"c":[]}],["a",{"w":"hackathon","s":"athon","e":true,"k":"a","d":[233,367],"c":[["s",{"w":"hackathons","s":"s","e":true,"k":"s","d":[73],"c":[]}]]}],["e",{"w":"hacker","s":"er","e":true,"k":"e","d":[73],"c":[]}],["i",{"w":"hacking","s":"ing","e":true,"k":"i","d":[73],"c":[]}]]}],["r",{"w":"har","s":"r","e":false,"k":"r","d":[],"c":[["d",{"w":"hard","s":"d","e":true,"k":"d","d":[108,113,196,221,515],"c":[["e",{"w":"harder","s":"er","e":true,"k":"e","d":[124,136,152,193],"c":[]}]]}],["p",{"w":"harper","s":"per","e":true,"k":"p","d":[142,144],"c":[]}]]}],["d",{"w":"had","s":"d","e":true,"k":"d","d":[180],"c":[]}]]}],["e",{"w":"he","s":"e","e":false,"k":"e","d":[],"c":[["l",{"w":"hel","s":"l","e":false,"k":"l","d":[],"c":[["p",{"w":"help","s":"p","e":true,"k":"p","d":[2,8,18,31,45,47,52,54,68,69,70,72,73,74,78,164,203,204,208,225,226,228,234,257,345,347,349,350,368,373,377,378,399,422,425,427,443,459,502],"c":[["e",{"w":"helper","s":"er","e":true,"k":"e","d":[6,7,9,71,72,129,134,177,224,226,228,229,233,234,238,360,361,367,368],"c":[["s",{"w":"helpers","s":"s","e":true,"k":"s","d":[6,28,224,229,231,233,236,360,367,370],"c":[]}]]}],["s",{"w":"helps","s":"s","e":true,"k":"s","d":[9,70,201,351,427,459,511,513],"c":[]}],["i",{"w":"helping","s":"ing","e":true,"k":"i","d":[12,224,245,348],"c":[]}],["f",{"w":"helpful","s":"ful","e":true,"k":"f","d":[354,378],"c":[]}]]}],["l",{"w":"hello","s":"lo","e":true,"k":"l","d":[6,7,22,182,230,353,360,361,374],"c":[["-",{"w":"hello-world","s":"-world","e":true,"k":"-","d":[6,7,243,360,361],"c":[]}]]}],["d",{"w":"held","s":"d","e":true,"k":"d","d":[427,459],"c":[]}]]}],["i",{"w":"height","s":"ight","e":true,"k":"i","d":[5,7,14,17,69,70,72,95,104,114,127,156,202,219,221,222,259,269,359,361,372,376,377,511,513,516],"c":[["s",{"w":"heights","s":"s","e":true,"k":"s","d":[104,127,372],"c":[]}],["_",{"w":"height_or_hash","s":"_or_hash","e":true,"k":"_","d":[206,219,222,260,264,314,336],"c":[]}]]}],["x",{"w":"hex","s":"x","e":true,"k":"x","d":[6,51,226,233,234,239,351,353,360,367,368,371,372,517],"c":[["t",{"w":"hextocv","s":"tocv","e":true,"k":"t","d":[226,234,368,514],"c":[]}],["-",{"w":"hex-","s":"-","e":false,"k":"-","d":[],"c":[["e",{"w":"hex-encoded","s":"encoded","e":true,"k":"e","d":[229,351],"c":[]}],["s",{"w":"hex-strings","s":"strings","e":true,"k":"s","d":[229],"c":[]}]]}]]}],["r",{"w":"her","s":"r","e":false,"k":"r","d":[],"c":[["e",{"w":"here","s":"e","e":true,"k":"e","d":[8,27,30,46,50,53,67,68,69,70,72,81,102,108,129,154,176,191,219,221,224,226,227,230,232,233,243,255,352,367,374,376,377,378,379,517],"c":[["'",{"w":"here's","s":"'s","e":true,"k":"'","d":[9,68,69,238,353],"c":[]}]]}],["o",{"w":"heroimage","s":"oimage","e":true,"k":"o","d":[44,466],"c":[]}]]}],["a",{"w":"header","s":"ader","e":true,"k":"a","d":[52,95,104,127,156,227,236,370],"c":[["s",{"w":"headers","s":"s","e":true,"k":"s","d":[52,65,227,236,370,439,462,509],"c":[]}],["-",{"w":"header-hash","s":"-hash","e":true,"k":"-","d":[95,104,156,161],"c":[]}]]}],["y",{"w":"hey","s":"y","e":true,"k":"y","d":[517],"c":[]}]]}],["t",{"w":"ht","s":"t","e":false,"k":"t","d":[],"c":[["t",{"w":"http","s":"tp","e":true,"k":"t","d":[14,15,17,27,64,233,259,365,367,374,376,379,382,383,384,385,386,387,514],"c":[["s",{"w":"https","s":"s","e":true,"k":"s","d":[2,8,9,12,13,14,15,17,18,22,27,28,31,45,46,48,49,50,51,54,68,69,70,71,72,73,74,75,78,203,204,208,219,220,221,223,224,225,226,228,229,230,232,234,235,236,243,245,257,259,345,346,347,348,349,350,352,353,355,356,366,368,369,370,371,373,374,376,377,379,380,399,424,425,427,443,459,466,502,504,509,510,514,515,517],"c":[]}],["_",{"w":"http_","s":"_","e":false,"k":"_","d":[],"c":[["p",{"w":"http_po","s":"po","e":false,"k":"p","d":[],"c":[["s",{"w":"http_post","s":"st","e":true,"k":"s","d":[52,68,374,375,376,379],"c":[]}],["r",{"w":"http_port","s":"rt","e":true,"k":"r","d":[374,376],"c":[]}]]}],["a",{"w":"http_api","s":"api","e":true,"k":"a","d":[374,376],"c":[]}]]}]]}],["m",{"w":"html","s":"ml","e":true,"k":"m","d":[9,22,27],"c":[]}]]}],["i",{"w":"hi","s":"i","e":true,"k":"i","d":[353],"c":[["r",{"w":"hiro","s":"ro","e":true,"k":"r","d":[2,8,13,14,15,16,17,18,28,31,44,45,46,47,48,49,50,51,52,53,54,58,65,67,68,72,73,74,203,204,208,219,220,223,225,228,257,258,345,347,349,350,352,356,365,366,371,373,374,376,377,378,379,399,422,425,427,443,459,466,502,514,517],"c":[["s",{"w":"hirosystems","s":"systems","e":true,"k":"s","d":[4,7,10,12,14,18,27,58,68,69,71,72,75,219,221,224,229,232,234,235,236,245,246,259,348,358,361,362,368,369,370,380,424,502,504],"c":[]}],["'",{"w":"hiro's","s":"'s","e":true,"k":"'","d":[14,17,208,399,466],"c":[]}],["-",{"w":"hiro-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"hiro-p","s":"p","e":false,"k":"p","d":[],"c":[["l",{"w":"hiro-platform","s":"latform","e":true,"k":"l","d":[31,45,46],"c":[]}],["b",{"w":"hiro-pbc","s":"bc","e":true,"k":"b","d":[46],"c":[]}]]}],["h",{"w":"hiro-hacks-","s":"hacks-","e":false,"k":"h","d":[],"c":[["t",{"w":"hiro-hacks-template","s":"template","e":true,"k":"t","d":[69,71],"c":[]}],["r",{"w":"hiro-hacks-rules","s":"rules","e":true,"k":"r","d":[73],"c":[]}]]}],["s",{"w":"hiro-so","s":"so","e":true,"k":"s","d":[230,243,352,374],"c":[]}],["m",{"w":"hiro-maintained","s":"maintained","e":true,"k":"m","d":[399],"c":[]}]]}],["_",{"w":"hiro_api_key","s":"_api_key","e":true,"k":"_","d":[58],"c":[["'",{"w":"hiro_api_key'","s":"'","e":true,"k":"'","d":[58],"c":[]}]]}],["h",{"w":"hirohacks25","s":"hacks25","e":true,"k":"h","d":[70,72,73],"c":[]}]]}],["t",{"w":"hit","s":"t","e":false,"k":"t","d":[],"c":[["t",{"w":"hitting","s":"ting","e":true,"k":"t","d":[26],"c":[]}],["s",{"w":"hits","s":"s","e":true,"k":"s","d":[51],"c":[]}]]}],["s",{"w":"histor","s":"stor","e":false,"k":"s","d":[],"c":[["y",{"w":"history","s":"y","e":true,"k":"y","d":[51,70,156,161,259],"c":[["-",{"w":"history-dependent","s":"-dependent","e":true,"k":"-","d":[161],"c":[]}],["'",{"w":"history'","s":"'","e":true,"k":"'","d":[344],"c":[]}]]}],["i",{"w":"histori","s":"i","e":false,"k":"i","d":[],"c":[["c",{"w":"historical","s":"cal","e":true,"k":"c","d":[55,95,104,127,156,161,202,376],"c":[]}],["e",{"w":"histories","s":"es","e":true,"k":"e","d":[371,372],"c":[]}]]}]]}],["g",{"w":"high","s":"gh","e":true,"k":"g","d":[69,177],"c":[["l",{"w":"highl","s":"l","e":false,"k":"l","d":[],"c":[["y",{"w":"highly","s":"y","e":true,"k":"y","d":[75],"c":[]}],["i",{"w":"highlight","s":"ight","e":true,"k":"i","d":[229,517],"c":[]}]]}],["e",{"w":"highe","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"higher","s":"r","e":true,"k":"r","d":[114,375],"c":[["-",{"w":"higher-level","s":"-level","e":true,"k":"-","d":[76],"c":[]}],["_",{"w":"higher_than","s":"_than","e":true,"k":"_","d":[372],"c":[]}]]}],["s",{"w":"highest","s":"st","e":true,"k":"s","d":[114],"c":[["b",{"w":"highestbidder","s":"bidder","e":true,"k":"b","d":[114],"c":[]}]]}]]}],["-",{"w":"high-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"high-precision","s":"precision","e":true,"k":"p","d":[77],"c":[]}],["l",{"w":"high-level","s":"level","e":true,"k":"l","d":[233,367],"c":[]}]]}]]}],["d",{"w":"hid","s":"d","e":false,"k":"d","d":[],"c":[["e",{"w":"hide","s":"e","e":true,"k":"e","d":[71],"c":[]}],["d",{"w":"hidden","s":"den","e":true,"k":"d","d":[129],"c":[]}]]}],["k",{"w":"hike","s":"ke","e":true,"k":"k","d":[517],"c":[]}]]}],["o",{"w":"ho","s":"o","e":false,"k":"o","d":[],"c":[["u",{"w":"hou","s":"u","e":false,"k":"u","d":[],"c":[["r",{"w":"hour","s":"r","e":true,"k":"r","d":[14,15],"c":[["s",{"w":"hours","s":"s","e":true,"k":"s","d":[2,8,18,31,45,54,74,104,127,156,202,203,204,208,225,228,257,345,347,349,350,373,399,422,425,427,443,459,502,515],"c":[]}]]}],["s",{"w":"house","s":"se","e":true,"k":"s","d":[73],"c":[]}]]}],["w",{"w":"how","s":"w","e":true,"k":"w","d":[8,9,11,12,22,26,27,30,47,49,50,51,52,53,55,65,68,69,71,72,76,77,79,80,81,201,202,219,224,229,230,231,232,234,235,236,237,241,243,245,246,256,348,352,353,354,356,357,366,368,369,370,371,374,375,376,377,378,379,381,423,439,462,501,502,504,505,509,510,511,513,515,516],"c":[["e",{"w":"however","s":"ever","e":true,"k":"e","d":[20,27,49,52,68,69,71,86,99,100,115,130,145,161,174,187,226,234,368],"c":[]}]]}],["l",{"w":"hold","s":"ld","e":true,"k":"l","d":[71,515],"c":[["s",{"w":"holds","s":"s","e":true,"k":"s","d":[12,224,241,245,348,377],"c":[]}],["e",{"w":"holder","s":"er","e":true,"k":"e","d":[69,71],"c":[["s",{"w":"holders","s":"s","e":true,"k":"s","d":[68,69,427,432,472],"c":[["'",{"w":"holders'","s":"'","e":true,"k":"'","d":[340,433,447,473,484],"c":[]}]]}],["'",{"w":"holder's","s":"'s","e":true,"k":"'","d":[71],"c":[]}]]}],["i",{"w":"holding","s":"ing","e":true,"k":"i","d":[69,229,354],"c":[["s",{"w":"holdings","s":"s","e":true,"k":"s","d":[143,190],"c":[["'",{"w":"holdings'","s":"'","e":true,"k":"'","d":[342],"c":[]}]]}]]}]]}],["v",{"w":"hover","s":"ver","e":true,"k":"v","d":[13,45,52,74,230,425,443],"c":[["i",{"w":"hovering","s":"ing","e":true,"k":"i","d":[52],"c":[]}]]}],["s",{"w":"host","s":"st","e":true,"k":"s","d":[73,374,376,422,504],"c":[["e",{"w":"hosted","s":"ed","e":true,"k":"e","d":[31,44,50,223,466],"c":[]}]]}],["n",{"w":"hone","s":"ne","e":true,"k":"n","d":[51],"c":[]}],["m",{"w":"hom","s":"m","e":false,"k":"m","d":[],"c":[["e",{"w":"home","s":"e","e":false,"k":"e","d":[],"c":[["b",{"w":"homebrew","s":"brew","e":true,"k":"b","d":[75],"c":[]}],["s",{"w":"homescreen","s":"screen","e":true,"k":"s","d":[232],"c":[]}]]}],["o",{"w":"homogene","s":"ogene","e":false,"k":"o","d":[],"c":[["o",{"w":"homogeneous","s":"ous","e":true,"k":"o","d":[226,234,368],"c":[]}],["i",{"w":"homogeneity","s":"ity","e":true,"k":"i","d":[226,234,368],"c":[]}]]}]]}],["o",{"w":"hoo","s":"o","e":false,"k":"o","d":[],"c":[["k",{"w":"hook","s":"k","e":true,"k":"k","d":[227,236,370],"c":[["s",{"w":"hooks","s":"s","e":true,"k":"s","d":[355,375],"c":[]}]]}],["d",{"w":"hood","s":"d","e":true,"k":"d","d":[355],"c":[]}]]}]]}],["r",{"w":"href","s":"ref","e":true,"k":"r","d":[8,9,11,12,13,18,22,26,27,30,31,44,45,47,53,54,74,78,208,224,228,230,231,232,239,243,245,246,256,348,350,352,353,354,357,373,374,376,377,378,379,381,399,420,423,425,427,443,459,466,501,502,504,505,508,509,510,511,513,515,516],"c":[]}],["s",{"w":"hsl","s":"sl","e":true,"k":"s","d":[9,20,375,517],"c":[]}],["u",{"w":"hu","s":"u","e":false,"k":"u","d":[],"c":[["m",{"w":"human-readable","s":"man-readable","e":true,"k":"m","d":[9,88,120,229],"c":[]}],["n",{"w":"hundred","s":"ndred","e":true,"k":"n","d":[14,17],"c":[]}],["b",{"w":"hub","s":"b","e":true,"k":"b","d":[352,356,366,502],"c":[]}]]}],["4",{"w":"h4","s":"4","e":true,"k":"4","d":[11,44,256,381,466,501,505],"c":[]}],["2",{"w":"h2","s":"2","e":true,"k":"2","d":[67,226,227,371,372],"c":[]}],["d",{"w":"hd16484710","s":"d16484710","e":true,"k":"d","d":[74,425,443],"c":[]}],["-",{"w":"h-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"h-auto","s":"auto","e":true,"k":"a","d":[352],"c":[]}],["f",{"w":"h-full","s":"full","e":true,"k":"f","d":[352],"c":[]}]]}],["y",{"w":"hyper-v","s":"yper-v","e":true,"k":"y","d":[510],"c":[]}]]}],["n",{"w":"n","s":"n","e":true,"k":"n","d":[26,105,106,107,145,155,165],"c":[["e",{"w":"ne","s":"e","e":false,"k":"e","d":[],"c":[["e",{"w":"need","s":"ed","e":true,"k":"e","d":[2,8,9,12,14,15,16,18,28,31,44,45,50,53,54,55,58,67,68,69,71,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,208,219,221,224,225,226,227,228,229,234,235,237,245,257,345,347,348,349,350,353,354,355,356,366,368,369,373,374,375,376,377,378,399,422,425,427,443,459,466,502,510,514,515,517],"c":[["e",{"w":"needed","s":"ed","e":true,"k":"e","d":[7,31,50,68,75,79,80,87,92,100,102,107,179,226,227,229,232,233,234,235,236,351,352,355,356,361,366,367,368,369,370],"c":[]}],["s",{"w":"needs","s":"s","e":true,"k":"s","d":[19,22,50,55,68,89,97,100,102,112,129,137,140,221,223],"c":[]}],["i",{"w":"needing","s":"ing","e":true,"k":"i","d":[80],"c":[]}]]}],["t",{"w":"net","s":"t","e":false,"k":"t","d":[],"c":[["w",{"w":"network","s":"work","e":true,"k":"w","d":[4,8,9,14,15,16,17,18,19,24,25,27,30,46,49,50,52,68,69,71,202,208,219,220,222,223,226,227,229,230,232,233,234,235,236,237,241,242,243,244,296,350,355,356,357,358,362,366,367,368,369,370,374,375,376,377,378,379,399,509,516],"c":[["s",{"w":"networks","s":"s","e":true,"k":"s","d":[19,25,55,68,229,241,374,376,377,378,379,509],"c":[]}],["'",{"w":"network'","s":"'","e":true,"k":"'","d":[226,227,229,234,235,236,368,369,370],"c":[["s",{"w":"network's","s":"s","e":true,"k":"s","d":[355],"c":[]}]]}],["i",{"w":"networking","s":"ing","e":true,"k":"i","d":[229],"c":[]}],["_",{"w":"network_block_time","s":"_block_time","e":true,"k":"_","d":[296],"c":[["s",{"w":"network_block_times'","s":"s'","e":true,"k":"s","d":[298],"c":[]}]]}]]}],["l",{"w":"netlify","s":"lify","e":true,"k":"l","d":[355],"c":[]}]]}],["w",{"w":"new","s":"w","e":true,"k":"w","d":[4,5,7,9,12,13,18,20,23,27,29,30,47,50,52,55,58,64,67,68,69,71,73,74,76,78,79,96,97,99,101,115,116,117,122,123,125,135,149,152,156,160,163,167,177,178,183,186,189,190,195,219,220,221,222,223,224,226,227,229,232,233,234,236,245,246,348,355,356,358,359,361,362,365,366,367,368,370,372,374,376,377,378,379,382,383,384,385,386,387,504,514,516,517],"c":[["d",{"w":"newdeployer","s":"deployer","e":true,"k":"d","d":[5,359],"c":[]}],["-",{"w":"new-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"new-count","s":"count","e":true,"k":"c","d":[6,360],"c":[]}],["l",{"w":"new-loan","s":"loan","e":true,"k":"l","d":[12,245,348],"c":[]}],["p",{"w":"new-permission","s":"permission","e":true,"k":"p","d":[76],"c":[]}],["b",{"w":"new-balance","s":"balance","e":true,"k":"b","d":[79],"c":[]}],["e",{"w":"new-element","s":"element","e":true,"k":"e","d":[109],"c":[]}],["a",{"w":"new-address","s":"address","e":true,"k":"a","d":[189],"c":[]}]]}],["s",{"w":"news","s":"s","e":true,"k":"s","d":[219],"c":[["p",{"w":"newspaper","s":"paper","e":true,"k":"p","d":[44,466],"c":[]}]]}],["r",{"w":"newreward","s":"reward","e":true,"k":"r","d":[77],"c":[]}],["a",{"w":"newadmin","s":"admin","e":true,"k":"a","d":[81],"c":[]}],["m",{"w":"newmember","s":"member","e":true,"k":"m","d":[81],"c":[]}],["o",{"w":"newowner","s":"owner","e":true,"k":"o","d":[81],"c":[]}],["e",{"w":"newe","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"newer","s":"r","e":true,"k":"r","d":[86,119,180],"c":[]}],["l",{"w":"newelement","s":"lement","e":true,"k":"l","d":[109],"c":[]}]]}],["l",{"w":"newl","s":"l","e":false,"k":"l","d":[],"c":[["i",{"w":"newlist","s":"ist","e":true,"k":"i","d":[126,180],"c":[["v",{"w":"newlistvalue","s":"value","e":true,"k":"v","d":[180],"c":[]}]]}],["y",{"w":"newly","s":"y","e":true,"k":"y","d":[132,178,186,516],"c":[]}]]}],["y",{"w":"newyorkcitycoin-token-v2","s":"yorkcitycoin-token-v2","e":true,"k":"y","d":[516],"c":[]}],["c",{"w":"newcount","s":"count","e":true,"k":"c","d":[517],"c":[]}]]}],["c",{"w":"necess","s":"cess","e":false,"k":"c","d":[],"c":[["a",{"w":"necessary","s":"ary","e":true,"k":"a","d":[9,18,48,75,123,148,151,161,171,192,199,224,230,232,353,354,357,510],"c":[]}],["i",{"w":"necessity","s":"ity","e":true,"k":"i","d":[149],"c":[]}]]}],["x",{"w":"next","s":"xt","e":true,"k":"x","d":[9,12,26,27,30,45,47,52,53,68,69,71,74,75,90,224,230,231,232,243,245,246,258,348,352,353,354,357,374,376,377,378,379,423,425,426,443,444,504,509,510,511,513,515,516],"c":[["-",{"w":"next-id","s":"-id","e":true,"k":"-","d":[28],"c":[]}],["s",{"w":"nextsignature","s":"signature","e":true,"k":"s","d":[229],"c":[]}],["v",{"w":"nextverification","s":"verification","e":true,"k":"v","d":[229],"c":[]}]]}],["g",{"w":"negat","s":"gat","e":false,"k":"g","d":[],"c":[["i",{"w":"negati","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"negating","s":"ng","e":true,"k":"n","d":[22],"c":[]}],["v",{"w":"negative","s":"ve","e":true,"k":"v","d":[77,87,100,106,107,118,137,140,142,145,165,168,174,179,185,187],"c":[]}],["o",{"w":"negation","s":"on","e":true,"k":"o","d":[155,165],"c":[]}]]}],["e",{"w":"negate","s":"e","e":true,"k":"e","d":[108],"c":[]}]]}],["v",{"w":"never","s":"ver","e":true,"k":"v","d":[55,92,237,258],"c":[]}],["a",{"w":"near","s":"ar","e":true,"k":"a","d":[65,68],"c":[]}],["s",{"w":"nest","s":"st","e":false,"k":"s","d":[],"c":[["e",{"w":"nested","s":"ed","e":true,"k":"e","d":[103,182,196,201],"c":[]}],["i",{"w":"nesting","s":"ing","e":true,"k":"i","d":[182],"c":[]}]]}]]}],["o",{"w":"no","s":"o","e":true,"k":"o","d":[7,14,25,27,49,50,52,79,87,88,101,120,130,133,135,158,159,177,179,198,229,233,238,241,351,355,361,367,377,515],"c":[["n",{"w":"non","s":"n","e":false,"k":"n","d":[],"c":[["e",{"w":"none","s":"e","e":true,"k":"e","d":[6,7,12,28,69,79,83,85,95,103,104,109,114,126,127,131,138,139,141,142,144,146,148,151,156,157,159,166,170,172,173,175,180,183,189,194,195,201,224,226,234,245,348,360,361,368,511,513,516],"c":[["x",{"w":"nonexistent","s":"xistent","e":true,"k":"x","d":[101,195],"c":[]}],["-",{"w":"none-branch","s":"-branch","e":true,"k":"-","d":[170],"c":[]}],["c",{"w":"nonecv","s":"cv","e":true,"k":"c","d":[226,234,368],"c":[]}]]}],["-",{"w":"non-","s":"-","e":false,"k":"-","d":[],"c":[["f",{"w":"non-fungible","s":"fungible","e":true,"k":"f","d":[7,27,31,54,101,122,135,186,195,208,226,229,234,238,361,368,372,399],"c":[["_",{"w":"non-fungible_token_event","s":"_token_event","e":true,"k":"_","d":[52],"c":[]}],["-",{"w":"non-fungible-token-metadata","s":"-token-metadata","e":true,"k":"-","d":[54],"c":[]}]]}],["e",{"w":"non-ex","s":"ex","e":false,"k":"e","d":[],"c":[["h",{"w":"non-exhaustive","s":"haustive","e":true,"k":"h","d":[8],"c":[]}],["i",{"w":"non-existent","s":"istent","e":true,"k":"i","d":[95,104,127,156,195],"c":[]}]]}],["t",{"w":"non-transferable","s":"transferable","e":true,"k":"t","d":[69],"c":[]}],["s",{"w":"non-sequential","s":"sequential","e":true,"k":"s","d":[72],"c":[]}],["n",{"w":"non-negative","s":"negative","e":true,"k":"n","d":[77,106,107,118],"c":[]}],["d",{"w":"non-descriptive","s":"descriptive","e":true,"k":"d","d":[83,164],"c":[]}],["b",{"w":"non-b","s":"b","e":false,"k":"b","d":[],"c":[["u",{"w":"non-buffer","s":"uffer","e":true,"k":"u","d":[91],"c":[]}],["o",{"w":"non-boolean","s":"oolean","e":true,"k":"o","d":[155,165],"c":[]}],["r",{"w":"non-browser","s":"rowser","e":true,"k":"r","d":[226,227],"c":[]}]]}],["i",{"w":"non-integer","s":"integer","e":true,"k":"i","d":[93],"c":[]}],["c",{"w":"non-co","s":"co","e":false,"k":"c","d":[],"c":[["m",{"w":"non-commutative","s":"mmutative","e":true,"k":"m","d":[96],"c":[]}],["n",{"w":"non-contiguous","s":"ntiguous","e":true,"k":"n","d":[258],"c":[]}]]}],["o",{"w":"non-optional","s":"optional","e":true,"k":"o","d":[139,146],"c":[]}],["p",{"w":"non-p","s":"p","e":false,"k":"p","d":[],"c":[["o",{"w":"non-positive","s":"ositive","e":true,"k":"o","d":[143,150,184],"c":[]}],["r",{"w":"non-principal","s":"rincipal","e":true,"k":"r","d":[147],"c":[]}]]}],["u",{"w":"non-u","s":"u","e":false,"k":"u","d":[],"c":[["i",{"w":"non-uint","s":"int","e":true,"k":"i","d":[145,174],"c":[]}],["n",{"w":"non-unique","s":"nique","e":true,"k":"n","d":[186],"c":[]}]]}]]}],["_",{"w":"non_fungible_tokens","s":"_fungible_tokens","e":true,"k":"_","d":[7,361],"c":[]}],["c",{"w":"nonce","s":"ce","e":true,"k":"c","d":[51,98,226,227,232,236,243,255,258,259,370,511,513,517],"c":[["s",{"w":"nonces","s":"s","e":true,"k":"s","d":[258],"c":[["'",{"w":"nonces'","s":"'","e":true,"k":"'","d":[258,326],"c":[]}]]}]]}],["f",{"w":"nonfungible","s":"fungible","e":false,"k":"f","d":[],"c":[["c",{"w":"nonfungibleconditioncode","s":"conditioncode","e":true,"k":"c","d":[226,234,368],"c":[]}],["a",{"w":"nonfungibleassetinfo","s":"assetinfo","e":true,"k":"a","d":[226,234,368],"c":[]}],["p",{"w":"nonfungiblepostcondition","s":"postcondition","e":true,"k":"p","d":[229,238],"c":[["w",{"w":"nonfungiblepostconditionwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}]]}]]}],["t",{"w":"not","s":"t","e":true,"k":"t","d":[12,14,16,22,27,48,49,51,53,68,69,75,76,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,150,151,152,153,154,155,156,157,158,159,160,161,162,163,165,166,167,168,169,170,171,172,173,174,175,177,178,179,180,181,182,183,184,185,186,187,188,189,190,192,193,194,195,196,197,198,199,200,201,219,226,227,229,231,233,234,235,236,238,245,246,258,259,346,348,356,366,367,368,369,370,375,377,399,511,513,516],"c":[["e",{"w":"note","s":"e","e":true,"k":"e","d":[7,9,16,21,25,27,46,48,51,52,67,68,71,75,147,221,222,226,227,231,239,246,352,355,356,361,366,371,374,376,377,378,379,399,444,515,516,517],"c":[["s",{"w":"notes","s":"s","e":true,"k":"s","d":[14,67,226,227,351],"c":[]}]]}],["-",{"w":"not-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"not-prose","s":"prose","e":true,"k":"p","d":[11,44,256,352,381,466,501,505],"c":[]}],["s",{"w":"not-sending","s":"sending","e":true,"k":"s","d":[231],"c":[]}]]}],["i",{"w":"noti","s":"i","e":false,"k":"i","d":[],"c":[["f",{"w":"notif","s":"f","e":false,"k":"f","d":[],"c":[["i",{"w":"notification","s":"ication","e":true,"k":"i","d":[51,377],"c":[["s",{"w":"notifications","s":"s","e":true,"k":"s","d":[51],"c":[]}]]}],["y",{"w":"notify","s":"y","e":true,"k":"y","d":[233,367],"c":[["i",{"w":"notifying","s":"ing","e":true,"k":"i","d":[233,367],"c":[]}],["s",{"w":"notifysbtc","s":"sbtc","e":true,"k":"s","d":[233,367],"c":[]}]]}]]}],["c",{"w":"notice","s":"ce","e":true,"k":"c","d":[376],"c":[]}]]}],["h",{"w":"nothing","s":"hing","e":true,"k":"h","d":[226,234,368],"c":[]}]]}],["d",{"w":"node","s":"de","e":true,"k":"d","d":[8,10,11,13,14,15,17,27,55,208,226,227,229,231,234,243,256,257,345,368,374,376,378,381,399,501,504,505,509,510,515],"c":[["s",{"w":"nodes","s":"s","e":true,"k":"s","d":[14,17,19,50,77,80,202,219,222,244,257,259,345],"c":[["-",{"w":"nodes-and-miners","s":"-and-miners","e":true,"k":"-","d":[17],"c":[]}]]}],["j",{"w":"nodejs","s":"js","e":true,"k":"j","d":[75,232],"c":[["-",{"w":"nodejs-specific","s":"-specific","e":true,"k":"-","d":[232],"c":[]}]]}],["i",{"w":"nodeinfourl","s":"infourl","e":true,"k":"i","d":[227,236,370],"c":[]}],["'",{"w":"node's","s":"'s","e":true,"k":"'","d":[374,376,509],"c":[]}]]}],["w",{"w":"now","s":"w","e":true,"k":"w","d":[9,27,30,46,48,52,53,68,69,71,219,220,224,226,229,232,234,355,368,371,374,376,377,378,515,516],"c":[]}],["-",{"w":"no-","s":"-","e":false,"k":"-","d":[],"c":[["l",{"w":"no-loss","s":"loss","e":true,"k":"l","d":[11,256,381,501,505,516],"c":[["-",{"w":"no-loss-lottery","s":"-lottery","e":true,"k":"-","d":[11,256,381,501,505],"c":[["-",{"w":"no-loss-lottery-pool","s":"-pool","e":true,"k":"-","d":[516],"c":[]}]]}]]}],["u",{"w":"no-underline","s":"underline","e":true,"k":"u","d":[13,45,74,425,443],"c":[]}]]}],["e",{"w":"noerrors","s":"errors","e":true,"k":"e","d":[226,227],"c":[]}],["r",{"w":"normal","s":"rmal","e":true,"k":"r","d":[240,517],"c":[]}]]}],["u",{"w":"nu","s":"u","e":false,"k":"u","d":[],"c":[["m",{"w":"num","s":"m","e":true,"k":"m","d":[177,354,356,366],"c":[["b",{"w":"numb","s":"b","e":false,"k":"b","d":[],"c":[["e",{"w":"number","s":"er","e":true,"k":"e","d":[6,7,12,15,49,51,52,102,106,107,112,137,138,140,145,155,157,165,174,177,185,187,191,197,199,221,226,231,233,234,245,255,346,348,351,356,360,361,366,367,368,379,516],"c":[["s",{"w":"numbers","s":"s","e":true,"k":"s","d":[77,82,92,96,102,105,106,107,110,114,137,138,140,145,154,157,171,174,177,183,185,197,199,229,517],"c":[["_",{"w":"numbers_","s":"_","e":true,"k":"_","d":[229],"c":[]}]]}]]}],["i",{"w":"numbits","s":"its","e":true,"k":"i","d":[145],"c":[]}]]}],["e",{"w":"numeric","s":"eric","e":true,"k":"e","d":[88,120,138,157,356,366],"c":[["a",{"w":"numerical","s":"al","e":true,"k":"a","d":[114,154,176,191],"c":[]}]]}],["s",{"w":"numsignatures","s":"signatures","e":true,"k":"s","d":[226,234,368],"c":[]}]]}],["l",{"w":"null","s":"ll","e":true,"k":"l","d":[7,103,201,232,258,361],"c":[]}],["a",{"w":"nuances","s":"ances","e":true,"k":"a","d":[77],"c":[]}]]}],["f",{"w":"nft","s":"ft","e":true,"k":"f","d":[7,11,27,28,58,63,101,122,135,186,195,219,222,226,231,234,254,256,342,343,344,361,368,372,381,501,505,511,513,516],"c":[["-",{"w":"nft-","s":"-","e":false,"k":"-","d":[],"c":[["m",{"w":"nft-mint","s":"mint","e":true,"k":"m","d":[7,28,101,122,135,186,195,361,516],"c":[]}],["t",{"w":"nft-tra","s":"tra","e":false,"k":"t","d":[],"c":[["i",{"w":"nft-trait","s":"it","e":true,"k":"i","d":[25,27,511,513],"c":[]}],["n",{"w":"nft-transfer","s":"nsfer","e":true,"k":"n","d":[101,122,135,186,195],"c":[]}]]}],["n",{"w":"nft-name","s":"name","e":true,"k":"n","d":[28],"c":[]}],["g",{"w":"nft-get-owner","s":"get-owner","e":true,"k":"g","d":[101,122,135,186,195],"c":[]}],["b",{"w":"nft-b","s":"b","e":false,"k":"b","d":[],"c":[["u",{"w":"nft-burn","s":"urn","e":true,"k":"u","d":[101,122,135,186,195],"c":[]}],["a",{"w":"nft-based","s":"ased","e":true,"k":"a","d":[122],"c":[]}]]}],["r",{"w":"nft-related","s":"related","e":true,"k":"r","d":[122],"c":[]}],["a",{"w":"nft-asset","s":"asset","e":true,"k":"a","d":[511,513],"c":[["-",{"w":"nft-asset-contract","s":"-contract","e":true,"k":"-","d":[511,513],"c":[]}]]}]]}],["b",{"w":"nftbalance","s":"balance","e":true,"k":"b","d":[7,361],"c":[]}],["s",{"w":"nfts","s":"s","e":true,"k":"s","d":[7,101,135,186,195,238,361,511,513],"c":[]}],["p",{"w":"nftpostcondition","s":"postcondition","e":true,"k":"p","d":[229,238],"c":[]}],["_",{"w":"nft_","s":"_","e":false,"k":"_","d":[],"c":[["e",{"w":"nft_events'","s":"events'","e":true,"k":"e","d":[323],"c":[]}],["t",{"w":"nft_transfer","s":"transfer","e":true,"k":"t","d":[372],"c":[]}]]}],["'",{"w":"nft's","s":"'s","e":true,"k":"'","d":[511,513],"c":[]}]]}],["a",{"w":"na","s":"a","e":false,"k":"a","d":[],"c":[["m",{"w":"nam","s":"m","e":false,"k":"m","d":[],"c":[["e",{"w":"name","s":"e","e":true,"k":"e","d":[7,9,14,15,17,20,27,29,30,51,52,67,68,69,83,85,86,92,95,97,99,100,103,115,116,119,122,123,125,129,131,134,139,141,142,144,146,151,152,156,160,170,175,178,182,189,190,226,227,241,271,272,277,278,353,354,356,361,366,371,372,374,375,376,377,378,379,395,515,517],"c":[["s",{"w":"names","s":"s","e":true,"k":"s","d":[27,82,83,84,85,88,89,91,92,93,94,97,98,99,100,101,105,106,107,109,110,111,116,117,118,119,120,121,122,124,129,131,132,134,135,136,138,139,141,142,143,146,147,148,150,151,152,153,155,157,159,160,162,165,166,167,168,169,170,171,172,173,175,181,183,184,185,186,189,194,195,197,198,200,270,271,272,277,278,356,366,395],"c":[["p",{"w":"namespace","s":"pace","e":true,"k":"p","d":[9,353],"c":[["s",{"w":"namespaces","s":"s","e":true,"k":"s","d":[275,276,393],"c":[]}]]}],["'",{"w":"names'","s":"'","e":true,"k":"'","d":[275],"c":[]}]]}],["d",{"w":"named","s":"d","e":true,"k":"d","d":[12,30,83,92,180,226,234,245,348,368,515],"c":[]}],["l",{"w":"namely","s":"ly","e":true,"k":"l","d":[71,229],"c":[]}],["1",{"w":"name1","s":"1","e":true,"k":"1","d":[171],"c":[]}],["2",{"w":"name2","s":"2","e":true,"k":"2","d":[171],"c":[]}]]}],["i",{"w":"naming","s":"ing","e":true,"k":"i","d":[229,259],"c":[]}]]}],["v",{"w":"navigat","s":"vigat","e":false,"k":"v","d":[],"c":[["e",{"w":"navigate","s":"e","e":true,"k":"e","d":[9,49,50,69,71,376,380,515],"c":[]}],["i",{"w":"navigati","s":"i","e":false,"k":"i","d":[],"c":[["o",{"w":"navigation","s":"on","e":true,"k":"o","d":[26],"c":[]}],["n",{"w":"navigating","s":"ng","e":true,"k":"n","d":[377],"c":[]}]]}]]}],["t",{"w":"nat","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"native","s":"ive","e":true,"k":"i","d":[49,232],"c":[]}],["u",{"w":"nature","s":"ure","e":true,"k":"u","d":[68,114,154,176,191],"c":[]}]]}],["k",{"w":"naka","s":"ka","e":false,"k":"k","d":[],"c":[["m",{"w":"nakamoto","s":"moto","e":true,"k":"m","d":[219,220,221,222,223,234,235,236,368,369,370],"c":[["-",{"w":"nakamoto-","s":"-","e":false,"k":"-","d":[],"c":[["u",{"w":"nakamoto-upgrade","s":"upgrade","e":true,"k":"u","d":[219],"c":[["-",{"w":"nakamoto-upgrade-start-here","s":"-start-here","e":true,"k":"-","d":[219],"c":[]}]]}],["e",{"w":"nakamoto-explorer","s":"explorer","e":true,"k":"e","d":[219,220],"c":[]}]]}],["c",{"w":"nakamotocoinbasepayload","s":"coinbasepayload","e":true,"k":"c","d":[229],"c":[["w",{"w":"nakamotocoinbasepayloadwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}]]}],["d",{"w":"nakademo","s":"demo","e":true,"k":"d","d":[221],"c":[]}]]}]]}],["p",{"w":"np","s":"p","e":false,"k":"p","d":[],"c":[["m",{"w":"npm","s":"m","e":true,"k":"m","d":[8,9,10,12,75,219,223,224,228,232,245,246,259,348,355,426,444,517],"c":[]}],["x",{"w":"npx","s":"x","e":true,"k":"x","d":[68,232,246,517],"c":[]}]]}],["i",{"w":"night","s":"ight","e":true,"k":"i","d":[13],"c":[]}],["v",{"w":"nvme","s":"vme","e":true,"k":"v","d":[502],"c":[]}],["y",{"w":"nyc","s":"yc","e":true,"k":"y","d":[516],"c":[]}]]}],["u",{"w":"u","s":"u","e":true,"k":"u","d":[6,100,226,234,360,368],"c":[["s",{"w":"us","s":"s","e":true,"k":"s","d":[2,8,12,18,31,45,46,49,54,74,203,204,208,225,228,229,245,257,345,347,348,349,350,355,373,377,399,422,425,427,443,459,502],"c":[["i",{"w":"using","s":"ing","e":true,"k":"i","d":[4,9,11,12,14,15,17,18,22,26,27,28,30,46,47,49,50,51,52,53,58,65,68,69,71,72,73,76,77,79,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,223,224,228,229,230,231,232,233,237,238,239,240,242,243,245,246,255,258,259,348,352,353,354,355,356,357,358,362,365,366,367,371,372,374,375,376,377,378,379,380,381,427,459,502,504,505,511,513,515,516,517],"c":[["-",{"w":"using-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"using-post-conditions","s":"post-conditions","e":true,"k":"p","d":[231],"c":[]}],["r",{"w":"using-regular-expressions-instead-of-ranges","s":"regular-expressions-instead-of-ranges","e":true,"k":"r","d":[517],"c":[]}]]}]]}],["t",{"w":"ustx","s":"tx","e":true,"k":"t","d":[7,185,230,231,234,238,361,368],"c":[]}],["e",{"w":"use","s":"e","e":true,"k":"e","d":[7,8,11,12,17,18,19,25,26,27,28,29,31,46,47,49,52,53,58,67,68,69,70,71,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,219,222,223,224,226,227,229,230,231,232,233,234,235,236,239,243,245,246,256,258,348,351,352,353,354,355,356,357,361,366,367,368,369,370,371,372,374,376,377,378,379,381,399,420,423,425,443,466,501,502,504,505,509,511,513,514,515,516,517],"c":[["f",{"w":"useful","s":"ful","e":true,"k":"f","d":[7,9,12,14,16,18,68,71,76,86,113,128,130,163,188,245,348,356,361,366,371,372,377],"c":[]}],["-",{"w":"use-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"use-cases","s":"cases","e":true,"k":"c","d":[8,229],"c":[]}],["t",{"w":"use-trait","s":"trait","e":true,"k":"t","d":[69,90,117,119],"c":[]}],["s",{"w":"use-stacksjs-in-the-project","s":"stacksjs-in-the-project","e":true,"k":"s","d":[232],"c":[]}]]}],["s",{"w":"uses","s":"s","e":true,"k":"s","d":[9,21,27,67,70,77,96,102,108,112,114,117,137,140,154,176,191,193,226,227,229,240,241,259,351,377,427,459,511,513,516],"c":[["t",{"w":"usestate","s":"tate","e":true,"k":"t","d":[232],"c":[]}]]}],["r",{"w":"user","s":"r","e":true,"k":"r","d":[12,18,19,27,30,50,67,68,71,75,76,77,79,81,83,85,88,89,91,97,103,113,116,117,120,126,130,132,139,146,147,149,151,152,163,167,172,173,189,201,202,224,226,227,231,239,240,242,244,245,348,350,352,354,356,366,422,427,459,502],"c":[["'",{"w":"user's","s":"'s","e":true,"k":"'","d":[9,12,67,76,79,88,89,91,103,120,132,139,146,167,172,173,189,190,201,202,224,226,227,240,245,348,352,353,354,355,357],"c":[]}],["s",{"w":"users","s":"s","e":true,"k":"s","d":[12,22,28,51,67,68,69,70,71,80,81,99,115,123,125,163,178,189,190,193,201,219,224,226,227,228,229,230,239,243,245,348,350,352,353,354,356,357,366,371,373,511,513],"c":[["e",{"w":"usersession","s":"ession","e":true,"k":"e","d":[67,226,227,240,355],"c":[]}],["'",{"w":"users'","s":"'","e":true,"k":"'","d":[352],"c":[]}]]}],["-",{"w":"user-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"user-d","s":"d","e":false,"k":"d","d":[],"c":[["e",{"w":"user-deposit","s":"eposit","e":true,"k":"e","d":[12,245,348],"c":[]}],["a",{"w":"user-data","s":"ata","e":true,"k":"a","d":[67,226,227],"c":[]}]]}],["f",{"w":"user-friendly","s":"friendly","e":true,"k":"f","d":[68],"c":[]}],["p",{"w":"user-permissions","s":"permissions","e":true,"k":"p","d":[76],"c":[]}],["s",{"w":"user-s","s":"s","e":false,"k":"s","d":[],"c":[["e",{"w":"user-settings","s":"ettings","e":true,"k":"e","d":[76],"c":[]}],["u",{"w":"user-submission-id","s":"ubmission-id","e":true,"k":"u","d":[80],"c":[]}]]}],["b",{"w":"user-balances","s":"balances","e":true,"k":"b","d":[79],"c":[]}],["i",{"w":"user-id","s":"id","e":true,"k":"i","d":[189],"c":[]}]]}],["n",{"w":"username","s":"name","e":true,"k":"n","d":[27,67,226,227,374,376,504,515],"c":[]}],["d",{"w":"userdata","s":"data","e":true,"k":"d","d":[67,85,89,91,132,151,167,172,226,227,352,355],"c":[]}],["p",{"w":"userp","s":"p","e":false,"k":"p","d":[],"c":[["o",{"w":"userpoints","s":"oints","e":true,"k":"o","d":[77],"c":[]}],["r",{"w":"userprofiles","s":"rofiles","e":true,"k":"r","d":[97,103,116,139,146],"c":[]}],["e",{"w":"userpermission","s":"ermission","e":true,"k":"e","d":[130],"c":[["s",{"w":"userpermissions","s":"s","e":true,"k":"s","d":[130],"c":[]}]]}]]}],["i",{"w":"useri","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"userinfo","s":"nfo","e":true,"k":"n","d":[83,85,151],"c":[]}],["d",{"w":"userid","s":"d","e":true,"k":"d","d":[83,85,88,89,91,116,120,124,132,136,139,146,147,151,167,172,173,196],"c":[]}]]}],["b",{"w":"userbalance","s":"balance","e":true,"k":"b","d":[185],"c":[["s",{"w":"userbalances","s":"s","e":true,"k":"s","d":[88,120,124,136,147,196],"c":[]}]]}],["r",{"w":"userrole","s":"role","e":true,"k":"r","d":[113,173],"c":[["s",{"w":"userroles","s":"s","e":true,"k":"s","d":[113,173],"c":[]}]]}],["c",{"w":"usercount","s":"count","e":true,"k":"c","d":[163],"c":[]}],["a",{"w":"useraddress","s":"address","e":true,"k":"a","d":[185],"c":[]}],["f",{"w":"userflags","s":"flags","e":true,"k":"f","d":[187],"c":[]}],["v",{"w":"uservotes","s":"votes","e":true,"k":"v","d":[377],"c":[]}]]}],["d",{"w":"used","s":"d","e":true,"k":"d","d":[9,12,14,16,17,27,49,51,52,68,69,71,79,80,82,83,84,85,86,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,219,224,226,227,229,230,233,234,236,241,244,245,259,348,355,367,368,370,371,372,374,376,379,509,511,513,516,517],"c":[]}],["c",{"w":"useconnect","s":"connect","e":true,"k":"c","d":[355],"c":[]}]]}],["r",{"w":"usr","s":"r","e":true,"k":"r","d":[18,517],"c":[]}],["a",{"w":"usa","s":"a","e":false,"k":"a","d":[],"c":[["g",{"w":"usage","s":"ge","e":true,"k":"g","d":[19,58,65,76,77,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,101,103,104,105,106,107,108,109,110,111,113,116,117,118,120,121,123,124,125,126,128,130,131,132,133,135,136,137,138,139,141,142,143,144,145,146,147,148,149,150,151,152,153,155,156,157,158,159,161,162,163,164,165,166,167,168,169,171,172,173,174,175,177,178,179,180,181,182,183,184,185,186,188,189,190,193,194,195,197,198,199,200,227,231,235,352,355,356,366,369,439,462,514,517],"c":[["-",{"w":"usage-examples","s":"-examples","e":true,"k":"-","d":[231],"c":[]}]]}],["b",{"w":"usability","s":"bility","e":true,"k":"b","d":[88,99,120,134],"c":[]}]]}]]}],["n",{"w":"un","s":"n","e":false,"k":"n","d":[],"c":[["d",{"w":"unde","s":"de","e":false,"k":"d","d":[],"c":[["r",{"w":"under","s":"r","e":true,"k":"r","d":[2,8,18,31,45,46,51,54,74,203,204,208,225,228,244,257,345,347,349,350,355,373,377,399,422,425,443,459,502,515],"c":[["s",{"w":"understand","s":"stand","e":true,"k":"s","d":[9,26,48,51,52,68,70,114,152,154,163,176,191],"c":[["i",{"w":"understanding","s":"ing","e":true,"k":"i","d":[65,69,71,76,77,79,80,81,87,91,102,104,108,112,114,133,137,140,149,154,158,176,179,182,191,199,202,439,462],"c":[]}]]}],["f",{"w":"underflow","s":"flow","e":true,"k":"f","d":[77,114,140],"c":[]}],["l",{"w":"underlying","s":"lying","e":true,"k":"l","d":[95,156,202,231,355],"c":[]}]]}],["f",{"w":"undefined","s":"fined","e":true,"k":"f","d":[7,201,361],"c":[]}]]}],["s",{"w":"uns","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"unsigned","s":"igned","e":true,"k":"i","d":[6,12,87,88,107,114,118,120,128,130,133,138,142,145,153,154,157,158,160,176,179,180,187,191,226,234,245,348,360,368],"c":[]}],["p",{"w":"unspe","s":"pe","e":false,"k":"p","d":[],"c":[["n",{"w":"unspent","s":"nt","e":true,"k":"n","d":[52],"c":[["s",{"w":"unspents","s":"s","e":true,"k":"s","d":[233,367],"c":[]}]]}],["c",{"w":"unspecified","s":"cified","e":true,"k":"c","d":[231],"c":[]}]]}],["u",{"w":"unsubscribe","s":"ubscribe","e":true,"k":"u","d":[65,365],"c":[]}],["e",{"w":"unset","s":"et","e":true,"k":"e","d":[173],"c":[]}]]}],["l",{"w":"unl","s":"l","e":false,"k":"l","d":[],"c":[["o",{"w":"unlock","s":"ock","e":true,"k":"o","d":[191],"c":[["-",{"w":"unlock-height","s":"-height","e":true,"k":"-","d":[7,202,361],"c":[]}],["e",{"w":"unlocked","s":"ed","e":true,"k":"e","d":[7,361],"c":[]}],["s",{"w":"unlocks","s":"s","e":true,"k":"s","d":[31,191],"c":[["c",{"w":"unlocksclaimed","s":"claimed","e":true,"k":"c","d":[191],"c":[]}],["d",{"w":"unlocksdue","s":"due","e":true,"k":"d","d":[191],"c":[]}]]}],["_",{"w":"unlock_","s":"_","e":false,"k":"_","d":[],"c":[["a",{"w":"unlock_amount","s":"amount","e":true,"k":"a","d":[191],"c":[]}],["i",{"w":"unlock_interval","s":"interval","e":true,"k":"i","d":[191],"c":[]}]]}]]}],["i",{"w":"unli","s":"i","e":false,"k":"i","d":[],"c":[["k",{"w":"unlike","s":"ke","e":true,"k":"k","d":[77],"c":[]}],["m",{"w":"unlimited","s":"mited","e":true,"k":"m","d":[160,178],"c":[]}]]}]]}],["i",{"w":"uni","s":"i","e":false,"k":"i","d":[],"c":[["t",{"w":"unit","s":"t","e":true,"k":"t","d":[8,11,12,18,22,26,28,30,224,245,246,348,381,505],"c":[["-",{"w":"unit-testing","s":"-testing","e":true,"k":"-","d":[12,18,19,245,348],"c":[]}]]}],["q",{"w":"unique","s":"que","e":true,"k":"q","d":[73,79,80,84,91,97,104,111,122,167,181,186,188,240,511,513,516],"c":[["n",{"w":"uniqueness","s":"ness","e":true,"k":"n","d":[104,122,156,229],"c":[]}],["l",{"w":"uniquely","s":"ly","e":true,"k":"l","d":[226,227,377],"c":[]}]]}],["n",{"w":"uninte","s":"nte","e":false,"k":"n","d":[],"c":[["n",{"w":"unintended","s":"nded","e":true,"k":"n","d":[79,192],"c":[]}],["l",{"w":"unintelligible","s":"lligible","e":true,"k":"l","d":[229],"c":[]}]]}],["x",{"w":"unix","s":"x","e":true,"k":"x","d":[104,127,156,377],"c":[]}],["f",{"w":"unify","s":"fy","e":true,"k":"f","d":[351,356,366],"c":[]}]]}],["w",{"w":"unw","s":"w","e":false,"k":"w","d":[],"c":[["r",{"w":"unwrap","s":"rap","e":true,"k":"r","d":[69,79,80,81,85,86,126,144,148,151,159,166,168,193,201,511,513,516],"c":[["-",{"w":"unwrap-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"unwrap-panic","s":"panic","e":true,"k":"p","d":[12,26,69,79,80,85,126,144,151,159,189,193,201,245,348,516],"c":[]}],["e",{"w":"unwrap-err","s":"err","e":true,"k":"e","d":[148,151,159],"c":[["-",{"w":"unwrap-err-panic","s":"-panic","e":true,"k":"-","d":[148],"c":[]}]]}]]}],["s",{"w":"unwraps","s":"s","e":true,"k":"s","d":[166,168],"c":[]}],["p",{"w":"unwrapping","s":"ping","e":true,"k":"p","d":[201],"c":[]}]]}],["a",{"w":"unwanted","s":"anted","e":true,"k":"a","d":[177],"c":[]}]]}],["t",{"w":"unt","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"untested","s":"ested","e":true,"k":"e","d":[12,224,245,348],"c":[]}],["i",{"w":"until","s":"il","e":true,"k":"i","d":[26,68,255,509],"c":[]}]]}],["p",{"w":"unp","s":"p","e":false,"k":"p","d":[],"c":[["r",{"w":"unprocessed","s":"rocessed","e":true,"k":"r","d":[14],"c":[]}],["a",{"w":"unpack","s":"ack","e":true,"k":"a","d":[85,148,151,159],"c":[["i",{"w":"unpacking","s":"ing","e":true,"k":"i","d":[85,148,151,159],"c":[]}],["s",{"w":"unpacks","s":"s","e":true,"k":"s","d":[85,148,151,159],"c":[]}]]}],["l",{"w":"unplug","s":"lug","e":true,"k":"l","d":[515],"c":[]}]]}],["a",{"w":"una","s":"a","e":false,"k":"a","d":[],"c":[["b",{"w":"unable","s":"ble","e":true,"k":"b","d":[24],"c":[]}],["r",{"w":"unarchive","s":"rchive","e":true,"k":"r","d":[48],"c":[["d",{"w":"unarchived","s":"d","e":true,"k":"d","d":[48],"c":[]}]]}],["u",{"w":"unauthorized","s":"uthorized","e":true,"k":"u","d":[99,115,123,178,192,516],"c":[]}],["v",{"w":"unavailable","s":"vailable","e":true,"k":"v","d":[259],"c":[]}]]}],["c",{"w":"unc","s":"c","e":false,"k":"c","d":[],"c":[["h",{"w":"unchanged","s":"hanged","e":true,"k":"h","d":[28,92,113],"c":[]}],["o",{"w":"uncommented","s":"ommented","e":true,"k":"o","d":[374,376],"c":[]}]]}],["h",{"w":"unh","s":"h","e":false,"k":"h","d":[],"c":[["a",{"w":"unhandled","s":"andled","e":true,"k":"a","d":[82,83,84,85,89,94,98,105,106,109,110,111,117,118,121,131,132,135,138,139,141,142,143,146,147,148,150,151,153,157,159,162,166,167,168,169,170,172,175,181,183,184,186,189,194,195,198,200],"c":[]}],["e",{"w":"unhelpful","s":"elpful","e":true,"k":"e","d":[193],"c":[]}]]}],["e",{"w":"unexpected","s":"expected","e":true,"k":"e","d":[86,87,100,103,108,112,121,126,128,129,130,133,153,158,167,168,179,187,192,196,201],"c":[]}],["n",{"w":"unnecessar","s":"necessar","e":false,"k":"n","d":[],"c":[["y",{"w":"unnecessary","s":"y","e":true,"k":"y","d":[108,199,229,427,459],"c":[]}],["i",{"w":"unnecessarily","s":"ily","e":true,"k":"i","d":[192],"c":[]}]]}],["b",{"w":"unbounded","s":"bounded","e":true,"k":"b","d":[126],"c":[]}],["u",{"w":"unused","s":"used","e":true,"k":"u","d":[229],"c":[]}]]}],["i",{"w":"ui","s":"i","e":true,"k":"i","d":[4,5,6,7,11,13,18,22,26,27,30,44,45,52,67,68,69,71,74,75,226,227,230,231,232,233,234,235,236,244,256,351,352,353,354,356,358,359,360,361,362,366,367,368,369,370,371,372,377,381,420,425,443,466,501,505],"c":[["n",{"w":"uint","s":"nt","e":true,"k":"n","d":[6,7,12,22,26,28,30,51,69,71,76,77,79,80,81,83,84,85,86,88,90,94,95,96,97,98,99,100,101,102,103,104,106,107,109,110,111,112,113,114,115,116,118,119,120,122,123,124,125,126,127,128,129,130,133,134,135,136,137,139,140,142,143,144,145,146,147,150,151,152,153,154,156,157,158,160,161,162,163,164,166,174,176,178,180,181,183,184,185,186,187,188,190,191,192,193,194,196,197,198,200,201,202,224,226,229,231,234,238,245,246,348,353,354,356,360,361,366,368,511,513,516,517],"c":[["8",{"w":"uint8array","s":"8array","e":true,"k":"8","d":[6,226,229,234,239,360,368],"c":[]}],["-",{"w":"uint-to-buff","s":"-to-buff","e":true,"k":"-","d":[133,158],"c":[]}],["c",{"w":"uintcv","s":"cv","e":true,"k":"c","d":[226,234,368,514],"c":[]}],["2",{"w":"uint256","s":"256","e":true,"k":"2","d":[517],"c":[]}]]}],["'",{"w":"ui'","s":"'","e":true,"k":"'","d":[67,226,227,234,235,236,356,366,368,369,370,371,372],"c":[]}]]}],["p",{"w":"up","s":"p","e":true,"k":"p","d":[11,12,13,14,15,17,18,22,27,30,45,47,49,50,51,55,67,68,69,71,74,77,87,92,95,133,137,156,158,164,179,201,221,224,226,227,232,233,243,245,256,259,348,354,357,367,373,374,376,377,378,381,423,425,427,443,459,501,504,505,515],"c":[["g",{"w":"upgrad","s":"grad","e":false,"k":"g","d":[],"c":[["e",{"w":"upgrade","s":"e","e":true,"k":"e","d":[219,222,375],"c":[["s",{"w":"upgrades","s":"s","e":true,"k":"s","d":[5,359],"c":[]}],["a",{"w":"upgradeable","s":"able","e":true,"k":"a","d":[86,90],"c":[]}],["d",{"w":"upgraded","s":"d","e":true,"k":"d","d":[86],"c":[]}],["'",{"w":"upgrade's","s":"'s","e":true,"k":"'","d":[219,220],"c":[]}]]}],["a",{"w":"upgradability","s":"ability","e":true,"k":"a","d":[86],"c":[]}]]}],["p",{"w":"uppercase","s":"percase","e":true,"k":"p","d":[11,44,92,256,381,466,501,505],"c":[]}],["d",{"w":"updat","s":"dat","e":false,"k":"d","d":[],"c":[["e",{"w":"update","s":"e","e":true,"k":"e","d":[12,30,31,52,68,71,79,89,97,100,101,109,132,137,140,175,189,221,224,229,232,234,235,236,245,348,355,368,369,370,374,376,377,378,515,516],"c":[["s",{"w":"updates","s":"s","e":true,"k":"s","d":[12,27,65,132,140,163,219,224,245,348,355,516],"c":[]}],["d",{"w":"updated","s":"d","e":true,"k":"d","d":[14,15,17,50,52,97,100,132,137,219,223,224,378,516],"c":[["-",{"w":"updated-user","s":"-user","e":true,"k":"-","d":[189],"c":[]}]]}],["-",{"w":"update-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"update-setting","s":"setting","e":true,"k":"s","d":[76],"c":[]}],["b",{"w":"update-balance","s":"balance","e":true,"k":"b","d":[79,201],"c":[]}],["u",{"w":"update-user-address","s":"user-address","e":true,"k":"u","d":[189],"c":[]}]]}]]}],["i",{"w":"updating","s":"ing","e":true,"k":"i","d":[76,77,79,89,101,109,119,126,132,175,189,224,355],"c":[]}]]}],["t",{"w":"upto","s":"to","e":true,"k":"t","d":[12,245,348],"c":[]}],["l",{"w":"upload","s":"load","e":true,"k":"l","d":[14,15,17,52,68,377],"c":[["e",{"w":"uploaded","s":"ed","e":true,"k":"e","d":[68],"c":[]}]]}],["o",{"w":"upon","s":"on","e":true,"k":"o","d":[27,69,243],"c":[]}],["c",{"w":"upcoming","s":"coming","e":true,"k":"c","d":[219,222],"c":[]}],["-",{"w":"up-to-date","s":"-to-date","e":true,"k":"-","d":[219,220],"c":[]}]]}],["0",{"w":"u0","s":"0","e":true,"k":"0","d":[6,7,12,22,26,28,30,69,71,76,77,79,81,88,96,97,98,99,100,102,103,106,112,113,114,118,120,122,123,124,128,129,130,134,136,140,147,152,153,154,161,163,164,176,187,191,192,193,194,196,198,201,202,224,245,348,353,360,361,511,513,516,517],"c":[]}],["1",{"w":"u1","s":"1","e":true,"k":"1","d":[6,7,9,22,26,27,28,30,69,71,76,77,79,80,81,90,96,99,100,101,102,106,108,110,112,113,114,122,124,125,126,128,129,130,133,136,140,144,145,147,149,150,152,154,158,160,163,164,166,174,176,180,184,186,187,190,191,193,196,201,202,360,361,377,511,513,516,517],"c":[["0",{"w":"u10","s":"0","e":true,"k":"0","d":[6,12,71,77,110,112,180,185,191,194,245,348,360],"c":[["0",{"w":"u100","s":"0","e":true,"k":"0","d":[28,71,77,86,88,104,114,120,123,124,136,140,147,156,161,164,178,185,190,193],"c":[["0",{"w":"u1000","s":"0","e":true,"k":"0","d":[69,77,106,193,511,513],"c":[["0",{"w":"u10000","s":"0","e":true,"k":"0","d":[12,245,348],"c":[["0",{"w":"u100000","s":"0","e":true,"k":"0","d":[202],"c":[["0",{"w":"u1000000","s":"0","e":true,"k":"0","d":[102,106,112,125,129,133,153,158,160,176,191],"c":[["0",{"w":"u100000000","s":"00","e":true,"k":"0","d":[154],"c":[["0",{"w":"u1000000000","s":"0","e":true,"k":"0","d":[114],"c":[["0",{"w":"u1000000000000","s":"000","e":true,"k":"0","d":[92],"c":[["0",{"w":"u100000000000000","s":"00","e":true,"k":"0","d":[7,361],"c":[]}]]}]]}]]}]]}]]}]]}]]}],["1",{"w":"u1001","s":"1","e":true,"k":"1","d":[69,511,513],"c":[["0",{"w":"u10010","s":"0","e":true,"k":"0","d":[71],"c":[]}]]}],["2",{"w":"u1002","s":"2","e":true,"k":"2","d":[69],"c":[]}]]}],["1",{"w":"u101000","s":"1000","e":true,"k":"1","d":[516],"c":[]}]]}],["9",{"w":"u19","s":"9","e":true,"k":"9","d":[7,361],"c":[["0",{"w":"u19000000","s":"000000","e":true,"k":"0","d":[6,7,360,361],"c":[]}]]}],["4",{"w":"u1440","s":"440","e":true,"k":"4","d":[69],"c":[]}],["2",{"w":"u12","s":"2","e":true,"k":"2","d":[80],"c":[["3",{"w":"u123","s":"3","e":true,"k":"3","d":[157],"c":[]}]]}],["5",{"w":"u15","s":"5","e":true,"k":"5","d":[96,194],"c":[]}],["1",{"w":"u11","s":"1","e":true,"k":"1","d":[106,145],"c":[]}],["6",{"w":"u16","s":"6","e":true,"k":"6","d":[107],"c":[["0",{"w":"u1600000000","s":"00000000","e":true,"k":"0","d":[156],"c":[]}]]}],["7",{"w":"u17","s":"7","e":true,"k":"7","d":[516],"c":[["1",{"w":"u171","s":"1","e":true,"k":"1","d":[145],"c":[]}],["2",{"w":"u17280","s":"280","e":true,"k":"2","d":[191],"c":[]}]]}]]}],["5",{"w":"u5","s":"5","e":true,"k":"5","d":[76,77,81,82,96,109,110,126,142,144,180,194],"c":[["0",{"w":"u50","s":"0","e":true,"k":"0","d":[123,124,136,143,147,150,161,166,184,190],"c":[["0",{"w":"u500","s":"0","e":true,"k":"0","d":[6,360,516],"c":[["0",{"w":"u50000","s":"00","e":true,"k":"0","d":[154],"c":[["0",{"w":"u500000","s":"0","e":true,"k":"0","d":[125],"c":[["0",{"w":"u5000000000","s":"0000","e":true,"k":"0","d":[516],"c":[]}]]}]]}]]}]]}]]}],["4",{"w":"u4","s":"4","e":true,"k":"4","d":[27,76,81,96,107,113,126,130,145,174,187],"c":[["2",{"w":"u42","s":"2","e":true,"k":"2","d":[7,118,153,361],"c":[["0",{"w":"u42000000","s":"000000","e":true,"k":"0","d":[7,361],"c":[]}]]}],["0",{"w":"u40","s":"0","e":false,"k":"0","d":[],"c":[["4",{"w":"u404","s":"4","e":true,"k":"4","d":[97,116,180,516],"c":[]}],["3",{"w":"u403","s":"3","e":true,"k":"3","d":[122,178,192],"c":[]}],["1",{"w":"u401","s":"1","e":true,"k":"1","d":[192],"c":[]}]]}],["5",{"w":"u456","s":"56","e":true,"k":"5","d":[157],"c":[]}]]}],["3",{"w":"u3","s":"3","e":true,"k":"3","d":[71,76,80,81,96,106,107,112,114,115,123,126,135,145,160,174,202,356,366],"c":[["0",{"w":"u30","s":"0","e":true,"k":"0","d":[77,83,85,103,116,139,146,151],"c":[["0",{"w":"u300","s":"0","e":true,"k":"0","d":[12,245,348],"c":[["0",{"w":"u3000","s":"0","e":true,"k":"0","d":[69],"c":[["0",{"w":"u3000000","s":"000","e":true,"k":"0","d":[51,517],"c":[]}]]}],["1",{"w":"u3001","s":"1","e":true,"k":"1","d":[69],"c":[]}],["2",{"w":"u3002","s":"2","e":true,"k":"2","d":[69],"c":[]}],["3",{"w":"u3003","s":"3","e":true,"k":"3","d":[69],"c":[]}],["4",{"w":"u3004","s":"4","e":true,"k":"4","d":[69],"c":[]}],["5",{"w":"u3005","s":"5","e":true,"k":"5","d":[69],"c":[]}],["6",{"w":"u3006","s":"6","e":true,"k":"6","d":[69],"c":[]}],["7",{"w":"u3007","s":"7","e":true,"k":"7","d":[69],"c":[]}],["8",{"w":"u3008","s":"8","e":true,"k":"8","d":[69],"c":[]}],["9",{"w":"u3009","s":"9","e":true,"k":"9","d":[69],"c":[]}]]}],["1",{"w":"u3010","s":"10","e":true,"k":"1","d":[69],"c":[]}]]}],["6",{"w":"u365","s":"65","e":true,"k":"6","d":[77,102],"c":[]}],["2",{"w":"u32","s":"2","e":true,"k":"2","d":[80],"c":[]}],["8",{"w":"u38","s":"8","e":true,"k":"8","d":[97],"c":[]}],["1",{"w":"u31536000","s":"1536000","e":true,"k":"1","d":[176],"c":[]}]]}],["2",{"w":"u2","s":"2","e":true,"k":"2","d":[12,71,76,79,80,81,96,101,102,108,109,112,113,114,123,124,126,128,130,136,140,147,149,174,176,183,187,191,193,202,245,246,348],"c":[["0",{"w":"u200","s":"00","e":true,"k":"0","d":[71,124,136],"c":[["0",{"w":"u2000","s":"0","e":true,"k":"0","d":[69,511,513],"c":[]}],["1",{"w":"u2001","s":"1","e":true,"k":"1","d":[69,511,513],"c":[]}],["2",{"w":"u2002","s":"2","e":true,"k":"2","d":[69,511,513],"c":[]}],["3",{"w":"u2003","s":"3","e":true,"k":"3","d":[511,513],"c":[]}],["4",{"w":"u2004","s":"4","e":true,"k":"4","d":[511,513],"c":[]}],["5",{"w":"u2005","s":"5","e":true,"k":"5","d":[511,513],"c":[]}],["6",{"w":"u2006","s":"6","e":true,"k":"6","d":[511,513],"c":[]}],["7",{"w":"u2007","s":"7","e":true,"k":"7","d":[511,513],"c":[]}],["8",{"w":"u2008","s":"8","e":true,"k":"8","d":[511,513],"c":[]}]]}]]}],["t",{"w":"ut","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"utili","s":"ili","e":false,"k":"i","d":[],"c":[["t",{"w":"utilit","s":"t","e":false,"k":"t","d":[],"c":[["y",{"w":"utility","s":"y","e":true,"k":"y","d":[49,129,160],"c":[]}],["i",{"w":"utilities","s":"ies","e":true,"k":"i","d":[224,236,244,370],"c":[]}]]}],["z",{"w":"utiliz","s":"z","e":false,"k":"z","d":[],"c":[["e",{"w":"utilize","s":"e","e":true,"k":"e","d":[134,156,377],"c":[]}],["a",{"w":"utilization","s":"ation","e":true,"k":"a","d":[514],"c":[]}]]}]]}],["x",{"w":"utxo","s":"xo","e":false,"k":"x","d":[],"c":[["s",{"w":"utxos","s":"s","e":true,"k":"s","d":[52,233,367],"c":[]}],["w",{"w":"utxowithtx","s":"withtx","e":true,"k":"w","d":[233,367],"c":[]}],["t",{"w":"utxotospendable","s":"tospendable","e":true,"k":"t","d":[233,367],"c":[]}]]}],["f",{"w":"utf","s":"f","e":false,"k":"f","d":[],"c":[["-",{"w":"utf-8","s":"-8","e":true,"k":"-","d":[120,182],"c":[]}],["8",{"w":"utf8tobytes","s":"8tobytes","e":true,"k":"8","d":[226,234,368],"c":[]}]]}]]}],["r",{"w":"ur","s":"r","e":false,"k":"r","d":[],"c":[["l",{"w":"url","s":"l","e":true,"k":"l","d":[52,67,68,223,226,227,229,233,367,374,376,379],"c":[["s",{"w":"urls","s":"s","e":true,"k":"s","d":[227,233,236,367,370],"c":[]}]]}],["i",{"w":"uri","s":"i","e":true,"k":"i","d":[69],"c":[["s",{"w":"uris","s":"s","e":true,"k":"s","d":[55],"c":[]}]]}]]}],["x",{"w":"ux","s":"x","e":true,"k":"x","d":[68,219],"c":[]}],["u",{"w":"uuid","s":"uid","e":true,"k":"u","d":[68,374,376,377,378,379],"c":[]}],["6",{"w":"u6","s":"6","e":true,"k":"6","d":[69,81,92,126,185],"c":[["0",{"w":"u60","s":"0","e":true,"k":"0","d":[150,166,184],"c":[["0",{"w":"u600000","s":"0000","e":true,"k":"0","d":[125],"c":[]}]]}]]}],["7",{"w":"u7","s":"7","e":true,"k":"7","d":[76,174],"c":[["0",{"w":"u700000","s":"00000","e":true,"k":"0","d":[95,202],"c":[]}]]}],["8",{"w":"u8","s":"8","e":true,"k":"8","d":[76,107,128,130,187],"c":[]}]]}],["k",{"w":"k","s":"k","e":false,"k":"k","d":[],"c":[["i",{"w":"ki","s":"i","e":false,"k":"i","d":[],"c":[["2",{"w":"ki22007085","s":"22007085","e":true,"k":"2","d":[2,8,18,31,45,54,203,204,208,225,228,257,345,347,349,350,373,399,459,502],"c":[]}],["c",{"w":"kickstart","s":"ckstart","e":true,"k":"c","d":[44],"c":[["e",{"w":"kickstarter","s":"er","e":true,"k":"e","d":[11,256,381,501,505],"c":[]}]]}],["n",{"w":"kind","s":"nd","e":true,"k":"n","d":[71,377,517],"c":[["s",{"w":"kinds","s":"s","e":true,"k":"s","d":[51],"c":[]}]]}]]}],["e",{"w":"ke","s":"e","e":false,"k":"e","d":[],"c":[["y",{"w":"key","s":"y","e":true,"k":"y","d":[7,9,31,45,52,58,67,69,71,73,79,80,81,89,93,94,97,115,116,132,141,162,167,169,172,180,189,200,224,226,227,229,230,233,234,236,237,239,240,243,354,356,361,366,367,368,370,371,377,379,508,516,517],"c":[["s",{"w":"keys","s":"s","e":true,"k":"s","d":[7,27,31,65,71,79,94,97,162,169,188,226,227,229,234,236,237,239,244,361,368,370,377,439,462,517],"c":[["b",{"w":"keysbalance","s":"balance","e":true,"k":"b","d":[71],"c":[]}],["s",{"w":"keyssupply","s":"supply","e":true,"k":"s","d":[71],"c":[]}]]}],["h",{"w":"keyhold","s":"hold","e":false,"k":"h","d":[],"c":[["e",{"w":"keyholder","s":"er","e":true,"k":"e","d":[71],"c":[["s",{"w":"keyholders","s":"s","e":true,"k":"s","d":[71],"c":[]}]]}],["i",{"w":"keyholdings","s":"ings","e":true,"k":"i","d":[71],"c":[]}]]}],["-",{"w":"key-","s":"-","e":false,"k":"-","d":[],"c":[["v",{"w":"key-value","s":"value","e":true,"k":"v","d":[79,97,100,167],"c":[]}],["t",{"w":"key-t","s":"t","e":false,"k":"t","d":[],"c":[["y",{"w":"key-type","s":"ype","e":true,"k":"y","d":[79,97],"c":[["-",{"w":"key-type-","s":"-","e":false,"k":"-","d":[],"c":[["0",{"w":"key-type-0","s":"0","e":true,"k":"0","d":[226,234,368],"c":[]}],["1",{"w":"key-type-1","s":"1","e":true,"k":"1","d":[226,234,368],"c":[]}]]}]]}],["u",{"w":"key-tuple","s":"uple","e":true,"k":"u","d":[89,132,167,172],"c":[]}]]}],["n",{"w":"key-name","s":"name","e":true,"k":"n","d":[116],"c":[["-",{"w":"key-name-","s":"-","e":false,"k":"-","d":[],"c":[["0",{"w":"key-name-0","s":"0","e":true,"k":"0","d":[226,234,368],"c":[]}],["1",{"w":"key-name-1","s":"1","e":true,"k":"1","d":[226,234,368],"c":[]}]]}]]}]]}],["w",{"w":"keyword","s":"word","e":true,"k":"w","d":[81,95,156],"c":[["s",{"w":"keywords","s":"s","e":true,"k":"s","d":[221],"c":[]}]]}]]}],["e",{"w":"keep","s":"ep","e":true,"k":"e","d":[50,69,71,119,129,163,201,219,220,229],"c":[]}],["c",{"w":"keccak","s":"ccak","e":false,"k":"c","d":[],"c":[["2",{"w":"keccak256","s":"256","e":true,"k":"2","d":[80,84,91,111,181,188],"c":[]}],["-",{"w":"keccak-256","s":"-256","e":true,"k":"-","d":[84,91,111,181],"c":[]}]]}]]}],["n",{"w":"kn","s":"n","e":false,"k":"n","d":[],"c":[["o",{"w":"know","s":"ow","e":true,"k":"o","d":[72,226,229,231,234,368,375],"c":[["n",{"w":"known","s":"n","e":true,"k":"n","d":[52,90,126],"c":[]}],["l",{"w":"knowledge","s":"ledge","e":true,"k":"l","d":[65,439,462],"c":[]}]]}],["e",{"w":"knew","s":"ew","e":true,"k":"e","d":[257,345],"c":[]}]]}]]}],["1",{"w":"1","s":"1","e":true,"k":"1","d":[5,6,7,9,12,14,15,16,17,22,26,27,30,46,47,48,49,52,55,68,69,70,71,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,219,220,221,224,226,229,230,231,232,233,234,235,245,246,348,352,353,354,355,356,357,359,360,361,366,367,368,369,374,375,376,377,378,379,509,510,511,513,515,516,517],"c":[["p",{"w":"1pm","s":"pm","e":true,"k":"p","d":[2,8,18,31,45,54,203,204,208,225,228,257,345,347,349,350,373,399,459,502],"c":[]}],["9",{"w":"19","s":"9","e":true,"k":"9","d":[6,360],"c":[["0",{"w":"19000000","s":"000000","e":true,"k":"0","d":[6,7,360,361],"c":[]}],["n",{"w":"19n","s":"n","e":true,"k":"n","d":[7,361],"c":[]}],["1",{"w":"191","s":"1","e":true,"k":"1","d":[7,361],"c":[]}],["3",{"w":"193","s":"3","e":true,"k":"3","d":[7,361],"c":[]}],["5",{"w":"195","s":"5","e":true,"k":"5","d":[7,361],"c":[]}],["-",{"w":"19-25","s":"-25","e":true,"k":"-","d":[72,73],"c":[]}]]}],["n",{"w":"1n","s":"n","e":true,"k":"n","d":[6,7,360,361],"c":[]}],["0",{"w":"10","s":"0","e":true,"k":"0","d":[7,12,25,27,69,77,96,105,109,110,170,173,177,180,183,191,197,199,221,226,232,233,234,245,255,258,348,355,356,361,366,367,368,374,376,516,517],"c":[["0",{"w":"100","s":"0","e":true,"k":"0","d":[7,12,28,50,71,88,120,140,156,235,245,348,361,369,374,376],"c":[["0",{"w":"1000","s":"0","e":true,"k":"0","d":[7,12,25,27,76,77,114,130,187,193,224,231,232,238,245,348,361],"c":[["0",{"w":"10000","s":"0","e":true,"k":"0","d":[25,27,237,372],"c":[["0",{"w":"1000000","s":"00","e":true,"k":"0","d":[7,153,361],"c":[["0",{"w":"100000000","s":"00","e":true,"k":"0","d":[9,22,25,27],"c":[["0",{"w":"100000000000000n","s":"000000n","e":true,"k":"0","d":[7,361],"c":[]}]]}],["n",{"w":"1000000n","s":"n","e":true,"k":"n","d":[226,230,234,368],"c":[]}]]}]]}],["n",{"w":"1000n","s":"n","e":true,"k":"n","d":[226,234,368],"c":[]}]]}],["_",{"w":"100_000","s":"_000","e":true,"k":"_","d":[233,367],"c":[["_",{"w":"100_000_000_000_000","s":"_000_000_000","e":true,"k":"_","d":[27],"c":[]}]]}]]}],["9",{"w":"109","s":"9","e":true,"k":"9","d":[7,361],"c":[]}],["8",{"w":"108","s":"8","e":true,"k":"8","d":[7,221,361],"c":[["6",{"w":"108606","s":"606","e":true,"k":"6","d":[58],"c":[]}]]}],["'",{"w":"10'","s":"'","e":true,"k":"'","d":[12,245,348],"c":[]}],["1",{"w":"101","s":"1","e":true,"k":"1","d":[127,379],"c":[["1",{"w":"1011","s":"1","e":true,"k":"1","d":[145],"c":[]}],["9",{"w":"101922","s":"922","e":true,"k":"9","d":[255],"c":[]}]]}],["4",{"w":"1048576","s":"48576","e":true,"k":"4","d":[138,157],"c":[]}],["_",{"w":"10_000_000_000_000","s":"_000_000_000_000","e":true,"k":"_","d":[223],"c":[]}],["2",{"w":"102","s":"2","e":true,"k":"2","d":[226,234,368],"c":[["0",{"w":"10200","s":"00","e":true,"k":"0","d":[374,379],"c":[]}]]}]]}],["1",{"w":"11","s":"1","e":true,"k":"1","d":[7,110,221,229,361,517],"c":[["a",{"w":"11am","s":"am","e":true,"k":"a","d":[74,422,425,427,443],"c":[]}],["1",{"w":"111","s":"1","e":true,"k":"1","d":[226,234,368],"c":[]}]]}],["2",{"w":"12","s":"2","e":true,"k":"2","d":[189,229,231],"c":[["0",{"w":"120","s":"0","e":true,"k":"0","d":[7,361],"c":[]}],["3",{"w":"123","s":"3","e":true,"k":"3","d":[7,93,138,157,353,361],"c":[["4",{"w":"12345","s":"45","e":true,"k":"4","d":[68,227,376,379],"c":[["n",{"w":"12345n","s":"n","e":true,"k":"n","d":[226,227,230,234,236,368,370],"c":[]}]]}],["n",{"w":"123n","s":"n","e":true,"k":"n","d":[223],"c":[]}]]}],["1",{"w":"121","s":"1","e":true,"k":"1","d":[58],"c":[]}],["8",{"w":"128","s":"8","e":true,"k":"8","d":[144,145,174],"c":[["-",{"w":"128-bit","s":"-bit","e":true,"k":"-","d":[77,226,234,368],"c":[]}]]}],["n",{"w":"12n","s":"n","e":true,"k":"n","d":[229],"c":[]}]]}],["3",{"w":"13","s":"3","e":true,"k":"3","d":[219,517],"c":[["8",{"w":"138","s":"8","e":true,"k":"8","d":[7,361],"c":[["3",{"w":"138339","s":"339","e":true,"k":"3","d":[68],"c":[]}]]}],["0",{"w":"1309","s":"09","e":true,"k":"0","d":[58],"c":[]}],["3",{"w":"1337","s":"37","e":true,"k":"3","d":[189],"c":[]}]]}],["8",{"w":"18","s":"8","e":true,"k":"8","d":[8,10],"c":[["4",{"w":"18443","s":"443","e":true,"k":"4","d":[27],"c":[]}],["-",{"w":"18-24","s":"-24","e":true,"k":"-","d":[73],"c":[]}],["5",{"w":"18543","s":"543","e":true,"k":"5","d":[374,376,515],"c":[]}]]}],["5",{"w":"15","s":"5","e":true,"k":"5","d":[28,104,170,375,517],"c":[["0",{"w":"15000","s":"000","e":true,"k":"0","d":[9,22],"c":[["0",{"w":"15000000","s":"000","e":true,"k":"0","d":[9,22],"c":[]}]]}],["4",{"w":"154670","s":"4670","e":true,"k":"4","d":[378],"c":[]}]]}],["m",{"w":"1m","s":"m","e":true,"k":"m","d":[29,30],"c":[["1",{"w":"1m1","s":"1","e":true,"k":"1","d":[21,30],"c":[]}],["s",{"w":"1ms","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"1mst1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm","s":"t1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm","e":true,"k":"t","d":[26],"c":[]}],["e",{"w":"1msettings","s":"ettings","e":true,"k":"e","d":[29,30],"c":[]}]]}],["m",{"w":"1mmy-project","s":"my-project","e":true,"k":"m","d":[29],"c":[]}],["c",{"w":"1mc","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"1mco","s":"o","e":false,"k":"o","d":[],"c":[["n",{"w":"1mcontracts","s":"ntracts","e":true,"k":"n","d":[29,30],"c":[]}],["u",{"w":"1mcounter","s":"unter","e":true,"k":"u","d":[30],"c":[]}]]}],["l",{"w":"1mclarinet","s":"larinet","e":true,"k":"l","d":[29,30],"c":[]}]]}],["t",{"w":"1mt","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"1mtests","s":"ests","e":true,"k":"e","d":[29,30],"c":[]}],["s",{"w":"1mtsconfig","s":"sconfig","e":true,"k":"s","d":[29,30],"c":[]}]]}],["p",{"w":"1mpackage","s":"package","e":true,"k":"p","d":[29,30],"c":[]}],["v",{"w":"1mvitest","s":"vitest","e":true,"k":"v","d":[29,30],"c":[]}],["w",{"w":"1mw","s":"w","e":false,"k":"w","d":[],"c":[["i",{"w":"1mwith","s":"ith","e":true,"k":"i","d":[30],"c":[]}],["h",{"w":"1mwhat","s":"hat","e":true,"k":"h","d":[517],"c":[]}]]}]]}],["7",{"w":"17","s":"7","e":true,"k":"7","d":[502],"c":[["2",{"w":"172","s":"2","e":false,"k":"2","d":[],"c":[["6",{"w":"1726104636","s":"6104636","e":true,"k":"6","d":[51,517],"c":[]}],["2",{"w":"1722208524","s":"2208524","e":true,"k":"2","d":[377],"c":[]}]]}]]}],["a",{"w":"1aa1603","s":"aa1603","e":true,"k":"a","d":[58],"c":[]}],["4",{"w":"14","s":"4","e":true,"k":"4","d":[517],"c":[["4",{"w":"144","s":"4","e":true,"k":"4","d":[233,367],"c":[["0",{"w":"1440","s":"0","e":true,"k":"0","d":[69],"c":[]}],["6",{"w":"14461","s":"61","e":true,"k":"6","d":[255],"c":[]}]]}],["2",{"w":"142","s":"2","e":true,"k":"2","d":[221],"c":[["2",{"w":"142221","s":"221","e":true,"k":"2","d":[379],"c":[]}]]}],["1",{"w":"141200","s":"1200","e":true,"k":"1","d":[372],"c":[]}]]}],["6",{"w":"16","s":"6","e":true,"k":"6","d":[87,133,145,158,179,374,376,517],"c":[["5",{"w":"165","s":"5","e":true,"k":"5","d":[93],"c":[]}],["0",{"w":"1600000000","s":"00000000","e":true,"k":"0","d":[156],"c":[]}],["3",{"w":"163","s":"3","e":true,"k":"3","d":[229],"c":[]}],["2",{"w":"1622875042","s":"22875042","e":true,"k":"2","d":[255],"c":[]}],["g",{"w":"16gb","s":"gb","e":true,"k":"g","d":[502],"c":[]}]]}],["'",{"w":"1'","s":"'","e":true,"k":"'","d":[371],"c":[]}]]}],["v",{"w":"v","s":"v","e":false,"k":"v","d":[],"c":[["a",{"w":"va","s":"a","e":false,"k":"a","d":[],"c":[["l",{"w":"val","s":"l","e":false,"k":"l","d":[],"c":[["u",{"w":"valu","s":"u","e":false,"k":"u","d":[],"c":[["e",{"w":"value","s":"e","e":true,"k":"e","d":[4,5,6,7,12,22,49,51,67,69,71,76,79,80,83,84,85,86,87,88,89,91,92,95,96,97,99,100,102,103,104,105,106,107,108,111,112,114,115,116,118,120,121,123,124,128,130,131,132,133,136,137,139,140,142,145,146,147,148,151,153,154,156,158,159,163,164,166,167,168,170,171,172,173,174,175,176,177,179,180,181,187,188,189,191,193,201,224,226,227,229,230,231,234,239,241,244,245,246,346,348,353,356,358,359,360,361,362,366,368,371,372,377,379,380,510,514,515,517],"c":[["s",{"w":"values","s":"s","e":true,"k":"s","d":[6,7,8,9,12,51,52,64,71,72,77,78,81,82,83,84,85,87,88,92,96,97,100,102,103,106,107,108,110,111,114,116,118,120,121,128,130,133,134,136,137,138,139,140,142,144,146,148,151,153,154,155,157,158,159,161,164,165,168,170,172,173,176,179,181,187,191,193,196,197,199,201,224,226,229,234,245,348,351,353,356,360,361,365,366,368,372,374,379,382,383,384,385,386,387,514,516],"c":[]}],["-",{"w":"value-t","s":"-t","e":false,"k":"-","d":[],"c":[["y",{"w":"value-type","s":"ype","e":true,"k":"y","d":[79,97],"c":[["-",{"w":"value-type-","s":"-","e":false,"k":"-","d":[],"c":[["0",{"w":"value-type-0","s":"0","e":true,"k":"0","d":[83],"c":[]}],["1",{"w":"value-type-1","s":"1","e":true,"k":"1","d":[83],"c":[]}]]}]]}],["u",{"w":"value-tuple","s":"uple","e":true,"k":"u","d":[132,167],"c":[]}]]}],["'",{"w":"value'","s":"'","e":true,"k":"'","d":[246],"c":[["s",{"w":"value's","s":"s","e":true,"k":"s","d":[100],"c":[]}]]}]]}],["a",{"w":"valuable","s":"able","e":true,"k":"a","d":[71,95,156],"c":[]}]]}],["i",{"w":"valid","s":"id","e":true,"k":"i","d":[12,21,27,71,83,84,90,93,94,98,103,106,109,110,111,117,123,128,131,138,141,142,147,157,162,168,169,175,176,181,191,194,198,200,224,226,234,243,245,348,368,517],"c":[["a",{"w":"validat","s":"at","e":false,"k":"a","d":[],"c":[["e",{"w":"validate","s":"e","e":true,"k":"e","d":[21,22,26,30,50,81,85,87,94,95,109,110,118,124,126,131,133,136,138,139,141,142,143,144,146,147,148,150,151,153,157,158,159,162,166,169,175,179,184,193,194,200,226,234,368,511,513],"c":[["-",{"w":"validate-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"validate-a","s":"a","e":false,"k":"a","d":[],"c":[["-",{"w":"validate-a-contract","s":"-contract","e":true,"k":"-","d":[22,26,30],"c":[]}],["m",{"w":"validate-amount","s":"mount","e":true,"k":"m","d":[129],"c":[]}]]}],["l",{"w":"validate-list-length","s":"list-length","e":true,"k":"l","d":[110],"c":[]}]]}],["d",{"w":"validated","s":"d","e":true,"k":"d","d":[30],"c":[]}],["s",{"w":"validates","s":"s","e":true,"k":"s","d":[110,124,136],"c":[]}],["w",{"w":"validatewithabi","s":"withabi","e":true,"k":"w","d":[226,230,234,368],"c":[]}]]}],["i",{"w":"validati","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"validating","s":"ng","e":true,"k":"n","d":[81,85,94,109,110,118,124,126,131,136,138,141,142,143,148,150,151,153,157,159,162,166,169,175,184,193,194,200,511,513],"c":[]}],["o",{"w":"validation","s":"on","e":true,"k":"o","d":[82,83,84,85,87,89,91,93,94,98,101,104,105,106,107,109,110,111,117,118,121,124,129,131,132,133,135,136,138,139,141,142,143,146,147,148,150,151,153,155,156,157,158,159,162,165,166,167,168,169,170,171,172,175,177,179,181,184,185,186,189,194,195,197,198,200],"c":[["s",{"w":"validations","s":"s","e":true,"k":"s","d":[190],"c":[]}]]}]]}]]}]]}]]}],["r",{"w":"var","s":"r","e":true,"k":"r","d":[9,20,375,517],"c":[["-",{"w":"var-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"var-set","s":"set","e":true,"k":"s","d":[6,7,12,28,69,81,99,100,102,108,112,114,122,126,128,131,137,140,149,154,163,175,176,180,187,191,192,224,245,348,360,361,377,511,513,516,517],"c":[]}],["g",{"w":"var-get","s":"get","e":true,"k":"g","d":[6,7,12,28,69,81,92,99,100,102,108,112,114,115,122,126,128,131,137,140,149,154,160,163,175,176,180,185,187,191,192,202,224,245,348,360,361,377,511,513,516,517],"c":[]}],["n",{"w":"var-name","s":"name","e":true,"k":"n","d":[131,175],"c":[]}]]}],["i",{"w":"vari","s":"i","e":false,"k":"i","d":[],"c":[["a",{"w":"varia","s":"a","e":false,"k":"a","d":[],"c":[["b",{"w":"variable","s":"ble","e":true,"k":"b","d":[7,12,26,71,82,84,85,88,89,91,92,93,94,98,100,101,102,105,106,107,109,110,111,112,118,120,121,124,126,128,131,132,135,136,137,138,139,140,141,142,143,146,147,148,150,151,153,155,157,159,162,165,166,167,168,169,170,171,172,173,175,180,181,183,184,185,186,189,194,195,197,198,200,224,226,234,245,246,348,361,368,511,513],"c":[["s",{"w":"variables","s":"s","e":true,"k":"s","d":[7,12,22,30,69,81,92,100,102,108,112,114,116,131,134,137,140,154,170,171,173,175,176,191,245,348,361,516],"c":[]}],["'",{"w":"variable's","s":"'s","e":true,"k":"'","d":[100],"c":[]}]]}],["n",{"w":"variant","s":"nt","e":true,"k":"n","d":[68,69,71,74,230,425,443],"c":[]}],["t",{"w":"variations","s":"tions","e":true,"k":"t","d":[202],"c":[]}]]}],["o",{"w":"various","s":"ous","e":true,"k":"o","d":[12,19,25,49,51,68,71,83,92,102,110,112,137,140,145,174,182,187,227,228,236,245,259,348,370,511,513],"c":[]}],["e",{"w":"varie","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"varies","s":"s","e":true,"k":"s","d":[104],"c":[]}],["t",{"w":"variety","s":"ty","e":true,"k":"t","d":[425,443],"c":[]}]]}]]}],["n",{"w":"varname","s":"name","e":true,"k":"n","d":[117,131,175],"c":[]}],["y",{"w":"vary","s":"y","e":true,"k":"y","d":[202],"c":[["i",{"w":"varying","s":"ing","e":true,"k":"i","d":[180],"c":[]}]]}]]}],["g",{"w":"vague","s":"gue","e":true,"k":"g","d":[193],"c":[]}],["u",{"w":"vault","s":"ult","e":true,"k":"u","d":[202,374],"c":[]}]]}],["e",{"w":"ve","s":"e","e":true,"k":"e","d":[51],"c":[["r",{"w":"ver","s":"r","e":false,"k":"r","d":[],"c":[["s",{"w":"vers","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"version","s":"ion","e":true,"k":"i","d":[7,14,15,17,27,48,50,68,71,75,95,141,180,219,221,222,223,229,233,234,235,236,353,354,355,356,361,366,367,368,369,370,374,375,376,377,378,379,426,444,502,510,515,517],"c":[["s",{"w":"versions","s":"s","e":true,"k":"s","d":[86,90,119,180,185,219],"c":[]}],["-",{"w":"version-byte","s":"-byte","e":true,"k":"-","d":[200],"c":[]}],["b",{"w":"versionbyte","s":"byte","e":true,"k":"b","d":[200],"c":[]}],["e",{"w":"versionedsmartcontractpayload","s":"edsmartcontractpayload","e":true,"k":"e","d":[229],"c":[["w",{"w":"versionedsmartcontractpayloadwire","s":"wire","e":true,"k":"w","d":[229],"c":[]}]]}]]}],["a",{"w":"versatil","s":"atil","e":false,"k":"a","d":[],"c":[["i",{"w":"versatility","s":"ity","e":true,"k":"i","d":[76],"c":[]}],["e",{"w":"versatile","s":"e","e":true,"k":"e","d":[120,182],"c":[]}]]}]]}],["i",{"w":"verif","s":"if","e":false,"k":"i","d":[],"c":[["i",{"w":"verifi","s":"i","e":false,"k":"i","d":[],"c":[["e",{"w":"verifie","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"verifies","s":"s","e":true,"k":"s","d":[12,95,169,224,245,348,511,513],"c":[]}],["d",{"w":"verified","s":"d","e":true,"k":"d","d":[52,71,231,233,354,367],"c":[]}]]}],["c",{"w":"verification","s":"cation","e":true,"k":"c","d":[72,80,95,104,156,162,169,346,509],"c":[["s",{"w":"verifications","s":"s","e":true,"k":"s","d":[161],"c":[]}]]}]]}],["y",{"w":"verify","s":"y","e":true,"k":"y","d":[12,13,14,15,16,17,30,54,71,80,81,91,95,104,123,125,127,156,161,162,169,173,190,195,202,224,226,233,234,238,245,346,348,350,354,367,368,375,379,399,425,427,443,459,510,511,513],"c":[["-",{"w":"verify-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"verify-archive-data","s":"archive-data","e":true,"k":"a","d":[13,14,15,17],"c":[]}],["d",{"w":"verify-document","s":"document","e":true,"k":"d","d":[80],"c":[]}],["b",{"w":"verify-b","s":"b","e":false,"k":"b","d":[],"c":[["t",{"w":"verify-btc-block-hash","s":"tc-block-hash","e":true,"k":"t","d":[95],"c":[]}],["l",{"w":"verify-block-hash","s":"lock-hash","e":true,"k":"l","d":[104],"c":[]}]]}],["s",{"w":"verify-signature","s":"signature","e":true,"k":"s","d":[169],"c":[["s",{"w":"verify-signatures","s":"s","e":true,"k":"s","d":[354],"c":[]}]]}]]}],["i",{"w":"verifying","s":"ing","e":true,"k":"i","d":[68,71,80,95,104,156,161,162,169,173,195],"c":[]}],["m",{"w":"verifymessagesignaturersv","s":"messagesignaturersv","e":true,"k":"m","d":[71,354],"c":[]}],["s",{"w":"verifysignature","s":"signature","e":true,"k":"s","d":[354],"c":[]}]]}]]}],["c",{"w":"vercel","s":"cel","e":true,"k":"c","d":[75],"c":[]}],["y",{"w":"very","s":"y","e":true,"k":"y","d":[108,114,144,154,183],"c":[]}]]}],["s",{"w":"vest","s":"st","e":true,"k":"s","d":[102],"c":[["i",{"w":"vesting","s":"ing","e":true,"k":"i","d":[102,176],"c":[["_",{"w":"vesting_period","s":"_period","e":true,"k":"_","d":[102,176],"c":[]}],["-",{"w":"vesting-rat","s":"-rat","e":false,"k":"-","d":[],"c":[["e",{"w":"vesting-rate","s":"e","e":true,"k":"e","d":[102],"c":[]}],["i",{"w":"vesting-ratio","s":"io","e":true,"k":"i","d":[176],"c":[]}]]}],["s",{"w":"vestingstarttime","s":"starttime","e":true,"k":"s","d":[176],"c":[]}]]}],["e",{"w":"vested","s":"ed","e":true,"k":"e","d":[102,176],"c":[["-",{"w":"vested-amount","s":"-amount","e":true,"k":"-","d":[102,176],"c":[]}]]}]]}]]}],["i",{"w":"vi","s":"i","e":false,"k":"i","d":[],"c":[["t",{"w":"vitest","s":"test","e":true,"k":"t","d":[8,9,20,29,30,224,246,375],"c":[]}],["e",{"w":"view","s":"ew","e":true,"k":"e","d":[9,13,27,47,50,51,69,74,134,202,219,220,222,243,353,371,372,377,425,443,466,504],"c":[["i",{"w":"viewing","s":"ing","e":true,"k":"i","d":[15,219,220],"c":[]}],["-",{"w":"view-alerts-page","s":"-alerts-page","e":true,"k":"-","d":[51],"c":[]}]]}],["a",{"w":"via","s":"a","e":true,"k":"a","d":[14,27,31,44,50,52,53,68,69,74,99,208,219,220,226,227,232,233,234,236,239,242,355,367,368,370,424,466],"c":[]}],["s",{"w":"vis","s":"s","e":false,"k":"s","d":[],"c":[["u",{"w":"visual","s":"ual","e":true,"k":"u","d":[50],"c":[["s",{"w":"visualstudio","s":"studio","e":true,"k":"s","d":[18],"c":[]}],["i",{"w":"visualizations","s":"izations","e":true,"k":"i","d":[68,70],"c":[]}]]}],["i",{"w":"visi","s":"i","e":false,"k":"i","d":[],"c":[["b",{"w":"visib","s":"b","e":false,"k":"b","d":[],"c":[["l",{"w":"visible","s":"le","e":true,"k":"l","d":[48],"c":[]}],["i",{"w":"visibility","s":"ility","e":true,"k":"i","d":[92,190],"c":[]}]]}],["t",{"w":"visit","s":"t","e":true,"k":"t","d":[49],"c":[]}]]}]]}],["d",{"w":"video","s":"deo","e":true,"k":"d","d":[70],"c":[]}]]}],["1",{"w":"v1","s":"1","e":true,"k":"1","d":[8,14,32,34,35,36,37,38,39,41,42,43,57,58,60,61,62,63,114,154,173,176,191,206,207,214,215,216,218,219,222,246,249,251,252,253,254,258,261,262,265,268,269,270,271,272,274,275,276,277,278,279,281,283,284,285,286,293,295,296,297,298,300,302,305,306,308,309,310,311,312,313,315,316,319,320,321,322,323,324,325,326,327,328,329,330,332,340,342,343,344,374,376,379,429,430,432,433,435,436,437,438,441,442,446,447,449,450,451,452,454,455,456,457,458,461,464,465,469,470,472,473,475,476,477,478,480,481,483,484,486,487,488,489,491,492,493,494,495,497,499,500],"c":[]}],["2",{"w":"v2","s":"2","e":true,"k":"2","d":[17,114,154,173,176,191,219,221,222,246,259,260,264,266,267,287,289,290,291,292,303,304,314,333,335,336,338,389,391,392,393,395,396,398,401,402,405,410,411,413,414,415,416,418,509,514],"c":[]}],["s",{"w":"vs","s":"s","e":true,"k":"s","d":[50,77,114,154,222,229,259],"c":[["c",{"w":"vscode","s":"code","e":true,"k":"c","d":[18,29,30],"c":[]}]]}],["0",{"w":"v0","s":"0","e":true,"k":"0","d":[18,58,517],"c":[]}],["o",{"w":"vo","s":"o","e":false,"k":"o","d":[],"c":[["t",{"w":"vot","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"vote","s":"e","e":true,"k":"e","d":[69,79,80,81,202,377],"c":[["d",{"w":"voted","s":"d","e":true,"k":"d","d":[68,69,377],"c":[]}],["s",{"w":"votes","s":"s","e":true,"k":"s","d":[69,79,80,202],"c":[["-",{"w":"votes-","s":"-","e":false,"k":"-","d":[],"c":[["f",{"w":"votes-for","s":"for","e":true,"k":"f","d":[69],"c":[]}],["a",{"w":"votes-against","s":"against","e":true,"k":"a","d":[69],"c":[]}]]}],["f",{"w":"votesfor","s":"for","e":true,"k":"f","d":[81],"c":[]}],["a",{"w":"votesagainst","s":"against","e":true,"k":"a","d":[81],"c":[]}]]}],["r",{"w":"voter","s":"r","e":true,"k":"r","d":[69,79,377],"c":[["s",{"w":"voters","s":"s","e":true,"k":"s","d":[79],"c":[]}]]}],["f",{"w":"votefor","s":"for","e":true,"k":"f","d":[81],"c":[]}],["-",{"w":"vote-for-aggregate-public-key","s":"-for-aggregate-public-key","e":true,"k":"-","d":[221],"c":[]}],["c",{"w":"votecount","s":"count","e":true,"k":"c","d":[377],"c":[]}]]}],["i",{"w":"voting","s":"ing","e":true,"k":"i","d":[69,77,79,80,202,377],"c":[]}]]}],["l",{"w":"volu","s":"lu","e":false,"k":"l","d":[],"c":[["n",{"w":"voluntarily","s":"ntarily","e":true,"k":"n","d":[115],"c":[]}],["m",{"w":"volume","s":"me","e":true,"k":"m","d":[239],"c":[["s",{"w":"volumes","s":"s","e":true,"k":"s","d":[515],"c":[]}]]}]]}]]}],["u",{"w":"vulnerabilities","s":"ulnerabilities","e":true,"k":"u","d":[126,192],"c":[]}],["r",{"w":"vrf","s":"rf","e":true,"k":"r","d":[127,516],"c":[["-",{"w":"vrf-seed","s":"-seed","e":true,"k":"-","d":[127],"c":[]}]]}],["7",{"w":"v7","s":"7","e":true,"k":"7","d":[231],"c":[]}],["b",{"w":"vbyte","s":"byte","e":true,"k":"b","d":[233,367],"c":[]}],["3",{"w":"v3","s":"3","e":true,"k":"3","d":[407,408,409],"c":[]}]]}],["g",{"w":"g","s":"g","e":true,"k":"g","d":[52,65,86,125,147,156,163,178,182,223,239,355,375,439,462],"c":[["r",{"w":"gr","s":"r","e":false,"k":"r","d":[],"c":[["o",{"w":"gro","s":"o","e":false,"k":"o","d":[],"c":[["u",{"w":"grou","s":"u","e":false,"k":"u","d":[],"c":[["p",{"w":"group","s":"p","e":true,"k":"p","d":[9,11,44,83,108,163,233,256,367,381,420,466,501,505],"c":[["'",{"w":"group'","s":"'","e":true,"k":"'","d":[4,5,6,7,67,226,227,230,244,353,358,359,360,361,362,371,372],"c":[]}],["-",{"w":"group-","s":"-","e":false,"k":"-","d":[],"c":[["h",{"w":"group-hover","s":"hover","e":true,"k":"h","d":[44,230,239,244,420,466],"c":[]}],["b",{"w":"group-by-block","s":"by-block","e":true,"k":"b","d":[219,220],"c":[]}],["d",{"w":"group-data-","s":"data-","e":true,"k":"d","d":[244],"c":[]}]]}],["i",{"w":"grouping","s":"ing","e":true,"k":"i","d":[83,163],"c":[]}],["e",{"w":"grouped","s":"ed","e":true,"k":"e","d":[83,219,220],"c":[]}],["s",{"w":"groups","s":"s","e":true,"k":"s","d":[224],"c":[]}]]}],["n",{"w":"ground","s":"nd","e":true,"k":"n","d":[50],"c":[["w",{"w":"groundwork","s":"work","e":true,"k":"w","d":[71],"c":[]}]]}]]}],["w",{"w":"grow","s":"w","e":false,"k":"w","d":[],"c":[["t",{"w":"growth","s":"th","e":true,"k":"t","d":[126],"c":[]}],["i",{"w":"growing","s":"ing","e":true,"k":"i","d":[149],"c":[]}]]}]]}],["a",{"w":"gra","s":"a","e":false,"k":"a","d":[],"c":[["p",{"w":"graph","s":"ph","e":true,"k":"p","d":[459],"c":[["i",{"w":"graphical","s":"ical","e":true,"k":"i","d":[9],"c":[]}]]}],["n",{"w":"gran","s":"n","e":false,"k":"n","d":[],"c":[["t",{"w":"grant","s":"t","e":true,"k":"t","d":[68,69,510],"c":[["s",{"w":"grants","s":"s","e":true,"k":"s","d":[68,69],"c":[["_",{"w":"grants_","s":"_","e":true,"k":"_","d":[69],"c":[]}]]}],["i",{"w":"granting","s":"ing","e":true,"k":"i","d":[69],"c":[]}],["-",{"w":"grant-permission","s":"-permission","e":true,"k":"-","d":[130],"c":[]}]]}],["u",{"w":"granular","s":"ular","e":true,"k":"u","d":[81],"c":[]}]]}],["c",{"w":"gracefully","s":"cefully","e":true,"k":"c","d":[123,124,136,166,180,193,201],"c":[]}]]}],["e",{"w":"great","s":"eat","e":true,"k":"e","d":[515],"c":[["e",{"w":"greater","s":"er","e":true,"k":"e","d":[15,52,69,71,104,114,145,154,174,176,191,231,371,372,511,513],"c":[["e",{"w":"greaterequal","s":"equal","e":true,"k":"e","d":[226,234,368],"c":[]}]]}],["l",{"w":"greatly","s":"ly","e":true,"k":"l","d":[100],"c":[]}]]}],["i",{"w":"grid","s":"id","e":true,"k":"i","d":[352],"c":[["-",{"w":"grid-cols-1'","s":"-cols-1'","e":true,"k":"-","d":[423],"c":[]}]]}]]}],["e",{"w":"ge","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"get","s":"t","e":true,"k":"t","d":[6,7,8,9,12,22,44,45,47,52,53,54,55,58,69,71,73,79,80,81,83,85,90,95,97,103,104,109,110,115,116,119,123,125,126,127,151,156,160,178,182,190,192,201,202,208,219,222,224,226,227,229,233,236,245,246,259,348,352,356,360,361,366,367,370,373,376,377,399,420,422,423,459,466,502,511,513,515,516,517],"c":[["t",{"w":"gett","s":"t","e":false,"k":"t","d":[],"c":[["i",{"w":"getting","s":"ing","e":true,"k":"i","d":[5,7,24,65,110,149,240,246,257,345,359,361,439,462],"c":[["-",{"w":"getting-started","s":"-started","e":true,"k":"-","d":[68,374,376],"c":[]}]]}],["e",{"w":"getter","s":"er","e":true,"k":"e","d":[116,134],"c":[]}],["r",{"w":"gettransferfeeestimateapiurl","s":"ransferfeeestimateapiurl","e":true,"k":"r","d":[227,236,370],"c":[]}]]}],["-",{"w":"get-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"get-p","s":"p","e":false,"k":"p","d":[],"c":[["a",{"w":"get-par","s":"ar","e":false,"k":"a","d":[],"c":[["t",{"w":"get-participant","s":"ticipant","e":true,"k":"t","d":[6,7,360,361,516],"c":[["-",{"w":"get-participant-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"get-participant-data","s":"data","e":true,"k":"d","d":[6,360],"c":[]}],["s",{"w":"get-participant-share","s":"share","e":true,"k":"s","d":[112],"c":[]}]]}]]}],["a",{"w":"get-parameter","s":"ameter","e":true,"k":"a","d":[69],"c":[]}]]}],["r",{"w":"get-pr","s":"r","e":false,"k":"r","d":[],"c":[["i",{"w":"get-price","s":"ice","e":true,"k":"i","d":[71],"c":[]}],["o",{"w":"get-profile","s":"ofile","e":true,"k":"o","d":[97],"c":[["-",{"w":"get-profile-","s":"-","e":false,"k":"-","d":[],"c":[["n",{"w":"get-profile-name","s":"name","e":true,"k":"n","d":[116],"c":[]}],["a",{"w":"get-profile-age","s":"age","e":true,"k":"a","d":[116],"c":[]}]]}]]}]]}],["o",{"w":"get-points","s":"oints","e":true,"k":"o","d":[77],"c":[]}],["e",{"w":"get-period-end-height","s":"eriod-end-height","e":true,"k":"e","d":[202],"c":[]}]]}],["b",{"w":"get-b","s":"b","e":false,"k":"b","d":[],"c":[["y",{"w":"get-byte-array","s":"yte-array","e":true,"k":"y","d":[6,360],"c":[]}],["t",{"w":"get-btc-buffer","s":"tc-buffer","e":true,"k":"t","d":[6,360],"c":[]}],["a",{"w":"get-balance","s":"alance","e":true,"k":"a","d":[7,69,79,81,92,119,134,152,160,201,361],"c":[["-",{"w":"get-balance-","s":"-","e":false,"k":"-","d":[],"c":[["b",{"w":"get-balance-by-sender","s":"by-sender","e":true,"k":"b","d":[12,224,245,348],"c":[]}],["s",{"w":"get-balance-stx","s":"stx","e":true,"k":"s","d":[516],"c":[]}]]}]]}],["u",{"w":"get-bu","s":"u","e":false,"k":"u","d":[],"c":[["y",{"w":"get-buy-price","s":"y-price","e":true,"k":"y","d":[71],"c":[]}],["r",{"w":"get-burn-block-info","s":"rn-block-info","e":true,"k":"r","d":[95,156],"c":[]}]]}],["l",{"w":"get-block","s":"lock","e":true,"k":"l","d":[377],"c":[["-",{"w":"get-block-info","s":"-info","e":true,"k":"-","d":[95,104,127,156,161,202],"c":[]}]]}],["r",{"w":"get-brc20-tokens","s":"rc20-tokens","e":true,"k":"r","d":[459],"c":[]}]]}],["t",{"w":"get-t","s":"t","e":false,"k":"t","d":[],"c":[["x",{"w":"get-tx-hash","s":"x-hash","e":true,"k":"x","d":[6,360],"c":[]}],["o",{"w":"get-to","s":"o","e":false,"k":"o","d":[],"c":[["t",{"w":"get-total-","s":"tal-","e":false,"k":"t","d":[],"c":[["s",{"w":"get-total-supply","s":"supply","e":true,"k":"s","d":[69],"c":[]}],["m",{"w":"get-total-micro-balance","s":"micro-balance","e":true,"k":"m","d":[185],"c":[]}],["v",{"w":"get-total-votes","s":"votes","e":true,"k":"v","d":[202,377],"c":[]}]]}],["k",{"w":"get-token","s":"ken","e":false,"k":"k","d":[],"c":[["-",{"w":"get-token-uri","s":"-uri","e":true,"k":"-","d":[69,119],"c":[]}],["s",{"w":"get-tokenssold","s":"ssold","e":true,"k":"s","d":[154],"c":[]}]]}],["d",{"w":"get-todo","s":"do","e":true,"k":"d","d":[180],"c":[]}]]}],["e",{"w":"get-tenure-info","s":"enure-info","e":true,"k":"e","d":[104,127],"c":[]}],["r",{"w":"get-transfers-per-block","s":"ransfers-per-block","e":true,"k":"r","d":[459],"c":[]}],["i",{"w":"get-ticket","s":"icket","e":true,"k":"i","d":[516],"c":[]}]]}],["a",{"w":"get-a","s":"a","e":false,"k":"a","d":[],"c":[["d",{"w":"get-addresses","s":"ddresses","e":true,"k":"d","d":[6,360],"c":[]}],["c",{"w":"get-account","s":"ccount","e":true,"k":"c","d":[7,361],"c":[["s",{"w":"get-accounts","s":"s","e":true,"k":"s","d":[7,361],"c":[]}]]}],["m",{"w":"get-amount-owed","s":"mount-owed","e":true,"k":"m","d":[12,245,348],"c":[]}],["s",{"w":"get-assets","s":"ssets","e":true,"k":"s","d":[67],"c":[]}],["l",{"w":"get-all-settings","s":"ll-settings","e":true,"k":"l","d":[76],"c":[]}]]}],["f",{"w":"get-f","s":"f","e":false,"k":"f","d":[],"c":[["t",{"w":"get-ft-balance","s":"t-balance","e":true,"k":"t","d":[7,361],"c":[]}],["l",{"w":"get-flag","s":"lag","e":true,"k":"l","d":[128],"c":[]}]]}],["n",{"w":"get-n","s":"n","e":false,"k":"n","d":[],"c":[["f",{"w":"get-nft-","s":"ft-","e":false,"k":"f","d":[],"c":[["b",{"w":"get-nft-balance","s":"balance","e":true,"k":"b","d":[7,361],"c":[]}],["o",{"w":"get-nft-owner","s":"owner","e":true,"k":"o","d":[195],"c":[]}]]}],["a",{"w":"get-name","s":"ame","e":true,"k":"a","d":[69,92],"c":[]}]]}],["d",{"w":"get-de","s":"de","e":false,"k":"d","d":[],"c":[["p",{"w":"get-deployer-balance","s":"ployer-balance","e":true,"k":"p","d":[7,361],"c":[]}],["c",{"w":"get-decimals","s":"cimals","e":true,"k":"c","d":[69,92],"c":[]}]]}],["c",{"w":"get-c","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"get-co","s":"o","e":false,"k":"o","d":[],"c":[["n",{"w":"get-contribution-amount","s":"ntribution-amount","e":true,"k":"n","d":[7,361],"c":[]}],["u",{"w":"get-count","s":"unt","e":true,"k":"u","d":[9,22,26,30,356,366,517],"c":[["e",{"w":"get-counter","s":"er","e":true,"k":"e","d":[100],"c":[]}]]}]]}],["u",{"w":"get-cur","s":"ur","e":false,"k":"u","d":[],"c":[["r",{"w":"get-current-","s":"rent-","e":false,"k":"r","d":[],"c":[["t",{"w":"get-current-total-votes","s":"total-votes","e":true,"k":"t","d":[69],"c":[]}],["r",{"w":"get-current-reward-cycle","s":"reward-cycle","e":true,"k":"r","d":[516],"c":[]}]]}],["s",{"w":"get-cursor","s":"sor","e":true,"k":"s","d":[131],"c":[]}]]}],["l",{"w":"get-claimable-tokens","s":"laimable-tokens","e":true,"k":"l","d":[191],"c":[]}],["i",{"w":"get-city-id","s":"ity-id","e":true,"k":"i","d":[516],"c":[]}]]}],["s",{"w":"get-s","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"get-st","s":"t","e":false,"k":"t","d":[],"c":[["a",{"w":"get-sta","s":"a","e":false,"k":"a","d":[],"c":[["r",{"w":"get-started","s":"rted","e":true,"k":"r","d":[44,466],"c":[]}],["c",{"w":"get-stacks-block-info","s":"cks-block-info","e":true,"k":"c","d":[104,156],"c":[]}]]}],["x",{"w":"get-stx-","s":"x-","e":false,"k":"x","d":[],"c":[["a",{"w":"get-stx-account-info","s":"account-info","e":true,"k":"a","d":[98],"c":[]}],["b",{"w":"get-stx-balance","s":"balance","e":true,"k":"b","d":[198],"c":[]}]]}]]}],["y",{"w":"get-symbol","s":"ymbol","e":true,"k":"y","d":[69,92],"c":[]}],["e",{"w":"get-sell-price","s":"ell-price","e":true,"k":"e","d":[71],"c":[]}],["u",{"w":"get-successful-response","s":"uccessful-response","e":true,"k":"u","d":[121],"c":[]}],["n",{"w":"get-snapshot-balance","s":"napshot-balance","e":true,"k":"n","d":[202],"c":[]}],["a",{"w":"get-sa","s":"a","e":false,"k":"a","d":[],"c":[["t",{"w":"get-satoshi","s":"toshi","e":true,"k":"t","d":[459],"c":[]}],["v",{"w":"get-save-rnd","s":"ve-rnd","e":true,"k":"v","d":[516],"c":[]}]]}]]}],["k",{"w":"get-keys-","s":"keys-","e":false,"k":"k","d":[],"c":[["b",{"w":"get-keys-balance","s":"balance","e":true,"k":"b","d":[71],"c":[]}],["s",{"w":"get-keys-supply","s":"supply","e":true,"k":"s","d":[71],"c":[]}]]}],["v",{"w":"get-v","s":"v","e":false,"k":"v","d":[],"c":[["o",{"w":"get-votes","s":"otes","e":true,"k":"o","d":[79],"c":[]}],["e",{"w":"get-vested-amount","s":"ested-amount","e":true,"k":"e","d":[102,176],"c":[]}]]}],["e",{"w":"get-e","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"get-et","s":"t","e":false,"k":"t","d":[],"c":[["h",{"w":"get-eth-","s":"h-","e":false,"k":"h","d":[],"c":[["a",{"w":"get-eth-address","s":"address","e":true,"k":"a","d":[80],"c":[]}],["h",{"w":"get-eth-hash","s":"hash","e":true,"k":"h","d":[80],"c":[]}]]}],["c",{"w":"get-etchings","s":"chings","e":true,"k":"c","d":[427],"c":[]}]]}],["v",{"w":"get-even","s":"ven","e":false,"k":"v","d":[],"c":[["t",{"w":"get-eventlog","s":"tlog","e":true,"k":"t","d":[149],"c":[]}],["-",{"w":"get-even-numbers","s":"-numbers","e":true,"k":"-","d":[177],"c":[]}]]}]]}],["u",{"w":"get-user-","s":"user-","e":false,"k":"u","d":[],"c":[["i",{"w":"get-user-info","s":"info","e":true,"k":"i","d":[83],"c":[]}],["a",{"w":"get-user-age","s":"age","e":true,"k":"a","d":[85,151],"c":[]}],["p",{"w":"get-user-profile","s":"profile","e":true,"k":"p","d":[103],"c":[]}],["d",{"w":"get-user-data","s":"data","e":true,"k":"d","d":[172],"c":[]}]]}],["h",{"w":"get-highest-bid","s":"highest-bid","e":true,"k":"h","d":[114],"c":[]}],["o",{"w":"get-o","s":"o","e":false,"k":"o","d":[],"c":[["w",{"w":"get-owner","s":"wner","e":true,"k":"w","d":[122],"c":[]}],["r",{"w":"get-or-create-city-id","s":"r-create-city-id","e":true,"k":"r","d":[516],"c":[]}]]}],["l",{"w":"get-list","s":"list","e":true,"k":"l","d":[126],"c":[["i",{"w":"get-listing","s":"ing","e":true,"k":"i","d":[511,513],"c":[]}]]}],["m",{"w":"get-miner-spend-ratio","s":"miner-spend-ratio","e":true,"k":"m","d":[127],"c":[]}],["i",{"w":"get-inscription","s":"inscription","e":false,"k":"i","d":[],"c":[["-",{"w":"get-inscription-content","s":"-content","e":true,"k":"-","d":[459],"c":[]}],["s",{"w":"get-inscriptions","s":"s","e":true,"k":"s","d":[459],"c":[]}]]}]]}],["a",{"w":"geta","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"getaccount","s":"ccount","e":false,"k":"c","d":[],"c":[["s",{"w":"getaccounts","s":"s","e":true,"k":"s","d":[7,9,12,224,245,246,348,361],"c":[]}],["t",{"w":"getaccounttransactions","s":"transactions","e":true,"k":"t","d":[64,365,382,383,384,385,386,387],"c":[]}],["a",{"w":"getaccounta","s":"a","e":false,"k":"a","d":[],"c":[["s",{"w":"getaccountassets","s":"ssets","e":true,"k":"s","d":[67],"c":[]}],["p",{"w":"getaccountapiurl","s":"piurl","e":true,"k":"p","d":[227,236,370],"c":[]}]]}]]}],["s",{"w":"getassetsmap","s":"ssetsmap","e":true,"k":"s","d":[7,361],"c":[]}],["d",{"w":"getaddress","s":"ddress","e":false,"k":"d","d":[],"c":[["f",{"w":"getaddressfromp","s":"fromp","e":false,"k":"f","d":[],"c":[["u",{"w":"getaddressfrompublickey","s":"ublickey","e":true,"k":"u","d":[71],"c":[]}],["r",{"w":"getaddressfromprivatekey","s":"rivatekey","e":true,"k":"r","d":[232],"c":[]}]]}],["e",{"w":"getaddresses","s":"es","e":true,"k":"e","d":[351,356,357,366],"c":[]}]]}],["b",{"w":"getabi","s":"bi","e":true,"k":"b","d":[229],"c":[["a",{"w":"getabiapiurl","s":"apiurl","e":true,"k":"a","d":[227,236,370],"c":[]}]]}]]}],["d",{"w":"getd","s":"d","e":false,"k":"d","d":[],"c":[["a",{"w":"getdatavar","s":"atavar","e":true,"k":"a","d":[7,12,224,245,246,348,361],"c":[]}],["e",{"w":"getdefaultconfig","s":"efaultconfig","e":true,"k":"e","d":[232],"c":[]}]]}],["m",{"w":"getmapentry","s":"mapentry","e":true,"k":"m","d":[7,361],"c":[]}],["c",{"w":"getco","s":"co","e":false,"k":"c","d":[],"c":[["n",{"w":"getcontr","s":"ntr","e":false,"k":"n","d":[],"c":[["i",{"w":"getcontributionamount","s":"ibutionamount","e":true,"k":"i","d":[7,361],"c":[]}],["a",{"w":"getcontract","s":"act","e":false,"k":"a","d":[],"c":[["s",{"w":"getcontracts","s":"s","e":false,"k":"s","d":[],"c":[["i",{"w":"getcontractsinterfaces","s":"interfaces","e":true,"k":"i","d":[7,361],"c":[]}],["o",{"w":"getcontractsource","s":"ource","e":true,"k":"o","d":[7,9,361],"c":[]}]]}],["a",{"w":"getcontractast","s":"ast","e":true,"k":"a","d":[7,361],"c":[]}],["m",{"w":"getcontractmapentry","s":"mapentry","e":true,"k":"m","d":[229],"c":[]}]]}]]}],["u",{"w":"getcountcall","s":"untcall","e":true,"k":"u","d":[9],"c":[]}]]}],["p",{"w":"getp","s":"p","e":false,"k":"p","d":[],"c":[["a",{"w":"getparticipant","s":"articipant","e":true,"k":"a","d":[7,361],"c":[]}],["o",{"w":"getpoxinfo","s":"oxinfo","e":true,"k":"o","d":[223],"c":[["u",{"w":"getpoxinfourl","s":"url","e":true,"k":"u","d":[227,236,370],"c":[]}]]}],["u",{"w":"getpublickey","s":"ublickey","e":true,"k":"u","d":[226],"c":[]}]]}],["_",{"w":"get_costs","s":"_costs","e":true,"k":"_","d":[22],"c":[]}],["s",{"w":"gets","s":"s","e":true,"k":"s","d":[51],"c":[]}],["f",{"w":"getftmetadata","s":"ftmetadata","e":true,"k":"f","d":[58],"c":[]}],["n",{"w":"getnonce","s":"nonce","e":true,"k":"n","d":[227,229,236,370],"c":[]}],["b",{"w":"getb","s":"b","e":false,"k":"b","d":[],"c":[["r",{"w":"getbroadcastapiurl","s":"roadcastapiurl","e":true,"k":"r","d":[227,236,370],"c":[]}],["l",{"w":"getblocktimeinfourl","s":"locktimeinfourl","e":true,"k":"l","d":[227,236,370],"c":[]}]]}],["r",{"w":"getreadonlyfunctioncallapiurl","s":"readonlyfunctioncallapiurl","e":true,"k":"r","d":[227,236,370],"c":[]}],["i",{"w":"getinfourl","s":"infourl","e":true,"k":"i","d":[227,236,370],"c":[]}],["l",{"w":"getlocalstorage","s":"localstorage","e":true,"k":"l","d":[352,356,357,366],"c":[]}]]}],["n",{"w":"gen","s":"n","e":false,"k":"n","d":[],"c":[["e",{"w":"gene","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"gener","s":"r","e":false,"k":"r","d":[],"c":[["a",{"w":"genera","s":"a","e":false,"k":"a","d":[],"c":[["t",{"w":"generat","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"generate","s":"e","e":true,"k":"e","d":[9,12,18,25,27,30,46,67,68,70,84,91,111,181,188,224,226,227,232,234,239,245,259,348,368,374,376,377,378,379,504,516],"c":[["d",{"w":"generated","s":"d","e":true,"k":"d","d":[9,27,46,64,67,226,227,239,365,371,374,376,378,382,383,384,385,386,387,399,504,516],"c":[]}],["-",{"w":"generate-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"generate-a-","s":"a-","e":false,"k":"a","d":[],"c":[["d",{"w":"generate-a-deployment-plan","s":"deployment-plan","e":true,"k":"d","d":[27],"c":[]}],["c",{"w":"generate-a-chainhook-predicate-to-target-specific-transactions","s":"chainhook-predicate-to-target-specific-transactions","e":true,"k":"c","d":[376],"c":[]}]]}],["i",{"w":"generate-identifier","s":"identifier","e":true,"k":"i","d":[188],"c":[]}]]}],["a",{"w":"generateandstoretransitkey","s":"andstoretransitkey","e":true,"k":"a","d":[67,226,227],"c":[]}],["s",{"w":"generates","s":"s","e":true,"k":"s","d":[188,378],"c":[["e",{"w":"generatesecretkey","s":"ecretkey","e":true,"k":"e","d":[229,232],"c":[]}]]}],["w",{"w":"generatewallet","s":"wallet","e":true,"k":"w","d":[232,239,240],"c":[]}],["n",{"w":"generatenewaccount","s":"newaccount","e":true,"k":"n","d":[239],"c":[]}]]}],["i",{"w":"generati","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"generating","s":"ng","e":true,"k":"n","d":[18,67,84,111,181,188,226,227,234,239,368],"c":[]}],["o",{"w":"generation","s":"on","e":true,"k":"o","d":[188,226,234,368],"c":[]}]]}]]}],["l",{"w":"general","s":"l","e":true,"k":"l","d":[72,103,145,174,379],"c":[["l",{"w":"generally","s":"ly","e":true,"k":"l","d":[14,52,76],"c":[]}]]}]]}],["i",{"w":"generic","s":"ic","e":true,"k":"i","d":[90],"c":[]}]]}],["s",{"w":"genesis","s":"sis","e":true,"k":"s","d":[13],"c":[]}]]}],["h",{"w":"genhtml","s":"html","e":true,"k":"h","d":[9],"c":[]}]]}]]}],["u",{"w":"gu","s":"u","e":false,"k":"u","d":[],"c":[["i",{"w":"guid","s":"id","e":false,"k":"i","d":[],"c":[["e",{"w":"guide","s":"e","e":true,"k":"e","d":[9,12,24,27,30,46,47,50,53,68,69,71,219,224,228,230,231,232,234,235,236,243,245,246,348,352,353,354,356,357,366,368,369,370,373,374,376,377,378,423,504,508,509,511,513,515,516],"c":[["s",{"w":"guides","s":"s","e":true,"k":"s","d":[8,9,11,12,13,14,15,17,18,22,24,26,27,30,44,45,46,47,50,52,53,68,71,74,78,219,228,230,231,241,243,245,246,256,348,350,352,353,354,356,357,366,373,374,376,377,378,379,381,420,423,425,427,443,466,501,505,508,509,510,511,513,515,516],"c":[["i",{"w":"guidesimage","s":"image","e":true,"k":"i","d":[508],"c":[]}]]}],["l",{"w":"guidelines","s":"lines","e":true,"k":"l","d":[70,72],"c":[]}]]}],["a",{"w":"guidance","s":"ance","e":true,"k":"a","d":[14,69],"c":[]}]]}],["a",{"w":"guar","s":"ar","e":false,"k":"a","d":[],"c":[["d",{"w":"guard","s":"d","e":true,"k":"d","d":[77,193],"c":[["i",{"w":"guarding","s":"ing","e":true,"k":"i","d":[77],"c":[]}],["s",{"w":"guards","s":"s","e":true,"k":"s","d":[123],"c":[]}]]}],["a",{"w":"guarantee","s":"antee","e":true,"k":"a","d":[238],"c":[]}]]}]]}],["i",{"w":"gi","s":"i","e":false,"k":"i","d":[],"c":[["t",{"w":"git","s":"t","e":true,"k":"t","d":[69,71,380,424,502,504,509],"c":[["i",{"w":"gitignore","s":"ignore","e":true,"k":"i","d":[9,20,29,30,375],"c":[]}],["h",{"w":"github","s":"hub","e":true,"k":"h","d":[9,12,14,17,18,27,28,47,53,68,69,70,71,72,75,219,221,224,226,229,230,232,234,235,236,243,245,259,346,348,352,355,356,366,368,369,370,374,379,380,424,502,504,509],"c":[]}],["a",{"w":"gitattributes","s":"attributes","e":true,"k":"a","d":[29,30],"c":[]}]]}],["v",{"w":"giv","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"give","s":"e","e":true,"k":"e","d":[69,71],"c":[["n",{"w":"given","s":"n","e":true,"k":"n","d":[22,27,71,72,79,84,90,95,98,106,107,111,156,168,181,183,198,208,233,234,246,258,259,367,368,378,379,511,513],"c":[]}],["s",{"w":"gives","s":"s","e":true,"k":"s","d":[55,115,357,377],"c":[]}]]}],["i",{"w":"giving","s":"ing","e":true,"k":"i","d":[92,355],"c":[]}]]}],["k",{"w":"gikrsamqnqo","s":"krsamqnqo","e":true,"k":"k","d":[70],"c":[]}]]}],["o",{"w":"go","s":"o","e":true,"k":"o","d":[68,77,224,246,258,510,515],"c":[["i",{"w":"going","s":"ing","e":true,"k":"i","d":[12,73,224,245,258,348,515],"c":[]}],["e",{"w":"goes","s":"es","e":true,"k":"e","d":[51,71],"c":[]}],["o",{"w":"goo","s":"o","e":false,"k":"o","d":[],"c":[["g",{"w":"google","s":"gle","e":true,"k":"g","d":[53],"c":[]}],["d",{"w":"good","s":"d","e":true,"k":"d","d":[219],"c":[]}]]}],["a",{"w":"goal","s":"al","e":true,"k":"a","d":[65,439,462],"c":[]}],["v",{"w":"governance","s":"vernance","e":true,"k":"v","d":[69,81,160],"c":[]}],["-",{"w":"go-to","s":"-to","e":true,"k":"-","d":[350],"c":[]}]]}],["z",{"w":"gz","s":"z","e":true,"k":"z","d":[14,16,17,18,517],"c":[["i",{"w":"gzip","s":"ip","e":true,"k":"i","d":[14],"c":[]}]]}],["a",{"w":"ga","s":"a","e":false,"k":"a","d":[],"c":[["i",{"w":"gai","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"gain","s":"n","e":true,"k":"n","d":[51],"c":[]}],["a",{"w":"gaia","s":"a","e":true,"k":"a","d":[244],"c":[["h",{"w":"gaiahuburl","s":"huburl","e":true,"k":"h","d":[352,356,366],"c":[]}],["a",{"w":"gaiaappkey","s":"appkey","e":true,"k":"a","d":[352,356,366],"c":[]}]]}]]}],["m",{"w":"gamify","s":"mify","e":true,"k":"m","d":[71],"c":[]}],["p",{"w":"gap-4","s":"p-4","e":true,"k":"p","d":[74,425,443],"c":[]}],["s",{"w":"gas","s":"s","e":true,"k":"s","d":[76,79,86,92,97,99,122,125,134,144,177,178,190],"c":[["-",{"w":"gas-","s":"-","e":false,"k":"-","d":[],"c":[["e",{"w":"gas-efficient","s":"efficient","e":true,"k":"e","d":[79,134],"c":[]}],["o",{"w":"gas-optimized","s":"optimized","e":true,"k":"o","d":[79,134],"c":[]}],["i",{"w":"gas-intensive","s":"intensive","e":true,"k":"i","d":[99],"c":[]}]]}]]}]]}],["y",{"w":"gyroscope","s":"yroscope","e":true,"k":"y","d":[70,72],"c":[]}],["l",{"w":"glo","s":"lo","e":false,"k":"l","d":[],"c":[["r",{"w":"glory","s":"ry","e":true,"k":"r","d":[73],"c":[]}],["b",{"w":"glob","s":"b","e":false,"k":"b","d":[],"c":[["a",{"w":"global","s":"al","e":true,"k":"a","d":[104,156,232],"c":[["l",{"w":"globally","s":"ly","e":true,"k":"l","d":[104,246],"c":[]}]]}],["e",{"w":"globe","s":"e","e":true,"k":"e","d":[228],"c":[]}]]}]]}],["m",{"w":"gm","s":"m","e":true,"k":"m","d":[517],"c":[]}]]}],["2",{"w":"2","s":"2","e":true,"k":"2","d":[5,6,7,9,12,20,22,25,27,28,30,46,47,48,49,55,70,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,219,220,221,222,223,224,226,230,231,232,233,234,239,245,246,348,352,353,354,359,360,361,367,368,374,375,376,377,379,509,510,511,513,515,516,517],"c":[["6",{"w":"26","s":"6","e":true,"k":"6","d":[7,361],"c":[["2",{"w":"262144","s":"2144","e":true,"k":"2","d":[138,157],"c":[]}]]}],["2",{"w":"22","s":"2","e":true,"k":"2","d":[235,255,369,514],"c":[["2",{"w":"222","s":"2","e":true,"k":"2","d":[7,93,361],"c":[]}],["3",{"w":"223","s":"3","e":true,"k":"3","d":[7,361],"c":[]}],["0",{"w":"220","s":"0","e":true,"k":"0","d":[7,361],"c":[]}],["-",{"w":"22-28","s":"-28","e":true,"k":"-","d":[70,73],"c":[]}]]}],["4",{"w":"24","s":"4","e":true,"k":"4","d":[239],"c":[["6",{"w":"246","s":"6","e":true,"k":"6","d":[7,361],"c":[]}],["2",{"w":"242","s":"2","e":true,"k":"2","d":[7,361],"c":[]}],["5",{"w":"245","s":"5","e":true,"k":"5","d":[9,22,229],"c":[]}]]}],["0",{"w":"20","s":"0","e":true,"k":"0","d":[83,85,138,141,151,157,170,182,188,194,199,200,235,369,375],"c":[["6",{"w":"206","s":"6","e":true,"k":"6","d":[7,361],"c":[]}],["4",{"w":"204","s":"4","e":false,"k":"4","d":[],"c":[["4",{"w":"2044","s":"4","e":false,"k":"4","d":[],"c":[["3",{"w":"20443","s":"3","e":true,"k":"3","d":[17,27,374,376],"c":[]}],["4",{"w":"20444","s":"4","e":true,"k":"4","d":[374],"c":[]}]]}],["5",{"w":"2045","s":"5","e":false,"k":"5","d":[],"c":[["5",{"w":"20455","s":"5","e":true,"k":"5","d":[374],"c":[]}],["6",{"w":"20456","s":"6","e":true,"k":"6","d":[374,376],"c":[]}]]}]]}],["v",{"w":"20vs","s":"vs","e":true,"k":"v","d":[18],"c":[]}],["c",{"w":"20c","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"20code","s":"ode","e":true,"k":"o","d":[18],"c":[]}],["h",{"w":"20checks","s":"hecks","e":true,"k":"h","d":[18],"c":[]}]]}],["e",{"w":"20extension","s":"extension","e":true,"k":"e","d":[18],"c":[]}],["b",{"w":"20brings","s":"brings","e":true,"k":"b","d":[18],"c":[]}],["d",{"w":"20debugger","s":"debugger","e":true,"k":"d","d":[18],"c":[]}],["a",{"w":"20and","s":"and","e":true,"k":"a","d":[18],"c":[]}],["m",{"w":"20more","s":"more","e":true,"k":"m","d":[18],"c":[]}],["2",{"w":"202","s":"2","e":false,"k":"2","d":[],"c":[["4",{"w":"2024-09-12t01","s":"4-09-12t01","e":true,"k":"4","d":[51],"c":[]}],["5",{"w":"2025","s":"5","e":true,"k":"5","d":[70,72],"c":[]}],["1",{"w":"2021-06-05t06","s":"1-06-05t06","e":true,"k":"1","d":[255],"c":[]}]]}],["0",{"w":"200","s":"0","e":true,"k":"0","d":[68,374,376],"c":[["n",{"w":"200n","s":"n","e":true,"k":"n","d":[226,243],"c":[]}],["0",{"w":"2000","s":"0","e":true,"k":"0","d":[516],"c":[]}]]}],["-",{"w":"20-byte","s":"-byte","e":true,"k":"-","d":[188],"c":[]}],["1",{"w":"201","s":"1","e":true,"k":"1","d":[379],"c":[]}]]}],["-",{"w":"2-latest","s":"-latest","e":true,"k":"-","d":[17],"c":[]}],["c",{"w":"2c","s":"c","e":true,"k":"c","d":[18],"c":[]}],["7",{"w":"27","s":"7","e":true,"k":"7","d":[18,517],"c":[]}],["5",{"w":"25","s":"5","e":true,"k":"5","d":[170,515],"c":[["0",{"w":"250","s":"0","e":true,"k":"0","d":[51,517],"c":[["0",{"w":"2500000n","s":"0000n","e":true,"k":"0","d":[226,234,368],"c":[]}]]}],["6",{"w":"256","s":"6","e":true,"k":"6","d":[69,84,111,119,122,181],"c":[]}],["5",{"w":"255","s":"5","e":true,"k":"5","d":[374],"c":[]}]]}],["1",{"w":"21","s":"1","e":true,"k":"1","d":[58,375],"c":[["-",{"w":"21-27","s":"-27","e":true,"k":"-","d":[73],"c":[]}],["4",{"w":"214","s":"4","e":false,"k":"4","d":[],"c":[["7",{"w":"2147483647","s":"7483647","e":true,"k":"7","d":[255],"c":[]}],["4",{"w":"21443","s":"43","e":true,"k":"4","d":[377,379],"c":[]}]]}],["5",{"w":"21544","s":"544","e":true,"k":"5","d":[377],"c":[]}]]}],["3",{"w":"23","s":"3","e":false,"k":"3","d":[],"c":[["-",{"w":"23-29","s":"-29","e":true,"k":"-","d":[73],"c":[]}],["3",{"w":"233382","s":"3382","e":true,"k":"3","d":[375],"c":[]}]]}],["8",{"w":"2801","s":"801","e":true,"k":"8","d":[229],"c":[]}]]}],["5",{"w":"5","s":"5","e":true,"k":"5","d":[5,7,9,22,27,30,46,49,51,77,79,80,82,90,105,109,110,121,126,137,155,165,170,171,176,177,183,191,197,221,232,258,359,361,374,375,376,510,516,517],"c":[["0",{"w":"50","s":"0","e":true,"k":"0","d":[69,81,97,103,116,139,142,144,146,149,161,180,352],"c":[["0",{"w":"500","s":"0","e":true,"k":"0","d":[6,49,69,231,360],"c":[["0",{"w":"50000","s":"00","e":true,"k":"0","d":[374],"c":[["0",{"w":"5000000000","s":"00000","e":true,"k":"0","d":[9,22],"c":[]}]]}]]}]]}],["8",{"w":"58","s":"8","e":true,"k":"8","d":[7,361],"c":[["9",{"w":"589","s":"9","e":false,"k":"9","d":[],"c":[["3",{"w":"5893","s":"3","e":true,"k":"3","d":[258],"c":[]}],["4",{"w":"5894","s":"4","e":true,"k":"4","d":[258],"c":[]}]]}]]}],["3",{"w":"53","s":"3","e":true,"k":"3","d":[7,361],"c":[]}],["9",{"w":"59","s":"9","e":false,"k":"9","d":[],"c":[["5",{"w":"595650","s":"5650","e":true,"k":"5","d":[11,44,256,381,466,501,505],"c":[]}],["6",{"w":"5960","s":"60","e":true,"k":"6","d":[25,27],"c":[]}]]}],["7",{"w":"5757'","s":"757'","e":true,"k":"7","d":[27],"c":[]}],["-",{"w":"5-ways-to-interact-with-devnet-in-the-hiro-platform","s":"-ways-to-interact-with-devnet-in-the-hiro-platform","e":true,"k":"-","d":[50],"c":[]}],["4",{"w":"54","s":"4","e":false,"k":"4","d":[],"c":[["5",{"w":"545094","s":"5094","e":true,"k":"5","d":[58],"c":[]}],["3",{"w":"5432","s":"32","e":true,"k":"3","d":[504],"c":[]}]]}],["_",{"w":"5_000_000","s":"_000_000","e":true,"k":"_","d":[233,367],"c":[]}]]}],["0",{"w":"0","s":"0","e":true,"k":"0","d":[6,7,8,10,12,17,18,22,27,28,58,71,76,87,91,99,104,113,118,128,130,137,153,154,155,165,177,179,190,219,221,224,226,231,232,233,234,235,239,240,245,246,255,346,348,354,356,360,361,366,367,368,369,371,372,374,375,376,377,515,517],"c":[["x",{"w":"0x","s":"x","e":true,"k":"x","d":[27],"c":[["0",{"w":"0x0","s":"0","e":false,"k":"0","d":[],"c":[["1",{"w":"0x01","s":"1","e":true,"k":"1","d":[27],"c":[["0",{"w":"0x010","s":"0","e":false,"k":"0","d":[],"c":[["2",{"w":"0x010203","s":"203","e":true,"k":"2","d":[184],"c":[["0",{"w":"0x01020304","s":"04","e":true,"k":"0","d":[6,360],"c":[]}]]}],["0",{"w":"0x01000000","s":"00000","e":true,"k":"0","d":[158],"c":[["0",{"w":"0x0100000000000000000000000000","s":"00000000000000000000","e":false,"k":"0","d":[],"c":[["2",{"w":"0x01000000000000000000000000002dc6c0","s":"2dc6c0","e":true,"k":"2","d":[51,517],"c":[]}],["0",{"w":"0x01000000000000000000000000000000","s":"0000","e":true,"k":"0","d":[179],"c":[]}]]}]]}]]}]]}],["0",{"w":"0x00","s":"0","e":false,"k":"0","d":[],"c":[["0",{"w":"0x000","s":"0","e":false,"k":"0","d":[],"c":[["0",{"w":"0x0000000","s":"0000","e":false,"k":"0","d":[],"c":[["0",{"w":"0x000000000000000","s":"00000000","e":false,"k":"0","d":[],"c":[["1",{"w":"0x0000000000000001","s":"1","e":true,"k":"1","d":[87],"c":[]}],["0",{"w":"0x0000000000000000000","s":"0000","e":false,"k":"0","d":[],"c":[["9",{"w":"0x00000000000000000009a11b3972c8e532e964e262c196556bd958b7fd0c55c3","s":"9a11b3972c8e532e964e262c196556bd958b7fd0c55c3","e":true,"k":"9","d":[95],"c":[]}],["0",{"w":"0x00000000000000000000000000000000000000000000000000000000000000","s":"0000000000000000000000000000000000000000000","e":false,"k":"0","d":[],"c":[["2",{"w":"0x000000000000000000000000000000000000000000000000000000000000002a","s":"2a","e":true,"k":"2","d":[142],"c":[]}],["0",{"w":"0x000000000000000000000000000000000000000000000000000000000000000a","s":"0a","e":true,"k":"0","d":[188],"c":[]}]]}]]}]]}],["1",{"w":"0x00000001","s":"1","e":true,"k":"1","d":[133],"c":[]}]]}],["f",{"w":"0x000f4240","s":"f4240","e":true,"k":"f","d":[133],"c":[]}]]}],["9",{"w":"0x00989680","s":"989680","e":true,"k":"9","d":[133],"c":[]}]]}],["3",{"w":"0x03","s":"3","e":false,"k":"3","d":[],"c":[["9",{"w":"0x0390a5cac7c33fda49f70bc1b0866fa0ba7a9440d9de647fecb8132ceb76a94dfa","s":"90a5cac7c33fda49f70bc1b0866fa0ba7a9440d9de647fecb8132ceb76a94dfa","e":true,"k":"9","d":[94],"c":[]}],["a",{"w":"0x03adb8de4bfb65db2cfd6120d55c6526ae9c52e675db7e47308636534ba7786110","s":"adb8de4bfb65db2cfd6120d55c6526ae9c52e675db7e47308636534ba7786110","e":true,"k":"a","d":[162,169],"c":[]}]]}],["c",{"w":"0x0c00000002036167650100000000000000000000000000000005046e616d650d0000000a48617270657220446f67","s":"c00000002036167650100000000000000000000000000000005046e616d650d0000000a48617270657220446f67","e":true,"k":"c","d":[142,144],"c":[]}],["4",{"w":"0x040506","s":"40506","e":true,"k":"4","d":[184],"c":[]}]]}],["6",{"w":"0x6","s":"6","e":false,"k":"6","d":[],"c":[["2",{"w":"0x627463","s":"27463","e":true,"k":"2","d":[6,360],"c":[]}],["8",{"w":"0x68656c6c6f2","s":"8656c6c6f2","e":false,"k":"8","d":[],"c":[["1",{"w":"0x68656c6c6f21","s":"1","e":true,"k":"1","d":[27],"c":[]}],["0",{"w":"0x68656c6c6f20776f726c64000000000000000000000000000000000000000000","s":"0776f726c64000000000000000000000000000000000000000000","e":true,"k":"0","d":[84,111,181],"c":[]}]]}],["3",{"w":"0x638f0da7489fae1f981a47199a2854d0fa117cea82bd86049930aa86e565c6cdccd52fc0e6bba5a135961ed5b7360d5e2b0ff65889acbac01361f5e291a6da45","s":"38f0da7489fae1f981a47199a2854d0fa117cea82bd86049930aa86e565c6cdccd52fc0e6bba5a135961ed5b7360d5e2b0ff65889acbac01361f5e291a6da45","e":true,"k":"3","d":[181],"c":[]}]]}],["7",{"w":"0x7","s":"7","e":false,"k":"7","d":[],"c":[["3",{"w":"0x73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e","s":"3e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e","e":true,"k":"3","d":[6,360],"c":[]}],["f",{"w":"0x7fffffffffffffff","s":"fffffffffffffff","e":true,"k":"f","d":[87],"c":[]}]]}],["a",{"w":"0xa","s":"a","e":false,"k":"a","d":[],"c":[["7",{"w":"0xa7f511b3f379efef6fe71d0de57712ed13a89c5b6e24dd049eb2cc9a7c24fcb5","s":"7f511b3f379efef6fe71d0de57712ed13a89c5b6e24dd049eb2cc9a7c24fcb5","e":true,"k":"7","d":[51],"c":[]}],["b",{"w":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef","s":"bcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef","e":true,"k":"b","d":[132,167],"c":[]}]]}],["2",{"w":"0x28effae679c457da1e5158c063b3dfa78d0ade721b9aa9f1fc3f46dba4c0ea15","s":"28effae679c457da1e5158c063b3dfa78d0ade721b9aa9f1fc3f46dba4c0ea15","e":true,"k":"2","d":[84],"c":[]}],["f",{"w":"0xf","s":"f","e":false,"k":"f","d":[],"c":[["f",{"w":"0xffffffffffffffff","s":"fffffffffffffff","e":true,"k":"f","d":[87],"c":[["f",{"w":"0xffffffffffffffffffffffffffffff","s":"ffffffffffffff","e":false,"k":"f","d":[],"c":[["f",{"w":"0xffffffffffffffffffffffffffffffff","s":"ff","e":true,"k":"f","d":[179],"c":[]}],["7",{"w":"0xffffffffffffffffffffffffffffff7f","s":"7f","e":true,"k":"7","d":[179],"c":[]}]]}]]}],["a",{"w":"0xfa","s":"a","e":false,"k":"a","d":[],"c":[["6",{"w":"0xfa6bf38ed557fe417333710d6033e9419391a320","s":"6bf38ed557fe417333710d6033e9419391a320","e":true,"k":"6","d":[141,200],"c":[]}],["a",{"w":"0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f","s":"aac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f","e":true,"k":"a","d":[371,372],"c":[]}]]}]]}],["1",{"w":"0x1","s":"1","e":false,"k":"1","d":[],"c":[["2",{"w":"0x1234","s":"234","e":true,"k":"2","d":[356,366],"c":[["5",{"w":"0x123456","s":"56","e":true,"k":"5","d":[161],"c":[["7",{"w":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","s":"7890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","e":true,"k":"7","d":[89,91,132,167,172],"c":[]}]]}]]}],["a",{"w":"0x1a","s":"a","e":true,"k":"a","d":[141,200],"c":[]}],["7",{"w":"0x17ceb3da5f36aab351d6b14f5aa77f85bb6b800b954b2f24c564579f80116d99","s":"7ceb3da5f36aab351d6b14f5aa77f85bb6b800b954b2f24c564579f80116d99","e":true,"k":"7","d":[255],"c":[]}]]}],["3",{"w":"0x3","s":"3","e":false,"k":"3","d":[],"c":[["7",{"w":"0x374708fff7719dd5979ec875d56cd2286f6d3cf7ec317a3b25632aab28ec37bb","s":"74708fff7719dd5979ec875d56cd2286f6d3cf7ec317a3b25632aab28ec37bb","e":true,"k":"7","d":[104],"c":[]}],["b",{"w":"0x3bf3d2e8f7a4d7c5f9e6d0d5c6b0f5c7d8e9f0a1","s":"bf3d2e8f7a4d7c5f9e6d0d5c6b0f5c7d8e9f0a1","e":true,"k":"b","d":[188],"c":[]}],["1",{"w":"0x312a3c559af0f75381a9eb4540912c310d74682ed3036207ec890ad8cd1aebe6","s":"12a3c559af0f75381a9eb4540912c310d74682ed3036207ec890ad8cd1aebe6","e":true,"k":"1","d":[377],"c":[]}]]}],["c",{"w":"0xcf0edb437886eae39b21ebad0caeea342d2bd61c98e9d09d0e89109a546d01fc","s":"cf0edb437886eae39b21ebad0caeea342d2bd61c98e9d09d0e89109a546d01fc","e":true,"k":"c","d":[111],"c":[]}],["4",{"w":"0x4","s":"4","e":false,"k":"4","d":[],"c":[["0",{"w":"0x40420f00","s":"0420f00","e":true,"k":"0","d":[158],"c":[]}],["d",{"w":"0x4d88015a6df9ec4f6df875941d87337ce64f8d51608563f80b6e27adeb327e4d","s":"d88015a6df9ec4f6df875941d87337ce64f8d51608563f80b6e27adeb327e4d","e":true,"k":"d","d":[377],"c":[]}],["a",{"w":"0x4ad36f77ff76042f3b7355006556375970b0f99d1232b14a3b4a2eadda4a806a","s":"ad36f77ff76042f3b7355006556375970b0f99d1232b14a3b4a2eadda4a806a","e":true,"k":"a","d":[377],"c":[]}]]}],["8",{"w":"0x8","s":"8","e":false,"k":"8","d":[],"c":[["0",{"w":"0x80969800","s":"0969800","e":true,"k":"0","d":[158],"c":[]}],["7",{"w":"0x8738487ebe69b93d8e51583be8eee50bb4213fc49c767d329632730cc193b873554428fc936ca3569afc15f1c9365f6591d6251a89fee9c9ac661116824d3a1301","s":"738487ebe69b93d8e51583be8eee50bb4213fc49c767d329632730cc193b873554428fc936ca3569afc15f1c9365f6591d6251a89fee9c9ac661116824d3a1301","e":true,"k":"7","d":[162,169],"c":[]}]]}],["d",{"w":"0xde5b9eb9e7c5592930eb2e30a01369c36586d872082ed8181ee83d2a0ec20f04","s":"de5b9eb9e7c5592930eb2e30a01369c36586d872082ed8181ee83d2a0ec20f04","e":true,"k":"d","d":[162,169],"c":[]}],["9",{"w":"0x9","s":"9","e":false,"k":"9","d":[],"c":[["2",{"w":"0x924e0a688664851f5f96b437fabaec19b7542cfcaaf92a97eae43384cacd83d0","s":"24e0a688664851f5f96b437fabaec19b7542cfcaaf92a97eae43384cacd83d0","e":true,"k":"2","d":[255],"c":[]}],["8",{"w":"0x98195af8f888d2f9ca3462c41c1691e7798ea6d9e5e3afe42955c0921f981f2c","s":"8195af8f888d2f9ca3462c41c1691e7798ea6d9e5e3afe42955c0921f981f2c","e":true,"k":"8","d":[377],"c":[]}]]}],["e",{"w":"0xe0d1e8d216a77526ae2ce40294fc77038798a179a6532bb8980d3c2183f58de6","s":"e0d1e8d216a77526ae2ce40294fc77038798a179a6532bb8980d3c2183f58de6","e":true,"k":"e","d":[255],"c":[]}],["b",{"w":"0xbtc21000042stx016","s":"btc21000042stx016","e":true,"k":"b","d":[371],"c":[]}]]}],["m",{"w":"0m","s":"m","e":true,"k":"m","d":[21,26,29,30,517],"c":[]}],["0",{"w":"00","s":"0","e":true,"k":"0","d":[22],"c":[["0",{"w":"000","s":"0","e":true,"k":"0","d":[22,160,353,356,357,366],"c":[["z",{"w":"000z","s":"z","e":true,"k":"z","d":[51,255],"c":[]}],["1",{"w":"0001","s":"1","e":true,"k":"1","d":[76,113,130,187],"c":[]}],["5",{"w":"0005","s":"5","e":true,"k":"5","d":[154],"c":[]}],["0",{"w":"00001","s":"01","e":true,"k":"0","d":[515],"c":[]}]]}],["9",{"w":"009","s":"9","e":true,"k":"9","d":[27],"c":[]}],["1",{"w":"0010","s":"10","e":true,"k":"1","d":[76,113,130,187],"c":[]}]]}],["3",{"w":"03","s":"3","e":true,"k":"3","d":[22],"c":[["6",{"w":"03652212ea76be0ed4cd83a25c06e57819993029a7b9999f7d63c36340b34a4e62","s":"652212ea76be0ed4cd83a25c06e57819993029a7b9999f7d63c36340b34a4e62","e":true,"k":"6","d":[374],"c":[]}]]}],["1",{"w":"01","s":"1","e":true,"k":"1","d":[22],"c":[["0",{"w":"0100","s":"00","e":true,"k":"0","d":[76,113,130,187],"c":[]}]]}],["'",{"w":"0'","s":"'","e":true,"k":"'","d":[27,354,356,366,371],"c":[]}],["-",{"w":"0-based","s":"-based","e":true,"k":"-","d":[183],"c":[]}],["n",{"w":"0n","s":"n","e":true,"k":"n","d":[226,234,243,368],"c":[]}],["2",{"w":"02","s":"2","e":false,"k":"2","d":[],"c":[["d",{"w":"02d","s":"d","e":false,"k":"d","d":[],"c":[["3",{"w":"02d3331cbb9f72fe635e6f87c2cf1a13cd","s":"3331cbb9f72fe635e6f87c2cf1a13cd","e":true,"k":"3","d":[352,356,366],"c":[["e",{"w":"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304","s":"ea520f08c0cc68584a96e8ac19d8d304","e":true,"k":"e","d":[356,366],"c":[]}]]}],["a",{"w":"02da7a464ac770ae8337a343670778b93410f2f3fef6bea98dd1c3e9224459d36b","s":"a7a464ac770ae8337a343670778b93410f2f3fef6bea98dd1c3e9224459d36b","e":true,"k":"a","d":[374],"c":[]}]]}],["5",{"w":"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114","s":"5b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114","e":true,"k":"5","d":[356,366],"c":[]}],["a",{"w":"02afeae522aab5f8c99a00ddf75fbcb4a641e052dd48836408d9cf437344b63516","s":"afeae522aab5f8c99a00ddf75fbcb4a641e052dd48836408d9cf437344b63516","e":true,"k":"a","d":[374],"c":[]}]]}],["4",{"w":"0488ade4040658015580000000dc81e3a5","s":"488ade4040658015580000000dc81e3a5","e":true,"k":"4","d":[352,356,366],"c":[]}],["6",{"w":"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69","s":"62bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69","e":true,"k":"6","d":[356,366],"c":[]}],["7",{"w":"07","s":"7","e":true,"k":"7","d":[375],"c":[]}]]}],["3",{"w":"3","s":"3","e":true,"k":"3","d":[6,7,9,12,17,26,27,30,46,47,48,49,55,70,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,219,221,224,226,230,231,232,233,234,245,348,352,353,354,356,360,361,366,367,368,371,374,376,377,509,510,511,513,515,516,517],"c":[["7",{"w":"37","s":"7","e":true,"k":"7","d":[7,255,361],"c":[]}],["9",{"w":"3999","s":"999","e":true,"k":"9","d":[14,514],"c":[]}],["0",{"w":"30","s":"0","e":true,"k":"0","d":[51,77,191,199],"c":[["0",{"w":"300","s":"0","e":false,"k":"0","d":[],"c":[["0",{"w":"3000","s":"0","e":true,"k":"0","d":[15,68,374,376,379],"c":[["0",{"w":"3000000","s":"000","e":true,"k":"0","d":[51,517],"c":[]}]]}],["p",{"w":"300px","s":"px","e":true,"k":"p","d":[229],"c":[]}]]}],["m",{"w":"30m","s":"m","e":true,"k":"m","d":[26],"c":[["c",{"w":"30mcounter","s":"counter","e":true,"k":"c","d":[26],"c":[]}]]}],["8",{"w":"308","s":"8","e":true,"k":"8","d":[255],"c":[]}]]}],["2",{"w":"32","s":"2","e":true,"k":"2","d":[69,80,84,89,91,95,104,111,127,132,142,156,161,162,167,169,172,181,188,233,367,371,372],"c":[["m",{"w":"32m","s":"m","e":true,"k":"m","d":[21,30,517],"c":[["c",{"w":"32mcreate","s":"create","e":true,"k":"c","d":[29,30],"c":[["d",{"w":"32mcreated","s":"d","e":true,"k":"d","d":[30],"c":[]}]]}],["u",{"w":"32mu1","s":"u1","e":true,"k":"u","d":[30],"c":[]}]]}],["-",{"w":"32-byte","s":"-byte","e":true,"k":"-","d":[95,161,188,371],"c":[]}],["0",{"w":"32000","s":"000","e":true,"k":"0","d":[374,376],"c":[]}]]}],["8",{"w":"38","s":"8","e":true,"k":"8","d":[26],"c":[["5",{"w":"385875968","s":"5875968","e":true,"k":"5","d":[235,369],"c":[]}]]}],["1",{"w":"31","s":"1","e":false,"k":"1","d":[],"c":[["m",{"w":"31m","s":"m","e":true,"k":"m","d":[26],"c":[]}],["5",{"w":"315","s":"5","e":true,"k":"5","d":[70,72],"c":[]}]]}],["4",{"w":"34","s":"4","e":true,"k":"4","d":[27,69,90,184],"c":[["m",{"w":"34m","s":"m","e":true,"k":"m","d":[26],"c":[["u",{"w":"34mu0","s":"u0","e":true,"k":"u","d":[26],"c":[]}]]}],["2",{"w":"34239","s":"239","e":true,"k":"2","d":[374],"c":[]}]]}],["3",{"w":"33","s":"3","e":true,"k":"3","d":[80,94,162,169],"c":[["m",{"w":"33mupdated","s":"mupdated","e":true,"k":"m","d":[30],"c":[]}]]}],["6",{"w":"36","s":"6","e":true,"k":"6","d":[51],"c":[]}],["r",{"w":"3rd","s":"rd","e":true,"k":"r","d":[128],"c":[]}]]}],["4",{"w":"4","s":"4","e":true,"k":"4","d":[6,14,15,20,26,27,46,48,49,69,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,219,222,230,231,232,233,352,353,354,360,367,374,376,377,510,511,513,515,516,517],"c":[["2",{"w":"42","s":"2","e":true,"k":"2","d":[7,93,118,142,148,153,159,168,246,361],"c":[["0",{"w":"42000000","s":"000000","e":true,"k":"0","d":[7,242,243,361],"c":[["0",{"w":"420000000n","s":"0n","e":true,"k":"0","d":[7,361],"c":[]}],["n",{"w":"42000000n","s":"n","e":true,"k":"n","d":[7,361],"c":[]}]]}]]}],["1",{"w":"41","s":"1","e":true,"k":"1","d":[9,22],"c":[]}],["7",{"w":"47","s":"7","e":false,"k":"7","d":[],"c":[["5",{"w":"4752","s":"52","e":true,"k":"5","d":[9,22],"c":[]}],["9",{"w":"4791","s":"91","e":true,"k":"9","d":[58],"c":[]}]]}],["0",{"w":"40","s":"0","e":true,"k":"0","d":[9,88,101,120,135,141,186,195,200,246],"c":[["9",{"w":"4096","s":"96","e":true,"k":"9","d":[502,515],"c":[]}]]}],["4",{"w":"44","s":"4","e":false,"k":"4","d":[],"c":[["'",{"w":"44'","s":"'","e":true,"k":"'","d":[27],"c":[]}],["3",{"w":"443257","s":"3257","e":true,"k":"3","d":[58],"c":[]}]]}],["5",{"w":"45","s":"5","e":false,"k":"5","d":[],"c":[["6",{"w":"456","s":"6","e":true,"k":"6","d":[157],"c":[]}],["0",{"w":"450","s":"0","e":true,"k":"0","d":[259],"c":[]}]]}]]}],["7",{"w":"7","s":"7","e":true,"k":"7","d":[7,58,110,175,177,197,199,234,235,236,258,355,356,361,366,368,369,370,510],"c":[["3",{"w":"73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e","s":"3e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e","e":true,"k":"3","d":[6,360],"c":[]}],["7",{"w":"770","s":"70","e":true,"k":"7","d":[70,72],"c":[]}],["5",{"w":"75","s":"5","e":false,"k":"5","d":[],"c":[["3",{"w":"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601","s":"3b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601","e":true,"k":"3","d":[230,242,243],"c":[]}],["0",{"w":"750","s":"0","e":true,"k":"0","d":[259],"c":[]}]]}],["0",{"w":"700000","s":"00000","e":true,"k":"0","d":[516],"c":[]}]]}],["9",{"w":"9","s":"9","e":true,"k":"9","d":[7,110,177,258,361,517],"c":[["2",{"w":"9223372036854775807","s":"223372036854775807","e":true,"k":"2","d":[87,179],"c":[]}],["0",{"w":"90","s":"0","e":false,"k":"0","d":[],"c":[["2",{"w":"90232","s":"232","e":true,"k":"2","d":[379],"c":[]}],["m",{"w":"90m","s":"m","e":true,"k":"m","d":[517],"c":[]}]]}]]}],["6",{"w":"6","s":"6","e":true,"k":"6","d":[7,26,92,105,110,131,175,177,183,185,219,258,361,510],"c":[["1",{"w":"61","s":"1","e":true,"k":"1","d":[7,361],"c":[]}],["9",{"w":"6940","s":"940","e":true,"k":"9","d":[27],"c":[]}],["5",{"w":"65","s":"5","e":true,"k":"5","d":[80,162,169],"c":[]}],["4",{"w":"64","s":"4","e":true,"k":"4","d":[169,181],"c":[]}],["0",{"w":"602","s":"02","e":true,"k":"0","d":[229,238],"c":[]}],["_",{"w":"6_000","s":"_000","e":true,"k":"_","d":[233,367],"c":[]}],["3",{"w":"6379","s":"379","e":true,"k":"3","d":[374,376],"c":[]}],["a",{"w":"6ad27176-2b83-4381-b51c-50baede11e3f","s":"ad27176-2b83-4381-b51c-50baede11e3f","e":true,"k":"a","d":[374],"c":[]}]]}],["8",{"w":"8","s":"8","e":true,"k":"8","d":[105,110,171,177,219,233,258,355,356,366,367,510,515,517],"c":[["7",{"w":"87","s":"7","e":true,"k":"7","d":[7,361],"c":[["a",{"w":"87ac9bff-1052-4d02-9c79-3768a6f08a09","s":"ac9bff-1052-4d02-9c79-3768a6f08a09","e":true,"k":"a","d":[378],"c":[]}]]}],["c",{"w":"8c877d","s":"c877d","e":true,"k":"c","d":[11,44,256,381,466,501,505],"c":[]}],["4",{"w":"84","s":"4","e":false,"k":"4","d":[],"c":[["0",{"w":"8400","s":"00","e":true,"k":"0","d":[27],"c":[]}],["'",{"w":"84'","s":"'","e":true,"k":"'","d":[371],"c":[]}]]}],["1",{"w":"81","s":"1","e":true,"k":"1","d":[93],"c":[]}],["0",{"w":"80","s":"0","e":false,"k":"0","d":[],"c":[["_",{"w":"80_000","s":"_000","e":true,"k":"_","d":[233,367],"c":[]}],["1",{"w":"801500","s":"1500","e":true,"k":"1","d":[376],"c":[]}],["2",{"w":"802000","s":"2000","e":true,"k":"2","d":[376],"c":[]}]]}],["3",{"w":"833","s":"33","e":false,"k":"3","d":[],"c":[["2",{"w":"8332","s":"2","e":true,"k":"2","d":[374,376,515],"c":[]}],["3",{"w":"8333","s":"3","e":true,"k":"3","d":[374],"c":[]}]]}]]}],["q",{"w":"q","s":"q","e":false,"k":"q","d":[],"c":[["u",{"w":"qu","s":"u","e":false,"k":"u","d":[],"c":[["i",{"w":"qui","s":"i","e":false,"k":"i","d":[],"c":[["c",{"w":"quick","s":"ck","e":true,"k":"c","d":[50,68],"c":[["s",{"w":"quickstart","s":"start","e":true,"k":"s","d":[8,9,11,22,26,27,30,44,53,243,256,357,378,381,423,466,501,502,504,505],"c":[["s",{"w":"quickstarts","s":"s","e":true,"k":"s","d":[68],"c":[]}]]}],["l",{"w":"quickly","s":"ly","e":true,"k":"l","d":[13,14,17,45,47,50],"c":[]}],["e",{"w":"quickest","s":"est","e":true,"k":"e","d":[14,259],"c":[]}]]}],["t",{"w":"quite","s":"te","e":true,"k":"t","d":[16],"c":[]}]]}],["a",{"w":"qua","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"quantit","s":"ntit","e":false,"k":"n","d":[],"c":[["y",{"w":"quantity","s":"y","e":true,"k":"y","d":[27],"c":[]}],["i",{"w":"quantities","s":"ies","e":true,"k":"i","d":[77,137,140],"c":[]}]]}],["l",{"w":"qualified","s":"lified","e":true,"k":"l","d":[372],"c":[]}]]}],["e",{"w":"que","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"quer","s":"r","e":false,"k":"r","d":[],"c":[["y",{"w":"query","s":"y","e":true,"k":"y","d":[31,68,71,98,134,190,198,202,208,226,227,259,371,372,373,399,422,466,502],"c":[["i",{"w":"querying","s":"ing","e":true,"k":"i","d":[68,98,125,134,190,198,377],"c":[]}]]}],["i",{"w":"querie","s":"ie","e":false,"k":"i","d":[],"c":[["d",{"w":"queried","s":"d","e":true,"k":"d","d":[97,125,190],"c":[]}],["s",{"w":"queries","s":"s","e":true,"k":"s","d":[98,143,150,184,198],"c":[]}]]}]]}],["s",{"w":"question","s":"stion","e":true,"k":"s","d":[180],"c":[["i",{"w":"questionicon","s":"icon","e":true,"k":"i","d":[44,466],"c":[]}],["s",{"w":"questions","s":"s","e":true,"k":"s","d":[49,78],"c":[]}]]}],["u",{"w":"queue-like","s":"ue-like","e":true,"k":"u","d":[149],"c":[]}]]}],["o",{"w":"quot","s":"ot","e":true,"k":"o","d":[373],"c":[]}]]}],["1",{"w":"q1","s":"1","e":true,"k":"1","d":[53],"c":[]}],["2",{"w":"q2","s":"2","e":true,"k":"2","d":[53],"c":[]}],["5",{"w":"q5","s":"5","e":true,"k":"5","d":[53],"c":[]}],["3",{"w":"q3","s":"3","e":true,"k":"3","d":[53],"c":[]}],["4",{"w":"q4","s":"4","e":true,"k":"4","d":[53],"c":[]}],["r",{"w":"qr","s":"r","e":true,"k":"r","d":[232],"c":[]}]]}],["z",{"w":"z","s":"z","e":true,"k":"z","d":[517],"c":[["e",{"w":"zero","s":"ero","e":true,"k":"e","d":[15,50,77,88,102,112,118,120,155,165,174,197,511,513],"c":[["-",{"w":"zero-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"zero-padded","s":"padded","e":true,"k":"p","d":[87,133,158,179],"c":[]}],["b",{"w":"zero-based","s":"based","e":true,"k":"b","d":[180],"c":[]}]]}],["m",{"w":"zeromq","s":"mq","e":true,"k":"m","d":[374,376,515],"c":[]}]]}],["s",{"w":"zsh","s":"sh","e":true,"k":"s","d":[18],"c":[]}],["9",{"w":"z9ulvhygkce","s":"9ulvhygkce","e":true,"k":"9","d":[72],"c":[]}],["o",{"w":"zone","s":"one","e":true,"k":"o","d":[226,227],"c":[["f",{"w":"zonefile","s":"file","e":true,"k":"f","d":[278],"c":[["l",{"w":"zonefilelookupurl","s":"lookupurl","e":true,"k":"l","d":[226,227],"c":[]}],["'",{"w":"zonefile'","s":"'","e":true,"k":"'","d":[272],"c":[]}],["h",{"w":"zonefilehash","s":"hash","e":true,"k":"h","d":[278],"c":[]}]]}]]}],["m",{"w":"zmq","s":"mq","e":true,"k":"m","d":[374,376],"c":[["p",{"w":"zmqpubhashblock","s":"pubhashblock","e":true,"k":"p","d":[374,376,515],"c":[]}],["_",{"w":"zmq_url","s":"_url","e":true,"k":"_","d":[515],"c":[]}]]}]]}],["x",{"w":"x","s":"x","e":true,"k":"x","d":[18,49,70,73,170,188,233,234,235,236,355,356,366,367,368,369,370,517],"c":[["o",{"w":"xor","s":"or","e":true,"k":"o","d":[93,130,187],"c":[]}],["-",{"w":"x-","s":"-","e":false,"k":"-","d":[],"c":[["f",{"w":"x-foo","s":"foo","e":true,"k":"f","d":[227,236,370],"c":[]}],["o",{"w":"x-only","s":"only","e":true,"k":"o","d":[233,367],"c":[]}]]}],["v",{"w":"xverse","s":"verse","e":true,"k":"v","d":[351],"c":[["-",{"w":"xverse-like","s":"-like","e":true,"k":"-","d":[351],"c":[]}]]}],["y",{"w":"xyz","s":"yz","e":true,"k":"y","d":[379],"c":[]}]]}]]},"isArray":false},"url":{"type":"Radix","node":{"w":"","s":"","e":false,"k":"","d":[],"c":[["d",{"w":"d","s":"d","e":false,"k":"d","d":[],"c":[["o",{"w":"docs","s":"ocs","e":true,"k":"o","d":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517],"c":[["k",{"w":"docskit","s":"kit","e":true,"k":"k","d":[517],"c":[]}]]}],["e",{"w":"de","s":"e","e":false,"k":"e","d":[],"c":[["p",{"w":"deploy-","s":"ploy-","e":false,"k":"p","d":[],"c":[["a",{"w":"deploy-a-contract","s":"a-contract","e":true,"k":"a","d":[25],"c":[]}],["c",{"w":"deploy-contracts","s":"contracts","e":true,"k":"c","d":[46],"c":[]}]]}],["b",{"w":"debug-a-contract","s":"bug-a-contract","e":true,"k":"b","d":[26],"c":[]}],["v",{"w":"devnet","s":"vnet","e":true,"k":"v","d":[32,33,34,35,36,50],"c":[]}],["l",{"w":"delete","s":"lete","e":true,"k":"l","d":[42],"c":[]}],["f",{"w":"def","s":"f","e":false,"k":"f","d":[],"c":[["i",{"w":"define-","s":"ine-","e":false,"k":"i","d":[],"c":[["c",{"w":"define-constant","s":"constant","e":true,"k":"c","d":[92],"c":[]}],["m",{"w":"define-map","s":"map","e":true,"k":"m","d":[97],"c":[]}],["p",{"w":"define-p","s":"p","e":false,"k":"p","d":[],"c":[["u",{"w":"define-public","s":"ublic","e":true,"k":"u","d":[99],"c":[]}],["r",{"w":"define-private","s":"rivate","e":true,"k":"r","d":[129],"c":[]}]]}],["d",{"w":"define-data-var","s":"data-var","e":true,"k":"d","d":[100],"c":[]}],["t",{"w":"define-trait","s":"trait","e":true,"k":"t","d":[119],"c":[]}],["n",{"w":"define-non-fungible-token","s":"non-fungible-token","e":true,"k":"n","d":[122],"c":[]}],["r",{"w":"define-read-only","s":"read-only","e":true,"k":"r","d":[134],"c":[]}],["f",{"w":"define-fungible-token","s":"fungible-token","e":true,"k":"f","d":[160],"c":[]}]]}],["a",{"w":"default-to","s":"ault-to","e":true,"k":"a","d":[103],"c":[]}]]}],["t",{"w":"details-for-transactions","s":"tails-for-transactions","e":true,"k":"t","d":[311],"c":[]}]]}],["i",{"w":"divide","s":"ivide","e":true,"k":"i","d":[112],"c":[]}],["r",{"w":"dropped-mempool-transactions","s":"ropped-mempool-transactions","e":true,"k":"r","d":[309],"c":[]}]]}],["s",{"w":"s","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"st","s":"t","e":false,"k":"t","d":[],"c":[["a",{"w":"sta","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"stack","s":"ck","e":false,"k":"c","d":[],"c":[["s",{"w":"stacks","s":"s","e":true,"k":"s","d":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418],"c":[["-",{"w":"stacks-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"stacks-api","s":"api","e":true,"k":"a","d":[14,222],"c":[]}],["b",{"w":"stacks-blockchain","s":"blockchain","e":true,"k":"b","d":[17,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344],"c":[["-",{"w":"stacks-blockchain-api","s":"-api","e":true,"k":"-","d":[36,365],"c":[]}]]}],["j",{"w":"stacks-js","s":"js","e":true,"k":"j","d":[223,364],"c":[]}]]}]]}],["i",{"w":"stacking-","s":"ing-","e":false,"k":"i","d":[],"c":[["r",{"w":"stacking-rewards","s":"rewards","e":true,"k":"r","d":[281,282,283,284,285,286],"c":[]}],["p",{"w":"stacking-pool","s":"pool","e":true,"k":"p","d":[316,317],"c":[]}]]}],["e",{"w":"stacker","s":"er","e":false,"k":"e","d":[],"c":[["s",{"w":"stackers-for-signer-in-cycle","s":"s-for-signer-in-cycle","e":true,"k":"s","d":[292],"c":[]}],["-",{"w":"stacker-set","s":"-set","e":true,"k":"-","d":[391],"c":[]}]]}]]}],["r",{"w":"start","s":"rt","e":true,"k":"r","d":[35],"c":[["-",{"w":"start-a-development-console","s":"-a-development-console","e":true,"k":"-","d":[23],"c":[]}]]}],["t",{"w":"stat","s":"t","e":false,"k":"t","d":[],"c":[["u",{"w":"status","s":"us","e":true,"k":"u","d":[43,57,210,249,301,333,429,461,469,497],"c":[]}],["i",{"w":"statistics","s":"istics","e":true,"k":"i","d":[445,446,482,483],"c":[["-",{"w":"statistics-for-mempool-transactions","s":"-for-mempool-transactions","e":true,"k":"-","d":[306],"c":[]}]]}]]}]]}],["o",{"w":"stop","s":"op","e":true,"k":"o","d":[34],"c":[]}],["x",{"w":"stx","s":"x","e":true,"k":"x","d":[319],"c":[["-",{"w":"stx-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"stx-account","s":"account","e":true,"k":"a","d":[98],"c":[]}],["b",{"w":"stx-b","s":"b","e":false,"k":"b","d":[],"c":[["u",{"w":"stx-burn","s":"urn","e":true,"k":"u","d":[143],"c":[]}],["a",{"w":"stx-balances","s":"alances","e":true,"k":"a","d":[327],"c":[]}]]}],["t",{"w":"stx-transfer","s":"transfer","e":true,"k":"t","d":[150],"c":[["-",{"w":"stx-transfer-memo","s":"-memo","e":true,"k":"-","d":[184],"c":[]}]]}],["g",{"w":"stx-get-balance","s":"get-balance","e":true,"k":"g","d":[198],"c":[]}]]}]]}],["r",{"w":"string-to-","s":"ring-to-","e":false,"k":"r","d":[],"c":[["i",{"w":"string-to-int","s":"int","e":true,"k":"i","d":[138],"c":[]}],["u",{"w":"string-to-uint","s":"uint","e":true,"k":"u","d":[157],"c":[]}]]}]]}],["i",{"w":"si","s":"i","e":false,"k":"i","d":[],"c":[["m",{"w":"simnet","s":"mnet","e":true,"k":"m","d":[4,358],"c":[]}],["g",{"w":"sign","s":"gn","e":false,"k":"g","d":[],"c":[["e",{"w":"signer","s":"er","e":false,"k":"e","d":[],"c":[["-",{"w":"signer-","s":"-","e":false,"k":"-","d":[],"c":[["m",{"w":"signer-metrics-api","s":"metrics-api","e":true,"k":"m","d":[205,206,207,208,209,210,211,212,213,214,215,216,217,218],"c":[]}],["i",{"w":"signer-in","s":"in","e":false,"k":"i","d":[],"c":[["f",{"w":"signer-information-for-","s":"formation-for-","e":false,"k":"f","d":[],"c":[["a",{"w":"signer-information-for-a-block","s":"a-block","e":true,"k":"a","d":[216],"c":[]}],["m",{"w":"signer-information-for-most-recent-block-proposals","s":"most-recent-block-proposals","e":true,"k":"m","d":[218],"c":[]}]]}],["-",{"w":"signer-in-cycle","s":"-cycle","e":true,"k":"-","d":[289],"c":[]}]]}]]}],["s",{"w":"signers","s":"s","e":true,"k":"s","d":[213,214,215],"c":[["-",{"w":"signers-in-cycle","s":"-in-cycle","e":true,"k":"-","d":[291],"c":[]}]]}]]}],["-",{"w":"sign-messages","s":"-messages","e":true,"k":"-","d":[354],"c":[]}]]}]]}],["e",{"w":"se","s":"e","e":false,"k":"e","d":[],"c":[["m",{"w":"semi-fungible-token-metadata","s":"mi-fungible-token-metadata","e":true,"k":"m","d":[61,252],"c":[]}],["c",{"w":"secp256k1-","s":"cp256k1-","e":false,"k":"c","d":[],"c":[["r",{"w":"secp256k1-recover","s":"recover","e":true,"k":"r","d":[162],"c":[]}],["v",{"w":"secp256k1-verify","s":"verify","e":true,"k":"v","d":[169],"c":[]}]]}],["a",{"w":"search","s":"arch","e":true,"k":"a","d":[293,294],"c":[["-",{"w":"search-by-id","s":"-by-id","e":true,"k":"-","d":[293],"c":[]}]]}],["t",{"w":"setup","s":"tup","e":true,"k":"t","d":[347],"c":[]}]]}],["h",{"w":"sha","s":"ha","e":false,"k":"h","d":[],"c":[["2",{"w":"sha256","s":"256","e":true,"k":"2","d":[84],"c":[]}],["5",{"w":"sha512","s":"512","e":true,"k":"5","d":[181],"c":[["-",{"w":"sha512-256","s":"-256","e":true,"k":"-","d":[111],"c":[]}]]}]]}],["q",{"w":"sqrti","s":"qrti","e":true,"k":"q","d":[106],"c":[]}],["u",{"w":"su","s":"u","e":false,"k":"u","d":[],"c":[["b",{"w":"subtract","s":"btract","e":true,"k":"b","d":[140],"c":[]}],["p",{"w":"support","s":"pport","e":true,"k":"p","d":[351],"c":[]}]]}],["o",{"w":"so","s":"o","e":false,"k":"o","d":[],"c":[["m",{"w":"some","s":"me","e":true,"k":"m","d":[168],"c":[]}],["u",{"w":"source","s":"urce","e":true,"k":"u","d":[415],"c":[]}]]}],["l",{"w":"slice","s":"lice","e":true,"k":"l","d":[194],"c":[]}],["m",{"w":"smart-contract","s":"mart-contract","e":false,"k":"m","d":[],"c":[["-",{"w":"smart-contract-development","s":"-development","e":true,"k":"-","d":[225],"c":[]}],["s",{"w":"smart-contracts","s":"s","e":true,"k":"s","d":[329,330,331,332,333,410,411,412,413,414,415,416],"c":[]}]]}],["b",{"w":"sbtc","s":"btc","e":true,"k":"b","d":[233,367],"c":[]}],["c",{"w":"scopes","s":"copes","e":true,"k":"c","d":[371,372],"c":[]}],["a",{"w":"satoshis","s":"atoshis","e":true,"k":"a","d":[463,464,465,498,499,500],"c":[]}],["y",{"w":"sync-a-","s":"ync-a-","e":false,"k":"y","d":[],"c":[["s",{"w":"sync-a-stacks-node","s":"stacks-node","e":true,"k":"s","d":[509],"c":[]}],["b",{"w":"sync-a-bitcoin-node","s":"bitcoin-node","e":true,"k":"b","d":[515],"c":[]}]]}]]}],["c",{"w":"c","s":"c","e":false,"k":"c","d":[],"c":[["o",{"w":"co","s":"o","e":false,"k":"o","d":[],"c":[["n",{"w":"con","s":"n","e":false,"k":"n","d":[],"c":[["t",{"w":"contr","s":"tr","e":false,"k":"t","d":[],"c":[["i",{"w":"contributors-guide","s":"ibutors-guide","e":true,"k":"i","d":[1,419,506],"c":[]}],["a",{"w":"contract-","s":"act-","e":false,"k":"a","d":[],"c":[["m",{"w":"contract-monitoring","s":"monitoring","e":true,"k":"m","d":[51],"c":[]}],["c",{"w":"contract-call","s":"call","e":true,"k":"c","d":[86],"c":[]}],["o",{"w":"contract-of","s":"of","e":true,"k":"o","d":[90],"c":[]}],["t",{"w":"contract-templates","s":"templates","e":true,"k":"t","d":[386],"c":[]}]]}]]}],["c",{"w":"conc","s":"c","e":false,"k":"c","d":[],"c":[["e",{"w":"concepts","s":"epts","e":true,"k":"e","d":[19,237,238,239,240,241,242],"c":[]}],["a",{"w":"concat","s":"at","e":true,"k":"a","d":[182],"c":[]}]]}],["n",{"w":"connect","s":"nect","e":true,"k":"n","d":[350,351,352,353,354,355,356,357,366],"c":[]}],["s",{"w":"constants","s":"stants","e":true,"k":"s","d":[416],"c":[]}]]}],["m",{"w":"common","s":"mmon","e":true,"k":"m","d":[236,370],"c":[]}],["r",{"w":"core-api","s":"re-api","e":true,"k":"r","d":[401],"c":[]}]]}],["l",{"w":"cl","s":"l","e":false,"k":"l","d":[],"c":[["a",{"w":"clari","s":"ari","e":false,"k":"a","d":[],"c":[["n",{"w":"clarinet","s":"net","e":true,"k":"n","d":[18,19,20,21,22,23,24,25,26,27,28,29,30,221,363],"c":[["-",{"w":"clarinet-","s":"-","e":false,"k":"-","d":[],"c":[["j",{"w":"clarinet-js-sdk","s":"js-sdk","e":true,"k":"j","d":[4,5,6,7,8,9,10,358,359,360,361,362],"c":[]}],["s",{"w":"clarinet-sdk","s":"sdk","e":true,"k":"s","d":[362],"c":[]}]]}]]}],["t",{"w":"clarity","s":"ty","e":true,"k":"t","d":[76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202],"c":[]}]]}],["i",{"w":"cli","s":"i","e":true,"k":"i","d":[363,364],"c":[["e",{"w":"client","s":"ent","e":true,"k":"e","d":[64,65,66,67,365],"c":[]}]]}]]}],["u",{"w":"custom-matchers","s":"ustom-matchers","e":true,"k":"u","d":[6,360],"c":[]}],["r",{"w":"cr","s":"r","e":false,"k":"r","d":[],"c":[["e",{"w":"create","s":"eate","e":true,"k":"e","d":[38],"c":[["-",{"w":"create-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"create-deployment-plans","s":"deployment-plans","e":true,"k":"d","d":[27],"c":[]}],["a",{"w":"create-a-new-project","s":"a-new-project","e":true,"k":"a","d":[29],"c":[]}],["p",{"w":"create-project","s":"project","e":true,"k":"p","d":[47],"c":[]}],["c",{"w":"create-chainhooks","s":"chainhooks","e":true,"k":"c","d":[52],"c":[]}]]}]]}],["y",{"w":"cryptographic-functions","s":"yptographic-functions","e":true,"k":"y","d":[80],"c":[]}]]}],["h",{"w":"chainhook","s":"hainhook","e":true,"k":"h","d":[371,372,373,374,375,376,377,378,379,380],"c":[["s",{"w":"chainhooks","s":"s","e":true,"k":"s","d":[37,38,39,40,41,42,43],"c":[]}],["-",{"w":"chainhook-as-a-service","s":"-as-a-service","e":true,"k":"-","d":[376],"c":[["-",{"w":"chainhook-as-a-service-with-stacks-node","s":"-with-stacks-node","e":true,"k":"-","d":[374],"c":[]}]]}]]}],["y",{"w":"cycle","s":"ycle","e":true,"k":"y","d":[290],"c":[["s",{"w":"cycles","s":"s","e":true,"k":"s","d":[287],"c":[]}]]}],["i",{"w":"circulating-stx-supply-in-plain-text","s":"irculating-stx-supply-in-plain-text","e":true,"k":"i","d":[297],"c":[]}]]}],["g",{"w":"g","s":"g","e":false,"k":"g","d":[],"c":[["e",{"w":"get","s":"et","e":true,"k":"e","d":[39,116],"c":[["-",{"w":"get-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"get-s","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"get-sta","s":"ta","e":false,"k":"t","d":[],"c":[["r",{"w":"get-started","s":"rted","e":true,"k":"r","d":[2,420],"c":[]}],["c",{"w":"get-stacks-block-info","s":"cks-block-info","e":true,"k":"c","d":[104],"c":[]}],["t",{"w":"get-stats-inscription-count","s":"ts-inscription-count","e":true,"k":"t","d":[446,483],"c":[]}]]}],["a",{"w":"get-satoshi","s":"atoshi","e":true,"k":"a","d":[464,499],"c":[["-",{"w":"get-satoshi-inscriptions","s":"-inscriptions","e":true,"k":"-","d":[465,500],"c":[]}]]}]]}],["f",{"w":"get-ft-metadata","s":"ft-metadata","e":true,"k":"f","d":[67],"c":[]}],["b",{"w":"get-b","s":"b","e":false,"k":"b","d":[],"c":[["u",{"w":"get-burn-","s":"urn-","e":false,"k":"u","d":[],"c":[["b",{"w":"get-burn-block","s":"block","e":true,"k":"b","d":[336],"c":[["-",{"w":"get-burn-block-info","s":"-info","e":true,"k":"-","d":[95],"c":[]}],["s",{"w":"get-burn-blocks","s":"s","e":true,"k":"s","d":[338],"c":[]}]]}],["o",{"w":"get-burn-operations","s":"operations","e":true,"k":"o","d":[418],"c":[]}]]}],["l",{"w":"get-block","s":"lock","e":true,"k":"l","d":[260],"c":[["-",{"w":"get-block-info","s":"-info","e":true,"k":"-","d":[156],"c":[]}],["s",{"w":"get-blocks","s":"s","e":true,"k":"s","d":[267],"c":[["-",{"w":"get-blocks-by-burn-block","s":"-by-burn-block","e":true,"k":"-","d":[264],"c":[]}]]}]]}],["r",{"w":"get-brc20-","s":"rc20-","e":false,"k":"r","d":[],"c":[["t",{"w":"get-brc20-token","s":"token","e":false,"k":"t","d":[],"c":[["-",{"w":"get-brc20-token-","s":"-","e":false,"k":"-","d":[],"c":[["h",{"w":"get-brc20-token-holders","s":"holders","e":true,"k":"h","d":[447,484],"c":[]}],["d",{"w":"get-brc20-token-details","s":"details","e":true,"k":"d","d":[450,487],"c":[]}]]}],["s",{"w":"get-brc20-tokens","s":"s","e":true,"k":"s","d":[451,488],"c":[]}]]}],["b",{"w":"get-brc20-balances","s":"balances","e":true,"k":"b","d":[449,486],"c":[]}],["a",{"w":"get-brc20-activity","s":"activity","e":true,"k":"a","d":[452,489],"c":[]}]]}]]}],["t",{"w":"get-t","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"get-tenure-info","s":"enure-info","e":true,"k":"e","d":[127],"c":[]}],["r",{"w":"get-trans","s":"rans","e":false,"k":"r","d":[],"c":[["a",{"w":"get-transaction","s":"action","e":true,"k":"a","d":[310],"c":[]}],["f",{"w":"get-transfers-per-block","s":"fers-per-block","e":true,"k":"f","d":[457,494],"c":[]}]]}]]}],["r",{"w":"get-raw-transaction","s":"raw-transaction","e":true,"k":"r","d":[315],"c":[]}],["e",{"w":"get-etching","s":"etching","e":true,"k":"e","d":[442,481],"c":[["s",{"w":"get-etchings","s":"s","e":true,"k":"s","d":[441,480],"c":[]}]]}],["i",{"w":"get-inscription","s":"inscription","e":true,"k":"i","d":[458,495],"c":[["-",{"w":"get-inscription-","s":"-","e":false,"k":"-","d":[],"c":[["t",{"w":"get-inscription-transfers","s":"transfers","e":true,"k":"t","d":[454,491],"c":[]}],["c",{"w":"get-inscription-content","s":"content","e":true,"k":"c","d":[456,493],"c":[]}]]}],["s",{"w":"get-inscriptions","s":"s","e":true,"k":"s","d":[455,492],"c":[]}]]}]]}],["t",{"w":"getting-started","s":"ting-started","e":true,"k":"t","d":[345],"c":[]}]]}],["u",{"w":"guides","s":"uides","e":true,"k":"u","d":[14,15,16,17,75,220,221,222,223,426,444,503,506,507,508,509,510,511,512,513,514,515,516,517],"c":[]}],["r",{"w":"greater-than","s":"reater-than","e":true,"k":"r","d":[154],"c":[["-",{"w":"greater-than-or-equal","s":"-or-equal","e":true,"k":"-","d":[191],"c":[]}]]}]]}],["r",{"w":"r","s":"r","e":false,"k":"r","d":[],"c":[["a",{"w":"rate-limiting","s":"ate-limiting","e":true,"k":"a","d":[3,421,507],"c":[]}],["e",{"w":"re","s":"e","e":false,"k":"e","d":[],"c":[["f",{"w":"reference","s":"ference","e":true,"k":"f","d":[11,358,359,360,361,362,363,364,365,366,367,368,369,370],"c":[["s",{"w":"references","s":"s","e":true,"k":"s","d":[4,5,6,7,371,372],"c":[]}]]}],["c",{"w":"rec","s":"c","e":false,"k":"c","d":[],"c":[["i",{"w":"recipes","s":"ipes","e":true,"k":"i","d":[72],"c":[]}],["e",{"w":"recent-","s":"ent-","e":false,"k":"e","d":[],"c":[["b",{"w":"recent-b","s":"b","e":false,"k":"b","d":[],"c":[["l",{"w":"recent-blocks","s":"locks","e":true,"k":"l","d":[261],"c":[]}],["u",{"w":"recent-burnchain-reward-recipient","s":"urnchain-reward-recipient","e":true,"k":"u","d":[283],"c":[["s",{"w":"recent-burnchain-reward-recipients","s":"s","e":true,"k":"s","d":[281],"c":[]}]]}]]}],["r",{"w":"recent-reward-slot-holder","s":"reward-slot-holder","e":false,"k":"r","d":[],"c":[["s",{"w":"recent-reward-slot-holders","s":"s","e":true,"k":"s","d":[284],"c":[]}],["-",{"w":"recent-reward-slot-holder-entries","s":"-entries","e":true,"k":"-","d":[285],"c":[]}]]}],["t",{"w":"recent-transactions","s":"transactions","e":true,"k":"t","d":[312],"c":[]}]]}]]}],["p",{"w":"replace-at","s":"place-at","e":true,"k":"p","d":[109],"c":[]}],["q",{"w":"requesting-proofs","s":"questing-proofs","e":true,"k":"q","d":[346],"c":[]}],["g",{"w":"register-chainhooks-on-devnet","s":"gister-chainhooks-on-devnet","e":true,"k":"g","d":[375],"c":[]}],["a",{"w":"read-only","s":"ad-only","e":true,"k":"a","d":[414],"c":[]}]]}],["u",{"w":"run","s":"un","e":false,"k":"u","d":[],"c":[["-",{"w":"run-","s":"-","e":false,"k":"-","d":[],"c":[["a",{"w":"run-a-local-devnet","s":"a-local-devnet","e":true,"k":"a","d":[24],"c":[]}],["i",{"w":"run-indexer","s":"indexer","e":true,"k":"i","d":[503],"c":[]}]]}],["e",{"w":"rune","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"runes","s":"s","e":true,"k":"s","d":[422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,468,469,470,471,472,473,474,475,476,477,478,479,480,481],"c":[]}],["h",{"w":"runehook","s":"hook","e":true,"k":"h","d":[422,423,424],"c":[]}]]}]]}],["o",{"w":"roadmap","s":"oadmap","e":true,"k":"o","d":[229],"c":[]}],["p",{"w":"rpc-api","s":"pc-api","e":true,"k":"p","d":[388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418],"c":[]}]]}],["p",{"w":"p","s":"p","e":false,"k":"p","d":[],"c":[["r",{"w":"pr","s":"r","e":false,"k":"r","d":[],"c":[["o",{"w":"pro","s":"o","e":false,"k":"o","d":[],"c":[["p",{"w":"properties","s":"perties","e":true,"k":"p","d":[5,359],"c":[]}],["m",{"w":"prometheus","s":"metheus","e":true,"k":"m","d":[211,212],"c":[]}],["o",{"w":"proof-of-transfer","s":"of-of-transfer","e":true,"k":"o","d":[287,288,289,290,291,292],"c":[]}]]}],["i",{"w":"pri","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"prin","s":"n","e":false,"k":"n","d":[],"c":[["c",{"w":"principal-","s":"cipal-","e":false,"k":"c","d":[],"c":[["o",{"w":"principal-of","s":"of","e":true,"k":"o","d":[94],"c":[]}],["d",{"w":"principal-destruct","s":"destruct","e":true,"k":"d","d":[141],"c":[]}],["c",{"w":"principal-construct","s":"construct","e":true,"k":"c","d":[200],"c":[]}]]}],["t",{"w":"print","s":"t","e":true,"k":"t","d":[199],"c":[]}]]}],["v",{"w":"private-keys","s":"vate-keys","e":true,"k":"v","d":[239],"c":[]}]]}],["e",{"w":"predicate-design","s":"edicate-design","e":true,"k":"e","d":[379],"c":[]}]]}],["l",{"w":"platform","s":"latform","e":true,"k":"l","d":[45,46,47,48,49,50,51,52,53],"c":[["-",{"w":"platform-api","s":"-api","e":true,"k":"-","d":[31,32,33,34,35,36,37,38,39,40,41,42,43],"c":[]}]]}],["o",{"w":"po","s":"o","e":false,"k":"o","d":[],"c":[["w",{"w":"pow","s":"w","e":true,"k":"w","d":[185],"c":[]}],["x",{"w":"pox","s":"x","e":true,"k":"x","d":[390,391,392],"c":[["-",{"w":"pox-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"pox-cycle-signer","s":"cycle-signer","e":true,"k":"c","d":[214],"c":[["s",{"w":"pox-cycle-signers","s":"s","e":true,"k":"s","d":[215],"c":[]}]]}],["d",{"w":"pox-details","s":"details","e":true,"k":"d","d":[392],"c":[]}]]}]]}],["s",{"w":"post-conditions","s":"st-conditions","e":true,"k":"s","d":[231,238],"c":[]}]]}],["a",{"w":"pa","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"packages","s":"ckages","e":true,"k":"c","d":[233,234,235,236,356],"c":[]}],["g",{"w":"pagination","s":"gination","e":true,"k":"g","d":[255],"c":[]}]]}]]}],["m",{"w":"m","s":"m","e":false,"k":"m","d":[],"c":[["e",{"w":"me","s":"e","e":false,"k":"e","d":[],"c":[["t",{"w":"met","s":"t","e":false,"k":"t","d":[],"c":[["h",{"w":"methods","s":"hods","e":true,"k":"h","d":[7,361],"c":[]}],["r",{"w":"metrics","s":"rics","e":true,"k":"r","d":[212],"c":[]}]]}],["r",{"w":"merge","s":"rge","e":true,"k":"r","d":[189],"c":[]}],["m",{"w":"mem","s":"m","e":false,"k":"m","d":[],"c":[["p",{"w":"mempool","s":"pool","e":true,"k":"p","d":[334,335],"c":[["-",{"w":"mempool-transactions","s":"-transactions","e":true,"k":"-","d":[313],"c":[]}]]}],["b",{"w":"members","s":"bers","e":true,"k":"b","d":[316],"c":[]}]]}]]}],["a",{"w":"ma","s":"a","e":false,"k":"a","d":[],"c":[["p",{"w":"map","s":"p","e":true,"k":"p","d":[105],"c":[["-",{"w":"map-","s":"-","e":false,"k":"-","d":[],"c":[["d",{"w":"map-delete","s":"delete","e":true,"k":"d","d":[89],"c":[]}],["s",{"w":"map-set","s":"set","e":true,"k":"s","d":[132],"c":[]}],["i",{"w":"map-insert","s":"insert","e":true,"k":"i","d":[167],"c":[]}],["g",{"w":"map-get","s":"get","e":true,"k":"g","d":[172],"c":[]}],["e",{"w":"map-entry","s":"entry","e":true,"k":"e","d":[413],"c":[]}]]}]]}],["t",{"w":"match","s":"tch","e":true,"k":"t","d":[170],"c":[]}]]}],["u",{"w":"multiply","s":"ultiply","e":true,"k":"u","d":[102],"c":[]}],["o",{"w":"mod","s":"od","e":true,"k":"o","d":[197],"c":[]}],["i",{"w":"mi","s":"i","e":false,"k":"i","d":[],"c":[["g",{"w":"migration","s":"gration","e":true,"k":"g","d":[355],"c":[["-",{"w":"migration-guide","s":"-guide","e":true,"k":"-","d":[246],"c":[]}]]}],["n",{"w":"mints","s":"nts","e":true,"k":"n","d":[343],"c":[]}]]}]]}],["q",{"w":"quickstart","s":"quickstart","e":true,"k":"q","d":[9,30,53,65,243,357,378,423,504],"c":[["s",{"w":"quickstarts","s":"s","e":true,"k":"s","d":[381,382,383,384,385,386,387,505],"c":[]}]]}],["i",{"w":"i","s":"i","e":false,"k":"i","d":[],"c":[["n",{"w":"in","s":"n","e":false,"k":"n","d":[],"c":[["s",{"w":"ins","s":"s","e":false,"k":"s","d":[],"c":[["t",{"w":"install","s":"tall","e":false,"k":"t","d":[],"c":[["a",{"w":"installation","s":"ation","e":true,"k":"a","d":[10,244,380,424],"c":[]}],["i",{"w":"installing-docker","s":"ing-docker","e":true,"k":"i","d":[510],"c":[]}]]}],["c",{"w":"inscriptions","s":"criptions","e":true,"k":"c","d":[453,454,455,456,457,458,490,491,492,493,494,495],"c":[]}]]}],["f",{"w":"info","s":"fo","e":true,"k":"f","d":[56,57,209,210,248,249,295,296,297,298,299,300,301,302,332,400,401,405,428,429,460,461,468,469,496,497],"c":[]}],["t",{"w":"int","s":"t","e":false,"k":"t","d":[],"c":[["-",{"w":"int-to-","s":"-to-","e":false,"k":"-","d":[],"c":[["a",{"w":"int-to-ascii","s":"ascii","e":true,"k":"a","d":[88],"c":[]}],["u",{"w":"int-to-utf8","s":"utf8","e":true,"k":"u","d":[120],"c":[]}]]}],["e",{"w":"inte","s":"e","e":false,"k":"e","d":[],"c":[["g",{"w":"integration-testing","s":"gration-testing","e":true,"k":"g","d":[245],"c":[]}],["r",{"w":"interface","s":"rface","e":true,"k":"r","d":[410],"c":[]}]]}]]}],["d",{"w":"index","s":"dex","e":false,"k":"d","d":[],"c":[["-",{"w":"index-of","s":"-of","e":true,"k":"-","d":[183],"c":[]}],["e",{"w":"indexer","s":"er","e":true,"k":"e","d":[502,503,504],"c":[]}]]}],["b",{"w":"inbound-stx-transfers","s":"bound-stx-transfers","e":true,"k":"b","d":[328],"c":[]}]]}],["s",{"w":"is-","s":"s-","e":false,"k":"s","d":[],"c":[["e",{"w":"is-e","s":"e","e":false,"k":"e","d":[],"c":[["r",{"w":"is-err","s":"rr","e":true,"k":"r","d":[124],"c":[]}],["q",{"w":"is-eq","s":"q","e":true,"k":"q","d":[173],"c":[]}]]}],["o",{"w":"is-ok","s":"ok","e":true,"k":"o","d":[136],"c":[]}],["n",{"w":"is-none","s":"none","e":true,"k":"n","d":[139],"c":[]}],["s",{"w":"is-s","s":"s","e":false,"k":"s","d":[],"c":[["o",{"w":"is-some","s":"ome","e":true,"k":"o","d":[146],"c":[]}],["t",{"w":"is-standard","s":"tandard","e":true,"k":"t","d":[147],"c":[]}]]}]]}],["m",{"w":"impl-trait","s":"mpl-trait","e":true,"k":"m","d":[152],"c":[]}],["f",{"w":"if","s":"f","e":true,"k":"f","d":[196],"c":[]}]]}],["t",{"w":"t","s":"t","e":false,"k":"t","d":[],"c":[["e",{"w":"te","s":"e","e":false,"k":"e","d":[],"c":[["s",{"w":"testing-","s":"sting-","e":false,"k":"s","d":[],"c":[["b",{"w":"testing-best-practices","s":"best-practices","e":true,"k":"b","d":[12],"c":[]}],["e",{"w":"testing-environments","s":"environments","e":true,"k":"e","d":[348],"c":[]}]]}],["n",{"w":"tenure-","s":"nure-","e":false,"k":"n","d":[],"c":[["m",{"w":"tenure-metadata","s":"metadata","e":true,"k":"m","d":[407],"c":[]}],["b",{"w":"tenure-blocks","s":"blocks","e":true,"k":"b","d":[409],"c":[]}]]}]]}],["o",{"w":"to","s":"o","e":false,"k":"o","d":[],"c":[["k",{"w":"token","s":"ken","e":false,"k":"k","d":[],"c":[["-",{"w":"token-","s":"-","e":false,"k":"-","d":[],"c":[["m",{"w":"token-metadata","s":"metadata","e":true,"k":"m","d":[248,249,250,251,252,253,254],"c":[["-",{"w":"token-metadata-api","s":"-api","e":true,"k":"-","d":[15,54,55,56,57,58,59,60,61,62,63,64,65,66,67],"c":[]}]]}],["d",{"w":"token-development","s":"development","e":true,"k":"d","d":[204],"c":[]}],["t",{"w":"token-transfers","s":"transfers","e":true,"k":"t","d":[387],"c":[]}]]}],["s",{"w":"tokens","s":"s","e":true,"k":"s","d":[59,60,61,62,63,66,67,250,251,252,253,254,339,340],"c":[]}]]}],["-",{"w":"to-","s":"-","e":false,"k":"-","d":[],"c":[["u",{"w":"to-uint","s":"uint","e":true,"k":"u","d":[118],"c":[]}],["c",{"w":"to-consensus-buff","s":"consensus-buff","e":true,"k":"c","d":[142],"c":[]}],["i",{"w":"to-int","s":"int","e":true,"k":"i","d":[153],"c":[]}]]}],["t",{"w":"total-","s":"tal-","e":false,"k":"t","d":[],"c":[["b",{"w":"total-burnchain-rewards-for-recipient","s":"burnchain-rewards-for-recipient","e":true,"k":"b","d":[286],"c":[]}],["a",{"w":"total-and-unlocked-stx-supply","s":"and-unlocked-stx-supply","e":true,"k":"a","d":[295],"c":[]}],["s",{"w":"total-stx-supply-in-plain-text","s":"stx-supply-in-plain-text","e":true,"k":"s","d":[300],"c":[]}]]}]]}],["u",{"w":"tuple","s":"uple","e":true,"k":"u","d":[83],"c":[]}],["r",{"w":"tr","s":"r","e":false,"k":"r","d":[],"c":[["y",{"w":"try","s":"y","e":true,"k":"y","d":[166],"c":[]}],["a",{"w":"tra","s":"a","e":false,"k":"a","d":[],"c":[["n",{"w":"trans","s":"ns","e":false,"k":"n","d":[],"c":[["a",{"w":"transaction","s":"action","e":false,"k":"a","d":[],"c":[["s",{"w":"transactions","s":"s","e":true,"k":"s","d":[226,234,237,303,304,305,306,307,308,309,310,311,312,313,314,315,322,368,402,403],"c":[["-",{"w":"transactions-","s":"-","e":false,"k":"-","d":[],"c":[["f",{"w":"transactions-for-address","s":"for-address","e":true,"k":"f","d":[308],"c":[]}],["b",{"w":"transactions-by-block","s":"by-block","e":true,"k":"b","d":[314],"c":[]}],["w",{"w":"transactions-with-transfers","s":"with-transfers","e":true,"k":"w","d":[320],"c":[]}]]}]]}],["-",{"w":"transaction-","s":"-","e":false,"k":"-","d":[],"c":[["e",{"w":"transaction-events","s":"events","e":true,"k":"e","d":[305],"c":[]}],["w",{"w":"transaction-with-transfers","s":"with-transfers","e":true,"k":"w","d":[325],"c":[]}],["f",{"w":"transaction-fee-priorities","s":"fee-priorities","e":true,"k":"f","d":[335],"c":[]}]]}]]}],["f",{"w":"transfer-estimate","s":"fer-estimate","e":true,"k":"f","d":[398],"c":[]}]]}],["i",{"w":"traits","s":"its","e":true,"k":"i","d":[411],"c":[]}]]}]]}],["i",{"w":"time-and-blocks","s":"ime-and-blocks","e":true,"k":"i","d":[202],"c":[]}]]}],["a",{"w":"a","s":"a","e":false,"k":"a","d":[],"c":[["r",{"w":"archi","s":"rchi","e":false,"k":"r","d":[],"c":[["v",{"w":"archive","s":"ve","e":true,"k":"v","d":[13,14,15,16,17,68,69,70,71],"c":[["-",{"w":"archive-project","s":"-project","e":true,"k":"-","d":[48],"c":[]}]]}],["t",{"w":"architecture","s":"tecture","e":true,"k":"t","d":[55,259],"c":[]}]]}],["d",{"w":"add","s":"dd","e":true,"k":"d","d":[137],"c":[["-",{"w":"add-a-contract","s":"-a-contract","e":true,"k":"-","d":[20],"c":[]}],["r",{"w":"address","s":"ress","e":true,"k":"r","d":[430,470],"c":[["-",{"w":"address-transactions","s":"-transactions","e":true,"k":"-","d":[303],"c":[]}]]}]]}],["i",{"w":"ai","s":"i","e":true,"k":"i","d":[70],"c":[]}],["c",{"w":"ac","s":"c","e":false,"k":"c","d":[],"c":[["c",{"w":"acc","s":"c","e":false,"k":"c","d":[],"c":[["e",{"w":"access-control","s":"ess-control","e":true,"k":"e","d":[81],"c":[]}],["o",{"w":"accounts","s":"ounts","e":true,"k":"o","d":[320,321,322,323,324,325,326,327,328,404,405],"c":[["-",{"w":"accounts-and-addresses","s":"-and-addresses","e":true,"k":"-","d":[240],"c":[]}]]}]]}],["t",{"w":"activit","s":"tivit","e":false,"k":"t","d":[],"c":[["i",{"w":"activities","s":"ies","e":true,"k":"i","d":[434,435,436,437,438,474,475,476,477,478],"c":[]}],["y",{"w":"activity","s":"y","e":true,"k":"y","d":[438,478],"c":[]}]]}]]}],["n",{"w":"and","s":"nd","e":true,"k":"n","d":[108],"c":[]}],["s",{"w":"as","s":"s","e":false,"k":"s","d":[],"c":[["-",{"w":"as-","s":"-","e":false,"k":"-","d":[],"c":[["m",{"w":"as-max-len","s":"max-len","e":true,"k":"m","d":[126],"c":[]}],["c",{"w":"as-contract","s":"contract","e":true,"k":"c","d":[192],"c":[]}]]}],["s",{"w":"asse","s":"se","e":false,"k":"s","d":[],"c":[["r",{"w":"asserts","s":"rts","e":true,"k":"r","d":[193],"c":[]}],["t",{"w":"assets","s":"ts","e":true,"k":"t","d":[324],"c":[]}]]}]]}],["p",{"w":"ap","s":"p","e":false,"k":"p","d":[],"c":[["p",{"w":"app","s":"p","e":false,"k":"p","d":[],"c":[["e",{"w":"append","s":"end","e":true,"k":"e","d":[149],"c":[]}],["-",{"w":"app-templates","s":"-templates","e":true,"k":"-","d":[384],"c":[]}]]}],["i",{"w":"api","s":"i","e":true,"k":"i","d":[248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501],"c":[["-",{"w":"api-keys","s":"-keys","e":true,"k":"-","d":[247,467,512],"c":[]}]]}]]}],["t",{"w":"at-block","s":"t-block","e":true,"k":"t","d":[161],"c":[]}],["g",{"w":"aggregated-signer-information-for-","s":"ggregated-signer-information-for-","e":false,"k":"g","d":[],"c":[["a",{"w":"aggregated-signer-information-for-a-block","s":"a-block","e":true,"k":"a","d":[206],"c":[]}],["m",{"w":"aggregated-signer-information-for-most-recent-blocks","s":"most-recent-blocks","e":true,"k":"m","d":[207],"c":[]}]]}],["u",{"w":"authenticat","s":"uthenticat","e":false,"k":"u","d":[],"c":[["i",{"w":"authentication","s":"ion","e":true,"k":"i","d":[257],"c":[]}],["e",{"w":"authenticate-users","s":"e-users","e":true,"k":"e","d":[352],"c":[]}]]}],["v",{"w":"average-times","s":"verage-times","e":true,"k":"v","d":[266],"c":[]}]]}],["v",{"w":"v","s":"v","e":false,"k":"v","d":[],"c":[["e",{"w":"verify-archive-data","s":"erify-archive-data","e":true,"k":"e","d":[16],"c":[]}],["a",{"w":"va","s":"a","e":false,"k":"a","d":[],"c":[["l",{"w":"validate-a-contract","s":"lidate-a-contract","e":true,"k":"l","d":[21],"c":[]}],["r",{"w":"var-","s":"r-","e":false,"k":"r","d":[],"c":[["g",{"w":"var-get","s":"get","e":true,"k":"g","d":[131],"c":[]}],["s",{"w":"var-set","s":"set","e":true,"k":"s","d":[175],"c":[]}]]}]]}],["6",{"w":"v6","s":"6","e":true,"k":"6","d":[226,227],"c":[]}],["3",{"w":"v3","s":"3","e":true,"k":"3","d":[406,407,408,409],"c":[]}]]}],["e",{"w":"e","s":"e","e":false,"k":"e","d":[],"c":[["x",{"w":"ex","s":"x","e":false,"k":"x","d":[],"c":[["a",{"w":"examples","s":"amples","e":true,"k":"a","d":[20,21,22,23,24,25,26,27,28,29,46,47,48,49,50,51,52,230,231,232,352,353,354,355,374,375,376,377],"c":[]}],["p",{"w":"explorer","s":"plorer","e":true,"k":"p","d":[74,75,220,425,426,443,444],"c":[]}]]}],["s",{"w":"estimate","s":"stimate","e":true,"k":"s","d":[396],"c":[["-",{"w":"estimate-costs","s":"-costs","e":true,"k":"-","d":[22],"c":[]}]]}],["r",{"w":"err","s":"rr","e":true,"k":"r","d":[164],"c":[]}],["l",{"w":"element-at","s":"lement-at","e":true,"k":"l","d":[180],"c":[]}],["v",{"w":"event","s":"vent","e":false,"k":"v","d":[],"c":[["s",{"w":"events","s":"s","e":true,"k":"s","d":[329],"c":[["-",{"w":"events-for-an-address-transaction","s":"-for-an-address-transaction","e":true,"k":"-","d":[304],"c":[]}]]}],["-",{"w":"event-streaming","s":"-streaming","e":true,"k":"-","d":[382],"c":[]}]]}],["t",{"w":"etchings","s":"tchings","e":true,"k":"t","d":[440,441,442,479,480,481],"c":[]}]]}],["w",{"w":"w","s":"w","e":false,"k":"w","d":[],"c":[["o",{"w":"working-with-sbtc","s":"orking-with-sbtc","e":true,"k":"o","d":[28],"c":[]}],["e",{"w":"web-app-development","s":"eb-app-development","e":true,"k":"e","d":[203],"c":[]}],["a",{"w":"wallet-integration","s":"allet-integration","e":true,"k":"a","d":[383],"c":[]}]]}],["b",{"w":"b","s":"b","e":false,"k":"b","d":[],"c":[["i",{"w":"bit","s":"it","e":false,"k":"i","d":[],"c":[["c",{"w":"bitcoin","s":"coin","e":true,"k":"c","d":[371,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505],"c":[["-",{"w":"bitcoin-node","s":"-node","e":true,"k":"-","d":[32],"c":[]}]]}],["-",{"w":"bit-","s":"-","e":false,"k":"-","d":[],"c":[["m",{"w":"bit-manipulation","s":"manipulation","e":true,"k":"m","d":[76],"c":[]}],["a",{"w":"bit-and","s":"and","e":true,"k":"a","d":[113],"c":[]}],["x",{"w":"bit-xor","s":"xor","e":true,"k":"x","d":[128],"c":[]}],["o",{"w":"bit-or","s":"or","e":true,"k":"o","d":[130],"c":[]}],["s",{"w":"bit-shift-","s":"shift-","e":false,"k":"s","d":[],"c":[["r",{"w":"bit-shift-right","s":"right","e":true,"k":"r","d":[145],"c":[]}],["l",{"w":"bit-shift-left","s":"left","e":true,"k":"l","d":[174],"c":[]}]]}],["n",{"w":"bit-not","s":"not","e":true,"k":"n","d":[187],"c":[]}]]}]]}],["u",{"w":"bu","s":"u","e":false,"k":"u","d":[],"c":[["i",{"w":"build-","s":"ild-","e":false,"k":"i","d":[],"c":[["a",{"w":"build-a","s":"a","e":false,"k":"a","d":[],"c":[["-",{"w":"build-a-","s":"-","e":false,"k":"-","d":[],"c":[["c",{"w":"build-a-custom-api","s":"custom-api","e":true,"k":"c","d":[68],"c":[]}],["d",{"w":"build-a-decentralized-","s":"decentralized-","e":false,"k":"d","d":[],"c":[["g",{"w":"build-a-decentralized-grants-program","s":"grants-program","e":true,"k":"g","d":[69],"c":[]}],["k",{"w":"build-a-decentralized-kickstarter","s":"kickstarter","e":true,"k":"k","d":[511],"c":[]}]]}],["f",{"w":"build-a-friend-tech-clone","s":"friend-tech-clone","e":true,"k":"f","d":[71],"c":[]}]]}],["n",{"w":"build-an-nft-marketplace","s":"n-nft-marketplace","e":true,"k":"n","d":[513],"c":[]}]]}],["e",{"w":"build-explorer","s":"explorer","e":true,"k":"e","d":[75,426,444],"c":[]}]]}],["f",{"w":"buff-to-","s":"ff-to-","e":false,"k":"f","d":[],"c":[["i",{"w":"buff-to-int-","s":"int-","e":false,"k":"i","d":[],"c":[["b",{"w":"buff-to-int-be","s":"be","e":true,"k":"b","d":[87],"c":[]}],["l",{"w":"buff-to-int-le","s":"le","e":true,"k":"l","d":[179],"c":[]}]]}],["u",{"w":"buff-to-uint-","s":"uint-","e":false,"k":"u","d":[],"c":[["b",{"w":"buff-to-uint-be","s":"be","e":true,"k":"b","d":[133],"c":[]}],["l",{"w":"buff-to-uint-le","s":"le","e":true,"k":"l","d":[158],"c":[]}]]}]]}],["r",{"w":"burn-","s":"rn-","e":false,"k":"r","d":[],"c":[["b",{"w":"burn-blocks","s":"blocks","e":true,"k":"b","d":[336,337,338],"c":[]}],["o",{"w":"burn-ops","s":"ops","e":true,"k":"o","d":[417,418],"c":[]}]]}]]}],["a",{"w":"ba","s":"a","e":false,"k":"a","d":[],"c":[["s",{"w":"basic-arithmetic","s":"sic-arithmetic","e":true,"k":"s","d":[77],"c":[]}],["l",{"w":"balances","s":"lances","e":true,"k":"l","d":[321,430,431,432,433,470,471,472,473],"c":[]}]]}],["e",{"w":"begin","s":"egin","e":true,"k":"e","d":[163],"c":[]}],["l",{"w":"block","s":"lock","e":false,"k":"l","d":[],"c":[["s",{"w":"blocks","s":"s","e":true,"k":"s","d":[205,206,207,260,261,262,263,264,265,266,267,268,269,388,389],"c":[]}],["-",{"w":"block-","s":"-","e":false,"k":"-","d":[],"c":[["p",{"w":"block-proposal","s":"proposal","e":true,"k":"p","d":[389],"c":[["s",{"w":"block-proposals","s":"s","e":true,"k":"s","d":[216,217,218],"c":[]}]]}],["b",{"w":"block-by-","s":"by-","e":false,"k":"b","d":[],"c":[["h",{"w":"block-by-h","s":"h","e":false,"k":"h","d":[],"c":[["a",{"w":"block-by-hash","s":"ash","e":true,"k":"a","d":[262],"c":[]}],["e",{"w":"block-by-height","s":"eight","e":true,"k":"e","d":[269],"c":[]}]]}],["b",{"w":"block-by-burn-block-h","s":"burn-block-h","e":false,"k":"b","d":[],"c":[["e",{"w":"block-by-burn-block-height","s":"eight","e":true,"k":"e","d":[265],"c":[]}],["a",{"w":"block-by-burn-block-hash","s":"ash","e":true,"k":"a","d":[268],"c":[]}]]}]]}]]}],["c",{"w":"blockchain-development","s":"chain-development","e":true,"k":"c","d":[349],"c":[]}]]}],["r",{"w":"br","s":"r","e":false,"k":"r","d":[],"c":[["o",{"w":"broadcast","s":"oadcast","e":false,"k":"o","d":[],"c":[["-",{"w":"broadcast-transaction","s":"-transaction","e":true,"k":"-","d":[402],"c":[["s",{"w":"broadcast-transactions","s":"s","e":true,"k":"s","d":[230,353],"c":[]}]]}],["i",{"w":"broadcasting","s":"ing","e":true,"k":"i","d":[242],"c":[]}]]}],["c",{"w":"brc20","s":"c20","e":true,"k":"c","d":[447,448,449,450,451,452,484,485,486,487,488,489],"c":[]}]]}],["y",{"w":"by-trait","s":"y-trait","e":true,"k":"y","d":[330],"c":[]}]]}],["l",{"w":"l","s":"l","e":false,"k":"l","d":[],"c":[["i",{"w":"list","s":"ist","e":true,"k":"i","d":[37,82],"c":[]}],["o",{"w":"log2","s":"og2","e":true,"k":"o","d":[107],"c":[]}],["e",{"w":"le","s":"e","e":false,"k":"e","d":[],"c":[["n",{"w":"len","s":"n","e":true,"k":"n","d":[110],"c":[]}],["s",{"w":"less-than","s":"ss-than","e":true,"k":"s","d":[114],"c":[["-",{"w":"less-than-or-equal","s":"-or-equal","e":true,"k":"-","d":[176],"c":[]}]]}],["t",{"w":"let","s":"t","e":true,"k":"t","d":[171],"c":[]}],["g",{"w":"legacy-total-and-unlocked-stx-supply","s":"gacy-total-and-unlocked-stx-supply","e":true,"k":"g","d":[302],"c":[]}]]}],["a",{"w":"latest-nonce","s":"atest-nonce","e":true,"k":"a","d":[326],"c":[]}]]}],["u",{"w":"u","s":"u","e":false,"k":"u","d":[],"c":[["p",{"w":"update","s":"pdate","e":true,"k":"p","d":[41],"c":[]}],["s",{"w":"us","s":"s","e":false,"k":"s","d":[],"c":[["a",{"w":"usage","s":"age","e":true,"k":"a","d":[58,439,462],"c":[]}],["e",{"w":"use-","s":"e-","e":false,"k":"e","d":[],"c":[["t",{"w":"use-trait","s":"trait","e":true,"k":"t","d":[117],"c":[]}],["w",{"w":"use-with-react-native","s":"with-react-native","e":true,"k":"w","d":[232],"c":[]}]]}],["i",{"w":"using-clarity-values","s":"ing-clarity-values","e":true,"k":"i","d":[514],"c":[]}]]}],["n",{"w":"un","s":"n","e":false,"k":"n","d":[],"c":[["w",{"w":"unwrap","s":"wrap","e":true,"k":"w","d":[85],"c":[["-",{"w":"unwrap-","s":"-","e":false,"k":"-","d":[],"c":[["e",{"w":"unwrap-err","s":"err","e":true,"k":"e","d":[159],"c":[["-",{"w":"unwrap-err-panic","s":"-panic","e":true,"k":"-","d":[148],"c":[]}]]}],["p",{"w":"unwrap-panic","s":"panic","e":true,"k":"p","d":[151],"c":[]}]]}]]}],["i",{"w":"unit-testing","s":"it-testing","e":true,"k":"i","d":[224],"c":[]}]]}]]}],["f",{"w":"f","s":"f","e":false,"k":"f","d":[],"c":[["a",{"w":"faucet","s":"aucet","e":true,"k":"a","d":[49],"c":[["s",{"w":"faucets","s":"s","e":true,"k":"s","d":[318,319],"c":[]}]]}],["u",{"w":"fun","s":"un","e":false,"k":"u","d":[],"c":[["g",{"w":"fungible-token","s":"gible-token","e":false,"k":"g","d":[],"c":[["-",{"w":"fungible-token-metadata","s":"-metadata","e":true,"k":"-","d":[60,251],"c":[]}],["s",{"w":"fungible-tokens","s":"s","e":true,"k":"s","d":[62,253],"c":[]}]]}],["c",{"w":"functions","s":"ctions","e":true,"k":"c","d":[82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200],"c":[]}]]}],["o",{"w":"fo","s":"o","e":false,"k":"o","d":[],"c":[["l",{"w":"fold","s":"ld","e":true,"k":"l","d":[96],"c":[]}],["r",{"w":"for-","s":"r-","e":false,"k":"r","d":[],"c":[["t",{"w":"for-transaction","s":"transaction","e":true,"k":"t","d":[435,475],"c":[]}],["a",{"w":"for-address","s":"address","e":true,"k":"a","d":[436,476],"c":[]}],["b",{"w":"for-block","s":"block","e":true,"k":"b","d":[437,477],"c":[]}]]}]]}],["t",{"w":"ft-","s":"t-","e":false,"k":"t","d":[],"c":[["b",{"w":"ft-burn","s":"burn","e":true,"k":"b","d":[115],"c":[]}],["t",{"w":"ft-transfer","s":"transfer","e":true,"k":"t","d":[123],"c":[]}],["g",{"w":"ft-get-","s":"get-","e":false,"k":"g","d":[],"c":[["s",{"w":"ft-get-supply","s":"supply","e":true,"k":"s","d":[125],"c":[]}],["b",{"w":"ft-get-balance","s":"balance","e":true,"k":"b","d":[190],"c":[]}]]}],["m",{"w":"ft-mint","s":"mint","e":true,"k":"m","d":[178],"c":[]}]]}],["r",{"w":"from-consensus-buff","s":"rom-consensus-buff","e":true,"k":"r","d":[144],"c":[]}],["i",{"w":"filter","s":"ilter","e":true,"k":"i","d":[177],"c":[]}],["e",{"w":"fee","s":"ee","e":false,"k":"e","d":[],"c":[["s",{"w":"fees","s":"s","e":true,"k":"s","d":[279,280,396,397,398],"c":[]}],["-",{"w":"fee-rate","s":"-rate","e":true,"k":"-","d":[279],"c":[]}]]}]]}],["n",{"w":"n","s":"n","e":false,"k":"n","d":[],"c":[["o",{"w":"no","s":"o","e":false,"k":"o","d":[],"c":[["n",{"w":"non","s":"n","e":false,"k":"n","d":[],"c":[["-",{"w":"non-fungible-token","s":"-fungible-token","e":false,"k":"-","d":[],"c":[["-",{"w":"non-fungible-token-metadata","s":"-metadata","e":true,"k":"-","d":[63,254],"c":[]}],["s",{"w":"non-fungible-tokens","s":"s","e":true,"k":"s","d":[341,342,343,344],"c":[]}]]}],["c",{"w":"nonce-handling","s":"ce-handling","e":true,"k":"c","d":[258],"c":[]}]]}],["t",{"w":"not","s":"t","e":true,"k":"t","d":[155],"c":[]}],["-",{"w":"no-loss-lottery","s":"-loss-lottery","e":true,"k":"-","d":[516],"c":[]}]]}],["f",{"w":"nft-","s":"ft-","e":false,"k":"f","d":[],"c":[["t",{"w":"nft-transfer","s":"transfer","e":true,"k":"t","d":[101],"c":[]}],["b",{"w":"nft-burn","s":"burn","e":true,"k":"b","d":[135],"c":[]}],["m",{"w":"nft-mint","s":"mint","e":true,"k":"m","d":[186],"c":[["i",{"w":"nft-minting","s":"ing","e":true,"k":"i","d":[385],"c":[]}]]}],["g",{"w":"nft-get-owner","s":"get-owner","e":true,"k":"g","d":[195],"c":[]}],["e",{"w":"nft-events","s":"events","e":true,"k":"e","d":[323],"c":[]}]]}],["a",{"w":"na","s":"a","e":false,"k":"a","d":[],"c":[["k",{"w":"nakamoto","s":"kamoto","e":true,"k":"k","d":[219,220,221,222,223],"c":[["-",{"w":"nakamoto-block","s":"-block","e":true,"k":"-","d":[408],"c":[]}]]}],["m",{"w":"name","s":"me","e":false,"k":"m","d":[],"c":[["s",{"w":"names","s":"s","e":true,"k":"s","d":[270,271,272,273,274,275,276,277,278,393,394,395],"c":[["p",{"w":"namespace","s":"pace","e":false,"k":"p","d":[],"c":[["-",{"w":"namespace-","s":"-","e":false,"k":"-","d":[],"c":[["n",{"w":"namespace-names","s":"names","e":true,"k":"n","d":[275],"c":[]}],["p",{"w":"namespace-price","s":"price","e":true,"k":"p","d":[393],"c":[]}]]}],["s",{"w":"namespaces","s":"s","e":true,"k":"s","d":[276],"c":[]}]]}]]}],["-",{"w":"name-","s":"-","e":false,"k":"-","d":[],"c":[["s",{"w":"name-subdomains","s":"subdomains","e":true,"k":"s","d":[271],"c":[]}],["z",{"w":"name-zonefile","s":"zonefile","e":true,"k":"z","d":[272],"c":[]}],["d",{"w":"name-details","s":"details","e":true,"k":"d","d":[277],"c":[]}],["p",{"w":"name-price","s":"price","e":true,"k":"p","d":[395],"c":[]}]]}]]}]]}],["e",{"w":"network","s":"etwork","e":true,"k":"e","d":[227,235,369],"c":[["s",{"w":"networks","s":"s","e":true,"k":"s","d":[241],"c":[]}],["-",{"w":"network-","s":"-","e":false,"k":"-","d":[],"c":[["g",{"w":"network-given-block-time","s":"given-block-time","e":true,"k":"g","d":[296],"c":[]}],["b",{"w":"network-block-time","s":"block-time","e":true,"k":"b","d":[298],"c":[]}]]}]]}]]}],["h",{"w":"h","s":"h","e":false,"k":"h","d":[],"c":[["a",{"w":"ha","s":"a","e":false,"k":"a","d":[],"c":[["c",{"w":"hacks","s":"cks","e":true,"k":"c","d":[68,69,70,71,72,73],"c":[]}],["s",{"w":"hash160","s":"sh160","e":true,"k":"s","d":[188],"c":[]}],["n",{"w":"handling-optionals-and-errors","s":"ndling-optionals-and-errors","e":true,"k":"n","d":[201],"c":[]}]]}],["i",{"w":"histor","s":"istor","e":false,"k":"i","d":[],"c":[["i",{"w":"historical-zonefile","s":"ical-zonefile","e":true,"k":"i","d":[278],"c":[]}],["y",{"w":"history","s":"y","e":true,"k":"y","d":[344],"c":[]}]]}],["o",{"w":"hold","s":"old","e":false,"k":"o","d":[],"c":[["e",{"w":"holder","s":"er","e":false,"k":"e","d":[],"c":[["s",{"w":"holders","s":"s","e":true,"k":"s","d":[340,433,473],"c":[]}],["-",{"w":"holder-balance","s":"-balance","e":true,"k":"-","d":[432,472],"c":[]}]]}],["i",{"w":"holdings","s":"ings","e":true,"k":"i","d":[342],"c":[]}]]}]]}],["o",{"w":"o","s":"o","e":false,"k":"o","d":[],"c":[["p",{"w":"optimizations","s":"ptimizations","e":true,"k":"p","d":[79],"c":[]}],["k",{"w":"ok","s":"k","e":true,"k":"k","d":[121],"c":[]}],["r",{"w":"or","s":"r","e":true,"k":"r","d":[165],"c":[["d",{"w":"ordinals","s":"dinals","e":true,"k":"d","d":[443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500],"c":[]}]]}],["w",{"w":"owned-by-address","s":"wned-by-address","e":true,"k":"w","d":[274],"c":[]}],["b",{"w":"observing-contract-calls","s":"bserving-contract-calls","e":true,"k":"b","d":[377],"c":[]}]]}],["k",{"w":"keccak256","s":"keccak256","e":true,"k":"k","d":[91],"c":[]}],["x",{"w":"xor","s":"xor","e":true,"k":"x","d":[93],"c":[]}],["j",{"w":"js","s":"js","e":true,"k":"j","d":[226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,366,367,368,369,370],"c":[]}]]},"isArray":false}},"vectorIndexes":{},"searchableProperties":["id","title","description","content","url"],"searchablePropertiesWithTypes":{"id":"string","title":"string","description":"string","content":"string","url":"string"},"frequencies":{"id":{"1":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"contributors-guide":0.3333333333333333},"2":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"get-started":0.3333333333333333},"3":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"rate-limiting":0.3333333333333333},"4":{"docs":0.2,"stacks":0.2,"clarinet-js-sdk":0.2,"references":0.2,"simnet":0.2},"5":{"docs":0.2,"stacks":0.2,"clarinet-js-sdk":0.2,"references":0.2,"properties":0.2},"6":{"docs":0.2,"stacks":0.2,"clarinet-js-sdk":0.2,"references":0.2,"custom-matchers":0.2},"7":{"docs":0.2,"stacks":0.2,"clarinet-js-sdk":0.2,"references":0.2,"methods":0.2},"8":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"clarinet-js-sdk":0.3333333333333333},"9":{"docs":0.25,"stacks":0.25,"clarinet-js-sdk":0.25,"quickstart":0.25},"10":{"docs":0.25,"stacks":0.25,"clarinet-js-sdk":0.25,"installation":0.25},"11":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"reference":0.3333333333333333},"12":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"testing-best-practices":0.3333333333333333},"13":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"archive":0.3333333333333333},"14":{"docs":0.2,"stacks":0.2,"archive":0.2,"guides":0.2,"stacks-api":0.2},"15":{"docs":0.2,"stacks":0.2,"archive":0.2,"guides":0.2,"token-metadata-api":0.2},"16":{"docs":0.2,"stacks":0.2,"archive":0.2,"guides":0.2,"verify-archive-data":0.2},"17":{"docs":0.2,"stacks":0.2,"archive":0.2,"guides":0.2,"stacks-blockchain":0.2},"18":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"clarinet":0.3333333333333333},"19":{"docs":0.25,"stacks":0.25,"clarinet":0.25,"concepts":0.25},"20":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"add-a-contract":0.2},"21":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"validate-a-contract":0.2},"22":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"estimate-costs":0.2},"23":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"start-a-development-console":0.2},"24":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"run-a-local-devnet":0.2},"25":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"deploy-a-contract":0.2},"26":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"debug-a-contract":0.2},"27":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"create-deployment-plans":0.2},"28":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"working-with-sbtc":0.2},"29":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"create-a-new-project":0.2},"30":{"docs":0.25,"stacks":0.25,"clarinet":0.25,"quickstart":0.25},"31":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"platform-api":0.3333333333333333},"32":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"devnet":0.2,"bitcoin-node":0.2},"33":{"docs":0.25,"stacks":0.25,"platform-api":0.25,"devnet":0.25},"34":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"devnet":0.2,"stop":0.2},"35":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"devnet":0.2,"start":0.2},"36":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"devnet":0.2,"stacks-blockchain-api":0.2},"37":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"chainhooks":0.2,"list":0.2},"38":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"chainhooks":0.2,"create":0.2},"39":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"chainhooks":0.2,"get":0.2},"40":{"docs":0.25,"stacks":0.25,"platform-api":0.25,"chainhooks":0.25},"41":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"chainhooks":0.2,"update":0.2},"42":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"chainhooks":0.2,"delete":0.2},"43":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"chainhooks":0.2,"status":0.2},"44":{"docs":0.5,"stacks":0.5},"45":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"platform":0.3333333333333333},"46":{"docs":0.2,"stacks":0.2,"platform":0.2,"examples":0.2,"deploy-contracts":0.2},"47":{"docs":0.2,"stacks":0.2,"platform":0.2,"examples":0.2,"create-project":0.2},"48":{"docs":0.2,"stacks":0.2,"platform":0.2,"examples":0.2,"archive-project":0.2},"49":{"docs":0.2,"stacks":0.2,"platform":0.2,"examples":0.2,"faucet":0.2},"50":{"docs":0.2,"stacks":0.2,"platform":0.2,"examples":0.2,"devnet":0.2},"51":{"docs":0.2,"stacks":0.2,"platform":0.2,"examples":0.2,"contract-monitoring":0.2},"52":{"docs":0.2,"stacks":0.2,"platform":0.2,"examples":0.2,"create-chainhooks":0.2},"53":{"docs":0.25,"stacks":0.25,"platform":0.25,"quickstart":0.25},"54":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"token-metadata-api":0.3333333333333333},"55":{"docs":0.25,"stacks":0.25,"token-metadata-api":0.25,"architecture":0.25},"56":{"docs":0.25,"stacks":0.25,"token-metadata-api":0.25,"info":0.25},"57":{"docs":0.2,"stacks":0.2,"token-metadata-api":0.2,"info":0.2,"status":0.2},"58":{"docs":0.25,"stacks":0.25,"token-metadata-api":0.25,"usage":0.25},"59":{"docs":0.25,"stacks":0.25,"token-metadata-api":0.25,"tokens":0.25},"60":{"docs":0.2,"stacks":0.2,"token-metadata-api":0.2,"tokens":0.2,"fungible-token-metadata":0.2},"61":{"docs":0.2,"stacks":0.2,"token-metadata-api":0.2,"tokens":0.2,"semi-fungible-token-metadata":0.2},"62":{"docs":0.2,"stacks":0.2,"token-metadata-api":0.2,"tokens":0.2,"fungible-tokens":0.2},"63":{"docs":0.2,"stacks":0.2,"token-metadata-api":0.2,"tokens":0.2,"non-fungible-token-metadata":0.2},"64":{"docs":0.25,"stacks":0.25,"token-metadata-api":0.25,"client":0.25},"65":{"docs":0.2,"stacks":0.2,"token-metadata-api":0.2,"client":0.2,"quickstart":0.2},"66":{"docs":0.2,"stacks":0.2,"token-metadata-api":0.2,"client":0.2,"tokens":0.2},"67":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"token-metadata-api":0.16666666666666666,"client":0.16666666666666666,"tokens":0.16666666666666666,"get-ft-metadata":0.16666666666666666},"68":{"docs":0.2,"stacks":0.2,"hacks":0.2,"archive":0.2,"build-a-custom-api":0.2},"69":{"docs":0.2,"stacks":0.2,"hacks":0.2,"archive":0.2,"build-a-decentralized-grants-program":0.2},"70":{"docs":0.2,"stacks":0.2,"hacks":0.2,"archive":0.2,"ai":0.2},"71":{"docs":0.2,"stacks":0.2,"hacks":0.2,"archive":0.2,"build-a-friend-tech-clone":0.2},"72":{"docs":0.25,"stacks":0.25,"hacks":0.25,"recipes":0.25},"73":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"hacks":0.3333333333333333},"74":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"explorer":0.3333333333333333},"75":{"docs":0.2,"stacks":0.2,"explorer":0.2,"guides":0.2,"build-explorer":0.2},"76":{"docs":0.25,"stacks":0.25,"clarity":0.25,"bit-manipulation":0.25},"77":{"docs":0.25,"stacks":0.25,"clarity":0.25,"basic-arithmetic":0.25},"78":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"clarity":0.3333333333333333},"79":{"docs":0.25,"stacks":0.25,"clarity":0.25,"optimizations":0.25},"80":{"docs":0.25,"stacks":0.25,"clarity":0.25,"cryptographic-functions":0.25},"81":{"docs":0.25,"stacks":0.25,"clarity":0.25,"access-control":0.25},"82":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"list":0.2},"83":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"tuple":0.2},"84":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"sha256":0.2},"85":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"unwrap":0.2},"86":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"contract-call":0.2},"87":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"buff-to-int-be":0.2},"88":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"int-to-ascii":0.2},"89":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"map-delete":0.2},"90":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"contract-of":0.2},"91":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"keccak256":0.2},"92":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-constant":0.2},"93":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"xor":0.2},"94":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"principal-of":0.2},"95":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"get-burn-block-info":0.2},"96":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"fold":0.2},"97":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-map":0.2},"98":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"stx-account":0.2},"99":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-public":0.2},"100":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-data-var":0.2},"101":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"nft-transfer":0.2},"102":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"multiply":0.2},"103":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"default-to":0.2},"104":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"get-stacks-block-info":0.2},"105":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"map":0.2},"106":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"sqrti":0.2},"107":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"log2":0.2},"108":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"and":0.2},"109":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"replace-at":0.2},"110":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"len":0.2},"111":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"sha512-256":0.2},"112":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"divide":0.2},"113":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"bit-and":0.2},"114":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"less-than":0.2},"115":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"ft-burn":0.2},"116":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"get":0.2},"117":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"use-trait":0.2},"118":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"to-uint":0.2},"119":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-trait":0.2},"120":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"int-to-utf8":0.2},"121":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"ok":0.2},"122":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-non-fungible-token":0.2},"123":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"ft-transfer":0.2},"124":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"is-err":0.2},"125":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"ft-get-supply":0.2},"126":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"as-max-len":0.2},"127":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"get-tenure-info":0.2},"128":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"bit-xor":0.2},"129":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-private":0.2},"130":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"bit-or":0.2},"131":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"var-get":0.2},"132":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"map-set":0.2},"133":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"buff-to-uint-be":0.2},"134":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-read-only":0.2},"135":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"nft-burn":0.2},"136":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"is-ok":0.2},"137":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"add":0.2},"138":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"string-to-int":0.2},"139":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"is-none":0.2},"140":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"subtract":0.2},"141":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"principal-destruct":0.2},"142":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"to-consensus-buff":0.2},"143":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"stx-burn":0.2},"144":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"from-consensus-buff":0.2},"145":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"bit-shift-right":0.2},"146":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"is-some":0.2},"147":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"is-standard":0.2},"148":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"unwrap-err-panic":0.2},"149":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"append":0.2},"150":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"stx-transfer":0.2},"151":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"unwrap-panic":0.2},"152":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"impl-trait":0.2},"153":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"to-int":0.2},"154":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"greater-than":0.2},"155":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"not":0.2},"156":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"get-block-info":0.2},"157":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"string-to-uint":0.2},"158":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"buff-to-uint-le":0.2},"159":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"unwrap-err":0.2},"160":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-fungible-token":0.2},"161":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"at-block":0.2},"162":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"secp256k1-recover":0.2},"163":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"begin":0.2},"164":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"err":0.2},"165":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"or":0.2},"166":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"try":0.2},"167":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"map-insert":0.2},"168":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"some":0.2},"169":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"secp256k1-verify":0.2},"170":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"match":0.2},"171":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"let":0.2},"172":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"map-get":0.2},"173":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"is-eq":0.2},"174":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"bit-shift-left":0.2},"175":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"var-set":0.2},"176":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"less-than-or-equal":0.2},"177":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"filter":0.2},"178":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"ft-mint":0.2},"179":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"buff-to-int-le":0.2},"180":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"element-at":0.2},"181":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"sha512":0.2},"182":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"concat":0.2},"183":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"index-of":0.2},"184":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"stx-transfer-memo":0.2},"185":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"pow":0.2},"186":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"nft-mint":0.2},"187":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"bit-not":0.2},"188":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"hash160":0.2},"189":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"merge":0.2},"190":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"ft-get-balance":0.2},"191":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"greater-than-or-equal":0.2},"192":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"as-contract":0.2},"193":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"asserts":0.2},"194":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"slice":0.2},"195":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"nft-get-owner":0.2},"196":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"if":0.2},"197":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"mod":0.2},"198":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"stx-get-balance":0.2},"199":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"print":0.2},"200":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"principal-construct":0.2},"201":{"docs":0.25,"stacks":0.25,"clarity":0.25,"handling-optionals-and-errors":0.25},"202":{"docs":0.25,"stacks":0.25,"clarity":0.25,"time-and-blocks":0.25},"203":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"web-app-development":0.3333333333333333},"204":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"token-development":0.3333333333333333},"205":{"docs":0.25,"stacks":0.25,"signer-metrics-api":0.25,"blocks":0.25},"206":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"blocks":0.2,"aggregated-signer-information-for-a-block":0.2},"207":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"blocks":0.2,"aggregated-signer-information-for-most-recent-blocks":0.2},"208":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"signer-metrics-api":0.3333333333333333},"209":{"docs":0.25,"stacks":0.25,"signer-metrics-api":0.25,"info":0.25},"210":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"info":0.2,"status":0.2},"211":{"docs":0.25,"stacks":0.25,"signer-metrics-api":0.25,"prometheus":0.25},"212":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"prometheus":0.2,"metrics":0.2},"213":{"docs":0.25,"stacks":0.25,"signer-metrics-api":0.25,"signers":0.25},"214":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"signers":0.2,"pox-cycle-signer":0.2},"215":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"signers":0.2,"pox-cycle-signers":0.2},"216":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"block-proposals":0.2,"signer-information-for-a-block":0.2},"217":{"docs":0.25,"stacks":0.25,"signer-metrics-api":0.25,"block-proposals":0.25},"218":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"block-proposals":0.2,"signer-information-for-most-recent-block-proposals":0.2},"219":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"nakamoto":0.3333333333333333},"220":{"docs":0.2,"stacks":0.2,"nakamoto":0.2,"guides":0.2,"explorer":0.2},"221":{"docs":0.2,"stacks":0.2,"nakamoto":0.2,"guides":0.2,"clarinet":0.2},"222":{"docs":0.2,"stacks":0.2,"nakamoto":0.2,"guides":0.2,"stacks-api":0.2},"223":{"docs":0.2,"stacks":0.2,"nakamoto":0.2,"guides":0.2,"stacks-js":0.2},"224":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"unit-testing":0.3333333333333333},"225":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"smart-contract-development":0.3333333333333333},"226":{"docs":0.2,"stacks":0.2,"js":0.2,"v6":0.2,"transactions":0.2},"227":{"docs":0.2,"stacks":0.2,"js":0.2,"v6":0.2,"network":0.2},"228":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"js":0.3333333333333333},"229":{"docs":0.25,"stacks":0.25,"js":0.25,"roadmap":0.25},"230":{"docs":0.2,"stacks":0.2,"js":0.2,"examples":0.2,"broadcast-transactions":0.2},"231":{"docs":0.2,"stacks":0.2,"js":0.2,"examples":0.2,"post-conditions":0.2},"232":{"docs":0.2,"stacks":0.2,"js":0.2,"examples":0.2,"use-with-react-native":0.2},"233":{"docs":0.2,"stacks":0.2,"js":0.2,"packages":0.2,"sbtc":0.2},"234":{"docs":0.2,"stacks":0.2,"js":0.2,"packages":0.2,"transactions":0.2},"235":{"docs":0.2,"stacks":0.2,"js":0.2,"packages":0.2,"network":0.2},"236":{"docs":0.2,"stacks":0.2,"js":0.2,"packages":0.2,"common":0.2},"237":{"docs":0.2,"stacks":0.2,"js":0.2,"concepts":0.2,"transactions":0.2},"238":{"docs":0.2,"stacks":0.2,"js":0.2,"concepts":0.2,"post-conditions":0.2},"239":{"docs":0.2,"stacks":0.2,"js":0.2,"concepts":0.2,"private-keys":0.2},"240":{"docs":0.2,"stacks":0.2,"js":0.2,"concepts":0.2,"accounts-and-addresses":0.2},"241":{"docs":0.2,"stacks":0.2,"js":0.2,"concepts":0.2,"networks":0.2},"242":{"docs":0.2,"stacks":0.2,"js":0.2,"concepts":0.2,"broadcasting":0.2},"243":{"docs":0.25,"stacks":0.25,"js":0.25,"quickstart":0.25},"244":{"docs":0.25,"stacks":0.25,"js":0.25,"installation":0.25},"245":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"integration-testing":0.3333333333333333},"246":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"migration-guide":0.3333333333333333},"247":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"api-keys":0.3333333333333333},"248":{"docs":0.2,"stacks":0.2,"api":0.2,"token-metadata":0.2,"info":0.2},"249":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"token-metadata":0.16666666666666666,"info":0.16666666666666666,"status":0.16666666666666666},"250":{"docs":0.2,"stacks":0.2,"api":0.2,"token-metadata":0.2,"tokens":0.2},"251":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"token-metadata":0.16666666666666666,"tokens":0.16666666666666666,"fungible-token-metadata":0.16666666666666666},"252":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"token-metadata":0.16666666666666666,"tokens":0.16666666666666666,"semi-fungible-token-metadata":0.16666666666666666},"253":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"token-metadata":0.16666666666666666,"tokens":0.16666666666666666,"fungible-tokens":0.16666666666666666},"254":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"token-metadata":0.16666666666666666,"tokens":0.16666666666666666,"non-fungible-token-metadata":0.16666666666666666},"255":{"docs":0.25,"stacks":0.25,"api":0.25,"pagination":0.25},"256":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"api":0.3333333333333333},"257":{"docs":0.25,"stacks":0.25,"api":0.25,"authentication":0.25},"258":{"docs":0.25,"stacks":0.25,"api":0.25,"nonce-handling":0.25},"259":{"docs":0.25,"stacks":0.25,"api":0.25,"architecture":0.25},"260":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"get-block":0.16666666666666666},"261":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"recent-blocks":0.16666666666666666},"262":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"block-by-hash":0.16666666666666666},"263":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"blocks":0.2},"264":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"get-blocks-by-burn-block":0.16666666666666666},"265":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"block-by-burn-block-height":0.16666666666666666},"266":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"average-times":0.16666666666666666},"267":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"get-blocks":0.16666666666666666},"268":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"block-by-burn-block-hash":0.16666666666666666},"269":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"block-by-height":0.16666666666666666},"270":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"names":0.2},"271":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"names":0.16666666666666666,"name-subdomains":0.16666666666666666},"272":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"names":0.16666666666666666,"name-zonefile":0.16666666666666666},"273":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"names":0.2},"274":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"names":0.16666666666666666,"owned-by-address":0.16666666666666666},"275":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"names":0.16666666666666666,"namespace-names":0.16666666666666666},"276":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"names":0.16666666666666666,"namespaces":0.16666666666666666},"277":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"names":0.16666666666666666,"name-details":0.16666666666666666},"278":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"names":0.16666666666666666,"historical-zonefile":0.16666666666666666},"279":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"fees":0.16666666666666666,"fee-rate":0.16666666666666666},"280":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"fees":0.2},"281":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"stacking-rewards":0.16666666666666666,"recent-burnchain-reward-recipients":0.16666666666666666},"282":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"stacking-rewards":0.2},"283":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"stacking-rewards":0.16666666666666666,"recent-burnchain-reward-recipient":0.16666666666666666},"284":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"stacking-rewards":0.16666666666666666,"recent-reward-slot-holders":0.16666666666666666},"285":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"stacking-rewards":0.16666666666666666,"recent-reward-slot-holder-entries":0.16666666666666666},"286":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"stacking-rewards":0.16666666666666666,"total-burnchain-rewards-for-recipient":0.16666666666666666},"287":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"proof-of-transfer":0.16666666666666666,"cycles":0.16666666666666666},"288":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"proof-of-transfer":0.2},"289":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"proof-of-transfer":0.16666666666666666,"signer-in-cycle":0.16666666666666666},"290":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"proof-of-transfer":0.16666666666666666,"cycle":0.16666666666666666},"291":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"proof-of-transfer":0.16666666666666666,"signers-in-cycle":0.16666666666666666},"292":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"proof-of-transfer":0.16666666666666666,"stackers-for-signer-in-cycle":0.16666666666666666},"293":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"search":0.16666666666666666,"search-by-id":0.16666666666666666},"294":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"search":0.2},"295":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"info":0.16666666666666666,"total-and-unlocked-stx-supply":0.16666666666666666},"296":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"info":0.16666666666666666,"network-given-block-time":0.16666666666666666},"297":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"info":0.16666666666666666,"circulating-stx-supply-in-plain-text":0.16666666666666666},"298":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"info":0.16666666666666666,"network-block-time":0.16666666666666666},"299":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"info":0.2},"300":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"info":0.16666666666666666,"total-stx-supply-in-plain-text":0.16666666666666666},"301":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"info":0.16666666666666666,"status":0.16666666666666666},"302":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"info":0.16666666666666666,"legacy-total-and-unlocked-stx-supply":0.16666666666666666},"303":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"address-transactions":0.16666666666666666},"304":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"events-for-an-address-transaction":0.16666666666666666},"305":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"transaction-events":0.16666666666666666},"306":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"statistics-for-mempool-transactions":0.16666666666666666},"307":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"transactions":0.2},"308":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"transactions-for-address":0.16666666666666666},"309":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"dropped-mempool-transactions":0.16666666666666666},"310":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"get-transaction":0.16666666666666666},"311":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"details-for-transactions":0.16666666666666666},"312":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"recent-transactions":0.16666666666666666},"313":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"mempool-transactions":0.16666666666666666},"314":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"transactions-by-block":0.16666666666666666},"315":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"get-raw-transaction":0.16666666666666666},"316":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"stacking-pool":0.16666666666666666,"members":0.16666666666666666},"317":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"stacking-pool":0.2},"318":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"faucets":0.2},"319":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"faucets":0.16666666666666666,"stx":0.16666666666666666},"320":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"transactions-with-transfers":0.16666666666666666},"321":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"balances":0.16666666666666666},"322":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"transactions":0.16666666666666666},"323":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"nft-events":0.16666666666666666},"324":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"assets":0.16666666666666666},"325":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"transaction-with-transfers":0.16666666666666666},"326":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"latest-nonce":0.16666666666666666},"327":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"stx-balances":0.16666666666666666},"328":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"inbound-stx-transfers":0.16666666666666666},"329":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"smart-contracts":0.16666666666666666,"events":0.16666666666666666},"330":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"smart-contracts":0.16666666666666666,"by-trait":0.16666666666666666},"331":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"smart-contracts":0.2},"332":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"smart-contracts":0.16666666666666666,"info":0.16666666666666666},"333":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"smart-contracts":0.16666666666666666,"status":0.16666666666666666},"334":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"mempool":0.2},"335":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"mempool":0.16666666666666666,"transaction-fee-priorities":0.16666666666666666},"336":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"burn-blocks":0.16666666666666666,"get-burn-block":0.16666666666666666},"337":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"burn-blocks":0.2},"338":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"burn-blocks":0.16666666666666666,"get-burn-blocks":0.16666666666666666},"339":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"tokens":0.2},"340":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"tokens":0.16666666666666666,"holders":0.16666666666666666},"341":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"non-fungible-tokens":0.2},"342":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"non-fungible-tokens":0.16666666666666666,"holdings":0.16666666666666666},"343":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"non-fungible-tokens":0.16666666666666666,"mints":0.16666666666666666},"344":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"non-fungible-tokens":0.16666666666666666,"history":0.16666666666666666},"345":{"docs":0.25,"stacks":0.25,"api":0.25,"getting-started":0.25},"346":{"docs":0.25,"stacks":0.25,"api":0.25,"requesting-proofs":0.25},"347":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"setup":0.3333333333333333},"348":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"testing-environments":0.3333333333333333},"349":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"blockchain-development":0.3333333333333333},"350":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"connect":0.3333333333333333},"351":{"docs":0.25,"stacks":0.25,"connect":0.25,"support":0.25},"352":{"docs":0.2,"stacks":0.2,"connect":0.2,"examples":0.2,"authenticate-users":0.2},"353":{"docs":0.2,"stacks":0.2,"connect":0.2,"examples":0.2,"broadcast-transactions":0.2},"354":{"docs":0.2,"stacks":0.2,"connect":0.2,"examples":0.2,"sign-messages":0.2},"355":{"docs":0.2,"stacks":0.2,"connect":0.2,"examples":0.2,"migration":0.2},"356":{"docs":0.25,"stacks":0.25,"connect":0.25,"packages":0.25},"357":{"docs":0.25,"stacks":0.25,"connect":0.25,"quickstart":0.25},"358":{"docs":0.2,"stacks":0.2,"reference":0.2,"clarinet-js-sdk":0.2,"simnet":0.2},"359":{"docs":0.2,"stacks":0.2,"reference":0.2,"clarinet-js-sdk":0.2,"properties":0.2},"360":{"docs":0.2,"stacks":0.2,"reference":0.2,"clarinet-js-sdk":0.2,"custom-matchers":0.2},"361":{"docs":0.2,"stacks":0.2,"reference":0.2,"clarinet-js-sdk":0.2,"methods":0.2},"362":{"docs":0.2,"stacks":0.2,"reference":0.2,"clarinet-js-sdk":0.2,"clarinet-sdk":0.2},"363":{"docs":0.2,"stacks":0.2,"reference":0.2,"cli":0.2,"clarinet":0.2},"364":{"docs":0.2,"stacks":0.2,"reference":0.2,"cli":0.2,"stacks-js":0.2},"365":{"docs":0.2,"stacks":0.2,"reference":0.2,"stacks-blockchain-api":0.2,"client":0.2},"366":{"docs":0.2,"stacks":0.2,"reference":0.2,"js":0.2,"connect":0.2},"367":{"docs":0.2,"stacks":0.2,"reference":0.2,"js":0.2,"sbtc":0.2},"368":{"docs":0.2,"stacks":0.2,"reference":0.2,"js":0.2,"transactions":0.2},"369":{"docs":0.2,"stacks":0.2,"reference":0.2,"js":0.2,"network":0.2},"370":{"docs":0.2,"stacks":0.2,"reference":0.2,"js":0.2,"common":0.2},"371":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"chainhook":0.16666666666666666,"references":0.16666666666666666,"scopes":0.16666666666666666,"bitcoin":0.16666666666666666},"372":{"docs":0.2,"stacks":0.2,"chainhook":0.2,"references":0.2,"scopes":0.2},"373":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"chainhook":0.3333333333333333},"374":{"docs":0.2,"stacks":0.2,"chainhook":0.2,"examples":0.2,"chainhook-as-a-service-with-stacks-node":0.2},"375":{"docs":0.2,"stacks":0.2,"chainhook":0.2,"examples":0.2,"register-chainhooks-on-devnet":0.2},"376":{"docs":0.2,"stacks":0.2,"chainhook":0.2,"examples":0.2,"chainhook-as-a-service":0.2},"377":{"docs":0.2,"stacks":0.2,"chainhook":0.2,"examples":0.2,"observing-contract-calls":0.2},"378":{"docs":0.25,"stacks":0.25,"chainhook":0.25,"quickstart":0.25},"379":{"docs":0.25,"stacks":0.25,"chainhook":0.25,"predicate-design":0.25},"380":{"docs":0.25,"stacks":0.25,"chainhook":0.25,"installation":0.25},"381":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"quickstarts":0.3333333333333333},"382":{"docs":0.25,"stacks":0.25,"quickstarts":0.25,"event-streaming":0.25},"383":{"docs":0.25,"stacks":0.25,"quickstarts":0.25,"wallet-integration":0.25},"384":{"docs":0.25,"stacks":0.25,"quickstarts":0.25,"app-templates":0.25},"385":{"docs":0.25,"stacks":0.25,"quickstarts":0.25,"nft-minting":0.25},"386":{"docs":0.25,"stacks":0.25,"quickstarts":0.25,"contract-templates":0.25},"387":{"docs":0.25,"stacks":0.25,"quickstarts":0.25,"token-transfers":0.25},"388":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"blocks":0.25},"389":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"blocks":0.2,"block-proposal":0.2},"390":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"pox":0.25},"391":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"pox":0.2,"stacker-set":0.2},"392":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"pox":0.2,"pox-details":0.2},"393":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"names":0.2,"namespace-price":0.2},"394":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"names":0.25},"395":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"names":0.2,"name-price":0.2},"396":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"fees":0.2,"estimate":0.2},"397":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"fees":0.25},"398":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"fees":0.2,"transfer-estimate":0.2},"399":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"rpc-api":0.3333333333333333},"400":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"info":0.25},"401":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"info":0.2,"core-api":0.2},"402":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"transactions":0.2,"broadcast-transaction":0.2},"403":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"transactions":0.25},"404":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"accounts":0.25},"405":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"accounts":0.2,"info":0.2},"406":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"v3":0.25},"407":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"v3":0.2,"tenure-metadata":0.2},"408":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"v3":0.2,"nakamoto-block":0.2},"409":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"v3":0.2,"tenure-blocks":0.2},"410":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"smart-contracts":0.2,"interface":0.2},"411":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"smart-contracts":0.2,"traits":0.2},"412":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"smart-contracts":0.25},"413":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"smart-contracts":0.2,"map-entry":0.2},"414":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"smart-contracts":0.2,"read-only":0.2},"415":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"smart-contracts":0.2,"source":0.2},"416":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"smart-contracts":0.2,"constants":0.2},"417":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"burn-ops":0.25},"418":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"burn-ops":0.2,"get-burn-operations":0.2},"419":{"docs":0.3333333333333333,"bitcoin":0.3333333333333333,"contributors-guide":0.3333333333333333},"420":{"docs":0.3333333333333333,"bitcoin":0.3333333333333333,"get-started":0.3333333333333333},"421":{"docs":0.3333333333333333,"bitcoin":0.3333333333333333,"rate-limiting":0.3333333333333333},"422":{"docs":0.25,"bitcoin":0.25,"runes":0.25,"runehook":0.25},"423":{"docs":0.2,"bitcoin":0.2,"runes":0.2,"runehook":0.2,"quickstart":0.2},"424":{"docs":0.2,"bitcoin":0.2,"runes":0.2,"runehook":0.2,"installation":0.2},"425":{"docs":0.25,"bitcoin":0.25,"runes":0.25,"explorer":0.25},"426":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"explorer":0.16666666666666666,"guides":0.16666666666666666,"build-explorer":0.16666666666666666},"427":{"docs":0.25,"bitcoin":0.25,"runes":0.25,"api":0.25},"428":{"docs":0.2,"bitcoin":0.2,"runes":0.2,"api":0.2,"info":0.2},"429":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"info":0.16666666666666666,"status":0.16666666666666666},"430":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"balances":0.16666666666666666,"address":0.16666666666666666},"431":{"docs":0.2,"bitcoin":0.2,"runes":0.2,"api":0.2,"balances":0.2},"432":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"balances":0.16666666666666666,"holder-balance":0.16666666666666666},"433":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"balances":0.16666666666666666,"holders":0.16666666666666666},"434":{"docs":0.2,"bitcoin":0.2,"runes":0.2,"api":0.2,"activities":0.2},"435":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"activities":0.16666666666666666,"for-transaction":0.16666666666666666},"436":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"activities":0.16666666666666666,"for-address":0.16666666666666666},"437":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"activities":0.16666666666666666,"for-block":0.16666666666666666},"438":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"activities":0.16666666666666666,"activity":0.16666666666666666},"439":{"docs":0.2,"bitcoin":0.2,"runes":0.2,"api":0.2,"usage":0.2},"440":{"docs":0.2,"bitcoin":0.2,"runes":0.2,"api":0.2,"etchings":0.2},"441":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"etchings":0.16666666666666666,"get-etchings":0.16666666666666666},"442":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"etchings":0.16666666666666666,"get-etching":0.16666666666666666},"443":{"docs":0.25,"bitcoin":0.25,"ordinals":0.25,"explorer":0.25},"444":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"explorer":0.16666666666666666,"guides":0.16666666666666666,"build-explorer":0.16666666666666666},"445":{"docs":0.2,"bitcoin":0.2,"ordinals":0.2,"api":0.2,"statistics":0.2},"446":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"statistics":0.16666666666666666,"get-stats-inscription-count":0.16666666666666666},"447":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-token-holders":0.16666666666666666},"448":{"docs":0.2,"bitcoin":0.2,"ordinals":0.2,"api":0.2,"brc20":0.2},"449":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-balances":0.16666666666666666},"450":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-token-details":0.16666666666666666},"451":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-tokens":0.16666666666666666},"452":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-activity":0.16666666666666666},"453":{"docs":0.2,"bitcoin":0.2,"ordinals":0.2,"api":0.2,"inscriptions":0.2},"454":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscription-transfers":0.16666666666666666},"455":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscriptions":0.16666666666666666},"456":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscription-content":0.16666666666666666},"457":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"inscriptions":0.16666666666666666,"get-transfers-per-block":0.16666666666666666},"458":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscription":0.16666666666666666},"459":{"docs":0.25,"bitcoin":0.25,"ordinals":0.25,"api":0.25},"460":{"docs":0.2,"bitcoin":0.2,"ordinals":0.2,"api":0.2,"info":0.2},"461":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"info":0.16666666666666666,"status":0.16666666666666666},"462":{"docs":0.2,"bitcoin":0.2,"ordinals":0.2,"api":0.2,"usage":0.2},"463":{"docs":0.2,"bitcoin":0.2,"ordinals":0.2,"api":0.2,"satoshis":0.2},"464":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"satoshis":0.16666666666666666,"get-satoshi":0.16666666666666666},"465":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"satoshis":0.16666666666666666,"get-satoshi-inscriptions":0.16666666666666666},"466":{"docs":0.5,"bitcoin":0.5},"467":{"docs":0.3333333333333333,"bitcoin":0.3333333333333333,"api-keys":0.3333333333333333},"468":{"docs":0.2,"bitcoin":0.2,"api":0.2,"runes":0.2,"info":0.2},"469":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"info":0.16666666666666666,"status":0.16666666666666666},"470":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"balances":0.16666666666666666,"address":0.16666666666666666},"471":{"docs":0.2,"bitcoin":0.2,"api":0.2,"runes":0.2,"balances":0.2},"472":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"balances":0.16666666666666666,"holder-balance":0.16666666666666666},"473":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"balances":0.16666666666666666,"holders":0.16666666666666666},"474":{"docs":0.2,"bitcoin":0.2,"api":0.2,"runes":0.2,"activities":0.2},"475":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"activities":0.16666666666666666,"for-transaction":0.16666666666666666},"476":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"activities":0.16666666666666666,"for-address":0.16666666666666666},"477":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"activities":0.16666666666666666,"for-block":0.16666666666666666},"478":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"activities":0.16666666666666666,"activity":0.16666666666666666},"479":{"docs":0.2,"bitcoin":0.2,"api":0.2,"runes":0.2,"etchings":0.2},"480":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"etchings":0.16666666666666666,"get-etchings":0.16666666666666666},"481":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"etchings":0.16666666666666666,"get-etching":0.16666666666666666},"482":{"docs":0.2,"bitcoin":0.2,"api":0.2,"ordinals":0.2,"statistics":0.2},"483":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"statistics":0.16666666666666666,"get-stats-inscription-count":0.16666666666666666},"484":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-token-holders":0.16666666666666666},"485":{"docs":0.2,"bitcoin":0.2,"api":0.2,"ordinals":0.2,"brc20":0.2},"486":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-balances":0.16666666666666666},"487":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-token-details":0.16666666666666666},"488":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-tokens":0.16666666666666666},"489":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-activity":0.16666666666666666},"490":{"docs":0.2,"bitcoin":0.2,"api":0.2,"ordinals":0.2,"inscriptions":0.2},"491":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscription-transfers":0.16666666666666666},"492":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscriptions":0.16666666666666666},"493":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscription-content":0.16666666666666666},"494":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"inscriptions":0.16666666666666666,"get-transfers-per-block":0.16666666666666666},"495":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscription":0.16666666666666666},"496":{"docs":0.2,"bitcoin":0.2,"api":0.2,"ordinals":0.2,"info":0.2},"497":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"info":0.16666666666666666,"status":0.16666666666666666},"498":{"docs":0.2,"bitcoin":0.2,"api":0.2,"ordinals":0.2,"satoshis":0.2},"499":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"satoshis":0.16666666666666666,"get-satoshi":0.16666666666666666},"500":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"satoshis":0.16666666666666666,"get-satoshi-inscriptions":0.16666666666666666},"501":{"docs":0.3333333333333333,"bitcoin":0.3333333333333333,"api":0.3333333333333333},"502":{"docs":0.3333333333333333,"bitcoin":0.3333333333333333,"indexer":0.3333333333333333},"503":{"docs":0.2,"bitcoin":0.2,"indexer":0.2,"guides":0.2,"run-indexer":0.2},"504":{"docs":0.25,"bitcoin":0.25,"indexer":0.25,"quickstart":0.25},"505":{"docs":0.3333333333333333,"bitcoin":0.3333333333333333,"quickstarts":0.3333333333333333},"506":{"docs":0.3333333333333333,"guides":0.3333333333333333,"contributors-guide":0.3333333333333333},"507":{"docs":0.3333333333333333,"guides":0.3333333333333333,"rate-limiting":0.3333333333333333},"508":{"docs":0.5,"guides":0.5},"509":{"docs":0.3333333333333333,"guides":0.3333333333333333,"sync-a-stacks-node":0.3333333333333333},"510":{"docs":0.3333333333333333,"guides":0.3333333333333333,"installing-docker":0.3333333333333333},"511":{"docs":0.3333333333333333,"guides":0.3333333333333333,"build-a-decentralized-kickstarter":0.3333333333333333},"512":{"docs":0.3333333333333333,"guides":0.3333333333333333,"api-keys":0.3333333333333333},"513":{"docs":0.3333333333333333,"guides":0.3333333333333333,"build-an-nft-marketplace":0.3333333333333333},"514":{"docs":0.3333333333333333,"guides":0.3333333333333333,"using-clarity-values":0.3333333333333333},"515":{"docs":0.3333333333333333,"guides":0.3333333333333333,"sync-a-bitcoin-node":0.3333333333333333},"516":{"docs":0.3333333333333333,"guides":0.3333333333333333,"no-loss-lottery":0.3333333333333333},"517":{"docs":0.3333333333333333,"guides":0.3333333333333333,"docskit":0.3333333333333333}},"title":{"1":{"contributors":0.5,"guide":0.5},"2":{"introduction":1},"3":{"rate":0.5,"limiting":0.5},"4":{"simnet":1},"5":{"properties":1},"6":{"custom":0.5,"matchers":0.5},"7":{"methods":1},"8":{"overview":1},"9":{"quickstart":1},"10":{"installation":1},"11":{"sdks":0.5,"libraries":0.5},"12":{"best":0.5,"practices":0.5},"13":{"overview":1},"14":{"use":0.16666666666666666,"the":0.16666666666666666,"stacks":0.16666666666666666,"blockchain":0.16666666666666666,"api":0.16666666666666666,"archive":0.16666666666666666},"15":{"use":0.16666666666666666,"the":0.16666666666666666,"token":0.16666666666666666,"metadata":0.16666666666666666,"api":0.16666666666666666,"archive":0.16666666666666666},"16":{"verify":0.3333333333333333,"archive":0.3333333333333333,"data":0.3333333333333333},"17":{"use":0.2,"the":0.2,"stacks":0.2,"blockchain":0.2,"archive":0.2},"18":{"overview":1},"19":{"concepts":1},"20":{"add":0.3333333333333333,"a":0.3333333333333333,"contract":0.3333333333333333},"21":{"validate":0.3333333333333333,"a":0.3333333333333333,"contract":0.3333333333333333},"22":{"estimating":0.3333333333333333,"contract":0.3333333333333333,"costs":0.3333333333333333},"23":{"start":0.3333333333333333,"development":0.3333333333333333,"console":0.3333333333333333},"24":{"run":0.25,"a":0.25,"local":0.25,"devnet":0.25},"25":{"deploy":0.3333333333333333,"a":0.3333333333333333,"contract":0.3333333333333333},"26":{"debug":0.3333333333333333,"a":0.3333333333333333,"contract":0.3333333333333333},"27":{"create":0.3333333333333333,"deployment":0.3333333333333333,"plans":0.3333333333333333},"28":{"working":0.3333333333333333,"with":0.3333333333333333,"sbtc":0.3333333333333333},"29":{"create":0.25,"a":0.25,"new":0.25,"project":0.25},"30":{"quickstart":1},"31":{"overview":1},"32":{"bitcoin":0.5,"node":0.5},"33":{"devnet":1},"34":{"stop":0.5,"devnet":0.5},"35":{"start":0.5,"devnet":0.5},"36":{"stacks":0.3333333333333333,"blockchain":0.3333333333333333,"api":0.3333333333333333},"37":{"get":0.3333333333333333,"all":0.3333333333333333,"chainhooks":0.3333333333333333},"38":{"create":0.3333333333333333,"a":0.3333333333333333,"chainhook":0.3333333333333333},"39":{"get":0.25,"a":0.25,"specific":0.25,"chainhook":0.25},"40":{"chainhooks":1},"41":{"update":0.3333333333333333,"a":0.3333333333333333,"chainhook":0.3333333333333333},"42":{"delete":0.3333333333333333,"a":0.3333333333333333,"chainhook":0.3333333333333333},"43":{"get":0.25,"a":0.25,"chainhook":0.25,"status":0.25},"44":{"home":1},"45":{"overview":1},"46":{"deploy":0.5,"contracts":0.5},"47":{"create":0.3333333333333333,"a":0.3333333333333333,"project":0.3333333333333333},"48":{"archive":0.3333333333333333,"a":0.3333333333333333,"project":0.3333333333333333},"49":{"request":0.3333333333333333,"testnet":0.3333333333333333,"stx":0.3333333333333333},"50":{"using":0.5,"devnet":0.5},"51":{"monitor":0.5,"contracts":0.5},"52":{"create":0.3333333333333333,"a":0.3333333333333333,"chainhook":0.3333333333333333},"53":{"quickstart":1},"54":{"overview":1},"55":{"architecture":1},"56":{"info":1},"57":{"get":0.5,"status":0.5},"58":{"usage":1},"59":{"tokens":1},"60":{"get":0.25,"fungible":0.25,"token":0.25,"metadata":0.25},"61":{"get":0.25,"semi-fungible":0.25,"token":0.25,"metadata":0.25},"62":{"get":0.3333333333333333,"fungible":0.3333333333333333,"tokens":0.3333333333333333},"63":{"get":0.25,"non-fungible":0.25,"token":0.25,"metadata":0.25},"64":{"overview":1},"65":{"quickstart":1},"66":{"tokens":1},"67":{"get":0.25,"fungible":0.25,"token":0.25,"metadata":0.25},"68":{"build":0.2,"a":0.2,"custom":0.2,"blockchain":0.2,"api":0.2},"69":{"build":0.2,"a":0.2,"decentralized":0.2,"grants":0.2,"program":0.2},"70":{"ai":0.3333333333333333,"x":0.3333333333333333,"stacks":0.3333333333333333},"71":{"build":0.2,"a":0.2,"friend":0.2,"tech":0.2,"clone":0.2},"72":{"create":0.14285714285714285,"a":0.14285714285714285,"recipe":0.14285714285714285,"for":0.14285714285714285,"the":0.14285714285714285,"hiro":0.14285714285714285,"cookbook":0.14285714285714285},"73":{"overview":1},"74":{"overview":1},"75":{"build":0.25,"a":0.25,"stacks":0.25,"explorer":0.25},"76":{"bit":0.5,"manipulation":0.5},"77":{"basic":0.5,"arithmetic":0.5},"78":{"introduction":1},"79":{"map":0.5,"functions":0.5},"80":{"cryptographic":0.5,"functions":0.5},"81":{"access":0.5,"control":0.5},"82":{"list":1},"83":{"tuple":1},"84":{"sha256":1},"85":{"unwrap":1},"86":{"contract-call":1},"87":{"buff-to-int-be":1},"88":{"int-to-ascii":1},"89":{"map-delete":1},"90":{"contract-of":1},"91":{"keccak256":1},"92":{"define-constant":1},"93":{"xor":1},"94":{"principal-of":1},"95":{"get-burn-block-info":1},"96":{"fold":1},"97":{"define-map":1},"98":{"stx-account":1},"99":{"define-public":1},"100":{"define-data-var":1},"101":{"nft-transfer":1},"102":{"multiply":1},"103":{"default-to":1},"104":{"get-stacks-block-info":1},"105":{"map":1},"106":{"sqrti":1},"107":{"log2":1},"108":{"and":1},"109":{"replace-at":1},"110":{"len":1},"111":{"256":0.5,"sha512":0.5},"112":{"divide":1},"113":{"bit-and":1},"114":{"less":0.5,"than":0.5},"115":{"ft-burn":1},"116":{"get":1},"117":{"use-trait":1},"118":{"to-uint":1},"119":{"define-trait":1},"120":{"int-to-utf8":1},"121":{"ok":1},"122":{"define-non-fungible-token":1},"123":{"ft-transfer":1},"124":{"is-err":1},"125":{"ft-get-supply":1},"126":{"as-max-len":1},"127":{"get-tenure-info":1},"128":{"bit-xor":1},"129":{"define-private":1},"130":{"bit-or":1},"131":{"var-get":1},"132":{"map-set":1},"133":{"buff-to-uint-be":1},"134":{"define-read-only":1},"135":{"nft-burn":1},"136":{"is-ok":1},"137":{"add":1},"138":{"string-to-int":1},"139":{"is-none":1},"140":{"subtract":1},"141":{"principal-destruct":1},"142":{"to-consensus-buff":1},"143":{"stx-burn":1},"144":{"from-consensus-buff":1},"145":{"bit-shift-right":1},"146":{"is-some":1},"147":{"is-standard":1},"148":{"unwrap-err-panic":1},"149":{"append":1},"150":{"stx-transfer":1},"151":{"unwrap-panic":1},"152":{"impl-trait":1},"153":{"to-int":1},"154":{"greater":0.5,"than":0.5},"155":{"not":1},"156":{"get-block-info":1},"157":{"string-to-uint":1},"158":{"buff-to-uint-le":1},"159":{"unwrap-err":1},"160":{"define-fungible-token":1},"161":{"at-block":1},"162":{"secp256k1-recover":1},"163":{"begin":1},"164":{"err":1},"165":{"or":1},"166":{"try":1},"167":{"map-insert":1},"168":{"some":1},"169":{"secp256k1-verify":1},"170":{"match":1},"171":{"let":1},"172":{"map-get":1},"173":{"is-eq":1},"174":{"bit-shift-left":1},"175":{"var-set":1},"176":{"less":0.25,"than":0.25,"or":0.25,"equal":0.25},"177":{"filter":1},"178":{"ft-mint":1},"179":{"buff-to-int-le":1},"180":{"element-at":1},"181":{"sha512":1},"182":{"concat":1},"183":{"index-of":1},"184":{"stx-transfer-memo":1},"185":{"pow":1},"186":{"nft-mint":1},"187":{"bit-not":1},"188":{"hash160":1},"189":{"merge":1},"190":{"ft-get-balance":1},"191":{"greater":0.25,"than":0.25,"or":0.25,"equal":0.25},"192":{"as-contract":1},"193":{"asserts":1},"194":{"slice":1},"195":{"nft-get-owner":1},"196":{"if":1},"197":{"mod":1},"198":{"stx-get-balance":1},"199":{"print":1},"200":{"principal-construct":1},"201":{"optional":0.2,"values":0.2,"and":0.2,"error":0.2,"handling":0.2},"202":{"time-based":0.5,"logic":0.5},"203":{"web":0.3333333333333333,"app":0.3333333333333333,"development":0.3333333333333333},"204":{"token":0.5,"development":0.5},"205":{"blocks":1},"206":{"aggregated":0.16666666666666666,"signer":0.16666666666666666,"information":0.16666666666666666,"for":0.16666666666666666,"a":0.16666666666666666,"block":0.16666666666666666},"207":{"aggregated":0.14285714285714285,"signer":0.14285714285714285,"information":0.14285714285714285,"for":0.14285714285714285,"most":0.14285714285714285,"recent":0.14285714285714285,"blocks":0.14285714285714285},"208":{"overview":1},"209":{"info":1},"210":{"api":0.5,"status":0.5},"211":{"prometheus":0.5,"metrics":0.5},"212":{"prometheus":0.5,"metrics":0.5},"213":{"signers":1},"214":{"pox":0.3333333333333333,"cycle":0.3333333333333333,"signer":0.3333333333333333},"215":{"pox":0.3333333333333333,"cycle":0.3333333333333333,"signers":0.3333333333333333},"216":{"signer":0.2,"information":0.2,"for":0.2,"a":0.2,"block":0.2},"217":{"block":0.5,"proposals":0.5},"218":{"signer":0.14285714285714285,"information":0.14285714285714285,"for":0.14285714285714285,"most":0.14285714285714285,"recent":0.14285714285714285,"block":0.14285714285714285,"proposals":0.14285714285714285},"219":{"overview":1},"220":{"updates":0.25,"for":0.25,"stacks":0.25,"explorer":0.25},"221":{"updates":0.3333333333333333,"for":0.3333333333333333,"clarinet":0.3333333333333333},"222":{"updates":0.25,"for":0.25,"stacks":0.25,"api":0.25},"223":{"updates":0.25,"for":0.25,"stacks":0.25,"js":0.25},"224":{"unit":0.5,"testing":0.5},"225":{"smart":0.3333333333333333,"contract":0.3333333333333333,"development":0.3333333333333333},"226":{"stacks":0.5,"transactions":0.5},"227":{"stacks":0.5,"network":0.5},"228":{"overview":1},"229":{"announcing":0.25,"stacks":0.25,"js":0.25,"v7":0.25},"230":{"broadcast":0.5,"transactions":0.5},"231":{"deep":0.25,"dive":0.25,"into":0.25,"post-conditions":0.25},"232":{"using":0.16666666666666666,"stacks":0.16666666666666666,"js":0.16666666666666666,"with":0.16666666666666666,"react":0.16666666666666666,"native":0.16666666666666666},"233":{"sbtc":1},"234":{"stacks":0.5,"transactions":0.5},"235":{"stacks":0.5,"network":0.5},"236":{"stacks":0.5,"common":0.5},"237":{"transactions":1},"238":{"post-conditions":1},"239":{"private":0.3333333333333333,"keys":0.3333333333333333,"wallets":0.3333333333333333},"240":{"accounts":0.5,"addresses":0.5},"241":{"networks":1},"242":{"broadcasting":1},"243":{"quickstart":1},"244":{"installation":1},"245":{"integration":0.5,"testing":0.5},"246":{"migration":0.5,"guide":0.5},"247":{"api":0.5,"keys":0.5},"248":{"info":1},"249":{"get":0.5,"status":0.5},"250":{"tokens":1},"251":{"get":0.25,"fungible":0.25,"token":0.25,"metadata":0.25},"252":{"get":0.25,"semi-fungible":0.25,"token":0.25,"metadata":0.25},"253":{"get":0.3333333333333333,"fungible":0.3333333333333333,"tokens":0.3333333333333333},"254":{"get":0.25,"non-fungible":0.25,"token":0.25,"metadata":0.25},"255":{"pagination":1},"256":{"apis":1},"257":{"authentication":1},"258":{"nonce":0.5,"handling":0.5},"259":{"architecture":1},"260":{"get":0.5,"block":0.5},"261":{"get":0.3333333333333333,"recent":0.3333333333333333,"blocks":0.3333333333333333},"262":{"get":0.25,"block":0.25,"by":0.25,"hash":0.25},"263":{"blocks":1},"264":{"get":0.2,"blocks":0.2,"by":0.2,"burn":0.2,"block":0.2},"265":{"get":0.2,"block":0.2,"by":0.2,"burnchain":0.2,"height":0.2},"266":{"get":0.25,"average":0.25,"block":0.25,"times":0.25},"267":{"get":0.5,"blocks":0.5},"268":{"get":0.2,"block":0.2,"by":0.2,"burnchain":0.2,"hash":0.2},"269":{"get":0.25,"block":0.25,"by":0.25,"height":0.25},"270":{"get":0.3333333333333333,"all":0.3333333333333333,"names":0.3333333333333333},"271":{"get":0.3333333333333333,"name":0.3333333333333333,"subdomains":0.3333333333333333},"272":{"get":0.25,"name":0.25,"zone":0.25,"file":0.25},"273":{"names":1},"274":{"get":0.2,"names":0.2,"owned":0.2,"by":0.2,"address":0.2},"275":{"get":0.3333333333333333,"namespace":0.3333333333333333,"names":0.3333333333333333},"276":{"get":0.3333333333333333,"all":0.3333333333333333,"namespaces":0.3333333333333333},"277":{"get":0.3333333333333333,"name":0.3333333333333333,"details":0.3333333333333333},"278":{"get":0.25,"historical":0.25,"zone":0.25,"file":0.25},"279":{"get":0.3333333333333333,"fee":0.3333333333333333,"rate":0.3333333333333333},"280":{"fees":1},"281":{"get":0.2,"recent":0.2,"burnchain":0.2,"reward":0.2,"recipients":0.2},"282":{"stacking":0.5,"rewards":0.5},"283":{"get":0.125,"recent":0.125,"burnchain":0.125,"reward":0.125,"for":0.125,"the":0.125,"given":0.125,"recipient":0.125},"284":{"get":0.2,"recent":0.2,"reward":0.2,"slot":0.2,"holders":0.2},"285":{"get":0.16666666666666666,"recent":0.16666666666666666,"reward":0.16666666666666666,"slot":0.16666666666666666,"holder":0.16666666666666666,"entries":0.16666666666666666},"286":{"get":0.125,"total":0.125,"burnchain":0.125,"rewards":0.125,"for":0.125,"the":0.125,"given":0.125,"recipient":0.125},"287":{"get":0.3333333333333333,"pox":0.3333333333333333,"cycles":0.3333333333333333},"288":{"proof":0.3333333333333333,"of":0.3333333333333333,"transfer":0.3333333333333333},"289":{"get":0.2,"signer":0.2,"in":0.2,"pox":0.2,"cycle":0.2},"290":{"get":0.3333333333333333,"pox":0.3333333333333333,"cycle":0.3333333333333333},"291":{"get":0.2,"signers":0.2,"in":0.2,"pox":0.2,"cycle":0.2},"292":{"get":0.14285714285714285,"stackers":0.14285714285714285,"for":0.14285714285714285,"signer":0.14285714285714285,"in":0.14285714285714285,"pox":0.14285714285714285,"cycle":0.14285714285714285},"293":{"search":0.3333333333333333,"by":0.3333333333333333,"id":0.3333333333333333},"294":{"search":1},"295":{"get":0.16666666666666666,"total":0.16666666666666666,"and":0.16666666666666666,"unlocked":0.16666666666666666,"stx":0.16666666666666666,"supply":0.16666666666666666},"296":{"get":0.14285714285714285,"a":0.14285714285714285,"given":0.14285714285714285,"network's":0.14285714285714285,"target":0.14285714285714285,"block":0.14285714285714285,"time":0.14285714285714285},"297":{"get":0.125,"circulating":0.125,"stx":0.125,"supply":0.125,"in":0.125,"plain":0.125,"text":0.125,"format":0.125},"298":{"get":0.16666666666666666,"the":0.16666666666666666,"network":0.16666666666666666,"target":0.16666666666666666,"block":0.16666666666666666,"time":0.16666666666666666},"299":{"info":1},"300":{"get":0.125,"total":0.125,"stx":0.125,"supply":0.125,"in":0.125,"plain":0.125,"text":0.125,"format":0.125},"301":{"get":0.3333333333333333,"api":0.3333333333333333,"status":0.3333333333333333},"302":{"get":0.14285714285714285,"total":0.14285714285714285,"and":0.14285714285714285,"unlocked":0.14285714285714285,"stx":0.14285714285714285,"supply":0.14285714285714285,"legacy":0.14285714285714285},"303":{"get":0.3333333333333333,"address":0.3333333333333333,"transactions":0.3333333333333333},"304":{"get":0.16666666666666666,"events":0.16666666666666666,"for":0.16666666666666666,"an":0.16666666666666666,"address":0.16666666666666666,"transaction":0.16666666666666666},"305":{"get":0.3333333333333333,"transaction":0.3333333333333333,"events":0.3333333333333333},"306":{"get":0.2,"statistics":0.2,"for":0.2,"mempool":0.2,"transactions":0.2},"307":{"transactions":1},"308":{"get":0.25,"transactions":0.25,"for":0.25,"address":0.25},"309":{"get":0.25,"dropped":0.25,"mempool":0.25,"transactions":0.25},"310":{"get":0.5,"transaction":0.5},"311":{"get":0.25,"details":0.25,"for":0.25,"transactions":0.25},"312":{"get":0.3333333333333333,"recent":0.3333333333333333,"transactions":0.3333333333333333},"313":{"get":0.3333333333333333,"mempool":0.3333333333333333,"transactions":0.3333333333333333},"314":{"get":0.25,"transactions":0.25,"by":0.25,"block":0.25},"315":{"get":0.3333333333333333,"raw":0.3333333333333333,"transaction":0.3333333333333333},"316":{"get":0.25,"stacking":0.25,"pool":0.25,"members":0.25},"317":{"stacking":0.5,"pool":0.5},"318":{"faucets":1},"319":{"stx":0.3333333333333333,"testnet":0.3333333333333333,"tokens":0.3333333333333333},"320":{"get":0.2,"account":0.2,"transactions":0.2,"with":0.2,"transfers":0.2},"321":{"get":0.3333333333333333,"user":0.3333333333333333,"balances":0.3333333333333333},"322":{"get":0.3333333333333333,"account":0.3333333333333333,"transactions":0.3333333333333333},"323":{"get":0.3333333333333333,"nft":0.3333333333333333,"events":0.3333333333333333},"324":{"get":0.3333333333333333,"account":0.3333333333333333,"assets":0.3333333333333333},"325":{"get":0.2,"account":0.2,"transaction":0.2,"with":0.2,"transfers":0.2},"326":{"get":0.25,"the":0.25,"latest":0.25,"nonce":0.25},"327":{"get":0.25,"account":0.25,"stx":0.25,"balance":0.25},"328":{"get":0.25,"inbound":0.25,"stx":0.25,"transfers":0.25},"329":{"get":0.3333333333333333,"contract":0.3333333333333333,"events":0.3333333333333333},"330":{"get":0.25,"contracts":0.25,"by":0.25,"trait":0.25},"331":{"smart":0.5,"contracts":0.5},"332":{"get":0.3333333333333333,"contract":0.3333333333333333,"info":0.3333333333333333},"333":{"get":0.3333333333333333,"contracts":0.3333333333333333,"status":0.3333333333333333},"334":{"mempool":1},"335":{"get":0.25,"transaction":0.25,"fee":0.25,"priorities":0.25},"336":{"get":0.3333333333333333,"burn":0.3333333333333333,"block":0.3333333333333333},"337":{"burn":0.5,"blocks":0.5},"338":{"get":0.3333333333333333,"burn":0.3333333333333333,"blocks":0.3333333333333333},"339":{"tokens":1},"340":{"get":0.25,"fungible":0.25,"token":0.25,"holders":0.25},"341":{"non-fungible":0.5,"tokens":0.5},"342":{"get":0.25,"non-fungible":0.25,"token":0.25,"holdings":0.25},"343":{"get":0.25,"non-fungible":0.25,"token":0.25,"mints":0.25},"344":{"get":0.25,"non-fungible":0.25,"token":0.25,"history":0.25},"345":{"getting":0.5,"started":0.5},"346":{"requesting":0.5,"proofs":0.5},"347":{"developer":0.3333333333333333,"environment":0.3333333333333333,"setup":0.3333333333333333},"348":{"testing":0.5,"environments":0.5},"349":{"blockchain":0.5,"development":0.5},"350":{"overview":1},"351":{"wallet":0.5,"support":0.5},"352":{"authenticate":0.5,"users":0.5},"353":{"broadcast":0.5,"transactions":0.5},"354":{"sign":0.5,"messages":0.5},"355":{"migration":0.5,"guide":0.5},"356":{"stacks":0.5,"connect":0.5},"357":{"quickstart":1},"358":{"simnet":1},"359":{"properties":1},"360":{"custom":0.5,"matchers":0.5},"361":{"methods":1},"362":{"hirosystems":0.5,"clarinet-sdk":0.5},"363":{"clarinet":0.5,"cli":0.5},"364":{"stacks":0.3333333333333333,"js":0.3333333333333333,"cli":0.3333333333333333},"365":{"stacks":0.5,"blockchain-api-client":0.5},"366":{"stacks":0.5,"connect":0.5},"367":{"sbtc":1},"368":{"stacks":0.5,"transactions":0.5},"369":{"stacks":0.5,"network":0.5},"370":{"stacks":0.5,"common":0.5},"371":{"bitcoin":0.5,"scopes":0.5},"372":{"stacks":0.5,"scopes":0.5},"373":{"overview":1},"374":{"run":0.125,"chainhook":0.125,"as":0.125,"a":0.125,"service":0.125,"with":0.125,"stacks":0.125,"node":0.125},"375":{"register":0.25,"chainhooks":0.25,"on":0.25,"devnet":0.25},"376":{"run":0.2,"chainhook":0.2,"as":0.2,"a":0.2,"service":0.2},"377":{"observing":0.2,"contract":0.2,"calls":0.2,"with":0.2,"chainhook":0.2},"378":{"quickstart":1},"379":{"predicate":0.5,"design":0.5},"380":{"installation":1},"381":{"quickstarts":1},"382":{"event":0.5,"streaming":0.5},"383":{"wallet":0.5,"integration":0.5},"384":{"app":0.5,"templates":0.5},"385":{"nft":0.5,"minting":0.5},"386":{"contract":0.5,"templates":0.5},"387":{"token":0.5,"transfers":0.5},"388":{"blocks":1},"389":{"validate":0.3333333333333333,"proposed":0.3333333333333333,"block":0.3333333333333333},"390":{"proof":0.3333333333333333,"of":0.3333333333333333,"transfer":0.3333333333333333},"391":{"get":0.16666666666666666,"stacker":0.16666666666666666,"and":0.16666666666666666,"signer":0.16666666666666666,"set":0.16666666666666666,"information":0.16666666666666666},"392":{"get":0.3333333333333333,"proof-of-transfer":0.3333333333333333,"details":0.3333333333333333},"393":{"get":0.3333333333333333,"namespace":0.3333333333333333,"price":0.3333333333333333},"394":{"names":1},"395":{"get":0.3333333333333333,"name":0.3333333333333333,"price":0.3333333333333333},"396":{"get":0.14285714285714285,"approximate":0.14285714285714285,"fees":0.14285714285714285,"for":0.14285714285714285,"the":0.14285714285714285,"given":0.14285714285714285,"transaction":0.14285714285714285},"397":{"fees":1},"398":{"get":0.25,"transfer":0.25,"fee":0.25,"estimate":0.25},"399":{"overview":1},"400":{"info":1},"401":{"get":0.25,"core":0.25,"api":0.25,"info":0.25},"402":{"broadcast":0.5,"transaction":0.5},"403":{"transactions":1},"404":{"accounts":1},"405":{"get":0.3333333333333333,"account":0.3333333333333333,"info":0.3333333333333333},"406":{"v3":1},"407":{"get":0.25,"nakamoto":0.25,"tenure":0.25,"metadata":0.25},"408":{"get":0.3333333333333333,"nakamoto":0.3333333333333333,"block":0.3333333333333333},"409":{"get":0.25,"nakamoto":0.25,"tenure":0.25,"blocks":0.25},"410":{"get":0.3333333333333333,"contract":0.3333333333333333,"interface":0.3333333333333333},"411":{"get":0.25,"trait":0.25,"implementation":0.25,"details":0.25},"412":{"smart":0.5,"contracts":0.5},"413":{"get":0.25,"contract":0.25,"map":0.25,"entry":0.25},"414":{"call":0.3333333333333333,"read-only":0.3333333333333333,"function":0.3333333333333333},"415":{"get":0.3333333333333333,"contract":0.3333333333333333,"source":0.3333333333333333},"416":{"get":0.3333333333333333,"constant":0.3333333333333333,"value":0.3333333333333333},"417":{"burn":0.5,"operations":0.5},"418":{"get":0.3333333333333333,"burn":0.3333333333333333,"operations":0.3333333333333333},"419":{"contributors":0.5,"guide":0.5},"420":{"get":0.5,"started":0.5},"421":{"rate":0.5,"limiting":0.5},"422":{"overview":1},"423":{"quickstart":1},"424":{"installation":1},"425":{"overview":1},"426":{"build":0.3333333333333333,"ordinals":0.3333333333333333,"explorer":0.3333333333333333},"427":{"overview":1},"428":{"status":1},"429":{"get":0.3333333333333333,"api":0.3333333333333333,"status":0.3333333333333333},"430":{"get":0.3333333333333333,"address":0.3333333333333333,"balances":0.3333333333333333},"431":{"balances":1},"432":{"get":0.3333333333333333,"holder":0.3333333333333333,"balance":0.3333333333333333},"433":{"get":0.3333333333333333,"rune":0.3333333333333333,"holders":0.3333333333333333},"434":{"activities":1},"435":{"get":0.2,"activity":0.2,"for":0.2,"a":0.2,"transaction":0.2},"436":{"get":0.2,"activity":0.2,"for":0.2,"an":0.2,"address":0.2},"437":{"get":0.2,"activity":0.2,"for":0.2,"a":0.2,"block":0.2},"438":{"get":0.3333333333333333,"all":0.3333333333333333,"activity":0.3333333333333333},"439":{"usage":1},"440":{"etchings":1},"441":{"get":0.5,"etchings":0.5},"442":{"get":0.5,"etching":0.5},"443":{"overview":1},"444":{"build":0.3333333333333333,"ordinals":0.3333333333333333,"explorer":0.3333333333333333},"445":{"statistics":1},"446":{"get":0.2,"inscription":0.2,"count":0.2,"per":0.2,"block":0.2},"447":{"get":0.25,"brc-20":0.25,"token":0.25,"holders":0.25},"448":{"brc-20":1},"449":{"get":0.3333333333333333,"brc-20":0.3333333333333333,"balances":0.3333333333333333},"450":{"get":0.25,"brc-20":0.25,"token":0.25,"details":0.25},"451":{"get":0.3333333333333333,"brc-20":0.3333333333333333,"tokens":0.3333333333333333},"452":{"get":0.3333333333333333,"brc-20":0.3333333333333333,"activity":0.3333333333333333},"453":{"inscriptions":1},"454":{"get":0.3333333333333333,"inscription":0.3333333333333333,"transfers":0.3333333333333333},"455":{"get":0.5,"inscriptions":0.5},"456":{"get":0.3333333333333333,"inscription":0.3333333333333333,"content":0.3333333333333333},"457":{"get":0.25,"transfers":0.25,"per":0.25,"block":0.25},"458":{"get":0.5,"inscription":0.5},"459":{"overview":1},"460":{"status":1},"461":{"get":0.3333333333333333,"api":0.3333333333333333,"status":0.3333333333333333},"462":{"usage":1},"463":{"satoshis":1},"464":{"get":0.3333333333333333,"satoshi":0.3333333333333333,"ordinal":0.3333333333333333},"465":{"get":0.3333333333333333,"satoshi":0.3333333333333333,"inscriptions":0.3333333333333333},"466":{"home":1},"467":{"api":0.5,"keys":0.5},"468":{"status":1},"469":{"get":0.3333333333333333,"api":0.3333333333333333,"status":0.3333333333333333},"470":{"get":0.3333333333333333,"address":0.3333333333333333,"balances":0.3333333333333333},"471":{"balances":1},"472":{"get":0.3333333333333333,"holder":0.3333333333333333,"balance":0.3333333333333333},"473":{"get":0.3333333333333333,"rune":0.3333333333333333,"holders":0.3333333333333333},"474":{"activities":1},"475":{"get":0.2,"activity":0.2,"for":0.2,"a":0.2,"transaction":0.2},"476":{"get":0.2,"activity":0.2,"for":0.2,"an":0.2,"address":0.2},"477":{"get":0.2,"activity":0.2,"for":0.2,"a":0.2,"block":0.2},"478":{"get":0.3333333333333333,"all":0.3333333333333333,"activity":0.3333333333333333},"479":{"etchings":1},"480":{"get":0.5,"etchings":0.5},"481":{"get":0.5,"etching":0.5},"482":{"statistics":1},"483":{"get":0.2,"inscription":0.2,"count":0.2,"per":0.2,"block":0.2},"484":{"get":0.25,"brc-20":0.25,"token":0.25,"holders":0.25},"485":{"brc-20":1},"486":{"get":0.3333333333333333,"brc-20":0.3333333333333333,"balances":0.3333333333333333},"487":{"get":0.25,"brc-20":0.25,"token":0.25,"details":0.25},"488":{"get":0.3333333333333333,"brc-20":0.3333333333333333,"tokens":0.3333333333333333},"489":{"get":0.3333333333333333,"brc-20":0.3333333333333333,"activity":0.3333333333333333},"490":{"inscriptions":1},"491":{"get":0.3333333333333333,"inscription":0.3333333333333333,"transfers":0.3333333333333333},"492":{"get":0.5,"inscriptions":0.5},"493":{"get":0.3333333333333333,"inscription":0.3333333333333333,"content":0.3333333333333333},"494":{"get":0.25,"transfers":0.25,"per":0.25,"block":0.25},"495":{"get":0.5,"inscription":0.5},"496":{"status":1},"497":{"get":0.3333333333333333,"api":0.3333333333333333,"status":0.3333333333333333},"498":{"satoshis":1},"499":{"get":0.3333333333333333,"satoshi":0.3333333333333333,"ordinal":0.3333333333333333},"500":{"get":0.3333333333333333,"satoshi":0.3333333333333333,"inscriptions":0.3333333333333333},"501":{"apis":1},"502":{"overview":1},"503":{"tbd":1},"504":{"quickstart":1},"505":{"quickstarts":1},"506":{"contributors":0.5,"guide":0.5},"507":{"rate":0.5,"limiting":0.5},"508":{"home":1},"509":{"how":0.16666666666666666,"to":0.16666666666666666,"sync":0.16666666666666666,"a":0.16666666666666666,"stacks":0.16666666666666666,"node":0.16666666666666666},"510":{"how":0.25,"to":0.25,"install":0.25,"docker":0.25},"511":{"build":0.25,"a":0.25,"decentralized":0.25,"kickstarter":0.25},"512":{"api":0.5,"keys":0.5},"513":{"build":0.25,"an":0.25,"nft":0.25,"marketplace":0.25},"514":{"using":0.3333333333333333,"clarity":0.3333333333333333,"values":0.3333333333333333},"515":{"how":0.16666666666666666,"to":0.16666666666666666,"sync":0.16666666666666666,"a":0.16666666666666666,"bitcoin":0.16666666666666666,"node":0.16666666666666666},"516":{"build":0.2,"a":0.2,"no-loss":0.2,"lottery":0.2,"pool":0.2},"517":{"docskit":1}},"description":{"1":{"learn":0.125,"how":0.125,"to":0.125,"contribute":0.125,"hiro's":0.125,"documentation":0.125,"and":0.125,"content":0.125},"2":{"get":0.16666666666666666,"started":0.16666666666666666,"with":0.16666666666666666,"the":0.16666666666666666,"stacks":0.16666666666666666,"ecosystem":0.16666666666666666},"3":{"understand":0.1,"the":0.1,"rate":0.1,"limits":0.1,"for":0.1,"hiro":0.1,"apis":0.1,"and":0.1,"stx":0.1,"faucet":0.1},"4":{"the":0.05263157894736842,"simnet":0.05263157894736842,"class":0.05263157894736842,"is":0.05263157894736842,"main":0.05263157894736842,"entry":0.05263157894736842,"point":0.05263157894736842,"for":0.05263157894736842,"clarinet":0.05263157894736842,"js":0.05263157894736842,"sdk":0.05263157894736842,"it":0.05263157894736842,"provides":0.05263157894736842,"properties":0.05263157894736842,"and":0.05263157894736842,"methods":0.05263157894736842,"interacting":0.05263157894736842,"with":0.05263157894736842,"network":0.05263157894736842},"5":{"the":0.07142857142857142,"clarinet":0.07142857142857142,"js":0.07142857142857142,"sdk":0.07142857142857142,"provides":0.07142857142857142,"properties":0.07142857142857142,"that":0.07142857142857142,"can":0.07142857142857142,"be":0.07142857142857142,"used":0.07142857142857142,"to":0.07142857142857142,"interact":0.07142857142857142,"with":0.07142857142857142,"simnet":0.07142857142857142},"6":{"a":0.05,"set":0.05,"of":0.05,"vitest":0.05,"matchers":0.05,"that":0.05,"can":0.05,"be":0.05,"used":0.05,"to":0.05,"make":0.05,"assertions":0.05,"on":0.05,"clarity":0.05,"values":0.05,"with":0.05,"the":0.05,"clarinet":0.05,"js":0.05,"sdk":0.05},"7":{"the":0.06666666666666667,"clarinet":0.06666666666666667,"js":0.06666666666666667,"sdk":0.06666666666666667,"provides":0.06666666666666667,"several":0.06666666666666667,"methods":0.06666666666666667,"that":0.06666666666666667,"can":0.06666666666666667,"be":0.06666666666666667,"used":0.06666666666666667,"to":0.06666666666666667,"interact":0.06666666666666667,"with":0.06666666666666667,"simnet":0.06666666666666667},"8":{"the":0.058823529411764705,"clarinet":0.058823529411764705,"js":0.058823529411764705,"sdk":0.058823529411764705,"is":0.058823529411764705,"a":0.058823529411764705,"javascript":0.058823529411764705,"library":0.058823529411764705,"used":0.058823529411764705,"to":0.058823529411764705,"write":0.058823529411764705,"unit":0.058823529411764705,"tests":0.058823529411764705,"for":0.058823529411764705,"clarity":0.058823529411764705,"smart":0.058823529411764705,"contracts":0.058823529411764705},"9":{"learn":0.07692307692307693,"how":0.07692307692307693,"to":0.07692307692307693,"test":0.07692307692307693,"a":0.07692307692307693,"simple":0.07692307692307693,"counter":0.07692307692307693,"contract":0.07692307692307693,"using":0.07692307692307693,"the":0.07692307692307693,"clarinet":0.07692307692307693,"js":0.07692307692307693,"sdk":0.07692307692307693},"10":{"clarinet":0.09090909090909091,"js":0.09090909090909091,"sdk":0.09090909090909091,"can":0.09090909090909091,"be":0.09090909090909091,"installed":0.09090909090909091,"using":0.09090909090909091,"your":0.09090909090909091,"preferred":0.09090909090909091,"package":0.09090909090909091,"manager":0.09090909090909091},"11":{"the":0.07692307692307693,"following":0.07692307692307693,"guides":0.07692307692307693,"cover":0.07692307692307693,"ways":0.07692307692307693,"to":0.07692307692307693,"use":0.07692307692307693,"hiro":0.07692307692307693,"tools":0.07692307692307693,"build":0.07692307692307693,"apps":0.07692307692307693,"on":0.07692307692307693,"stacks":0.07692307692307693},"12":{"learn":0.05555555555555555,"best":0.05555555555555555,"practices":0.05555555555555555,"for":0.05555555555555555,"writing":0.05555555555555555,"and":0.05555555555555555,"running":0.05555555555555555,"tests":0.05555555555555555,"your":0.05555555555555555,"clarity":0.05555555555555555,"smart":0.05555555555555555,"contracts":0.05555555555555555,"using":0.05555555555555555,"the":0.05555555555555555,"clarinet":0.05555555555555555,"js":0.05555555555555555,"sdk":0.05555555555555555,"vitest":0.05555555555555555},"13":{"the":0.07142857142857142,"hiro":0.07142857142857142,"archive":0.07142857142857142,"is":0.07142857142857142,"a":0.07142857142857142,"series":0.07142857142857142,"of":0.07142857142857142,"data":0.07142857142857142,"snapshots":0.07142857142857142,"for":0.07142857142857142,"services":0.07142857142857142,"in":0.07142857142857142,"stacks":0.07142857142857142,"ecosystem":0.07142857142857142},"14":{"discover":0.07692307692307693,"how":0.07692307692307693,"to":0.07692307692307693,"use":0.07692307692307693,"the":0.07692307692307693,"hiro":0.07692307692307693,"archive":0.07692307692307693,"spin":0.07692307692307693,"up":0.07692307692307693,"a":0.07692307692307693,"stacks":0.07692307692307693,"blockchain":0.07692307692307693,"api":0.07692307692307693},"15":{"discover":0.07692307692307693,"how":0.07692307692307693,"to":0.07692307692307693,"use":0.07692307692307693,"the":0.07692307692307693,"hiro":0.07692307692307693,"archive":0.07692307692307693,"spin":0.07692307692307693,"up":0.07692307692307693,"a":0.07692307692307693,"token":0.07692307692307693,"metadata":0.07692307692307693,"api":0.07692307692307693},"16":{"verify":0.1111111111111111,"the":0.1111111111111111,"integrity":0.1111111111111111,"of":0.1111111111111111,"data":0.1111111111111111,"in":0.1111111111111111,"a":0.1111111111111111,"particular":0.1111111111111111,"snapshot":0.1111111111111111},"17":{"discover":0.08333333333333333,"how":0.08333333333333333,"to":0.08333333333333333,"use":0.08333333333333333,"the":0.08333333333333333,"hiro":0.08333333333333333,"archive":0.08333333333333333,"spin":0.08333333333333333,"up":0.08333333333333333,"a":0.08333333333333333,"stacks":0.08333333333333333,"node":0.08333333333333333},"18":{"clarinet":0.05,"is":0.05,"a":0.05,"local":0.05,"development":0.05,"environment":0.05,"that":0.05,"offers":0.05,"everything":0.05,"you":0.05,"need":0.05,"to":0.05,"create":0.05,"test":0.05,"and":0.05,"deploy":0.05,"smart":0.05,"contracts":0.05,"on":0.05,"stacks":0.05},"19":{"learn":0.16666666666666666,"about":0.16666666666666666,"the":0.16666666666666666,"concepts":0.16666666666666666,"behind":0.16666666666666666,"clarinet":0.16666666666666666},"20":{"clarinet":0.08333333333333333,"can":0.08333333333333333,"handle":0.08333333333333333,"adding":0.08333333333333333,"and":0.08333333333333333,"configuring":0.08333333333333333,"a":0.08333333333333333,"new":0.08333333333333333,"contract":0.08333333333333333,"to":0.08333333333333333,"your":0.08333333333333333,"project":0.08333333333333333},"21":{"clarinet":0.08333333333333333,"provides":0.08333333333333333,"syntax":0.08333333333333333,"and":0.08333333333333333,"semantics":0.08333333333333333,"checkers":0.08333333333333333,"for":0.08333333333333333,"the":0.08333333333333333,"smart":0.08333333333333333,"contract":0.08333333333333333,"language":0.08333333333333333,"clarity":0.08333333333333333},"22":{"analyze":0.14285714285714285,"execution":0.14285714285714285,"costs":0.14285714285714285,"pertaining":0.14285714285714285,"to":0.14285714285714285,"your":0.14285714285714285,"contract":0.14285714285714285},"23":{"launch":0.14285714285714285,"the":0.14285714285714285,"clarinet":0.14285714285714285,"console":0.14285714285714285,"for":0.14285714285714285,"interactive":0.14285714285714285,"development":0.14285714285714285},"24":{"integrate":0.125,"your":0.125,"contracts":0.125,"with":0.125,"a":0.125,"local":0.125,"development":0.125,"environment":0.125},"25":{"use":0.08333333333333333,"clarinet":0.08333333333333333,"to":0.08333333333333333,"publish":0.08333333333333333,"your":0.08333333333333333,"contracts":0.08333333333333333,"the":0.08333333333333333,"devnet":0.08333333333333333,"testnet":0.08333333333333333,"or":0.08333333333333333,"mainnet":0.08333333333333333,"networks":0.08333333333333333},"26":{"step":0.1,"through":0.1,"and":0.1,"debug":0.1,"your":0.1,"contracts":0.1,"inside":0.1,"the":0.1,"command":0.1,"line":0.1},"27":{"learn":0.16666666666666666,"how":0.16666666666666666,"to":0.16666666666666666,"create":0.16666666666666666,"deployment":0.16666666666666666,"plans":0.16666666666666666},"28":{"clarinet":0.09090909090909091,"helps":0.09090909090909091,"with":0.09090909090909091,"building":0.09090909090909091,"testing":0.09090909090909091,"and":0.09090909090909091,"deploying":0.09090909090909091,"contracts":0.09090909090909091,"that":0.09090909090909091,"use":0.09090909090909091,"sbtc":0.09090909090909091},"29":{"once":0.09090909090909091,"you":0.09090909090909091,"install":0.09090909090909091,"clarinet":0.09090909090909091,"can":0.09090909090909091,"use":0.09090909090909091,"to":0.09090909090909091,"create":0.09090909090909091,"a":0.09090909090909091,"new":0.09090909090909091,"project":0.09090909090909091},"30":{"learn":0.1,"how":0.1,"to":0.1,"create":0.1,"a":0.1,"simple":0.1,"counter":0.1,"contract":0.1,"using":0.1,"clarinet":0.1},"31":{"leverage":0.07142857142857142,"programmatic":0.07142857142857142,"api":0.07142857142857142,"access":0.07142857142857142,"in":0.07142857142857142,"order":0.07142857142857142,"to":0.07142857142857142,"seamlessly":0.07142857142857142,"interact":0.07142857142857142,"with":0.07142857142857142,"devnet":0.07142857142857142,"and":0.07142857142857142,"manage":0.07142857142857142,"chainhooks":0.07142857142857142},"32":{"proxy":0.1,"for":0.1,"the":0.1,"bitcoin":0.1,"node":0.1,"on":0.1,"a":0.1,"development":0.1,"network":0.1,"devnet":0.1},"33":{"retrieves":0.0625,"information":0.0625,"about":0.0625,"the":0.0625,"platform":0.0625,"devnet":0.0625,"services":0.0625,"such":0.0625,"as":0.0625,"stacks":0.0625,"blockchain":0.0625,"api":0.0625,"bitcoin":0.0625,"node":0.0625,"and":0.0625,"more":0.0625},"34":{"stop":0.2,"a":0.2,"development":0.2,"network":0.2,"devnet":0.2},"35":{"start":0.2,"a":0.2,"development":0.2,"network":0.2,"devnet":0.2},"36":{"proxy":0.09090909090909091,"for":0.09090909090909091,"the":0.09090909090909091,"stacks":0.09090909090909091,"blockchain":0.09090909090909091,"api":0.09090909090909091,"on":0.09090909090909091,"a":0.09090909090909091,"development":0.09090909090909091,"network":0.09090909090909091,"devnet":0.09090909090909091},"37":{"get":0.1111111111111111,"all":0.1111111111111111,"of":0.1111111111111111,"your":0.1111111111111111,"chainhooks":0.1111111111111111,"through":0.1111111111111111,"the":0.1111111111111111,"hiro":0.1111111111111111,"platform":0.1111111111111111},"38":{"create":0.14285714285714285,"a":0.14285714285714285,"chainhook":0.14285714285714285,"through":0.14285714285714285,"the":0.14285714285714285,"hiro":0.14285714285714285,"platform":0.14285714285714285},"39":{"get":0.125,"a":0.125,"specific":0.125,"chainhook":0.125,"through":0.125,"the":0.125,"hiro":0.125,"platform":0.125},"40":{"retrieves":0.14285714285714285,"information":0.14285714285714285,"about":0.14285714285714285,"the":0.14285714285714285,"platform":0.14285714285714285,"chainhooks":0.14285714285714285,"api":0.14285714285714285},"41":{"update":0.14285714285714285,"a":0.14285714285714285,"chainhook":0.14285714285714285,"through":0.14285714285714285,"the":0.14285714285714285,"hiro":0.14285714285714285,"platform":0.14285714285714285},"42":{"delete":0.14285714285714285,"a":0.14285714285714285,"chainhook":0.14285714285714285,"through":0.14285714285714285,"the":0.14285714285714285,"hiro":0.14285714285714285,"platform":0.14285714285714285},"43":{"retrieve":0.1,"the":0.1,"status":0.1,"of":0.1,"a":0.1,"specific":0.1,"chainhook":0.1,"through":0.1,"hiro":0.1,"platform":0.1},"44":{},"45":{"a":0.1,"developer":0.1,"platform":0.1,"for":0.1,"building":0.1,"deploying":0.1,"and":0.1,"scaling":0.1,"bitcoin":0.1,"apps":0.1},"46":{"learn":0.1111111111111111,"how":0.1111111111111111,"to":0.1111111111111111,"deploy":0.1111111111111111,"contracts":0.1111111111111111,"in":0.1111111111111111,"the":0.1111111111111111,"hiro":0.1111111111111111,"platform":0.1111111111111111},"47":{"learn":0.08333333333333333,"how":0.08333333333333333,"to":0.08333333333333333,"create":0.08333333333333333,"or":0.08333333333333333,"import":0.08333333333333333,"a":0.08333333333333333,"project":0.08333333333333333,"in":0.08333333333333333,"the":0.08333333333333333,"hiro":0.08333333333333333,"platform":0.08333333333333333},"48":{"discover":0.1,"how":0.1,"to":0.1,"archive":0.1,"your":0.1,"projects":0.1,"in":0.1,"the":0.1,"hiro":0.1,"platform":0.1},"49":{"easily":0.08333333333333333,"request":0.08333333333333333,"testnet":0.08333333333333333,"stx":0.08333333333333333,"so":0.08333333333333333,"you":0.08333333333333333,"can":0.08333333333333333,"deploy":0.08333333333333333,"and":0.08333333333333333,"interact":0.08333333333333333,"with":0.08333333333333333,"stacks":0.08333333333333333},"50":{"test":0.1,"and":0.1,"validate":0.1,"your":0.1,"code":0.1,"using":0.1,"devnet's":0.1,"private":0.1,"blockchain":0.1,"environment":0.1},"51":{"learn":0.07692307692307693,"how":0.07692307692307693,"to":0.07692307692307693,"monitor":0.07692307692307693,"your":0.07692307692307693,"contract":0.07692307692307693,"with":0.07692307692307693,"custom":0.07692307692307693,"alerts":0.07692307692307693,"after":0.07692307692307693,"you":0.07692307692307693,"deploy":0.07692307692307693,"mainnet":0.07692307692307693},"52":{"create":0.14285714285714285,"a":0.14285714285714285,"chainhook":0.14285714285714285,"using":0.14285714285714285,"the":0.14285714285714285,"hiro":0.14285714285714285,"platform":0.14285714285714285},"53":{"create":0.1,"and":0.1,"deploy":0.1,"your":0.1,"first":0.1,"app":0.1,"in":0.1,"the":0.1,"hiro":0.1,"platform":0.1},"54":{"fetch":0.09090909090909091,"data":0.09090909090909091,"for":0.09090909090909091,"any":0.09090909090909091,"fungible":0.09090909090909091,"non-fungible":0.09090909090909091,"and":0.09090909090909091,"semi-fungible":0.09090909090909091,"token":0.09090909090909091,"on":0.09090909090909091,"stacks":0.09090909090909091},"55":{"understand":0.14285714285714285,"the":0.14285714285714285,"architecture":0.14285714285714285,"of":0.14285714285714285,"token":0.14285714285714285,"metadata":0.14285714285714285,"api":0.14285714285714285},"56":{"retrieves":0.1,"information":0.1,"about":0.1,"the":0.1,"token":0.1,"metadata":0.1,"api":0.1,"including":0.1,"server":0.1,"version":0.1},"57":{"retrieves":0.1,"information":0.1,"about":0.1,"the":0.1,"token":0.1,"metadata":0.1,"api":0.1,"including":0.1,"server":0.1,"version":0.1},"58":{"go":0.09090909090909091,"over":0.09090909090909091,"the":0.09090909090909091,"multiple":0.09090909090909091,"ways":0.09090909090909091,"to":0.09090909090909091,"make":0.09090909090909091,"requests":0.09090909090909091,"token":0.09090909090909091,"metadata":0.09090909090909091,"api":0.09090909090909091},"59":{"retrieves":0.125,"information":0.125,"about":0.125,"tokens":0.125,"on":0.125,"the":0.125,"stacks":0.125,"blockchain":0.125},"60":{"retrieves":0.14285714285714285,"metadata":0.14285714285714285,"for":0.14285714285714285,"a":0.14285714285714285,"sip-010":0.14285714285714285,"fungible":0.14285714285714285,"token":0.14285714285714285},"61":{"retrieves":0.2,"information":0.2,"about":0.2,"semi-fungible":0.2,"tokens":0.2},"62":{"retrieves":0.2,"information":0.2,"about":0.2,"fungible":0.2,"tokens":0.2},"63":{"retrieves":0.14285714285714285,"metadata":0.14285714285714285,"for":0.14285714285714285,"a":0.14285714285714285,"sip-009":0.14285714285714285,"non-fungible":0.14285714285714285,"token":0.14285714285714285},"64":{"interact":0.1,"with":0.1,"the":0.1,"stacks":0.1,"blockchain":0.1,"using":0.1,"a":0.1,"javascript":0.1,"client":0.1,"library":0.1},"65":{"2":0.1111111111111111,"create":0.1111111111111111,"your":0.1111111111111111,"first":0.1111111111111111,"project":0.1111111111111111,"in":0.1111111111111111,"less":0.1111111111111111,"than":0.1111111111111111,"minutes":0.1111111111111111},"66":{"manage":0.125,"token":0.125,"metadata":0.125,"including":0.125,"ids":0.125,"uris":0.125,"and":0.125,"traits":0.125},"67":{"retrieves":0.07142857142857142,"a":0.07142857142857142,"list":0.07142857142857142,"of":0.07142857142857142,"all":0.07142857142857142,"assets":0.07142857142857142,"events":0.07142857142857142,"associated":0.07142857142857142,"with":0.07142857142857142,"an":0.07142857142857142,"account":0.07142857142857142,"or":0.07142857142857142,"contract":0.07142857142857142,"identifier":0.07142857142857142},"68":{"learn":0.1111111111111111,"how":0.1111111111111111,"to":0.1111111111111111,"build":0.1111111111111111,"a":0.1111111111111111,"custom":0.1111111111111111,"api":0.1111111111111111,"with":0.1111111111111111,"chainhook":0.1111111111111111},"69":{"learn":0.07692307692307693,"how":0.07692307692307693,"to":0.07692307692307693,"build":0.07692307692307693,"a":0.07692307692307693,"decentralized":0.07692307692307693,"grants":0.07692307692307693,"program":0.07692307692307693,"with":0.07692307692307693,"governance":0.07692307692307693,"submissions":0.07692307692307693,"and":0.07692307692307693,"voting":0.07692307692307693},"70":{"build":0.125,"something":0.125,"that":0.125,"combines":0.125,"ai":0.125,"capabilities":0.125,"with":0.125,"stacks":0.125},"71":{"learn":0.125,"how":0.125,"to":0.125,"build":0.125,"a":0.125,"decentralized":0.125,"social":0.125,"network":0.125},"72":{"create":0.07692307692307693,"your":0.07692307692307693,"own":0.07692307692307693,"recipe":0.07692307692307693,"for":0.07692307692307693,"the":0.07692307692307693,"hiro":0.07692307692307693,"cookbook":0.07692307692307693,"and":0.07692307692307693,"share":0.07692307692307693,"it":0.07692307692307693,"with":0.07692307692307693,"community":0.07692307692307693},"73":{"a":0.1111111111111111,"series":0.1111111111111111,"of":0.1111111111111111,"coding":0.1111111111111111,"challenges":0.1111111111111111,"to":0.1111111111111111,"sharpen":0.1111111111111111,"your":0.1111111111111111,"skills":0.1111111111111111},"74":{"explore":0.125,"and":0.125,"verify":0.125,"data":0.125,"on":0.125,"the":0.125,"stacks":0.125,"blockchain":0.125},"75":{"run":0.125,"a":0.125,"local":0.125,"instance":0.125,"of":0.125,"the":0.125,"stacks":0.125,"explorer":0.125},"76":{"using":0.07692307692307693,"bit":0.07692307692307693,"manipulation":0.07692307692307693,"for":0.07692307692307693,"compact":0.07692307692307693,"data":0.07692307692307693,"storage":0.07692307692307693,"and":0.07692307692307693,"flags":0.07692307692307693,"in":0.07692307692307693,"clarity":0.07692307692307693,"smart":0.07692307692307693,"contracts":0.07692307692307693},"77":{"brief":0.07692307692307693,"overview":0.07692307692307693,"of":0.07692307692307693,"arithmetic":0.07692307692307693,"operations":0.07692307692307693,"in":0.07692307692307693,"clarity":0.07692307692307693,"and":0.07692307692307693,"their":0.07692307692307693,"importance":0.07692307692307693,"smart":0.07692307692307693,"contract":0.07692307692307693,"development":0.07692307692307693},"78":{"explore":0.1,"and":0.1,"master":0.1,"clarity's":0.1,"built-in":0.1,"functions":0.1,"for":0.1,"smart":0.1,"contract":0.1,"development":0.1},"79":{"optimizing":0.1111111111111111,"storage":0.1111111111111111,"and":0.1111111111111111,"retrieval":0.1111111111111111,"with":0.1111111111111111,"map":0.1111111111111111,"functions":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111},"80":{"brief":0.07692307692307693,"overview":0.07692307692307693,"of":0.07692307692307693,"cryptographic":0.07692307692307693,"functions":0.07692307692307693,"in":0.07692307692307693,"clarity":0.07692307692307693,"and":0.07692307692307693,"their":0.07692307692307693,"importance":0.07692307692307693,"smart":0.07692307692307693,"contract":0.07692307692307693,"development":0.07692307692307693},"81":{"manage":0.125,"permissions":0.125,"and":0.125,"access":0.125,"control":0.125,"with":0.125,"principal":0.125,"functions":0.125},"82":{"construct":0.16666666666666666,"lists":0.16666666666666666,"in":0.16666666666666666,"clarity":0.16666666666666666,"smart":0.16666666666666666,"contracts":0.16666666666666666},"83":{"use":0.07692307692307693,"tuples":0.07692307692307693,"to":0.07692307692307693,"group":0.07692307692307693,"data":0.07692307692307693,"values":0.07692307692307693,"with":0.07692307692307693,"named":0.07692307692307693,"fields":0.07692307692307693,"in":0.07692307692307693,"clarity":0.07692307692307693,"smart":0.07692307692307693,"contracts":0.07692307692307693},"84":{"compute":0.09090909090909091,"the":0.09090909090909091,"sha-256":0.09090909090909091,"hash":0.09090909090909091,"of":0.09090909090909091,"a":0.09090909090909091,"value":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"85":{"unpack":0.1111111111111111,"optional":0.1111111111111111,"and":0.1111111111111111,"response":0.1111111111111111,"types":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"86":{"execute":0.08333333333333333,"public":0.08333333333333333,"functions":0.08333333333333333,"in":0.08333333333333333,"other":0.08333333333333333,"smart":0.08333333333333333,"contracts":0.08333333333333333,"from":0.08333333333333333,"within":0.08333333333333333,"a":0.08333333333333333,"clarity":0.08333333333333333,"contract":0.08333333333333333},"87":{"convert":0.07142857142857142,"a":0.07142857142857142,"byte":0.07142857142857142,"buffer":0.07142857142857142,"to":0.07142857142857142,"signed":0.07142857142857142,"integer":0.07142857142857142,"using":0.07142857142857142,"big-endian":0.07142857142857142,"encoding":0.07142857142857142,"in":0.07142857142857142,"clarity":0.07142857142857142,"smart":0.07142857142857142,"contracts":0.07142857142857142},"88":{"convert":0.1,"integers":0.1,"to":0.1,"ascii":0.1,"string":0.1,"representations":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"89":{"remove":0.1,"an":0.1,"entry":0.1,"from":0.1,"a":0.1,"map":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"90":{"retrieve":0.08333333333333333,"the":0.08333333333333333,"principal":0.08333333333333333,"of":0.08333333333333333,"a":0.08333333333333333,"contract":0.08333333333333333,"implementing":0.08333333333333333,"trait":0.08333333333333333,"in":0.08333333333333333,"clarity":0.08333333333333333,"smart":0.08333333333333333,"contracts":0.08333333333333333},"91":{"compute":0.09090909090909091,"the":0.09090909090909091,"keccak-256":0.09090909090909091,"hash":0.09090909090909091,"of":0.09090909090909091,"a":0.09090909090909091,"buffer":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"92":{"define":0.14285714285714285,"immutable":0.14285714285714285,"constants":0.14285714285714285,"in":0.14285714285714285,"clarity":0.14285714285714285,"smart":0.14285714285714285,"contracts":0.14285714285714285},"93":{"perform":0.1,"a":0.1,"bitwise":0.1,"exclusive":0.1,"or":0.1,"operation":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"94":{"derive":0.1,"a":0.1,"principal":0.1,"from":0.1,"public":0.1,"key":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"95":{"fetch":0.1111111111111111,"information":0.1111111111111111,"about":0.1111111111111111,"burnchain":0.1111111111111111,"blocks":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"96":{"reduce":0.1,"a":0.1,"sequence":0.1,"to":0.1,"single":0.1,"value":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"97":{"define":0.125,"a":0.125,"data":0.125,"map":0.125,"in":0.125,"clarity":0.125,"smart":0.125,"contracts":0.125},"98":{"query":0.125,"stx":0.125,"account":0.125,"information":0.125,"in":0.125,"clarity":0.125,"smart":0.125,"contracts":0.125},"99":{"define":0.14285714285714285,"public":0.14285714285714285,"functions":0.14285714285714285,"in":0.14285714285714285,"clarity":0.14285714285714285,"smart":0.14285714285714285,"contracts":0.14285714285714285},"100":{"define":0.14285714285714285,"mutable":0.14285714285714285,"variables":0.14285714285714285,"in":0.14285714285714285,"clarity":0.14285714285714285,"smart":0.14285714285714285,"contracts":0.14285714285714285},"101":{"transfer":0.09090909090909091,"ownership":0.09090909090909091,"of":0.09090909090909091,"a":0.09090909090909091,"non-fungible":0.09090909090909091,"token":0.09090909090909091,"nft":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"102":{"use":0.09090909090909091,"the":0.09090909090909091,"multiplication":0.09090909090909091,"function":0.09090909090909091,"for":0.09090909090909091,"arithmetic":0.09090909090909091,"operations":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"103":{"provide":0.09090909090909091,"a":0.09090909090909091,"default":0.09090909090909091,"value":0.09090909090909091,"for":0.09090909090909091,"optional":0.09090909090909091,"types":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"104":{"fetch":0.1111111111111111,"information":0.1111111111111111,"about":0.1111111111111111,"stacks":0.1111111111111111,"blocks":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"105":{"apply":0.08333333333333333,"a":0.08333333333333333,"function":0.08333333333333333,"to":0.08333333333333333,"each":0.08333333333333333,"element":0.08333333333333333,"of":0.08333333333333333,"list":0.08333333333333333,"in":0.08333333333333333,"clarity":0.08333333333333333,"smart":0.08333333333333333,"contracts":0.08333333333333333},"106":{"calculate":0.08333333333333333,"the":0.08333333333333333,"integer":0.08333333333333333,"square":0.08333333333333333,"root":0.08333333333333333,"of":0.08333333333333333,"a":0.08333333333333333,"number":0.08333333333333333,"in":0.08333333333333333,"clarity":0.08333333333333333,"smart":0.08333333333333333,"contracts":0.08333333333333333},"107":{"calculate":0.09090909090909091,"the":0.09090909090909091,"base-2":0.09090909090909091,"logarithm":0.09090909090909091,"of":0.09090909090909091,"a":0.09090909090909091,"number":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"108":{"use":0.09090909090909091,"the":0.09090909090909091,"and":0.09090909090909091,"function":0.09090909090909091,"for":0.09090909090909091,"logical":0.09090909090909091,"operations":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"109":{"replace":0.08333333333333333,"an":0.08333333333333333,"element":0.08333333333333333,"at":0.08333333333333333,"a":0.08333333333333333,"specific":0.08333333333333333,"index":0.08333333333333333,"in":0.08333333333333333,"sequence":0.08333333333333333,"clarity":0.08333333333333333,"smart":0.08333333333333333,"contracts":0.08333333333333333},"110":{"get":0.1,"the":0.1,"length":0.1,"of":0.1,"a":0.1,"sequence":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"111":{"256":0.08333333333333333,"compute":0.08333333333333333,"the":0.08333333333333333,"sha-512":0.08333333333333333,"hash":0.08333333333333333,"of":0.08333333333333333,"a":0.08333333333333333,"value":0.08333333333333333,"in":0.08333333333333333,"clarity":0.08333333333333333,"smart":0.08333333333333333,"contracts":0.08333333333333333},"112":{"use":0.09090909090909091,"the":0.09090909090909091,"division":0.09090909090909091,"function":0.09090909090909091,"for":0.09090909090909091,"arithmetic":0.09090909090909091,"operations":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"113":{"use":0.09090909090909091,"the":0.09090909090909091,"bit-and":0.09090909090909091,"function":0.09090909090909091,"for":0.09090909090909091,"bitwise":0.09090909090909091,"operations":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"114":{"use":0.09090909090909091,"the":0.09090909090909091,"less":0.09090909090909091,"than":0.09090909090909091,"function":0.09090909090909091,"for":0.09090909090909091,"comparisons":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"115":{"burn":0.14285714285714285,"fungible":0.14285714285714285,"tokens":0.14285714285714285,"in":0.14285714285714285,"clarity":0.14285714285714285,"smart":0.14285714285714285,"contracts":0.14285714285714285},"116":{"retrieve":0.1111111111111111,"a":0.1111111111111111,"value":0.1111111111111111,"from":0.1111111111111111,"tuple":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"117":{"import":0.1,"and":0.1,"use":0.1,"traits":0.1,"from":0.1,"other":0.1,"contracts":0.1,"in":0.1,"clarity":0.1,"smart":0.1},"118":{"convert":0.09090909090909091,"a":0.09090909090909091,"signed":0.09090909090909091,"integer":0.09090909090909091,"to":0.09090909090909091,"an":0.09090909090909091,"unsigned":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"119":{"define":0.1111111111111111,"traits":0.1111111111111111,"for":0.1111111111111111,"interface-like":0.1111111111111111,"behavior":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"120":{"convert":0.1,"integers":0.1,"to":0.1,"utf-8":0.1,"string":0.1,"representations":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"121":{"construct":0.1111111111111111,"a":0.1111111111111111,"successful":0.1111111111111111,"response":0.1111111111111111,"type":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"122":{"define":0.1,"a":0.1,"new":0.1,"non-fungible":0.1,"token":0.1,"class":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"123":{"transfer":0.1111111111111111,"fungible":0.1111111111111111,"tokens":0.1111111111111111,"between":0.1111111111111111,"principals":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"124":{"check":0.09090909090909091,"if":0.09090909090909091,"a":0.09090909090909091,"response":0.09090909090909091,"is":0.09090909090909091,"an":0.09090909090909091,"error":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"125":{"retrieve":0.08333333333333333,"the":0.08333333333333333,"total":0.08333333333333333,"supply":0.08333333333333333,"of":0.08333333333333333,"a":0.08333333333333333,"fungible":0.08333333333333333,"token":0.08333333333333333,"in":0.08333333333333333,"clarity":0.08333333333333333,"smart":0.08333333333333333,"contracts":0.08333333333333333},"126":{"use":0.07142857142857142,"the":0.07142857142857142,"as-max-len":0.07142857142857142,"function":0.07142857142857142,"to":0.07142857142857142,"check":0.07142857142857142,"and":0.07142857142857142,"limit":0.07142857142857142,"sequence":0.07142857142857142,"lengths":0.07142857142857142,"in":0.07142857142857142,"clarity":0.07142857142857142,"smart":0.07142857142857142,"contracts":0.07142857142857142},"127":{"fetch":0.1111111111111111,"information":0.1111111111111111,"about":0.1111111111111111,"stacks":0.1111111111111111,"tenures":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"128":{"use":0.07692307692307693,"the":0.07692307692307693,"bit-xor":0.07692307692307693,"function":0.07692307692307693,"for":0.07692307692307693,"bitwise":0.07692307692307693,"exclusive":0.07692307692307693,"or":0.07692307692307693,"operations":0.07692307692307693,"in":0.07692307692307693,"clarity":0.07692307692307693,"smart":0.07692307692307693,"contracts":0.07692307692307693},"129":{"define":0.14285714285714285,"private":0.14285714285714285,"functions":0.14285714285714285,"in":0.14285714285714285,"clarity":0.14285714285714285,"smart":0.14285714285714285,"contracts":0.14285714285714285},"130":{"use":0.08333333333333333,"the":0.08333333333333333,"bit-or":0.08333333333333333,"function":0.08333333333333333,"for":0.08333333333333333,"bitwise":0.08333333333333333,"or":0.08333333333333333,"operations":0.08333333333333333,"in":0.08333333333333333,"clarity":0.08333333333333333,"smart":0.08333333333333333,"contracts":0.08333333333333333},"131":{"retrieve":0.09090909090909091,"the":0.09090909090909091,"value":0.09090909090909091,"of":0.09090909090909091,"a":0.09090909090909091,"data":0.09090909090909091,"variable":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"132":{"set":0.1111111111111111,"an":0.1111111111111111,"entry":0.1111111111111111,"in":0.1111111111111111,"a":0.1111111111111111,"map":0.1111111111111111,"clarity":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"133":{"convert":0.06666666666666667,"a":0.06666666666666667,"byte":0.06666666666666667,"buffer":0.06666666666666667,"to":0.06666666666666667,"an":0.06666666666666667,"unsigned":0.06666666666666667,"integer":0.06666666666666667,"using":0.06666666666666667,"big-endian":0.06666666666666667,"encoding":0.06666666666666667,"in":0.06666666666666667,"clarity":0.06666666666666667,"smart":0.06666666666666667,"contracts":0.06666666666666667},"134":{"define":0.125,"public":0.125,"read-only":0.125,"functions":0.125,"in":0.125,"clarity":0.125,"smart":0.125,"contracts":0.125},"135":{"burn":0.1111111111111111,"a":0.1111111111111111,"non-fungible":0.1111111111111111,"token":0.1111111111111111,"nft":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"136":{"check":0.1,"if":0.1,"a":0.1,"response":0.1,"is":0.1,"ok":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"137":{"use":0.09090909090909091,"the":0.09090909090909091,"addition":0.09090909090909091,"function":0.09090909090909091,"for":0.09090909090909091,"arithmetic":0.09090909090909091,"operations":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"138":{"convert":0.09090909090909091,"a":0.09090909090909091,"string":0.09090909090909091,"to":0.09090909090909091,"an":0.09090909090909091,"optional":0.09090909090909091,"integer":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"139":{"check":0.09090909090909091,"if":0.09090909090909091,"an":0.09090909090909091,"optional":0.09090909090909091,"value":0.09090909090909091,"is":0.09090909090909091,"none":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"140":{"use":0.09090909090909091,"the":0.09090909090909091,"subtraction":0.09090909090909091,"function":0.09090909090909091,"for":0.09090909090909091,"arithmetic":0.09090909090909091,"operations":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"141":{"decompose":0.1,"a":0.1,"principal":0.1,"into":0.1,"its":0.1,"components":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"142":{"serialize":0.09090909090909091,"a":0.09090909090909091,"clarity":0.09090909090909091,"value":0.09090909090909091,"into":0.09090909090909091,"buffer":0.09090909090909091,"for":0.09090909090909091,"consensus":0.09090909090909091,"in":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"143":{"burn":0.1,"stx":0.1,"from":0.1,"a":0.1,"principal's":0.1,"account":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"144":{"deserialize":0.1111111111111111,"a":0.1111111111111111,"buffer":0.1111111111111111,"into":0.1111111111111111,"clarity":0.1111111111111111,"value":0.1111111111111111,"in":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"145":{"use":0.07692307692307693,"the":0.07692307692307693,"bit-shift-right":0.07692307692307693,"function":0.07692307692307693,"for":0.07692307692307693,"bitwise":0.07692307692307693,"right":0.07692307692307693,"shift":0.07692307692307693,"operations":0.07692307692307693,"in":0.07692307692307693,"clarity":0.07692307692307693,"smart":0.07692307692307693,"contracts":0.07692307692307693},"146":{"check":0.09090909090909091,"if":0.09090909090909091,"an":0.09090909090909091,"optional":0.09090909090909091,"value":0.09090909090909091,"is":0.09090909090909091,"some":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"147":{"check":0.09090909090909091,"if":0.09090909090909091,"a":0.09090909090909091,"value":0.09090909090909091,"is":0.09090909090909091,"standard":0.09090909090909091,"principal":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"148":{"unpack":0.09090909090909091,"error":0.09090909090909091,"responses":0.09090909090909091,"and":0.09090909090909091,"throwing":0.09090909090909091,"runtime":0.09090909090909091,"errors":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"149":{"use":0.05555555555555555,"the":0.05555555555555555,"append":0.05555555555555555,"function":0.05555555555555555,"to":0.05555555555555555,"add":0.05555555555555555,"elements":0.05555555555555555,"lists":0.05555555555555555,"in":0.05555555555555555,"clarity":0.05555555555555555,"smart":0.05555555555555555,"contracts":0.05555555555555555,"with":0.05555555555555555,"considerations":0.05555555555555555,"for":0.05555555555555555,"maximum":0.05555555555555555,"list":0.05555555555555555,"length":0.05555555555555555},"150":{"transfer":0.125,"stx":0.125,"between":0.125,"principals":0.125,"in":0.125,"clarity":0.125,"smart":0.125,"contracts":0.125},"151":{"unpack":0.08333333333333333,"optional":0.08333333333333333,"and":0.08333333333333333,"response":0.08333333333333333,"types":0.08333333333333333,"throwing":0.08333333333333333,"runtime":0.08333333333333333,"errors":0.08333333333333333,"in":0.08333333333333333,"clarity":0.08333333333333333,"smart":0.08333333333333333,"contracts":0.08333333333333333},"152":{"implement":0.16666666666666666,"traits":0.16666666666666666,"in":0.16666666666666666,"clarity":0.16666666666666666,"smart":0.16666666666666666,"contracts":0.16666666666666666},"153":{"convert":0.09090909090909091,"an":0.09090909090909091,"unsigned":0.09090909090909091,"integer":0.09090909090909091,"to":0.09090909090909091,"a":0.09090909090909091,"signed":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"154":{"use":0.09090909090909091,"the":0.09090909090909091,"greater":0.09090909090909091,"than":0.09090909090909091,"function":0.09090909090909091,"for":0.09090909090909091,"comparisons":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"155":{"logical":0.16666666666666666,"negation":0.16666666666666666,"in":0.16666666666666666,"clarity":0.16666666666666666,"smart":0.16666666666666666,"contracts":0.16666666666666666},"156":{"fetch":0.1111111111111111,"information":0.1111111111111111,"about":0.1111111111111111,"stacks":0.1111111111111111,"blocks":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"157":{"convert":0.08333333333333333,"a":0.08333333333333333,"string":0.08333333333333333,"to":0.08333333333333333,"an":0.08333333333333333,"optional":0.08333333333333333,"unsigned":0.08333333333333333,"integer":0.08333333333333333,"in":0.08333333333333333,"clarity":0.08333333333333333,"smart":0.08333333333333333,"contracts":0.08333333333333333},"158":{"convert":0.06666666666666667,"a":0.06666666666666667,"byte":0.06666666666666667,"buffer":0.06666666666666667,"to":0.06666666666666667,"an":0.06666666666666667,"unsigned":0.06666666666666667,"integer":0.06666666666666667,"using":0.06666666666666667,"little-endian":0.06666666666666667,"encoding":0.06666666666666667,"in":0.06666666666666667,"clarity":0.06666666666666667,"smart":0.06666666666666667,"contracts":0.06666666666666667},"159":{"unpack":0.14285714285714285,"error":0.14285714285714285,"responses":0.14285714285714285,"in":0.14285714285714285,"clarity":0.14285714285714285,"smart":0.14285714285714285,"contracts":0.14285714285714285},"160":{"define":0.1111111111111111,"a":0.1111111111111111,"new":0.1111111111111111,"fungible":0.1111111111111111,"token":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"161":{"use":0.06666666666666667,"the":0.06666666666666667,"at-block":0.06666666666666667,"function":0.06666666666666667,"to":0.06666666666666667,"evaluate":0.06666666666666667,"expressions":0.06666666666666667,"at":0.06666666666666667,"a":0.06666666666666667,"specific":0.06666666666666667,"block":0.06666666666666667,"in":0.06666666666666667,"clarity":0.06666666666666667,"smart":0.06666666666666667,"contracts":0.06666666666666667},"162":{"recover":0.07142857142857142,"the":0.07142857142857142,"public":0.07142857142857142,"key":0.07142857142857142,"from":0.07142857142857142,"a":0.07142857142857142,"message":0.07142857142857142,"hash":0.07142857142857142,"and":0.07142857142857142,"signature":0.07142857142857142,"in":0.07142857142857142,"clarity":0.07142857142857142,"smart":0.07142857142857142,"contracts":0.07142857142857142},"163":{"use":0.07692307692307693,"the":0.07692307692307693,"begin":0.07692307692307693,"function":0.07692307692307693,"to":0.07692307692307693,"evaluate":0.07692307692307693,"multiple":0.07692307692307693,"expressions":0.07692307692307693,"in":0.07692307692307693,"sequence":0.07692307692307693,"clarity":0.07692307692307693,"smart":0.07692307692307693,"contracts":0.07692307692307693},"164":{"construct":0.14285714285714285,"error":0.14285714285714285,"responses":0.14285714285714285,"in":0.14285714285714285,"clarity":0.14285714285714285,"smart":0.14285714285714285,"contracts":0.14285714285714285},"165":{"logical":0.16666666666666666,"disjunction":0.16666666666666666,"in":0.16666666666666666,"clarity":0.16666666666666666,"smart":0.16666666666666666,"contracts":0.16666666666666666},"166":{"handle":0.1,"errors":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1,"using":0.1,"the":0.1,"try":0.1,"function":0.1},"167":{"insert":0.1,"an":0.1,"entry":0.1,"into":0.1,"a":0.1,"map":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"168":{"construct":0.09090909090909091,"an":0.09090909090909091,"optional":0.09090909090909091,"type":0.09090909090909091,"from":0.09090909090909091,"a":0.09090909090909091,"value":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"169":{"verify":0.07692307692307693,"a":0.07692307692307693,"signature":0.07692307692307693,"against":0.07692307692307693,"message":0.07692307692307693,"hash":0.07692307692307693,"and":0.07692307692307693,"public":0.07692307692307693,"key":0.07692307692307693,"in":0.07692307692307693,"clarity":0.07692307692307693,"smart":0.07692307692307693,"contracts":0.07692307692307693},"170":{"handle":0.1111111111111111,"different":0.1111111111111111,"branches":0.1111111111111111,"or":0.1111111111111111,"cases":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"171":{"bind":0.125,"variables":0.125,"to":0.125,"expressions":0.125,"in":0.125,"clarity":0.125,"smart":0.125,"contracts":0.125},"172":{"retrieve":0.1,"an":0.1,"entry":0.1,"from":0.1,"a":0.1,"map":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"173":{"compare":0.125,"values":0.125,"for":0.125,"equality":0.125,"in":0.125,"clarity":0.125,"smart":0.125,"contracts":0.125},"174":{"use":0.07692307692307693,"the":0.07692307692307693,"bit-shift-left":0.07692307692307693,"function":0.07692307692307693,"for":0.07692307692307693,"bitwise":0.07692307692307693,"left":0.07692307692307693,"shift":0.07692307692307693,"operations":0.07692307692307693,"in":0.07692307692307693,"clarity":0.07692307692307693,"smart":0.07692307692307693,"contracts":0.07692307692307693},"175":{"set":0.09090909090909091,"the":0.09090909090909091,"value":0.09090909090909091,"of":0.09090909090909091,"a":0.09090909090909091,"data":0.09090909090909091,"variable":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"176":{"use":0.07692307692307693,"the":0.07692307692307693,"less":0.07692307692307693,"than":0.07692307692307693,"or":0.07692307692307693,"equal":0.07692307692307693,"function":0.07692307692307693,"for":0.07692307692307693,"comparisons":0.07692307692307693,"in":0.07692307692307693,"clarity":0.07692307692307693,"smart":0.07692307692307693,"contracts":0.07692307692307693},"177":{"filter":0.07692307692307693,"elements":0.07692307692307693,"from":0.07692307692307693,"a":0.07692307692307693,"list":0.07692307692307693,"based":0.07692307692307693,"on":0.07692307692307693,"predicate":0.07692307692307693,"function":0.07692307692307693,"in":0.07692307692307693,"clarity":0.07692307692307693,"smart":0.07692307692307693,"contracts":0.07692307692307693},"178":{"mint":0.125,"new":0.125,"fungible":0.125,"tokens":0.125,"in":0.125,"clarity":0.125,"smart":0.125,"contracts":0.125},"179":{"convert":0.07142857142857142,"a":0.07142857142857142,"byte":0.07142857142857142,"buffer":0.07142857142857142,"to":0.07142857142857142,"signed":0.07142857142857142,"integer":0.07142857142857142,"using":0.07142857142857142,"little-endian":0.07142857142857142,"encoding":0.07142857142857142,"in":0.07142857142857142,"clarity":0.07142857142857142,"smart":0.07142857142857142,"contracts":0.07142857142857142},"180":{"retrieve":0.07692307692307693,"an":0.07692307692307693,"element":0.07692307692307693,"from":0.07692307692307693,"a":0.07692307692307693,"list":0.07692307692307693,"at":0.07692307692307693,"specific":0.07692307692307693,"index":0.07692307692307693,"in":0.07692307692307693,"clarity":0.07692307692307693,"smart":0.07692307692307693,"contracts":0.07692307692307693},"181":{"compute":0.09090909090909091,"the":0.09090909090909091,"sha-512":0.09090909090909091,"hash":0.09090909090909091,"of":0.09090909090909091,"a":0.09090909090909091,"value":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"182":{"concatenate":0.16666666666666666,"sequences":0.16666666666666666,"in":0.16666666666666666,"clarity":0.16666666666666666,"smart":0.16666666666666666,"contracts":0.16666666666666666},"183":{"find":0.08333333333333333,"the":0.08333333333333333,"index":0.08333333333333333,"of":0.08333333333333333,"an":0.08333333333333333,"element":0.08333333333333333,"in":0.08333333333333333,"a":0.08333333333333333,"list":0.08333333333333333,"clarity":0.08333333333333333,"smart":0.08333333333333333,"contracts":0.08333333333333333},"184":{"transfer":0.1,"stx":0.1,"with":0.1,"a":0.1,"memo":0.1,"field":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"185":{"calculate":0.1,"the":0.1,"power":0.1,"of":0.1,"a":0.1,"number":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"186":{"mint":0.1111111111111111,"a":0.1111111111111111,"non-fungible":0.1111111111111111,"token":0.1111111111111111,"nft":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"187":{"use":0.08333333333333333,"the":0.08333333333333333,"bit-not":0.08333333333333333,"function":0.08333333333333333,"for":0.08333333333333333,"bitwise":0.08333333333333333,"complement":0.08333333333333333,"operations":0.08333333333333333,"in":0.08333333333333333,"clarity":0.08333333333333333,"smart":0.08333333333333333,"contracts":0.08333333333333333},"188":{"compute":0.1,"the":0.1,"ripemd160":0.1,"sha256":0.1,"x":0.1,"hash":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"189":{"merge":0.16666666666666666,"tuples":0.16666666666666666,"in":0.16666666666666666,"clarity":0.16666666666666666,"smart":0.16666666666666666,"contracts":0.16666666666666666},"190":{"retrieve":0.07692307692307693,"the":0.07692307692307693,"balance":0.07692307692307693,"of":0.07692307692307693,"a":0.07692307692307693,"fungible":0.07692307692307693,"token":0.07692307692307693,"for":0.07692307692307693,"principal":0.07692307692307693,"in":0.07692307692307693,"clarity":0.07692307692307693,"smart":0.07692307692307693,"contracts":0.07692307692307693},"191":{"use":0.07692307692307693,"the":0.07692307692307693,"greater":0.07692307692307693,"than":0.07692307692307693,"or":0.07692307692307693,"equal":0.07692307692307693,"function":0.07692307692307693,"for":0.07692307692307693,"comparisons":0.07692307692307693,"in":0.07692307692307693,"clarity":0.07692307692307693,"smart":0.07692307692307693,"contracts":0.07692307692307693},"192":{"use":0.07142857142857142,"the":0.07142857142857142,"as-contract":0.07142857142857142,"function":0.07142857142857142,"to":0.07142857142857142,"execute":0.07142857142857142,"expressions":0.07142857142857142,"as":0.07142857142857142,"contract":0.07142857142857142,"principal":0.07142857142857142,"in":0.07142857142857142,"clarity":0.07142857142857142,"smart":0.07142857142857142,"contracts":0.07142857142857142},"193":{"use":0.09090909090909091,"the":0.09090909090909091,"asserts":0.09090909090909091,"function":0.09090909090909091,"for":0.09090909090909091,"conditional":0.09090909090909091,"assertions":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"194":{"extract":0.1111111111111111,"a":0.1111111111111111,"sub-sequence":0.1111111111111111,"from":0.1111111111111111,"sequence":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111,"smart":0.1111111111111111,"contracts":0.1111111111111111},"195":{"retrieve":0.08333333333333333,"the":0.08333333333333333,"owner":0.08333333333333333,"of":0.08333333333333333,"a":0.08333333333333333,"non-fungible":0.08333333333333333,"token":0.08333333333333333,"nft":0.08333333333333333,"in":0.08333333333333333,"clarity":0.08333333333333333,"smart":0.08333333333333333,"contracts":0.08333333333333333},"196":{"conditional":0.16666666666666666,"evaluation":0.16666666666666666,"in":0.16666666666666666,"clarity":0.16666666666666666,"smart":0.16666666666666666,"contracts":0.16666666666666666},"197":{"calculate":0.1,"the":0.1,"remainder":0.1,"of":0.1,"integer":0.1,"division":0.1,"in":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"198":{"query":0.09090909090909091,"the":0.09090909090909091,"stx":0.09090909090909091,"balance":0.09090909090909091,"of":0.09090909090909091,"a":0.09090909090909091,"principal":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"199":{"evaluate":0.125,"and":0.125,"printing":0.125,"expressions":0.125,"in":0.125,"clarity":0.125,"smart":0.125,"contracts":0.125},"200":{"construct":0.14285714285714285,"a":0.14285714285714285,"principal":0.14285714285714285,"in":0.14285714285714285,"clarity":0.14285714285714285,"smart":0.14285714285714285,"contracts":0.14285714285714285},"201":{"safely":0.09090909090909091,"handling":0.09090909090909091,"optional":0.09090909090909091,"values":0.09090909090909091,"and":0.09090909090909091,"error":0.09090909090909091,"cases":0.09090909090909091,"in":0.09090909090909091,"clarity":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"202":{"implementing":0.1111111111111111,"time-based":0.1111111111111111,"logic":0.1111111111111111,"with":0.1111111111111111,"block":0.1111111111111111,"info":0.1111111111111111,"functions":0.1111111111111111,"in":0.1111111111111111,"clarity":0.1111111111111111},"203":{"build":0.16666666666666666,"your":0.16666666666666666,"web":0.16666666666666666,"apps":0.16666666666666666,"on":0.16666666666666666,"stacks":0.16666666666666666},"204":{"build":0.2,"your":0.2,"tokens":0.2,"on":0.2,"stacks":0.2},"205":{"get":0.16666666666666666,"aggregated":0.16666666666666666,"signer":0.16666666666666666,"information":0.16666666666666666,"for":0.16666666666666666,"blocks":0.16666666666666666},"206":{"get":0.125,"aggregated":0.125,"signer":0.125,"information":0.125,"for":0.125,"a":0.125,"specific":0.125,"block":0.125},"207":{"get":0.125,"aggregated":0.125,"signer":0.125,"information":0.125,"for":0.125,"most":0.125,"recent":0.125,"blocks":0.125},"208":{"monitor":0.1111111111111111,"and":0.1111111111111111,"analyze":0.1111111111111111,"signer":0.1111111111111111,"behavior":0.1111111111111111,"on":0.1111111111111111,"the":0.1111111111111111,"stacks":0.1111111111111111,"network":0.1111111111111111},"209":{"service":0.3333333333333333,"status":0.3333333333333333,"endpoints":0.3333333333333333},"210":{"displays":0.1111111111111111,"the":0.1111111111111111,"status":0.1111111111111111,"of":0.1111111111111111,"api":0.1111111111111111,"and":0.1111111111111111,"its":0.1111111111111111,"current":0.1111111111111111,"workload":0.1111111111111111},"211":{"get":0.14285714285714285,"prometheus":0.14285714285714285,"metrics":0.14285714285714285,"for":0.14285714285714285,"the":0.14285714285714285,"signer":0.14285714285714285,"api":0.14285714285714285},"212":{"get":0.14285714285714285,"prometheus":0.14285714285714285,"metrics":0.14285714285714285,"for":0.14285714285714285,"the":0.14285714285714285,"signer":0.14285714285714285,"api":0.14285714285714285},"213":{"get":0.125,"information":0.125,"about":0.125,"signers":0.125,"on":0.125,"the":0.125,"stacks":0.125,"blockchain":0.125},"214":{"get":0.1,"stats":0.1,"for":0.1,"a":0.1,"specific":0.1,"signer":0.1,"in":0.1,"given":0.1,"pox":0.1,"cycle":0.1},"215":{"get":0.1111111111111111,"a":0.1111111111111111,"list":0.1111111111111111,"of":0.1111111111111111,"signers":0.1111111111111111,"in":0.1111111111111111,"given":0.1111111111111111,"pox":0.1111111111111111,"cycle":0.1111111111111111},"216":{"get":0.14285714285714285,"signer":0.14285714285714285,"information":0.14285714285714285,"for":0.14285714285714285,"a":0.14285714285714285,"specific":0.14285714285714285,"block":0.14285714285714285},"217":{"get":0.2,"information":0.2,"about":0.2,"block":0.2,"proposals":0.2},"218":{"get":0.125,"signer":0.125,"information":0.125,"for":0.125,"most":0.125,"recent":0.125,"block":0.125,"proposals":0.125},"219":{"discover":0.1111111111111111,"updates":0.1111111111111111,"to":0.1111111111111111,"hiro":0.1111111111111111,"tools":0.1111111111111111,"related":0.1111111111111111,"the":0.1111111111111111,"nakamoto":0.1111111111111111,"upgrade":0.1111111111111111},"220":{"discover":0.1111111111111111,"stacks":0.1111111111111111,"explorer":0.1111111111111111,"updates":0.1111111111111111,"related":0.1111111111111111,"to":0.1111111111111111,"the":0.1111111111111111,"nakamoto":0.1111111111111111,"upgrade":0.1111111111111111},"221":{"discover":0.125,"clarinet":0.125,"upgrades":0.125,"related":0.125,"to":0.125,"the":0.125,"nakamoto":0.125,"release":0.125},"222":{"discover":0.1,"stacks":0.1,"blockchain":0.1,"api":0.1,"updates":0.1,"related":0.1,"to":0.1,"the":0.1,"nakamoto":0.1,"upgrade":0.1},"223":{"discover":0.1111111111111111,"stacks":0.1111111111111111,"js":0.1111111111111111,"changes":0.1111111111111111,"related":0.1111111111111111,"to":0.1111111111111111,"the":0.1111111111111111,"nakamoto":0.1111111111111111,"upgrade":0.1111111111111111},"224":{"learn":0.05263157894736842,"how":0.05263157894736842,"to":0.05263157894736842,"write":0.05263157894736842,"and":0.05263157894736842,"run":0.05263157894736842,"unit":0.05263157894736842,"tests":0.05263157894736842,"for":0.05263157894736842,"your":0.05263157894736842,"clarity":0.05263157894736842,"smart":0.05263157894736842,"contracts":0.05263157894736842,"using":0.05263157894736842,"the":0.05263157894736842,"clarinet":0.05263157894736842,"js":0.05263157894736842,"sdk":0.05263157894736842,"vitest":0.05263157894736842},"225":{"build":0.16666666666666666,"your":0.16666666666666666,"smart":0.16666666666666666,"contracts":0.16666666666666666,"on":0.16666666666666666,"stacks":0.16666666666666666},"226":{"construct":0.07692307692307693,"decode":0.07692307692307693,"transactions":0.07692307692307693,"and":0.07692307692307693,"work":0.07692307692307693,"with":0.07692307692307693,"clarity":0.07692307692307693,"smart":0.07692307692307693,"contracts":0.07692307692307693,"on":0.07692307692307693,"the":0.07692307692307693,"stacks":0.07692307692307693,"blockchain":0.07692307692307693},"227":{"network":0.1,"and":0.1,"api":0.1,"library":0.1,"for":0.1,"working":0.1,"with":0.1,"stacks":0.1,"blockchain":0.1,"nodes":0.1},"228":{"a":0.09090909090909091,"collection":0.09090909090909091,"of":0.09090909090909091,"javascript":0.09090909090909091,"libraries":0.09090909090909091,"to":0.09090909090909091,"build":0.09090909090909091,"web":0.09090909090909091,"applications":0.09090909090909091,"on":0.09090909090909091,"stacks":0.09090909090909091},"229":{"discover":0.16666666666666666,"the":0.16666666666666666,"future":0.16666666666666666,"of":0.16666666666666666,"stacks":0.16666666666666666,"js":0.16666666666666666},"230":{"create":0.09090909090909091,"and":0.09090909090909091,"broadcast":0.09090909090909091,"transactions":0.09090909090909091,"to":0.09090909090909091,"the":0.09090909090909091,"stacks":0.09090909090909091,"blockchain":0.09090909090909091,"network":0.09090909090909091,"using":0.09090909090909091,"js":0.09090909090909091},"231":{"this":0.09090909090909091,"guide":0.09090909090909091,"explains":0.09090909090909091,"how":0.09090909090909091,"to":0.09090909090909091,"use":0.09090909090909091,"post-conditions":0.09090909090909091,"secure":0.09090909090909091,"your":0.09090909090909091,"smart":0.09090909090909091,"contracts":0.09090909090909091},"232":{"learn":0.1111111111111111,"how":0.1111111111111111,"to":0.1111111111111111,"use":0.1111111111111111,"stacks":0.1111111111111111,"js":0.1111111111111111,"with":0.1111111111111111,"react":0.1111111111111111,"native":0.1111111111111111},"233":{"a":0.1111111111111111,"js":0.1111111111111111,"ts":0.1111111111111111,"helper":0.1111111111111111,"package":0.1111111111111111,"for":0.1111111111111111,"interacting":0.1111111111111111,"with":0.1111111111111111,"sbtc":0.1111111111111111},"234":{"construct":0.07692307692307693,"decode":0.07692307692307693,"transactions":0.07692307692307693,"and":0.07692307692307693,"work":0.07692307692307693,"with":0.07692307692307693,"clarity":0.07692307692307693,"smart":0.07692307692307693,"contracts":0.07692307692307693,"on":0.07692307692307693,"the":0.07692307692307693,"stacks":0.07692307692307693,"blockchain":0.07692307692307693},"235":{"network":0.1,"and":0.1,"api":0.1,"library":0.1,"for":0.1,"working":0.1,"with":0.1,"stacks":0.1,"blockchain":0.1,"nodes":0.1},"236":{"common":0.16666666666666666,"utilities":0.16666666666666666,"for":0.16666666666666666,"working":0.16666666666666666,"with":0.16666666666666666,"stacks":0.16666666666666666},"237":{"learn":0.1,"how":0.1,"to":0.1,"create":0.1,"and":0.1,"broadcast":0.1,"transactions":0.1,"with":0.1,"stacks":0.1,"js":0.1},"238":{},"239":{"learn":0.125,"how":0.125,"to":0.125,"manage":0.125,"secrets":0.125,"with":0.125,"stacks":0.125,"js":0.125},"240":{"learn":0.125,"how":0.125,"to":0.125,"get":0.125,"an":0.125,"address":0.125,"from":0.125,"account":0.125},"241":{"learn":0.16666666666666666,"how":0.16666666666666666,"to":0.16666666666666666,"use":0.16666666666666666,"different":0.16666666666666666,"networks":0.16666666666666666},"242":{"learn":0.125,"how":0.125,"to":0.125,"broadcast":0.125,"transactions":0.125,"the":0.125,"stacks":0.125,"network":0.125},"243":{"learn":0.1111111111111111,"how":0.1111111111111111,"to":0.1111111111111111,"transfer":0.1111111111111111,"stx":0.1111111111111111,"tokens":0.1111111111111111,"using":0.1111111111111111,"stacks":0.1111111111111111,"js":0.1111111111111111},"244":{"installing":0.25,"stacks":0.25,"js":0.25,"packages":0.25},"245":{"learn":0.05263157894736842,"how":0.05263157894736842,"to":0.05263157894736842,"write":0.05263157894736842,"and":0.05263157894736842,"run":0.05263157894736842,"integration":0.05263157894736842,"tests":0.05263157894736842,"for":0.05263157894736842,"your":0.05263157894736842,"clarity":0.05263157894736842,"smart":0.05263157894736842,"contracts":0.05263157894736842,"using":0.05263157894736842,"the":0.05263157894736842,"clarinet":0.05263157894736842,"js":0.05263157894736842,"sdk":0.05263157894736842,"vitest":0.05263157894736842},"246":{"learn":0.1,"how":0.1,"to":0.1,"migrate":0.1,"your":0.1,"existing":0.1,"clarinet":0.1,"projects":0.1,"the":0.1,"sdk":0.1},"247":{"for":0.09090909090909091,"developers":0.09090909090909091,"who":0.09090909090909091,"need":0.09090909090909091,"api":0.09090909090909091,"requests":0.09090909090909091,"beyond":0.09090909090909091,"the":0.09090909090909091,"standard":0.09090909090909091,"rate":0.09090909090909091,"limits":0.09090909090909091},"248":{"retrieves":0.1,"information":0.1,"about":0.1,"the":0.1,"token":0.1,"metadata":0.1,"api":0.1,"including":0.1,"server":0.1,"version":0.1},"249":{"retrieves":0.1,"information":0.1,"about":0.1,"the":0.1,"token":0.1,"metadata":0.1,"api":0.1,"including":0.1,"server":0.1,"version":0.1},"250":{"retrieves":0.125,"information":0.125,"about":0.125,"tokens":0.125,"on":0.125,"the":0.125,"stacks":0.125,"blockchain":0.125},"251":{"retrieves":0.14285714285714285,"metadata":0.14285714285714285,"for":0.14285714285714285,"a":0.14285714285714285,"sip-010":0.14285714285714285,"fungible":0.14285714285714285,"token":0.14285714285714285},"252":{"retrieves":0.2,"information":0.2,"about":0.2,"semi-fungible":0.2,"tokens":0.2},"253":{"retrieves":0.2,"information":0.2,"about":0.2,"fungible":0.2,"tokens":0.2},"254":{"retrieves":0.14285714285714285,"metadata":0.14285714285714285,"for":0.14285714285714285,"a":0.14285714285714285,"sip-009":0.14285714285714285,"non-fungible":0.14285714285714285,"token":0.14285714285714285},"255":{"learn":0.16666666666666666,"how":0.16666666666666666,"to":0.16666666666666666,"paginate":0.16666666666666666,"through":0.16666666666666666,"lists":0.16666666666666666},"256":{"the":0.07692307692307693,"following":0.07692307692307693,"guides":0.07692307692307693,"cover":0.07692307692307693,"ways":0.07692307692307693,"to":0.07692307692307693,"use":0.07692307692307693,"hiro":0.07692307692307693,"tools":0.07692307692307693,"build":0.07692307692307693,"apps":0.07692307692307693,"on":0.07692307692307693,"stacks":0.07692307692307693},"257":{"authenticate":0.16666666666666666,"with":0.16666666666666666,"the":0.16666666666666666,"stacks":0.16666666666666666,"blockchain":0.16666666666666666,"api":0.16666666666666666},"258":{"learn":0.14285714285714285,"how":0.14285714285714285,"to":0.14285714285714285,"handle":0.14285714285714285,"nonces":0.14285714285714285,"on":0.14285714285714285,"stacks":0.14285714285714285},"259":{"understand":0.14285714285714285,"the":0.14285714285714285,"architecture":0.14285714285714285,"of":0.14285714285714285,"stacks":0.14285714285714285,"blockchain":0.14285714285714285,"api":0.14285714285714285},"260":{"retrieves":0.25,"a":0.25,"single":0.25,"block":0.25},"261":{"retrieves":0.14285714285714285,"a":0.14285714285714285,"list":0.14285714285714285,"of":0.14285714285714285,"recently":0.14285714285714285,"mined":0.14285714285714285,"blocks":0.14285714285714285},"262":{"retrieves":0.1,"block":0.1,"details":0.1,"of":0.1,"a":0.1,"specific":0.1,"for":0.1,"given":0.1,"chain":0.1,"height":0.1},"263":{"handle":0.09090909090909091,"the":0.09090909090909091,"retrieval":0.09090909090909091,"and":0.09090909090909091,"management":0.09090909090909091,"of":0.09090909090909091,"block":0.09090909090909091,"data":0.09090909090909091,"using":0.09090909090909091,"various":0.09090909090909091,"identifiers":0.09090909090909091},"264":{"retrieves":0.1,"a":0.1,"list":0.1,"of":0.1,"blocks":0.1,"confirmed":0.1,"by":0.1,"specific":0.1,"burn":0.1,"block":0.1},"265":{"retrieves":0.1,"block":0.1,"details":0.1,"of":0.1,"a":0.1,"specific":0.1,"for":0.1,"given":0.1,"burnchain":0.1,"height":0.1},"266":{"retrieves":0.25,"average":0.25,"block":0.25,"times":0.25},"267":{"retrieves":0.14285714285714285,"a":0.14285714285714285,"list":0.14285714285714285,"of":0.14285714285714285,"recently":0.14285714285714285,"mined":0.14285714285714285,"blocks":0.14285714285714285},"268":{"retrieves":0.1,"block":0.1,"details":0.1,"of":0.1,"a":0.1,"specific":0.1,"for":0.1,"given":0.1,"burnchain":0.1,"hash":0.1},"269":{"retrieves":0.1,"block":0.1,"details":0.1,"of":0.1,"a":0.1,"specific":0.1,"for":0.1,"given":0.1,"chain":0.1,"height":0.1},"270":{"retrieves":0.1,"a":0.1,"list":0.1,"of":0.1,"all":0.1,"names":0.1,"known":0.1,"to":0.1,"the":0.1,"node":0.1},"271":{"retrieves":0.1111111111111111,"the":0.1111111111111111,"list":0.1111111111111111,"of":0.1111111111111111,"subdomains":0.1111111111111111,"for":0.1111111111111111,"a":0.1111111111111111,"specific":0.1111111111111111,"name":0.1111111111111111},"272":{"retrieves":0.125,"the":0.125,"zone":0.125,"file":0.125,"for":0.125,"a":0.125,"specific":0.125,"name":0.125},"273":{"manages":0.1,"and":0.1,"retrieve":0.1,"information":0.1,"on":0.1,"blockchain":0.1,"namespaces":0.1,"names":0.1,"related":0.1,"details":0.1},"274":{"retrieves":0.1,"the":0.1,"list":0.1,"of":0.1,"names":0.1,"owned":0.1,"by":0.1,"a":0.1,"specific":0.1,"address":0.1},"275":{"retrieves":0.125,"a":0.125,"list":0.125,"of":0.125,"names":0.125,"within":0.125,"given":0.125,"namespace":0.125},"276":{"retrieves":0.1,"a":0.1,"list":0.1,"of":0.1,"all":0.1,"namespaces":0.1,"known":0.1,"to":0.1,"the":0.1,"node":0.1},"277":{"retrieves":0.07142857142857142,"details":0.07142857142857142,"of":0.07142857142857142,"a":0.07142857142857142,"given":0.07142857142857142,"name":0.07142857142857142,"including":0.07142857142857142,"the":0.07142857142857142,"address":0.07142857142857142,"status":0.07142857142857142,"and":0.07142857142857142,"last":0.07142857142857142,"transaction":0.07142857142857142,"id":0.07142857142857142},"278":{"retrieves":0.1111111111111111,"the":0.1111111111111111,"historical":0.1111111111111111,"zone":0.1111111111111111,"file":0.1111111111111111,"for":0.1111111111111111,"a":0.1111111111111111,"specific":0.1111111111111111,"name":0.1111111111111111},"279":{"retrieves":0.14285714285714285,"an":0.14285714285714285,"estimated":0.14285714285714285,"fee":0.14285714285714285,"rate":0.14285714285714285,"for":0.14285714285714285,"transactions":0.14285714285714285},"280":{"provide":0.1111111111111111,"estimates":0.1111111111111111,"rates":0.1111111111111111,"and":0.1111111111111111,"approximate":0.1111111111111111,"calculations":0.1111111111111111,"for":0.1111111111111111,"transaction":0.1111111111111111,"costs":0.1111111111111111},"281":{"retrieves":0.05555555555555555,"a":0.05555555555555555,"list":0.05555555555555555,"of":0.05555555555555555,"recent":0.05555555555555555,"burnchain":0.05555555555555555,"e":0.05555555555555555,"g":0.05555555555555555,"bitcoin":0.05555555555555555,"reward":0.05555555555555555,"recipients":0.05555555555555555,"with":0.05555555555555555,"the":0.05555555555555555,"associated":0.05555555555555555,"amounts":0.05555555555555555,"and":0.05555555555555555,"block":0.05555555555555555,"info":0.05555555555555555},"282":{"provides":0.1,"information":0.1,"on":0.1,"recent":0.1,"rewards":0.1,"recipients":0.1,"and":0.1,"total":0.1,"earned":0.1,"amounts":0.1},"283":{"retrieves":0.05,"a":0.05,"list":0.05,"of":0.05,"recent":0.05,"burnchain":0.05,"e":0.05,"g":0.05,"bitcoin":0.05,"rewards":0.05,"for":0.05,"the":0.05,"given":0.05,"recipient":0.05,"with":0.05,"associated":0.05,"amounts":0.05,"and":0.05,"block":0.05,"info":0.05},"284":{"retrieves":0.07692307692307693,"a":0.07692307692307693,"list":0.07692307692307693,"of":0.07692307692307693,"the":0.07692307692307693,"bitcoin":0.07692307692307693,"addresses":0.07692307692307693,"that":0.07692307692307693,"would":0.07692307692307693,"validly":0.07692307692307693,"receive":0.07692307692307693,"proof-of-transfer":0.07692307692307693,"commitments":0.07692307692307693},"285":{"retrieves":0.05,"a":0.05,"list":0.05,"of":0.05,"the":0.05,"bitcoin":0.05,"addresses":0.05,"that":0.05,"would":0.05,"validly":0.05,"receive":0.05,"proof-of-transfer":0.05,"commitments":0.05,"for":0.05,"given":0.05,"reward":0.05,"slot":0.05,"holder":0.05,"recipient":0.05,"address":0.05},"286":{"retrieves":0.07692307692307693,"the":0.07692307692307693,"total":0.07692307692307693,"burnchain":0.07692307692307693,"e":0.07692307692307693,"g":0.07692307692307693,"bitcoin":0.07692307692307693,"rewards":0.07692307692307693,"for":0.07692307692307693,"a":0.07692307692307693,"given":0.07692307692307693,"recipient":0.07692307692307693,"address":0.07692307692307693},"287":{"retrieves":0.16666666666666666,"a":0.16666666666666666,"list":0.16666666666666666,"of":0.16666666666666666,"pox":0.16666666666666666,"cycles":0.16666666666666666},"288":{"retrieve":0.125,"information":0.125,"on":0.125,"pox":0.125,"cycles":0.125,"signers":0.125,"and":0.125,"stackers":0.125},"289":{"retrieves":0.125,"details":0.125,"for":0.125,"a":0.125,"signer":0.125,"in":0.125,"pox":0.125,"cycle":0.125},"290":{"retrieves":0.16666666666666666,"details":0.16666666666666666,"for":0.16666666666666666,"a":0.16666666666666666,"pox":0.16666666666666666,"cycle":0.16666666666666666},"291":{"retrieves":0.125,"a":0.125,"list":0.125,"of":0.125,"signers":0.125,"in":0.125,"pox":0.125,"cycle":0.125},"292":{"retrieves":0.1,"a":0.1,"list":0.1,"of":0.1,"stackers":0.1,"for":0.1,"signer":0.1,"in":0.1,"pox":0.1,"cycle":0.1},"293":{"search":0.1111111111111111,"blocks":0.1111111111111111,"transactions":0.1111111111111111,"contracts":0.1111111111111111,"or":0.1111111111111111,"accounts":0.1111111111111111,"by":0.1111111111111111,"hash":0.1111111111111111,"id":0.1111111111111111},"294":{"search":0.16666666666666666,"for":0.16666666666666666,"a":0.16666666666666666,"principal":0.16666666666666666,"by":0.16666666666666666,"id":0.16666666666666666},"295":{"retrieves":0.14285714285714285,"the":0.14285714285714285,"total":0.14285714285714285,"and":0.14285714285714285,"unlocked":0.14285714285714285,"stx":0.14285714285714285,"supply":0.14285714285714285},"296":{"retrieves":0.1111111111111111,"the":0.1111111111111111,"target":0.1111111111111111,"block":0.1111111111111111,"time":0.1111111111111111,"for":0.1111111111111111,"a":0.1111111111111111,"given":0.1111111111111111,"network":0.1111111111111111},"297":{"retrieves":0.125,"the":0.125,"circulating":0.125,"stx":0.125,"supply":0.125,"as":0.125,"plain":0.125,"text":0.125},"298":{"retrieves":0.1111111111111111,"the":0.1111111111111111,"target":0.1111111111111111,"block":0.1111111111111111,"times":0.1111111111111111,"for":0.1111111111111111,"mainnet":0.1111111111111111,"and":0.1111111111111111,"testnet":0.1111111111111111},"299":{"retrieves":0.1111111111111111,"information":0.1111111111111111,"about":0.1111111111111111,"the":0.1111111111111111,"core":0.1111111111111111,"api":0.1111111111111111,"and":0.1111111111111111,"stacks":0.1111111111111111,"network":0.1111111111111111},"300":{"retrieves":0.125,"the":0.125,"total":0.125,"stx":0.125,"supply":0.125,"as":0.125,"plain":0.125,"text":0.125},"301":{"retrieves":0.125,"the":0.125,"running":0.125,"status":0.125,"of":0.125,"stacks":0.125,"blockchain":0.125,"api":0.125},"302":{"0":0.07692307692307693,"1":0.07692307692307693,"retrieves":0.07692307692307693,"the":0.07692307692307693,"total":0.07692307692307693,"and":0.07692307692307693,"unlocked":0.07692307692307693,"stx":0.07692307692307693,"supply":0.07692307692307693,"in":0.07692307692307693,"legacy":0.07692307692307693,"format":0.07692307692307693,"api":0.07692307692307693},"303":{"retrieves":0.08333333333333333,"transactions":0.08333333333333333,"sent":0.08333333333333333,"or":0.08333333333333333,"received":0.08333333333333333,"by":0.08333333333333333,"a":0.08333333333333333,"stx":0.08333333333333333,"address":0.08333333333333333,"smart":0.08333333333333333,"contract":0.08333333333333333,"id":0.08333333333333333},"304":{"retrieves":0.16666666666666666,"events":0.16666666666666666,"for":0.16666666666666666,"a":0.16666666666666666,"specific":0.16666666666666666,"transaction":0.16666666666666666},"305":{"retrieves":0.16666666666666666,"events":0.16666666666666666,"for":0.16666666666666666,"a":0.16666666666666666,"specific":0.16666666666666666,"transaction":0.16666666666666666},"306":{"retrieves":0.07692307692307693,"statistics":0.07692307692307693,"for":0.07692307692307693,"transactions":0.07692307692307693,"in":0.07692307692307693,"the":0.07692307692307693,"mempool":0.07692307692307693,"such":0.07692307692307693,"as":0.07692307692307693,"counts":0.07692307692307693,"ages":0.07692307692307693,"and":0.07692307692307693,"fees":0.07692307692307693},"307":{"manage":0.1111111111111111,"retrieve":0.1111111111111111,"and":0.1111111111111111,"broadcast":0.1111111111111111,"transaction":0.1111111111111111,"data":0.1111111111111111,"on":0.1111111111111111,"the":0.1111111111111111,"blockchain":0.1111111111111111},"308":{"retrieves":0.16666666666666666,"transactions":0.16666666666666666,"for":0.16666666666666666,"a":0.16666666666666666,"specific":0.16666666666666666,"address":0.16666666666666666},"309":{"retrieves":0.09090909090909091,"all":0.09090909090909091,"recently-broadcast":0.09090909090909091,"transactions":0.09090909090909091,"that":0.09090909090909091,"have":0.09090909090909091,"been":0.09090909090909091,"dropped":0.09090909090909091,"from":0.09090909090909091,"the":0.09090909090909091,"mempool":0.09090909090909091},"310":{"retrieves":0.16666666666666666,"details":0.16666666666666666,"for":0.16666666666666666,"a":0.16666666666666666,"specific":0.16666666666666666,"transaction":0.16666666666666666},"311":{"retrieves":0.14285714285714285,"details":0.14285714285714285,"for":0.14285714285714285,"a":0.14285714285714285,"list":0.14285714285714285,"of":0.14285714285714285,"transactions":0.14285714285714285},"312":{"retrieves":0.2,"all":0.2,"recently":0.2,"mined":0.2,"transactions":0.2},"313":{"retrieves":0.0625,"all":0.0625,"transactions":0.0625,"that":0.0625,"have":0.0625,"been":0.0625,"recently":0.0625,"broadcast":0.0625,"to":0.0625,"the":0.0625,"mempool":0.0625,"these":0.0625,"are":0.0625,"pending":0.0625,"awaiting":0.0625,"confirmation":0.0625},"314":{"retrieves":0.14285714285714285,"transactions":0.14285714285714285,"confirmed":0.14285714285714285,"in":0.14285714285714285,"a":0.14285714285714285,"single":0.14285714285714285,"block":0.14285714285714285},"315":{"retrieves":0.1111111111111111,"a":0.1111111111111111,"hex":0.1111111111111111,"encoded":0.1111111111111111,"serialized":0.1111111111111111,"transaction":0.1111111111111111,"for":0.1111111111111111,"given":0.1111111111111111,"id":0.1111111111111111},"316":{"retrieves":0.08333333333333333,"the":0.08333333333333333,"list":0.08333333333333333,"of":0.08333333333333333,"stacking":0.08333333333333333,"pool":0.08333333333333333,"members":0.08333333333333333,"for":0.08333333333333333,"a":0.08333333333333333,"given":0.08333333333333333,"delegator":0.08333333333333333,"principal":0.08333333333333333},"317":{"retrieve":0.08333333333333333,"the":0.08333333333333333,"list":0.08333333333333333,"of":0.08333333333333333,"stacking":0.08333333333333333,"pool":0.08333333333333333,"members":0.08333333333333333,"for":0.08333333333333333,"a":0.08333333333333333,"given":0.08333333333333333,"delegator":0.08333333333333333,"principal":0.08333333333333333},"318":{"distribute":0.16666666666666666,"testnet":0.16666666666666666,"tokens":0.16666666666666666,"to":0.16666666666666666,"specified":0.16666666666666666,"addresses":0.16666666666666666},"319":{"delivers":0.125,"testnet":0.125,"stx":0.125,"tokens":0.125,"to":0.125,"a":0.125,"specified":0.125,"address":0.125},"320":{"retrieves":0.09090909090909091,"transactions":0.09090909090909091,"for":0.09090909090909091,"a":0.09090909090909091,"specific":0.09090909090909091,"account":0.09090909090909091,"including":0.09090909090909091,"stx":0.09090909090909091,"transfers":0.09090909090909091,"each":0.09090909090909091,"transaction":0.09090909090909091},"321":{"retrieves":0.1,"account":0.1,"balance":0.1,"information":0.1,"including":0.1,"stx":0.1,"fungible":0.1,"and":0.1,"non-fungible":0.1,"tokens":0.1},"322":{"retrieves":0.16666666666666666,"transactions":0.16666666666666666,"for":0.16666666666666666,"a":0.16666666666666666,"specific":0.16666666666666666,"account":0.16666666666666666},"323":{"retrieves":0.07142857142857142,"a":0.07142857142857142,"list":0.07142857142857142,"of":0.07142857142857142,"all":0.07142857142857142,"nft":0.07142857142857142,"events":0.07142857142857142,"associated":0.07142857142857142,"with":0.07142857142857142,"an":0.07142857142857142,"account":0.07142857142857142,"or":0.07142857142857142,"contract":0.07142857142857142,"identifier":0.07142857142857142},"324":{"retrieves":0.07142857142857142,"a":0.07142857142857142,"list":0.07142857142857142,"of":0.07142857142857142,"all":0.07142857142857142,"asset":0.07142857142857142,"events":0.07142857142857142,"associated":0.07142857142857142,"with":0.07142857142857142,"an":0.07142857142857142,"account":0.07142857142857142,"or":0.07142857142857142,"contract":0.07142857142857142,"identifier":0.07142857142857142},"325":{"retrieves":0.1,"transaction":0.1,"details":0.1,"for":0.1,"a":0.1,"specific":0.1,"including":0.1,"stx":0.1,"transfers":0.1,"each":0.1},"326":{"retrieves":0.07142857142857142,"the":0.07142857142857142,"latest":0.07142857142857142,"nonce":0.07142857142857142,"values":0.07142857142857142,"used":0.07142857142857142,"by":0.07142857142857142,"an":0.07142857142857142,"account":0.07142857142857142,"inspecting":0.07142857142857142,"mempool":0.07142857142857142,"and":0.07142857142857142,"anchored":0.07142857142857142,"transactions":0.07142857142857142},"327":{"retrieves":0.08333333333333333,"the":0.08333333333333333,"stx":0.08333333333333333,"token":0.08333333333333333,"balance":0.08333333333333333,"for":0.08333333333333333,"a":0.08333333333333333,"specified":0.08333333333333333,"address":0.08333333333333333,"or":0.08333333333333333,"contract":0.08333333333333333,"identifier":0.08333333333333333},"328":{"retrieves":0.08333333333333333,"a":0.08333333333333333,"list":0.08333333333333333,"of":0.08333333333333333,"stx":0.08333333333333333,"transfers":0.08333333333333333,"with":0.08333333333333333,"memos":0.08333333333333333,"to":0.08333333333333333,"the":0.08333333333333333,"given":0.08333333333333333,"principal":0.08333333333333333},"329":{"retrieves":0.07692307692307693,"a":0.07692307692307693,"list":0.07692307692307693,"of":0.07692307692307693,"events":0.07692307692307693,"that":0.07692307692307693,"have":0.07692307692307693,"been":0.07692307692307693,"triggered":0.07692307692307693,"by":0.07692307692307693,"given":0.07692307692307693,"smart":0.07692307692307693,"contract":0.07692307692307693},"330":{"retrieves":0.045454545454545456,"a":0.045454545454545456,"list":0.045454545454545456,"of":0.045454545454545456,"contracts":0.045454545454545456,"based":0.045454545454545456,"on":0.045454545454545456,"the":0.045454545454545456,"following":0.045454545454545456,"traits":0.045454545454545456,"listed":0.045454545454545456,"in":0.045454545454545456,"json":0.045454545454545456,"format":0.045454545454545456,"-":0.045454545454545456,"functions":0.045454545454545456,"variables":0.045454545454545456,"maps":0.045454545454545456,"fungible":0.045454545454545456,"tokens":0.045454545454545456,"and":0.045454545454545456,"non-fungible":0.045454545454545456},"331":{"provide":0.125,"information":0.125,"and":0.125,"facilitate":0.125,"interactions":0.125,"with":0.125,"smart":0.125,"contracts":0.125},"332":{"retrieves":0.14285714285714285,"details":0.14285714285714285,"for":0.14285714285714285,"a":0.14285714285714285,"specific":0.14285714285714285,"smart":0.14285714285714285,"contract":0.14285714285714285},"333":{"retrieves":0.125,"the":0.125,"deployment":0.125,"status":0.125,"of":0.125,"multiple":0.125,"smart":0.125,"contracts":0.125},"334":{"retrieve":0.1,"information":0.1,"around":0.1,"transaction":0.1,"fees":0.1,"and":0.1,"priorities":0.1,"in":0.1,"the":0.1,"mempool":0.1},"335":{"retrieves":0.05,"estimated":0.05,"fee":0.05,"priorities":0.05,"in":0.05,"micro-stx":0.05,"for":0.05,"all":0.05,"transactions":0.05,"that":0.05,"are":0.05,"currently":0.05,"the":0.05,"mempool":0.05,"also":0.05,"returns":0.05,"separated":0.05,"by":0.05,"transaction":0.05,"type":0.05},"336":{"retrieves":0.2,"a":0.2,"single":0.2,"burn":0.2,"block":0.2},"337":{"retrieve":0.16666666666666666,"information":0.16666666666666666,"about":0.16666666666666666,"specific":0.16666666666666666,"burned":0.16666666666666666,"blocks":0.16666666666666666},"338":{"retrieves":0.14285714285714285,"a":0.14285714285714285,"list":0.14285714285714285,"of":0.14285714285714285,"recent":0.14285714285714285,"burn":0.14285714285714285,"blocks":0.14285714285714285},"339":{"read-only":0.16666666666666666,"endpoints":0.16666666666666666,"to":0.16666666666666666,"obtain":0.16666666666666666,"token":0.16666666666666666,"details":0.16666666666666666},"340":{"retrieves":0.09090909090909091,"the":0.09090909090909091,"list":0.09090909090909091,"of":0.09090909090909091,"fungible":0.09090909090909091,"token":0.09090909090909091,"holders":0.09090909090909091,"for":0.09090909090909091,"a":0.09090909090909091,"given":0.09090909090909091,"id":0.09090909090909091},"341":{"read-only":0.14285714285714285,"endpoints":0.14285714285714285,"to":0.14285714285714285,"obtain":0.14285714285714285,"non-fungible":0.14285714285714285,"token":0.14285714285714285,"details":0.14285714285714285},"342":{"retrieves":0.058823529411764705,"a":0.058823529411764705,"list":0.058823529411764705,"of":0.058823529411764705,"non-fungible":0.058823529411764705,"tokens":0.058823529411764705,"owned":0.058823529411764705,"by":0.058823529411764705,"the":0.058823529411764705,"given":0.058823529411764705,"principal":0.058823529411764705,"stx":0.058823529411764705,"address":0.058823529411764705,"or":0.058823529411764705,"smart":0.058823529411764705,"contract":0.058823529411764705,"id":0.058823529411764705},"343":{"retrieves":0.09090909090909091,"a":0.09090909090909091,"list":0.09090909090909091,"of":0.09090909090909091,"non-fungible":0.09090909090909091,"token":0.09090909090909091,"mints":0.09090909090909091,"for":0.09090909090909091,"given":0.09090909090909091,"asset":0.09090909090909091,"identifier":0.09090909090909091},"344":{"retrieves":0.14285714285714285,"the":0.14285714285714285,"history":0.14285714285714285,"of":0.14285714285714285,"a":0.14285714285714285,"non-fungible":0.14285714285714285,"token":0.14285714285714285},"345":{"get":0.2,"started":0.2,"with":0.2,"hiro":0.2,"apis":0.2},"346":{"understand":0.16666666666666666,"proof":0.16666666666666666,"requests":0.16666666666666666,"from":0.16666666666666666,"api":0.16666666666666666,"endpoints":0.16666666666666666},"347":{"set":0.14285714285714285,"up":0.14285714285714285,"your":0.14285714285714285,"development":0.14285714285714285,"environment":0.14285714285714285,"for":0.14285714285714285,"stacks":0.14285714285714285},"348":{"setup":0.1,"and":0.1,"configure":0.1,"testing":0.1,"environments":0.1,"for":0.1,"your":0.1,"clarity":0.1,"smart":0.1,"contracts":0.1},"349":{"build":0.2,"your":0.2,"blockchain":0.2,"on":0.2,"stacks":0.2},"350":{"a":0.08333333333333333,"javascript":0.08333333333333333,"library":0.08333333333333333,"for":0.08333333333333333,"authenticating":0.08333333333333333,"users":0.08333333333333333,"as":0.08333333333333333,"well":0.08333333333333333,"signing":0.08333333333333333,"transactions":0.08333333333333333,"and":0.08333333333333333,"messages":0.08333333333333333},"351":{"compatibility":0.16666666666666666,"information":0.16666666666666666,"for":0.16666666666666666,"different":0.16666666666666666,"wallet":0.16666666666666666,"providers":0.16666666666666666},"352":{"connect":0.1,"to":0.1,"user":0.1,"wallets":0.1,"and":0.1,"authenticate":0.1,"your":0.1,"users":0.1,"using":0.1,"stacks":0.1},"353":{"prompt":0.09090909090909091,"users":0.09090909090909091,"to":0.09090909090909091,"sign":0.09090909090909091,"transactions":0.09090909090909091,"and":0.09090909090909091,"broadcast":0.09090909090909091,"them":0.09090909090909091,"the":0.09090909090909091,"stacks":0.09090909090909091,"blockchain":0.09090909090909091},"354":{"prompt":0.06666666666666667,"users":0.06666666666666667,"to":0.06666666666666667,"sign":0.06666666666666667,"a":0.06666666666666667,"message":0.06666666666666667,"prove":0.06666666666666667,"they":0.06666666666666667,"control":0.06666666666666667,"an":0.06666666666666667,"address":0.06666666666666667,"or":0.06666666666666667,"authorize":0.06666666666666667,"in-app":0.06666666666666667,"action":0.06666666666666667},"355":{"how":0.1,"to":0.1,"migrate":0.1,"from":0.1,"v7":0.1,"x":0.1,"v8":0.1,"of":0.1,"stacks":0.1,"connect":0.1},"356":{"connect":0.08333333333333333,"is":0.08333333333333333,"a":0.08333333333333333,"javascript":0.08333333333333333,"library":0.08333333333333333,"for":0.08333333333333333,"building":0.08333333333333333,"web":0.08333333333333333,"applications":0.08333333333333333,"connected":0.08333333333333333,"to":0.08333333333333333,"stacks":0.08333333333333333},"357":{"learn":0.07692307692307693,"how":0.07692307692307693,"to":0.07692307692307693,"transfer":0.07692307692307693,"stx":0.07692307692307693,"tokens":0.07692307692307693,"via":0.07692307692307693,"a":0.07692307692307693,"web":0.07692307692307693,"wallet":0.07692307692307693,"using":0.07692307692307693,"stacks":0.07692307692307693,"connect":0.07692307692307693},"358":{"the":0.05263157894736842,"simnet":0.05263157894736842,"class":0.05263157894736842,"is":0.05263157894736842,"main":0.05263157894736842,"entry":0.05263157894736842,"point":0.05263157894736842,"for":0.05263157894736842,"clarinet":0.05263157894736842,"js":0.05263157894736842,"sdk":0.05263157894736842,"it":0.05263157894736842,"provides":0.05263157894736842,"properties":0.05263157894736842,"and":0.05263157894736842,"methods":0.05263157894736842,"interacting":0.05263157894736842,"with":0.05263157894736842,"network":0.05263157894736842},"359":{"the":0.07142857142857142,"clarinet":0.07142857142857142,"js":0.07142857142857142,"sdk":0.07142857142857142,"provides":0.07142857142857142,"properties":0.07142857142857142,"that":0.07142857142857142,"can":0.07142857142857142,"be":0.07142857142857142,"used":0.07142857142857142,"to":0.07142857142857142,"interact":0.07142857142857142,"with":0.07142857142857142,"simnet":0.07142857142857142},"360":{"a":0.05,"set":0.05,"of":0.05,"vitest":0.05,"matchers":0.05,"that":0.05,"can":0.05,"be":0.05,"used":0.05,"to":0.05,"make":0.05,"assertions":0.05,"on":0.05,"clarity":0.05,"values":0.05,"with":0.05,"the":0.05,"clarinet":0.05,"js":0.05,"sdk":0.05},"361":{"the":0.06666666666666667,"clarinet":0.06666666666666667,"js":0.06666666666666667,"sdk":0.06666666666666667,"provides":0.06666666666666667,"several":0.06666666666666667,"methods":0.06666666666666667,"that":0.06666666666666667,"can":0.06666666666666667,"be":0.06666666666666667,"used":0.06666666666666667,"to":0.06666666666666667,"interact":0.06666666666666667,"with":0.06666666666666667,"simnet":0.06666666666666667},"362":{"the":0.0625,"main":0.0625,"entry":0.0625,"point":0.0625,"for":0.0625,"clarinet":0.0625,"js":0.0625,"sdk":0.0625,"it":0.0625,"provides":0.0625,"properties":0.0625,"and":0.0625,"methods":0.0625,"interacting":0.0625,"with":0.0625,"network":0.0625},"363":{"the":0.09090909090909091,"clarinet":0.09090909090909091,"cli":0.09090909090909091,"is":0.09090909090909091,"a":0.09090909090909091,"command-line":0.09090909090909091,"tool":0.09090909090909091,"for":0.09090909090909091,"interacting":0.09090909090909091,"with":0.09090909090909091,"network":0.09090909090909091},"364":{"the":0.08333333333333333,"stacks":0.08333333333333333,"js":0.08333333333333333,"cli":0.08333333333333333,"is":0.08333333333333333,"a":0.08333333333333333,"command-line":0.08333333333333333,"tool":0.08333333333333333,"for":0.08333333333333333,"creating":0.08333333333333333,"new":0.08333333333333333,"projects":0.08333333333333333},"365":{"interact":0.1,"with":0.1,"the":0.1,"stacks":0.1,"blockchain":0.1,"using":0.1,"a":0.1,"javascript":0.1,"client":0.1,"library":0.1},"366":{"connect":0.08333333333333333,"is":0.08333333333333333,"a":0.08333333333333333,"javascript":0.08333333333333333,"library":0.08333333333333333,"for":0.08333333333333333,"building":0.08333333333333333,"web":0.08333333333333333,"applications":0.08333333333333333,"connected":0.08333333333333333,"to":0.08333333333333333,"stacks":0.08333333333333333},"367":{"a":0.1111111111111111,"js":0.1111111111111111,"ts":0.1111111111111111,"helper":0.1111111111111111,"package":0.1111111111111111,"for":0.1111111111111111,"interacting":0.1111111111111111,"with":0.1111111111111111,"sbtc":0.1111111111111111},"368":{"construct":0.07692307692307693,"decode":0.07692307692307693,"transactions":0.07692307692307693,"and":0.07692307692307693,"work":0.07692307692307693,"with":0.07692307692307693,"clarity":0.07692307692307693,"smart":0.07692307692307693,"contracts":0.07692307692307693,"on":0.07692307692307693,"the":0.07692307692307693,"stacks":0.07692307692307693,"blockchain":0.07692307692307693},"369":{"network":0.1,"and":0.1,"api":0.1,"library":0.1,"for":0.1,"working":0.1,"with":0.1,"stacks":0.1,"blockchain":0.1,"nodes":0.1},"370":{"common":0.16666666666666666,"utilities":0.16666666666666666,"for":0.16666666666666666,"working":0.16666666666666666,"with":0.16666666666666666,"stacks":0.16666666666666666},"371":{"reference":0.16666666666666666,"guide":0.16666666666666666,"for":0.16666666666666666,"available":0.16666666666666666,"scopes":0.16666666666666666,"bitcoin":0.16666666666666666},"372":{"reference":0.16666666666666666,"guide":0.16666666666666666,"for":0.16666666666666666,"available":0.16666666666666666,"scopes":0.16666666666666666,"stacks":0.16666666666666666},"373":{"chainhook":0.045454545454545456,"enables":0.045454545454545456,"you":0.045454545454545456,"to":0.045454545454545456,"target":0.045454545454545456,"events":0.045454545454545456,"on":0.045454545454545456,"the":0.045454545454545456,"bitcoin":0.045454545454545456,"and":0.045454545454545456,"stacks":0.045454545454545456,"blockchain":0.045454545454545456,"important":0.045454545454545456,"your":0.045454545454545456,"use":0.045454545454545456,"case":0.045454545454545456,"in":0.045454545454545456,"order":0.045454545454545456,"trigger":0.045454545454545456,"actions":0.045454545454545456,"based":0.045454545454545456,"those":0.045454545454545456},"374":{"learn":0.0625,"how":0.0625,"to":0.0625,"run":0.0625,"chainhook":0.0625,"as":0.0625,"a":0.0625,"service":0.0625,"with":0.0625,"stacks":0.0625,"node":0.0625,"evaluate":0.0625,"blocks":0.0625,"against":0.0625,"your":0.0625,"predicates":0.0625},"375":{"learn":0.14285714285714285,"how":0.14285714285714285,"to":0.14285714285714285,"register":0.14285714285714285,"chainhooks":0.14285714285714285,"on":0.14285714285714285,"devnet":0.14285714285714285},"376":{"learn":0.047619047619047616,"how":0.047619047619047616,"to":0.047619047619047616,"run":0.047619047619047616,"chainhook":0.047619047619047616,"as":0.047619047619047616,"a":0.047619047619047616,"service":0.047619047619047616,"evaluate":0.047619047619047616,"your":0.047619047619047616,"if":0.047619047619047616,"this":0.047619047619047616,"then":0.047619047619047616,"that":0.047619047619047616,"predicates":0.047619047619047616,"against":0.047619047619047616,"the":0.047619047619047616,"bitcoin":0.047619047619047616,"and":0.047619047619047616,"stacks":0.047619047619047616,"blockchains":0.047619047619047616},"377":{"learn":0.08333333333333333,"how":0.08333333333333333,"to":0.08333333333333333,"use":0.08333333333333333,"chainhook":0.08333333333333333,"observe":0.08333333333333333,"a":0.08333333333333333,"function":0.08333333333333333,"call":0.08333333333333333,"for":0.08333333333333333,"voting":0.08333333333333333,"contract":0.08333333333333333},"378":{"learn":0.1,"how":0.1,"to":0.1,"scan":0.1,"the":0.1,"stacks":0.1,"blockchain":0.1,"for":0.1,"stx":0.1,"transactions":0.1},"379":{"predicates":0.14285714285714285,"are":0.14285714285714285,"the":0.14285714285714285,"building":0.14285714285714285,"blocks":0.14285714285714285,"of":0.14285714285714285,"chainhook":0.14285714285714285},"380":{"chainhook":0.05555555555555555,"is":0.05555555555555555,"a":0.05555555555555555,"cli":0.05555555555555555,"tool":0.05555555555555555,"that":0.05555555555555555,"allows":0.05555555555555555,"you":0.05555555555555555,"to":0.05555555555555555,"create":0.05555555555555555,"event":0.05555555555555555,"streams":0.05555555555555555,"for":0.05555555555555555,"your":0.05555555555555555,"stacks":0.05555555555555555,"and":0.05555555555555555,"bitcoin":0.05555555555555555,"nodes":0.05555555555555555},"381":{"the":0.07692307692307693,"following":0.07692307692307693,"guides":0.07692307692307693,"cover":0.07692307692307693,"ways":0.07692307692307693,"to":0.07692307692307693,"use":0.07692307692307693,"hiro":0.07692307692307693,"tools":0.07692307692307693,"build":0.07692307692307693,"apps":0.07692307692307693,"on":0.07692307692307693,"stacks":0.07692307692307693},"382":{"stream":0.5,"events":0.5},"383":{"integrate":0.25,"with":0.25,"a":0.25,"wallet":0.25},"384":{"build":0.16666666666666666,"your":0.16666666666666666,"app":0.16666666666666666,"with":0.16666666666666666,"a":0.16666666666666666,"template":0.16666666666666666},"385":{"mint":0.3333333333333333,"an":0.3333333333333333,"nft":0.3333333333333333},"386":{"build":0.16666666666666666,"your":0.16666666666666666,"contract":0.16666666666666666,"with":0.16666666666666666,"a":0.16666666666666666,"template":0.16666666666666666},"387":{"transfer":0.5,"tokens":0.5},"388":{"get":0.25,"block":0.25,"proposal":0.25,"information":0.25},"389":{"validate":0.2,"a":0.2,"proposed":0.2,"stacks":0.2,"block":0.2},"390":{"retrieves":0.25,"proof-of-transfer":0.25,"pox":0.25,"information":0.25},"391":{"retrieves":0.1,"stacker":0.1,"and":0.1,"signer":0.1,"set":0.1,"information":0.1,"for":0.1,"a":0.1,"given":0.1,"cycle":0.1},"392":{"retrieves":0.25,"proof-of-transfer":0.25,"pox":0.25,"information":0.25},"393":{"retrieves":0.16666666666666666,"the":0.16666666666666666,"price":0.16666666666666666,"of":0.16666666666666666,"a":0.16666666666666666,"namespace":0.16666666666666666},"394":{"manages":0.1,"and":0.1,"retrieve":0.1,"information":0.1,"on":0.1,"blockchain":0.1,"namespaces":0.1,"names":0.1,"related":0.1,"details":0.1},"395":{"retrieves":0.16666666666666666,"the":0.16666666666666666,"price":0.16666666666666666,"of":0.16666666666666666,"a":0.16666666666666666,"name":0.16666666666666666},"396":{"get":0.125,"an":0.125,"estimated":0.125,"fee":0.125,"for":0.125,"the":0.125,"supplied":0.125,"transaction":0.125},"397":{"provide":0.1111111111111111,"estimates":0.1111111111111111,"rates":0.1111111111111111,"and":0.1111111111111111,"approximate":0.1111111111111111,"calculations":0.1111111111111111,"for":0.1111111111111111,"transaction":0.1111111111111111,"costs":0.1111111111111111},"398":{"retrieves":0.1111111111111111,"an":0.1111111111111111,"estimated":0.1111111111111111,"fee":0.1111111111111111,"rate":0.1111111111111111,"for":0.1111111111111111,"stx":0.1111111111111111,"transfer":0.1111111111111111,"transactions":0.1111111111111111},"399":{"query":0.05263157894736842,"the":0.05263157894736842,"stacks":0.05263157894736842,"node":0.05263157894736842,"rpc":0.05263157894736842,"api":0.05263157894736842,"interact":0.05263157894736842,"with":0.05263157894736842,"smart":0.05263157894736842,"contracts":0.05263157894736842,"and":0.05263157894736842,"broadcast":0.05263157894736842,"transactions":0.05263157894736842,"all":0.05263157894736842,"via":0.05263157894736842,"a":0.05263157894736842,"familiar":0.05263157894736842,"rest":0.05263157894736842,"interface":0.05263157894736842},"400":{"retrieves":0.1111111111111111,"information":0.1111111111111111,"about":0.1111111111111111,"the":0.1111111111111111,"core":0.1111111111111111,"api":0.1111111111111111,"and":0.1111111111111111,"stacks":0.1111111111111111,"network":0.1111111111111111},"401":{"retrieves":0.1111111111111111,"information":0.1111111111111111,"about":0.1111111111111111,"the":0.1111111111111111,"core":0.1111111111111111,"api":0.1111111111111111,"including":0.1111111111111111,"server":0.1111111111111111,"version":0.1111111111111111},"402":{"broadcasts":0.16666666666666666,"raw":0.16666666666666666,"transactions":0.16666666666666666,"on":0.16666666666666666,"the":0.16666666666666666,"network":0.16666666666666666},"403":{"manage":0.1111111111111111,"retrieve":0.1111111111111111,"and":0.1111111111111111,"broadcast":0.1111111111111111,"transaction":0.1111111111111111,"data":0.1111111111111111,"on":0.1111111111111111,"the":0.1111111111111111,"blockchain":0.1111111111111111},"404":{"get":0.3333333333333333,"account":0.3333333333333333,"information":0.3333333333333333},"405":{"retrieves":0.1,"the":0.1,"account":0.1,"data":0.1,"for":0.1,"a":0.1,"given":0.1,"or":0.1,"contract":0.1,"identifier":0.1},"406":{"3":0.16666666666666666,"version":0.16666666666666666,"of":0.16666666666666666,"the":0.16666666666666666,"rpc":0.16666666666666666,"api":0.16666666666666666},"407":{"fetch":0.14285714285714285,"metadata":0.14285714285714285,"about":0.14285714285714285,"the":0.14285714285714285,"ongoing":0.14285714285714285,"nakamoto":0.14285714285714285,"tenure":0.14285714285714285},"408":{"fetch":0.125,"a":0.125,"nakamoto":0.125,"block":0.125,"by":0.125,"its":0.125,"index":0.125,"hash":0.125},"409":{"fetch":0.125,"a":0.125,"sequence":0.125,"of":0.125,"nakamoto":0.125,"blocks":0.125,"in":0.125,"tenure":0.125},"410":{"retrieves":0.06666666666666667,"a":0.06666666666666667,"list":0.06666666666666667,"of":0.06666666666666667,"functions":0.06666666666666667,"variables":0.06666666666666667,"maps":0.06666666666666667,"fungible":0.06666666666666667,"tokens":0.06666666666666667,"and":0.06666666666666667,"non-fungible":0.06666666666666667,"for":0.06666666666666667,"given":0.06666666666666667,"smart":0.06666666666666667,"contract":0.06666666666666667},"411":{"determine":0.06666666666666667,"whether":0.06666666666666667,"or":0.06666666666666667,"not":0.06666666666666667,"a":0.06666666666666667,"specified":0.06666666666666667,"trait":0.06666666666666667,"is":0.06666666666666667,"implemented":0.06666666666666667,"either":0.06666666666666667,"explicitly":0.06666666666666667,"implicitly":0.06666666666666667,"within":0.06666666666666667,"given":0.06666666666666667,"contract":0.06666666666666667},"412":{"provide":0.125,"information":0.125,"and":0.125,"facilitate":0.125,"interactions":0.125,"with":0.125,"smart":0.125,"contracts":0.125},"413":{"retrieves":0.125,"a":0.125,"specific":0.125,"entry":0.125,"from":0.125,"contract":0.125,"data":0.125,"map":0.125},"414":{"calls":0.1111111111111111,"a":0.1111111111111111,"read-only":0.1111111111111111,"public":0.1111111111111111,"function":0.1111111111111111,"on":0.1111111111111111,"given":0.1111111111111111,"smart":0.1111111111111111,"contract":0.1111111111111111},"415":{"retrieves":0.045454545454545456,"the":0.045454545454545456,"clarity":0.045454545454545456,"source":0.045454545454545456,"code":0.045454545454545456,"of":0.045454545454545456,"a":0.045454545454545456,"given":0.045454545454545456,"contract":0.045454545454545456,"along":0.045454545454545456,"with":0.045454545454545456,"block":0.045454545454545456,"height":0.045454545454545456,"it":0.045454545454545456,"was":0.045454545454545456,"published":0.045454545454545456,"in":0.045454545454545456,"and":0.045454545454545456,"marf":0.045454545454545456,"proof":0.045454545454545456,"for":0.045454545454545456,"data":0.045454545454545456},"416":{"get":0.125,"the":0.125,"value":0.125,"of":0.125,"a":0.125,"constant":0.125,"inside":0.125,"contract":0.125},"417":{"get":0.1,"burn":0.1,"operations":0.1,"of":0.1,"type":0.1,"op_type":0.1,"successfully":0.1,"read":0.1,"at":0.1,"burn_height":0.1},"418":{"get":0.09090909090909091,"all":0.09090909090909091,"burn":0.09090909090909091,"operations":0.09090909090909091,"of":0.09090909090909091,"type":0.09090909090909091,"op_type":0.09090909090909091,"successfully":0.09090909090909091,"read":0.09090909090909091,"at":0.09090909090909091,"burn_height":0.09090909090909091},"419":{"learn":0.125,"how":0.125,"to":0.125,"contribute":0.125,"hiro's":0.125,"documentation":0.125,"and":0.125,"content":0.125},"420":{"the":0.06666666666666667,"following":0.06666666666666667,"guides":0.06666666666666667,"cover":0.06666666666666667,"ways":0.06666666666666667,"to":0.06666666666666667,"use":0.06666666666666667,"hiro":0.06666666666666667,"tools":0.06666666666666667,"build":0.06666666666666667,"with":0.06666666666666667,"ordinals":0.06666666666666667,"brc-20":0.06666666666666667,"and":0.06666666666666667,"runes":0.06666666666666667},"421":{"understand":0.1,"the":0.1,"rate":0.1,"limits":0.1,"for":0.1,"hiro":0.1,"apis":0.1,"and":0.1,"stx":0.1,"faucet":0.1},"422":{"runehook":0.047619047619047616,"enables":0.047619047619047616,"you":0.047619047619047616,"to":0.047619047619047616,"build":0.047619047619047616,"rune":0.047619047619047616,"event":0.047619047619047616,"streams":0.047619047619047616,"so":0.047619047619047616,"can":0.047619047619047616,"create":0.047619047619047616,"accurate":0.047619047619047616,"lightweight":0.047619047619047616,"databases":0.047619047619047616,"that":0.047619047619047616,"gracefully":0.047619047619047616,"handle":0.047619047619047616,"bitcoin":0.047619047619047616,"forks":0.047619047619047616,"and":0.047619047619047616,"reorgs":0.047619047619047616},"423":{"learn":0.1,"how":0.1,"to":0.1,"scan":0.1,"the":0.1,"bitcoin":0.1,"blockchain":0.1,"for":0.1,"runes":0.1,"activity":0.1},"424":{"runehook":0.05263157894736842,"was":0.05263157894736842,"developed":0.05263157894736842,"to":0.05263157894736842,"be":0.05263157894736842,"environment-agnostic":0.05263157894736842,"below":0.05263157894736842,"are":0.05263157894736842,"the":0.05263157894736842,"different":0.05263157894736842,"ways":0.05263157894736842,"install":0.05263157894736842,"and":0.05263157894736842,"build":0.05263157894736842,"bitcoin":0.05263157894736842,"indexer":0.05263157894736842,"on":0.05263157894736842,"your":0.05263157894736842,"machine":0.05263157894736842},"425":{"explore":0.125,"and":0.125,"verify":0.125,"ordinals":0.125,"brc-20":0.125,"data":0.125,"on":0.125,"bitcoin":0.125},"426":{},"427":{"the":0.0625,"runes":0.0625,"api":0.0625,"provides":0.0625,"you":0.0625,"with":0.0625,"fast":0.0625,"reliable":0.0625,"data":0.0625,"for":0.0625,"bitcoin":0.0625,"via":0.0625,"an":0.0625,"easy-to-use":0.0625,"rest":0.0625,"interface":0.0625},"428":{"retrieves":0.14285714285714285,"information":0.14285714285714285,"about":0.14285714285714285,"the":0.14285714285714285,"rune":0.14285714285714285,"api":0.14285714285714285,"status":0.14285714285714285},"429":{"retrieves":0.2,"the":0.2,"status":0.2,"of":0.2,"api":0.2},"430":{"retrieves":0.14285714285714285,"a":0.14285714285714285,"paginated":0.14285714285714285,"list":0.14285714285714285,"of":0.14285714285714285,"address":0.14285714285714285,"balances":0.14285714285714285},"431":{"retrieves":0.2,"information":0.2,"about":0.2,"rune":0.2,"balances":0.2},"432":{"retrieves":0.14285714285714285,"holder":0.14285714285714285,"balance":0.14285714285714285,"for":0.14285714285714285,"a":0.14285714285714285,"specific":0.14285714285714285,"rune":0.14285714285714285},"433":{"retrieves":0.125,"a":0.125,"paginated":0.125,"list":0.125,"of":0.125,"holders":0.125,"for":0.125,"rune":0.125},"434":{"retrieves":0.2,"information":0.2,"about":0.2,"rune":0.2,"activities":0.2},"435":{"retrieves":0.1111111111111111,"a":0.1111111111111111,"paginated":0.1111111111111111,"list":0.1111111111111111,"of":0.1111111111111111,"rune":0.1111111111111111,"activity":0.1111111111111111,"for":0.1111111111111111,"transaction":0.1111111111111111},"436":{"retrieves":0.125,"all":0.125,"rune":0.125,"activity":0.125,"for":0.125,"a":0.125,"bitcoin":0.125,"address":0.125},"437":{"retrieves":0.1111111111111111,"a":0.1111111111111111,"paginated":0.1111111111111111,"list":0.1111111111111111,"of":0.1111111111111111,"rune":0.1111111111111111,"activity":0.1111111111111111,"for":0.1111111111111111,"block":0.1111111111111111},"438":{"retrieves":0.16666666666666666,"all":0.16666666666666666,"activity":0.16666666666666666,"for":0.16666666666666666,"a":0.16666666666666666,"rune":0.16666666666666666},"439":{"2":0.1111111111111111,"create":0.1111111111111111,"your":0.1111111111111111,"first":0.1111111111111111,"project":0.1111111111111111,"in":0.1111111111111111,"less":0.1111111111111111,"than":0.1111111111111111,"minutes":0.1111111111111111},"440":{"retrieves":0.2,"information":0.2,"about":0.2,"rune":0.2,"etchings":0.2},"441":{"retrieves":0.14285714285714285,"a":0.14285714285714285,"paginated":0.14285714285714285,"list":0.14285714285714285,"of":0.14285714285714285,"rune":0.14285714285714285,"etchings":0.14285714285714285},"442":{"retrieves":0.16666666666666666,"information":0.16666666666666666,"for":0.16666666666666666,"a":0.16666666666666666,"rune":0.16666666666666666,"etching":0.16666666666666666},"443":{"explore":0.125,"and":0.125,"verify":0.125,"ordinals":0.125,"brc-20":0.125,"data":0.125,"on":0.125,"bitcoin":0.125},"444":{},"445":{"retrieves":0.1111111111111111,"stats":0.1111111111111111,"on":0.1111111111111111,"the":0.1111111111111111,"number":0.1111111111111111,"of":0.1111111111111111,"inscriptions":0.1111111111111111,"per":0.1111111111111111,"block":0.1111111111111111},"446":{"retrieves":0.1,"statistics":0.1,"on":0.1,"the":0.1,"number":0.1,"of":0.1,"inscriptions":0.1,"revealed":0.1,"per":0.1,"block":0.1},"447":{"retrieves":0.08333333333333333,"a":0.08333333333333333,"list":0.08333333333333333,"of":0.08333333333333333,"holders":0.08333333333333333,"and":0.08333333333333333,"their":0.08333333333333333,"balances":0.08333333333333333,"for":0.08333333333333333,"particular":0.08333333333333333,"brc-20":0.08333333333333333,"token":0.08333333333333333},"448":{"retrieves":0.2,"information":0.2,"about":0.2,"brc-20":0.2,"tokens":0.2},"449":{"retrieves":0.125,"brc-20":0.125,"token":0.125,"balances":0.125,"for":0.125,"a":0.125,"bitcoin":0.125,"address":0.125},"450":{"retrieves":0.1,"information":0.1,"for":0.1,"a":0.1,"brc-20":0.1,"token":0.1,"including":0.1,"supply":0.1,"and":0.1,"holders":0.1},"451":{"retrieves":0.2,"information":0.2,"for":0.2,"brc-20":0.2,"tokens":0.2},"452":{"retrieves":0.09090909090909091,"brc-20":0.09090909090909091,"activity":0.09090909090909091,"filtered":0.09090909090909091,"by":0.09090909090909091,"ticker":0.09090909090909091,"address":0.09090909090909091,"operation":0.09090909090909091,"or":0.09090909090909091,"block":0.09090909090909091,"height":0.09090909090909091},"453":{"retrieves":0.2,"information":0.2,"about":0.2,"ordinals":0.2,"inscriptions":0.2},"454":{"retrieves":0.14285714285714285,"all":0.14285714285714285,"transfers":0.14285714285714285,"for":0.14285714285714285,"a":0.14285714285714285,"single":0.14285714285714285,"inscription":0.14285714285714285},"455":{"retrieves":0.08333333333333333,"a":0.08333333333333333,"list":0.08333333333333333,"of":0.08333333333333333,"inscriptions":0.08333333333333333,"with":0.08333333333333333,"options":0.08333333333333333,"to":0.08333333333333333,"filter":0.08333333333333333,"and":0.08333333333333333,"sort":0.08333333333333333,"results":0.08333333333333333},"456":{"retrieves":0.14285714285714285,"the":0.14285714285714285,"content":0.14285714285714285,"of":0.14285714285714285,"a":0.14285714285714285,"single":0.14285714285714285,"inscription":0.14285714285714285},"457":{"retrieves":0.08333333333333333,"a":0.08333333333333333,"list":0.08333333333333333,"of":0.08333333333333333,"inscription":0.08333333333333333,"transfers":0.08333333333333333,"that":0.08333333333333333,"ocurred":0.08333333333333333,"at":0.08333333333333333,"specific":0.08333333333333333,"bitcoin":0.08333333333333333,"block":0.08333333333333333},"458":{"retrieves":0.25,"a":0.25,"single":0.25,"inscription":0.25},"459":{"the":0.05263157894736842,"ordinals":0.05263157894736842,"api":0.05263157894736842,"provides":0.05263157894736842,"you":0.05263157894736842,"with":0.05263157894736842,"fast":0.05263157894736842,"reliable":0.05263157894736842,"data":0.05263157894736842,"for":0.05263157894736842,"bitcoin":0.05263157894736842,"and":0.05263157894736842,"brc-20":0.05263157894736842,"tokens":0.05263157894736842,"via":0.05263157894736842,"an":0.05263157894736842,"easy-to-use":0.05263157894736842,"rest":0.05263157894736842,"interface":0.05263157894736842},"460":{"retrieves":0.1,"information":0.1,"about":0.1,"the":0.1,"ordinals":0.1,"api":0.1,"status":0.1,"including":0.1,"server":0.1,"version":0.1},"461":{"retrieves":0.14285714285714285,"the":0.14285714285714285,"running":0.14285714285714285,"status":0.14285714285714285,"of":0.14285714285714285,"ordinals":0.14285714285714285,"api":0.14285714285714285},"462":{"2":0.1111111111111111,"create":0.1111111111111111,"your":0.1111111111111111,"first":0.1111111111111111,"project":0.1111111111111111,"in":0.1111111111111111,"less":0.1111111111111111,"than":0.1111111111111111,"minutes":0.1111111111111111},"463":{"retrieves":0.2,"ordinal":0.2,"information":0.2,"for":0.2,"satoshis":0.2},"464":{"retrieves":0.14285714285714285,"ordinal":0.14285714285714285,"information":0.14285714285714285,"for":0.14285714285714285,"a":0.14285714285714285,"single":0.14285714285714285,"satoshi":0.14285714285714285},"465":{"retrieves":0.125,"all":0.125,"inscriptions":0.125,"associated":0.125,"with":0.125,"a":0.125,"single":0.125,"satoshi":0.125},"466":{},"467":{"for":0.09090909090909091,"developers":0.09090909090909091,"who":0.09090909090909091,"need":0.09090909090909091,"api":0.09090909090909091,"requests":0.09090909090909091,"beyond":0.09090909090909091,"the":0.09090909090909091,"standard":0.09090909090909091,"rate":0.09090909090909091,"limits":0.09090909090909091},"468":{"retrieves":0.14285714285714285,"information":0.14285714285714285,"about":0.14285714285714285,"the":0.14285714285714285,"rune":0.14285714285714285,"api":0.14285714285714285,"status":0.14285714285714285},"469":{"retrieves":0.2,"the":0.2,"status":0.2,"of":0.2,"api":0.2},"470":{"retrieves":0.14285714285714285,"a":0.14285714285714285,"paginated":0.14285714285714285,"list":0.14285714285714285,"of":0.14285714285714285,"address":0.14285714285714285,"balances":0.14285714285714285},"471":{"retrieves":0.2,"information":0.2,"about":0.2,"rune":0.2,"balances":0.2},"472":{"retrieves":0.14285714285714285,"holder":0.14285714285714285,"balance":0.14285714285714285,"for":0.14285714285714285,"a":0.14285714285714285,"specific":0.14285714285714285,"rune":0.14285714285714285},"473":{"retrieves":0.125,"a":0.125,"paginated":0.125,"list":0.125,"of":0.125,"holders":0.125,"for":0.125,"rune":0.125},"474":{"retrieves":0.2,"information":0.2,"about":0.2,"rune":0.2,"activities":0.2},"475":{"retrieves":0.1111111111111111,"a":0.1111111111111111,"paginated":0.1111111111111111,"list":0.1111111111111111,"of":0.1111111111111111,"rune":0.1111111111111111,"activity":0.1111111111111111,"for":0.1111111111111111,"transaction":0.1111111111111111},"476":{"retrieves":0.125,"all":0.125,"rune":0.125,"activity":0.125,"for":0.125,"a":0.125,"bitcoin":0.125,"address":0.125},"477":{"retrieves":0.1111111111111111,"a":0.1111111111111111,"paginated":0.1111111111111111,"list":0.1111111111111111,"of":0.1111111111111111,"rune":0.1111111111111111,"activity":0.1111111111111111,"for":0.1111111111111111,"block":0.1111111111111111},"478":{"retrieves":0.16666666666666666,"all":0.16666666666666666,"activity":0.16666666666666666,"for":0.16666666666666666,"a":0.16666666666666666,"rune":0.16666666666666666},"479":{"retrieves":0.2,"information":0.2,"about":0.2,"rune":0.2,"etchings":0.2},"480":{"retrieves":0.14285714285714285,"a":0.14285714285714285,"paginated":0.14285714285714285,"list":0.14285714285714285,"of":0.14285714285714285,"rune":0.14285714285714285,"etchings":0.14285714285714285},"481":{"retrieves":0.16666666666666666,"information":0.16666666666666666,"for":0.16666666666666666,"a":0.16666666666666666,"rune":0.16666666666666666,"etching":0.16666666666666666},"482":{"retrieves":0.1111111111111111,"stats":0.1111111111111111,"on":0.1111111111111111,"the":0.1111111111111111,"number":0.1111111111111111,"of":0.1111111111111111,"inscriptions":0.1111111111111111,"per":0.1111111111111111,"block":0.1111111111111111},"483":{"retrieves":0.1,"statistics":0.1,"on":0.1,"the":0.1,"number":0.1,"of":0.1,"inscriptions":0.1,"revealed":0.1,"per":0.1,"block":0.1},"484":{"retrieves":0.08333333333333333,"a":0.08333333333333333,"list":0.08333333333333333,"of":0.08333333333333333,"holders":0.08333333333333333,"and":0.08333333333333333,"their":0.08333333333333333,"balances":0.08333333333333333,"for":0.08333333333333333,"particular":0.08333333333333333,"brc-20":0.08333333333333333,"token":0.08333333333333333},"485":{"retrieves":0.2,"information":0.2,"about":0.2,"brc-20":0.2,"tokens":0.2},"486":{"retrieves":0.125,"brc-20":0.125,"token":0.125,"balances":0.125,"for":0.125,"a":0.125,"bitcoin":0.125,"address":0.125},"487":{"retrieves":0.1,"information":0.1,"for":0.1,"a":0.1,"brc-20":0.1,"token":0.1,"including":0.1,"supply":0.1,"and":0.1,"holders":0.1},"488":{"retrieves":0.2,"information":0.2,"for":0.2,"brc-20":0.2,"tokens":0.2},"489":{"retrieves":0.09090909090909091,"brc-20":0.09090909090909091,"activity":0.09090909090909091,"filtered":0.09090909090909091,"by":0.09090909090909091,"ticker":0.09090909090909091,"address":0.09090909090909091,"operation":0.09090909090909091,"or":0.09090909090909091,"block":0.09090909090909091,"height":0.09090909090909091},"490":{"retrieves":0.2,"information":0.2,"about":0.2,"ordinals":0.2,"inscriptions":0.2},"491":{"retrieves":0.14285714285714285,"all":0.14285714285714285,"transfers":0.14285714285714285,"for":0.14285714285714285,"a":0.14285714285714285,"single":0.14285714285714285,"inscription":0.14285714285714285},"492":{"retrieves":0.08333333333333333,"a":0.08333333333333333,"list":0.08333333333333333,"of":0.08333333333333333,"inscriptions":0.08333333333333333,"with":0.08333333333333333,"options":0.08333333333333333,"to":0.08333333333333333,"filter":0.08333333333333333,"and":0.08333333333333333,"sort":0.08333333333333333,"results":0.08333333333333333},"493":{"retrieves":0.14285714285714285,"the":0.14285714285714285,"content":0.14285714285714285,"of":0.14285714285714285,"a":0.14285714285714285,"single":0.14285714285714285,"inscription":0.14285714285714285},"494":{"retrieves":0.08333333333333333,"a":0.08333333333333333,"list":0.08333333333333333,"of":0.08333333333333333,"inscription":0.08333333333333333,"transfers":0.08333333333333333,"that":0.08333333333333333,"ocurred":0.08333333333333333,"at":0.08333333333333333,"specific":0.08333333333333333,"bitcoin":0.08333333333333333,"block":0.08333333333333333},"495":{"retrieves":0.25,"a":0.25,"single":0.25,"inscription":0.25},"496":{"retrieves":0.1,"information":0.1,"about":0.1,"the":0.1,"ordinals":0.1,"api":0.1,"status":0.1,"including":0.1,"server":0.1,"version":0.1},"497":{"retrieves":0.14285714285714285,"the":0.14285714285714285,"running":0.14285714285714285,"status":0.14285714285714285,"of":0.14285714285714285,"ordinals":0.14285714285714285,"api":0.14285714285714285},"498":{"retrieves":0.2,"ordinal":0.2,"information":0.2,"for":0.2,"satoshis":0.2},"499":{"retrieves":0.14285714285714285,"ordinal":0.14285714285714285,"information":0.14285714285714285,"for":0.14285714285714285,"a":0.14285714285714285,"single":0.14285714285714285,"satoshi":0.14285714285714285},"500":{"retrieves":0.125,"all":0.125,"inscriptions":0.125,"associated":0.125,"with":0.125,"a":0.125,"single":0.125,"satoshi":0.125},"501":{"the":0.07692307692307693,"following":0.07692307692307693,"guides":0.07692307692307693,"cover":0.07692307692307693,"ways":0.07692307692307693,"to":0.07692307692307693,"use":0.07692307692307693,"hiro":0.07692307692307693,"tools":0.07692307692307693,"build":0.07692307692307693,"apps":0.07692307692307693,"on":0.07692307692307693,"stacks":0.07692307692307693},"502":{"the":0.045454545454545456,"bitcoin":0.045454545454545456,"indexer":0.045454545454545456,"enables":0.045454545454545456,"you":0.045454545454545456,"to":0.045454545454545456,"build":0.045454545454545456,"ordinals":0.045454545454545456,"event":0.045454545454545456,"streams":0.045454545454545456,"so":0.045454545454545456,"can":0.045454545454545456,"create":0.045454545454545456,"accurate":0.045454545454545456,"lightweight":0.045454545454545456,"databases":0.045454545454545456,"that":0.045454545454545456,"gracefully":0.045454545454545456,"handle":0.045454545454545456,"forks":0.045454545454545456,"and":0.045454545454545456,"reorgs":0.045454545454545456},"503":{"tbd":1},"504":{"learn":0.1,"how":0.1,"to":0.1,"scan":0.1,"the":0.1,"bitcoin":0.1,"blockchain":0.1,"for":0.1,"ordinals":0.1,"activity":0.1},"505":{"the":0.07692307692307693,"following":0.07692307692307693,"guides":0.07692307692307693,"cover":0.07692307692307693,"ways":0.07692307692307693,"to":0.07692307692307693,"use":0.07692307692307693,"hiro":0.07692307692307693,"tools":0.07692307692307693,"build":0.07692307692307693,"apps":0.07692307692307693,"on":0.07692307692307693,"stacks":0.07692307692307693},"506":{"learn":0.125,"how":0.125,"to":0.125,"contribute":0.125,"hiro's":0.125,"documentation":0.125,"and":0.125,"content":0.125},"507":{"understand":0.1,"the":0.1,"rate":0.1,"limits":0.1,"for":0.1,"hiro":0.1,"apis":0.1,"and":0.1,"stx":0.1,"faucet":0.1},"508":{},"509":{"learn":0.07692307692307693,"how":0.07692307692307693,"to":0.07692307692307693,"sync":0.07692307692307693,"a":0.07692307692307693,"stacks":0.07692307692307693,"node":0.07692307692307693,"for":0.07692307692307693,"running":0.07692307692307693,"local":0.07692307692307693,"devnet":0.07692307692307693,"or":0.07692307692307693,"mainnet":0.07692307692307693},"510":{"install":0.14285714285714285,"docker":0.14285714285714285,"to":0.14285714285714285,"run":0.14285714285714285,"a":0.14285714285714285,"local":0.14285714285714285,"devnet":0.14285714285714285},"511":{"learn":0.06666666666666667,"how":0.06666666666666667,"to":0.06666666666666667,"create":0.06666666666666667,"a":0.06666666666666667,"crowdfunding":0.06666666666666667,"app":0.06666666666666667,"enabling":0.06666666666666667,"creators":0.06666666666666667,"fund":0.06666666666666667,"their":0.06666666666666667,"projects":0.06666666666666667,"without":0.06666666666666667,"third":0.06666666666666667,"party":0.06666666666666667},"512":{"for":0.09090909090909091,"developers":0.09090909090909091,"who":0.09090909090909091,"need":0.09090909090909091,"api":0.09090909090909091,"requests":0.09090909090909091,"beyond":0.09090909090909091,"the":0.09090909090909091,"standard":0.09090909090909091,"rate":0.09090909090909091,"limits":0.09090909090909091},"513":{"learn":0.05263157894736842,"how":0.05263157894736842,"to":0.05263157894736842,"create":0.05263157894736842,"an":0.05263157894736842,"nft":0.05263157894736842,"marketplace":0.05263157894736842,"that":0.05263157894736842,"allows":0.05263157894736842,"users":0.05263157894736842,"list":0.05263157894736842,"nfts":0.05263157894736842,"for":0.05263157894736842,"sale":0.05263157894736842,"and":0.05263157894736842,"purchase":0.05263157894736842,"them":0.05263157894736842,"using":0.05263157894736842,"clarity":0.05263157894736842},"514":{"learn":0.1,"how":0.1,"to":0.1,"use":0.1,"clarity":0.1,"values":0.1,"in":0.1,"your":0.1,"smart":0.1,"contracts":0.1},"515":{"learn":0.1,"how":0.1,"to":0.1,"sync":0.1,"a":0.1,"bitcoin":0.1,"node":0.1,"for":0.1,"building":0.1,"applications":0.1},"516":{"learn":0.08333333333333333,"how":0.08333333333333333,"to":0.08333333333333333,"create":0.08333333333333333,"a":0.08333333333333333,"no-loss":0.08333333333333333,"lottery":0.08333333333333333,"pool":0.08333333333333333,"that":0.08333333333333333,"leverages":0.08333333333333333,"stacking":0.08333333333333333,"yield":0.08333333333333333},"517":{"docskit":0.5,"usage":0.5}},"content":{"1":{"import":0.1,"contributorsguidecontent":0.1,"from":0.1,"'":0.1,"content":0.1,"_shared":0.1,"contributors-guide":0.1,"mdx'":0.1,"components":0.1,"props":0.1},"2":{"import":0.012658227848101266,"secondarycard":0.012658227848101266,"from":0.012658227848101266,"'":0.012658227848101266,"components":0.012658227848101266,"card'":0.012658227848101266,"lfg":0.012658227848101266,"related":0.012658227848101266,"tools":0.012658227848101266,"-":0.012658227848101266,"clarinet":0.012658227848101266,"stacks":0.012658227848101266,"build":0.012658227848101266,"your":0.012658227848101266,"app":0.012658227848101266,"in":0.012658227848101266,"a":0.012658227848101266,"local":0.012658227848101266,"environment":0.012658227848101266,"on":0.012658227848101266,"js":0.012658227848101266,"don":0.012658227848101266,"t":0.012658227848101266,"reinvent":0.012658227848101266,"the":0.012658227848101266,"wheel":0.012658227848101266,"and":0.012658227848101266,"faster":0.012658227848101266,"with":0.012658227848101266,"library":0.012658227848101266,"that":0.012658227848101266,"handles":0.012658227848101266,"basic":0.012658227848101266,"blockchain":0.012658227848101266,"functionality":0.012658227848101266,"api":0.012658227848101266,"fetch":0.012658227848101266,"data":0.012658227848101266,"broadcast":0.012658227848101266,"transactions":0.012658227848101266,"br":0.012658227848101266,"callout":0.012658227848101266,"title":0.012658227848101266,"need":0.012658227848101266,"help":0.012658227848101266,"building":0.012658227848101266,"sdk":0.012658227848101266,"type":0.012658227848101266,"reach":0.012658227848101266,"out":0.012658227848101266,"to":0.012658227848101266,"us":0.012658227848101266,"span":0.012658227848101266,"classname":0.012658227848101266,"font-bold":0.012658227848101266,"channel":0.012658227848101266,"discord":0.012658227848101266,"https":0.012658227848101266,"chat":0.012658227848101266,"under":0.012658227848101266,"hiro":0.012658227848101266,"developer":0.012658227848101266,"section":0.012658227848101266,"there's":0.012658227848101266,"also":0.012658227848101266,"weekly":0.012658227848101266,"office":0.012658227848101266,"hours":0.012658227848101266,"www":0.012658227848101266,"addevent":0.012658227848101266,"com":0.012658227848101266,"event":0.012658227848101266,"ki22007085":0.012658227848101266,"call":0.012658227848101266,"every":0.012658227848101266,"wednesday":0.012658227848101266,"at":0.012658227848101266,"1pm":0.012658227848101266,"et":0.012658227848101266},"3":{"import":0.1,"ratelimitingcontent":0.1,"from":0.1,"'":0.1,"content":0.1,"_shared":0.1,"rate-limiting":0.1,"mdx'":0.1,"components":0.1,"props":0.1},"4":{"import":0.013513513513513514,"accordion":0.013513513513513514,"accordioncontent":0.013513513513513514,"accordionitem":0.013513513513513514,"accordiontrigger":0.013513513513513514,"from":0.013513513513513514,"components":0.013513513513513514,"ui":0.013513513513513514,"badge":0.013513513513513514,"'":0.013513513513513514,"badge'":0.013513513513513514,"tabs":0.013513513513513514,"tabscontent":0.013513513513513514,"tabslist":0.013513513513513514,"tabstrigger":0.013513513513513514,"tabs'":0.013513513513513514,"initsimnet":0.013513513513513514,"the":0.013513513513513514,"function":0.013513513513513514,"initializes":0.013513513513513514,"a":0.013513513513513514,"simulated":0.013513513513513514,"network":0.013513513513513514,"it":0.013513513513513514,"will":0.013513513513513514,"often":0.013513513513513514,"be":0.013513513513513514,"first":0.013513513513513514,"you":0.013513513513513514,"call":0.013513513513513514,"when":0.013513513513513514,"using":0.013513513513513514,"sdk":0.013513513513513514,"parameters":0.013513513513513514,"manifestpath":0.013513513513513514,"is":0.013513513513513514,"path":0.013513513513513514,"to":0.013513513513513514,"clarinet":0.013513513513513514,"toml":0.013513513513513514,"manifest":0.013513513513513514,"file":0.013513513513513514,"defaultvalue":0.013513513513513514,"default":0.013513513513513514,"classname":0.013513513513513514,"'flex":0.013513513513513514,"flex-wrap'":0.013513513513513514,"value":0.013513513513513514,"'tab":0.013513513513513514,"group'":0.013513513513513514,"'transition-colors'":0.013513513513513514,"creating":0.013513513513513514,"new":0.013513513513513514,"instance":0.013513513513513514,"of":0.013513513513513514,"simnet":0.013513513513513514,"custom":0.013513513513513514,"'badge":0.013513513513513514,"transition-colors'":0.013513513513513514,"with":0.013513513513513514,"config":0.013513513513513514,"ts":0.013513513513513514,"hirosystems":0.013513513513513514,"clarinet-sdk'":0.013513513513513514,"const":0.013513513513513514,"await":0.013513513513513514,"toml'":0.013513513513513514,"type":0.013513513513513514,"single":0.013513513513513514,"collapsible":0.013513513513513514,"w-full":0.013513513513513514,"schema":0.013513513513513514,"string":0.013513513513513514,"promise":0.013513513513513514},"5":{"1":0.013513513513513514,"2":0.013513513513513514,"5":0.013513513513513514,"import":0.013513513513513514,"accordion":0.013513513513513514,"accordions":0.013513513513513514,"from":0.013513513513513514,"'fumadocs-ui":0.013513513513513514,"components":0.013513513513513514,"accordion'":0.013513513513513514,"badge":0.013513513513513514,"'":0.013513513513513514,"ui":0.013513513513513514,"badge'":0.013513513513513514,"tabs":0.013513513513513514,"tabscontent":0.013513513513513514,"tabslist":0.013513513513513514,"tabstrigger":0.013513513513513514,"tabs'":0.013513513513513514,"blockheight":0.013513513513513514,"returns":0.013513513513513514,"the":0.013513513513513514,"current":0.013513513513513514,"block":0.013513513513513514,"height":0.013513513513513514,"of":0.013513513513513514,"simnet":0.013513513513513514,"defaultvalue":0.013513513513513514,"default":0.013513513513513514,"classname":0.013513513513513514,"'flex":0.013513513513513514,"flex-wrap'":0.013513513513513514,"value":0.013513513513513514,"'tab":0.013513513513513514,"group'":0.013513513513513514,"'badge":0.013513513513513514,"transition-colors'":0.013513513513513514,"getting":0.013513513513513514,"ts":0.013513513513513514,"const":0.013513513513513514,"currentblockheight":0.013513513513513514,"title":0.013513513513513514,"response":0.013513513513513514,"deployer":0.013513513513513514,"address":0.013513513513513514,"as":0.013513513513513514,"defined":0.013513513513513514,"in":0.013513513513513514,"project":0.013513513513513514,"file":0.013513513513513514,"set-deployer":0.013513513513513514,"setting":0.013513513513513514,"to":0.013513513513513514,"a":0.013513513513513514,"new":0.013513513513513514,"currentdeployeraddress":0.013513513513513514,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.013513513513513514,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5'":0.013513513513513514,"newdeployer":0.013513513513513514,"st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":0.013513513513513514,"currentepoch":0.013513513513513514,"epoch":0.013513513513513514,"this":0.013513513513513514,"represents":0.013513513513513514,"stacks":0.013513513513513514,"blockchain's":0.013513513513513514,"progress":0.013513513513513514,"through":0.013513513513513514,"discrete":0.013513513513513514,"time":0.013513513513513514,"periods":0.013513513513513514,"cycles":0.013513513513513514,"or":0.013513513513513514,"upgrades":0.013513513513513514},"6":{"0":0.0044444444444444444,"1":0.0044444444444444444,"2":0.0044444444444444444,"3":0.0044444444444444444,"4":0.0044444444444444444,"19":0.0044444444444444444,"500":0.0044444444444444444,"19000000":0.0044444444444444444,"import":0.0044444444444444444,"accordion":0.0044444444444444444,"accordions":0.0044444444444444444,"from":0.0044444444444444444,"'fumadocs-ui":0.0044444444444444444,"components":0.0044444444444444444,"accordion'":0.0044444444444444444,"badge":0.0044444444444444444,"'":0.0044444444444444444,"ui":0.0044444444444444444,"badge'":0.0044444444444444444,"tabs":0.0044444444444444444,"tabscontent":0.0044444444444444444,"tabslist":0.0044444444444444444,"tabstrigger":0.0044444444444444444,"tabs'":0.0044444444444444444,"tohaveclaritytype":0.0044444444444444444,"check":0.0044444444444444444,"that":0.0044444444444444444,"a":0.0044444444444444444,"value":0.0044444444444444444,"has":0.0044444444444444444,"the":0.0044444444444444444,"right":0.0044444444444444444,"clarity":0.0044444444444444444,"type":0.0044444444444444444,"without":0.0044444444444444444,"checking":0.0044444444444444444,"its":0.0044444444444444444,"parameters":0.0044444444444444444,"expected":0.0044444444444444444,"should":0.0044444444444444444,"have":0.0044444444444444444,"defaultvalue":0.0044444444444444444,"default":0.0044444444444444444,"classname":0.0044444444444444444,"'flex":0.0044444444444444444,"flex-wrap'":0.0044444444444444444,"'tab":0.0044444444444444444,"group'":0.0044444444444444444,"'badge":0.0044444444444444444,"transition-colors'":0.0044444444444444444,"for":0.0044444444444444444,"an":0.0044444444444444444,"ok":0.0044444444444444444,"response":0.0044444444444444444,"ts":0.0044444444444444444,"const":0.0044444444444444444,"result":0.0044444444444444444,"simnet":0.0044444444444444444,"callpublicfn":0.0044444444444444444,"'counter'":0.0044444444444444444,"'increment'":0.0044444444444444444,"deployer":0.0044444444444444444,"expect":0.0044444444444444444,"claritytype":0.0044444444444444444,"responseok":0.0044444444444444444,"title":0.0044444444444444444,"source":0.0044444444444444444,"code":0.0044444444444444444,"counter":0.0044444444444444444,"clar":0.0044444444444444444,"define-data-var":0.0044444444444444444,"count":0.0044444444444444444,"uint":0.0044444444444444444,"u0":0.0044444444444444444,"define-public":0.0044444444444444444,"increment":0.0044444444444444444,"begin":0.0044444444444444444,"var-set":0.0044444444444444444,"var-get":0.0044444444444444444,"u1":0.0044444444444444444,"schema":0.0044444444444444444,"expectedtype":0.0044444444444444444,"tobeok":0.0044444444444444444,"is":0.0044444444444444444,"ok-type":0.0044444444444444444,"and":0.0044444444444444444,"any":0.0044444444444444444,"can":0.0044444444444444444,"be":0.0044444444444444444,"passed":0.0044444444444444444,"clarityvalue":0.0044444444444444444,"with":0.0044444444444444444,"specific":0.0044444444444444444,"cl":0.0044444444444444444,"tobeerr":0.0044444444444444444,"err":0.0044444444444444444,"error-type":0.0044444444444444444,"'add'":0.0044444444444444444,"define-constant":0.0044444444444444444,"too_big":0.0044444444444444444,"u10":0.0044444444444444444,"add":0.0044444444444444444,"amount":0.0044444444444444444,"let":0.0044444444444444444,"new-count":0.0044444444444444444,"if":0.0044444444444444444,"u500":0.0044444444444444444,"tobesome":0.0044444444444444444,"some":0.0044444444444444444,"optional":0.0044444444444444444,"callreadonlyfn":0.0044444444444444444,"'pool'":0.0044444444444444444,"'get-participant'":0.0044444444444444444,"standardprincipal":0.0044444444444444444,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5'":0.0044444444444444444,"bool":0.0044444444444444444,"true":0.0044444444444444444,"pool":0.0044444444444444444,"define-map":0.0044444444444444444,"participants":0.0044444444444444444,"principal":0.0044444444444444444,"participantstatus":0.0044444444444444444,"enrollmentblock":0.0044444444444444444,"contributionamount":0.0044444444444444444,"define-read-only":0.0044444444444444444,"get-participant":0.0044444444444444444,"who":0.0044444444444444444,"map-get":0.0044444444444444444,"map-set":0.0044444444444444444,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":0.0044444444444444444,"u19000000":0.0044444444444444444,"tobenone":0.0044444444444444444,"none":0.0044444444444444444,"tobebool":0.0044444444444444444,"asserts":0.0044444444444444444,"of":0.0044444444444444444,"boolean":0.0044444444444444444,"or":0.0044444444444444444,"false":0.0044444444444444444,"'has-contributed'":0.0044444444444444444,"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm'":0.0044444444444444444,"has-contributed":0.0044444444444444444,"is-some":0.0044444444444444444,"get":0.0044444444444444444,"tx-sender":0.0044444444444444444,"tobeint":0.0044444444444444444,"integer":0.0044444444444444444,"1n":0.0044444444444444444,"int":0.0044444444444444444,"number":0.0044444444444444444,"bigint":0.0044444444444444444,"tobeuint":0.0044444444444444444,"unsigned":0.0044444444444444444,"tobeascii":0.0044444444444444444,"string-ascii":0.0044444444444444444,"string":0.0044444444444444444,"'hello-world'":0.0044444444444444444,"'say-hi'":0.0044444444444444444,"'hello":0.0044444444444444444,"world'":0.0044444444444444444,"hello-world":0.0044444444444444444,"say-hi":0.0044444444444444444,"hello":0.0044444444444444444,"world":0.0044444444444444444,"tobeutf8":0.0044444444444444444,"string-utf8":0.0044444444444444444,"u":0.0044444444444444444,"tobeprincipal":0.0044444444444444444,"standard":0.0044444444444444444,"contract":0.0044444444444444444,"options":0.0044444444444444444,"contractprincipal":0.0044444444444444444,"tobebuff":0.0044444444444444444,"buffer":0.0044444444444444444,"it":0.0044444444444444444,"takes":0.0044444444444444444,"arraybuffer":0.0044444444444444444,"as":0.0044444444444444444,"input":0.0044444444444444444,"building":0.0044444444444444444,"stacks":0.0044444444444444444,"transactions":0.0044444444444444444,"provides":0.0044444444444444444,"helper":0.0044444444444444444,"functions":0.0044444444444444444,"-":0.0044444444444444444,"bufferfromascii":0.0044444444444444444,"bufferfromutf8":0.0044444444444444444,"bufferfromhex":0.0044444444444444444,"uint8array":0.0044444444444444444,"ascii":0.0044444444444444444,"hex":0.0044444444444444444,"'helpers'":0.0044444444444444444,"'get-byte-array'":0.0044444444444444444,"helpers":0.0044444444444444444,"0x01020304":0.0044444444444444444,"get-byte-array":0.0044444444444444444,"transactions'":0.0044444444444444444,"'get-btc-buffer'":0.0044444444444444444,"btc":0.0044444444444444444,"'btc'":0.0044444444444444444,"ascii_btc":0.0044444444444444444,"0x627463":0.0044444444444444444,"get-btc-buffer":0.0044444444444444444,"get-tx-hash":0.0044444444444444444,"tx":0.0044444444444444444,"73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e":0.0044444444444444444,"tx_hash":0.0044444444444444444,"0x73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e":0.0044444444444444444,"tobelist":0.0044444444444444444,"list":0.0044444444444444444,"containing":0.0044444444444444444,"array":0.0044444444444444444,"values":0.0044444444444444444,"'get-addresses'":0.0044444444444444444,"'st2cy5v39nhdpwsxmw9qdt3hc3gd6q6xx4cfrk9ag'":0.0044444444444444444,"get-addresses":0.0044444444444444444,"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.0044444444444444444,"'st2cy5v39nhdpwsxmw9qdt3hc3gd6q6xx4cfrk9ag":0.0044444444444444444,"tobetuple":0.0044444444444444444,"tuple":0.0044444444444444444,"object":0.0044444444444444444,"'get-participant-data'":0.0044444444444444444,"get-participant-data":0.0044444444444444444,"record":0.0044444444444444444},"7":{"0":0.002004008016032064,"1":0.002004008016032064,"2":0.002004008016032064,"3":0.002004008016032064,"5":0.002004008016032064,"6":0.002004008016032064,"7":0.002004008016032064,"9":0.002004008016032064,"10":0.002004008016032064,"11":0.002004008016032064,"26":0.002004008016032064,"37":0.002004008016032064,"42":0.002004008016032064,"53":0.002004008016032064,"58":0.002004008016032064,"61":0.002004008016032064,"87":0.002004008016032064,"100":0.002004008016032064,"108":0.002004008016032064,"109":0.002004008016032064,"120":0.002004008016032064,"123":0.002004008016032064,"138":0.002004008016032064,"191":0.002004008016032064,"193":0.002004008016032064,"195":0.002004008016032064,"206":0.002004008016032064,"220":0.002004008016032064,"222":0.002004008016032064,"223":0.002004008016032064,"242":0.002004008016032064,"246":0.002004008016032064,"1000":0.002004008016032064,"1000000":0.002004008016032064,"19000000":0.002004008016032064,"42000000":0.002004008016032064,"import":0.002004008016032064,"accordion":0.002004008016032064,"accordions":0.002004008016032064,"from":0.002004008016032064,"'fumadocs-ui":0.002004008016032064,"components":0.002004008016032064,"accordion'":0.002004008016032064,"badge":0.002004008016032064,"'":0.002004008016032064,"ui":0.002004008016032064,"badge'":0.002004008016032064,"tabs":0.002004008016032064,"tabscontent":0.002004008016032064,"tabslist":0.002004008016032064,"tabstrigger":0.002004008016032064,"tabs'":0.002004008016032064,"getaccounts":0.002004008016032064,"retrieve":0.002004008016032064,"a":0.002004008016032064,"list":0.002004008016032064,"of":0.002004008016032064,"all":0.002004008016032064,"stacks":0.002004008016032064,"addresses":0.002004008016032064,"configured":0.002004008016032064,"within":0.002004008016032064,"the":0.002004008016032064,"project":0.002004008016032064,"including":0.002004008016032064,"wallets":0.002004008016032064,"deployers":0.002004008016032064,"and":0.002004008016032064,"faucets":0.002004008016032064,"defaultvalue":0.002004008016032064,"get-accounts":0.002004008016032064,"classname":0.002004008016032064,"'flex":0.002004008016032064,"flex-wrap'":0.002004008016032064,"value":0.002004008016032064,"'tab":0.002004008016032064,"group'":0.002004008016032064,"'badge":0.002004008016032064,"transition-colors'":0.002004008016032064,"getting":0.002004008016032064,"your":0.002004008016032064,"accounts":0.002004008016032064,"get-account":0.002004008016032064,"selecting":0.002004008016032064,"specific":0.002004008016032064,"account":0.002004008016032064,"ts":0.002004008016032064,"const":0.002004008016032064,"simnet":0.002004008016032064,"title":0.002004008016032064,"response":0.002004008016032064,"map":0.002004008016032064,"wallet_7":0.002004008016032064,"st3pf13w7z0rrm42a8vzrvfq75sv1k26rxep8ygkj":0.002004008016032064,"wallet_1":0.002004008016032064,"st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":0.002004008016032064,"wallet_3":0.002004008016032064,"st2jhg361zxg51qtky2nqcvbpprre2kzb1hr05nnc":0.002004008016032064,"wallet_5":0.002004008016032064,"st2rehhs5j3cercrbepmgh7921q6pykaadt7jp2vb":0.002004008016032064,"wallet_8":0.002004008016032064,"st3nbrsfkx28fq2zj1makx58hkhsdgnv5n7r21xcp":0.002004008016032064,"wallet_4":0.002004008016032064,"st2neb84asendxkygjpqw86yxqcefex2zqpg87nd":0.002004008016032064,"deployer":0.002004008016032064,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.002004008016032064,"wallet_6":0.002004008016032064,"st3am1a56ak2c1xafj4115zsv26eb49bvq10mgcs0":0.002004008016032064,"wallet_2":0.002004008016032064,"st2cy5v39nhdpwsxmw9qdt3hc3gd6q6xx4cfrk9ag":0.002004008016032064,"faucet":0.002004008016032064,"stnhkepyepj8et55zz0m5a34j0r3n5fm2cmmmaz6":0.002004008016032064,"schema":0.002004008016032064,"string":0.002004008016032064,"wallet":0.002004008016032064,"get":0.002004008016032064,"'wallet_1'":0.002004008016032064,"getassetsmap":0.002004008016032064,"asset":0.002004008016032064,"balances":0.002004008016032064,"associated":0.002004008016032064,"with":0.002004008016032064,"fungible":0.002004008016032064,"non-fungible":0.002004008016032064,"tokens":0.002004008016032064,"default":0.002004008016032064,"stx":0.002004008016032064,"get-ft-balance":0.002004008016032064,"ft":0.002004008016032064,"get-nft-balance":0.002004008016032064,"nft":0.002004008016032064,"get-deployer-balance":0.002004008016032064,"filtering":0.002004008016032064,"for":0.002004008016032064,"an":0.002004008016032064,"assets":0.002004008016032064,"stxbalances":0.002004008016032064,"'stx'":0.002004008016032064,"100000000000000n":0.002004008016032064,"bigint":0.002004008016032064,"contractname":0.002004008016032064,"'token'":0.002004008016032064,"sourcecode":0.002004008016032064,"define-fungible-token":0.002004008016032064,"sbtc":0.002004008016032064,"ft-mint":0.002004008016032064,"u19":0.002004008016032064,"tx-sender":0.002004008016032064,"deploycontract":0.002004008016032064,"null":0.002004008016032064,"tokenbalance":0.002004008016032064,"token":0.002004008016032064,"sbtc'":0.002004008016032064,"19n":0.002004008016032064,"'nft'":0.002004008016032064,"define-non-fungible-token":0.002004008016032064,"ticket":0.002004008016032064,"uint":0.002004008016032064,"nft-mint":0.002004008016032064,"u42":0.002004008016032064,"nftbalance":0.002004008016032064,"ticket'":0.002004008016032064,"1n":0.002004008016032064,"deployerbalance":0.002004008016032064,"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm'":0.002004008016032064,"getdatavar":0.002004008016032064,"data-var":0.002004008016032064,"defined":0.002004008016032064,"in":0.002004008016032064,"contract":0.002004008016032064,"parameters":0.002004008016032064,"identifier":0.002004008016032064,"span":0.002004008016032064,"example":0.002004008016032064,"counter":0.002004008016032064,"name":0.002004008016032064,"count":0.002004008016032064,"data":0.002004008016032064,"variable":0.002004008016032064,"clarity-value":0.002004008016032064,"converting":0.002004008016032064,"clarity":0.002004008016032064,"values":0.002004008016032064,"currentcount":0.002004008016032064,"'counter'":0.002004008016032064,"'count'":0.002004008016032064,"source":0.002004008016032064,"code":0.002004008016032064,"clar":0.002004008016032064,"define-data-var":0.002004008016032064,"u0":0.002004008016032064,"contractowner":0.002004008016032064,"principal":0.002004008016032064,"var-set":0.002004008016032064,"var-get":0.002004008016032064,"u1":0.002004008016032064,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":0.002004008016032064,"type":0.002004008016032064,"datavar":0.002004008016032064,"clarityvalue":0.002004008016032064,"cvtovalue":0.002004008016032064,"transactions'":0.002004008016032064,"getmapentry":0.002004008016032064,"entry":0.002004008016032064,"by":0.002004008016032064,"its":0.002004008016032064,"key":0.002004008016032064,"note":0.002004008016032064,"that":0.002004008016032064,"this":0.002004008016032064,"method":0.002004008016032064,"will":0.002004008016032064,"always":0.002004008016032064,"return":0.002004008016032064,"optional":0.002004008016032064,"some":0.002004008016032064,"or":0.002004008016032064,"none":0.002004008016032064,"just":0.002004008016032064,"like":0.002004008016032064,"map-get":0.002004008016032064,"pool":0.002004008016032064,"participants":0.002004008016032064,"to":0.002004008016032064,"access":0.002004008016032064,"cl":0.002004008016032064,"standardprincipal":0.002004008016032064,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5'":0.002004008016032064,"hasparticipated":0.002004008016032064,"define-map":0.002004008016032064,"bool":0.002004008016032064,"map-set":0.002004008016032064,"true":0.002004008016032064,"mapname":0.002004008016032064,"mapkey":0.002004008016032064,"callreadonlyfn":0.002004008016032064,"call":0.002004008016032064,"read-only":0.002004008016032064,"functions":0.002004008016032064,"exposed":0.002004008016032064,"returns":0.002004008016032064,"object":0.002004008016032064,"result":0.002004008016032064,"function":0.002004008016032064,"as":0.002004008016032064,"it":0.002004008016032064,"takes":0.002004008016032064,"arguments":0.002004008016032064,"form":0.002004008016032064,"which":0.002004008016032064,"are":0.002004008016032064,"available":0.002004008016032064,"package":0.002004008016032064,"transactions":0.002004008016032064,"js":0.002004008016032064,"packages":0.002004008016032064,"get-participant":0.002004008016032064,"pass":0.002004008016032064,"if":0.002004008016032064,"no":0.002004008016032064,"needed":0.002004008016032064,"empty":0.002004008016032064,"array":0.002004008016032064,"address":0.002004008016032064,"sender":0.002004008016032064,"making":0.002004008016032064,"with-no-arguments":0.002004008016032064,"explicit":0.002004008016032064,"getcontributionamount":0.002004008016032064,"'pool'":0.002004008016032064,"'get-contribution-amount'":0.002004008016032064,"participantstatus":0.002004008016032064,"enrollmentblock":0.002004008016032064,"contributionamount":0.002004008016032064,"define-read-only":0.002004008016032064,"who":0.002004008016032064,"get-contribution-amount":0.002004008016032064,"default-to":0.002004008016032064,"is-active":0.002004008016032064,"block-height":0.002004008016032064,"u42000000":0.002004008016032064,"420000000n":0.002004008016032064,"parsedtransactionresult":0.002004008016032064,"events":0.002004008016032064,"clarityevent":0.002004008016032064,"args":0.002004008016032064,"isactive":0.002004008016032064,"'is-active'":0.002004008016032064,"'deployer'":0.002004008016032064,"contractaddress":0.002004008016032064,"getparticipant":0.002004008016032064,"'get-participant'":0.002004008016032064,"42000000n":0.002004008016032064,"callpublicfn":0.002004008016032064,"public":0.002004008016032064,"fired":0.002004008016032064,"during":0.002004008016032064,"execution":0.002004008016032064,"simulate":0.002004008016032064,"block":0.002004008016032064,"being":0.002004008016032064,"mined":0.002004008016032064,"increase":0.002004008016032064,"height":0.002004008016032064,"one":0.002004008016032064,"register-participant":0.002004008016032064,"broadcasting":0.002004008016032064,"transaction":0.002004008016032064,"registerparticipant":0.002004008016032064,"'register-participant'":0.002004008016032064,"define-public":0.002004008016032064,"begin":0.002004008016032064,"print":0.002004008016032064,"message":0.002004008016032064,"registered":0.002004008016032064,"at":0.002004008016032064,"ok":0.002004008016032064,"eventvalues":0.002004008016032064,"event":0.002004008016032064,"string-ascii":0.002004008016032064,"callprivatefn":0.002004008016032064,"private":0.002004008016032064,"any":0.002004008016032064,"reward-participant-points":0.002004008016032064,"address1":0.002004008016032064,"rewardparticipantpoints":0.002004008016032064,"participantpoints":0.002004008016032064,"int":0.002004008016032064,"define-private":0.002004008016032064,"map-insert":0.002004008016032064,"transferstx":0.002004008016032064,"transfer":0.002004008016032064,"another":0.002004008016032064,"amount":0.002004008016032064,"transferred":0.002004008016032064,"is":0.002004008016032064,"ustx":0.002004008016032064,"equals":0.002004008016032064,"recipient":0.002004008016032064,"transferring":0.002004008016032064,"stx_transfer_event":0.002004008016032064,"memo":0.002004008016032064,"number":0.002004008016032064,"deploy":0.002004008016032064,"be":0.002004008016032064,"deployed":0.002004008016032064,"hello-world":0.002004008016032064,"content":0.002004008016032064,"say-hi":0.002004008016032064,"hello":0.002004008016032064,"world":0.002004008016032064,"specify":0.002004008016032064,"options":0.002004008016032064,"such":0.002004008016032064,"version":0.002004008016032064,"clarityversion":0.002004008016032064,"deploying":0.002004008016032064,"specifying":0.002004008016032064,"interact":0.002004008016032064,"interacting":0.002004008016032064,"'hello-world'":0.002004008016032064,"deploycontractoptions":0.002004008016032064,"sayhi":0.002004008016032064,"mineblock":0.002004008016032064,"methods":0.002004008016032064,"mine":0.002004008016032064,"only":0.002004008016032064,"can":0.002004008016032064,"also":0.002004008016032064,"useful":0.002004008016032064,"multiple":0.002004008016032064,"what":0.002004008016032064,"objects":0.002004008016032064,"built":0.002004008016032064,"tx":0.002004008016032064,"helper":0.002004008016032064,"exported":0.002004008016032064,"sdk":0.002004008016032064,"has":0.002004008016032064,"three":0.002004008016032064,"-":0.002004008016032064,"these":0.002004008016032064,"have":0.002004008016032064,"same":0.002004008016032064,"interface":0.002004008016032064,"but":0.002004008016032064,"instead":0.002004008016032064,"performing":0.002004008016032064,"they":0.002004008016032064,"build":0.002004008016032064,"passed":0.002004008016032064,"epochs":0.002004008016032064,"on":0.002004008016032064,"chaintip":0.002004008016032064,"advanced":0.002004008016032064,"separately":0.002004008016032064,"burn":0.002004008016032064,"means":0.002004008016032064,"affect":0.002004008016032064,"you'd":0.002004008016032064,"blocks":0.002004008016032064,"use":0.002004008016032064,"mineemptyburnblock":0.002004008016032064,"included":0.002004008016032064,"mining":0.002004008016032064,"single":0.002004008016032064,"hirosystems":0.002004008016032064,"clarinet-sdk'":0.002004008016032064,"increment":0.002004008016032064,"add":0.002004008016032064,"foreach":0.002004008016032064,"console":0.002004008016032064,"log":0.002004008016032064,"length":0.002004008016032064,"txs":0.002004008016032064,"mineemptyblock":0.002004008016032064,"new":0.002004008016032064,"blockheight":0.002004008016032064,"mineemptyblocks":0.002004008016032064,"reach":0.002004008016032064,"certain":0.002004008016032064,"parameter":0.002004008016032064,"without":0.002004008016032064,"runsnippet":0.002004008016032064,"execute":0.002004008016032064,"arbitrary":0.002004008016032064,"directly":0.002004008016032064,"allows":0.002004008016032064,"you":0.002004008016032064,"test":0.002004008016032064,"smart":0.002004008016032064,"them":0.002004008016032064,"snippet":0.002004008016032064,"executed":0.002004008016032064,"get-balance":0.002004008016032064,"stx-balance":0.002004008016032064,"executing":0.002004008016032064,"running":0.002004008016032064,"codesnippet":0.002004008016032064,"stx-account":0.002004008016032064,"prettyprint":0.002004008016032064,"locked":0.002004008016032064,"unlock-height":0.002004008016032064,"unlocked":0.002004008016032064,"u100000000000000":0.002004008016032064,"stx-transfer":0.002004008016032064,"u19000000":0.002004008016032064,"getcontractsinterfaces":0.002004008016032064,"interfaces":0.002004008016032064,"contracts":0.002004008016032064,"keys":0.002004008016032064,"contain":0.002004008016032064,"information":0.002004008016032064,"data-vars":0.002004008016032064,"maps":0.002004008016032064,"nfts":0.002004008016032064,"fts":0.002004008016032064,"filter":0.002004008016032064,"contractinterfaces":0.002004008016032064,"read_only":0.002004008016032064,"outputs":0.002004008016032064,"variables":0.002004008016032064,"fungible_tokens":0.002004008016032064,"non_fungible_tokens":0.002004008016032064,"epoch":0.002004008016032064,"epoch25":0.002004008016032064,"clarity_version":0.002004008016032064,"clarity2":0.002004008016032064,"contractinterface":0.002004008016032064,"poolcontract":0.002004008016032064,"getcontractsource":0.002004008016032064,"requested":0.002004008016032064,"contractsource":0.002004008016032064,"undefined":0.002004008016032064,"getcontractast":0.002004008016032064,"full":0.002004008016032064,"ast":0.002004008016032064,"abstract":0.002004008016032064,"syntax":0.002004008016032064,"tree":0.002004008016032064,"throws":0.002004008016032064,"error":0.002004008016032064,"fails":0.002004008016032064,"encode":0.002004008016032064,"contractast":0.002004008016032064,"contract_identifier":0.002004008016032064,"issuer":0.002004008016032064,"pre_expressions":0.002004008016032064,"expressions":0.002004008016032064,"expr":0.002004008016032064,"id":0.002004008016032064,"pre_comments":0.002004008016032064,"end_line_comment":0.002004008016032064,"post_comments":0.002004008016032064,"top_level_expression_sorting":0.002004008016032064,"referenced_traits":0.002004008016032064,"implemented_traits":0.002004008016032064,"wasm_module":0.002004008016032064,"contractid":0.002004008016032064},"8":{"0":0.006211180124223602,"18":0.006211180124223602,"import":0.006211180124223602,"secondarycard":0.006211180124223602,"from":0.006211180124223602,"'":0.006211180124223602,"components":0.006211180124223602,"card'":0.006211180124223602,"the":0.006211180124223602,"clarinet":0.006211180124223602,"js":0.006211180124223602,"sdk":0.006211180124223602,"allows":0.006211180124223602,"you":0.006211180124223602,"to":0.006211180124223602,"write":0.006211180124223602,"unit":0.006211180124223602,"tests":0.006211180124223602,"for":0.006211180124223602,"your":0.006211180124223602,"clarity":0.006211180124223602,"smart":0.006211180124223602,"contracts":0.006211180124223602,"can":0.006211180124223602,"theoretically":0.006211180124223602,"use":0.006211180124223602,"any":0.006211180124223602,"javascript":0.006211180124223602,"test":0.006211180124223602,"framework":0.006211180124223602,"but":0.006211180124223602,"supports":0.006211180124223602,"vitest":0.006211180124223602,"out":0.006211180124223602,"of":0.006211180124223602,"box":0.006211180124223602,"this":0.006211180124223602,"leverages":0.006211180124223602,"simnet":0.006211180124223602,"a":0.006211180124223602,"simulated":0.006211180124223602,"network":0.006211180124223602,"that":0.006211180124223602,"offers":0.006211180124223602,"rapid":0.006211180124223602,"feedback":0.006211180124223602,"loop":0.006211180124223602,"initial":0.006211180124223602,"testing":0.006211180124223602,"here":0.006211180124223602,"is":0.006211180124223602,"non-exhaustive":0.006211180124223602,"list":0.006211180124223602,"some":0.006211180124223602,"simnet's":0.006211180124223602,"use-cases":0.006211180124223602,"-":0.006211180124223602,"call":0.006211180124223602,"public":0.006211180124223602,"and":0.006211180124223602,"read-only":0.006211180124223602,"functions":0.006211180124223602,"get":0.006211180124223602,"maps":0.006211180124223602,"or":0.006211180124223602,"data-var":0.006211180124223602,"values":0.006211180124223602,"contract":0.006211180124223602,"interfaces":0.006211180124223602,"available":0.006211180124223602,"data":0.006211180124223602,"callout":0.006211180124223602,"title":0.006211180124223602,"requirements":0.006211180124223602,"type":0.006211180124223602,"warn":0.006211180124223602,"requires":0.006211180124223602,"node":0.006211180124223602,"npm":0.006211180124223602,"be":0.006211180124223602,"installed":0.006211180124223602,"guides":0.006211180124223602,"cards":0.006211180124223602,"href":0.006211180124223602,"stacks":0.006211180124223602,"clarinet-js-sdk":0.006211180124223602,"quickstart":0.006211180124223602,"simulate":0.006211180124223602,"blockchain":0.006211180124223602,"with":0.006211180124223602,"description":0.006211180124223602,"learn":0.006211180124223602,"how":0.006211180124223602,"interact":0.006211180124223602,"without":0.006211180124223602,"running":0.006211180124223602,"migrate-to-the-clarinet-sdk":0.006211180124223602,"migrate":0.006211180124223602,"v1":0.006211180124223602,"existing":0.006211180124223602,"references":0.006211180124223602,"reference":0.006211180124223602,"dive":0.006211180124223602,"deeper":0.006211180124223602,"into":0.006211180124223602,"methods":0.006211180124223602,"properties":0.006211180124223602,"types":0.006211180124223602,"in":0.006211180124223602,"related":0.006211180124223602,"tools":0.006211180124223602,"build":0.006211180124223602,"app":0.006211180124223602,"local":0.006211180124223602,"environment":0.006211180124223602,"on":0.006211180124223602,"don":0.006211180124223602,"t":0.006211180124223602,"reinvent":0.006211180124223602,"wheel":0.006211180124223602,"faster":0.006211180124223602,"library":0.006211180124223602,"handles":0.006211180124223602,"basic":0.006211180124223602,"functionality":0.006211180124223602,"api":0.006211180124223602,"fetch":0.006211180124223602,"broadcast":0.006211180124223602,"transactions":0.006211180124223602,"br":0.006211180124223602,"need":0.006211180124223602,"help":0.006211180124223602,"building":0.006211180124223602,"reach":0.006211180124223602,"us":0.006211180124223602,"span":0.006211180124223602,"classname":0.006211180124223602,"font-bold":0.006211180124223602,"channel":0.006211180124223602,"discord":0.006211180124223602,"https":0.006211180124223602,"chat":0.006211180124223602,"under":0.006211180124223602,"hiro":0.006211180124223602,"developer":0.006211180124223602,"section":0.006211180124223602,"there's":0.006211180124223602,"also":0.006211180124223602,"weekly":0.006211180124223602,"office":0.006211180124223602,"hours":0.006211180124223602,"www":0.006211180124223602,"addevent":0.006211180124223602,"com":0.006211180124223602,"event":0.006211180124223602,"ki22007085":0.006211180124223602,"every":0.006211180124223602,"wednesday":0.006211180124223602,"at":0.006211180124223602,"1pm":0.006211180124223602,"et":0.006211180124223602},"9":{"1":0.002976190476190476,"2":0.002976190476190476,"3":0.002976190476190476,"5":0.002976190476190476,"40":0.002976190476190476,"41":0.002976190476190476,"245":0.002976190476190476,"4752":0.002976190476190476,"15000":0.002976190476190476,"15000000":0.002976190476190476,"100000000":0.002976190476190476,"import":0.002976190476190476,"chevronright":0.002976190476190476,"code":0.002976190476190476,"terminal":0.002976190476190476,"from":0.002976190476190476,"'lucide-react'":0.002976190476190476,"file":0.002976190476190476,"folder":0.002976190476190476,"files":0.002976190476190476,"'fumadocs-ui":0.002976190476190476,"components":0.002976190476190476,"files'":0.002976190476190476,"steps":0.002976190476190476,"step":0.002976190476190476,"steps'":0.002976190476190476,"smallcard":0.002976190476190476,"'":0.002976190476190476,"card'":0.002976190476190476,"in":0.002976190476190476,"this":0.002976190476190476,"quickstart":0.002976190476190476,"guide":0.002976190476190476,"you":0.002976190476190476,"will":0.002976190476190476,"initialize":0.002976190476190476,"a":0.002976190476190476,"simulated":0.002976190476190476,"development":0.002976190476190476,"network":0.002976190476190476,"for":0.002976190476190476,"testing":0.002976190476190476,"smart":0.002976190476190476,"contract":0.002976190476190476,"using":0.002976190476190476,"the":0.002976190476190476,"clarinet":0.002976190476190476,"js":0.002976190476190476,"sdk":0.002976190476190476,"you'll":0.002976190476190476,"learn":0.002976190476190476,"how":0.002976190476190476,"to":0.002976190476190476,"your":0.002976190476190476,"project":0.002976190476190476,"interact":0.002976190476190476,"with":0.002976190476190476,"call":0.002976190476190476,"its":0.002976190476190476,"functions":0.002976190476190476,"and":0.002976190476190476,"test":0.002976190476190476,"results":0.002976190476190476,"check":0.002976190476190476,"out":0.002976190476190476,"methods":0.002976190476190476,"stacks":0.002976190476190476,"clarinet-js-sdk":0.002976190476190476,"references":0.002976190476190476,"page":0.002976190476190476,"about":0.002976190476190476,"different":0.002976190476190476,"ways":0.002976190476190476,"that":0.002976190476190476,"can":0.002976190476190476,"simnet":0.002976190476190476,"---":0.002976190476190476,"importing":0.002976190476190476,"dependencies":0.002976190476190476,"before":0.002976190476190476,"we":0.002976190476190476,"dive":0.002976190476190476,"navigate":0.002976190476190476,"cl":0.002976190476190476,"helper":0.002976190476190476,"transactions":0.002976190476190476,"package":0.002976190476190476,"classname":0.002976190476190476,"'pointer-events-none'":0.002976190476190476,"name":0.002976190476190476,"contracts":0.002976190476190476,"defaultopen":0.002976190476190476,"counter":0.002976190476190476,"clar":0.002976190476190476,"settings":0.002976190476190476,"tests":0.002976190476190476,"ts":0.002976190476190476,"'bg-":0.002976190476190476,"hsl":0.002976190476190476,"var":0.002976190476190476,"--highlight":0.002976190476190476,"gitignore":0.002976190476190476,"toml":0.002976190476190476,"json":0.002976190476190476,"tsconfig":0.002976190476190476,"vitest":0.002976190476190476,"config":0.002976190476190476,"describe":0.002976190476190476,"expect":0.002976190476190476,"it":0.002976190476190476,"namespace":0.002976190476190476,"simplifies":0.002976190476190476,"process":0.002976190476190476,"of":0.002976190476190476,"creating":0.002976190476190476,"handling":0.002976190476190476,"clarity":0.002976190476190476,"values":0.002976190476190476,"functionality":0.002976190476190476,"is":0.002976190476190476,"particularly":0.002976190476190476,"useful":0.002976190476190476,"environments":0.002976190476190476,"where":0.002976190476190476,"developers":0.002976190476190476,"need":0.002976190476190476,"simulate":0.002976190476190476,"interactions":0.002976190476190476,"accurately":0.002976190476190476,"retrieve":0.002976190476190476,"an":0.002976190476190476,"account":0.002976190476190476,"most":0.002976190476190476,"cases":0.002976190476190476,"want":0.002976190476190476,"order":0.002976190476190476,"following":0.002976190476190476,"uses":0.002976190476190476,"getaccounts":0.002976190476190476,"method":0.002976190476190476,"achieve":0.002976190476190476,"const":0.002976190476190476,"accounts":0.002976190476190476,"wallet":0.002976190476190476,"get":0.002976190476190476,"wallet_1":0.002976190476190476,"callout":0.002976190476190476,"title":0.002976190476190476,"note":0.002976190476190476,"--stacks":0.002976190476190476,"flag":0.002976190476190476,"required":0.002976190476190476,"allows":0.002976190476190476,"specify":0.002976190476190476,"scan":0.002976190476190476,"other":0.002976190476190476,"options":0.002976190476190476,"include":0.002976190476190476,"--bitcoin":0.002976190476190476,"write":0.002976190476190476,"first":0.002976190476190476,"writing":0.002976190476190476,"follows":0.002976190476190476,"structured":0.002976190476190476,"approach":0.002976190476190476,"similar":0.002976190476190476,"javascript":0.002976190476190476,"here's":0.002976190476190476,"breakdown":0.002976190476190476,"involved":0.002976190476190476,"define":0.002976190476190476,"group":0.002976190476190476,"run":0.002976190476190476,"block":0.002976190476190476,"function":0.002976190476190476,"assert":0.002976190476190476,"result":0.002976190476190476,"now":0.002976190476190476,"understand":0.002976190476190476,"key":0.002976190476190476,"start":0.002976190476190476,"by":0.002976190476190476,"ensures":0.002976190476190476,"has":0.002976190476190476,"been":0.002976190476190476,"deployed":0.002976190476190476,"contractsource":0.002976190476190476,"getcontractsource":0.002976190476190476,"tobedefined":0.002976190476190476,"count-up":0.002976190476190476,"it's":0.002976190476190476,"time":0.002976190476190476,"public":0.002976190476190476,"expected":0.002976190476190476,"increment":0.002976190476190476,"count":0.002976190476190476,"user's":0.002976190476190476,"principal":0.002976190476190476,"ensure":0.002976190476190476,"behaves":0.002976190476190476,"as":0.002976190476190476,"increments":0.002976190476190476,"countupcall":0.002976190476190476,"callpublicfn":0.002976190476190476,"tobeok":0.002976190476190476,"bool":0.002976190476190476,"true":0.002976190476190476,"getcountcall":0.002976190476190476,"callreadonlyfn":0.002976190476190476,"get-count":0.002976190476190476,"tobeuint":0.002976190476190476,"above":0.002976190476190476,"called":0.002976190476190476,"asserted":0.002976190476190476,"return":0.002976190476190476,"ok":0.002976190476190476,"then":0.002976190476190476,"retrieved":0.002976190476190476,"be":0.002976190476190476,"u1":0.002976190476190476,"custom":0.002976190476190476,"matchers":0.002976190476190476,"p":0.002976190476190476,"are":0.002976190476190476,"used":0.002976190476190476,"returns":0.002976190476190476,"proper":0.002976190476190476,"more":0.002976190476190476,"details":0.002976190476190476,"custom-matchers":0.002976190476190476,"every":0.002976190476190476,"generated":0.002976190476190476,"comes":0.002976190476190476,"contains":0.002976190476190476,"necessary":0.002976190476190476,"scripts":0.002976190476190476,"report":0.002976190476190476,"--":0.002976190476190476,"--coverage":0.002976190476190476,"--costs":0.002976190476190476,"watch":0.002976190476190476,"chokidar":0.002976190476190476,"-c":0.002976190476190476,"npm":0.002976190476190476,"preferred":0.002976190476190476,"manager":0.002976190476190476,"executing":0.002976190476190476,"command":0.002976190476190476,"coverage":0.002976190476190476,"cost":0.002976190476190476,"analysis":0.002976190476190476,"automatically":0.002976190476190476,"also":0.002976190476190476,"produce":0.002976190476190476,"on":0.002976190476190476,"ran":0.002976190476190476,"running":0.002976190476190476,"lcov":0.002976190476190476,"info":0.002976190476190476,"costs-reports":0.002976190476190476,"appear":0.002976190476190476,"root":0.002976190476190476,"output":0.002976190476190476,"since":0.002976190476190476,"was":0.002976190476190476,"our":0.002976190476190476,"would":0.002976190476190476,"look":0.002976190476190476,"like":0.002976190476190476,"test_name":0.002976190476190476,"ts__counter":0.002976190476190476,"contract__increments":0.002976190476190476,"contract_id":0.002976190476190476,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.002976190476190476,"args":0.002976190476190476,"cost_result":0.002976190476190476,"total":0.002976190476190476,"write_length":0.002976190476190476,"write_count":0.002976190476190476,"read_length":0.002976190476190476,"read_count":0.002976190476190476,"runtime":0.002976190476190476,"limit":0.002976190476190476,"5000000000":0.002976190476190476,"memory":0.002976190476190476,"memory_limit":0.002976190476190476,"access":0.002976190476190476,"read":0.002976190476190476,"human-readable":0.002976190476190476,"format":0.002976190476190476,"install":0.002976190476190476,"https":0.002976190476190476,"github":0.002976190476190476,"com":0.002976190476190476,"linux-test-project":0.002976190476190476,"helps":0.002976190476190476,"generate":0.002976190476190476,"graphical":0.002976190476190476,"front-end":0.002976190476190476,"tools":0.002976190476190476,"brew":0.002976190476190476,"we'll":0.002976190476190476,"genhtml":0.002976190476190476,"below":0.002976190476190476,"actual":0.002976190476190476,"html":0.002976190476190476,"add":0.002976190476190476,"additional":0.002976190476190476,"branch":0.002976190476190476,"store":0.002976190476190476,"new":0.002976190476190476,"--branch-coverage":0.002976190476190476,"-o":0.002976190476190476,"into":0.002976190476190476,"open":0.002976190476190476,"index":0.002976190476190476,"view":0.002976190476190476,"addition":0.002976190476190476,"summary":0.002976190476190476,"outputted":0.002976190476190476,"next":0.002976190476190476,"cards":0.002976190476190476,"card":0.002976190476190476,"href":0.002976190476190476,"api":0.002976190476190476,"reference":0.002976190476190476,"description":0.002976190476190476,"deeper":0.002976190476190476,"properties":0.002976190476190476,"available":0.002976190476190476,"guides":0.002976190476190476,"migrate-to-the-clarinet-sdk":0.002976190476190476,"migrating":0.002976190476190476,"migrate":0.002976190476190476,"existing":0.002976190476190476,"projects":0.002976190476190476},"10":{"0":0.05555555555555555,"18":0.05555555555555555,"callout":0.05555555555555555,"type":0.05555555555555555,"warn":0.05555555555555555,"the":0.05555555555555555,"sdk":0.05555555555555555,"requires":0.05555555555555555,"node":0.05555555555555555,"js":0.05555555555555555,"and":0.05555555555555555,"npm":0.05555555555555555,"to":0.05555555555555555,"be":0.05555555555555555,"installed":0.05555555555555555,"package-install":0.05555555555555555,"hirosystems":0.05555555555555555,"clarinet-sdk":0.05555555555555555},"11":{"595650":0.006329113924050633,"import":0.006329113924050633,"database":0.006329113924050633,"ticket":0.006329113924050633,"from":0.006329113924050633,"'lucide-react'":0.006329113924050633,"blockchain":0.006329113924050633,"bitcoinicon":0.006329113924050633,"clarinet":0.006329113924050633,"container":0.006329113924050633,"dao":0.006329113924050633,"js":0.006329113924050633,"plant":0.006329113924050633,"shapes":0.006329113924050633,"stacksicon":0.006329113924050633,"'":0.006329113924050633,"components":0.006329113924050633,"ui":0.006329113924050633,"icon'":0.006329113924050633,"secondarycard":0.006329113924050633,"smallcard":0.006329113924050633,"card'":0.006329113924050633,"div":0.006329113924050633,"classname":0.006329113924050633,"'flex":0.006329113924050633,"flex-col":0.006329113924050633,"space-y-10'":0.006329113924050633,"cards":0.006329113924050633,"icon":0.006329113924050633,"href":0.006329113924050633,"stacks":0.006329113924050633,"quickstart":0.006329113924050633,"title":0.006329113924050633,"create":0.006329113924050633,"your":0.006329113924050633,"first":0.006329113924050633,"smart":0.006329113924050633,"contract":0.006329113924050633,"description":0.006329113924050633,"build":0.006329113924050633,"a":0.006329113924050633,"simple":0.006329113924050633,"counter":0.006329113924050633,"using":0.006329113924050633,"tag":0.006329113924050633,"'clarinet'":0.006329113924050633,"clarinet-js-sdk":0.006329113924050633,"write":0.006329113924050633,"unit":0.006329113924050633,"tests":0.006329113924050633,"for":0.006329113924050633,"contracts":0.006329113924050633,"learn":0.006329113924050633,"how":0.006329113924050633,"run":0.006329113924050633,"with":0.006329113924050633,"sdk":0.006329113924050633,"'clarinet":0.006329113924050633,"sdk'":0.006329113924050633,"make":0.006329113924050633,"call":0.006329113924050633,"to":0.006329113924050633,"integrate":0.006329113924050633,"into":0.006329113924050633,"app":0.006329113924050633,"'stacks":0.006329113924050633,"js'":0.006329113924050633,"chainhook":0.006329113924050633,"stream":0.006329113924050633,"custom":0.006329113924050633,"events":0.006329113924050633,"use":0.006329113924050633,"filter":0.006329113924050633,"deployments":0.006329113924050633,"'chainhook'":0.006329113924050633,"flex-col'":0.006329113924050633,"h4":0.006329113924050633,"id":0.006329113924050633,"learn-by-example":0.006329113924050633,"text-":0.006329113924050633,"dark":0.006329113924050633,"8c877d":0.006329113924050633,"scroll-m-20":0.006329113924050633,"not-prose":0.006329113924050633,"group":0.006329113924050633,"text-sm":0.006329113924050633,"uppercase":0.006329113924050633,"by":0.006329113924050633,"example":0.006329113924050633,"---":0.006329113924050633,"guides":0.006329113924050633,"build-an-nft-marketplace":0.006329113924050633,"an":0.006329113924050633,"nft":0.006329113924050633,"marketplace":0.006329113924050633,"and":0.006329113924050633,"deploy":0.006329113924050633,"own":0.006329113924050633,"launch":0.006329113924050633,"decentralized":0.006329113924050633,"autonomous":0.006329113924050633,"organization":0.006329113924050633,"discover":0.006329113924050633,"the":0.006329113924050633,"steps":0.006329113924050633,"creating":0.006329113924050633,"no-loss-lottery":0.006329113924050633,"no-loss":0.006329113924050633,"lottery":0.006329113924050633,"pool":0.006329113924050633,"that":0.006329113924050633,"leverages":0.006329113924050633,"stacking":0.006329113924050633,"yield":0.006329113924050633,"build-a-decentralized-kickstarter":0.006329113924050633,"kickstarter":0.006329113924050633,"crowdfunding":0.006329113924050633,"enabling":0.006329113924050633,"creators":0.006329113924050633,"fund":0.006329113924050633,"their":0.006329113924050633,"projects":0.006329113924050633,"without":0.006329113924050633,"third":0.006329113924050633,"party":0.006329113924050633,"installation-guides":0.006329113924050633,"installation":0.006329113924050633,"sync-a-bitcoin-node":0.006329113924050633,"sync":0.006329113924050633,"bitcoin":0.006329113924050633,"node":0.006329113924050633,"set":0.006329113924050633,"up":0.006329113924050633,"tools":0.006329113924050633,"like":0.006329113924050633,"as":0.006329113924050633,"service":0.006329113924050633,"sync-a-stacks-node":0.006329113924050633,"or":0.006329113924050633,"spin":0.006329113924050633,"api":0.006329113924050633,"installing-docker":0.006329113924050633,"install":0.006329113924050633,"docker":0.006329113924050633,"on":0.006329113924050633,"machine":0.006329113924050633,"essential":0.006329113924050633,"running":0.006329113924050633,"local":0.006329113924050633,"development":0.006329113924050633,"callout":0.006329113924050633,"type":0.006329113924050633,"tip":0.006329113924050633,"more":0.006329113924050633,"check":0.006329113924050633,"out":0.006329113924050633,"our":0.006329113924050633,"section":0.006329113924050633},"12":{"0":0.002386634844868735,"1":0.002386634844868735,"2":0.002386634844868735,"3":0.002386634844868735,"10":0.002386634844868735,"100":0.002386634844868735,"1000":0.002386634844868735,"integration":0.002386634844868735,"testing":0.002386634844868735,"is":0.002386634844868735,"a":0.002386634844868735,"crucial":0.002386634844868735,"step":0.002386634844868735,"in":0.002386634844868735,"smart":0.002386634844868735,"contract":0.002386634844868735,"development":0.002386634844868735,"that":0.002386634844868735,"involves":0.002386634844868735,"how":0.002386634844868735,"different":0.002386634844868735,"components":0.002386634844868735,"of":0.002386634844868735,"your":0.002386634844868735,"system":0.002386634844868735,"work":0.002386634844868735,"together":0.002386634844868735,"the":0.002386634844868735,"clarinet":0.002386634844868735,"js":0.002386634844868735,"sdk":0.002386634844868735,"provides":0.002386634844868735,"powerful":0.002386634844868735,"tools":0.002386634844868735,"for":0.002386634844868735,"writing":0.002386634844868735,"and":0.002386634844868735,"running":0.002386634844868735,"tests":0.002386634844868735,"allowing":0.002386634844868735,"you":0.002386634844868735,"to":0.002386634844868735,"simulate":0.002386634844868735,"complex":0.002386634844868735,"scenarios":0.002386634844868735,"interactions":0.002386634844868735,"between":0.002386634844868735,"multiple":0.002386634844868735,"contracts":0.002386634844868735,"by":0.002386634844868735,"using":0.002386634844868735,"can":0.002386634844868735,"ensure":0.002386634844868735,"function":0.002386634844868735,"correctly":0.002386634844868735,"as":0.002386634844868735,"part":0.002386634844868735,"larger":0.002386634844868735,"catch":0.002386634844868735,"potential":0.002386634844868735,"issues":0.002386634844868735,"might":0.002386634844868735,"not":0.002386634844868735,"be":0.002386634844868735,"apparent":0.002386634844868735,"unit":0.002386634844868735,"alone":0.002386634844868735,"this":0.002386634844868735,"guide":0.002386634844868735,"will":0.002386634844868735,"set":0.002386634844868735,"up":0.002386634844868735,"project":0.002386634844868735,"with":0.002386634844868735,"defi":0.002386634844868735,"set-up-a-clarinet-project":0.002386634844868735,"write":0.002386634844868735,"an":0.002386634844868735,"test":0.002386634844868735,"test-the-deposit-and-borrow-functionality":0.002386634844868735,"run":0.002386634844868735,"generate":0.002386634844868735,"coverage":0.002386634844868735,"reports":0.002386634844868735,"run-tests-and-generate-coverage-reports":0.002386634844868735,"---":0.002386634844868735,"start":0.002386634844868735,"creating":0.002386634844868735,"new":0.002386634844868735,"command":0.002386634844868735,"create":0.002386634844868735,"directory":0.002386634844868735,"named":0.002386634844868735,"basic":0.002386634844868735,"inside":0.002386634844868735,"it":0.002386634844868735,"terminal":0.002386634844868735,"stx-defi":0.002386634844868735,"cd":0.002386634844868735,"after":0.002386634844868735,"changing":0.002386634844868735,"into":0.002386634844868735,"npm":0.002386634844868735,"install":0.002386634844868735,"package":0.002386634844868735,"dependencies":0.002386634844868735,"we":0.002386634844868735,"are":0.002386634844868735,"going":0.002386634844868735,"use":0.002386634844868735,"same":0.002386634844868735,"used":0.002386634844868735,"stacks":0.002386634844868735,"clarinet-js-sdk":0.002386634844868735,"guides":0.002386634844868735,"unit-testing":0.002386634844868735,"but":0.002386634844868735,"some":0.002386634844868735,"additional":0.002386634844868735,"functionality":0.002386634844868735,"-":0.002386634844868735,"ability":0.002386634844868735,"borrow":0.002386634844868735,"stx":0.002386634844868735,"from":0.002386634844868735,"if":0.002386634844868735,"don't":0.002386634844868735,"have":0.002386634844868735,"already":0.002386634844868735,"follow":0.002386634844868735,"steps":0.002386634844868735,"below":0.002386634844868735,"then":0.002386634844868735,"clar":0.002386634844868735,"file":0.002386634844868735,"copy":0.002386634844868735,"paste":0.002386634844868735,"following":0.002386634844868735,"code":0.002386634844868735,"clarity":0.002386634844868735,"error":0.002386634844868735,"constants":0.002386634844868735,"various":0.002386634844868735,"failure":0.002386634844868735,"define-constant":0.002386634844868735,"err-overborrow":0.002386634844868735,"err":0.002386634844868735,"u300":0.002386634844868735,"interest":0.002386634844868735,"rate":0.002386634844868735,"loans":0.002386634844868735,"represented":0.002386634844868735,"out":0.002386634844868735,"base":0.002386634844868735,"define-data-var":0.002386634844868735,"loan-interest-rate":0.002386634844868735,"uint":0.002386634844868735,"u10":0.002386634844868735,"representing":0.002386634844868735,"holds":0.002386634844868735,"total":0.002386634844868735,"amount":0.002386634844868735,"deposits":0.002386634844868735,"initialized":0.002386634844868735,"total-deposits":0.002386634844868735,"u0":0.002386634844868735,"maps":0.002386634844868735,"user's":0.002386634844868735,"principal":0.002386634844868735,"address":0.002386634844868735,"their":0.002386634844868735,"deposited":0.002386634844868735,"define-map":0.002386634844868735,"owner":0.002386634844868735,"borrower's":0.002386634844868735,"loan":0.002386634844868735,"details":0.002386634844868735,"last":0.002386634844868735,"interaction":0.002386634844868735,"block":0.002386634844868735,"last-interaction-block":0.002386634844868735,"public":0.002386634844868735,"users":0.002386634844868735,"deposit":0.002386634844868735,"updates":0.002386634844868735,"balance":0.002386634844868735,"define-public":0.002386634844868735,"let":0.002386634844868735,"fetch":0.002386634844868735,"current":0.002386634844868735,"or":0.002386634844868735,"default":0.002386634844868735,"none":0.002386634844868735,"exists":0.002386634844868735,"current-balance":0.002386634844868735,"default-to":0.002386634844868735,"get":0.002386634844868735,"map-get":0.002386634844868735,"tx-sender":0.002386634844868735,"transfer":0.002386634844868735,"sender":0.002386634844868735,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.002386634844868735,"recipient":0.002386634844868735,"ie":0.002386634844868735,"identifier":0.002386634844868735,"on":0.002386634844868735,"chain":0.002386634844868735,"try":0.002386634844868735,"stx-transfer":0.002386634844868735,"as-contract":0.002386634844868735,"update":0.002386634844868735,"map":0.002386634844868735,"map-set":0.002386634844868735,"variable":0.002386634844868735,"var-set":0.002386634844868735,"var-get":0.002386634844868735,"return":0.002386634844868735,"success":0.002386634844868735,"ok":0.002386634844868735,"true":0.002386634844868735,"based":0.002386634844868735,"user-deposit":0.002386634844868735,"calculate":0.002386634844868735,"maximum":0.002386634844868735,"user":0.002386634844868735,"allowed":0.002386634844868735,"which":0.002386634844868735,"upto":0.002386634844868735,"half":0.002386634844868735,"what":0.002386634844868735,"they":0.002386634844868735,"allowed-borrow":0.002386634844868735,"u2":0.002386634844868735,"initial":0.002386634844868735,"values":0.002386634844868735,"current-loan-details":0.002386634844868735,"accrued":0.002386634844868735,"accrued-interest":0.002386634844868735,"calculate-accrued-interest":0.002386634844868735,"due":0.002386634844868735,"including":0.002386634844868735,"total-due":0.002386634844868735,"unwrap-panic":0.002386634844868735,"borrowing":0.002386634844868735,"new-loan":0.002386634844868735,"requested":0.002386634844868735,"does":0.002386634844868735,"exceed":0.002386634844868735,"asserts":0.002386634844868735,"borrowed":0.002386634844868735,"block-height":0.002386634844868735,"read-only":0.002386634844868735,"define-read-only":0.002386634844868735,"get-balance-by-sender":0.002386634844868735,"owed":0.002386634844868735,"get-amount-owed":0.002386634844868735,"private":0.002386634844868735,"define-private":0.002386634844868735,"start-block":0.002386634844868735,"number":0.002386634844868735,"blocks":0.002386634844868735,"elapsed":0.002386634844868735,"since":0.002386634844868735,"elapsed-blocks":0.002386634844868735,"time":0.002386634844868735,"u10000":0.002386634844868735,"started":0.002386634844868735,"past":0.002386634844868735,"at":0.002386634844868735,"is-eq":0.002386634844868735,"calculated":0.002386634844868735,"check":0.002386634844868735,"valid":0.002386634844868735,"ready":0.002386634844868735,"callout":0.002386634844868735,"find":0.002386634844868735,"full":0.002386634844868735,"repo":0.002386634844868735,"https":0.002386634844868735,"github":0.002386634844868735,"com":0.002386634844868735,"hirosystems":0.002386634844868735,"clarity-examples":0.002386634844868735,"tree":0.002386634844868735,"main":0.002386634844868735,"examples":0.002386634844868735,"order":0.002386634844868735,"must":0.002386634844868735,"first":0.002386634844868735,"therefore":0.002386634844868735,"need":0.002386634844868735,"simulates":0.002386634844868735,"these":0.002386634844868735,"two":0.002386634844868735,"functions":0.002386634844868735,"ts":0.002386634844868735,"replace":0.002386634844868735,"boilerplate":0.002386634844868735,"add":0.002386634844868735,"typescript":0.002386634844868735,"import":0.002386634844868735,"describe":0.002386634844868735,"expect":0.002386634844868735,"'vitest'":0.002386634844868735,"cl":0.002386634844868735,"'":0.002386634844868735,"transactions'":0.002386634844868735,"const":0.002386634844868735,"accounts":0.002386634844868735,"simnet":0.002386634844868735,"getaccounts":0.002386634844868735,"wallet1":0.002386634844868735,"'wallet_1'":0.002386634844868735,"'stx-defi'":0.002386634844868735,"'borrows":0.002386634844868735,"verifies":0.002386634844868735,"10'":0.002386634844868735,"callpublicfn":0.002386634844868735,"'defi'":0.002386634844868735,"'deposit'":0.002386634844868735,"totaldeposits":0.002386634844868735,"getdatavar":0.002386634844868735,"'total-deposits'":0.002386634844868735,"tobeuint":0.002386634844868735,"'borrow'":0.002386634844868735,"result":0.002386634844868735,"callreadonlyfn":0.002386634844868735,"'get-amount-owed'":0.002386634844868735,"tobeok":0.002386634844868735,"we're":0.002386634844868735,"simulating":0.002386634844868735,"scenario":0.002386634844868735,"where":0.002386634844868735,"borrows":0.002386634844868735,"against":0.002386634844868735,"let's":0.002386634844868735,"walk":0.002386634844868735,"through":0.002386634844868735,"process":0.002386634844868735,"do":0.002386634844868735,"method":0.002386634844868735,"object":0.002386634844868735,"allows":0.002386634844868735,"us":0.002386634844868735,"call":0.002386634844868735,"our":0.002386634844868735,"just":0.002386634844868735,"would":0.002386634844868735,"actual":0.002386634844868735,"blockchain":0.002386634844868735,"making":0.002386634844868735,"want":0.002386634844868735,"verify":0.002386634844868735,"was":0.002386634844868735,"successful":0.002386634844868735,"checking":0.002386634844868735,"handy":0.002386634844868735,"lets":0.002386634844868735,"peek":0.002386634844868735,"value":0.002386634844868735,"data":0.002386634844868735,"variables":0.002386634844868735,"defined":0.002386634844868735,"learn":0.002386634844868735,"more":0.002386634844868735,"about":0.002386634844868735,"available":0.002386634844868735,"methods":0.002386634844868735,"reference":0.002386634844868735,"page":0.002386634844868735,"references":0.002386634844868735,"recorded":0.002386634844868735,"custom":0.002386634844868735,"matcher":0.002386634844868735,"specifically":0.002386634844868735,"designed":0.002386634844868735,"unsigned":0.002386634844868735,"integer":0.002386634844868735,"exact":0.002386634844868735,"confirmed":0.002386634844868735,"another":0.002386634844868735,"invoking":0.002386634844868735,"operation":0.002386634844868735,"much":0.002386634844868735,"owes":0.002386634844868735,"finally":0.002386634844868735,"particularly":0.002386634844868735,"useful":0.002386634844868735,"because":0.002386634844868735,"checks":0.002386634844868735,"things":0.002386634844868735,"once":0.002386634844868735,"returned":0.002386634844868735,"response":0.002386634844868735,"type":0.002386634844868735,"matchers":0.002386634844868735,"allow":0.002386634844868735,"make":0.002386634844868735,"detailed":0.002386634844868735,"assertions":0.002386634844868735,"results":0.002386634844868735,"report":0.002386634844868735,"produce":0.002386634844868735,"helping":0.002386634844868735,"identify":0.002386634844868735,"any":0.002386634844868735,"untested":0.002386634844868735,"parts":0.002386634844868735,"next":0.002386634844868735,"cards":0.002386634844868735,"card":0.002386634844868735,"href":0.002386634844868735,"title":0.002386634844868735,"api":0.002386634844868735,"description":0.002386634844868735,"dive":0.002386634844868735,"deeper":0.002386634844868735,"properties":0.002386634844868735,"custom-matchers":0.002386634844868735},"13":{"import":0.011627906976744186,"button":0.011627906976744186,"from":0.011627906976744186,"components":0.011627906976744186,"ui":0.011627906976744186,"secondarycard":0.011627906976744186,"card":0.011627906976744186,"the":0.011627906976744186,"hiro":0.011627906976744186,"archive":0.011627906976744186,"enables":0.011627906976744186,"you":0.011627906976744186,"to":0.011627906976744186,"quickly":0.011627906976744186,"bootstrap":0.011627906976744186,"supported":0.011627906976744186,"services":0.011627906976744186,"with":0.011627906976744186,"pre-loaded":0.011627906976744186,"data":0.011627906976744186,"which":0.011627906976744186,"otherwise":0.011627906976744186,"could":0.011627906976744186,"take":0.011627906976744186,"days":0.011627906976744186,"or":0.011627906976744186,"weeks":0.011627906976744186,"acquire":0.011627906976744186,"when":0.011627906976744186,"syncing":0.011627906976744186,"genesis":0.011627906976744186,"this":0.011627906976744186,"is":0.011627906976744186,"a":0.011627906976744186,"public":0.011627906976744186,"service":0.011627906976744186,"offers":0.011627906976744186,"as":0.011627906976744186,"free":0.011627906976744186,"benefit":0.011627906976744186,"stacks":0.011627906976744186,"community":0.011627906976744186,"classname":0.011627906976744186,"bg-orange-500":0.011627906976744186,"hover":0.011627906976744186,"bg-orange-600":0.011627906976744186,"href":0.011627906976744186,"https":0.011627906976744186,"so":0.011627906976744186,"target":0.011627906976744186,"_blank":0.011627906976744186,"no-underline":0.011627906976744186,"view":0.011627906976744186,"we":0.011627906976744186,"record":0.011627906976744186,"and":0.011627906976744186,"mainnet":0.011627906976744186,"testnet":0.011627906976744186,"snapshots":0.011627906976744186,"for":0.011627906976744186,"following":0.011627906976744186,"every":0.011627906976744186,"night":0.011627906976744186,"cards":0.011627906976744186,"guides":0.011627906976744186,"verify-archive-data":0.011627906976744186,"title":0.011627906976744186,"verify":0.011627906976744186,"description":0.011627906976744186,"integrity":0.011627906976744186,"of":0.011627906976744186,"in":0.011627906976744186,"particular":0.011627906976744186,"snapshot":0.011627906976744186,"stacks-blockchain":0.011627906976744186,"blockchain":0.011627906976744186,"spin":0.011627906976744186,"up":0.011627906976744186,"new":0.011627906976744186,"node":0.011627906976744186,"stacks-api":0.011627906976744186,"api":0.011627906976744186,"instance":0.011627906976744186,"token-metadata-api":0.011627906976744186,"token":0.011627906976744186,"metadata":0.011627906976744186},"14":{"1":0.004424778761061947,"4":0.004424778761061947,"3999":0.004424778761061947,"prerequisites":0.004424778761061947,"since":0.004424778761061947,"the":0.004424778761061947,"stacks":0.004424778761061947,"blockchain":0.004424778761061947,"api":0.004424778761061947,"depends":0.004424778761061947,"on":0.004424778761061947,"a":0.004424778761061947,"node":0.004424778761061947,"being":0.004424778761061947,"at":0.004424778761061947,"same":0.004424778761061947,"block":0.004424778761061947,"height":0.004424778761061947,"you":0.004424778761061947,"will":0.004424778761061947,"need":0.004424778761061947,"to":0.004424778761061947,"first":0.004424778761061947,"restore":0.004424778761061947,"using":0.004424778761061947,"hiro":0.004424778761061947,"archive":0.004424778761061947,"guides":0.004424778761061947,"stacks-blockchain":0.004424778761061947,"before":0.004424778761061947,"restoring":0.004424778761061947,"otherwise":0.004424778761061947,"may":0.004424778761061947,"encounter":0.004424778761061947,"errors":0.004424778761061947,"when":0.004424778761061947,"running":0.004424778761061947,"in":0.004424778761061947,"order":0.004424778761061947,"for":0.004424778761061947,"and":0.004424778761061947,"archives":0.004424778761061947,"be":0.004424778761061947,"compatible":0.004424778761061947,"they":0.004424778761061947,"must":0.004424778761061947,"meet":0.004424778761061947,"following":0.004424778761061947,"criteria":0.004424778761061947,"-":0.004424778761061947,"both":0.004424778761061947,"correspond":0.004424778761061947,"network":0.004424778761061947,"mainnet":0.004424778761061947,"testnet":0.004424778761061947,"version":0.004424778761061947,"with":0.004424778761061947,"see":0.004424778761061947,"release":0.004424778761061947,"notes":0.004424778761061947,"https":0.004424778761061947,"github":0.004424778761061947,"com":0.004424778761061947,"hirosystems":0.004424778761061947,"stacks-blockchain-api":0.004424778761061947,"releases":0.004424778761061947,"guidance":0.004424778761061947,"were":0.004424778761061947,"created":0.004424778761061947,"date":0.004424778761061947,"restoration":0.004424778761061947,"methods":0.004424778761061947,"there":0.004424778761061947,"are":0.004424778761061947,"two":0.004424778761061947,"ways":0.004424778761061947,"file":0.004424778761061947,"you'll":0.004424778761061947,"download":0.004424778761061947,"depend":0.004424778761061947,"your":0.004424778761061947,"method":0.004424778761061947,"of":0.004424778761061947,"is":0.004424778761061947,"no":0.004424778761061947,"scenario":0.004424778761061947,"where":0.004424778761061947,"would":0.004424778761061947,"via":0.004424778761061947,"postgres":0.004424778761061947,"database":0.004424778761061947,"dump":0.004424778761061947,"recommended":0.004424778761061947,"this":0.004424778761061947,"quickest":0.004424778761061947,"most":0.004424778761061947,"direct":0.004424778761061947,"it":0.004424778761061947,"suitable":0.004424778761061947,"scenarios":0.004424778761061947,"consists":0.004424778761061947,"backup":0.004424778761061947,"api's":0.004424778761061947,"taken":0.004424778761061947,"pg_dump":0.004424778761061947,"we":0.004424778761061947,"generally":0.004424778761061947,"recommend":0.004424778761061947,"starting":0.004424778761061947,"attempting":0.004424778761061947,"below":0.004424778761061947,"if":0.004424778761061947,"one":0.004424778761061947,"does":0.004424778761061947,"not":0.004424778761061947,"work":0.004424778761061947,"any":0.004424778761061947,"reason":0.004424778761061947,"tab-separated-values":0.004424778761061947,"tsv":0.004424778761061947,"several":0.004424778761061947,"times":0.004424778761061947,"slower":0.004424778761061947,"than":0.004424778761061947,"from":0.004424778761061947,"contains":0.004424778761061947,"raw":0.004424778761061947,"unprocessed":0.004424778761061947,"events":0.004424778761061947,"can":0.004424778761061947,"ingest":0.004424778761061947,"process":0.004424778761061947,"into":0.004424778761061947,"useful":0.004424778761061947,"particular":0.004424778761061947,"available":0.004424778761061947,"or":0.004424778761061947,"cannot":0.004424778761061947,"used":0.004424778761061947,"depending":0.004424778761061947,"above":0.004424778761061947,"each":0.004424778761061947,"found":0.004424778761061947,"locations":0.004424778761061947,"so":0.004424778761061947,"stacks-blockchain-api-pg":0.004424778761061947,"name":0.004424778761061947,"patterns":0.004424778761061947,"as":0.004424778761061947,"follows":0.004424778761061947,"stacks-blockchain-api-pg-":0.004424778761061947,"yyyymmdd":0.004424778761061947,"shasum":0.004424778761061947,"sha256":0.004424778761061947,"-stacks-blockchain-api-":0.004424778761061947,"gz":0.004424778761061947,"continually":0.004424778761061947,"updated":0.004424778761061947,"which":0.004424778761061947,"always":0.004424778761061947,"points":0.004424778761061947,"recent":0.004424778761061947,"upload":0.004424778761061947,"-latest":0.004424778761061947,"-stacks-blockchain-api-latest":0.004424778761061947,"appropriate":0.004424778761061947,"verify":0.004424778761061947,"verify-archive-data":0.004424778761061947,"import":0.004424778761061947,"take":0.004424778761061947,"up":0.004424778761061947,"an":0.004424778761061947,"hour":0.004424778761061947,"specs":0.004424778761061947,"tuning":0.004424778761061947,"terminal":0.004424778761061947,"export":0.004424778761061947,"pgpassword":0.004424778761061947,"password":0.004424778761061947,"pg_restore":0.004424778761061947,"--username":0.004424778761061947,"--verbose":0.004424778761061947,"--jobs":0.004424778761061947,"--dbname":0.004424778761061947,"stacks_blockchain_api":0.004424778761061947,"path":0.004424778761061947,"launch":0.004424778761061947,"service":0.004424778761061947,"dataset":0.004424778761061947,"by":0.004424778761061947,"comparing":0.004424778761061947,"nodes":0.004424778761061947,"local":0.004424778761061947,"http":0.004424778761061947,"localhost":0.004424778761061947,"extended":0.004424778761061947,"v1":0.004424778761061947,"status":0.004424778761061947,"hiro's":0.004424778761061947,"matches":0.004424778761061947,"close":0.004424778761061947,"was":0.004424778761061947,"successful":0.004424778761061947,"few":0.004424778761061947,"minutes":0.004424778761061947,"respond":0.004424778761061947,"endpoint":0.004424778761061947,"hundred":0.004424778761061947,"blocks":0.004424778761061947,"away":0.004424778761061947,"age":0.004424778761061947,"should":0.004424778761061947,"catch":0.004424778761061947,"relatively":0.004424778761061947,"quickly":0.004424778761061947,"extract":0.004424778761061947,"desired":0.004424778761061947,"directory":0.004424778761061947,"gzip":0.004424778761061947,"-d":0.004424778761061947,"--stdout":0.004424778761061947,"extracted":0.004424778761061947,"follow":0.004424778761061947,"these":0.004424778761061947,"directions":0.004424778761061947,"export-and-import":0.004424778761061947},"15":{"1":0.0072992700729927005,"4":0.0072992700729927005,"3000":0.0072992700729927005,"prerequisites":0.0072992700729927005,"since":0.0072992700729927005,"the":0.0072992700729927005,"token":0.0072992700729927005,"metadata":0.0072992700729927005,"api":0.0072992700729927005,"depends":0.0072992700729927005,"on":0.0072992700729927005,"a":0.0072992700729927005,"stacks":0.0072992700729927005,"blockchain":0.0072992700729927005,"you":0.0072992700729927005,"will":0.0072992700729927005,"need":0.0072992700729927005,"to":0.0072992700729927005,"first":0.0072992700729927005,"launch":0.0072992700729927005,"configured":0.0072992700729927005,"for":0.0072992700729927005,"same":0.0072992700729927005,"network":0.0072992700729927005,"if":0.0072992700729927005,"don't":0.0072992700729927005,"already":0.0072992700729927005,"have":0.0072992700729927005,"one":0.0072992700729927005,"can":0.0072992700729927005,"follow":0.0072992700729927005,"these":0.0072992700729927005,"instructions":0.0072992700729927005,"archive":0.0072992700729927005,"guides":0.0072992700729927005,"stacks-blockchain":0.0072992700729927005,"with":0.0072992700729927005,"an":0.0072992700729927005,"where":0.0072992700729927005,"download":0.0072992700729927005,"archives":0.0072992700729927005,"each":0.0072992700729927005,"be":0.0072992700729927005,"found":0.0072992700729927005,"at":0.0072992700729927005,"following":0.0072992700729927005,"locations":0.0072992700729927005,"-":0.0072992700729927005,"mainnet":0.0072992700729927005,"https":0.0072992700729927005,"hiro":0.0072992700729927005,"so":0.0072992700729927005,"token-metadata-api-pg":0.0072992700729927005,"testnet":0.0072992700729927005,"file":0.0072992700729927005,"name":0.0072992700729927005,"patterns":0.0072992700729927005,"are":0.0072992700729927005,"as":0.0072992700729927005,"follows":0.0072992700729927005,"token-metadata-api-pg-":0.0072992700729927005,"database":0.0072992700729927005,"version":0.0072992700729927005,"date":0.0072992700729927005,"yyyymmdd":0.0072992700729927005,"dump":0.0072992700729927005,"shasum":0.0072992700729927005,"sha256":0.0072992700729927005,"there":0.0072992700729927005,"is":0.0072992700729927005,"continually":0.0072992700729927005,"updated":0.0072992700729927005,"and":0.0072992700729927005,"which":0.0072992700729927005,"always":0.0072992700729927005,"points":0.0072992700729927005,"most":0.0072992700729927005,"recent":0.0072992700729927005,"upload":0.0072992700729927005,"-latest":0.0072992700729927005,"or":0.0072992700729927005,"particular":0.0072992700729927005,"restoring":0.0072992700729927005,"using":0.0072992700729927005,"appropriate":0.0072992700729927005,"verify":0.0072992700729927005,"verify-archive-data":0.0072992700729927005,"import":0.0072992700729927005,"into":0.0072992700729927005,"running":0.0072992700729927005,"postgres":0.0072992700729927005,"may":0.0072992700729927005,"take":0.0072992700729927005,"up":0.0072992700729927005,"hour":0.0072992700729927005,"depending":0.0072992700729927005,"specs":0.0072992700729927005,"tuning":0.0072992700729927005,"terminal":0.0072992700729927005,"export":0.0072992700729927005,"pgpassword":0.0072992700729927005,"your":0.0072992700729927005,"password":0.0072992700729927005,"pg_restore":0.0072992700729927005,"--username":0.0072992700729927005,"--verbose":0.0072992700729927005,"--jobs":0.0072992700729927005,"--dbname":0.0072992700729927005,"token_metadata_api":0.0072992700729927005,"path":0.0072992700729927005,"service":0.0072992700729927005,"restoration":0.0072992700729927005,"was":0.0072992700729927005,"successful":0.0072992700729927005,"by":0.0072992700729927005,"viewing":0.0072992700729927005,"total":0.0072992700729927005,"number":0.0072992700729927005,"of":0.0072992700729927005,"tokens":0.0072992700729927005,"contracts":0.0072992700729927005,"tracked":0.0072992700729927005,"in":0.0072992700729927005,"http":0.0072992700729927005,"localhost":0.0072992700729927005,"property":0.0072992700729927005,"greater":0.0072992700729927005,"than":0.0072992700729927005,"zero":0.0072992700729927005,"it":0.0072992700729927005,"few":0.0072992700729927005,"minutes":0.0072992700729927005,"local":0.0072992700729927005,"node":0.0072992700729927005,"respond":0.0072992700729927005,"this":0.0072992700729927005,"endpoint":0.0072992700729927005},"16":{"1":0.010869565217391304,"all":0.010869565217391304,"datasets":0.010869565217391304,"have":0.010869565217391304,"an":0.010869565217391304,"associated":0.010869565217391304,"sha256":0.010869565217391304,"hash":0.010869565217391304,"file":0.010869565217391304,"which":0.010869565217391304,"can":0.010869565217391304,"be":0.010869565217391304,"used":0.010869565217391304,"to":0.010869565217391304,"verify":0.010869565217391304,"the":0.010869565217391304,"integrity":0.010869565217391304,"of":0.010869565217391304,"downloaded":0.010869565217391304,"dataset":0.010869565217391304,"as":0.010869565217391304,"some":0.010869565217391304,"archives":0.010869565217391304,"are":0.010869565217391304,"quite":0.010869565217391304,"large":0.010869565217391304,"this":0.010869565217391304,"is":0.010869565217391304,"useful":0.010869565217391304,"ensure":0.010869565217391304,"you've":0.010869565217391304,"matches":0.010869565217391304,"maintained":0.010869565217391304,"in":0.010869565217391304,"hiro":0.010869565217391304,"archive":0.010869565217391304,"after":0.010869565217391304,"downloading":0.010869565217391304,"and":0.010869565217391304,"its":0.010869565217391304,"shasum":0.010869565217391304,"you":0.010869565217391304,"like":0.010869565217391304,"so":0.010869565217391304,"terminal":0.010869565217391304,"echo":0.010869565217391304,"cat":0.010869565217391304,"awk":0.010869565217391304,"'":0.010869565217391304,"print":0.010869565217391304,"--check":0.010869565217391304,"ok":0.010869565217391304,"mainnet-stacks-blockchain-api-latest":0.010869565217391304,"gz":0.010869565217391304,"otherwise":0.010869565217391304,"a":0.010869565217391304,"log":0.010869565217391304,"will":0.010869565217391304,"printed":0.010869565217391304,"indicating":0.010869565217391304,"failure":0.010869565217391304,"failed":0.010869565217391304,"warning":0.010869565217391304,"computed":0.010869565217391304,"checksum":0.010869565217391304,"did":0.010869565217391304,"not":0.010869565217391304,"match":0.010869565217391304,"callout":0.010869565217391304,"title":0.010869565217391304,"note":0.010869565217391304,"type":0.010869565217391304,"warn":0.010869565217391304,"if":0.010869565217391304,"check":0.010869565217391304,"fails":0.010869565217391304,"for":0.010869565217391304,"any":0.010869565217391304,"reason":0.010869565217391304,"may":0.010869565217391304,"need":0.010869565217391304,"delete":0.010869565217391304,"local":0.010869565217391304,"re-attempt":0.010869565217391304,"download":0.010869565217391304,"issues":0.010869565217391304,"persist":0.010869565217391304,"switch":0.010869565217391304,"different":0.010869565217391304,"network":0.010869565217391304,"try":0.010869565217391304,"again":0.010869565217391304},"17":{"0":0.00684931506849315,"1":0.00684931506849315,"3":0.00684931506849315,"20443":0.00684931506849315,"where":0.00684931506849315,"to":0.00684931506849315,"download":0.00684931506849315,"archives":0.00684931506849315,"stacks":0.00684931506849315,"blockchain":0.00684931506849315,"for":0.00684931506849315,"each":0.00684931506849315,"network":0.00684931506849315,"can":0.00684931506849315,"be":0.00684931506849315,"found":0.00684931506849315,"at":0.00684931506849315,"the":0.00684931506849315,"following":0.00684931506849315,"locations":0.00684931506849315,"-":0.00684931506849315,"mainnet":0.00684931506849315,"https":0.00684931506849315,"archive":0.00684931506849315,"hiro":0.00684931506849315,"so":0.00684931506849315,"stacks-blockchain":0.00684931506849315,"testnet":0.00684931506849315,"file":0.00684931506849315,"name":0.00684931506849315,"patterns":0.00684931506849315,"are":0.00684931506849315,"as":0.00684931506849315,"follows":0.00684931506849315,"-stacks-blockchain-":0.00684931506849315,"version":0.00684931506849315,"date":0.00684931506849315,"yyyymmdd":0.00684931506849315,"tar":0.00684931506849315,"gz":0.00684931506849315,"shasum":0.00684931506849315,"sha256":0.00684931506849315,"there":0.00684931506849315,"is":0.00684931506849315,"a":0.00684931506849315,"continually":0.00684931506849315,"updated":0.00684931506849315,"and":0.00684931506849315,"which":0.00684931506849315,"always":0.00684931506849315,"points":0.00684931506849315,"most":0.00684931506849315,"recent":0.00684931506849315,"upload":0.00684931506849315,"-stacks-blockchain-latest":0.00684931506849315,"or":0.00684931506849315,"particular":0.00684931506849315,"-stacks-blockchain-2":0.00684931506849315,"2-latest":0.00684931506849315,"restoring":0.00684931506849315,"node":0.00684931506849315,"using":0.00684931506849315,"appropriate":0.00684931506849315,"verify":0.00684931506849315,"guides":0.00684931506849315,"verify-archive-data":0.00684931506849315,"with":0.00684931506849315,"extract":0.00684931506849315,"into":0.00684931506849315,"desired":0.00684931506849315,"directory":0.00684931506849315,"terminal":0.00684931506849315,"-zxvf":0.00684931506849315,"-c":0.00684931506849315,"target":0.00684931506849315,"configure":0.00684931506849315,"working_dir":0.00684931506849315,"property":0.00684931506849315,"docs":0.00684931506849315,"co":0.00684931506849315,"nodes-and-miners":0.00684931506849315,"stacks-node-configuration":0.00684931506849315,"in":0.00684931506849315,"your":0.00684931506849315,"config":0.00684931506849315,"toml":0.00684931506849315,"match":0.00684931506849315,"you":0.00684931506849315,"extracted":0.00684931506849315,"launch":0.00684931506849315,"use":0.00684931506849315,"one":0.00684931506849315,"of":0.00684931506849315,"these":0.00684931506849315,"example":0.00684931506849315,"configuration":0.00684931506849315,"files":0.00684931506849315,"github":0.00684931506849315,"com":0.00684931506849315,"stacks-network":0.00684931506849315,"tree":0.00684931506849315,"master":0.00684931506849315,"stacks-node":0.00684931506849315,"conf":0.00684931506849315,"reference":0.00684931506849315,"dataset":0.00684931506849315,"being":0.00684931506849315,"used":0.00684931506849315,"by":0.00684931506849315,"comparing":0.00684931506849315,"nodes":0.00684931506849315,"local":0.00684931506849315,"block":0.00684931506849315,"height":0.00684931506849315,"http":0.00684931506849315,"localhost":0.00684931506849315,"v2":0.00684931506849315,"info":0.00684931506849315,"hiro's":0.00684931506849315,"api":0.00684931506849315,"if":0.00684931506849315,"matches":0.00684931506849315,"close":0.00684931506849315,"restoration":0.00684931506849315,"was":0.00684931506849315,"successful":0.00684931506849315,"it":0.00684931506849315,"may":0.00684931506849315,"take":0.00684931506849315,"few":0.00684931506849315,"minutes":0.00684931506849315,"respond":0.00684931506849315,"on":0.00684931506849315,"this":0.00684931506849315,"endpoint":0.00684931506849315,"up":0.00684931506849315,"hundred":0.00684931506849315,"blocks":0.00684931506849315,"away":0.00684931506849315,"from":0.00684931506849315,"depending":0.00684931506849315,"age":0.00684931506849315,"should":0.00684931506849315,"catch":0.00684931506849315,"relatively":0.00684931506849315,"quickly":0.00684931506849315},"18":{"0":0.003937007874015748,"27":0.003937007874015748,"import":0.003937007874015748,"arrowupright":0.003937007874015748,"from":0.003937007874015748,"lucide-react":0.003937007874015748,"tooltip":0.003937007874015748,"tooltipcontent":0.003937007874015748,"tooltipprovider":0.003937007874015748,"tooltiptrigger":0.003937007874015748,"components":0.003937007874015748,"ui":0.003937007874015748,"secondarycard":0.003937007874015748,"card":0.003937007874015748,"using":0.003937007874015748,"a":0.003937007874015748,"simple":0.003937007874015748,"command":0.003937007874015748,"line":0.003937007874015748,"interface":0.003937007874015748,"clarinet":0.003937007874015748,"enables":0.003937007874015748,"you":0.003937007874015748,"to":0.003937007874015748,"build":0.003937007874015748,"and":0.003937007874015748,"iterate":0.003937007874015748,"on":0.003937007874015748,"your":0.003937007874015748,"contracts":0.003937007874015748,"locally":0.003937007874015748,"before":0.003937007874015748,"moving":0.003937007874015748,"into":0.003937007874015748,"production":0.003937007874015748,"the":0.003937007874015748,"mainnet":0.003937007874015748,"network":0.003937007874015748,"can":0.003937007874015748,"code":0.003937007874015748,"with":0.003937007874015748,"inline":0.003937007874015748,"aschild":0.003937007874015748,"span":0.003937007874015748,"classname":0.003937007874015748,"'cursor-default":0.003937007874015748,"border-b":0.003937007874015748,"border-dotted":0.003937007874015748,"border-primary'":0.003937007874015748,"clarity":0.003937007874015748,"syntax":0.003937007874015748,"support":0.003937007874015748,"vscode":0.003937007874015748,"extension":0.003937007874015748,"https":0.003937007874015748,"marketplace":0.003937007874015748,"visualstudio":0.003937007874015748,"com":0.003937007874015748,"items":0.003937007874015748,"itemname":0.003937007874015748,"hirosystems":0.003937007874015748,"clarity-lsp":0.003937007874015748,"text":0.003937007874015748,"this":0.003937007874015748,"20vs":0.003937007874015748,"20code":0.003937007874015748,"20extension":0.003937007874015748,"20brings":0.003937007874015748,"safety":0.003937007874015748,"20checks":0.003937007874015748,"2c":0.003937007874015748,"20debugger":0.003937007874015748,"20and":0.003937007874015748,"20more":0.003937007874015748,"run":0.003937007874015748,"tests":0.003937007874015748,"debug":0.003937007874015748,"by":0.003937007874015748,"deploy":0.003937007874015748,"local":0.003937007874015748,"stacks":0.003937007874015748,"blockchain":0.003937007874015748,"environment":0.003937007874015748,"rapidly":0.003937007874015748,"installation":0.003937007874015748,"terminalpicker":0.003937007874015748,"storage":0.003937007874015748,"macos":0.003937007874015748,"terminal":0.003937007874015748,"brew":0.003937007874015748,"install":0.003937007874015748,"windows":0.003937007874015748,"winget":0.003937007874015748,"cargo":0.003937007874015748,"sudo":0.003937007874015748,"apt":0.003937007874015748,"build-essential":0.003937007874015748,"pkg-config":0.003937007874015748,"libssl-dev":0.003937007874015748,"pre-built":0.003937007874015748,"binary":0.003937007874015748,"wget":0.003937007874015748,"-nv":0.003937007874015748,"github":0.003937007874015748,"releases":0.003937007874015748,"download":0.003937007874015748,"v0":0.003937007874015748,"clarinet-linux-x64-glibc":0.003937007874015748,"tar":0.003937007874015748,"gz":0.003937007874015748,"-o":0.003937007874015748,"clarinet-linux-x64":0.003937007874015748,"-xf":0.003937007874015748,"chmod":0.003937007874015748,"x":0.003937007874015748,"mv":0.003937007874015748,"usr":0.003937007874015748,"bin":0.003937007874015748,"set":0.003937007874015748,"up":0.003937007874015748,"shell":0.003937007874015748,"completions":0.003937007874015748,"already":0.003937007874015748,"has":0.003937007874015748,"many":0.003937007874015748,"different":0.003937007874015748,"commands":0.003937007874015748,"built":0.003937007874015748,"in":0.003937007874015748,"therefore":0.003937007874015748,"enabling":0.003937007874015748,"tab":0.003937007874015748,"completion":0.003937007874015748,"may":0.003937007874015748,"be":0.003937007874015748,"useful":0.003937007874015748,"below":0.003937007874015748,"use":0.003937007874015748,"generate":0.003937007874015748,"scripts":0.003937007874015748,"for":0.003937007874015748,"common":0.003937007874015748,"shells":0.003937007874015748,"bash":0.003937007874015748,"elvish":0.003937007874015748,"fish":0.003937007874015748,"powershell":0.003937007874015748,"zsh":0.003937007874015748,"after":0.003937007874015748,"generating":0.003937007874015748,"file":0.003937007874015748,"refer":0.003937007874015748,"documentation":0.003937007874015748,"determine":0.003937007874015748,"where":0.003937007874015748,"should":0.003937007874015748,"moved":0.003937007874015748,"what":0.003937007874015748,"other":0.003937007874015748,"steps":0.003937007874015748,"necessary":0.003937007874015748,"enable":0.003937007874015748,"guides":0.003937007874015748,"cards":0.003937007874015748,"href":0.003937007874015748,"create-a-new-project":0.003937007874015748,"title":0.003937007874015748,"create":0.003937007874015748,"new":0.003937007874015748,"contract":0.003937007874015748,"description":0.003937007874015748,"add":0.003937007874015748,"project":0.003937007874015748,"have":0.003937007874015748,"them":0.003937007874015748,"automatically":0.003937007874015748,"configured":0.003937007874015748,"clarinet-js-sdk":0.003937007874015748,"unit-testing":0.003937007874015748,"write":0.003937007874015748,"unit":0.003937007874015748,"leverage":0.003937007874015748,"js":0.003937007874015748,"sdk":0.003937007874015748,"comprehensive":0.003937007874015748,"ensuring":0.003937007874015748,"performs":0.003937007874015748,"as":0.003937007874015748,"expected":0.003937007874015748,"create-deployment-plans":0.003937007874015748,"deployment":0.003937007874015748,"plans":0.003937007874015748,"employ":0.003937007874015748,"customizable":0.003937007874015748,"streamline":0.003937007874015748,"deployments":0.003937007874015748,"run-a-local-devnet":0.003937007874015748,"development":0.003937007874015748,"devnet":0.003937007874015748,"developing":0.003937007874015748,"testing":0.003937007874015748,"controlled":0.003937007874015748,"related":0.003937007874015748,"tools":0.003937007874015748,"-":0.003937007874015748,"simplify":0.003937007874015748,"hiro":0.003937007874015748,"platform":0.003937007874015748,"developer":0.003937007874015748,"building":0.003937007874015748,"deploying":0.003937007874015748,"scaling":0.003937007874015748,"bitcoin":0.003937007874015748,"apps":0.003937007874015748,"javascript":0.003937007874015748,"library":0.003937007874015748,"that":0.003937007874015748,"handles":0.003937007874015748,"basic":0.003937007874015748,"functions":0.003937007874015748,"such":0.003937007874015748,"user":0.003937007874015748,"authentication":0.003937007874015748,"transaction":0.003937007874015748,"signing":0.003937007874015748,"br":0.003937007874015748,"callout":0.003937007874015748,"need":0.003937007874015748,"help":0.003937007874015748,"type":0.003937007874015748,"reach":0.003937007874015748,"out":0.003937007874015748,"us":0.003937007874015748,"font-bold":0.003937007874015748,"channel":0.003937007874015748,"discord":0.003937007874015748,"chat":0.003937007874015748,"under":0.003937007874015748,"section":0.003937007874015748,"there's":0.003937007874015748,"also":0.003937007874015748,"weekly":0.003937007874015748,"office":0.003937007874015748,"hours":0.003937007874015748,"www":0.003937007874015748,"addevent":0.003937007874015748,"event":0.003937007874015748,"ki22007085":0.003937007874015748,"call":0.003937007874015748,"every":0.003937007874015748,"wednesday":0.003937007874015748,"at":0.003937007874015748,"1pm":0.003937007874015748,"et":0.003937007874015748},"19":{"network":0.007042253521126761,"types":0.007042253521126761,"clarinet":0.007042253521126761,"supports":0.007042253521126761,"different":0.007042253521126761,"to":0.007042253521126761,"cater":0.007042253521126761,"various":0.007042253521126761,"development":0.007042253521126761,"and":0.007042253521126761,"testing":0.007042253521126761,"needs":0.007042253521126761,"description":0.007042253521126761,"use":0.007042253521126761,"case":0.007042253521126761,"--------------":0.007042253521126761,"-------------------------------------------------------------------------------":0.007042253521126761,"--------------------------------------------------------------------------------":0.007042253521126761,"simnet":0.007042253521126761,"optimized":0.007042253521126761,"for":0.007042253521126761,"fast":0.007042253521126761,"feedback":0.007042253521126761,"loops":0.007042253521126761,"introspection":0.007042253521126761,"portability":0.007042253521126761,"ideal":0.007042253521126761,"initial":0.007042253521126761,"unit-testing":0.007042253521126761,"devnet":0.007042253521126761,"local":0.007042253521126761,"stacks":0.007042253521126761,"bitcoin":0.007042253521126761,"nodes":0.007042253521126761,"running":0.007042253521126761,"on":0.007042253521126761,"docker":0.007042253521126761,"faster":0.007042253521126761,"integration":0.007042253521126761,"tests":0.007042253521126761,"or":0.007042253521126761,"frontend":0.007042253521126761,"testnet":0.007042253521126761,"a":0.007042253521126761,"pre-production":0.007042253521126761,"that":0.007042253521126761,"offers":0.007042253521126761,"realistic":0.007042253521126761,"environment":0.007042253521126761,"final":0.007042253521126761,"before":0.007042253521126761,"deploying":0.007042253521126761,"mainnet":0.007042253521126761,"the":0.007042253521126761,"production":0.007042253521126761,"where":0.007042253521126761,"real":0.007042253521126761,"transactions":0.007042253521126761,"occur":0.007042253521126761,"when":0.007042253521126761,"you're":0.007042253521126761,"ready":0.007042253521126761,"deploy":0.007042253521126761,"your":0.007042253521126761,"smart":0.007042253521126761,"contract":0.007042253521126761,"deployment":0.007042253521126761,"plans":0.007042253521126761,"default":0.007042253521126761,"plan":0.007042253521126761,"of":0.007042253521126761,"every":0.007042253521126761,"project":0.007042253521126761,"is":0.007042253521126761,"contained":0.007042253521126761,"within":0.007042253521126761,"specifications":0.007042253521126761,"set":0.007042253521126761,"inside":0.007042253521126761,"certain":0.007042253521126761,"files":0.007042253521126761,"in":0.007042253521126761,"addition":0.007042253521126761,"this":0.007042253521126761,"user":0.007042253521126761,"can":0.007042253521126761,"manually":0.007042253521126761,"configure":0.007042253521126761,"each":0.007042253521126761,"adding":0.007042253521126761,"additional":0.007042253521126761,"calls":0.007042253521126761,"across":0.007042253521126761,"multiple":0.007042253521126761,"blocks":0.007042253521126761,"you":0.007042253521126761,"commit":0.007042253521126761,"audit":0.007042253521126761,"test":0.007042253521126761,"contracts":0.007042253521126761,"without":0.007042253521126761,"including":0.007042253521126761,"any":0.007042253521126761,"secrets":0.007042253521126761,"share":0.007042253521126761,"these":0.007042253521126761,"exposing":0.007042253521126761,"sensitive":0.007042253521126761,"information":0.007042253521126761,"primitives":0.007042253521126761,"transaction":0.007042253521126761,"primitive":0.007042253521126761,"typical":0.007042253521126761,"usage":0.007042253521126761,"-----------------------":0.007042253521126761,"---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------":0.007042253521126761,"publish":0.007042253521126761,"an":0.007042253521126761,"in-memory":0.007042253521126761,"simulated":0.007042253521126761,"chain":0.007042253521126761,"public":0.007042253521126761,"networks":0.007042253521126761,"like":0.007042253521126761,"external":0.007042253521126761,"purposes":0.007042253521126761,"call":0.007042253521126761,"functions":0.007042253521126761,"deployed":0.007042253521126761,"devnets":0.007042253521126761,"send":0.007042253521126761,"btc":0.007042253521126761,"perform":0.007042253521126761,"simple":0.007042253521126761,"transfer":0.007042253521126761,"from":0.007042253521126761,"p2pkh":0.007042253521126761,"address":0.007042253521126761,"wait":0.007042253521126761,"block":0.007042253521126761,"automate":0.007042253521126761,"stx":0.007042253521126761},"20":{"2":0.0136986301369863,"4":0.0136986301369863,"import":0.0136986301369863,"file":0.0136986301369863,"folder":0.0136986301369863,"files":0.0136986301369863,"from":0.0136986301369863,"'fumadocs-ui":0.0136986301369863,"components":0.0136986301369863,"files'":0.0136986301369863,"to":0.0136986301369863,"add":0.0136986301369863,"a":0.0136986301369863,"new":0.0136986301369863,"contract":0.0136986301369863,"run":0.0136986301369863,"the":0.0136986301369863,"clarinet":0.0136986301369863,"command":0.0136986301369863,"along":0.0136986301369863,"with":0.0136986301369863,"your":0.0136986301369863,"name":0.0136986301369863,"inside":0.0136986301369863,"project":0.0136986301369863,"terminal":0.0136986301369863,"my-contract":0.0136986301369863,"structure":0.0136986301369863,"will":0.0136986301369863,"clar":0.0136986301369863,"and":0.0136986301369863,"test":0.0136986301369863,"ts":0.0136986301369863,"classname":0.0136986301369863,"'pointer-events-none'":0.0136986301369863,"contracts":0.0136986301369863,"defaultopen":0.0136986301369863,"'bg-":0.0136986301369863,"hsl":0.0136986301369863,"var":0.0136986301369863,"--highlight":0.0136986301369863,"'":0.0136986301369863,"settings":0.0136986301369863,"tests":0.0136986301369863,"gitignore":0.0136986301369863,"toml":0.0136986301369863,"package":0.0136986301369863,"json":0.0136986301369863,"tsconfig":0.0136986301369863,"vitest":0.0136986301369863,"config":0.0136986301369863,"js":0.0136986301369863,"also":0.0136986301369863,"configuration":0.0136986301369863,"for":0.0136986301369863,"path":0.0136986301369863,"'contracts":0.0136986301369863,"clar'":0.0136986301369863,"clarity_version":0.0136986301369863,"epoch":0.0136986301369863,"callout":0.0136986301369863,"title":0.0136986301369863,"adding":0.0136986301369863,"manually":0.0136986301369863,"you":0.0136986301369863,"can":0.0136986301369863,"by":0.0136986301369863,"however":0.0136986301369863,"must":0.0136986301369863,"appropriate":0.0136986301369863,"in":0.0136986301369863,"order":0.0136986301369863,"recognize":0.0136986301369863},"21":{"import":0.01694915254237288,"file":0.01694915254237288,"folder":0.01694915254237288,"files":0.01694915254237288,"from":0.01694915254237288,"'fumadocs-ui":0.01694915254237288,"components":0.01694915254237288,"files'":0.01694915254237288,"validate":0.01694915254237288,"the":0.01694915254237288,"syntax":0.01694915254237288,"and":0.01694915254237288,"semantics":0.01694915254237288,"of":0.01694915254237288,"your":0.01694915254237288,"contracts":0.01694915254237288,"terminal":0.01694915254237288,"clarinet":0.01694915254237288,"check":0.01694915254237288,"32m":0.01694915254237288,"0m":0.01694915254237288,"1m1":0.01694915254237288,"contract":0.01694915254237288,"checked":0.01694915254237288,"path":0.01694915254237288,"to":0.01694915254237288,"my-contract":0.01694915254237288,"clar":0.01694915254237288,"this":0.01694915254237288,"command":0.01694915254237288,"uses":0.01694915254237288,"_txt":0.01694915254237288,"toml":0.01694915254237288,"_":0.01694915254237288,"locate":0.01694915254237288,"analyze":0.01694915254237288,"all":0.01694915254237288,"in":0.01694915254237288,"project":0.01694915254237288,"if":0.01694915254237288,"clarity":0.01694915254237288,"code":0.01694915254237288,"is":0.01694915254237288,"valid":0.01694915254237288,"will":0.01694915254237288,"indicate":0.01694915254237288,"success":0.01694915254237288,"with":0.01694915254237288,"response":0.01694915254237288,"below":0.01694915254237288,"callout":0.01694915254237288,"title":0.01694915254237288,"note":0.01694915254237288,"_console":0.01694915254237288,"may":0.01694915254237288,"also":0.01694915254237288,"report":0.01694915254237288,"warnings":0.01694915254237288,"indicating":0.01694915254237288},"22":{"0":0.003787878787878788,"1":0.003787878787878788,"2":0.003787878787878788,"5":0.003787878787878788,"41":0.003787878787878788,"245":0.003787878787878788,"4752":0.003787878787878788,"15000":0.003787878787878788,"15000000":0.003787878787878788,"100000000":0.003787878787878788,"import":0.003787878787878788,"api":0.003787878787878788,"clarinet":0.003787878787878788,"js":0.003787878787878788,"from":0.003787878787878788,"'":0.003787878787878788,"components":0.003787878787878788,"ui":0.003787878787878788,"icon'":0.003787878787878788,"file":0.003787878787878788,"folder":0.003787878787878788,"files":0.003787878787878788,"fumadocs-ui":0.003787878787878788,"transactions":0.003787878787878788,"on":0.003787878787878788,"the":0.003787878787878788,"stacks":0.003787878787878788,"blockchain":0.003787878787878788,"comes":0.003787878787878788,"with":0.003787878787878788,"execution":0.003787878787878788,"costs":0.003787878787878788,"that":0.003787878787878788,"can":0.003787878787878788,"dictate":0.003787878787878788,"transaction":0.003787878787878788,"fees":0.003787878787878788,"for":0.003787878787878788,"your":0.003787878787878788,"users":0.003787878787878788,"to":0.003787878787878788,"analyze":0.003787878787878788,"of":0.003787878787878788,"contract's":0.003787878787878788,"functions":0.003787878787878788,"let's":0.003787878787878788,"continue":0.003787878787878788,"simple":0.003787878787878788,"counter":0.003787878787878788,"contract":0.003787878787878788,"quickstart":0.003787878787878788,"as":0.003787878787878788,"an":0.003787878787878788,"example":0.003787878787878788,"clarity":0.003787878787878788,"define-map":0.003787878787878788,"counters":0.003787878787878788,"principal":0.003787878787878788,"uint":0.003787878787878788,"define-read-only":0.003787878787878788,"get-count":0.003787878787878788,"who":0.003787878787878788,"default-to":0.003787878787878788,"u0":0.003787878787878788,"map-get":0.003787878787878788,"define-public":0.003787878787878788,"count-up":0.003787878787878788,"ok":0.003787878787878788,"map-set":0.003787878787878788,"tx-sender":0.003787878787878788,"u1":0.003787878787878788,"start":0.003787878787878788,"analyzing":0.003787878787878788,"first":0.003787878787878788,"run":0.003787878787878788,"console":0.003787878787878788,"command":0.003787878787878788,"inside":0.003787878787878788,"project":0.003787878787878788,"terminal":0.003787878787878788,"get":0.003787878787878788,"get_costs":0.003787878787878788,"expr":0.003787878787878788,"in":0.003787878787878788,"will":0.003787878787878788,"display":0.003787878787878788,"cost":0.003787878787878788,"analysis":0.003787878787878788,"given":0.003787878787878788,"expression":0.003787878787878788,"well":0.003787878787878788,"return":0.003787878787878788,"value":0.003787878787878788,"expects":0.003787878787878788,"so":0.003787878787878788,"make":0.003787878787878788,"a":0.003787878787878788,"contract-call":0.003787878787878788,"our":0.003787878787878788,"function":0.003787878787878788,"and":0.003787878787878788,"see":0.003787878787878788,"what":0.003787878787878788,"happens":0.003787878787878788,"----------------------":0.003787878787878788,"-------------":0.003787878787878788,"----------------":0.003787878787878788,"-----------------":0.003787878787878788,"consumed":0.003787878787878788,"limit":0.003787878787878788,"percentage":0.003787878787878788,"runtime":0.003787878787878788,"5000000000":0.003787878787878788,"00":0.003787878787878788,"read":0.003787878787878788,"count":0.003787878787878788,"03":0.003787878787878788,"length":0.003787878787878788,"bytes":0.003787878787878788,"write":0.003787878787878788,"01":0.003787878787878788,"true":0.003787878787878788,"you":0.003787878787878788,"chart":0.003787878787878788,"are":0.003787878787878788,"broken":0.003787878787878788,"into":0.003787878787878788,"different":0.003787878787878788,"categories":0.003787878787878788,"each":0.003787878787878788,"its":0.003787878787878788,"own":0.003787878787878788,"is":0.003787878787878788,"pertaining":0.003787878787878788,"block":0.003787878787878788,"limited":0.003787878787878788,"callout":0.003787878787878788,"title":0.003787878787878788,"below":0.003787878787878788,"lists":0.003787878787878788,"out":0.003787878787878788,"source":0.003787878787878788,"https":0.003787878787878788,"book":0.003787878787878788,"clarity-lang":0.003787878787878788,"org":0.003787878787878788,"ch12-00-runtime-cost-analysis":0.003787878787878788,"html":0.003787878787878788,"-":0.003787878787878788,"limits":0.003787878787878788,"overall":0.003787878787878788,"complexity":0.003787878787878788,"code":0.003787878787878788,"be":0.003787878787878788,"executed":0.003787878787878788,"negating":0.003787878787878788,"boolean":0.003787878787878788,"less":0.003787878787878788,"complex":0.003787878787878788,"than":0.003787878787878788,"calculating":0.003787878787878788,"sha512":0.003787878787878788,"hash":0.003787878787878788,"therefore":0.003787878787878788,"not":0.003787878787878788,"false":0.003787878787878788,"consume":0.003787878787878788,"hello":0.003787878787878788,"world":0.003787878787878788,"this":0.003787878787878788,"category":0.003787878787878788,"also":0.003787878787878788,"affected":0.003787878787878788,"by":0.003787878787878788,"size":0.003787878787878788,"how":0.003787878787878788,"many":0.003787878787878788,"times":0.003787878787878788,"we":0.003787878787878788,"memory":0.003787878787878788,"or":0.003787878787878788,"chain":0.003787878787878788,"state":0.003787878787878788,"extract":0.003787878787878788,"piece":0.003787878787878788,"information":0.003787878787878788,"it":0.003787878787878788,"reading":0.003787878787878788,"constants":0.003787878787878788,"variables":0.003787878787878788,"intermediate":0.003787878787878788,"created":0.003787878787878788,"let":0.003787878787878788,"maps":0.003787878787878788,"but":0.003787878787878788,"some":0.003787878787878788,"needs":0.003787878787878788,"save":0.003787878787878788,"results":0.003787878787878788,"during":0.003787878787878788,"much":0.003787878787878788,"data":0.003787878787878788,"calling":0.003787878787878788,"using":0.003787878787878788,"increases":0.003787878787878788,"amount":0.003787878787878788,"equal":0.003787878787878788,"every":0.003787878787878788,"time":0.003787878787878788,"if":0.003787878787878788,"call":0.003787878787878788,"000":0.003787878787878788,"twice":0.003787878787878788,"increased":0.003787878787878788,"increments":0.003787878787878788,"when":0.003787878787878788,"writing":0.003787878787878788,"column":0.003787878787878788,"shows":0.003787878787878788,"toggle":0.003787878787878788,"always":0.003787878787878788,"displayed":0.003787878787878788,"after":0.003787878787878788,"toggling":0.003787878787878788,"feature":0.003787878787878788,"toggle_costs":0.003787878787878788,"turn":0.003787878787878788,"off":0.003787878787878788,"just":0.003787878787878788,"again":0.003787878787878788,"check":0.003787878787878788,"section":0.003787878787878788,"up":0.003787878787878788,"optimization":0.003787878787878788,"techniques":0.003787878787878788,"recommendations":0.003787878787878788,"automated":0.003787878787878788,"unit":0.003787878787878788,"tests":0.003787878787878788,"clarinet-js-sdk":0.003787878787878788,"run-your-tests-with-code-coverage-and-cost-analysis":0.003787878787878788,"sdk":0.003787878787878788,"cards":0.003787878787878788,"secondarycard":0.003787878787878788,"icon":0.003787878787878788,"href":0.003787878787878788,"guides":0.003787878787878788,"cli-commands":0.003787878787878788,"validate-a-contract":0.003787878787878788,"validate":0.003787878787878788,"description":0.003787878787878788,"learn":0.003787878787878788,"tag":0.003787878787878788,"'clarinet'":0.003787878787878788,"rpc-api":0.003787878787878788,"estimate":0.003787878787878788,"fee":0.003787878787878788,"estimates":0.003787878787878788,"fetch":0.003787878787878788,"'api'":0.003787878787878788,"smart":0.003787878787878788,"contracts":0.003787878787878788,"'clarinet":0.003787878787878788,"sdk'":0.003787878787878788},"23":{"import":0.03333333333333333,"file":0.03333333333333333,"folder":0.03333333333333333,"files":0.03333333333333333,"from":0.03333333333333333,"'fumadocs-ui":0.03333333333333333,"components":0.03333333333333333,"files'":0.03333333333333333,"launch":0.03333333333333333,"the":0.03333333333333333,"clarinet":0.03333333333333333,"console":0.03333333333333333,"for":0.03333333333333333,"interactive":0.03333333333333333,"development":0.03333333333333333,"terminal":0.03333333333333333,"this":0.03333333333333333,"commands":0.03333333333333333,"starts":0.03333333333333333,"a":0.03333333333333333,"new":0.03333333333333333,"repl":0.03333333333333333,"session":0.03333333333333333,"so":0.03333333333333333,"you":0.03333333333333333,"can":0.03333333333333333,"interact":0.03333333333333333,"with":0.03333333333333333,"your":0.03333333333333333,"contracts":0.03333333333333333},"24":{"launch":0.02127659574468085,"a":0.02127659574468085,"local":0.02127659574468085,"development":0.02127659574468085,"network":0.02127659574468085,"with":0.02127659574468085,"all":0.02127659574468085,"required":0.02127659574468085,"services":0.02127659574468085,"terminal":0.02127659574468085,"clarinet":0.02127659574468085,"devnet":0.02127659574468085,"start":0.02127659574468085,"requires":0.02127659574468085,"docker":0.02127659574468085,"to":0.02127659574468085,"be":0.02127659574468085,"running":0.02127659574468085,"locally":0.02127659574468085,"see":0.02127659574468085,"installing":0.02127659574468085,"guides":0.02127659574468085,"install-docker":0.02127659574468085,"guide":0.02127659574468085,"for":0.02127659574468085,"more":0.02127659574468085,"information":0.02127659574468085,"callout":0.02127659574468085,"title":0.02127659574468085,"common":0.02127659574468085,"errors":0.02127659574468085,"type":0.02127659574468085,"warn":0.02127659574468085,"p":0.02127659574468085,"if":0.02127659574468085,"you":0.02127659574468085,"are":0.02127659574468085,"getting":0.02127659574468085,"error":0.02127659574468085,"was":0.02127659574468085,"unable":0.02127659574468085,"create":0.02127659574468085,"make":0.02127659574468085,"sure":0.02127659574468085,"have":0.02127659574468085,"container":0.02127659574468085,"service":0.02127659574468085},"25":{"2":0.011111111111111112,"10":0.011111111111111112,"1000":0.011111111111111112,"5960":0.011111111111111112,"10000":0.011111111111111112,"100000000":0.011111111111111112,"generate":0.011111111111111112,"a":0.011111111111111112,"deployment":0.011111111111111112,"plan":0.011111111111111112,"terminal":0.011111111111111112,"clarinet":0.011111111111111112,"deployments":0.011111111111111112,"--":0.011111111111111112,"network":0.011111111111111112,"supported":0.011111111111111112,"networks":0.011111111111111112,"console":0.011111111111111112,"devnet":0.011111111111111112,"_":0.011111111111111112,"testnet":0.011111111111111112,"mainnet":0.011111111111111112,"deploy":0.011111111111111112,"contracts":0.011111111111111112,"apply":0.011111111111111112,"add":0.011111111111111112,"contract":0.011111111111111112,"requirements":0.011111111111111112,"external":0.011111111111111112,"dependencies":0.011111111111111112,"contract-principal":0.011111111111111112,"example":0.011111111111111112,"sp2pabaf9ftajynfzh93xenaj8fvy99rrm50d2jg9":0.011111111111111112,"nft-trait":0.011111111111111112,"transactions":0.011111111111111112,"your":0.011111111111111112,"plans":0.011111111111111112,"can":0.011111111111111112,"include":0.011111111111111112,"various":0.011111111111111112,"transaction":0.011111111111111112,"types":0.011111111111111112,"operations":0.011111111111111112,"yaml":0.011111111111111112,"-":0.011111111111111112,"contract-publish":0.011111111111111112,"contract-name":0.011111111111111112,"my-contract":0.011111111111111112,"expected-sender":0.011111111111111112,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.011111111111111112,"cost":0.011111111111111112,"path":0.011111111111111112,"clar":0.011111111111111112,"clarity-version":0.011111111111111112,"contract-call":0.011111111111111112,"contract-id":0.011111111111111112,"method":0.011111111111111112,"my-function":0.011111111111111112,"parameters":0.011111111111111112,"asset":0.011111111111111112,"transfers":0.011111111111111112,"stx-transfer":0.011111111111111112,"recipient":0.011111111111111112,"mstx-amount":0.011111111111111112,"memo":0.011111111111111112,"'0x01'":0.011111111111111112,"btc-transfer":0.011111111111111112,"mjsrb3ws4xab3kyqfktwbzftdpg367zj2d":0.011111111111111112,"bcrt1qnxknq3wqtphv7sfwy07m7e4sr6ut9yt6ed99jg":0.011111111111111112,"sats-amount":0.011111111111111112,"sats-per-byte":0.011111111111111112,"simnet":0.011111111111111112,"emulated-contract-publish":0.011111111111111112,"emulated-sender":0.011111111111111112,"emulated-contract-call":0.011111111111111112,"callout":0.011111111111111112,"title":0.011111111111111112,"note":0.011111111111111112,"for":0.011111111111111112,"functions":0.011111111111111112,"that":0.011111111111111112,"take":0.011111111111111112,"no":0.011111111111111112,"arguments":0.011111111111111112,"or":0.011111111111111112,"read-only":0.011111111111111112,"use":0.011111111111111112,"an":0.011111111111111112,"empty":0.011111111111111112,"list":0.011111111111111112},"26":{"1":0.005494505494505495,"3":0.005494505494505495,"4":0.005494505494505495,"6":0.005494505494505495,"38":0.005494505494505495,"import":0.005494505494505495,"clarinet":0.005494505494505495,"js":0.005494505494505495,"from":0.005494505494505495,"'":0.005494505494505495,"components":0.005494505494505495,"ui":0.005494505494505495,"icon'":0.005494505494505495,"file":0.005494505494505495,"folder":0.005494505494505495,"files":0.005494505494505495,"'fumadocs-ui":0.005494505494505495,"files'":0.005494505494505495,"inside":0.005494505494505495,"the":0.005494505494505495,"console":0.005494505494505495,"you":0.005494505494505495,"can":0.005494505494505495,"use":0.005494505494505495,"these":0.005494505494505495,"debugging":0.005494505494505495,"commands":0.005494505494505495,"terminal":0.005494505494505495,"trace":0.005494505494505495,"contract-call":0.005494505494505495,"my-contract":0.005494505494505495,"my-function":0.005494505494505495,"debug":0.005494505494505495,"break":0.005494505494505495,"navigation":0.005494505494505495,"-":0.005494505494505495,"_console":0.005494505494505495,"step":0.005494505494505495,"_":0.005494505494505495,"or":0.005494505494505495,"s":0.005494505494505495,"into":0.005494505494505495,"finish":0.005494505494505495,"f":0.005494505494505495,"out":0.005494505494505495,"next":0.005494505494505495,"n":0.005494505494505495,"over":0.005494505494505495,"continue":0.005494505494505495,"c":0.005494505494505495,"execution":0.005494505494505495,"let's":0.005494505494505495,"take":0.005494505494505495,"clarity_":0.005494505494505495,"counter":0.005494505494505495,"contract":0.005494505494505495,"as":0.005494505494505495,"an":0.005494505494505495,"example":0.005494505494505495,"clarity":0.005494505494505495,"define-map":0.005494505494505495,"counters":0.005494505494505495,"principal":0.005494505494505495,"uint":0.005494505494505495,"define-read-only":0.005494505494505495,"get-count":0.005494505494505495,"who":0.005494505494505495,"default-to":0.005494505494505495,"u0":0.005494505494505495,"map-get":0.005494505494505495,"define-public":0.005494505494505495,"count-up":0.005494505494505495,"ok":0.005494505494505495,"map-set":0.005494505494505495,"tx-sender":0.005494505494505495,"u1":0.005494505494505495,"command":0.005494505494505495,"expects":0.005494505494505495,"expression":0.005494505494505495,"so":0.005494505494505495,"make":0.005494505494505495,"a":0.005494505494505495,"_clarity":0.005494505494505495,"with":0.005494505494505495,"our":0.005494505494505495,"function":0.005494505494505495,"and":0.005494505494505495,"see":0.005494505494505495,"what":0.005494505494505495,"happens":0.005494505494505495,"30m":0.005494505494505495,"0m":0.005494505494505495,"30mcounter":0.005494505494505495,"31m":0.005494505494505495,"args":0.005494505494505495,"1mst1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.005494505494505495,"34mu0":0.005494505494505495,"34m":0.005494505494505495,"true":0.005494505494505495,"breakpoints":0.005494505494505495,"also":0.005494505494505495,"set":0.005494505494505495,"breakpoint":0.005494505494505495,"at":0.005494505494505495,"specific":0.005494505494505495,"line":0.005494505494505495,"to":0.005494505494505495,"better":0.005494505494505495,"understand":0.005494505494505495,"what's":0.005494505494505495,"happening":0.005494505494505495,"in":0.005494505494505495,"your":0.005494505494505495,"add":0.005494505494505495,"of":0.005494505494505495,"contracts":0.005494505494505495,"mark":0.005494505494505495,"count-twice":0.005494505494505495,"double":0.005494505494505495,"define-private":0.005494505494505495,"begin":0.005494505494505495,"unwrap-panic":0.005494505494505495,"callout":0.005494505494505495,"title":0.005494505494505495,"through":0.005494505494505495,"one":0.005494505494505495,"following":0.005494505494505495,"step-in":0.005494505494505495,"sub-expressions":0.005494505494505495,"step-out":0.005494505494505495,"complete":0.005494505494505495,"current":0.005494505494505495,"return":0.005494505494505495,"result":0.005494505494505495,"parent":0.005494505494505495,"step-over":0.005494505494505495,"completion":0.005494505494505495,"stepping":0.005494505494505495,"until":0.005494505494505495,"hitting":0.005494505494505495,"completing":0.005494505494505495,"using":0.005494505494505495,"will":0.005494505494505495,"trigger":0.005494505494505495,"twice":0.005494505494505495,"due":0.005494505494505495,"two":0.005494505494505495,"calls":0.005494505494505495,"which":0.005494505494505495,"enables":0.005494505494505495,"do":0.005494505494505495,"variable":0.005494505494505495,"map":0.005494505494505495,"analysis":0.005494505494505495,"steps":0.005494505494505495,"cards":0.005494505494505495,"secondarycard":0.005494505494505495,"icon":0.005494505494505495,"href":0.005494505494505495,"stacks":0.005494505494505495,"guides":0.005494505494505495,"cli-commands":0.005494505494505495,"validate-a-contract":0.005494505494505495,"validate":0.005494505494505495,"description":0.005494505494505495,"learn":0.005494505494505495,"how":0.005494505494505495,"tag":0.005494505494505495,"'clarinet'":0.005494505494505495,"estimate-costs":0.005494505494505495,"estimate":0.005494505494505495,"costs":0.005494505494505495,"for":0.005494505494505495,"clarinet-js-sdk":0.005494505494505495,"quickstart":0.005494505494505495,"write":0.005494505494505495,"tests":0.005494505494505495,"smart":0.005494505494505495,"unit":0.005494505494505495,"sdk":0.005494505494505495,"'clarinet":0.005494505494505495,"sdk'":0.005494505494505495},"27":{"0":0.002325581395348837,"1":0.002325581395348837,"2":0.002325581395348837,"3":0.002325581395348837,"4":0.002325581395348837,"5":0.002325581395348837,"10":0.002325581395348837,"34":0.002325581395348837,"1000":0.002325581395348837,"5960":0.002325581395348837,"6940":0.002325581395348837,"8400":0.002325581395348837,"10000":0.002325581395348837,"18443":0.002325581395348837,"20443":0.002325581395348837,"100000000":0.002325581395348837,"import":0.002325581395348837,"clarinet":0.002325581395348837,"js":0.002325581395348837,"from":0.002325581395348837,"'":0.002325581395348837,"components":0.002325581395348837,"ui":0.002325581395348837,"icon'":0.002325581395348837,"tooltip":0.002325581395348837,"tooltipcontent":0.002325581395348837,"tooltipprovider":0.002325581395348837,"tooltiptrigger":0.002325581395348837,"deployment":0.002325581395348837,"plans":0.002325581395348837,"minimize":0.002325581395348837,"the":0.002325581395348837,"inherent":0.002325581395348837,"complexity":0.002325581395348837,"of":0.002325581395348837,"deployments":0.002325581395348837,"such":0.002325581395348837,"as":0.002325581395348837,"smart":0.002325581395348837,"contract":0.002325581395348837,"dependencies":0.002325581395348837,"and":0.002325581395348837,"interactions":0.002325581395348837,"transaction":0.002325581395348837,"chaining":0.002325581395348837,"limits":0.002325581395348837,"costs":0.002325581395348837,"more":0.002325581395348837,"ensure":0.002325581395348837,"reproducible":0.002325581395348837,"a":0.002325581395348837,"critical":0.002325581395348837,"workflow":0.002325581395348837,"for":0.002325581395348837,"testing":0.002325581395348837,"purposes":0.002325581395348837,"in":0.002325581395348837,"this":0.002325581395348837,"guide":0.002325581395348837,"you":0.002325581395348837,"will":0.002325581395348837,"learn":0.002325581395348837,"how":0.002325581395348837,"to":0.002325581395348837,"generate":0.002325581395348837,"configure":0.002325581395348837,"plan":0.002325581395348837,"generate-a-deployment-plan":0.002325581395348837,"set":0.002325581395348837,"specifications":0.002325581395348837,"deployment-plan-specifications":0.002325581395348837,"add":0.002325581395348837,"project":0.002325581395348837,"requirements":0.002325581395348837,"adding-project-contract-requirements":0.002325581395348837,"customize":0.002325581395348837,"your":0.002325581395348837,"edit-your-deployment-plan":0.002325581395348837,"---":0.002325581395348837,"uses":0.002325581395348837,"every":0.002325581395348837,"whether":0.002325581395348837,"basic":0.002325581395348837,"simnet":0.002325581395348837,"devnet":0.002325581395348837,"use":0.002325581395348837,"with":0.002325581395348837,"start":0.002325581395348837,"command":0.002325581395348837,"or":0.002325581395348837,"public":0.002325581395348837,"testnet":0.002325581395348837,"mainnet":0.002325581395348837,"can":0.002325581395348837,"view":0.002325581395348837,"current":0.002325581395348837,"saved":0.002325581395348837,"disk":0.002325581395348837,"at":0.002325581395348837,"any":0.002325581395348837,"time":0.002325581395348837,"following":0.002325581395348837,"specifying":0.002325581395348837,"network":0.002325581395348837,"terminal":0.002325581395348837,"--":0.002325581395348837,"upon":0.002325581395348837,"project's":0.002325581395348837,"default":0.002325581395348837,"yaml":0.002325581395348837,"file":0.002325581395348837,"example":0.002325581395348837,"devnet-plan":0.002325581395348837,"is":0.002325581395348837,"generated":0.002325581395348837,"contracts":0.002325581395348837,"here":0.002325581395348837,"counter":0.002325581395348837,"stacks":0.002325581395348837,"quickstart":0.002325581395348837,"used":0.002325581395348837,"our":0.002325581395348837,"id":0.002325581395348837,"name":0.002325581395348837,"stacks-node":0.002325581395348837,"http":0.002325581395348837,"localhost":0.002325581395348837,"bitcoin-node":0.002325581395348837,"batches":0.002325581395348837,"-":0.002325581395348837,"transactions":0.002325581395348837,"contract-publish":0.002325581395348837,"contract-name":0.002325581395348837,"expected-sender":0.002325581395348837,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.002325581395348837,"cost":0.002325581395348837,"path":0.002325581395348837,"clar":0.002325581395348837,"anchor-block-only":0.002325581395348837,"true":0.002325581395348837,"clarity-version":0.002325581395348837,"epoch":0.002325581395348837,"are":0.002325581395348837,"on":0.002325581395348837,"two":0.002325581395348837,"files":0.002325581395348837,"within":0.002325581395348837,"toml":0.002325581395348837,"well":0.002325581395348837,"s":0.002325581395348837,"corresponding":0.002325581395348837,"settings":0.002325581395348837,"folder":0.002325581395348837,"change":0.002325581395348837,"include":0.002325581395348837,"clarity":0.002325581395348837,"version":0.002325581395348837,"blockchain":0.002325581395348837,"that":0.002325581395348837,"emulates":0.002325581395348837,"form":0.002325581395348837,"see":0.002325581395348837,"next":0.002325581395348837,"section":0.002325581395348837,"accounts":0.002325581395348837,"balances":0.002325581395348837,"names":0.002325581395348837,"environment":0.002325581395348837,"features":0.002325581395348837,"block":0.002325581395348837,"api":0.002325581395348837,"ports":0.002325581395348837,"stacking":0.002325581395348837,"orders":0.002325581395348837,"derivation":0.002325581395348837,"given":0.002325581395348837,"account":0.002325581395348837,"deployer":0.002325581395348837,"mnemonic":0.002325581395348837,"private":0.002325581395348837,"balance":0.002325581395348837,"100_000_000_000_000":0.002325581395348837,"m":0.002325581395348837,"44'":0.002325581395348837,"5757'":0.002325581395348837,"0'":0.002325581395348837,"adding":0.002325581395348837,"reference":0.002325581395348837,"already":0.002325581395348837,"exists":0.002325581395348837,"improvement":0.002325581395348837,"proposal":0.002325581395348837,"009":0.002325581395348837,"https":0.002325581395348837,"github":0.002325581395348837,"com":0.002325581395348837,"stacksgov":0.002325581395348837,"sips":0.002325581395348837,"blob":0.002325581395348837,"main":0.002325581395348837,"sip-010":0.002325581395348837,"sip-010-fungible-token-standard":0.002325581395348837,"md":0.002325581395348837,"specifies":0.002325581395348837,"trait":0.002325581395348837,"all":0.002325581395348837,"non-fungible":0.002325581395348837,"tokens":0.002325581395348837,"instead":0.002325581395348837,"redeploying":0.002325581395348837,"separate":0.002325581395348837,"each":0.002325581395348837,"new":0.002325581395348837,"nft":0.002325581395348837,"collection":0.002325581395348837,"published":0.002325581395348837,"directly":0.002325581395348837,"including":0.002325581395348837,"principal":0.002325581395348837,"sp2pabaf9ftajynfzh93xenaj8fvy99rrm50d2jg9":0.002325581395348837,"nft-trait":0.002325581395348837,"updates":0.002325581395348837,"development":0.002325581395348837,"instance":0.002325581395348837,"would":0.002325581395348837,"now":0.002325581395348837,"download":0.002325581395348837,"copy":0.002325581395348837,"via":0.002325581395348837,"node":0.002325581395348837,"booted":0.002325581395348837,"alongside":0.002325581395348837,"it":0.002325581395348837,"remap":0.002325581395348837,"publishes":0.002325581395348837,"one":0.002325581395348837,"specified":0.002325581395348837,"permits":0.002325581395348837,"developer":0.002325581395348837,"maintain":0.002325581395348837,"minimum":0.002325581395348837,"their":0.002325581395348837,"deploy":0.002325581395348837,"single":0.002325581395348837,"an":0.002325581395348837,"impl-trait":0.002325581395348837,"statement":0.002325581395348837,"edit":0.002325581395348837,"recall":0.002325581395348837,"comprising":0.002325581395348837,"projects":0.002325581395348837,"shell":0.002325581395348837,"however":0.002325581395348837,"also":0.002325581395348837,"manually":0.002325581395348837,"programmatically":0.002325581395348837,"orchestrating":0.002325581395348837,"publication":0.002325581395348837,"user":0.002325581395348837,"interaction":0.002325581395348837,"beyond":0.002325581395348837,"plan's":0.002325581395348837,"defaults":0.002325581395348837,"callout":0.002325581395348837,"title":0.002325581395348837,"note":0.002325581395348837,"when":0.002325581395348837,"deploying":0.002325581395348837,"prompts":0.002325581395348837,"overwrite":0.002325581395348837,"added":0.002325581395348837,"edited":0.002325581395348837,"changes":0.002325581395348837,"differ":0.002325581395348837,"laid":0.002325581395348837,"out":0.002325581395348837,"type":0.002325581395348837,"no":0.002325581395348837,"proceed":0.002325581395348837,"configured":0.002325581395348837,"some":0.002325581395348837,"relevant":0.002325581395348837,"configurations":0.002325581395348837,"available":0.002325581395348837,"developers":0.002325581395348837,"configuring":0.002325581395348837,"emulated-contract-publish":0.002325581395348837,"in-memory":0.002325581395348837,"simulated":0.002325581395348837,"chain":0.002325581395348837,"emulated-contract-call":0.002325581395348837,"call":0.002325581395348837,"has":0.002325581395348837,"been":0.002325581395348837,"deployed":0.002325581395348837,"requirement-publish":0.002325581395348837,"inline":0.002325581395348837,"aschild":0.002325581395348837,"span":0.002325581395348837,"classname":0.002325581395348837,"'cursor-default":0.002325581395348837,"border-b":0.002325581395348837,"border-dotted":0.002325581395348837,"border-primary'":0.002325581395348837,"external":0.002325581395348837,"not":0.002325581395348837,"by":0.002325581395348837,"same":0.002325581395348837,"keys":0.002325581395348837,"wallet":0.002325581395348837,"currently":0.002325581395348837,"another":0.002325581395348837,"using":0.002325581395348837,"contract-call":0.002325581395348837,"stx-transfer":0.002325581395348837,"transfer":0.002325581395348837,"stx":0.002325581395348837,"between":0.002325581395348837,"btc-transfer":0.002325581395348837,"simple":0.002325581395348837,"bitcoin":0.002325581395348837,"p2pkh":0.002325581395348837,"address":0.002325581395348837,"experimental":0.002325581395348837,"regtest":0.002325581395348837,"included":0.002325581395348837,"extension-trait":0.002325581395348837,"emulated-sender":0.002325581395348837,"dao":0.002325581395348837,"traits":0.002325581395348837,"where":0.002325581395348837,"wants":0.002325581395348837,"emulate":0.002325581395348837,"contract-id":0.002325581395348837,"method":0.002325581395348837,"increment":0.002325581395348837,"parameters":0.002325581395348837,"u1":0.002325581395348837,"read-only":0.002325581395348837,"functions":0.002325581395348837,"take":0.002325581395348837,"arguments":0.002325581395348837,"passed":0.002325581395348837,"empty":0.002325581395348837,"list":0.002325581395348837,"like":0.002325581395348837,"so":0.002325581395348837,"cbtc":0.002325581395348837,"application":0.002325581395348837,"hirosystems":0.002325581395348837,"develop":0.002325581395348837,"clarinet-cli":0.002325581395348837,"examples":0.002325581395348837,"required":0.002325581395348837,"its":0.002325581395348837,"core":0.002325581395348837,"sp3fbr2agk5h9qbdh3een6df8ek8jy7rx8qj5svte":0.002325581395348837,"sip-010-trait-ft-standard":0.002325581395348837,"remap-sender":0.002325581395348837,"remap-principals":0.002325581395348837,"cache":0.002325581395348837,"clar'":0.002325581395348837,"function":0.002325581395348837,"pass":0.002325581395348837,"valid":0.002325581395348837,"bitcoin-dao":0.002325581395348837,"add-new-member":0.002325581395348837,"0x01":0.002325581395348837,"u4":0.002325581395348837,"username":0.002325581395348837,"satoshi":0.002325581395348837,"'sp1htbvd3jg9c05j7hbjthgr0ggw7kxw28m5js8qe":0.002325581395348837,"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.002325581395348837,"specify":0.002325581395348837,"originating":0.002325581395348837,"quantity":0.002325581395348837,"denominated":0.002325581395348837,"microstacks":0.002325581395348837,"recipient":0.002325581395348837,"optional":0.002325581395348837,"memo":0.002325581395348837,"field":0.002325581395348837,"only":0.002325581395348837,"contain":0.002325581395348837,"buffer":0.002325581395348837,"book":0.002325581395348837,"clarity-lang":0.002325581395348837,"org":0.002325581395348837,"ch02-02-sequence-types":0.002325581395348837,"html":0.002325581395348837,"up":0.002325581395348837,"bytes":0.002325581395348837,"size":0.002325581395348837,"pre-fixed":0.002325581395348837,"0x":0.002325581395348837,"0x68656c6c6f21":0.002325581395348837,"ascii":0.002325581395348837,"text":0.002325581395348837,"strings":0.002325581395348837,"my-contract":0.002325581395348837,"mstx-amount":0.002325581395348837,"'0x01'":0.002325581395348837,"wrap-btc":0.002325581395348837,"includes":0.002325581395348837,"broadcasting":0.002325581395348837,"btc":0.002325581395348837,"emulated":0.002325581395348837,"these":0.002325581395348837,"mjsrb3ws4xab3kyqfktwbzftdpg367zj2d":0.002325581395348837,"bcrt1qnxknq3wqtphv7sfwy07m7e4sr6ut9yt6ed99jg":0.002325581395348837,"sats-amount":0.002325581395348837,"sats-per-byte":0.002325581395348837,"steps":0.002325581395348837,"cards":0.002325581395348837,"secondarycard":0.002325581395348837,"icon":0.002325581395348837,"href":0.002325581395348837,"guides":0.002325581395348837,"cli-commands":0.002325581395348837,"run-a-local-devnet":0.002325581395348837,"run":0.002325581395348837,"local":0.002325581395348837,"description":0.002325581395348837,"tag":0.002325581395348837,"'clarinet'":0.002325581395348837,"clarinet-js-sdk":0.002325581395348837,"references":0.002325581395348837,"sdk":0.002325581395348837,"'clarinet":0.002325581395348837,"sdk'":0.002325581395348837},"28":{"0":0.00558659217877095,"2":0.00558659217877095,"15":0.00558659217877095,"100":0.00558659217877095,"to":0.00558659217877095,"take":0.00558659217877095,"advantage":0.00558659217877095,"of":0.00558659217877095,"these":0.00558659217877095,"features":0.00558659217877095,"make":0.00558659217877095,"sure":0.00558659217877095,"use":0.00558659217877095,"clarinet":0.00558659217877095,"or":0.00558659217877095,"later":0.00558659217877095,"about":0.00558659217877095,"sbtc":0.00558659217877095,"is":0.00558659217877095,"a":0.00558659217877095,"fungible":0.00558659217877095,"token":0.00558659217877095,"on":0.00558659217877095,"the":0.00558659217877095,"stacks":0.00558659217877095,"blockchain":0.00558659217877095,"it":0.00558659217877095,"follows":0.00558659217877095,"sip-010":0.00558659217877095,"standard":0.00558659217877095,"https":0.00558659217877095,"github":0.00558659217877095,"com":0.00558659217877095,"stacksgov":0.00558659217877095,"sips":0.00558659217877095,"blob":0.00558659217877095,"main":0.00558659217877095,"sip-010-fungible-token-standard":0.00558659217877095,"md":0.00558659217877095,"for":0.00558659217877095,"tokens":0.00558659217877095,"even":0.00558659217877095,"though":0.00558659217877095,"it's":0.00558659217877095,"just":0.00558659217877095,"has":0.00558659217877095,"some":0.00558659217877095,"helpers":0.00558659217877095,"easier":0.00558659217877095,"work":0.00558659217877095,"with":0.00558659217877095,"using":0.00558659217877095,"in":0.00558659217877095,"your":0.00558659217877095,"contract":0.00558659217877095,"you":0.00558659217877095,"need":0.00558659217877095,"add":0.00558659217877095,"sbtc-deposit":0.00558659217877095,"smart":0.00558659217877095,"requirements":0.00558659217877095,"project":0.00558659217877095,"run":0.00558659217877095,"following":0.00558659217877095,"command":0.00558659217877095,"terminal":0.00558659217877095,"sm3vdxk3wzzsa84xxfkafaf15nnzx32ctsg82jfq4":0.00558659217877095,"this":0.00558659217877095,"will":0.00558659217877095,"explorer":0.00558659217877095,"hiro":0.00558659217877095,"so":0.00558659217877095,"txid":0.00558659217877095,"along":0.00558659217877095,"dependencies":0.00558659217877095,"-":0.00558659217877095,"sbtc-token":0.00558659217877095,"sbtc-registry":0.00558659217877095,"when":0.00558659217877095,"detects":0.00558659217877095,"automatically":0.00558659217877095,"fund":0.00558659217877095,"test":0.00558659217877095,"wallets":0.00558659217877095,"that":0.00558659217877095,"can":0.00558659217877095,"simnet":0.00558659217877095,"and":0.00558659217877095,"devnet":0.00558659217877095,"as":0.00558659217877095,"let":0.00558659217877095,"call":0.00558659217877095,"transfer":0.00558659217877095,"function":0.00558659217877095,"from":0.00558659217877095,"one":0.00558659217877095,"address":0.00558659217877095,"another":0.00558659217877095,"let's":0.00558659217877095,"say":0.00558659217877095,"we":0.00558659217877095,"have":0.00558659217877095,"an":0.00558659217877095,"nft":0.00558659217877095,"allows":0.00558659217877095,"users":0.00558659217877095,"mint":0.00558659217877095,"by":0.00558659217877095,"spending":0.00558659217877095,"clarity":0.00558659217877095,"code":0.00558659217877095,"demo":0.00558659217877095,"purposes":0.00558659217877095,"doesn't":0.00558659217877095,"implement":0.00558659217877095,"sip-009":0.00558659217877095,"define-non-fungible-token":0.00558659217877095,"nft-name":0.00558659217877095,"uint":0.00558659217877095,"sats":0.00558659217877095,"define-data-var":0.00558659217877095,"sats-sbtc-mint-price":0.00558659217877095,"u100":0.00558659217877095,"next-id":0.00558659217877095,"u0":0.00558659217877095,"define-public":0.00558659217877095,"mint-one-with-sbtc":0.00558659217877095,"begin":0.00558659217877095,"sbtcs":0.00558659217877095,"try":0.00558659217877095,"contract-call":0.00558659217877095,"'sm3vdxk3wzzsa84xxfkafaf15nnzx32ctsg82jfq4":0.00558659217877095,"var-get":0.00558659217877095,"tx-sender":0.00558659217877095,"as-contract":0.00558659217877095,"none":0.00558659217877095,"nft-mint":0.00558659217877095,"ok":0.00558659217877095,"var-set":0.00558659217877095,"u1":0.00558659217877095,"because":0.00558659217877095,"already":0.00558659217877095,"took":0.00558659217877095,"care":0.00558659217877095,"funding":0.00558659217877095,"unit":0.00558659217877095,"tests":0.00558659217877095,"console":0.00558659217877095,"deployer":0.00558659217877095,"remain":0.00558659217877095,"but":0.00558659217877095,"like":0.00558659217877095,"every":0.00558659217877095,"other":0.00558659217877095,"be":0.00558659217877095,"deployed":0.00558659217877095,"default":0.00558659217877095,"don't":0.00558659217877095,"worry":0.00558659217877095,"always":0.00558659217877095,"contracts":0.00558659217877095,"right":0.00558659217877095,"deploying":0.00558659217877095,"testnet":0.00558659217877095,"official":0.00558659217877095,"st1f7qa2mdf17s807epa36tss8amefy4ka9tvgwxt":0.00558659217877095,"chain":0.00558659217877095,"linked":0.00558659217877095,"faucet":0.00558659217877095,"again":0.00558659217877095,"being":0.00558659217877095,"mainnet":0.00558659217877095,"see":0.00558659217877095,"sbtc-contract":0.00558659217877095,"re-mapped":0.00558659217877095,"deployment":0.00558659217877095,"plan":0.00558659217877095,"unchanged":0.00558659217877095,"only":0.00558659217877095},"29":{"import":0.011494252873563218,"file":0.011494252873563218,"folder":0.011494252873563218,"files":0.011494252873563218,"from":0.011494252873563218,"'fumadocs-ui":0.011494252873563218,"components":0.011494252873563218,"files'":0.011494252873563218,"create":0.011494252873563218,"a":0.011494252873563218,"new":0.011494252873563218,"clarinet":0.011494252873563218,"project":0.011494252873563218,"with":0.011494252873563218,"the":0.011494252873563218,"basic":0.011494252873563218,"directory":0.011494252873563218,"structure":0.011494252873563218,"and":0.011494252873563218,"configuration":0.011494252873563218,"terminal":0.011494252873563218,"my-project":0.011494252873563218,"32mcreate":0.011494252873563218,"0m":0.011494252873563218,"1mmy-project":0.011494252873563218,"1mcontracts":0.011494252873563218,"1msettings":0.011494252873563218,"1mtests":0.011494252873563218,"1mclarinet":0.011494252873563218,"toml":0.011494252873563218,"mainnet":0.011494252873563218,"testnet":0.011494252873563218,"devnet":0.011494252873563218,"1m":0.011494252873563218,"vscode":0.011494252873563218,"settings":0.011494252873563218,"json":0.011494252873563218,"tasks":0.011494252873563218,"gitignore":0.011494252873563218,"gitattributes":0.011494252873563218,"1mpackage":0.011494252873563218,"1mtsconfig":0.011494252873563218,"1mvitest":0.011494252873563218,"config":0.011494252873563218,"js":0.011494252873563218,"this":0.011494252873563218,"will":0.011494252873563218,"following":0.011494252873563218,"layout":0.011494252873563218,"classname":0.011494252873563218,"'pointer-events-none'":0.011494252873563218,"name":0.011494252873563218,"contracts":0.011494252873563218,"defaultopen":0.011494252873563218,"tests":0.011494252873563218,"package":0.011494252873563218,"tsconfig":0.011494252873563218,"vitest":0.011494252873563218,"_txt":0.011494252873563218,"_":0.011494252873563218,"contains":0.011494252873563218,"for":0.011494252873563218,"smart":0.011494252873563218,"in":0.011494252873563218,"your":0.011494252873563218,"when":0.011494252873563218,"you":0.011494252873563218,"automatically":0.011494252873563218,"add":0.011494252873563218,"them":0.011494252873563218,"to":0.011494252873563218,"accounts":0.011494252873563218,"console":0.011494252873563218,"including":0.011494252873563218,"seed":0.011494252873563218,"phrases":0.011494252873563218,"initial":0.011494252873563218,"balances":0.011494252873563218,"set":0.011494252873563218,"of":0.011494252873563218,"out-of-the-box":0.011494252873563218,"wallets":0.011494252873563218,"that":0.011494252873563218,"can":0.011494252873563218,"use":0.011494252873563218,"testing":0.011494252873563218,"environment":0.011494252873563218},"30":{"1":0.004672897196261682,"2":0.004672897196261682,"3":0.004672897196261682,"5":0.004672897196261682,"import":0.004672897196261682,"clarinet":0.004672897196261682,"js":0.004672897196261682,"from":0.004672897196261682,"'":0.004672897196261682,"components":0.004672897196261682,"ui":0.004672897196261682,"icon'":0.004672897196261682,"file":0.004672897196261682,"folder":0.004672897196261682,"files":0.004672897196261682,"'fumadocs-ui":0.004672897196261682,"files'":0.004672897196261682,"steps":0.004672897196261682,"step":0.004672897196261682,"steps'":0.004672897196261682,"in":0.004672897196261682,"this":0.004672897196261682,"quickstart":0.004672897196261682,"guide":0.004672897196261682,"you":0.004672897196261682,"will":0.004672897196261682,"write":0.004672897196261682,"a":0.004672897196261682,"simple":0.004672897196261682,"counter":0.004672897196261682,"contract":0.004672897196261682,"with":0.004672897196261682,"clarity":0.004672897196261682,"throughout":0.004672897196261682,"tutorial":0.004672897196261682,"you'll":0.004672897196261682,"learn":0.004672897196261682,"how":0.004672897196261682,"to":0.004672897196261682,"generate":0.004672897196261682,"new":0.004672897196261682,"project":0.004672897196261682,"create":0.004672897196261682,"smart":0.004672897196261682,"and":0.004672897196261682,"validate":0.004672897196261682,"your":0.004672897196261682,"code":0.004672897196261682,"using":0.004672897196261682,"the":0.004672897196261682,"cli":0.004672897196261682,"check":0.004672897196261682,"out":0.004672897196261682,"stacks":0.004672897196261682,"guides":0.004672897196261682,"create-a-new-project":0.004672897196261682,"validate-a-contract":0.004672897196261682,"for":0.004672897196261682,"deeper":0.004672897196261682,"look":0.004672897196261682,"---":0.004672897196261682,"start":0.004672897196261682,"by":0.004672897196261682,"creating":0.004672897196261682,"command":0.004672897196261682,"directory":0.004672897196261682,"named":0.004672897196261682,"_console":0.004672897196261682,"_":0.004672897196261682,"set":0.004672897196261682,"up":0.004672897196261682,"basic":0.004672897196261682,"inside":0.004672897196261682,"it":0.004672897196261682,"terminal":0.004672897196261682,"32mcreate":0.004672897196261682,"0m":0.004672897196261682,"1mcounter":0.004672897196261682,"1mcontracts":0.004672897196261682,"1msettings":0.004672897196261682,"1mtests":0.004672897196261682,"1mclarinet":0.004672897196261682,"toml":0.004672897196261682,"mainnet":0.004672897196261682,"testnet":0.004672897196261682,"devnet":0.004672897196261682,"1m":0.004672897196261682,"vscode":0.004672897196261682,"settings":0.004672897196261682,"json":0.004672897196261682,"tasks":0.004672897196261682,"gitignore":0.004672897196261682,"gitattributes":0.004672897196261682,"1mpackage":0.004672897196261682,"1mtsconfig":0.004672897196261682,"1mvitest":0.004672897196261682,"config":0.004672897196261682,"classname":0.004672897196261682,"pointer-events-none":0.004672897196261682,"name":0.004672897196261682,"contracts":0.004672897196261682,"defaultopen":0.004672897196261682,"tests":0.004672897196261682,"package":0.004672897196261682,"tsconfig":0.004672897196261682,"vitest":0.004672897196261682,"run":0.004672897196261682,"update":0.004672897196261682,"proper":0.004672897196261682,"writing":0.004672897196261682,"testing":0.004672897196261682,"cd":0.004672897196261682,"32mcreated":0.004672897196261682,"clar":0.004672897196261682,"test":0.004672897196261682,"ts":0.004672897196261682,"33mupdated":0.004672897196261682,"1mwith":0.004672897196261682,"path":0.004672897196261682,"'contracts":0.004672897196261682,"clar'":0.004672897196261682,"clarity_version":0.004672897196261682,"epoch":0.004672897196261682,"variables":0.004672897196261682,"functions":0.004672897196261682,"_txt":0.004672897196261682,"define":0.004672897196261682,"map":0.004672897196261682,"called":0.004672897196261682,"_clarity":0.004672897196261682,"counters":0.004672897196261682,"store":0.004672897196261682,"count":0.004672897196261682,"associated":0.004672897196261682,"each":0.004672897196261682,"user":0.004672897196261682,"public":0.004672897196261682,"function":0.004672897196261682,"count-up":0.004672897196261682,"that":0.004672897196261682,"increments":0.004672897196261682,"of":0.004672897196261682,"who":0.004672897196261682,"calls":0.004672897196261682,"add":0.004672897196261682,"read-only":0.004672897196261682,"get-count":0.004672897196261682,"returns":0.004672897196261682,"-c":0.004672897196261682,"define-map":0.004672897196261682,"principal":0.004672897196261682,"uint":0.004672897196261682,"define-public":0.004672897196261682,"ok":0.004672897196261682,"map-set":0.004672897196261682,"tx-sender":0.004672897196261682,"u1":0.004672897196261682,"define-read-only":0.004672897196261682,"default-to":0.004672897196261682,"u0":0.004672897196261682,"map-get":0.004672897196261682,"now":0.004672897196261682,"it's":0.004672897196261682,"time":0.004672897196261682,"errors":0.004672897196261682,"typos":0.004672897196261682,"32m":0.004672897196261682,"1m1":0.004672897196261682,"checked":0.004672897196261682,"once":0.004672897196261682,"is":0.004672897196261682,"validated":0.004672897196261682,"can":0.004672897196261682,"interact":0.004672897196261682,"locally":0.004672897196261682,"console":0.004672897196261682,"here":0.004672897196261682,"are":0.004672897196261682,"some":0.004672897196261682,"example":0.004672897196261682,"interactions":0.004672897196261682,"perform":0.004672897196261682,"call":0.004672897196261682,"on":0.004672897196261682,"increment":0.004672897196261682,"verify":0.004672897196261682,"has":0.004672897196261682,"been":0.004672897196261682,"incremented":0.004672897196261682,"calling":0.004672897196261682,"as":0.004672897196261682,"argument":0.004672897196261682,"contract-call":0.004672897196261682,"true":0.004672897196261682,"32mu1":0.004672897196261682,"next":0.004672897196261682,"cards":0.004672897196261682,"secondarycard":0.004672897196261682,"icon":0.004672897196261682,"href":0.004672897196261682,"add-a-contract":0.004672897196261682,"title":0.004672897196261682,"description":0.004672897196261682,"tag":0.004672897196261682,"'clarinet'":0.004672897196261682,"run-a-local-devnet":0.004672897196261682,"local":0.004672897196261682,"development":0.004672897196261682,"network":0.004672897196261682,"clarinet-js-sdk":0.004672897196261682,"unit":0.004672897196261682,"sdk":0.004672897196261682,"'clarinet":0.004672897196261682,"sdk'":0.004672897196261682},"31":{"import":0.0070921985815602835,"secondarycard":0.0070921985815602835,"from":0.0070921985815602835,"'":0.0070921985815602835,"components":0.0070921985815602835,"card'":0.0070921985815602835,"the":0.0070921985815602835,"platform":0.0070921985815602835,"api":0.0070921985815602835,"unlocks":0.0070921985815602835,"powerful":0.0070921985815602835,"automation":0.0070921985815602835,"opportunities":0.0070921985815602835,"in":0.0070921985815602835,"your":0.0070921985815602835,"application":0.0070921985815602835,"code":0.0070921985815602835,"development":0.0070921985815602835,"and":0.0070921985815602835,"ci":0.0070921985815602835,"scripts":0.0070921985815602835,"more":0.0070921985815602835,"via":0.0070921985815602835,"a":0.0070921985815602835,"familiar":0.0070921985815602835,"rest":0.0070921985815602835,"interface":0.0070921985815602835,"particular":0.0070921985815602835,"this":0.0070921985815602835,"lets":0.0070921985815602835,"you":0.0070921985815602835,"programmatically":0.0070921985815602835,"create":0.0070921985815602835,"update":0.0070921985815602835,"query":0.0070921985815602835,"delete":0.0070921985815602835,"chainhooks":0.0070921985815602835,"as":0.0070921985815602835,"well":0.0070921985815602835,"interact":0.0070921985815602835,"with":0.0070921985815602835,"platform-hosted":0.0070921985815602835,"devnet":0.0070921985815602835,"local":0.0070921985815602835,"machine":0.0070921985815602835,"when":0.0070921985815602835,"account":0.0070921985815602835,"you'll":0.0070921985815602835,"automatically":0.0070921985815602835,"receive":0.0070921985815602835,"an":0.0070921985815602835,"key":0.0070921985815602835,"that's":0.0070921985815602835,"required":0.0070921985815602835,"to":0.0070921985815602835,"use":0.0070921985815602835,"these":0.0070921985815602835,"endpoints":0.0070921985815602835,"can":0.0070921985815602835,"also":0.0070921985815602835,"additional":0.0070921985815602835,"keys":0.0070921985815602835,"hiro":0.0070921985815602835,"stacks":0.0070921985815602835,"api-keys":0.0070921985815602835,"needed":0.0070921985815602835,"popular":0.0070921985815602835,"cards":0.0070921985815602835,"href":0.0070921985815602835,"platform-api":0.0070921985815602835,"stacks-blockchain-api":0.0070921985815602835,"title":0.0070921985815602835,"description":0.0070921985815602835,"for":0.0070921985815602835,"data":0.0070921985815602835,"related":0.0070921985815602835,"start":0.0070921985815602835,"service":0.0070921985815602835,"hosted":0.0070921985815602835,"through":0.0070921985815602835,"chainhook":0.0070921985815602835,"tools":0.0070921985815602835,"-":0.0070921985815602835,"developer":0.0070921985815602835,"building":0.0070921985815602835,"deploying":0.0070921985815602835,"scaling":0.0070921985815602835,"bitcoin":0.0070921985815602835,"apps":0.0070921985815602835,"don't":0.0070921985815602835,"need":0.0070921985815602835,"event":0.0070921985815602835,"streams":0.0070921985815602835,"leverage":0.0070921985815602835,"independently":0.0070921985815602835,"so":0.0070921985815602835,"app":0.0070921985815602835,"react":0.0070921985815602835,"on-chain":0.0070921985815602835,"events":0.0070921985815602835,"real":0.0070921985815602835,"time":0.0070921985815602835,"blockchain":0.0070921985815602835,"fetch":0.0070921985815602835,"token":0.0070921985815602835,"metadata":0.0070921985815602835,"token-metadata-api":0.0070921985815602835,"fungible":0.0070921985815602835,"non-fungible":0.0070921985815602835,"on":0.0070921985815602835,"br":0.0070921985815602835,"callout":0.0070921985815602835,"help":0.0070921985815602835,"type":0.0070921985815602835,"reach":0.0070921985815602835,"out":0.0070921985815602835,"us":0.0070921985815602835,"span":0.0070921985815602835,"classname":0.0070921985815602835,"font-bold":0.0070921985815602835,"hiro-platform":0.0070921985815602835,"channel":0.0070921985815602835,"discord":0.0070921985815602835,"https":0.0070921985815602835,"chat":0.0070921985815602835,"under":0.0070921985815602835,"section":0.0070921985815602835,"there's":0.0070921985815602835,"weekly":0.0070921985815602835,"office":0.0070921985815602835,"hours":0.0070921985815602835,"www":0.0070921985815602835,"addevent":0.0070921985815602835,"com":0.0070921985815602835,"ki22007085":0.0070921985815602835,"call":0.0070921985815602835,"every":0.0070921985815602835,"wednesday":0.0070921985815602835,"at":0.0070921985815602835,"1pm":0.0070921985815602835,"et":0.0070921985815602835},"32":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"platform-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"v1":0.0625,"ext":0.0625,"apikey":0.0625,"bitcoin-node":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"33":{},"34":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"platform-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"v1":0.0625,"ext":0.0625,"apikey":0.0625,"devnet'":0.0625,"method":0.0625,"'delete'":0.0625,"hashead":0.0625,"false":0.0625},"35":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"platform-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"v1":0.058823529411764705,"ext":0.058823529411764705,"apikey":0.058823529411764705,"devnet":0.058823529411764705,"projectname":0.058823529411764705,"method":0.058823529411764705,"'put'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"36":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"platform-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"v1":0.0625,"ext":0.0625,"apikey":0.0625,"stacks-blockchain-api":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"37":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"platform-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"v1":0.0625,"ext":0.0625,"apikey":0.0625,"chainhooks'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"38":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"platform-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"v1":0.0625,"ext":0.0625,"apikey":0.0625,"chainhooks'":0.0625,"method":0.0625,"'post'":0.0625,"hashead":0.0625,"false":0.0625},"39":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"platform-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"v1":0.058823529411764705,"ext":0.058823529411764705,"apikey":0.058823529411764705,"chainhooks":0.058823529411764705,"chainhookuuid":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"40":{},"41":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"platform-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"v1":0.058823529411764705,"ext":0.058823529411764705,"apikey":0.058823529411764705,"chainhooks":0.058823529411764705,"chainhookuuid":0.058823529411764705,"method":0.058823529411764705,"'put'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"42":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"platform-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"v1":0.058823529411764705,"ext":0.058823529411764705,"apikey":0.058823529411764705,"chainhooks":0.058823529411764705,"chainhookuuid":0.058823529411764705,"method":0.058823529411764705,"'delete'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"43":{"apipage":0.05555555555555555,"document":0.05555555555555555,"openapi":0.05555555555555555,"platform-api":0.05555555555555555,"json":0.05555555555555555,"operations":0.05555555555555555,"path":0.05555555555555555,"'":0.05555555555555555,"v1":0.05555555555555555,"ext":0.05555555555555555,"apikey":0.05555555555555555,"chainhooks":0.05555555555555555,"chainhookuuid":0.05555555555555555,"status'":0.05555555555555555,"method":0.05555555555555555,"'get'":0.05555555555555555,"hashead":0.05555555555555555,"false":0.05555555555555555},"44":{"595650":0.005555555555555556,"import":0.005555555555555556,"card":0.005555555555555556,"as":0.005555555555555556,"maincard":0.005555555555555556,"smallcard":0.005555555555555556,"from":0.005555555555555556,"'":0.005555555555555556,"components":0.005555555555555556,"card'":0.005555555555555556,"imagezoom":0.005555555555555556,"'fumadocs-ui":0.005555555555555556,"image-zoom'":0.005555555555555556,"pagefooter":0.005555555555555556,"footer'":0.005555555555555556,"messagecircle":0.005555555555555556,"braces":0.005555555555555556,"chevronright":0.005555555555555556,"code":0.005555555555555556,"database":0.005555555555555556,"play":0.005555555555555556,"rocket":0.005555555555555556,"star":0.005555555555555556,"terminal":0.005555555555555556,"wallet":0.005555555555555556,"'lucide-react'":0.005555555555555556,"api":0.005555555555555556,"backend":0.005555555555555556,"bugicon":0.005555555555555556,"clarinet":0.005555555555555556,"cloud":0.005555555555555556,"chainhook":0.005555555555555556,"frontend":0.005555555555555556,"hiro":0.005555555555555556,"js":0.005555555555555556,"newspaper":0.005555555555555556,"pulse":0.005555555555555556,"questionicon":0.005555555555555556,"ui":0.005555555555555556,"icon'":0.005555555555555556,"heroimage":0.005555555555555556,"public":0.005555555555555556,"stacks-hero":0.005555555555555556,"svg'":0.005555555555555556,"div":0.005555555555555556,"classname":0.005555555555555556,"'flex":0.005555555555555556,"flex-col":0.005555555555555556,"space-y-10":0.005555555555555556,"pt-0'":0.005555555555555556,"space-x-6":0.005555555555555556,"items-end'":0.005555555555555556,"alt":0.005555555555555556,"banner":0.005555555555555556,"src":0.005555555555555556,"mt-0":0.005555555555555556,"mb-6":0.005555555555555556,"first-line":0.005555555555555556,"rounded-xl":0.005555555555555556,"bg-background":0.005555555555555556,"priority":0.005555555555555556,"_h2":0.005555555555555556,"mb-2":0.005555555555555556,"_p":0.005555555555555556,"mb-6'":0.005555555555555556,"build":0.005555555555555556,"with":0.005555555555555556,"stacks":0.005555555555555556,"find":0.005555555555555556,"all":0.005555555555555556,"the":0.005555555555555556,"guides":0.005555555555555556,"and":0.005555555555555556,"resources":0.005555555555555556,"you":0.005555555555555556,"need":0.005555555555555556,"to":0.005555555555555556,"on":0.005555555555555556,"cards":0.005555555555555556,"'group":0.005555555555555556,"space-y-1'":0.005555555555555556,"icon":0.005555555555555556,"'transition-colors":0.005555555555555556,"duration-500":0.005555555555555556,"ease-in-out":0.005555555555555556,"group-hover":0.005555555555555556,"text-primary'":0.005555555555555556,"href":0.005555555555555556,"get-started":0.005555555555555556,"title":0.005555555555555556,"get":0.005555555555555556,"started":0.005555555555555556,"description":0.005555555555555556,"our":0.005555555555555556,"end-to-end":0.005555555555555556,"tutorials":0.005555555555555556,"quickstart":0.005555555555555556,"across":0.005555555555555556,"tools":0.005555555555555556,"reference":0.005555555555555556,"explore":0.005555555555555556,"endpoints":0.005555555555555556,"for":0.005555555555555556,"interacting":0.005555555555555556,"blockchain":0.005555555555555556,"flex-col'":0.005555555555555556,"h4":0.005555555555555556,"id":0.005555555555555556,"explore-by-category":0.005555555555555556,"text-":0.005555555555555556,"dark":0.005555555555555556,"8c877d":0.005555555555555556,"scroll-m-20":0.005555555555555556,"a":0.005555555555555556,"not-prose":0.005555555555555556,"group":0.005555555555555556,"text-sm":0.005555555555555556,"uppercase":0.005555555555555556,"by":0.005555555555555556,"category":0.005555555555555556,"---":0.005555555555555556,"platform":0.005555555555555556,"app":0.005555555555555556,"templates":0.005555555555555556,"full-stack":0.005555555555555556,"starter-kits":0.005555555555555556,"including":0.005555555555555556,"front-end":0.005555555555555556,"back-end":0.005555555555555556,"smart":0.005555555555555556,"contract":0.005555555555555556,"development":0.005555555555555556,"kickstart":0.005555555555555556,"your":0.005555555555555556,"journey":0.005555555555555556,"sdk":0.005555555555555556,"data":0.005555555555555556,"streaming":0.005555555555555556,"amp":0.005555555555555556,"events":0.005555555555555556,"create":0.005555555555555556,"custom":0.005555555555555556,"event":0.005555555555555556,"streams":0.005555555555555556,"real-time":0.005555555555555556,"web":0.005555555555555556,"interact":0.005555555555555556,"contracts":0.005555555555555556,"library":0.005555555555555556,"hosted":0.005555555555555556,"apis":0.005555555555555556,"offering":0.005555555555555556,"familiar":0.005555555555555556,"rest":0.005555555555555556,"interface":0.005555555555555556,"token-metadata-api":0.005555555555555556,"token":0.005555555555555556,"management":0.005555555555555556,"fetching":0.005555555555555556,"metadata":0.005555555555555556,"explore-by-tool":0.005555555555555556,"tool":0.005555555555555556,"developer":0.005555555555555556,"building":0.005555555555555556,"deploying":0.005555555555555556,"scaling":0.005555555555555556,"bitcoin":0.005555555555555556,"apps":0.005555555555555556,"test":0.005555555555555556,"deploy":0.005555555555555556,"via":0.005555555555555556,"collection":0.005555555555555556,"of":0.005555555555555556,"javascript":0.005555555555555556,"libraries":0.005555555555555556,"applications":0.005555555555555556,"customizable":0.005555555555555556,"lightweight":0.005555555555555556,"databases":0.005555555555555556,"on-chain":0.005555555555555556},"45":{"import":0.005917159763313609,"link":0.005917159763313609,"from":0.005917159763313609,"next":0.005917159763313609,"button":0.005917159763313609,"components":0.005917159763313609,"ui":0.005917159763313609,"the":0.005917159763313609,"hiro":0.005917159763313609,"platform":0.005917159763313609,"is":0.005917159763313609,"your":0.005917159763313609,"all-in-one":0.005917159763313609,"solution":0.005917159763313609,"for":0.005917159763313609,"building":0.005917159763313609,"and":0.005917159763313609,"scaling":0.005917159763313609,"bitcoin":0.005917159763313609,"applications":0.005917159763313609,"it":0.005917159763313609,"provides":0.005917159763313609,"essential":0.005917159763313609,"tools":0.005917159763313609,"including":0.005917159763313609,"api":0.005917159763313609,"key":0.005917159763313609,"management":0.005917159763313609,"customizable":0.005917159763313609,"data":0.005917159763313609,"streams":0.005917159763313609,"production-ready":0.005917159763313609,"app":0.005917159763313609,"templates":0.005917159763313609,"dedicated":0.005917159763313609,"testing":0.005917159763313609,"environments":0.005917159763313609,"onchain":0.005917159763313609,"monitoring":0.005917159763313609,"analytics":0.005917159763313609,"-":0.005917159763313609,"everything":0.005917159763313609,"developers":0.005917159763313609,"need":0.005917159763313609,"to":0.005917159763313609,"bring":0.005917159763313609,"their":0.005917159763313609,"apps":0.005917159763313609,"life":0.005917159763313609,"classname":0.005917159763313609,"bg-orange-500":0.005917159763313609,"hover":0.005917159763313609,"bg-orange-600":0.005917159763313609,"target":0.005917159763313609,"_blank":0.005917159763313609,"href":0.005917159763313609,"https":0.005917159763313609,"so":0.005917159763313609,"no-underline":0.005917159763313609,"get":0.005917159763313609,"started":0.005917159763313609,"on":0.005917159763313609,"projects":0.005917159763313609,"images":0.005917159763313609,"o1":0.005917159763313609,"png":0.005917159763313609,"guides":0.005917159763313609,"cards":0.005917159763313609,"card":0.005917159763313609,"stacks":0.005917159763313609,"create-chainhooks":0.005917159763313609,"title":0.005917159763313609,"create":0.005917159763313609,"event":0.005917159763313609,"with":0.005917159763313609,"chainhook":0.005917159763313609,"description":0.005917159763313609,"manage":0.005917159763313609,"webhook-like":0.005917159763313609,"triggers":0.005917159763313609,"that":0.005917159763313609,"react":0.005917159763313609,"on-chain":0.005917159763313609,"events":0.005917159763313609,"in":0.005917159763313609,"real":0.005917159763313609,"time":0.005917159763313609,"deploy-contracts":0.005917159763313609,"deploy":0.005917159763313609,"contracts":0.005917159763313609,"project":0.005917159763313609,"deployment":0.005917159763313609,"plans":0.005917159763313609,"can":0.005917159763313609,"handle":0.005917159763313609,"contract":0.005917159763313609,"dependencies":0.005917159763313609,"devnet":0.005917159763313609,"iterate":0.005917159763313609,"quickly":0.005917159763313609,"leverage":0.005917159763313609,"a":0.005917159763313609,"private":0.005917159763313609,"instance":0.005917159763313609,"of":0.005917159763313609,"blockchain":0.005917159763313609,"rapid":0.005917159763313609,"feedback":0.005917159763313609,"loops":0.005917159763313609,"better":0.005917159763313609,"debugging":0.005917159763313609,"experience":0.005917159763313609,"contract-monitoring":0.005917159763313609,"monitor":0.005917159763313609,"activity":0.005917159763313609,"set":0.005917159763313609,"up":0.005917159763313609,"smart":0.005917159763313609,"alerts":0.005917159763313609,"track":0.005917159763313609,"after":0.005917159763313609,"related":0.005917159763313609,"clarinet":0.005917159763313609,"build":0.005917159763313609,"locally":0.005917159763313609,"device":0.005917159763313609,"you":0.005917159763313609,"don":0.005917159763313609,"t":0.005917159763313609,"independently":0.005917159763313609,"js":0.005917159763313609,"reinvent":0.005917159763313609,"wheel":0.005917159763313609,"faster":0.005917159763313609,"library":0.005917159763313609,"handles":0.005917159763313609,"basic":0.005917159763313609,"functions":0.005917159763313609,"br":0.005917159763313609,"callout":0.005917159763313609,"help":0.005917159763313609,"type":0.005917159763313609,"reach":0.005917159763313609,"out":0.005917159763313609,"us":0.005917159763313609,"span":0.005917159763313609,"font-bold":0.005917159763313609,"hiro-platform":0.005917159763313609,"channel":0.005917159763313609,"discord":0.005917159763313609,"chat":0.005917159763313609,"under":0.005917159763313609,"developer":0.005917159763313609,"section":0.005917159763313609,"there's":0.005917159763313609,"also":0.005917159763313609,"weekly":0.005917159763313609,"office":0.005917159763313609,"hours":0.005917159763313609,"www":0.005917159763313609,"addevent":0.005917159763313609,"com":0.005917159763313609,"ki22007085":0.005917159763313609,"call":0.005917159763313609,"every":0.005917159763313609,"wednesday":0.005917159763313609,"at":0.005917159763313609,"1pm":0.005917159763313609,"et":0.005917159763313609},"46":{"1":0.009523809523809525,"2":0.009523809523809525,"3":0.009523809523809525,"4":0.009523809523809525,"5":0.009523809523809525,"prerequisites":0.009523809523809525,"-":0.009523809523809525,"follow":0.009523809523809525,"the":0.009523809523809525,"create":0.009523809523809525,"project":0.009523809523809525,"stacks":0.009523809523809525,"platform":0.009523809523809525,"guides":0.009523809523809525,"create-project":0.009523809523809525,"guide":0.009523809523809525,"to":0.009523809523809525,"or":0.009523809523809525,"import":0.009523809523809525,"a":0.009523809523809525,"make":0.009523809523809525,"sure":0.009523809523809525,"you":0.009523809523809525,"have":0.009523809523809525,"installed":0.009523809523809525,"and":0.009523809523809525,"connected":0.009523809523809525,"wallet":0.009523809523809525,"deploy":0.009523809523809525,"your":0.009523809523809525,"contracts":0.009523809523809525,"use":0.009523809523809525,"button":0.009523809523809525,"once":0.009523809523809525,"is":0.009523809523809525,"setup":0.009523809523809525,"can":0.009523809523809525,"testnet":0.009523809523809525,"mainnet":0.009523809523809525,"using":0.009523809523809525,"on":0.009523809523809525,"hiro":0.009523809523809525,"images":0.009523809523809525,"deploy-contracts":0.009523809523809525,"d1":0.009523809523809525,"png":0.009523809523809525,"following":0.009523809523809525,"are":0.009523809523809525,"steps":0.009523809523809525,"projects":0.009523809523809525,"page":0.009523809523809525,"select":0.009523809523809525,"want":0.009523809523809525,"from":0.009523809523809525,"available":0.009523809523809525,"at":0.009523809523809525,"top":0.009523809523809525,"right":0.009523809523809525,"of":0.009523809523809525,"choose":0.009523809523809525,"network":0.009523809523809525,"note":0.009523809523809525,"for":0.009523809523809525,"devnet":0.009523809523809525,"reference":0.009523809523809525,"this":0.009523809523809525,"below":0.009523809523809525,"specific":0.009523809523809525,"will":0.009523809523809525,"see":0.009523809523809525,"generate":0.009523809523809525,"deployment":0.009523809523809525,"plan":0.009523809523809525,"generated":0.009523809523809525,"list":0.009523809523809525,"be":0.009523809523809525,"deployed":0.009523809523809525,"now":0.009523809523809525,"connect":0.009523809523809525,"click":0.009523809523809525,"d2":0.009523809523809525,"if":0.009523809523809525,"find":0.009523809523809525,"issues":0.009523809523809525,"with":0.009523809523809525,"process":0.009523809523809525,"reach":0.009523809523809525,"out":0.009523809523809525,"us":0.009523809523809525,"hiro-platform":0.009523809523809525,"channel":0.009523809523809525,"https":0.009523809523809525,"chat":0.009523809523809525,"discord":0.009523809523809525,"under":0.009523809523809525,"developer":0.009523809523809525,"tools":0.009523809523809525,"section":0.009523809523809525,"file":0.009523809523809525,"an":0.009523809523809525,"issue":0.009523809523809525,"here":0.009523809523809525,"hiro-pbc":0.009523809523809525,"canny":0.009523809523809525,"io":0.009523809523809525},"47":{"1":0.00625,"2":0.00625,"3":0.00625,"import":0.00625,"code":0.00625,"terminal":0.00625,"from":0.00625,"lucide-react":0.00625,"smallcard":0.00625,"components":0.00625,"card":0.00625,"callout":0.00625,"cards":0.00625,"the":0.00625,"hiro":0.00625,"platform":0.00625,"offers":0.00625,"multiple":0.00625,"ways":0.00625,"to":0.00625,"create":0.00625,"projects":0.00625,"whether":0.00625,"you're":0.00625,"starting":0.00625,"scratch":0.00625,"with":0.00625,"a":0.00625,"template":0.00625,"or":0.00625,"importing":0.00625,"an":0.00625,"existing":0.00625,"repository":0.00625,"this":0.00625,"guide":0.00625,"will":0.00625,"walk":0.00625,"you":0.00625,"through":0.00625,"both":0.00625,"approaches":0.00625,"using":0.00625,"templates":0.00625,"main":0.00625,"page":0.00625,"click":0.00625,"add":0.00625,"project":0.00625,"button":0.00625,"begin":0.00625,"creating":0.00625,"new":0.00625,"selection":0.00625,"images":0.00625,"create-project":0.00625,"c2":0.00625,"png":0.00625,"provides":0.00625,"types":0.00625,"of":0.00625,"pre-built":0.00625,"help":0.00625,"get":0.00625,"started":0.00625,"quickly":0.00625,"app":0.00625,"contract-only":0.00625,"are":0.00625,"feature":0.00625,"rich":0.00625,"pre-configured":0.00625,"frontend":0.00625,"and":0.00625,"smart":0.00625,"contracts":0.00625,"just":0.00625,"that":0.00625,"contract":0.00625,"start":0.00625,"building":0.00625,"simply":0.00625,"select":0.00625,"want":0.00625,"open":0.00625,"up":0.00625,"more":0.00625,"detailed":0.00625,"view":0.00625,"c1":0.00625,"once":0.00625,"ready":0.00625,"clone":0.00625,"copy":0.00625,"your":0.00625,"github":0.00625,"account":0.00625,"there":0.00625,"see":0.00625,"instructions":0.00625,"on":0.00625,"how":0.00625,"locally":0.00625,"development":0.00625,"if":0.00625,"have":0.00625,"can":0.00625,"it":0.00625,"directly":0.00625,"into":0.00625,"haven't":0.00625,"already":0.00625,"authorize":0.00625,"you'll":0.00625,"list":0.00625,"repositories":0.00625,"be":0.00625,"imported":0.00625,"by":0.00625,"clicking":0.00625,"c3":0.00625,"type":0.00625,"info":0.00625,"requires":0.00625,"specific":0.00625,"clarinet-generated":0.00625,"files":0.00625,"directory":0.00625,"structure":0.00625,"successfully":0.00625,"should":0.00625,"include":0.00625,"-":0.00625,"clar":0.00625,"containing":0.00625,"clarinet":0.00625,"toml":0.00625,"configuration":0.00625,"file":0.00625,"in":0.00625,"folder":0.00625,"is":0.00625,"next":0.00625,"steps":0.00625,"href":0.00625,"stacks":0.00625,"guides":0.00625,"deploy-contracts":0.00625,"title":0.00625,"deploy":0.00625,"description":0.00625,"learn":0.00625,"testnet":0.00625,"mainnet":0.00625,"devnet":0.00625,"running":0.00625,"use":0.00625,"test":0.00625,"local":0.00625,"environment":0.00625},"48":{"1":0.010869565217391304,"2":0.010869565217391304,"3":0.010869565217391304,"4":0.010869565217391304,"archive":0.010869565217391304,"a":0.010869565217391304,"project":0.010869565217391304,"sometimes":0.010869565217391304,"you":0.010869565217391304,"may":0.010869565217391304,"find":0.010869565217391304,"it":0.010869565217391304,"necessary":0.010869565217391304,"to":0.010869565217391304,"from":0.010869565217391304,"your":0.010869565217391304,"list":0.010869565217391304,"is":0.010869565217391304,"important":0.010869565217391304,"understand":0.010869565217391304,"that":0.010869565217391304,"archiving":0.010869565217391304,"not":0.010869565217391304,"the":0.010869565217391304,"same":0.010869565217391304,"as":0.010869565217391304,"deleting":0.010869565217391304,"means":0.010869565217391304,"wish":0.010869565217391304,"move":0.010869565217391304,"status":0.010869565217391304,"an":0.010869565217391304,"active":0.010869565217391304,"one":0.010869565217391304,"and":0.010869565217391304,"visible":0.010869565217391304,"in":0.010869565217391304,"follow":0.010869565217391304,"steps":0.010869565217391304,"below":0.010869565217391304,"sign":0.010869565217391304,"hiro":0.010869565217391304,"platform":0.010869565217391304,"https":0.010869565217391304,"so":0.010869565217391304,"once":0.010869565217391304,"are":0.010869565217391304,"authenticated":0.010869565217391304,"will":0.010869565217391304,"be":0.010869565217391304,"redirected":0.010869565217391304,"page":0.010869565217391304,"of":0.010869565217391304,"projects":0.010869565217391304,"click":0.010869565217391304,"on":0.010869565217391304,"far-right":0.010869565217391304,"three":0.010869565217391304,"dots":0.010869565217391304,"select":0.010869565217391304,"this":0.010869565217391304,"remove":0.010869565217391304,"place":0.010869565217391304,"into":0.010869565217391304,"folder":0.010869565217391304,"images":0.010869565217391304,"archive-project":0.010869565217391304,"png":0.010869565217391304,"unarchive":0.010869565217391304,"button":0.010869565217391304,"at":0.010869565217391304,"top":0.010869565217391304,"right":0.010869565217391304,"now":0.010869565217391304,"see":0.010869565217391304,"archived":0.010869565217391304,"three-dots":0.010869565217391304,"far":0.010869565217391304,"for":0.010869565217391304,"any":0.010869565217391304,"want":0.010869565217391304,"unarchived":0.010869565217391304,"back":0.010869565217391304,"callout":0.010869565217391304,"title":0.010869565217391304,"note":0.010869565217391304,"type":0.010869565217391304,"info":0.010869565217391304,"yet":0.010869565217391304,"available":0.010869565217391304,"beta":0.010869565217391304,"version":0.010869565217391304},"49":{"1":0.004629629629629629,"2":0.004629629629629629,"3":0.004629629629629629,"4":0.004629629629629629,"5":0.004629629629629629,"500":0.004629629629629629,"import":0.004629629629629629,"accordion":0.004629629629629629,"accordions":0.004629629629629629,"from":0.004629629629629629,"'fumadocs-ui":0.004629629629629629,"components":0.004629629629629629,"accordion'":0.004629629629629629,"the":0.004629629629629629,"stacks":0.004629629629629629,"testnet":0.004629629629629629,"faucet":0.004629629629629629,"is":0.004629629629629629,"a":0.004629629629629629,"dedicated":0.004629629629629629,"utility":0.004629629629629629,"for":0.004629629629629629,"developers":0.004629629629629629,"building":0.004629629629629629,"on":0.004629629629629629,"blockchain":0.004629629629629629,"to":0.004629629629629629,"aid":0.004629629629629629,"you":0.004629629629629629,"in":0.004629629629629629,"deploying":0.004629629629629629,"and":0.004629629629629629,"running":0.004629629629629629,"smart":0.004629629629629629,"contracts":0.004629629629629629,"we've":0.004629629629629629,"provided":0.004629629629629629,"this":0.004629629629629629,"that":0.004629629629629629,"offers":0.004629629629629629,"easy":0.004629629629629629,"access":0.004629629629629629,"stx":0.004629629629629629,"tokens":0.004629629629629629,"create":0.004629629629629629,"chainhook":0.004629629629629629,"window":0.004629629629629629,"images":0.004629629629629629,"request":0.004629629629629629,"png":0.004629629629629629,"why":0.004629629629629629,"use":0.004629629629629629,"testing":0.004629629629629629,"requires":0.004629629629629629,"certain":0.004629629629629629,"amount":0.004629629629629629,"of":0.004629629629629629,"native":0.004629629629629629,"facilitate":0.004629629629629629,"various":0.004629629629629629,"operations":0.004629629629629629,"contract":0.004629629629629629,"deployments":0.004629629629629629,"transaction":0.004629629629629629,"executions":0.004629629629629629,"however":0.004629629629629629,"sourcing":0.004629629629629629,"these":0.004629629629629629,"can":0.004629629629629629,"often":0.004629629629629629,"be":0.004629629629629629,"cumbersome":0.004629629629629629,"simplifies":0.004629629629629629,"by":0.004629629629629629,"offering":0.004629629629629629,"hassle-free":0.004629629629629629,"way":0.004629629629629629,"acquire":0.004629629629629629,"purposes":0.004629629629629629,"how":0.004629629629629629,"visit":0.004629629629629629,"page":0.004629629629629629,"navigate":0.004629629629629629,"platform":0.004629629629629629,"hiro":0.004629629629629629,"so":0.004629629629629629,"https":0.004629629629629629,"select":0.004629629629629629,"token":0.004629629629629629,"which":0.004629629629629629,"want":0.004629629629629629,"either":0.004629629629629629,"or":0.004629629629629629,"sbtc":0.004629629629629629,"you'll":0.004629629629629629,"find":0.004629629629629629,"straightforward":0.004629629629629629,"interface":0.004629629629629629,"with":0.004629629629629629,"button":0.004629629629629629,"simply":0.004629629629629629,"click":0.004629629629629629,"receive":0.004629629629629629,"x":0.004629629629629629,"clicking":0.004629629629629629,"your":0.004629629629629629,"account":0.004629629629629629,"frequently":0.004629629629629629,"asked":0.004629629629629629,"questions":0.004629629629629629,"title":0.004629629629629629,"what":0.004629629629629629,"an":0.004629629629629629,"application":0.004629629629629629,"dispenses":0.004629629629629629,"free":0.004629629629629629,"network":0.004629629629629629,"used":0.004629629629629629,"development":0.004629629629629629,"provides":0.004629629629629629,"test":0.004629629629629629,"optimizing":0.004629629629629629,"leverage":0.004629629629629629,"it's":0.004629629629629629,"important":0.004629629629629629,"remember":0.004629629629629629,"have":0.004629629629629629,"no":0.004629629629629629,"real-world":0.004629629629629629,"value":0.004629629629629629,"cannot":0.004629629629629629,"sold":0.004629629629629629,"main":0.004629629629629629,"does":0.004629629629629629,"work":0.004629629629629629,"type":0.004629629629629629,"wish":0.004629629629629629,"enter":0.004629629629629629,"wallet":0.004629629629629629,"address":0.004629629629629629,"where":0.004629629629629629,"them":0.004629629629629629,"will":0.004629629629629629,"sends":0.004629629629629629,"small":0.004629629629629629,"if":0.004629629629629629,"you're":0.004629629629629629,"curious":0.004629629629629629,"track":0.004629629629629629,"transaction's":0.004629629629629629,"status":0.004629629629629629,"using":0.004629629629629629,"explorer":0.004629629629629629,"it":0.004629629629629629,"secure":0.004629629629629629,"we":0.004629629629629629,"securely":0.004629629629629629,"handle":0.004629629629629629,"provide":0.004629629629629629,"while":0.004629629629629629,"processing":0.004629629629629629,"data":0.004629629629629629,"not":0.004629629629629629,"shared":0.004629629629629629,"any":0.004629629629629629,"other":0.004629629629629629,"services":0.004629629629629629,"there":0.004629629629629629,"limit":0.004629629629629629,"number":0.004629629629629629,"i":0.004629629629629629,"make":0.004629629629629629,"up":0.004629629629629629,"requests":0.004629629629629629,"every":0.004629629629629629,"minutes":0.004629629629629629,"more":0.004629629629629629,"details":0.004629629629629629,"see":0.004629629629629629,"our":0.004629629629629629,"rate":0.004629629629629629,"limiting":0.004629629629629629,"policies":0.004629629629629629,"rate-limiting":0.004629629629629629,"long":0.004629629629629629,"take":0.004629629629629629,"arrive":0.004629629629629629,"my":0.004629629629629629,"time":0.004629629629629629,"depends":0.004629629629629629,"busy":0.004629629629629629,"average":0.004629629629629629,"should":0.004629629629629629,"seems":0.004629629629629629,"stuck":0.004629629629629629,"feel":0.004629629629629629,"reach":0.004629629629629629,"out":0.004629629629629629,"us":0.004629629629629629,"support":0.004629629629629629,"channel":0.004629629629629629,"chat":0.004629629629629629,"callout":0.004629629629629629,"info":0.004629629629629629,"daily":0.004629629629629629,"ensure":0.004629629629629629,"fair":0.004629629629629629,"distribution":0.004629629629629629,"availability":0.004629629629629629,"all":0.004629629629629629,"there's":0.004629629629629629,"one":0.004629629629629629,"per":0.004629629629629629,"day":0.004629629629629629,"plan":0.004629629629629629,"accordingly":0.004629629629629629},"50":{"100":0.0038022813688212928,"devnet":0.0038022813688212928,"is":0.0038022813688212928,"a":0.0038022813688212928,"personal":0.0038022813688212928,"blockchain":0.0038022813688212928,"environment":0.0038022813688212928,"that":0.0038022813688212928,"lets":0.0038022813688212928,"you":0.0038022813688212928,"test":0.0038022813688212928,"and":0.0038022813688212928,"validate":0.0038022813688212928,"your":0.0038022813688212928,"contract":0.0038022813688212928,"code":0.0038022813688212928,"before":0.0038022813688212928,"deploying":0.0038022813688212928,"on":0.0038022813688212928,"public":0.0038022813688212928,"network":0.0038022813688212928,"like":0.0038022813688212928,"testnet":0.0038022813688212928,"or":0.0038022813688212928,"mainnet":0.0038022813688212928,"in":0.0038022813688212928,"this":0.0038022813688212928,"guide":0.0038022813688212928,"you'll":0.0038022813688212928,"learn":0.0038022813688212928,"how":0.0038022813688212928,"to":0.0038022813688212928,"interact":0.0038022813688212928,"with":0.0038022813688212928,"the":0.0038022813688212928,"hiro":0.0038022813688212928,"platform":0.0038022813688212928,"expedite":0.0038022813688212928,"development":0.0038022813688212928,"what":0.0038022813688212928,"private":0.0038022813688212928,"smart":0.0038022813688212928,"contracts":0.0038022813688212928,"quickly":0.0038022813688212928,"think":0.0038022813688212928,"of":0.0038022813688212928,"it":0.0038022813688212928,"as":0.0038022813688212928,"sandbox":0.0038022813688212928,"no":0.0038022813688212928,"one":0.0038022813688212928,"else":0.0038022813688212928,"can":0.0038022813688212928,"see":0.0038022813688212928,"instance":0.0038022813688212928,"don't":0.0038022813688212928,"have":0.0038022813688212928,"worry":0.0038022813688212928,"about":0.0038022813688212928,"breaking":0.0038022813688212928,"stop":0.0038022813688212928,"restart":0.0038022813688212928,"many":0.0038022813688212928,"times":0.0038022813688212928,"need":0.0038022813688212928,"while":0.0038022813688212928,"developers":0.0038022813688212928,"run":0.0038022813688212928,"locally":0.0038022813688212928,"using":0.0038022813688212928,"clarinet":0.0038022813688212928,"provides":0.0038022813688212928,"hosted":0.0038022813688212928,"version":0.0038022813688212928,"eliminates":0.0038022813688212928,"manage":0.0038022813688212928,"nodes":0.0038022813688212928,"miners":0.0038022813688212928,"machine":0.0038022813688212928,"platform-hosted":0.0038022813688212928,"still":0.0038022813688212928,"produces":0.0038022813688212928,"blocks":0.0038022813688212928,"processes":0.0038022813688212928,"transactions":0.0038022813688212928,"but":0.0038022813688212928,"offloads":0.0038022813688212928,"computational":0.0038022813688212928,"overhead":0.0038022813688212928,"our":0.0038022813688212928,"infrastructure":0.0038022813688212928,"providing":0.0038022813688212928,"more":0.0038022813688212928,"intuitive":0.0038022813688212928,"interface":0.0038022813688212928,"for":0.0038022813688212928,"risk-free":0.0038022813688212928,"testing":0.0038022813688212928,"ground":0.0038022813688212928,"convenience":0.0038022813688212928,"rapid":0.0038022813688212928,"prototyping":0.0038022813688212928,"cost":0.0038022813688212928,"savings":0.0038022813688212928,"privacy":0.0038022813688212928,"benefits":0.0038022813688212928,"offers":0.0038022813688212928,"several":0.0038022813688212928,"advantages":0.0038022813688212928,"-":0.0038022813688212928,"zero":0.0038022813688212928,"local":0.0038022813688212928,"setup":0.0038022813688212928,"configure":0.0038022813688212928,"maintain":0.0038022813688212928,"resource-efficient":0.0038022813688212928,"demands":0.0038022813688212928,"quick":0.0038022813688212928,"iterations":0.0038022813688212928,"immediate":0.0038022813688212928,"feedback":0.0038022813688212928,"cost-efficiency":0.0038022813688212928,"real":0.0038022813688212928,"cryptocurrency":0.0038022813688212928,"expenses":0.0038022813688212928,"seamless":0.0038022813688212928,"integration":0.0038022813688212928,"connect":0.0038022813688212928,"isolated":0.0038022813688212928,"confidential":0.0038022813688212928,"secure":0.0038022813688212928,"first":0.0038022813688212928,"log":0.0038022813688212928,"into":0.0038022813688212928,"https":0.0038022813688212928,"so":0.0038022813688212928,"after":0.0038022813688212928,"setting":0.0038022813688212928,"up":0.0038022813688212928,"project":0.0038022813688212928,"stacks":0.0038022813688212928,"guides":0.0038022813688212928,"create-project":0.0038022813688212928,"navigate":0.0038022813688212928,"page":0.0038022813688212928,"where":0.0038022813688212928,"select":0.0038022813688212928,"tab":0.0038022813688212928,"starting":0.0038022813688212928,"managing":0.0038022813688212928,"click":0.0038022813688212928,"start":0.0038022813688212928,"initially":0.0038022813688212928,"should":0.0038022813688212928,"read":0.0038022813688212928,"inactive":0.0038022813688212928,"button":0.0038022813688212928,"dashboard":0.0038022813688212928,"images":0.0038022813688212928,"dev1":0.0038022813688212928,"png":0.0038022813688212928,"callout":0.0038022813688212928,"title":0.0038022813688212928,"programmatic":0.0038022813688212928,"api":0.0038022813688212928,"also":0.0038022813688212928,"programmatically":0.0038022813688212928,"via":0.0038022813688212928,"platform-api":0.0038022813688212928,"if":0.0038022813688212928,"want":0.0038022813688212928,"terminal":0.0038022813688212928,"open":0.0038022813688212928,"project's":0.0038022813688212928,"toml":0.0038022813688212928,"file":0.0038022813688212928,"vs":0.0038022813688212928,"editor":0.0038022813688212928,"from":0.0038022813688212928,"there":0.0038022813688212928,"settings":0.0038022813688212928,"match":0.0038022813688212928,"needs":0.0038022813688212928,"once":0.0038022813688212928,"will":0.0038022813688212928,"take":0.0038022813688212928,"few":0.0038022813688212928,"moments":0.0038022813688212928,"spin":0.0038022813688212928,"status":0.0038022813688212928,"indicator":0.0038022813688212928,"keep":0.0038022813688212928,"updated":0.0038022813688212928,"progress":0.0038022813688212928,"active":0.0038022813688212928,"session":0.0038022813688212928,"management":0.0038022813688212928,"when":0.0038022813688212928,"ready":0.0038022813688212928,"change":0.0038022813688212928,"'active'":0.0038022813688212928,"needed":0.0038022813688212928,"refresh":0.0038022813688212928,"timer":0.0038022813688212928,"mind":0.0038022813688212928,"only":0.0038022813688212928,"at":0.0038022813688212928,"time":0.0038022813688212928,"per":0.0038022813688212928,"user":0.0038022813688212928,"account":0.0038022813688212928,"work":0.0038022813688212928,"different":0.0038022813688212928,"simply":0.0038022813688212928,"within":0.0038022813688212928,"seamlessly":0.0038022813688212928,"transition":0.0038022813688212928,"monthly":0.0038022813688212928,"limit":0.0038022813688212928,"sessions":0.0038022813688212928,"plan":0.0038022813688212928,"schedule":0.0038022813688212928,"accordingly":0.0038022813688212928,"exploring":0.0038022813688212928,"platform's":0.0038022813688212928,"comprehensive":0.0038022813688212928,"monitoring":0.0038022813688212928,"interacting":0.0038022813688212928,"track":0.0038022813688212928,"real-time":0.0038022813688212928,"block":0.0038022813688212928,"production":0.0038022813688212928,"through":0.0038022813688212928,"visual":0.0038022813688212928,"assembly":0.0038022813688212928,"line":0.0038022813688212928,"inspect":0.0038022813688212928,"contents":0.0038022813688212928,"transaction":0.0038022813688212928,"details":0.0038022813688212928,"search":0.0038022813688212928,"efficiently":0.0038022813688212928,"monitor":0.0038022813688212928,"deployments":0.0038022813688212928,"function":0.0038022813688212928,"calls":0.0038022813688212928,"mint":0.0038022813688212928,"new":0.0038022813688212928,"demand":0.0038022813688212928,"dev2":0.0038022813688212928,"additional":0.0038022813688212928,"features":0.0038022813688212928,"call":0.0038022813688212928,"functions":0.0038022813688212928,"make":0.0038022813688212928,"requests":0.0038022813688212928,"view":0.0038022813688212928,"wallets":0.0038022813688212928,"information":0.0038022813688212928,"here":0.0038022813688212928,"www":0.0038022813688212928,"blog":0.0038022813688212928,"5-ways-to-interact-with-devnet-in-the-hiro-platform":0.0038022813688212928},"51":{"5":0.0036101083032490976,"30":0.0036101083032490976,"36":0.0036101083032490976,"250":0.0036101083032490976,"3000000":0.0036101083032490976,"1726104636":0.0036101083032490976,"import":0.0036101083032490976,"tab":0.0036101083032490976,"tabs":0.0036101083032490976,"from":0.0036101083032490976,"'fumadocs-ui":0.0036101083032490976,"components":0.0036101083032490976,"tabs'":0.0036101083032490976,"this":0.0036101083032490976,"feature":0.0036101083032490976,"goes":0.0036101083032490976,"beyond":0.0036101083032490976,"just":0.0036101083032490976,"security":0.0036101083032490976,"it's":0.0036101083032490976,"also":0.0036101083032490976,"a":0.0036101083032490976,"way":0.0036101083032490976,"to":0.0036101083032490976,"better":0.0036101083032490976,"understand":0.0036101083032490976,"how":0.0036101083032490976,"your":0.0036101083032490976,"contracts":0.0036101083032490976,"are":0.0036101083032490976,"being":0.0036101083032490976,"used":0.0036101083032490976,"you":0.0036101083032490976,"can":0.0036101083032490976,"set":0.0036101083032490976,"up":0.0036101083032490976,"alerts":0.0036101083032490976,"for":0.0036101083032490976,"various":0.0036101083032490976,"public":0.0036101083032490976,"functions":0.0036101083032490976,"in":0.0036101083032490976,"smart":0.0036101083032490976,"contract":0.0036101083032490976,"gain":0.0036101083032490976,"insight":0.0036101083032490976,"on":0.0036101083032490976,"which":0.0036101083032490976,"receiving":0.0036101083032490976,"the":0.0036101083032490976,"most":0.0036101083032490976,"calls":0.0036101083032490976,"and":0.0036101083032490976,"users":0.0036101083032490976,"interacting":0.0036101083032490976,"with":0.0036101083032490976,"monitoring":0.0036101083032490976,"callout":0.0036101083032490976,"title":0.0036101083032490976,"note":0.0036101083032490976,"make":0.0036101083032490976,"sure":0.0036101083032490976,"have":0.0036101083032490976,"successfully":0.0036101083032490976,"deployed":0.0036101083032490976,"stacks":0.0036101083032490976,"mainnet":0.0036101083032490976,"if":0.0036101083032490976,"plan":0.0036101083032490976,"setting":0.0036101083032490976,"alert":0.0036101083032490976,"own":0.0036101083032490976,"or":0.0036101083032490976,"want":0.0036101083032490976,"other":0.0036101083032490976,"toggle":0.0036101083032490976,"monitor":0.0036101083032490976,"after":0.0036101083032490976,"logging":0.0036101083032490976,"into":0.0036101083032490976,"hiro":0.0036101083032490976,"platform":0.0036101083032490976,"https":0.0036101083032490976,"so":0.0036101083032490976,"start":0.0036101083032490976,"images":0.0036101083032490976,"contract-monitoring":0.0036101083032490976,"start-monitoring":0.0036101083032490976,"png":0.0036101083032490976,"add":0.0036101083032490976,"clicking":0.0036101083032490976,"'add":0.0036101083032490976,"contract'":0.0036101083032490976,"button":0.0036101083032490976,"slideout":0.0036101083032490976,"modal":0.0036101083032490976,"will":0.0036101083032490976,"appear":0.0036101083032490976,"fields":0.0036101083032490976,"look":0.0036101083032490976,"any":0.0036101083032490976,"using":0.0036101083032490976,"contract's":0.0036101083032490976,"principal":0.0036101083032490976,"name":0.0036101083032490976,"all":0.0036101083032490976,"of":0.0036101083032490976,"them":0.0036101083032490976,"regardless":0.0036101083032490976,"whether":0.0036101083032490976,"deployer":0.0036101083032490976,"alternatively":0.0036101083032490976,"connect":0.0036101083032490976,"wallet":0.0036101083032490976,"view":0.0036101083032490976,"deployment":0.0036101083032490976,"history":0.0036101083032490976,"choose":0.0036101083032490976,"ve":0.0036101083032490976,"previously":0.0036101083032490976,"order":0.0036101083032490976,"add-contract":0.0036101083032490976,"then":0.0036101083032490976,"under":0.0036101083032490976,"once":0.0036101083032490976,"particular":0.0036101083032490976,"its":0.0036101083032490976,"transaction":0.0036101083032490976,"pending":0.0036101083032490976,"transactions":0.0036101083032490976,"mempool":0.0036101083032490976,"click":0.0036101083032490976,"create":0.0036101083032490976,"an":0.0036101083032490976,"specific":0.0036101083032490976,"added":0.0036101083032490976,"added-contract":0.0036101083032490976,"custom":0.0036101083032490976,"configure":0.0036101083032490976,"that":0.0036101083032490976,"s":0.0036101083032490976,"set-contract-owner":0.0036101083032490976,"function":0.0036101083032490976,"transfer":0.0036101083032490976,"mint":0.0036101083032490976,"burn":0.0036101083032490976,"anything":0.0036101083032490976,"else":0.0036101083032490976,"implemented":0.0036101083032490976,"identify":0.0036101083032490976,"further":0.0036101083032490976,"hone":0.0036101083032490976,"by":0.0036101083032490976,"creating":0.0036101083032490976,"filters":0.0036101083032490976,"argument":0.0036101083032490976,"values":0.0036101083032490976,"address":0.0036101083032490976,"called":0.0036101083032490976,"conditions":0.0036101083032490976,"include":0.0036101083032490976,"-":0.0036101083032490976,"when":0.0036101083032490976,"is":0.0036101083032490976,"specified":0.0036101083032490976,"these":0.0036101083032490976,"receive":0.0036101083032490976,"email":0.0036101083032490976,"every":0.0036101083032490976,"time":0.0036101083032490976,"one":0.0036101083032490976,"those":0.0036101083032490976,"triggered":0.0036101083032490976,"webhook":0.0036101083032490976,"be":0.0036101083032490976,"kinds":0.0036101083032490976,"customized":0.0036101083032490976,"alerting":0.0036101083032490976,"flows":0.0036101083032490976,"form":0.0036101083032490976,"create-alert-form":0.0036101083032490976,"each":0.0036101083032490976,"response":0.0036101083032490976,"status":0.0036101083032490976,"made":0.0036101083032490976,"ability":0.0036101083032490976,"edit":0.0036101083032490976,"existing":0.0036101083032490976,"change":0.0036101083032490976,"notification":0.0036101083032490976,"preferences":0.0036101083032490976,"at":0.0036101083032490976,"page":0.0036101083032490976,"view-alerts-page":0.0036101083032490976,"what":0.0036101083032490976,"expect":0.0036101083032490976,"you've":0.0036101083032490976,"as":0.0036101083032490976,"type":0.0036101083032490976,"emails":0.0036101083032490976,"come":0.0036101083032490976,"send":0.0036101083032490976,"api":0.0036101083032490976,"endpoint":0.0036101083032490976,"payload":0.0036101083032490976,"like":0.0036101083032490976,"sample-alert-payload":0.0036101083032490976,"json":0.0036101083032490976,"below":0.0036101083032490976,"info":0.0036101083032490976,"tx_status":0.0036101083032490976,"always":0.0036101083032490976,"return":0.0036101083032490976,"notifications":0.0036101083032490976,"because":0.0036101083032490976,"only":0.0036101083032490976,"hits":0.0036101083032490976,"but":0.0036101083032490976,"not":0.0036101083032490976,"it":0.0036101083032490976,"gets":0.0036101083032490976,"confirmed":0.0036101083032490976,"blockchain":0.0036101083032490976,"items":0.0036101083032490976,"'sample":0.0036101083032490976,"payload'":0.0036101083032490976,"'alert":0.0036101083032490976,"interface'":0.0036101083032490976,"value":0.0036101083032490976,"sample":0.0036101083032490976,"tx_id":0.0036101083032490976,"0xa7f511b3f379efef6fe71d0de57712ed13a89c5b6e24dd049eb2cc9a7c24fcb5":0.0036101083032490976,"nonce":0.0036101083032490976,"fee_rate":0.0036101083032490976,"sender_address":0.0036101083032490976,"sp2w9qyahjns7ytqy9ek2mstqgx9e2ndmv766jp9z":0.0036101083032490976,"sponsored":0.0036101083032490976,"false":0.0036101083032490976,"post_condition_mode":0.0036101083032490976,"deny":0.0036101083032490976,"post_conditions":0.0036101083032490976,"stx":0.0036101083032490976,"condition_code":0.0036101083032490976,"sent_equal_to":0.0036101083032490976,"amount":0.0036101083032490976,"type_id":0.0036101083032490976,"principal_standard":0.0036101083032490976,"anchor_mode":0.0036101083032490976,"receipt_time":0.0036101083032490976,"receipt_time_iso":0.0036101083032490976,"2024-09-12t01":0.0036101083032490976,"000z":0.0036101083032490976,"tx_type":0.0036101083032490976,"contract_call":0.0036101083032490976,"contract_id":0.0036101083032490976,"sphw0ejk5kpdmk03zx792emp0q5j3a39zmtvzzcy":0.0036101083032490976,"sample-contract":0.0036101083032490976,"function_name":0.0036101083032490976,"donate":0.0036101083032490976,"function_signature":0.0036101083032490976,"define-public":0.0036101083032490976,"uint":0.0036101083032490976,"function_args":0.0036101083032490976,"hex":0.0036101083032490976,"0x01000000000000000000000000002dc6c0":0.0036101083032490976,"repr":0.0036101083032490976,"u3000000":0.0036101083032490976,"interface":0.0036101083032490976,"ts":0.0036101083032490976,"sample-alert-interface":0.0036101083032490976,"body":0.0036101083032490976,"string":0.0036101083032490976,"number":0.0036101083032490976,"boolean":0.0036101083032490976,"postcondition":0.0036101083032490976,"contractcall":0.0036101083032490976,"functionarg":0.0036101083032490976},"52":{"1":0.0030211480362537764,"with":0.0030211480362537764,"chainhook":0.0030211480362537764,"you":0.0030211480362537764,"can":0.0030211480362537764,"automatically":0.0030211480362537764,"trigger":0.0030211480362537764,"an":0.0030211480362537764,"action":0.0030211480362537764,"in":0.0030211480362537764,"response":0.0030211480362537764,"to":0.0030211480362537764,"on-chain":0.0030211480362537764,"events":0.0030211480362537764,"on":0.0030211480362537764,"stacks":0.0030211480362537764,"and":0.0030211480362537764,"bitcoin":0.0030211480362537764,"enabling":0.0030211480362537764,"use":0.0030211480362537764,"ifttt":0.0030211480362537764,"if_this":0.0030211480362537764,"then_that":0.0030211480362537764,"logic":0.0030211480362537764,"power":0.0030211480362537764,"your":0.0030211480362537764,"applications":0.0030211480362537764,"learn":0.0030211480362537764,"more":0.0030211480362537764,"about":0.0030211480362537764,"refer":0.0030211480362537764,"the":0.0030211480362537764,"overview":0.0030211480362537764,"callout":0.0030211480362537764,"title":0.0030211480362537764,"programmatic":0.0030211480362537764,"api":0.0030211480362537764,"also":0.0030211480362537764,"create":0.0030211480362537764,"manage":0.0030211480362537764,"chainhooks":0.0030211480362537764,"via":0.0030211480362537764,"platform":0.0030211480362537764,"platform-api":0.0030211480362537764,"get":0.0030211480362537764,"started":0.0030211480362537764,"hiro":0.0030211480362537764,"login":0.0030211480362537764,"toggle":0.0030211480362537764,"page":0.0030211480362537764,"there":0.0030211480362537764,"are":0.0030211480362537764,"two":0.0030211480362537764,"ways":0.0030211480362537764,"a":0.0030211480362537764,"either":0.0030211480362537764,"from":0.0030211480362537764,"scratch":0.0030211480362537764,"using":0.0030211480362537764,"ui":0.0030211480362537764,"or":0.0030211480362537764,"upload":0.0030211480362537764,"that":0.0030211480362537764,"have":0.0030211480362537764,"already":0.0030211480362537764,"defined":0.0030211480362537764,"json":0.0030211480362537764,"window":0.0030211480362537764,"images":0.0030211480362537764,"select-chainhook-tab":0.0030211480362537764,"png":0.0030211480362537764,"select":0.0030211480362537764,"new":0.0030211480362537764,"button":0.0030211480362537764,"create-chainhook-window":0.0030211480362537764,"this":0.0030211480362537764,"will":0.0030211480362537764,"open":0.0030211480362537764,"panel":0.0030211480362537764,"right":0.0030211480362537764,"following":0.0030211480362537764,"fields":0.0030211480362537764,"name":0.0030211480362537764,"input":0.0030211480362537764,"of":0.0030211480362537764,"chain":0.0030211480362537764,"which":0.0030211480362537764,"want":0.0030211480362537764,"build":0.0030211480362537764,"for":0.0030211480362537764,"network":0.0030211480362537764,"choose":0.0030211480362537764,"observe":0.0030211480362537764,"if-this":0.0030211480362537764,"based":0.0030211480362537764,"selected":0.0030211480362537764,"see":0.0030211480362537764,"list":0.0030211480362537764,"available":0.0030211480362537764,"scopes":0.0030211480362537764,"condition":0.0030211480362537764,"called":0.0030211480362537764,"predicate":0.0030211480362537764,"-for":0.0030211480362537764,"options":0.0030211480362537764,"txid":0.0030211480362537764,"outputs":0.0030211480362537764,"stacks_protocols":0.0030211480362537764,"block_height":0.0030211480362537764,"fungible_token_event":0.0030211480362537764,"non-fungible_token_event":0.0030211480362537764,"stx_event":0.0030211480362537764,"print_event":0.0030211480362537764,"contract_deployment":0.0030211480362537764,"_refer":0.0030211480362537764,"predicates":0.0030211480362537764,"concepts":0.0030211480362537764,"bitcoin-predicates":0.0030211480362537764,"stacks-predicates":0.0030211480362537764,"documents":0.0030211480362537764,"understand":0.0030211480362537764,"how":0.0030211480362537764,"them":0.0030211480362537764,"_":0.0030211480362537764,"then-that":0.0030211480362537764,"is":0.0030211480362537764,"defaulted":0.0030211480362537764,"http_post":0.0030211480362537764,"allow":0.0030211480362537764,"post":0.0030211480362537764,"url":0.0030211480362537764,"specified":0.0030211480362537764,"next":0.0030211480362537764,"field":0.0030211480362537764,"below":0.0030211480362537764,"specify":0.0030211480362537764,"method":0.0030211480362537764,"authorization":0.0030211480362537764,"header":0.0030211480362537764,"optional":0.0030211480362537764,"add":0.0030211480362537764,"secret":0.0030211480362537764,"when":0.0030211480362537764,"posting":0.0030211480362537764,"payloads":0.0030211480362537764,"start":0.0030211480362537764,"block":0.0030211480362537764,"must":0.0030211480362537764,"search":0.0030211480362537764,"end":0.0030211480362537764,"it":0.0030211480362537764,"however":0.0030211480362537764,"optimize":0.0030211480362537764,"scan":0.0030211480362537764,"time":0.0030211480362537764,"we":0.0030211480362537764,"recommended":0.0030211480362537764,"expire":0.0030211480362537764,"after":0.0030211480362537764,"occurrence":0.0030211480362537764,"specific":0.0030211480362537764,"number":0.0030211480362537764,"occurrences":0.0030211480362537764,"greater":0.0030211480362537764,"than":0.0030211480362537764,"equal":0.0030211480362537764,"leave":0.0030211480362537764,"blank":0.0030211480362537764,"if":0.0030211480362537764,"don't":0.0030211480362537764,"set":0.0030211480362537764,"any":0.0030211480362537764,"limit":0.0030211480362537764,"decode":0.0030211480362537764,"clarity":0.0030211480362537764,"values":0.0030211480362537764,"enabled":0.0030211480362537764,"by":0.0030211480362537764,"default":0.0030211480362537764,"help":0.0030211480362537764,"contract":0.0030211480362537764,"you'll":0.0030211480362537764,"include":0.0030211480362537764,"proof":0.0030211480362537764,"enable":0.0030211480362537764,"option":0.0030211480362537764,"evidence":0.0030211480362537764,"transaction":0.0030211480362537764,"has":0.0030211480362537764,"been":0.0030211480362537764,"verified":0.0030211480362537764,"authorized":0.0030211480362537764,"sender":0.0030211480362537764,"their":0.0030211480362537764,"private":0.0030211480362537764,"key":0.0030211480362537764,"generally":0.0030211480362537764,"cryptographic":0.0030211480362537764,"signature":0.0030211480362537764,"blockchain":0.0030211480362537764,"inputs":0.0030211480362537764,"payload":0.0030211480362537764,"references":0.0030211480362537764,"previous":0.0030211480362537764,"transactions'":0.0030211480362537764,"known":0.0030211480362537764,"as":0.0030211480362537764,"unspent":0.0030211480362537764,"utxos":0.0030211480362537764,"being":0.0030211480362537764,"spent":0.0030211480362537764,"current":0.0030211480362537764,"these":0.0030211480362537764,"provide":0.0030211480362537764,"spend":0.0030211480362537764,"funds":0.0030211480362537764,"including":0.0030211480362537764,"refers":0.0030211480362537764,"specifying":0.0030211480362537764,"destinations":0.0030211480362537764,"amounts":0.0030211480362537764,"sent":0.0030211480362537764,"part":0.0030211480362537764,"represent":0.0030211480362537764,"recipients'":0.0030211480362537764,"addresses":0.0030211480362537764,"corresponding":0.0030211480362537764,"they":0.0030211480362537764,"receiving":0.0030211480362537764,"witness":0.0030211480362537764,"data":0.0030211480362537764,"includes":0.0030211480362537764,"signatures":0.0030211480362537764,"other":0.0030211480362537764,"related":0.0030211480362537764,"information":0.0030211480362537764,"placed":0.0030211480362537764,"alongside":0.0030211480362537764,"once":0.0030211480362537764,"define":0.0030211480362537764,"all":0.0030211480362537764,"required":0.0030211480362537764,"now":0.0030211480362537764,"created":0.0030211480362537764,"status":0.0030211480362537764,"last":0.0030211480362537764,"updated":0.0030211480362537764,"headers":0.0030211480362537764,"used":0.0030211480362537764,"chosen":0.0030211480362537764,"respective":0.0030211480362537764,"columns":0.0030211480362537764,"be":0.0030211480362537764,"deployed":0.0030211480362537764,"note":0.0030211480362537764,"may":0.0030211480362537764,"above":0.0030211480362537764,"file":0.0030211480362537764,"s":0.0030211480362537764,"drag":0.0030211480362537764,"drop":0.0030211480362537764,"into":0.0030211480362537764,"area":0.0030211480362537764,"containing":0.0030211480362537764,"single":0.0030211480362537764,"object":0.0030211480362537764,"representing":0.0030211480362537764,"array":0.0030211480362537764,"objects":0.0030211480362537764,"one":0.0030211480362537764,"prepare":0.0030211480362537764,"edit":0.0030211480362537764,"clicking":0.0030211480362537764,"ellipse":0.0030211480362537764,"edit-chainhook":0.0030211480362537764,"update":0.0030211480362537764,"reflect":0.0030211480362537764,"desired":0.0030211480362537764,"changes":0.0030211480362537764,"then":0.0030211480362537764,"duplicate":0.0030211480362537764,"opens":0.0030211480362537764,"pane":0.0030211480362537764,"populated":0.0030211480362537764,"publish":0.0030211480362537764,"direct":0.0030211480362537764,"copy":0.0030211480362537764,"delete":0.0030211480362537764,"wish":0.0030211480362537764,"confirmation":0.0030211480362537764,"confirm":0.0030211480362537764,"column":0.0030211480362537764,"displays":0.0030211480362537764,"whether":0.0030211480362537764,"active":0.0030211480362537764,"inactive":0.0030211480362537764,"error":0.0030211480362537764,"state":0.0030211480362537764,"means":0.0030211480362537764,"actively":0.0030211480362537764,"scanning":0.0030211480362537764,"blocks":0.0030211480362537764,"against":0.0030211480362537764,"its":0.0030211480362537764,"reached":0.0030211480362537764,"terminal":0.0030211480362537764,"e":0.0030211480362537764,"g":0.0030211480362537764,"no":0.0030211480362537764,"longer":0.0030211480362537764,"ran":0.0030211480362537764,"during":0.0030211480362537764,"execution":0.0030211480362537764,"info":0.0030211480362537764,"found":0.0030211480362537764,"hovering":0.0030211480362537764,"over":0.0030211480362537764,"element":0.0030211480362537764,"example":0.0030211480362537764,"why":0.0030211480362537764,"hover":0.0030211480362537764,"find":0.0030211480362537764,"out":0.0030211480362537764,"status-info":0.0030211480362537764,"-":0.0030211480362537764,"run":0.0030211480362537764,"service":0.0030211480362537764,"bitcoind":0.0030211480362537764,"guides":0.0030211480362537764,"chainhook-as-a-service":0.0030211480362537764,"chainhook-as-a-service-with-stacks-node":0.0030211480362537764},"53":{"import":0.0058823529411764705,"code":0.0058823529411764705,"terminal":0.0058823529411764705,"from":0.0058823529411764705,"lucide-react":0.0058823529411764705,"smallcard":0.0058823529411764705,"components":0.0058823529411764705,"card":0.0058823529411764705,"in":0.0058823529411764705,"this":0.0058823529411764705,"quickstart":0.0058823529411764705,"guide":0.0058823529411764705,"you":0.0058823529411764705,"will":0.0058823529411764705,"create":0.0058823529411764705,"a":0.0058823529411764705,"simple":0.0058823529411764705,"fundraising":0.0058823529411764705,"app":0.0058823529411764705,"using":0.0058823529411764705,"one":0.0058823529411764705,"of":0.0058823529411764705,"the":0.0058823529411764705,"templates":0.0058823529411764705,"available":0.0058823529411764705,"features":0.0058823529411764705,"single":0.0058823529411764705,"page":0.0058823529411764705,"that":0.0058823529411764705,"displays":0.0058823529411764705,"campaign":0.0058823529411764705,"and":0.0058823529411764705,"functionality":0.0058823529411764705,"handles":0.0058823529411764705,"contributions":0.0058823529411764705,"refunds":0.0058823529411764705,"withdrawal":0.0058823529411764705,"by":0.0058823529411764705,"fundraiser":0.0058823529411764705,"your":0.0058823529411764705,"account":0.0058823529411764705,"start":0.0058823529411764705,"creating":0.0058823529411764705,"an":0.0058823529411764705,"hiro":0.0058823529411764705,"platform":0.0058823529411764705,"can":0.0058823529411764705,"with":0.0058823529411764705,"-":0.0058823529411764705,"email":0.0058823529411764705,"google":0.0058823529411764705,"github":0.0058823529411764705,"discord":0.0058823529411764705,"login":0.0058823529411764705,"images":0.0058823529411764705,"q1":0.0058823529411764705,"png":0.0058823529411764705,"once":0.0058823529411764705,"signed":0.0058823529411764705,"see":0.0058823529411764705,"onboarding":0.0058823529411764705,"screen":0.0058823529411764705,"showing":0.0058823529411764705,"all":0.0058823529411764705,"has":0.0058823529411764705,"to":0.0058823529411764705,"offer":0.0058823529411764705,"welcome":0.0058823529411764705,"q2":0.0058823529411764705,"project":0.0058823529411764705,"if":0.0058823529411764705,"do":0.0058823529411764705,"not":0.0058823529411764705,"have":0.0058823529411764705,"any":0.0058823529411764705,"existing":0.0058823529411764705,"projects":0.0058823529411764705,"be":0.0058823529411764705,"prompted":0.0058823529411764705,"on":0.0058823529411764705,"click":0.0058823529411764705,"add":0.0058823529411764705,"button":0.0058823529411764705,"get":0.0058823529411764705,"started":0.0058823529411764705,"callout":0.0058823529411764705,"type":0.0058823529411764705,"info":0.0058823529411764705,"already":0.0058823529411764705,"find":0.0058823529411764705,"at":0.0058823529411764705,"top":0.0058823529411764705,"right":0.0058823529411764705,"here":0.0058823529411764705,"option":0.0058823529411764705,"choose":0.0058823529411764705,"set":0.0058823529411764705,"or":0.0058823529411764705,"for":0.0058823529411764705,"select":0.0058823529411764705,"template":0.0058823529411764705,"which":0.0058823529411764705,"is":0.0058823529411764705,"starter":0.0058823529411764705,"comes":0.0058823529411764705,"equipped":0.0058823529411764705,"both":0.0058823529411764705,"frontend":0.0058823529411764705,"smart":0.0058823529411764705,"contracts":0.0058823529411764705,"q5":0.0058823529411764705,"list":0.0058823529411764705,"repositories":0.0058823529411764705,"first":0.0058823529411764705,"need":0.0058823529411764705,"authorize":0.0058823529411764705,"clone":0.0058823529411764705,"selected":0.0058823529411764705,"presented":0.0058823529411764705,"full":0.0058823529411764705,"details":0.0058823529411764705,"clicking":0.0058823529411764705,"q3":0.0058823529411764705,"before":0.0058823529411764705,"being":0.0058823529411764705,"able":0.0058823529411764705,"ready":0.0058823529411764705,"instructions":0.0058823529411764705,"how":0.0058823529411764705,"local":0.0058823529411764705,"machine":0.0058823529411764705,"develop":0.0058823529411764705,"browser":0.0058823529411764705,"via":0.0058823529411764705,"codespaces":0.0058823529411764705,"q4":0.0058823529411764705,"are":0.0058823529411764705,"now":0.0058823529411764705,"building":0.0058823529411764705,"next":0.0058823529411764705,"steps":0.0058823529411764705,"cards":0.0058823529411764705,"href":0.0058823529411764705,"stacks":0.0058823529411764705,"guides":0.0058823529411764705,"deploy-contracts":0.0058823529411764705,"title":0.0058823529411764705,"deploy":0.0058823529411764705,"description":0.0058823529411764705,"learn":0.0058823529411764705,"testnet":0.0058823529411764705,"mainnet":0.0058823529411764705,"deployment":0.0058823529411764705,"plans":0.0058823529411764705,"devnet":0.0058823529411764705,"running":0.0058823529411764705,"use":0.0058823529411764705,"private":0.0058823529411764705,"blockchain":0.0058823529411764705,"environment":0.0058823529411764705,"test":0.0058823529411764705,"interact":0.0058823529411764705,"create-chainhooks":0.0058823529411764705,"manage":0.0058823529411764705,"chainhooks":0.0058823529411764705,"custom":0.0058823529411764705,"event":0.0058823529411764705,"streams":0.0058823529411764705,"bitcoin":0.0058823529411764705,"chainhook":0.0058823529411764705},"54":{"import":0.008928571428571428,"secondarycard":0.008928571428571428,"from":0.008928571428571428,"'":0.008928571428571428,"components":0.008928571428571428,"card'":0.008928571428571428,"the":0.008928571428571428,"token":0.008928571428571428,"metadata":0.008928571428571428,"api":0.008928571428571428,"is":0.008928571428571428,"a":0.008928571428571428,"service":0.008928571428571428,"that":0.008928571428571428,"offers":0.008928571428571428,"rest":0.008928571428571428,"so":0.008928571428571428,"you":0.008928571428571428,"can":0.008928571428571428,"easily":0.008928571428571428,"pull":0.008928571428571428,"any":0.008928571428571428,"data":0.008928571428571428,"need":0.008928571428571428,"for":0.008928571428571428,"on":0.008928571428571428,"stacks":0.008928571428571428,"follows":0.008928571428571428,"sip":0.008928571428571428,"standards":0.008928571428571428,"every":0.008928571428571428,"one":0.008928571428571428,"request":0.008928571428571428,"away":0.008928571428571428,"popular":0.008928571428571428,"endpoints":0.008928571428571428,"cards":0.008928571428571428,"href":0.008928571428571428,"token-metadata-api":0.008928571428571428,"tokens":0.008928571428571428,"fungible-token-metadata":0.008928571428571428,"title":0.008928571428571428,"get":0.008928571428571428,"fungible":0.008928571428571428,"description":0.008928571428571428,"retrieve":0.008928571428571428,"related":0.008928571428571428,"to":0.008928571428571428,"non-fungible-token-metadata":0.008928571428571428,"non-fungible":0.008928571428571428,"semi-fungible-token-metadata":0.008928571428571428,"semi-fungible":0.008928571428571428,"tools":0.008928571428571428,"-":0.008928571428571428,"hiro":0.008928571428571428,"archive":0.008928571428571428,"bootstrap":0.008928571428571428,"your":0.008928571428571428,"own":0.008928571428571428,"instance":0.008928571428571428,"of":0.008928571428571428,"with":0.008928571428571428,"and":0.008928571428571428,"save":0.008928571428571428,"days":0.008928571428571428,"setup":0.008928571428571428,"time":0.008928571428571428,"blockchain":0.008928571428571428,"fetch":0.008928571428571428,"on-chain":0.008928571428571428,"explorer":0.008928571428571428,"https":0.008928571428571428,"looking":0.008928571428571428,"simpler":0.008928571428571428,"way":0.008928571428571428,"verify":0.008928571428571428,"try":0.008928571428571428,"ordinals":0.008928571428571428,"bitcoin":0.008928571428571428,"brc-20":0.008928571428571428,"br":0.008928571428571428,"callout":0.008928571428571428,"help":0.008928571428571428,"building":0.008928571428571428,"type":0.008928571428571428,"reach":0.008928571428571428,"out":0.008928571428571428,"us":0.008928571428571428,"span":0.008928571428571428,"classname":0.008928571428571428,"font-bold":0.008928571428571428,"channel":0.008928571428571428,"discord":0.008928571428571428,"chat":0.008928571428571428,"under":0.008928571428571428,"developer":0.008928571428571428,"section":0.008928571428571428,"there's":0.008928571428571428,"also":0.008928571428571428,"weekly":0.008928571428571428,"office":0.008928571428571428,"hours":0.008928571428571428,"www":0.008928571428571428,"addevent":0.008928571428571428,"com":0.008928571428571428,"event":0.008928571428571428,"ki22007085":0.008928571428571428,"call":0.008928571428571428,"wednesday":0.008928571428571428,"at":0.008928571428571428,"1pm":0.008928571428571428,"et":0.008928571428571428},"55":{"1":0.010416666666666666,"2":0.010416666666666666,"3":0.010416666666666666,"service":0.010416666666666666,"architecture":0.010416666666666666,"this":0.010416666666666666,"section":0.010416666666666666,"gives":0.010416666666666666,"you":0.010416666666666666,"an":0.010416666666666666,"overview":0.010416666666666666,"of":0.010416666666666666,"external":0.010416666666666666,"and":0.010416666666666666,"internal":0.010416666666666666,"architectural":0.010416666666666666,"diagrams":0.010416666666666666,"the":0.010416666666666666,"diagram":0.010416666666666666,"shows":0.010416666666666666,"how":0.010416666666666666,"token":0.010416666666666666,"metadata":0.010416666666666666,"api":0.010416666666666666,"is":0.010416666666666666,"connected":0.010416666666666666,"to":0.010416666666666666,"three":0.010416666666666666,"systems":0.010416666666666666,"a":0.010416666666666666,"stacks":0.010416666666666666,"node":0.010416666666666666,"blockchain":0.010416666666666666,"database":0.010416666666666666,"postgres":0.010416666666666666,"public":0.010416666666666666,"images":0.010416666666666666,"token-metadata-api":0.010416666666666666,"svg":0.010416666666666666,"interacts":0.010416666666666666,"with":0.010416666666666666,"referred":0.010416666666666666,"as":0.010416666666666666,"local":0.010416666666666666,"db":0.010416666666666666,"in":0.010416666666666666,"above":0.010416666666666666,"import":0.010416666666666666,"all":0.010416666666666666,"historical":0.010416666666666666,"smart":0.010416666666666666,"contracts":0.010416666666666666,"when":0.010416666666666666,"booting":0.010416666666666666,"up":0.010416666666666666,"listen":0.010416666666666666,"for":0.010416666666666666,"new":0.010416666666666666,"that":0.010416666666666666,"may":0.010416666666666666,"be":0.010416666666666666,"deployed":0.010416666666666666,"afterwards":0.010416666666666666,"read-only":0.010416666666666666,"access":0.010416666666666666,"recommended":0.010416666666666666,"will":0.010416666666666666,"never":0.010416666666666666,"need":0.010416666666666666,"write":0.010416666666666666,"anything":0.010416666666666666,"responds":0.010416666666666666,"contract":0.010416666666666666,"calls":0.010416666666666666,"required":0.010416666666666666,"fetching":0.010416666666666666,"get":0.010416666666666666,"count":0.010416666666666666,"uris":0.010416666666666666,"etc":0.010416666666666666,"stores":0.010416666666666666,"processed":0.010416666666666666,"info":0.010416666666666666,"needs":0.010416666666666666,"fetch":0.010416666666666666,"files":0.010416666666666666,"jsons":0.010416666666666666,"from":0.010416666666666666,"internet":0.010416666666666666,"so":0.010416666666666666,"it":0.010416666666666666,"must":0.010416666666666666,"have":0.010416666666666666,"networks":0.010416666666666666,"following":0.010416666666666666,"flowchart":0.010416666666666666},"56":{},"57":{"apipage":0.07142857142857142,"document":0.07142857142857142,"openapi":0.07142857142857142,"token-metadata-api":0.07142857142857142,"json":0.07142857142857142,"operations":0.07142857142857142,"path":0.07142857142857142,"'":0.07142857142857142,"metadata":0.07142857142857142,"v1":0.07142857142857142,"method":0.07142857142857142,"'get'":0.07142857142857142,"hashead":0.07142857142857142,"false":0.07142857142857142},"58":{"0":0.00847457627118644,"7":0.00847457627118644,"21":0.00847457627118644,"121":0.00847457627118644,"1309":0.00847457627118644,"4791":0.00847457627118644,"108606":0.00847457627118644,"443257":0.00847457627118644,"545094":0.00847457627118644,"making":0.00847457627118644,"requests":0.00847457627118644,"to":0.00847457627118644,"make":0.00847457627118644,"a":0.00847457627118644,"request":0.00847457627118644,"the":0.00847457627118644,"stacks":0.00847457627118644,"api":0.00847457627118644,"you":0.00847457627118644,"can":0.00847457627118644,"paste":0.00847457627118644,"curl":0.00847457627118644,"command":0.00847457627118644,"below":0.00847457627118644,"in":0.00847457627118644,"your":0.00847457627118644,"terminal":0.00847457627118644,"-l":0.00847457627118644,"'https":0.00847457627118644,"hiro":0.00847457627118644,"so":0.00847457627118644,"metadata":0.00847457627118644,"v1":0.00847457627118644,"'":0.00847457627118644,"-h":0.00847457627118644,"'accept":0.00847457627118644,"application":0.00847457627118644,"json'":0.00847457627118644,"if":0.00847457627118644,"are":0.00847457627118644,"using":0.00847457627118644,"an":0.00847457627118644,"api-key":0.00847457627118644,"will":0.00847457627118644,"need":0.00847457627118644,"replace":0.00847457627118644,"hiro_api_key":0.00847457627118644,"with":0.00847457627118644,"secret":0.00847457627118644,"key":0.00847457627118644,"'x-api-key":0.00847457627118644,"hiro_api_key'":0.00847457627118644,"should":0.00847457627118644,"get":0.00847457627118644,"response":0.00847457627118644,"back":0.00847457627118644,"that":0.00847457627118644,"resembles":0.00847457627118644,"following":0.00847457627118644,"json":0.00847457627118644,"server_version":0.00847457627118644,"token-metadata-api":0.00847457627118644,"v0":0.00847457627118644,"master":0.00847457627118644,"1aa1603":0.00847457627118644,"status":0.00847457627118644,"ready":0.00847457627118644,"tokens":0.00847457627118644,"ft":0.00847457627118644,"nft":0.00847457627118644,"sft":0.00847457627118644,"token_contracts":0.00847457627118644,"sip-009":0.00847457627118644,"sip-010":0.00847457627118644,"sip-013":0.00847457627118644,"job_queue":0.00847457627118644,"done":0.00847457627118644,"failed":0.00847457627118644,"client":0.00847457627118644,"we":0.00847457627118644,"also":0.00847457627118644,"maintain":0.00847457627118644,"standalone":0.00847457627118644,"use":0.00847457627118644,"this":0.00847457627118644,"is":0.00847457627118644,"available":0.00847457627118644,"as":0.00847457627118644,"package":0.00847457627118644,"and":0.00847457627118644,"be":0.00847457627118644,"installed":0.00847457627118644,"package-install":0.00847457627118644,"title":0.00847457627118644,"hirosystems":0.00847457627118644,"token-metadata-api-client":0.00847457627118644,"example":0.00847457627118644,"usage":0.00847457627118644,"ts":0.00847457627118644,"import":0.00847457627118644,"configuration":0.00847457627118644,"tokensapi":0.00847457627118644,"from":0.00847457627118644,"const":0.00847457627118644,"config":0.00847457627118644,"new":0.00847457627118644,"result":0.00847457627118644,"await":0.00847457627118644,"getftmetadata":0.00847457627118644,"'sp1h1733v5mz3sz9xrw9fkygezt0jdgeb8y634c7r":0.00847457627118644,"miamicoin-token-v2'":0.00847457627118644,"for":0.00847457627118644,"more":0.00847457627118644,"information":0.00847457627118644,"on":0.00847457627118644,"check":0.00847457627118644,"out":0.00847457627118644,"documentation":0.00847457627118644},"59":{},"60":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"token-metadata-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"metadata":0.0625,"v1":0.0625,"ft":0.0625,"principal":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"61":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"token-metadata-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"metadata":0.058823529411764705,"v1":0.058823529411764705,"sft":0.058823529411764705,"principal":0.058823529411764705,"token_id":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"62":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"token-metadata-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"metadata":0.06666666666666667,"v1":0.06666666666666667,"ft'":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"63":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"token-metadata-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"metadata":0.058823529411764705,"v1":0.058823529411764705,"nft":0.058823529411764705,"principal":0.058823529411764705,"token_id":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"64":{"import":0.015873015873015872,"accordion":0.015873015873015872,"accordions":0.015873015873015872,"from":0.015873015873015872,"fumadocs-ui":0.015873015873015872,"components":0.015873015873015872,"blocks":0.015873015873015872,"braces":0.015873015873015872,"circleuserround":0.015873015873015872,"'lucide-react'":0.015873015873015872,"tab":0.015873015873015872,"tabs":0.015873015873015872,"'fumadocs-ui":0.015873015873015872,"tabs'":0.015873015873015872,"the":0.015873015873015872,"stacks":0.015873015873015872,"blockchain-api-client":0.015873015873015872,"library":0.015873015873015872,"provides":0.015873015873015872,"a":0.015873015873015872,"robust":0.015873015873015872,"interface":0.015873015873015872,"for":0.015873015873015872,"interacting":0.015873015873015872,"with":0.015873015873015872,"blockchain":0.015873015873015872,"api":0.015873015873015872,"by":0.015873015873015872,"offering":0.015873015873015872,"type-safe":0.015873015873015872,"methods":0.015873015873015872,"to":0.015873015873015872,"access":0.015873015873015872,"rest":0.015873015873015872,"and":0.015873015873015872,"websocket":0.015873015873015872,"endpoints":0.015873015873015872,"client":0.015873015873015872,"includes":0.015873015873015872,"automatically":0.015873015873015872,"generated":0.015873015873015872,"http":0.015873015873015872,"comprehensive":0.015873015873015872,"schemas":0.015873015873015872,"clarity":0.015873015873015872,"smart":0.015873015873015872,"contract":0.015873015873015872,"values":0.015873015873015872,"real-time":0.015873015873015872,"data":0.015873015873015872,"streaming":0.015873015873015872,"ts":0.015873015873015872,"accountsapi":0.015873015873015872,"'":0.015873015873015872,"blockchain-api-client'":0.015873015873015872,"const":0.015873015873015872,"accounts":0.015873015873015872,"new":0.015873015873015872,"apiconfig":0.015873015873015872,"await":0.015873015873015872,"getaccounttransactions":0.015873015873015872,"principal":0.015873015873015872,"'st000000000000000000002amw42h'":0.015873015873015872},"65":{"the":0.009708737864077669,"usage":0.009708737864077669,"section":0.009708737864077669,"should":0.009708737864077669,"focus":0.009708737864077669,"on":0.009708737864077669,"practical":0.009708737864077669,"hands-on":0.009708737864077669,"instructions":0.009708737864077669,"for":0.009708737864077669,"getting":0.009708737864077669,"started":0.009708737864077669,"with":0.009708737864077669,"api":0.009708737864077669,"this":0.009708737864077669,"includes":0.009708737864077669,"authentication":0.009708737864077669,"how":0.009708737864077669,"to":0.009708737864077669,"authenticate":0.009708737864077669,"e":0.009708737864077669,"g":0.009708737864077669,"keys":0.009708737864077669,"oauth":0.009708737864077669,"tokens":0.009708737864077669,"making":0.009708737864077669,"requests":0.009708737864077669,"basic":0.009708737864077669,"examples":0.009708737864077669,"of":0.009708737864077669,"including":0.009708737864077669,"request":0.009708737864077669,"format":0.009708737864077669,"essential":0.009708737864077669,"headers":0.009708737864077669,"and":0.009708737864077669,"parameters":0.009708737864077669,"handling":0.009708737864077669,"responses":0.009708737864077669,"information":0.009708737864077669,"response":0.009708737864077669,"structure":0.009708737864077669,"understanding":0.009708737864077669,"status":0.009708737864077669,"codes":0.009708737864077669,"error":0.009708737864077669,"rate":0.009708737864077669,"limits":0.009708737864077669,"if":0.009708737864077669,"applicable":0.009708737864077669,"explain":0.009708737864077669,"any":0.009708737864077669,"best":0.009708737864077669,"practices":0.009708737864077669,"avoiding":0.009708737864077669,"them":0.009708737864077669,"goal":0.009708737864077669,"is":0.009708737864077669,"equip":0.009708737864077669,"developers":0.009708737864077669,"knowledge":0.009708737864077669,"make":0.009708737864077669,"successful":0.009708737864077669,"calls":0.009708737864077669,"handle":0.009708737864077669,"effectively":0.009708737864077669,"using":0.009708737864077669,"websockets":0.009708737864077669,"websocket":0.009708737864077669,"components":0.009708737864077669,"enable":0.009708737864077669,"you":0.009708737864077669,"subscribe":0.009708737864077669,"specific":0.009708737864077669,"updates":0.009708737864077669,"providing":0.009708737864077669,"a":0.009708737864077669,"near":0.009708737864077669,"real-time":0.009708737864077669,"display":0.009708737864077669,"transactions":0.009708737864077669,"accounts":0.009708737864077669,"ts":0.009708737864077669,"import":0.009708737864077669,"connectwebsocketclient":0.009708737864077669,"from":0.009708737864077669,"'":0.009708737864077669,"stacks":0.009708737864077669,"blockchain-api-client'":0.009708737864077669,"const":0.009708737864077669,"client":0.009708737864077669,"await":0.009708737864077669,"'ws":0.009708737864077669,"hiro":0.009708737864077669,"so":0.009708737864077669,"sub":0.009708737864077669,"subscribeaddresstransactions":0.009708737864077669,"contractcall":0.009708737864077669,"txid":0.009708737864077669,"event":0.009708737864077669,"console":0.009708737864077669,"log":0.009708737864077669,"unsubscribe":0.009708737864077669},"66":{},"67":{"import":0.0037313432835820895,"root":0.0037313432835820895,"api":0.0037313432835820895,"apiexample":0.0037313432835820895,"from":0.0037313432835820895,"'fumadocs-openapi":0.0037313432835820895,"ui'":0.0037313432835820895,"property":0.0037313432835820895,"accordion":0.0037313432835820895,"accordions":0.0037313432835820895,"'fumadocs-ui":0.0037313432835820895,"components":0.0037313432835820895,"accordion'":0.0037313432835820895,"tabs":0.0037313432835820895,"tabscontent":0.0037313432835820895,"tabslist":0.0037313432835820895,"tabstrigger":0.0037313432835820895,"'":0.0037313432835820895,"ui":0.0037313432835820895,"tabs'":0.0037313432835820895,"badge":0.0037313432835820895,"badge'":0.0037313432835820895,"classname":0.0037313432835820895,"'api":0.0037313432835820895,"my-3'":0.0037313432835820895,"div":0.0037313432835820895,"'flex-1'":0.0037313432835820895,"h2":0.0037313432835820895,"'mt-0'":0.0037313432835820895,"getaccountassets":0.0037313432835820895,"this":0.0037313432835820895,"endpoint":0.0037313432835820895,"retrieves":0.0037313432835820895,"a":0.0037313432835820895,"comprehensive":0.0037313432835820895,"list":0.0037313432835820895,"of":0.0037313432835820895,"asset":0.0037313432835820895,"events":0.0037313432835820895,"associated":0.0037313432835820895,"with":0.0037313432835820895,"specific":0.0037313432835820895,"account":0.0037313432835820895,"or":0.0037313432835820895,"contract":0.0037313432835820895,"identifier":0.0037313432835820895,"including":0.0037313432835820895,"transfers":0.0037313432835820895,"and":0.0037313432835820895,"mints":0.0037313432835820895,"it":0.0037313432835820895,"is":0.0037313432835820895,"essential":0.0037313432835820895,"for":0.0037313432835820895,"tracking":0.0037313432835820895,"movements":0.0037313432835820895,"changes":0.0037313432835820895,"in":0.0037313432835820895,"ownership":0.0037313432835820895,"within":0.0037313432835820895,"the":0.0037313432835820895,"stacks":0.0037313432835820895,"blockchain":0.0037313432835820895,"parameters":0.0037313432835820895,"required":0.0037313432835820895,"true":0.0037313432835820895,"deprecated":0.0037313432835820895,"false":0.0037313432835820895,"name":0.0037313432835820895,"principal":0.0037313432835820895,"type":0.0037313432835820895,"string":0.0037313432835820895,"address":0.0037313432835820895,"whose":0.0037313432835820895,"are":0.0037313432835820895,"to":0.0037313432835820895,"be":0.0037313432835820895,"retrieved":0.0037313432835820895,"initoverrides":0.0037313432835820895,"requestinit":0.0037313432835820895,"optional":0.0037313432835820895,"overrides":0.0037313432835820895,"request":0.0037313432835820895,"initialization":0.0037313432835820895,"settings":0.0037313432835820895,"defaultvalue":0.0037313432835820895,"get-assets":0.0037313432835820895,"'flex":0.0037313432835820895,"flex-wrap'":0.0037313432835820895,"value":0.0037313432835820895,"'tab":0.0037313432835820895,"group'":0.0037313432835820895,"'badge":0.0037313432835820895,"transition-colors'":0.0037313432835820895,"retrieve":0.0037313432835820895,"assets":0.0037313432835820895,"tsx":0.0037313432835820895,"configuration":0.0037313432835820895,"accountsapi":0.0037313432835820895,"blockchain-api-client'":0.0037313432835820895,"const":0.0037313432835820895,"apiconfig":0.0037313432835820895,"new":0.0037313432835820895,"basepath":0.0037313432835820895,"'https":0.0037313432835820895,"testnet":0.0037313432835820895,"hiro":0.0037313432835820895,"so'":0.0037313432835820895,"'st000000000000000000002amw42h'":0.0037313432835820895,"all":0.0037313432835820895,"specified":0.0037313432835820895,"await":0.0037313432835820895,"title":0.0037313432835820895,"full":0.0037313432835820895,"code":0.0037313432835820895,"sample":0.0037313432835820895,"usersession":0.0037313432835820895,"makeauthrequest":0.0037313432835820895,"appconfig":0.0037313432835820895,"auth'":0.0037313432835820895,"appdomain":0.0037313432835820895,"www":0.0037313432835820895,"myapp":0.0037313432835820895,"com'":0.0037313432835820895,"'store_write'":0.0037313432835820895,"authentication":0.0037313432835820895,"payloads":0.0037313432835820895,"encrypted":0.0037313432835820895,"during":0.0037313432835820895,"transit":0.0037313432835820895,"encryption":0.0037313432835820895,"key":0.0037313432835820895,"generated":0.0037313432835820895,"below":0.0037313432835820895,"provides":0.0037313432835820895,"transitkey":0.0037313432835820895,"generateandstoretransitkey":0.0037313432835820895,"auth":0.0037313432835820895,"process":0.0037313432835820895,"will":0.0037313432835820895,"open":0.0037313432835820895,"compatible":0.0037313432835820895,"authenticator":0.0037313432835820895,"browser":0.0037313432835820895,"extension":0.0037313432835820895,"perform":0.0037313432835820895,"so":0.0037313432835820895,"you":0.0037313432835820895,"need":0.0037313432835820895,"provide":0.0037313432835820895,"redirect":0.0037313432835820895,"url":0.0037313432835820895,"which":0.0037313432835820895,"can":0.0037313432835820895,"payload":0.0037313432835820895,"page":0.0037313432835820895,"should":0.0037313432835820895,"redirecturi":0.0037313432835820895,"com":0.0037313432835820895,"set":0.0037313432835820895,"location":0.0037313432835820895,"your":0.0037313432835820895,"app":0.0037313432835820895,"manifest":0.0037313432835820895,"file":0.0037313432835820895,"contains":0.0037313432835820895,"information":0.0037313432835820895,"about":0.0037313432835820895,"that":0.0037313432835820895,"shown":0.0037313432835820895,"user":0.0037313432835820895,"manifesturi":0.0037313432835820895,"json'":0.0037313432835820895,"generate":0.0037313432835820895,"authrequest":0.0037313432835820895,"enables":0.0037313432835820895,"secure":0.0037313432835820895,"sign-in":0.0037313432835820895,"web":0.0037313432835820895,"apps":0.0037313432835820895,"by":0.0037313432835820895,"generating":0.0037313432835820895,"handling":0.0037313432835820895,"requests":0.0037313432835820895,"involves":0.0037313432835820895,"setting":0.0037313432835820895,"up":0.0037313432835820895,"an":0.0037313432835820895,"domain":0.0037313432835820895,"configuring":0.0037313432835820895,"permissions":0.0037313432835820895,"creating":0.0037313432835820895,"manage":0.0037313432835820895,"data":0.0037313432835820895,"functions":0.0037313432835820895,"issigninpending":0.0037313432835820895,"function":0.0037313432835820895,"determines":0.0037313432835820895,"if":0.0037313432835820895,"there":0.0037313432835820895,"incoming":0.0037313432835820895,"response":0.0037313432835820895,"handlependingsignin":0.0037313432835820895,"processes":0.0037313432835820895,"userdata":0.0037313432835820895,"object":0.0037313432835820895,"containing":0.0037313432835820895,"user's":0.0037313432835820895,"identity":0.0037313432835820895,"bns":0.0037313432835820895,"username":0.0037313432835820895,"profile":0.0037313432835820895,"isusersignedin":0.0037313432835820895,"checks":0.0037313432835820895,"already":0.0037313432835820895,"authenticated":0.0037313432835820895,"loaduserdata":0.0037313432835820895,"encryptcontent":0.0037313432835820895,"encrypts":0.0037313432835820895,"storage":0.0037313432835820895,"decryptcontent":0.0037313432835820895,"decrypts":0.0037313432835820895,"pending":0.0037313432835820895,"handle":0.0037313432835820895,"status":0.0037313432835820895,"check":0.0037313432835820895,"signed":0.0037313432835820895,"user-data":0.0037313432835820895,"load":0.0037313432835820895,"sign-out":0.0037313432835820895,"signing":0.0037313432835820895,"out":0.0037313432835820895,"encrypt":0.0037313432835820895,"encrypting":0.0037313432835820895,"decrypt":0.0037313432835820895,"decrypting":0.0037313432835820895,"ispending":0.0037313432835820895,"then":0.0037313432835820895,"do":0.0037313432835820895,"something":0.0037313432835820895,"'status'":0.0037313432835820895,"issignedin":0.0037313432835820895,"'user-data'":0.0037313432835820895,"'sign-out'":0.0037313432835820895,"logout":0.0037313432835820895,"signuserout":0.0037313432835820895,"'encrypt'":0.0037313432835820895,"message":0.0037313432835820895,"'my":0.0037313432835820895,"secret":0.0037313432835820895,"message'":0.0037313432835820895,"ciphertext":0.0037313432835820895,"'decrypt'":0.0037313432835820895,"plaintext":0.0037313432835820895,"notes":0.0037313432835820895,"note":0.0037313432835820895,"here":0.0037313432835820895,"uses":0.0037313432835820895,"private":0.0037313432835820895,"only":0.0037313432835820895,"share":0.0037313432835820895,"another":0.0037313432835820895,"other":0.0037313432835820895,"users":0.0037313432835820895,"use":0.0037313432835820895,"equivalent":0.0037313432835820895,"methods":0.0037313432835820895,"custom":0.0037313432835820895},"68":{"1":0.0019193857965451055,"200":0.0019193857965451055,"3000":0.0019193857965451055,"12345":0.0019193857965451055,"138339":0.0019193857965451055,"import":0.0019193857965451055,"hackbadge":0.0019193857965451055,"from":0.0019193857965451055,"components":0.0019193857965451055,"badge":0.0019193857965451055,"callout":0.0019193857965451055,"title":0.0019193857965451055,"inactive":0.0019193857965451055,"type":0.0019193857965451055,"warn":0.0019193857965451055,"this":0.0019193857965451055,"hack":0.0019193857965451055,"has":0.0019193857965451055,"been":0.0019193857965451055,"archived":0.0019193857965451055,"feel":0.0019193857965451055,"free":0.0019193857965451055,"to":0.0019193857965451055,"continue":0.0019193857965451055,"use":0.0019193857965451055,"the":0.0019193857965451055,"code":0.0019193857965451055,"in":0.0019193857965451055,"guide":0.0019193857965451055,"as":0.0019193857965451055,"a":0.0019193857965451055,"reference":0.0019193857965451055,"for":0.0019193857965451055,"your":0.0019193857965451055,"own":0.0019193857965451055,"projects":0.0019193857965451055,"introduction":0.0019193857965451055,"previous":0.0019193857965451055,"hacks":0.0019193857965451055,"you":0.0019193857965451055,"built":0.0019193857965451055,"some":0.0019193857965451055,"pretty":0.0019193857965451055,"complex":0.0019193857965451055,"smart":0.0019193857965451055,"contracts":0.0019193857965451055,"but":0.0019193857965451055,"building":0.0019193857965451055,"robust":0.0019193857965451055,"ui":0.0019193857965451055,"ux":0.0019193857965451055,"around":0.0019193857965451055,"these":0.0019193857965451055,"and":0.0019193857965451055,"their":0.0019193857965451055,"on-chain":0.0019193857965451055,"data":0.0019193857965451055,"can":0.0019193857965451055,"be":0.0019193857965451055,"challenging":0.0019193857965451055,"due":0.0019193857965451055,"nature":0.0019193857965451055,"of":0.0019193857965451055,"blockchains":0.0019193857965451055,"let's":0.0019193857965451055,"take":0.0019193857965451055,"decentralized":0.0019193857965451055,"grants":0.0019193857965451055,"program":0.0019193857965451055,"stacks":0.0019193857965451055,"build-a-decentralized-grants-program":0.0019193857965451055,"an":0.0019193857965451055,"example":0.0019193857965451055,"project":0.0019193857965451055,"anyone":0.0019193857965451055,"propose":0.0019193857965451055,"grant":0.0019193857965451055,"proposals":0.0019193857965451055,"are":0.0019193857965451055,"voted":0.0019193857965451055,"on":0.0019193857965451055,"by":0.0019193857965451055,"token":0.0019193857965451055,"holders":0.0019193857965451055,"details":0.0019193857965451055,"each":0.0019193857965451055,"proposal":0.0019193857965451055,"including":0.0019193857965451055,"description":0.0019193857965451055,"contract":0.0019193857965451055,"stored":0.0019193857965451055,"blockchain":0.0019193857965451055,"however":0.0019193857965451055,"directly":0.0019193857965451055,"querying":0.0019193857965451055,"every":0.0019193857965451055,"time":0.0019193857965451055,"want":0.0019193857965451055,"display":0.0019193857965451055,"it":0.0019193857965451055,"application's":0.0019193857965451055,"slow":0.0019193857965451055,"inefficient":0.0019193857965451055,"that":0.0019193857965451055,"information":0.0019193857965451055,"might":0.0019193857965451055,"not":0.0019193857965451055,"always":0.0019193857965451055,"formatted":0.0019193857965451055,"organized":0.0019193857965451055,"way":0.0019193857965451055,"makes":0.0019193857965451055,"sense":0.0019193857965451055,"case":0.0019193857965451055,"is":0.0019193857965451055,"where":0.0019193857965451055,"chainhook":0.0019193857965451055,"comes":0.0019193857965451055,"allows":0.0019193857965451055,"listen":0.0019193857965451055,"specific":0.0019193857965451055,"events":0.0019193857965451055,"such":0.0019193857965451055,"submission":0.0019193857965451055,"new":0.0019193857965451055,"trigger":0.0019193857965451055,"actions":0.0019193857965451055,"response":0.0019193857965451055,"-":0.0019193857965451055,"like":0.0019193857965451055,"inserting":0.0019193857965451055,"into":0.0019193857965451055,"database":0.0019193857965451055,"query":0.0019193857965451055,"off-chain":0.0019193857965451055,"you'll":0.0019193857965451055,"build":0.0019193857965451055,"custom":0.0019193857965451055,"api":0.0019193857965451055,"with":0.0019193857965451055,"using":0.0019193857965451055,"hiro":0.0019193857965451055,"platform":0.0019193857965451055,"https":0.0019193857965451055,"so":0.0019193857965451055,"focus":0.0019193857965451055,"integrating":0.0019193857965451055,"creating":0.0019193857965451055,"server":0.0019193857965451055,"section":0.0019193857965451055,"we'll":0.0019193857965451055,"briefly":0.0019193857965451055,"discuss":0.0019193857965451055,"setting":0.0019193857965451055,"up":0.0019193857965451055,"express":0.0019193857965451055,"handle":0.0019193857965451055,"incoming":0.0019193857965451055,"event":0.0019193857965451055,"while":0.0019193857965451055,"detailed":0.0019193857965451055,"walkthrough":0.0019193857965451055,"beyond":0.0019193857965451055,"scope":0.0019193857965451055,"app":0.0019193857965451055,"here":0.0019193857965451055,"github":0.0019193857965451055,"com":0.0019193857965451055,"hirosystems":0.0019193857965451055,"examples":0.0019193857965451055,"tree":0.0019193857965451055,"main":0.0019193857965451055,"apps":0.0019193857965451055,"illustrate":0.0019193857965451055,"how":0.0019193857965451055,"ts":0.0019193857965451055,"file":0.0019193857965451055,"typescript":0.0019193857965451055,"const":0.0019193857965451055,"require":0.0019193857965451055,"json":0.0019193857965451055,"post":0.0019193857965451055,"req":0.0019193857965451055,"res":0.0019193857965451055,"body":0.0019193857965451055,"process":0.0019193857965451055,"status":0.0019193857965451055,"send":0.0019193857965451055,"message":0.0019193857965451055,"received":0.0019193857965451055,"console":0.0019193857965451055,"log":0.0019193857965451055,"running":0.0019193857965451055,"port":0.0019193857965451055,"listens":0.0019193857965451055,"requests":0.0019193857965451055,"at":0.0019193857965451055,"route":0.0019193857965451055,"when":0.0019193857965451055,"request":0.0019193857965451055,"which":0.0019193857965451055,"will":0.0019193857965451055,"set":0.0019193857965451055,"next":0.0019193857965451055,"extract":0.0019193857965451055,"parsing":0.0019193857965451055,"payload":0.0019193857965451055,"lot":0.0019193857965451055,"break":0.0019193857965451055,"down":0.0019193857965451055,"more":0.0019193857965451055,"important":0.0019193857965451055,"parts":0.0019193857965451055,"inside":0.0019193857965451055,"truncated":0.0019193857965451055,"look":0.0019193857965451055,"structure":0.0019193857965451055,"apply":0.0019193857965451055,"transactions":0.0019193857965451055,"metadata":0.0019193857965451055,"receipt":0.0019193857965451055,"operations":0.0019193857965451055,"item":0.0019193857965451055,"array":0.0019193857965451055,"should":0.0019193857965451055,"contain":0.0019193857965451055,"transaction":0.0019193857965451055,"object":0.0019193857965451055,"have":0.0019193857965451055,"attribute":0.0019193857965451055,"contains":0.0019193857965451055,"about":0.0019193857965451055,"any":0.0019193857965451055,"were":0.0019193857965451055,"triggered":0.0019193857965451055,"function":0.0019193857965451055,"what":0.0019193857965451055,"happened":0.0019193857965451055,"result":0.0019193857965451055,"call":0.0019193857965451055,"instance":0.0019193857965451055,"if":0.0019193857965451055,"_token":0.0019193857965451055,"transfer_":0.0019193857965451055,"occured":0.0019193857965451055,"would":0.0019193857965451055,"various":0.0019193857965451055,"attributes":0.0019193857965451055,"regarding":0.0019193857965451055,"account":0.0019193857965451055,"amount":0.0019193857965451055,"transfer":0.0019193857965451055,"here's":0.0019193857965451055,"after":0.0019193857965451055,"filtering":0.0019193857965451055,"relevant":0.0019193857965451055,"async":0.0019193857965451055,"loop":0.0019193857965451055,"through":0.0019193857965451055,"foreach":0.0019193857965451055,"them":0.0019193857965451055,"operation":0.0019193857965451055,"back":0.0019193857965451055,"acknowledge":0.0019193857965451055,"added":0.0019193857965451055,"need":0.0019193857965451055,"expose":0.0019193857965451055,"local":0.0019193857965451055,"via":0.0019193857965451055,"deliver":0.0019193857965451055,"do":0.0019193857965451055,"run":0.0019193857965451055,"following":0.0019193857965451055,"command":0.0019193857965451055,"terminal":0.0019193857965451055,"npx":0.0019193857965451055,"localtunnel":0.0019193857965451055,"--port":0.0019193857965451055,"your-port-number":0.0019193857965451055,"_":0.0019193857965451055,"note":0.0019193857965451055,"there":0.0019193857965451055,"several":0.0019193857965451055,"tools":0.0019193857965451055,"exposing":0.0019193857965451055,"localhost":0.0019193857965451055,"world":0.0019193857965451055,"choose":0.0019193857965451055,"one":0.0019193857965451055,"prefer":0.0019193857965451055,"click":0.0019193857965451055,"integrate":0.0019193857965451055,"involves":0.0019193857965451055,"predicate":0.0019193857965451055,"matches":0.0019193857965451055,"respond":0.0019193857965451055,"provides":0.0019193857965451055,"user-friendly":0.0019193857965451055,"interface":0.0019193857965451055,"managing":0.0019193857965451055,"chainhooks":0.0019193857965451055,"end":0.0019193857965451055,"ready":0.0019193857965451055,"deploying":0.0019193857965451055,"testnet":0.0019193857965451055,"order":0.0019193857965451055,"create":0.0019193857965451055,"deploy":0.0019193857965451055,"page":0.0019193857965451055,"button":0.0019193857965451055,"near":0.0019193857965451055,"top":0.0019193857965451055,"right":0.0019193857965451055,"screen":0.0019193857965451055,"see":0.0019193857965451055,"deployment":0.0019193857965451055,"options":0.0019193857965451055,"generate":0.0019193857965451055,"provide":0.0019193857965451055,"step":0.0019193857965451055,"requesting":0.0019193857965451055,"stx":0.0019193857965451055,"also":0.0019193857965451055,"go":0.0019193857965451055,"straight":0.0019193857965451055,"faucet":0.0019193857965451055,"explorer":0.0019193857965451055,"sandbox":0.0019193857965451055,"chain":0.0019193857965451055,"once":0.0019193857965451055,"tokens":0.0019193857965451055,"same":0.0019193857965451055,"methods":0.0019193857965451055,"used":0.0019193857965451055,"devnet":0.0019193857965451055,"network":0.0019193857965451055,"parameter":0.0019193857965451055,"now":0.0019193857965451055,"it's":0.0019193857965451055,"first":0.0019193857965451055,"start":0.0019193857965451055,"proposal-submission":0.0019193857965451055,"called":0.0019193857965451055,"submitted":0.0019193857965451055,"define":0.0019193857965451055,"uuid":0.0019193857965451055,"name":0.0019193857965451055,"version":0.0019193857965451055,"networks":0.0019193857965451055,"if_this":0.0019193857965451055,"contract_call":0.0019193857965451055,"contract_identifier":0.0019193857965451055,"st2bsv94a650wgz2yz5y8hm93w01ngt4gy0mgjecg":0.0019193857965451055,"method":0.0019193857965451055,"then_that":0.0019193857965451055,"http_post":0.0019193857965451055,"url":0.0019193857965451055,"your-https-server-url":0.0019193857965451055,"authorization_header":0.0019193857965451055,"bearer":0.0019193857965451055,"start_block":0.0019193857965451055,"info":0.0019193857965451055,"make":0.0019193857965451055,"sure":0.0019193857965451055,"swap":0.0019193857965451055,"out":0.0019193857965451055,"match":0.0019193857965451055,"abi":0.0019193857965451055,"specifies":0.0019193857965451055,"conditions":0.0019193857965451055,"looking":0.0019193857965451055,"calls":0.0019193857965451055,"action":0.0019193857965451055,"detects":0.0019193857965451055,"specified":0.0019193857965451055,"field":0.0019193857965451055,"specify":0.0019193857965451055,"starting":0.0019193857965451055,"block":0.0019193857965451055,"listening":0.0019193857965451055,"useful":0.0019193857965451055,"ignoring":0.0019193857965451055,"blocks":0.0019193857965451055,"mined":0.0019193857965451055,"before":0.0019193857965451055,"was":0.0019193857965451055,"created":0.0019193857965451055,"similar":0.0019193857965451055,"select":0.0019193857965451055,"_chainhooks_":0.0019193857965451055,"tab":0.0019193857965451055,"upload":0.0019193857965451055,"_upload":0.0019193857965451055,"chainhook_":0.0019193857965451055,"option":0.0019193857965451055,"follow":0.0019193857965451055,"guides":0.0019193857965451055,"create-chainhooks":0.0019193857965451055,"testing":0.0019193857965451055,"you've":0.0019193857965451055,"successfully":0.0019193857965451055,"uploaded":0.0019193857965451055,"test":0.0019193857965451055,"performing":0.0019193857965451055,"aligns":0.0019193857965451055,"logic":0.0019193857965451055,"then":0.0019193857965451055,"check":0.0019193857965451055,"endpoint":0.0019193857965451055,"everything":0.0019193857965451055,"correctly":0.0019193857965451055,"requested":0.0019193857965451055,"logged":0.0019193857965451055,"presents":0.0019193857965451055,"challenges":0.0019193857965451055,"help":0.0019193857965451055,"put":0.0019193857965451055,"finishing":0.0019193857965451055,"touches":0.0019193857965451055,"foundation":0.0019193857965451055,"you're":0.0019193857965451055,"well-equipped":0.0019193857965451055,"journey":0.0019193857965451055,"applications":0.0019193857965451055,"congratulations":0.0019193857965451055,"reaching":0.0019193857965451055,"point":0.0019193857965451055,"all":0.0019193857965451055,"needed":0.0019193857965451055,"significant":0.0019193857965451055,"towards":0.0019193857965451055,"enhancing":0.0019193857965451055,"functionality":0.0019193857965451055,"user":0.0019193857965451055,"experience":0.0019193857965451055,"crucial":0.0019193857965451055,"verifying":0.0019193857965451055,"working":0.0019193857965451055,"expected":0.0019193857965451055,"don't":0.0019193857965451055,"output":0.0019193857965451055,"may":0.0019193857965451055,"revisit":0.0019193857965451055,"ensure":0.0019193857965451055,"configured":0.0019193857965451055,"additional":0.0019193857965451055,"features":0.0019193857965451055,"implement":0.0019193857965451055,"further":0.0019193857965451055,"explore":0.0019193857965451055,"add":0.0019193857965451055,"other":0.0019193857965451055,"variant":0.0019193857965451055,"starter":0.0019193857965451055,"than":0.0019193857965451055,"stop":0.0019193857965451055,"just":0.0019193857965451055,"above":0.0019193857965451055,"dapp":0.0019193857965451055,"parse":0.0019193857965451055,"accordingly":0.0019193857965451055,"intermediate":0.0019193857965451055,"consumer-facing":0.0019193857965451055,"endpoints":0.0019193857965451055,"until":0.0019193857965451055,"we've":0.0019193857965451055,"shown":0.0019193857965451055,"capture":0.0019193857965451055,"initial":0.0019193857965451055,"sent":0.0019193857965451055,"raw":0.0019193857965451055,"challenge":0.0019193857965451055,"present":0.0019193857965451055,"filtered":0.0019193857965451055,"extracted":0.0019193857965451055,"consumer-friendly":0.0019193857965451055,"format":0.0019193857965451055,"could":0.0019193857965451055,"involve":0.0019193857965451055,"adding":0.0019193857965451055,"layer":0.0019193857965451055,"organizing":0.0019193857965451055,"context":0.0019193857965451055,"or":0.0019193857965451055,"transforming":0.0019193857965451055,"needs":0.0019193857965451055,"frontend":0.0019193857965451055,"quick":0.0019193857965451055,"db":0.0019193857965451055,"setup":0.0019193857965451055,"try":0.0019193857965451055,"something":0.0019193857965451055,"supabase":0.0019193857965451055,"docs":0.0019193857965451055,"getting-started":0.0019193857965451055,"quickstarts":0.0019193857965451055,"reactjs":0.0019193857965451055,"createclient":0.0019193857965451055,"co":0.0019193857965451055,"your-anon-key":0.0019193857965451055,"insert":0.0019193857965451055,"save":0.0019193857965451055,"error":0.0019193857965451055,"await":0.0019193857965451055,"advanced":0.0019193857965451055,"integration":0.0019193857965451055,"final":0.0019193857965451055,"taking":0.0019193857965451055,"processed":0.0019193857965451055,"displaying":0.0019193857965451055,"meaningful":0.0019193857965451055,"application":0.0019193857965451055,"dynamic":0.0019193857965451055,"update":0.0019193857965451055,"interactive":0.0019193857965451055,"elements":0.0019193857965451055,"allow":0.0019193857965451055,"users":0.0019193857965451055,"incorporating":0.0019193857965451055,"visualizations":0.0019193857965451055,"understand":0.0019193857965451055},"69":{"1":0.0016155088852988692,"4":0.0016155088852988692,"10":0.0016155088852988692,"32":0.0016155088852988692,"34":0.0016155088852988692,"50":0.0016155088852988692,"256":0.0016155088852988692,"500":0.0016155088852988692,"1440":0.0016155088852988692,"import":0.0016155088852988692,"hackbadge":0.0016155088852988692,"from":0.0016155088852988692,"components":0.0016155088852988692,"badge":0.0016155088852988692,"callout":0.0016155088852988692,"title":0.0016155088852988692,"inactive":0.0016155088852988692,"type":0.0016155088852988692,"warn":0.0016155088852988692,"this":0.0016155088852988692,"hack":0.0016155088852988692,"has":0.0016155088852988692,"been":0.0016155088852988692,"archived":0.0016155088852988692,"feel":0.0016155088852988692,"free":0.0016155088852988692,"to":0.0016155088852988692,"continue":0.0016155088852988692,"use":0.0016155088852988692,"the":0.0016155088852988692,"code":0.0016155088852988692,"in":0.0016155088852988692,"guide":0.0016155088852988692,"as":0.0016155088852988692,"a":0.0016155088852988692,"reference":0.0016155088852988692,"for":0.0016155088852988692,"your":0.0016155088852988692,"own":0.0016155088852988692,"projects":0.0016155088852988692,"introduction":0.0016155088852988692,"welcome":0.0016155088852988692,"world":0.0016155088852988692,"where":0.0016155088852988692,"funding":0.0016155088852988692,"innovative":0.0016155088852988692,"is":0.0016155088852988692,"fluid":0.0016155088852988692,"and":0.0016155088852988692,"controlled":0.0016155088852988692,"by":0.0016155088852988692,"community":0.0016155088852988692,"of":0.0016155088852988692,"token":0.0016155088852988692,"holders":0.0016155088852988692,"not":0.0016155088852988692,"just":0.0016155088852988692,"select":0.0016155088852988692,"few":0.0016155088852988692,"value":0.0016155088852988692,"proposition":0.0016155088852988692,"decentralized":0.0016155088852988692,"grants":0.0016155088852988692,"program":0.0016155088852988692,"you":0.0016155088852988692,"will":0.0016155088852988692,"build":0.0016155088852988692,"such":0.0016155088852988692,"using":0.0016155088852988692,"executordao":0.0016155088852988692,"https":0.0016155088852988692,"github":0.0016155088852988692,"com":0.0016155088852988692,"marvinjanssen":0.0016155088852988692,"executor-dao":0.0016155088852988692,"protocol":0.0016155088852988692,"on":0.0016155088852988692,"stacks":0.0016155088852988692,"blockchain":0.0016155088852988692,"key":0.0016155088852988692,"features":0.0016155088852988692,"project":0.0016155088852988692,"include":0.0016155088852988692,"governance":0.0016155088852988692,"anyone":0.0016155088852988692,"holding":0.0016155088852988692,"membership-token":0.0016155088852988692,"can":0.0016155088852988692,"vote":0.0016155088852988692,"grant":0.0016155088852988692,"proposals":0.0016155088852988692,"open":0.0016155088852988692,"proposal":0.0016155088852988692,"submission":0.0016155088852988692,"propose":0.0016155088852988692,"encouraging":0.0016155088852988692,"wide":0.0016155088852988692,"range":0.0016155088852988692,"ideas":0.0016155088852988692,"smart":0.0016155088852988692,"contract":0.0016155088852988692,"automation":0.0016155088852988692,"all":0.0016155088852988692,"aspects":0.0016155088852988692,"voting":0.0016155088852988692,"fund":0.0016155088852988692,"distribution":0.0016155088852988692,"are":0.0016155088852988692,"automated":0.0016155088852988692,"through":0.0016155088852988692,"contracts":0.0016155088852988692,"ensuring":0.0016155088852988692,"transparency":0.0016155088852988692,"tamper-proof":0.0016155088852988692,"processes":0.0016155088852988692,"walks":0.0016155088852988692,"basics":0.0016155088852988692,"building":0.0016155088852988692,"over":0.0016155088852988692,"course":0.0016155088852988692,"deploy":0.0016155088852988692,"functioning":0.0016155088852988692,"there":0.0016155088852988692,"also":0.0016155088852988692,"optional":0.0016155088852988692,"challenges":0.0016155088852988692,"at":0.0016155088852988692,"end":0.0016155088852988692,"further":0.0016155088852988692,"stretch":0.0016155088852988692,"skills":0.0016155088852988692,"now":0.0016155088852988692,"it's":0.0016155088852988692,"time":0.0016155088852988692,"first":0.0016155088852988692,"we'll":0.0016155088852988692,"cover":0.0016155088852988692,"core":0.0016155088852988692,"functionalities":0.0016155088852988692,"our":0.0016155088852988692,"look":0.0016155088852988692,"let's":0.0016155088852988692,"dive":0.0016155088852988692,"understanding":0.0016155088852988692,"powerful":0.0016155088852988692,"flexible":0.0016155088852988692,"that":0.0016155088852988692,"allows":0.0016155088852988692,"creation":0.0016155088852988692,"autonomous":0.0016155088852988692,"organizations":0.0016155088852988692,"daos":0.0016155088852988692,"with":0.0016155088852988692,"high":0.0016155088852988692,"degree":0.0016155088852988692,"modularity":0.0016155088852988692,"customization":0.0016155088852988692,"operates":0.0016155088852988692,"three":0.0016155088852988692,"tenets":0.0016155088852988692,"expressed":0.0016155088852988692,"allowing":0.0016155088852988692,"precise":0.0016155088852988692,"logical":0.0016155088852988692,"descriptions":0.0016155088852988692,"operations":0.0016155088852988692,"duties":0.0016155088852988692,"members":0.0016155088852988692,"dao":0.0016155088852988692,"case":0.0016155088852988692,"each":0.0016155088852988692,"application":0.0016155088852988692,"executes":0.0016155088852988692,"extensions":0.0016155088852988692,"give":0.0016155088852988692,"form":0.0016155088852988692,"starts":0.0016155088852988692,"single":0.0016155088852988692,"whose":0.0016155088852988692,"sole":0.0016155088852988692,"purpose":0.0016155088852988692,"execute":0.0016155088852988692,"keep":0.0016155088852988692,"list":0.0016155088852988692,"authorized":0.0016155088852988692,"be":0.0016155088852988692,"enabled":0.0016155088852988692,"or":0.0016155088852988692,"disabled":0.0016155088852988692,"add":0.0016155088852988692,"specific":0.0016155088852988692,"-":0.0016155088852988692,"like":0.0016155088852988692,"_proposing":0.0016155088852988692,"grants_":0.0016155088852988692,"_voting":0.0016155088852988692,"_distributing":0.0016155088852988692,"funds_":0.0016155088852988692,"more":0.0016155088852988692,"ownership":0.0016155088852988692,"control":0.0016155088852988692,"happens":0.0016155088852988692,"via":0.0016155088852988692,"sending":0.0016155088852988692,"context":0.0016155088852988692,"follows":0.0016155088852988692,"single-address":0.0016155088852988692,"model":0.0016155088852988692,"de":0.0016155088852988692,"facto":0.0016155088852988692,"owner":0.0016155088852988692,"external":0.0016155088852988692,"ownable":0.0016155088852988692,"any":0.0016155088852988692,"extension":0.0016155088852988692,"act":0.0016155088852988692,"upon":0.0016155088852988692,"it":0.0016155088852988692,"we":0.0016155088852988692,"out":0.0016155088852988692,"sections":0.0016155088852988692,"below":0.0016155088852988692,"details":0.0016155088852988692,"view":0.0016155088852988692,"standard":0.0016155088852988692,"tree":0.0016155088852988692,"main":0.0016155088852988692,"repository":0.0016155088852988692,"clone":0.0016155088852988692,"starter":0.0016155088852988692,"template":0.0016155088852988692,"start":0.0016155088852988692,"setting":0.0016155088852988692,"up":0.0016155088852988692,"development":0.0016155088852988692,"environment":0.0016155088852988692,"we've":0.0016155088852988692,"prepared":0.0016155088852988692,"includes":0.0016155088852988692,"an":0.0016155088852988692,"initialized":0.0016155088852988692,"clarinet":0.0016155088852988692,"react":0.0016155088852988692,"frontend":0.0016155088852988692,"some":0.0016155088852988692,"boilerplate":0.0016155088852988692,"required":0.0016155088852988692,"packages":0.0016155088852988692,"terminal":0.0016155088852988692,"run":0.0016155088852988692,"following":0.0016155088852988692,"command":0.0016155088852988692,"git":0.0016155088852988692,"hirosystems":0.0016155088852988692,"hiro-hacks-template":0.0016155088852988692,"cd":0.0016155088852988692,"establishing":0.0016155088852988692,"before":0.0016155088852988692,"creating":0.0016155088852988692,"need":0.0016155088852988692,"create":0.0016155088852988692,"trait":0.0016155088852988692,"you'll":0.0016155088852988692,"implementing":0.0016155088852988692,"traits":0.0016155088852988692,"clarity":0.0016155088852988692,"define":0.0016155088852988692,"set":0.0016155088852988692,"functions":0.0016155088852988692,"must":0.0016155088852988692,"implement":0.0016155088852988692,"wants":0.0016155088852988692,"defined":0.0016155088852988692,"proposal-trait":0.0016155088852988692,"extension-trait":0.0016155088852988692,"respectively":0.0016155088852988692,"project's":0.0016155088852988692,"directory":0.0016155088852988692,"new":0.0016155088852988692,"clar":0.0016155088852988692,"define-trait":0.0016155088852988692,"callback":0.0016155088852988692,"principal":0.0016155088852988692,"buff":0.0016155088852988692,"response":0.0016155088852988692,"bool":0.0016155088852988692,"uint":0.0016155088852988692,"you've":0.0016155088852988692,"how":0.0016155088852988692,"implemented":0.0016155088852988692,"begin":0.0016155088852988692,"called":0.0016155088852988692,"inside":0.0016155088852988692,"two":0.0016155088852988692,"created":0.0016155088852988692,"steps":0.0016155088852988692,"above":0.0016155088852988692,"use-trait":0.0016155088852988692,"error":0.0016155088852988692,"handling":0.0016155088852988692,"state":0.0016155088852988692,"management":0.0016155088852988692,"next":0.0016155088852988692,"basic":0.0016155088852988692,"variables":0.0016155088852988692,"managing":0.0016155088852988692,"define-constant":0.0016155088852988692,"err_unauthorized":0.0016155088852988692,"err":0.0016155088852988692,"u1000":0.0016155088852988692,"err_already_executed":0.0016155088852988692,"u1001":0.0016155088852988692,"err_invalid_extension":0.0016155088852988692,"u1002":0.0016155088852988692,"define-data-var":0.0016155088852988692,"executive":0.0016155088852988692,"tx-sender":0.0016155088852988692,"define-map":0.0016155088852988692,"executedproposals":0.0016155088852988692,"these":0.0016155088852988692,"constants":0.0016155088852988692,"represent":0.0016155088852988692,"codes":0.0016155088852988692,"return":0.0016155088852988692,"store":0.0016155088852988692,"map":0.0016155088852988692,"executed":0.0016155088852988692,"authorization":0.0016155088852988692,"check":0.0016155088852988692,"is-self-or-extension":0.0016155088852988692,"function":0.0016155088852988692,"private":0.0016155088852988692,"checks":0.0016155088852988692,"if":0.0016155088852988692,"caller":0.0016155088852988692,"itself":0.0016155088852988692,"define-private":0.0016155088852988692,"ok":0.0016155088852988692,"asserts":0.0016155088852988692,"is-eq":0.0016155088852988692,"as-contract":0.0016155088852988692,"is-extension":0.0016155088852988692,"contract-caller":0.0016155088852988692,"define-read-only":0.0016155088852988692,"default-to":0.0016155088852988692,"false":0.0016155088852988692,"map-get":0.0016155088852988692,"executed-at":0.0016155088852988692,"contract-of":0.0016155088852988692,"here's":0.0016155088852988692,"enable":0.0016155088852988692,"disable":0.0016155088852988692,"set-extension":0.0016155088852988692,"define-public":0.0016155088852988692,"try":0.0016155088852988692,"print":0.0016155088852988692,"event":0.0016155088852988692,"map-set":0.0016155088852988692,"execution":0.0016155088852988692,"sender":0.0016155088852988692,"map-insert":0.0016155088852988692,"block-height":0.0016155088852988692,"contract-call":0.0016155088852988692,"inserts":0.0016155088852988692,"into":0.0016155088852988692,"then":0.0016155088852988692,"calls":0.0016155088852988692,"bootstrap":0.0016155088852988692,"construct":0.0016155088852988692,"used":0.0016155088852988692,"let":0.0016155088852988692,"var-get":0.0016155088852988692,"var-set":0.0016155088852988692,"sets":0.0016155088852988692,"provided":0.0016155088852988692,"requests":0.0016155088852988692,"request-extension-callback":0.0016155088852988692,"request":0.0016155088852988692,"memo":0.0016155088852988692,"help":0.0016155088852988692,"membership":0.0016155088852988692,"section":0.0016155088852988692,"non-transferable":0.0016155088852988692,"which":0.0016155088852988692,"rights":0.0016155088852988692,"initially":0.0016155088852988692,"distributed":0.0016155088852988692,"certain":0.0016155088852988692,"addresses":0.0016155088852988692,"during":0.0016155088852988692,"bootstrapping":0.0016155088852988692,"process":0.0016155088852988692,"however":0.0016155088852988692,"minting":0.0016155088852988692,"burning":0.0016155088852988692,"removal":0.0016155088852988692,"tokens":0.0016155088852988692,"managed":0.0016155088852988692,"navigate":0.0016155088852988692,"walk":0.0016155088852988692,"defines":0.0016155088852988692,"u2000":0.0016155088852988692,"err_not_token_owner":0.0016155088852988692,"u2001":0.0016155088852988692,"err_membership_limit_reached":0.0016155088852988692,"u2002":0.0016155088852988692,"define-fungible-token":0.0016155088852988692,"sgrant":0.0016155088852988692,"tokenname":0.0016155088852988692,"string-ascii":0.0016155088852988692,"tokensymbol":0.0016155088852988692,"sgt":0.0016155088852988692,"tokenuri":0.0016155088852988692,"string-utf8":0.0016155088852988692,"none":0.0016155088852988692,"tokendecimals":0.0016155088852988692,"u6":0.0016155088852988692,"name":0.0016155088852988692,"symbol":0.0016155088852988692,"uri":0.0016155088852988692,"decimals":0.0016155088852988692,"is-dao-or-extension":0.0016155088852988692,"allow":0.0016155088852988692,"distribute":0.0016155088852988692,"burn":0.0016155088852988692,"granting":0.0016155088852988692,"them":0.0016155088852988692,"ability":0.0016155088852988692,"future":0.0016155088852988692,"provides":0.0016155088852988692,"mint":0.0016155088852988692,"amount":0.0016155088852988692,"recipient":0.0016155088852988692,"ft-mint":0.0016155088852988692,"ft-burn":0.0016155088852988692,"specified":0.0016155088852988692,"see":0.0016155088852988692,"either":0.0016155088852988692,"approved":0.0016155088852988692,"later":0.0016155088852988692,"information":0.0016155088852988692,"get":0.0016155088852988692,"token's":0.0016155088852988692,"get-name":0.0016155088852988692,"get-symbol":0.0016155088852988692,"get-decimals":0.0016155088852988692,"balance":0.0016155088852988692,"get-balance":0.0016155088852988692,"total":0.0016155088852988692,"supply":0.0016155088852988692,"get-total-supply":0.0016155088852988692,"get-token-uri":0.0016155088852988692,"who":0.0016155088852988692,"ft-get-balance":0.0016155088852988692,"ft-get-supply":0.0016155088852988692,"corresponding":0.0016155088852988692,"about":0.0016155088852988692,"second":0.0016155088852988692,"voted":0.0016155088852988692,"proposal-submission":0.0016155088852988692,"impl-trait":0.0016155088852988692,"u3000":0.0016155088852988692,"err_unknown_parameter":0.0016155088852988692,"u3001":0.0016155088852988692,"parameters":0.0016155088852988692,"proposal-duration":0.0016155088852988692,"parameter":0.0016155088852988692,"default":0.0016155088852988692,"represents":0.0016155088852988692,"duration":0.0016155088852988692,"blocks":0.0016155088852988692,"example":0.0016155088852988692,"block":0.0016155088852988692,"mined":0.0016155088852988692,"approximately":0.0016155088852988692,"every":0.0016155088852988692,"minutes":0.0016155088852988692,"would":0.0016155088852988692,"days":0.0016155088852988692,"u1440":0.0016155088852988692,"based":0.0016155088852988692,"minute":0.0016155088852988692,"get-parameter":0.0016155088852988692,"read-only":0.0016155088852988692,"returns":0.0016155088852988692,"unwrap":0.0016155088852988692,"description":0.0016155088852988692,"proposal-voting":0.0016155088852988692,"add-proposal":0.0016155088852988692,"end-block-height":0.0016155088852988692,"proposer":0.0016155088852988692,"passing":0.0016155088852988692,"current":0.0016155088852988692,"height":0.0016155088852988692,"plus":0.0016155088852988692,"true":0.0016155088852988692,"third":0.0016155088852988692,"proposed":0.0016155088852988692,"err_proposal_already_executed":0.0016155088852988692,"u3002":0.0016155088852988692,"err_proposal_already_exists":0.0016155088852988692,"u3003":0.0016155088852988692,"err_unknown_proposal":0.0016155088852988692,"u3004":0.0016155088852988692,"err_proposal_already_concluded":0.0016155088852988692,"u3005":0.0016155088852988692,"err_proposal_inactive":0.0016155088852988692,"u3006":0.0016155088852988692,"err_proposal_not_concluded":0.0016155088852988692,"u3007":0.0016155088852988692,"err_no_votes_to_return":0.0016155088852988692,"u3008":0.0016155088852988692,"err_end_block_height_not_reached":0.0016155088852988692,"u3009":0.0016155088852988692,"err_disabled":0.0016155088852988692,"u3010":0.0016155088852988692,"another":0.0016155088852988692,"votes":0.0016155088852988692,"member":0.0016155088852988692,"votes-for":0.0016155088852988692,"votes-against":0.0016155088852988692,"concluded":0.0016155088852988692,"passed":0.0016155088852988692,"member-total-votes":0.0016155088852988692,"voter":0.0016155088852988692,"data":0.0016155088852988692,"is-none":0.0016155088852988692,"merge":0.0016155088852988692,"u0":0.0016155088852988692,"holder":0.0016155088852988692,"least":0.0016155088852988692,"proposal-data":0.0016155088852988692,"unwrap-panic":0.0016155088852988692,"u1":0.0016155088852988692,"get-current-total-votes":0.0016155088852988692,"conclusion":0.0016155088852988692,"conclude":0.0016155088852988692,"concludes":0.0016155088852988692,"retrieves":0.0016155088852988692,"than":0.0016155088852988692,"against":0.0016155088852988692,"already":0.0016155088852988692,"greater":0.0016155088852988692,"equal":0.0016155088852988692,"conditions":0.0016155088852988692,"met":0.0016155088852988692,"fields":0.0016155088852988692,"prints":0.0016155088852988692,"tries":0.0016155088852988692,"whether":0.0016155088852988692,"congratulations":0.0016155088852988692,"successfully":0.0016155088852988692,"foundations":0.0016155088852988692,"additional":0.0016155088852988692,"sharpening":0.0016155088852988692,"variant":0.0016155088852988692,"initialize":0.0016155088852988692,"have":0.0016155088852988692,"way":0.0016155088852988692,"do":0.0016155088852988692,"wrote":0.0016155088852988692,"enabling":0.0016155088852988692,"initial":0.0016155088852988692,"allocation":0.0016155088852988692,"responsible":0.0016155088852988692,"little":0.0016155088852988692,"guidance":0.0016155088852988692,"here":0.0016155088852988692,"blob":0.0016155088852988692,"edp000-bootstrap":0.0016155088852988692,"after":0.0016155088852988692,"initializing":0.0016155088852988692,"step":0.0016155088852988692,"involves":0.0016155088852988692,"once":0.0016155088852988692,"submitted":0.0016155088852988692,"period":0.0016155088852988692,"intermediate":0.0016155088852988692,"milestone-based":0.0016155088852988692,"tracks":0.0016155088852988692,"progress":0.0016155088852988692,"manage":0.0016155088852988692,"milestones":0.0016155088852988692,"funds":0.0016155088852988692,"released":0.0016155088852988692,"milestone":0.0016155088852988692,"achieved":0.0016155088852988692,"provide":0.0016155088852988692,"structured":0.0016155088852988692,"accountable":0.0016155088852988692,"recipients":0.0016155088852988692,"making":0.0016155088852988692,"they":0.0016155088852988692,"receive":0.0016155088852988692,"their":0.0016155088852988692,"round":0.0016155088852988692,"advanced":0.0016155088852988692,"ui":0.0016155088852988692,"integration":0.0016155088852988692,"integrate":0.0016155088852988692,"js":0.0016155088852988692,"users":0.0016155088852988692,"submit":0.0016155088852988692,"status":0.0016155088852988692,"directly":0.0016155088852988692,"tsx":0.0016155088852988692,"callreadonlyfunction":0.0016155088852988692,"standardprincipalcv":0.0016155088852988692,"transactions":0.0016155088852988692,"const":0.0016155088852988692,"senderaddress":0.0016155088852988692,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.0016155088852988692,"contractaddress":0.0016155088852988692,"contractname":0.0016155088852988692,"functionname":0.0016155088852988692,"extensionaddress":0.0016155088852988692,"functionargs":0.0016155088852988692,"await":0.0016155088852988692,"network":0.0016155088852988692},"70":{"1":0.00641025641025641,"2":0.00641025641025641,"3":0.00641025641025641,"315":0.00641025641025641,"770":0.00641025641025641,"2025":0.00641025641025641,"january":0.00641025641025641,"ai":0.00641025641025641,"x":0.00641025641025641,"stacks":0.00641025641025641,"build":0.00641025641025641,"something":0.00641025641025641,"that":0.00641025641025641,"combines":0.00641025641025641,"capabilities":0.00641025641025641,"with":0.00641025641025641,"blockchain":0.00641025641025641,"technology":0.00641025641025641,"timeline":0.00641025641025641,"22-28":0.00641025641025641,"this":0.00641025641025641,"month's":0.00641025641025641,"challenge":0.00641025641025641,"invites":0.00641025641025641,"you":0.00641025641025641,"to":0.00641025641025641,"explore":0.00641025641025641,"the":0.00641025641025641,"intersection":0.00641025641025641,"of":0.00641025641025641,"artificial":0.00641025641025641,"intelligence":0.00641025641025641,"and":0.00641025641025641,"create":0.00641025641025641,"innovative":0.00641025641025641,"solutions":0.00641025641025641,"leverage":0.00641025641025641,"both":0.00641025641025641,"submit":0.00641025641025641,"your":0.00641025641025641,"project":0.00641025641025641,"here":0.00641025641025641,"https":0.00641025641025641,"hirohacks25":0.00641025641025641,"paperform":0.00641025641025641,"co":0.00641025641025641,"iframe":0.00641025641025641,"width":0.00641025641025641,"height":0.00641025641025641,"src":0.00641025641025641,"www":0.00641025641025641,"youtube":0.00641025641025641,"com":0.00641025641025641,"embed":0.00641025641025641,"gikrsamqnqo":0.00641025641025641,"si":0.00641025641025641,"eq74otytsozcpik-":0.00641025641025641,"title":0.00641025641025641,"video":0.00641025641025641,"player":0.00641025641025641,"allow":0.00641025641025641,"accelerometer":0.00641025641025641,"autoplay":0.00641025641025641,"clipboard-write":0.00641025641025641,"encrypted-media":0.00641025641025641,"gyroscope":0.00641025641025641,"picture-in-picture":0.00641025641025641,"web-share":0.00641025641025641,"referrerpolicy":0.00641025641025641,"strict-origin-when-cross-origin":0.00641025641025641,"allowfullscreen":0.00641025641025641,"example":0.00641025641025641,"ideas":0.00641025641025641,"contract":0.00641025641025641,"analyzer":0.00641025641025641,"-":0.00641025641025641,"a":0.00641025641025641,"tool":0.00641025641025641,"uses":0.00641025641025641,"llms":0.00641025641025641,"audit":0.00641025641025641,"explain":0.00641025641025641,"clarity":0.00641025641025641,"contracts":0.00641025641025641,"help":0.00641025641025641,"developers":0.00641025641025641,"understand":0.00641025641025641,"improve":0.00641025641025641,"their":0.00641025641025641,"smart":0.00641025641025641,"through":0.00641025641025641,"ai-powered":0.00641025641025641,"analysis":0.00641025641025641,"provide":0.00641025641025641,"suggestions":0.00641025641025641,"for":0.00641025641025641,"security":0.00641025641025641,"improvements":0.00641025641025641,"optimizations":0.00641025641025641,"wallet":0.00641025641025641,"assistant":0.00641025641025641,"an":0.00641025641025641,"js":0.00641025641025641,"helps":0.00641025641025641,"users":0.00641025641025641,"make":0.00641025641025641,"informed":0.00641025641025641,"decisions":0.00641025641025641,"analyze":0.00641025641025641,"transaction":0.00641025641025641,"history":0.00641025641025641,"personalized":0.00641025641025641,"insights":0.00641025641025641,"offer":0.00641025641025641,"predictive":0.00641025641025641,"analytics":0.00641025641025641,"spending":0.00641025641025641,"recommendations":0.00641025641025641,"chain":0.00641025641025641,"detective":0.00641025641025641,"develop":0.00641025641025641,"analyzes":0.00641025641025641,"on-chain":0.00641025641025641,"data":0.00641025641025641,"discover":0.00641025641025641,"interesting":0.00641025641025641,"patterns":0.00641025641025641,"use":0.00641025641025641,"chainhook":0.00641025641025641,"stream":0.00641025641025641,"events":0.00641025641025641,"in":0.00641025641025641,"real-time":0.00641025641025641,"generate":0.00641025641025641,"visualizations":0.00641025641025641,"reports":0.00641025641025641,"activity":0.00641025641025641,"_review":0.00641025641025641,"submission":0.00641025641025641,"guidelines":0.00641025641025641,"hacks":0.00641025641025641,"rules":0.00641025641025641,"requirements":0.00641025641025641,"join":0.00641025641025641,"discord":0.00641025641025641,"chat":0.00641025641025641,"connect":0.00641025641025641,"other":0.00641025641025641,"builders":0.00641025641025641,"_":0.00641025641025641,"---":0.00641025641025641,"resources":0.00641025641025641,"codex":0.00641025641025641,"github":0.00641025641025641,"leahjlou":0.00641025641025641,"clarity-codex":0.00641025641025641},"71":{"0":0.0019230769230769232,"1":0.0019230769230769232,"100":0.0019230769230769232,"import":0.0019230769230769232,"hackbadge":0.0019230769230769232,"from":0.0019230769230769232,"components":0.0019230769230769232,"badge":0.0019230769230769232,"callout":0.0019230769230769232,"title":0.0019230769230769232,"inactive":0.0019230769230769232,"type":0.0019230769230769232,"warn":0.0019230769230769232,"this":0.0019230769230769232,"hack":0.0019230769230769232,"has":0.0019230769230769232,"been":0.0019230769230769232,"archived":0.0019230769230769232,"feel":0.0019230769230769232,"free":0.0019230769230769232,"to":0.0019230769230769232,"continue":0.0019230769230769232,"use":0.0019230769230769232,"the":0.0019230769230769232,"code":0.0019230769230769232,"in":0.0019230769230769232,"guide":0.0019230769230769232,"as":0.0019230769230769232,"a":0.0019230769230769232,"reference":0.0019230769230769232,"for":0.0019230769230769232,"your":0.0019230769230769232,"own":0.0019230769230769232,"projects":0.0019230769230769232,"introduction":0.0019230769230769232,"what":0.0019230769230769232,"if":0.0019230769230769232,"we":0.0019230769230769232,"could":0.0019230769230769232,"gamify":0.0019230769230769232,"and":0.0019230769230769232,"reward":0.0019230769230769232,"being":0.0019230769230769232,"friend":0.0019230769230769232,"that's":0.0019230769230769232,"idea":0.0019230769230769232,"behind":0.0019230769230769232,"tech":0.0019230769230769232,"decentralized":0.0019230769230769232,"social":0.0019230769230769232,"network":0.0019230769230769232,"that":0.0019230769230769232,"took":0.0019230769230769232,"web3":0.0019230769230769232,"by":0.0019230769230769232,"storm":0.0019230769230769232,"you'll":0.0019230769230769232,"recreate":0.0019230769230769232,"on":0.0019230769230769232,"stacks":0.0019230769230769232,"blockchain":0.0019230769230769232,"there":0.0019230769230769232,"are":0.0019230769230769232,"few":0.0019230769230769232,"key":0.0019230769230769232,"namely":0.0019230769230769232,"subjects":0.0019230769230769232,"have":0.0019230769230769232,"keys":0.0019230769230769232,"anyone":0.0019230769230769232,"can":0.0019230769230769232,"buy":0.0019230769230769232,"these":0.0019230769230769232,"start":0.0019230769230769232,"off":0.0019230769230769232,"low":0.0019230769230769232,"price":0.0019230769230769232,"but":0.0019230769230769232,"people":0.0019230769230769232,"more":0.0019230769230769232,"goes":0.0019230769230769232,"up":0.0019230769230769232,"faster":0.0019230769230769232,"rewarding":0.0019230769230769232,"friends":0.0019230769230769232,"who":0.0019230769230769232,"bought":0.0019230769230769232,"early":0.0019230769230769232,"owners":0.0019230769230769232,"sell":0.0019230769230769232,"their":0.0019230769230769232,"profit":0.0019230769230769232,"or":0.0019230769230769232,"they":0.0019230769230769232,"hold":0.0019230769230769232,"them":0.0019230769230769232,"signal":0.0019230769230769232,"friendship":0.0019230769230769232,"build":0.0019230769230769232,"reputation":0.0019230769230769232,"also":0.0019230769230769232,"be":0.0019230769230769232,"used":0.0019230769230769232,"access":0.0019230769230769232,"exclusive":0.0019230769230769232,"chatrooms":0.0019230769230769232,"with":0.0019230769230769232,"corresponding":0.0019230769230769232,"subject":0.0019230769230769232,"receive":0.0019230769230769232,"airdrops":0.0019230769230769232,"walks":0.0019230769230769232,"you":0.0019230769230769232,"through":0.0019230769230769232,"basics":0.0019230769230769232,"of":0.0019230769230769232,"building":0.0019230769230769232,"clone":0.0019230769230769232,"challenges":0.0019230769230769232,"at":0.0019230769230769232,"end":0.0019230769230769232,"which":0.0019230769230769232,"opportunities":0.0019230769230769232,"stretch":0.0019230769230769232,"skills":0.0019230769230769232,"keep":0.0019230769230769232,"learning":0.0019230769230769232,"starter":0.0019230769230769232,"template":0.0019230769230769232,"setting":0.0019230769230769232,"development":0.0019230769230769232,"environment":0.0019230769230769232,"we've":0.0019230769230769232,"prepared":0.0019230769230769232,"repository":0.0019230769230769232,"includes":0.0019230769230769232,"an":0.0019230769230769232,"initialized":0.0019230769230769232,"clarinet":0.0019230769230769232,"project":0.0019230769230769232,"react":0.0019230769230769232,"frontend":0.0019230769230769232,"some":0.0019230769230769232,"boilerplate":0.0019230769230769232,"all":0.0019230769230769232,"required":0.0019230769230769232,"packages":0.0019230769230769232,"open":0.0019230769230769232,"terminal":0.0019230769230769232,"run":0.0019230769230769232,"following":0.0019230769230769232,"command":0.0019230769230769232,"git":0.0019230769230769232,"https":0.0019230769230769232,"github":0.0019230769230769232,"com":0.0019230769230769232,"hirosystems":0.0019230769230769232,"hiro-hacks-template":0.0019230769230769232,"cd":0.0019230769230769232,"create":0.0019230769230769232,"contract":0.0019230769230769232,"before":0.0019230769230769232,"begin":0.0019230769230769232,"we're":0.0019230769230769232,"assuming":0.0019230769230769232,"installed":0.0019230769230769232,"basic":0.0019230769230769232,"understanding":0.0019230769230769232,"how":0.0019230769230769232,"it":0.0019230769230769232,"haven't":0.0019230769230769232,"yet":0.0019230769230769232,"do":0.0019230769230769232,"so":0.0019230769230769232,"referring":0.0019230769230769232,"our":0.0019230769230769232,"installation":0.0019230769230769232,"navigate":0.0019230769230769232,"project's":0.0019230769230769232,"directory":0.0019230769230769232,"new":0.0019230769230769232,"will":0.0019230769230769232,"contracts":0.0019230769230769232,"called":0.0019230769230769232,"clar":0.0019230769230769232,"info":0.0019230769230769232,"don't":0.0019230769230769232,"want":0.0019230769230769232,"provided":0.0019230769230769232,"manually":0.0019230769230769232,"running":0.0019230769230769232,"friendtech":0.0019230769230769232,"defining":0.0019230769230769232,"balances":0.0019230769230769232,"supply":0.0019230769230769232,"inside":0.0019230769230769232,"need":0.0019230769230769232,"track":0.0019230769230769232,"balance":0.0019230769230769232,"each":0.0019230769230769232,"user":0.0019230769230769232,"_holder_":0.0019230769230769232,"total":0.0019230769230769232,"using":0.0019230769230769232,"clarity's":0.0019230769230769232,"define-map":0.0019230769230769232,"function":0.0019230769230769232,"clarity":0.0019230769230769232,"keysbalance":0.0019230769230769232,"principal":0.0019230769230769232,"holder":0.0019230769230769232,"uint":0.0019230769230769232,"keyssupply":0.0019230769230769232,"stores":0.0019230769230769232,"holder's":0.0019230769230769232,"given":0.0019230769230769232,"maps":0.0019230769230769232,"contract's":0.0019230769230769232,"functions":0.0019230769230769232,"manage":0.0019230769230769232,"creation":0.0019230769230769232,"buying":0.0019230769230769232,"selling":0.0019230769230769232,"calculating":0.0019230769230769232,"prices":0.0019230769230769232,"next":0.0019230769230769232,"thing":0.0019230769230769232,"is":0.0019230769230769232,"define":0.0019230769230769232,"calculates":0.0019230769230769232,"amount":0.0019230769230769232,"get-price":0.0019230769230769232,"define-read-only":0.0019230769230769232,"let":0.0019230769230769232,"base-price":0.0019230769230769232,"u10":0.0019230769230769232,"base":0.0019230769230769232,"per":0.0019230769230769232,"micro-stx":0.0019230769230769232,"price-change-factor":0.0019230769230769232,"u100":0.0019230769230769232,"factor":0.0019230769230769232,"control":0.0019230769230769232,"rate":0.0019230769230769232,"change":0.0019230769230769232,"average":0.0019230769230769232,"token":0.0019230769230769232,"over":0.0019230769230769232,"range":0.0019230769230769232,"u3":0.0019230769230769232,"formula":0.0019230769230769232,"affected":0.0019230769230769232,"done":0.0019230769230769232,"integrating":0.0019230769230769232,"dividing":0.0019230769230769232,"creating":0.0019230769230769232,"form":0.0019230769230769232,"core":0.0019230769230769232,"operations":0.0019230769230769232,"enabling":0.0019230769230769232,"users":0.0019230769230769232,"let's":0.0019230769230769232,"first":0.0019230769230769232,"take":0.0019230769230769232,"look":0.0019230769230769232,"buy-keys":0.0019230769230769232,"define-public":0.0019230769230769232,"default-to":0.0019230769230769232,"u0":0.0019230769230769232,"map-get":0.0019230769230769232,"is-eq":0.0019230769230769232,"tx-sender":0.0019230769230769232,"match":0.0019230769230769232,"stx-transfer":0.0019230769230769232,"as-contract":0.0019230769230769232,"success":0.0019230769230769232,"map-set":0.0019230769230769232,"ok":0.0019230769230769232,"true":0.0019230769230769232,"error":0.0019230769230769232,"err":0.0019230769230769232,"u2":0.0019230769230769232,"u1":0.0019230769230769232,"allows":0.0019230769230769232,"initiating":0.0019230769230769232,"transaction":0.0019230769230769232,"only":0.0019230769230769232,"succeeds":0.0019230769230769232,"_subject_":0.0019230769230769232,"initial":0.0019230769230769232,"already":0.0019230769230769232,"circulation":0.0019230769230769232,"ie":0.0019230769230769232,"principal-a":0.0019230769230769232,"cannot":0.0019230769230769232,"principal-b":0.0019230769230769232,"sell-keys":0.0019230769230769232,"-":0.0019230769230769232,"recipient":0.0019230769230769232,"less":0.0019230769230769232,"same":0.0019230769230769232,"logic":0.0019230769230769232,"instead":0.0019230769230769232,"deduct":0.0019230769230769232,"check":0.0019230769230769232,"seller":0.0019230769230769232,"owns":0.0019230769230769232,"enough":0.0019230769230769232,"authorized":0.0019230769230769232,"verifying":0.0019230769230769232,"keyholders":0.0019230769230769232,"now":0.0019230769230769232,"ability":0.0019230769230769232,"way":0.0019230769230769232,"verify":0.0019230769230769232,"keyholder":0.0019230769230769232,"is-keyholder":0.0019230769230769232,"read-only":0.0019230769230769232,"checks":0.0019230769230769232,"greater":0.0019230769230769232,"than":0.0019230769230769232,"equal":0.0019230769230769232,"then":0.0019230769230769232,"testing":0.0019230769230769232,"locally":0.0019230769230769232,"make":0.0019230769230769232,"sure":0.0019230769230769232,"valid":0.0019230769230769232,"doesn't":0.0019230769230769232,"any":0.0019230769230769232,"errors":0.0019230769230769232,"functionality":0.0019230769230769232,"console":0.0019230769230769232,"get":0.0019230769230769232,"when":0.0019230769230769232,"contract-call":0.0019230769230769232,"u10010":0.0019230769230769232,"purchase":0.0019230769230769232,"sender":0.0019230769230769232,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":0.0019230769230769232,"false":0.0019230769230769232,"congratulations":0.0019230769230769232,"you've":0.0019230769230769232,"successfully":0.0019230769230769232,"created":0.0019230769230769232,"laid":0.0019230769230769232,"groundwork":0.0019230769230769232,"just":0.0019230769230769232,"like":0.0019230769230769232,"additional":0.0019230769230769232,"features":0.0019230769230769232,"implement":0.0019230769230769232,"variant":0.0019230769230769232,"query":0.0019230769230769232,"add":0.0019230769230769232,"two":0.0019230769230769232,"get-keys-balance":0.0019230769230769232,"get-keys-supply":0.0019230769230769232,"provide":0.0019230769230769232,"valuable":0.0019230769230769232,"information":0.0019230769230769232,"about":0.0019230769230769232,"distribution":0.0019230769230769232,"availability":0.0019230769230769232,"various":0.0019230769230769232,"parts":0.0019230769230769232,"application":0.0019230769230769232,"display":0.0019230769230769232,"return":0.0019230769230769232,"get-buy-price":0.0019230769230769232,"get-sell-price":0.0019230769230769232,"helper":0.0019230769230769232,"allow":0.0019230769230769232,"current":0.0019230769230769232,"specific":0.0019230769230769232,"intermediate":0.0019230769230769232,"fee":0.0019230769230769232,"management":0.0019230769230769232,"buys":0.0019230769230769232,"sells":0.0019230769230769232,"might":0.0019230769230769232,"introduce":0.0019230769230769232,"either":0.0019230769230769232,"protocol":0.0019230769230769232,"level":0.0019230769230769232,"distributed":0.0019230769230769232,"accordingly":0.0019230769230769232,"protocolfeepercent":0.0019230769230769232,"subjectfeepercent":0.0019230769230769232,"variable":0.0019230769230769232,"well":0.0019230769230769232,"destination":0.0019230769230769232,"protocolfeedestination":0.0019230769230769232,"revenue":0.0019230769230769232,"update":0.0019230769230769232,"incorporate":0.0019230769230769232,"fees":0.0019230769230769232,"into":0.0019230769230769232,"values":0.0019230769230769232,"wish":0.0019230769230769232,"define-data-var":0.0019230769230769232,"u200":0.0019230769230769232,"real-world":0.0019230769230769232,"adjust":0.0019230769230769232,"time":0.0019230769230769232,"however":0.0019230769230769232,"wouldn't":0.0019230769230769232,"able":0.0019230769230769232,"changes":0.0019230769230769232,"where":0.0019230769230769232,"comes":0.0019230769230769232,"specifically":0.0019230769230769232,"should":0.0019230769230769232,"set-fee":0.0019230769230769232,"designated":0.0019230769230769232,"contractowner":0.0019230769230769232,"set-protocol-fee-percent":0.0019230769230769232,"feepercent":0.0019230769230769232,"caller":0.0019230769230769232,"value":0.0019230769230769232,"think":0.0019230769230769232,"whether":0.0019230769230769232,"indeed":0.0019230769230769232,"consider":0.0019230769230769232,"kind":0.0019230769230769232,"feedback":0.0019230769230769232,"give":0.0019230769230769232,"someone":0.0019230769230769232,"else":0.0019230769230769232,"tries":0.0019230769230769232,"call":0.0019230769230769232,"test":0.0019230769230769232,"implementation":0.0019230769230769232,"ensure":0.0019230769230769232,"works":0.0019230769230769232,"expected":0.0019230769230769232,"ui":0.0019230769230769232,"integration":0.0019230769230769232,"clone-the-starter-template":0.0019230769230769232,"integrate":0.0019230769230769232,"js":0.0019230769230769232,"example":0.0019230769230769232,"were":0.0019230769230769232,"calling":0.0019230769230769232,"something":0.0019230769230769232,"tsx":0.0019230769230769232,"callreadonlyfunction":0.0019230769230769232,"standardprincipalcv":0.0019230769230769232,"transactions":0.0019230769230769232,"const":0.0019230769230769232,"senderaddress":0.0019230769230769232,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.0019230769230769232,"contractaddress":0.0019230769230769232,"contractname":0.0019230769230769232,"functionname":0.0019230769230769232,"functionargs":0.0019230769230769232,"await":0.0019230769230769232,"similar":0.0019230769230769232,"pattern":0.0019230769230769232,"above":0.0019230769230769232,"show":0.0019230769230769232,"hide":0.0019230769230769232,"based":0.0019230769230769232,"keyholdings":0.0019230769230769232,"exchange":0.0019230769230769232,"search":0.0019230769230769232,"displaying":0.0019230769230769232,"_":0.0019230769230769232,"note":0.0019230769230769232,"planning":0.0019230769230769232,"experiment":0.0019230769230769232,"devnet":0.0019230769230769232,"deploy":0.0019230769230769232,"guides":0.0019230769230769232,"run-a-local-devnet":0.0019230769230769232,"leather":0.0019230769230769232,"wallet":0.0019230769230769232,"io":0.0019230769230769232,"install-extension":0.0019230769230769232,"advanced":0.0019230769230769232,"message":0.0019230769230769232,"signature":0.0019230769230769232,"further":0.0019230769230769232,"enhance":0.0019230769230769232,"security":0.0019230769230769232,"authenticity":0.0019230769230769232,"app":0.0019230769230769232,"try":0.0019230769230769232,"implemement":0.0019230769230769232,"_login_":0.0019230769230769232,"feature":0.0019230769230769232,"signing":0.0019230769230769232,"connect":0.0019230769230769232,"sign-messages":0.0019230769230769232,"opensignaturerequestpopup":0.0019230769230769232,"verifymessagesignaturersv":0.0019230769230769232,"encryption":0.0019230769230769232,"stacksmocknet":0.0019230769230769232,"getaddressfrompublickey":0.0019230769230769232,"log":0.0019230769230769232,"chatroom":0.0019230769230769232,"onfinish":0.0019230769230769232,"async":0.0019230769230769232,"publickey":0.0019230769230769232,"verified":0.0019230769230769232,"address":0.0019230769230769232,"version":0.0019230769230769232,"iskeyholder":0.0019230769230769232,"checkiskeyholder":0.0019230769230769232,"signed":0.0019230769230769232,"serve":0.0019230769230769232,"_proof":0.0019230769230769232,"identity_":0.0019230769230769232,"login":0.0019230769230769232,"claim":0.0019230769230769232,"particularly":0.0019230769230769232,"useful":0.0019230769230769232,"allowed":0.0019230769230769232,"send":0.0019230769230769232,"messages":0.0019230769230769232},"72":{"315":0.0072992700729927005,"770":0.0072992700729927005,"2025":0.0072992700729927005,"february":0.0072992700729927005,"create":0.0072992700729927005,"your":0.0072992700729927005,"own":0.0072992700729927005,"recipe":0.0072992700729927005,"for":0.0072992700729927005,"the":0.0072992700729927005,"hiro":0.0072992700729927005,"cookbook":0.0072992700729927005,"that":0.0072992700729927005,"you":0.0072992700729927005,"think":0.0072992700729927005,"will":0.0072992700729927005,"help":0.0072992700729927005,"other":0.0072992700729927005,"developers":0.0072992700729927005,"build":0.0072992700729927005,"on":0.0072992700729927005,"stacks":0.0072992700729927005,"timeline":0.0072992700729927005,"19-25":0.0072992700729927005,"this":0.0072992700729927005,"month's":0.0072992700729927005,"challenge":0.0072992700729927005,"invites":0.0072992700729927005,"to":0.0072992700729927005,"and":0.0072992700729927005,"share":0.0072992700729927005,"it":0.0072992700729927005,"with":0.0072992700729927005,"community":0.0072992700729927005,"each":0.0072992700729927005,"is":0.0072992700729927005,"a":0.0072992700729927005,"reusable":0.0072992700729927005,"code":0.0072992700729927005,"snippet":0.0072992700729927005,"handles":0.0072992700729927005,"some":0.0072992700729927005,"specific":0.0072992700729927005,"function":0.0072992700729927005,"has":0.0072992700729927005,"written":0.0072992700729927005,"annotations":0.0072992700729927005,"so":0.0072992700729927005,"readers":0.0072992700729927005,"know":0.0072992700729927005,"exactly":0.0072992700729927005,"how":0.0072992700729927005,"in":0.0072992700729927005,"given":0.0072992700729927005,"works":0.0072992700729927005,"what":0.0072992700729927005,"parameters":0.0072992700729927005,"can":0.0072992700729927005,"customize":0.0072992700729927005,"submission":0.0072992700729927005,"should":0.0072992700729927005,"be":0.0072992700729927005,"submit":0.0072992700729927005,"project":0.0072992700729927005,"here":0.0072992700729927005,"https":0.0072992700729927005,"hirohacks25":0.0072992700729927005,"paperform":0.0072992700729927005,"co":0.0072992700729927005,"iframe":0.0072992700729927005,"width":0.0072992700729927005,"height":0.0072992700729927005,"src":0.0072992700729927005,"www":0.0072992700729927005,"youtube":0.0072992700729927005,"com":0.0072992700729927005,"embed":0.0072992700729927005,"z9ulvhygkce":0.0072992700729927005,"title":0.0072992700729927005,"hacks":0.0072992700729927005,"allow":0.0072992700729927005,"accelerometer":0.0072992700729927005,"autoplay":0.0072992700729927005,"clipboard-write":0.0072992700729927005,"encrypted-media":0.0072992700729927005,"gyroscope":0.0072992700729927005,"picture-in-picture":0.0072992700729927005,"web-share":0.0072992700729927005,"referrerpolicy":0.0072992700729927005,"strict-origin-when-cross-origin":0.0072992700729927005,"allowfullscreen":0.0072992700729927005,"example":0.0072992700729927005,"ideas":0.0072992700729927005,"explore":0.0072992700729927005,"-":0.0072992700729927005,"using":0.0072992700729927005,"cl":0.0072992700729927005,"parse":0.0072992700729927005,"helper":0.0072992700729927005,"convert":0.0072992700729927005,"string":0.0072992700729927005,"values":0.0072992700729927005,"into":0.0072992700729927005,"clarity":0.0072992700729927005,"creating":0.0072992700729927005,"signing":0.0072992700729927005,"message":0.0072992700729927005,"smart":0.0072992700729927005,"contract":0.0072992700729927005,"verification":0.0072992700729927005,"construct":0.0072992700729927005,"non-sequential":0.0072992700729927005,"multisig":0.0072992700729927005,"transaction":0.0072992700729927005,"determine":0.0072992700729927005,"if":0.0072992700729927005,"been":0.0072992700729927005,"signed":0.0072992700729927005,"_for":0.0072992700729927005,"provide":0.0072992700729927005,"link":0.0072992700729927005,"pr":0.0072992700729927005,"recipes":0.0072992700729927005,"github":0.0072992700729927005,"hirosystems":0.0072992700729927005,"repo":0.0072992700729927005,"review":0.0072992700729927005,"general":0.0072992700729927005,"guidelines":0.0072992700729927005,"see":0.0072992700729927005,"page":0.0072992700729927005,"_":0.0072992700729927005,"---":0.0072992700729927005,"resources":0.0072992700729927005,"form":0.0072992700729927005,"discord":0.0072992700729927005,"chat":0.0072992700729927005},"73":{"import":0.004651162790697674,"code":0.004651162790697674,"from":0.004651162790697674,"'lucide-react'":0.004651162790697674,"secondarycard":0.004651162790697674,"'":0.004651162790697674,"components":0.004651162790697674,"card'":0.004651162790697674,"hiro":0.004651162790697674,"hacks":0.004651162790697674,"are":0.004651162790697674,"monthly":0.004651162790697674,"hackathons":0.004651162790697674,"designed":0.004651162790697674,"to":0.004651162790697674,"bring":0.004651162790697674,"together":0.004651162790697674,"the":0.004651162790697674,"most":0.004651162790697674,"innovative":0.004651162790697674,"builders":0.004651162790697674,"in":0.004651162790697674,"stacks":0.004651162790697674,"ecosystem":0.004651162790697674,"each":0.004651162790697674,"month":0.004651162790697674,"features":0.004651162790697674,"a":0.004651162790697674,"unique":0.004651162790697674,"theme":0.004651162790697674,"challenging":0.004651162790697674,"you":0.004651162790697674,"stretch":0.004651162790697674,"your":0.004651162790697674,"creativity":0.004651162790697674,"show":0.004651162790697674,"off":0.004651162790697674,"skills":0.004651162790697674,"and":0.004651162790697674,"learn":0.004651162790697674,"other":0.004651162790697674,"devs":0.004651162790697674,"process":0.004651162790697674,"have":0.004651162790697674,"fun":0.004651162790697674,"build":0.004651162790697674,"something":0.004651162790697674,"new":0.004651162790697674,"compete":0.004651162790697674,"against":0.004651162790697674,"for":0.004651162790697674,"swag":0.004651162790697674,"seat":0.004651162790697674,"hacker":0.004651162790697674,"house":0.004651162790697674,"prizes":0.004651162790697674,"coming":0.004651162790697674,"later":0.004651162790697674,"this":0.004651162790697674,"year":0.004651162790697674,"submit":0.004651162790697674,"projects":0.004651162790697674,"complete":0.004651162790697674,"form":0.004651162790697674,"https":0.004651162790697674,"hirohacks25":0.004651162790697674,"paperform":0.004651162790697674,"co":0.004651162790697674,"before":0.004651162790697674,"midnight":0.004651162790697674,"et":0.004651162790697674,"on":0.004651162790697674,"last":0.004651162790697674,"day":0.004651162790697674,"of":0.004651162790697674,"that":0.004651162790697674,"month's":0.004651162790697674,"hack":0.004651162790697674,"schedule":0.004651162790697674,"week":0.004651162790697674,"description":0.004651162790697674,"---":0.004651162790697674,"jan":0.004651162790697674,"22-28":0.004651162790697674,"ai":0.004651162790697674,"x":0.004651162790697674,"archive":0.004651162790697674,"combines":0.004651162790697674,"capabilities":0.004651162790697674,"with":0.004651162790697674,"feb":0.004651162790697674,"19-25":0.004651162790697674,"create":0.004651162790697674,"own":0.004651162790697674,"recipe":0.004651162790697674,"recipes":0.004651162790697674,"cookbook":0.004651162790697674,"share":0.004651162790697674,"it":0.004651162790697674,"community":0.004651162790697674,"mar":0.004651162790697674,"tba":0.004651162790697674,"soon":0.004651162790697674,"apr":0.004651162790697674,"23-29":0.004651162790697674,"may":0.004651162790697674,"21-27":0.004651162790697674,"jun":0.004651162790697674,"18-24":0.004651162790697674,"at":0.004651162790697674,"end":0.004651162790697674,"will":0.004651162790697674,"host":0.004651162790697674,"livestream":0.004651162790697674,"going":0.004651162790697674,"over":0.004651162790697674,"submissions":0.004651162790697674,"announcing":0.004651162790697674,"winning":0.004651162790697674,"developer":0.004651162790697674,"prize":0.004651162790697674,"fame":0.004651162790697674,"glory":0.004651162790697674,"top":0.004651162790697674,"developers":0.004651162790697674,"these":0.004651162790697674,"be":0.004651162790697674,"invited":0.004651162790697674,"participate":0.004651162790697674,"tied":0.004651162790697674,"one":0.004651162790697674,"year's":0.004651162790697674,"biggest":0.004651162790697674,"conferences":0.004651162790697674,"key":0.004651162790697674,"expenses":0.004651162790697674,"covered":0.004651162790697674,"we'll":0.004651162790697674,"more":0.004651162790697674,"details":0.004651162790697674,"so":0.004651162790697674,"stay":0.004651162790697674,"tuned":0.004651162790697674,"resources":0.004651162790697674,"need":0.004651162790697674,"help":0.004651162790697674,"hacking":0.004651162790697674,"project":0.004651162790697674,"join":0.004651162790697674,"discord":0.004651162790697674,"chat":0.004651162790697674,"get":0.004651162790697674,"builder-general":0.004651162790697674,"channel":0.004651162790697674,"if":0.004651162790697674,"you're":0.004651162790697674,"having":0.004651162790697674,"problems":0.004651162790697674,"using":0.004651162790697674,"tools":0.004651162790697674,"can":0.004651162790697674,"also":0.004651162790697674,"reach":0.004651162790697674,"out":0.004651162790697674,"our":0.004651162790697674,"team":0.004651162790697674,"relevant":0.004651162790697674,"tool":0.004651162790697674,"section":0.004651162790697674,"don't":0.004651162790697674,"forget":0.004651162790697674,"take":0.004651162790697674,"advantage":0.004651162790697674,"all":0.004651162790697674,"docs":0.004651162790697674,"as":0.004651162790697674,"well":0.004651162790697674,"rules":0.004651162790697674,"eligible":0.004651162790697674,"must":0.004651162790697674,"through":0.004651162790697674,"submission":0.004651162790697674,"we":0.004651162790697674,"expect":0.004651162790697674,"see":0.004651162790697674,"-":0.004651162790697674,"link":0.004651162790697674,"applicable":0.004651162790697674,"clear":0.004651162790697674,"readme":0.004651162790697674,"or":0.004651162790697674,"pr":0.004651162790697674,"submitting":0.004651162790697674,"covers":0.004651162790697674,"problem":0.004651162790697674,"being":0.004651162790697674,"solved":0.004651162790697674,"technical":0.004651162790697674,"approach":0.004651162790697674,"future":0.004651162790697674,"improvements":0.004651162790697674,"terms":0.004651162790697674,"selecting":0.004651162790697674,"winners":0.004651162790697674,"evaluated":0.004651162790697674,"their":0.004651162790697674,"implementation":0.004651162790697674,"innovation":0.004651162790697674,"documentation":0.004651162790697674,"presentation":0.004651162790697674,"about":0.004651162790697674,"read":0.004651162790697674,"conditions":0.004651162790697674,"www":0.004651162790697674,"hiro-hacks-rules":0.004651162790697674},"74":{"import":0.009174311926605505,"link":0.009174311926605505,"from":0.009174311926605505,"next":0.009174311926605505,"button":0.009174311926605505,"components":0.009174311926605505,"ui":0.009174311926605505,"the":0.009174311926605505,"stacks":0.009174311926605505,"explorer":0.009174311926605505,"lets":0.009174311926605505,"you":0.009174311926605505,"explore":0.009174311926605505,"on-chain":0.009174311926605505,"data":0.009174311926605505,"troubleshoot":0.009174311926605505,"pending":0.009174311926605505,"transactions":0.009174311926605505,"edit":0.009174311926605505,"and":0.009174311926605505,"deploy":0.009174311926605505,"contracts":0.009174311926605505,"via":0.009174311926605505,"sandbox":0.009174311926605505,"discover":0.009174311926605505,"new":0.009174311926605505,"tokens":0.009174311926605505,"more":0.009174311926605505,"we":0.009174311926605505,"maintain":0.009174311926605505,"support":0.009174311926605505,"https":0.009174311926605505,"hiro":0.009174311926605505,"so":0.009174311926605505,"as":0.009174311926605505,"a":0.009174311926605505,"service":0.009174311926605505,"for":0.009174311926605505,"community":0.009174311926605505,"but":0.009174311926605505,"can":0.009174311926605505,"also":0.009174311926605505,"run":0.009174311926605505,"your":0.009174311926605505,"own":0.009174311926605505,"instance":0.009174311926605505,"of":0.009174311926605505,"div":0.009174311926605505,"classname":0.009174311926605505,"flex":0.009174311926605505,"gap-4":0.009174311926605505,"bg-orange-500":0.009174311926605505,"hover":0.009174311926605505,"bg-orange-600":0.009174311926605505,"href":0.009174311926605505,"target":0.009174311926605505,"_blank":0.009174311926605505,"no-underline":0.009174311926605505,"view":0.009174311926605505,"variant":0.009174311926605505,"outline":0.009174311926605505,"guides":0.009174311926605505,"build-explorer":0.009174311926605505,"set":0.009174311926605505,"up":0.009174311926605505,"related":0.009174311926605505,"tools":0.009174311926605505,"-":0.009174311926605505,"blockchain":0.009174311926605505,"api":0.009174311926605505,"looking":0.009174311926605505,"without":0.009174311926605505,"front":0.009174311926605505,"end":0.009174311926605505,"leverage":0.009174311926605505,"ordinals":0.009174311926605505,"bitcoin":0.009174311926605505,"brc-20":0.009174311926605505,"---":0.009174311926605505,"need":0.009174311926605505,"help":0.009174311926605505,"building":0.009174311926605505,"with":0.009174311926605505,"reach":0.009174311926605505,"out":0.009174311926605505,"to":0.009174311926605505,"us":0.009174311926605505,"on":0.009174311926605505,"stacks-explorer":0.009174311926605505,"channel":0.009174311926605505,"discord":0.009174311926605505,"under":0.009174311926605505,"developer":0.009174311926605505,"section":0.009174311926605505,"chat":0.009174311926605505,"there":0.009174311926605505,"s":0.009174311926605505,"weekly":0.009174311926605505,"office":0.009174311926605505,"hours":0.009174311926605505,"events":0.009174311926605505,"co":0.009174311926605505,"event":0.009174311926605505,"hd16484710":0.009174311926605505,"every":0.009174311926605505,"thursday":0.009174311926605505,"at":0.009174311926605505,"11am":0.009174311926605505,"et":0.009174311926605505},"75":{"the":0.009523809523809525,"stacks":0.009523809523809525,"explorer":0.009523809523809525,"frontend":0.009523809523809525,"user":0.009523809523809525,"interface":0.009523809523809525,"is":0.009523809523809525,"built":0.009523809523809525,"with":0.009523809523809525,"react":0.009523809523809525,"https":0.009523809523809525,"reactjs":0.009523809523809525,"org":0.009523809523809525,"next":0.009523809523809525,"js":0.009523809523809525,"github":0.009523809523809525,"com":0.009523809523809525,"vercel":0.009523809523809525,"and":0.009523809523809525,"ui":0.009523809523809525,"hirosystems":0.009523809523809525,"before":0.009523809523809525,"you":0.009523809523809525,"can":0.009523809523809525,"run":0.009523809523809525,"on":0.009523809523809525,"your":0.009523809523809525,"machine":0.009523809523809525,"locally":0.009523809523809525,"must":0.009523809523809525,"first":0.009523809523809525,"clone":0.009523809523809525,"repository":0.009523809523809525,"to":0.009523809523809525,"obtain":0.009523809523809525,"all":0.009523809523809525,"of":0.009523809523809525,"necessary":0.009523809523809525,"files":0.009523809523809525,"libraries":0.009523809523809525,"needed":0.009523809523809525,"project":0.009523809523809525,"dependencies":0.009523809523809525,"once":0.009523809523809525,"have":0.009523809523809525,"cloned":0.009523809523809525,"repositories":0.009523809523809525,"will":0.009523809523809525,"need":0.009523809523809525,"install":0.009523809523809525,"following":0.009523809523809525,"-":0.009523809523809525,"nodejs":0.009523809523809525,"dev":0.009523809523809525,"en":0.009523809523809525,"that":0.009523809523809525,"includes":0.009523809523809525,"npm":0.009523809523809525,"pnpm":0.009523809523809525,"io":0.009523809523809525,"installation":0.009523809523809525,"homebrew":0.009523809523809525,"brew":0.009523809523809525,"sh":0.009523809523809525,"_note":0.009523809523809525,"_":0.009523809523809525,"although":0.009523809523809525,"not":0.009523809523809525,"required":0.009523809523809525,"operate":0.009523809523809525,"it":0.009523809523809525,"highly":0.009523809523809525,"recommended":0.009523809523809525,"open":0.009523809523809525,"terminal":0.009523809523809525,"window":0.009523809523809525,"make":0.009523809523809525,"sure":0.009523809523809525,"are":0.009523809523809525,"in":0.009523809523809525,"folder":0.009523809523809525,"below":0.009523809523809525,"command":0.009523809523809525,"i":0.009523809523809525,"after":0.009523809523809525,"installing":0.009523809523809525,"configuring":0.009523809523809525,"environment":0.009523809523809525,"if":0.009523809523809525,"wish":0.009523809523809525,"by":0.009523809523809525,"running":0.009523809523809525,"building":0.009523809523809525,"for":0.009523809523809525,"production":0.009523809523809525,"may":0.009523809523809525,"also":0.009523809523809525,"build":0.009523809523809525,"a":0.009523809523809525,"version":0.009523809523809525,"do":0.009523809523809525,"simply":0.009523809523809525,"note":0.009523809523809525,"default":0.009523809523809525,"task":0.009523809523809525},"76":{"0":0.0044444444444444444,"1":0.0044444444444444444,"2":0.0044444444444444444,"3":0.0044444444444444444,"4":0.0044444444444444444,"1000":0.0044444444444444444,"bit":0.0044444444444444444,"manipulation":0.0044444444444444444,"functions":0.0044444444444444444,"in":0.0044444444444444444,"clarity":0.0044444444444444444,"provide":0.0044444444444444444,"powerful":0.0044444444444444444,"tools":0.0044444444444444444,"for":0.0044444444444444444,"efficient":0.0044444444444444444,"data":0.0044444444444444444,"storage":0.0044444444444444444,"and":0.0044444444444444444,"flag":0.0044444444444444444,"management":0.0044444444444444444,"smart":0.0044444444444444444,"contracts":0.0044444444444444444,"these":0.0044444444444444444,"allow":0.0044444444444444444,"developers":0.0044444444444444444,"to":0.0044444444444444444,"pack":0.0044444444444444444,"multiple":0.0044444444444444444,"pieces":0.0044444444444444444,"of":0.0044444444444444444,"information":0.0044444444444444444,"into":0.0044444444444444444,"a":0.0044444444444444444,"single":0.0044444444444444444,"integer":0.0044444444444444444,"saving":0.0044444444444444444,"space":0.0044444444444444444,"potentially":0.0044444444444444444,"reducing":0.0044444444444444444,"gas":0.0044444444444444444,"costs":0.0044444444444444444,"why":0.0044444444444444444,"matter":0.0044444444444444444,"clarity's":0.0044444444444444444,"are":0.0044444444444444444,"designed":0.0044444444444444444,"with":0.0044444444444444444,"several":0.0044444444444444444,"important":0.0044444444444444444,"considerations":0.0044444444444444444,"mind":0.0044444444444444444,"efficiency":0.0044444444444444444,"they":0.0044444444444444444,"compact":0.0044444444444444444,"contract":0.0044444444444444444,"versatility":0.0044444444444444444,"enable":0.0044444444444444444,"the":0.0044444444444444444,"implementation":0.0044444444444444444,"bitfields":0.0044444444444444444,"flags":0.0044444444444444444,"other":0.0044444444444444444,"low-level":0.0044444444444444444,"structures":0.0044444444444444444,"performance":0.0044444444444444444,"operations":0.0044444444444444444,"generally":0.0044444444444444444,"faster":0.0044444444444444444,"than":0.0044444444444444444,"higher-level":0.0044444444444444444,"manipulations":0.0044444444444444444,"interoperability":0.0044444444444444444,"facilitate":0.0044444444444444444,"working":0.0044444444444444444,"from":0.0044444444444444444,"systems":0.0044444444444444444,"that":0.0044444444444444444,"use":0.0044444444444444444,"bitwise":0.0044444444444444444,"representations":0.0044444444444444444,"core":0.0044444444444444444,"bit-and":0.0044444444444444444,"what":0.0044444444444444444,"performs":0.0044444444444444444,"operation":0.0044444444444444444,"on":0.0044444444444444444,"two":0.0044444444444444444,"or":0.0044444444444444444,"more":0.0044444444444444444,"integers":0.0044444444444444444,"useful":0.0044444444444444444,"checking":0.0044444444444444444,"if":0.0044444444444444444,"specific":0.0044444444444444444,"bits":0.0044444444444444444,"set":0.0044444444444444444,"clearing":0.0044444444444444444,"certain":0.0044444444444444444,"when":0.0044444444444444444,"you":0.0044444444444444444,"need":0.0044444444444444444,"isolate":0.0044444444444444444,"apply":0.0044444444444444444,"bitmask":0.0044444444444444444,"how":0.0044444444444444444,"i1":0.0044444444444444444,"i2":0.0044444444444444444,"best":0.0044444444444444444,"practices":0.0044444444444444444,"-":0.0044444444444444444,"check":0.0044444444444444444,"is":0.0044444444444444444,"bitfield":0.0044444444444444444,"combine":0.0044444444444444444,"bit-or":0.0044444444444444444,"complex":0.0044444444444444444,"example":0.0044444444444444444,"case":0.0044444444444444444,"user":0.0044444444444444444,"has":0.0044444444444444444,"permission":0.0044444444444444444,"system":0.0044444444444444444,"define-constant":0.0044444444444444444,"permission_read":0.0044444444444444444,"u1":0.0044444444444444444,"0001":0.0044444444444444444,"permission_write":0.0044444444444444444,"u2":0.0044444444444444444,"0010":0.0044444444444444444,"permission_exec":0.0044444444444444444,"u4":0.0044444444444444444,"0100":0.0044444444444444444,"define-public":0.0044444444444444444,"has-permission":0.0044444444444444444,"user-permissions":0.0044444444444444444,"uint":0.0044444444444444444,"required-permission":0.0044444444444444444,"is-eq":0.0044444444444444444,"usage":0.0044444444444444444,"u3":0.0044444444444444444,"returns":0.0044444444444444444,"true":0.0044444444444444444,"false":0.0044444444444444444,"setting":0.0044444444444444444,"combining":0.0044444444444444444,"add":0.0044444444444444444,"new":0.0044444444444444444,"permissions":0.0044444444444444444,"an":0.0044444444444444444,"existing":0.0044444444444444444,"adding":0.0044444444444444444,"user's":0.0044444444444444444,"add-permission":0.0044444444444444444,"current-permissions":0.0044444444444444444,"new-permission":0.0044444444444444444,"ok":0.0044444444444444444,"u7":0.0044444444444444444,"bit-not":0.0044444444444444444,"not":0.0044444444444444444,"inverting":0.0044444444444444444,"all":0.0044444444444444444,"value":0.0044444444444444444,"flip":0.0044444444444444444,"create":0.0044444444444444444,"carefully":0.0044444444444444444,"signed":0.0044444444444444444,"as":0.0044444444444444444,"it":0.0044444444444444444,"affects":0.0044444444444444444,"sign":0.0044444444444444444,"clear":0.0044444444444444444,"creating":0.0044444444444444444,"remove-permission":0.0044444444444444444,"permission-to-remove":0.0044444444444444444,"u5":0.0044444444444444444,"practical":0.0044444444444444444,"profile":0.0044444444444444444,"let's":0.0044444444444444444,"implement":0.0044444444444444444,"stores":0.0044444444444444444,"settings":0.0044444444444444444,"using":0.0044444444444444444,"setting_newsletter":0.0044444444444444444,"setting_2fa":0.0044444444444444444,"setting_private_profile":0.0044444444444444444,"setting_dark_mode":0.0044444444444444444,"u8":0.0044444444444444444,"define-map":0.0044444444444444444,"user-settings":0.0044444444444444444,"principal":0.0044444444444444444,"update-setting":0.0044444444444444444,"enabled":0.0044444444444444444,"bool":0.0044444444444444444,"let":0.0044444444444444444,"current-settings":0.0044444444444444444,"default-to":0.0044444444444444444,"u0":0.0044444444444444444,"map-get":0.0044444444444444444,"tx-sender":0.0044444444444444444,"map-set":0.0044444444444444444,"define-read-only":0.0044444444444444444,"has-setting":0.0044444444444444444,"get-all-settings":0.0044444444444444444,"this":0.0044444444444444444,"demonstrates":0.0044444444444444444,"constants":0.0044444444444444444,"define":0.0044444444444444444,"individual":0.0044444444444444444,"updating":0.0044444444444444444,"storing":0.0044444444444444444,"compactly":0.0044444444444444444,"conclusion":0.0044444444444444444,"by":0.0044444444444444444,"understanding":0.0044444444444444444,"can":0.0044444444444444444,"storage-efficient":0.0044444444444444444,"ease":0.0044444444444444444,"always":0.0044444444444444444,"consider":0.0044444444444444444,"trade-off":0.0044444444444444444,"between":0.0044444444444444444,"code":0.0044444444444444444,"readability":0.0044444444444444444,"techniques":0.0044444444444444444},"77":{"1":0.0037174721189591076,"2":0.0037174721189591076,"3":0.0037174721189591076,"4":0.0037174721189591076,"5":0.0037174721189591076,"10":0.0037174721189591076,"30":0.0037174721189591076,"1000":0.0037174721189591076,"smart":0.0037174721189591076,"contracts":0.0037174721189591076,"often":0.0037174721189591076,"need":0.0037174721189591076,"to":0.0037174721189591076,"perform":0.0037174721189591076,"calculations":0.0037174721189591076,"whether":0.0037174721189591076,"it's":0.0037174721189591076,"for":0.0037174721189591076,"token":0.0037174721189591076,"balances":0.0037174721189591076,"voting":0.0037174721189591076,"weights":0.0037174721189591076,"or":0.0037174721189591076,"complex":0.0037174721189591076,"financial":0.0037174721189591076,"operations":0.0037174721189591076,"understanding":0.0037174721189591076,"clarity's":0.0037174721189591076,"arithmetic":0.0037174721189591076,"functions":0.0037174721189591076,"is":0.0037174721189591076,"crucial":0.0037174721189591076,"implementing":0.0037174721189591076,"these":0.0037174721189591076,"features":0.0037174721189591076,"efficiently":0.0037174721189591076,"and":0.0037174721189591076,"securely":0.0037174721189591076,"why":0.0037174721189591076,"matter":0.0037174721189591076,"are":0.0037174721189591076,"designed":0.0037174721189591076,"with":0.0037174721189591076,"blockchain-specific":0.0037174721189591076,"considerations":0.0037174721189591076,"in":0.0037174721189591076,"mind":0.0037174721189591076,"overflow":0.0037174721189591076,"protection":0.0037174721189591076,"unlike":0.0037174721189591076,"some":0.0037174721189591076,"languages":0.0037174721189591076,"clarity":0.0037174721189591076,"prevents":0.0037174721189591076,"integer":0.0037174721189591076,"by":0.0037174721189591076,"default":0.0037174721189591076,"enhancing":0.0037174721189591076,"contract":0.0037174721189591076,"security":0.0037174721189591076,"precision":0.0037174721189591076,"uses":0.0037174721189591076,"128-bit":0.0037174721189591076,"integers":0.0037174721189591076,"allowing":0.0037174721189591076,"high-precision":0.0037174721189591076,"applications":0.0037174721189591076,"determinism":0.0037174721189591076,"the":0.0037174721189591076,"behavior":0.0037174721189591076,"of":0.0037174721189591076,"consistent":0.0037174721189591076,"across":0.0037174721189591076,"all":0.0037174721189591076,"nodes":0.0037174721189591076,"ensuring":0.0037174721189591076,"blockchain":0.0037174721189591076,"consensus":0.0037174721189591076,"core":0.0037174721189591076,"addition":0.0037174721189591076,"what":0.0037174721189591076,"adds":0.0037174721189591076,"two":0.0037174721189591076,"more":0.0037174721189591076,"essential":0.0037174721189591076,"involving":0.0037174721189591076,"cumulative":0.0037174721189591076,"values":0.0037174721189591076,"when":0.0037174721189591076,"use":0.0037174721189591076,"you":0.0037174721189591076,"increase":0.0037174721189591076,"combine":0.0037174721189591076,"quantities":0.0037174721189591076,"any":0.0037174721189591076,"additive":0.0037174721189591076,"calculation":0.0037174721189591076,"best":0.0037174721189591076,"practices":0.0037174721189591076,"-":0.0037174721189591076,"consider":0.0037174721189591076,"uint":0.0037174721189591076,"non-negative":0.0037174721189591076,"like":0.0037174721189591076,"amounts":0.0037174721189591076,"example":0.0037174721189591076,"case":0.0037174721189591076,"calculating":0.0037174721189591076,"total":0.0037174721189591076,"rewards":0.0037174721189591076,"a":0.0037174721189591076,"stacking":0.0037174721189591076,"system":0.0037174721189591076,"define-map":0.0037174721189591076,"stackingrewards":0.0037174721189591076,"principal":0.0037174721189591076,"define-public":0.0037174721189591076,"add-stacking-reward":0.0037174721189591076,"stacker":0.0037174721189591076,"newreward":0.0037174721189591076,"let":0.0037174721189591076,"currentrewards":0.0037174721189591076,"default-to":0.0037174721189591076,"u0":0.0037174721189591076,"map-get":0.0037174721189591076,"map-set":0.0037174721189591076,"ok":0.0037174721189591076,"true":0.0037174721189591076,"subtraction":0.0037174721189591076,"subtracts":0.0037174721189591076,"from":0.0037174721189591076,"first":0.0037174721189591076,"argument":0.0037174721189591076,"decreasing":0.0037174721189591076,"finding":0.0037174721189591076,"differences":0.0037174721189591076,"decrease":0.0037174721189591076,"calculate":0.0037174721189591076,"subtractive":0.0037174721189591076,"operation":0.0037174721189591076,"guard":0.0037174721189591076,"against":0.0037174721189591076,"underflow":0.0037174721189591076,"using":0.0037174721189591076,"that":0.0037174721189591076,"shouldn't":0.0037174721189591076,"go":0.0037174721189591076,"negative":0.0037174721189591076,"updating":0.0037174721189591076,"user":0.0037174721189591076,"points":0.0037174721189591076,"userpoints":0.0037174721189591076,"deduct-points":0.0037174721189591076,"amount":0.0037174721189591076,"currentpoints":0.0037174721189591076,"tx-sender":0.0037174721189591076,"asserts":0.0037174721189591076,"err":0.0037174721189591076,"u1":0.0037174721189591076,"define-read-only":0.0037174721189591076,"get-points":0.0037174721189591076,"multiplication":0.0037174721189591076,"multiplies":0.0037174721189591076,"important":0.0037174721189591076,"scaling":0.0037174721189591076,"rates":0.0037174721189591076,"proportions":0.0037174721189591076,"scale":0.0037174721189591076,"multiplicative":0.0037174721189591076,"based":0.0037174721189591076,"on":0.0037174721189591076,"duration":0.0037174721189591076,"calculate-rewards":0.0037174721189591076,"days":0.0037174721189591076,"rewardrate":0.0037174721189591076,"u10":0.0037174721189591076,"tokens":0.0037174721189591076,"per":0.0037174721189591076,"day":0.0037174721189591076,"stacked":0.0037174721189591076,"u1000":0.0037174721189591076,"division":0.0037174721189591076,"performs":0.0037174721189591076,"sharing":0.0037174721189591076,"divide":0.0037174721189591076,"zero":0.0037174721189591076,"price":0.0037174721189591076,"item":0.0037174721189591076,"buying":0.0037174721189591076,"bulk":0.0037174721189591076,"calculate-price-per-item":0.0037174721189591076,"totalprice":0.0037174721189591076,"itemcount":0.0037174721189591076,"if":0.0037174721189591076,"order":0.0037174721189591076,"doesn't":0.0037174721189591076,"have":0.0037174721189591076,"operator":0.0037174721189591076,"precedence":0.0037174721189591076,"parentheses":0.0037174721189591076,"explicitly":0.0037174721189591076,"define":0.0037174721189591076,"handling":0.0037174721189591076,"remainders":0.0037174721189591076,"how":0.0037174721189591076,"handle":0.0037174721189591076,"might":0.0037174721189591076,"combination":0.0037174721189591076,"modulo":0.0037174721189591076,"dealing":0.0037174721189591076,"percentages":0.0037174721189591076,"fractions":0.0037174721189591076,"up":0.0037174721189591076,"your":0.0037174721189591076,"numbers":0.0037174721189591076,"maintain":0.0037174721189591076,"guarding":0.0037174721189591076,"always":0.0037174721189591076,"check":0.0037174721189591076,"before":0.0037174721189591076,"performing":0.0037174721189591076,"avoid":0.0037174721189591076,"runtime":0.0037174721189591076,"errors":0.0037174721189591076,"vs":0.0037174721189591076,"int":0.0037174721189591076,"choose":0.0037174721189591076,"can't":0.0037174721189591076,"be":0.0037174721189591076,"possible":0.0037174721189591076,"practical":0.0037174721189591076,"simple":0.0037174721189591076,"interest":0.0037174721189591076,"calculator":0.0037174721189591076,"let's":0.0037174721189591076,"create":0.0037174721189591076,"calculate-interest":0.0037174721189591076,"rate":0.0037174721189591076,"time":0.0037174721189591076,"scaled-rate":0.0037174721189591076,"u100":0.0037174721189591076,"convert":0.0037174721189591076,"percentage":0.0037174721189591076,"decimal":0.0037174721189591076,"u365":0.0037174721189591076,"formula":0.0037174721189591076,"usage":0.0037174721189591076,"at":0.0037174721189591076,"apr":0.0037174721189591076,"u5":0.0037174721189591076,"u30":0.0037174721189591076,"this":0.0037174721189591076,"demonstrates":0.0037174721189591076,"multiple":0.0037174721189591076,"while":0.0037174721189591076,"appropriately":0.0037174721189591076,"conclusion":0.0037174721189591076,"mastering":0.0037174721189591076,"building":0.0037174721189591076,"robust":0.0037174721189591076,"their":0.0037174721189591076,"nuances":0.0037174721189591076,"can":0.0037174721189591076,"implement":0.0037174721189591076,"logic":0.0037174721189591076,"manage":0.0037174721189591076,"economics":0.0037174721189591076,"secure":0.0037174721189591076,"efficient":0.0037174721189591076},"78":{"import":0.01,"code":0.01,"from":0.01,"'lucide-react'":0.01,"secondarycard":0.01,"'":0.01,"components":0.01,"card'":0.01,"callout":0.01,"title":0.01,"new":0.01,"series":0.01,"type":0.01,"info":0.01,"we're":0.01,"introducing":0.01,"a":0.01,"of":0.01,"guides":0.01,"that":0.01,"explore":0.01,"clarity":0.01,"functions":0.01,"in":0.01,"depth":0.01,"focusing":0.01,"on":0.01,"their":0.01,"practical":0.01,"applications":0.01,"blockchain":0.01,"development":0.01,"each":0.01,"page":0.01,"this":0.01,"section":0.01,"covers":0.01,"one":0.01,"or":0.01,"more":0.01,"related":0.01,"explaining":0.01,"purpose":0.01,"demonstrating":0.01,"implementation":0.01,"with":0.01,"samples":0.01,"and":0.01,"discussing":0.01,"best":0.01,"practices":0.01,"ready":0.01,"to":0.01,"enhance":0.01,"your":0.01,"smart":0.01,"contract":0.01,"skills":0.01,"cards":0.01,"href":0.01,"stacks":0.01,"basic-arithmetic":0.01,"arithmetic":0.01,"operations":0.01,"description":0.01,"master":0.01,"basic":0.01,"advanced":0.01,"for":0.01,"precise":0.01,"calculations":0.01,"contracts":0.01,"access-control":0.01,"access":0.01,"control":0.01,"manage":0.01,"permissions":0.01,"handling-optionals-and-errors":0.01,"handling":0.01,"optionals":0.01,"errors":0.01,"safely":0.01,"optional":0.01,"values":0.01,"error":0.01,"cases":0.01,"need":0.01,"help":0.01,"have":0.01,"questions":0.01,"join":0.01,"the":0.01,"discussion":0.01,"channel":0.01,"https":0.01,"chat":0.01,"discord":0.01,"connect":0.01,"other":0.01,"developers":0.01},"79":{"1":0.0038314176245210726,"2":0.0038314176245210726,"3":0.0038314176245210726,"4":0.0038314176245210726,"5":0.0038314176245210726,"map":0.0038314176245210726,"functions":0.0038314176245210726,"in":0.0038314176245210726,"clarity":0.0038314176245210726,"provide":0.0038314176245210726,"powerful":0.0038314176245210726,"tools":0.0038314176245210726,"for":0.0038314176245210726,"efficient":0.0038314176245210726,"data":0.0038314176245210726,"storage":0.0038314176245210726,"and":0.0038314176245210726,"retrieval":0.0038314176245210726,"smart":0.0038314176245210726,"contracts":0.0038314176245210726,"these":0.0038314176245210726,"allow":0.0038314176245210726,"developers":0.0038314176245210726,"to":0.0038314176245210726,"create":0.0038314176245210726,"key-value":0.0038314176245210726,"stores":0.0038314176245210726,"that":0.0038314176245210726,"can":0.0038314176245210726,"be":0.0038314176245210726,"used":0.0038314176245210726,"maintain":0.0038314176245210726,"complex":0.0038314176245210726,"state":0.0038314176245210726,"a":0.0038314176245210726,"gas-efficient":0.0038314176245210726,"manner":0.0038314176245210726,"why":0.0038314176245210726,"matter":0.0038314176245210726,"clarity's":0.0038314176245210726,"are":0.0038314176245210726,"designed":0.0038314176245210726,"with":0.0038314176245210726,"blockchain-specific":0.0038314176245210726,"considerations":0.0038314176245210726,"mind":0.0038314176245210726,"efficiency":0.0038314176245210726,"maps":0.0038314176245210726,"o":0.0038314176245210726,"lookup":0.0038314176245210726,"time":0.0038314176245210726,"making":0.0038314176245210726,"them":0.0038314176245210726,"ideal":0.0038314176245210726,"storing":0.0038314176245210726,"retrieving":0.0038314176245210726,"flexibility":0.0038314176245210726,"they":0.0038314176245210726,"structures":0.0038314176245210726,"stored":0.0038314176245210726,"accessed":0.0038314176245210726,"easily":0.0038314176245210726,"gas":0.0038314176245210726,"optimization":0.0038314176245210726,"using":0.0038314176245210726,"significantly":0.0038314176245210726,"reduce":0.0038314176245210726,"costs":0.0038314176245210726,"compared":0.0038314176245210726,"other":0.0038314176245210726,"methods":0.0038314176245210726,"management":0.0038314176245210726,"crucial":0.0038314176245210726,"maintaining":0.0038314176245210726,"contract":0.0038314176245210726,"across":0.0038314176245210726,"multiple":0.0038314176245210726,"transactions":0.0038314176245210726,"scalability":0.0038314176245210726,"enable":0.0038314176245210726,"handle":0.0038314176245210726,"large":0.0038314176245210726,"amounts":0.0038314176245210726,"of":0.0038314176245210726,"without":0.0038314176245210726,"significant":0.0038314176245210726,"performance":0.0038314176245210726,"degradation":0.0038314176245210726,"core":0.0038314176245210726,"define-map":0.0038314176245210726,"what":0.0038314176245210726,"defines":0.0038314176245210726,"new":0.0038314176245210726,"specified":0.0038314176245210726,"key":0.0038314176245210726,"value":0.0038314176245210726,"type":0.0038314176245210726,"essential":0.0038314176245210726,"creating":0.0038314176245210726,"structured":0.0038314176245210726,"your":0.0038314176245210726,"when":0.0038314176245210726,"use":0.0038314176245210726,"you":0.0038314176245210726,"need":0.0038314176245210726,"store":0.0038314176245210726,"retrieve":0.0038314176245210726,"associated":0.0038314176245210726,"unique":0.0038314176245210726,"keys":0.0038314176245210726,"how":0.0038314176245210726,"map-name":0.0038314176245210726,"key-type":0.0038314176245210726,"value-type":0.0038314176245210726,"best":0.0038314176245210726,"practices":0.0038314176245210726,"-":0.0038314176245210726,"choose":0.0038314176245210726,"appropriate":0.0038314176245210726,"types":0.0038314176245210726,"represent":0.0038314176245210726,"efficiently":0.0038314176245210726,"consider":0.0038314176245210726,"composite":0.0038314176245210726,"tuples":0.0038314176245210726,"more":0.0038314176245210726,"relationships":0.0038314176245210726,"example":0.0038314176245210726,"case":0.0038314176245210726,"user":0.0038314176245210726,"balance":0.0038314176245210726,"tracker":0.0038314176245210726,"user-balances":0.0038314176245210726,"principal":0.0038314176245210726,"uint":0.0038314176245210726,"map-set":0.0038314176245210726,"sets":0.0038314176245210726,"the":0.0038314176245210726,"given":0.0038314176245210726,"allows":0.0038314176245210726,"updating":0.0038314176245210726,"or":0.0038314176245210726,"inserting":0.0038314176245210726,"into":0.0038314176245210726,"update":0.0038314176245210726,"always":0.0038314176245210726,"check":0.0038314176245210726,"if":0.0038314176245210726,"exists":0.0038314176245210726,"before":0.0038314176245210726,"avoid":0.0038314176245210726,"unintended":0.0038314176245210726,"overwrites":0.0038314176245210726,"conjunction":0.0038314176245210726,"access":0.0038314176245210726,"controls":0.0038314176245210726,"user's":0.0038314176245210726,"define-public":0.0038314176245210726,"update-balance":0.0038314176245210726,"new-balance":0.0038314176245210726,"begin":0.0038314176245210726,"asserts":0.0038314176245210726,"is-eq":0.0038314176245210726,"tx-sender":0.0038314176245210726,"err":0.0038314176245210726,"u1":0.0038314176245210726,"ok":0.0038314176245210726,"map-get":0.0038314176245210726,"retrieves":0.0038314176245210726,"reading":0.0038314176245210726,"from":0.0038314176245210726,"based":0.0038314176245210726,"on":0.0038314176245210726,"where":0.0038314176245210726,"might":0.0038314176245210726,"not":0.0038314176245210726,"exist":0.0038314176245210726,"returns":0.0038314176245210726,"none":0.0038314176245210726,"unwrap":0.0038314176245210726,"unwrap-panic":0.0038314176245210726,"you're":0.0038314176245210726,"certain":0.0038314176245210726,"define-read-only":0.0038314176245210726,"get-balance":0.0038314176245210726,"default-to":0.0038314176245210726,"u0":0.0038314176245210726,"map-delete":0.0038314176245210726,"removes":0.0038314176245210726,"entry":0.0038314176245210726,"removing":0.0038314176245210726,"it's":0.0038314176245210726,"no":0.0038314176245210726,"longer":0.0038314176245210726,"needed":0.0038314176245210726,"delete":0.0038314176245210726,"cautious":0.0038314176245210726,"deleting":0.0038314176245210726,"as":0.0038314176245210726,"it":0.0038314176245210726,"can't":0.0038314176245210726,"recovered":0.0038314176245210726,"once":0.0038314176245210726,"deleted":0.0038314176245210726,"soft":0.0038314176245210726,"approach":0.0038314176245210726,"referenced":0.0038314176245210726,"later":0.0038314176245210726,"account":0.0038314176245210726,"delete-account":0.0038314176245210726,"practical":0.0038314176245210726,"simple":0.0038314176245210726,"voting":0.0038314176245210726,"system":0.0038314176245210726,"let's":0.0038314176245210726,"implement":0.0038314176245210726,"basic":0.0038314176245210726,"demonstrate":0.0038314176245210726,"their":0.0038314176245210726,"define":0.0038314176245210726,"votes":0.0038314176245210726,"voter":0.0038314176245210726,"registration":0.0038314176245210726,"proposal":0.0038314176245210726,"yes":0.0038314176245210726,"voters":0.0038314176245210726,"bool":0.0038314176245210726,"function":0.0038314176245210726,"register":0.0038314176245210726,"register-voter":0.0038314176245210726,"true":0.0038314176245210726,"cast":0.0038314176245210726,"vote":0.0038314176245210726,"cast-vote":0.0038314176245210726,"let":0.0038314176245210726,"proposal-votes":0.0038314176245210726,"is-some":0.0038314176245210726,"is-none":0.0038314176245210726,"u2":0.0038314176245210726,"merge":0.0038314176245210726,"get":0.0038314176245210726,"count":0.0038314176245210726,"get-votes":0.0038314176245210726,"this":0.0038314176245210726,"demonstrates":0.0038314176245210726,"record":0.0038314176245210726,"counts":0.0038314176245210726,"combining":0.0038314176245210726,"features":0.0038314176245210726,"complete":0.0038314176245210726,"conclusion":0.0038314176245210726,"way":0.0038314176245210726,"by":0.0038314176245210726,"understanding":0.0038314176245210726,"scalable":0.0038314176245210726,"gas-optimized":0.0038314176245210726,"specific":0.0038314176245210726,"requirements":0.0038314176245210726,"application":0.0038314176245210726,"designing":0.0038314176245210726,"strategy":0.0038314176245210726},"80":{"1":0.004081632653061225,"2":0.004081632653061225,"3":0.004081632653061225,"4":0.004081632653061225,"5":0.004081632653061225,"32":0.004081632653061225,"33":0.004081632653061225,"65":0.004081632653061225,"cryptographic":0.004081632653061225,"functions":0.004081632653061225,"are":0.004081632653061225,"essential":0.004081632653061225,"in":0.004081632653061225,"blockchain":0.004081632653061225,"smart":0.004081632653061225,"contracts":0.004081632653061225,"for":0.004081632653061225,"ensuring":0.004081632653061225,"data":0.004081632653061225,"integrity":0.004081632653061225,"creating":0.004081632653061225,"secure":0.004081632653061225,"hashes":0.004081632653061225,"and":0.004081632653061225,"verifying":0.004081632653061225,"signatures":0.004081632653061225,"clarity":0.004081632653061225,"provides":0.004081632653061225,"several":0.004081632653061225,"built-in":0.004081632653061225,"that":0.004081632653061225,"crucial":0.004081632653061225,"these":0.004081632653061225,"purposes":0.004081632653061225,"why":0.004081632653061225,"matter":0.004081632653061225,"clarity's":0.004081632653061225,"designed":0.004081632653061225,"with":0.004081632653061225,"blockchain-specific":0.004081632653061225,"considerations":0.004081632653061225,"mind":0.004081632653061225,"security":0.004081632653061225,"provide":0.004081632653061225,"primitives":0.004081632653061225,"building":0.004081632653061225,"they":0.004081632653061225,"allow":0.004081632653061225,"the":0.004081632653061225,"creation":0.004081632653061225,"verification":0.004081632653061225,"of":0.004081632653061225,"unique":0.004081632653061225,"identifiers":0.004081632653061225,"hasn't":0.004081632653061225,"been":0.004081632653061225,"tampered":0.004081632653061225,"authentication":0.004081632653061225,"enable":0.004081632653061225,"signature":0.004081632653061225,"authenticating":0.004081632653061225,"transactions":0.004081632653061225,"messages":0.004081632653061225,"determinism":0.004081632653061225,"behavior":0.004081632653061225,"is":0.004081632653061225,"consistent":0.004081632653061225,"across":0.004081632653061225,"all":0.004081632653061225,"nodes":0.004081632653061225,"consensus":0.004081632653061225,"interoperability":0.004081632653061225,"some":0.004081632653061225,"like":0.004081632653061225,"keccak256":0.004081632653061225,"compatibility":0.004081632653061225,"other":0.004081632653061225,"systems":0.004081632653061225,"core":0.004081632653061225,"sha256":0.004081632653061225,"what":0.004081632653061225,"computes":0.004081632653061225,"hash":0.004081632653061225,"input":0.004081632653061225,"widely":0.004081632653061225,"used":0.004081632653061225,"fixed-size":0.004081632653061225,"representations":0.004081632653061225,"checks":0.004081632653061225,"when":0.004081632653061225,"use":0.004081632653061225,"you":0.004081632653061225,"need":0.004081632653061225,"to":0.004081632653061225,"create":0.004081632653061225,"a":0.004081632653061225,"identifier":0.004081632653061225,"or":0.004081632653061225,"verify":0.004081632653061225,"how":0.004081632653061225,"value":0.004081632653061225,"best":0.004081632653061225,"practices":0.004081632653061225,"-":0.004081632653061225,"combine":0.004081632653061225,"before":0.004081632653061225,"hashing":0.004081632653061225,"prevent":0.004081632653061225,"rainbow":0.004081632653061225,"table":0.004081632653061225,"attacks":0.004081632653061225,"example":0.004081632653061225,"case":0.004081632653061225,"document":0.004081632653061225,"transaction":0.004081632653061225,"define-public":0.004081632653061225,"submit-document-hash":0.004081632653061225,"document-hash":0.004081632653061225,"buff":0.004081632653061225,"let":0.004081632653061225,"user-submission-id":0.004081632653061225,"concat":0.004081632653061225,"tx-sender":0.004081632653061225,"map-set":0.004081632653061225,"document-submissions":0.004081632653061225,"true":0.004081632653061225,"ok":0.004081632653061225,"another":0.004081632653061225,"function":0.004081632653061225,"often":0.004081632653061225,"ethereum-compatible":0.004081632653061225,"ethereum":0.004081632653061225,"needed":0.004081632653061225,"an":0.004081632653061225,"alternative":0.004081632653061225,"required":0.004081632653061225,"not":0.004081632653061225,"suitable":0.004081632653061225,"your":0.004081632653061225,"specific":0.004081632653061225,"be":0.004081632653061225,"aware":0.004081632653061225,"differences":0.004081632653061225,"output":0.004081632653061225,"compared":0.004081632653061225,"address":0.004081632653061225,"define-read-only":0.004081632653061225,"get-eth-address":0.004081632653061225,"public-key":0.004081632653061225,"hashed-key":0.004081632653061225,"unwrap-panic":0.004081632653061225,"secp256k1-recover":0.004081632653061225,"message-hash":0.004081632653061225,"buff-to-hex-string":0.004081632653061225,"slice":0.004081632653061225,"u12":0.004081632653061225,"u32":0.004081632653061225,"recovers":0.004081632653061225,"public":0.004081632653061225,"key":0.004081632653061225,"from":0.004081632653061225,"signed":0.004081632653061225,"message":0.004081632653061225,"without":0.004081632653061225,"needing":0.004081632653061225,"advance":0.004081632653061225,"implementing":0.004081632653061225,"schemes":0.004081632653061225,"especially":0.004081632653061225,"always":0.004081632653061225,"check":0.004081632653061225,"return":0.004081632653061225,"as":0.004081632653061225,"it's":0.004081632653061225,"optional":0.004081632653061225,"type":0.004081632653061225,"combination":0.004081632653061225,"secp256k1-verify":0.004081632653061225,"complete":0.004081632653061225,"decentralized":0.004081632653061225,"voting":0.004081632653061225,"system":0.004081632653061225,"submit-vote":0.004081632653061225,"vote":0.004081632653061225,"uint":0.004081632653061225,"signer":0.004081632653061225,"unwrap":0.004081632653061225,"err":0.004081632653061225,"u1":0.004081632653061225,"asserts":0.004081632653061225,"is-eq":0.004081632653061225,"principal-of":0.004081632653061225,"u2":0.004081632653061225,"votes":0.004081632653061225,"practical":0.004081632653061225,"let's":0.004081632653061225,"implement":0.004081632653061225,"basic":0.004081632653061225,"demonstrates":0.004081632653061225,"this":0.004081632653061225,"will":0.004081632653061225,"users":0.004081632653061225,"submit":0.004081632653061225,"sign":0.004081632653061225,"them":0.004081632653061225,"later":0.004081632653061225,"authenticity":0.004081632653061225,"define":0.004081632653061225,"map":0.004081632653061225,"store":0.004081632653061225,"their":0.004081632653061225,"signers":0.004081632653061225,"define-map":0.004081632653061225,"documents":0.004081632653061225,"doc-hash":0.004081632653061225,"principal":0.004081632653061225,"eth-compatible-hash":0.004081632653061225,"submit-document":0.004081632653061225,"submission-id":0.004081632653061225,"eth-hash":0.004081632653061225,"sign-document":0.004081632653061225,"match":0.004081632653061225,"map-get":0.004081632653061225,"doc-info":0.004081632653061225,"u3":0.004081632653061225,"its":0.004081632653061225,"verify-document":0.004081632653061225,"if":0.004081632653061225,"get":0.004081632653061225,"get-eth-hash":0.004081632653061225,"conclusion":0.004081632653061225,"powerful":0.004081632653061225,"tools":0.004081632653061225,"by":0.004081632653061225,"understanding":0.004081632653061225,"developers":0.004081632653061225,"can":0.004081632653061225,"robust":0.004081632653061225,"maintain":0.004081632653061225,"trustlessness":0.004081632653061225,"applications":0.004081632653061225,"consider":0.004081632653061225,"requirements":0.004081632653061225,"application":0.004081632653061225,"choosing":0.004081632653061225},"81":{"1":0.0036101083032490976,"2":0.0036101083032490976,"3":0.0036101083032490976,"4":0.0036101083032490976,"50":0.0036101083032490976,"principal":0.0036101083032490976,"functions":0.0036101083032490976,"in":0.0036101083032490976,"clarity":0.0036101083032490976,"are":0.0036101083032490976,"essential":0.0036101083032490976,"tools":0.0036101083032490976,"for":0.0036101083032490976,"implementing":0.0036101083032490976,"robust":0.0036101083032490976,"access":0.0036101083032490976,"control":0.0036101083032490976,"and":0.0036101083032490976,"permission":0.0036101083032490976,"management":0.0036101083032490976,"smart":0.0036101083032490976,"contracts":0.0036101083032490976,"these":0.0036101083032490976,"allow":0.0036101083032490976,"you":0.0036101083032490976,"to":0.0036101083032490976,"identify":0.0036101083032490976,"authenticate":0.0036101083032490976,"authorize":0.0036101083032490976,"different":0.0036101083032490976,"entities":0.0036101083032490976,"interacting":0.0036101083032490976,"with":0.0036101083032490976,"the":0.0036101083032490976,"contract":0.0036101083032490976,"ensuring":0.0036101083032490976,"that":0.0036101083032490976,"only":0.0036101083032490976,"right":0.0036101083032490976,"parties":0.0036101083032490976,"can":0.0036101083032490976,"perform":0.0036101083032490976,"specific":0.0036101083032490976,"actions":0.0036101083032490976,"or":0.0036101083032490976,"certain":0.0036101083032490976,"data":0.0036101083032490976,"why":0.0036101083032490976,"matter":0.0036101083032490976,"clarity's":0.0036101083032490976,"designed":0.0036101083032490976,"blockchain-specific":0.0036101083032490976,"considerations":0.0036101083032490976,"mind":0.0036101083032490976,"they":0.0036101083032490976,"users":0.0036101083032490976,"your":0.0036101083032490976,"implement":0.0036101083032490976,"role-based":0.0036101083032490976,"ensure":0.0036101083032490976,"authorized":0.0036101083032490976,"create":0.0036101083032490976,"multi-signature":0.0036101083032490976,"schemes":0.0036101083032490976,"enhanced":0.0036101083032490976,"security":0.0036101083032490976,"key":0.0036101083032490976,"elements":0.0036101083032490976,"asserts":0.0036101083032490976,"what":0.0036101083032490976,"a":0.0036101083032490976,"function":0.0036101083032490976,"checks":0.0036101083032490976,"condition":0.0036101083032490976,"throws":0.0036101083032490976,"an":0.0036101083032490976,"error":0.0036101083032490976,"if":0.0036101083032490976,"it's":0.0036101083032490976,"not":0.0036101083032490976,"met":0.0036101083032490976,"enforcing":0.0036101083032490976,"rules":0.0036101083032490976,"validating":0.0036101083032490976,"conditions":0.0036101083032490976,"when":0.0036101083032490976,"use":0.0036101083032490976,"need":0.0036101083032490976,"is":0.0036101083032490976,"true":0.0036101083032490976,"before":0.0036101083032490976,"proceeding":0.0036101083032490976,"best":0.0036101083032490976,"practices":0.0036101083032490976,"-":0.0036101083032490976,"enforce":0.0036101083032490976,"validate":0.0036101083032490976,"consider":0.0036101083032490976,"using":0.0036101083032490976,"combination":0.0036101083032490976,"other":0.0036101083032490976,"example":0.0036101083032490976,"case":0.0036101083032490976,"check":0.0036101083032490976,"user":0.0036101083032490976,"has":0.0036101083032490976,"sufficient":0.0036101083032490976,"balance":0.0036101083032490976,"performing":0.0036101083032490976,"transfer":0.0036101083032490976,"define":0.0036101083032490976,"map":0.0036101083032490976,"store":0.0036101083032490976,"balances":0.0036101083032490976,"define-map":0.0036101083032490976,"uint":0.0036101083032490976,"tokens":0.0036101083032490976,"define-public":0.0036101083032490976,"amount":0.0036101083032490976,"recipient":0.0036101083032490976,"let":0.0036101083032490976,"senderbalance":0.0036101083032490976,"default-to":0.0036101083032490976,"u0":0.0036101083032490976,"map-get":0.0036101083032490976,"tx-sender":0.0036101083032490976,"assert":0.0036101083032490976,"sender":0.0036101083032490976,"err":0.0036101083032490976,"u1":0.0036101083032490976,"assertion":0.0036101083032490976,"passes":0.0036101083032490976,"proceed":0.0036101083032490976,"map-set":0.0036101083032490976,"ok":0.0036101083032490976,"define-read-only":0.0036101083032490976,"get-balance":0.0036101083032490976,"keyword":0.0036101083032490976,"represents":0.0036101083032490976,"current":0.0036101083032490976,"transaction":0.0036101083032490976,"important":0.0036101083032490976,"identifying":0.0036101083032490976,"who":0.0036101083032490976,"calling":0.0036101083032490976,"permissions":0.0036101083032490976,"record":0.0036101083032490976,"associated":0.0036101083032490976,"caller":0.0036101083032490976,"always":0.0036101083032490976,"sensitive":0.0036101083032490976,"operations":0.0036101083032490976,"don't":0.0036101083032490976,"rely":0.0036101083032490976,"solely":0.0036101083032490976,"on":0.0036101083032490976,"complex":0.0036101083032490976,"authentication":0.0036101083032490976,"restricting":0.0036101083032490976,"be":0.0036101083032490976,"called":0.0036101083032490976,"by":0.0036101083032490976,"owner":0.0036101083032490976,"define-data-var":0.0036101083032490976,"contractowner":0.0036101083032490976,"restricted-function":0.0036101083032490976,"begin":0.0036101083032490976,"is-eq":0.0036101083032490976,"var-get":0.0036101083032490976,"logic":0.0036101083032490976,"here":0.0036101083032490976,"contract-caller":0.0036101083032490976,"immediate":0.0036101083032490976,"of":0.0036101083032490976,"allows":0.0036101083032490976,"more":0.0036101083032490976,"granular":0.0036101083032490976,"contract-to-contract":0.0036101083032490976,"interactions":0.0036101083032490976,"might":0.0036101083032490976,"distinguish":0.0036101083032490976,"between":0.0036101083032490976,"original":0.0036101083032490976,"conjunction":0.0036101083032490976,"comprehensive":0.0036101083032490976,"cautious":0.0036101083032490976,"potential":0.0036101083032490976,"confusion":0.0036101083032490976,"call":0.0036101083032490976,"chains":0.0036101083032490976,"whitelist":0.0036101083032490976,"allowed":0.0036101083032490976,"allowedcallers":0.0036101083032490976,"bool":0.0036101083032490976,"whitelisted-function":0.0036101083032490976,"false":0.0036101083032490976,"u2":0.0036101083032490976,"two":0.0036101083032490976,"values":0.0036101083032490976,"equal":0.0036101083032490976,"crucial":0.0036101083032490976,"comparing":0.0036101083032490976,"principals":0.0036101083032490976,"verify":0.0036101083032490976,"matches":0.0036101083032490976,"same":0.0036101083032490976,"exact":0.0036101083032490976,"matching":0.0036101083032490976,"functionality":0.0036101083032490976,"requiring":0.0036101083032490976,"approval":0.0036101083032490976,"from":0.0036101083032490976,"define-constant":0.0036101083032490976,"approver_one":0.0036101083032490976,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":0.0036101083032490976,"approver_two":0.0036101083032490976,"'st2cy5v39nhdpwsxmw9qdt3hc3gd6q6xx4cfrk9ag":0.0036101083032490976,"approve-transaction":0.0036101083032490976,"transactionid":0.0036101083032490976,"u3":0.0036101083032490976,"practical":0.0036101083032490976,"simple":0.0036101083032490976,"governance":0.0036101083032490976,"let's":0.0036101083032490976,"basic":0.0036101083032490976,"demonstrates":0.0036101083032490976,"this":0.0036101083032490976,"will":0.0036101083032490976,"have":0.0036101083032490976,"administrators":0.0036101083032490976,"regular":0.0036101083032490976,"members":0.0036101083032490976,"each":0.0036101083032490976,"maps":0.0036101083032490976,"roles":0.0036101083032490976,"variables":0.0036101083032490976,"proposalcounter":0.0036101083032490976,"proposals":0.0036101083032490976,"title":0.0036101083032490976,"string-ascii":0.0036101083032490976,"proposer":0.0036101083032490976,"votesfor":0.0036101083032490976,"votesagainst":0.0036101083032490976,"add":0.0036101083032490976,"administrator":0.0036101083032490976,"do":0.0036101083032490976,"add-administrator":0.0036101083032490976,"newadmin":0.0036101083032490976,"member":0.0036101083032490976,"add-member":0.0036101083032490976,"newmember":0.0036101083032490976,"proposal":0.0036101083032490976,"create-proposal":0.0036101083032490976,"proposalid":0.0036101083032490976,"var-set":0.0036101083032490976,"vote":0.0036101083032490976,"votefor":0.0036101083032490976,"unwrap":0.0036101083032490976,"u4":0.0036101083032490976,"u5":0.0036101083032490976,"merge":0.0036101083032490976,"get":0.0036101083032490976,"ownership":0.0036101083032490976,"transfer-ownership":0.0036101083032490976,"newowner":0.0036101083032490976,"u6":0.0036101083032490976,"conclusion":0.0036101083032490976,"provide":0.0036101083032490976,"powerful":0.0036101083032490976,"secure":0.0036101083032490976,"flexible":0.0036101083032490976,"understanding":0.0036101083032490976,"how":0.0036101083032490976,"systems":0.0036101083032490976,"requirements":0.0036101083032490976,"application":0.0036101083032490976,"mechanisms":0.0036101083032490976},"82":{"1":0.006578947368421052,"2":0.006578947368421052,"3":0.006578947368421052,"4":0.006578947368421052,"5":0.006578947368421052,"function":0.006578947368421052,"signature":0.006578947368421052,"clarity":0.006578947368421052,"list":0.006578947368421052,"expr1":0.006578947368421052,"expr2":0.006578947368421052,"expr3":0.006578947368421052,"-":0.006578947368421052,"input":0.006578947368421052,"a":0.006578947368421052,"output":0.006578947368421052,"why":0.006578947368421052,"it":0.006578947368421052,"matters":0.006578947368421052,"the":0.006578947368421052,"is":0.006578947368421052,"crucial":0.006578947368421052,"for":0.006578947368421052,"constructing":0.006578947368421052,"lists":0.006578947368421052,"of":0.006578947368421052,"elements":0.006578947368421052,"in":0.006578947368421052,"enabling":0.006578947368421052,"use":0.006578947368421052,"data":0.006578947368421052,"storage":0.006578947368421052,"and":0.006578947368421052,"manipulation":0.006578947368421052,"simplifying":0.006578947368421052,"creation":0.006578947368421052,"sequences":0.006578947368421052,"values":0.006578947368421052,"facilitating":0.006578947368421052,"operations":0.006578947368421052,"on":0.006578947368421052,"collections":0.006578947368421052,"when":0.006578947368421052,"to":0.006578947368421052,"you":0.006578947368421052,"need":0.006578947368421052,"construct":0.006578947368421052,"store":0.006578947368421052,"manipulate":0.006578947368421052,"pass":0.006578947368421052,"as":0.006578947368421052,"arguments":0.006578947368421052,"functions":0.006578947368421052,"perform":0.006578947368421052,"best":0.006578947368421052,"practices":0.006578947368421052,"ensure":0.006578947368421052,"all":0.006578947368421052,"are":0.006578947368421052,"same":0.006578947368421052,"type":0.006578947368421052,"meaningful":0.006578947368421052,"variable":0.006578947368421052,"names":0.006578947368421052,"better":0.006578947368421052,"readability":0.006578947368421052,"combine":0.006578947368421052,"with":0.006578947368421052,"other":0.006578947368421052,"comprehensive":0.006578947368421052,"handling":0.006578947368421052,"be":0.006578947368421052,"aware":0.006578947368421052,"maximum":0.006578947368421052,"length":0.006578947368421052,"practical":0.006578947368421052,"example":0.006578947368421052,"creating":0.006578947368421052,"integers":0.006578947368421052,"let's":0.006578947368421052,"implement":0.006578947368421052,"that":0.006578947368421052,"creates":0.006578947368421052,"returns":0.006578947368421052,"its":0.006578947368421052,"define-read-only":0.006578947368421052,"create-list":0.006578947368421052,"let":0.006578947368421052,"numbers":0.006578947368421052,"len":0.006578947368421052,"usage":0.006578947368421052,"u5":0.006578947368421052,"this":0.006578947368421052,"demonstrates":0.006578947368421052,"using":0.006578947368421052,"create":0.006578947368421052,"binding":0.006578947368421052,"returning":0.006578947368421052,"common":0.006578947368421052,"pitfalls":0.006578947368421052,"different":0.006578947368421052,"types":0.006578947368421052,"causing":0.006578947368421052,"errors":0.006578947368421052,"assuming":0.006578947368421052,"will":0.006578947368421052,"always":0.006578947368421052,"within":0.006578947368421052,"certain":0.006578947368421052,"leading":0.006578947368421052,"unhandled":0.006578947368421052,"cases":0.006578947368421052,"not":0.006578947368421052,"possible":0.006578947368421052,"conditions":0.006578947368421052,"resulting":0.006578947368421052,"incomplete":0.006578947368421052,"checks":0.006578947368421052,"overlooking":0.006578947368421052,"validation":0.006578947368421052,"error":0.006578947368421052,"checking":0.006578947368421052,"related":0.006578947368421052,"append":0.006578947368421052,"adds":0.006578947368421052,"an":0.006578947368421052,"element":0.006578947368421052,"end":0.006578947368421052,"concat":0.006578947368421052,"concatenates":0.006578947368421052,"multiple":0.006578947368421052,"conclusion":0.006578947368421052,"fundamental":0.006578947368421052,"tool":0.006578947368421052,"smart":0.006578947368421052,"contracts":0.006578947368421052,"allows":0.006578947368421052,"robust":0.006578947368421052,"used":0.006578947368421052,"effectively":0.006578947368421052,"enhances":0.006578947368421052,"reliability":0.006578947368421052,"maintainability":0.006578947368421052,"your":0.006578947368421052,"contract":0.006578947368421052,"code":0.006578947368421052,"by":0.006578947368421052,"providing":0.006578947368421052,"clear":0.006578947368421052,"concise":0.006578947368421052,"way":0.006578947368421052,"manage":0.006578947368421052},"83":{"1":0.005988023952095809,"2":0.005988023952095809,"3":0.005988023952095809,"4":0.005988023952095809,"20":0.005988023952095809,"type":0.005988023952095809,"definition":0.005988023952095809,"clarity":0.005988023952095809,"label-0":0.005988023952095809,"value-type-0":0.005988023952095809,"label-1":0.005988023952095809,"value-type-1":0.005988023952095809,"-":0.005988023952095809,"input":0.005988023952095809,"various":0.005988023952095809,"types":0.005988023952095809,"output":0.005988023952095809,"tuple":0.005988023952095809,"why":0.005988023952095809,"it":0.005988023952095809,"matters":0.005988023952095809,"the":0.005988023952095809,"is":0.005988023952095809,"crucial":0.005988023952095809,"for":0.005988023952095809,"grouping":0.005988023952095809,"related":0.005988023952095809,"data":0.005988023952095809,"values":0.005988023952095809,"with":0.005988023952095809,"named":0.005988023952095809,"fields":0.005988023952095809,"implementing":0.005988023952095809,"complex":0.005988023952095809,"structures":0.005988023952095809,"in":0.005988023952095809,"smart":0.005988023952095809,"contracts":0.005988023952095809,"ensuring":0.005988023952095809,"integrity":0.005988023952095809,"by":0.005988023952095809,"providing":0.005988023952095809,"a":0.005988023952095809,"clear":0.005988023952095809,"structure":0.005988023952095809,"simplifying":0.005988023952095809,"process":0.005988023952095809,"of":0.005988023952095809,"handling":0.005988023952095809,"grouped":0.005988023952095809,"when":0.005988023952095809,"to":0.005988023952095809,"use":0.005988023952095809,"you":0.005988023952095809,"need":0.005988023952095809,"group":0.005988023952095809,"implement":0.005988023952095809,"your":0.005988023952095809,"contract":0.005988023952095809,"ensure":0.005988023952095809,"handle":0.005988023952095809,"best":0.005988023952095809,"practices":0.005988023952095809,"descriptive":0.005988023952095809,"names":0.005988023952095809,"better":0.005988023952095809,"readability":0.005988023952095809,"are":0.005988023952095809,"appropriate":0.005988023952095809,"they":0.005988023952095809,"represent":0.005988023952095809,"combine":0.005988023952095809,"other":0.005988023952095809,"and":0.005988023952095809,"functions":0.005988023952095809,"comprehensive":0.005988023952095809,"management":0.005988023952095809,"possible":0.005988023952095809,"error":0.005988023952095809,"cases":0.005988023952095809,"robust":0.005988023952095809,"behavior":0.005988023952095809,"practical":0.005988023952095809,"example":0.005988023952095809,"using":0.005988023952095809,"tuples":0.005988023952095809,"store":0.005988023952095809,"user":0.005988023952095809,"information":0.005988023952095809,"let's":0.005988023952095809,"function":0.005988023952095809,"that":0.005988023952095809,"stores":0.005988023952095809,"retrieves":0.005988023952095809,"define-map":0.005988023952095809,"userinfo":0.005988023952095809,"userid":0.005988023952095809,"principal":0.005988023952095809,"name":0.005988023952095809,"string-ascii":0.005988023952095809,"age":0.005988023952095809,"uint":0.005988023952095809,"define-public":0.005988023952095809,"set-user-info":0.005988023952095809,"begin":0.005988023952095809,"map-set":0.005988023952095809,"ok":0.005988023952095809,"true":0.005988023952095809,"define-read-only":0.005988023952095809,"get-user-info":0.005988023952095809,"map-get":0.005988023952095809,"usage":0.005988023952095809,"tx-sender":0.005988023952095809,"alice":0.005988023952095809,"u30":0.005988023952095809,"sets":0.005988023952095809,"info":0.005988023952095809,"returns":0.005988023952095809,"some":0.005988023952095809,"this":0.005988023952095809,"demonstrates":0.005988023952095809,"set":0.005988023952095809,"get":0.005988023952095809,"both":0.005988023952095809,"successful":0.005988023952095809,"common":0.005988023952095809,"pitfalls":0.005988023952095809,"non-descriptive":0.005988023952095809,"causing":0.005988023952095809,"confusion":0.005988023952095809,"assuming":0.005988023952095809,"will":0.005988023952095809,"always":0.005988023952095809,"be":0.005988023952095809,"valid":0.005988023952095809,"leading":0.005988023952095809,"unhandled":0.005988023952095809,"not":0.005988023952095809,"all":0.005988023952095809,"conditions":0.005988023952095809,"resulting":0.005988023952095809,"incomplete":0.005988023952095809,"overlooking":0.005988023952095809,"proper":0.005988023952095809,"validation":0.005988023952095809,"value":0.005988023952095809,"map":0.005988023952095809,"from":0.005988023952095809,"default-to":0.005988023952095809,"provides":0.005988023952095809,"default":0.005988023952095809,"if":0.005988023952095809,"an":0.005988023952095809,"optional":0.005988023952095809,"none":0.005988023952095809,"conclusion":0.005988023952095809,"fundamental":0.005988023952095809,"tool":0.005988023952095809,"allows":0.005988023952095809,"used":0.005988023952095809,"effectively":0.005988023952095809,"enhances":0.005988023952095809,"reliability":0.005988023952095809,"maintainability":0.005988023952095809,"code":0.005988023952095809,"concise":0.005988023952095809,"way":0.005988023952095809},"84":{"1":0.006993006993006993,"2":0.006993006993006993,"3":0.006993006993006993,"4":0.006993006993006993,"32":0.006993006993006993,"256":0.006993006993006993,"function":0.006993006993006993,"signature":0.006993006993006993,"clarity":0.006993006993006993,"sha256":0.006993006993006993,"value":0.006993006993006993,"-":0.006993006993006993,"input":0.006993006993006993,"buff":0.006993006993006993,"uint":0.006993006993006993,"int":0.006993006993006993,"output":0.006993006993006993,"why":0.006993006993006993,"it":0.006993006993006993,"matters":0.006993006993006993,"the":0.006993006993006993,"is":0.006993006993006993,"crucial":0.006993006993006993,"for":0.006993006993006993,"computing":0.006993006993006993,"sha-256":0.006993006993006993,"hash":0.006993006993006993,"of":0.006993006993006993,"a":0.006993006993006993,"given":0.006993006993006993,"implementing":0.006993006993006993,"cryptographic":0.006993006993006993,"operations":0.006993006993006993,"in":0.006993006993006993,"smart":0.006993006993006993,"contracts":0.006993006993006993,"ensuring":0.006993006993006993,"data":0.006993006993006993,"integrity":0.006993006993006993,"by":0.006993006993006993,"generating":0.006993006993006993,"unique":0.006993006993006993,"hashes":0.006993006993006993,"simplifying":0.006993006993006993,"process":0.006993006993006993,"handling":0.006993006993006993,"hashing":0.006993006993006993,"when":0.006993006993006993,"to":0.006993006993006993,"use":0.006993006993006993,"you":0.006993006993006993,"need":0.006993006993006993,"compute":0.006993006993006993,"implement":0.006993006993006993,"your":0.006993006993006993,"contract":0.006993006993006993,"generate":0.006993006993006993,"ensure":0.006993006993006993,"handle":0.006993006993006993,"best":0.006993006993006993,"practices":0.006993006993006993,"correctly":0.006993006993006993,"formatted":0.006993006993006993,"and":0.006993006993006993,"valid":0.006993006993006993,"meaningful":0.006993006993006993,"variable":0.006993006993006993,"names":0.006993006993006993,"better":0.006993006993006993,"readability":0.006993006993006993,"combine":0.006993006993006993,"with":0.006993006993006993,"other":0.006993006993006993,"functions":0.006993006993006993,"comprehensive":0.006993006993006993,"security":0.006993006993006993,"management":0.006993006993006993,"possible":0.006993006993006993,"error":0.006993006993006993,"cases":0.006993006993006993,"robust":0.006993006993006993,"behavior":0.006993006993006993,"practical":0.006993006993006993,"example":0.006993006993006993,"let's":0.006993006993006993,"that":0.006993006993006993,"computes":0.006993006993006993,"buffer":0.006993006993006993,"define-read-only":0.006993006993006993,"compute-sha256":0.006993006993006993,"usage":0.006993006993006993,"0x68656c6c6f20776f726c64000000000000000000000000000000000000000000":0.006993006993006993,"returns":0.006993006993006993,"0x28effae679c457da1e5158c063b3dfa78d0ade721b9aa9f1fc3f46dba4c0ea15":0.006993006993006993,"this":0.006993006993006993,"demonstrates":0.006993006993006993,"using":0.006993006993006993,"public":0.006993006993006993,"computation":0.006993006993006993,"both":0.006993006993006993,"successful":0.006993006993006993,"common":0.006993006993006993,"pitfalls":0.006993006993006993,"incorrectly":0.006993006993006993,"or":0.006993006993006993,"invalid":0.006993006993006993,"values":0.006993006993006993,"causing":0.006993006993006993,"operation":0.006993006993006993,"fail":0.006993006993006993,"assuming":0.006993006993006993,"will":0.006993006993006993,"always":0.006993006993006993,"be":0.006993006993006993,"leading":0.006993006993006993,"unhandled":0.006993006993006993,"not":0.006993006993006993,"all":0.006993006993006993,"conditions":0.006993006993006993,"resulting":0.006993006993006993,"incomplete":0.006993006993006993,"overlooking":0.006993006993006993,"proper":0.006993006993006993,"validation":0.006993006993006993,"related":0.006993006993006993,"sha512":0.006993006993006993,"sha-512":0.006993006993006993,"keccak256":0.006993006993006993,"keccak-256":0.006993006993006993,"conclusion":0.006993006993006993,"fundamental":0.006993006993006993,"tool":0.006993006993006993,"allows":0.006993006993006993,"used":0.006993006993006993,"effectively":0.006993006993006993,"enhances":0.006993006993006993,"reliability":0.006993006993006993,"maintainability":0.006993006993006993,"code":0.006993006993006993,"providing":0.006993006993006993,"clear":0.006993006993006993,"concise":0.006993006993006993,"way":0.006993006993006993},"85":{"1":0.006024096385542169,"2":0.006024096385542169,"3":0.006024096385542169,"4":0.006024096385542169,"20":0.006024096385542169,"function":0.006024096385542169,"signature":0.006024096385542169,"clarity":0.006024096385542169,"unwrap":0.006024096385542169,"option-input":0.006024096385542169,"thrown-value":0.006024096385542169,"-":0.006024096385542169,"input":0.006024096385542169,"optional":0.006024096385542169,"a":0.006024096385542169,"response":0.006024096385542169,"b":0.006024096385542169,"c":0.006024096385542169,"output":0.006024096385542169,"why":0.006024096385542169,"it":0.006024096385542169,"matters":0.006024096385542169,"the":0.006024096385542169,"is":0.006024096385542169,"crucial":0.006024096385542169,"for":0.006024096385542169,"unpacking":0.006024096385542169,"and":0.006024096385542169,"types":0.006024096385542169,"to":0.006024096385542169,"access":0.006024096385542169,"their":0.006024096385542169,"inner":0.006024096385542169,"values":0.006024096385542169,"implementing":0.006024096385542169,"logic":0.006024096385542169,"that":0.006024096385542169,"requires":0.006024096385542169,"handling":0.006024096385542169,"ensuring":0.006024096385542169,"data":0.006024096385542169,"integrity":0.006024096385542169,"by":0.006024096385542169,"validating":0.006024096385542169,"process":0.006024096385542169,"simplifying":0.006024096385542169,"of":0.006024096385542169,"in":0.006024096385542169,"smart":0.006024096385542169,"contracts":0.006024096385542169,"when":0.006024096385542169,"use":0.006024096385542169,"you":0.006024096385542169,"need":0.006024096385542169,"unpack":0.006024096385542169,"implement":0.006024096385542169,"validate":0.006024096385542169,"ensure":0.006024096385542169,"handle":0.006024096385542169,"your":0.006024096385542169,"contract":0.006024096385542169,"best":0.006024096385542169,"practices":0.006024096385542169,"value":0.006024096385542169,"an":0.006024096385542169,"or":0.006024096385542169,"type":0.006024096385542169,"meaningful":0.006024096385542169,"variable":0.006024096385542169,"names":0.006024096385542169,"better":0.006024096385542169,"readability":0.006024096385542169,"combine":0.006024096385542169,"with":0.006024096385542169,"other":0.006024096385542169,"error":0.006024096385542169,"functions":0.006024096385542169,"comprehensive":0.006024096385542169,"management":0.006024096385542169,"possible":0.006024096385542169,"cases":0.006024096385542169,"robust":0.006024096385542169,"behavior":0.006024096385542169,"practical":0.006024096385542169,"example":0.006024096385542169,"let's":0.006024096385542169,"retrieves":0.006024096385542169,"from":0.006024096385542169,"map":0.006024096385542169,"unpacks":0.006024096385542169,"using":0.006024096385542169,"define-map":0.006024096385542169,"userinfo":0.006024096385542169,"userid":0.006024096385542169,"principal":0.006024096385542169,"name":0.006024096385542169,"string-ascii":0.006024096385542169,"age":0.006024096385542169,"uint":0.006024096385542169,"define-public":0.006024096385542169,"get-user-age":0.006024096385542169,"user":0.006024096385542169,"let":0.006024096385542169,"userdata":0.006024096385542169,"map-get":0.006024096385542169,"err":0.006024096385542169,"not":0.006024096385542169,"found":0.006024096385542169,"ok":0.006024096385542169,"get":0.006024096385542169,"usage":0.006024096385542169,"map-set":0.006024096385542169,"tx-sender":0.006024096385542169,"alice":0.006024096385542169,"u30":0.006024096385542169,"returns":0.006024096385542169,"'sz2j6zy48gv1ez5v2v5rb9mp66sw86pykkq9h6dpr":0.006024096385542169,"this":0.006024096385542169,"demonstrates":0.006024096385542169,"public":0.006024096385542169,"both":0.006024096385542169,"successful":0.006024096385542169,"common":0.006024096385542169,"pitfalls":0.006024096385542169,"are":0.006024096385542169,"causing":0.006024096385542169,"runtime":0.006024096385542169,"errors":0.006024096385542169,"assuming":0.006024096385542169,"will":0.006024096385542169,"always":0.006024096385542169,"succeed":0.006024096385542169,"leading":0.006024096385542169,"unhandled":0.006024096385542169,"all":0.006024096385542169,"conditions":0.006024096385542169,"resulting":0.006024096385542169,"incomplete":0.006024096385542169,"overlooking":0.006024096385542169,"proper":0.006024096385542169,"validation":0.006024096385542169,"related":0.006024096385542169,"try":0.006024096385542169,"returning":0.006024096385542169,"none":0.006024096385542169,"if":0.006024096385542169,"fails":0.006024096385542169,"unwrap-panic":0.006024096385542169,"throwing":0.006024096385542169,"default-to":0.006024096385542169,"provides":0.006024096385542169,"default":0.006024096385542169,"conclusion":0.006024096385542169,"fundamental":0.006024096385542169,"tool":0.006024096385542169,"allows":0.006024096385542169,"used":0.006024096385542169,"effectively":0.006024096385542169,"enhances":0.006024096385542169,"reliability":0.006024096385542169,"maintainability":0.006024096385542169,"code":0.006024096385542169,"providing":0.006024096385542169,"clear":0.006024096385542169,"concise":0.006024096385542169,"way":0.006024096385542169},"86":{"1":0.005319148936170213,"2":0.005319148936170213,"3":0.005319148936170213,"4":0.005319148936170213,"function":0.005319148936170213,"signature":0.005319148936170213,"clarity":0.005319148936170213,"contract-call":0.005319148936170213,"contract-name":0.005319148936170213,"function-name":0.005319148936170213,"arg0":0.005319148936170213,"arg1":0.005319148936170213,"-":0.005319148936170213,"input":0.005319148936170213,"the":0.005319148936170213,"name":0.005319148936170213,"of":0.005319148936170213,"contract":0.005319148936170213,"to":0.005319148936170213,"call":0.005319148936170213,"public":0.005319148936170213,"execute":0.005319148936170213,"arguments":0.005319148936170213,"pass":0.005319148936170213,"output":0.005319148936170213,"response":0.005319148936170213,"a":0.005319148936170213,"b":0.005319148936170213,"where":0.005319148936170213,"and":0.005319148936170213,"are":0.005319148936170213,"types":0.005319148936170213,"returned":0.005319148936170213,"by":0.005319148936170213,"called":0.005319148936170213,"why":0.005319148936170213,"it":0.005319148936170213,"matters":0.005319148936170213,"is":0.005319148936170213,"crucial":0.005319148936170213,"for":0.005319148936170213,"enabling":0.005319148936170213,"inter-contract":0.005319148936170213,"communication":0.005319148936170213,"composability":0.005319148936170213,"allowing":0.005319148936170213,"contracts":0.005319148936170213,"leverage":0.005319148936170213,"functionality":0.005319148936170213,"from":0.005319148936170213,"other":0.005319148936170213,"building":0.005319148936170213,"complex":0.005319148936170213,"systems":0.005319148936170213,"interacting":0.005319148936170213,"smart":0.005319148936170213,"implementing":0.005319148936170213,"upgradeable":0.005319148936170213,"patterns":0.005319148936170213,"when":0.005319148936170213,"use":0.005319148936170213,"you":0.005319148936170213,"need":0.005319148936170213,"in":0.005319148936170213,"another":0.005319148936170213,"interact":0.005319148936170213,"with":0.005319148936170213,"standardized":0.005319148936170213,"e":0.005319148936170213,"g":0.005319148936170213,"token":0.005319148936170213,"split":0.005319148936170213,"logic":0.005319148936170213,"across":0.005319148936170213,"multiple":0.005319148936170213,"better":0.005319148936170213,"organization":0.005319148936170213,"implement":0.005319148936170213,"calling":0.005319148936170213,"into":0.005319148936170213,"newer":0.005319148936170213,"versions":0.005319148936170213,"best":0.005319148936170213,"practices":0.005319148936170213,"always":0.005319148936170213,"check":0.005319148936170213,"return":0.005319148936170213,"value":0.005319148936170213,"as":0.005319148936170213,"returns":0.005319148936170213,"type":0.005319148936170213,"be":0.005319148936170213,"aware":0.005319148936170213,"that":0.005319148936170213,"cannot":0.005319148936170213,"used":0.005319148936170213,"functions":0.005319148936170213,"within":0.005319148936170213,"same":0.005319148936170213,"consider":0.005319148936170213,"gas":0.005319148936170213,"costs":0.005319148936170213,"external":0.005319148936170213,"calls":0.005319148936170213,"your":0.005319148936170213,"overall":0.005319148936170213,"transaction":0.005319148936170213,"budget":0.005319148936170213,"as-contract":0.005319148936170213,"appropriate":0.005319148936170213,"make":0.005319148936170213,"contract's":0.005319148936170213,"own":0.005319148936170213,"principal":0.005319148936170213,"practical":0.005319148936170213,"example":0.005319148936170213,"let's":0.005319148936170213,"transfers":0.005319148936170213,"tokens":0.005319148936170213,"using":0.005319148936170213,"standard":0.005319148936170213,"define-public":0.005319148936170213,"transfer-tokens":0.005319148936170213,"amount":0.005319148936170213,"uint":0.005319148936170213,"recipient":0.005319148936170213,"token-contract":0.005319148936170213,"transfer":0.005319148936170213,"tx-sender":0.005319148936170213,"usage":0.005319148936170213,"u100":0.005319148936170213,"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.005319148936170213,"this":0.005319148936170213,"demonstrates":0.005319148936170213,"passing":0.005319148936170213,"including":0.005319148936170213,"current":0.005319148936170213,"returning":0.005319148936170213,"directly":0.005319148936170213,"common":0.005319148936170213,"pitfalls":0.005319148936170213,"forgetting":0.005319148936170213,"handle":0.005319148936170213,"which":0.005319148936170213,"can":0.005319148936170213,"lead":0.005319148936170213,"unexpected":0.005319148936170213,"behavior":0.005319148936170213,"attempting":0.005319148936170213,"not":0.005319148936170213,"allowed":0.005319148936170213,"considering":0.005319148936170213,"possibility":0.005319148936170213,"changing":0.005319148936170213,"or":0.005319148936170213,"being":0.005319148936170213,"upgraded":0.005319148936170213,"related":0.005319148936170213,"often":0.005319148936170213,"combination":0.005319148936170213,"try":0.005319148936170213,"useful":0.005319148936170213,"handling":0.005319148936170213,"propagating":0.005319148936170213,"errors":0.005319148936170213,"unwrap":0.005319148936170213,"extract":0.005319148936170213,"success":0.005319148936170213,"an":0.005319148936170213,"error":0.005319148936170213,"conclusion":0.005319148936170213,"fundamental":0.005319148936170213,"block":0.005319148936170213,"creating":0.005319148936170213,"on":0.005319148936170213,"stacks":0.005319148936170213,"blockchain":0.005319148936170213,"promotes":0.005319148936170213,"code":0.005319148936170213,"reuse":0.005319148936170213,"modularity":0.005319148936170213,"upgradability":0.005319148936170213,"however":0.005319148936170213,"must":0.005319148936170213,"careful":0.005319148936170213,"responses":0.005319148936170213,"correctly":0.005319148936170213,"implications":0.005319148936170213},"87":{"0":0.005681818181818182,"1":0.005681818181818182,"2":0.005681818181818182,"3":0.005681818181818182,"4":0.005681818181818182,"16":0.005681818181818182,"function":0.005681818181818182,"signature":0.005681818181818182,"clarity":0.005681818181818182,"buff-to-int-be":0.005681818181818182,"buff":0.005681818181818182,"-":0.005681818181818182,"input":0.005681818181818182,"a":0.005681818181818182,"byte":0.005681818181818182,"buffer":0.005681818181818182,"of":0.005681818181818182,"up":0.005681818181818182,"to":0.005681818181818182,"bytes":0.005681818181818182,"output":0.005681818181818182,"signed":0.005681818181818182,"integer":0.005681818181818182,"int":0.005681818181818182,"why":0.005681818181818182,"it":0.005681818181818182,"matters":0.005681818181818182,"the":0.005681818181818182,"is":0.005681818181818182,"crucial":0.005681818181818182,"for":0.005681818181818182,"converting":0.005681818181818182,"data":0.005681818181818182,"integers":0.005681818181818182,"in":0.005681818181818182,"smart":0.005681818181818182,"contracts":0.005681818181818182,"handling":0.005681818181818182,"from":0.005681818181818182,"external":0.005681818181818182,"sources":0.005681818181818182,"or":0.005681818181818182,"other":0.005681818181818182,"that":0.005681818181818182,"use":0.005681818181818182,"big-endian":0.005681818181818182,"encoding":0.005681818181818182,"implementing":0.005681818181818182,"protocols":0.005681818181818182,"algorithms":0.005681818181818182,"require":0.005681818181818182,"representation":0.005681818181818182,"interoperating":0.005681818181818182,"with":0.005681818181818182,"systems":0.005681818181818182,"order":0.005681818181818182,"when":0.005681818181818182,"you":0.005681818181818182,"need":0.005681818181818182,"convert":0.005681818181818182,"encoded":0.005681818181818182,"process":0.005681818181818182,"represents":0.005681818181818182,"format":0.005681818181818182,"implement":0.005681818181818182,"cryptographic":0.005681818181818182,"mathematical":0.005681818181818182,"operations":0.005681818181818182,"expect":0.005681818181818182,"inputs":0.005681818181818182,"ensure":0.005681818181818182,"compatibility":0.005681818181818182,"using":0.005681818181818182,"best":0.005681818181818182,"practices":0.005681818181818182,"no":0.005681818181818182,"larger":0.005681818181818182,"than":0.005681818181818182,"avoid":0.005681818181818182,"errors":0.005681818181818182,"be":0.005681818181818182,"aware":0.005681818181818182,"smaller":0.005681818181818182,"buffers":0.005681818181818182,"are":0.005681818181818182,"zero-padded":0.005681818181818182,"on":0.005681818181818182,"left":0.005681818181818182,"affecting":0.005681818181818182,"resulting":0.005681818181818182,"value":0.005681818181818182,"consider":0.005681818181818182,"buff-to-uint-be":0.005681818181818182,"unsigned":0.005681818181818182,"if":0.005681818181818182,"sign":0.005681818181818182,"not":0.005681818181818182,"needed":0.005681818181818182,"handle":0.005681818181818182,"potential":0.005681818181818182,"might":0.005681818181818182,"invalid":0.005681818181818182,"empty":0.005681818181818182,"practical":0.005681818181818182,"example":0.005681818181818182,"decoding":0.005681818181818182,"let's":0.005681818181818182,"processes":0.005681818181818182,"containing":0.005681818181818182,"define-read-only":0.005681818181818182,"process-external-data":0.005681818181818182,"let":0.005681818181818182,"err":0.005681818181818182,"negative":0.005681818181818182,"allowed":0.005681818181818182,"ok":0.005681818181818182,"usage":0.005681818181818182,"0x0000000000000001":0.005681818181818182,"returns":0.005681818181818182,"0xffffffffffffffff":0.005681818181818182,"0x7fffffffffffffff":0.005681818181818182,"9223372036854775807":0.005681818181818182,"this":0.005681818181818182,"demonstrates":0.005681818181818182,"both":0.005681818181818182,"positive":0.005681818181818182,"and":0.005681818181818182,"values":0.005681818181818182,"conversion":0.005681818181818182,"validation":0.005681818181818182,"based":0.005681818181818182,"converted":0.005681818181818182,"common":0.005681818181818182,"pitfalls":0.005681818181818182,"forgetting":0.005681818181818182,"interprets":0.005681818181818182,"as":0.005681818181818182,"which":0.005681818181818182,"lead":0.005681818181818182,"unexpected":0.005681818181818182,"actually":0.005681818181818182,"little-endian":0.005681818181818182,"working":0.005681818181818182,"assuming":0.005681818181818182,"specific":0.005681818181818182,"length":0.005681818181818182,"could":0.005681818181818182,"results":0.005681818181818182,"shorter":0.005681818181818182,"due":0.005681818181818182,"left-padding":0.005681818181818182,"related":0.005681818181818182,"functions":0.005681818181818182,"buff-to-int-le":0.005681818181818182,"converts":0.005681818181818182,"an":0.005681818181818182,"int-to-ascii":0.005681818181818182,"its":0.005681818181818182,"ascii":0.005681818181818182,"string":0.005681818181818182,"conclusion":0.005681818181818182,"powerful":0.005681818181818182,"tool":0.005681818181818182,"by":0.005681818181818182,"understanding":0.005681818181818182,"behavior":0.005681818181818182,"different":0.005681818181818182,"sizes":0.005681818181818182,"issues":0.005681818181818182,"can":0.005681818181818182,"effectively":0.005681818181818182,"validate":0.005681818181818182,"complex":0.005681818181818182,"your":0.005681818181818182,"contract":0.005681818181818182,"applications":0.005681818181818182},"88":{"1":0.006097560975609756,"2":0.006097560975609756,"3":0.006097560975609756,"4":0.006097560975609756,"40":0.006097560975609756,"100":0.006097560975609756,"function":0.006097560975609756,"signature":0.006097560975609756,"clarity":0.006097560975609756,"int-to-ascii":0.006097560975609756,"value":0.006097560975609756,"-":0.006097560975609756,"input":0.006097560975609756,"int":0.006097560975609756,"uint":0.006097560975609756,"output":0.006097560975609756,"string-ascii":0.006097560975609756,"why":0.006097560975609756,"it":0.006097560975609756,"matters":0.006097560975609756,"the":0.006097560975609756,"is":0.006097560975609756,"crucial":0.006097560975609756,"for":0.006097560975609756,"converting":0.006097560975609756,"integer":0.006097560975609756,"values":0.006097560975609756,"to":0.006097560975609756,"their":0.006097560975609756,"string":0.006097560975609756,"representations":0.006097560975609756,"facilitating":0.006097560975609756,"display":0.006097560975609756,"and":0.006097560975609756,"logging":0.006097560975609756,"of":0.006097560975609756,"numeric":0.006097560975609756,"data":0.006097560975609756,"enabling":0.006097560975609756,"use":0.006097560975609756,"in":0.006097560975609756,"contexts":0.006097560975609756,"that":0.006097560975609756,"require":0.006097560975609756,"strings":0.006097560975609756,"simplifying":0.006097560975609756,"process":0.006097560975609756,"creating":0.006097560975609756,"human-readable":0.006097560975609756,"outputs":0.006097560975609756,"from":0.006097560975609756,"when":0.006097560975609756,"you":0.006097560975609756,"need":0.006097560975609756,"convert":0.006097560975609756,"an":0.006097560975609756,"or":0.006097560975609756,"unsigned":0.006097560975609756,"a":0.006097560975609756,"format":0.006097560975609756,"log":0.006097560975609756,"store":0.006097560975609756,"as":0.006097560975609756,"prepare":0.006097560975609756,"concatenation":0.006097560975609756,"with":0.006097560975609756,"other":0.006097560975609756,"best":0.006097560975609756,"practices":0.006097560975609756,"ensure":0.006097560975609756,"within":0.006097560975609756,"range":0.006097560975609756,"can":0.006097560975609756,"be":0.006097560975609756,"represented":0.006097560975609756,"meaningful":0.006097560975609756,"variable":0.006097560975609756,"names":0.006097560975609756,"better":0.006097560975609756,"readability":0.006097560975609756,"combine":0.006097560975609756,"functions":0.006097560975609756,"more":0.006097560975609756,"complex":0.006097560975609756,"manipulations":0.006097560975609756,"aware":0.006097560975609756,"maximum":0.006097560975609756,"length":0.006097560975609756,"resulting":0.006097560975609756,"characters":0.006097560975609756,"practical":0.006097560975609756,"example":0.006097560975609756,"user's":0.006097560975609756,"balance":0.006097560975609756,"let's":0.006097560975609756,"implement":0.006097560975609756,"logs":0.006097560975609756,"define-map":0.006097560975609756,"userbalances":0.006097560975609756,"userid":0.006097560975609756,"principal":0.006097560975609756,"define-public":0.006097560975609756,"log-balance":0.006097560975609756,"user":0.006097560975609756,"let":0.006097560975609756,"default-to":0.006097560975609756,"u0":0.006097560975609756,"map-get":0.006097560975609756,"balancestr":0.006097560975609756,"print":0.006097560975609756,"usage":0.006097560975609756,"map-set":0.006097560975609756,"tx-sender":0.006097560975609756,"u100":0.006097560975609756,"this":0.006097560975609756,"demonstrates":0.006097560975609756,"using":0.006097560975609756,"representation":0.006097560975609756,"handling":0.006097560975609756,"case":0.006097560975609756,"where":0.006097560975609756,"has":0.006097560975609756,"no":0.006097560975609756,"set":0.006097560975609756,"common":0.006097560975609756,"pitfalls":0.006097560975609756,"assuming":0.006097560975609756,"will":0.006097560975609756,"always":0.006097560975609756,"fit":0.006097560975609756,"forgetting":0.006097560975609756,"handle":0.006097560975609756,"cases":0.006097560975609756,"not":0.006097560975609756,"zero":0.006097560975609756,"performance-critical":0.006097560975609756,"sections":0.006097560975609756,"without":0.006097560975609756,"considering":0.006097560975609756,"overhead":0.006097560975609756,"combining":0.006097560975609756,"related":0.006097560975609756,"used":0.006097560975609756,"concat":0.006097560975609756,"concatenate":0.006097560975609756,"multiple":0.006097560975609756,"provide":0.006097560975609756,"default":0.006097560975609756,"optional":0.006097560975609756,"types":0.006097560975609756,"conclusion":0.006097560975609756,"powerful":0.006097560975609756,"tool":0.006097560975609756,"smart":0.006097560975609756,"contracts":0.006097560975609756,"enables":0.006097560975609756,"create":0.006097560975609756,"storage":0.006097560975609756,"effectively":0.006097560975609756,"enhances":0.006097560975609756,"usability":0.006097560975609756,"your":0.006097560975609756,"contract":0.006097560975609756,"code":0.006097560975609756},"89":{"1":0.005780346820809248,"2":0.005780346820809248,"3":0.005780346820809248,"4":0.005780346820809248,"32":0.005780346820809248,"function":0.005780346820809248,"signature":0.005780346820809248,"clarity":0.005780346820809248,"map-delete":0.005780346820809248,"map-name":0.005780346820809248,"key-tuple":0.005780346820809248,"-":0.005780346820809248,"input":0.005780346820809248,"mapname":0.005780346820809248,"tuple":0.005780346820809248,"output":0.005780346820809248,"bool":0.005780346820809248,"why":0.005780346820809248,"it":0.005780346820809248,"matters":0.005780346820809248,"the":0.005780346820809248,"is":0.005780346820809248,"crucial":0.005780346820809248,"for":0.005780346820809248,"removing":0.005780346820809248,"entries":0.005780346820809248,"from":0.005780346820809248,"a":0.005780346820809248,"map":0.005780346820809248,"managing":0.005780346820809248,"and":0.005780346820809248,"updating":0.005780346820809248,"state":0.005780346820809248,"of":0.005780346820809248,"data":0.005780346820809248,"stored":0.005780346820809248,"in":0.005780346820809248,"maps":0.005780346820809248,"ensuring":0.005780346820809248,"integrity":0.005780346820809248,"by":0.005780346820809248,"allowing":0.005780346820809248,"deletion":0.005780346820809248,"obsolete":0.005780346820809248,"or":0.005780346820809248,"incorrect":0.005780346820809248,"simplifying":0.005780346820809248,"process":0.005780346820809248,"maintaining":0.005780346820809248,"clean":0.005780346820809248,"accurate":0.005780346820809248,"smart":0.005780346820809248,"contracts":0.005780346820809248,"when":0.005780346820809248,"to":0.005780346820809248,"use":0.005780346820809248,"you":0.005780346820809248,"need":0.005780346820809248,"remove":0.005780346820809248,"an":0.005780346820809248,"entry":0.005780346820809248,"manage":0.005780346820809248,"update":0.005780346820809248,"ensure":0.005780346820809248,"deleting":0.005780346820809248,"maintain":0.005780346820809248,"your":0.005780346820809248,"contract":0.005780346820809248,"best":0.005780346820809248,"practices":0.005780346820809248,"accurately":0.005780346820809248,"identifies":0.005780346820809248,"be":0.005780346820809248,"deleted":0.005780346820809248,"meaningful":0.005780346820809248,"variable":0.005780346820809248,"names":0.005780346820809248,"better":0.005780346820809248,"readability":0.005780346820809248,"combine":0.005780346820809248,"with":0.005780346820809248,"other":0.005780346820809248,"functions":0.005780346820809248,"comprehensive":0.005780346820809248,"management":0.005780346820809248,"aware":0.005780346820809248,"performance":0.005780346820809248,"implications":0.005780346820809248,"frequent":0.005780346820809248,"deletions":0.005780346820809248,"large":0.005780346820809248,"practical":0.005780346820809248,"example":0.005780346820809248,"user's":0.005780346820809248,"let's":0.005780346820809248,"implement":0.005780346820809248,"that":0.005780346820809248,"deletes":0.005780346820809248,"define-map":0.005780346820809248,"userdata":0.005780346820809248,"userid":0.005780346820809248,"principal":0.005780346820809248,"buff":0.005780346820809248,"define-public":0.005780346820809248,"delete-user-data":0.005780346820809248,"user":0.005780346820809248,"ok":0.005780346820809248,"usage":0.005780346820809248,"map-set":0.005780346820809248,"tx-sender":0.005780346820809248,"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef":0.005780346820809248,"returns":0.005780346820809248,"true":0.005780346820809248,"this":0.005780346820809248,"demonstrates":0.005780346820809248,"using":0.005780346820809248,"implementing":0.005780346820809248,"public":0.005780346820809248,"delete":0.005780346820809248,"handling":0.005780346820809248,"case":0.005780346820809248,"where":0.005780346820809248,"present":0.005780346820809248,"needs":0.005780346820809248,"removed":0.005780346820809248,"common":0.005780346820809248,"pitfalls":0.005780346820809248,"causing":0.005780346820809248,"fail":0.005780346820809248,"assuming":0.005780346820809248,"will":0.005780346820809248,"always":0.005780346820809248,"exist":0.005780346820809248,"leading":0.005780346820809248,"unhandled":0.005780346820809248,"cases":0.005780346820809248,"not":0.005780346820809248,"all":0.005780346820809248,"possible":0.005780346820809248,"conditions":0.005780346820809248,"resulting":0.005780346820809248,"incomplete":0.005780346820809248,"overlooking":0.005780346820809248,"proper":0.005780346820809248,"error":0.005780346820809248,"validation":0.005780346820809248,"related":0.005780346820809248,"sets":0.005780346820809248,"value":0.005780346820809248,"associated":0.005780346820809248,"key":0.005780346820809248,"map-get":0.005780346820809248,"retrieves":0.005780346820809248,"map-insert":0.005780346820809248,"inserts":0.005780346820809248,"into":0.005780346820809248,"if":0.005780346820809248,"does":0.005780346820809248,"already":0.005780346820809248,"conclusion":0.005780346820809248,"fundamental":0.005780346820809248,"tool":0.005780346820809248,"allows":0.005780346820809248,"used":0.005780346820809248,"effectively":0.005780346820809248,"enhances":0.005780346820809248,"reliability":0.005780346820809248,"maintainability":0.005780346820809248,"code":0.005780346820809248,"providing":0.005780346820809248,"clear":0.005780346820809248,"concise":0.005780346820809248,"way":0.005780346820809248},"90":{"1":0.004149377593360996,"2":0.004149377593360996,"3":0.004149377593360996,"4":0.004149377593360996,"5":0.004149377593360996,"34":0.004149377593360996,"function":0.004149377593360996,"signature":0.004149377593360996,"clarity":0.004149377593360996,"contract-of":0.004149377593360996,"trait-reference":0.004149377593360996,"-":0.004149377593360996,"input":0.004149377593360996,"a":0.004149377593360996,"trait":0.004149377593360996,"reference":0.004149377593360996,"output":0.004149377593360996,"the":0.004149377593360996,"principal":0.004149377593360996,"of":0.004149377593360996,"contract":0.004149377593360996,"implementing":0.004149377593360996,"why":0.004149377593360996,"it":0.004149377593360996,"matters":0.004149377593360996,"is":0.004149377593360996,"crucial":0.004149377593360996,"for":0.004149377593360996,"retrieving":0.004149377593360996,"address":0.004149377593360996,"specific":0.004149377593360996,"enabling":0.004149377593360996,"dynamic":0.004149377593360996,"interactions":0.004149377593360996,"with":0.004149377593360996,"contracts":0.004149377593360996,"based":0.004149377593360996,"on":0.004149377593360996,"traits":0.004149377593360996,"contract-agnostic":0.004149377593360996,"functions":0.004149377593360996,"that":0.004149377593360996,"work":0.004149377593360996,"any":0.004149377593360996,"adhering":0.004149377593360996,"to":0.004149377593360996,"interface":0.004149377593360996,"enhancing":0.004149377593360996,"interoperability":0.004149377593360996,"between":0.004149377593360996,"in":0.004149377593360996,"composable":0.004149377593360996,"ecosystem":0.004149377593360996,"when":0.004149377593360996,"use":0.004149377593360996,"you":0.004149377593360996,"need":0.004149377593360996,"get":0.004149377593360996,"actual":0.004149377593360996,"from":0.004149377593360996,"perform":0.004149377593360996,"operations":0.004149377593360996,"require":0.004149377593360996,"contract's":0.004149377593360996,"such":0.004149377593360996,"as":0.004149377593360996,"authorization":0.004149377593360996,"checks":0.004149377593360996,"implement":0.004149377593360996,"can":0.004149377593360996,"multiple":0.004149377593360996,"same":0.004149377593360996,"debug":0.004149377593360996,"or":0.004149377593360996,"log":0.004149377593360996,"information":0.004149377593360996,"about":0.004149377593360996,"which":0.004149377593360996,"being":0.004149377593360996,"interacted":0.004149377593360996,"manage":0.004149377593360996,"routing":0.004149377593360996,"logic":0.004149377593360996,"different":0.004149377593360996,"versions":0.004149377593360996,"upgradeable":0.004149377593360996,"smart":0.004149377593360996,"access":0.004149377593360996,"control":0.004149377593360996,"mechanisms":0.004149377593360996,"restrict":0.004149377593360996,"calls":0.004149377593360996,"designated":0.004149377593360996,"best":0.004149377593360996,"practices":0.004149377593360996,"combination":0.004149377593360996,"create":0.004149377593360996,"more":0.004149377593360996,"flexible":0.004149377593360996,"and":0.004149377593360996,"remember":0.004149377593360996,"returns":0.004149377593360996,"be":0.004149377593360996,"used":0.004149377593360996,"other":0.004149377593360996,"expecting":0.004149377593360996,"consider":0.004149377593360996,"using":0.004149377593360996,"proxy":0.004149377593360996,"router":0.004149377593360996,"similar":0.004149377593360996,"aware":0.004149377593360996,"only":0.004149377593360996,"references":0.004149377593360996,"not":0.004149377593360996,"direct":0.004149377593360996,"practical":0.004149377593360996,"example":0.004149377593360996,"modular":0.004149377593360996,"approach":0.004149377593360996,"extension":0.004149377593360996,"let's":0.004149377593360996,"system":0.004149377593360996,"where":0.004149377593360996,"called":0.004149377593360996,"by":0.004149377593360996,"define":0.004149377593360996,"first":0.004149377593360996,"define-trait":0.004149377593360996,"extension-trait":0.004149377593360996,"callback":0.004149377593360996,"buff":0.004149377593360996,"response":0.004149377593360996,"bool":0.004149377593360996,"uint":0.004149377593360996,"main":0.004149377593360996,"next":0.004149377593360996,"request-extension-callback":0.004149377593360996,"use-trait":0.004149377593360996,"extensiontrait":0.004149377593360996,"define-map":0.004149377593360996,"extensions":0.004149377593360996,"define-public":0.004149377593360996,"set-extension":0.004149377593360996,"enabled":0.004149377593360996,"ok":0.004149377593360996,"map-set":0.004149377593360996,"memo":0.004149377593360996,"let":0.004149377593360996,"sender":0.004149377593360996,"tx-sender":0.004149377593360996,"asserts":0.004149377593360996,"is-extension":0.004149377593360996,"contract-caller":0.004149377593360996,"is-eq":0.004149377593360996,"err":0.004149377593360996,"u1":0.004149377593360996,"as-contract":0.004149377593360996,"contract-call":0.004149377593360996,"define-read-only":0.004149377593360996,"default-to":0.004149377593360996,"false":0.004149377593360996,"map-get":0.004149377593360996,"explanation":0.004149377593360996,"defines":0.004149377593360996,"must":0.004149377593360996,"data":0.004149377593360996,"map":0.004149377593360996,"valid":0.004149377593360996,"stores":0.004149377593360996,"status":0.004149377593360996,"disabled":0.004149377593360996,"public":0.004149377593360996,"this":0.004149377593360996,"allows":0.004149377593360996,"adding":0.004149377593360996,"removing":0.004149377593360996,"an":0.004149377593360996,"retrieves":0.004149377593360996,"caller":0.004149377593360996,"matches":0.004149377593360996,"read-only":0.004149377593360996,"if":0.004149377593360996,"given":0.004149377593360996,"usage":0.004149377593360996,"set":0.004149377593360996,"'sp2j4zq6zq6zq6zq6zq6zq6zq6zq6zq6zq6zq6zq6":0.004149377593360996,"true":0.004149377593360996,"request":0.004149377593360996,"extension-contract":0.004149377593360996,"demonstrates":0.004149377593360996,"check":0.004149377593360996,"restricting":0.004149377593360996,"certain":0.004149377593360996,"authorized":0.004149377593360996,"allowing":0.004149377593360996,"call":0.004149377593360996,"common":0.004149377593360996,"pitfalls":0.004149377593360996,"attempting":0.004149377593360996,"instead":0.004149377593360996,"forgetting":0.004149377593360996,"itself":0.004149377593360996,"handling":0.004149377593360996,"potential":0.004149377593360996,"errors":0.004149377593360996,"working":0.004149377593360996,"might":0.004149377593360996,"properly":0.004149377593360996,"initialized":0.004149377593360996,"related":0.004149377593360996,"often":0.004149377593360996,"retrieved":0.004149377593360996,"compare":0.004149377593360996,"returned":0.004149377593360996,"known":0.004149377593360996,"addresses":0.004149377593360996,"conclusion":0.004149377593360996,"powerful":0.004149377593360996,"tool":0.004149377593360996,"creating":0.004149377593360996,"interoperable":0.004149377593360996,"dynamically":0.004149377593360996,"retrieve":0.004149377593360996,"trait-implementing":0.004149377593360996,"enables":0.004149377593360996,"creation":0.004149377593360996,"generic":0.004149377593360996,"reusable":0.004149377593360996,"code":0.004149377593360996,"effectively":0.004149377593360996,"significantly":0.004149377593360996,"enhance":0.004149377593360996,"composability":0.004149377593360996,"modularity":0.004149377593360996,"your":0.004149377593360996,"especially":0.004149377593360996,"scenarios":0.004149377593360996,"like":0.004149377593360996,"management":0.004149377593360996,"essential":0.004149377593360996},"91":{"0":0.006535947712418301,"1":0.006535947712418301,"2":0.006535947712418301,"3":0.006535947712418301,"4":0.006535947712418301,"32":0.006535947712418301,"function":0.006535947712418301,"signature":0.006535947712418301,"clarity":0.006535947712418301,"keccak256":0.006535947712418301,"value":0.006535947712418301,"-":0.006535947712418301,"input":0.006535947712418301,"buff":0.006535947712418301,"output":0.006535947712418301,"why":0.006535947712418301,"it":0.006535947712418301,"matters":0.006535947712418301,"the":0.006535947712418301,"is":0.006535947712418301,"crucial":0.006535947712418301,"for":0.006535947712418301,"computing":0.006535947712418301,"cryptographic":0.006535947712418301,"hashes":0.006535947712418301,"of":0.006535947712418301,"data":0.006535947712418301,"ensuring":0.006535947712418301,"integrity":0.006535947712418301,"and":0.006535947712418301,"authenticity":0.006535947712418301,"implementing":0.006535947712418301,"operations":0.006535947712418301,"in":0.006535947712418301,"smart":0.006535947712418301,"contracts":0.006535947712418301,"creating":0.006535947712418301,"unique":0.006535947712418301,"identifiers":0.006535947712418301,"when":0.006535947712418301,"to":0.006535947712418301,"use":0.006535947712418301,"you":0.006535947712418301,"need":0.006535947712418301,"compute":0.006535947712418301,"a":0.006535947712418301,"hash":0.006535947712418301,"buffer":0.006535947712418301,"verify":0.006535947712418301,"generate":0.006535947712418301,"implement":0.006535947712418301,"your":0.006535947712418301,"contract":0.006535947712418301,"best":0.006535947712418301,"practices":0.006535947712418301,"ensure":0.006535947712418301,"correct":0.006535947712418301,"length":0.006535947712418301,"format":0.006535947712418301,"meaningful":0.006535947712418301,"variable":0.006535947712418301,"names":0.006535947712418301,"better":0.006535947712418301,"readability":0.006535947712418301,"combine":0.006535947712418301,"with":0.006535947712418301,"other":0.006535947712418301,"functions":0.006535947712418301,"more":0.006535947712418301,"complex":0.006535947712418301,"be":0.006535947712418301,"aware":0.006535947712418301,"security":0.006535947712418301,"implications":0.006535947712418301,"using":0.006535947712418301,"practical":0.006535947712418301,"example":0.006535947712418301,"hashing":0.006535947712418301,"user's":0.006535947712418301,"let's":0.006535947712418301,"that":0.006535947712418301,"computes":0.006535947712418301,"keccak-256":0.006535947712418301,"define-map":0.006535947712418301,"userdata":0.006535947712418301,"userid":0.006535947712418301,"principal":0.006535947712418301,"define-public":0.006535947712418301,"hash-user-data":0.006535947712418301,"user":0.006535947712418301,"let":0.006535947712418301,"default-to":0.006535947712418301,"map-get":0.006535947712418301,"ok":0.006535947712418301,"usage":0.006535947712418301,"map-set":0.006535947712418301,"tx-sender":0.006535947712418301,"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef":0.006535947712418301,"returns":0.006535947712418301,"this":0.006535947712418301,"demonstrates":0.006535947712418301,"public":0.006535947712418301,"return":0.006535947712418301,"handling":0.006535947712418301,"case":0.006535947712418301,"where":0.006535947712418301,"not":0.006535947712418301,"set":0.006535947712418301,"by":0.006535947712418301,"providing":0.006535947712418301,"default":0.006535947712418301,"common":0.006535947712418301,"pitfalls":0.006535947712418301,"on":0.006535947712418301,"non-buffer":0.006535947712418301,"types":0.006535947712418301,"causing":0.006535947712418301,"type":0.006535947712418301,"errors":0.006535947712418301,"cases":0.006535947712418301,"empty":0.006535947712418301,"or":0.006535947712418301,"invalid":0.006535947712418301,"overlooking":0.006535947712418301,"proper":0.006535947712418301,"error":0.006535947712418301,"validation":0.006535947712418301,"assuming":0.006535947712418301,"collision-resistant":0.006535947712418301,"without":0.006535947712418301,"understanding":0.006535947712418301,"its":0.006535947712418301,"limitations":0.006535947712418301,"related":0.006535947712418301,"sha256":0.006535947712418301,"sha-256":0.006535947712418301,"hash160":0.006535947712418301,"ripemd-160":0.006535947712418301,"concat":0.006535947712418301,"concatenates":0.006535947712418301,"multiple":0.006535947712418301,"buffers":0.006535947712418301,"conclusion":0.006535947712418301,"powerful":0.006535947712418301,"tool":0.006535947712418301,"allows":0.006535947712418301,"used":0.006535947712418301,"effectively":0.006535947712418301,"enhances":0.006535947712418301,"reliability":0.006535947712418301,"code":0.006535947712418301,"robust":0.006535947712418301,"mechanism":0.006535947712418301},"92":{"1":0.005434782608695652,"2":0.005434782608695652,"3":0.005434782608695652,"4":0.005434782608695652,"6":0.005434782608695652,"function":0.005434782608695652,"signature":0.005434782608695652,"clarity":0.005434782608695652,"define-constant":0.005434782608695652,"name":0.005434782608695652,"expression":0.005434782608695652,"-":0.005434782608695652,"input":0.005434782608695652,"the":0.005434782608695652,"of":0.005434782608695652,"constant":0.005434782608695652,"value":0.005434782608695652,"to":0.005434782608695652,"be":0.005434782608695652,"assigned":0.005434782608695652,"output":0.005434782608695652,"not":0.005434782608695652,"applicable":0.005434782608695652,"definition":0.005434782608695652,"statement":0.005434782608695652,"why":0.005434782608695652,"it":0.005434782608695652,"matters":0.005434782608695652,"is":0.005434782608695652,"crucial":0.005434782608695652,"for":0.005434782608695652,"declaring":0.005434782608695652,"immutable":0.005434782608695652,"values":0.005434782608695652,"that":0.005434782608695652,"can":0.005434782608695652,"reused":0.005434782608695652,"throughout":0.005434782608695652,"contract":0.005434782608695652,"improving":0.005434782608695652,"code":0.005434782608695652,"readability":0.005434782608695652,"by":0.005434782608695652,"giving":0.005434782608695652,"meaningful":0.005434782608695652,"names":0.005434782608695652,"fixed":0.005434782608695652,"optimizing":0.005434782608695652,"gas":0.005434782608695652,"costs":0.005434782608695652,"avoiding":0.005434782608695652,"repeated":0.005434782608695652,"computations":0.005434782608695652,"ensuring":0.005434782608695652,"certain":0.005434782608695652,"remain":0.005434782608695652,"unchanged":0.005434782608695652,"contract's":0.005434782608695652,"lifecycle":0.005434782608695652,"when":0.005434782608695652,"use":0.005434782608695652,"you":0.005434782608695652,"need":0.005434782608695652,"define":0.005434782608695652,"won't":0.005434782608695652,"change":0.005434782608695652,"during":0.005434782608695652,"execution":0.005434782608695652,"create":0.005434782608695652,"named":0.005434782608695652,"constants":0.005434782608695652,"magic":0.005434782608695652,"numbers":0.005434782608695652,"or":0.005434782608695652,"frequently":0.005434782608695652,"used":0.005434782608695652,"declare":0.005434782608695652,"contract-wide":0.005434782608695652,"configuration":0.005434782608695652,"parameters":0.005434782608695652,"optimize":0.005434782608695652,"usage":0.005434782608695652,"are":0.005434782608695652,"computed":0.005434782608695652,"but":0.005434782608695652,"never":0.005434782608695652,"best":0.005434782608695652,"practices":0.005434782608695652,"uppercase":0.005434782608695652,"distinguish":0.005434782608695652,"them":0.005434782608695652,"from":0.005434782608695652,"variables":0.005434782608695652,"place":0.005434782608695652,"definitions":0.005434782608695652,"at":0.005434782608695652,"top":0.005434782608695652,"your":0.005434782608695652,"better":0.005434782608695652,"visibility":0.005434782608695652,"multiple":0.005434782608695652,"times":0.005434782608695652,"in":0.005434782608695652,"consider":0.005434782608695652,"using":0.005434782608695652,"might":0.005434782608695652,"between":0.005434782608695652,"deployments":0.005434782608695652,"practical":0.005434782608695652,"example":0.005434782608695652,"token":0.005434782608695652,"let's":0.005434782608695652,"implement":0.005434782608695652,"a":0.005434782608695652,"simple":0.005434782608695652,"token_name":0.005434782608695652,"dog-go-to-the-moon":0.005434782608695652,"token_symbol":0.005434782608695652,"dog":0.005434782608695652,"token_decimals":0.005434782608695652,"u6":0.005434782608695652,"token_supply":0.005434782608695652,"u1000000000000":0.005434782608695652,"million":0.005434782608695652,"tokens":0.005434782608695652,"with":0.005434782608695652,"decimals":0.005434782608695652,"define-fungible-token":0.005434782608695652,"define-read-only":0.005434782608695652,"get-name":0.005434782608695652,"get-symbol":0.005434782608695652,"get-decimals":0.005434782608695652,"get-balance":0.005434782608695652,"who":0.005434782608695652,"principal":0.005434782608695652,"ok":0.005434782608695652,"ft-get-balance":0.005434782608695652,"this":0.005434782608695652,"demonstrates":0.005434782608695652,"set":0.005434782608695652,"up":0.005434782608695652,"referencing":0.005434782608695652,"these":0.005434782608695652,"various":0.005434782608695652,"parts":0.005434782608695652,"and":0.005434782608695652,"maintainability":0.005434782608695652,"common":0.005434782608695652,"pitfalls":0.005434782608695652,"attempting":0.005434782608695652,"modify":0.005434782608695652,"after":0.005434782608695652,"it's":0.005434782608695652,"defined":0.005434782608695652,"which":0.005434782608695652,"allowed":0.005434782608695652,"define-data-var":0.005434782608695652,"instead":0.005434782608695652,"overusing":0.005434782608695652,"only":0.005434782608695652,"once":0.005434782608695652,"decrease":0.005434782608695652,"related":0.005434782608695652,"functions":0.005434782608695652,"defining":0.005434782608695652,"mutable":0.005434782608695652,"define-map":0.005434782608695652,"data":0.005434782608695652,"maps":0.005434782608695652,"var-get":0.005434782608695652,"retrieve":0.005434782608695652,"variable":0.005434782608695652,"needed":0.005434782608695652,"conclusion":0.005434782608695652,"powerful":0.005434782608695652,"tool":0.005434782608695652,"creating":0.005434782608695652,"smart":0.005434782608695652,"contracts":0.005434782608695652,"effectively":0.005434782608695652,"improve":0.005434782608695652,"ensure":0.005434782608695652,"designing":0.005434782608695652,"should":0.005434782608695652},"93":{"1":0.006578947368421052,"2":0.006578947368421052,"3":0.006578947368421052,"4":0.006578947368421052,"42":0.006578947368421052,"81":0.006578947368421052,"123":0.006578947368421052,"165":0.006578947368421052,"222":0.006578947368421052,"function":0.006578947368421052,"signature":0.006578947368421052,"clarity":0.006578947368421052,"xor":0.006578947368421052,"int1":0.006578947368421052,"int2":0.006578947368421052,"-":0.006578947368421052,"input":0.006578947368421052,"int":0.006578947368421052,"output":0.006578947368421052,"why":0.006578947368421052,"it":0.006578947368421052,"matters":0.006578947368421052,"the":0.006578947368421052,"is":0.006578947368421052,"crucial":0.006578947368421052,"for":0.006578947368421052,"performing":0.006578947368421052,"bitwise":0.006578947368421052,"operations":0.006578947368421052,"essential":0.006578947368421052,"cryptographic":0.006578947368421052,"functions":0.006578947368421052,"implementing":0.006578947368421052,"conditional":0.006578947368421052,"logic":0.006578947368421052,"that":0.006578947368421052,"requires":0.006578947368421052,"toggling":0.006578947368421052,"between":0.006578947368421052,"states":0.006578947368421052,"enhancing":0.006578947368421052,"data":0.006578947368421052,"security":0.006578947368421052,"through":0.006578947368421052,"simple":0.006578947368421052,"encryption":0.006578947368421052,"mechanisms":0.006578947368421052,"simplifying":0.006578947368421052,"process":0.006578947368421052,"of":0.006578947368421052,"handling":0.006578947368421052,"in":0.006578947368421052,"smart":0.006578947368421052,"contracts":0.006578947368421052,"when":0.006578947368421052,"to":0.006578947368421052,"use":0.006578947368421052,"you":0.006578947368421052,"need":0.006578947368421052,"perform":0.006578947368421052,"exclusive":0.006578947368421052,"or":0.006578947368421052,"implement":0.006578947368421052,"decryption":0.006578947368421052,"toggle":0.006578947368421052,"two":0.006578947368421052,"based":0.006578947368421052,"on":0.006578947368421052,"certain":0.006578947368421052,"conditions":0.006578947368421052,"enhance":0.006578947368421052,"your":0.006578947368421052,"contract":0.006578947368421052,"best":0.006578947368421052,"practices":0.006578947368421052,"ensure":0.006578947368421052,"integers":0.006578947368421052,"used":0.006578947368421052,"with":0.006578947368421052,"are":0.006578947368421052,"within":0.006578947368421052,"valid":0.006578947368421052,"range":0.006578947368421052,"application":0.006578947368421052,"meaningful":0.006578947368421052,"variable":0.006578947368421052,"names":0.006578947368421052,"code":0.006578947368421052,"readability":0.006578947368421052,"combine":0.006578947368421052,"other":0.006578947368421052,"logical":0.006578947368421052,"complex":0.006578947368421052,"handle":0.006578947368421052,"possible":0.006578947368421052,"edge":0.006578947368421052,"cases":0.006578947368421052,"robust":0.006578947368421052,"behavior":0.006578947368421052,"practical":0.006578947368421052,"example":0.006578947368421052,"let's":0.006578947368421052,"a":0.006578947368421052,"and":0.006578947368421052,"mechanism":0.006578947368421052,"using":0.006578947368421052,"define-public":0.006578947368421052,"encrypt":0.006578947368421052,"key":0.006578947368421052,"ok":0.006578947368421052,"decrypt":0.006578947368421052,"encrypteddata":0.006578947368421052,"usage":0.006578947368421052,"encrypts":0.006578947368421052,"returns":0.006578947368421052,"decrypts":0.006578947368421052,"this":0.006578947368421052,"demonstrates":0.006578947368421052,"operation":0.006578947368421052,"public":0.006578947368421052,"both":0.006578947368421052,"successful":0.006578947368421052,"error":0.006578947368421052,"common":0.006578947368421052,"pitfalls":0.006578947368421052,"non-integer":0.006578947368421052,"types":0.006578947368421052,"causing":0.006578947368421052,"runtime":0.006578947368421052,"errors":0.006578947368421052,"misunderstanding":0.006578947368421052,"leading":0.006578947368421052,"incorrect":0.006578947368421052,"implementation":0.006578947368421052,"not":0.006578947368421052,"considering":0.006578947368421052,"resulting":0.006578947368421052,"incomplete":0.006578947368421052,"management":0.006578947368421052,"overlooking":0.006578947368421052,"proper":0.006578947368421052,"validation":0.006578947368421052,"related":0.006578947368421052,"performs":0.006578947368421052,"conclusion":0.006578947368421052,"powerful":0.006578947368421052,"tool":0.006578947368421052,"allows":0.006578947368421052,"functionality":0.006578947368421052,"effectively":0.006578947368421052,"simplifies":0.006578947368421052,"ensures":0.006578947368421052},"94":{"1":0.006535947712418301,"2":0.006535947712418301,"3":0.006535947712418301,"4":0.006535947712418301,"33":0.006535947712418301,"function":0.006535947712418301,"signature":0.006535947712418301,"clarity":0.006535947712418301,"principal-of":0.006535947712418301,"public-key":0.006535947712418301,"-":0.006535947712418301,"input":0.006535947712418301,"buff":0.006535947712418301,"output":0.006535947712418301,"response":0.006535947712418301,"principal":0.006535947712418301,"uint":0.006535947712418301,"why":0.006535947712418301,"it":0.006535947712418301,"matters":0.006535947712418301,"the":0.006535947712418301,"is":0.006535947712418301,"crucial":0.006535947712418301,"for":0.006535947712418301,"deriving":0.006535947712418301,"a":0.006535947712418301,"from":0.006535947712418301,"public":0.006535947712418301,"key":0.006535947712418301,"managing":0.006535947712418301,"identities":0.006535947712418301,"and":0.006535947712418301,"permissions":0.006535947712418301,"in":0.006535947712418301,"smart":0.006535947712418301,"contracts":0.006535947712418301,"ensuring":0.006535947712418301,"data":0.006535947712418301,"integrity":0.006535947712418301,"by":0.006535947712418301,"validating":0.006535947712418301,"to":0.006535947712418301,"conversion":0.006535947712418301,"simplifying":0.006535947712418301,"process":0.006535947712418301,"of":0.006535947712418301,"handling":0.006535947712418301,"principals":0.006535947712418301,"derived":0.006535947712418301,"keys":0.006535947712418301,"when":0.006535947712418301,"use":0.006535947712418301,"you":0.006535947712418301,"need":0.006535947712418301,"derive":0.006535947712418301,"manage":0.006535947712418301,"your":0.006535947712418301,"contract":0.006535947712418301,"validate":0.006535947712418301,"handle":0.006535947712418301,"derivation":0.006535947712418301,"operations":0.006535947712418301,"best":0.006535947712418301,"practices":0.006535947712418301,"ensure":0.006535947712418301,"correctly":0.006535947712418301,"formatted":0.006535947712418301,"valid":0.006535947712418301,"meaningful":0.006535947712418301,"variable":0.006535947712418301,"names":0.006535947712418301,"better":0.006535947712418301,"readability":0.006535947712418301,"combine":0.006535947712418301,"with":0.006535947712418301,"other":0.006535947712418301,"functions":0.006535947712418301,"comprehensive":0.006535947712418301,"identity":0.006535947712418301,"management":0.006535947712418301,"possible":0.006535947712418301,"error":0.006535947712418301,"cases":0.006535947712418301,"robust":0.006535947712418301,"behavior":0.006535947712418301,"practical":0.006535947712418301,"example":0.006535947712418301,"let's":0.006535947712418301,"implement":0.006535947712418301,"that":0.006535947712418301,"derives":0.006535947712418301,"define-public":0.006535947712418301,"derive-principal":0.006535947712418301,"usage":0.006535947712418301,"0x0390a5cac7c33fda49f70bc1b0866fa0ba7a9440d9de647fecb8132ceb76a94dfa":0.006535947712418301,"returns":0.006535947712418301,"ok":0.006535947712418301,"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.006535947712418301,"this":0.006535947712418301,"demonstrates":0.006535947712418301,"using":0.006535947712418301,"implementing":0.006535947712418301,"both":0.006535947712418301,"successful":0.006535947712418301,"common":0.006535947712418301,"pitfalls":0.006535947712418301,"an":0.006535947712418301,"incorrectly":0.006535947712418301,"or":0.006535947712418301,"invalid":0.006535947712418301,"causing":0.006535947712418301,"operation":0.006535947712418301,"fail":0.006535947712418301,"assuming":0.006535947712418301,"will":0.006535947712418301,"always":0.006535947712418301,"be":0.006535947712418301,"leading":0.006535947712418301,"unhandled":0.006535947712418301,"not":0.006535947712418301,"all":0.006535947712418301,"conditions":0.006535947712418301,"resulting":0.006535947712418301,"incomplete":0.006535947712418301,"overlooking":0.006535947712418301,"proper":0.006535947712418301,"validation":0.006535947712418301,"related":0.006535947712418301,"principal-construct":0.006535947712418301,"constructs":0.006535947712418301,"its":0.006535947712418301,"components":0.006535947712418301,"principal-destruct":0.006535947712418301,"decomposes":0.006535947712418301,"into":0.006535947712418301,"contract-caller":0.006535947712418301,"caller":0.006535947712418301,"current":0.006535947712418301,"context":0.006535947712418301,"conclusion":0.006535947712418301,"fundamental":0.006535947712418301,"tool":0.006535947712418301,"allows":0.006535947712418301,"used":0.006535947712418301,"effectively":0.006535947712418301,"enhances":0.006535947712418301,"reliability":0.006535947712418301,"maintainability":0.006535947712418301,"code":0.006535947712418301,"providing":0.006535947712418301,"clear":0.006535947712418301,"concise":0.006535947712418301,"way":0.006535947712418301},"95":{"1":0.004830917874396135,"2":0.004830917874396135,"3":0.004830917874396135,"4":0.004830917874396135,"32":0.004830917874396135,"function":0.004830917874396135,"signature":0.004830917874396135,"clarity":0.004830917874396135,"get-burn-block-info":0.004830917874396135,"prop-name":0.004830917874396135,"block-height":0.004830917874396135,"-":0.004830917874396135,"input":0.004830917874396135,"a":0.004830917874396135,"burnblockinfopropertyname":0.004830917874396135,"uint":0.004830917874396135,"representing":0.004830917874396135,"the":0.004830917874396135,"burnchain":0.004830917874396135,"block":0.004830917874396135,"height":0.004830917874396135,"output":0.004830917874396135,"optional":0.004830917874396135,"buff":0.004830917874396135,"tuple":0.004830917874396135,"addrs":0.004830917874396135,"list":0.004830917874396135,"hashbytes":0.004830917874396135,"version":0.004830917874396135,"payout":0.004830917874396135,"why":0.004830917874396135,"it":0.004830917874396135,"matters":0.004830917874396135,"is":0.004830917874396135,"crucial":0.004830917874396135,"for":0.004830917874396135,"accessing":0.004830917874396135,"historical":0.004830917874396135,"data":0.004830917874396135,"from":0.004830917874396135,"underlying":0.004830917874396135,"bitcoin":0.004830917874396135,"implementing":0.004830917874396135,"cross-chain":0.004830917874396135,"verification":0.004830917874396135,"or":0.004830917874396135,"logic":0.004830917874396135,"based":0.004830917874396135,"on":0.004830917874396135,"information":0.004830917874396135,"retrieving":0.004830917874396135,"pox":0.004830917874396135,"proof":0.004830917874396135,"of":0.004830917874396135,"transfer":0.004830917874396135,"related":0.004830917874396135,"advanced":0.004830917874396135,"stacking":0.004830917874396135,"operations":0.004830917874396135,"enabling":0.004830917874396135,"contracts":0.004830917874396135,"to":0.004830917874396135,"react":0.004830917874396135,"validate":0.004830917874396135,"events":0.004830917874396135,"when":0.004830917874396135,"use":0.004830917874396135,"you":0.004830917874396135,"need":0.004830917874396135,"verify":0.004830917874396135,"hashes":0.004830917874396135,"within":0.004830917874396135,"your":0.004830917874396135,"stacks":0.004830917874396135,"contract":0.004830917874396135,"access":0.004830917874396135,"about":0.004830917874396135,"payouts":0.004830917874396135,"and":0.004830917874396135,"addresses":0.004830917874396135,"implement":0.004830917874396135,"that":0.004830917874396135,"depends":0.004830917874396135,"build":0.004830917874396135,"applications":0.004830917874396135,"reference":0.004830917874396135,"state":0.004830917874396135,"best":0.004830917874396135,"practices":0.004830917874396135,"always":0.004830917874396135,"check":0.004830917874396135,"if":0.004830917874396135,"returned":0.004830917874396135,"value":0.004830917874396135,"none":0.004830917874396135,"as":0.004830917874396135,"will":0.004830917874396135,"be":0.004830917874396135,"non-existent":0.004830917874396135,"future":0.004830917874396135,"blocks":0.004830917874396135,"aware":0.004830917874396135,"potential":0.004830917874396135,"chain":0.004830917874396135,"reorganizations":0.004830917874396135,"using":0.004830917874396135,"recent":0.004830917874396135,"appropriate":0.004830917874396135,"property":0.004830917874396135,"name":0.004830917874396135,"retrieve":0.004830917874396135,"consider":0.004830917874396135,"caching":0.004830917874396135,"results":0.004830917874396135,"frequently":0.004830917874396135,"accessed":0.004830917874396135,"save":0.004830917874396135,"execution":0.004830917874396135,"costs":0.004830917874396135,"practical":0.004830917874396135,"example":0.004830917874396135,"verifying":0.004830917874396135,"hash":0.004830917874396135,"let's":0.004830917874396135,"verifies":0.004830917874396135,"given":0.004830917874396135,"matches":0.004830917874396135,"specific":0.004830917874396135,"define-read-only":0.004830917874396135,"verify-btc-block-hash":0.004830917874396135,"expectedhash":0.004830917874396135,"match":0.004830917874396135,"header-hash":0.004830917874396135,"is-eq":0.004830917874396135,"false":0.004830917874396135,"usage":0.004830917874396135,"u700000":0.004830917874396135,"0x00000000000000000009a11b3972c8e532e964e262c196556bd958b7fd0c55c3":0.004830917874396135,"this":0.004830917874396135,"demonstrates":0.004830917874396135,"handling":0.004830917874396135,"return":0.004830917874396135,"with":0.004830917874396135,"comparing":0.004830917874396135,"retrieved":0.004830917874396135,"an":0.004830917874396135,"expected":0.004830917874396135,"available":0.004830917874396135,"properties":0.004830917874396135,"returns":0.004830917874396135,"32-byte":0.004830917874396135,"buffer":0.004830917874396135,"header":0.004830917874396135,"pox-addrs":0.004830917874396135,"containing":0.004830917874396135,"up":0.004830917874396135,"two":0.004830917874396135,"received":0.004830917874396135,"amount":0.004830917874396135,"tokens":0.004830917874396135,"paid":0.004830917874396135,"each":0.004830917874396135,"address":0.004830917874396135,"common":0.004830917874396135,"pitfalls":0.004830917874396135,"assuming":0.004830917874396135,"all":0.004830917874396135,"are":0.004830917874396135,"not":0.004830917874396135,"case":0.004830917874396135,"invalid":0.004830917874396135,"in":0.004830917874396135,"misinterpreting":0.004830917874396135,"especially":0.004830917874396135,"during":0.004830917874396135,"different":0.004830917874396135,"phases":0.004830917874396135,"overlooking":0.004830917874396135,"fact":0.004830917874396135,"burn":0.004830917874396135,"may":0.004830917874396135,"included":0.004830917874396135,"functions":0.004830917874396135,"get-block-info":0.004830917874396135,"used":0.004830917874396135,"get":0.004830917874396135,"burn-block-height":0.004830917874396135,"keyword":0.004830917874396135,"current":0.004830917874396135,"conclusion":0.004830917874396135,"powerful":0.004830917874396135,"tool":0.004830917874396135,"smart":0.004830917874396135,"allows":0.004830917874396135,"incorporate":0.004830917874396135,"blockchain":0.004830917874396135,"into":0.004830917874396135,"pox-related":0.004830917874396135,"functionalities":0.004830917874396135,"correctly":0.004830917874396135,"provides":0.004830917874396135,"valuable":0.004830917874396135,"insights":0.004830917874396135,"blockchain's":0.004830917874396135,"can":0.004830917874396135,"sophisticated":0.004830917874396135,"behavior":0.004830917874396135},"96":{"1":0.005208333333333333,"2":0.005208333333333333,"3":0.005208333333333333,"4":0.005208333333333333,"10":0.005208333333333333,"function":0.005208333333333333,"signature":0.005208333333333333,"clarity":0.005208333333333333,"fold":0.005208333333333333,"sequence":0.005208333333333333,"initial-value":0.005208333333333333,"-":0.005208333333333333,"input":0.005208333333333333,"a":0.005208333333333333,"that":0.005208333333333333,"takes":0.005208333333333333,"two":0.005208333333333333,"arguments":0.005208333333333333,"and":0.005208333333333333,"returns":0.005208333333333333,"single":0.005208333333333333,"value":0.005208333333333333,"list":0.005208333333333333,"buffer":0.005208333333333333,"or":0.005208333333333333,"string":0.005208333333333333,"to":0.005208333333333333,"iterate":0.005208333333333333,"over":0.005208333333333333,"the":0.005208333333333333,"starting":0.005208333333333333,"for":0.005208333333333333,"accumulation":0.005208333333333333,"output":0.005208333333333333,"final":0.005208333333333333,"accumulated":0.005208333333333333,"why":0.005208333333333333,"it":0.005208333333333333,"matters":0.005208333333333333,"is":0.005208333333333333,"crucial":0.005208333333333333,"aggregating":0.005208333333333333,"values":0.005208333333333333,"from":0.005208333333333333,"into":0.005208333333333333,"result":0.005208333333333333,"performing":0.005208333333333333,"complex":0.005208333333333333,"computations":0.005208333333333333,"on":0.005208333333333333,"elements":0.005208333333333333,"transforming":0.005208333333333333,"data":0.005208333333333333,"structures":0.005208333333333333,"efficiently":0.005208333333333333,"implementing":0.005208333333333333,"recursive-like":0.005208333333333333,"operations":0.005208333333333333,"without":0.005208333333333333,"explicit":0.005208333333333333,"recursion":0.005208333333333333,"when":0.005208333333333333,"use":0.005208333333333333,"you":0.005208333333333333,"need":0.005208333333333333,"calculate":0.005208333333333333,"sum":0.005208333333333333,"product":0.005208333333333333,"other":0.005208333333333333,"aggregate":0.005208333333333333,"transform":0.005208333333333333,"different":0.005208333333333333,"structure":0.005208333333333333,"apply":0.005208333333333333,"each":0.005208333333333333,"element":0.005208333333333333,"of":0.005208333333333333,"while":0.005208333333333333,"maintaining":0.005208333333333333,"state":0.005208333333333333,"implement":0.005208333333333333,"algorithms":0.005208333333333333,"would":0.005208333333333333,"typically":0.005208333333333333,"require":0.005208333333333333,"best":0.005208333333333333,"practices":0.005208333333333333,"ensure":0.005208333333333333,"passed":0.005208333333333333,"commutative":0.005208333333333333,"if":0.005208333333333333,"order":0.005208333333333333,"doesn't":0.005208333333333333,"matter":0.005208333333333333,"meaningful":0.005208333333333333,"initial":0.005208333333333333,"make":0.005208333333333333,"sense":0.005208333333333333,"your":0.005208333333333333,"aggregation":0.005208333333333333,"consider":0.005208333333333333,"using":0.005208333333333333,"instead":0.005208333333333333,"loops":0.005208333333333333,"cleaner":0.005208333333333333,"more":0.005208333333333333,"functional":0.005208333333333333,"code":0.005208333333333333,"be":0.005208333333333333,"mindful":0.005208333333333333,"performance":0.005208333333333333,"implications":0.005208333333333333,"folding":0.005208333333333333,"large":0.005208333333333333,"sequences":0.005208333333333333,"practical":0.005208333333333333,"example":0.005208333333333333,"summing":0.005208333333333333,"numbers":0.005208333333333333,"let's":0.005208333333333333,"sums":0.005208333333333333,"all":0.005208333333333333,"in":0.005208333333333333,"define-read-only":0.005208333333333333,"sum-list":0.005208333333333333,"uint":0.005208333333333333,"u0":0.005208333333333333,"usage":0.005208333333333333,"u1":0.005208333333333333,"u2":0.005208333333333333,"u3":0.005208333333333333,"u4":0.005208333333333333,"u5":0.005208333333333333,"u15":0.005208333333333333,"this":0.005208333333333333,"demonstrates":0.005208333333333333,"with":0.005208333333333333,"built-in":0.005208333333333333,"an":0.005208333333333333,"applying":0.005208333333333333,"operation":0.005208333333333333,"common":0.005208333333333333,"pitfalls":0.005208333333333333,"wrong":0.005208333333333333,"type":0.005208333333333333,"forgetting":0.005208333333333333,"processes":0.005208333333333333,"left":0.005208333333333333,"right":0.005208333333333333,"which":0.005208333333333333,"non-commutative":0.005208333333333333,"overusing":0.005208333333333333,"might":0.005208333333333333,"clearly":0.005208333333333333,"expressed":0.005208333333333333,"functions":0.005208333333333333,"like":0.005208333333333333,"map":0.005208333333333333,"filter":0.005208333333333333,"related":0.005208333333333333,"applies":0.005208333333333333,"returning":0.005208333333333333,"new":0.005208333333333333,"selects":0.005208333333333333,"based":0.005208333333333333,"predicate":0.005208333333333333,"reduce":0.005208333333333333,"similar":0.005208333333333333,"languages":0.005208333333333333,"but":0.005208333333333333,"uses":0.005208333333333333,"conclusion":0.005208333333333333,"powerful":0.005208333333333333,"tool":0.005208333333333333,"smart":0.005208333333333333,"contracts":0.005208333333333333,"allows":0.005208333333333333,"express":0.005208333333333333,"concise":0.005208333333333333,"manner":0.005208333333333333,"used":0.005208333333333333,"effectively":0.005208333333333333,"can":0.005208333333333333,"simplify":0.005208333333333333,"improve":0.005208333333333333,"readability":0.005208333333333333,"provide":0.005208333333333333,"efficient":0.005208333333333333,"way":0.005208333333333333,"process":0.005208333333333333,"collections":0.005208333333333333,"within":0.005208333333333333},"97":{"1":0.0048543689320388345,"2":0.0048543689320388345,"3":0.0048543689320388345,"4":0.0048543689320388345,"50":0.0048543689320388345,"function":0.0048543689320388345,"signature":0.0048543689320388345,"clarity":0.0048543689320388345,"define-map":0.0048543689320388345,"map-name":0.0048543689320388345,"key-type":0.0048543689320388345,"value-type":0.0048543689320388345,"-":0.0048543689320388345,"input":0.0048543689320388345,"the":0.0048543689320388345,"name":0.0048543689320388345,"of":0.0048543689320388345,"map":0.0048543689320388345,"type":0.0048543689320388345,"map's":0.0048543689320388345,"keys":0.0048543689320388345,"values":0.0048543689320388345,"output":0.0048543689320388345,"not":0.0048543689320388345,"applicable":0.0048543689320388345,"definition":0.0048543689320388345,"statement":0.0048543689320388345,"why":0.0048543689320388345,"it":0.0048543689320388345,"matters":0.0048543689320388345,"is":0.0048543689320388345,"crucial":0.0048543689320388345,"for":0.0048543689320388345,"creating":0.0048543689320388345,"key-value":0.0048543689320388345,"stores":0.0048543689320388345,"within":0.0048543689320388345,"smart":0.0048543689320388345,"contracts":0.0048543689320388345,"efficiently":0.0048543689320388345,"organizing":0.0048543689320388345,"and":0.0048543689320388345,"accessing":0.0048543689320388345,"structured":0.0048543689320388345,"data":0.0048543689320388345,"implementing":0.0048543689320388345,"complex":0.0048543689320388345,"structures":0.0048543689320388345,"like":0.0048543689320388345,"mappings":0.0048543689320388345,"or":0.0048543689320388345,"dictionaries":0.0048543689320388345,"storing":0.0048543689320388345,"retrieving":0.0048543689320388345,"contract-specific":0.0048543689320388345,"associated":0.0048543689320388345,"with":0.0048543689320388345,"unique":0.0048543689320388345,"when":0.0048543689320388345,"to":0.0048543689320388345,"use":0.0048543689320388345,"you":0.0048543689320388345,"need":0.0048543689320388345,"store":0.0048543689320388345,"retrieve":0.0048543689320388345,"implement":0.0048543689320388345,"lookup":0.0048543689320388345,"tables":0.0048543689320388345,"in":0.0048543689320388345,"your":0.0048543689320388345,"contract":0.0048543689320388345,"organize":0.0048543689320388345,"that":0.0048543689320388345,"needs":0.0048543689320388345,"be":0.0048543689320388345,"accessed":0.0048543689320388345,"by":0.0048543689320388345,"a":0.0048543689320388345,"specific":0.0048543689320388345,"identifier":0.0048543689320388345,"create":0.0048543689320388345,"can":0.0048543689320388345,"updated":0.0048543689320388345,"queried":0.0048543689320388345,"best":0.0048543689320388345,"practices":0.0048543689320388345,"choose":0.0048543689320388345,"appropriate":0.0048543689320388345,"types":0.0048543689320388345,"ensure":0.0048543689320388345,"efficient":0.0048543689320388345,"storage":0.0048543689320388345,"retrieval":0.0048543689320388345,"meaningful":0.0048543689320388345,"names":0.0048543689320388345,"maps":0.0048543689320388345,"reflect":0.0048543689320388345,"their":0.0048543689320388345,"purpose":0.0048543689320388345,"consider":0.0048543689320388345,"using":0.0048543689320388345,"composite":0.0048543689320388345,"tuples":0.0048543689320388345,"more":0.0048543689320388345,"relationships":0.0048543689320388345,"mindful":0.0048543689320388345,"gas":0.0048543689320388345,"costs":0.0048543689320388345,"operations":0.0048543689320388345,"especially":0.0048543689320388345,"large":0.0048543689320388345,"datasets":0.0048543689320388345,"practical":0.0048543689320388345,"example":0.0048543689320388345,"simple":0.0048543689320388345,"user":0.0048543689320388345,"profile":0.0048543689320388345,"system":0.0048543689320388345,"let's":0.0048543689320388345,"basic":0.0048543689320388345,"userprofiles":0.0048543689320388345,"principal":0.0048543689320388345,"string-ascii":0.0048543689320388345,"age":0.0048543689320388345,"uint":0.0048543689320388345,"isactive":0.0048543689320388345,"bool":0.0048543689320388345,"define-public":0.0048543689320388345,"set-profile":0.0048543689320388345,"ok":0.0048543689320388345,"map-set":0.0048543689320388345,"tx-sender":0.0048543689320388345,"true":0.0048543689320388345,"define-read-only":0.0048543689320388345,"get-profile":0.0048543689320388345,"default-to":0.0048543689320388345,"u0":0.0048543689320388345,"false":0.0048543689320388345,"map-get":0.0048543689320388345,"deactivate-profile":0.0048543689320388345,"match":0.0048543689320388345,"merge":0.0048543689320388345,"err":0.0048543689320388345,"u404":0.0048543689320388345,"usage":0.0048543689320388345,"ryan":0.0048543689320388345,"u38":0.0048543689320388345,"this":0.0048543689320388345,"demonstrates":0.0048543689320388345,"functions":0.0048543689320388345,"set":0.0048543689320388345,"get":0.0048543689320388345,"update":0.0048543689320388345,"manipulate":0.0048543689320388345,"handling":0.0048543689320388345,"cases":0.0048543689320388345,"where":0.0048543689320388345,"might":0.0048543689320388345,"exist":0.0048543689320388345,"common":0.0048543689320388345,"pitfalls":0.0048543689320388345,"forgetting":0.0048543689320388345,"are":0.0048543689320388345,"iterable":0.0048543689320388345,"can't":0.0048543689320388345,"loop":0.0048543689320388345,"through":0.0048543689320388345,"all":0.0048543689320388345,"entries":0.0048543689320388345,"key":0.0048543689320388345,"overusing":0.0048543689320388345,"better":0.0048543689320388345,"suited":0.0048543689320388345,"other":0.0048543689320388345,"considering":0.0048543689320388345,"related":0.0048543689320388345,"used":0.0048543689320388345,"value":0.0048543689320388345,"from":0.0048543689320388345,"returns":0.0048543689320388345,"an":0.0048543689320388345,"optional":0.0048543689320388345,"map-delete":0.0048543689320388345,"remove":0.0048543689320388345,"pair":0.0048543689320388345,"map-insert":0.0048543689320388345,"insert":0.0048543689320388345,"new":0.0048543689320388345,"only":0.0048543689320388345,"if":0.0048543689320388345,"doesn't":0.0048543689320388345,"already":0.0048543689320388345,"two":0.0048543689320388345,"combining":0.0048543689320388345,"pairs":0.0048543689320388345,"conclusion":0.0048543689320388345,"powerful":0.0048543689320388345,"tool":0.0048543689320388345,"allows":0.0048543689320388345,"enabling":0.0048543689320388345,"lookups":0.0048543689320388345,"effectively":0.0048543689320388345,"significantly":0.0048543689320388345,"enhance":0.0048543689320388345,"functionality":0.0048543689320388345,"organization":0.0048543689320388345},"98":{"1":0.006756756756756757,"2":0.006756756756756757,"3":0.006756756756756757,"4":0.006756756756756757,"function":0.006756756756756757,"signature":0.006756756756756757,"clarity":0.006756756756756757,"stx-account":0.006756756756756757,"principal":0.006756756756756757,"-":0.006756756756756757,"input":0.006756756756756757,"output":0.006756756756756757,"tuple":0.006756756756756757,"balance":0.006756756756756757,"uint":0.006756756756756757,"nonce":0.006756756756756757,"stx-locked":0.006756756756756757,"why":0.006756756756756757,"it":0.006756756756756757,"matters":0.006756756756756757,"the":0.006756756756756757,"is":0.006756756756756757,"crucial":0.006756756756756757,"for":0.006756756756756757,"querying":0.006756756756756757,"detailed":0.006756756756756757,"information":0.006756756756756757,"about":0.006756756756756757,"a":0.006756756756756757,"stx":0.006756756756756757,"account":0.006756756756756757,"implementing":0.006756756756756757,"logic":0.006756756756756757,"that":0.006756756756756757,"requires":0.006756756756756757,"and":0.006756756756756757,"locked":0.006756756756756757,"ensuring":0.006756756756756757,"data":0.006756756756756757,"integrity":0.006756756756756757,"by":0.006756756756756757,"providing":0.006756756756756757,"accurate":0.006756756756756757,"details":0.006756756756756757,"simplifying":0.006756756756756757,"process":0.006756756756756757,"of":0.006756756756756757,"handling":0.006756756756756757,"account-related":0.006756756756756757,"operations":0.006756756756756757,"in":0.006756756756756757,"smart":0.006756756756756757,"contracts":0.006756756756756757,"when":0.006756756756756757,"to":0.006756756756756757,"use":0.006756756756756757,"you":0.006756756756756757,"need":0.006756756756756757,"query":0.006756756756756757,"implement":0.006756756756756757,"ensure":0.006756756756756757,"handle":0.006756756756756757,"your":0.006756756756756757,"contract":0.006756756756756757,"best":0.006756756756756757,"practices":0.006756756756756757,"correctly":0.006756756756756757,"formatted":0.006756756756756757,"valid":0.006756756756756757,"meaningful":0.006756756756756757,"variable":0.006756756756756757,"names":0.006756756756756757,"better":0.006756756756756757,"readability":0.006756756756756757,"combine":0.006756756756756757,"with":0.006756756756756757,"other":0.006756756756756757,"functions":0.006756756756756757,"comprehensive":0.006756756756756757,"management":0.006756756756756757,"possible":0.006756756756756757,"error":0.006756756756756757,"cases":0.006756756756756757,"robust":0.006756756756756757,"behavior":0.006756756756756757,"practical":0.006756756756756757,"example":0.006756756756756757,"let's":0.006756756756756757,"queries":0.006756756756756757,"given":0.006756756756756757,"define-read-only":0.006756756756756757,"get-stx-account-info":0.006756756756756757,"usage":0.006756756756756757,"'sz2j6zy48gv1ez5v2v5rb9mp66sw86pykkq9h6dpr":0.006756756756756757,"returns":0.006756756756756757,"u0":0.006756756756756757,"this":0.006756756756756757,"demonstrates":0.006756756756756757,"using":0.006756756756756757,"public":0.006756756756756757,"both":0.006756756756756757,"successful":0.006756756756756757,"common":0.006756756756756757,"pitfalls":0.006756756756756757,"an":0.006756756756756757,"incorrectly":0.006756756756756757,"or":0.006756756756756757,"invalid":0.006756756756756757,"causing":0.006756756756756757,"operation":0.006756756756756757,"fail":0.006756756756756757,"assuming":0.006756756756756757,"will":0.006756756756756757,"always":0.006756756756756757,"be":0.006756756756756757,"leading":0.006756756756756757,"unhandled":0.006756756756756757,"not":0.006756756756756757,"all":0.006756756756756757,"conditions":0.006756756756756757,"resulting":0.006756756756756757,"incomplete":0.006756756756756757,"overlooking":0.006756756756756757,"proper":0.006756756756756757,"validation":0.006756756756756757,"related":0.006756756756756757,"stx-get-balance":0.006756756756756757,"stx-transfer":0.006756756756756757,"transfers":0.006756756756756757,"from":0.006756756756756757,"one":0.006756756756756757,"another":0.006756756756756757,"stx-burn":0.006756756756756757,"burns":0.006756756756756757,"principal's":0.006756756756756757,"conclusion":0.006756756756756757,"fundamental":0.006756756756756757,"tool":0.006756756756756757,"allows":0.006756756756756757,"used":0.006756756756756757,"effectively":0.006756756756756757,"enhances":0.006756756756756757,"reliability":0.006756756756756757,"maintainability":0.006756756756756757,"code":0.006756756756756757,"clear":0.006756756756756757,"concise":0.006756756756756757,"way":0.006756756756756757},"99":{"0":0.005208333333333333,"1":0.005208333333333333,"2":0.005208333333333333,"3":0.005208333333333333,"4":0.005208333333333333,"function":0.005208333333333333,"signature":0.005208333333333333,"clarity":0.005208333333333333,"define-public":0.005208333333333333,"function-name":0.005208333333333333,"arg-name-0":0.005208333333333333,"arg-type-0":0.005208333333333333,"function-body":0.005208333333333333,"-":0.005208333333333333,"input":0.005208333333333333,"the":0.005208333333333333,"name":0.005208333333333333,"of":0.005208333333333333,"public":0.005208333333333333,"arg-name-n":0.005208333333333333,"each":0.005208333333333333,"argument":0.005208333333333333,"arg-type-n":0.005208333333333333,"type":0.005208333333333333,"code":0.005208333333333333,"to":0.005208333333333333,"be":0.005208333333333333,"executed":0.005208333333333333,"when":0.005208333333333333,"is":0.005208333333333333,"called":0.005208333333333333,"output":0.005208333333333333,"a":0.005208333333333333,"responsetype":0.005208333333333333,"using":0.005208333333333333,"ok":0.005208333333333333,"or":0.005208333333333333,"err":0.005208333333333333,"why":0.005208333333333333,"it":0.005208333333333333,"matters":0.005208333333333333,"crucial":0.005208333333333333,"for":0.005208333333333333,"creating":0.005208333333333333,"functions":0.005208333333333333,"that":0.005208333333333333,"can":0.005208333333333333,"from":0.005208333333333333,"outside":0.005208333333333333,"contract":0.005208333333333333,"enabling":0.005208333333333333,"interaction":0.005208333333333333,"with":0.005208333333333333,"through":0.005208333333333333,"transactions":0.005208333333333333,"implementing":0.005208333333333333,"main":0.005208333333333333,"entry":0.005208333333333333,"points":0.005208333333333333,"functionality":0.005208333333333333,"allowing":0.005208333333333333,"other":0.005208333333333333,"contracts":0.005208333333333333,"call":0.005208333333333333,"this":0.005208333333333333,"contract's":0.005208333333333333,"use":0.005208333333333333,"you":0.005208333333333333,"need":0.005208333333333333,"create":0.005208333333333333,"users":0.005208333333333333,"directly":0.005208333333333333,"interact":0.005208333333333333,"implement":0.005208333333333333,"core":0.005208333333333333,"should":0.005208333333333333,"accessible":0.005208333333333333,"externally":0.005208333333333333,"define":0.005208333333333333,"via":0.005208333333333333,"contract-call":0.005208333333333333,"modify":0.005208333333333333,"state":0.005208333333333333,"and":0.005208333333333333,"invoked":0.005208333333333333,"best":0.005208333333333333,"practices":0.005208333333333333,"always":0.005208333333333333,"return":0.005208333333333333,"response":0.005208333333333333,"t":0.005208333333333333,"e":0.005208333333333333,"descriptive":0.005208333333333333,"names":0.005208333333333333,"clearly":0.005208333333333333,"indicate":0.005208333333333333,"their":0.005208333333333333,"purpose":0.005208333333333333,"proper":0.005208333333333333,"access":0.005208333333333333,"control":0.005208333333333333,"sensitive":0.005208333333333333,"operations":0.005208333333333333,"handle":0.005208333333333333,"potential":0.005208333333333333,"errors":0.005208333333333333,"edge":0.005208333333333333,"cases":0.005208333333333333,"within":0.005208333333333333,"consider":0.005208333333333333,"gas":0.005208333333333333,"costs":0.005208333333333333,"designing":0.005208333333333333,"practical":0.005208333333333333,"examples":0.005208333333333333,"example":0.005208333333333333,"simple":0.005208333333333333,"counter":0.005208333333333333,"let's":0.005208333333333333,"incremented":0.005208333333333333,"by":0.005208333333333333,"define-data-var":0.005208333333333333,"int":0.005208333333333333,"increment-counter":0.005208333333333333,"begin":0.005208333333333333,"var-set":0.005208333333333333,"var-get":0.005208333333333333,"demonstrates":0.005208333333333333,"incrementing":0.005208333333333333,"returning":0.005208333333333333,"new":0.005208333333333333,"value":0.005208333333333333,"success":0.005208333333333333,"setting":0.005208333333333333,"sets":0.005208333333333333,"if":0.005208333333333333,"meets":0.005208333333333333,"certain":0.005208333333333333,"conditions":0.005208333333333333,"storedvalue":0.005208333333333333,"uint":0.005208333333333333,"u0":0.005208333333333333,"set-value":0.005208333333333333,"u1":0.005208333333333333,"only":0.005208333333333333,"condition":0.005208333333333333,"failure":0.005208333333333333,"common":0.005208333333333333,"pitfalls":0.005208333333333333,"forgetting":0.005208333333333333,"which":0.005208333333333333,"will":0.005208333333333333,"cause":0.005208333333333333,"invalid":0.005208333333333333,"not":0.005208333333333333,"controls":0.005208333333333333,"potentially":0.005208333333333333,"unauthorized":0.005208333333333333,"actions":0.005208333333333333,"overlooking":0.005208333333333333,"error":0.005208333333333333,"are":0.005208333333333333,"too":0.005208333333333333,"complex":0.005208333333333333,"gas-intensive":0.005208333333333333,"related":0.005208333333333333,"define-private":0.005208333333333333,"used":0.005208333333333333,"private":0.005208333333333333,"define-read-only":0.005208333333333333,"read-only":0.005208333333333333,"don't":0.005208333333333333,"defined":0.005208333333333333,"conclusion":0.005208333333333333,"fundamental":0.005208333333333333,"building":0.005208333333333333,"block":0.005208333333333333,"interactive":0.005208333333333333,"composable":0.005208333333333333,"smart":0.005208333333333333,"in":0.005208333333333333,"defining":0.005208333333333333,"decentralized":0.005208333333333333,"applications":0.005208333333333333,"however":0.005208333333333333,"it's":0.005208333333333333,"design":0.005208333333333333,"these":0.005208333333333333,"security":0.005208333333333333,"efficiency":0.005208333333333333,"usability":0.005208333333333333,"mind":0.005208333333333333},"100":{"1":0.00510204081632653,"2":0.00510204081632653,"3":0.00510204081632653,"4":0.00510204081632653,"function":0.00510204081632653,"signature":0.00510204081632653,"clarity":0.00510204081632653,"define-data-var":0.00510204081632653,"name":0.00510204081632653,"type":0.00510204081632653,"value":0.00510204081632653,"-":0.00510204081632653,"input":0.00510204081632653,"the":0.00510204081632653,"of":0.00510204081632653,"variable":0.00510204081632653,"initial":0.00510204081632653,"output":0.00510204081632653,"not":0.00510204081632653,"applicable":0.00510204081632653,"definition":0.00510204081632653,"statement":0.00510204081632653,"why":0.00510204081632653,"it":0.00510204081632653,"matters":0.00510204081632653,"is":0.00510204081632653,"crucial":0.00510204081632653,"for":0.00510204081632653,"creating":0.00510204081632653,"mutable":0.00510204081632653,"state":0.00510204081632653,"variables":0.00510204081632653,"that":0.00510204081632653,"can":0.00510204081632653,"be":0.00510204081632653,"updated":0.00510204081632653,"throughout":0.00510204081632653,"contract's":0.00510204081632653,"lifecycle":0.00510204081632653,"storing":0.00510204081632653,"and":0.00510204081632653,"managing":0.00510204081632653,"changeable":0.00510204081632653,"data":0.00510204081632653,"within":0.00510204081632653,"smart":0.00510204081632653,"contract":0.00510204081632653,"implementing":0.00510204081632653,"counters":0.00510204081632653,"flags":0.00510204081632653,"or":0.00510204081632653,"other":0.00510204081632653,"dynamic":0.00510204081632653,"values":0.00510204081632653,"need":0.00510204081632653,"to":0.00510204081632653,"modified":0.00510204081632653,"maintaining":0.00510204081632653,"contract-wide":0.00510204081632653,"accessed":0.00510204081632653,"by":0.00510204081632653,"multiple":0.00510204081632653,"functions":0.00510204081632653,"when":0.00510204081632653,"use":0.00510204081632653,"you":0.00510204081632653,"create":0.00510204081632653,"a":0.00510204081632653,"will":0.00510204081632653,"change":0.00510204081632653,"its":0.00510204081632653,"during":0.00510204081632653,"execution":0.00510204081632653,"implement":0.00510204081632653,"counter":0.00510204081632653,"accumulator":0.00510204081632653,"needs":0.00510204081632653,"store":0.00510204081632653,"temporary":0.00510204081632653,"intermediate":0.00510204081632653,"may":0.00510204081632653,"maintain":0.00510204081632653,"configurable":0.00510204081632653,"parameters":0.00510204081632653,"authorized":0.00510204081632653,"parties":0.00510204081632653,"best":0.00510204081632653,"practices":0.00510204081632653,"immutable":0.00510204081632653,"define-constant":0.00510204081632653,"instead":0.00510204081632653,"initialize":0.00510204081632653,"with":0.00510204081632653,"meaningful":0.00510204081632653,"default":0.00510204081632653,"consider":0.00510204081632653,"access":0.00510204081632653,"control":0.00510204081632653,"modify":0.00510204081632653,"important":0.00510204081632653,"clear":0.00510204081632653,"descriptive":0.00510204081632653,"names":0.00510204081632653,"your":0.00510204081632653,"enhance":0.00510204081632653,"readability":0.00510204081632653,"practical":0.00510204081632653,"example":0.00510204081632653,"simple":0.00510204081632653,"let's":0.00510204081632653,"basic":0.00510204081632653,"using":0.00510204081632653,"uint":0.00510204081632653,"u0":0.00510204081632653,"define-public":0.00510204081632653,"increment":0.00510204081632653,"begin":0.00510204081632653,"var-set":0.00510204081632653,"var-get":0.00510204081632653,"u1":0.00510204081632653,"ok":0.00510204081632653,"decrement":0.00510204081632653,"asserts":0.00510204081632653,"err":0.00510204081632653,"u":0.00510204081632653,"cannot":0.00510204081632653,"negative":0.00510204081632653,"define-read-only":0.00510204081632653,"get-counter":0.00510204081632653,"this":0.00510204081632653,"demonstrates":0.00510204081632653,"read":0.00510204081632653,"variable's":0.00510204081632653,"adding":0.00510204081632653,"safety":0.00510204081632653,"check":0.00510204081632653,"prevent":0.00510204081632653,"from":0.00510204081632653,"becoming":0.00510204081632653,"common":0.00510204081632653,"pitfalls":0.00510204081632653,"forgetting":0.00510204081632653,"creates":0.00510204081632653,"which":0.00510204081632653,"lead":0.00510204081632653,"unexpected":0.00510204081632653,"behavior":0.00510204081632653,"if":0.00510204081632653,"managed":0.00510204081632653,"carefully":0.00510204081632653,"considering":0.00510204081632653,"value's":0.00510204081632653,"impact":0.00510204081632653,"on":0.00510204081632653,"logic":0.00510204081632653,"especially":0.00510204081632653,"relies":0.00510204081632653,"overusing":0.00510204081632653,"constants":0.00510204081632653,"maps":0.00510204081632653,"might":0.00510204081632653,"more":0.00510204081632653,"appropriate":0.00510204081632653,"case":0.00510204081632653,"related":0.00510204081632653,"used":0.00510204081632653,"retrieve":0.00510204081632653,"current":0.00510204081632653,"update":0.00510204081632653,"defining":0.00510204081632653,"define-map":0.00510204081632653,"key-value":0.00510204081632653,"stores":0.00510204081632653,"complex":0.00510204081632653,"structures":0.00510204081632653,"are":0.00510204081632653,"needed":0.00510204081632653,"conclusion":0.00510204081632653,"essential":0.00510204081632653,"in":0.00510204081632653,"contracts":0.00510204081632653,"allows":0.00510204081632653,"judiciously":0.00510204081632653,"greatly":0.00510204081632653,"functionality":0.00510204081632653,"flexibility":0.00510204081632653,"however":0.00510204081632653,"should":0.00510204081632653,"mindful":0.00510204081632653,"implications":0.00510204081632653,"ensure":0.00510204081632653,"proper":0.00510204081632653,"error":0.00510204081632653,"handling":0.00510204081632653,"modifying":0.00510204081632653,"these":0.00510204081632653},"101":{"1":0.005813953488372093,"2":0.005813953488372093,"3":0.005813953488372093,"4":0.005813953488372093,"40":0.005813953488372093,"function":0.005813953488372093,"signature":0.005813953488372093,"clarity":0.005813953488372093,"nft-transfer":0.005813953488372093,"asset-class":0.005813953488372093,"asset-identifier":0.005813953488372093,"sender":0.005813953488372093,"recipient":0.005813953488372093,"-":0.005813953488372093,"input":0.005813953488372093,"assetname":0.005813953488372093,"a":0.005813953488372093,"principal":0.005813953488372093,"output":0.005813953488372093,"response":0.005813953488372093,"bool":0.005813953488372093,"uint":0.005813953488372093,"why":0.005813953488372093,"it":0.005813953488372093,"matters":0.005813953488372093,"the":0.005813953488372093,"is":0.005813953488372093,"crucial":0.005813953488372093,"for":0.005813953488372093,"changing":0.005813953488372093,"ownership":0.005813953488372093,"of":0.005813953488372093,"non-fungible":0.005813953488372093,"token":0.005813953488372093,"nft":0.005813953488372093,"implementing":0.005813953488372093,"logic":0.005813953488372093,"that":0.005813953488372093,"depends":0.005813953488372093,"on":0.005813953488372093,"transfer":0.005813953488372093,"nfts":0.005813953488372093,"ensuring":0.005813953488372093,"data":0.005813953488372093,"integrity":0.005813953488372093,"by":0.005813953488372093,"updating":0.005813953488372093,"records":0.005813953488372093,"simplifying":0.005813953488372093,"process":0.005813953488372093,"transferring":0.005813953488372093,"in":0.005813953488372093,"smart":0.005813953488372093,"contracts":0.005813953488372093,"when":0.005813953488372093,"to":0.005813953488372093,"use":0.005813953488372093,"you":0.005813953488372093,"need":0.005813953488372093,"change":0.005813953488372093,"an":0.005813953488372093,"implement":0.005813953488372093,"update":0.005813953488372093,"your":0.005813953488372093,"contract":0.005813953488372093,"handle":0.005813953488372093,"operations":0.005813953488372093,"best":0.005813953488372093,"practices":0.005813953488372093,"ensure":0.005813953488372093,"owns":0.005813953488372093,"before":0.005813953488372093,"attempting":0.005813953488372093,"and":0.005813953488372093,"are":0.005813953488372093,"different":0.005813953488372093,"principals":0.005813953488372093,"meaningful":0.005813953488372093,"variable":0.005813953488372093,"names":0.005813953488372093,"better":0.005813953488372093,"readability":0.005813953488372093,"combine":0.005813953488372093,"with":0.005813953488372093,"other":0.005813953488372093,"functions":0.005813953488372093,"comprehensive":0.005813953488372093,"management":0.005813953488372093,"possible":0.005813953488372093,"error":0.005813953488372093,"cases":0.005813953488372093,"robust":0.005813953488372093,"behavior":0.005813953488372093,"practical":0.005813953488372093,"example":0.005813953488372093,"let's":0.005813953488372093,"transfers":0.005813953488372093,"from":0.005813953488372093,"define-non-fungible-token":0.005813953488372093,"stackaroo":0.005813953488372093,"string-ascii":0.005813953488372093,"define-public":0.005813953488372093,"transfer-nft":0.005813953488372093,"id":0.005813953488372093,"tx-sender":0.005813953488372093,"usage":0.005813953488372093,"nft-mint":0.005813953488372093,"roo":0.005813953488372093,"returns":0.005813953488372093,"ok":0.005813953488372093,"true":0.005813953488372093,"'spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf":0.005813953488372093,"err":0.005813953488372093,"u1":0.005813953488372093,"because":0.005813953488372093,"no":0.005813953488372093,"longer":0.005813953488372093,"asset":0.005813953488372093,"nonexistent":0.005813953488372093,"u2":0.005813953488372093,"does":0.005813953488372093,"not":0.005813953488372093,"exist":0.005813953488372093,"this":0.005813953488372093,"demonstrates":0.005813953488372093,"using":0.005813953488372093,"public":0.005813953488372093,"operation":0.005813953488372093,"handling":0.005813953488372093,"both":0.005813953488372093,"successful":0.005813953488372093,"case":0.005813953488372093,"where":0.005813953488372093,"common":0.005813953488372093,"pitfalls":0.005813953488372093,"without":0.005813953488372093,"causing":0.005813953488372093,"fail":0.005813953488372093,"assuming":0.005813953488372093,"same":0.005813953488372093,"leading":0.005813953488372093,"invalid":0.005813953488372093,"all":0.005813953488372093,"conditions":0.005813953488372093,"resulting":0.005813953488372093,"incomplete":0.005813953488372093,"overlooking":0.005813953488372093,"proper":0.005813953488372093,"validation":0.005813953488372093,"related":0.005813953488372093,"mints":0.005813953488372093,"new":0.005813953488372093,"nft-get-owner":0.005813953488372093,"retrieves":0.005813953488372093,"owner":0.005813953488372093,"nft-burn":0.005813953488372093,"burns":0.005813953488372093,"conclusion":0.005813953488372093,"fundamental":0.005813953488372093,"tool":0.005813953488372093,"tokens":0.005813953488372093,"allows":0.005813953488372093,"used":0.005813953488372093,"effectively":0.005813953488372093,"enhances":0.005813953488372093,"reliability":0.005813953488372093,"maintainability":0.005813953488372093,"code":0.005813953488372093,"providing":0.005813953488372093,"clear":0.005813953488372093,"concise":0.005813953488372093,"way":0.005813953488372093},"102":{"1":0.0047169811320754715,"2":0.0047169811320754715,"3":0.0047169811320754715,"4":0.0047169811320754715,"the":0.0047169811320754715,"multiplication":0.0047169811320754715,"function":0.0047169811320754715,"in":0.0047169811320754715,"clarity":0.0047169811320754715,"performs":0.0047169811320754715,"on":0.0047169811320754715,"a":0.0047169811320754715,"variable":0.0047169811320754715,"number":0.0047169811320754715,"of":0.0047169811320754715,"integer":0.0047169811320754715,"inputs":0.0047169811320754715,"it's":0.0047169811320754715,"fundamental":0.0047169811320754715,"arithmetic":0.0047169811320754715,"operation":0.0047169811320754715,"used":0.0047169811320754715,"many":0.0047169811320754715,"smart":0.0047169811320754715,"contract":0.0047169811320754715,"calculations":0.0047169811320754715,"signature":0.0047169811320754715,"i1":0.0047169811320754715,"i2":0.0047169811320754715,"-":0.0047169811320754715,"input":0.0047169811320754715,"two":0.0047169811320754715,"or":0.0047169811320754715,"more":0.0047169811320754715,"integers":0.0047169811320754715,"int":0.0047169811320754715,"uint":0.0047169811320754715,"output":0.0047169811320754715,"single":0.0047169811320754715,"why":0.0047169811320754715,"it":0.0047169811320754715,"matters":0.0047169811320754715,"is":0.0047169811320754715,"crucial":0.0047169811320754715,"for":0.0047169811320754715,"performing":0.0047169811320754715,"basic":0.0047169811320754715,"within":0.0047169811320754715,"contracts":0.0047169811320754715,"scaling":0.0047169811320754715,"values":0.0047169811320754715,"such":0.0047169811320754715,"as":0.0047169811320754715,"calculating":0.0047169811320754715,"fees":0.0047169811320754715,"interest":0.0047169811320754715,"implementing":0.0047169811320754715,"complex":0.0047169811320754715,"mathematical":0.0047169811320754715,"operations":0.0047169811320754715,"adjusting":0.0047169811320754715,"token":0.0047169811320754715,"amounts":0.0047169811320754715,"financial":0.0047169811320754715,"when":0.0047169811320754715,"to":0.0047169811320754715,"use":0.0047169811320754715,"you":0.0047169811320754715,"need":0.0047169811320754715,"perform":0.0047169811320754715,"your":0.0047169811320754715,"logic":0.0047169811320754715,"scale":0.0047169811320754715,"proportionally":0.0047169811320754715,"calculate":0.0047169811320754715,"compound":0.0047169811320754715,"rates":0.0047169811320754715,"implement":0.0047169811320754715,"formulas":0.0047169811320754715,"that":0.0047169811320754715,"involve":0.0047169811320754715,"best":0.0047169811320754715,"practices":0.0047169811320754715,"always":0.0047169811320754715,"consider":0.0047169811320754715,"possibility":0.0047169811320754715,"overflow":0.0047169811320754715,"multiplying":0.0047169811320754715,"large":0.0047169811320754715,"numbers":0.0047169811320754715,"appropriate":0.0047169811320754715,"types":0.0047169811320754715,"based":0.0047169811320754715,"needs":0.0047169811320754715,"and":0.0047169811320754715,"expected":0.0047169811320754715,"value":0.0047169811320754715,"ranges":0.0047169811320754715,"using":0.0047169811320754715,"mul-overflow":0.0047169811320754715,"checked":0.0047169811320754715,"if":0.0047169811320754715,"detection":0.0047169811320754715,"needed":0.0047169811320754715,"be":0.0047169811320754715,"aware":0.0047169811320754715,"by":0.0047169811320754715,"zero":0.0047169811320754715,"will":0.0047169811320754715,"return":0.0047169811320754715,"practical":0.0047169811320754715,"example":0.0047169811320754715,"vesting":0.0047169811320754715,"let's":0.0047169811320754715,"simple":0.0047169811320754715,"uses":0.0047169811320754715,"vested":0.0047169811320754715,"define":0.0047169811320754715,"constants":0.0047169811320754715,"define-constant":0.0047169811320754715,"vesting_period":0.0047169811320754715,"u365":0.0047169811320754715,"year":0.0047169811320754715,"days":0.0047169811320754715,"total_allocation":0.0047169811320754715,"u1000000":0.0047169811320754715,"total":0.0047169811320754715,"tokens":0.0047169811320754715,"vest":0.0047169811320754715,"data":0.0047169811320754715,"variables":0.0047169811320754715,"define-data-var":0.0047169811320754715,"starttime":0.0047169811320754715,"u0":0.0047169811320754715,"beneficiary":0.0047169811320754715,"principal":0.0047169811320754715,"tx-sender":0.0047169811320754715,"initialize":0.0047169811320754715,"define-public":0.0047169811320754715,"start-vesting":0.0047169811320754715,"recipient":0.0047169811320754715,"begin":0.0047169811320754715,"asserts":0.0047169811320754715,"is-eq":0.0047169811320754715,"var-get":0.0047169811320754715,"err":0.0047169811320754715,"u1":0.0047169811320754715,"var-set":0.0047169811320754715,"block-height":0.0047169811320754715,"ok":0.0047169811320754715,"true":0.0047169811320754715,"amount":0.0047169811320754715,"define-read-only":0.0047169811320754715,"get-vested-amount":0.0047169811320754715,"let":0.0047169811320754715,"elapsed-time":0.0047169811320754715,"vesting-rate":0.0047169811320754715,"claim":0.0047169811320754715,"claim-tokens":0.0047169811320754715,"vested-amount":0.0047169811320754715,"u2":0.0047169811320754715,"here":0.0047169811320754715,"would":0.0047169811320754715,"typically":0.0047169811320754715,"transfer":0.0047169811320754715,"simplicity":0.0047169811320754715,"we're":0.0047169811320754715,"just":0.0047169811320754715,"returning":0.0047169811320754715,"this":0.0047169811320754715,"demonstrates":0.0047169811320754715,"elapsed":0.0047169811320754715,"time":0.0047169811320754715,"rate":0.0047169811320754715,"combining":0.0047169811320754715,"with":0.0047169811320754715,"division":0.0047169811320754715,"linear":0.0047169811320754715,"schedule":0.0047169811320754715,"part":0.0047169811320754715,"larger":0.0047169811320754715,"formula":0.0047169811320754715,"context":0.0047169811320754715,"common":0.0047169811320754715,"pitfalls":0.0047169811320754715,"overlooking":0.0047169811320754715,"potential":0.0047169811320754715,"not":0.0047169811320754715,"considering":0.0047169811320754715,"effect":0.0047169811320754715,"combined":0.0047169811320754715,"assuming":0.0047169811320754715,"increases":0.0047169811320754715,"forgetting":0.0047169811320754715,"about":0.0047169811320754715,"fractions":0.0047169811320754715,"related":0.0047169811320754715,"functions":0.0047169811320754715,"addition":0.0047169811320754715,"subtraction":0.0047169811320754715,"conclusion":0.0047169811320754715,"tool":0.0047169811320754715,"understanding":0.0047169811320754715,"its":0.0047169811320754715,"behavior":0.0047169811320754715,"different":0.0047169811320754715,"edge":0.0047169811320754715,"cases":0.0047169811320754715,"can":0.0047169811320754715,"effectively":0.0047169811320754715,"various":0.0047169811320754715,"from":0.0047169811320754715},"103":{"1":0.00558659217877095,"2":0.00558659217877095,"3":0.00558659217877095,"4":0.00558659217877095,"50":0.00558659217877095,"function":0.00558659217877095,"signature":0.00558659217877095,"clarity":0.00558659217877095,"default-to":0.00558659217877095,"default-value":0.00558659217877095,"option-value":0.00558659217877095,"-":0.00558659217877095,"input":0.00558659217877095,"a":0.00558659217877095,"value":0.00558659217877095,"of":0.00558659217877095,"type":0.00558659217877095,"an":0.00558659217877095,"optional":0.00558659217877095,"output":0.00558659217877095,"why":0.00558659217877095,"it":0.00558659217877095,"matters":0.00558659217877095,"the":0.00558659217877095,"is":0.00558659217877095,"crucial":0.00558659217877095,"for":0.00558659217877095,"safely":0.00558659217877095,"handling":0.00558659217877095,"values":0.00558659217877095,"in":0.00558659217877095,"smart":0.00558659217877095,"contracts":0.00558659217877095,"providing":0.00558659217877095,"fallback":0.00558659217877095,"when":0.00558659217877095,"dealing":0.00558659217877095,"with":0.00558659217877095,"potentially":0.00558659217877095,"missing":0.00558659217877095,"data":0.00558659217877095,"simplifying":0.00558659217877095,"code":0.00558659217877095,"that":0.00558659217877095,"works":0.00558659217877095,"map":0.00558659217877095,"lookups":0.00558659217877095,"or":0.00558659217877095,"other":0.00558659217877095,"operations":0.00558659217877095,"may":0.00558659217877095,"return":0.00558659217877095,"none":0.00558659217877095,"improving":0.00558659217877095,"readability":0.00558659217877095,"by":0.00558659217877095,"reducing":0.00558659217877095,"nested":0.00558659217877095,"conditionals":0.00558659217877095,"to":0.00558659217877095,"use":0.00558659217877095,"you":0.00558659217877095,"need":0.00558659217877095,"provide":0.00558659217877095,"default":0.00558659217877095,"lookup":0.00558659217877095,"might":0.00558659217877095,"handle":0.00558659217877095,"parameters":0.00558659217877095,"set":0.00558659217877095,"your":0.00558659217877095,"contract":0.00558659217877095,"logic":0.00558659217877095,"simplify":0.00558659217877095,"error":0.00558659217877095,"not":0.00558659217877095,"best":0.00558659217877095,"practices":0.00558659217877095,"choose":0.00558659217877095,"meaningful":0.00558659217877095,"make":0.00558659217877095,"sense":0.00558659217877095,"context":0.00558659217877095,"more":0.00558659217877095,"concise":0.00558659217877095,"and":0.00558659217877095,"readable":0.00558659217877095,"optionals":0.00558659217877095,"consider":0.00558659217877095,"implications":0.00558659217877095,"using":0.00558659217877095,"contract's":0.00558659217877095,"combine":0.00558659217877095,"functions":0.00558659217877095,"like":0.00558659217877095,"map-get":0.00558659217877095,"efficient":0.00558659217877095,"practical":0.00558659217877095,"example":0.00558659217877095,"user":0.00558659217877095,"profile":0.00558659217877095,"let's":0.00558659217877095,"implement":0.00558659217877095,"retrieves":0.00558659217877095,"user's":0.00558659217877095,"information":0.00558659217877095,"define-map":0.00558659217877095,"userprofiles":0.00558659217877095,"principal":0.00558659217877095,"name":0.00558659217877095,"string-ascii":0.00558659217877095,"age":0.00558659217877095,"uint":0.00558659217877095,"define-read-only":0.00558659217877095,"get-user-profile":0.00558659217877095,"let":0.00558659217877095,"anonymous":0.00558659217877095,"get":0.00558659217877095,"u0":0.00558659217877095,"usage":0.00558659217877095,"map-set":0.00558659217877095,"tx-sender":0.00558659217877095,"alice":0.00558659217877095,"u30":0.00558659217877095,"returns":0.00558659217877095,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":0.00558659217877095,"this":0.00558659217877095,"demonstrates":0.00558659217877095,"profiles":0.00558659217877095,"individual":0.00558659217877095,"fields":0.00558659217877095,"within":0.00558659217877095,"creating":0.00558659217877095,"safe":0.00558659217877095,"way":0.00558659217877095,"retrieve":0.00558659217877095,"without":0.00558659217877095,"explicit":0.00558659217877095,"null":0.00558659217877095,"checks":0.00558659217877095,"common":0.00558659217877095,"pitfalls":0.00558659217877095,"forgetting":0.00558659217877095,"only":0.00558659217877095,"types":0.00558659217877095,"general":0.00558659217877095,"be":0.00558659217877095,"indistinguishable":0.00558659217877095,"from":0.00558659217877095,"valid":0.00558659217877095,"leading":0.00558659217877095,"confusion":0.00558659217877095,"overusing":0.00558659217877095,"where":0.00558659217877095,"appropriate":0.00558659217877095,"related":0.00558659217877095,"often":0.00558659217877095,"used":0.00558659217877095,"combination":0.00558659217877095,"can":0.00558659217877095,"are":0.00558659217877095,"then":0.00558659217877095,"handled":0.00558659217877095,"some":0.00558659217877095,"create":0.00558659217877095,"conclusion":0.00558659217877095,"powerful":0.00558659217877095,"tool":0.00558659217877095,"clean":0.00558659217877095,"specify":0.00558659217877095,"enhances":0.00558659217877095,"safety":0.00558659217877095,"judiciously":0.00558659217877095,"significantly":0.00558659217877095,"robust":0.00558659217877095,"against":0.00558659217877095,"unexpected":0.00558659217877095,"inputs":0.00558659217877095,"states":0.00558659217877095},"104":{"0":0.0053475935828877,"1":0.0053475935828877,"2":0.0053475935828877,"3":0.0053475935828877,"4":0.0053475935828877,"15":0.0053475935828877,"32":0.0053475935828877,"callout":0.0053475935828877,"in":0.0053475935828877,"clarity":0.0053475935828877,"this":0.0053475935828877,"function":0.0053475935828877,"replaces":0.0053475935828877,"the":0.0053475935828877,"deprecated":0.0053475935828877,"get-block-info":0.0053475935828877,"signature":0.0053475935828877,"get-stacks-block-info":0.0053475935828877,"prop-name":0.0053475935828877,"block-height":0.0053475935828877,"-":0.0053475935828877,"input":0.0053475935828877,"a":0.0053475935828877,"stacksblockinfopropertyname":0.0053475935828877,"uint":0.0053475935828877,"representing":0.0053475935828877,"stacks":0.0053475935828877,"block":0.0053475935828877,"height":0.0053475935828877,"output":0.0053475935828877,"optional":0.0053475935828877,"buff":0.0053475935828877,"depending":0.0053475935828877,"on":0.0053475935828877,"property":0.0053475935828877,"why":0.0053475935828877,"it":0.0053475935828877,"matters":0.0053475935828877,"is":0.0053475935828877,"crucial":0.0053475935828877,"for":0.0053475935828877,"accessing":0.0053475935828877,"historical":0.0053475935828877,"data":0.0053475935828877,"within":0.0053475935828877,"smart":0.0053475935828877,"contracts":0.0053475935828877,"retrieving":0.0053475935828877,"globally":0.0053475935828877,"unique":0.0053475935828877,"identifiers":0.0053475935828877,"implementing":0.0053475935828877,"time-based":0.0053475935828877,"logic":0.0053475935828877,"using":0.0053475935828877,"information":0.0053475935828877,"verifying":0.0053475935828877,"block-related":0.0053475935828877,"properties":0.0053475935828877,"security":0.0053475935828877,"or":0.0053475935828877,"validation":0.0053475935828877,"purposes":0.0053475935828877,"when":0.0053475935828877,"to":0.0053475935828877,"use":0.0053475935828877,"you":0.0053475935828877,"need":0.0053475935828877,"retrieve":0.0053475935828877,"blocks":0.0053475935828877,"access":0.0053475935828877,"timestamps":0.0053475935828877,"verify":0.0053475935828877,"hashes":0.0053475935828877,"implement":0.0053475935828877,"that":0.0053475935828877,"depends":0.0053475935828877,"best":0.0053475935828877,"practices":0.0053475935828877,"always":0.0053475935828877,"id-header-hash":0.0053475935828877,"global":0.0053475935828877,"uniqueness":0.0053475935828877,"required":0.0053475935828877,"handle":0.0053475935828877,"none":0.0053475935828877,"case":0.0053475935828877,"non-existent":0.0053475935828877,"future":0.0053475935828877,"be":0.0053475935828877,"aware":0.0053475935828877,"of":0.0053475935828877,"different":0.0053475935828877,"timestamp":0.0053475935828877,"sources":0.0053475935828877,"before":0.0053475935828877,"and":0.0053475935828877,"after":0.0053475935828877,"epoch":0.0053475935828877,"consider":0.0053475935828877,"caching":0.0053475935828877,"frequently":0.0053475935828877,"accessed":0.0053475935828877,"practical":0.0053475935828877,"example":0.0053475935828877,"hash":0.0053475935828877,"verification":0.0053475935828877,"define-read-only":0.0053475935828877,"verify-block-hash":0.0053475935828877,"blockheight":0.0053475935828877,"expectedhash":0.0053475935828877,"match":0.0053475935828877,"is-eq":0.0053475935828877,"false":0.0053475935828877,"usage":0.0053475935828877,"u100":0.0053475935828877,"0x374708fff7719dd5979ec875d56cd2286f6d3cf7ec317a3b25632aab28ec37bb":0.0053475935828877,"demonstrates":0.0053475935828877,"block's":0.0053475935828877,"identifier":0.0053475935828877,"handling":0.0053475935828877,"return":0.0053475935828877,"value":0.0053475935828877,"comparing":0.0053475935828877,"available":0.0053475935828877,"returns":0.0053475935828877,"index":0.0053475935828877,"header-hash":0.0053475935828877,"header":0.0053475935828877,"time":0.0053475935828877,"as":0.0053475935828877,"unix":0.0053475935828877,"common":0.0053475935828877,"pitfalls":0.0053475935828877,"instead":0.0053475935828877,"not":0.0053475935828877,"invalid":0.0053475935828877,"heights":0.0053475935828877,"assuming":0.0053475935828877,"times":0.0053475935828877,"are":0.0053475935828877,"exact":0.0053475935828877,"accuracy":0.0053475935828877,"varies":0.0053475935828877,"by":0.0053475935828877,"pre-epoch":0.0053475935828877,"accurate":0.0053475935828877,"two":0.0053475935828877,"hours":0.0053475935828877,"post-epoch":0.0053475935828877,"must":0.0053475935828877,"greater":0.0053475935828877,"than":0.0053475935828877,"previous":0.0053475935828877,"at":0.0053475935828877,"most":0.0053475935828877,"seconds":0.0053475935828877,"considering":0.0053475935828877,"across":0.0053475935828877,"epochs":0.0053475935828877,"related":0.0053475935828877,"functions":0.0053475935828877,"get-tenure-info":0.0053475935828877,"used":0.0053475935828877,"get":0.0053475935828877,"about":0.0053475935828877,"tenures":0.0053475935828877,"current":0.0053475935828877,"at-block":0.0053475935828877,"with":0.0053475935828877,"state":0.0053475935828877,"conclusion":0.0053475935828877,"introduced":0.0053475935828877,"provides":0.0053475935828877,"essential":0.0053475935828877,"offers":0.0053475935828877,"reliable":0.0053475935828877,"ways":0.0053475935828877,"important":0.0053475935828877,"considerations":0.0053475935828877,"understanding":0.0053475935828877,"its":0.0053475935828877,"limitations":0.0053475935828877,"building":0.0053475935828877,"robust":0.0053475935828877,"interact":0.0053475935828877,"blockchain":0.0053475935828877},"105":{"1":0.006060606060606061,"2":0.006060606060606061,"3":0.006060606060606061,"4":0.006060606060606061,"5":0.006060606060606061,"6":0.006060606060606061,"8":0.006060606060606061,"10":0.006060606060606061,"function":0.006060606060606061,"signature":0.006060606060606061,"clarity":0.006060606060606061,"map":0.006060606060606061,"list":0.006060606060606061,"-":0.006060606060606061,"input":0.006060606060606061,"a":0.006060606060606061,"b":0.006060606060606061,"output":0.006060606060606061,"why":0.006060606060606061,"it":0.006060606060606061,"matters":0.006060606060606061,"the":0.006060606060606061,"is":0.006060606060606061,"crucial":0.006060606060606061,"for":0.006060606060606061,"applying":0.006060606060606061,"to":0.006060606060606061,"each":0.006060606060606061,"element":0.006060606060606061,"of":0.006060606060606061,"transforming":0.006060606060606061,"lists":0.006060606060606061,"by":0.006060606060606061,"operations":0.006060606060606061,"their":0.006060606060606061,"elements":0.006060606060606061,"simplifying":0.006060606060606061,"process":0.006060606060606061,"performing":0.006060606060606061,"bulk":0.006060606060606061,"on":0.006060606060606061,"enhancing":0.006060606060606061,"code":0.006060606060606061,"readability":0.006060606060606061,"and":0.006060606060606061,"maintainability":0.006060606060606061,"abstracting":0.006060606060606061,"repetitive":0.006060606060606061,"when":0.006060606060606061,"use":0.006060606060606061,"you":0.006060606060606061,"need":0.006060606060606061,"apply":0.006060606060606061,"transform":0.006060606060606061,"its":0.006060606060606061,"perform":0.006060606060606061,"simplify":0.006060606060606061,"abstract":0.006060606060606061,"best":0.006060606060606061,"practices":0.006060606060606061,"ensure":0.006060606060606061,"being":0.006060606060606061,"applied":0.006060606060606061,"compatible":0.006060606060606061,"with":0.006060606060606061,"meaningful":0.006060606060606061,"variable":0.006060606060606061,"names":0.006060606060606061,"better":0.006060606060606061,"combine":0.006060606060606061,"other":0.006060606060606061,"functions":0.006060606060606061,"comprehensive":0.006060606060606061,"handling":0.006060606060606061,"be":0.006060606060606061,"aware":0.006060606060606061,"performance":0.006060606060606061,"implications":0.006060606060606061,"large":0.006060606060606061,"practical":0.006060606060606061,"example":0.006060606060606061,"doubling":0.006060606060606061,"in":0.006060606060606061,"let's":0.006060606060606061,"implement":0.006060606060606061,"that":0.006060606060606061,"doubles":0.006060606060606061,"integers":0.006060606060606061,"define-private":0.006060606060606061,"double":0.006060606060606061,"n":0.006060606060606061,"int":0.006060606060606061,"define-read-only":0.006060606060606061,"double-elements":0.006060606060606061,"numbers":0.006060606060606061,"usage":0.006060606060606061,"returns":0.006060606060606061,"this":0.006060606060606061,"demonstrates":0.006060606060606061,"defining":0.006060606060606061,"private":0.006060606060606061,"an":0.006060606060606061,"integer":0.006060606060606061,"using":0.006060606060606061,"implementing":0.006060606060606061,"read-only":0.006060606060606061,"return":0.006060606060606061,"transformed":0.006060606060606061,"both":0.006060606060606061,"small":0.006060606060606061,"common":0.006060606060606061,"pitfalls":0.006060606060606061,"incompatible":0.006060606060606061,"types":0.006060606060606061,"causing":0.006060606060606061,"type":0.006060606060606061,"errors":0.006060606060606061,"assuming":0.006060606060606061,"will":0.006060606060606061,"always":0.006060606060606061,"within":0.006060606060606061,"certain":0.006060606060606061,"length":0.006060606060606061,"leading":0.006060606060606061,"unhandled":0.006060606060606061,"cases":0.006060606060606061,"not":0.006060606060606061,"all":0.006060606060606061,"possible":0.006060606060606061,"conditions":0.006060606060606061,"resulting":0.006060606060606061,"incomplete":0.006060606060606061,"transformations":0.006060606060606061,"overlooking":0.006060606060606061,"proper":0.006060606060606061,"error":0.006060606060606061,"validation":0.006060606060606061,"related":0.006060606060606061,"filter":0.006060606060606061,"filters":0.006060606060606061,"based":0.006060606060606061,"predicate":0.006060606060606061,"fold":0.006060606060606061,"reduces":0.006060606060606061,"single":0.006060606060606061,"value":0.006060606060606061,"len":0.006060606060606061,"conclusion":0.006060606060606061,"fundamental":0.006060606060606061,"tool":0.006060606060606061,"smart":0.006060606060606061,"contracts":0.006060606060606061,"allows":0.006060606060606061,"tasks":0.006060606060606061,"used":0.006060606060606061,"effectively":0.006060606060606061,"enhances":0.006060606060606061,"reliability":0.006060606060606061,"your":0.006060606060606061,"contract":0.006060606060606061,"providing":0.006060606060606061,"clear":0.006060606060606061,"concise":0.006060606060606061,"way":0.006060606060606061,"manage":0.006060606060606061},"106":{"1":0.0064516129032258064,"2":0.0064516129032258064,"3":0.0064516129032258064,"4":0.0064516129032258064,"function":0.0064516129032258064,"signature":0.0064516129032258064,"clarity":0.0064516129032258064,"sqrti":0.0064516129032258064,"n":0.0064516129032258064,"-":0.0064516129032258064,"input":0.0064516129032258064,"int":0.0064516129032258064,"uint":0.0064516129032258064,"output":0.0064516129032258064,"why":0.0064516129032258064,"it":0.0064516129032258064,"matters":0.0064516129032258064,"the":0.0064516129032258064,"is":0.0064516129032258064,"crucial":0.0064516129032258064,"for":0.0064516129032258064,"calculating":0.0064516129032258064,"largest":0.0064516129032258064,"integer":0.0064516129032258064,"less":0.0064516129032258064,"than":0.0064516129032258064,"or":0.0064516129032258064,"equal":0.0064516129032258064,"to":0.0064516129032258064,"square":0.0064516129032258064,"root":0.0064516129032258064,"of":0.0064516129032258064,"a":0.0064516129032258064,"number":0.0064516129032258064,"implementing":0.0064516129032258064,"mathematical":0.0064516129032258064,"operations":0.0064516129032258064,"in":0.0064516129032258064,"smart":0.0064516129032258064,"contracts":0.0064516129032258064,"ensuring":0.0064516129032258064,"data":0.0064516129032258064,"integrity":0.0064516129032258064,"by":0.0064516129032258064,"providing":0.0064516129032258064,"precise":0.0064516129032258064,"calculations":0.0064516129032258064,"simplifying":0.0064516129032258064,"process":0.0064516129032258064,"handling":0.0064516129032258064,"when":0.0064516129032258064,"use":0.0064516129032258064,"you":0.0064516129032258064,"need":0.0064516129032258064,"calculate":0.0064516129032258064,"implement":0.0064516129032258064,"your":0.0064516129032258064,"contract":0.0064516129032258064,"ensure":0.0064516129032258064,"handle":0.0064516129032258064,"best":0.0064516129032258064,"practices":0.0064516129032258064,"value":0.0064516129032258064,"non-negative":0.0064516129032258064,"avoid":0.0064516129032258064,"runtime":0.0064516129032258064,"errors":0.0064516129032258064,"meaningful":0.0064516129032258064,"variable":0.0064516129032258064,"names":0.0064516129032258064,"better":0.0064516129032258064,"readability":0.0064516129032258064,"combine":0.0064516129032258064,"with":0.0064516129032258064,"other":0.0064516129032258064,"functions":0.0064516129032258064,"comprehensive":0.0064516129032258064,"possible":0.0064516129032258064,"error":0.0064516129032258064,"cases":0.0064516129032258064,"robust":0.0064516129032258064,"behavior":0.0064516129032258064,"practical":0.0064516129032258064,"example":0.0064516129032258064,"roots":0.0064516129032258064,"let's":0.0064516129032258064,"that":0.0064516129032258064,"calculates":0.0064516129032258064,"given":0.0064516129032258064,"define-read-only":0.0064516129032258064,"calculate-sqrti":0.0064516129032258064,"usage":0.0064516129032258064,"u11":0.0064516129032258064,"returns":0.0064516129032258064,"u3":0.0064516129032258064,"u1000000":0.0064516129032258064,"u1000":0.0064516129032258064,"u1":0.0064516129032258064,"u0":0.0064516129032258064,"this":0.0064516129032258064,"demonstrates":0.0064516129032258064,"using":0.0064516129032258064,"public":0.0064516129032258064,"calculation":0.0064516129032258064,"both":0.0064516129032258064,"small":0.0064516129032258064,"and":0.0064516129032258064,"large":0.0064516129032258064,"values":0.0064516129032258064,"common":0.0064516129032258064,"pitfalls":0.0064516129032258064,"negative":0.0064516129032258064,"numbers":0.0064516129032258064,"causing":0.0064516129032258064,"operation":0.0064516129032258064,"fail":0.0064516129032258064,"assuming":0.0064516129032258064,"result":0.0064516129032258064,"will":0.0064516129032258064,"always":0.0064516129032258064,"be":0.0064516129032258064,"valid":0.0064516129032258064,"leading":0.0064516129032258064,"unhandled":0.0064516129032258064,"not":0.0064516129032258064,"all":0.0064516129032258064,"conditions":0.0064516129032258064,"resulting":0.0064516129032258064,"incomplete":0.0064516129032258064,"overlooking":0.0064516129032258064,"proper":0.0064516129032258064,"validation":0.0064516129032258064,"related":0.0064516129032258064,"multiplies":0.0064516129032258064,"two":0.0064516129032258064,"more":0.0064516129032258064,"adds":0.0064516129032258064,"subtracts":0.0064516129032258064,"one":0.0064516129032258064,"from":0.0064516129032258064,"another":0.0064516129032258064,"divides":0.0064516129032258064,"conclusion":0.0064516129032258064,"fundamental":0.0064516129032258064,"tool":0.0064516129032258064,"allows":0.0064516129032258064,"used":0.0064516129032258064,"effectively":0.0064516129032258064,"enhances":0.0064516129032258064,"reliability":0.0064516129032258064,"maintainability":0.0064516129032258064,"code":0.0064516129032258064,"clear":0.0064516129032258064,"concise":0.0064516129032258064,"way":0.0064516129032258064},"107":{"1":0.006060606060606061,"2":0.006060606060606061,"3":0.006060606060606061,"4":0.006060606060606061,"function":0.006060606060606061,"signature":0.006060606060606061,"clarity":0.006060606060606061,"log2":0.006060606060606061,"n":0.006060606060606061,"-":0.006060606060606061,"input":0.006060606060606061,"int":0.006060606060606061,"uint":0.006060606060606061,"output":0.006060606060606061,"why":0.006060606060606061,"it":0.006060606060606061,"matters":0.006060606060606061,"the":0.006060606060606061,"is":0.006060606060606061,"crucial":0.006060606060606061,"for":0.006060606060606061,"calculating":0.006060606060606061,"base-2":0.006060606060606061,"logarithm":0.006060606060606061,"of":0.006060606060606061,"a":0.006060606060606061,"number":0.006060606060606061,"implementing":0.006060606060606061,"mathematical":0.006060606060606061,"operations":0.006060606060606061,"that":0.006060606060606061,"require":0.006060606060606061,"logarithmic":0.006060606060606061,"calculations":0.006060606060606061,"simplifying":0.006060606060606061,"process":0.006060606060606061,"determining":0.006060606060606061,"power":0.006060606060606061,"needed":0.006060606060606061,"to":0.006060606060606061,"obtain":0.006060606060606061,"given":0.006060606060606061,"value":0.006060606060606061,"facilitating":0.006060606060606061,"depend":0.006060606060606061,"on":0.006060606060606061,"scaling":0.006060606060606061,"when":0.006060606060606061,"use":0.006060606060606061,"you":0.006060606060606061,"need":0.006060606060606061,"calculate":0.006060606060606061,"an":0.006060606060606061,"integer":0.006060606060606061,"or":0.006060606060606061,"unsigned":0.006060606060606061,"implement":0.006060606060606061,"logic":0.006060606060606061,"depends":0.006060606060606061,"determine":0.006060606060606061,"simplify":0.006060606060606061,"involving":0.006060606060606061,"logarithms":0.006060606060606061,"best":0.006060606060606061,"practices":0.006060606060606061,"ensure":0.006060606060606061,"non-negative":0.006060606060606061,"as":0.006060606060606061,"fails":0.006060606060606061,"negative":0.006060606060606061,"numbers":0.006060606060606061,"meaningful":0.006060606060606061,"variable":0.006060606060606061,"names":0.006060606060606061,"better":0.006060606060606061,"readability":0.006060606060606061,"combine":0.006060606060606061,"with":0.006060606060606061,"other":0.006060606060606061,"functions":0.006060606060606061,"comprehensive":0.006060606060606061,"be":0.006060606060606061,"aware":0.006060606060606061,"rounding":0.006060606060606061,"behavior":0.006060606060606061,"practical":0.006060606060606061,"example":0.006060606060606061,"let's":0.006060606060606061,"calculates":0.006060606060606061,"define-read-only":0.006060606060606061,"calculate-log2":0.006060606060606061,"usage":0.006060606060606061,"u8":0.006060606060606061,"returns":0.006060606060606061,"u3":0.006060606060606061,"u16":0.006060606060606061,"u4":0.006060606060606061,"this":0.006060606060606061,"demonstrates":0.006060606060606061,"using":0.006060606060606061,"read-only":0.006060606060606061,"return":0.006060606060606061,"handling":0.006060606060606061,"both":0.006060606060606061,"small":0.006060606060606061,"and":0.006060606060606061,"large":0.006060606060606061,"values":0.006060606060606061,"common":0.006060606060606061,"pitfalls":0.006060606060606061,"causing":0.006060606060606061,"fail":0.006060606060606061,"assuming":0.006060606060606061,"result":0.006060606060606061,"will":0.006060606060606061,"always":0.006060606060606061,"leading":0.006060606060606061,"incorrect":0.006060606060606061,"expectations":0.006060606060606061,"not":0.006060606060606061,"all":0.006060606060606061,"possible":0.006060606060606061,"conditions":0.006060606060606061,"resulting":0.006060606060606061,"in":0.006060606060606061,"incomplete":0.006060606060606061,"overlooking":0.006060606060606061,"proper":0.006060606060606061,"error":0.006060606060606061,"validation":0.006060606060606061,"related":0.006060606060606061,"sqrti":0.006060606060606061,"largest":0.006060606060606061,"less":0.006060606060606061,"than":0.006060606060606061,"equal":0.006060606060606061,"square":0.006060606060606061,"root":0.006060606060606061,"pow":0.006060606060606061,"raises":0.006060606060606061,"another":0.006060606060606061,"sqrt":0.006060606060606061,"conclusion":0.006060606060606061,"fundamental":0.006060606060606061,"tool":0.006060606060606061,"smart":0.006060606060606061,"contracts":0.006060606060606061,"allows":0.006060606060606061,"perform":0.006060606060606061,"enabling":0.006060606060606061,"robust":0.006060606060606061,"used":0.006060606060606061,"effectively":0.006060606060606061,"enhances":0.006060606060606061,"reliability":0.006060606060606061,"maintainability":0.006060606060606061,"your":0.006060606060606061,"contract":0.006060606060606061,"code":0.006060606060606061,"by":0.006060606060606061,"providing":0.006060606060606061,"clear":0.006060606060606061,"concise":0.006060606060606061,"way":0.006060606060606061,"manage":0.006060606060606061},"108":{"1":0.005235602094240838,"2":0.005235602094240838,"3":0.005235602094240838,"4":0.005235602094240838,"the":0.005235602094240838,"and":0.005235602094240838,"function":0.005235602094240838,"in":0.005235602094240838,"clarity":0.005235602094240838,"performs":0.005235602094240838,"a":0.005235602094240838,"logical":0.005235602094240838,"operation":0.005235602094240838,"on":0.005235602094240838,"two":0.005235602094240838,"or":0.005235602094240838,"more":0.005235602094240838,"boolean":0.005235602094240838,"inputs":0.005235602094240838,"it's":0.005235602094240838,"fundamental":0.005235602094240838,"used":0.005235602094240838,"many":0.005235602094240838,"smart":0.005235602094240838,"contract":0.005235602094240838,"conditions":0.005235602094240838,"control":0.005235602094240838,"flows":0.005235602094240838,"signature":0.005235602094240838,"b1":0.005235602094240838,"b2":0.005235602094240838,"-":0.005235602094240838,"input":0.005235602094240838,"values":0.005235602094240838,"output":0.005235602094240838,"single":0.005235602094240838,"value":0.005235602094240838,"why":0.005235602094240838,"it":0.005235602094240838,"matters":0.005235602094240838,"is":0.005235602094240838,"crucial":0.005235602094240838,"for":0.005235602094240838,"implementing":0.005235602094240838,"complex":0.005235602094240838,"conditional":0.005235602094240838,"logic":0.005235602094240838,"contracts":0.005235602094240838,"combining":0.005235602094240838,"multiple":0.005235602094240838,"that":0.005235602094240838,"all":0.005235602094240838,"need":0.005235602094240838,"to":0.005235602094240838,"be":0.005235602094240838,"true":0.005235602094240838,"short-circuiting":0.005235602094240838,"evaluations":0.005235602094240838,"efficiency":0.005235602094240838,"creating":0.005235602094240838,"sophisticated":0.005235602094240838,"access":0.005235602094240838,"mechanisms":0.005235602094240838,"when":0.005235602094240838,"use":0.005235602094240838,"you":0.005235602094240838,"check":0.005235602094240838,"if":0.005235602094240838,"are":0.005235602094240838,"implement":0.005235602094240838,"multi-factor":0.005235602094240838,"authentication":0.005235602094240838,"permissions":0.005235602094240838,"optimize":0.005235602094240838,"condition":0.005235602094240838,"checking":0.005235602094240838,"by":0.005235602094240838,"combine":0.005235602094240838,"results":0.005235602094240838,"of":0.005235602094240838,"comparison":0.005235602094240838,"operations":0.005235602094240838,"best":0.005235602094240838,"practices":0.005235602094240838,"leverage":0.005235602094240838,"behavior":0.005235602094240838,"order":0.005235602094240838,"from":0.005235602094240838,"most":0.005235602094240838,"likely":0.005235602094240838,"fail":0.005235602094240838,"least":0.005235602094240838,"better":0.005235602094240838,"performance":0.005235602094240838,"parentheses":0.005235602094240838,"group":0.005235602094240838,"expressions":0.005235602094240838,"consider":0.005235602094240838,"breaking":0.005235602094240838,"very":0.005235602094240838,"into":0.005235602094240838,"separate":0.005235602094240838,"functions":0.005235602094240838,"variables":0.005235602094240838,"readability":0.005235602094240838,"practical":0.005235602094240838,"example":0.005235602094240838,"simple":0.005235602094240838,"let's":0.005235602094240838,"uses":0.005235602094240838,"define-constant":0.005235602094240838,"contract_owner":0.005235602094240838,"tx-sender":0.005235602094240838,"define-data-var":0.005235602094240838,"isadmin":0.005235602094240838,"bool":0.005235602094240838,"false":0.005235602094240838,"isactive":0.005235602094240838,"define-public":0.005235602094240838,"set-admin":0.005235602094240838,"enabled":0.005235602094240838,"begin":0.005235602094240838,"asserts":0.005235602094240838,"is-eq":0.005235602094240838,"err":0.005235602094240838,"u1":0.005235602094240838,"ok":0.005235602094240838,"var-set":0.005235602094240838,"perform-sensitive-action":0.005235602094240838,"var-get":0.005235602094240838,"u2":0.005235602094240838,"perform":0.005235602094240838,"sensitive":0.005235602094240838,"action":0.005235602094240838,"here":0.005235602094240838,"usage":0.005235602094240838,"returns":0.005235602094240838,"this":0.005235602094240838,"demonstrates":0.005235602094240838,"using":0.005235602094240838,"sender":0.005235602094240838,"an":0.005235602094240838,"admin":0.005235602094240838,"active":0.005235602094240838,"expression":0.005235602094240838,"leveraging":0.005235602094240838,"avoid":0.005235602094240838,"unnecessary":0.005235602094240838,"computations":0.005235602094240838,"first":0.005235602094240838,"fails":0.005235602094240838,"common":0.005235602094240838,"pitfalls":0.005235602094240838,"forgetting":0.005235602094240838,"short-circuits":0.005235602094240838,"which":0.005235602094240838,"might":0.005235602094240838,"lead":0.005235602094240838,"unexpected":0.005235602094240838,"side":0.005235602094240838,"effects":0.005235602094240838,"intended":0.005235602094240838,"later":0.005235602094240838,"over-complicating":0.005235602094240838,"making":0.005235602094240838,"them":0.005235602094240838,"hard":0.005235602094240838,"read":0.005235602094240838,"maintain":0.005235602094240838,"not":0.005235602094240838,"considering":0.005235602094240838,"optimal":0.005235602094240838,"related":0.005235602094240838,"negate":0.005235602094240838,"often":0.005235602094240838,"combination":0.005235602094240838,"with":0.005235602094240838,"checks":0.005235602094240838,"conclusion":0.005235602094240838,"powerful":0.005235602094240838,"tool":0.005235602094240838,"understanding":0.005235602094240838,"its":0.005235602094240838,"effectively":0.005235602094240838,"can":0.005235602094240838,"create":0.005235602094240838,"efficient":0.005235602094240838,"especially":0.005235602094240838,"scenarios":0.005235602094240838,"requiring":0.005235602094240838,"simultaneously":0.005235602094240838},"109":{"1":0.006211180124223602,"2":0.006211180124223602,"3":0.006211180124223602,"4":0.006211180124223602,"5":0.006211180124223602,"10":0.006211180124223602,"function":0.006211180124223602,"signature":0.006211180124223602,"clarity":0.006211180124223602,"replace-at":0.006211180124223602,"sequence":0.006211180124223602,"index":0.006211180124223602,"new-element":0.006211180124223602,"-":0.006211180124223602,"input":0.006211180124223602,"sequence_a":0.006211180124223602,"uint":0.006211180124223602,"a":0.006211180124223602,"output":0.006211180124223602,"response":0.006211180124223602,"why":0.006211180124223602,"it":0.006211180124223602,"matters":0.006211180124223602,"the":0.006211180124223602,"is":0.006211180124223602,"crucial":0.006211180124223602,"for":0.006211180124223602,"modifying":0.006211180124223602,"elements":0.006211180124223602,"in":0.006211180124223602,"at":0.006211180124223602,"specific":0.006211180124223602,"implementing":0.006211180124223602,"logic":0.006211180124223602,"that":0.006211180124223602,"requires":0.006211180124223602,"updating":0.006211180124223602,"sequences":0.006211180124223602,"ensuring":0.006211180124223602,"data":0.006211180124223602,"integrity":0.006211180124223602,"by":0.006211180124223602,"validating":0.006211180124223602,"and":0.006211180124223602,"element":0.006211180124223602,"replacement":0.006211180124223602,"simplifying":0.006211180124223602,"process":0.006211180124223602,"of":0.006211180124223602,"handling":0.006211180124223602,"modifications":0.006211180124223602,"smart":0.006211180124223602,"contracts":0.006211180124223602,"when":0.006211180124223602,"to":0.006211180124223602,"use":0.006211180124223602,"you":0.006211180124223602,"need":0.006211180124223602,"modify":0.006211180124223602,"an":0.006211180124223602,"implement":0.006211180124223602,"validate":0.006211180124223602,"your":0.006211180124223602,"contract":0.006211180124223602,"handle":0.006211180124223602,"modification":0.006211180124223602,"operations":0.006211180124223602,"best":0.006211180124223602,"practices":0.006211180124223602,"ensure":0.006211180124223602,"within":0.006211180124223602,"bounds":0.006211180124223602,"meaningful":0.006211180124223602,"variable":0.006211180124223602,"names":0.006211180124223602,"better":0.006211180124223602,"readability":0.006211180124223602,"combine":0.006211180124223602,"with":0.006211180124223602,"other":0.006211180124223602,"functions":0.006211180124223602,"comprehensive":0.006211180124223602,"management":0.006211180124223602,"possible":0.006211180124223602,"error":0.006211180124223602,"cases":0.006211180124223602,"robust":0.006211180124223602,"behavior":0.006211180124223602,"practical":0.006211180124223602,"example":0.006211180124223602,"replacing":0.006211180124223602,"list":0.006211180124223602,"let's":0.006211180124223602,"replaces":0.006211180124223602,"define-read-only":0.006211180124223602,"replace-element":0.006211180124223602,"items":0.006211180124223602,"int":0.006211180124223602,"newelement":0.006211180124223602,"usage":0.006211180124223602,"u2":0.006211180124223602,"returns":0.006211180124223602,"some":0.006211180124223602,"u5":0.006211180124223602,"none":0.006211180124223602,"because":0.006211180124223602,"out":0.006211180124223602,"this":0.006211180124223602,"demonstrates":0.006211180124223602,"using":0.006211180124223602,"public":0.006211180124223602,"both":0.006211180124223602,"successful":0.006211180124223602,"common":0.006211180124223602,"pitfalls":0.006211180124223602,"causing":0.006211180124223602,"operation":0.006211180124223602,"fail":0.006211180124223602,"assuming":0.006211180124223602,"will":0.006211180124223602,"always":0.006211180124223602,"be":0.006211180124223602,"valid":0.006211180124223602,"leading":0.006211180124223602,"unhandled":0.006211180124223602,"not":0.006211180124223602,"all":0.006211180124223602,"conditions":0.006211180124223602,"resulting":0.006211180124223602,"incomplete":0.006211180124223602,"overlooking":0.006211180124223602,"proper":0.006211180124223602,"validation":0.006211180124223602,"related":0.006211180124223602,"append":0.006211180124223602,"adds":0.006211180124223602,"end":0.006211180124223602,"index-of":0.006211180124223602,"first":0.006211180124223602,"which":0.006211180124223602,"item":0.006211180124223602,"can":0.006211180124223602,"found":0.006211180124223602,"get":0.006211180124223602,"retrieves":0.006211180124223602,"from":0.006211180124223602,"conclusion":0.006211180124223602,"fundamental":0.006211180124223602,"tool":0.006211180124223602,"allows":0.006211180124223602,"update":0.006211180124223602,"used":0.006211180124223602,"effectively":0.006211180124223602,"enhances":0.006211180124223602,"reliability":0.006211180124223602,"maintainability":0.006211180124223602,"code":0.006211180124223602,"providing":0.006211180124223602,"clear":0.006211180124223602,"concise":0.006211180124223602,"way":0.006211180124223602},"110":{"1":0.005780346820809248,"2":0.005780346820809248,"3":0.005780346820809248,"4":0.005780346820809248,"5":0.005780346820809248,"6":0.005780346820809248,"7":0.005780346820809248,"8":0.005780346820809248,"9":0.005780346820809248,"10":0.005780346820809248,"11":0.005780346820809248,"function":0.005780346820809248,"signature":0.005780346820809248,"clarity":0.005780346820809248,"len":0.005780346820809248,"sequence":0.005780346820809248,"-":0.005780346820809248,"input":0.005780346820809248,"sequence_a":0.005780346820809248,"output":0.005780346820809248,"uint":0.005780346820809248,"why":0.005780346820809248,"it":0.005780346820809248,"matters":0.005780346820809248,"the":0.005780346820809248,"is":0.005780346820809248,"crucial":0.005780346820809248,"for":0.005780346820809248,"determining":0.005780346820809248,"length":0.005780346820809248,"of":0.005780346820809248,"various":0.005780346820809248,"types":0.005780346820809248,"implementing":0.005780346820809248,"logic":0.005780346820809248,"that":0.005780346820809248,"depends":0.005780346820809248,"on":0.005780346820809248,"size":0.005780346820809248,"sequences":0.005780346820809248,"ensuring":0.005780346820809248,"data":0.005780346820809248,"integrity":0.005780346820809248,"by":0.005780346820809248,"validating":0.005780346820809248,"lengths":0.005780346820809248,"simplifying":0.005780346820809248,"checks":0.005780346820809248,"in":0.005780346820809248,"smart":0.005780346820809248,"contract":0.005780346820809248,"code":0.005780346820809248,"when":0.005780346820809248,"to":0.005780346820809248,"use":0.005780346820809248,"you":0.005780346820809248,"need":0.005780346820809248,"get":0.005780346820809248,"a":0.005780346820809248,"list":0.005780346820809248,"buffer":0.005780346820809248,"or":0.005780346820809248,"string":0.005780346820809248,"implement":0.005780346820809248,"validate":0.005780346820809248,"handle":0.005780346820809248,"cases":0.005780346820809248,"where":0.005780346820809248,"important":0.005780346820809248,"best":0.005780346820809248,"practices":0.005780346820809248,"ensure":0.005780346820809248,"type":0.005780346820809248,"compatible":0.005780346820809248,"with":0.005780346820809248,"meaningful":0.005780346820809248,"variable":0.005780346820809248,"names":0.005780346820809248,"better":0.005780346820809248,"readability":0.005780346820809248,"combine":0.005780346820809248,"other":0.005780346820809248,"functions":0.005780346820809248,"comprehensive":0.005780346820809248,"handling":0.005780346820809248,"be":0.005780346820809248,"aware":0.005780346820809248,"maximum":0.005780346820809248,"practical":0.005780346820809248,"example":0.005780346820809248,"let's":0.005780346820809248,"validates":0.005780346820809248,"integers":0.005780346820809248,"define-read-only":0.005780346820809248,"validate-list-length":0.005780346820809248,"numbers":0.005780346820809248,"int":0.005780346820809248,"let":0.005780346820809248,"if":0.005780346820809248,"u10":0.005780346820809248,"ok":0.005780346820809248,"err":0.005780346820809248,"u1":0.005780346820809248,"usage":0.005780346820809248,"returns":0.005780346820809248,"u5":0.005780346820809248,"this":0.005780346820809248,"demonstrates":0.005780346820809248,"using":0.005780346820809248,"conditional":0.005780346820809248,"based":0.005780346820809248,"both":0.005780346820809248,"case":0.005780346820809248,"valid":0.005780346820809248,"and":0.005780346820809248,"not":0.005780346820809248,"common":0.005780346820809248,"pitfalls":0.005780346820809248,"incompatible":0.005780346820809248,"causing":0.005780346820809248,"errors":0.005780346820809248,"assuming":0.005780346820809248,"will":0.005780346820809248,"always":0.005780346820809248,"within":0.005780346820809248,"certain":0.005780346820809248,"range":0.005780346820809248,"leading":0.005780346820809248,"unhandled":0.005780346820809248,"all":0.005780346820809248,"possible":0.005780346820809248,"conditions":0.005780346820809248,"resulting":0.005780346820809248,"incomplete":0.005780346820809248,"overlooking":0.005780346820809248,"validation":0.005780346820809248,"error":0.005780346820809248,"checking":0.005780346820809248,"related":0.005780346820809248,"as-max-len":0.005780346820809248,"ensures":0.005780346820809248,"does":0.005780346820809248,"exceed":0.005780346820809248,"concat":0.005780346820809248,"concatenates":0.005780346820809248,"multiple":0.005780346820809248,"default-to":0.005780346820809248,"provides":0.005780346820809248,"default":0.005780346820809248,"values":0.005780346820809248,"optional":0.005780346820809248,"conclusion":0.005780346820809248,"fundamental":0.005780346820809248,"tool":0.005780346820809248,"getting":0.005780346820809248,"contracts":0.005780346820809248,"allows":0.005780346820809248,"determine":0.005780346820809248,"lists":0.005780346820809248,"buffers":0.005780346820809248,"strings":0.005780346820809248,"enabling":0.005780346820809248,"robust":0.005780346820809248,"used":0.005780346820809248,"effectively":0.005780346820809248,"enhances":0.005780346820809248,"reliability":0.005780346820809248,"maintainability":0.005780346820809248,"your":0.005780346820809248,"are":0.005780346820809248,"detected":0.005780346820809248,"handled":0.005780346820809248,"appropriately":0.005780346820809248},"111":{"1":0.006993006993006993,"2":0.006993006993006993,"3":0.006993006993006993,"4":0.006993006993006993,"32":0.006993006993006993,"256":0.006993006993006993,"function":0.006993006993006993,"signature":0.006993006993006993,"clarity":0.006993006993006993,"sha512":0.006993006993006993,"value":0.006993006993006993,"-":0.006993006993006993,"input":0.006993006993006993,"buff":0.006993006993006993,"uint":0.006993006993006993,"int":0.006993006993006993,"output":0.006993006993006993,"why":0.006993006993006993,"it":0.006993006993006993,"matters":0.006993006993006993,"the":0.006993006993006993,"is":0.006993006993006993,"crucial":0.006993006993006993,"for":0.006993006993006993,"computing":0.006993006993006993,"sha-512":0.006993006993006993,"hash":0.006993006993006993,"of":0.006993006993006993,"a":0.006993006993006993,"given":0.006993006993006993,"implementing":0.006993006993006993,"cryptographic":0.006993006993006993,"operations":0.006993006993006993,"in":0.006993006993006993,"smart":0.006993006993006993,"contracts":0.006993006993006993,"ensuring":0.006993006993006993,"data":0.006993006993006993,"integrity":0.006993006993006993,"by":0.006993006993006993,"generating":0.006993006993006993,"unique":0.006993006993006993,"hashes":0.006993006993006993,"simplifying":0.006993006993006993,"process":0.006993006993006993,"handling":0.006993006993006993,"hashing":0.006993006993006993,"when":0.006993006993006993,"to":0.006993006993006993,"use":0.006993006993006993,"you":0.006993006993006993,"need":0.006993006993006993,"compute":0.006993006993006993,"implement":0.006993006993006993,"your":0.006993006993006993,"contract":0.006993006993006993,"generate":0.006993006993006993,"ensure":0.006993006993006993,"handle":0.006993006993006993,"best":0.006993006993006993,"practices":0.006993006993006993,"correctly":0.006993006993006993,"formatted":0.006993006993006993,"and":0.006993006993006993,"valid":0.006993006993006993,"meaningful":0.006993006993006993,"variable":0.006993006993006993,"names":0.006993006993006993,"better":0.006993006993006993,"readability":0.006993006993006993,"combine":0.006993006993006993,"with":0.006993006993006993,"other":0.006993006993006993,"functions":0.006993006993006993,"comprehensive":0.006993006993006993,"security":0.006993006993006993,"management":0.006993006993006993,"possible":0.006993006993006993,"error":0.006993006993006993,"cases":0.006993006993006993,"robust":0.006993006993006993,"behavior":0.006993006993006993,"practical":0.006993006993006993,"example":0.006993006993006993,"let's":0.006993006993006993,"that":0.006993006993006993,"computes":0.006993006993006993,"buffer":0.006993006993006993,"define-read-only":0.006993006993006993,"compute-sha512-256":0.006993006993006993,"usage":0.006993006993006993,"0x68656c6c6f20776f726c64000000000000000000000000000000000000000000":0.006993006993006993,"returns":0.006993006993006993,"0xcf0edb437886eae39b21ebad0caeea342d2bd61c98e9d09d0e89109a546d01fc":0.006993006993006993,"this":0.006993006993006993,"demonstrates":0.006993006993006993,"using":0.006993006993006993,"public":0.006993006993006993,"computation":0.006993006993006993,"both":0.006993006993006993,"successful":0.006993006993006993,"common":0.006993006993006993,"pitfalls":0.006993006993006993,"incorrectly":0.006993006993006993,"or":0.006993006993006993,"invalid":0.006993006993006993,"values":0.006993006993006993,"causing":0.006993006993006993,"operation":0.006993006993006993,"fail":0.006993006993006993,"assuming":0.006993006993006993,"will":0.006993006993006993,"always":0.006993006993006993,"be":0.006993006993006993,"leading":0.006993006993006993,"unhandled":0.006993006993006993,"not":0.006993006993006993,"all":0.006993006993006993,"conditions":0.006993006993006993,"resulting":0.006993006993006993,"incomplete":0.006993006993006993,"overlooking":0.006993006993006993,"proper":0.006993006993006993,"validation":0.006993006993006993,"related":0.006993006993006993,"sha256":0.006993006993006993,"sha-256":0.006993006993006993,"keccak256":0.006993006993006993,"keccak-256":0.006993006993006993,"conclusion":0.006993006993006993,"fundamental":0.006993006993006993,"tool":0.006993006993006993,"allows":0.006993006993006993,"used":0.006993006993006993,"effectively":0.006993006993006993,"enhances":0.006993006993006993,"reliability":0.006993006993006993,"maintainability":0.006993006993006993,"code":0.006993006993006993,"providing":0.006993006993006993,"clear":0.006993006993006993,"concise":0.006993006993006993,"way":0.006993006993006993},"112":{"1":0.0049504950495049506,"2":0.0049504950495049506,"3":0.0049504950495049506,"4":0.0049504950495049506,"the":0.0049504950495049506,"division":0.0049504950495049506,"function":0.0049504950495049506,"in":0.0049504950495049506,"clarity":0.0049504950495049506,"performs":0.0049504950495049506,"integer":0.0049504950495049506,"on":0.0049504950495049506,"a":0.0049504950495049506,"variable":0.0049504950495049506,"number":0.0049504950495049506,"of":0.0049504950495049506,"inputs":0.0049504950495049506,"it's":0.0049504950495049506,"fundamental":0.0049504950495049506,"arithmetic":0.0049504950495049506,"operation":0.0049504950495049506,"used":0.0049504950495049506,"many":0.0049504950495049506,"smart":0.0049504950495049506,"contract":0.0049504950495049506,"calculations":0.0049504950495049506,"signature":0.0049504950495049506,"i1":0.0049504950495049506,"i2":0.0049504950495049506,"-":0.0049504950495049506,"input":0.0049504950495049506,"two":0.0049504950495049506,"or":0.0049504950495049506,"more":0.0049504950495049506,"integers":0.0049504950495049506,"int":0.0049504950495049506,"uint":0.0049504950495049506,"output":0.0049504950495049506,"single":0.0049504950495049506,"why":0.0049504950495049506,"it":0.0049504950495049506,"matters":0.0049504950495049506,"is":0.0049504950495049506,"crucial":0.0049504950495049506,"for":0.0049504950495049506,"performing":0.0049504950495049506,"basic":0.0049504950495049506,"within":0.0049504950495049506,"contracts":0.0049504950495049506,"calculating":0.0049504950495049506,"rates":0.0049504950495049506,"percentages":0.0049504950495049506,"proportions":0.0049504950495049506,"distributing":0.0049504950495049506,"resources":0.0049504950495049506,"tokens":0.0049504950495049506,"evenly":0.0049504950495049506,"implementing":0.0049504950495049506,"mathematical":0.0049504950495049506,"formulas":0.0049504950495049506,"that":0.0049504950495049506,"involve":0.0049504950495049506,"when":0.0049504950495049506,"to":0.0049504950495049506,"use":0.0049504950495049506,"you":0.0049504950495049506,"need":0.0049504950495049506,"perform":0.0049504950495049506,"your":0.0049504950495049506,"logic":0.0049504950495049506,"calculate":0.0049504950495049506,"distribute":0.0049504950495049506,"among":0.0049504950495049506,"participants":0.0049504950495049506,"implement":0.0049504950495049506,"best":0.0049504950495049506,"practices":0.0049504950495049506,"always":0.0049504950495049506,"consider":0.0049504950495049506,"possibility":0.0049504950495049506,"by":0.0049504950495049506,"zero":0.0049504950495049506,"which":0.0049504950495049506,"throws":0.0049504950495049506,"runtime":0.0049504950495049506,"error":0.0049504950495049506,"be":0.0049504950495049506,"aware":0.0049504950495049506,"uses":0.0049504950495049506,"so":0.0049504950495049506,"results":0.0049504950495049506,"are":0.0049504950495049506,"rounded":0.0049504950495049506,"down":0.0049504950495049506,"appropriate":0.0049504950495049506,"types":0.0049504950495049506,"based":0.0049504950495049506,"needs":0.0049504950495049506,"and":0.0049504950495049506,"expected":0.0049504950495049506,"value":0.0049504950495049506,"ranges":0.0049504950495049506,"using":0.0049504950495049506,"multiplication":0.0049504950495049506,"fractions":0.0049504950495049506,"instead":0.0049504950495049506,"precise":0.0049504950495049506,"practical":0.0049504950495049506,"example":0.0049504950495049506,"token":0.0049504950495049506,"distribution":0.0049504950495049506,"let's":0.0049504950495049506,"simple":0.0049504950495049506,"allocate":0.0049504950495049506,"define":0.0049504950495049506,"constants":0.0049504950495049506,"define-constant":0.0049504950495049506,"total_tokens":0.0049504950495049506,"u1000000":0.0049504950495049506,"distribution_rounds":0.0049504950495049506,"u10":0.0049504950495049506,"data":0.0049504950495049506,"variables":0.0049504950495049506,"define-map":0.0049504950495049506,"participantshares":0.0049504950495049506,"principal":0.0049504950495049506,"define-data-var":0.0049504950495049506,"currentround":0.0049504950495049506,"u0":0.0049504950495049506,"participantscount":0.0049504950495049506,"register":0.0049504950495049506,"as":0.0049504950495049506,"participant":0.0049504950495049506,"define-public":0.0049504950495049506,"register-participant":0.0049504950495049506,"let":0.0049504950495049506,"currentparticipants":0.0049504950495049506,"var-get":0.0049504950495049506,"asserts":0.0049504950495049506,"err":0.0049504950495049506,"u1":0.0049504950495049506,"map-set":0.0049504950495049506,"tx-sender":0.0049504950495049506,"var-set":0.0049504950495049506,"ok":0.0049504950495049506,"true":0.0049504950495049506,"distribute-tokens":0.0049504950495049506,"tokensperparticipant":0.0049504950495049506,"u2":0.0049504950495049506,"u3":0.0049504950495049506,"check":0.0049504950495049506,"participant's":0.0049504950495049506,"share":0.0049504950495049506,"define-read-only":0.0049504950495049506,"get-participant-share":0.0049504950495049506,"default-to":0.0049504950495049506,"map-get":0.0049504950495049506,"this":0.0049504950495049506,"demonstrates":0.0049504950495049506,"each":0.0049504950495049506,"should":0.0049504950495049506,"receive":0.0049504950495049506,"handling":0.0049504950495049506,"potential":0.0049504950495049506,"checking":0.0049504950495049506,"common":0.0049504950495049506,"pitfalls":0.0049504950495049506,"forgetting":0.0049504950495049506,"handle":0.0049504950495049506,"causes":0.0049504950495049506,"not":0.0049504950495049506,"accounting":0.0049504950495049506,"rounding":0.0049504950495049506,"can":0.0049504950495049506,"lead":0.0049504950495049506,"unexpected":0.0049504950495049506,"dividing":0.0049504950495049506,"before":0.0049504950495049506,"multiplying":0.0049504950495049506,"complex":0.0049504950495049506,"potentially":0.0049504950495049506,"losing":0.0049504950495049506,"precision":0.0049504950495049506,"related":0.0049504950495049506,"functions":0.0049504950495049506,"operations":0.0049504950495049506,"addition":0.0049504950495049506,"subtraction":0.0049504950495049506,"conclusion":0.0049504950495049506,"tool":0.0049504950495049506,"understanding":0.0049504950495049506,"its":0.0049504950495049506,"behavior":0.0049504950495049506,"with":0.0049504950495049506,"edge":0.0049504950495049506,"cases":0.0049504950495049506,"effectively":0.0049504950495049506,"various":0.0049504950495049506,"their":0.0049504950495049506,"from":0.0049504950495049506,"divisions":0.0049504950495049506,"algorithms":0.0049504950495049506},"113":{"0":0.004901960784313725,"1":0.004901960784313725,"2":0.004901960784313725,"3":0.004901960784313725,"4":0.004901960784313725,"the":0.004901960784313725,"bit-and":0.004901960784313725,"function":0.004901960784313725,"in":0.004901960784313725,"clarity":0.004901960784313725,"performs":0.004901960784313725,"a":0.004901960784313725,"bitwise":0.004901960784313725,"and":0.004901960784313725,"operation":0.004901960784313725,"on":0.004901960784313725,"two":0.004901960784313725,"or":0.004901960784313725,"more":0.004901960784313725,"integer":0.004901960784313725,"inputs":0.004901960784313725,"it's":0.004901960784313725,"powerful":0.004901960784313725,"tool":0.004901960784313725,"for":0.004901960784313725,"working":0.004901960784313725,"with":0.004901960784313725,"compact":0.004901960784313725,"data":0.004901960784313725,"representations":0.004901960784313725,"flag":0.004901960784313725,"systems":0.004901960784313725,"smart":0.004901960784313725,"contracts":0.004901960784313725,"signature":0.004901960784313725,"i1":0.004901960784313725,"i2":0.004901960784313725,"-":0.004901960784313725,"input":0.004901960784313725,"integers":0.004901960784313725,"int":0.004901960784313725,"uint":0.004901960784313725,"output":0.004901960784313725,"single":0.004901960784313725,"why":0.004901960784313725,"it":0.004901960784313725,"matters":0.004901960784313725,"is":0.004901960784313725,"crucial":0.004901960784313725,"efficient":0.004901960784313725,"storage":0.004901960784313725,"allows":0.004901960784313725,"packing":0.004901960784313725,"multiple":0.004901960784313725,"boolean":0.004901960784313725,"flags":0.004901960784313725,"into":0.004901960784313725,"permission":0.004901960784313725,"enables":0.004901960784313725,"checking":0.004901960784313725,"specific":0.004901960784313725,"permissions":0.004901960784313725,"format":0.004901960784313725,"bitmasking":0.004901960784313725,"useful":0.004901960784313725,"isolating":0.004901960784313725,"bits":0.004901960784313725,"larger":0.004901960784313725,"low-level":0.004901960784313725,"optimizations":0.004901960784313725,"can":0.004901960784313725,"be":0.004901960784313725,"used":0.004901960784313725,"certain":0.004901960784313725,"mathematical":0.004901960784313725,"operations":0.004901960784313725,"when":0.004901960784313725,"to":0.004901960784313725,"use":0.004901960784313725,"you":0.004901960784313725,"need":0.004901960784313725,"check":0.004901960784313725,"if":0.004901960784313725,"are":0.004901960784313725,"set":0.004901960784313725,"bitfield":0.004901960784313725,"implement":0.004901960784313725,"clear":0.004901960784313725,"while":0.004901960784313725,"leaving":0.004901960784313725,"others":0.004901960784313725,"unchanged":0.004901960784313725,"perform":0.004901960784313725,"best":0.004901960784313725,"practices":0.004901960784313725,"always":0.004901960784313725,"constants":0.004901960784313725,"bit":0.004901960784313725,"improve":0.004901960784313725,"readability":0.004901960784313725,"maintainability":0.004901960784313725,"cautious":0.004901960784313725,"using":0.004901960784313725,"signed":0.004901960784313725,"as":0.004901960784313725,"sign":0.004901960784313725,"affect":0.004901960784313725,"results":0.004901960784313725,"combine":0.004901960784313725,"other":0.004901960784313725,"like":0.004901960784313725,"bit-or":0.004901960784313725,"bit-not":0.004901960784313725,"complex":0.004901960784313725,"manipulations":0.004901960784313725,"document":0.004901960784313725,"your":0.004901960784313725,"meanings":0.004901960784313725,"clearly":0.004901960784313725,"contract":0.004901960784313725,"practical":0.004901960784313725,"example":0.004901960784313725,"role-based":0.004901960784313725,"access":0.004901960784313725,"control":0.004901960784313725,"let's":0.004901960784313725,"simple":0.004901960784313725,"system":0.004901960784313725,"define":0.004901960784313725,"role":0.004901960784313725,"define-constant":0.004901960784313725,"role_admin":0.004901960784313725,"u1":0.004901960784313725,"0001":0.004901960784313725,"role_moderator":0.004901960784313725,"u2":0.004901960784313725,"0010":0.004901960784313725,"role_user":0.004901960784313725,"u4":0.004901960784313725,"0100":0.004901960784313725,"map":0.004901960784313725,"store":0.004901960784313725,"user":0.004901960784313725,"roles":0.004901960784313725,"define-map":0.004901960784313725,"userroles":0.004901960784313725,"principal":0.004901960784313725,"has":0.004901960784313725,"define-read-only":0.004901960784313725,"has-role":0.004901960784313725,"let":0.004901960784313725,"userrole":0.004901960784313725,"default-to":0.004901960784313725,"u0":0.004901960784313725,"map-get":0.004901960784313725,"is-eq":0.004901960784313725,"add":0.004901960784313725,"define-public":0.004901960784313725,"add-role":0.004901960784313725,"currentrole":0.004901960784313725,"ok":0.004901960784313725,"map-set":0.004901960784313725,"remove":0.004901960784313725,"from":0.004901960784313725,"remove-role":0.004901960784313725,"usage":0.004901960784313725,"tx-sender":0.004901960784313725,"returns":0.004901960784313725,"true":0.004901960784313725,"false":0.004901960784313725,"this":0.004901960784313725,"demonstrates":0.004901960784313725,"combining":0.004901960784313725,"management":0.004901960784313725,"of":0.004901960784313725,"common":0.004901960784313725,"pitfalls":0.004901960784313725,"forgetting":0.004901960784313725,"that":0.004901960784313725,"not":0.004901960784313725,"accounting":0.004901960784313725,"overcomplicating":0.004901960784313725,"making":0.004901960784313725,"them":0.004901960784313725,"hard":0.004901960784313725,"maintain":0.004901960784313725,"related":0.004901960784313725,"functions":0.004901960784313725,"invert":0.004901960784313725,"often":0.004901960784313725,"combination":0.004901960784313725,"clearing":0.004901960784313725,"bit-xor":0.004901960784313725,"toggling":0.004901960784313725,"conclusion":0.004901960784313725,"by":0.004901960784313725,"mastering":0.004901960784313725,"along":0.004901960784313725,"create":0.004901960784313725,"sophisticated":0.004901960784313725,"make":0.004901960784313725,"optimal":0.004901960784313725,"flag-based":0.004901960784313725,"logic":0.004901960784313725},"114":{"1":0.004608294930875576,"2":0.004608294930875576,"3":0.004608294930875576,"4":0.004608294930875576,"1000":0.004608294930875576,"the":0.004608294930875576,"less":0.004608294930875576,"than":0.004608294930875576,"function":0.004608294930875576,"in":0.004608294930875576,"clarity":0.004608294930875576,"compares":0.004608294930875576,"two":0.004608294930875576,"values":0.004608294930875576,"and":0.004608294930875576,"returns":0.004608294930875576,"true":0.004608294930875576,"if":0.004608294930875576,"first":0.004608294930875576,"value":0.004608294930875576,"is":0.004608294930875576,"second":0.004608294930875576,"it's":0.004608294930875576,"a":0.004608294930875576,"fundamental":0.004608294930875576,"comparison":0.004608294930875576,"operation":0.004608294930875576,"used":0.004608294930875576,"many":0.004608294930875576,"smart":0.004608294930875576,"contract":0.004608294930875576,"conditions":0.004608294930875576,"logic":0.004608294930875576,"flows":0.004608294930875576,"signature":0.004608294930875576,"v1":0.004608294930875576,"v2":0.004608294930875576,"-":0.004608294930875576,"input":0.004608294930875576,"of":0.004608294930875576,"same":0.004608294930875576,"type":0.004608294930875576,"int":0.004608294930875576,"uint":0.004608294930875576,"string-ascii":0.004608294930875576,"string-utf8":0.004608294930875576,"or":0.004608294930875576,"buff":0.004608294930875576,"output":0.004608294930875576,"boolean":0.004608294930875576,"false":0.004608294930875576,"why":0.004608294930875576,"it":0.004608294930875576,"matters":0.004608294930875576,"crucial":0.004608294930875576,"for":0.004608294930875576,"implementing":0.004608294930875576,"conditional":0.004608294930875576,"contracts":0.004608294930875576,"comparing":0.004608294930875576,"numerical":0.004608294930875576,"financial":0.004608294930875576,"operations":0.004608294930875576,"ordering":0.004608294930875576,"sorting":0.004608294930875576,"data":0.004608294930875576,"maximum":0.004608294930875576,"thresholds":0.004608294930875576,"limits":0.004608294930875576,"when":0.004608294930875576,"to":0.004608294930875576,"use":0.004608294930875576,"you":0.004608294930875576,"need":0.004608294930875576,"compare":0.004608294930875576,"determine":0.004608294930875576,"one":0.004608294930875576,"smaller":0.004608294930875576,"implement":0.004608294930875576,"certain":0.004608294930875576,"create":0.004608294930875576,"based":0.004608294930875576,"on":0.004608294930875576,"comparisons":0.004608294930875576,"sort":0.004608294930875576,"order":0.004608294930875576,"lexicographical":0.004608294930875576,"best":0.004608294930875576,"practices":0.004608294930875576,"ensure":0.004608294930875576,"that":0.004608294930875576,"both":0.004608294930875576,"inputs":0.004608294930875576,"are":0.004608294930875576,"avoid":0.004608294930875576,"runtime":0.004608294930875576,"errors":0.004608294930875576,"be":0.004608294930875576,"aware":0.004608294930875576,"differences":0.004608294930875576,"between":0.004608294930875576,"signed":0.004608294930875576,"unsigned":0.004608294930875576,"integers":0.004608294930875576,"strings":0.004608294930875576,"buffers":0.004608294930875576,"understand":0.004608294930875576,"consider":0.004608294930875576,"edge":0.004608294930875576,"cases":0.004608294930875576,"especially":0.004608294930875576,"dealing":0.004608294930875576,"with":0.004608294930875576,"integer":0.004608294930875576,"ranges":0.004608294930875576,"practical":0.004608294930875576,"example":0.004608294930875576,"auction":0.004608294930875576,"bid":0.004608294930875576,"let's":0.004608294930875576,"simple":0.004608294930875576,"uses":0.004608294930875576,"enforce":0.004608294930875576,"amount":0.004608294930875576,"define":0.004608294930875576,"constants":0.004608294930875576,"define-constant":0.004608294930875576,"max_bid":0.004608294930875576,"u1000000000":0.004608294930875576,"stx":0.004608294930875576,"auction_end_height":0.004608294930875576,"u100":0.004608294930875576,"variables":0.004608294930875576,"define-data-var":0.004608294930875576,"currenthighestbid":0.004608294930875576,"u0":0.004608294930875576,"highestbidder":0.004608294930875576,"optional":0.004608294930875576,"principal":0.004608294930875576,"none":0.004608294930875576,"place":0.004608294930875576,"define-public":0.004608294930875576,"place-bid":0.004608294930875576,"let":0.004608294930875576,"current-block-height":0.004608294930875576,"block-height":0.004608294930875576,"check":0.004608294930875576,"still":0.004608294930875576,"open":0.004608294930875576,"asserts":0.004608294930875576,"err":0.004608294930875576,"u1":0.004608294930875576,"allowed":0.004608294930875576,"u2":0.004608294930875576,"higher":0.004608294930875576,"current":0.004608294930875576,"highest":0.004608294930875576,"var-get":0.004608294930875576,"u3":0.004608294930875576,"try":0.004608294930875576,"stx-transfer":0.004608294930875576,"tx-sender":0.004608294930875576,"as-contract":0.004608294930875576,"var-set":0.004608294930875576,"some":0.004608294930875576,"ok":0.004608294930875576,"define-read-only":0.004608294930875576,"get-highest-bid":0.004608294930875576,"has":0.004608294930875576,"ended":0.004608294930875576,"auction-ended":0.004608294930875576,"this":0.004608294930875576,"demonstrates":0.004608294930875576,"using":0.004608294930875576,"block":0.004608294930875576,"height":0.004608294930875576,"end":0.004608294930875576,"combining":0.004608294930875576,"other":0.004608294930875576,"an":0.004608294930875576,"system":0.004608294930875576,"common":0.004608294930875576,"pitfalls":0.004608294930875576,"different":0.004608294930875576,"types":0.004608294930875576,"which":0.004608294930875576,"will":0.004608294930875576,"result":0.004608294930875576,"error":0.004608294930875576,"not":0.004608294930875576,"considering":0.004608294930875576,"inclusive":0.004608294930875576,"nature":0.004608294930875576,"vs":0.004608294930875576,"exclusive":0.004608294930875576,"setting":0.004608294930875576,"overlooking":0.004608294930875576,"potential":0.004608294930875576,"underflow":0.004608294930875576,"working":0.004608294930875576,"very":0.004608294930875576,"small":0.004608294930875576,"numbers":0.004608294930875576,"related":0.004608294930875576,"functions":0.004608294930875576,"greater":0.004608294930875576,"equal":0.004608294930875576,"conclusion":0.004608294930875576,"tool":0.004608294930875576,"by":0.004608294930875576,"understanding":0.004608294930875576,"its":0.004608294930875576,"behavior":0.004608294930875576,"can":0.004608294930875576,"robust":0.004608294930875576,"important":0.004608294930875576,"your":0.004608294930875576},"115":{"1":0.00558659217877095,"2":0.00558659217877095,"3":0.00558659217877095,"4":0.00558659217877095,"function":0.00558659217877095,"signature":0.00558659217877095,"clarity":0.00558659217877095,"ft-burn":0.00558659217877095,"token-name":0.00558659217877095,"amount":0.00558659217877095,"sender":0.00558659217877095,"-":0.00558659217877095,"input":0.00558659217877095,"the":0.00558659217877095,"name":0.00558659217877095,"of":0.00558659217877095,"fungible":0.00558659217877095,"token":0.00558659217877095,"tokens":0.00558659217877095,"to":0.00558659217877095,"burn":0.00558659217877095,"uint":0.00558659217877095,"principal":0.00558659217877095,"from":0.00558659217877095,"whose":0.00558659217877095,"balance":0.00558659217877095,"will":0.00558659217877095,"be":0.00558659217877095,"burned":0.00558659217877095,"output":0.00558659217877095,"response":0.00558659217877095,"bool":0.00558659217877095,"why":0.00558659217877095,"it":0.00558659217877095,"matters":0.00558659217877095,"is":0.00558659217877095,"crucial":0.00558659217877095,"for":0.00558659217877095,"decreasing":0.00558659217877095,"total":0.00558659217877095,"supply":0.00558659217877095,"a":0.00558659217877095,"implementing":0.00558659217877095,"burning":0.00558659217877095,"mechanisms":0.00558659217877095,"in":0.00558659217877095,"tokenomics":0.00558659217877095,"models":0.00558659217877095,"allowing":0.00558659217877095,"users":0.00558659217877095,"destroy":0.00558659217877095,"their":0.00558659217877095,"own":0.00558659217877095,"managing":0.00558659217877095,"deflationary":0.00558659217877095,"systems":0.00558659217877095,"when":0.00558659217877095,"use":0.00558659217877095,"you":0.00558659217877095,"need":0.00558659217877095,"implement":0.00558659217877095,"feature":0.00558659217877095,"your":0.00558659217877095,"contract":0.00558659217877095,"reduce":0.00558659217877095,"circulating":0.00558659217877095,"allow":0.00558659217877095,"voluntarily":0.00558659217877095,"execute":0.00558659217877095,"economy":0.00558659217877095,"best":0.00558659217877095,"practices":0.00558659217877095,"ensure":0.00558659217877095,"that":0.00558659217877095,"has":0.00558659217877095,"sufficient":0.00558659217877095,"before":0.00558659217877095,"attempting":0.00558659217877095,"conjunction":0.00558659217877095,"with":0.00558659217877095,"proper":0.00558659217877095,"access":0.00558659217877095,"controls":0.00558659217877095,"consider":0.00558659217877095,"emitting":0.00558659217877095,"events":0.00558659217877095,"or":0.00558659217877095,"logging":0.00558659217877095,"burns":0.00558659217877095,"transparency":0.00558659217877095,"cautious":0.00558659217877095,"different":0.00558659217877095,"than":0.00558659217877095,"tx-sender":0.00558659217877095,"practical":0.00558659217877095,"example":0.00558659217877095,"mechanism":0.00558659217877095,"let's":0.00558659217877095,"simple":0.00558659217877095,"define-fungible-token":0.00558659217877095,"cbtc":0.00558659217877095,"define-data-var":0.00558659217877095,"tokenadmin":0.00558659217877095,"define-public":0.00558659217877095,"burn-tokens":0.00558659217877095,"burn-tokens-from":0.00558659217877095,"owner":0.00558659217877095,"begin":0.00558659217877095,"asserts":0.00558659217877095,"is-eq":0.00558659217877095,"var-get":0.00558659217877095,"err":0.00558659217877095,"u3":0.00558659217877095,"this":0.00558659217877095,"demonstrates":0.00558659217877095,"using":0.00558659217877095,"transaction":0.00558659217877095,"an":0.00558659217877095,"admin":0.00558659217877095,"any":0.00558659217877095,"account":0.00558659217877095,"assertions":0.00558659217877095,"only":0.00558659217877095,"can":0.00558659217877095,"other":0.00558659217877095,"accounts":0.00558659217877095,"common":0.00558659217877095,"pitfalls":0.00558659217877095,"more":0.00558659217877095,"not":0.00558659217877095,"checking":0.00558659217877095,"return":0.00558659217877095,"value":0.00558659217877095,"handle":0.00558659217877095,"potential":0.00558659217877095,"errors":0.00558659217877095,"unauthorized":0.00558659217877095,"forgetting":0.00558659217877095,"are":0.00558659217877095,"permanently":0.00558659217877095,"destroyed":0.00558659217877095,"and":0.00558659217877095,"cannot":0.00558659217877095,"recovered":0.00558659217877095,"related":0.00558659217877095,"functions":0.00558659217877095,"ft-mint":0.00558659217877095,"used":0.00558659217877095,"create":0.00558659217877095,"new":0.00558659217877095,"increasing":0.00558659217877095,"ft-transfer":0.00558659217877095,"transfer":0.00558659217877095,"between":0.00558659217877095,"principals":0.00558659217877095,"ft-get-balance":0.00558659217877095,"check":0.00558659217877095,"ft-get-supply":0.00558659217877095,"get":0.00558659217877095,"current":0.00558659217877095,"conclusion":0.00558659217877095,"powerful":0.00558659217877095,"tool":0.00558659217877095,"smart":0.00558659217877095,"contracts":0.00558659217877095,"allows":0.00558659217877095,"implementation":0.00558659217877095,"gives":0.00558659217877095,"ability":0.00558659217877095,"correctly":0.00558659217877095,"key":0.00558659217877095,"component":0.00558659217877095,"sophisticated":0.00558659217877095,"however":0.00558659217877095,"should":0.00558659217877095,"caution":0.00558659217877095,"checks":0.00558659217877095,"integrity":0.00558659217877095,"system":0.00558659217877095},"116":{"1":0.005555555555555556,"2":0.005555555555555556,"3":0.005555555555555556,"4":0.005555555555555556,"50":0.005555555555555556,"function":0.005555555555555556,"signature":0.005555555555555556,"clarity":0.005555555555555556,"get":0.005555555555555556,"key-name":0.005555555555555556,"tuple":0.005555555555555556,"-":0.005555555555555556,"input":0.005555555555555556,"the":0.005555555555555556,"name":0.005555555555555556,"of":0.005555555555555556,"key":0.005555555555555556,"in":0.005555555555555556,"to":0.005555555555555556,"retrieve":0.005555555555555556,"value":0.005555555555555556,"from":0.005555555555555556,"output":0.005555555555555556,"associated":0.005555555555555556,"with":0.005555555555555556,"why":0.005555555555555556,"it":0.005555555555555556,"matters":0.005555555555555556,"is":0.005555555555555556,"crucial":0.005555555555555556,"for":0.005555555555555556,"accessing":0.005555555555555556,"specific":0.005555555555555556,"values":0.005555555555555556,"within":0.005555555555555556,"data":0.005555555555555556,"structures":0.005555555555555556,"extracting":0.005555555555555556,"information":0.005555555555555556,"complex":0.005555555555555556,"types":0.005555555555555556,"contracts":0.005555555555555556,"enabling":0.005555555555555556,"efficient":0.005555555555555556,"retrieval":0.005555555555555556,"contract":0.005555555555555556,"logic":0.005555555555555556,"working":0.005555555555555556,"structured":0.005555555555555556,"returned":0.005555555555555556,"by":0.005555555555555556,"other":0.005555555555555556,"functions":0.005555555555555556,"or":0.005555555555555556,"stored":0.005555555555555556,"variables":0.005555555555555556,"when":0.005555555555555556,"use":0.005555555555555556,"you":0.005555555555555556,"need":0.005555555555555556,"access":0.005555555555555556,"a":0.005555555555555556,"field":0.005555555555555556,"extract":0.005555555555555556,"work":0.005555555555555556,"your":0.005555555555555556,"implement":0.005555555555555556,"processing":0.005555555555555556,"that":0.005555555555555556,"involves":0.005555555555555556,"manipulation":0.005555555555555556,"best":0.005555555555555556,"practices":0.005555555555555556,"ensure":0.005555555555555556,"exists":0.005555555555555556,"avoid":0.005555555555555556,"runtime":0.005555555555555556,"errors":0.005555555555555556,"meaningful":0.005555555555555556,"names":0.005555555555555556,"better":0.005555555555555556,"code":0.005555555555555556,"readability":0.005555555555555556,"consider":0.005555555555555556,"using":0.005555555555555556,"combination":0.005555555555555556,"optional":0.005555555555555556,"safer":0.005555555555555556,"be":0.005555555555555556,"aware":0.005555555555555556,"performance":0.005555555555555556,"implications":0.005555555555555556,"large":0.005555555555555556,"tuples":0.005555555555555556,"practical":0.005555555555555556,"example":0.005555555555555556,"user":0.005555555555555556,"profile":0.005555555555555556,"management":0.005555555555555556,"let's":0.005555555555555556,"simple":0.005555555555555556,"system":0.005555555555555556,"and":0.005555555555555556,"define-map":0.005555555555555556,"userprofiles":0.005555555555555556,"userid":0.005555555555555556,"principal":0.005555555555555556,"string-ascii":0.005555555555555556,"age":0.005555555555555556,"uint":0.005555555555555556,"define-public":0.005555555555555556,"set-profile":0.005555555555555556,"ok":0.005555555555555556,"map-set":0.005555555555555556,"tx-sender":0.005555555555555556,"define-read-only":0.005555555555555556,"get-profile-name":0.005555555555555556,"match":0.005555555555555556,"map-get":0.005555555555555556,"err":0.005555555555555556,"u404":0.005555555555555556,"get-profile-age":0.005555555555555556,"usage":0.005555555555555556,"alice":0.005555555555555556,"u30":0.005555555555555556,"returns":0.005555555555555556,"this":0.005555555555555556,"demonstrates":0.005555555555555556,"fields":0.005555555555555556,"map":0.005555555555555556,"implementing":0.005555555555555556,"getter":0.005555555555555556,"handling":0.005555555555555556,"cases":0.005555555555555556,"where":0.005555555555555556,"might":0.005555555555555556,"not":0.005555555555555556,"exist":0.005555555555555556,"common":0.005555555555555556,"pitfalls":0.005555555555555556,"attempting":0.005555555555555556,"doesn't":0.005555555555555556,"causing":0.005555555555555556,"error":0.005555555555555556,"forgetting":0.005555555555555556,"case-sensitive":0.005555555555555556,"considering":0.005555555555555556,"impact":0.005555555555555556,"frequently":0.005555555555555556,"related":0.005555555555555556,"merge":0.005555555555555556,"used":0.005555555555555556,"combine":0.005555555555555556,"potentially":0.005555555555555556,"creating":0.005555555555555556,"new":0.005555555555555556,"create":0.005555555555555556,"can":0.005555555555555556,"accessed":0.005555555555555556,"often":0.005555555555555556,"maps":0.005555555555555556,"conclusion":0.005555555555555556,"fundamental":0.005555555555555556,"tool":0.005555555555555556,"smart":0.005555555555555556,"provides":0.005555555555555556,"straightforward":0.005555555555555556,"way":0.005555555555555556,"developers":0.005555555555555556,"efficiently":0.005555555555555556,"effectively":0.005555555555555556,"enhances":0.005555555555555556,"contract's":0.005555555555555556,"ability":0.005555555555555556,"manage":0.005555555555555556,"process":0.005555555555555556,"leading":0.005555555555555556,"more":0.005555555555555556,"organized":0.005555555555555556,"maintainable":0.005555555555555556},"117":{"1":0.006622516556291391,"2":0.006622516556291391,"3":0.006622516556291391,"4":0.006622516556291391,"function":0.006622516556291391,"signature":0.006622516556291391,"clarity":0.006622516556291391,"use-trait":0.006622516556291391,"trait-alias":0.006622516556291391,"trait-identifier":0.006622516556291391,"-":0.006622516556291391,"input":0.006622516556291391,"varname":0.006622516556291391,"traitidentifier":0.006622516556291391,"output":0.006622516556291391,"not":0.006622516556291391,"applicable":0.006622516556291391,"why":0.006622516556291391,"it":0.006622516556291391,"matters":0.006622516556291391,"the":0.006622516556291391,"is":0.006622516556291391,"crucial":0.006622516556291391,"for":0.006622516556291391,"importing":0.006622516556291391,"traits":0.006622516556291391,"defined":0.006622516556291391,"in":0.006622516556291391,"other":0.006622516556291391,"contracts":0.006622516556291391,"implementing":0.006622516556291391,"logic":0.006622516556291391,"that":0.006622516556291391,"requires":0.006622516556291391,"conformance":0.006622516556291391,"to":0.006622516556291391,"specific":0.006622516556291391,"interfaces":0.006622516556291391,"ensuring":0.006622516556291391,"code":0.006622516556291391,"reusability":0.006622516556291391,"and":0.006622516556291391,"modularity":0.006622516556291391,"by":0.006622516556291391,"leveraging":0.006622516556291391,"simplifying":0.006622516556291391,"process":0.006622516556291391,"of":0.006622516556291391,"using":0.006622516556291391,"external":0.006622516556291391,"smart":0.006622516556291391,"when":0.006622516556291391,"use":0.006622516556291391,"you":0.006622516556291391,"need":0.006622516556291391,"import":0.006622516556291391,"implement":0.006622516556291391,"ensure":0.006622516556291391,"handle":0.006622516556291391,"trait":0.006622516556291391,"imports":0.006622516556291391,"your":0.006622516556291391,"contract":0.006622516556291391,"best":0.006622516556291391,"practices":0.006622516556291391,"descriptive":0.006622516556291391,"names":0.006622516556291391,"aliases":0.006622516556291391,"better":0.006622516556291391,"readability":0.006622516556291391,"identifier":0.006622516556291391,"correctly":0.006622516556291391,"formatted":0.006622516556291391,"valid":0.006622516556291391,"combine":0.006622516556291391,"with":0.006622516556291391,"functions":0.006622516556291391,"comprehensive":0.006622516556291391,"management":0.006622516556291391,"possible":0.006622516556291391,"error":0.006622516556291391,"cases":0.006622516556291391,"robust":0.006622516556291391,"behavior":0.006622516556291391,"practical":0.006622516556291391,"example":0.006622516556291391,"a":0.006622516556291391,"let's":0.006622516556291391,"uses":0.006622516556291391,"token-trait":0.006622516556291391,"'sp2j6zy48gv1ez5v2v5rb9mp66sw86pykkq9h6dpr":0.006622516556291391,"define-public":0.006622516556291391,"forward-get-balance":0.006622516556291391,"user":0.006622516556291391,"principal":0.006622516556291391,"ok":0.006622516556291391,"contract-of":0.006622516556291391,"usage":0.006622516556291391,"tx-sender":0.006622516556291391,"returns":0.006622516556291391,"this":0.006622516556291391,"demonstrates":0.006622516556291391,"from":0.006622516556291391,"another":0.006622516556291391,"public":0.006622516556291391,"imported":0.006622516556291391,"handling":0.006622516556291391,"both":0.006622516556291391,"successful":0.006622516556291391,"common":0.006622516556291391,"pitfalls":0.006622516556291391,"incorrectly":0.006622516556291391,"or":0.006622516556291391,"invalid":0.006622516556291391,"identifiers":0.006622516556291391,"causing":0.006622516556291391,"runtime":0.006622516556291391,"errors":0.006622516556291391,"assuming":0.006622516556291391,"will":0.006622516556291391,"always":0.006622516556291391,"succeed":0.006622516556291391,"leading":0.006622516556291391,"unhandled":0.006622516556291391,"all":0.006622516556291391,"conditions":0.006622516556291391,"resulting":0.006622516556291391,"incomplete":0.006622516556291391,"overlooking":0.006622516556291391,"proper":0.006622516556291391,"validation":0.006622516556291391,"related":0.006622516556291391,"define-trait":0.006622516556291391,"defines":0.006622516556291391,"new":0.006622516556291391,"current":0.006622516556291391,"impl-trait":0.006622516556291391,"implements":0.006622516556291391,"conclusion":0.006622516556291391,"fundamental":0.006622516556291391,"tool":0.006622516556291391,"allows":0.006622516556291391,"used":0.006622516556291391,"effectively":0.006622516556291391,"enhances":0.006622516556291391,"reliability":0.006622516556291391,"maintainability":0.006622516556291391,"providing":0.006622516556291391,"clear":0.006622516556291391,"concise":0.006622516556291391,"way":0.006622516556291391},"118":{"0":0.006993006993006993,"1":0.006993006993006993,"2":0.006993006993006993,"3":0.006993006993006993,"4":0.006993006993006993,"42":0.006993006993006993,"function":0.006993006993006993,"signature":0.006993006993006993,"clarity":0.006993006993006993,"to-uint":0.006993006993006993,"value":0.006993006993006993,"-":0.006993006993006993,"input":0.006993006993006993,"int":0.006993006993006993,"output":0.006993006993006993,"uint":0.006993006993006993,"why":0.006993006993006993,"it":0.006993006993006993,"matters":0.006993006993006993,"the":0.006993006993006993,"is":0.006993006993006993,"crucial":0.006993006993006993,"for":0.006993006993006993,"converting":0.006993006993006993,"signed":0.006993006993006993,"integers":0.006993006993006993,"to":0.006993006993006993,"unsigned":0.006993006993006993,"implementing":0.006993006993006993,"logic":0.006993006993006993,"that":0.006993006993006993,"requires":0.006993006993006993,"integer":0.006993006993006993,"operations":0.006993006993006993,"ensuring":0.006993006993006993,"data":0.006993006993006993,"integrity":0.006993006993006993,"by":0.006993006993006993,"validating":0.006993006993006993,"conversion":0.006993006993006993,"process":0.006993006993006993,"simplifying":0.006993006993006993,"of":0.006993006993006993,"handling":0.006993006993006993,"conversions":0.006993006993006993,"in":0.006993006993006993,"smart":0.006993006993006993,"contracts":0.006993006993006993,"when":0.006993006993006993,"use":0.006993006993006993,"you":0.006993006993006993,"need":0.006993006993006993,"convert":0.006993006993006993,"a":0.006993006993006993,"an":0.006993006993006993,"implement":0.006993006993006993,"validate":0.006993006993006993,"ensure":0.006993006993006993,"handle":0.006993006993006993,"your":0.006993006993006993,"contract":0.006993006993006993,"best":0.006993006993006993,"practices":0.006993006993006993,"non-negative":0.006993006993006993,"avoid":0.006993006993006993,"runtime":0.006993006993006993,"errors":0.006993006993006993,"meaningful":0.006993006993006993,"variable":0.006993006993006993,"names":0.006993006993006993,"better":0.006993006993006993,"readability":0.006993006993006993,"combine":0.006993006993006993,"with":0.006993006993006993,"other":0.006993006993006993,"functions":0.006993006993006993,"comprehensive":0.006993006993006993,"management":0.006993006993006993,"possible":0.006993006993006993,"error":0.006993006993006993,"cases":0.006993006993006993,"robust":0.006993006993006993,"behavior":0.006993006993006993,"practical":0.006993006993006993,"example":0.006993006993006993,"let's":0.006993006993006993,"converts":0.006993006993006993,"define-read-only":0.006993006993006993,"convert-to-uint":0.006993006993006993,"usage":0.006993006993006993,"returns":0.006993006993006993,"u42":0.006993006993006993,"u0":0.006993006993006993,"-1":0.006993006993006993,"causes":0.006993006993006993,"this":0.006993006993006993,"demonstrates":0.006993006993006993,"using":0.006993006993006993,"public":0.006993006993006993,"both":0.006993006993006993,"positive":0.006993006993006993,"and":0.006993006993006993,"zero":0.006993006993006993,"values":0.006993006993006993,"common":0.006993006993006993,"pitfalls":0.006993006993006993,"negative":0.006993006993006993,"causing":0.006993006993006993,"assuming":0.006993006993006993,"will":0.006993006993006993,"always":0.006993006993006993,"succeed":0.006993006993006993,"leading":0.006993006993006993,"unhandled":0.006993006993006993,"not":0.006993006993006993,"all":0.006993006993006993,"conditions":0.006993006993006993,"resulting":0.006993006993006993,"incomplete":0.006993006993006993,"overlooking":0.006993006993006993,"proper":0.006993006993006993,"validation":0.006993006993006993,"related":0.006993006993006993,"to-int":0.006993006993006993,"int-to-ascii":0.006993006993006993,"string-ascii":0.006993006993006993,"representation":0.006993006993006993,"int-to-utf8":0.006993006993006993,"string-utf8":0.006993006993006993,"conclusion":0.006993006993006993,"fundamental":0.006993006993006993,"tool":0.006993006993006993,"allows":0.006993006993006993,"used":0.006993006993006993,"effectively":0.006993006993006993,"enhances":0.006993006993006993,"reliability":0.006993006993006993,"maintainability":0.006993006993006993,"code":0.006993006993006993,"providing":0.006993006993006993,"clear":0.006993006993006993,"concise":0.006993006993006993,"way":0.006993006993006993},"119":{"1":0.005714285714285714,"2":0.005714285714285714,"3":0.005714285714285714,"4":0.005714285714285714,"256":0.005714285714285714,"function":0.005714285714285714,"signature":0.005714285714285714,"clarity":0.005714285714285714,"define-trait":0.005714285714285714,"trait-name":0.005714285714285714,"func1-name":0.005714285714285714,"arg1-type":0.005714285714285714,"arg2-type":0.005714285714285714,"return-type":0.005714285714285714,"-":0.005714285714285714,"input":0.005714285714285714,"the":0.005714285714285714,"name":0.005714285714285714,"of":0.005714285714285714,"trait":0.005714285714285714,"being":0.005714285714285714,"defined":0.005714285714285714,"a":0.005714285714285714,"in":0.005714285714285714,"types":0.005714285714285714,"function's":0.005714285714285714,"arguments":0.005714285714285714,"return":0.005714285714285714,"type":0.005714285714285714,"output":0.005714285714285714,"not":0.005714285714285714,"applicable":0.005714285714285714,"definition":0.005714285714285714,"statement":0.005714285714285714,"why":0.005714285714285714,"it":0.005714285714285714,"matters":0.005714285714285714,"is":0.005714285714285714,"crucial":0.005714285714285714,"for":0.005714285714285714,"creating":0.005714285714285714,"standardized":0.005714285714285714,"interfaces":0.005714285714285714,"contracts":0.005714285714285714,"to":0.005714285714285714,"implement":0.005714285714285714,"enabling":0.005714285714285714,"polymorphic":0.005714285714285714,"behavior":0.005714285714285714,"smart":0.005714285714285714,"contract":0.005714285714285714,"interactions":0.005714285714285714,"facilitating":0.005714285714285714,"composability":0.005714285714285714,"and":0.005714285714285714,"interoperability":0.005714285714285714,"allowing":0.005714285714285714,"dynamic":0.005714285714285714,"dispatch":0.005714285714285714,"calls":0.005714285714285714,"based":0.005714285714285714,"on":0.005714285714285714,"traits":0.005714285714285714,"when":0.005714285714285714,"use":0.005714285714285714,"you":0.005714285714285714,"need":0.005714285714285714,"define":0.005714285714285714,"common":0.005714285714285714,"interface":0.005714285714285714,"that":0.005714285714285714,"multiple":0.005714285714285714,"should":0.005714285714285714,"adhere":0.005714285714285714,"create":0.005714285714285714,"can":0.005714285714285714,"interact":0.005714285714285714,"with":0.005714285714285714,"any":0.005714285714285714,"other":0.005714285714285714,"implementing":0.005714285714285714,"specific":0.005714285714285714,"establish":0.005714285714285714,"standards":0.005714285714285714,"token":0.005714285714285714,"or":0.005714285714285714,"patterns":0.005714285714285714,"enable":0.005714285714285714,"more":0.005714285714285714,"flexible":0.005714285714285714,"modular":0.005714285714285714,"architectures":0.005714285714285714,"best":0.005714285714285714,"practices":0.005714285714285714,"clear":0.005714285714285714,"descriptive":0.005714285714285714,"names":0.005714285714285714,"their":0.005714285714285714,"functions":0.005714285714285714,"keep":0.005714285714285714,"focused":0.005714285714285714,"single":0.005714285714285714,"responsibility":0.005714285714285714,"concept":0.005714285714285714,"consider":0.005714285714285714,"like":0.005714285714285714,"combination":0.005714285714285714,"use-trait":0.005714285714285714,"contract-call":0.005714285714285714,"practical":0.005714285714285714,"example":0.005714285714285714,"let's":0.005714285714285714,"simple":0.005714285714285714,"token-trait":0.005714285714285714,"transfer":0.005714285714285714,"principal":0.005714285714285714,"uint":0.005714285714285714,"response":0.005714285714285714,"bool":0.005714285714285714,"get-balance":0.005714285714285714,"get-token-uri":0.005714285714285714,"optional":0.005714285714285714,"string-utf8":0.005714285714285714,"this":0.005714285714285714,"demonstrates":0.005714285714285714,"defining":0.005714285714285714,"specifying":0.005714285714285714,"signatures":0.005714285714285714,"argument":0.005714285714285714,"using":0.005714285714285714,"handle":0.005714285714285714,"success":0.005714285714285714,"failure":0.005714285714285714,"cases":0.005714285714285714,"pitfalls":0.005714285714285714,"overly":0.005714285714285714,"complex":0.005714285714285714,"are":0.005714285714285714,"difficult":0.005714285714285714,"forgetting":0.005714285714285714,"implementations":0.005714285714285714,"just":0.005714285714285714,"definitions":0.005714285714285714,"considering":0.005714285714285714,"backwards":0.005714285714285714,"compatibility":0.005714285714285714,"updating":0.005714285714285714,"newer":0.005714285714285714,"versions":0.005714285714285714,"related":0.005714285714285714,"used":0.005714285714285714,"import":0.005714285714285714,"from":0.005714285714285714,"impl-trait":0.005714285714285714,"declare":0.005714285714285714,"implements":0.005714285714285714,"often":0.005714285714285714,"contract-of":0.005714285714285714,"get":0.005714285714285714,"conclusion":0.005714285714285714,"powerful":0.005714285714285714,"tool":0.005714285714285714,"by":0.005714285714285714,"interoperable":0.005714285714285714,"ecosystems":0.005714285714285714,"each":0.005714285714285714,"predictable":0.005714285714285714,"way":0.005714285714285714,"fostering":0.005714285714285714,"development":0.005714285714285714,"decentralized":0.005714285714285714,"applications":0.005714285714285714,"within":0.005714285714285714,"stacks":0.005714285714285714,"ecosystem":0.005714285714285714},"120":{"1":0.005988023952095809,"2":0.005988023952095809,"3":0.005988023952095809,"4":0.005988023952095809,"40":0.005988023952095809,"100":0.005988023952095809,"function":0.005988023952095809,"signature":0.005988023952095809,"clarity":0.005988023952095809,"int-to-utf8":0.005988023952095809,"value":0.005988023952095809,"-":0.005988023952095809,"input":0.005988023952095809,"int":0.005988023952095809,"uint":0.005988023952095809,"output":0.005988023952095809,"string-utf8":0.005988023952095809,"why":0.005988023952095809,"it":0.005988023952095809,"matters":0.005988023952095809,"the":0.005988023952095809,"is":0.005988023952095809,"crucial":0.005988023952095809,"for":0.005988023952095809,"converting":0.005988023952095809,"integer":0.005988023952095809,"values":0.005988023952095809,"to":0.005988023952095809,"their":0.005988023952095809,"utf-8":0.005988023952095809,"string":0.005988023952095809,"representations":0.005988023952095809,"facilitating":0.005988023952095809,"display":0.005988023952095809,"and":0.005988023952095809,"logging":0.005988023952095809,"of":0.005988023952095809,"numeric":0.005988023952095809,"data":0.005988023952095809,"in":0.005988023952095809,"a":0.005988023952095809,"more":0.005988023952095809,"versatile":0.005988023952095809,"encoding":0.005988023952095809,"enabling":0.005988023952095809,"use":0.005988023952095809,"contexts":0.005988023952095809,"that":0.005988023952095809,"require":0.005988023952095809,"strings":0.005988023952095809,"simplifying":0.005988023952095809,"process":0.005988023952095809,"creating":0.005988023952095809,"human-readable":0.005988023952095809,"outputs":0.005988023952095809,"from":0.005988023952095809,"when":0.005988023952095809,"you":0.005988023952095809,"need":0.005988023952095809,"convert":0.005988023952095809,"an":0.005988023952095809,"or":0.005988023952095809,"unsigned":0.005988023952095809,"format":0.005988023952095809,"log":0.005988023952095809,"store":0.005988023952095809,"as":0.005988023952095809,"prepare":0.005988023952095809,"concatenation":0.005988023952095809,"with":0.005988023952095809,"other":0.005988023952095809,"best":0.005988023952095809,"practices":0.005988023952095809,"ensure":0.005988023952095809,"within":0.005988023952095809,"range":0.005988023952095809,"can":0.005988023952095809,"be":0.005988023952095809,"represented":0.005988023952095809,"meaningful":0.005988023952095809,"variable":0.005988023952095809,"names":0.005988023952095809,"better":0.005988023952095809,"readability":0.005988023952095809,"combine":0.005988023952095809,"functions":0.005988023952095809,"complex":0.005988023952095809,"manipulations":0.005988023952095809,"aware":0.005988023952095809,"maximum":0.005988023952095809,"length":0.005988023952095809,"resulting":0.005988023952095809,"characters":0.005988023952095809,"practical":0.005988023952095809,"example":0.005988023952095809,"user's":0.005988023952095809,"balance":0.005988023952095809,"let's":0.005988023952095809,"implement":0.005988023952095809,"logs":0.005988023952095809,"define-map":0.005988023952095809,"userbalances":0.005988023952095809,"userid":0.005988023952095809,"principal":0.005988023952095809,"define-public":0.005988023952095809,"log-balance":0.005988023952095809,"user":0.005988023952095809,"let":0.005988023952095809,"default-to":0.005988023952095809,"u0":0.005988023952095809,"map-get":0.005988023952095809,"balancestr":0.005988023952095809,"print":0.005988023952095809,"usage":0.005988023952095809,"map-set":0.005988023952095809,"tx-sender":0.005988023952095809,"u100":0.005988023952095809,"this":0.005988023952095809,"demonstrates":0.005988023952095809,"using":0.005988023952095809,"representation":0.005988023952095809,"handling":0.005988023952095809,"case":0.005988023952095809,"where":0.005988023952095809,"has":0.005988023952095809,"no":0.005988023952095809,"set":0.005988023952095809,"common":0.005988023952095809,"pitfalls":0.005988023952095809,"assuming":0.005988023952095809,"will":0.005988023952095809,"always":0.005988023952095809,"fit":0.005988023952095809,"forgetting":0.005988023952095809,"handle":0.005988023952095809,"cases":0.005988023952095809,"not":0.005988023952095809,"zero":0.005988023952095809,"performance-critical":0.005988023952095809,"sections":0.005988023952095809,"without":0.005988023952095809,"considering":0.005988023952095809,"overhead":0.005988023952095809,"combining":0.005988023952095809,"related":0.005988023952095809,"used":0.005988023952095809,"concat":0.005988023952095809,"concatenate":0.005988023952095809,"multiple":0.005988023952095809,"provide":0.005988023952095809,"default":0.005988023952095809,"optional":0.005988023952095809,"types":0.005988023952095809,"conclusion":0.005988023952095809,"powerful":0.005988023952095809,"tool":0.005988023952095809,"smart":0.005988023952095809,"contracts":0.005988023952095809,"enables":0.005988023952095809,"create":0.005988023952095809,"storage":0.005988023952095809,"effectively":0.005988023952095809,"enhances":0.005988023952095809,"usability":0.005988023952095809,"your":0.005988023952095809,"contract":0.005988023952095809,"code":0.005988023952095809},"121":{"1":0.006944444444444444,"2":0.006944444444444444,"3":0.006944444444444444,"4":0.006944444444444444,"5":0.006944444444444444,"function":0.006944444444444444,"signature":0.006944444444444444,"clarity":0.006944444444444444,"ok":0.006944444444444444,"value":0.006944444444444444,"-":0.006944444444444444,"input":0.006944444444444444,"a":0.006944444444444444,"output":0.006944444444444444,"response":0.006944444444444444,"b":0.006944444444444444,"why":0.006944444444444444,"it":0.006944444444444444,"matters":0.006944444444444444,"the":0.006944444444444444,"is":0.006944444444444444,"crucial":0.006944444444444444,"for":0.006944444444444444,"constructing":0.006944444444444444,"successful":0.006944444444444444,"type":0.006944444444444444,"indicating":0.006944444444444444,"that":0.006944444444444444,"executed":0.006944444444444444,"successfully":0.006944444444444444,"ensuring":0.006944444444444444,"data":0.006944444444444444,"integrity":0.006944444444444444,"by":0.006944444444444444,"clearly":0.006944444444444444,"distinguishing":0.006944444444444444,"between":0.006944444444444444,"success":0.006944444444444444,"and":0.006944444444444444,"error":0.006944444444444444,"states":0.006944444444444444,"simplifying":0.006944444444444444,"process":0.006944444444444444,"of":0.006944444444444444,"handling":0.006944444444444444,"return":0.006944444444444444,"values":0.006944444444444444,"in":0.006944444444444444,"smart":0.006944444444444444,"contracts":0.006944444444444444,"when":0.006944444444444444,"to":0.006944444444444444,"use":0.006944444444444444,"you":0.006944444444444444,"need":0.006944444444444444,"construct":0.006944444444444444,"indicate":0.006944444444444444,"distinguish":0.006944444444444444,"handle":0.006944444444444444,"your":0.006944444444444444,"contract":0.006944444444444444,"best":0.006944444444444444,"practices":0.006944444444444444,"ensure":0.006944444444444444,"passed":0.006944444444444444,"intended":0.006944444444444444,"result":0.006944444444444444,"meaningful":0.006944444444444444,"variable":0.006944444444444444,"names":0.006944444444444444,"better":0.006944444444444444,"readability":0.006944444444444444,"combine":0.006944444444444444,"with":0.006944444444444444,"err":0.006944444444444444,"comprehensive":0.006944444444444444,"possible":0.006944444444444444,"cases":0.006944444444444444,"robust":0.006944444444444444,"behavior":0.006944444444444444,"practical":0.006944444444444444,"example":0.006944444444444444,"returning":0.006944444444444444,"let's":0.006944444444444444,"implement":0.006944444444444444,"returns":0.006944444444444444,"define-read-only":0.006944444444444444,"get-successful-response":0.006944444444444444,"int":0.006944444444444444,"usage":0.006944444444444444,"this":0.006944444444444444,"demonstrates":0.006944444444444444,"using":0.006944444444444444,"implementing":0.006944444444444444,"read-only":0.006944444444444444,"case":0.006944444444444444,"common":0.006944444444444444,"pitfalls":0.006944444444444444,"an":0.006944444444444444,"incorrect":0.006944444444444444,"or":0.006944444444444444,"invalid":0.006944444444444444,"causing":0.006944444444444444,"unexpected":0.006944444444444444,"assuming":0.006944444444444444,"will":0.006944444444444444,"always":0.006944444444444444,"be":0.006944444444444444,"leading":0.006944444444444444,"unhandled":0.006944444444444444,"not":0.006944444444444444,"all":0.006944444444444444,"conditions":0.006944444444444444,"resulting":0.006944444444444444,"incomplete":0.006944444444444444,"overlooking":0.006944444444444444,"proper":0.006944444444444444,"validation":0.006944444444444444,"related":0.006944444444444444,"functions":0.006944444444444444,"constructs":0.006944444444444444,"match":0.006944444444444444,"handles":0.006944444444444444,"different":0.006944444444444444,"branches":0.006944444444444444,"optional":0.006944444444444444,"types":0.006944444444444444,"conclusion":0.006944444444444444,"fundamental":0.006944444444444444,"tool":0.006944444444444444,"allows":0.006944444444444444,"execution":0.006944444444444444,"simplify":0.006944444444444444,"used":0.006944444444444444,"effectively":0.006944444444444444,"enhances":0.006944444444444444,"reliability":0.006944444444444444,"maintainability":0.006944444444444444,"code":0.006944444444444444,"providing":0.006944444444444444,"clear":0.006944444444444444,"concise":0.006944444444444444,"way":0.006944444444444444,"responses":0.006944444444444444},"122":{"1":0.005376344086021506,"2":0.005376344086021506,"3":0.005376344086021506,"4":0.005376344086021506,"256":0.005376344086021506,"function":0.005376344086021506,"signature":0.005376344086021506,"clarity":0.005376344086021506,"define-non-fungible-token":0.005376344086021506,"asset-name":0.005376344086021506,"asset-identifier-type":0.005376344086021506,"-":0.005376344086021506,"input":0.005376344086021506,"the":0.005376344086021506,"name":0.005376344086021506,"of":0.005376344086021506,"non-fungible":0.005376344086021506,"token":0.005376344086021506,"class":0.005376344086021506,"type":0.005376344086021506,"unique":0.005376344086021506,"identifier":0.005376344086021506,"for":0.005376344086021506,"each":0.005376344086021506,"output":0.005376344086021506,"not":0.005376344086021506,"applicable":0.005376344086021506,"definition":0.005376344086021506,"statement":0.005376344086021506,"why":0.005376344086021506,"it":0.005376344086021506,"matters":0.005376344086021506,"is":0.005376344086021506,"crucial":0.005376344086021506,"creating":0.005376344086021506,"new":0.005376344086021506,"nft":0.005376344086021506,"classes":0.005376344086021506,"within":0.005376344086021506,"a":0.005376344086021506,"smart":0.005376344086021506,"contract":0.005376344086021506,"establishing":0.005376344086021506,"digital":0.005376344086021506,"assets":0.005376344086021506,"with":0.005376344086021506,"individual":0.005376344086021506,"identifiers":0.005376344086021506,"implementing":0.005376344086021506,"collectibles":0.005376344086021506,"art":0.005376344086021506,"or":0.005376344086021506,"other":0.005376344086021506,"token-based":0.005376344086021506,"systems":0.005376344086021506,"enabling":0.005376344086021506,"nft-related":0.005376344086021506,"operations":0.005376344086021506,"like":0.005376344086021506,"minting":0.005376344086021506,"transferring":0.005376344086021506,"and":0.005376344086021506,"ownership":0.005376344086021506,"checks":0.005376344086021506,"when":0.005376344086021506,"to":0.005376344086021506,"use":0.005376344086021506,"you":0.005376344086021506,"need":0.005376344086021506,"create":0.005376344086021506,"your":0.005376344086021506,"dapp":0.005376344086021506,"implement":0.005376344086021506,"distinct":0.005376344086021506,"establish":0.005376344086021506,"foundation":0.005376344086021506,"nft-based":0.005376344086021506,"features":0.005376344086021506,"in":0.005376344086021506,"tokens":0.005376344086021506,"best":0.005376344086021506,"practices":0.005376344086021506,"place":0.005376344086021506,"at":0.005376344086021506,"top":0.005376344086021506,"level":0.005376344086021506,"as":0.005376344086021506,"it's":0.005376344086021506,"choose":0.005376344086021506,"an":0.005376344086021506,"appropriate":0.005376344086021506,"asset":0.005376344086021506,"that":0.005376344086021506,"ensures":0.005376344086021506,"uniqueness":0.005376344086021506,"meaningful":0.005376344086021506,"descriptive":0.005376344086021506,"names":0.005376344086021506,"consider":0.005376344086021506,"scalability":0.005376344086021506,"gas":0.005376344086021506,"costs":0.005376344086021506,"associated":0.005376344086021506,"chosen":0.005376344086021506,"practical":0.005376344086021506,"example":0.005376344086021506,"simple":0.005376344086021506,"let's":0.005376344086021506,"basic":0.005376344086021506,"system":0.005376344086021506,"sharkobarko":0.005376344086021506,"uint":0.005376344086021506,"define-data-var":0.005376344086021506,"index":0.005376344086021506,"u0":0.005376344086021506,"define-public":0.005376344086021506,"mint":0.005376344086021506,"who":0.005376344086021506,"principal":0.005376344086021506,"artwork-uri":0.005376344086021506,"string-utf8":0.005376344086021506,"let":0.005376344086021506,"tokenid":0.005376344086021506,"var-get":0.005376344086021506,"try":0.005376344086021506,"nft-mint":0.005376344086021506,"var-set":0.005376344086021506,"u1":0.005376344086021506,"ok":0.005376344086021506,"define-read-only":0.005376344086021506,"get-owner":0.005376344086021506,"nft-get-owner":0.005376344086021506,"transfer":0.005376344086021506,"sender":0.005376344086021506,"recipient":0.005376344086021506,"begin":0.005376344086021506,"asserts":0.005376344086021506,"is-eq":0.005376344086021506,"tx-sender":0.005376344086021506,"err":0.005376344086021506,"u403":0.005376344086021506,"nft-transfer":0.005376344086021506,"this":0.005376344086021506,"demonstrates":0.005376344086021506,"using":0.005376344086021506,"artwork":0.005376344086021506,"checking":0.005376344086021506,"incrementing":0.005376344086021506,"integer":0.005376344086021506,"common":0.005376344086021506,"pitfalls":0.005376344086021506,"forgetting":0.005376344086021506,"must":0.005376344086021506,"have":0.005376344086021506,"proper":0.005376344086021506,"access":0.005376344086021506,"controls":0.005376344086021506,"choosing":0.005376344086021506,"may":0.005376344086021506,"lead":0.005376344086021506,"collisions":0.005376344086021506,"issues":0.005376344086021506,"related":0.005376344086021506,"functions":0.005376344086021506,"used":0.005376344086021506,"check":0.005376344086021506,"current":0.005376344086021506,"owner":0.005376344086021506,"nft-burn":0.005376344086021506,"destroy":0.005376344086021506,"existing":0.005376344086021506,"conclusion":0.005376344086021506,"fundamental":0.005376344086021506,"building":0.005376344086021506,"block":0.005376344086021506,"contracts":0.005376344086021506,"allows":0.005376344086021506,"define":0.005376344086021506,"custom":0.005376344086021506,"combined":0.005376344086021506,"enables":0.005376344086021506,"implementation":0.005376344086021506,"sophisticated":0.005376344086021506,"on":0.005376344086021506,"stacks":0.005376344086021506,"blockchain":0.005376344086021506},"123":{"1":0.004739336492890996,"2":0.004739336492890996,"3":0.004739336492890996,"4":0.004739336492890996,"function":0.004739336492890996,"signature":0.004739336492890996,"clarity":0.004739336492890996,"ft-transfer":0.004739336492890996,"token-name":0.004739336492890996,"amount":0.004739336492890996,"sender":0.004739336492890996,"recipient":0.004739336492890996,"-":0.004739336492890996,"input":0.004739336492890996,"the":0.004739336492890996,"name":0.004739336492890996,"of":0.004739336492890996,"fungible":0.004739336492890996,"token":0.004739336492890996,"tokens":0.004739336492890996,"to":0.004739336492890996,"transfer":0.004739336492890996,"uint":0.004739336492890996,"principal":0.004739336492890996,"sending":0.004739336492890996,"receiving":0.004739336492890996,"output":0.004739336492890996,"response":0.004739336492890996,"bool":0.004739336492890996,"why":0.004739336492890996,"it":0.004739336492890996,"matters":0.004739336492890996,"is":0.004739336492890996,"crucial":0.004739336492890996,"for":0.004739336492890996,"moving":0.004739336492890996,"between":0.004739336492890996,"different":0.004739336492890996,"principals":0.004739336492890996,"within":0.004739336492890996,"a":0.004739336492890996,"smart":0.004739336492890996,"contract":0.004739336492890996,"implementing":0.004739336492890996,"functionality":0.004739336492890996,"in":0.004739336492890996,"decentralized":0.004739336492890996,"applications":0.004739336492890996,"enabling":0.004739336492890996,"token-based":0.004739336492890996,"transactions":0.004739336492890996,"and":0.004739336492890996,"interactions":0.004739336492890996,"users":0.004739336492890996,"or":0.004739336492890996,"contracts":0.004739336492890996,"facilitating":0.004739336492890996,"economy":0.004739336492890996,"mechanisms":0.004739336492890996,"when":0.004739336492890996,"use":0.004739336492890996,"you":0.004739336492890996,"need":0.004739336492890996,"from":0.004739336492890996,"one":0.004739336492890996,"account":0.004739336492890996,"another":0.004739336492890996,"implement":0.004739336492890996,"payment":0.004739336492890996,"reward":0.004739336492890996,"systems":0.004739336492890996,"using":0.004739336492890996,"custom":0.004739336492890996,"allow":0.004739336492890996,"send":0.004739336492890996,"each":0.004739336492890996,"other":0.004739336492890996,"your":0.004739336492890996,"dapp":0.004739336492890996,"move":0.004739336492890996,"as":0.004739336492890996,"part":0.004739336492890996,"more":0.004739336492890996,"complex":0.004739336492890996,"operations":0.004739336492890996,"best":0.004739336492890996,"practices":0.004739336492890996,"always":0.004739336492890996,"check":0.004739336492890996,"return":0.004739336492890996,"value":0.004739336492890996,"ensure":0.004739336492890996,"was":0.004739336492890996,"successful":0.004739336492890996,"proper":0.004739336492890996,"access":0.004739336492890996,"controls":0.004739336492890996,"prevent":0.004739336492890996,"unauthorized":0.004739336492890996,"transfers":0.004739336492890996,"consider":0.004739336492890996,"asserts":0.004739336492890996,"try":0.004739336492890996,"handle":0.004739336492890996,"failures":0.004739336492890996,"gracefully":0.004739336492890996,"be":0.004739336492890996,"aware":0.004739336492890996,"that":0.004739336492890996,"any":0.004739336492890996,"can":0.004739336492890996,"call":0.004739336492890996,"this":0.004739336492890996,"so":0.004739336492890996,"add":0.004739336492890996,"necessary":0.004739336492890996,"guards":0.004739336492890996,"verify":0.004739336492890996,"has":0.004739336492890996,"sufficient":0.004739336492890996,"balance":0.004739336492890996,"before":0.004739336492890996,"attempting":0.004739336492890996,"practical":0.004739336492890996,"example":0.004739336492890996,"let's":0.004739336492890996,"public":0.004739336492890996,"transferring":0.004739336492890996,"with":0.004739336492890996,"some":0.004739336492890996,"basic":0.004739336492890996,"checks":0.004739336492890996,"define-fungible-token":0.004739336492890996,"cbtc":0.004739336492890996,"define-public":0.004739336492890996,"transfer-tokens":0.004739336492890996,"let":0.004739336492890996,"tx-sender":0.004739336492890996,"not":0.004739336492890996,"is-eq":0.004739336492890996,"err":0.004739336492890996,"u2":0.004739336492890996,"u0":0.004739336492890996,"u3":0.004739336492890996,"match":0.004739336492890996,"success":0.004739336492890996,"ok":0.004739336492890996,"error":0.004739336492890996,"usage":0.004739336492890996,"ft-mint":0.004739336492890996,"u100":0.004739336492890996,"u50":0.004739336492890996,"'spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf":0.004739336492890996,"returns":0.004739336492890996,"true":0.004739336492890996,"demonstrates":0.004739336492890996,"valid":0.004739336492890996,"conditions":0.004739336492890996,"handling":0.004739336492890996,"propagating":0.004739336492890996,"caller":0.004739336492890996,"common":0.004739336492890996,"pitfalls":0.004739336492890996,"forgetting":0.004739336492890996,"called":0.004739336492890996,"by":0.004739336492890996,"potentially":0.004739336492890996,"leading":0.004739336492890996,"all":0.004739336492890996,"possible":0.004739336492890996,"cases":0.004739336492890996,"returned":0.004739336492890996,"than":0.004739336492890996,"sender's":0.004739336492890996,"hasn't":0.004739336492890996,"been":0.004739336492890996,"defined":0.004739336492890996,"related":0.004739336492890996,"functions":0.004739336492890996,"used":0.004739336492890996,"create":0.004739336492890996,"new":0.004739336492890996,"assign":0.004739336492890996,"them":0.004739336492890996,"ft-burn":0.004739336492890996,"destroy":0.004739336492890996,"reducing":0.004739336492890996,"ft-get-balance":0.004739336492890996,"ft-get-supply":0.004739336492890996,"get":0.004739336492890996,"current":0.004739336492890996,"total":0.004739336492890996,"supply":0.004739336492890996,"conclusion":0.004739336492890996,"fundamental":0.004739336492890996,"component":0.004739336492890996,"provides":0.004739336492890996,"straightforward":0.004739336492890996,"way":0.004739336492890996,"wide":0.004739336492890996,"range":0.004739336492890996,"functionalities":0.004739336492890996,"balances":0.004739336492890996,"allows":0.004739336492890996,"creation":0.004739336492890996,"secure":0.004739336492890996,"efficient":0.004739336492890996,"economies":0.004739336492890996,"on":0.004739336492890996,"stacks":0.004739336492890996,"blockchain":0.004739336492890996},"124":{"1":0.0058823529411764705,"2":0.0058823529411764705,"3":0.0058823529411764705,"4":0.0058823529411764705,"function":0.0058823529411764705,"signature":0.0058823529411764705,"clarity":0.0058823529411764705,"is-err":0.0058823529411764705,"value":0.0058823529411764705,"-":0.0058823529411764705,"input":0.0058823529411764705,"response":0.0058823529411764705,"a":0.0058823529411764705,"b":0.0058823529411764705,"output":0.0058823529411764705,"bool":0.0058823529411764705,"why":0.0058823529411764705,"it":0.0058823529411764705,"matters":0.0058823529411764705,"the":0.0058823529411764705,"is":0.0058823529411764705,"crucial":0.0058823529411764705,"for":0.0058823529411764705,"determining":0.0058823529411764705,"if":0.0058823529411764705,"represents":0.0058823529411764705,"an":0.0058823529411764705,"error":0.0058823529411764705,"implementing":0.0058823529411764705,"handling":0.0058823529411764705,"and":0.0058823529411764705,"validation":0.0058823529411764705,"logic":0.0058823529411764705,"ensuring":0.0058823529411764705,"robust":0.0058823529411764705,"contract":0.0058823529411764705,"behavior":0.0058823529411764705,"by":0.0058823529411764705,"checking":0.0058823529411764705,"errors":0.0058823529411764705,"simplifying":0.0058823529411764705,"conditional":0.0058823529411764705,"checks":0.0058823529411764705,"based":0.0058823529411764705,"on":0.0058823529411764705,"types":0.0058823529411764705,"when":0.0058823529411764705,"to":0.0058823529411764705,"use":0.0058823529411764705,"you":0.0058823529411764705,"need":0.0058823529411764705,"check":0.0058823529411764705,"implement":0.0058823529411764705,"success":0.0058823529411764705,"or":0.0058823529411764705,"failure":0.0058823529411764705,"of":0.0058823529411764705,"operations":0.0058823529411764705,"validate":0.0058823529411764705,"results":0.0058823529411764705,"calls":0.0058823529411764705,"that":0.0058823529411764705,"return":0.0058823529411764705,"handle":0.0058823529411764705,"gracefully":0.0058823529411764705,"in":0.0058823529411764705,"your":0.0058823529411764705,"best":0.0058823529411764705,"practices":0.0058823529411764705,"combination":0.0058823529411764705,"with":0.0058823529411764705,"match":0.0058823529411764705,"comprehensive":0.0058823529411764705,"ensure":0.0058823529411764705,"being":0.0058823529411764705,"checked":0.0058823529411764705,"correct":0.0058823529411764705,"type":0.0058823529411764705,"meaningful":0.0058823529411764705,"variable":0.0058823529411764705,"names":0.0058823529411764705,"better":0.0058823529411764705,"readability":0.0058823529411764705,"combine":0.0058823529411764705,"other":0.0058823529411764705,"functions":0.0058823529411764705,"like":0.0058823529411764705,"is-ok":0.0058823529411764705,"complete":0.0058823529411764705,"practical":0.0058823529411764705,"example":0.0058823529411764705,"validating":0.0058823529411764705,"token":0.0058823529411764705,"transfer":0.0058823529411764705,"let's":0.0058823529411764705,"validates":0.0058823529411764705,"define-map":0.0058823529411764705,"userbalances":0.0058823529411764705,"userid":0.0058823529411764705,"principal":0.0058823529411764705,"balance":0.0058823529411764705,"uint":0.0058823529411764705,"define-public":0.0058823529411764705,"transfer-tokens":0.0058823529411764705,"amount":0.0058823529411764705,"recipient":0.0058823529411764705,"let":0.0058823529411764705,"senderbalance":0.0058823529411764705,"default-to":0.0058823529411764705,"u0":0.0058823529411764705,"map-get":0.0058823529411764705,"tx-sender":0.0058823529411764705,"recipientbalance":0.0058823529411764705,"transferresult":0.0058823529411764705,"begin":0.0058823529411764705,"map-set":0.0058823529411764705,"ok":0.0058823529411764705,"true":0.0058823529411764705,"err":0.0058823529411764705,"u1":0.0058823529411764705,"u2":0.0058823529411764705,"usage":0.0058823529411764705,"u100":0.0058823529411764705,"u50":0.0058823529411764705,"'spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf":0.0058823529411764705,"returns":0.0058823529411764705,"u200":0.0058823529411764705,"this":0.0058823529411764705,"demonstrates":0.0058823529411764705,"using":0.0058823529411764705,"operation":0.0058823529411764705,"resulted":0.0058823529411764705,"both":0.0058823529411764705,"cases":0.0058823529411764705,"appropriately":0.0058823529411764705,"common":0.0058823529411764705,"pitfalls":0.0058823529411764705,"assuming":0.0058823529411764705,"always":0.0058823529411764705,"leading":0.0058823529411764705,"not":0.0058823529411764705,"all":0.0058823529411764705,"possible":0.0058823529411764705,"resulting":0.0058823529411764705,"incomplete":0.0058823529411764705,"overlooking":0.0058823529411764705,"without":0.0058823529411764705,"codes":0.0058823529411764705,"messages":0.0058823529411764705,"making":0.0058823529411764705,"debugging":0.0058823529411764705,"harder":0.0058823529411764705,"related":0.0058823529411764705,"constructs":0.0058823529411764705,"conclusion":0.0058823529411764705,"fundamental":0.0058823529411764705,"tool":0.0058823529411764705,"smart":0.0058823529411764705,"contracts":0.0058823529411764705,"allows":0.0058823529411764705,"enabling":0.0058823529411764705,"used":0.0058823529411764705,"effectively":0.0058823529411764705,"enhances":0.0058823529411764705,"reliability":0.0058823529411764705,"maintainability":0.0058823529411764705,"code":0.0058823529411764705,"are":0.0058823529411764705,"detected":0.0058823529411764705,"handled":0.0058823529411764705},"125":{"1":0.005649717514124294,"2":0.005649717514124294,"3":0.005649717514124294,"4":0.005649717514124294,"function":0.005649717514124294,"signature":0.005649717514124294,"clarity":0.005649717514124294,"ft-get-supply":0.005649717514124294,"token-name":0.005649717514124294,"-":0.005649717514124294,"input":0.005649717514124294,"the":0.005649717514124294,"name":0.005649717514124294,"of":0.005649717514124294,"fungible":0.005649717514124294,"token":0.005649717514124294,"output":0.005649717514124294,"uint":0.005649717514124294,"why":0.005649717514124294,"it":0.005649717514124294,"matters":0.005649717514124294,"is":0.005649717514124294,"crucial":0.005649717514124294,"for":0.005649717514124294,"querying":0.005649717514124294,"current":0.005649717514124294,"total":0.005649717514124294,"supply":0.005649717514124294,"a":0.005649717514124294,"implementing":0.005649717514124294,"supply-dependent":0.005649717514124294,"logic":0.005649717514124294,"in":0.005649717514124294,"contracts":0.005649717514124294,"providing":0.005649717514124294,"transparency":0.005649717514124294,"about":0.005649717514124294,"token's":0.005649717514124294,"circulating":0.005649717514124294,"enabling":0.005649717514124294,"other":0.005649717514124294,"or":0.005649717514124294,"off-chain":0.005649717514124294,"applications":0.005649717514124294,"to":0.005649717514124294,"verify":0.005649717514124294,"when":0.005649717514124294,"use":0.005649717514124294,"you":0.005649717514124294,"need":0.005649717514124294,"check":0.005649717514124294,"implement":0.005649717514124294,"that":0.005649717514124294,"depends":0.005649717514124294,"on":0.005649717514124294,"e":0.005649717514124294,"g":0.005649717514124294,"minting":0.005649717514124294,"limits":0.005649717514124294,"provide":0.005649717514124294,"information":0.005649717514124294,"users":0.005649717514124294,"integrity":0.005649717514124294,"operations":0.005649717514124294,"by":0.005649717514124294,"checking":0.005649717514124294,"changes":0.005649717514124294,"best":0.005649717514124294,"practices":0.005649717514124294,"combination":0.005649717514124294,"with":0.005649717514124294,"ft-mint":0.005649717514124294,"and":0.005649717514124294,"ft-burn":0.005649717514124294,"manage":0.005649717514124294,"consider":0.005649717514124294,"caching":0.005649717514124294,"result":0.005649717514124294,"if":0.005649717514124294,"queried":0.005649717514124294,"frequently":0.005649717514124294,"optimize":0.005649717514124294,"gas":0.005649717514124294,"usage":0.005649717514124294,"be":0.005649717514124294,"aware":0.005649717514124294,"can":0.005649717514124294,"change":0.005649717514124294,"between":0.005649717514124294,"checks":0.005649717514124294,"due":0.005649717514124294,"burning":0.005649717514124294,"conjunction":0.005649717514124294,"ft-get-balance":0.005649717514124294,"comprehensive":0.005649717514124294,"management":0.005649717514124294,"practical":0.005649717514124294,"example":0.005649717514124294,"supply-limited":0.005649717514124294,"let's":0.005649717514124294,"mints":0.005649717514124294,"tokens":0.005649717514124294,"only":0.005649717514124294,"doesn't":0.005649717514124294,"exceed":0.005649717514124294,"certain":0.005649717514124294,"cap":0.005649717514124294,"define-fungible-token":0.005649717514124294,"cbtc":0.005649717514124294,"define-constant":0.005649717514124294,"max_supply":0.005649717514124294,"u1000000":0.005649717514124294,"define-public":0.005649717514124294,"mint":0.005649717514124294,"amount":0.005649717514124294,"recipient":0.005649717514124294,"principal":0.005649717514124294,"let":0.005649717514124294,"currentsupply":0.005649717514124294,"err":0.005649717514124294,"u1":0.005649717514124294,"u500000":0.005649717514124294,"tx-sender":0.005649717514124294,"returns":0.005649717514124294,"ok":0.005649717514124294,"true":0.005649717514124294,"u600000":0.005649717514124294,"this":0.005649717514124294,"demonstrates":0.005649717514124294,"using":0.005649717514124294,"before":0.005649717514124294,"limit":0.005649717514124294,"combining":0.005649717514124294,"common":0.005649717514124294,"pitfalls":0.005649717514124294,"assuming":0.005649717514124294,"remains":0.005649717514124294,"constant":0.005649717514124294,"not":0.005649717514124294,"considering":0.005649717514124294,"potential":0.005649717514124294,"overflow":0.005649717514124294,"adding":0.005649717514124294,"overusing":0.005649717514124294,"loops":0.005649717514124294,"which":0.005649717514124294,"inefficient":0.005649717514124294,"consumption":0.005649717514124294,"related":0.005649717514124294,"functions":0.005649717514124294,"used":0.005649717514124294,"create":0.005649717514124294,"new":0.005649717514124294,"increasing":0.005649717514124294,"destroy":0.005649717514124294,"decreasing":0.005649717514124294,"get":0.005649717514124294,"balance":0.005649717514124294,"specific":0.005649717514124294,"define":0.005649717514124294,"initially":0.005649717514124294,"conclusion":0.005649717514124294,"an":0.005649717514124294,"essential":0.005649717514124294,"tool":0.005649717514124294,"managing":0.005649717514124294,"smart":0.005649717514124294,"provides":0.005649717514124294,"straightforward":0.005649717514124294,"way":0.005649717514124294,"access":0.005649717514124294,"maintain":0.005649717514124294,"effectively":0.005649717514124294,"ensures":0.005649717514124294,"accuracy":0.005649717514124294,"within":0.005649717514124294,"your":0.005649717514124294},"126":{"1":0.0055248618784530384,"2":0.0055248618784530384,"3":0.0055248618784530384,"4":0.0055248618784530384,"5":0.0055248618784530384,"function":0.0055248618784530384,"signature":0.0055248618784530384,"clarity":0.0055248618784530384,"as-max-len":0.0055248618784530384,"sequence":0.0055248618784530384,"max_length":0.0055248618784530384,"-":0.0055248618784530384,"input":0.0055248618784530384,"a":0.0055248618784530384,"of":0.0055248618784530384,"type":0.0055248618784530384,"list":0.0055248618784530384,"buff":0.0055248618784530384,"string-ascii":0.0055248618784530384,"or":0.0055248618784530384,"string-utf8":0.0055248618784530384,"uint":0.0055248618784530384,"literal":0.0055248618784530384,"representing":0.0055248618784530384,"the":0.0055248618784530384,"maximum":0.0055248618784530384,"allowed":0.0055248618784530384,"length":0.0055248618784530384,"output":0.0055248618784530384,"optional":0.0055248618784530384,"sequence_a":0.0055248618784530384,"why":0.0055248618784530384,"it":0.0055248618784530384,"matters":0.0055248618784530384,"is":0.0055248618784530384,"crucial":0.0055248618784530384,"for":0.0055248618784530384,"enforcing":0.0055248618784530384,"limits":0.0055248618784530384,"on":0.0055248618784530384,"sequences":0.0055248618784530384,"in":0.0055248618784530384,"smart":0.0055248618784530384,"contracts":0.0055248618784530384,"safely":0.0055248618784530384,"appending":0.0055248618784530384,"to":0.0055248618784530384,"lists":0.0055248618784530384,"other":0.0055248618784530384,"with":0.0055248618784530384,"lengths":0.0055248618784530384,"validating":0.0055248618784530384,"data":0.0055248618784530384,"before":0.0055248618784530384,"processing":0.0055248618784530384,"preventing":0.0055248618784530384,"potential":0.0055248618784530384,"overflow":0.0055248618784530384,"excessive":0.0055248618784530384,"resource":0.0055248618784530384,"consumption":0.0055248618784530384,"when":0.0055248618784530384,"use":0.0055248618784530384,"you":0.0055248618784530384,"need":0.0055248618784530384,"check":0.0055248618784530384,"if":0.0055248618784530384,"within":0.0055248618784530384,"specified":0.0055248618784530384,"append":0.0055248618784530384,"known":0.0055248618784530384,"validate":0.0055248618784530384,"user":0.0055248618784530384,"from":0.0055248618784530384,"external":0.0055248618784530384,"sources":0.0055248618784530384,"implement":0.0055248618784530384,"logic":0.0055248618784530384,"that":0.0055248618784530384,"depends":0.0055248618784530384,"constraints":0.0055248618784530384,"best":0.0055248618784530384,"practices":0.0055248618784530384,"always":0.0055248618784530384,"combine":0.0055248618784530384,"unwrap":0.0055248618784530384,"unwrap-panic":0.0055248618784530384,"you're":0.0055248618784530384,"certain":0.0055248618784530384,"should":0.0055248618784530384,"be":0.0055248618784530384,"meaningful":0.0055248618784530384,"error":0.0055248618784530384,"handling":0.0055248618784530384,"fails":0.0055248618784530384,"consider":0.0055248618784530384,"performance":0.0055248618784530384,"impact":0.0055248618784530384,"frequent":0.0055248618784530384,"checks":0.0055248618784530384,"your":0.0055248618784530384,"contract":0.0055248618784530384,"practical":0.0055248618784530384,"example":0.0055248618784530384,"safe":0.0055248618784530384,"let's":0.0055248618784530384,"appends":0.0055248618784530384,"define-data-var":0.0055248618784530384,"mylist":0.0055248618784530384,"define-public":0.0055248618784530384,"safe-append":0.0055248618784530384,"item":0.0055248618784530384,"let":0.0055248618784530384,"newlist":0.0055248618784530384,"var-get":0.0055248618784530384,"u5":0.0055248618784530384,"err":0.0055248618784530384,"u1":0.0055248618784530384,"ok":0.0055248618784530384,"var-set":0.0055248618784530384,"define-read-only":0.0055248618784530384,"get-list":0.0055248618784530384,"usage":0.0055248618784530384,"returns":0.0055248618784530384,"true":0.0055248618784530384,"u2":0.0055248618784530384,"u3":0.0055248618784530384,"u4":0.0055248618784530384,"u6":0.0055248618784530384,"this":0.0055248618784530384,"demonstrates":0.0055248618784530384,"using":0.0055248618784530384,"would":0.0055248618784530384,"exceed":0.0055248618784530384,"combining":0.0055248618784530384,"concise":0.0055248618784530384,"updating":0.0055248618784530384,"variable":0.0055248618784530384,"only":0.0055248618784530384,"passes":0.0055248618784530384,"common":0.0055248618784530384,"pitfalls":0.0055248618784530384,"forgetting":0.0055248618784530384,"parameter":0.0055248618784530384,"which":0.0055248618784530384,"not":0.0055248618784530384,"must":0.0055248618784530384,"none":0.0055248618784530384,"case":0.0055248618784530384,"an":0.0055248618784530384,"related":0.0055248618784530384,"functions":0.0055248618784530384,"used":0.0055248618784530384,"add":0.0055248618784530384,"elements":0.0055248618784530384,"concat":0.0055248618784530384,"join":0.0055248618784530384,"two":0.0055248618784530384,"together":0.0055248618784530384,"len":0.0055248618784530384,"get":0.0055248618784530384,"current":0.0055248618784530384,"conclusion":0.0055248618784530384,"critical":0.0055248618784530384,"tool":0.0055248618784530384,"managing":0.0055248618784530384,"by":0.0055248618784530384,"consistently":0.0055248618784530384,"can":0.0055248618784530384,"create":0.0055248618784530384,"more":0.0055248618784530384,"robust":0.0055248618784530384,"and":0.0055248618784530384,"secure":0.0055248618784530384,"properly":0.0055248618784530384,"handle":0.0055248618784530384,"vulnerabilities":0.0055248618784530384,"unbounded":0.0055248618784530384,"growth":0.0055248618784530384,"unexpected":0.0055248618784530384,"sizes":0.0055248618784530384},"127":{"1":0.005319148936170213,"2":0.005319148936170213,"3":0.005319148936170213,"4":0.005319148936170213,"32":0.005319148936170213,"101":0.005319148936170213,"function":0.005319148936170213,"signature":0.005319148936170213,"clarity":0.005319148936170213,"get-tenure-info":0.005319148936170213,"prop-name":0.005319148936170213,"block-height":0.005319148936170213,"-":0.005319148936170213,"input":0.005319148936170213,"a":0.005319148936170213,"tenureinfopropertyname":0.005319148936170213,"uint":0.005319148936170213,"representing":0.005319148936170213,"the":0.005319148936170213,"stacks":0.005319148936170213,"block":0.005319148936170213,"height":0.005319148936170213,"output":0.005319148936170213,"optional":0.005319148936170213,"buff":0.005319148936170213,"principal":0.005319148936170213,"depending":0.005319148936170213,"on":0.005319148936170213,"property":0.005319148936170213,"why":0.005319148936170213,"it":0.005319148936170213,"matters":0.005319148936170213,"is":0.005319148936170213,"essential":0.005319148936170213,"for":0.005319148936170213,"accessing":0.005319148936170213,"historical":0.005319148936170213,"tenure":0.005319148936170213,"data":0.005319148936170213,"within":0.005319148936170213,"smart":0.005319148936170213,"contracts":0.005319148936170213,"retrieving":0.005319148936170213,"information":0.005319148936170213,"about":0.005319148936170213,"miners":0.005319148936170213,"and":0.005319148936170213,"rewards":0.005319148936170213,"vrf":0.005319148936170213,"seeds":0.005319148936170213,"randomness-based":0.005319148936170213,"applications":0.005319148936170213,"analyzing":0.005319148936170213,"miner":0.005319148936170213,"participation":0.005319148936170213,"spending":0.005319148936170213,"patterns":0.005319148936170213,"when":0.005319148936170213,"to":0.005319148936170213,"use":0.005319148936170213,"you":0.005319148936170213,"need":0.005319148936170213,"access":0.005319148936170213,"tenure-specific":0.005319148936170213,"like":0.005319148936170213,"or":0.005319148936170213,"addresses":0.005319148936170213,"verify":0.005319148936170213,"timestamps":0.005319148936170213,"burnchain":0.005319148936170213,"analyze":0.005319148936170213,"implement":0.005319148936170213,"logic":0.005319148936170213,"that":0.005319148936170213,"depends":0.005319148936170213,"best":0.005319148936170213,"practices":0.005319148936170213,"always":0.005319148936170213,"handle":0.005319148936170213,"none":0.005319148936170213,"case":0.005319148936170213,"as":0.005319148936170213,"will":0.005319148936170213,"be":0.005319148936170213,"returned":0.005319148936170213,"non-existent":0.005319148936170213,"future":0.005319148936170213,"blocks":0.005319148936170213,"aware":0.005319148936170213,"are":0.005319148936170213,"only":0.005319148936170213,"available":0.005319148936170213,"after":0.005319148936170213,"maturity":0.005319148936170213,"mainnet":0.005319148936170213,"consider":0.005319148936170213,"two-hour":0.005319148936170213,"accuracy":0.005319148936170213,"window":0.005319148936170213,"working":0.005319148936170213,"with":0.005319148936170213,"cache":0.005319148936170213,"frequently":0.005319148936170213,"accessed":0.005319148936170213,"optimize":0.005319148936170213,"execution":0.005319148936170213,"costs":0.005319148936170213,"practical":0.005319148936170213,"example":0.005319148936170213,"checking":0.005319148936170213,"define-read-only":0.005319148936170213,"get-miner-spend-ratio":0.005319148936170213,"blockheight":0.005319148936170213,"let":0.005319148936170213,"winnerspend":0.005319148936170213,"miner-spend-winner":0.005319148936170213,"totalspend":0.005319148936170213,"miner-spend-total":0.005319148936170213,"match":0.005319148936170213,"tuple":0.005319148936170213,"winner":0.005319148936170213,"total":0.005319148936170213,"success":0.005319148936170213,"some":0.005319148936170213,"get":0.005319148936170213,"error":0.005319148936170213,"properties":0.005319148936170213,"burnchain-header-hash":0.005319148936170213,"returns":0.005319148936170213,"header":0.005319148936170213,"hash":0.005319148936170213,"miner-address":0.005319148936170213,"miner's":0.005319148936170213,"time":0.005319148936170213,"unix":0.005319148936170213,"epoch":0.005319148936170213,"timestamp":0.005319148936170213,"vrf-seed":0.005319148936170213,"seed":0.005319148936170213,"block-reward":0.005319148936170213,"reward":0.005319148936170213,"spent":0.005319148936170213,"by":0.005319148936170213,"all":0.005319148936170213,"this":0.005319148936170213,"amount":0.005319148936170213,"winning":0.005319148936170213,"common":0.005319148936170213,"pitfalls":0.005319148936170213,"not":0.005319148936170213,"accounting":0.005319148936170213,"period":0.005319148936170213,"relying":0.005319148936170213,"exact":0.005319148936170213,"times":0.005319148936170213,"of":0.005319148936170213,"two":0.005319148936170213,"hours":0.005319148936170213,"handling":0.005319148936170213,"invalid":0.005319148936170213,"heights":0.005319148936170213,"related":0.005319148936170213,"functions":0.005319148936170213,"get-block-info":0.005319148936170213,"used":0.005319148936170213,"current":0.005319148936170213,"burn-block-height":0.005319148936170213,"burn":0.005319148936170213,"chain":0.005319148936170213,"conclusion":0.005319148936170213,"provides":0.005319148936170213,"crucial":0.005319148936170213,"in":0.005319148936170213,"introduced":0.005319148936170213,"enables":0.005319148936170213,"developers":0.005319148936170213,"detailed":0.005319148936170213,"past":0.005319148936170213,"tenures":0.005319148936170213,"including":0.005319148936170213,"properly":0.005319148936170213,"powerful":0.005319148936170213,"tool":0.005319148936170213,"implementing":0.005319148936170213,"sophisticated":0.005319148936170213,"contract":0.005319148936170213,"blockchain":0.005319148936170213,"state":0.005319148936170213},"128":{"0":0.005319148936170213,"1":0.005319148936170213,"2":0.005319148936170213,"3":0.005319148936170213,"4":0.005319148936170213,"function":0.005319148936170213,"signature":0.005319148936170213,"clarity":0.005319148936170213,"bit-xor":0.005319148936170213,"i1":0.005319148936170213,"i2":0.005319148936170213,"-":0.005319148936170213,"input":0.005319148936170213,"two":0.005319148936170213,"or":0.005319148936170213,"more":0.005319148936170213,"integers":0.005319148936170213,"int":0.005319148936170213,"uint":0.005319148936170213,"output":0.005319148936170213,"an":0.005319148936170213,"integer":0.005319148936170213,"of":0.005319148936170213,"the":0.005319148936170213,"same":0.005319148936170213,"type":0.005319148936170213,"as":0.005319148936170213,"inputs":0.005319148936170213,"why":0.005319148936170213,"it":0.005319148936170213,"matters":0.005319148936170213,"is":0.005319148936170213,"crucial":0.005319148936170213,"for":0.005319148936170213,"performing":0.005319148936170213,"bitwise":0.005319148936170213,"exclusive":0.005319148936170213,"operations":0.005319148936170213,"in":0.005319148936170213,"smart":0.005319148936170213,"contracts":0.005319148936170213,"implementing":0.005319148936170213,"certain":0.005319148936170213,"cryptographic":0.005319148936170213,"algorithms":0.005319148936170213,"and":0.005319148936170213,"hash":0.005319148936170213,"functions":0.005319148936170213,"creating":0.005319148936170213,"toggle":0.005319148936170213,"mechanisms":0.005319148936170213,"binary":0.005319148936170213,"flags":0.005319148936170213,"detecting":0.005319148936170213,"changes":0.005319148936170213,"between":0.005319148936170213,"bit":0.005319148936170213,"patterns":0.005319148936170213,"when":0.005319148936170213,"to":0.005319148936170213,"use":0.005319148936170213,"you":0.005319148936170213,"need":0.005319148936170213,"implement":0.005319148936170213,"logic":0.005319148936170213,"on":0.005319148936170213,"data":0.005319148936170213,"specific":0.005319148936170213,"bits":0.005319148936170213,"a":0.005319148936170213,"value":0.005319148936170213,"without":0.005319148936170213,"affecting":0.005319148936170213,"others":0.005319148936170213,"compare":0.005319148936170213,"find":0.005319148936170213,"differences":0.005319148936170213,"create":0.005319148936170213,"simple":0.005319148936170213,"encryption":0.005319148936170213,"hashing":0.005319148936170213,"best":0.005319148936170213,"practices":0.005319148936170213,"ensure":0.005319148936170213,"all":0.005319148936170213,"values":0.005319148936170213,"are":0.005319148936170213,"either":0.005319148936170213,"remember":0.005319148936170213,"that":0.005319148936170213,"with":0.005319148936170213,"returns":0.005319148936170213,"original":0.005319148936170213,"which":0.005319148936170213,"can":0.005319148936170213,"be":0.005319148936170213,"useful":0.005319148936170213,"conditional":0.005319148936170213,"combination":0.005319148936170213,"other":0.005319148936170213,"complex":0.005319148936170213,"manipulations":0.005319148936170213,"consider":0.005319148936170213,"readability":0.005319148936170213,"your":0.005319148936170213,"code":0.005319148936170213,"using":0.005319148936170213,"extensively":0.005319148936170213,"add":0.005319148936170213,"comments":0.005319148936170213,"explain":0.005319148936170213,"purpose":0.005319148936170213,"practical":0.005319148936170213,"example":0.005319148936170213,"mechanism":0.005319148936170213,"let's":0.005319148936170213,"define-data-var":0.005319148936170213,"u0":0.005319148936170213,"define-read-only":0.005319148936170213,"get-flag":0.005319148936170213,"flagposition":0.005319148936170213,"is-eq":0.005319148936170213,"bit-and":0.005319148936170213,"var-get":0.005319148936170213,"bit-shift-left":0.005319148936170213,"u1":0.005319148936170213,"define-public":0.005319148936170213,"toggle-flag":0.005319148936170213,"begin":0.005319148936170213,"asserts":0.005319148936170213,"u8":0.005319148936170213,"err":0.005319148936170213,"flag":0.005319148936170213,"position":0.005319148936170213,"valid":0.005319148936170213,"ok":0.005319148936170213,"var-set":0.005319148936170213,"usage":0.005319148936170213,"u2":0.005319148936170213,"toggles":0.005319148936170213,"3rd":0.005319148936170213,"false":0.005319148936170213,"again":0.005319148936170213,"true":0.005319148936170213,"this":0.005319148936170213,"demonstrates":0.005319148936170213,"individual":0.005319148936170213,"variable":0.005319148936170213,"combining":0.005319148936170213,"like":0.005319148936170213,"system":0.005319148936170213,"efficient":0.005319148936170213,"storage":0.005319148936170213,"manipulation":0.005319148936170213,"common":0.005319148936170213,"pitfalls":0.005319148936170213,"mixing":0.005319148936170213,"signed":0.005319148936170213,"unsigned":0.005319148936170213,"single":0.005319148936170213,"operation":0.005319148936170213,"forgetting":0.005319148936170213,"itself":0.005319148936170213,"always":0.005319148936170213,"results":0.005319148936170213,"not":0.005319148936170213,"considering":0.005319148936170213,"full":0.005319148936170213,"range":0.005319148936170213,"smaller":0.005319148936170213,"related":0.005319148936170213,"used":0.005319148936170213,"bit-or":0.005319148936170213,"bit-not":0.005319148936170213,"often":0.005319148936170213,"bit-shift-right":0.005319148936170213,"right-shifting":0.005319148936170213,"conclusion":0.005319148936170213,"powerful":0.005319148936170213,"tool":0.005319148936170213,"enables":0.005319148936170213,"implementation":0.005319148936170213,"bit-level":0.005319148936170213,"avoid":0.005319148936170213,"unexpected":0.005319148936170213,"mindful":0.005319148936170213,"types":0.005319148936170213,"effects":0.005319148936170213},"129":{"1":0.005747126436781609,"2":0.005747126436781609,"3":0.005747126436781609,"4":0.005747126436781609,"function":0.005747126436781609,"signature":0.005747126436781609,"clarity":0.005747126436781609,"define-private":0.005747126436781609,"function-name":0.005747126436781609,"arg-name-0":0.005747126436781609,"arg-type-0":0.005747126436781609,"function-body":0.005747126436781609,"-":0.005747126436781609,"input":0.005747126436781609,"the":0.005747126436781609,"name":0.005747126436781609,"of":0.005747126436781609,"private":0.005747126436781609,"arg-name-n":0.005747126436781609,"each":0.005747126436781609,"argument":0.005747126436781609,"arg-type-n":0.005747126436781609,"type":0.005747126436781609,"code":0.005747126436781609,"to":0.005747126436781609,"be":0.005747126436781609,"executed":0.005747126436781609,"when":0.005747126436781609,"is":0.005747126436781609,"called":0.005747126436781609,"output":0.005747126436781609,"not":0.005747126436781609,"applicable":0.005747126436781609,"definition":0.005747126436781609,"statement":0.005747126436781609,"why":0.005747126436781609,"it":0.005747126436781609,"matters":0.005747126436781609,"crucial":0.005747126436781609,"for":0.005747126436781609,"creating":0.005747126436781609,"internal":0.005747126436781609,"helper":0.005747126436781609,"functions":0.005747126436781609,"that":0.005747126436781609,"are":0.005747126436781609,"only":0.005747126436781609,"accessible":0.005747126436781609,"within":0.005747126436781609,"contract":0.005747126436781609,"encapsulating":0.005747126436781609,"logic":0.005747126436781609,"shouldn't":0.005747126436781609,"directly":0.005747126436781609,"callable":0.005747126436781609,"from":0.005747126436781609,"outside":0.005747126436781609,"improving":0.005747126436781609,"organization":0.005747126436781609,"and":0.005747126436781609,"reusability":0.005747126436781609,"a":0.005747126436781609,"implementing":0.005747126436781609,"complex":0.005747126436781609,"operations":0.005747126436781609,"used":0.005747126436781609,"by":0.005747126436781609,"multiple":0.005747126436781609,"public":0.005747126436781609,"use":0.005747126436781609,"you":0.005747126436781609,"need":0.005747126436781609,"create":0.005747126436781609,"utility":0.005747126436781609,"implement":0.005747126436781609,"needs":0.005747126436781609,"hidden":0.005747126436781609,"external":0.005747126436781609,"callers":0.005747126436781609,"break":0.005747126436781609,"down":0.005747126436781609,"large":0.005747126436781609,"into":0.005747126436781609,"smaller":0.005747126436781609,"more":0.005747126436781609,"manageable":0.005747126436781609,"pieces":0.005747126436781609,"improve":0.005747126436781609,"readability":0.005747126436781609,"maintainability":0.005747126436781609,"your":0.005747126436781609,"best":0.005747126436781609,"practices":0.005747126436781609,"descriptive":0.005747126436781609,"names":0.005747126436781609,"clearly":0.005747126436781609,"indicate":0.005747126436781609,"their":0.005747126436781609,"purpose":0.005747126436781609,"keep":0.005747126436781609,"focused":0.005747126436781609,"on":0.005747126436781609,"single":0.005747126436781609,"task":0.005747126436781609,"or":0.005747126436781609,"operation":0.005747126436781609,"avoid":0.005747126436781609,"duplication":0.005747126436781609,"remember":0.005747126436781609,"can":0.005747126436781609,"return":0.005747126436781609,"any":0.005747126436781609,"just":0.005747126436781609,"response":0.005747126436781609,"types":0.005747126436781609,"practical":0.005747126436781609,"example":0.005747126436781609,"validation":0.005747126436781609,"let's":0.005747126436781609,"validate-amount":0.005747126436781609,"amount":0.005747126436781609,"uint":0.005747126436781609,"u0":0.005747126436781609,"u1000000":0.005747126436781609,"define-public":0.005747126436781609,"transfer":0.005747126436781609,"recipient":0.005747126436781609,"principal":0.005747126436781609,"if":0.005747126436781609,"begin":0.005747126436781609,"perform":0.005747126436781609,"here":0.005747126436781609,"ok":0.005747126436781609,"true":0.005747126436781609,"err":0.005747126436781609,"u1":0.005747126436781609,"this":0.005747126436781609,"demonstrates":0.005747126436781609,"using":0.005747126436781609,"calling":0.005747126436781609,"separating":0.005747126436781609,"common":0.005747126436781609,"pitfalls":0.005747126436781609,"attempting":0.005747126436781609,"call":0.005747126436781609,"which":0.005747126436781609,"allowed":0.005747126436781609,"overusing":0.005747126436781609,"leading":0.005747126436781609,"overly":0.005747126436781609,"structure":0.005747126436781609,"forgetting":0.005747126436781609,"modify":0.005747126436781609,"state":0.005747126436781609,"may":0.005747126436781609,"lead":0.005747126436781609,"unexpected":0.005747126436781609,"behavior":0.005747126436781609,"carefully":0.005747126436781609,"managed":0.005747126436781609,"related":0.005747126436781609,"define":0.005747126436781609,"define-read-only":0.005747126436781609,"read-only":0.005747126436781609,"don't":0.005747126436781609,"conclusion":0.005747126436781609,"powerful":0.005747126436781609,"tool":0.005747126436781609,"smart":0.005747126436781609,"contracts":0.005747126436781609,"effectively":0.005747126436781609,"reduce":0.005747126436781609,"maintainable":0.005747126436781609,"secure":0.005747126436781609},"130":{"0":0.005076142131979695,"1":0.005076142131979695,"2":0.005076142131979695,"3":0.005076142131979695,"4":0.005076142131979695,"1000":0.005076142131979695,"function":0.005076142131979695,"signature":0.005076142131979695,"clarity":0.005076142131979695,"bit-or":0.005076142131979695,"i1":0.005076142131979695,"i2":0.005076142131979695,"-":0.005076142131979695,"input":0.005076142131979695,"two":0.005076142131979695,"or":0.005076142131979695,"more":0.005076142131979695,"integers":0.005076142131979695,"int":0.005076142131979695,"uint":0.005076142131979695,"output":0.005076142131979695,"an":0.005076142131979695,"integer":0.005076142131979695,"of":0.005076142131979695,"the":0.005076142131979695,"same":0.005076142131979695,"type":0.005076142131979695,"as":0.005076142131979695,"inputs":0.005076142131979695,"why":0.005076142131979695,"it":0.005076142131979695,"matters":0.005076142131979695,"is":0.005076142131979695,"crucial":0.005076142131979695,"for":0.005076142131979695,"performing":0.005076142131979695,"bitwise":0.005076142131979695,"operations":0.005076142131979695,"in":0.005076142131979695,"smart":0.005076142131979695,"contracts":0.005076142131979695,"combining":0.005076142131979695,"flags":0.005076142131979695,"bitmasks":0.005076142131979695,"efficiently":0.005076142131979695,"implementing":0.005076142131979695,"certain":0.005076142131979695,"logical":0.005076142131979695,"and":0.005076142131979695,"algorithms":0.005076142131979695,"manipulating":0.005076142131979695,"binary":0.005076142131979695,"data":0.005076142131979695,"at":0.005076142131979695,"bit":0.005076142131979695,"level":0.005076142131979695,"when":0.005076142131979695,"to":0.005076142131979695,"use":0.005076142131979695,"you":0.005076142131979695,"need":0.005076142131979695,"combine":0.005076142131979695,"multiple":0.005076142131979695,"into":0.005076142131979695,"a":0.005076142131979695,"single":0.005076142131979695,"value":0.005076142131979695,"set":0.005076142131979695,"specific":0.005076142131979695,"bits":0.005076142131979695,"without":0.005076142131979695,"affecting":0.005076142131979695,"others":0.005076142131979695,"implement":0.005076142131979695,"structures":0.005076142131979695,"perform":0.005076142131979695,"low-level":0.005076142131979695,"manipulations":0.005076142131979695,"involving":0.005076142131979695,"best":0.005076142131979695,"practices":0.005076142131979695,"ensure":0.005076142131979695,"all":0.005076142131979695,"values":0.005076142131979695,"are":0.005076142131979695,"either":0.005076142131979695,"remember":0.005076142131979695,"that":0.005076142131979695,"with":0.005076142131979695,"has":0.005076142131979695,"no":0.005076142131979695,"effect":0.005076142131979695,"which":0.005076142131979695,"can":0.005076142131979695,"be":0.005076142131979695,"useful":0.005076142131979695,"conditional":0.005076142131979695,"combination":0.005076142131979695,"other":0.005076142131979695,"complex":0.005076142131979695,"consider":0.005076142131979695,"readability":0.005076142131979695,"using":0.005076142131979695,"extensively":0.005076142131979695,"add":0.005076142131979695,"comments":0.005076142131979695,"explain":0.005076142131979695,"purpose":0.005076142131979695,"practical":0.005076142131979695,"example":0.005076142131979695,"permission":0.005076142131979695,"system":0.005076142131979695,"let's":0.005076142131979695,"simple":0.005076142131979695,"define-constant":0.005076142131979695,"permission_read":0.005076142131979695,"u1":0.005076142131979695,"0001":0.005076142131979695,"permission_write":0.005076142131979695,"u2":0.005076142131979695,"0010":0.005076142131979695,"permission_execute":0.005076142131979695,"u4":0.005076142131979695,"0100":0.005076142131979695,"permission_admin":0.005076142131979695,"u8":0.005076142131979695,"define-map":0.005076142131979695,"userpermissions":0.005076142131979695,"principal":0.005076142131979695,"define-public":0.005076142131979695,"grant-permission":0.005076142131979695,"user":0.005076142131979695,"let":0.005076142131979695,"currentpermissions":0.005076142131979695,"default-to":0.005076142131979695,"u0":0.005076142131979695,"map-get":0.005076142131979695,"ok":0.005076142131979695,"map-set":0.005076142131979695,"revoke-permission":0.005076142131979695,"bit-and":0.005076142131979695,"bit-not":0.005076142131979695,"define-read-only":0.005076142131979695,"has-permission":0.005076142131979695,"userpermission":0.005076142131979695,"is-eq":0.005076142131979695,"usage":0.005076142131979695,"tx-sender":0.005076142131979695,"returns":0.005076142131979695,"true":0.005076142131979695,"false":0.005076142131979695,"this":0.005076142131979695,"demonstrates":0.005076142131979695,"permissions":0.005076142131979695,"efficient":0.005076142131979695,"storage":0.005076142131979695,"checks":0.005076142131979695,"like":0.005076142131979695,"management":0.005076142131979695,"common":0.005076142131979695,"pitfalls":0.005076142131979695,"mixing":0.005076142131979695,"signed":0.005076142131979695,"unsigned":0.005076142131979695,"operation":0.005076142131979695,"forgetting":0.005076142131979695,"-1":0.005076142131979695,"maximum":0.005076142131979695,"always":0.005076142131979695,"results":0.005076142131979695,"not":0.005076142131979695,"considering":0.005076142131979695,"full":0.005076142131979695,"range":0.005076142131979695,"smaller":0.005076142131979695,"related":0.005076142131979695,"functions":0.005076142131979695,"used":0.005076142131979695,"bit-xor":0.005076142131979695,"xor":0.005076142131979695,"bit-shift-left":0.005076142131979695,"left-shifting":0.005076142131979695,"bit-shift-right":0.005076142131979695,"right-shifting":0.005076142131979695,"conclusion":0.005076142131979695,"powerful":0.005076142131979695,"tool":0.005076142131979695,"enables":0.005076142131979695,"implementation":0.005076142131979695,"bit-level":0.005076142131979695,"however":0.005076142131979695,"mindful":0.005076142131979695,"types":0.005076142131979695,"effects":0.005076142131979695,"on":0.005076142131979695,"avoid":0.005076142131979695,"unexpected":0.005076142131979695},"131":{"1":0.006896551724137931,"2":0.006896551724137931,"3":0.006896551724137931,"4":0.006896551724137931,"6":0.006896551724137931,"function":0.006896551724137931,"signature":0.006896551724137931,"clarity":0.006896551724137931,"var-get":0.006896551724137931,"var-name":0.006896551724137931,"-":0.006896551724137931,"input":0.006896551724137931,"varname":0.006896551724137931,"output":0.006896551724137931,"a":0.006896551724137931,"why":0.006896551724137931,"it":0.006896551724137931,"matters":0.006896551724137931,"the":0.006896551724137931,"is":0.006896551724137931,"crucial":0.006896551724137931,"for":0.006896551724137931,"retrieving":0.006896551724137931,"value":0.006896551724137931,"of":0.006896551724137931,"data":0.006896551724137931,"variable":0.006896551724137931,"implementing":0.006896551724137931,"logic":0.006896551724137931,"that":0.006896551724137931,"requires":0.006896551724137931,"accessing":0.006896551724137931,"stored":0.006896551724137931,"ensuring":0.006896551724137931,"integrity":0.006896551724137931,"by":0.006896551724137931,"validating":0.006896551724137931,"retrieval":0.006896551724137931,"process":0.006896551724137931,"simplifying":0.006896551724137931,"handling":0.006896551724137931,"variables":0.006896551724137931,"in":0.006896551724137931,"smart":0.006896551724137931,"contracts":0.006896551724137931,"when":0.006896551724137931,"to":0.006896551724137931,"use":0.006896551724137931,"you":0.006896551724137931,"need":0.006896551724137931,"retrieve":0.006896551724137931,"implement":0.006896551724137931,"validate":0.006896551724137931,"ensure":0.006896551724137931,"handle":0.006896551724137931,"your":0.006896551724137931,"contract":0.006896551724137931,"best":0.006896551724137931,"practices":0.006896551724137931,"name":0.006896551724137931,"correctly":0.006896551724137931,"formatted":0.006896551724137931,"and":0.006896551724137931,"valid":0.006896551724137931,"meaningful":0.006896551724137931,"names":0.006896551724137931,"better":0.006896551724137931,"readability":0.006896551724137931,"combine":0.006896551724137931,"with":0.006896551724137931,"other":0.006896551724137931,"functions":0.006896551724137931,"comprehensive":0.006896551724137931,"management":0.006896551724137931,"possible":0.006896551724137931,"error":0.006896551724137931,"cases":0.006896551724137931,"robust":0.006896551724137931,"behavior":0.006896551724137931,"practical":0.006896551724137931,"example":0.006896551724137931,"define-data-var":0.006896551724137931,"cursor":0.006896551724137931,"int":0.006896551724137931,"define-public":0.006896551724137931,"get-cursor":0.006896551724137931,"ok":0.006896551724137931,"usage":0.006896551724137931,"returns":0.006896551724137931,"this":0.006896551724137931,"demonstrates":0.006896551724137931,"using":0.006896551724137931,"public":0.006896551724137931,"both":0.006896551724137931,"successful":0.006896551724137931,"common":0.006896551724137931,"pitfalls":0.006896551724137931,"incorrectly":0.006896551724137931,"or":0.006896551724137931,"invalid":0.006896551724137931,"causing":0.006896551724137931,"runtime":0.006896551724137931,"errors":0.006896551724137931,"assuming":0.006896551724137931,"will":0.006896551724137931,"always":0.006896551724137931,"succeed":0.006896551724137931,"leading":0.006896551724137931,"unhandled":0.006896551724137931,"not":0.006896551724137931,"all":0.006896551724137931,"conditions":0.006896551724137931,"resulting":0.006896551724137931,"incomplete":0.006896551724137931,"overlooking":0.006896551724137931,"proper":0.006896551724137931,"validation":0.006896551724137931,"related":0.006896551724137931,"var-set":0.006896551724137931,"sets":0.006896551724137931,"map-get":0.006896551724137931,"retrieves":0.006896551724137931,"from":0.006896551724137931,"map":0.006896551724137931,"default-to":0.006896551724137931,"provides":0.006896551724137931,"default":0.006896551724137931,"if":0.006896551724137931,"an":0.006896551724137931,"optional":0.006896551724137931,"none":0.006896551724137931,"conclusion":0.006896551724137931,"fundamental":0.006896551724137931,"tool":0.006896551724137931,"allows":0.006896551724137931,"used":0.006896551724137931,"effectively":0.006896551724137931,"enhances":0.006896551724137931,"reliability":0.006896551724137931,"maintainability":0.006896551724137931,"code":0.006896551724137931,"providing":0.006896551724137931,"clear":0.006896551724137931,"concise":0.006896551724137931,"way":0.006896551724137931},"132":{"1":0.005747126436781609,"2":0.005747126436781609,"3":0.005747126436781609,"4":0.005747126436781609,"32":0.005747126436781609,"function":0.005747126436781609,"signature":0.005747126436781609,"clarity":0.005747126436781609,"map-set":0.005747126436781609,"map-name":0.005747126436781609,"key-tuple":0.005747126436781609,"value-tuple":0.005747126436781609,"-":0.005747126436781609,"input":0.005747126436781609,"mapname":0.005747126436781609,"tuple_a":0.005747126436781609,"tuple_b":0.005747126436781609,"output":0.005747126436781609,"bool":0.005747126436781609,"why":0.005747126436781609,"it":0.005747126436781609,"matters":0.005747126436781609,"the":0.005747126436781609,"is":0.005747126436781609,"crucial":0.005747126436781609,"for":0.005747126436781609,"setting":0.005747126436781609,"or":0.005747126436781609,"updating":0.005747126436781609,"entries":0.005747126436781609,"in":0.005747126436781609,"a":0.005747126436781609,"map":0.005747126436781609,"managing":0.005747126436781609,"and":0.005747126436781609,"state":0.005747126436781609,"of":0.005747126436781609,"data":0.005747126436781609,"stored":0.005747126436781609,"maps":0.005747126436781609,"ensuring":0.005747126436781609,"integrity":0.005747126436781609,"by":0.005747126436781609,"allowing":0.005747126436781609,"updates":0.005747126436781609,"to":0.005747126436781609,"existing":0.005747126436781609,"simplifying":0.005747126436781609,"process":0.005747126436781609,"maintaining":0.005747126436781609,"accurate":0.005747126436781609,"smart":0.005747126436781609,"contracts":0.005747126436781609,"when":0.005747126436781609,"use":0.005747126436781609,"you":0.005747126436781609,"need":0.005747126436781609,"set":0.005747126436781609,"update":0.005747126436781609,"an":0.005747126436781609,"entry":0.005747126436781609,"manage":0.005747126436781609,"ensure":0.005747126436781609,"maintain":0.005747126436781609,"your":0.005747126436781609,"contract":0.005747126436781609,"best":0.005747126436781609,"practices":0.005747126436781609,"are":0.005747126436781609,"correctly":0.005747126436781609,"formatted":0.005747126436781609,"meaningful":0.005747126436781609,"variable":0.005747126436781609,"names":0.005747126436781609,"better":0.005747126436781609,"readability":0.005747126436781609,"combine":0.005747126436781609,"with":0.005747126436781609,"other":0.005747126436781609,"functions":0.005747126436781609,"comprehensive":0.005747126436781609,"management":0.005747126436781609,"be":0.005747126436781609,"aware":0.005747126436781609,"performance":0.005747126436781609,"implications":0.005747126436781609,"frequent":0.005747126436781609,"large":0.005747126436781609,"practical":0.005747126436781609,"example":0.005747126436781609,"user":0.005747126436781609,"let's":0.005747126436781609,"implement":0.005747126436781609,"that":0.005747126436781609,"sets":0.005747126436781609,"user's":0.005747126436781609,"define-map":0.005747126436781609,"userdata":0.005747126436781609,"userid":0.005747126436781609,"principal":0.005747126436781609,"buff":0.005747126436781609,"define-public":0.005747126436781609,"set-user-data":0.005747126436781609,"ok":0.005747126436781609,"usage":0.005747126436781609,"tx-sender":0.005747126436781609,"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef":0.005747126436781609,"returns":0.005747126436781609,"true":0.005747126436781609,"0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef":0.005747126436781609,"this":0.005747126436781609,"demonstrates":0.005747126436781609,"using":0.005747126436781609,"implementing":0.005747126436781609,"public":0.005747126436781609,"handling":0.005747126436781609,"both":0.005747126436781609,"case":0.005747126436781609,"where":0.005747126436781609,"newly":0.005747126436781609,"created":0.005747126436781609,"updated":0.005747126436781609,"common":0.005747126436781609,"pitfalls":0.005747126436781609,"incorrectly":0.005747126436781609,"tuples":0.005747126436781609,"causing":0.005747126436781609,"operation":0.005747126436781609,"fail":0.005747126436781609,"assuming":0.005747126436781609,"will":0.005747126436781609,"always":0.005747126436781609,"leading":0.005747126436781609,"unhandled":0.005747126436781609,"cases":0.005747126436781609,"not":0.005747126436781609,"all":0.005747126436781609,"possible":0.005747126436781609,"conditions":0.005747126436781609,"resulting":0.005747126436781609,"incomplete":0.005747126436781609,"overlooking":0.005747126436781609,"proper":0.005747126436781609,"error":0.005747126436781609,"validation":0.005747126436781609,"related":0.005747126436781609,"map-insert":0.005747126436781609,"inserts":0.005747126436781609,"value":0.005747126436781609,"into":0.005747126436781609,"if":0.005747126436781609,"key":0.005747126436781609,"does":0.005747126436781609,"already":0.005747126436781609,"exist":0.005747126436781609,"map-delete":0.005747126436781609,"removes":0.005747126436781609,"from":0.005747126436781609,"map-get":0.005747126436781609,"retrieves":0.005747126436781609,"conclusion":0.005747126436781609,"fundamental":0.005747126436781609,"tool":0.005747126436781609,"allows":0.005747126436781609,"used":0.005747126436781609,"effectively":0.005747126436781609,"enhances":0.005747126436781609,"reliability":0.005747126436781609,"maintainability":0.005747126436781609,"code":0.005747126436781609,"providing":0.005747126436781609,"clear":0.005747126436781609,"concise":0.005747126436781609,"way":0.005747126436781609},"133":{"1":0.005681818181818182,"2":0.005681818181818182,"3":0.005681818181818182,"4":0.005681818181818182,"16":0.005681818181818182,"function":0.005681818181818182,"signature":0.005681818181818182,"clarity":0.005681818181818182,"buff-to-uint-be":0.005681818181818182,"buff":0.005681818181818182,"-":0.005681818181818182,"input":0.005681818181818182,"a":0.005681818181818182,"byte":0.005681818181818182,"buffer":0.005681818181818182,"of":0.005681818181818182,"up":0.005681818181818182,"to":0.005681818181818182,"bytes":0.005681818181818182,"output":0.005681818181818182,"an":0.005681818181818182,"unsigned":0.005681818181818182,"integer":0.005681818181818182,"uint":0.005681818181818182,"why":0.005681818181818182,"it":0.005681818181818182,"matters":0.005681818181818182,"the":0.005681818181818182,"is":0.005681818181818182,"crucial":0.005681818181818182,"for":0.005681818181818182,"converting":0.005681818181818182,"data":0.005681818181818182,"integers":0.005681818181818182,"using":0.005681818181818182,"big-endian":0.005681818181818182,"encoding":0.005681818181818182,"handling":0.005681818181818182,"from":0.005681818181818182,"external":0.005681818181818182,"sources":0.005681818181818182,"or":0.005681818181818182,"other":0.005681818181818182,"contracts":0.005681818181818182,"that":0.005681818181818182,"use":0.005681818181818182,"implementing":0.005681818181818182,"protocols":0.005681818181818182,"algorithms":0.005681818181818182,"require":0.005681818181818182,"representation":0.005681818181818182,"interoperating":0.005681818181818182,"with":0.005681818181818182,"systems":0.005681818181818182,"order":0.005681818181818182,"when":0.005681818181818182,"you":0.005681818181818182,"need":0.005681818181818182,"convert":0.005681818181818182,"encoded":0.005681818181818182,"process":0.005681818181818182,"represents":0.005681818181818182,"in":0.005681818181818182,"format":0.005681818181818182,"implement":0.005681818181818182,"cryptographic":0.005681818181818182,"mathematical":0.005681818181818182,"operations":0.005681818181818182,"expect":0.005681818181818182,"inputs":0.005681818181818182,"ensure":0.005681818181818182,"compatibility":0.005681818181818182,"best":0.005681818181818182,"practices":0.005681818181818182,"no":0.005681818181818182,"larger":0.005681818181818182,"than":0.005681818181818182,"avoid":0.005681818181818182,"errors":0.005681818181818182,"be":0.005681818181818182,"aware":0.005681818181818182,"smaller":0.005681818181818182,"buffers":0.005681818181818182,"are":0.005681818181818182,"zero-padded":0.005681818181818182,"on":0.005681818181818182,"left":0.005681818181818182,"affecting":0.005681818181818182,"resulting":0.005681818181818182,"value":0.005681818181818182,"buff-to-int-be":0.005681818181818182,"if":0.005681818181818182,"handle":0.005681818181818182,"signed":0.005681818181818182,"instead":0.005681818181818182,"potential":0.005681818181818182,"might":0.005681818181818182,"invalid":0.005681818181818182,"empty":0.005681818181818182,"practical":0.005681818181818182,"example":0.005681818181818182,"decoding":0.005681818181818182,"let's":0.005681818181818182,"processes":0.005681818181818182,"containing":0.005681818181818182,"define-read-only":0.005681818181818182,"process-external-data":0.005681818181818182,"let":0.005681818181818182,"u1000000":0.005681818181818182,"err":0.005681818181818182,"too":0.005681818181818182,"large":0.005681818181818182,"ok":0.005681818181818182,"usage":0.005681818181818182,"0x00000001":0.005681818181818182,"returns":0.005681818181818182,"u1":0.005681818181818182,"0x000f4240":0.005681818181818182,"0x00989680":0.005681818181818182,"this":0.005681818181818182,"demonstrates":0.005681818181818182,"validation":0.005681818181818182,"based":0.005681818181818182,"converted":0.005681818181818182,"different":0.005681818181818182,"sizes":0.005681818181818182,"and":0.005681818181818182,"values":0.005681818181818182,"common":0.005681818181818182,"pitfalls":0.005681818181818182,"forgetting":0.005681818181818182,"interprets":0.005681818181818182,"as":0.005681818181818182,"which":0.005681818181818182,"lead":0.005681818181818182,"unexpected":0.005681818181818182,"actually":0.005681818181818182,"little-endian":0.005681818181818182,"not":0.005681818181818182,"considering":0.005681818181818182,"full":0.005681818181818182,"range":0.005681818181818182,"possible":0.005681818181818182,"processing":0.005681818181818182,"result":0.005681818181818182,"assuming":0.005681818181818182,"specific":0.005681818181818182,"length":0.005681818181818182,"could":0.005681818181818182,"results":0.005681818181818182,"shorter":0.005681818181818182,"due":0.005681818181818182,"left-padding":0.005681818181818182,"related":0.005681818181818182,"functions":0.005681818181818182,"buff-to-uint-le":0.005681818181818182,"converts":0.005681818181818182,"uint-to-buff":0.005681818181818182,"conclusion":0.005681818181818182,"powerful":0.005681818181818182,"tool":0.005681818181818182,"working":0.005681818181818182,"smart":0.005681818181818182,"by":0.005681818181818182,"understanding":0.005681818181818182,"its":0.005681818181818182,"behavior":0.005681818181818182,"edge":0.005681818181818182,"cases":0.005681818181818182,"can":0.005681818181818182,"effectively":0.005681818181818182,"validate":0.005681818181818182,"complex":0.005681818181818182,"your":0.005681818181818182,"contract":0.005681818181818182,"applications":0.005681818181818182},"134":{"1":0.00546448087431694,"2":0.00546448087431694,"3":0.00546448087431694,"4":0.00546448087431694,"function":0.00546448087431694,"signature":0.00546448087431694,"clarity":0.00546448087431694,"define-read-only":0.00546448087431694,"function-name":0.00546448087431694,"arg-name-0":0.00546448087431694,"arg-type-0":0.00546448087431694,"function-body":0.00546448087431694,"-":0.00546448087431694,"input":0.00546448087431694,"the":0.00546448087431694,"name":0.00546448087431694,"of":0.00546448087431694,"read-only":0.00546448087431694,"arg-name-n":0.00546448087431694,"each":0.00546448087431694,"argument":0.00546448087431694,"arg-type-n":0.00546448087431694,"type":0.00546448087431694,"code":0.00546448087431694,"to":0.00546448087431694,"be":0.00546448087431694,"executed":0.00546448087431694,"when":0.00546448087431694,"is":0.00546448087431694,"called":0.00546448087431694,"output":0.00546448087431694,"not":0.00546448087431694,"applicable":0.00546448087431694,"definition":0.00546448087431694,"statement":0.00546448087431694,"why":0.00546448087431694,"it":0.00546448087431694,"matters":0.00546448087431694,"crucial":0.00546448087431694,"for":0.00546448087431694,"creating":0.00546448087431694,"public":0.00546448087431694,"functions":0.00546448087431694,"that":0.00546448087431694,"can":0.00546448087431694,"query":0.00546448087431694,"contract":0.00546448087431694,"state":0.00546448087431694,"without":0.00546448087431694,"modifying":0.00546448087431694,"enabling":0.00546448087431694,"efficient":0.00546448087431694,"and":0.00546448087431694,"gas-optimized":0.00546448087431694,"read":0.00546448087431694,"operations":0.00546448087431694,"on":0.00546448087431694,"implementing":0.00546448087431694,"view":0.00546448087431694,"other":0.00546448087431694,"contracts":0.00546448087431694,"or":0.00546448087431694,"off-chain":0.00546448087431694,"applications":0.00546448087431694,"call":0.00546448087431694,"providing":0.00546448087431694,"a":0.00546448087431694,"safe":0.00546448087431694,"way":0.00546448087431694,"expose":0.00546448087431694,"data":0.00546448087431694,"risking":0.00546448087431694,"changes":0.00546448087431694,"use":0.00546448087431694,"you":0.00546448087431694,"need":0.00546448087431694,"create":0.00546448087431694,"return":0.00546448087431694,"computed":0.00546448087431694,"values":0.00546448087431694,"implement":0.00546448087431694,"getter":0.00546448087431694,"variables":0.00546448087431694,"complex":0.00546448087431694,"structures":0.00546448087431694,"provide":0.00546448087431694,"interfaces":0.00546448087431694,"querying":0.00546448087431694,"helper":0.00546448087431694,"incurring":0.00546448087431694,"change":0.00546448087431694,"costs":0.00546448087431694,"best":0.00546448087431694,"practices":0.00546448087431694,"descriptive":0.00546448087431694,"names":0.00546448087431694,"clearly":0.00546448087431694,"indicate":0.00546448087431694,"their":0.00546448087431694,"purpose":0.00546448087431694,"ensure":0.00546448087431694,"do":0.00546448087431694,"attempt":0.00546448087431694,"modify":0.00546448087431694,"utilize":0.00546448087431694,"calculations":0.00546448087431694,"don't":0.00546448087431694,"require":0.00546448087431694,"consider":0.00546448087431694,"using":0.00546448087431694,"in":0.00546448087431694,"combination":0.00546448087431694,"with":0.00546448087431694,"separate":0.00546448087431694,"write":0.00546448087431694,"practical":0.00546448087431694,"example":0.00546448087431694,"token":0.00546448087431694,"balance":0.00546448087431694,"checker":0.00546448087431694,"let's":0.00546448087431694,"checking":0.00546448087431694,"balances":0.00546448087431694,"define-map":0.00546448087431694,"principal":0.00546448087431694,"uint":0.00546448087431694,"get-balance":0.00546448087431694,"account":0.00546448087431694,"default-to":0.00546448087431694,"u0":0.00546448087431694,"map-get":0.00546448087431694,"this":0.00546448087431694,"demonstrates":0.00546448087431694,"individual":0.00546448087431694,"common":0.00546448087431694,"pitfalls":0.00546448087431694,"attempting":0.00546448087431694,"within":0.00546448087431694,"which":0.00546448087431694,"will":0.00546448087431694,"cause":0.00546448087431694,"an":0.00546448087431694,"error":0.00546448087431694,"overusing":0.00546448087431694,"might":0.00546448087431694,"better":0.00546448087431694,"suited":0.00546448087431694,"computation":0.00546448087431694,"forgetting":0.00546448087431694,"still":0.00546448087431694,"consume":0.00546448087431694,"gas":0.00546448087431694,"even":0.00546448087431694,"though":0.00546448087431694,"they":0.00546448087431694,"related":0.00546448087431694,"define-public":0.00546448087431694,"used":0.00546448087431694,"define":0.00546448087431694,"define-private":0.00546448087431694,"private":0.00546448087431694,"only":0.00546448087431694,"often":0.00546448087431694,"retrieve":0.00546448087431694,"from":0.00546448087431694,"maps":0.00546448087431694,"conclusion":0.00546448087431694,"essential":0.00546448087431694,"tool":0.00546448087431694,"smart":0.00546448087431694,"by":0.00546448087431694,"perform":0.00546448087431694,"enable":0.00546448087431694,"more":0.00546448087431694,"transparent":0.00546448087431694,"gas-efficient":0.00546448087431694,"effectively":0.00546448087431694,"significantly":0.00546448087431694,"enhance":0.00546448087431694,"usability":0.00546448087431694,"accessibility":0.00546448087431694,"both":0.00546448087431694,"on-chain":0.00546448087431694},"135":{"1":0.005813953488372093,"2":0.005813953488372093,"3":0.005813953488372093,"4":0.005813953488372093,"40":0.005813953488372093,"function":0.005813953488372093,"signature":0.005813953488372093,"clarity":0.005813953488372093,"nft-burn":0.005813953488372093,"asset-class":0.005813953488372093,"asset-identifier":0.005813953488372093,"sender":0.005813953488372093,"-":0.005813953488372093,"input":0.005813953488372093,"assetname":0.005813953488372093,"a":0.005813953488372093,"principal":0.005813953488372093,"output":0.005813953488372093,"response":0.005813953488372093,"bool":0.005813953488372093,"uint":0.005813953488372093,"why":0.005813953488372093,"it":0.005813953488372093,"matters":0.005813953488372093,"the":0.005813953488372093,"is":0.005813953488372093,"crucial":0.005813953488372093,"for":0.005813953488372093,"reducing":0.005813953488372093,"circulating":0.005813953488372093,"supply":0.005813953488372093,"of":0.005813953488372093,"non-fungible":0.005813953488372093,"token":0.005813953488372093,"nft":0.005813953488372093,"managing":0.005813953488372093,"lifecycle":0.005813953488372093,"nfts":0.005813953488372093,"by":0.005813953488372093,"allowing":0.005813953488372093,"their":0.005813953488372093,"destruction":0.005813953488372093,"ensuring":0.005813953488372093,"data":0.005813953488372093,"integrity":0.005813953488372093,"removing":0.005813953488372093,"ownership":0.005813953488372093,"records":0.005813953488372093,"burned":0.005813953488372093,"simplifying":0.005813953488372093,"process":0.005813953488372093,"handling":0.005813953488372093,"burn":0.005813953488372093,"operations":0.005813953488372093,"in":0.005813953488372093,"smart":0.005813953488372093,"contracts":0.005813953488372093,"when":0.005813953488372093,"to":0.005813953488372093,"use":0.005813953488372093,"you":0.005813953488372093,"need":0.005813953488372093,"reduce":0.005813953488372093,"an":0.005813953488372093,"manage":0.005813953488372093,"remove":0.005813953488372093,"handle":0.005813953488372093,"your":0.005813953488372093,"contract":0.005813953488372093,"best":0.005813953488372093,"practices":0.005813953488372093,"ensure":0.005813953488372093,"owns":0.005813953488372093,"before":0.005813953488372093,"attempting":0.005813953488372093,"meaningful":0.005813953488372093,"variable":0.005813953488372093,"names":0.005813953488372093,"better":0.005813953488372093,"readability":0.005813953488372093,"combine":0.005813953488372093,"with":0.005813953488372093,"other":0.005813953488372093,"functions":0.005813953488372093,"comprehensive":0.005813953488372093,"management":0.005813953488372093,"possible":0.005813953488372093,"error":0.005813953488372093,"cases":0.005813953488372093,"robust":0.005813953488372093,"behavior":0.005813953488372093,"practical":0.005813953488372093,"example":0.005813953488372093,"burning":0.005813953488372093,"let's":0.005813953488372093,"implement":0.005813953488372093,"that":0.005813953488372093,"burns":0.005813953488372093,"owned":0.005813953488372093,"define-non-fungible-token":0.005813953488372093,"stackaroo":0.005813953488372093,"string-ascii":0.005813953488372093,"define-public":0.005813953488372093,"burn-nft":0.005813953488372093,"id":0.005813953488372093,"tx-sender":0.005813953488372093,"usage":0.005813953488372093,"nft-mint":0.005813953488372093,"roo":0.005813953488372093,"returns":0.005813953488372093,"ok":0.005813953488372093,"true":0.005813953488372093,"err":0.005813953488372093,"u3":0.005813953488372093,"because":0.005813953488372093,"asset":0.005813953488372093,"no":0.005813953488372093,"longer":0.005813953488372093,"exists":0.005813953488372093,"this":0.005813953488372093,"demonstrates":0.005813953488372093,"using":0.005813953488372093,"implementing":0.005813953488372093,"public":0.005813953488372093,"operation":0.005813953488372093,"both":0.005813953488372093,"successful":0.005813953488372093,"and":0.005813953488372093,"case":0.005813953488372093,"where":0.005813953488372093,"common":0.005813953488372093,"pitfalls":0.005813953488372093,"without":0.005813953488372093,"causing":0.005813953488372093,"fail":0.005813953488372093,"assuming":0.005813953488372093,"will":0.005813953488372093,"always":0.005813953488372093,"exist":0.005813953488372093,"leading":0.005813953488372093,"unhandled":0.005813953488372093,"not":0.005813953488372093,"all":0.005813953488372093,"conditions":0.005813953488372093,"resulting":0.005813953488372093,"incomplete":0.005813953488372093,"overlooking":0.005813953488372093,"proper":0.005813953488372093,"validation":0.005813953488372093,"related":0.005813953488372093,"mints":0.005813953488372093,"new":0.005813953488372093,"nft-transfer":0.005813953488372093,"transfers":0.005813953488372093,"nft-get-owner":0.005813953488372093,"retrieves":0.005813953488372093,"owner":0.005813953488372093,"conclusion":0.005813953488372093,"fundamental":0.005813953488372093,"tool":0.005813953488372093,"tokens":0.005813953488372093,"allows":0.005813953488372093,"used":0.005813953488372093,"effectively":0.005813953488372093,"enhances":0.005813953488372093,"reliability":0.005813953488372093,"maintainability":0.005813953488372093,"code":0.005813953488372093,"providing":0.005813953488372093,"clear":0.005813953488372093,"concise":0.005813953488372093,"way":0.005813953488372093},"136":{"1":0.005714285714285714,"2":0.005714285714285714,"3":0.005714285714285714,"4":0.005714285714285714,"function":0.005714285714285714,"signature":0.005714285714285714,"clarity":0.005714285714285714,"is-ok":0.005714285714285714,"value":0.005714285714285714,"-":0.005714285714285714,"input":0.005714285714285714,"response":0.005714285714285714,"a":0.005714285714285714,"b":0.005714285714285714,"output":0.005714285714285714,"bool":0.005714285714285714,"why":0.005714285714285714,"it":0.005714285714285714,"matters":0.005714285714285714,"the":0.005714285714285714,"is":0.005714285714285714,"crucial":0.005714285714285714,"for":0.005714285714285714,"determining":0.005714285714285714,"if":0.005714285714285714,"represents":0.005714285714285714,"successful":0.005714285714285714,"operation":0.005714285714285714,"implementing":0.005714285714285714,"conditional":0.005714285714285714,"logic":0.005714285714285714,"based":0.005714285714285714,"on":0.005714285714285714,"success":0.005714285714285714,"or":0.005714285714285714,"failure":0.005714285714285714,"of":0.005714285714285714,"operations":0.005714285714285714,"ensuring":0.005714285714285714,"robust":0.005714285714285714,"contract":0.005714285714285714,"behavior":0.005714285714285714,"by":0.005714285714285714,"checking":0.005714285714285714,"responses":0.005714285714285714,"simplifying":0.005714285714285714,"checks":0.005714285714285714,"types":0.005714285714285714,"in":0.005714285714285714,"smart":0.005714285714285714,"code":0.005714285714285714,"when":0.005714285714285714,"to":0.005714285714285714,"use":0.005714285714285714,"you":0.005714285714285714,"need":0.005714285714285714,"check":0.005714285714285714,"ok":0.005714285714285714,"implement":0.005714285714285714,"that":0.005714285714285714,"depends":0.005714285714285714,"validate":0.005714285714285714,"results":0.005714285714285714,"calls":0.005714285714285714,"return":0.005714285714285714,"handle":0.005714285714285714,"cases":0.005714285714285714,"gracefully":0.005714285714285714,"your":0.005714285714285714,"best":0.005714285714285714,"practices":0.005714285714285714,"combination":0.005714285714285714,"with":0.005714285714285714,"match":0.005714285714285714,"comprehensive":0.005714285714285714,"handling":0.005714285714285714,"ensure":0.005714285714285714,"being":0.005714285714285714,"checked":0.005714285714285714,"correct":0.005714285714285714,"type":0.005714285714285714,"meaningful":0.005714285714285714,"variable":0.005714285714285714,"names":0.005714285714285714,"better":0.005714285714285714,"readability":0.005714285714285714,"combine":0.005714285714285714,"other":0.005714285714285714,"functions":0.005714285714285714,"like":0.005714285714285714,"is-err":0.005714285714285714,"complete":0.005714285714285714,"validation":0.005714285714285714,"practical":0.005714285714285714,"example":0.005714285714285714,"validating":0.005714285714285714,"token":0.005714285714285714,"transfer":0.005714285714285714,"let's":0.005714285714285714,"validates":0.005714285714285714,"and":0.005714285714285714,"define-map":0.005714285714285714,"userbalances":0.005714285714285714,"userid":0.005714285714285714,"principal":0.005714285714285714,"balance":0.005714285714285714,"uint":0.005714285714285714,"define-public":0.005714285714285714,"transfer-tokens":0.005714285714285714,"amount":0.005714285714285714,"recipient":0.005714285714285714,"let":0.005714285714285714,"senderbalance":0.005714285714285714,"default-to":0.005714285714285714,"u0":0.005714285714285714,"map-get":0.005714285714285714,"tx-sender":0.005714285714285714,"recipientbalance":0.005714285714285714,"transferresult":0.005714285714285714,"begin":0.005714285714285714,"map-set":0.005714285714285714,"true":0.005714285714285714,"err":0.005714285714285714,"u1":0.005714285714285714,"u2":0.005714285714285714,"usage":0.005714285714285714,"u100":0.005714285714285714,"u50":0.005714285714285714,"'spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf":0.005714285714285714,"returns":0.005714285714285714,"u200":0.005714285714285714,"this":0.005714285714285714,"demonstrates":0.005714285714285714,"using":0.005714285714285714,"was":0.005714285714285714,"both":0.005714285714285714,"error":0.005714285714285714,"appropriately":0.005714285714285714,"common":0.005714285714285714,"pitfalls":0.005714285714285714,"assuming":0.005714285714285714,"always":0.005714285714285714,"leading":0.005714285714285714,"errors":0.005714285714285714,"not":0.005714285714285714,"all":0.005714285714285714,"possible":0.005714285714285714,"resulting":0.005714285714285714,"incomplete":0.005714285714285714,"overlooking":0.005714285714285714,"without":0.005714285714285714,"codes":0.005714285714285714,"messages":0.005714285714285714,"making":0.005714285714285714,"debugging":0.005714285714285714,"harder":0.005714285714285714,"related":0.005714285714285714,"constructs":0.005714285714285714,"an":0.005714285714285714,"conclusion":0.005714285714285714,"fundamental":0.005714285714285714,"tool":0.005714285714285714,"values":0.005714285714285714,"contracts":0.005714285714285714,"allows":0.005714285714285714,"determine":0.005714285714285714,"enabling":0.005714285714285714,"used":0.005714285714285714,"effectively":0.005714285714285714,"enhances":0.005714285714285714,"reliability":0.005714285714285714,"maintainability":0.005714285714285714,"are":0.005714285714285714,"detected":0.005714285714285714,"handled":0.005714285714285714},"137":{"0":0.00641025641025641,"1":0.00641025641025641,"2":0.00641025641025641,"3":0.00641025641025641,"4":0.00641025641025641,"5":0.00641025641025641,"the":0.00641025641025641,"addition":0.00641025641025641,"function":0.00641025641025641,"in":0.00641025641025641,"clarity":0.00641025641025641,"performs":0.00641025641025641,"on":0.00641025641025641,"a":0.00641025641025641,"variable":0.00641025641025641,"number":0.00641025641025641,"of":0.00641025641025641,"integer":0.00641025641025641,"inputs":0.00641025641025641,"it's":0.00641025641025641,"fundamental":0.00641025641025641,"arithmetic":0.00641025641025641,"operation":0.00641025641025641,"used":0.00641025641025641,"many":0.00641025641025641,"smart":0.00641025641025641,"contract":0.00641025641025641,"calculations":0.00641025641025641,"signature":0.00641025641025641,"i1":0.00641025641025641,"i2":0.00641025641025641,"-":0.00641025641025641,"input":0.00641025641025641,"two":0.00641025641025641,"or":0.00641025641025641,"more":0.00641025641025641,"integers":0.00641025641025641,"int":0.00641025641025641,"uint":0.00641025641025641,"output":0.00641025641025641,"single":0.00641025641025641,"why":0.00641025641025641,"it":0.00641025641025641,"matters":0.00641025641025641,"is":0.00641025641025641,"crucial":0.00641025641025641,"for":0.00641025641025641,"performing":0.00641025641025641,"basic":0.00641025641025641,"within":0.00641025641025641,"contracts":0.00641025641025641,"incrementing":0.00641025641025641,"counters":0.00641025641025641,"values":0.00641025641025641,"combining":0.00641025641025641,"multiple":0.00641025641025641,"quantities":0.00641025641025641,"balances":0.00641025641025641,"implementing":0.00641025641025641,"mathematical":0.00641025641025641,"formulas":0.00641025641025641,"that":0.00641025641025641,"involve":0.00641025641025641,"when":0.00641025641025641,"to":0.00641025641025641,"use":0.00641025641025641,"you":0.00641025641025641,"need":0.00641025641025641,"perform":0.00641025641025641,"your":0.00641025641025641,"logic":0.00641025641025641,"increment":0.00641025641025641,"sum":0.00641025641025641,"up":0.00641025641025641,"implement":0.00641025641025641,"best":0.00641025641025641,"practices":0.00641025641025641,"always":0.00641025641025641,"consider":0.00641025641025641,"possibility":0.00641025641025641,"overflow":0.00641025641025641,"adding":0.00641025641025641,"large":0.00641025641025641,"numbers":0.00641025641025641,"appropriate":0.00641025641025641,"types":0.00641025641025641,"based":0.00641025641025641,"needs":0.00641025641025641,"and":0.00641025641025641,"expected":0.00641025641025641,"value":0.00641025641025641,"ranges":0.00641025641025641,"be":0.00641025641025641,"aware":0.00641025641025641,"negative":0.00641025641025641,"positive":0.00641025641025641,"can":0.00641025641025641,"result":0.00641025641025641,"subtraction":0.00641025641025641,"using":0.00641025641025641,"checked":0.00641025641025641,"functions":0.00641025641025641,"if":0.00641025641025641,"detection":0.00641025641025641,"critical":0.00641025641025641,"practical":0.00641025641025641,"example":0.00641025641025641,"simple":0.00641025641025641,"counter":0.00641025641025641,"let's":0.00641025641025641,"uses":0.00641025641025641,"its":0.00641025641025641,"define-data-var":0.00641025641025641,"define-public":0.00641025641025641,"increment-counter":0.00641025641025641,"amount":0.00641025641025641,"begin":0.00641025641025641,"var-set":0.00641025641025641,"var-get":0.00641025641025641,"ok":0.00641025641025641,"usage":0.00641025641025641,"increments":0.00641025641025641,"by":0.00641025641025641,"this":0.00641025641025641,"demonstrates":0.00641025641025641,"public":0.00641025641025641,"handle":0.00641025641025641,"returning":0.00641025641025641,"updated":0.00641025641025641,"common":0.00641025641025641,"pitfalls":0.00641025641025641,"overlooking":0.00641025641025641,"potential":0.00641025641025641,"not":0.00641025641025641,"considering":0.00641025641025641,"effect":0.00641025641025641,"forgetting":0.00641025641025641,"update":0.00641025641025641,"related":0.00641025641025641,"variables":0.00641025641025641,"state":0.00641025641025641,"operations":0.00641025641025641,"multiplication":0.00641025641025641,"division":0.00641025641025641,"conclusion":0.00641025641025641,"tool":0.00641025641025641,"understanding":0.00641025641025641,"behavior":0.00641025641025641,"with":0.00641025641025641,"different":0.00641025641025641,"edge":0.00641025641025641,"cases":0.00641025641025641,"effectively":0.00641025641025641,"various":0.00641025641025641,"from":0.00641025641025641,"complex":0.00641025641025641},"138":{"1":0.006578947368421052,"2":0.006578947368421052,"3":0.006578947368421052,"4":0.006578947368421052,"20":0.006578947368421052,"123":0.006578947368421052,"262144":0.006578947368421052,"1048576":0.006578947368421052,"function":0.006578947368421052,"signature":0.006578947368421052,"clarity":0.006578947368421052,"string-to-int":0.006578947368421052,"string":0.006578947368421052,"-":0.006578947368421052,"input":0.006578947368421052,"string-ascii":0.006578947368421052,"string-utf8":0.006578947368421052,"output":0.006578947368421052,"optional":0.006578947368421052,"int":0.006578947368421052,"why":0.006578947368421052,"it":0.006578947368421052,"matters":0.006578947368421052,"the":0.006578947368421052,"is":0.006578947368421052,"crucial":0.006578947368421052,"for":0.006578947368421052,"converting":0.006578947368421052,"representations":0.006578947368421052,"of":0.006578947368421052,"numbers":0.006578947368421052,"to":0.006578947368421052,"integers":0.006578947368421052,"implementing":0.006578947368421052,"logic":0.006578947368421052,"that":0.006578947368421052,"requires":0.006578947368421052,"numeric":0.006578947368421052,"values":0.006578947368421052,"from":0.006578947368421052,"inputs":0.006578947368421052,"ensuring":0.006578947368421052,"data":0.006578947368421052,"integrity":0.006578947368421052,"by":0.006578947368421052,"validating":0.006578947368421052,"string-to-integer":0.006578947368421052,"conversions":0.006578947368421052,"simplifying":0.006578947368421052,"process":0.006578947368421052,"handling":0.006578947368421052,"in":0.006578947368421052,"smart":0.006578947368421052,"contracts":0.006578947368421052,"when":0.006578947368421052,"use":0.006578947368421052,"you":0.006578947368421052,"need":0.006578947368421052,"convert":0.006578947368421052,"a":0.006578947368421052,"representation":0.006578947368421052,"number":0.006578947368421052,"an":0.006578947368421052,"integer":0.006578947368421052,"implement":0.006578947368421052,"validate":0.006578947368421052,"ensure":0.006578947368421052,"handle":0.006578947368421052,"your":0.006578947368421052,"contract":0.006578947368421052,"best":0.006578947368421052,"practices":0.006578947368421052,"correctly":0.006578947368421052,"formatted":0.006578947368421052,"and":0.006578947368421052,"represents":0.006578947368421052,"valid":0.006578947368421052,"meaningful":0.006578947368421052,"variable":0.006578947368421052,"names":0.006578947368421052,"better":0.006578947368421052,"readability":0.006578947368421052,"combine":0.006578947368421052,"with":0.006578947368421052,"other":0.006578947368421052,"functions":0.006578947368421052,"comprehensive":0.006578947368421052,"management":0.006578947368421052,"possible":0.006578947368421052,"error":0.006578947368421052,"cases":0.006578947368421052,"robust":0.006578947368421052,"behavior":0.006578947368421052,"practical":0.006578947368421052,"example":0.006578947368421052,"let's":0.006578947368421052,"converts":0.006578947368421052,"define-read-only":0.006578947368421052,"convert-string-to-int":0.006578947368421052,"usage":0.006578947368421052,"returns":0.006578947368421052,"some":0.006578947368421052,"-456":0.006578947368421052,"abc":0.006578947368421052,"none":0.006578947368421052,"this":0.006578947368421052,"demonstrates":0.006578947368421052,"using":0.006578947368421052,"public":0.006578947368421052,"conversion":0.006578947368421052,"both":0.006578947368421052,"invalid":0.006578947368421052,"common":0.006578947368421052,"pitfalls":0.006578947368421052,"incorrectly":0.006578947368421052,"or":0.006578947368421052,"causing":0.006578947368421052,"operation":0.006578947368421052,"return":0.006578947368421052,"assuming":0.006578947368421052,"will":0.006578947368421052,"always":0.006578947368421052,"succeed":0.006578947368421052,"leading":0.006578947368421052,"unhandled":0.006578947368421052,"not":0.006578947368421052,"all":0.006578947368421052,"conditions":0.006578947368421052,"resulting":0.006578947368421052,"incomplete":0.006578947368421052,"overlooking":0.006578947368421052,"proper":0.006578947368421052,"validation":0.006578947368421052,"related":0.006578947368421052,"string-to-uint":0.006578947368421052,"unsigned":0.006578947368421052,"int-to-ascii":0.006578947368421052,"int-to-utf8":0.006578947368421052,"conclusion":0.006578947368421052,"fundamental":0.006578947368421052,"tool":0.006578947368421052,"allows":0.006578947368421052,"used":0.006578947368421052,"effectively":0.006578947368421052,"enhances":0.006578947368421052,"reliability":0.006578947368421052,"maintainability":0.006578947368421052,"code":0.006578947368421052,"providing":0.006578947368421052,"clear":0.006578947368421052,"concise":0.006578947368421052,"way":0.006578947368421052},"139":{"1":0.005780346820809248,"2":0.005780346820809248,"3":0.005780346820809248,"4":0.005780346820809248,"50":0.005780346820809248,"function":0.005780346820809248,"signature":0.005780346820809248,"clarity":0.005780346820809248,"is-none":0.005780346820809248,"value":0.005780346820809248,"-":0.005780346820809248,"input":0.005780346820809248,"optional":0.005780346820809248,"a":0.005780346820809248,"output":0.005780346820809248,"bool":0.005780346820809248,"why":0.005780346820809248,"it":0.005780346820809248,"matters":0.005780346820809248,"the":0.005780346820809248,"is":0.005780346820809248,"crucial":0.005780346820809248,"for":0.005780346820809248,"determining":0.005780346820809248,"if":0.005780346820809248,"an":0.005780346820809248,"none":0.005780346820809248,"implementing":0.005780346820809248,"conditional":0.005780346820809248,"logic":0.005780346820809248,"based":0.005780346820809248,"on":0.005780346820809248,"presence":0.005780346820809248,"or":0.005780346820809248,"absence":0.005780346820809248,"of":0.005780346820809248,"values":0.005780346820809248,"ensuring":0.005780346820809248,"robust":0.005780346820809248,"contract":0.005780346820809248,"behavior":0.005780346820809248,"by":0.005780346820809248,"checking":0.005780346820809248,"missing":0.005780346820809248,"simplifying":0.005780346820809248,"checks":0.005780346820809248,"in":0.005780346820809248,"smart":0.005780346820809248,"code":0.005780346820809248,"when":0.005780346820809248,"to":0.005780346820809248,"use":0.005780346820809248,"you":0.005780346820809248,"need":0.005780346820809248,"check":0.005780346820809248,"implement":0.005780346820809248,"that":0.005780346820809248,"depends":0.005780346820809248,"whether":0.005780346820809248,"present":0.005780346820809248,"absent":0.005780346820809248,"validate":0.005780346820809248,"results":0.005780346820809248,"calls":0.005780346820809248,"return":0.005780346820809248,"types":0.005780346820809248,"handle":0.005780346820809248,"cases":0.005780346820809248,"where":0.005780346820809248,"might":0.005780346820809248,"be":0.005780346820809248,"not":0.005780346820809248,"set":0.005780346820809248,"best":0.005780346820809248,"practices":0.005780346820809248,"combination":0.005780346820809248,"with":0.005780346820809248,"match":0.005780346820809248,"comprehensive":0.005780346820809248,"handling":0.005780346820809248,"ensure":0.005780346820809248,"being":0.005780346820809248,"checked":0.005780346820809248,"correct":0.005780346820809248,"type":0.005780346820809248,"meaningful":0.005780346820809248,"variable":0.005780346820809248,"names":0.005780346820809248,"better":0.005780346820809248,"readability":0.005780346820809248,"combine":0.005780346820809248,"other":0.005780346820809248,"functions":0.005780346820809248,"like":0.005780346820809248,"is-some":0.005780346820809248,"complete":0.005780346820809248,"validation":0.005780346820809248,"practical":0.005780346820809248,"example":0.005780346820809248,"user":0.005780346820809248,"data":0.005780346820809248,"let's":0.005780346820809248,"user's":0.005780346820809248,"profile":0.005780346820809248,"define-map":0.005780346820809248,"userprofiles":0.005780346820809248,"userid":0.005780346820809248,"principal":0.005780346820809248,"name":0.005780346820809248,"string-ascii":0.005780346820809248,"age":0.005780346820809248,"uint":0.005780346820809248,"define-read-only":0.005780346820809248,"is-profile-missing":0.005780346820809248,"map-get":0.005780346820809248,"usage":0.005780346820809248,"map-set":0.005780346820809248,"tx-sender":0.005780346820809248,"alice":0.005780346820809248,"u30":0.005780346820809248,"returns":0.005780346820809248,"false":0.005780346820809248,"'spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf":0.005780346820809248,"true":0.005780346820809248,"this":0.005780346820809248,"demonstrates":0.005780346820809248,"using":0.005780346820809248,"read-only":0.005780346820809248,"determine":0.005780346820809248,"both":0.005780346820809248,"case":0.005780346820809248,"and":0.005780346820809248,"common":0.005780346820809248,"pitfalls":0.005780346820809248,"assuming":0.005780346820809248,"will":0.005780346820809248,"always":0.005780346820809248,"some":0.005780346820809248,"leading":0.005780346820809248,"unhandled":0.005780346820809248,"non-optional":0.005780346820809248,"causing":0.005780346820809248,"errors":0.005780346820809248,"all":0.005780346820809248,"possible":0.005780346820809248,"conditions":0.005780346820809248,"resulting":0.005780346820809248,"incomplete":0.005780346820809248,"overlooking":0.005780346820809248,"error":0.005780346820809248,"related":0.005780346820809248,"used":0.005780346820809248,"pattern":0.005780346820809248,"matching":0.005780346820809248,"multiple":0.005780346820809248,"default-to":0.005780346820809248,"provides":0.005780346820809248,"default":0.005780346820809248,"conclusion":0.005780346820809248,"fundamental":0.005780346820809248,"tool":0.005780346820809248,"contracts":0.005780346820809248,"allows":0.005780346820809248,"enabling":0.005780346820809248,"effectively":0.005780346820809248,"enhances":0.005780346820809248,"reliability":0.005780346820809248,"maintainability":0.005780346820809248,"your":0.005780346820809248,"are":0.005780346820809248,"detected":0.005780346820809248,"handled":0.005780346820809248,"appropriately":0.005780346820809248},"140":{"1":0.00510204081632653,"2":0.00510204081632653,"3":0.00510204081632653,"4":0.00510204081632653,"100":0.00510204081632653,"the":0.00510204081632653,"subtraction":0.00510204081632653,"function":0.00510204081632653,"-":0.00510204081632653,"in":0.00510204081632653,"clarity":0.00510204081632653,"performs":0.00510204081632653,"on":0.00510204081632653,"a":0.00510204081632653,"variable":0.00510204081632653,"number":0.00510204081632653,"of":0.00510204081632653,"integer":0.00510204081632653,"inputs":0.00510204081632653,"it's":0.00510204081632653,"fundamental":0.00510204081632653,"arithmetic":0.00510204081632653,"operation":0.00510204081632653,"used":0.00510204081632653,"many":0.00510204081632653,"smart":0.00510204081632653,"contract":0.00510204081632653,"calculations":0.00510204081632653,"signature":0.00510204081632653,"i1":0.00510204081632653,"i2":0.00510204081632653,"input":0.00510204081632653,"two":0.00510204081632653,"or":0.00510204081632653,"more":0.00510204081632653,"integers":0.00510204081632653,"int":0.00510204081632653,"uint":0.00510204081632653,"output":0.00510204081632653,"single":0.00510204081632653,"why":0.00510204081632653,"it":0.00510204081632653,"matters":0.00510204081632653,"is":0.00510204081632653,"crucial":0.00510204081632653,"for":0.00510204081632653,"performing":0.00510204081632653,"basic":0.00510204081632653,"within":0.00510204081632653,"contracts":0.00510204081632653,"decreasing":0.00510204081632653,"values":0.00510204081632653,"counters":0.00510204081632653,"calculating":0.00510204081632653,"differences":0.00510204081632653,"between":0.00510204081632653,"quantities":0.00510204081632653,"implementing":0.00510204081632653,"mathematical":0.00510204081632653,"formulas":0.00510204081632653,"that":0.00510204081632653,"involve":0.00510204081632653,"when":0.00510204081632653,"to":0.00510204081632653,"use":0.00510204081632653,"you":0.00510204081632653,"need":0.00510204081632653,"perform":0.00510204081632653,"your":0.00510204081632653,"logic":0.00510204081632653,"decrement":0.00510204081632653,"calculate":0.00510204081632653,"difference":0.00510204081632653,"implement":0.00510204081632653,"best":0.00510204081632653,"practices":0.00510204081632653,"always":0.00510204081632653,"consider":0.00510204081632653,"possibility":0.00510204081632653,"underflow":0.00510204081632653,"subtracting":0.00510204081632653,"from":0.00510204081632653,"small":0.00510204081632653,"numbers":0.00510204081632653,"appropriate":0.00510204081632653,"types":0.00510204081632653,"based":0.00510204081632653,"needs":0.00510204081632653,"and":0.00510204081632653,"expected":0.00510204081632653,"value":0.00510204081632653,"ranges":0.00510204081632653,"be":0.00510204081632653,"aware":0.00510204081632653,"negative":0.00510204081632653,"results":0.00510204081632653,"addition":0.00510204081632653,"using":0.00510204081632653,"checked":0.00510204081632653,"functions":0.00510204081632653,"if":0.00510204081632653,"detection":0.00510204081632653,"critical":0.00510204081632653,"practical":0.00510204081632653,"example":0.00510204081632653,"simple":0.00510204081632653,"escrow":0.00510204081632653,"let's":0.00510204081632653,"uses":0.00510204081632653,"manage":0.00510204081632653,"balances":0.00510204081632653,"define":0.00510204081632653,"constants":0.00510204081632653,"define-constant":0.00510204081632653,"escrow_fee":0.00510204081632653,"u100":0.00510204081632653,"tokens":0.00510204081632653,"as":0.00510204081632653,"fee":0.00510204081632653,"data":0.00510204081632653,"variables":0.00510204081632653,"define-map":0.00510204081632653,"principal":0.00510204081632653,"define-data-var":0.00510204081632653,"escrowbalance":0.00510204081632653,"u0":0.00510204081632653,"deposit":0.00510204081632653,"funds":0.00510204081632653,"define-public":0.00510204081632653,"amount":0.00510204081632653,"let":0.00510204081632653,"currentbalance":0.00510204081632653,"default-to":0.00510204081632653,"map-get":0.00510204081632653,"tx-sender":0.00510204081632653,"try":0.00510204081632653,"stx-transfer":0.00510204081632653,"as-contract":0.00510204081632653,"map-set":0.00510204081632653,"ok":0.00510204081632653,"true":0.00510204081632653,"initiate":0.00510204081632653,"start-escrow":0.00510204081632653,"recipient":0.00510204081632653,"senderbalance":0.00510204081632653,"asserts":0.00510204081632653,"err":0.00510204081632653,"u1":0.00510204081632653,"var-set":0.00510204081632653,"var-get":0.00510204081632653,"complete":0.00510204081632653,"transfer":0.00510204081632653,"complete-escrow":0.00510204081632653,"escrowamount":0.00510204081632653,"u2":0.00510204081632653,"this":0.00510204081632653,"demonstrates":0.00510204081632653,"update":0.00510204081632653,"initiating":0.00510204081632653,"an":0.00510204081632653,"balance":0.00510204081632653,"completing":0.00510204081632653,"combining":0.00510204081632653,"with":0.00510204081632653,"handle":0.00510204081632653,"fees":0.00510204081632653,"updates":0.00510204081632653,"common":0.00510204081632653,"pitfalls":0.00510204081632653,"overlooking":0.00510204081632653,"potential":0.00510204081632653,"not":0.00510204081632653,"considering":0.00510204081632653,"effect":0.00510204081632653,"forgetting":0.00510204081632653,"related":0.00510204081632653,"state":0.00510204081632653,"decrementing":0.00510204081632653,"operations":0.00510204081632653,"multiplication":0.00510204081632653,"division":0.00510204081632653,"conclusion":0.00510204081632653,"tool":0.00510204081632653,"by":0.00510204081632653,"understanding":0.00510204081632653,"its":0.00510204081632653,"behavior":0.00510204081632653,"different":0.00510204081632653,"edge":0.00510204081632653,"cases":0.00510204081632653,"can":0.00510204081632653,"effectively":0.00510204081632653,"various":0.00510204081632653,"decrements":0.00510204081632653,"complex":0.00510204081632653,"financial":0.00510204081632653},"141":{"1":0.006211180124223602,"2":0.006211180124223602,"3":0.006211180124223602,"4":0.006211180124223602,"20":0.006211180124223602,"40":0.006211180124223602,"function":0.006211180124223602,"signature":0.006211180124223602,"clarity":0.006211180124223602,"principal-destruct":0.006211180124223602,"principal-address":0.006211180124223602,"-":0.006211180124223602,"input":0.006211180124223602,"principal":0.006211180124223602,"output":0.006211180124223602,"response":0.006211180124223602,"tuple":0.006211180124223602,"hash-bytes":0.006211180124223602,"buff":0.006211180124223602,"name":0.006211180124223602,"optional":0.006211180124223602,"string-ascii":0.006211180124223602,"version":0.006211180124223602,"why":0.006211180124223602,"it":0.006211180124223602,"matters":0.006211180124223602,"the":0.006211180124223602,"is":0.006211180124223602,"crucial":0.006211180124223602,"for":0.006211180124223602,"decomposing":0.006211180124223602,"a":0.006211180124223602,"into":0.006211180124223602,"its":0.006211180124223602,"component":0.006211180124223602,"parts":0.006211180124223602,"managing":0.006211180124223602,"identities":0.006211180124223602,"and":0.006211180124223602,"permissions":0.006211180124223602,"in":0.006211180124223602,"smart":0.006211180124223602,"contracts":0.006211180124223602,"ensuring":0.006211180124223602,"data":0.006211180124223602,"integrity":0.006211180124223602,"by":0.006211180124223602,"validating":0.006211180124223602,"components":0.006211180124223602,"simplifying":0.006211180124223602,"process":0.006211180124223602,"of":0.006211180124223602,"handling":0.006211180124223602,"principals":0.006211180124223602,"when":0.006211180124223602,"to":0.006211180124223602,"use":0.006211180124223602,"you":0.006211180124223602,"need":0.006211180124223602,"decompose":0.006211180124223602,"manage":0.006211180124223602,"your":0.006211180124223602,"contract":0.006211180124223602,"validate":0.006211180124223602,"handle":0.006211180124223602,"decomposition":0.006211180124223602,"operations":0.006211180124223602,"best":0.006211180124223602,"practices":0.006211180124223602,"ensure":0.006211180124223602,"correctly":0.006211180124223602,"formatted":0.006211180124223602,"meaningful":0.006211180124223602,"variable":0.006211180124223602,"names":0.006211180124223602,"better":0.006211180124223602,"readability":0.006211180124223602,"combine":0.006211180124223602,"with":0.006211180124223602,"other":0.006211180124223602,"functions":0.006211180124223602,"comprehensive":0.006211180124223602,"identity":0.006211180124223602,"management":0.006211180124223602,"possible":0.006211180124223602,"error":0.006211180124223602,"cases":0.006211180124223602,"robust":0.006211180124223602,"behavior":0.006211180124223602,"practical":0.006211180124223602,"example":0.006211180124223602,"let's":0.006211180124223602,"implement":0.006211180124223602,"that":0.006211180124223602,"destructs":0.006211180124223602,"back":0.006211180124223602,"define-public":0.006211180124223602,"destruct-principal":0.006211180124223602,"usage":0.006211180124223602,"'st3x6qwwetnbzwgbk6drgtr1kx50s74d3425q1tpk":0.006211180124223602,"returns":0.006211180124223602,"ok":0.006211180124223602,"0xfa6bf38ed557fe417333710d6033e9419391a320":0.006211180124223602,"none":0.006211180124223602,"0x1a":0.006211180124223602,"foo":0.006211180124223602,"some":0.006211180124223602,"this":0.006211180124223602,"demonstrates":0.006211180124223602,"using":0.006211180124223602,"implementing":0.006211180124223602,"public":0.006211180124223602,"both":0.006211180124223602,"successful":0.006211180124223602,"common":0.006211180124223602,"pitfalls":0.006211180124223602,"incorrectly":0.006211180124223602,"causing":0.006211180124223602,"operation":0.006211180124223602,"fail":0.006211180124223602,"assuming":0.006211180124223602,"will":0.006211180124223602,"always":0.006211180124223602,"be":0.006211180124223602,"valid":0.006211180124223602,"leading":0.006211180124223602,"unhandled":0.006211180124223602,"not":0.006211180124223602,"all":0.006211180124223602,"conditions":0.006211180124223602,"resulting":0.006211180124223602,"incomplete":0.006211180124223602,"overlooking":0.006211180124223602,"proper":0.006211180124223602,"validation":0.006211180124223602,"related":0.006211180124223602,"principal-construct":0.006211180124223602,"constructs":0.006211180124223602,"from":0.006211180124223602,"principal-of":0.006211180124223602,"derived":0.006211180124223602,"key":0.006211180124223602,"contract-caller":0.006211180124223602,"caller":0.006211180124223602,"current":0.006211180124223602,"context":0.006211180124223602,"conclusion":0.006211180124223602,"fundamental":0.006211180124223602,"tool":0.006211180124223602,"their":0.006211180124223602,"allows":0.006211180124223602,"used":0.006211180124223602,"effectively":0.006211180124223602,"enhances":0.006211180124223602,"reliability":0.006211180124223602,"maintainability":0.006211180124223602,"code":0.006211180124223602,"providing":0.006211180124223602,"clear":0.006211180124223602,"concise":0.006211180124223602,"way":0.006211180124223602},"142":{"1":0.005952380952380952,"2":0.005952380952380952,"3":0.005952380952380952,"4":0.005952380952380952,"32":0.005952380952380952,"42":0.005952380952380952,"50":0.005952380952380952,"function":0.005952380952380952,"signature":0.005952380952380952,"clarity":0.005952380952380952,"to-consensus-buff":0.005952380952380952,"value":0.005952380952380952,"-":0.005952380952380952,"input":0.005952380952380952,"any":0.005952380952380952,"output":0.005952380952380952,"optional":0.005952380952380952,"buff":0.005952380952380952,"why":0.005952380952380952,"it":0.005952380952380952,"matters":0.005952380952380952,"the":0.005952380952380952,"is":0.005952380952380952,"crucial":0.005952380952380952,"for":0.005952380952380952,"serializing":0.005952380952380952,"values":0.005952380952380952,"into":0.005952380952380952,"buffers":0.005952380952380952,"consensus":0.005952380952380952,"implementing":0.005952380952380952,"logic":0.005952380952380952,"that":0.005952380952380952,"requires":0.005952380952380952,"converting":0.005952380952380952,"to":0.005952380952380952,"a":0.005952380952380952,"standardized":0.005952380952380952,"buffer":0.005952380952380952,"format":0.005952380952380952,"ensuring":0.005952380952380952,"data":0.005952380952380952,"integrity":0.005952380952380952,"by":0.005952380952380952,"validating":0.005952380952380952,"serialization":0.005952380952380952,"process":0.005952380952380952,"simplifying":0.005952380952380952,"of":0.005952380952380952,"handling":0.005952380952380952,"in":0.005952380952380952,"smart":0.005952380952380952,"contracts":0.005952380952380952,"when":0.005952380952380952,"use":0.005952380952380952,"you":0.005952380952380952,"need":0.005952380952380952,"serialize":0.005952380952380952,"implement":0.005952380952380952,"validate":0.005952380952380952,"ensure":0.005952380952380952,"handle":0.005952380952380952,"your":0.005952380952380952,"contract":0.005952380952380952,"best":0.005952380952380952,"practices":0.005952380952380952,"correctly":0.005952380952380952,"formatted":0.005952380952380952,"and":0.005952380952380952,"valid":0.005952380952380952,"meaningful":0.005952380952380952,"variable":0.005952380952380952,"names":0.005952380952380952,"better":0.005952380952380952,"readability":0.005952380952380952,"combine":0.005952380952380952,"with":0.005952380952380952,"other":0.005952380952380952,"functions":0.005952380952380952,"comprehensive":0.005952380952380952,"management":0.005952380952380952,"possible":0.005952380952380952,"error":0.005952380952380952,"cases":0.005952380952380952,"robust":0.005952380952380952,"behavior":0.005952380952380952,"practical":0.005952380952380952,"example":0.005952380952380952,"let's":0.005952380952380952,"serializes":0.005952380952380952,"an":0.005952380952380952,"integer":0.005952380952380952,"define-read-only":0.005952380952380952,"serialize-int":0.005952380952380952,"int":0.005952380952380952,"serialize-tuple":0.005952380952380952,"tuple":0.005952380952380952,"name":0.005952380952380952,"string-ascii":0.005952380952380952,"age":0.005952380952380952,"uint":0.005952380952380952,"usage":0.005952380952380952,"returns":0.005952380952380952,"some":0.005952380952380952,"0x000000000000000000000000000000000000000000000000000000000000002a":0.005952380952380952,"-1":0.005952380952380952,"none":0.005952380952380952,"since":0.005952380952380952,"negative":0.005952380952380952,"integers":0.005952380952380952,"cannot":0.005952380952380952,"be":0.005952380952380952,"serialized":0.005952380952380952,"harper":0.005952380952380952,"dog":0.005952380952380952,"u5":0.005952380952380952,"0x0c00000002036167650100000000000000000000000000000005046e616d650d0000000a48617270657220446f67":0.005952380952380952,"this":0.005952380952380952,"demonstrates":0.005952380952380952,"using":0.005952380952380952,"public":0.005952380952380952,"both":0.005952380952380952,"successful":0.005952380952380952,"common":0.005952380952380952,"pitfalls":0.005952380952380952,"incorrectly":0.005952380952380952,"or":0.005952380952380952,"invalid":0.005952380952380952,"causing":0.005952380952380952,"operation":0.005952380952380952,"fail":0.005952380952380952,"assuming":0.005952380952380952,"will":0.005952380952380952,"always":0.005952380952380952,"succeed":0.005952380952380952,"leading":0.005952380952380952,"unhandled":0.005952380952380952,"not":0.005952380952380952,"all":0.005952380952380952,"conditions":0.005952380952380952,"resulting":0.005952380952380952,"incomplete":0.005952380952380952,"overlooking":0.005952380952380952,"proper":0.005952380952380952,"validation":0.005952380952380952,"related":0.005952380952380952,"from-consensus-buff":0.005952380952380952,"deserializes":0.005952380952380952,"buff-to-int-be":0.005952380952380952,"converts":0.005952380952380952,"big-endian":0.005952380952380952,"buff-to-uint-le":0.005952380952380952,"little-endian":0.005952380952380952,"unsigned":0.005952380952380952,"conclusion":0.005952380952380952,"fundamental":0.005952380952380952,"tool":0.005952380952380952,"allows":0.005952380952380952,"used":0.005952380952380952,"effectively":0.005952380952380952,"enhances":0.005952380952380952,"reliability":0.005952380952380952,"maintainability":0.005952380952380952,"code":0.005952380952380952,"providing":0.005952380952380952,"clear":0.005952380952380952,"concise":0.005952380952380952,"way":0.005952380952380952},"143":{"1":0.006578947368421052,"2":0.006578947368421052,"3":0.006578947368421052,"4":0.006578947368421052,"function":0.006578947368421052,"signature":0.006578947368421052,"clarity":0.006578947368421052,"stx-burn":0.006578947368421052,"amount":0.006578947368421052,"sender":0.006578947368421052,"-":0.006578947368421052,"input":0.006578947368421052,"uint":0.006578947368421052,"principal":0.006578947368421052,"output":0.006578947368421052,"response":0.006578947368421052,"bool":0.006578947368421052,"why":0.006578947368421052,"it":0.006578947368421052,"matters":0.006578947368421052,"the":0.006578947368421052,"is":0.006578947368421052,"crucial":0.006578947368421052,"for":0.006578947368421052,"decreasing":0.006578947368421052,"stx":0.006578947368421052,"holdings":0.006578947368421052,"of":0.006578947368421052,"a":0.006578947368421052,"by":0.006578947368421052,"burning":0.006578947368421052,"specified":0.006578947368421052,"implementing":0.006578947368421052,"logic":0.006578947368421052,"that":0.006578947368421052,"requires":0.006578947368421052,"reducing":0.006578947368421052,"circulating":0.006578947368421052,"supply":0.006578947368421052,"ensuring":0.006578947368421052,"data":0.006578947368421052,"integrity":0.006578947368421052,"validating":0.006578947368421052,"burn":0.006578947368421052,"operation":0.006578947368421052,"simplifying":0.006578947368421052,"process":0.006578947368421052,"handling":0.006578947368421052,"in":0.006578947368421052,"smart":0.006578947368421052,"contracts":0.006578947368421052,"when":0.006578947368421052,"to":0.006578947368421052,"use":0.006578947368421052,"you":0.006578947368421052,"need":0.006578947368421052,"decrease":0.006578947368421052,"implement":0.006578947368421052,"validate":0.006578947368421052,"ensure":0.006578947368421052,"handle":0.006578947368421052,"operations":0.006578947368421052,"your":0.006578947368421052,"contract":0.006578947368421052,"best":0.006578947368421052,"practices":0.006578947368421052,"positive":0.006578947368421052,"and":0.006578947368421052,"has":0.006578947368421052,"sufficient":0.006578947368421052,"balance":0.006578947368421052,"meaningful":0.006578947368421052,"variable":0.006578947368421052,"names":0.006578947368421052,"better":0.006578947368421052,"readability":0.006578947368421052,"combine":0.006578947368421052,"with":0.006578947368421052,"other":0.006578947368421052,"functions":0.006578947368421052,"comprehensive":0.006578947368421052,"account":0.006578947368421052,"management":0.006578947368421052,"possible":0.006578947368421052,"error":0.006578947368421052,"cases":0.006578947368421052,"robust":0.006578947368421052,"behavior":0.006578947368421052,"practical":0.006578947368421052,"example":0.006578947368421052,"from":0.006578947368421052,"an":0.006578947368421052,"let's":0.006578947368421052,"burns":0.006578947368421052,"tx-sender":0.006578947368421052,"define-public":0.006578947368421052,"burn-stx":0.006578947368421052,"usage":0.006578947368421052,"u50":0.006578947368421052,"returns":0.006578947368421052,"ok":0.006578947368421052,"true":0.006578947368421052,"this":0.006578947368421052,"demonstrates":0.006578947368421052,"using":0.006578947368421052,"public":0.006578947368421052,"both":0.006578947368421052,"successful":0.006578947368421052,"common":0.006578947368421052,"pitfalls":0.006578947368421052,"non-positive":0.006578947368421052,"causing":0.006578947368421052,"fail":0.006578947368421052,"assuming":0.006578947368421052,"will":0.006578947368421052,"always":0.006578947368421052,"succeed":0.006578947368421052,"leading":0.006578947368421052,"unhandled":0.006578947368421052,"not":0.006578947368421052,"all":0.006578947368421052,"conditions":0.006578947368421052,"resulting":0.006578947368421052,"incomplete":0.006578947368421052,"overlooking":0.006578947368421052,"proper":0.006578947368421052,"validation":0.006578947368421052,"related":0.006578947368421052,"stx-get-balance":0.006578947368421052,"queries":0.006578947368421052,"stx-transfer":0.006578947368421052,"transfers":0.006578947368421052,"one":0.006578947368421052,"another":0.006578947368421052,"stx-account":0.006578947368421052,"detailed":0.006578947368421052,"information":0.006578947368421052,"conclusion":0.006578947368421052,"fundamental":0.006578947368421052,"tool":0.006578947368421052,"principal's":0.006578947368421052,"allows":0.006578947368421052,"used":0.006578947368421052,"effectively":0.006578947368421052,"enhances":0.006578947368421052,"reliability":0.006578947368421052,"maintainability":0.006578947368421052,"code":0.006578947368421052,"providing":0.006578947368421052,"clear":0.006578947368421052,"concise":0.006578947368421052,"way":0.006578947368421052},"144":{"1":0.005434782608695652,"2":0.005434782608695652,"3":0.005434782608695652,"4":0.005434782608695652,"50":0.005434782608695652,"128":0.005434782608695652,"function":0.005434782608695652,"signature":0.005434782608695652,"clarity":0.005434782608695652,"from-consensus-buff":0.005434782608695652,"type-signature":0.005434782608695652,"buffer":0.005434782608695652,"-":0.005434782608695652,"input":0.005434782608695652,"the":0.005434782608695652,"type":0.005434782608695652,"to":0.005434782608695652,"deserialize":0.005434782608695652,"into":0.005434782608695652,"a":0.005434782608695652,"containing":0.005434782608695652,"serialized":0.005434782608695652,"data":0.005434782608695652,"output":0.005434782608695652,"optional":0.005434782608695652,"t":0.005434782608695652,"where":0.005434782608695652,"is":0.005434782608695652,"specified":0.005434782608695652,"in":0.005434782608695652,"why":0.005434782608695652,"it":0.005434782608695652,"matters":0.005434782608695652,"crucial":0.005434782608695652,"for":0.005434782608695652,"deserializing":0.005434782608695652,"that":0.005434782608695652,"has":0.005434782608695652,"been":0.005434782608695652,"using":0.005434782608695652,"sip-005":0.005434782608695652,"standard":0.005434782608695652,"enabling":0.005434782608695652,"interoperability":0.005434782608695652,"between":0.005434782608695652,"different":0.005434782608695652,"contracts":0.005434782608695652,"or":0.005434782608695652,"systems":0.005434782608695652,"handling":0.005434782608695652,"complex":0.005434782608695652,"structures":0.005434782608695652,"have":0.005434782608695652,"storage":0.005434782608695652,"transmission":0.005434782608695652,"safely":0.005434782608695652,"converting":0.005434782608695652,"buffers":0.005434782608695652,"back":0.005434782608695652,"values":0.005434782608695652,"with":0.005434782608695652,"checking":0.005434782608695652,"when":0.005434782608695652,"use":0.005434782608695652,"you":0.005434782608695652,"need":0.005434782608695652,"convert":0.005434782608695652,"interact":0.005434782608695652,"by":0.005434782608695652,"other":0.005434782608695652,"off-chain":0.005434782608695652,"implement":0.005434782608695652,"cross-contract":0.005434782608695652,"communication":0.005434782608695652,"protocols":0.005434782608695652,"involving":0.005434782608695652,"stored":0.005434782608695652,"was":0.005434782608695652,"previously":0.005434782608695652,"efficiency":0.005434782608695652,"best":0.005434782608695652,"practices":0.005434782608695652,"always":0.005434782608695652,"specify":0.005434782608695652,"correct":0.005434782608695652,"ensure":0.005434782608695652,"proper":0.005434782608695652,"deserialization":0.005434782608695652,"handle":0.005434782608695652,"none":0.005434782608695652,"case":0.005434782608695652,"fails":0.005434782608695652,"conjunction":0.005434782608695652,"to-consensus-buff":0.005434782608695652,"serialization-deserialization":0.005434782608695652,"workflows":0.005434782608695652,"be":0.005434782608695652,"aware":0.005434782608695652,"of":0.005434782608695652,"gas":0.005434782608695652,"costs":0.005434782608695652,"associated":0.005434782608695652,"large":0.005434782608695652,"practical":0.005434782608695652,"example":0.005434782608695652,"tuple":0.005434782608695652,"let's":0.005434782608695652,"deserializes":0.005434782608695652,"define-read-only":0.005434782608695652,"deserialize-user-data":0.005434782608695652,"serializeddata":0.005434782608695652,"buff":0.005434782608695652,"match":0.005434782608695652,"name":0.005434782608695652,"string-ascii":0.005434782608695652,"age":0.005434782608695652,"uint":0.005434782608695652,"success":0.005434782608695652,"err":0.005434782608695652,"u1":0.005434782608695652,"usage":0.005434782608695652,"0x0c00000002036167650100000000000000000000000000000005046e616d650d0000000a48617270657220446f67":0.005434782608695652,"returns":0.005434782608695652,"ok":0.005434782608695652,"harper":0.005434782608695652,"dog":0.005434782608695652,"u5":0.005434782608695652,"this":0.005434782608695652,"demonstrates":0.005434782608695652,"specifying":0.005434782608695652,"expected":0.005434782608695652,"structure":0.005434782608695652,"both":0.005434782608695652,"successful":0.005434782608695652,"and":0.005434782608695652,"failed":0.005434782608695652,"attempts":0.005434782608695652,"common":0.005434782608695652,"pitfalls":0.005434782608695652,"an":0.005434782608695652,"incorrect":0.005434782608695652,"leading":0.005434782608695652,"failures":0.005434782608695652,"not":0.005434782608695652,"attempting":0.005434782608695652,"wasn't":0.005434782608695652,"properly":0.005434782608695652,"overlooking":0.005434782608695652,"potential":0.005434782608695652,"out-of-memory":0.005434782608695652,"errors":0.005434782608695652,"very":0.005434782608695652,"related":0.005434782608695652,"functions":0.005434782608695652,"used":0.005434782608695652,"serialize":0.005434782608695652,"unwrap-panic":0.005434782608695652,"often":0.005434782608695652,"forcibly":0.005434782608695652,"unwrap":0.005434782608695652,"result":0.005434782608695652,"caution":0.005434782608695652,"commonly":0.005434782608695652,"failure":0.005434782608695652,"cases":0.005434782608695652,"conclusion":0.005434782608695652,"powerful":0.005434782608695652,"tool":0.005434782608695652,"working":0.005434782608695652,"smart":0.005434782608695652,"enables":0.005434782608695652,"facilitating":0.005434782608695652,"efficient":0.005434782608695652,"correctly":0.005434782608695652,"provides":0.005434782608695652,"robust":0.005434782608695652,"way":0.005434782608695652,"typed":0.005434782608695652,"enhancing":0.005434782608695652,"contract's":0.005434782608695652,"ability":0.005434782608695652,"process":0.005434782608695652,"validate":0.005434782608695652,"external":0.005434782608695652},"145":{"1":0.005813953488372093,"2":0.005813953488372093,"3":0.005813953488372093,"4":0.005813953488372093,"16":0.005813953488372093,"128":0.005813953488372093,"1011":0.005813953488372093,"function":0.005813953488372093,"signature":0.005813953488372093,"clarity":0.005813953488372093,"bit-shift-right":0.005813953488372093,"i1":0.005813953488372093,"shamt":0.005813953488372093,"-":0.005813953488372093,"input":0.005813953488372093,"an":0.005813953488372093,"integer":0.005813953488372093,"int":0.005813953488372093,"or":0.005813953488372093,"uint":0.005813953488372093,"a":0.005813953488372093,"representing":0.005813953488372093,"the":0.005813953488372093,"number":0.005813953488372093,"of":0.005813953488372093,"places":0.005813953488372093,"to":0.005813953488372093,"shift":0.005813953488372093,"output":0.005813953488372093,"same":0.005813953488372093,"type":0.005813953488372093,"as":0.005813953488372093,"why":0.005813953488372093,"it":0.005813953488372093,"matters":0.005813953488372093,"is":0.005813953488372093,"crucial":0.005813953488372093,"for":0.005813953488372093,"performing":0.005813953488372093,"efficient":0.005813953488372093,"division":0.005813953488372093,"by":0.005813953488372093,"powers":0.005813953488372093,"implementing":0.005813953488372093,"certain":0.005813953488372093,"bitwise":0.005813953488372093,"algorithms":0.005813953488372093,"and":0.005813953488372093,"data":0.005813953488372093,"structures":0.005813953488372093,"manipulating":0.005813953488372093,"binary":0.005813953488372093,"at":0.005813953488372093,"bit":0.005813953488372093,"level":0.005813953488372093,"extracting":0.005813953488372093,"specific":0.005813953488372093,"patterns":0.005813953488372093,"from":0.005813953488372093,"integers":0.005813953488372093,"when":0.005813953488372093,"use":0.005813953488372093,"you":0.005813953488372093,"need":0.005813953488372093,"divide":0.005813953488372093,"power":0.005813953488372093,"efficiently":0.005813953488372093,"implement":0.005813953488372093,"cryptographic":0.005813953488372093,"hashing":0.005813953488372093,"perform":0.005813953488372093,"low-level":0.005813953488372093,"manipulations":0.005813953488372093,"involving":0.005813953488372093,"operations":0.005813953488372093,"extract":0.005813953488372093,"bits":0.005813953488372093,"best":0.005813953488372093,"practices":0.005813953488372093,"be":0.005813953488372093,"aware":0.005813953488372093,"that":0.005813953488372093,"shifting":0.005813953488372093,"right":0.005813953488372093,"n":0.005813953488372093,"equivalent":0.005813953488372093,"remember":0.005813953488372093,"signed":0.005813953488372093,"sign":0.005813953488372093,"preserved":0.005813953488372093,"during":0.005813953488372093,"shifts":0.005813953488372093,"avoid":0.005813953488372093,"potential":0.005813953488372093,"issues":0.005813953488372093,"with":0.005813953488372093,"negative":0.005813953488372093,"amounts":0.005813953488372093,"consider":0.005813953488372093,"differences":0.005813953488372093,"in":0.005813953488372093,"behavior":0.005813953488372093,"between":0.005813953488372093,"unsigned":0.005813953488372093,"right-shifting":0.005813953488372093,"practical":0.005813953488372093,"example":0.005813953488372093,"let's":0.005813953488372093,"divides":0.005813953488372093,"using":0.005813953488372093,"define-read-only":0.005813953488372093,"divide-by-power-of-2":0.005813953488372093,"value":0.005813953488372093,"extract-lowest-bits":0.005813953488372093,"numbits":0.005813953488372093,"bit-and":0.005813953488372093,"bit-shift-left":0.005813953488372093,"u1":0.005813953488372093,"usage":0.005813953488372093,"u3":0.005813953488372093,"returns":0.005813953488372093,"-128":0.005813953488372093,"-16":0.005813953488372093,"u171":0.005813953488372093,"u4":0.005813953488372093,"u11":0.005813953488372093,"this":0.005813953488372093,"demonstrates":0.005813953488372093,"handling":0.005813953488372093,"both":0.005813953488372093,"positive":0.005813953488372093,"numbers":0.005813953488372093,"combining":0.005813953488372093,"other":0.005813953488372093,"common":0.005813953488372093,"pitfalls":0.005813953488372093,"forgetting":0.005813953488372093,"preserves":0.005813953488372093,"not":0.005813953488372093,"considering":0.005813953488372093,"modulo":0.005813953488372093,"greater":0.005813953488372093,"than":0.005813953488372093,"equal":0.005813953488372093,"non-uint":0.005813953488372093,"amount":0.005813953488372093,"which":0.005813953488372093,"allowed":0.005813953488372093,"related":0.005813953488372093,"functions":0.005813953488372093,"used":0.005813953488372093,"left-shifting":0.005813953488372093,"often":0.005813953488372093,"combination":0.005813953488372093,"masking":0.005813953488372093,"general":0.005813953488372093,"but":0.005813953488372093,"less":0.005813953488372093,"compared":0.005813953488372093,"conclusion":0.005813953488372093,"powerful":0.005813953488372093,"tool":0.005813953488372093,"smart":0.005813953488372093,"contracts":0.005813953488372093,"enables":0.005813953488372093,"essential":0.005813953488372093,"various":0.005813953488372093,"however":0.005813953488372093,"mindful":0.005813953488372093,"well":0.005813953488372093,"its":0.005813953488372093,"large":0.005813953488372093},"146":{"1":0.005813953488372093,"2":0.005813953488372093,"3":0.005813953488372093,"4":0.005813953488372093,"50":0.005813953488372093,"function":0.005813953488372093,"signature":0.005813953488372093,"clarity":0.005813953488372093,"is-some":0.005813953488372093,"value":0.005813953488372093,"-":0.005813953488372093,"input":0.005813953488372093,"optional":0.005813953488372093,"a":0.005813953488372093,"output":0.005813953488372093,"bool":0.005813953488372093,"why":0.005813953488372093,"it":0.005813953488372093,"matters":0.005813953488372093,"the":0.005813953488372093,"is":0.005813953488372093,"crucial":0.005813953488372093,"for":0.005813953488372093,"determining":0.005813953488372093,"if":0.005813953488372093,"an":0.005813953488372093,"some":0.005813953488372093,"implementing":0.005813953488372093,"conditional":0.005813953488372093,"logic":0.005813953488372093,"based":0.005813953488372093,"on":0.005813953488372093,"presence":0.005813953488372093,"of":0.005813953488372093,"values":0.005813953488372093,"ensuring":0.005813953488372093,"robust":0.005813953488372093,"contract":0.005813953488372093,"behavior":0.005813953488372093,"by":0.005813953488372093,"checking":0.005813953488372093,"existing":0.005813953488372093,"simplifying":0.005813953488372093,"checks":0.005813953488372093,"in":0.005813953488372093,"smart":0.005813953488372093,"code":0.005813953488372093,"when":0.005813953488372093,"to":0.005813953488372093,"use":0.005813953488372093,"you":0.005813953488372093,"need":0.005813953488372093,"check":0.005813953488372093,"implement":0.005813953488372093,"that":0.005813953488372093,"depends":0.005813953488372093,"whether":0.005813953488372093,"present":0.005813953488372093,"validate":0.005813953488372093,"results":0.005813953488372093,"calls":0.005813953488372093,"return":0.005813953488372093,"types":0.005813953488372093,"handle":0.005813953488372093,"cases":0.005813953488372093,"where":0.005813953488372093,"might":0.005813953488372093,"be":0.005813953488372093,"or":0.005813953488372093,"absent":0.005813953488372093,"best":0.005813953488372093,"practices":0.005813953488372093,"combination":0.005813953488372093,"with":0.005813953488372093,"match":0.005813953488372093,"comprehensive":0.005813953488372093,"handling":0.005813953488372093,"ensure":0.005813953488372093,"being":0.005813953488372093,"checked":0.005813953488372093,"correct":0.005813953488372093,"type":0.005813953488372093,"meaningful":0.005813953488372093,"variable":0.005813953488372093,"names":0.005813953488372093,"better":0.005813953488372093,"readability":0.005813953488372093,"combine":0.005813953488372093,"other":0.005813953488372093,"functions":0.005813953488372093,"like":0.005813953488372093,"is-none":0.005813953488372093,"complete":0.005813953488372093,"validation":0.005813953488372093,"practical":0.005813953488372093,"example":0.005813953488372093,"user":0.005813953488372093,"data":0.005813953488372093,"let's":0.005813953488372093,"user's":0.005813953488372093,"profile":0.005813953488372093,"exists":0.005813953488372093,"define-map":0.005813953488372093,"userprofiles":0.005813953488372093,"userid":0.005813953488372093,"principal":0.005813953488372093,"name":0.005813953488372093,"string-ascii":0.005813953488372093,"age":0.005813953488372093,"uint":0.005813953488372093,"define-read-only":0.005813953488372093,"is-profile-existing":0.005813953488372093,"map-get":0.005813953488372093,"usage":0.005813953488372093,"map-set":0.005813953488372093,"tx-sender":0.005813953488372093,"alice":0.005813953488372093,"u30":0.005813953488372093,"returns":0.005813953488372093,"true":0.005813953488372093,"'spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf":0.005813953488372093,"false":0.005813953488372093,"this":0.005813953488372093,"demonstrates":0.005813953488372093,"using":0.005813953488372093,"read-only":0.005813953488372093,"determine":0.005813953488372093,"both":0.005813953488372093,"case":0.005813953488372093,"and":0.005813953488372093,"common":0.005813953488372093,"pitfalls":0.005813953488372093,"assuming":0.005813953488372093,"will":0.005813953488372093,"always":0.005813953488372093,"leading":0.005813953488372093,"unhandled":0.005813953488372093,"none":0.005813953488372093,"non-optional":0.005813953488372093,"causing":0.005813953488372093,"errors":0.005813953488372093,"not":0.005813953488372093,"all":0.005813953488372093,"possible":0.005813953488372093,"conditions":0.005813953488372093,"resulting":0.005813953488372093,"incomplete":0.005813953488372093,"overlooking":0.005813953488372093,"error":0.005813953488372093,"related":0.005813953488372093,"used":0.005813953488372093,"pattern":0.005813953488372093,"matching":0.005813953488372093,"multiple":0.005813953488372093,"default-to":0.005813953488372093,"provides":0.005813953488372093,"default":0.005813953488372093,"conclusion":0.005813953488372093,"fundamental":0.005813953488372093,"tool":0.005813953488372093,"contracts":0.005813953488372093,"allows":0.005813953488372093,"enabling":0.005813953488372093,"effectively":0.005813953488372093,"enhances":0.005813953488372093,"reliability":0.005813953488372093,"maintainability":0.005813953488372093,"your":0.005813953488372093,"are":0.005813953488372093,"detected":0.005813953488372093,"handled":0.005813953488372093,"appropriately":0.005813953488372093},"147":{"1":0.005649717514124294,"2":0.005649717514124294,"3":0.005649717514124294,"4":0.005649717514124294,"function":0.005649717514124294,"signature":0.005649717514124294,"clarity":0.005649717514124294,"is-standard":0.005649717514124294,"value":0.005649717514124294,"-":0.005649717514124294,"input":0.005649717514124294,"principal":0.005649717514124294,"output":0.005649717514124294,"bool":0.005649717514124294,"why":0.005649717514124294,"it":0.005649717514124294,"matters":0.005649717514124294,"the":0.005649717514124294,"is":0.005649717514124294,"crucial":0.005649717514124294,"for":0.005649717514124294,"determining":0.005649717514124294,"if":0.005649717514124294,"a":0.005649717514124294,"standard":0.005649717514124294,"i":0.005649717514124294,"e":0.005649717514124294,"user":0.005649717514124294,"address":0.005649717514124294,"implementing":0.005649717514124294,"conditional":0.005649717514124294,"logic":0.005649717514124294,"based":0.005649717514124294,"on":0.005649717514124294,"type":0.005649717514124294,"of":0.005649717514124294,"ensuring":0.005649717514124294,"that":0.005649717514124294,"certain":0.005649717514124294,"operations":0.005649717514124294,"are":0.005649717514124294,"only":0.005649717514124294,"performed":0.005649717514124294,"by":0.005649717514124294,"principals":0.005649717514124294,"simplifying":0.005649717514124294,"checks":0.005649717514124294,"types":0.005649717514124294,"in":0.005649717514124294,"smart":0.005649717514124294,"contract":0.005649717514124294,"code":0.005649717514124294,"when":0.005649717514124294,"to":0.005649717514124294,"use":0.005649717514124294,"you":0.005649717514124294,"need":0.005649717514124294,"check":0.005649717514124294,"implement":0.005649717514124294,"depends":0.005649717514124294,"validate":0.005649717514124294,"before":0.005649717514124294,"performing":0.005649717514124294,"handle":0.005649717514124294,"cases":0.005649717514124294,"where":0.005649717514124294,"allowed":0.005649717514124294,"best":0.005649717514124294,"practices":0.005649717514124294,"combination":0.005649717514124294,"with":0.005649717514124294,"or":0.005649717514124294,"match":0.005649717514124294,"comprehensive":0.005649717514124294,"handling":0.005649717514124294,"ensure":0.005649717514124294,"being":0.005649717514124294,"checked":0.005649717514124294,"correct":0.005649717514124294,"meaningful":0.005649717514124294,"variable":0.005649717514124294,"names":0.005649717514124294,"better":0.005649717514124294,"readability":0.005649717514124294,"note":0.005649717514124294,"can":0.005649717514124294,"pass":0.005649717514124294,"valid":0.005649717514124294,"as":0.005649717514124294,"well":0.005649717514124294,"not":0.005649717514124294,"just":0.005649717514124294,"g":0.005649717514124294,"'sp12":0.005649717514124294,"practical":0.005649717514124294,"example":0.005649717514124294,"restricting":0.005649717514124294,"access":0.005649717514124294,"let's":0.005649717514124294,"restricts":0.005649717514124294,"define-map":0.005649717514124294,"userbalances":0.005649717514124294,"userid":0.005649717514124294,"balance":0.005649717514124294,"uint":0.005649717514124294,"define-public":0.005649717514124294,"transfer-tokens":0.005649717514124294,"amount":0.005649717514124294,"recipient":0.005649717514124294,"tx-sender":0.005649717514124294,"let":0.005649717514124294,"senderbalance":0.005649717514124294,"default-to":0.005649717514124294,"u0":0.005649717514124294,"map-get":0.005649717514124294,"recipientbalance":0.005649717514124294,"begin":0.005649717514124294,"map-set":0.005649717514124294,"ok":0.005649717514124294,"true":0.005649717514124294,"err":0.005649717514124294,"u1":0.005649717514124294,"u2":0.005649717514124294,"usage":0.005649717514124294,"u100":0.005649717514124294,"u50":0.005649717514124294,"'spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf":0.005649717514124294,"returns":0.005649717514124294,"this":0.005649717514124294,"demonstrates":0.005649717514124294,"using":0.005649717514124294,"transaction":0.005649717514124294,"sender":0.005649717514124294,"both":0.005649717514124294,"case":0.005649717514124294,"and":0.005649717514124294,"common":0.005649717514124294,"pitfalls":0.005649717514124294,"assuming":0.005649717514124294,"will":0.005649717514124294,"always":0.005649717514124294,"be":0.005649717514124294,"leading":0.005649717514124294,"unhandled":0.005649717514124294,"non-principal":0.005649717514124294,"causing":0.005649717514124294,"errors":0.005649717514124294,"all":0.005649717514124294,"possible":0.005649717514124294,"conditions":0.005649717514124294,"resulting":0.005649717514124294,"incomplete":0.005649717514124294,"overlooking":0.005649717514124294,"validation":0.005649717514124294,"error":0.005649717514124294,"checking":0.005649717514124294,"related":0.005649717514124294,"functions":0.005649717514124294,"initiated":0.005649717514124294,"contract-caller":0.005649717514124294,"caller":0.005649717514124294,"current":0.005649717514124294,"context":0.005649717514124294,"conclusion":0.005649717514124294,"fundamental":0.005649717514124294,"tool":0.005649717514124294,"contracts":0.005649717514124294,"allows":0.005649717514124294,"determine":0.005649717514124294,"enabling":0.005649717514124294,"robust":0.005649717514124294,"used":0.005649717514124294,"effectively":0.005649717514124294,"enhances":0.005649717514124294,"reliability":0.005649717514124294,"maintainability":0.005649717514124294,"your":0.005649717514124294},"148":{"1":0.006666666666666667,"2":0.006666666666666667,"3":0.006666666666666667,"4":0.006666666666666667,"42":0.006666666666666667,"function":0.006666666666666667,"signature":0.006666666666666667,"clarity":0.006666666666666667,"unwrap-err-panic":0.006666666666666667,"response-input":0.006666666666666667,"-":0.006666666666666667,"input":0.006666666666666667,"response":0.006666666666666667,"a":0.006666666666666667,"b":0.006666666666666667,"output":0.006666666666666667,"why":0.006666666666666667,"it":0.006666666666666667,"matters":0.006666666666666667,"the":0.006666666666666667,"is":0.006666666666666667,"crucial":0.006666666666666667,"for":0.006666666666666667,"unpacking":0.006666666666666667,"error":0.006666666666666667,"responses":0.006666666666666667,"to":0.006666666666666667,"access":0.006666666666666667,"their":0.006666666666666667,"inner":0.006666666666666667,"values":0.006666666666666667,"implementing":0.006666666666666667,"logic":0.006666666666666667,"that":0.006666666666666667,"requires":0.006666666666666667,"handling":0.006666666666666667,"ensuring":0.006666666666666667,"data":0.006666666666666667,"integrity":0.006666666666666667,"by":0.006666666666666667,"validating":0.006666666666666667,"process":0.006666666666666667,"simplifying":0.006666666666666667,"of":0.006666666666666667,"in":0.006666666666666667,"smart":0.006666666666666667,"contracts":0.006666666666666667,"throwing":0.006666666666666667,"runtime":0.006666666666666667,"errors":0.006666666666666667,"when":0.006666666666666667,"necessary":0.006666666666666667,"use":0.006666666666666667,"you":0.006666666666666667,"need":0.006666666666666667,"unpack":0.006666666666666667,"implement":0.006666666666666667,"validate":0.006666666666666667,"ensure":0.006666666666666667,"handle":0.006666666666666667,"your":0.006666666666666667,"contract":0.006666666666666667,"and":0.006666666666666667,"throw":0.006666666666666667,"best":0.006666666666666667,"practices":0.006666666666666667,"value":0.006666666666666667,"type":0.006666666666666667,"meaningful":0.006666666666666667,"variable":0.006666666666666667,"names":0.006666666666666667,"better":0.006666666666666667,"readability":0.006666666666666667,"combine":0.006666666666666667,"with":0.006666666666666667,"other":0.006666666666666667,"functions":0.006666666666666667,"comprehensive":0.006666666666666667,"management":0.006666666666666667,"possible":0.006666666666666667,"cases":0.006666666666666667,"robust":0.006666666666666667,"behavior":0.006666666666666667,"practical":0.006666666666666667,"example":0.006666666666666667,"an":0.006666666666666667,"let's":0.006666666666666667,"processes":0.006666666666666667,"using":0.006666666666666667,"define-public":0.006666666666666667,"process-error-response":0.006666666666666667,"int":0.006666666666666667,"let":0.006666666666666667,"errorvalue":0.006666666666666667,"ok":0.006666666666666667,"usage":0.006666666666666667,"err":0.006666666666666667,"returns":0.006666666666666667,"throws":0.006666666666666667,"exception":0.006666666666666667,"this":0.006666666666666667,"demonstrates":0.006666666666666667,"public":0.006666666666666667,"both":0.006666666666666667,"successful":0.006666666666666667,"thrown":0.006666666666666667,"common":0.006666666666666667,"pitfalls":0.006666666666666667,"are":0.006666666666666667,"not":0.006666666666666667,"types":0.006666666666666667,"causing":0.006666666666666667,"assuming":0.006666666666666667,"will":0.006666666666666667,"always":0.006666666666666667,"succeed":0.006666666666666667,"leading":0.006666666666666667,"unhandled":0.006666666666666667,"all":0.006666666666666667,"conditions":0.006666666666666667,"resulting":0.006666666666666667,"incomplete":0.006666666666666667,"overlooking":0.006666666666666667,"proper":0.006666666666666667,"validation":0.006666666666666667,"related":0.006666666666666667,"unwrap":0.006666666666666667,"unpacks":0.006666666666666667,"optional":0.006666666666666667,"returning":0.006666666666666667,"if":0.006666666666666667,"fails":0.006666666666666667,"unwrap-err":0.006666666666666667,"try":0.006666666666666667,"none":0.006666666666666667,"or":0.006666666666666667,"conclusion":0.006666666666666667,"fundamental":0.006666666666666667,"tool":0.006666666666666667,"allows":0.006666666666666667,"used":0.006666666666666667,"effectively":0.006666666666666667,"enhances":0.006666666666666667,"reliability":0.006666666666666667,"maintainability":0.006666666666666667,"code":0.006666666666666667,"providing":0.006666666666666667,"clear":0.006666666666666667,"concise":0.006666666666666667,"way":0.006666666666666667},"149":{"1":0.0051813471502590676,"2":0.0051813471502590676,"3":0.0051813471502590676,"4":0.0051813471502590676,"50":0.0051813471502590676,"function":0.0051813471502590676,"signature":0.0051813471502590676,"clarity":0.0051813471502590676,"append":0.0051813471502590676,"list":0.0051813471502590676,"a":0.0051813471502590676,"-":0.0051813471502590676,"input":0.0051813471502590676,"of":0.0051813471502590676,"type":0.0051813471502590676,"and":0.0051813471502590676,"single":0.0051813471502590676,"element":0.0051813471502590676,"output":0.0051813471502590676,"new":0.0051813471502590676,"with":0.0051813471502590676,"the":0.0051813471502590676,"appended":0.0051813471502590676,"why":0.0051813471502590676,"it":0.0051813471502590676,"matters":0.0051813471502590676,"is":0.0051813471502590676,"crucial":0.0051813471502590676,"for":0.0051813471502590676,"dynamically":0.0051813471502590676,"growing":0.0051813471502590676,"lists":0.0051813471502590676,"within":0.0051813471502590676,"smart":0.0051813471502590676,"contracts":0.0051813471502590676,"adding":0.0051813471502590676,"elements":0.0051813471502590676,"to":0.0051813471502590676,"existing":0.0051813471502590676,"data":0.0051813471502590676,"structures":0.0051813471502590676,"implementing":0.0051813471502590676,"queue-like":0.0051813471502590676,"behaviors":0.0051813471502590676,"in":0.0051813471502590676,"contract":0.0051813471502590676,"logic":0.0051813471502590676,"constructing":0.0051813471502590676,"incrementally":0.0051813471502590676,"during":0.0051813471502590676,"execution":0.0051813471502590676,"when":0.0051813471502590676,"use":0.0051813471502590676,"you":0.0051813471502590676,"need":0.0051813471502590676,"add":0.0051813471502590676,"end":0.0051813471502590676,"an":0.0051813471502590676,"construct":0.0051813471502590676,"by":0.0051813471502590676,"one":0.0051813471502590676,"at":0.0051813471502590676,"time":0.0051813471502590676,"implement":0.0051813471502590676,"that":0.0051813471502590676,"require":0.0051813471502590676,"order":0.0051813471502590676,"combine":0.0051813471502590676,"best":0.0051813471502590676,"practices":0.0051813471502590676,"always":0.0051813471502590676,"as-max-len":0.0051813471502590676,"before":0.0051813471502590676,"appending":0.0051813471502590676,"ensure":0.0051813471502590676,"doesn't":0.0051813471502590676,"exceed":0.0051813471502590676,"its":0.0051813471502590676,"maximum":0.0051813471502590676,"length":0.0051813471502590676,"be":0.0051813471502590676,"mindful":0.0051813471502590676,"specified":0.0051813471502590676,"defining":0.0051813471502590676,"consider":0.0051813471502590676,"using":0.0051813471502590676,"concat":0.0051813471502590676,"joining":0.0051813471502590676,"two":0.0051813471502590676,"instead":0.0051813471502590676,"repeatedly":0.0051813471502590676,"remember":0.0051813471502590676,"creates":0.0051813471502590676,"modify":0.0051813471502590676,"original":0.0051813471502590676,"in-place":0.0051813471502590676,"type-appropriate":0.0051813471502590676,"match":0.0051813471502590676,"list's":0.0051813471502590676,"declared":0.0051813471502590676,"practical":0.0051813471502590676,"example":0.0051813471502590676,"event":0.0051813471502590676,"log":0.0051813471502590676,"max":0.0051813471502590676,"check":0.0051813471502590676,"let's":0.0051813471502590676,"simple":0.0051813471502590676,"system":0.0051813471502590676,"define-data-var":0.0051813471502590676,"eventlog":0.0051813471502590676,"string-ascii":0.0051813471502590676,"define-public":0.0051813471502590676,"log-event":0.0051813471502590676,"let":0.0051813471502590676,"current-log":0.0051813471502590676,"var-get":0.0051813471502590676,"u2":0.0051813471502590676,"success":0.0051813471502590676,"ok":0.0051813471502590676,"var-set":0.0051813471502590676,"err":0.0051813471502590676,"u1":0.0051813471502590676,"define-read-only":0.0051813471502590676,"get-eventlog":0.0051813471502590676,"usage":0.0051813471502590676,"initialized":0.0051813471502590676,"user":0.0051813471502590676,"registered":0.0051813471502590676,"returns":0.0051813471502590676,"this":0.0051813471502590676,"demonstrates":0.0051813471502590676,"events":0.0051813471502590676,"if":0.0051813471502590676,"would":0.0051813471502590676,"handling":0.0051813471502590676,"case":0.0051813471502590676,"where":0.0051813471502590676,"combining":0.0051813471502590676,"other":0.0051813471502590676,"functions":0.0051813471502590676,"like":0.0051813471502590676,"common":0.0051813471502590676,"pitfalls":0.0051813471502590676,"forgetting":0.0051813471502590676,"attempting":0.0051813471502590676,"wrong":0.0051813471502590676,"typed":0.0051813471502590676,"assuming":0.0051813471502590676,"will":0.0051813471502590676,"succeed":0.0051813471502590676,"without":0.0051813471502590676,"checking":0.0051813471502590676,"current":0.0051813471502590676,"inefficiently":0.0051813471502590676,"loop":0.0051813471502590676,"might":0.0051813471502590676,"more":0.0051813471502590676,"appropriate":0.0051813471502590676,"related":0.0051813471502590676,"used":0.0051813471502590676,"sequence":0.0051813471502590676,"exceeds":0.0051813471502590676,"together":0.0051813471502590676,"creating":0.0051813471502590676,"len":0.0051813471502590676,"getting":0.0051813471502590676,"conclusion":0.0051813471502590676,"powerful":0.0051813471502590676,"tool":0.0051813471502590676,"manipulating":0.0051813471502590676,"understanding":0.0051813471502590676,"behavior":0.0051813471502590676,"limitations":0.0051813471502590676,"necessity":0.0051813471502590676,"have":0.0051813471502590676,"can":0.0051813471502590676,"effectively":0.0051813471502590676,"manage":0.0051813471502590676,"dynamic":0.0051813471502590676,"your":0.0051813471502590676,"enables":0.0051813471502590676,"flexible":0.0051813471502590676,"responsive":0.0051813471502590676,"designs":0.0051813471502590676,"while":0.0051813471502590676,"maintaining":0.0051813471502590676,"safeguards":0.0051813471502590676,"against":0.0051813471502590676,"exceeding":0.0051813471502590676,"predefined":0.0051813471502590676,"size":0.0051813471502590676,"limits":0.0051813471502590676},"150":{"1":0.0064516129032258064,"2":0.0064516129032258064,"3":0.0064516129032258064,"4":0.0064516129032258064,"function":0.0064516129032258064,"signature":0.0064516129032258064,"clarity":0.0064516129032258064,"stx-transfer":0.0064516129032258064,"amount":0.0064516129032258064,"sender":0.0064516129032258064,"recipient":0.0064516129032258064,"-":0.0064516129032258064,"input":0.0064516129032258064,"uint":0.0064516129032258064,"principal":0.0064516129032258064,"output":0.0064516129032258064,"response":0.0064516129032258064,"bool":0.0064516129032258064,"why":0.0064516129032258064,"it":0.0064516129032258064,"matters":0.0064516129032258064,"the":0.0064516129032258064,"is":0.0064516129032258064,"crucial":0.0064516129032258064,"for":0.0064516129032258064,"transferring":0.0064516129032258064,"stx":0.0064516129032258064,"between":0.0064516129032258064,"principals":0.0064516129032258064,"implementing":0.0064516129032258064,"logic":0.0064516129032258064,"that":0.0064516129032258064,"requires":0.0064516129032258064,"moving":0.0064516129032258064,"from":0.0064516129032258064,"one":0.0064516129032258064,"account":0.0064516129032258064,"to":0.0064516129032258064,"another":0.0064516129032258064,"ensuring":0.0064516129032258064,"data":0.0064516129032258064,"integrity":0.0064516129032258064,"by":0.0064516129032258064,"validating":0.0064516129032258064,"transfer":0.0064516129032258064,"operation":0.0064516129032258064,"simplifying":0.0064516129032258064,"process":0.0064516129032258064,"of":0.0064516129032258064,"handling":0.0064516129032258064,"transfers":0.0064516129032258064,"in":0.0064516129032258064,"smart":0.0064516129032258064,"contracts":0.0064516129032258064,"when":0.0064516129032258064,"use":0.0064516129032258064,"you":0.0064516129032258064,"need":0.0064516129032258064,"implement":0.0064516129032258064,"validate":0.0064516129032258064,"ensure":0.0064516129032258064,"handle":0.0064516129032258064,"your":0.0064516129032258064,"contract":0.0064516129032258064,"best":0.0064516129032258064,"practices":0.0064516129032258064,"positive":0.0064516129032258064,"and":0.0064516129032258064,"has":0.0064516129032258064,"sufficient":0.0064516129032258064,"balance":0.0064516129032258064,"meaningful":0.0064516129032258064,"variable":0.0064516129032258064,"names":0.0064516129032258064,"better":0.0064516129032258064,"readability":0.0064516129032258064,"combine":0.0064516129032258064,"with":0.0064516129032258064,"other":0.0064516129032258064,"functions":0.0064516129032258064,"comprehensive":0.0064516129032258064,"management":0.0064516129032258064,"possible":0.0064516129032258064,"error":0.0064516129032258064,"cases":0.0064516129032258064,"robust":0.0064516129032258064,"behavior":0.0064516129032258064,"practical":0.0064516129032258064,"example":0.0064516129032258064,"let's":0.0064516129032258064,"a":0.0064516129032258064,"tx-sender":0.0064516129032258064,"define-public":0.0064516129032258064,"transfer-stx":0.0064516129032258064,"usage":0.0064516129032258064,"u60":0.0064516129032258064,"'sz2j6zy48gv1ez5v2v5rb9mp66sw86pykkq9h6dpr":0.0064516129032258064,"returns":0.0064516129032258064,"ok":0.0064516129032258064,"true":0.0064516129032258064,"if":0.0064516129032258064,"successful":0.0064516129032258064,"u50":0.0064516129032258064,"err":0.0064516129032258064,"u1":0.0064516129032258064,"does":0.0064516129032258064,"not":0.0064516129032258064,"have":0.0064516129032258064,"enough":0.0064516129032258064,"this":0.0064516129032258064,"demonstrates":0.0064516129032258064,"using":0.0064516129032258064,"public":0.0064516129032258064,"both":0.0064516129032258064,"common":0.0064516129032258064,"pitfalls":0.0064516129032258064,"non-positive":0.0064516129032258064,"causing":0.0064516129032258064,"fail":0.0064516129032258064,"assuming":0.0064516129032258064,"will":0.0064516129032258064,"always":0.0064516129032258064,"succeed":0.0064516129032258064,"leading":0.0064516129032258064,"unhandled":0.0064516129032258064,"all":0.0064516129032258064,"conditions":0.0064516129032258064,"resulting":0.0064516129032258064,"incomplete":0.0064516129032258064,"overlooking":0.0064516129032258064,"proper":0.0064516129032258064,"validation":0.0064516129032258064,"related":0.0064516129032258064,"stx-get-balance":0.0064516129032258064,"queries":0.0064516129032258064,"stx-transfer-memo":0.0064516129032258064,"memo":0.0064516129032258064,"stx-burn":0.0064516129032258064,"burns":0.0064516129032258064,"principal's":0.0064516129032258064,"conclusion":0.0064516129032258064,"fundamental":0.0064516129032258064,"tool":0.0064516129032258064,"allows":0.0064516129032258064,"operations":0.0064516129032258064,"used":0.0064516129032258064,"effectively":0.0064516129032258064,"enhances":0.0064516129032258064,"reliability":0.0064516129032258064,"maintainability":0.0064516129032258064,"code":0.0064516129032258064,"providing":0.0064516129032258064,"clear":0.0064516129032258064,"concise":0.0064516129032258064,"way":0.0064516129032258064},"151":{"1":0.006172839506172839,"2":0.006172839506172839,"3":0.006172839506172839,"4":0.006172839506172839,"20":0.006172839506172839,"function":0.006172839506172839,"signature":0.006172839506172839,"clarity":0.006172839506172839,"unwrap-panic":0.006172839506172839,"option-input":0.006172839506172839,"-":0.006172839506172839,"input":0.006172839506172839,"optional":0.006172839506172839,"a":0.006172839506172839,"response":0.006172839506172839,"b":0.006172839506172839,"output":0.006172839506172839,"why":0.006172839506172839,"it":0.006172839506172839,"matters":0.006172839506172839,"the":0.006172839506172839,"is":0.006172839506172839,"crucial":0.006172839506172839,"for":0.006172839506172839,"unpacking":0.006172839506172839,"and":0.006172839506172839,"types":0.006172839506172839,"to":0.006172839506172839,"access":0.006172839506172839,"their":0.006172839506172839,"inner":0.006172839506172839,"values":0.006172839506172839,"implementing":0.006172839506172839,"logic":0.006172839506172839,"that":0.006172839506172839,"requires":0.006172839506172839,"handling":0.006172839506172839,"ensuring":0.006172839506172839,"data":0.006172839506172839,"integrity":0.006172839506172839,"by":0.006172839506172839,"validating":0.006172839506172839,"process":0.006172839506172839,"simplifying":0.006172839506172839,"of":0.006172839506172839,"in":0.006172839506172839,"smart":0.006172839506172839,"contracts":0.006172839506172839,"throwing":0.006172839506172839,"runtime":0.006172839506172839,"errors":0.006172839506172839,"when":0.006172839506172839,"necessary":0.006172839506172839,"use":0.006172839506172839,"you":0.006172839506172839,"need":0.006172839506172839,"unpack":0.006172839506172839,"implement":0.006172839506172839,"validate":0.006172839506172839,"ensure":0.006172839506172839,"handle":0.006172839506172839,"your":0.006172839506172839,"contract":0.006172839506172839,"throw":0.006172839506172839,"best":0.006172839506172839,"practices":0.006172839506172839,"value":0.006172839506172839,"an":0.006172839506172839,"or":0.006172839506172839,"type":0.006172839506172839,"meaningful":0.006172839506172839,"variable":0.006172839506172839,"names":0.006172839506172839,"better":0.006172839506172839,"readability":0.006172839506172839,"combine":0.006172839506172839,"with":0.006172839506172839,"other":0.006172839506172839,"error":0.006172839506172839,"functions":0.006172839506172839,"comprehensive":0.006172839506172839,"management":0.006172839506172839,"possible":0.006172839506172839,"cases":0.006172839506172839,"robust":0.006172839506172839,"behavior":0.006172839506172839,"practical":0.006172839506172839,"example":0.006172839506172839,"let's":0.006172839506172839,"retrieves":0.006172839506172839,"from":0.006172839506172839,"map":0.006172839506172839,"unpacks":0.006172839506172839,"using":0.006172839506172839,"define-map":0.006172839506172839,"userinfo":0.006172839506172839,"userid":0.006172839506172839,"principal":0.006172839506172839,"name":0.006172839506172839,"string-ascii":0.006172839506172839,"age":0.006172839506172839,"uint":0.006172839506172839,"define-public":0.006172839506172839,"get-user-age":0.006172839506172839,"user":0.006172839506172839,"let":0.006172839506172839,"userdata":0.006172839506172839,"map-get":0.006172839506172839,"ok":0.006172839506172839,"get":0.006172839506172839,"usage":0.006172839506172839,"map-set":0.006172839506172839,"tx-sender":0.006172839506172839,"alice":0.006172839506172839,"u30":0.006172839506172839,"returns":0.006172839506172839,"'sz2j6zy48gv1ez5v2v5rb9mp66sw86pykkq9h6dpr":0.006172839506172839,"throws":0.006172839506172839,"exception":0.006172839506172839,"common":0.006172839506172839,"pitfalls":0.006172839506172839,"are":0.006172839506172839,"not":0.006172839506172839,"causing":0.006172839506172839,"assuming":0.006172839506172839,"will":0.006172839506172839,"always":0.006172839506172839,"succeed":0.006172839506172839,"leading":0.006172839506172839,"unhandled":0.006172839506172839,"all":0.006172839506172839,"conditions":0.006172839506172839,"resulting":0.006172839506172839,"incomplete":0.006172839506172839,"overlooking":0.006172839506172839,"proper":0.006172839506172839,"validation":0.006172839506172839,"related":0.006172839506172839,"unwrap":0.006172839506172839,"returning":0.006172839506172839,"thrown":0.006172839506172839,"if":0.006172839506172839,"fails":0.006172839506172839,"unwrap-err":0.006172839506172839,"responses":0.006172839506172839,"try":0.006172839506172839,"none":0.006172839506172839,"err":0.006172839506172839,"conclusion":0.006172839506172839,"fundamental":0.006172839506172839,"tool":0.006172839506172839,"allows":0.006172839506172839,"used":0.006172839506172839,"effectively":0.006172839506172839,"enhances":0.006172839506172839,"reliability":0.006172839506172839,"maintainability":0.006172839506172839,"code":0.006172839506172839,"providing":0.006172839506172839,"clear":0.006172839506172839,"concise":0.006172839506172839,"way":0.006172839506172839},"152":{"1":0.005813953488372093,"2":0.005813953488372093,"3":0.005813953488372093,"4":0.005813953488372093,"function":0.005813953488372093,"signature":0.005813953488372093,"clarity":0.005813953488372093,"impl-trait":0.005813953488372093,"trait-name":0.005813953488372093,"-":0.005813953488372093,"input":0.005813953488372093,"the":0.005813953488372093,"name":0.005813953488372093,"of":0.005813953488372093,"trait":0.005813953488372093,"to":0.005813953488372093,"implement":0.005813953488372093,"output":0.005813953488372093,"not":0.005813953488372093,"applicable":0.005813953488372093,"why":0.005813953488372093,"it":0.005813953488372093,"matters":0.005813953488372093,"is":0.005813953488372093,"crucial":0.005813953488372093,"for":0.005813953488372093,"enabling":0.005813953488372093,"contracts":0.005813953488372093,"conform":0.005813953488372093,"specific":0.005813953488372093,"interfaces":0.005813953488372093,"allowing":0.005813953488372093,"dynamic":0.005813953488372093,"calls":0.005813953488372093,"between":0.005813953488372093,"promoting":0.005813953488372093,"code":0.005813953488372093,"reuse":0.005813953488372093,"and":0.005813953488372093,"modularity":0.005813953488372093,"in":0.005813953488372093,"smart":0.005813953488372093,"contract":0.005813953488372093,"development":0.005813953488372093,"ensuring":0.005813953488372093,"adhere":0.005813953488372093,"predefined":0.005813953488372093,"behaviors":0.005813953488372093,"standards":0.005813953488372093,"when":0.005813953488372093,"use":0.005813953488372093,"you":0.005813953488372093,"need":0.005813953488372093,"a":0.005813953488372093,"interface":0.005813953488372093,"your":0.005813953488372093,"allow":0.005813953488372093,"other":0.005813953488372093,"interact":0.005813953488372093,"with":0.005813953488372093,"through":0.005813953488372093,"common":0.005813953488372093,"ensure":0.005813953488372093,"adheres":0.005813953488372093,"or":0.005813953488372093,"enable":0.005813953488372093,"using":0.005813953488372093,"contract-call":0.005813953488372093,"best":0.005813953488372093,"practices":0.005813953488372093,"define":0.005813953488372093,"traits":0.005813953488372093,"at":0.005813953488372093,"top":0.005813953488372093,"level":0.005813953488372093,"organization":0.005813953488372093,"all":0.005813953488372093,"required":0.005813953488372093,"functions":0.005813953488372093,"are":0.005813953488372093,"implemented":0.005813953488372093,"meaningful":0.005813953488372093,"descriptive":0.005813953488372093,"names":0.005813953488372093,"their":0.005813953488372093,"document":0.005813953488372093,"purpose":0.005813953488372093,"usage":0.005813953488372093,"each":0.005813953488372093,"practical":0.005813953488372093,"example":0.005813953488372093,"implementing":0.005813953488372093,"token":0.005813953488372093,"let's":0.005813953488372093,"simple":0.005813953488372093,"define-trait":0.005813953488372093,"token-trait":0.005813953488372093,"transfer":0.005813953488372093,"principal":0.005813953488372093,"uint":0.005813953488372093,"response":0.005813953488372093,"bool":0.005813953488372093,"get-balance":0.005813953488372093,"define-map":0.005813953488372093,"balances":0.005813953488372093,"user":0.005813953488372093,"balance":0.005813953488372093,"define-public":0.005813953488372093,"sender":0.005813953488372093,"recipient":0.005813953488372093,"amount":0.005813953488372093,"let":0.005813953488372093,"senderbalance":0.005813953488372093,"default-to":0.005813953488372093,"u0":0.005813953488372093,"map-get":0.005813953488372093,"recipientbalance":0.005813953488372093,"if":0.005813953488372093,"begin":0.005813953488372093,"map-set":0.005813953488372093,"ok":0.005813953488372093,"true":0.005813953488372093,"err":0.005813953488372093,"u1":0.005813953488372093,"define-read-only":0.005813953488372093,"this":0.005813953488372093,"demonstrates":0.005813953488372093,"defining":0.005813953488372093,"providing":0.005813953488372093,"implementations":0.005813953488372093,"pitfalls":0.005813953488372093,"forgetting":0.005813953488372093,"leading":0.005813953488372093,"deployment":0.005813953488372093,"errors":0.005813953488372093,"inconsistent":0.005813953488372093,"signatures":0.005813953488372093,"implementation":0.005813953488372093,"documenting":0.005813953488372093,"making":0.005813953488372093,"harder":0.005813953488372093,"understand":0.005813953488372093,"overlooking":0.005813953488372093,"proper":0.005813953488372093,"error":0.005813953488372093,"handling":0.005813953488372093,"related":0.005813953488372093,"used":0.005813953488372093,"new":0.005813953488372093,"call":0.005813953488372093,"dynamically":0.005813953488372093,"on":0.005813953488372093,"that":0.005813953488372093,"public":0.005813953488372093,"can":0.005813953488372093,"be":0.005813953488372093,"called":0.005813953488372093,"from":0.005813953488372093,"outside":0.005813953488372093,"conclusion":0.005813953488372093,"powerful":0.005813953488372093,"tool":0.005813953488372093,"by":0.005813953488372093,"effectively":0.005813953488372093,"enhances":0.005813953488372093,"flexibility":0.005813953488372093,"maintainability":0.005813953488372093,"more":0.005813953488372093,"robust":0.005813953488372093,"interoperable":0.005813953488372093,"decentralized":0.005813953488372093,"applications":0.005813953488372093},"153":{"0":0.00684931506849315,"1":0.00684931506849315,"2":0.00684931506849315,"3":0.00684931506849315,"4":0.00684931506849315,"42":0.00684931506849315,"1000000":0.00684931506849315,"function":0.00684931506849315,"signature":0.00684931506849315,"clarity":0.00684931506849315,"to-int":0.00684931506849315,"value":0.00684931506849315,"-":0.00684931506849315,"input":0.00684931506849315,"uint":0.00684931506849315,"output":0.00684931506849315,"int":0.00684931506849315,"why":0.00684931506849315,"it":0.00684931506849315,"matters":0.00684931506849315,"the":0.00684931506849315,"is":0.00684931506849315,"crucial":0.00684931506849315,"for":0.00684931506849315,"converting":0.00684931506849315,"unsigned":0.00684931506849315,"integers":0.00684931506849315,"to":0.00684931506849315,"signed":0.00684931506849315,"implementing":0.00684931506849315,"logic":0.00684931506849315,"that":0.00684931506849315,"requires":0.00684931506849315,"integer":0.00684931506849315,"operations":0.00684931506849315,"ensuring":0.00684931506849315,"data":0.00684931506849315,"integrity":0.00684931506849315,"by":0.00684931506849315,"validating":0.00684931506849315,"conversion":0.00684931506849315,"process":0.00684931506849315,"simplifying":0.00684931506849315,"of":0.00684931506849315,"handling":0.00684931506849315,"conversions":0.00684931506849315,"in":0.00684931506849315,"smart":0.00684931506849315,"contracts":0.00684931506849315,"when":0.00684931506849315,"use":0.00684931506849315,"you":0.00684931506849315,"need":0.00684931506849315,"convert":0.00684931506849315,"an":0.00684931506849315,"a":0.00684931506849315,"implement":0.00684931506849315,"validate":0.00684931506849315,"ensure":0.00684931506849315,"handle":0.00684931506849315,"your":0.00684931506849315,"contract":0.00684931506849315,"best":0.00684931506849315,"practices":0.00684931506849315,"within":0.00684931506849315,"range":0.00684931506849315,"can":0.00684931506849315,"be":0.00684931506849315,"represented":0.00684931506849315,"as":0.00684931506849315,"meaningful":0.00684931506849315,"variable":0.00684931506849315,"names":0.00684931506849315,"better":0.00684931506849315,"readability":0.00684931506849315,"combine":0.00684931506849315,"with":0.00684931506849315,"other":0.00684931506849315,"functions":0.00684931506849315,"comprehensive":0.00684931506849315,"management":0.00684931506849315,"possible":0.00684931506849315,"error":0.00684931506849315,"cases":0.00684931506849315,"robust":0.00684931506849315,"behavior":0.00684931506849315,"practical":0.00684931506849315,"example":0.00684931506849315,"let's":0.00684931506849315,"converts":0.00684931506849315,"define-read-only":0.00684931506849315,"convert-to-int":0.00684931506849315,"usage":0.00684931506849315,"u42":0.00684931506849315,"returns":0.00684931506849315,"u0":0.00684931506849315,"u1000000":0.00684931506849315,"this":0.00684931506849315,"demonstrates":0.00684931506849315,"using":0.00684931506849315,"public":0.00684931506849315,"both":0.00684931506849315,"small":0.00684931506849315,"and":0.00684931506849315,"large":0.00684931506849315,"values":0.00684931506849315,"common":0.00684931506849315,"pitfalls":0.00684931506849315,"exceed":0.00684931506849315,"causing":0.00684931506849315,"unexpected":0.00684931506849315,"assuming":0.00684931506849315,"will":0.00684931506849315,"always":0.00684931506849315,"succeed":0.00684931506849315,"leading":0.00684931506849315,"unhandled":0.00684931506849315,"not":0.00684931506849315,"all":0.00684931506849315,"conditions":0.00684931506849315,"resulting":0.00684931506849315,"incomplete":0.00684931506849315,"overlooking":0.00684931506849315,"proper":0.00684931506849315,"validation":0.00684931506849315,"related":0.00684931506849315,"to-uint":0.00684931506849315,"int-to-ascii":0.00684931506849315,"string-ascii":0.00684931506849315,"representation":0.00684931506849315,"int-to-utf8":0.00684931506849315,"string-utf8":0.00684931506849315,"conclusion":0.00684931506849315,"fundamental":0.00684931506849315,"tool":0.00684931506849315,"allows":0.00684931506849315,"used":0.00684931506849315,"effectively":0.00684931506849315,"enhances":0.00684931506849315,"reliability":0.00684931506849315,"maintainability":0.00684931506849315,"code":0.00684931506849315,"providing":0.00684931506849315,"clear":0.00684931506849315,"concise":0.00684931506849315,"way":0.00684931506849315},"154":{"0":0.004651162790697674,"1":0.004651162790697674,"2":0.004651162790697674,"3":0.004651162790697674,"4":0.004651162790697674,"the":0.004651162790697674,"greater":0.004651162790697674,"than":0.004651162790697674,"function":0.004651162790697674,"in":0.004651162790697674,"clarity":0.004651162790697674,"compares":0.004651162790697674,"two":0.004651162790697674,"values":0.004651162790697674,"and":0.004651162790697674,"returns":0.004651162790697674,"true":0.004651162790697674,"if":0.004651162790697674,"first":0.004651162790697674,"value":0.004651162790697674,"is":0.004651162790697674,"second":0.004651162790697674,"it's":0.004651162790697674,"a":0.004651162790697674,"fundamental":0.004651162790697674,"comparison":0.004651162790697674,"operation":0.004651162790697674,"used":0.004651162790697674,"many":0.004651162790697674,"smart":0.004651162790697674,"contract":0.004651162790697674,"conditions":0.004651162790697674,"logic":0.004651162790697674,"flows":0.004651162790697674,"signature":0.004651162790697674,"v1":0.004651162790697674,"v2":0.004651162790697674,"-":0.004651162790697674,"input":0.004651162790697674,"of":0.004651162790697674,"same":0.004651162790697674,"type":0.004651162790697674,"int":0.004651162790697674,"uint":0.004651162790697674,"string-ascii":0.004651162790697674,"string-utf8":0.004651162790697674,"or":0.004651162790697674,"buff":0.004651162790697674,"output":0.004651162790697674,"boolean":0.004651162790697674,"false":0.004651162790697674,"why":0.004651162790697674,"it":0.004651162790697674,"matters":0.004651162790697674,"crucial":0.004651162790697674,"for":0.004651162790697674,"implementing":0.004651162790697674,"conditional":0.004651162790697674,"contracts":0.004651162790697674,"comparing":0.004651162790697674,"numerical":0.004651162790697674,"financial":0.004651162790697674,"operations":0.004651162790697674,"ordering":0.004651162790697674,"sorting":0.004651162790697674,"data":0.004651162790697674,"thresholds":0.004651162790697674,"limits":0.004651162790697674,"when":0.004651162790697674,"to":0.004651162790697674,"use":0.004651162790697674,"you":0.004651162790697674,"need":0.004651162790697674,"compare":0.004651162790697674,"determine":0.004651162790697674,"one":0.004651162790697674,"larger":0.004651162790697674,"implement":0.004651162790697674,"minimum":0.004651162790697674,"certain":0.004651162790697674,"create":0.004651162790697674,"based":0.004651162790697674,"on":0.004651162790697674,"comparisons":0.004651162790697674,"sort":0.004651162790697674,"order":0.004651162790697674,"lexicographical":0.004651162790697674,"best":0.004651162790697674,"practices":0.004651162790697674,"ensure":0.004651162790697674,"that":0.004651162790697674,"both":0.004651162790697674,"inputs":0.004651162790697674,"are":0.004651162790697674,"avoid":0.004651162790697674,"runtime":0.004651162790697674,"errors":0.004651162790697674,"be":0.004651162790697674,"aware":0.004651162790697674,"differences":0.004651162790697674,"between":0.004651162790697674,"signed":0.004651162790697674,"unsigned":0.004651162790697674,"integers":0.004651162790697674,"strings":0.004651162790697674,"buffers":0.004651162790697674,"understand":0.004651162790697674,"consider":0.004651162790697674,"edge":0.004651162790697674,"cases":0.004651162790697674,"especially":0.004651162790697674,"dealing":0.004651162790697674,"with":0.004651162790697674,"integer":0.004651162790697674,"ranges":0.004651162790697674,"practical":0.004651162790697674,"example":0.004651162790697674,"token":0.004651162790697674,"sale":0.004651162790697674,"purchase":0.004651162790697674,"let's":0.004651162790697674,"simple":0.004651162790697674,"uses":0.004651162790697674,"enforce":0.004651162790697674,"amount":0.004651162790697674,"define":0.004651162790697674,"constants":0.004651162790697674,"define-constant":0.004651162790697674,"min_purchase":0.004651162790697674,"u100000000":0.004651162790697674,"stx":0.004651162790697674,"token_price":0.004651162790697674,"u50000":0.004651162790697674,"0005":0.004651162790697674,"per":0.004651162790697674,"variables":0.004651162790697674,"define-data-var":0.004651162790697674,"tokenssold":0.004651162790697674,"u0":0.004651162790697674,"tokens":0.004651162790697674,"define-public":0.004651162790697674,"purchase-tokens":0.004651162790697674,"let":0.004651162790697674,"tokenstomint":0.004651162790697674,"payment":0.004651162790697674,"check":0.004651162790697674,"asserts":0.004651162790697674,"err":0.004651162790697674,"u1":0.004651162790697674,"perform":0.004651162790697674,"try":0.004651162790697674,"stx-transfer":0.004651162790697674,"tx-sender":0.004651162790697674,"as-contract":0.004651162790697674,"var-set":0.004651162790697674,"var-get":0.004651162790697674,"here":0.004651162790697674,"would":0.004651162790697674,"typically":0.004651162790697674,"mint":0.004651162790697674,"transfer":0.004651162790697674,"buyer":0.004651162790697674,"ok":0.004651162790697674,"total":0.004651162790697674,"sold":0.004651162790697674,"define-read-only":0.004651162790697674,"get-tokenssold":0.004651162790697674,"this":0.004651162790697674,"demonstrates":0.004651162790697674,"using":0.004651162790697674,"exceeds":0.004651162790697674,"threshold":0.004651162790697674,"combining":0.004651162790697674,"other":0.004651162790697674,"prevent":0.004651162790697674,"small":0.004651162790697674,"potentially":0.004651162790697674,"spam":0.004651162790697674,"transactions":0.004651162790697674,"common":0.004651162790697674,"pitfalls":0.004651162790697674,"different":0.004651162790697674,"types":0.004651162790697674,"which":0.004651162790697674,"will":0.004651162790697674,"result":0.004651162790697674,"error":0.004651162790697674,"not":0.004651162790697674,"considering":0.004651162790697674,"inclusive":0.004651162790697674,"nature":0.004651162790697674,"vs":0.004651162790697674,"exclusive":0.004651162790697674,"setting":0.004651162790697674,"overlooking":0.004651162790697674,"potential":0.004651162790697674,"overflow":0.004651162790697674,"working":0.004651162790697674,"very":0.004651162790697674,"large":0.004651162790697674,"numbers":0.004651162790697674,"related":0.004651162790697674,"functions":0.004651162790697674,"less":0.004651162790697674,"equal":0.004651162790697674,"conclusion":0.004651162790697674,"tool":0.004651162790697674,"by":0.004651162790697674,"understanding":0.004651162790697674,"its":0.004651162790697674,"behavior":0.004651162790697674,"can":0.004651162790697674,"robust":0.004651162790697674,"important":0.004651162790697674,"your":0.004651162790697674},"155":{"0":0.006896551724137931,"1":0.006896551724137931,"2":0.006896551724137931,"3":0.006896551724137931,"4":0.006896551724137931,"5":0.006896551724137931,"function":0.006896551724137931,"signature":0.006896551724137931,"clarity":0.006896551724137931,"not":0.006896551724137931,"boolean-expression":0.006896551724137931,"-":0.006896551724137931,"input":0.006896551724137931,"bool":0.006896551724137931,"output":0.006896551724137931,"why":0.006896551724137931,"it":0.006896551724137931,"matters":0.006896551724137931,"the":0.006896551724137931,"is":0.006896551724137931,"crucial":0.006896551724137931,"for":0.006896551724137931,"implementing":0.006896551724137931,"logical":0.006896551724137931,"negation":0.006896551724137931,"in":0.006896551724137931,"conditional":0.006896551724137931,"statements":0.006896551724137931,"simplifying":0.006896551724137931,"process":0.006896551724137931,"of":0.006896551724137931,"inverting":0.006896551724137931,"boolean":0.006896551724137931,"expressions":0.006896551724137931,"enhancing":0.006896551724137931,"code":0.006896551724137931,"readability":0.006896551724137931,"and":0.006896551724137931,"maintainability":0.006896551724137931,"by":0.006896551724137931,"abstracting":0.006896551724137931,"when":0.006896551724137931,"to":0.006896551724137931,"use":0.006896551724137931,"you":0.006896551724137931,"need":0.006896551724137931,"invert":0.006896551724137931,"a":0.006896551724137931,"expression":0.006896551724137931,"implement":0.006896551724137931,"simplify":0.006896551724137931,"abstract":0.006896551724137931,"values":0.006896551724137931,"best":0.006896551724137931,"practices":0.006896551724137931,"ensure":0.006896551724137931,"meaningful":0.006896551724137931,"variable":0.006896551724137931,"names":0.006896551724137931,"better":0.006896551724137931,"combine":0.006896551724137931,"with":0.006896551724137931,"other":0.006896551724137931,"functions":0.006896551724137931,"comprehensive":0.006896551724137931,"logic":0.006896551724137931,"be":0.006896551724137931,"aware":0.006896551724137931,"performance":0.006896551724137931,"implications":0.006896551724137931,"complex":0.006896551724137931,"operations":0.006896551724137931,"practical":0.006896551724137931,"example":0.006896551724137931,"let's":0.006896551724137931,"that":0.006896551724137931,"checks":0.006896551724137931,"if":0.006896551724137931,"number":0.006896551724137931,"zero":0.006896551724137931,"define-read-only":0.006896551724137931,"is-not-zero":0.006896551724137931,"n":0.006896551724137931,"int":0.006896551724137931,"is-eq":0.006896551724137931,"usage":0.006896551724137931,"returns":0.006896551724137931,"true":0.006896551724137931,"false":0.006896551724137931,"this":0.006896551724137931,"demonstrates":0.006896551724137931,"using":0.006896551724137931,"result":0.006896551724137931,"read-only":0.006896551724137931,"check":0.006896551724137931,"handling":0.006896551724137931,"both":0.006896551724137931,"cases":0.006896551724137931,"common":0.006896551724137931,"pitfalls":0.006896551724137931,"non-boolean":0.006896551724137931,"causing":0.006896551724137931,"type":0.006896551724137931,"errors":0.006896551724137931,"assuming":0.006896551724137931,"will":0.006896551724137931,"always":0.006896551724137931,"or":0.006896551724137931,"leading":0.006896551724137931,"incorrect":0.006896551724137931,"all":0.006896551724137931,"possible":0.006896551724137931,"conditions":0.006896551724137931,"resulting":0.006896551724137931,"incomplete":0.006896551724137931,"overlooking":0.006896551724137931,"proper":0.006896551724137931,"error":0.006896551724137931,"validation":0.006896551724137931,"related":0.006896551724137931,"conjunction":0.006896551724137931,"multiple":0.006896551724137931,"disjunction":0.006896551724137931,"two":0.006896551724137931,"are":0.006896551724137931,"equal":0.006896551724137931,"conclusion":0.006896551724137931,"fundamental":0.006896551724137931,"tool":0.006896551724137931,"smart":0.006896551724137931,"contracts":0.006896551724137931,"allows":0.006896551724137931,"enabling":0.006896551724137931,"robust":0.006896551724137931,"used":0.006896551724137931,"effectively":0.006896551724137931,"enhances":0.006896551724137931,"reliability":0.006896551724137931,"your":0.006896551724137931,"contract":0.006896551724137931,"providing":0.006896551724137931,"clear":0.006896551724137931,"concise":0.006896551724137931,"way":0.006896551724137931,"manage":0.006896551724137931},"156":{"1":0.004484304932735426,"2":0.004484304932735426,"3":0.004484304932735426,"4":0.004484304932735426,"32":0.004484304932735426,"100":0.004484304932735426,"1600000000":0.004484304932735426,"callout":0.004484304932735426,"in":0.004484304932735426,"clarity":0.004484304932735426,"this":0.004484304932735426,"function":0.004484304932735426,"is":0.004484304932735426,"being":0.004484304932735426,"deprecated":0.004484304932735426,"for":0.004484304932735426,"get-stacks-block-info":0.004484304932735426,"stacks":0.004484304932735426,"functions":0.004484304932735426,"signature":0.004484304932735426,"get-block-info":0.004484304932735426,"prop-name":0.004484304932735426,"block-height":0.004484304932735426,"-":0.004484304932735426,"input":0.004484304932735426,"a":0.004484304932735426,"blockinfopropertyname":0.004484304932735426,"uint":0.004484304932735426,"representing":0.004484304932735426,"the":0.004484304932735426,"block":0.004484304932735426,"height":0.004484304932735426,"output":0.004484304932735426,"optional":0.004484304932735426,"buff":0.004484304932735426,"principal":0.004484304932735426,"depending":0.004484304932735426,"on":0.004484304932735426,"property":0.004484304932735426,"why":0.004484304932735426,"it":0.004484304932735426,"matters":0.004484304932735426,"crucial":0.004484304932735426,"accessing":0.004484304932735426,"historical":0.004484304932735426,"data":0.004484304932735426,"within":0.004484304932735426,"smart":0.004484304932735426,"contracts":0.004484304932735426,"implementing":0.004484304932735426,"time-based":0.004484304932735426,"logic":0.004484304932735426,"using":0.004484304932735426,"information":0.004484304932735426,"verifying":0.004484304932735426,"block-related":0.004484304932735426,"properties":0.004484304932735426,"security":0.004484304932735426,"or":0.004484304932735426,"validation":0.004484304932735426,"purposes":0.004484304932735426,"building":0.004484304932735426,"applications":0.004484304932735426,"that":0.004484304932735426,"need":0.004484304932735426,"to":0.004484304932735426,"reference":0.004484304932735426,"specific":0.004484304932735426,"blockchain":0.004484304932735426,"states":0.004484304932735426,"when":0.004484304932735426,"use":0.004484304932735426,"you":0.004484304932735426,"retrieve":0.004484304932735426,"about":0.004484304932735426,"past":0.004484304932735426,"blocks":0.004484304932735426,"implement":0.004484304932735426,"depends":0.004484304932735426,"times":0.004484304932735426,"miner":0.004484304932735426,"verify":0.004484304932735426,"hashes":0.004484304932735426,"other":0.004484304932735426,"block-specific":0.004484304932735426,"access":0.004484304932735426,"rewards":0.004484304932735426,"spending":0.004484304932735426,"best":0.004484304932735426,"practices":0.004484304932735426,"always":0.004484304932735426,"check":0.004484304932735426,"if":0.004484304932735426,"returned":0.004484304932735426,"value":0.004484304932735426,"none":0.004484304932735426,"as":0.004484304932735426,"will":0.004484304932735426,"be":0.004484304932735426,"non-existent":0.004484304932735426,"future":0.004484304932735426,"aware":0.004484304932735426,"of":0.004484304932735426,"potential":0.004484304932735426,"chain":0.004484304932735426,"reorganizations":0.004484304932735426,"recent":0.004484304932735426,"appropriate":0.004484304932735426,"name":0.004484304932735426,"consider":0.004484304932735426,"caching":0.004484304932735426,"results":0.004484304932735426,"frequently":0.004484304932735426,"accessed":0.004484304932735426,"save":0.004484304932735426,"execution":0.004484304932735426,"costs":0.004484304932735426,"practical":0.004484304932735426,"example":0.004484304932735426,"time":0.004484304932735426,"verification":0.004484304932735426,"let's":0.004484304932735426,"checks":0.004484304932735426,"given":0.004484304932735426,"was":0.004484304932735426,"mined":0.004484304932735426,"after":0.004484304932735426,"certain":0.004484304932735426,"define-read-only":0.004484304932735426,"block-after-time":0.004484304932735426,"blockheight":0.004484304932735426,"targettime":0.004484304932735426,"match":0.004484304932735426,"false":0.004484304932735426,"usage":0.004484304932735426,"u100":0.004484304932735426,"u1600000000":0.004484304932735426,"returns":0.004484304932735426,"true":0.004484304932735426,"unix":0.004484304932735426,"timestamp":0.004484304932735426,"demonstrates":0.004484304932735426,"handling":0.004484304932735426,"return":0.004484304932735426,"with":0.004484304932735426,"comparing":0.004484304932735426,"target":0.004484304932735426,"available":0.004484304932735426,"burnchain-header-hash":0.004484304932735426,"burnchain":0.004484304932735426,"header":0.004484304932735426,"hash":0.004484304932735426,"id-header-hash":0.004484304932735426,"block's":0.004484304932735426,"index":0.004484304932735426,"header-hash":0.004484304932735426,"miner-address":0.004484304932735426,"miner's":0.004484304932735426,"epoch":0.004484304932735426,"new":0.004484304932735426,"block-reward":0.004484304932735426,"total":0.004484304932735426,"reward":0.004484304932735426,"miner-spend-total":0.004484304932735426,"spent":0.004484304932735426,"by":0.004484304932735426,"miners":0.004484304932735426,"common":0.004484304932735426,"pitfalls":0.004484304932735426,"assuming":0.004484304932735426,"all":0.004484304932735426,"are":0.004484304932735426,"e":0.004484304932735426,"g":0.004484304932735426,"only":0.004484304932735426,"mature":0.004484304932735426,"not":0.004484304932735426,"case":0.004484304932735426,"invalid":0.004484304932735426,"relying":0.004484304932735426,"exact":0.004484304932735426,"which":0.004484304932735426,"can":0.004484304932735426,"inaccurate":0.004484304932735426,"up":0.004484304932735426,"two":0.004484304932735426,"hours":0.004484304932735426,"global":0.004484304932735426,"uniqueness":0.004484304932735426,"required":0.004484304932735426,"instead":0.004484304932735426,"related":0.004484304932735426,"get-burn-block-info":0.004484304932735426,"used":0.004484304932735426,"get":0.004484304932735426,"underlying":0.004484304932735426,"burn":0.004484304932735426,"keyword":0.004484304932735426,"current":0.004484304932735426,"burn-block-height":0.004484304932735426,"conclusion":0.004484304932735426,"powerful":0.004484304932735426,"tool":0.004484304932735426,"allows":0.004484304932735426,"incorporate":0.004484304932735426,"into":0.004484304932735426,"your":0.004484304932735426,"contract":0.004484304932735426,"enabling":0.004484304932735426,"wide":0.004484304932735426,"range":0.004484304932735426,"and":0.004484304932735426,"utilize":0.004484304932735426,"state":0.004484304932735426,"correctly":0.004484304932735426,"provides":0.004484304932735426,"valuable":0.004484304932735426,"insights":0.004484304932735426,"blockchain's":0.004484304932735426,"history":0.004484304932735426,"sophisticated":0.004484304932735426,"time-aware":0.004484304932735426,"behaviors":0.004484304932735426},"157":{"1":0.0064516129032258064,"2":0.0064516129032258064,"3":0.0064516129032258064,"4":0.0064516129032258064,"20":0.0064516129032258064,"123":0.0064516129032258064,"456":0.0064516129032258064,"262144":0.0064516129032258064,"1048576":0.0064516129032258064,"function":0.0064516129032258064,"signature":0.0064516129032258064,"clarity":0.0064516129032258064,"string-to-uint":0.0064516129032258064,"string":0.0064516129032258064,"-":0.0064516129032258064,"input":0.0064516129032258064,"string-ascii":0.0064516129032258064,"string-utf8":0.0064516129032258064,"output":0.0064516129032258064,"optional":0.0064516129032258064,"uint":0.0064516129032258064,"why":0.0064516129032258064,"it":0.0064516129032258064,"matters":0.0064516129032258064,"the":0.0064516129032258064,"is":0.0064516129032258064,"crucial":0.0064516129032258064,"for":0.0064516129032258064,"converting":0.0064516129032258064,"representations":0.0064516129032258064,"of":0.0064516129032258064,"numbers":0.0064516129032258064,"to":0.0064516129032258064,"unsigned":0.0064516129032258064,"integers":0.0064516129032258064,"implementing":0.0064516129032258064,"logic":0.0064516129032258064,"that":0.0064516129032258064,"requires":0.0064516129032258064,"numeric":0.0064516129032258064,"values":0.0064516129032258064,"from":0.0064516129032258064,"inputs":0.0064516129032258064,"ensuring":0.0064516129032258064,"data":0.0064516129032258064,"integrity":0.0064516129032258064,"by":0.0064516129032258064,"validating":0.0064516129032258064,"string-to-unsigned-integer":0.0064516129032258064,"conversions":0.0064516129032258064,"simplifying":0.0064516129032258064,"process":0.0064516129032258064,"handling":0.0064516129032258064,"in":0.0064516129032258064,"smart":0.0064516129032258064,"contracts":0.0064516129032258064,"when":0.0064516129032258064,"use":0.0064516129032258064,"you":0.0064516129032258064,"need":0.0064516129032258064,"convert":0.0064516129032258064,"a":0.0064516129032258064,"representation":0.0064516129032258064,"number":0.0064516129032258064,"an":0.0064516129032258064,"integer":0.0064516129032258064,"implement":0.0064516129032258064,"validate":0.0064516129032258064,"ensure":0.0064516129032258064,"handle":0.0064516129032258064,"your":0.0064516129032258064,"contract":0.0064516129032258064,"best":0.0064516129032258064,"practices":0.0064516129032258064,"correctly":0.0064516129032258064,"formatted":0.0064516129032258064,"and":0.0064516129032258064,"represents":0.0064516129032258064,"valid":0.0064516129032258064,"meaningful":0.0064516129032258064,"variable":0.0064516129032258064,"names":0.0064516129032258064,"better":0.0064516129032258064,"readability":0.0064516129032258064,"combine":0.0064516129032258064,"with":0.0064516129032258064,"other":0.0064516129032258064,"functions":0.0064516129032258064,"comprehensive":0.0064516129032258064,"management":0.0064516129032258064,"possible":0.0064516129032258064,"error":0.0064516129032258064,"cases":0.0064516129032258064,"robust":0.0064516129032258064,"behavior":0.0064516129032258064,"practical":0.0064516129032258064,"example":0.0064516129032258064,"let's":0.0064516129032258064,"converts":0.0064516129032258064,"define-read-only":0.0064516129032258064,"convert-string-to-uint":0.0064516129032258064,"usage":0.0064516129032258064,"returns":0.0064516129032258064,"some":0.0064516129032258064,"u123":0.0064516129032258064,"u456":0.0064516129032258064,"abc":0.0064516129032258064,"none":0.0064516129032258064,"this":0.0064516129032258064,"demonstrates":0.0064516129032258064,"using":0.0064516129032258064,"public":0.0064516129032258064,"conversion":0.0064516129032258064,"both":0.0064516129032258064,"invalid":0.0064516129032258064,"common":0.0064516129032258064,"pitfalls":0.0064516129032258064,"incorrectly":0.0064516129032258064,"or":0.0064516129032258064,"causing":0.0064516129032258064,"operation":0.0064516129032258064,"return":0.0064516129032258064,"assuming":0.0064516129032258064,"will":0.0064516129032258064,"always":0.0064516129032258064,"succeed":0.0064516129032258064,"leading":0.0064516129032258064,"unhandled":0.0064516129032258064,"not":0.0064516129032258064,"all":0.0064516129032258064,"conditions":0.0064516129032258064,"resulting":0.0064516129032258064,"incomplete":0.0064516129032258064,"overlooking":0.0064516129032258064,"proper":0.0064516129032258064,"validation":0.0064516129032258064,"related":0.0064516129032258064,"string-to-int":0.0064516129032258064,"signed":0.0064516129032258064,"int-to-ascii":0.0064516129032258064,"int-to-utf8":0.0064516129032258064,"conclusion":0.0064516129032258064,"fundamental":0.0064516129032258064,"tool":0.0064516129032258064,"allows":0.0064516129032258064,"used":0.0064516129032258064,"effectively":0.0064516129032258064,"enhances":0.0064516129032258064,"reliability":0.0064516129032258064,"maintainability":0.0064516129032258064,"code":0.0064516129032258064,"providing":0.0064516129032258064,"clear":0.0064516129032258064,"concise":0.0064516129032258064,"way":0.0064516129032258064},"158":{"1":0.005714285714285714,"2":0.005714285714285714,"3":0.005714285714285714,"4":0.005714285714285714,"16":0.005714285714285714,"function":0.005714285714285714,"signature":0.005714285714285714,"clarity":0.005714285714285714,"buff-to-uint-le":0.005714285714285714,"buff":0.005714285714285714,"-":0.005714285714285714,"input":0.005714285714285714,"a":0.005714285714285714,"byte":0.005714285714285714,"buffer":0.005714285714285714,"of":0.005714285714285714,"up":0.005714285714285714,"to":0.005714285714285714,"bytes":0.005714285714285714,"output":0.005714285714285714,"an":0.005714285714285714,"unsigned":0.005714285714285714,"integer":0.005714285714285714,"uint":0.005714285714285714,"why":0.005714285714285714,"it":0.005714285714285714,"matters":0.005714285714285714,"the":0.005714285714285714,"is":0.005714285714285714,"crucial":0.005714285714285714,"for":0.005714285714285714,"converting":0.005714285714285714,"data":0.005714285714285714,"integers":0.005714285714285714,"using":0.005714285714285714,"little-endian":0.005714285714285714,"encoding":0.005714285714285714,"handling":0.005714285714285714,"from":0.005714285714285714,"external":0.005714285714285714,"sources":0.005714285714285714,"or":0.005714285714285714,"other":0.005714285714285714,"contracts":0.005714285714285714,"that":0.005714285714285714,"use":0.005714285714285714,"implementing":0.005714285714285714,"protocols":0.005714285714285714,"algorithms":0.005714285714285714,"require":0.005714285714285714,"representation":0.005714285714285714,"interoperating":0.005714285714285714,"with":0.005714285714285714,"systems":0.005714285714285714,"order":0.005714285714285714,"when":0.005714285714285714,"you":0.005714285714285714,"need":0.005714285714285714,"convert":0.005714285714285714,"encoded":0.005714285714285714,"process":0.005714285714285714,"represents":0.005714285714285714,"in":0.005714285714285714,"format":0.005714285714285714,"implement":0.005714285714285714,"cryptographic":0.005714285714285714,"mathematical":0.005714285714285714,"operations":0.005714285714285714,"expect":0.005714285714285714,"inputs":0.005714285714285714,"ensure":0.005714285714285714,"compatibility":0.005714285714285714,"best":0.005714285714285714,"practices":0.005714285714285714,"no":0.005714285714285714,"larger":0.005714285714285714,"than":0.005714285714285714,"avoid":0.005714285714285714,"errors":0.005714285714285714,"be":0.005714285714285714,"aware":0.005714285714285714,"smaller":0.005714285714285714,"buffers":0.005714285714285714,"are":0.005714285714285714,"zero-padded":0.005714285714285714,"on":0.005714285714285714,"right":0.005714285714285714,"affecting":0.005714285714285714,"resulting":0.005714285714285714,"value":0.005714285714285714,"buff-to-int-le":0.005714285714285714,"if":0.005714285714285714,"handle":0.005714285714285714,"signed":0.005714285714285714,"instead":0.005714285714285714,"potential":0.005714285714285714,"might":0.005714285714285714,"invalid":0.005714285714285714,"empty":0.005714285714285714,"practical":0.005714285714285714,"example":0.005714285714285714,"decoding":0.005714285714285714,"let's":0.005714285714285714,"processes":0.005714285714285714,"containing":0.005714285714285714,"define-read-only":0.005714285714285714,"process-external-data-le":0.005714285714285714,"let":0.005714285714285714,"u1000000":0.005714285714285714,"err":0.005714285714285714,"too":0.005714285714285714,"large":0.005714285714285714,"ok":0.005714285714285714,"usage":0.005714285714285714,"0x01000000":0.005714285714285714,"returns":0.005714285714285714,"u1":0.005714285714285714,"0x40420f00":0.005714285714285714,"0x80969800":0.005714285714285714,"this":0.005714285714285714,"demonstrates":0.005714285714285714,"validation":0.005714285714285714,"based":0.005714285714285714,"converted":0.005714285714285714,"different":0.005714285714285714,"sizes":0.005714285714285714,"and":0.005714285714285714,"values":0.005714285714285714,"common":0.005714285714285714,"pitfalls":0.005714285714285714,"confusing":0.005714285714285714,"big-endian":0.005714285714285714,"leading":0.005714285714285714,"incorrect":0.005714285714285714,"not":0.005714285714285714,"considering":0.005714285714285714,"full":0.005714285714285714,"range":0.005714285714285714,"possible":0.005714285714285714,"processing":0.005714285714285714,"result":0.005714285714285714,"assuming":0.005714285714285714,"specific":0.005714285714285714,"length":0.005714285714285714,"which":0.005714285714285714,"could":0.005714285714285714,"lead":0.005714285714285714,"unexpected":0.005714285714285714,"results":0.005714285714285714,"shorter":0.005714285714285714,"due":0.005714285714285714,"right-padding":0.005714285714285714,"related":0.005714285714285714,"functions":0.005714285714285714,"buff-to-uint-be":0.005714285714285714,"converts":0.005714285714285714,"uint-to-buff":0.005714285714285714,"conclusion":0.005714285714285714,"powerful":0.005714285714285714,"tool":0.005714285714285714,"working":0.005714285714285714,"smart":0.005714285714285714,"by":0.005714285714285714,"understanding":0.005714285714285714,"its":0.005714285714285714,"behavior":0.005714285714285714,"edge":0.005714285714285714,"cases":0.005714285714285714,"can":0.005714285714285714,"effectively":0.005714285714285714,"validate":0.005714285714285714,"complex":0.005714285714285714,"your":0.005714285714285714,"contract":0.005714285714285714,"applications":0.005714285714285714},"159":{"1":0.006666666666666667,"2":0.006666666666666667,"3":0.006666666666666667,"4":0.006666666666666667,"42":0.006666666666666667,"function":0.006666666666666667,"signature":0.006666666666666667,"clarity":0.006666666666666667,"unwrap-err":0.006666666666666667,"response-input":0.006666666666666667,"thrown-value":0.006666666666666667,"-":0.006666666666666667,"input":0.006666666666666667,"response":0.006666666666666667,"a":0.006666666666666667,"b":0.006666666666666667,"c":0.006666666666666667,"output":0.006666666666666667,"why":0.006666666666666667,"it":0.006666666666666667,"matters":0.006666666666666667,"the":0.006666666666666667,"is":0.006666666666666667,"crucial":0.006666666666666667,"for":0.006666666666666667,"unpacking":0.006666666666666667,"error":0.006666666666666667,"responses":0.006666666666666667,"to":0.006666666666666667,"access":0.006666666666666667,"their":0.006666666666666667,"inner":0.006666666666666667,"values":0.006666666666666667,"implementing":0.006666666666666667,"logic":0.006666666666666667,"that":0.006666666666666667,"requires":0.006666666666666667,"handling":0.006666666666666667,"ensuring":0.006666666666666667,"data":0.006666666666666667,"integrity":0.006666666666666667,"by":0.006666666666666667,"validating":0.006666666666666667,"process":0.006666666666666667,"simplifying":0.006666666666666667,"of":0.006666666666666667,"in":0.006666666666666667,"smart":0.006666666666666667,"contracts":0.006666666666666667,"when":0.006666666666666667,"use":0.006666666666666667,"you":0.006666666666666667,"need":0.006666666666666667,"unpack":0.006666666666666667,"implement":0.006666666666666667,"validate":0.006666666666666667,"ensure":0.006666666666666667,"handle":0.006666666666666667,"your":0.006666666666666667,"contract":0.006666666666666667,"best":0.006666666666666667,"practices":0.006666666666666667,"value":0.006666666666666667,"type":0.006666666666666667,"meaningful":0.006666666666666667,"variable":0.006666666666666667,"names":0.006666666666666667,"better":0.006666666666666667,"readability":0.006666666666666667,"combine":0.006666666666666667,"with":0.006666666666666667,"other":0.006666666666666667,"functions":0.006666666666666667,"comprehensive":0.006666666666666667,"management":0.006666666666666667,"possible":0.006666666666666667,"cases":0.006666666666666667,"robust":0.006666666666666667,"behavior":0.006666666666666667,"practical":0.006666666666666667,"example":0.006666666666666667,"an":0.006666666666666667,"let's":0.006666666666666667,"processes":0.006666666666666667,"using":0.006666666666666667,"define-public":0.006666666666666667,"process-error-response":0.006666666666666667,"int":0.006666666666666667,"let":0.006666666666666667,"errorvalue":0.006666666666666667,"err":0.006666666666666667,"no":0.006666666666666667,"found":0.006666666666666667,"ok":0.006666666666666667,"usage":0.006666666666666667,"returns":0.006666666666666667,"this":0.006666666666666667,"demonstrates":0.006666666666666667,"public":0.006666666666666667,"both":0.006666666666666667,"successful":0.006666666666666667,"and":0.006666666666666667,"common":0.006666666666666667,"pitfalls":0.006666666666666667,"are":0.006666666666666667,"not":0.006666666666666667,"types":0.006666666666666667,"causing":0.006666666666666667,"runtime":0.006666666666666667,"errors":0.006666666666666667,"assuming":0.006666666666666667,"will":0.006666666666666667,"always":0.006666666666666667,"succeed":0.006666666666666667,"leading":0.006666666666666667,"unhandled":0.006666666666666667,"all":0.006666666666666667,"conditions":0.006666666666666667,"resulting":0.006666666666666667,"incomplete":0.006666666666666667,"overlooking":0.006666666666666667,"proper":0.006666666666666667,"validation":0.006666666666666667,"related":0.006666666666666667,"unwrap":0.006666666666666667,"unpacks":0.006666666666666667,"optional":0.006666666666666667,"returning":0.006666666666666667,"thrown":0.006666666666666667,"if":0.006666666666666667,"fails":0.006666666666666667,"unwrap-panic":0.006666666666666667,"throwing":0.006666666666666667,"try":0.006666666666666667,"none":0.006666666666666667,"or":0.006666666666666667,"conclusion":0.006666666666666667,"fundamental":0.006666666666666667,"tool":0.006666666666666667,"allows":0.006666666666666667,"used":0.006666666666666667,"effectively":0.006666666666666667,"enhances":0.006666666666666667,"reliability":0.006666666666666667,"maintainability":0.006666666666666667,"code":0.006666666666666667,"providing":0.006666666666666667,"clear":0.006666666666666667,"concise":0.006666666666666667,"way":0.006666666666666667},"160":{"1":0.005291005291005291,"2":0.005291005291005291,"3":0.005291005291005291,"4":0.005291005291005291,"function":0.005291005291005291,"signature":0.005291005291005291,"clarity":0.005291005291005291,"define-fungible-token":0.005291005291005291,"token-name":0.005291005291005291,"total-supply":0.005291005291005291,"-":0.005291005291005291,"input":0.005291005291005291,"the":0.005291005291005291,"name":0.005291005291005291,"of":0.005291005291005291,"fungible":0.005291005291005291,"token":0.005291005291005291,"optional":0.005291005291005291,"an":0.005291005291005291,"unsigned":0.005291005291005291,"integer":0.005291005291005291,"representing":0.005291005291005291,"total":0.005291005291005291,"supply":0.005291005291005291,"tokens":0.005291005291005291,"output":0.005291005291005291,"not":0.005291005291005291,"applicable":0.005291005291005291,"definition":0.005291005291005291,"statement":0.005291005291005291,"why":0.005291005291005291,"it":0.005291005291005291,"matters":0.005291005291005291,"is":0.005291005291005291,"crucial":0.005291005291005291,"for":0.005291005291005291,"creating":0.005291005291005291,"new":0.005291005291005291,"within":0.005291005291005291,"a":0.005291005291005291,"smart":0.005291005291005291,"contract":0.005291005291005291,"establishing":0.005291005291005291,"economy":0.005291005291005291,"or":0.005291005291005291,"system":0.005291005291005291,"your":0.005291005291005291,"dapp":0.005291005291005291,"implementing":0.005291005291005291,"custom":0.005291005291005291,"with":0.005291005291005291,"specific":0.005291005291005291,"constraints":0.005291005291005291,"enabling":0.005291005291005291,"token-related":0.005291005291005291,"operations":0.005291005291005291,"like":0.005291005291005291,"minting":0.005291005291005291,"transferring":0.005291005291005291,"and":0.005291005291005291,"burning":0.005291005291005291,"when":0.005291005291005291,"to":0.005291005291005291,"use":0.005291005291005291,"you":0.005291005291005291,"need":0.005291005291005291,"create":0.005291005291005291,"implement":0.005291005291005291,"fixed":0.005291005291005291,"establish":0.005291005291005291,"foundation":0.005291005291005291,"token-based":0.005291005291005291,"features":0.005291005291005291,"in":0.005291005291005291,"utility":0.005291005291005291,"governance":0.005291005291005291,"other":0.005291005291005291,"assets":0.005291005291005291,"best":0.005291005291005291,"practices":0.005291005291005291,"place":0.005291005291005291,"at":0.005291005291005291,"top":0.005291005291005291,"level":0.005291005291005291,"as":0.005291005291005291,"it's":0.005291005291005291,"consider":0.005291005291005291,"carefully":0.005291005291005291,"whether":0.005291005291005291,"specify":0.005291005291005291,"leave":0.005291005291005291,"unlimited":0.005291005291005291,"meaningful":0.005291005291005291,"descriptive":0.005291005291005291,"names":0.005291005291005291,"proper":0.005291005291005291,"access":0.005291005291005291,"controls":0.005291005291005291,"if":0.005291005291005291,"required":0.005291005291005291,"practical":0.005291005291005291,"example":0.005291005291005291,"simple":0.005291005291005291,"creation":0.005291005291005291,"let's":0.005291005291005291,"basic":0.005291005291005291,"dog-go-to-the-moon":0.005291005291005291,"u1000000":0.005291005291005291,"define-data-var":0.005291005291005291,"tokenadmin":0.005291005291005291,"principal":0.005291005291005291,"tx-sender":0.005291005291005291,"define-public":0.005291005291005291,"transfer":0.005291005291005291,"amount":0.005291005291005291,"uint":0.005291005291005291,"sender":0.005291005291005291,"recipient":0.005291005291005291,"begin":0.005291005291005291,"asserts":0.005291005291005291,"is-eq":0.005291005291005291,"err":0.005291005291005291,"u1":0.005291005291005291,"ft-transfer":0.005291005291005291,"define-read-only":0.005291005291005291,"get-balance":0.005291005291005291,"account":0.005291005291005291,"ok":0.005291005291005291,"ft-get-balance":0.005291005291005291,"mint":0.005291005291005291,"var-get":0.005291005291005291,"u3":0.005291005291005291,"ft-mint":0.005291005291005291,"this":0.005291005291005291,"demonstrates":0.005291005291005291,"using":0.005291005291005291,"000":0.005291005291005291,"balance":0.005291005291005291,"checking":0.005291005291005291,"adding":0.005291005291005291,"admin-only":0.005291005291005291,"control":0.005291005291005291,"common":0.005291005291005291,"pitfalls":0.005291005291005291,"forgetting":0.005291005291005291,"that":0.005291005291005291,"omitting":0.005291005291005291,"parameter":0.005291005291005291,"allows":0.005291005291005291,"handled":0.005291005291005291,"manually":0.005291005291005291,"sensitive":0.005291005291005291,"overlooking":0.005291005291005291,"additional":0.005291005291005291,"functionality":0.005291005291005291,"pausing":0.005291005291005291,"related":0.005291005291005291,"functions":0.005291005291005291,"used":0.005291005291005291,"between":0.005291005291005291,"principals":0.005291005291005291,"allowed":0.005291005291005291,"by":0.005291005291005291,"ft-burn":0.005291005291005291,"destroy":0.005291005291005291,"reducing":0.005291005291005291,"circulating":0.005291005291005291,"check":0.005291005291005291,"ft-get-supply":0.005291005291005291,"get":0.005291005291005291,"current":0.005291005291005291,"conclusion":0.005291005291005291,"fundamental":0.005291005291005291,"building":0.005291005291005291,"block":0.005291005291005291,"systems":0.005291005291005291,"contracts":0.005291005291005291,"define":0.005291005291005291,"without":0.005291005291005291,"combined":0.005291005291005291,"enables":0.005291005291005291,"implementation":0.005291005291005291,"sophisticated":0.005291005291005291,"economies":0.005291005291005291,"financial":0.005291005291005291,"instruments":0.005291005291005291,"on":0.005291005291005291,"stacks":0.005291005291005291,"blockchain":0.005291005291005291},"161":{"1":0.004975124378109453,"2":0.004975124378109453,"3":0.004975124378109453,"4":0.004975124378109453,"32":0.004975124378109453,"50":0.004975124378109453,"function":0.004975124378109453,"signature":0.004975124378109453,"clarity":0.004975124378109453,"at-block":0.004975124378109453,"id-block-hash":0.004975124378109453,"expr":0.004975124378109453,"-":0.004975124378109453,"input":0.004975124378109453,"a":0.004975124378109453,"32-byte":0.004975124378109453,"buffer":0.004975124378109453,"representing":0.004975124378109453,"block":0.004975124378109453,"hash":0.004975124378109453,"an":0.004975124378109453,"expression":0.004975124378109453,"to":0.004975124378109453,"be":0.004975124378109453,"evaluated":0.004975124378109453,"output":0.004975124378109453,"the":0.004975124378109453,"result":0.004975124378109453,"of":0.004975124378109453,"evaluating":0.004975124378109453,"why":0.004975124378109453,"it":0.004975124378109453,"matters":0.004975124378109453,"is":0.004975124378109453,"crucial":0.004975124378109453,"for":0.004975124378109453,"accessing":0.004975124378109453,"historical":0.004975124378109453,"contract":0.004975124378109453,"state":0.004975124378109453,"at":0.004975124378109453,"specific":0.004975124378109453,"implementing":0.004975124378109453,"time-dependent":0.004975124378109453,"logic":0.004975124378109453,"based":0.004975124378109453,"on":0.004975124378109453,"blockchain":0.004975124378109453,"verifying":0.004975124378109453,"past":0.004975124378109453,"conditions":0.004975124378109453,"or":0.004975124378109453,"values":0.004975124378109453,"in":0.004975124378109453,"creating":0.004975124378109453,"mechanisms":0.004975124378109453,"that":0.004975124378109453,"depend":0.004975124378109453,"checkpoints":0.004975124378109453,"when":0.004975124378109453,"use":0.004975124378109453,"you":0.004975124378109453,"need":0.004975124378109453,"evaluate":0.004975124378109453,"expressions":0.004975124378109453,"as":0.004975124378109453,"they":0.004975124378109453,"were":0.004975124378109453,"implement":0.004975124378109453,"depends":0.004975124378109453,"data":0.004975124378109453,"verify":0.004975124378109453,"without":0.004975124378109453,"relying":0.004975124378109453,"stored":0.004975124378109453,"create":0.004975124378109453,"time-locked":0.004975124378109453,"checkpoint-based":0.004975124378109453,"features":0.004975124378109453,"your":0.004975124378109453,"best":0.004975124378109453,"practices":0.004975124378109453,"only":0.004975124378109453,"necessary":0.004975124378109453,"can":0.004975124378109453,"computationally":0.004975124378109453,"expensive":0.004975124378109453,"ensure":0.004975124378109453,"used":0.004975124378109453,"from":0.004975124378109453,"id-header-hash":0.004975124378109453,"property":0.004975124378109453,"not":0.004975124378109453,"header-hash":0.004975124378109453,"read-only":0.004975124378109453,"within":0.004975124378109453,"maintain":0.004975124378109453,"determinism":0.004975124378109453,"aware":0.004975124378109453,"potential":0.004975124378109453,"chain":0.004975124378109453,"reorganizations":0.004975124378109453,"using":0.004975124378109453,"recent":0.004975124378109453,"hashes":0.004975124378109453,"practical":0.004975124378109453,"example":0.004975124378109453,"price":0.004975124378109453,"check":0.004975124378109453,"let's":0.004975124378109453,"simple":0.004975124378109453,"checks":0.004975124378109453,"if":0.004975124378109453,"was":0.004975124378109453,"above":0.004975124378109453,"certain":0.004975124378109453,"threshold":0.004975124378109453,"define-map":0.004975124378109453,"assetprices":0.004975124378109453,"uint":0.004975124378109453,"define-public":0.004975124378109453,"set-price":0.004975124378109453,"ok":0.004975124378109453,"map-set":0.004975124378109453,"block-height":0.004975124378109453,"define-read-only":0.004975124378109453,"was-price-above-at-block":0.004975124378109453,"blockhash":0.004975124378109453,"buff":0.004975124378109453,"let":0.004975124378109453,"pastprice":0.004975124378109453,"default-to":0.004975124378109453,"u0":0.004975124378109453,"map-get":0.004975124378109453,"usage":0.004975124378109453,"u100":0.004975124378109453,"several":0.004975124378109453,"blocks":0.004975124378109453,"later":0.004975124378109453,"u50":0.004975124378109453,"0x123456":0.004975124378109453,"returns":0.004975124378109453,"true":0.004975124378109453,"specified":0.004975124378109453,"this":0.004975124378109453,"demonstrates":0.004975124378109453,"condition":0.004975124378109453,"combining":0.004975124378109453,"with":0.004975124378109453,"map":0.004975124378109453,"lookups":0.004975124378109453,"access":0.004975124378109453,"history":0.004975124378109453,"common":0.004975124378109453,"pitfalls":0.004975124378109453,"instead":0.004975124378109453,"which":0.004975124378109453,"lead":0.004975124378109453,"inconsistencies":0.004975124378109453,"across":0.004975124378109453,"forks":0.004975124378109453,"attempting":0.004975124378109453,"modify":0.004975124378109453,"allowed":0.004975124378109453,"overusing":0.004975124378109453,"performance":0.004975124378109453,"issues":0.004975124378109453,"due":0.004975124378109453,"cost":0.004975124378109453,"related":0.004975124378109453,"functions":0.004975124378109453,"get-block-info":0.004975124378109453,"retrieve":0.004975124378109453,"information":0.004975124378109453,"about":0.004975124378109453,"often":0.004975124378109453,"conjunction":0.004975124378109453,"time-based":0.004975124378109453,"provides":0.004975124378109453,"correct":0.004975124378109453,"conclusion":0.004975124378109453,"powerful":0.004975124378109453,"tool":0.004975124378109453,"history-dependent":0.004975124378109453,"smart":0.004975124378109453,"contracts":0.004975124378109453,"by":0.004975124378109453,"allowing":0.004975124378109453,"would":0.004975124378109453,"have":0.004975124378109453,"enables":0.004975124378109453,"sophisticated":0.004975124378109453,"and":0.004975124378109453,"verifications":0.004975124378109453,"however":0.004975124378109453,"should":0.004975124378109453,"judiciously":0.004975124378109453,"its":0.004975124378109453,"impact":0.004975124378109453,"complexities":0.004975124378109453,"working":0.004975124378109453},"162":{"1":0.00641025641025641,"2":0.00641025641025641,"3":0.00641025641025641,"4":0.00641025641025641,"32":0.00641025641025641,"33":0.00641025641025641,"65":0.00641025641025641,"function":0.00641025641025641,"signature":0.00641025641025641,"clarity":0.00641025641025641,"secp256k1-recover":0.00641025641025641,"message-hash":0.00641025641025641,"-":0.00641025641025641,"input":0.00641025641025641,"buff":0.00641025641025641,"output":0.00641025641025641,"response":0.00641025641025641,"uint":0.00641025641025641,"why":0.00641025641025641,"it":0.00641025641025641,"matters":0.00641025641025641,"the":0.00641025641025641,"is":0.00641025641025641,"crucial":0.00641025641025641,"for":0.00641025641025641,"verifying":0.00641025641025641,"authenticity":0.00641025641025641,"of":0.00641025641025641,"a":0.00641025641025641,"message":0.00641025641025641,"by":0.00641025641025641,"recovering":0.00641025641025641,"public":0.00641025641025641,"key":0.00641025641025641,"from":0.00641025641025641,"implementing":0.00641025641025641,"cryptographic":0.00641025641025641,"verification":0.00641025641025641,"in":0.00641025641025641,"smart":0.00641025641025641,"contracts":0.00641025641025641,"ensuring":0.00641025641025641,"data":0.00641025641025641,"integrity":0.00641025641025641,"validating":0.00641025641025641,"signatures":0.00641025641025641,"simplifying":0.00641025641025641,"process":0.00641025641025641,"handling":0.00641025641025641,"operations":0.00641025641025641,"when":0.00641025641025641,"to":0.00641025641025641,"use":0.00641025641025641,"you":0.00641025641025641,"need":0.00641025641025641,"verify":0.00641025641025641,"implement":0.00641025641025641,"your":0.00641025641025641,"contract":0.00641025641025641,"validate":0.00641025641025641,"ensure":0.00641025641025641,"handle":0.00641025641025641,"best":0.00641025641025641,"practices":0.00641025641025641,"and":0.00641025641025641,"are":0.00641025641025641,"correctly":0.00641025641025641,"formatted":0.00641025641025641,"valid":0.00641025641025641,"meaningful":0.00641025641025641,"variable":0.00641025641025641,"names":0.00641025641025641,"better":0.00641025641025641,"readability":0.00641025641025641,"combine":0.00641025641025641,"with":0.00641025641025641,"other":0.00641025641025641,"functions":0.00641025641025641,"comprehensive":0.00641025641025641,"security":0.00641025641025641,"management":0.00641025641025641,"possible":0.00641025641025641,"error":0.00641025641025641,"cases":0.00641025641025641,"robust":0.00641025641025641,"behavior":0.00641025641025641,"practical":0.00641025641025641,"example":0.00641025641025641,"let's":0.00641025641025641,"that":0.00641025641025641,"recovers":0.00641025641025641,"hash":0.00641025641025641,"define-read-only":0.00641025641025641,"recover-public-key":0.00641025641025641,"messagehash":0.00641025641025641,"usage":0.00641025641025641,"0xde5b9eb9e7c5592930eb2e30a01369c36586d872082ed8181ee83d2a0ec20f04":0.00641025641025641,"0x8738487ebe69b93d8e51583be8eee50bb4213fc49c767d329632730cc193b873554428fc936ca3569afc15f1c9365f6591d6251a89fee9c9ac661116824d3a1301":0.00641025641025641,"returns":0.00641025641025641,"ok":0.00641025641025641,"0x03adb8de4bfb65db2cfd6120d55c6526ae9c52e675db7e47308636534ba7786110":0.00641025641025641,"this":0.00641025641025641,"demonstrates":0.00641025641025641,"using":0.00641025641025641,"recover":0.00641025641025641,"recovery":0.00641025641025641,"both":0.00641025641025641,"successful":0.00641025641025641,"common":0.00641025641025641,"pitfalls":0.00641025641025641,"incorrectly":0.00641025641025641,"or":0.00641025641025641,"invalid":0.00641025641025641,"causing":0.00641025641025641,"operation":0.00641025641025641,"fail":0.00641025641025641,"assuming":0.00641025641025641,"will":0.00641025641025641,"always":0.00641025641025641,"be":0.00641025641025641,"leading":0.00641025641025641,"unhandled":0.00641025641025641,"not":0.00641025641025641,"all":0.00641025641025641,"conditions":0.00641025641025641,"resulting":0.00641025641025641,"incomplete":0.00641025641025641,"overlooking":0.00641025641025641,"proper":0.00641025641025641,"validation":0.00641025641025641,"related":0.00641025641025641,"principal-of":0.00641025641025641,"principal":0.00641025641025641,"derived":0.00641025641025641,"hash160":0.00641025641025641,"computes":0.00641025641025641,"ripemd-160":0.00641025641025641,"sha-256":0.00641025641025641,"sha256":0.00641025641025641,"conclusion":0.00641025641025641,"fundamental":0.00641025641025641,"tool":0.00641025641025641,"keys":0.00641025641025641,"hashes":0.00641025641025641,"allows":0.00641025641025641,"messages":0.00641025641025641,"used":0.00641025641025641,"effectively":0.00641025641025641,"enhances":0.00641025641025641,"reliability":0.00641025641025641,"maintainability":0.00641025641025641,"code":0.00641025641025641,"providing":0.00641025641025641,"clear":0.00641025641025641,"concise":0.00641025641025641,"way":0.00641025641025641},"163":{"1":0.005235602094240838,"2":0.005235602094240838,"3":0.005235602094240838,"4":0.005235602094240838,"function":0.005235602094240838,"signature":0.005235602094240838,"clarity":0.005235602094240838,"begin":0.005235602094240838,"expr1":0.005235602094240838,"expr2":0.005235602094240838,"expr3":0.005235602094240838,"expr-last":0.005235602094240838,"-":0.005235602094240838,"input":0.005235602094240838,"two":0.005235602094240838,"or":0.005235602094240838,"more":0.005235602094240838,"expressions":0.005235602094240838,"of":0.005235602094240838,"any":0.005235602094240838,"type":0.005235602094240838,"output":0.005235602094240838,"the":0.005235602094240838,"value":0.005235602094240838,"last":0.005235602094240838,"expression":0.005235602094240838,"why":0.005235602094240838,"it":0.005235602094240838,"matters":0.005235602094240838,"is":0.005235602094240838,"crucial":0.005235602094240838,"for":0.005235602094240838,"grouping":0.005235602094240838,"multiple":0.005235602094240838,"into":0.005235602094240838,"a":0.005235602094240838,"single":0.005235602094240838,"executing":0.005235602094240838,"series":0.005235602094240838,"operations":0.005235602094240838,"in":0.005235602094240838,"specific":0.005235602094240838,"order":0.005235602094240838,"creating":0.005235602094240838,"complex":0.005235602094240838,"logic":0.005235602094240838,"flows":0.005235602094240838,"within":0.005235602094240838,"functions":0.005235602094240838,"conditions":0.005235602094240838,"allowing":0.005235602094240838,"side":0.005235602094240838,"effects":0.005235602094240838,"while":0.005235602094240838,"returning":0.005235602094240838,"when":0.005235602094240838,"to":0.005235602094240838,"use":0.005235602094240838,"you":0.005235602094240838,"need":0.005235602094240838,"perform":0.005235602094240838,"sequence":0.005235602094240838,"execute":0.005235602094240838,"before":0.005235602094240838,"final":0.005235602094240838,"group":0.005235602094240838,"where":0.005235602094240838,"only":0.005235602094240838,"one":0.005235602094240838,"allowed":0.005235602094240838,"e":0.005235602094240838,"g":0.005235602094240838,"bodies":0.005235602094240838,"condition":0.005235602094240838,"branches":0.005235602094240838,"create":0.005235602094240838,"multi-step":0.005235602094240838,"your":0.005235602094240838,"smart":0.005235602094240838,"contract":0.005235602094240838,"best":0.005235602094240838,"practices":0.005235602094240838,"keep":0.005235602094240838,"related":0.005235602094240838,"together":0.005235602094240838,"better":0.005235602094240838,"readability":0.005235602094240838,"ensure":0.005235602094240838,"that":0.005235602094240838,"return":0.005235602094240838,"response":0.005235602094240838,"ok":0.005235602094240838,"err":0.005235602094240838,"are":0.005235602094240838,"properly":0.005235602094240838,"checked":0.005235602094240838,"be":0.005235602094240838,"mindful":0.005235602094240838,"as":0.005235602094240838,"they":0.005235602094240838,"evaluated":0.005235602094240838,"sequentially":0.005235602094240838,"make":0.005235602094240838,"code":0.005235602094240838,"expressive":0.005235602094240838,"and":0.005235602094240838,"easier":0.005235602094240838,"understand":0.005235602094240838,"practical":0.005235602094240838,"example":0.005235602094240838,"user":0.005235602094240838,"registration":0.005235602094240838,"with":0.005235602094240838,"logging":0.005235602094240838,"let's":0.005235602094240838,"implement":0.005235602094240838,"simple":0.005235602094240838,"performs":0.005235602094240838,"actions":0.005235602094240838,"define-map":0.005235602094240838,"users":0.005235602094240838,"principal":0.005235602094240838,"bool":0.005235602094240838,"define-data-var":0.005235602094240838,"usercount":0.005235602094240838,"uint":0.005235602094240838,"u0":0.005235602094240838,"define-public":0.005235602094240838,"register-user":0.005235602094240838,"asserts":0.005235602094240838,"is-none":0.005235602094240838,"map-get":0.005235602094240838,"tx-sender":0.005235602094240838,"u1":0.005235602094240838,"map-set":0.005235602094240838,"true":0.005235602094240838,"var-set":0.005235602094240838,"var-get":0.005235602094240838,"print":0.005235602094240838,"registered":0.005235602094240838,"usage":0.005235602094240838,"returns":0.005235602094240838,"logs":0.005235602094240838,"new":0.005235602094240838,"this":0.005235602094240838,"demonstrates":0.005235602094240838,"using":0.005235602094240838,"performing":0.005235602094240838,"checks":0.005235602094240838,"updates":0.005235602094240838,"printing":0.005235602094240838,"common":0.005235602094240838,"pitfalls":0.005235602094240838,"forgetting":0.005235602094240838,"block":0.005235602094240838,"not":0.005235602094240838,"handling":0.005235602094240838,"responses":0.005235602094240838,"from":0.005235602094240838,"relying":0.005235602094240838,"on":0.005235602094240838,"earlier":0.005235602094240838,"without":0.005235602094240838,"considering":0.005235602094240838,"their":0.005235602094240838,"execution":0.005235602094240838,"let":0.005235602094240838,"used":0.005235602094240838,"local":0.005235602094240838,"bindings":0.005235602094240838,"limited":0.005235602094240838,"scope":0.005235602094240838,"often":0.005235602094240838,"blocks":0.005235602094240838,"checking":0.005235602094240838,"useful":0.005235602094240838,"during":0.005235602094240838,"development":0.005235602094240838,"conclusion":0.005235602094240838,"fundamental":0.005235602094240838,"tool":0.005235602094240838,"by":0.005235602094240838,"enhances":0.005235602094240838,"expressiveness":0.005235602094240838,"capability":0.005235602094240838,"contracts":0.005235602094240838,"judiciously":0.005235602094240838,"can":0.005235602094240838,"significantly":0.005235602094240838,"improve":0.005235602094240838,"organization":0.005235602094240838},"164":{"1":0.005434782608695652,"2":0.005434782608695652,"3":0.005434782608695652,"4":0.005434782608695652,"function":0.005434782608695652,"signature":0.005434782608695652,"clarity":0.005434782608695652,"err":0.005434782608695652,"value":0.005434782608695652,"-":0.005434782608695652,"input":0.005434782608695652,"any":0.005434782608695652,"type":0.005434782608695652,"a":0.005434782608695652,"output":0.005434782608695652,"response":0.005434782608695652,"b":0.005434782608695652,"where":0.005434782608695652,"is":0.005434782608695652,"the":0.005434782608695652,"of":0.005434782608695652,"why":0.005434782608695652,"it":0.005434782608695652,"matters":0.005434782608695652,"crucial":0.005434782608695652,"for":0.005434782608695652,"creating":0.005434782608695652,"standardized":0.005434782608695652,"error":0.005434782608695652,"responses":0.005434782608695652,"in":0.005434782608695652,"public":0.005434782608695652,"functions":0.005434782608695652,"indicating":0.005434782608695652,"that":0.005434782608695652,"execution":0.005434782608695652,"has":0.005434782608695652,"failed":0.005434782608695652,"providing":0.005434782608695652,"meaningful":0.005434782608695652,"information":0.005434782608695652,"to":0.005434782608695652,"callers":0.005434782608695652,"triggering":0.005434782608695652,"automatic":0.005434782608695652,"rollback":0.005434782608695652,"database":0.005434782608695652,"changes":0.005434782608695652,"during":0.005434782608695652,"when":0.005434782608695652,"use":0.005434782608695652,"you":0.005434782608695652,"need":0.005434782608695652,"return":0.005434782608695652,"an":0.005434782608695652,"state":0.005434782608695652,"from":0.005434782608695652,"indicate":0.005434782608695652,"condition":0.005434782608695652,"or":0.005434782608695652,"operation":0.005434782608695652,"provide":0.005434782608695652,"specific":0.005434782608695652,"codes":0.005434782608695652,"caller":0.005434782608695652,"ensure":0.005434782608695652,"are":0.005434782608695652,"reverted":0.005434782608695652,"due":0.005434782608695652,"failure":0.005434782608695652,"best":0.005434782608695652,"practices":0.005434782608695652,"descriptive":0.005434782608695652,"values":0.005434782608695652,"help":0.005434782608695652,"diagnose":0.005434782608695652,"issue":0.005434782608695652,"consider":0.005434782608695652,"using":0.005434782608695652,"across":0.005434782608695652,"your":0.005434782608695652,"contract":0.005434782608695652,"pair":0.005434782608695652,"with":0.005434782608695652,"ok":0.005434782608695652,"create":0.005434782608695652,"comprehensive":0.005434782608695652,"handling":0.005434782608695652,"remember":0.005434782608695652,"returning":0.005434782608695652,"will":0.005434782608695652,"cause":0.005434782608695652,"all":0.005434782608695652,"current":0.005434782608695652,"be":0.005434782608695652,"rolled":0.005434782608695652,"back":0.005434782608695652,"practical":0.005434782608695652,"example":0.005434782608695652,"token":0.005434782608695652,"transfer":0.005434782608695652,"let's":0.005434782608695652,"implement":0.005434782608695652,"simple":0.005434782608695652,"define-map":0.005434782608695652,"balances":0.005434782608695652,"principal":0.005434782608695652,"uint":0.005434782608695652,"define-public":0.005434782608695652,"amount":0.005434782608695652,"recipient":0.005434782608695652,"let":0.005434782608695652,"senderbalance":0.005434782608695652,"default-to":0.005434782608695652,"u0":0.005434782608695652,"map-get":0.005434782608695652,"tx-sender":0.005434782608695652,"if":0.005434782608695652,"begin":0.005434782608695652,"map-set":0.005434782608695652,"true":0.005434782608695652,"u1":0.005434782608695652,"usage":0.005434782608695652,"u100":0.005434782608695652,"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.005434782608695652,"returns":0.005434782608695652,"balance":0.005434782608695652,"insufficient":0.005434782608695652,"this":0.005434782608695652,"demonstrates":0.005434782608695652,"sender":0.005434782608695652,"pairing":0.005434782608695652,"handle":0.005434782608695652,"both":0.005434782608695652,"success":0.005434782608695652,"and":0.005434782608695652,"cases":0.005434782608695652,"code":0.005434782608695652,"common":0.005434782608695652,"pitfalls":0.005434782608695652,"forgetting":0.005434782608695652,"revert":0.005434782608695652,"non-descriptive":0.005434782608695652,"make":0.005434782608695652,"debugging":0.005434782608695652,"difficult":0.005434782608695652,"inconsistent":0.005434782608695652,"different":0.005434782608695652,"related":0.005434782608695652,"used":0.005434782608695652,"construct":0.005434782608695652,"successful":0.005434782608695652,"asserts":0.005434782608695652,"often":0.005434782608695652,"checking":0.005434782608695652,"reporting":0.005434782608695652,"try":0.005434782608695652,"propagate":0.005434782608695652,"errors":0.005434782608695652,"up":0.005434782608695652,"call":0.005434782608695652,"stack":0.005434782608695652,"conclusion":0.005434782608695652,"fundamental":0.005434782608695652,"tool":0.005434782608695652,"construction":0.005434782608695652,"smart":0.005434782608695652,"contracts":0.005434782608695652,"by":0.005434782608695652,"way":0.005434782608695652,"communicate":0.005434782608695652,"enables":0.005434782608695652,"robust":0.005434782608695652,"predictable":0.005434782608695652,"behavior":0.005434782608695652,"effectively":0.005434782608695652,"combination":0.005434782608695652,"other":0.005434782608695652,"error-handling":0.005434782608695652,"mechanisms":0.005434782608695652,"contributes":0.005434782608695652,"more":0.005434782608695652,"reliable":0.005434782608695652,"maintainable":0.005434782608695652},"165":{"0":0.006578947368421052,"1":0.006578947368421052,"2":0.006578947368421052,"3":0.006578947368421052,"4":0.006578947368421052,"5":0.006578947368421052,"function":0.006578947368421052,"signature":0.006578947368421052,"clarity":0.006578947368421052,"or":0.006578947368421052,"b1":0.006578947368421052,"b2":0.006578947368421052,"-":0.006578947368421052,"input":0.006578947368421052,"bool":0.006578947368421052,"output":0.006578947368421052,"why":0.006578947368421052,"it":0.006578947368421052,"matters":0.006578947368421052,"the":0.006578947368421052,"is":0.006578947368421052,"crucial":0.006578947368421052,"for":0.006578947368421052,"implementing":0.006578947368421052,"logical":0.006578947368421052,"disjunction":0.006578947368421052,"in":0.006578947368421052,"conditional":0.006578947368421052,"statements":0.006578947368421052,"simplifying":0.006578947368421052,"process":0.006578947368421052,"of":0.006578947368421052,"evaluating":0.006578947368421052,"multiple":0.006578947368421052,"boolean":0.006578947368421052,"expressions":0.006578947368421052,"enhancing":0.006578947368421052,"code":0.006578947368421052,"readability":0.006578947368421052,"and":0.006578947368421052,"maintainability":0.006578947368421052,"by":0.006578947368421052,"abstracting":0.006578947368421052,"when":0.006578947368421052,"to":0.006578947368421052,"use":0.006578947368421052,"you":0.006578947368421052,"need":0.006578947368421052,"evaluate":0.006578947368421052,"return":0.006578947368421052,"true":0.006578947368421052,"if":0.006578947368421052,"any":0.006578947368421052,"are":0.006578947368421052,"implement":0.006578947368421052,"simplify":0.006578947368421052,"abstract":0.006578947368421052,"values":0.006578947368421052,"best":0.006578947368421052,"practices":0.006578947368421052,"ensure":0.006578947368421052,"all":0.006578947368421052,"inputs":0.006578947368421052,"meaningful":0.006578947368421052,"variable":0.006578947368421052,"names":0.006578947368421052,"better":0.006578947368421052,"combine":0.006578947368421052,"with":0.006578947368421052,"other":0.006578947368421052,"functions":0.006578947368421052,"comprehensive":0.006578947368421052,"logic":0.006578947368421052,"be":0.006578947368421052,"aware":0.006578947368421052,"performance":0.006578947368421052,"implications":0.006578947368421052,"complex":0.006578947368421052,"operations":0.006578947368421052,"practical":0.006578947368421052,"example":0.006578947368421052,"conditions":0.006578947368421052,"let's":0.006578947368421052,"a":0.006578947368421052,"that":0.006578947368421052,"checks":0.006578947368421052,"number":0.006578947368421052,"either":0.006578947368421052,"zero":0.006578947368421052,"negative":0.006578947368421052,"define-read-only":0.006578947368421052,"is-zero-or-negative":0.006578947368421052,"n":0.006578947368421052,"int":0.006578947368421052,"is-eq":0.006578947368421052,"usage":0.006578947368421052,"returns":0.006578947368421052,"false":0.006578947368421052,"-3":0.006578947368421052,"this":0.006578947368421052,"demonstrates":0.006578947368421052,"using":0.006578947368421052,"read-only":0.006578947368421052,"check":0.006578947368421052,"handling":0.006578947368421052,"both":0.006578947368421052,"cases":0.006578947368421052,"common":0.006578947368421052,"pitfalls":0.006578947368421052,"non-boolean":0.006578947368421052,"causing":0.006578947368421052,"type":0.006578947368421052,"errors":0.006578947368421052,"assuming":0.006578947368421052,"result":0.006578947368421052,"will":0.006578947368421052,"always":0.006578947368421052,"leading":0.006578947368421052,"incorrect":0.006578947368421052,"not":0.006578947368421052,"possible":0.006578947368421052,"resulting":0.006578947368421052,"incomplete":0.006578947368421052,"overlooking":0.006578947368421052,"proper":0.006578947368421052,"error":0.006578947368421052,"validation":0.006578947368421052,"related":0.006578947368421052,"conjunction":0.006578947368421052,"negation":0.006578947368421052,"expression":0.006578947368421052,"two":0.006578947368421052,"equal":0.006578947368421052,"conclusion":0.006578947368421052,"fundamental":0.006578947368421052,"tool":0.006578947368421052,"smart":0.006578947368421052,"contracts":0.006578947368421052,"allows":0.006578947368421052,"enabling":0.006578947368421052,"robust":0.006578947368421052,"used":0.006578947368421052,"effectively":0.006578947368421052,"enhances":0.006578947368421052,"reliability":0.006578947368421052,"your":0.006578947368421052,"contract":0.006578947368421052,"providing":0.006578947368421052,"clear":0.006578947368421052,"concise":0.006578947368421052,"way":0.006578947368421052,"manage":0.006578947368421052},"166":{"1":0.006097560975609756,"2":0.006097560975609756,"3":0.006097560975609756,"4":0.006097560975609756,"function":0.006097560975609756,"signature":0.006097560975609756,"clarity":0.006097560975609756,"try":0.006097560975609756,"expression":0.006097560975609756,"-":0.006097560975609756,"input":0.006097560975609756,"of":0.006097560975609756,"type":0.006097560975609756,"response":0.006097560975609756,"t":0.006097560975609756,"e":0.006097560975609756,"output":0.006097560975609756,"if":0.006097560975609756,"the":0.006097560975609756,"is":0.006097560975609756,"ok":0.006097560975609756,"or":0.006097560975609756,"causes":0.006097560975609756,"a":0.006097560975609756,"runtime":0.006097560975609756,"error":0.006097560975609756,"err":0.006097560975609756,"why":0.006097560975609756,"it":0.006097560975609756,"matters":0.006097560975609756,"crucial":0.006097560975609756,"for":0.006097560975609756,"simplifying":0.006097560975609756,"handling":0.006097560975609756,"in":0.006097560975609756,"smart":0.006097560975609756,"contracts":0.006097560975609756,"implementing":0.006097560975609756,"logic":0.006097560975609756,"that":0.006097560975609756,"requires":0.006097560975609756,"automatic":0.006097560975609756,"propagation":0.006097560975609756,"ensuring":0.006097560975609756,"data":0.006097560975609756,"integrity":0.006097560975609756,"by":0.006097560975609756,"validating":0.006097560975609756,"operations":0.006097560975609756,"and":0.006097560975609756,"errors":0.006097560975609756,"gracefully":0.006097560975609756,"process":0.006097560975609756,"responses":0.006097560975609756,"when":0.006097560975609756,"to":0.006097560975609756,"use":0.006097560975609756,"you":0.006097560975609756,"need":0.006097560975609756,"simplify":0.006097560975609756,"your":0.006097560975609756,"contract":0.006097560975609756,"implement":0.006097560975609756,"validate":0.006097560975609756,"handle":0.006097560975609756,"best":0.006097560975609756,"practices":0.006097560975609756,"ensure":0.006097560975609756,"returns":0.006097560975609756,"meaningful":0.006097560975609756,"variable":0.006097560975609756,"names":0.006097560975609756,"better":0.006097560975609756,"readability":0.006097560975609756,"combine":0.006097560975609756,"with":0.006097560975609756,"other":0.006097560975609756,"functions":0.006097560975609756,"comprehensive":0.006097560975609756,"management":0.006097560975609756,"possible":0.006097560975609756,"cases":0.006097560975609756,"robust":0.006097560975609756,"behavior":0.006097560975609756,"practical":0.006097560975609756,"example":0.006097560975609756,"transfer":0.006097560975609756,"let's":0.006097560975609756,"transfers":0.006097560975609756,"stx":0.006097560975609756,"handles":0.006097560975609756,"using":0.006097560975609756,"define-public":0.006097560975609756,"transfer-stx":0.006097560975609756,"amount":0.006097560975609756,"uint":0.006097560975609756,"recipient":0.006097560975609756,"principal":0.006097560975609756,"begin":0.006097560975609756,"stx-transfer":0.006097560975609756,"tx-sender":0.006097560975609756,"true":0.006097560975609756,"usage":0.006097560975609756,"u60":0.006097560975609756,"'sz2j6zy48gv1ez5v2v5rb9mp66sw86pykkq9h6dpr":0.006097560975609756,"successful":0.006097560975609756,"u50":0.006097560975609756,"u1":0.006097560975609756,"sender":0.006097560975609756,"does":0.006097560975609756,"not":0.006097560975609756,"have":0.006097560975609756,"enough":0.006097560975609756,"balance":0.006097560975609756,"this":0.006097560975609756,"demonstrates":0.006097560975609756,"operation":0.006097560975609756,"public":0.006097560975609756,"both":0.006097560975609756,"common":0.006097560975609756,"pitfalls":0.006097560975609756,"expressions":0.006097560975609756,"do":0.006097560975609756,"return":0.006097560975609756,"causing":0.006097560975609756,"assuming":0.006097560975609756,"will":0.006097560975609756,"always":0.006097560975609756,"succeed":0.006097560975609756,"leading":0.006097560975609756,"unhandled":0.006097560975609756,"all":0.006097560975609756,"conditions":0.006097560975609756,"resulting":0.006097560975609756,"incomplete":0.006097560975609756,"overlooking":0.006097560975609756,"proper":0.006097560975609756,"validation":0.006097560975609756,"related":0.006097560975609756,"unwrap":0.006097560975609756,"unwraps":0.006097560975609756,"an":0.006097560975609756,"optional":0.006097560975609756,"value":0.006097560975609756,"none":0.006097560975609756,"asserts":0.006097560975609756,"condition":0.006097560975609756,"false":0.006097560975609756,"is-err":0.006097560975609756,"checks":0.006097560975609756,"conclusion":0.006097560975609756,"fundamental":0.006097560975609756,"tool":0.006097560975609756,"allows":0.006097560975609756,"used":0.006097560975609756,"effectively":0.006097560975609756,"enhances":0.006097560975609756,"reliability":0.006097560975609756,"maintainability":0.006097560975609756,"code":0.006097560975609756,"providing":0.006097560975609756,"clear":0.006097560975609756,"concise":0.006097560975609756,"way":0.006097560975609756},"167":{"1":0.005649717514124294,"2":0.005649717514124294,"3":0.005649717514124294,"4":0.005649717514124294,"32":0.005649717514124294,"function":0.005649717514124294,"signature":0.005649717514124294,"clarity":0.005649717514124294,"map-insert":0.005649717514124294,"map-name":0.005649717514124294,"key-tuple":0.005649717514124294,"value-tuple":0.005649717514124294,"-":0.005649717514124294,"input":0.005649717514124294,"mapname":0.005649717514124294,"tuple_a":0.005649717514124294,"tuple_b":0.005649717514124294,"output":0.005649717514124294,"bool":0.005649717514124294,"why":0.005649717514124294,"it":0.005649717514124294,"matters":0.005649717514124294,"the":0.005649717514124294,"is":0.005649717514124294,"crucial":0.005649717514124294,"for":0.005649717514124294,"adding":0.005649717514124294,"new":0.005649717514124294,"entries":0.005649717514124294,"to":0.005649717514124294,"a":0.005649717514124294,"map":0.005649717514124294,"ensuring":0.005649717514124294,"data":0.005649717514124294,"integrity":0.005649717514124294,"by":0.005649717514124294,"preventing":0.005649717514124294,"overwrites":0.005649717514124294,"of":0.005649717514124294,"existing":0.005649717514124294,"simplifying":0.005649717514124294,"process":0.005649717514124294,"managing":0.005649717514124294,"in":0.005649717514124294,"smart":0.005649717514124294,"contracts":0.005649717514124294,"enabling":0.005649717514124294,"creation":0.005649717514124294,"unique":0.005649717514124294,"key-value":0.005649717514124294,"pairs":0.005649717514124294,"maps":0.005649717514124294,"when":0.005649717514124294,"use":0.005649717514124294,"you":0.005649717514124294,"need":0.005649717514124294,"add":0.005649717514124294,"entry":0.005649717514124294,"ensure":0.005649717514124294,"that":0.005649717514124294,"are":0.005649717514124294,"not":0.005649717514124294,"overwritten":0.005649717514124294,"manage":0.005649717514124294,"your":0.005649717514124294,"contract":0.005649717514124294,"create":0.005649717514124294,"best":0.005649717514124294,"practices":0.005649717514124294,"and":0.005649717514124294,"correctly":0.005649717514124294,"formatted":0.005649717514124294,"meaningful":0.005649717514124294,"variable":0.005649717514124294,"names":0.005649717514124294,"better":0.005649717514124294,"readability":0.005649717514124294,"combine":0.005649717514124294,"with":0.005649717514124294,"other":0.005649717514124294,"functions":0.005649717514124294,"comprehensive":0.005649717514124294,"management":0.005649717514124294,"handle":0.005649717514124294,"case":0.005649717514124294,"where":0.005649717514124294,"key":0.005649717514124294,"already":0.005649717514124294,"exists":0.005649717514124294,"avoid":0.005649717514124294,"unexpected":0.005649717514124294,"behavior":0.005649717514124294,"practical":0.005649717514124294,"example":0.005649717514124294,"inserting":0.005649717514124294,"user":0.005649717514124294,"let's":0.005649717514124294,"implement":0.005649717514124294,"inserts":0.005649717514124294,"user's":0.005649717514124294,"into":0.005649717514124294,"define-map":0.005649717514124294,"userdata":0.005649717514124294,"userid":0.005649717514124294,"principal":0.005649717514124294,"buff":0.005649717514124294,"define-public":0.005649717514124294,"insert-user-data":0.005649717514124294,"ok":0.005649717514124294,"usage":0.005649717514124294,"tx-sender":0.005649717514124294,"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef":0.005649717514124294,"returns":0.005649717514124294,"true":0.005649717514124294,"if":0.005649717514124294,"inserted":0.005649717514124294,"0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef":0.005649717514124294,"false":0.005649717514124294,"this":0.005649717514124294,"demonstrates":0.005649717514124294,"using":0.005649717514124294,"implementing":0.005649717514124294,"public":0.005649717514124294,"insert":0.005649717514124294,"handling":0.005649717514124294,"both":0.005649717514124294,"successfully":0.005649717514124294,"common":0.005649717514124294,"pitfalls":0.005649717514124294,"incorrectly":0.005649717514124294,"tuples":0.005649717514124294,"causing":0.005649717514124294,"insertion":0.005649717514124294,"fail":0.005649717514124294,"assuming":0.005649717514124294,"will":0.005649717514124294,"always":0.005649717514124294,"be":0.005649717514124294,"leading":0.005649717514124294,"unhandled":0.005649717514124294,"cases":0.005649717514124294,"all":0.005649717514124294,"possible":0.005649717514124294,"conditions":0.005649717514124294,"resulting":0.005649717514124294,"incomplete":0.005649717514124294,"overlooking":0.005649717514124294,"proper":0.005649717514124294,"error":0.005649717514124294,"validation":0.005649717514124294,"related":0.005649717514124294,"map-set":0.005649717514124294,"sets":0.005649717514124294,"value":0.005649717514124294,"associated":0.005649717514124294,"overwriting":0.005649717514124294,"any":0.005649717514124294,"map-delete":0.005649717514124294,"removes":0.005649717514124294,"an":0.005649717514124294,"from":0.005649717514124294,"map-get":0.005649717514124294,"retrieves":0.005649717514124294,"conclusion":0.005649717514124294,"fundamental":0.005649717514124294,"tool":0.005649717514124294,"allows":0.005649717514124294,"used":0.005649717514124294,"effectively":0.005649717514124294,"enhances":0.005649717514124294,"reliability":0.005649717514124294,"maintainability":0.005649717514124294,"code":0.005649717514124294,"providing":0.005649717514124294,"clear":0.005649717514124294,"concise":0.005649717514124294,"way":0.005649717514124294},"168":{"1":0.00684931506849315,"2":0.00684931506849315,"3":0.00684931506849315,"4":0.00684931506849315,"42":0.00684931506849315,"function":0.00684931506849315,"signature":0.00684931506849315,"clarity":0.00684931506849315,"some":0.00684931506849315,"value":0.00684931506849315,"-":0.00684931506849315,"input":0.00684931506849315,"a":0.00684931506849315,"output":0.00684931506849315,"optional":0.00684931506849315,"why":0.00684931506849315,"it":0.00684931506849315,"matters":0.00684931506849315,"the":0.00684931506849315,"is":0.00684931506849315,"crucial":0.00684931506849315,"for":0.00684931506849315,"constructing":0.00684931506849315,"an":0.00684931506849315,"type":0.00684931506849315,"from":0.00684931506849315,"given":0.00684931506849315,"implementing":0.00684931506849315,"logic":0.00684931506849315,"that":0.00684931506849315,"requires":0.00684931506849315,"types":0.00684931506849315,"ensuring":0.00684931506849315,"data":0.00684931506849315,"integrity":0.00684931506849315,"by":0.00684931506849315,"explicitly":0.00684931506849315,"handling":0.00684931506849315,"values":0.00684931506849315,"simplifying":0.00684931506849315,"process":0.00684931506849315,"of":0.00684931506849315,"working":0.00684931506849315,"with":0.00684931506849315,"in":0.00684931506849315,"smart":0.00684931506849315,"contracts":0.00684931506849315,"when":0.00684931506849315,"to":0.00684931506849315,"use":0.00684931506849315,"you":0.00684931506849315,"need":0.00684931506849315,"construct":0.00684931506849315,"implement":0.00684931506849315,"handle":0.00684931506849315,"ensure":0.00684931506849315,"work":0.00684931506849315,"your":0.00684931506849315,"contract":0.00684931506849315,"best":0.00684931506849315,"practices":0.00684931506849315,"passed":0.00684931506849315,"intended":0.00684931506849315,"be":0.00684931506849315,"wrapped":0.00684931506849315,"meaningful":0.00684931506849315,"variable":0.00684931506849315,"names":0.00684931506849315,"better":0.00684931506849315,"readability":0.00684931506849315,"combine":0.00684931506849315,"other":0.00684931506849315,"functions":0.00684931506849315,"comprehensive":0.00684931506849315,"management":0.00684931506849315,"possible":0.00684931506849315,"error":0.00684931506849315,"cases":0.00684931506849315,"robust":0.00684931506849315,"behavior":0.00684931506849315,"practical":0.00684931506849315,"example":0.00684931506849315,"let's":0.00684931506849315,"constructs":0.00684931506849315,"integer":0.00684931506849315,"define-read-only":0.00684931506849315,"wrap-in-optional":0.00684931506849315,"int":0.00684931506849315,"usage":0.00684931506849315,"returns":0.00684931506849315,"-1":0.00684931506849315,"this":0.00684931506849315,"demonstrates":0.00684931506849315,"using":0.00684931506849315,"public":0.00684931506849315,"construction":0.00684931506849315,"both":0.00684931506849315,"positive":0.00684931506849315,"and":0.00684931506849315,"negative":0.00684931506849315,"common":0.00684931506849315,"pitfalls":0.00684931506849315,"without":0.00684931506849315,"causing":0.00684931506849315,"unexpected":0.00684931506849315,"assuming":0.00684931506849315,"will":0.00684931506849315,"always":0.00684931506849315,"valid":0.00684931506849315,"leading":0.00684931506849315,"unhandled":0.00684931506849315,"not":0.00684931506849315,"all":0.00684931506849315,"conditions":0.00684931506849315,"resulting":0.00684931506849315,"incomplete":0.00684931506849315,"overlooking":0.00684931506849315,"proper":0.00684931506849315,"validation":0.00684931506849315,"related":0.00684931506849315,"is-some":0.00684931506849315,"checks":0.00684931506849315,"if":0.00684931506849315,"contains":0.00684931506849315,"is-none":0.00684931506849315,"empty":0.00684931506849315,"unwrap":0.00684931506849315,"unwraps":0.00684931506849315,"returning":0.00684931506849315,"contained":0.00684931506849315,"or":0.00684931506849315,"throwing":0.00684931506849315,"conclusion":0.00684931506849315,"fundamental":0.00684931506849315,"tool":0.00684931506849315,"allows":0.00684931506849315,"used":0.00684931506849315,"effectively":0.00684931506849315,"enhances":0.00684931506849315,"reliability":0.00684931506849315,"maintainability":0.00684931506849315,"code":0.00684931506849315,"providing":0.00684931506849315,"clear":0.00684931506849315,"concise":0.00684931506849315,"way":0.00684931506849315},"169":{"1":0.00641025641025641,"2":0.00641025641025641,"3":0.00641025641025641,"4":0.00641025641025641,"32":0.00641025641025641,"33":0.00641025641025641,"64":0.00641025641025641,"65":0.00641025641025641,"function":0.00641025641025641,"signature":0.00641025641025641,"clarity":0.00641025641025641,"secp256k1-verify":0.00641025641025641,"message-hash":0.00641025641025641,"public-key":0.00641025641025641,"-":0.00641025641025641,"input":0.00641025641025641,"buff":0.00641025641025641,"output":0.00641025641025641,"bool":0.00641025641025641,"why":0.00641025641025641,"it":0.00641025641025641,"matters":0.00641025641025641,"the":0.00641025641025641,"is":0.00641025641025641,"crucial":0.00641025641025641,"for":0.00641025641025641,"verifying":0.00641025641025641,"authenticity":0.00641025641025641,"of":0.00641025641025641,"a":0.00641025641025641,"message":0.00641025641025641,"by":0.00641025641025641,"checking":0.00641025641025641,"against":0.00641025641025641,"public":0.00641025641025641,"key":0.00641025641025641,"implementing":0.00641025641025641,"cryptographic":0.00641025641025641,"verification":0.00641025641025641,"in":0.00641025641025641,"smart":0.00641025641025641,"contracts":0.00641025641025641,"ensuring":0.00641025641025641,"data":0.00641025641025641,"integrity":0.00641025641025641,"validating":0.00641025641025641,"signatures":0.00641025641025641,"simplifying":0.00641025641025641,"process":0.00641025641025641,"handling":0.00641025641025641,"operations":0.00641025641025641,"when":0.00641025641025641,"to":0.00641025641025641,"use":0.00641025641025641,"you":0.00641025641025641,"need":0.00641025641025641,"verify":0.00641025641025641,"implement":0.00641025641025641,"your":0.00641025641025641,"contract":0.00641025641025641,"validate":0.00641025641025641,"ensure":0.00641025641025641,"handle":0.00641025641025641,"best":0.00641025641025641,"practices":0.00641025641025641,"and":0.00641025641025641,"are":0.00641025641025641,"correctly":0.00641025641025641,"formatted":0.00641025641025641,"valid":0.00641025641025641,"meaningful":0.00641025641025641,"variable":0.00641025641025641,"names":0.00641025641025641,"better":0.00641025641025641,"readability":0.00641025641025641,"combine":0.00641025641025641,"with":0.00641025641025641,"other":0.00641025641025641,"functions":0.00641025641025641,"comprehensive":0.00641025641025641,"security":0.00641025641025641,"management":0.00641025641025641,"possible":0.00641025641025641,"error":0.00641025641025641,"cases":0.00641025641025641,"robust":0.00641025641025641,"behavior":0.00641025641025641,"practical":0.00641025641025641,"example":0.00641025641025641,"let's":0.00641025641025641,"that":0.00641025641025641,"verifies":0.00641025641025641,"hash":0.00641025641025641,"define-read-only":0.00641025641025641,"verify-signature":0.00641025641025641,"messagehash":0.00641025641025641,"publickey":0.00641025641025641,"usage":0.00641025641025641,"0xde5b9eb9e7c5592930eb2e30a01369c36586d872082ed8181ee83d2a0ec20f04":0.00641025641025641,"0x8738487ebe69b93d8e51583be8eee50bb4213fc49c767d329632730cc193b873554428fc936ca3569afc15f1c9365f6591d6251a89fee9c9ac661116824d3a1301":0.00641025641025641,"0x03adb8de4bfb65db2cfd6120d55c6526ae9c52e675db7e47308636534ba7786110":0.00641025641025641,"returns":0.00641025641025641,"true":0.00641025641025641,"this":0.00641025641025641,"demonstrates":0.00641025641025641,"using":0.00641025641025641,"both":0.00641025641025641,"successful":0.00641025641025641,"common":0.00641025641025641,"pitfalls":0.00641025641025641,"incorrectly":0.00641025641025641,"or":0.00641025641025641,"invalid":0.00641025641025641,"causing":0.00641025641025641,"operation":0.00641025641025641,"fail":0.00641025641025641,"assuming":0.00641025641025641,"will":0.00641025641025641,"always":0.00641025641025641,"succeed":0.00641025641025641,"leading":0.00641025641025641,"unhandled":0.00641025641025641,"not":0.00641025641025641,"all":0.00641025641025641,"conditions":0.00641025641025641,"resulting":0.00641025641025641,"incomplete":0.00641025641025641,"overlooking":0.00641025641025641,"proper":0.00641025641025641,"validation":0.00641025641025641,"related":0.00641025641025641,"secp256k1-recover":0.00641025641025641,"recovers":0.00641025641025641,"from":0.00641025641025641,"sha256":0.00641025641025641,"computes":0.00641025641025641,"sha-256":0.00641025641025641,"hash160":0.00641025641025641,"ripemd-160":0.00641025641025641,"conclusion":0.00641025641025641,"fundamental":0.00641025641025641,"tool":0.00641025641025641,"hashes":0.00641025641025641,"keys":0.00641025641025641,"allows":0.00641025641025641,"simplify":0.00641025641025641,"used":0.00641025641025641,"effectively":0.00641025641025641,"enhances":0.00641025641025641,"reliability":0.00641025641025641,"maintainability":0.00641025641025641,"code":0.00641025641025641,"providing":0.00641025641025641,"clear":0.00641025641025641,"concise":0.00641025641025641,"way":0.00641025641025641},"170":{"1":0.005681818181818182,"2":0.005681818181818182,"3":0.005681818181818182,"4":0.005681818181818182,"5":0.005681818181818182,"10":0.005681818181818182,"15":0.005681818181818182,"20":0.005681818181818182,"25":0.005681818181818182,"function":0.005681818181818182,"signature":0.005681818181818182,"clarity":0.005681818181818182,"match":0.005681818181818182,"opt-input":0.005681818181818182,"some-binding-name":0.005681818181818182,"some-branch":0.005681818181818182,"none-branch":0.005681818181818182,"match-resp":0.005681818181818182,"input":0.005681818181818182,"ok-binding-name":0.005681818181818182,"ok-branch":0.005681818181818182,"err-binding-name":0.005681818181818182,"err-branch":0.005681818181818182,"-":0.005681818181818182,"optional":0.005681818181818182,"a":0.005681818181818182,"name":0.005681818181818182,"expression":0.005681818181818182,"response":0.005681818181818182,"b":0.005681818181818182,"output":0.005681818181818182,"c":0.005681818181818182,"why":0.005681818181818182,"it":0.005681818181818182,"matters":0.005681818181818182,"the":0.005681818181818182,"is":0.005681818181818182,"crucial":0.005681818181818182,"for":0.005681818181818182,"handling":0.005681818181818182,"different":0.005681818181818182,"branches":0.005681818181818182,"or":0.005681818181818182,"cases":0.005681818181818182,"and":0.005681818181818182,"types":0.005681818181818182,"simplifying":0.005681818181818182,"complex":0.005681818181818182,"conditional":0.005681818181818182,"logic":0.005681818181818182,"enhancing":0.005681818181818182,"code":0.005681818181818182,"readability":0.005681818181818182,"maintainability":0.005681818181818182,"ensuring":0.005681818181818182,"comprehensive":0.005681818181818182,"of":0.005681818181818182,"all":0.005681818181818182,"possible":0.005681818181818182,"when":0.005681818181818182,"to":0.005681818181818182,"use":0.005681818181818182,"you":0.005681818181818182,"need":0.005681818181818182,"handle":0.005681818181818182,"simplify":0.005681818181818182,"enhance":0.005681818181818182,"your":0.005681818181818182,"ensure":0.005681818181818182,"best":0.005681818181818182,"practices":0.005681818181818182,"are":0.005681818181818182,"covered":0.005681818181818182,"avoid":0.005681818181818182,"unhandled":0.005681818181818182,"meaningful":0.005681818181818182,"variable":0.005681818181818182,"names":0.005681818181818182,"better":0.005681818181818182,"combine":0.005681818181818182,"with":0.005681818181818182,"other":0.005681818181818182,"control":0.005681818181818182,"flow":0.005681818181818182,"functions":0.005681818181818182,"more":0.005681818181818182,"be":0.005681818181818182,"aware":0.005681818181818182,"performance":0.005681818181818182,"implications":0.005681818181818182,"extensive":0.005681818181818182,"branching":0.005681818181818182,"practical":0.005681818181818182,"example":0.005681818181818182,"values":0.005681818181818182,"let's":0.005681818181818182,"implement":0.005681818181818182,"that":0.005681818181818182,"using":0.005681818181818182,"define-private":0.005681818181818182,"add-10":0.005681818181818182,"x":0.005681818181818182,"int":0.005681818181818182,"value":0.005681818181818182,"some":0.005681818181818182,"returns":0.005681818181818182,"none":0.005681818181818182,"add-or-pass-err":0.005681818181818182,"string-ascii":0.005681818181818182,"to-add":0.005681818181818182,"ok":0.005681818181818182,"err-value":0.005681818181818182,"err":0.005681818181818182,"error":0.005681818181818182,"this":0.005681818181818182,"demonstrates":0.005681818181818182,"result":0.005681818181818182,"an":0.005681818181818182,"implementing":0.005681818181818182,"return":0.005681818181818182,"appropriate":0.005681818181818182,"based":0.005681818181818182,"on":0.005681818181818182,"type":0.005681818181818182,"common":0.005681818181818182,"pitfalls":0.005681818181818182,"without":0.005681818181818182,"covering":0.005681818181818182,"leading":0.005681818181818182,"assuming":0.005681818181818182,"will":0.005681818181818182,"always":0.005681818181818182,"certain":0.005681818181818182,"branch":0.005681818181818182,"causing":0.005681818181818182,"runtime":0.005681818181818182,"errors":0.005681818181818182,"not":0.005681818181818182,"conditions":0.005681818181818182,"resulting":0.005681818181818182,"in":0.005681818181818182,"incomplete":0.005681818181818182,"overlooking":0.005681818181818182,"proper":0.005681818181818182,"validation":0.005681818181818182,"related":0.005681818181818182,"if":0.005681818181818182,"implements":0.005681818181818182,"boolean":0.005681818181818182,"expressions":0.005681818181818182,"let":0.005681818181818182,"binds":0.005681818181818182,"variables":0.005681818181818182,"within":0.005681818181818182,"local":0.005681818181818182,"scope":0.005681818181818182,"default-to":0.005681818181818182,"provides":0.005681818181818182,"default":0.005681818181818182,"conclusion":0.005681818181818182,"fundamental":0.005681818181818182,"tool":0.005681818181818182,"smart":0.005681818181818182,"contracts":0.005681818181818182,"allows":0.005681818181818182,"manage":0.005681818181818182,"used":0.005681818181818182,"effectively":0.005681818181818182,"enhances":0.005681818181818182,"reliability":0.005681818181818182,"contract":0.005681818181818182,"by":0.005681818181818182,"providing":0.005681818181818182,"clear":0.005681818181818182,"concise":0.005681818181818182,"way":0.005681818181818182},"171":{"1":0.006060606060606061,"2":0.006060606060606061,"3":0.006060606060606061,"4":0.006060606060606061,"5":0.006060606060606061,"8":0.006060606060606061,"function":0.006060606060606061,"signature":0.006060606060606061,"clarity":0.006060606060606061,"let":0.006060606060606061,"name1":0.006060606060606061,"expr1":0.006060606060606061,"name2":0.006060606060606061,"expr2":0.006060606060606061,"expr-body1":0.006060606060606061,"expr-body2":0.006060606060606061,"expr-body-last":0.006060606060606061,"-":0.006060606060606061,"input":0.006060606060606061,"anytype":0.006060606060606061,"a":0.006060606060606061,"output":0.006060606060606061,"why":0.006060606060606061,"it":0.006060606060606061,"matters":0.006060606060606061,"the":0.006060606060606061,"is":0.006060606060606061,"crucial":0.006060606060606061,"for":0.006060606060606061,"binding":0.006060606060606061,"variables":0.006060606060606061,"to":0.006060606060606061,"expressions":0.006060606060606061,"within":0.006060606060606061,"local":0.006060606060606061,"scope":0.006060606060606061,"simplifying":0.006060606060606061,"complex":0.006060606060606061,"by":0.006060606060606061,"breaking":0.006060606060606061,"them":0.006060606060606061,"into":0.006060606060606061,"smaller":0.006060606060606061,"parts":0.006060606060606061,"improving":0.006060606060606061,"code":0.006060606060606061,"readability":0.006060606060606061,"and":0.006060606060606061,"maintainability":0.006060606060606061,"enabling":0.006060606060606061,"sequential":0.006060606060606061,"evaluation":0.006060606060606061,"of":0.006060606060606061,"when":0.006060606060606061,"use":0.006060606060606061,"you":0.006060606060606061,"need":0.006060606060606061,"bind":0.006060606060606061,"simplify":0.006060606060606061,"improve":0.006060606060606061,"your":0.006060606060606061,"ensure":0.006060606060606061,"best":0.006060606060606061,"practices":0.006060606060606061,"meaningful":0.006060606060606061,"variable":0.006060606060606061,"names":0.006060606060606061,"better":0.006060606060606061,"that":0.006060606060606061,"are":0.006060606060606061,"evaluated":0.006060606060606061,"in":0.006060606060606061,"correct":0.006060606060606061,"order":0.006060606060606061,"combine":0.006060606060606061,"with":0.006060606060606061,"other":0.006060606060606061,"control":0.006060606060606061,"flow":0.006060606060606061,"functions":0.006060606060606061,"more":0.006060606060606061,"logic":0.006060606060606061,"be":0.006060606060606061,"aware":0.006060606060606061,"bindings":0.006060606060606061,"can":0.006060606060606061,"refer":0.006060606060606061,"prior":0.006060606060606061,"practical":0.006060606060606061,"example":0.006060606060606061,"calculating":0.006060606060606061,"sum":0.006060606060606061,"let's":0.006060606060606061,"implement":0.006060606060606061,"calculates":0.006060606060606061,"two":0.006060606060606061,"numbers":0.006060606060606061,"using":0.006060606060606061,"define-public":0.006060606060606061,"calculate-sum":0.006060606060606061,"int":0.006060606060606061,"b":0.006060606060606061,"ok":0.006060606060606061,"usage":0.006060606060606061,"returns":0.006060606060606061,"this":0.006060606060606061,"demonstrates":0.006060606060606061,"result":0.006060606060606061,"adding":0.006060606060606061,"returning":0.006060606060606061,"as":0.006060606060606061,"body":0.006060606060606061,"common":0.006060606060606061,"pitfalls":0.006060606060606061,"out":0.006060606060606061,"leading":0.006060606060606061,"incorrect":0.006060606060606061,"evaluations":0.006060606060606061,"not":0.006060606060606061,"handling":0.006060606060606061,"all":0.006060606060606061,"possible":0.006060606060606061,"conditions":0.006060606060606061,"resulting":0.006060606060606061,"incomplete":0.006060606060606061,"overlooking":0.006060606060606061,"proper":0.006060606060606061,"error":0.006060606060606061,"validation":0.006060606060606061,"simple":0.006060606060606061,"where":0.006060606060606061,"necessary":0.006060606060606061,"related":0.006060606060606061,"begin":0.006060606060606061,"evaluates":0.006060606060606061,"multiple":0.006060606060606061,"sequentially":0.006060606060606061,"last":0.006060606060606061,"expression's":0.006060606060606061,"value":0.006060606060606061,"if":0.006060606060606061,"implements":0.006060606060606061,"conditional":0.006060606060606061,"based":0.006060606060606061,"on":0.006060606060606061,"boolean":0.006060606060606061,"match":0.006060606060606061,"used":0.006060606060606061,"pattern":0.006060606060606061,"matching":0.006060606060606061,"conclusion":0.006060606060606061,"fundamental":0.006060606060606061,"tool":0.006060606060606061,"smart":0.006060606060606061,"contracts":0.006060606060606061,"allows":0.006060606060606061,"effectively":0.006060606060606061,"enhances":0.006060606060606061,"reliability":0.006060606060606061,"contract":0.006060606060606061,"providing":0.006060606060606061,"clear":0.006060606060606061,"concise":0.006060606060606061,"way":0.006060606060606061,"manage":0.006060606060606061},"172":{"1":0.005917159763313609,"2":0.005917159763313609,"3":0.005917159763313609,"4":0.005917159763313609,"32":0.005917159763313609,"function":0.005917159763313609,"signature":0.005917159763313609,"clarity":0.005917159763313609,"map-get":0.005917159763313609,"map-name":0.005917159763313609,"key-tuple":0.005917159763313609,"-":0.005917159763313609,"input":0.005917159763313609,"mapname":0.005917159763313609,"tuple":0.005917159763313609,"output":0.005917159763313609,"optional":0.005917159763313609,"why":0.005917159763313609,"it":0.005917159763313609,"matters":0.005917159763313609,"the":0.005917159763313609,"is":0.005917159763313609,"crucial":0.005917159763313609,"for":0.005917159763313609,"retrieving":0.005917159763313609,"entries":0.005917159763313609,"from":0.005917159763313609,"a":0.005917159763313609,"map":0.005917159763313609,"implementing":0.005917159763313609,"logic":0.005917159763313609,"that":0.005917159763313609,"depends":0.005917159763313609,"on":0.005917159763313609,"presence":0.005917159763313609,"of":0.005917159763313609,"ensuring":0.005917159763313609,"data":0.005917159763313609,"integrity":0.005917159763313609,"by":0.005917159763313609,"checking":0.005917159763313609,"existence":0.005917159763313609,"values":0.005917159763313609,"simplifying":0.005917159763313609,"process":0.005917159763313609,"accessing":0.005917159763313609,"stored":0.005917159763313609,"in":0.005917159763313609,"smart":0.005917159763313609,"contracts":0.005917159763313609,"when":0.005917159763313609,"to":0.005917159763313609,"use":0.005917159763313609,"you":0.005917159763313609,"need":0.005917159763313609,"retrieve":0.005917159763313609,"an":0.005917159763313609,"entry":0.005917159763313609,"implement":0.005917159763313609,"check":0.005917159763313609,"access":0.005917159763313609,"your":0.005917159763313609,"contract":0.005917159763313609,"best":0.005917159763313609,"practices":0.005917159763313609,"ensure":0.005917159763313609,"accurately":0.005917159763313609,"identifies":0.005917159763313609,"be":0.005917159763313609,"retrieved":0.005917159763313609,"meaningful":0.005917159763313609,"variable":0.005917159763313609,"names":0.005917159763313609,"better":0.005917159763313609,"readability":0.005917159763313609,"combine":0.005917159763313609,"with":0.005917159763313609,"other":0.005917159763313609,"functions":0.005917159763313609,"comprehensive":0.005917159763313609,"management":0.005917159763313609,"handle":0.005917159763313609,"none":0.005917159763313609,"case":0.005917159763313609,"avoid":0.005917159763313609,"runtime":0.005917159763313609,"errors":0.005917159763313609,"practical":0.005917159763313609,"example":0.005917159763313609,"user":0.005917159763313609,"let's":0.005917159763313609,"retrieves":0.005917159763313609,"user's":0.005917159763313609,"define-map":0.005917159763313609,"userdata":0.005917159763313609,"userid":0.005917159763313609,"principal":0.005917159763313609,"buff":0.005917159763313609,"define-read-only":0.005917159763313609,"get-user-data":0.005917159763313609,"usage":0.005917159763313609,"map-set":0.005917159763313609,"tx-sender":0.005917159763313609,"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef":0.005917159763313609,"returns":0.005917159763313609,"some":0.005917159763313609,"'spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf":0.005917159763313609,"this":0.005917159763313609,"demonstrates":0.005917159763313609,"using":0.005917159763313609,"read-only":0.005917159763313609,"return":0.005917159763313609,"handling":0.005917159763313609,"both":0.005917159763313609,"where":0.005917159763313609,"present":0.005917159763313609,"and":0.005917159763313609,"not":0.005917159763313609,"common":0.005917159763313609,"pitfalls":0.005917159763313609,"incorrect":0.005917159763313609,"causing":0.005917159763313609,"retrieval":0.005917159763313609,"fail":0.005917159763313609,"assuming":0.005917159763313609,"will":0.005917159763313609,"always":0.005917159763313609,"exist":0.005917159763313609,"leading":0.005917159763313609,"unhandled":0.005917159763313609,"cases":0.005917159763313609,"all":0.005917159763313609,"possible":0.005917159763313609,"conditions":0.005917159763313609,"resulting":0.005917159763313609,"incomplete":0.005917159763313609,"overlooking":0.005917159763313609,"proper":0.005917159763313609,"error":0.005917159763313609,"validation":0.005917159763313609,"related":0.005917159763313609,"sets":0.005917159763313609,"value":0.005917159763313609,"associated":0.005917159763313609,"key":0.005917159763313609,"map-delete":0.005917159763313609,"removes":0.005917159763313609,"map-insert":0.005917159763313609,"inserts":0.005917159763313609,"into":0.005917159763313609,"if":0.005917159763313609,"does":0.005917159763313609,"already":0.005917159763313609,"conclusion":0.005917159763313609,"fundamental":0.005917159763313609,"tool":0.005917159763313609,"maps":0.005917159763313609,"allows":0.005917159763313609,"based":0.005917159763313609,"used":0.005917159763313609,"effectively":0.005917159763313609,"enhances":0.005917159763313609,"reliability":0.005917159763313609,"maintainability":0.005917159763313609,"code":0.005917159763313609,"providing":0.005917159763313609,"clear":0.005917159763313609,"concise":0.005917159763313609,"way":0.005917159763313609},"173":{"1":0.005681818181818182,"2":0.005681818181818182,"3":0.005681818181818182,"4":0.005681818181818182,"10":0.005681818181818182,"function":0.005681818181818182,"signature":0.005681818181818182,"clarity":0.005681818181818182,"is-eq":0.005681818181818182,"v1":0.005681818181818182,"v2":0.005681818181818182,"-":0.005681818181818182,"input":0.005681818181818182,"a":0.005681818181818182,"output":0.005681818181818182,"bool":0.005681818181818182,"why":0.005681818181818182,"it":0.005681818181818182,"matters":0.005681818181818182,"the":0.005681818181818182,"is":0.005681818181818182,"crucial":0.005681818181818182,"for":0.005681818181818182,"comparing":0.005681818181818182,"values":0.005681818181818182,"to":0.005681818181818182,"check":0.005681818181818182,"equality":0.005681818181818182,"implementing":0.005681818181818182,"conditional":0.005681818181818182,"logic":0.005681818181818182,"based":0.005681818181818182,"on":0.005681818181818182,"value":0.005681818181818182,"comparisons":0.005681818181818182,"ensuring":0.005681818181818182,"data":0.005681818181818182,"integrity":0.005681818181818182,"by":0.005681818181818182,"verifying":0.005681818181818182,"that":0.005681818181818182,"match":0.005681818181818182,"expected":0.005681818181818182,"results":0.005681818181818182,"simplifying":0.005681818181818182,"checks":0.005681818181818182,"in":0.005681818181818182,"smart":0.005681818181818182,"contract":0.005681818181818182,"code":0.005681818181818182,"when":0.005681818181818182,"use":0.005681818181818182,"you":0.005681818181818182,"need":0.005681818181818182,"compare":0.005681818181818182,"multiple":0.005681818181818182,"implement":0.005681818181818182,"depends":0.005681818181818182,"whether":0.005681818181818182,"are":0.005681818181818182,"equal":0.005681818181818182,"verify":0.005681818181818182,"constants":0.005681818181818182,"or":0.005681818181818182,"variables":0.005681818181818182,"simplify":0.005681818181818182,"your":0.005681818181818182,"best":0.005681818181818182,"practices":0.005681818181818182,"ensure":0.005681818181818182,"all":0.005681818181818182,"being":0.005681818181818182,"compared":0.005681818181818182,"of":0.005681818181818182,"same":0.005681818181818182,"type":0.005681818181818182,"avoid":0.005681818181818182,"errors":0.005681818181818182,"simple":0.005681818181818182,"and":0.005681818181818182,"combine":0.005681818181818182,"with":0.005681818181818182,"other":0.005681818181818182,"logical":0.005681818181818182,"functions":0.005681818181818182,"complex":0.005681818181818182,"conditions":0.005681818181818182,"be":0.005681818181818182,"aware":0.005681818181818182,"does":0.005681818181818182,"not":0.005681818181818182,"short-circuit":0.005681818181818182,"evaluated":0.005681818181818182,"meaningful":0.005681818181818182,"variable":0.005681818181818182,"names":0.005681818181818182,"better":0.005681818181818182,"readability":0.005681818181818182,"practical":0.005681818181818182,"example":0.005681818181818182,"checking":0.005681818181818182,"user":0.005681818181818182,"role":0.005681818181818182,"let's":0.005681818181818182,"if":0.005681818181818182,"has":0.005681818181818182,"specific":0.005681818181818182,"define-constant":0.005681818181818182,"admin_role":0.005681818181818182,"admin":0.005681818181818182,"define-map":0.005681818181818182,"userroles":0.005681818181818182,"userid":0.005681818181818182,"principal":0.005681818181818182,"string-ascii":0.005681818181818182,"define-read-only":0.005681818181818182,"is-admin":0.005681818181818182,"let":0.005681818181818182,"userrole":0.005681818181818182,"default-to":0.005681818181818182,"none":0.005681818181818182,"map-get":0.005681818181818182,"usage":0.005681818181818182,"map-set":0.005681818181818182,"tx-sender":0.005681818181818182,"returns":0.005681818181818182,"true":0.005681818181818182,"this":0.005681818181818182,"demonstrates":0.005681818181818182,"using":0.005681818181818182,"user's":0.005681818181818182,"constant":0.005681818181818182,"handling":0.005681818181818182,"case":0.005681818181818182,"where":0.005681818181818182,"set":0.005681818181818182,"providing":0.005681818181818182,"default":0.005681818181818182,"read-only":0.005681818181818182,"an":0.005681818181818182,"common":0.005681818181818182,"pitfalls":0.005681818181818182,"different":0.005681818181818182,"types":0.005681818181818182,"leading":0.005681818181818182,"assuming":0.005681818181818182,"short-circuits":0.005681818181818182,"like":0.005681818181818182,"might":0.005681818181818182,"more":0.005681818181818182,"appropriate":0.005681818181818182,"cases":0.005681818181818182,"unset":0.005681818181818182,"related":0.005681818181818182,"is-some":0.005681818181818182,"optional":0.005681818181818182,"some":0.005681818181818182,"is-none":0.005681818181818182,"asserts":0.005681818181818182,"condition":0.005681818181818182,"throws":0.005681818181818182,"error":0.005681818181818182,"false":0.005681818181818182,"conclusion":0.005681818181818182,"fundamental":0.005681818181818182,"tool":0.005681818181818182,"contracts":0.005681818181818182,"provides":0.005681818181818182,"straightforward":0.005681818181818182,"way":0.005681818181818182,"enabling":0.005681818181818182,"used":0.005681818181818182,"effectively":0.005681818181818182,"simplifies":0.005681818181818182,"enhances":0.005681818181818182,"maintainability":0.005681818181818182},"174":{"1":0.005235602094240838,"2":0.005235602094240838,"3":0.005235602094240838,"4":0.005235602094240838,"128":0.005235602094240838,"function":0.005235602094240838,"signature":0.005235602094240838,"clarity":0.005235602094240838,"bit-shift-left":0.005235602094240838,"i1":0.005235602094240838,"shamt":0.005235602094240838,"-":0.005235602094240838,"input":0.005235602094240838,"an":0.005235602094240838,"integer":0.005235602094240838,"int":0.005235602094240838,"or":0.005235602094240838,"uint":0.005235602094240838,"a":0.005235602094240838,"representing":0.005235602094240838,"the":0.005235602094240838,"number":0.005235602094240838,"of":0.005235602094240838,"places":0.005235602094240838,"to":0.005235602094240838,"shift":0.005235602094240838,"output":0.005235602094240838,"same":0.005235602094240838,"type":0.005235602094240838,"as":0.005235602094240838,"why":0.005235602094240838,"it":0.005235602094240838,"matters":0.005235602094240838,"is":0.005235602094240838,"crucial":0.005235602094240838,"for":0.005235602094240838,"implementing":0.005235602094240838,"certain":0.005235602094240838,"bitwise":0.005235602094240838,"algorithms":0.005235602094240838,"and":0.005235602094240838,"data":0.005235602094240838,"structures":0.005235602094240838,"manipulating":0.005235602094240838,"binary":0.005235602094240838,"at":0.005235602094240838,"bit":0.005235602094240838,"level":0.005235602094240838,"creating":0.005235602094240838,"bitmasks":0.005235602094240838,"various":0.005235602094240838,"purposes":0.005235602094240838,"low-level":0.005235602094240838,"optimizations":0.005235602094240838,"in":0.005235602094240838,"specific":0.005235602094240838,"scenarios":0.005235602094240838,"when":0.005235602094240838,"use":0.005235602094240838,"you":0.005235602094240838,"need":0.005235602094240838,"implement":0.005235602094240838,"cryptographic":0.005235602094240838,"hashing":0.005235602094240838,"perform":0.005235602094240838,"manipulations":0.005235602094240838,"involving":0.005235602094240838,"operations":0.005235602094240838,"create":0.005235602094240838,"patterns":0.005235602094240838,"masks":0.005235602094240838,"optimize":0.005235602094240838,"best":0.005235602094240838,"practices":0.005235602094240838,"remember":0.005235602094240838,"that":0.005235602094240838,"shifting":0.005235602094240838,"beyond":0.005235602094240838,"width":0.005235602094240838,"bits":0.005235602094240838,"will":0.005235602094240838,"result":0.005235602094240838,"zero":0.005235602094240838,"avoid":0.005235602094240838,"potential":0.005235602094240838,"issues":0.005235602094240838,"with":0.005235602094240838,"negative":0.005235602094240838,"amounts":0.005235602094240838,"be":0.005235602094240838,"aware":0.005235602094240838,"overflow":0.005235602094240838,"left":0.005235602094240838,"especially":0.005235602094240838,"large":0.005235602094240838,"numbers":0.005235602094240838,"multiplication":0.005235602094240838,"by":0.005235602094240838,"powers":0.005235602094240838,"pow":0.005235602094240838,"instead":0.005235602094240838,"provides":0.005235602094240838,"built-in":0.005235602094240838,"protection":0.005235602094240838,"practical":0.005235602094240838,"example":0.005235602094240838,"flag":0.005235602094240838,"management":0.005235602094240838,"let's":0.005235602094240838,"simple":0.005235602094240838,"system":0.005235602094240838,"using":0.005235602094240838,"define-constant":0.005235602094240838,"flag_read":0.005235602094240838,"u1":0.005235602094240838,"flag_write":0.005235602094240838,"u2":0.005235602094240838,"flag_execute":0.005235602094240838,"u4":0.005235602094240838,"define-read-only":0.005235602094240838,"create-flag":0.005235602094240838,"flagposition":0.005235602094240838,"set-flag":0.005235602094240838,"currentflags":0.005235602094240838,"bit-or":0.005235602094240838,"check-flag":0.005235602094240838,"flags":0.005235602094240838,"is-eq":0.005235602094240838,"bit-and":0.005235602094240838,"usage":0.005235602094240838,"returns":0.005235602094240838,"u7":0.005235602094240838,"read":0.005235602094240838,"write":0.005235602094240838,"execute":0.005235602094240838,"true":0.005235602094240838,"u3":0.005235602094240838,"false":0.005235602094240838,"this":0.005235602094240838,"demonstrates":0.005235602094240838,"individual":0.005235602094240838,"combining":0.005235602094240838,"set":0.005235602094240838,"check":0.005235602094240838,"if":0.005235602094240838,"common":0.005235602094240838,"pitfalls":0.005235602094240838,"without":0.005235602094240838,"considering":0.005235602094240838,"risks":0.005235602094240838,"not":0.005235602094240838,"modulo":0.005235602094240838,"behavior":0.005235602094240838,"greater":0.005235602094240838,"than":0.005235602094240838,"equal":0.005235602094240838,"non-uint":0.005235602094240838,"value":0.005235602094240838,"amount":0.005235602094240838,"which":0.005235602094240838,"allowed":0.005235602094240838,"related":0.005235602094240838,"functions":0.005235602094240838,"bit-shift-right":0.005235602094240838,"used":0.005235602094240838,"right-shifting":0.005235602094240838,"often":0.005235602094240838,"combination":0.005235602094240838,"masking":0.005235602094240838,"created":0.005235602094240838,"preferred":0.005235602094240838,"safe":0.005235602094240838,"conclusion":0.005235602094240838,"powerful":0.005235602094240838,"tool":0.005235602094240838,"smart":0.005235602094240838,"contracts":0.005235602094240838,"essential":0.005235602094240838,"performing":0.005235602094240838,"however":0.005235602094240838,"should":0.005235602094240838,"cautious":0.005235602094240838,"about":0.005235602094240838,"overflows":0.005235602094240838,"general":0.005235602094240838,"tasks":0.005235602094240838,"where":0.005235602094240838,"more":0.005235602094240838,"appropriate":0.005235602094240838,"due":0.005235602094240838,"its":0.005235602094240838},"175":{"1":0.006711409395973154,"2":0.006711409395973154,"3":0.006711409395973154,"4":0.006711409395973154,"6":0.006711409395973154,"7":0.006711409395973154,"function":0.006711409395973154,"signature":0.006711409395973154,"clarity":0.006711409395973154,"var-set":0.006711409395973154,"var-name":0.006711409395973154,"expr1":0.006711409395973154,"-":0.006711409395973154,"input":0.006711409395973154,"varname":0.006711409395973154,"anytype":0.006711409395973154,"output":0.006711409395973154,"bool":0.006711409395973154,"why":0.006711409395973154,"it":0.006711409395973154,"matters":0.006711409395973154,"the":0.006711409395973154,"is":0.006711409395973154,"crucial":0.006711409395973154,"for":0.006711409395973154,"setting":0.006711409395973154,"value":0.006711409395973154,"of":0.006711409395973154,"a":0.006711409395973154,"data":0.006711409395973154,"variable":0.006711409395973154,"implementing":0.006711409395973154,"logic":0.006711409395973154,"that":0.006711409395973154,"requires":0.006711409395973154,"updating":0.006711409395973154,"stored":0.006711409395973154,"ensuring":0.006711409395973154,"integrity":0.006711409395973154,"by":0.006711409395973154,"validating":0.006711409395973154,"update":0.006711409395973154,"process":0.006711409395973154,"simplifying":0.006711409395973154,"handling":0.006711409395973154,"variables":0.006711409395973154,"in":0.006711409395973154,"smart":0.006711409395973154,"contracts":0.006711409395973154,"when":0.006711409395973154,"to":0.006711409395973154,"use":0.006711409395973154,"you":0.006711409395973154,"need":0.006711409395973154,"set":0.006711409395973154,"implement":0.006711409395973154,"validate":0.006711409395973154,"ensure":0.006711409395973154,"handle":0.006711409395973154,"your":0.006711409395973154,"contract":0.006711409395973154,"best":0.006711409395973154,"practices":0.006711409395973154,"name":0.006711409395973154,"correctly":0.006711409395973154,"formatted":0.006711409395973154,"and":0.006711409395973154,"valid":0.006711409395973154,"meaningful":0.006711409395973154,"names":0.006711409395973154,"better":0.006711409395973154,"readability":0.006711409395973154,"combine":0.006711409395973154,"with":0.006711409395973154,"other":0.006711409395973154,"functions":0.006711409395973154,"comprehensive":0.006711409395973154,"management":0.006711409395973154,"possible":0.006711409395973154,"error":0.006711409395973154,"cases":0.006711409395973154,"robust":0.006711409395973154,"behavior":0.006711409395973154,"practical":0.006711409395973154,"example":0.006711409395973154,"let's":0.006711409395973154,"sets":0.006711409395973154,"define-data-var":0.006711409395973154,"cursor":0.006711409395973154,"int":0.006711409395973154,"define-public":0.006711409395973154,"increment-cursor":0.006711409395973154,"ok":0.006711409395973154,"var-get":0.006711409395973154,"usage":0.006711409395973154,"returns":0.006711409395973154,"this":0.006711409395973154,"demonstrates":0.006711409395973154,"using":0.006711409395973154,"public":0.006711409395973154,"both":0.006711409395973154,"successful":0.006711409395973154,"common":0.006711409395973154,"pitfalls":0.006711409395973154,"incorrectly":0.006711409395973154,"or":0.006711409395973154,"invalid":0.006711409395973154,"causing":0.006711409395973154,"runtime":0.006711409395973154,"errors":0.006711409395973154,"assuming":0.006711409395973154,"will":0.006711409395973154,"always":0.006711409395973154,"succeed":0.006711409395973154,"leading":0.006711409395973154,"unhandled":0.006711409395973154,"not":0.006711409395973154,"all":0.006711409395973154,"conditions":0.006711409395973154,"resulting":0.006711409395973154,"incomplete":0.006711409395973154,"overlooking":0.006711409395973154,"proper":0.006711409395973154,"validation":0.006711409395973154,"related":0.006711409395973154,"retrieves":0.006711409395973154,"map-set":0.006711409395973154,"map":0.006711409395973154,"default-to":0.006711409395973154,"provides":0.006711409395973154,"default":0.006711409395973154,"if":0.006711409395973154,"an":0.006711409395973154,"optional":0.006711409395973154,"none":0.006711409395973154,"conclusion":0.006711409395973154,"fundamental":0.006711409395973154,"tool":0.006711409395973154,"allows":0.006711409395973154,"used":0.006711409395973154,"effectively":0.006711409395973154,"enhances":0.006711409395973154,"reliability":0.006711409395973154,"maintainability":0.006711409395973154,"code":0.006711409395973154,"providing":0.006711409395973154,"clear":0.006711409395973154,"concise":0.006711409395973154,"way":0.006711409395973154},"176":{"1":0.004273504273504274,"2":0.004273504273504274,"3":0.004273504273504274,"4":0.004273504273504274,"5":0.004273504273504274,"the":0.004273504273504274,"less":0.004273504273504274,"than":0.004273504273504274,"or":0.004273504273504274,"equal":0.004273504273504274,"function":0.004273504273504274,"in":0.004273504273504274,"clarity":0.004273504273504274,"compares":0.004273504273504274,"two":0.004273504273504274,"values":0.004273504273504274,"and":0.004273504273504274,"returns":0.004273504273504274,"true":0.004273504273504274,"if":0.004273504273504274,"first":0.004273504273504274,"value":0.004273504273504274,"is":0.004273504273504274,"to":0.004273504273504274,"second":0.004273504273504274,"it's":0.004273504273504274,"a":0.004273504273504274,"fundamental":0.004273504273504274,"comparison":0.004273504273504274,"operation":0.004273504273504274,"used":0.004273504273504274,"many":0.004273504273504274,"smart":0.004273504273504274,"contract":0.004273504273504274,"conditions":0.004273504273504274,"logic":0.004273504273504274,"flows":0.004273504273504274,"signature":0.004273504273504274,"v1":0.004273504273504274,"v2":0.004273504273504274,"-":0.004273504273504274,"input":0.004273504273504274,"of":0.004273504273504274,"same":0.004273504273504274,"type":0.004273504273504274,"int":0.004273504273504274,"uint":0.004273504273504274,"string-ascii":0.004273504273504274,"string-utf8":0.004273504273504274,"buff":0.004273504273504274,"output":0.004273504273504274,"boolean":0.004273504273504274,"false":0.004273504273504274,"why":0.004273504273504274,"it":0.004273504273504274,"matters":0.004273504273504274,"crucial":0.004273504273504274,"for":0.004273504273504274,"implementing":0.004273504273504274,"conditional":0.004273504273504274,"contracts":0.004273504273504274,"comparing":0.004273504273504274,"numerical":0.004273504273504274,"financial":0.004273504273504274,"operations":0.004273504273504274,"ordering":0.004273504273504274,"sorting":0.004273504273504274,"data":0.004273504273504274,"maximum":0.004273504273504274,"thresholds":0.004273504273504274,"limits":0.004273504273504274,"checking":0.004273504273504274,"equality":0.004273504273504274,"alongside":0.004273504273504274,"comparisons":0.004273504273504274,"when":0.004273504273504274,"use":0.004273504273504274,"you":0.004273504273504274,"need":0.004273504273504274,"compare":0.004273504273504274,"determine":0.004273504273504274,"one":0.004273504273504274,"smaller":0.004273504273504274,"implement":0.004273504273504274,"certain":0.004273504273504274,"including":0.004273504273504274,"threshold":0.004273504273504274,"itself":0.004273504273504274,"create":0.004273504273504274,"based":0.004273504273504274,"on":0.004273504273504274,"sort":0.004273504273504274,"order":0.004273504273504274,"lexicographical":0.004273504273504274,"best":0.004273504273504274,"practices":0.004273504273504274,"ensure":0.004273504273504274,"that":0.004273504273504274,"both":0.004273504273504274,"inputs":0.004273504273504274,"are":0.004273504273504274,"avoid":0.004273504273504274,"runtime":0.004273504273504274,"errors":0.004273504273504274,"be":0.004273504273504274,"aware":0.004273504273504274,"differences":0.004273504273504274,"between":0.004273504273504274,"signed":0.004273504273504274,"unsigned":0.004273504273504274,"integers":0.004273504273504274,"strings":0.004273504273504274,"buffers":0.004273504273504274,"understand":0.004273504273504274,"consider":0.004273504273504274,"edge":0.004273504273504274,"cases":0.004273504273504274,"especially":0.004273504273504274,"dealing":0.004273504273504274,"with":0.004273504273504274,"integer":0.004273504273504274,"ranges":0.004273504273504274,"instead":0.004273504273504274,"want":0.004273504273504274,"include":0.004273504273504274,"your":0.004273504273504274,"practical":0.004273504273504274,"example":0.004273504273504274,"token":0.004273504273504274,"vesting":0.004273504273504274,"let's":0.004273504273504274,"simple":0.004273504273504274,"uses":0.004273504273504274,"manage":0.004273504273504274,"periods":0.004273504273504274,"define":0.004273504273504274,"constants":0.004273504273504274,"define-constant":0.004273504273504274,"vesting_period":0.004273504273504274,"u31536000":0.004273504273504274,"year":0.004273504273504274,"seconds":0.004273504273504274,"total_allocation":0.004273504273504274,"u1000000":0.004273504273504274,"million":0.004273504273504274,"tokens":0.004273504273504274,"variables":0.004273504273504274,"define-data-var":0.004273504273504274,"vestingstarttime":0.004273504273504274,"u0":0.004273504273504274,"tokensclaimed":0.004273504273504274,"start":0.004273504273504274,"define-public":0.004273504273504274,"start-vesting":0.004273504273504274,"begin":0.004273504273504274,"asserts":0.004273504273504274,"is-eq":0.004273504273504274,"var-get":0.004273504273504274,"err":0.004273504273504274,"u1":0.004273504273504274,"var-set":0.004273504273504274,"block-height":0.004273504273504274,"ok":0.004273504273504274,"calculate":0.004273504273504274,"vested":0.004273504273504274,"amount":0.004273504273504274,"define-read-only":0.004273504273504274,"get-vested-amount":0.004273504273504274,"let":0.004273504273504274,"elapsed-time":0.004273504273504274,"vesting-ratio":0.004273504273504274,"claim":0.004273504273504274,"claim-tokens":0.004273504273504274,"vested-amount":0.004273504273504274,"claimable-amount":0.004273504273504274,"u2":0.004273504273504274,"here":0.004273504273504274,"would":0.004273504273504274,"typically":0.004273504273504274,"transfer":0.004273504273504274,"simplicity":0.004273504273504274,"we're":0.004273504273504274,"just":0.004273504273504274,"returning":0.004273504273504274,"claimed":0.004273504273504274,"this":0.004273504273504274,"demonstrates":0.004273504273504274,"using":0.004273504273504274,"check":0.004273504273504274,"elapsed":0.004273504273504274,"time":0.004273504273504274,"within":0.004273504273504274,"period":0.004273504273504274,"combining":0.004273504273504274,"other":0.004273504273504274,"system":0.004273504273504274,"includes":0.004273504273504274,"exact":0.004273504273504274,"end":0.004273504273504274,"common":0.004273504273504274,"pitfalls":0.004273504273504274,"different":0.004273504273504274,"types":0.004273504273504274,"which":0.004273504273504274,"will":0.004273504273504274,"result":0.004273504273504274,"error":0.004273504273504274,"confusing":0.004273504273504274,"setting":0.004273504273504274,"potentially":0.004273504273504274,"excluding":0.004273504273504274,"valid":0.004273504273504274,"overlooking":0.004273504273504274,"inclusive":0.004273504273504274,"nature":0.004273504273504274,"boundary":0.004273504273504274,"related":0.004273504273504274,"functions":0.004273504273504274,"strict":0.004273504273504274,"greater":0.004273504273504274,"conclusion":0.004273504273504274,"tool":0.004273504273504274,"by":0.004273504273504274,"understanding":0.004273504273504274,"its":0.004273504273504274,"behavior":0.004273504273504274,"potential":0.004273504273504274,"can":0.004273504273504274,"robust":0.004273504273504274,"enforce":0.004273504273504274,"important":0.004273504273504274,"scenarios":0.004273504273504274,"where":0.004273504273504274,"condition":0.004273504273504274},"177":{"0":0.005291005291005291,"1":0.005291005291005291,"2":0.005291005291005291,"3":0.005291005291005291,"4":0.005291005291005291,"5":0.005291005291005291,"6":0.005291005291005291,"7":0.005291005291005291,"8":0.005291005291005291,"9":0.005291005291005291,"10":0.005291005291005291,"function":0.005291005291005291,"signature":0.005291005291005291,"clarity":0.005291005291005291,"filter":0.005291005291005291,"sequence":0.005291005291005291,"-":0.005291005291005291,"input":0.005291005291005291,"a":0.005291005291005291,"that":0.005291005291005291,"takes":0.005291005291005291,"one":0.005291005291005291,"argument":0.005291005291005291,"and":0.005291005291005291,"returns":0.005291005291005291,"boolean":0.005291005291005291,"list":0.005291005291005291,"buffer":0.005291005291005291,"or":0.005291005291005291,"string":0.005291005291005291,"to":0.005291005291005291,"iterate":0.005291005291005291,"over":0.005291005291005291,"output":0.005291005291005291,"new":0.005291005291005291,"containing":0.005291005291005291,"only":0.005291005291005291,"the":0.005291005291005291,"elements":0.005291005291005291,"for":0.005291005291005291,"which":0.005291005291005291,"returned":0.005291005291005291,"true":0.005291005291005291,"why":0.005291005291005291,"it":0.005291005291005291,"matters":0.005291005291005291,"is":0.005291005291005291,"crucial":0.005291005291005291,"selectively":0.005291005291005291,"processing":0.005291005291005291,"from":0.005291005291005291,"based":0.005291005291005291,"on":0.005291005291005291,"specific":0.005291005291005291,"criteria":0.005291005291005291,"removing":0.005291005291005291,"unwanted":0.005291005291005291,"without":0.005291005291005291,"modifying":0.005291005291005291,"original":0.005291005291005291,"implementing":0.005291005291005291,"complex":0.005291005291005291,"data":0.005291005291005291,"filtering":0.005291005291005291,"logic":0.005291005291005291,"within":0.005291005291005291,"smart":0.005291005291005291,"contracts":0.005291005291005291,"enhancing":0.005291005291005291,"manipulation":0.005291005291005291,"capabilities":0.005291005291005291,"in":0.005291005291005291,"when":0.005291005291005291,"use":0.005291005291005291,"you":0.005291005291005291,"need":0.005291005291005291,"create":0.005291005291005291,"subset":0.005291005291005291,"of":0.005291005291005291,"certain":0.005291005291005291,"conditions":0.005291005291005291,"remove":0.005291005291005291,"don't":0.005291005291005291,"meet":0.005291005291005291,"implement":0.005291005291005291,"validation":0.005291005291005291,"selection":0.005291005291005291,"lists":0.005291005291005291,"prepare":0.005291005291005291,"further":0.005291005291005291,"by":0.005291005291005291,"irrelevant":0.005291005291005291,"best":0.005291005291005291,"practices":0.005291005291005291,"ensure":0.005291005291005291,"predicate":0.005291005291005291,"efficient":0.005291005291005291,"especially":0.005291005291005291,"large":0.005291005291005291,"combination":0.005291005291005291,"with":0.005291005291005291,"other":0.005291005291005291,"functions":0.005291005291005291,"like":0.005291005291005291,"map":0.005291005291005291,"fold":0.005291005291005291,"operations":0.005291005291005291,"be":0.005291005291005291,"mindful":0.005291005291005291,"gas":0.005291005291005291,"costs":0.005291005291005291,"consider":0.005291005291005291,"using":0.005291005291005291,"define-private":0.005291005291005291,"reusable":0.005291005291005291,"practical":0.005291005291005291,"example":0.005291005291005291,"even":0.005291005291005291,"numbers":0.005291005291005291,"let's":0.005291005291005291,"filters":0.005291005291005291,"is-even":0.005291005291005291,"num":0.005291005291005291,"int":0.005291005291005291,"is-eq":0.005291005291005291,"mod":0.005291005291005291,"define-read-only":0.005291005291005291,"get-even-numbers":0.005291005291005291,"usage":0.005291005291005291,"this":0.005291005291005291,"demonstrates":0.005291005291005291,"defining":0.005291005291005291,"private":0.005291005291005291,"helper":0.005291005291005291,"check":0.005291005291005291,"if":0.005291005291005291,"number":0.005291005291005291,"applying":0.005291005291005291,"operation":0.005291005291005291,"integers":0.005291005291005291,"common":0.005291005291005291,"pitfalls":0.005291005291005291,"forgetting":0.005291005291005291,"creates":0.005291005291005291,"does":0.005291005291005291,"not":0.005291005291005291,"modify":0.005291005291005291,"computationally":0.005291005291005291,"expensive":0.005291005291005291,"could":0.005291005291005291,"lead":0.005291005291005291,"high":0.005291005291005291,"considering":0.005291005291005291,"potential":0.005291005291005291,"an":0.005291005291005291,"empty":0.005291005291005291,"result":0.005291005291005291,"no":0.005291005291005291,"match":0.005291005291005291,"related":0.005291005291005291,"applies":0.005291005291005291,"each":0.005291005291005291,"element":0.005291005291005291,"transforming":0.005291005291005291,"reduces":0.005291005291005291,"single":0.005291005291005291,"value":0.005291005291005291,"len":0.005291005291005291,"can":0.005291005291005291,"used":0.005291005291005291,"length":0.005291005291005291,"resulting":0.005291005291005291,"filtered":0.005291005291005291,"conclusion":0.005291005291005291,"powerful":0.005291005291005291,"tool":0.005291005291005291,"allows":0.005291005291005291,"refined":0.005291005291005291,"subsets":0.005291005291005291,"contract's":0.005291005291005291,"ability":0.005291005291005291,"process":0.005291005291005291,"analyze":0.005291005291005291,"list-based":0.005291005291005291,"information":0.005291005291005291,"effectively":0.005291005291005291,"significantly":0.005291005291005291,"improve":0.005291005291005291,"efficiency":0.005291005291005291},"178":{"1":0.004878048780487805,"2":0.004878048780487805,"3":0.004878048780487805,"4":0.004878048780487805,"function":0.004878048780487805,"signature":0.004878048780487805,"clarity":0.004878048780487805,"ft-mint":0.004878048780487805,"token-name":0.004878048780487805,"amount":0.004878048780487805,"recipient":0.004878048780487805,"-":0.004878048780487805,"input":0.004878048780487805,"the":0.004878048780487805,"name":0.004878048780487805,"of":0.004878048780487805,"fungible":0.004878048780487805,"token":0.004878048780487805,"tokens":0.004878048780487805,"to":0.004878048780487805,"mint":0.004878048780487805,"uint":0.004878048780487805,"principal":0.004878048780487805,"receive":0.004878048780487805,"newly":0.004878048780487805,"minted":0.004878048780487805,"output":0.004878048780487805,"response":0.004878048780487805,"bool":0.004878048780487805,"why":0.004878048780487805,"it":0.004878048780487805,"matters":0.004878048780487805,"is":0.004878048780487805,"crucial":0.004878048780487805,"for":0.004878048780487805,"creating":0.004878048780487805,"new":0.004878048780487805,"and":0.004878048780487805,"increasing":0.004878048780487805,"total":0.004878048780487805,"supply":0.004878048780487805,"a":0.004878048780487805,"implementing":0.004878048780487805,"issuance":0.004878048780487805,"mechanisms":0.004878048780487805,"in":0.004878048780487805,"smart":0.004878048780487805,"contracts":0.004878048780487805,"rewarding":0.004878048780487805,"users":0.004878048780487805,"or":0.004878048780487805,"other":0.004878048780487805,"with":0.004878048780487805,"created":0.004878048780487805,"managing":0.004878048780487805,"economy":0.004878048780487805,"within":0.004878048780487805,"decentralized":0.004878048780487805,"application":0.004878048780487805,"when":0.004878048780487805,"use":0.004878048780487805,"you":0.004878048780487805,"need":0.004878048780487805,"create":0.004878048780487805,"as":0.004878048780487805,"part":0.004878048780487805,"your":0.004878048780487805,"contract's":0.004878048780487805,"logic":0.004878048780487805,"implement":0.004878048780487805,"distribution":0.004878048780487805,"e":0.004878048780487805,"g":0.004878048780487805,"airdrops":0.004878048780487805,"rewards":0.004878048780487805,"increase":0.004878048780487805,"balance":0.004878048780487805,"specific":0.004878048780487805,"execute":0.004878048780487805,"minting":0.004878048780487805,"operations":0.004878048780487805,"based":0.004878048780487805,"on":0.004878048780487805,"certain":0.004878048780487805,"conditions":0.004878048780487805,"events":0.004878048780487805,"best":0.004878048780487805,"practices":0.004878048780487805,"proper":0.004878048780487805,"access":0.004878048780487805,"controls":0.004878048780487805,"restrict":0.004878048780487805,"who":0.004878048780487805,"can":0.004878048780487805,"consider":0.004878048780487805,"using":0.004878048780487805,"maximum":0.004878048780487805,"cap":0.004878048780487805,"prevent":0.004878048780487805,"unlimited":0.004878048780487805,"emit":0.004878048780487805,"logging":0.004878048780487805,"mechanism":0.004878048780487805,"track":0.004878048780487805,"transparency":0.004878048780487805,"be":0.004878048780487805,"cautious":0.004878048780487805,"potential":0.004878048780487805,"overflow":0.004878048780487805,"large":0.004878048780487805,"amounts":0.004878048780487805,"practical":0.004878048780487805,"example":0.004878048780487805,"reward":0.004878048780487805,"let's":0.004878048780487805,"simple":0.004878048780487805,"system":0.004878048780487805,"that":0.004878048780487805,"mints":0.004878048780487805,"define-fungible-token":0.004878048780487805,"rewardtoken":0.004878048780487805,"define-constant":0.004878048780487805,"contract_owner":0.004878048780487805,"tx-sender":0.004878048780487805,"define-public":0.004878048780487805,"mint-reward":0.004878048780487805,"begin":0.004878048780487805,"asserts":0.004878048780487805,"is-eq":0.004878048780487805,"err":0.004878048780487805,"u403":0.004878048780487805,"usage":0.004878048780487805,"u100":0.004878048780487805,"'spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf":0.004878048780487805,"returns":0.004878048780487805,"ok":0.004878048780487805,"true":0.004878048780487805,"if":0.004878048780487805,"called":0.004878048780487805,"by":0.004878048780487805,"this":0.004878048780487805,"demonstrates":0.004878048780487805,"assign":0.004878048780487805,"them":0.004878048780487805,"basic":0.004878048780487805,"control":0.004878048780487805,"check":0.004878048780487805,"before":0.004878048780487805,"returning":0.004878048780487805,"result":0.004878048780487805,"operation":0.004878048780487805,"common":0.004878048780487805,"pitfalls":0.004878048780487805,"without":0.004878048780487805,"allowing":0.004878048780487805,"unauthorized":0.004878048780487805,"creation":0.004878048780487805,"not":0.004878048780487805,"considering":0.004878048780487805,"limit":0.004878048780487805,"potentially":0.004878048780487805,"leading":0.004878048780487805,"economic":0.004878048780487805,"imbalances":0.004878048780487805,"forgetting":0.004878048780487805,"handle":0.004878048780487805,"error":0.004878048780487805,"case":0.004878048780487805,"fails":0.004878048780487805,"due":0.004878048780487805,"overlooking":0.004878048780487805,"gas":0.004878048780487805,"costs":0.004878048780487805,"associated":0.004878048780487805,"especially":0.004878048780487805,"related":0.004878048780487805,"functions":0.004878048780487805,"ft-burn":0.004878048780487805,"used":0.004878048780487805,"destroy":0.004878048780487805,"decreasing":0.004878048780487805,"ft-transfer":0.004878048780487805,"transfer":0.004878048780487805,"between":0.004878048780487805,"principals":0.004878048780487805,"ft-get-balance":0.004878048780487805,"ft-get-supply":0.004878048780487805,"get":0.004878048780487805,"current":0.004878048780487805,"conclusion":0.004878048780487805,"fundamental":0.004878048780487805,"tool":0.004878048780487805,"allows":0.004878048780487805,"controlled":0.004878048780487805,"specified":0.004878048780487805,"recipients":0.004878048780487805,"responsibly":0.004878048780487805,"management":0.004878048780487805,"enables":0.004878048780487805,"implementation":0.004878048780487805,"sophisticated":0.004878048780487805,"economies":0.004878048780487805,"applications":0.004878048780487805,"stacks":0.004878048780487805,"blockchain":0.004878048780487805},"179":{"0":0.005714285714285714,"1":0.005714285714285714,"2":0.005714285714285714,"3":0.005714285714285714,"4":0.005714285714285714,"16":0.005714285714285714,"function":0.005714285714285714,"signature":0.005714285714285714,"clarity":0.005714285714285714,"buff-to-int-le":0.005714285714285714,"buff":0.005714285714285714,"-":0.005714285714285714,"input":0.005714285714285714,"a":0.005714285714285714,"byte":0.005714285714285714,"buffer":0.005714285714285714,"of":0.005714285714285714,"up":0.005714285714285714,"to":0.005714285714285714,"bytes":0.005714285714285714,"output":0.005714285714285714,"signed":0.005714285714285714,"integer":0.005714285714285714,"int":0.005714285714285714,"why":0.005714285714285714,"it":0.005714285714285714,"matters":0.005714285714285714,"the":0.005714285714285714,"is":0.005714285714285714,"crucial":0.005714285714285714,"for":0.005714285714285714,"converting":0.005714285714285714,"data":0.005714285714285714,"integers":0.005714285714285714,"using":0.005714285714285714,"little-endian":0.005714285714285714,"encoding":0.005714285714285714,"handling":0.005714285714285714,"from":0.005714285714285714,"external":0.005714285714285714,"sources":0.005714285714285714,"or":0.005714285714285714,"other":0.005714285714285714,"contracts":0.005714285714285714,"that":0.005714285714285714,"use":0.005714285714285714,"implementing":0.005714285714285714,"protocols":0.005714285714285714,"algorithms":0.005714285714285714,"require":0.005714285714285714,"representation":0.005714285714285714,"interoperating":0.005714285714285714,"with":0.005714285714285714,"systems":0.005714285714285714,"order":0.005714285714285714,"when":0.005714285714285714,"you":0.005714285714285714,"need":0.005714285714285714,"convert":0.005714285714285714,"encoded":0.005714285714285714,"process":0.005714285714285714,"represents":0.005714285714285714,"in":0.005714285714285714,"format":0.005714285714285714,"implement":0.005714285714285714,"cryptographic":0.005714285714285714,"mathematical":0.005714285714285714,"operations":0.005714285714285714,"expect":0.005714285714285714,"inputs":0.005714285714285714,"ensure":0.005714285714285714,"compatibility":0.005714285714285714,"best":0.005714285714285714,"practices":0.005714285714285714,"no":0.005714285714285714,"larger":0.005714285714285714,"than":0.005714285714285714,"avoid":0.005714285714285714,"errors":0.005714285714285714,"be":0.005714285714285714,"aware":0.005714285714285714,"smaller":0.005714285714285714,"buffers":0.005714285714285714,"are":0.005714285714285714,"zero-padded":0.005714285714285714,"on":0.005714285714285714,"right":0.005714285714285714,"affecting":0.005714285714285714,"resulting":0.005714285714285714,"value":0.005714285714285714,"consider":0.005714285714285714,"buff-to-uint-le":0.005714285714285714,"unsigned":0.005714285714285714,"if":0.005714285714285714,"sign":0.005714285714285714,"not":0.005714285714285714,"needed":0.005714285714285714,"handle":0.005714285714285714,"potential":0.005714285714285714,"might":0.005714285714285714,"invalid":0.005714285714285714,"empty":0.005714285714285714,"practical":0.005714285714285714,"example":0.005714285714285714,"decoding":0.005714285714285714,"let's":0.005714285714285714,"processes":0.005714285714285714,"containing":0.005714285714285714,"define-read-only":0.005714285714285714,"process-external-data-le":0.005714285714285714,"let":0.005714285714285714,"err":0.005714285714285714,"negative":0.005714285714285714,"allowed":0.005714285714285714,"ok":0.005714285714285714,"usage":0.005714285714285714,"0x01000000000000000000000000000000":0.005714285714285714,"returns":0.005714285714285714,"0xffffffffffffffffffffffffffffffff":0.005714285714285714,"0xffffffffffffffffffffffffffffff7f":0.005714285714285714,"9223372036854775807":0.005714285714285714,"this":0.005714285714285714,"demonstrates":0.005714285714285714,"both":0.005714285714285714,"positive":0.005714285714285714,"and":0.005714285714285714,"values":0.005714285714285714,"conversion":0.005714285714285714,"validation":0.005714285714285714,"based":0.005714285714285714,"converted":0.005714285714285714,"common":0.005714285714285714,"pitfalls":0.005714285714285714,"confusing":0.005714285714285714,"big-endian":0.005714285714285714,"leading":0.005714285714285714,"incorrect":0.005714285714285714,"working":0.005714285714285714,"assuming":0.005714285714285714,"specific":0.005714285714285714,"length":0.005714285714285714,"which":0.005714285714285714,"could":0.005714285714285714,"lead":0.005714285714285714,"unexpected":0.005714285714285714,"results":0.005714285714285714,"shorter":0.005714285714285714,"due":0.005714285714285714,"right-padding":0.005714285714285714,"related":0.005714285714285714,"functions":0.005714285714285714,"buff-to-int-be":0.005714285714285714,"converts":0.005714285714285714,"an":0.005714285714285714,"int-to-ascii":0.005714285714285714,"its":0.005714285714285714,"ascii":0.005714285714285714,"string":0.005714285714285714,"conclusion":0.005714285714285714,"powerful":0.005714285714285714,"tool":0.005714285714285714,"smart":0.005714285714285714,"by":0.005714285714285714,"understanding":0.005714285714285714,"behavior":0.005714285714285714,"different":0.005714285714285714,"sizes":0.005714285714285714,"issues":0.005714285714285714,"can":0.005714285714285714,"effectively":0.005714285714285714,"validate":0.005714285714285714,"complex":0.005714285714285714,"your":0.005714285714285714,"contract":0.005714285714285714,"applications":0.005714285714285714},"180":{"1":0.004424778761061947,"2":0.004424778761061947,"3":0.004424778761061947,"4":0.004424778761061947,"10":0.004424778761061947,"50":0.004424778761061947,"function":0.004424778761061947,"signature":0.004424778761061947,"clarity":0.004424778761061947,"element-at":0.004424778761061947,"list-expr":0.004424778761061947,"uint":0.004424778761061947,"-":0.004424778761061947,"input":0.004424778761061947,"a":0.004424778761061947,"list":0.004424778761061947,"expression":0.004424778761061947,"an":0.004424778761061947,"unsigned":0.004424778761061947,"integer":0.004424778761061947,"representing":0.004424778761061947,"the":0.004424778761061947,"index":0.004424778761061947,"output":0.004424778761061947,"optional":0.004424778761061947,"where":0.004424778761061947,"is":0.004424778761061947,"type":0.004424778761061947,"of":0.004424778761061947,"elements":0.004424778761061947,"in":0.004424778761061947,"why":0.004424778761061947,"it":0.004424778761061947,"matters":0.004424778761061947,"crucial":0.004424778761061947,"for":0.004424778761061947,"safely":0.004424778761061947,"accessing":0.004424778761061947,"at":0.004424778761061947,"specific":0.004424778761061947,"handling":0.004424778761061947,"potential":0.004424778761061947,"out-of-bounds":0.004424778761061947,"access":0.004424778761061947,"without":0.004424778761061947,"causing":0.004424778761061947,"errors":0.004424778761061947,"implementing":0.004424778761061947,"logic":0.004424778761061947,"that":0.004424778761061947,"depends":0.004424778761061947,"on":0.004424778761061947,"retrieving":0.004424778761061947,"from":0.004424778761061947,"lists":0.004424778761061947,"providing":0.004424778761061947,"way":0.004424778761061947,"to":0.004424778761061947,"work":0.004424778761061947,"with":0.004424778761061947,"more":0.004424778761061947,"flexible":0.004424778761061947,"manner":0.004424778761061947,"when":0.004424778761061947,"use":0.004424778761061947,"you":0.004424778761061947,"need":0.004424778761061947,"retrieve":0.004424778761061947,"element":0.004424778761061947,"by":0.004424778761061947,"its":0.004424778761061947,"position":0.004424778761061947,"implement":0.004424778761061947,"algorithms":0.004424778761061947,"require":0.004424778761061947,"handle":0.004424778761061947,"operations":0.004424778761061947,"may":0.004424778761061947,"involve":0.004424778761061947,"varying":0.004424778761061947,"positions":0.004424778761061947,"best":0.004424778761061947,"practices":0.004424778761061947,"always":0.004424778761061947,"check":0.004424778761061947,"returned":0.004424778761061947,"value":0.004424778761061947,"cases":0.004424778761061947,"out":0.004424778761061947,"bounds":0.004424778761061947,"combination":0.004424778761061947,"len":0.004424778761061947,"ensure":0.004424778761061947,"you're":0.004424778761061947,"not":0.004424778761061947,"attempting":0.004424778761061947,"beyond":0.004424778761061947,"list's":0.004424778761061947,"length":0.004424778761061947,"consider":0.004424778761061947,"using":0.004424778761061947,"map":0.004424778761061947,"or":0.004424778761061947,"fold":0.004424778761061947,"process":0.004424778761061947,"all":0.004424778761061947,"instead":0.004424778761061947,"be":0.004424778761061947,"mindful":0.004424778761061947,"zero-based":0.004424778761061947,"indexing":0.004424778761061947,"practical":0.004424778761061947,"example":0.004424778761061947,"item":0.004424778761061947,"let's":0.004424778761061947,"retrieves":0.004424778761061947,"todo":0.004424778761061947,"define-data-var":0.004424778761061947,"todolist":0.004424778761061947,"string-ascii":0.004424778761061947,"define-public":0.004424778761061947,"add-todo":0.004424778761061947,"let":0.004424778761061947,"currentlist":0.004424778761061947,"var-get":0.004424778761061947,"newlist":0.004424778761061947,"as-max-len":0.004424778761061947,"append":0.004424778761061947,"u10":0.004424778761061947,"match":0.004424778761061947,"newlistvalue":0.004424778761061947,"ok":0.004424778761061947,"var-set":0.004424778761061947,"err":0.004424778761061947,"u1":0.004424778761061947,"define-read-only":0.004424778761061947,"get-todo":0.004424778761061947,"u404":0.004424778761061947,"usage":0.004424778761061947,"buy":0.004424778761061947,"milk":0.004424778761061947,"walk":0.004424778761061947,"dog":0.004424778761061947,"returns":0.004424778761061947,"u5":0.004424778761061947,"this":0.004424778761061947,"demonstrates":0.004424778761061947,"stored":0.004424778761061947,"data":0.004424778761061947,"variable":0.004424778761061947,"return":0.004424778761061947,"provide":0.004424778761061947,"meaningful":0.004424778761061947,"responses":0.004424778761061947,"risking":0.004424778761061947,"common":0.004424778761061947,"pitfalls":0.004424778761061947,"forgetting":0.004424778761061947,"indices":0.004424778761061947,"are":0.004424778761061947,"case":0.004424778761061947,"none":0.004424778761061947,"loop":0.004424778761061947,"which":0.004424778761061947,"less":0.004424778761061947,"efficient":0.004424778761061947,"than":0.004424778761061947,"related":0.004424778761061947,"functions":0.004424778761061947,"used":0.004424778761061947,"create":0.004424778761061947,"can":0.004424778761061947,"accessed":0.004424778761061947,"often":0.004424778761061947,"conjunction":0.004424778761061947,"alternative":0.004424778761061947,"processing":0.004424778761061947,"another":0.004424778761061947,"reducing":0.004424778761061947,"single":0.004424778761061947,"version":0.004424778761061947,"was":0.004424778761061947,"named":0.004424778761061947,"question":0.004424778761061947,"mark":0.004424778761061947,"and":0.004424778761061947,"had":0.004424778761061947,"slightly":0.004424778761061947,"different":0.004424778761061947,"behavior":0.004424778761061947,"key":0.004424778761061947,"differences":0.004424778761061947,"directly":0.004424778761061947,"wrapped":0.004424778761061947,"throws":0.004424778761061947,"runtime":0.004424778761061947,"error":0.004424778761061947,"if":0.004424778761061947,"migrating":0.004424778761061947,"newer":0.004424778761061947,"versions":0.004424778761061947,"replace":0.004424778761061947,"add":0.004424778761061947,"appropriate":0.004424778761061947,"conclusion":0.004424778761061947,"safer":0.004424778761061947,"smart":0.004424778761061947,"contracts":0.004424778761061947,"compared":0.004424778761061947,"predecessor":0.004424778761061947,"returning":0.004424778761061947,"allows":0.004424778761061947,"gracefully":0.004424778761061947,"leading":0.004424778761061947,"robust":0.004424778761061947,"error-resistant":0.004424778761061947,"code":0.004424778761061947,"working":0.004424778761061947,"essential":0.004424778761061947,"tool":0.004424778761061947,"while":0.004424778761061947,"maintaining":0.004424778761061947,"integrity":0.004424778761061947,"safety":0.004424778761061947,"your":0.004424778761061947,"contract":0.004424778761061947},"181":{"1":0.006944444444444444,"2":0.006944444444444444,"3":0.006944444444444444,"4":0.006944444444444444,"32":0.006944444444444444,"64":0.006944444444444444,"256":0.006944444444444444,"function":0.006944444444444444,"signature":0.006944444444444444,"clarity":0.006944444444444444,"sha512":0.006944444444444444,"value":0.006944444444444444,"-":0.006944444444444444,"input":0.006944444444444444,"buff":0.006944444444444444,"uint":0.006944444444444444,"int":0.006944444444444444,"output":0.006944444444444444,"why":0.006944444444444444,"it":0.006944444444444444,"matters":0.006944444444444444,"the":0.006944444444444444,"is":0.006944444444444444,"crucial":0.006944444444444444,"for":0.006944444444444444,"computing":0.006944444444444444,"sha-512":0.006944444444444444,"hash":0.006944444444444444,"of":0.006944444444444444,"a":0.006944444444444444,"given":0.006944444444444444,"implementing":0.006944444444444444,"cryptographic":0.006944444444444444,"operations":0.006944444444444444,"in":0.006944444444444444,"smart":0.006944444444444444,"contracts":0.006944444444444444,"ensuring":0.006944444444444444,"data":0.006944444444444444,"integrity":0.006944444444444444,"by":0.006944444444444444,"generating":0.006944444444444444,"unique":0.006944444444444444,"hashes":0.006944444444444444,"simplifying":0.006944444444444444,"process":0.006944444444444444,"handling":0.006944444444444444,"hashing":0.006944444444444444,"when":0.006944444444444444,"to":0.006944444444444444,"use":0.006944444444444444,"you":0.006944444444444444,"need":0.006944444444444444,"compute":0.006944444444444444,"implement":0.006944444444444444,"your":0.006944444444444444,"contract":0.006944444444444444,"generate":0.006944444444444444,"ensure":0.006944444444444444,"handle":0.006944444444444444,"best":0.006944444444444444,"practices":0.006944444444444444,"correctly":0.006944444444444444,"formatted":0.006944444444444444,"and":0.006944444444444444,"valid":0.006944444444444444,"meaningful":0.006944444444444444,"variable":0.006944444444444444,"names":0.006944444444444444,"better":0.006944444444444444,"readability":0.006944444444444444,"combine":0.006944444444444444,"with":0.006944444444444444,"other":0.006944444444444444,"functions":0.006944444444444444,"comprehensive":0.006944444444444444,"security":0.006944444444444444,"management":0.006944444444444444,"possible":0.006944444444444444,"error":0.006944444444444444,"cases":0.006944444444444444,"robust":0.006944444444444444,"behavior":0.006944444444444444,"practical":0.006944444444444444,"example":0.006944444444444444,"let's":0.006944444444444444,"that":0.006944444444444444,"computes":0.006944444444444444,"buffer":0.006944444444444444,"define-read-only":0.006944444444444444,"compute-sha512":0.006944444444444444,"usage":0.006944444444444444,"0x68656c6c6f20776f726c64000000000000000000000000000000000000000000":0.006944444444444444,"returns":0.006944444444444444,"0x638f0da7489fae1f981a47199a2854d0fa117cea82bd86049930aa86e565c6cdccd52fc0e6bba5a135961ed5b7360d5e2b0ff65889acbac01361f5e291a6da45":0.006944444444444444,"this":0.006944444444444444,"demonstrates":0.006944444444444444,"using":0.006944444444444444,"public":0.006944444444444444,"computation":0.006944444444444444,"both":0.006944444444444444,"successful":0.006944444444444444,"common":0.006944444444444444,"pitfalls":0.006944444444444444,"incorrectly":0.006944444444444444,"or":0.006944444444444444,"invalid":0.006944444444444444,"values":0.006944444444444444,"causing":0.006944444444444444,"operation":0.006944444444444444,"fail":0.006944444444444444,"assuming":0.006944444444444444,"will":0.006944444444444444,"always":0.006944444444444444,"be":0.006944444444444444,"leading":0.006944444444444444,"unhandled":0.006944444444444444,"not":0.006944444444444444,"all":0.006944444444444444,"conditions":0.006944444444444444,"resulting":0.006944444444444444,"incomplete":0.006944444444444444,"overlooking":0.006944444444444444,"proper":0.006944444444444444,"validation":0.006944444444444444,"related":0.006944444444444444,"sha256":0.006944444444444444,"sha-256":0.006944444444444444,"keccak256":0.006944444444444444,"keccak-256":0.006944444444444444,"conclusion":0.006944444444444444,"fundamental":0.006944444444444444,"tool":0.006944444444444444,"allows":0.006944444444444444,"used":0.006944444444444444,"effectively":0.006944444444444444,"enhances":0.006944444444444444,"reliability":0.006944444444444444,"maintainability":0.006944444444444444,"code":0.006944444444444444,"providing":0.006944444444444444,"clear":0.006944444444444444,"concise":0.006944444444444444,"way":0.006944444444444444},"182":{"1":0.005649717514124294,"2":0.005649717514124294,"3":0.005649717514124294,"4":0.005649717514124294,"20":0.005649717514124294,"function":0.005649717514124294,"signature":0.005649717514124294,"clarity":0.005649717514124294,"concat":0.005649717514124294,"sequence1":0.005649717514124294,"sequence2":0.005649717514124294,"-":0.005649717514124294,"input":0.005649717514124294,"two":0.005649717514124294,"sequences":0.005649717514124294,"of":0.005649717514124294,"the":0.005649717514124294,"same":0.005649717514124294,"type":0.005649717514124294,"sequence_a":0.005649717514124294,"output":0.005649717514124294,"a":0.005649717514124294,"concatenated":0.005649717514124294,"sequence":0.005649717514124294,"why":0.005649717514124294,"it":0.005649717514124294,"matters":0.005649717514124294,"is":0.005649717514124294,"crucial":0.005649717514124294,"for":0.005649717514124294,"combining":0.005649717514124294,"into":0.005649717514124294,"single":0.005649717514124294,"building":0.005649717514124294,"longer":0.005649717514124294,"strings":0.005649717514124294,"buffers":0.005649717514124294,"or":0.005649717514124294,"lists":0.005649717514124294,"from":0.005649717514124294,"smaller":0.005649717514124294,"components":0.005649717514124294,"dynamically":0.005649717514124294,"constructing":0.005649717514124294,"data":0.005649717514124294,"structures":0.005649717514124294,"in":0.005649717514124294,"smart":0.005649717514124294,"contracts":0.005649717514124294,"implementing":0.005649717514124294,"string":0.005649717514124294,"manipulation":0.005649717514124294,"operations":0.005649717514124294,"when":0.005649717514124294,"to":0.005649717514124294,"use":0.005649717514124294,"you":0.005649717514124294,"need":0.005649717514124294,"join":0.005649717514124294,"together":0.005649717514124294,"combine":0.005649717514124294,"byte":0.005649717514124294,"buffer":0.005649717514124294,"merge":0.005649717514124294,"list":0.005649717514124294,"build":0.005649717514124294,"complex":0.005649717514124294,"simpler":0.005649717514124294,"best":0.005649717514124294,"practices":0.005649717514124294,"ensure":0.005649717514124294,"that":0.005649717514124294,"both":0.005649717514124294,"are":0.005649717514124294,"e":0.005649717514124294,"g":0.005649717514124294,"be":0.005649717514124294,"aware":0.005649717514124294,"maximum":0.005649717514124294,"length":0.005649717514124294,"limitations":0.005649717514124294,"resulting":0.005649717514124294,"consider":0.005649717514124294,"using":0.005649717514124294,"combination":0.005649717514124294,"with":0.005649717514124294,"other":0.005649717514124294,"functions":0.005649717514124294,"more":0.005649717514124294,"working":0.005649717514124294,"remember":0.005649717514124294,"distinguishes":0.005649717514124294,"between":0.005649717514124294,"ascii":0.005649717514124294,"and":0.005649717514124294,"utf-8":0.005649717514124294,"practical":0.005649717514124294,"example":0.005649717514124294,"dynamic":0.005649717514124294,"message":0.005649717514124294,"construction":0.005649717514124294,"let's":0.005649717514124294,"implement":0.005649717514124294,"constructs":0.005649717514124294,"personalized":0.005649717514124294,"define-public":0.005649717514124294,"create-greeting":0.005649717514124294,"name":0.005649717514124294,"string-ascii":0.005649717514124294,"ok":0.005649717514124294,"hello":0.005649717514124294,"welcome":0.005649717514124294,"our":0.005649717514124294,"dapp":0.005649717514124294,"usage":0.005649717514124294,"alice":0.005649717514124294,"returns":0.005649717514124294,"this":0.005649717514124294,"demonstrates":0.005649717514124294,"multiple":0.005649717514124294,"nesting":0.005649717514124294,"calls":0.005649717514124294,"static":0.005649717514124294,"parts":0.005649717514124294,"common":0.005649717514124294,"pitfalls":0.005649717514124294,"attempting":0.005649717514124294,"concatenate":0.005649717514124294,"different":0.005649717514124294,"types":0.005649717514124294,"which":0.005649717514124294,"will":0.005649717514124294,"result":0.005649717514124294,"an":0.005649717514124294,"error":0.005649717514124294,"not":0.005649717514124294,"considering":0.005649717514124294,"potentially":0.005649717514124294,"leading":0.005649717514124294,"truncation":0.005649717514124294,"forgetting":0.005649717514124294,"only":0.005649717514124294,"works":0.005649717514124294,"at":0.005649717514124294,"time":0.005649717514124294,"requiring":0.005649717514124294,"nested":0.005649717514124294,"concatenations":0.005649717514124294,"related":0.005649717514124294,"len":0.005649717514124294,"used":0.005649717514124294,"get":0.005649717514124294,"slice":0.005649717514124294,"can":0.005649717514124294,"extract":0.005649717514124294,"before":0.005649717514124294,"concatenation":0.005649717514124294,"append":0.005649717514124294,"add":0.005649717514124294,"elements":0.005649717514124294,"end":0.005649717514124294,"similar":0.005649717514124294,"conclusion":0.005649717514124294,"versatile":0.005649717514124294,"tool":0.005649717514124294,"whether":0.005649717514124294,"you're":0.005649717514124294,"provides":0.005649717514124294,"straightforward":0.005649717514124294,"way":0.005649717514124294,"by":0.005649717514124294,"understanding":0.005649717514124294,"its":0.005649717514124294,"behavior":0.005649717514124294,"effectively":0.005649717514124294,"various":0.005649717514124294,"your":0.005649717514124294},"183":{"1":0.006024096385542169,"2":0.006024096385542169,"3":0.006024096385542169,"4":0.006024096385542169,"5":0.006024096385542169,"6":0.006024096385542169,"10":0.006024096385542169,"function":0.006024096385542169,"signature":0.006024096385542169,"clarity":0.006024096385542169,"index-of":0.006024096385542169,"list":0.006024096385542169,"element":0.006024096385542169,"-":0.006024096385542169,"input":0.006024096385542169,"a":0.006024096385542169,"of":0.006024096385542169,"elements":0.006024096385542169,"the":0.006024096385542169,"to":0.006024096385542169,"find":0.006024096385542169,"in":0.006024096385542169,"output":0.006024096385542169,"optional":0.006024096385542169,"uint":0.006024096385542169,"why":0.006024096385542169,"it":0.006024096385542169,"matters":0.006024096385542169,"is":0.006024096385542169,"crucial":0.006024096385542169,"for":0.006024096385542169,"locating":0.006024096385542169,"position":0.006024096385542169,"an":0.006024096385542169,"within":0.006024096385542169,"implementing":0.006024096385542169,"search":0.006024096385542169,"functionality":0.006024096385542169,"smart":0.006024096385542169,"contracts":0.006024096385542169,"enabling":0.006024096385542169,"conditional":0.006024096385542169,"logic":0.006024096385542169,"based":0.006024096385542169,"on":0.006024096385542169,"presence":0.006024096385542169,"and":0.006024096385542169,"simplifying":0.006024096385542169,"operations":0.006024096385542169,"by":0.006024096385542169,"providing":0.006024096385542169,"built-in":0.006024096385542169,"mechanism":0.006024096385542169,"when":0.006024096385542169,"use":0.006024096385542169,"you":0.006024096385542169,"need":0.006024096385542169,"determine":0.006024096385542169,"check":0.006024096385542169,"if":0.006024096385542169,"exists":0.006024096385542169,"retrieve":0.006024096385542169,"its":0.006024096385542169,"index":0.006024096385542169,"implement":0.006024096385542169,"that":0.006024096385542169,"depends":0.006024096385542169,"order":0.006024096385542169,"or":0.006024096385542169,"simplify":0.006024096385542169,"without":0.006024096385542169,"writing":0.006024096385542169,"custom":0.006024096385542169,"loops":0.006024096385542169,"best":0.006024096385542169,"practices":0.006024096385542169,"ensure":0.006024096385542169,"types":0.006024096385542169,"are":0.006024096385542169,"compatible":0.006024096385542169,"handle":0.006024096385542169,"none":0.006024096385542169,"case":0.006024096385542169,"not":0.006024096385542169,"found":0.006024096385542169,"meaningful":0.006024096385542169,"variable":0.006024096385542169,"names":0.006024096385542169,"better":0.006024096385542169,"readability":0.006024096385542169,"consider":0.006024096385542169,"performance":0.006024096385542169,"implications":0.006024096385542169,"searching":0.006024096385542169,"large":0.006024096385542169,"lists":0.006024096385542169,"practical":0.006024096385542169,"example":0.006024096385542169,"finding":0.006024096385542169,"let's":0.006024096385542169,"finds":0.006024096385542169,"given":0.006024096385542169,"integers":0.006024096385542169,"define-read-only":0.006024096385542169,"find-index":0.006024096385542169,"int":0.006024096385542169,"numbers":0.006024096385542169,"usage":0.006024096385542169,"returns":0.006024096385542169,"some":0.006024096385542169,"u2":0.006024096385542169,"this":0.006024096385542169,"demonstrates":0.006024096385542169,"using":0.006024096385542169,"handling":0.006024096385542169,"both":0.006024096385542169,"where":0.006024096385542169,"common":0.006024096385542169,"pitfalls":0.006024096385542169,"assuming":0.006024096385542169,"will":0.006024096385542169,"always":0.006024096385542169,"be":0.006024096385542169,"leading":0.006024096385542169,"unhandled":0.006024096385542169,"cases":0.006024096385542169,"with":0.006024096385542169,"incompatible":0.006024096385542169,"overlooking":0.006024096385542169,"impact":0.006024096385542169,"very":0.006024096385542169,"considering":0.006024096385542169,"0-based":0.006024096385542169,"related":0.006024096385542169,"functions":0.006024096385542169,"filter":0.006024096385542169,"used":0.006024096385542169,"create":0.006024096385542169,"new":0.006024096385542169,"containing":0.006024096385542169,"only":0.006024096385542169,"match":0.006024096385542169,"condition":0.006024096385542169,"map":0.006024096385542169,"applies":0.006024096385542169,"each":0.006024096385542169,"transforming":0.006024096385542169,"len":0.006024096385542169,"length":0.006024096385542169,"conclusion":0.006024096385542169,"powerful":0.006024096385542169,"tool":0.006024096385542169,"provides":0.006024096385542169,"straightforward":0.006024096385542169,"way":0.006024096385542169,"their":0.006024096385542169,"positions":0.006024096385542169,"more":0.006024096385542169,"complex":0.006024096385542169,"effectively":0.006024096385542169,"simplifies":0.006024096385542169,"enhances":0.006024096385542169,"maintainability":0.006024096385542169,"your":0.006024096385542169,"contract":0.006024096385542169,"code":0.006024096385542169},"184":{"1":0.006060606060606061,"2":0.006060606060606061,"3":0.006060606060606061,"4":0.006060606060606061,"34":0.006060606060606061,"function":0.006060606060606061,"signature":0.006060606060606061,"clarity":0.006060606060606061,"stx-transfer-memo":0.006060606060606061,"amount":0.006060606060606061,"sender":0.006060606060606061,"recipient":0.006060606060606061,"memo":0.006060606060606061,"-":0.006060606060606061,"input":0.006060606060606061,"uint":0.006060606060606061,"principal":0.006060606060606061,"buff":0.006060606060606061,"output":0.006060606060606061,"response":0.006060606060606061,"bool":0.006060606060606061,"why":0.006060606060606061,"it":0.006060606060606061,"matters":0.006060606060606061,"the":0.006060606060606061,"is":0.006060606060606061,"crucial":0.006060606060606061,"for":0.006060606060606061,"transferring":0.006060606060606061,"stx":0.006060606060606061,"between":0.006060606060606061,"principals":0.006060606060606061,"with":0.006060606060606061,"an":0.006060606060606061,"additional":0.006060606060606061,"field":0.006060606060606061,"implementing":0.006060606060606061,"logic":0.006060606060606061,"that":0.006060606060606061,"requires":0.006060606060606061,"recording":0.006060606060606061,"a":0.006060606060606061,"each":0.006060606060606061,"transfer":0.006060606060606061,"ensuring":0.006060606060606061,"data":0.006060606060606061,"integrity":0.006060606060606061,"by":0.006060606060606061,"validating":0.006060606060606061,"operation":0.006060606060606061,"simplifying":0.006060606060606061,"process":0.006060606060606061,"of":0.006060606060606061,"handling":0.006060606060606061,"transfers":0.006060606060606061,"memos":0.006060606060606061,"in":0.006060606060606061,"smart":0.006060606060606061,"contracts":0.006060606060606061,"when":0.006060606060606061,"to":0.006060606060606061,"use":0.006060606060606061,"you":0.006060606060606061,"need":0.006060606060606061,"implement":0.006060606060606061,"validate":0.006060606060606061,"ensure":0.006060606060606061,"handle":0.006060606060606061,"your":0.006060606060606061,"contract":0.006060606060606061,"best":0.006060606060606061,"practices":0.006060606060606061,"positive":0.006060606060606061,"and":0.006060606060606061,"has":0.006060606060606061,"sufficient":0.006060606060606061,"balance":0.006060606060606061,"meaningful":0.006060606060606061,"variable":0.006060606060606061,"names":0.006060606060606061,"better":0.006060606060606061,"readability":0.006060606060606061,"combine":0.006060606060606061,"other":0.006060606060606061,"functions":0.006060606060606061,"comprehensive":0.006060606060606061,"account":0.006060606060606061,"management":0.006060606060606061,"possible":0.006060606060606061,"error":0.006060606060606061,"cases":0.006060606060606061,"robust":0.006060606060606061,"behavior":0.006060606060606061,"practical":0.006060606060606061,"example":0.006060606060606061,"let's":0.006060606060606061,"from":0.006060606060606061,"tx-sender":0.006060606060606061,"define-public":0.006060606060606061,"transfer-stx-with-memo":0.006060606060606061,"usage":0.006060606060606061,"u60":0.006060606060606061,"'sz2j6zy48gv1ez5v2v5rb9mp66sw86pykkq9h6dpr":0.006060606060606061,"0x010203":0.006060606060606061,"returns":0.006060606060606061,"ok":0.006060606060606061,"true":0.006060606060606061,"if":0.006060606060606061,"successful":0.006060606060606061,"u50":0.006060606060606061,"0x040506":0.006060606060606061,"err":0.006060606060606061,"u1":0.006060606060606061,"does":0.006060606060606061,"not":0.006060606060606061,"have":0.006060606060606061,"enough":0.006060606060606061,"this":0.006060606060606061,"demonstrates":0.006060606060606061,"using":0.006060606060606061,"public":0.006060606060606061,"both":0.006060606060606061,"common":0.006060606060606061,"pitfalls":0.006060606060606061,"non-positive":0.006060606060606061,"causing":0.006060606060606061,"fail":0.006060606060606061,"assuming":0.006060606060606061,"will":0.006060606060606061,"always":0.006060606060606061,"succeed":0.006060606060606061,"leading":0.006060606060606061,"unhandled":0.006060606060606061,"all":0.006060606060606061,"conditions":0.006060606060606061,"resulting":0.006060606060606061,"incomplete":0.006060606060606061,"overlooking":0.006060606060606061,"proper":0.006060606060606061,"validation":0.006060606060606061,"related":0.006060606060606061,"stx-get-balance":0.006060606060606061,"queries":0.006060606060606061,"stx-transfer":0.006060606060606061,"one":0.006060606060606061,"another":0.006060606060606061,"without":0.006060606060606061,"stx-burn":0.006060606060606061,"burns":0.006060606060606061,"principal's":0.006060606060606061,"conclusion":0.006060606060606061,"fundamental":0.006060606060606061,"tool":0.006060606060606061,"allows":0.006060606060606061,"operations":0.006060606060606061,"used":0.006060606060606061,"effectively":0.006060606060606061,"enhances":0.006060606060606061,"reliability":0.006060606060606061,"maintainability":0.006060606060606061,"code":0.006060606060606061,"providing":0.006060606060606061,"clear":0.006060606060606061,"concise":0.006060606060606061,"way":0.006060606060606061},"185":{"1":0.00546448087431694,"2":0.00546448087431694,"3":0.00546448087431694,"4":0.00546448087431694,"6":0.00546448087431694,"function":0.00546448087431694,"signature":0.00546448087431694,"clarity":0.00546448087431694,"pow":0.00546448087431694,"base":0.00546448087431694,"exponent":0.00546448087431694,"-":0.00546448087431694,"input":0.00546448087431694,"int":0.00546448087431694,"uint":0.00546448087431694,"output":0.00546448087431694,"why":0.00546448087431694,"it":0.00546448087431694,"matters":0.00546448087431694,"the":0.00546448087431694,"is":0.00546448087431694,"crucial":0.00546448087431694,"for":0.00546448087431694,"performing":0.00546448087431694,"exponentiation":0.00546448087431694,"operations":0.00546448087431694,"implementing":0.00546448087431694,"logic":0.00546448087431694,"that":0.00546448087431694,"depends":0.00546448087431694,"on":0.00546448087431694,"power":0.00546448087431694,"calculations":0.00546448087431694,"simplifying":0.00546448087431694,"process":0.00546448087431694,"of":0.00546448087431694,"raising":0.00546448087431694,"numbers":0.00546448087431694,"to":0.00546448087431694,"a":0.00546448087431694,"enhancing":0.00546448087431694,"code":0.00546448087431694,"readability":0.00546448087431694,"and":0.00546448087431694,"maintainability":0.00546448087431694,"by":0.00546448087431694,"abstracting":0.00546448087431694,"when":0.00546448087431694,"use":0.00546448087431694,"you":0.00546448087431694,"need":0.00546448087431694,"perform":0.00546448087431694,"implement":0.00546448087431694,"raise":0.00546448087431694,"simplify":0.00546448087431694,"abstract":0.00546448087431694,"best":0.00546448087431694,"practices":0.00546448087431694,"ensure":0.00546448087431694,"are":0.00546448087431694,"correctly":0.00546448087431694,"formatted":0.00546448087431694,"within":0.00546448087431694,"acceptable":0.00546448087431694,"ranges":0.00546448087431694,"meaningful":0.00546448087431694,"variable":0.00546448087431694,"names":0.00546448087431694,"better":0.00546448087431694,"combine":0.00546448087431694,"with":0.00546448087431694,"other":0.00546448087431694,"mathematical":0.00546448087431694,"functions":0.00546448087431694,"comprehensive":0.00546448087431694,"be":0.00546448087431694,"aware":0.00546448087431694,"performance":0.00546448087431694,"implications":0.00546448087431694,"large":0.00546448087431694,"practical":0.00546448087431694,"example":0.00546448087431694,"calculating":0.00546448087431694,"token":0.00546448087431694,"balances":0.00546448087431694,"in":0.00546448087431694,"decimal":0.00546448087431694,"format":0.00546448087431694,"let's":0.00546448087431694,"calculates":0.00546448087431694,"number":0.00546448087431694,"specifically":0.00546448087431694,"converting":0.00546448087431694,"integer":0.00546448087431694,"representations":0.00546448087431694,"tokens":0.00546448087431694,"or":0.00546448087431694,"ustx":0.00546448087431694,"define-constant":0.00546448087431694,"micro_tokens":0.00546448087431694,"u10":0.00546448087431694,"u6":0.00546448087431694,"places":0.00546448087431694,"define-data-var":0.00546448087431694,"userbalance":0.00546448087431694,"u100":0.00546448087431694,"amount":0.00546448087431694,"reprented":0.00546448087431694,"clear":0.00546448087431694,"readable":0.00546448087431694,"define-read-only":0.00546448087431694,"get-total-micro-balance":0.00546448087431694,"useraddress":0.00546448087431694,"principal":0.00546448087431694,"var-get":0.00546448087431694,"usage":0.00546448087431694,"tx-sender":0.00546448087431694,"this":0.00546448087431694,"demonstrates":0.00546448087431694,"using":0.00546448087431694,"define":0.00546448087431694,"constant":0.00546448087431694,"micro":0.00546448087431694,"read-only":0.00546448087431694,"calculate":0.00546448087431694,"total":0.00546448087431694,"balance":0.00546448087431694,"handling":0.00546448087431694,"from":0.00546448087431694,"different":0.00546448087431694,"versions":0.00546448087431694,"contract":0.00546448087431694,"common":0.00546448087431694,"pitfalls":0.00546448087431694,"negative":0.00546448087431694,"exponents":0.00546448087431694,"which":0.00546448087431694,"not":0.00546448087431694,"supported":0.00546448087431694,"will":0.00546448087431694,"cause":0.00546448087431694,"runtime":0.00546448087431694,"error":0.00546448087431694,"assuming":0.00546448087431694,"result":0.00546448087431694,"always":0.00546448087431694,"leading":0.00546448087431694,"overflow":0.00546448087431694,"errors":0.00546448087431694,"all":0.00546448087431694,"possible":0.00546448087431694,"conditions":0.00546448087431694,"resulting":0.00546448087431694,"incomplete":0.00546448087431694,"overlooking":0.00546448087431694,"proper":0.00546448087431694,"validation":0.00546448087431694,"related":0.00546448087431694,"multiplies":0.00546448087431694,"two":0.00546448087431694,"more":0.00546448087431694,"adds":0.00546448087431694,"subtracts":0.00546448087431694,"one":0.00546448087431694,"another":0.00546448087431694,"divides":0.00546448087431694,"conclusion":0.00546448087431694,"fundamental":0.00546448087431694,"tool":0.00546448087431694,"smart":0.00546448087431694,"contracts":0.00546448087431694,"allows":0.00546448087431694,"enabling":0.00546448087431694,"robust":0.00546448087431694,"used":0.00546448087431694,"effectively":0.00546448087431694,"enhances":0.00546448087431694,"reliability":0.00546448087431694,"your":0.00546448087431694,"providing":0.00546448087431694,"concise":0.00546448087431694,"way":0.00546448087431694,"manage":0.00546448087431694},"186":{"1":0.005917159763313609,"2":0.005917159763313609,"3":0.005917159763313609,"4":0.005917159763313609,"40":0.005917159763313609,"function":0.005917159763313609,"signature":0.005917159763313609,"clarity":0.005917159763313609,"nft-mint":0.005917159763313609,"asset-class":0.005917159763313609,"asset-identifier":0.005917159763313609,"recipient":0.005917159763313609,"-":0.005917159763313609,"input":0.005917159763313609,"assetname":0.005917159763313609,"a":0.005917159763313609,"principal":0.005917159763313609,"output":0.005917159763313609,"response":0.005917159763313609,"bool":0.005917159763313609,"uint":0.005917159763313609,"why":0.005917159763313609,"it":0.005917159763313609,"matters":0.005917159763313609,"the":0.005917159763313609,"is":0.005917159763313609,"crucial":0.005917159763313609,"for":0.005917159763313609,"creating":0.005917159763313609,"new":0.005917159763313609,"non-fungible":0.005917159763313609,"tokens":0.005917159763313609,"nfts":0.005917159763313609,"assigning":0.005917159763313609,"ownership":0.005917159763313609,"of":0.005917159763313609,"newly":0.005917159763313609,"created":0.005917159763313609,"ensuring":0.005917159763313609,"data":0.005917159763313609,"integrity":0.005917159763313609,"by":0.005917159763313609,"preventing":0.005917159763313609,"duplicate":0.005917159763313609,"nft":0.005917159763313609,"creation":0.005917159763313609,"simplifying":0.005917159763313609,"process":0.005917159763313609,"minting":0.005917159763313609,"in":0.005917159763313609,"smart":0.005917159763313609,"contracts":0.005917159763313609,"when":0.005917159763313609,"to":0.005917159763313609,"use":0.005917159763313609,"you":0.005917159763313609,"need":0.005917159763313609,"create":0.005917159763313609,"assign":0.005917159763313609,"prevent":0.005917159763313609,"handle":0.005917159763313609,"operations":0.005917159763313609,"your":0.005917159763313609,"contract":0.005917159763313609,"best":0.005917159763313609,"practices":0.005917159763313609,"ensure":0.005917159763313609,"unique":0.005917159763313609,"and":0.005917159763313609,"correctly":0.005917159763313609,"formatted":0.005917159763313609,"meaningful":0.005917159763313609,"variable":0.005917159763313609,"names":0.005917159763313609,"better":0.005917159763313609,"readability":0.005917159763313609,"combine":0.005917159763313609,"with":0.005917159763313609,"other":0.005917159763313609,"functions":0.005917159763313609,"comprehensive":0.005917159763313609,"management":0.005917159763313609,"possible":0.005917159763313609,"error":0.005917159763313609,"cases":0.005917159763313609,"robust":0.005917159763313609,"behavior":0.005917159763313609,"practical":0.005917159763313609,"example":0.005917159763313609,"an":0.005917159763313609,"let's":0.005917159763313609,"implement":0.005917159763313609,"that":0.005917159763313609,"mints":0.005917159763313609,"assigns":0.005917159763313609,"define-non-fungible-token":0.005917159763313609,"stackaroo":0.005917159763313609,"string-ascii":0.005917159763313609,"define-public":0.005917159763313609,"mint-nft":0.005917159763313609,"id":0.005917159763313609,"usage":0.005917159763313609,"roo":0.005917159763313609,"tx-sender":0.005917159763313609,"returns":0.005917159763313609,"ok":0.005917159763313609,"true":0.005917159763313609,"err":0.005917159763313609,"u1":0.005917159763313609,"because":0.005917159763313609,"asset":0.005917159763313609,"already":0.005917159763313609,"exists":0.005917159763313609,"this":0.005917159763313609,"demonstrates":0.005917159763313609,"using":0.005917159763313609,"implementing":0.005917159763313609,"public":0.005917159763313609,"operation":0.005917159763313609,"handling":0.005917159763313609,"both":0.005917159763313609,"successful":0.005917159763313609,"mint":0.005917159763313609,"case":0.005917159763313609,"where":0.005917159763313609,"common":0.005917159763313609,"pitfalls":0.005917159763313609,"non-unique":0.005917159763313609,"causing":0.005917159763313609,"fail":0.005917159763313609,"assuming":0.005917159763313609,"will":0.005917159763313609,"always":0.005917159763313609,"be":0.005917159763313609,"minted":0.005917159763313609,"leading":0.005917159763313609,"unhandled":0.005917159763313609,"not":0.005917159763313609,"all":0.005917159763313609,"conditions":0.005917159763313609,"resulting":0.005917159763313609,"incomplete":0.005917159763313609,"overlooking":0.005917159763313609,"proper":0.005917159763313609,"validation":0.005917159763313609,"related":0.005917159763313609,"nft-get-owner":0.005917159763313609,"retrieves":0.005917159763313609,"owner":0.005917159763313609,"token":0.005917159763313609,"nft-transfer":0.005917159763313609,"transfers":0.005917159763313609,"nft-burn":0.005917159763313609,"burns":0.005917159763313609,"conclusion":0.005917159763313609,"fundamental":0.005917159763313609,"tool":0.005917159763313609,"allows":0.005917159763313609,"used":0.005917159763313609,"effectively":0.005917159763313609,"enhances":0.005917159763313609,"reliability":0.005917159763313609,"maintainability":0.005917159763313609,"code":0.005917159763313609,"providing":0.005917159763313609,"clear":0.005917159763313609,"concise":0.005917159763313609,"way":0.005917159763313609,"manage":0.005917159763313609},"187":{"1":0.005649717514124294,"2":0.005649717514124294,"3":0.005649717514124294,"4":0.005649717514124294,"1000":0.005649717514124294,"function":0.005649717514124294,"signature":0.005649717514124294,"clarity":0.005649717514124294,"bit-not":0.005649717514124294,"i1":0.005649717514124294,"-":0.005649717514124294,"input":0.005649717514124294,"an":0.005649717514124294,"integer":0.005649717514124294,"int":0.005649717514124294,"or":0.005649717514124294,"uint":0.005649717514124294,"output":0.005649717514124294,"of":0.005649717514124294,"the":0.005649717514124294,"same":0.005649717514124294,"type":0.005649717514124294,"as":0.005649717514124294,"why":0.005649717514124294,"it":0.005649717514124294,"matters":0.005649717514124294,"is":0.005649717514124294,"crucial":0.005649717514124294,"for":0.005649717514124294,"performing":0.005649717514124294,"bitwise":0.005649717514124294,"complement":0.005649717514124294,"operations":0.005649717514124294,"in":0.005649717514124294,"smart":0.005649717514124294,"contracts":0.005649717514124294,"implementing":0.005649717514124294,"certain":0.005649717514124294,"logical":0.005649717514124294,"and":0.005649717514124294,"algorithms":0.005649717514124294,"manipulating":0.005649717514124294,"binary":0.005649717514124294,"data":0.005649717514124294,"at":0.005649717514124294,"bit":0.005649717514124294,"level":0.005649717514124294,"creating":0.005649717514124294,"bitmasks":0.005649717514124294,"various":0.005649717514124294,"purposes":0.005649717514124294,"when":0.005649717514124294,"to":0.005649717514124294,"use":0.005649717514124294,"you":0.005649717514124294,"need":0.005649717514124294,"invert":0.005649717514124294,"all":0.005649717514124294,"bits":0.005649717514124294,"value":0.005649717514124294,"create":0.005649717514124294,"a":0.005649717514124294,"bitmask":0.005649717514124294,"implement":0.005649717514124294,"cryptographic":0.005649717514124294,"hashing":0.005649717514124294,"perform":0.005649717514124294,"low-level":0.005649717514124294,"manipulations":0.005649717514124294,"best":0.005649717514124294,"practices":0.005649717514124294,"be":0.005649717514124294,"aware":0.005649717514124294,"differences":0.005649717514124294,"between":0.005649717514124294,"signed":0.005649717514124294,"unsigned":0.005649717514124294,"integers":0.005649717514124294,"using":0.005649717514124294,"remember":0.005649717514124294,"that":0.005649717514124294,"on":0.005649717514124294,"will":0.005649717514124294,"result":0.005649717514124294,"large":0.005649717514124294,"positive":0.005649717514124294,"number":0.005649717514124294,"due":0.005649717514124294,"two's":0.005649717514124294,"representation":0.005649717514124294,"combination":0.005649717514124294,"with":0.005649717514124294,"other":0.005649717514124294,"bit-and":0.005649717514124294,"bit-or":0.005649717514124294,"bit-xor":0.005649717514124294,"complex":0.005649717514124294,"consider":0.005649717514124294,"readability":0.005649717514124294,"your":0.005649717514124294,"code":0.005649717514124294,"extensively":0.005649717514124294,"practical":0.005649717514124294,"example":0.005649717514124294,"simple":0.005649717514124294,"flag":0.005649717514124294,"system":0.005649717514124294,"let's":0.005649717514124294,"define-constant":0.005649717514124294,"flag_a":0.005649717514124294,"u1":0.005649717514124294,"0001":0.005649717514124294,"flag_b":0.005649717514124294,"u2":0.005649717514124294,"0010":0.005649717514124294,"flag_c":0.005649717514124294,"u4":0.005649717514124294,"0100":0.005649717514124294,"flag_d":0.005649717514124294,"u8":0.005649717514124294,"define-data-var":0.005649717514124294,"userflags":0.005649717514124294,"u0":0.005649717514124294,"define-public":0.005649717514124294,"toggle-flag":0.005649717514124294,"ok":0.005649717514124294,"var-set":0.005649717514124294,"var-get":0.005649717514124294,"clear-all-flags-except":0.005649717514124294,"set-all-flags-except":0.005649717514124294,"define-read-only":0.005649717514124294,"has-flag":0.005649717514124294,"is-eq":0.005649717514124294,"this":0.005649717514124294,"demonstrates":0.005649717514124294,"set":0.005649717514124294,"flags":0.005649717514124294,"except":0.005649717514124294,"specific":0.005649717514124294,"one":0.005649717514124294,"efficient":0.005649717514124294,"storage":0.005649717514124294,"manipulation":0.005649717514124294,"combining":0.005649717514124294,"common":0.005649717514124294,"pitfalls":0.005649717514124294,"forgetting":0.005649717514124294,"results":0.005649717514124294,"not":0.005649717514124294,"negative":0.005649717514124294,"overlooking":0.005649717514124294,"sign":0.005649717514124294,"considering":0.005649717514124294,"full":0.005649717514124294,"range":0.005649717514124294,"applying":0.005649717514124294,"smaller":0.005649717514124294,"values":0.005649717514124294,"related":0.005649717514124294,"functions":0.005649717514124294,"used":0.005649717514124294,"xor":0.005649717514124294,"bit-shift-left":0.005649717514124294,"left-shifting":0.005649717514124294,"bit-shift-right":0.005649717514124294,"right-shifting":0.005649717514124294,"conclusion":0.005649717514124294,"powerful":0.005649717514124294,"tool":0.005649717514124294,"enables":0.005649717514124294,"implementation":0.005649717514124294,"however":0.005649717514124294,"should":0.005649717514124294,"mindful":0.005649717514124294,"potential":0.005649717514124294,"unexpected":0.005649717514124294,"carefully":0.005649717514124294},"188":{"1":0.005747126436781609,"2":0.005747126436781609,"3":0.005747126436781609,"4":0.005747126436781609,"20":0.005747126436781609,"32":0.005747126436781609,"function":0.005747126436781609,"signature":0.005747126436781609,"clarity":0.005747126436781609,"hash160":0.005747126436781609,"value":0.005747126436781609,"-":0.005747126436781609,"input":0.005747126436781609,"buff":0.005747126436781609,"uint":0.005747126436781609,"int":0.005747126436781609,"output":0.005747126436781609,"why":0.005747126436781609,"it":0.005747126436781609,"matters":0.005747126436781609,"the":0.005747126436781609,"is":0.005747126436781609,"crucial":0.005747126436781609,"for":0.005747126436781609,"creating":0.005747126436781609,"compact":0.005747126436781609,"unique":0.005747126436781609,"identifiers":0.005747126436781609,"data":0.005747126436781609,"or":0.005747126436781609,"addresses":0.005747126436781609,"implementing":0.005747126436781609,"cryptographic":0.005747126436781609,"operations":0.005747126436781609,"commonly":0.005747126436781609,"used":0.005747126436781609,"in":0.005747126436781609,"blockchain":0.005747126436781609,"systems":0.005747126436781609,"generating":0.005747126436781609,"bitcoin-style":0.005747126436781609,"from":0.005747126436781609,"public":0.005747126436781609,"keys":0.005747126436781609,"providing":0.005747126436781609,"a":0.005747126436781609,"way":0.005747126436781609,"to":0.005747126436781609,"create":0.005747126436781609,"short":0.005747126436781609,"collision-resistant":0.005747126436781609,"hashes":0.005747126436781609,"when":0.005747126436781609,"use":0.005747126436781609,"you":0.005747126436781609,"need":0.005747126436781609,"generate":0.005747126436781609,"hash":0.005747126436781609,"of":0.005747126436781609,"especially":0.005747126436781609,"address":0.005747126436781609,"creation":0.005747126436781609,"implement":0.005747126436781609,"generation":0.005747126436781609,"within":0.005747126436781609,"contracts":0.005747126436781609,"structures":0.005747126436781609,"perform":0.005747126436781609,"that":0.005747126436781609,"require":0.005747126436781609,"ripemd160":0.005747126436781609,"sha256":0.005747126436781609,"x":0.005747126436781609,"best":0.005747126436781609,"practices":0.005747126436781609,"shorter":0.005747126436781609,"than":0.005747126436781609,"but":0.005747126436781609,"still":0.005747126436781609,"want":0.005747126436781609,"strong":0.005747126436781609,"collision":0.005747126436781609,"resistance":0.005747126436781609,"be":0.005747126436781609,"aware":0.005747126436781609,"not":0.005747126436781609,"reversible":0.005747126436781609,"it's":0.005747126436781609,"one-way":0.005747126436781609,"hashing":0.005747126436781609,"sensitive":0.005747126436781609,"consider":0.005747126436781609,"using":0.005747126436781609,"additional":0.005747126436781609,"security":0.005747126436781609,"measures":0.005747126436781609,"like":0.005747126436781609,"salting":0.005747126436781609,"remember":0.005747126436781609,"integers":0.005747126436781609,"computed":0.005747126436781609,"over":0.005747126436781609,"their":0.005747126436781609,"little-endian":0.005747126436781609,"representation":0.005747126436781609,"practical":0.005747126436781609,"example":0.005747126436781609,"simple":0.005747126436781609,"let's":0.005747126436781609,"generates":0.005747126436781609,"hash-based":0.005747126436781609,"identifier":0.005747126436781609,"define-read-only":0.005747126436781609,"generate-identifier":0.005747126436781609,"usage":0.005747126436781609,"0x000000000000000000000000000000000000000000000000000000000000000a":0.005747126436781609,"returns":0.005747126436781609,"0x3bf3d2e8f7a4d7c5f9e6d0d5c6b0f5c7d8e9f0a1":0.005747126436781609,"this":0.005747126436781609,"demonstrates":0.005747126436781609,"takes":0.005747126436781609,"32-byte":0.005747126436781609,"buffer":0.005747126436781609,"and":0.005747126436781609,"20-byte":0.005747126436781609,"common":0.005747126436781609,"pitfalls":0.005747126436781609,"assuming":0.005747126436781609,"same":0.005747126436781609,"length":0.005747126436781609,"as":0.005747126436781609,"at":0.005747126436781609,"bytes":0.005747126436781609,"where":0.005747126436781609,"longer":0.005747126436781609,"might":0.005747126436781609,"more":0.005747126436781609,"appropriate":0.005747126436781609,"reasons":0.005747126436781609,"forgetting":0.005747126436781609,"integer":0.005747126436781609,"inputs":0.005747126436781609,"are":0.005747126436781609,"hashed":0.005747126436781609,"considering":0.005747126436781609,"computationally":0.005747126436781609,"expensive":0.005747126436781609,"single":0.005747126436781609,"related":0.005747126436781609,"functions":0.005747126436781609,"computes":0.005747126436781609,"directly":0.005747126436781609,"available":0.005747126436781609,"combines":0.005747126436781609,"keccak256":0.005747126436781609,"another":0.005747126436781609,"conclusion":0.005747126436781609,"powerful":0.005747126436781609,"tool":0.005747126436781609,"smart":0.005747126436781609,"with":0.005747126436781609,"compactness":0.005747126436781609,"making":0.005747126436781609,"particularly":0.005747126436781609,"useful":0.005747126436781609,"appropriately":0.005747126436781609,"can":0.005747126436781609,"enhance":0.005747126436781609,"efficiency":0.005747126436781609,"your":0.005747126436781609,"contract":0.005747126436781609,"scenarios":0.005747126436781609,"space":0.005747126436781609,"concern":0.005747126436781609},"189":{"1":0.005263157894736842,"2":0.005263157894736842,"3":0.005263157894736842,"4":0.005263157894736842,"12":0.005263157894736842,"1337":0.005263157894736842,"function":0.005263157894736842,"signature":0.005263157894736842,"clarity":0.005263157894736842,"merge":0.005263157894736842,"tuple1":0.005263157894736842,"tuple2":0.005263157894736842,"-":0.005263157894736842,"input":0.005263157894736842,"tuple":0.005263157894736842,"output":0.005263157894736842,"why":0.005263157894736842,"it":0.005263157894736842,"matters":0.005263157894736842,"the":0.005263157894736842,"is":0.005263157894736842,"crucial":0.005263157894736842,"for":0.005263157894736842,"combining":0.005263157894736842,"fields":0.005263157894736842,"from":0.005263157894736842,"two":0.005263157894736842,"tuples":0.005263157894736842,"into":0.005263157894736842,"a":0.005263157894736842,"single":0.005263157894736842,"simplifying":0.005263157894736842,"process":0.005263157894736842,"of":0.005263157894736842,"updating":0.005263157894736842,"and":0.005263157894736842,"managing":0.005263157894736842,"data":0.005263157894736842,"structures":0.005263157894736842,"ensuring":0.005263157894736842,"integrity":0.005263157894736842,"by":0.005263157894736842,"creating":0.005263157894736842,"new":0.005263157894736842,"without":0.005263157894736842,"mutating":0.005263157894736842,"original":0.005263157894736842,"ones":0.005263157894736842,"enhancing":0.005263157894736842,"code":0.005263157894736842,"readability":0.005263157894736842,"maintainability":0.005263157894736842,"abstracting":0.005263157894736842,"merging":0.005263157894736842,"operations":0.005263157894736842,"when":0.005263157894736842,"to":0.005263157894736842,"use":0.005263157894736842,"you":0.005263157894736842,"need":0.005263157894736842,"combine":0.005263157894736842,"update":0.005263157894736842,"manage":0.005263157894736842,"in":0.005263157894736842,"clean":0.005263157894736842,"efficient":0.005263157894736842,"manner":0.005263157894736842,"ensure":0.005263157894736842,"simplify":0.005263157894736842,"abstract":0.005263157894736842,"best":0.005263157894736842,"practices":0.005263157894736842,"being":0.005263157894736842,"merged":0.005263157894736842,"have":0.005263157894736842,"compatible":0.005263157894736842,"meaningful":0.005263157894736842,"variable":0.005263157894736842,"names":0.005263157894736842,"better":0.005263157894736842,"with":0.005263157894736842,"other":0.005263157894736842,"map":0.005263157894736842,"functions":0.005263157894736842,"comprehensive":0.005263157894736842,"management":0.005263157894736842,"be":0.005263157894736842,"aware":0.005263157894736842,"performance":0.005263157894736842,"implications":0.005263157894736842,"frequent":0.005263157894736842,"large":0.005263157894736842,"practical":0.005263157894736842,"example":0.005263157894736842,"user":0.005263157894736842,"let's":0.005263157894736842,"implement":0.005263157894736842,"that":0.005263157894736842,"merges":0.005263157894736842,"additional":0.005263157894736842,"user's":0.005263157894736842,"existing":0.005263157894736842,"define-map":0.005263157894736842,"users":0.005263157894736842,"id":0.005263157894736842,"int":0.005263157894736842,"name":0.005263157894736842,"string-ascii":0.005263157894736842,"address":0.005263157894736842,"optional":0.005263157894736842,"principal":0.005263157894736842,"define-public":0.005263157894736842,"update-user-address":0.005263157894736842,"user-id":0.005263157894736842,"new-address":0.005263157894736842,"let":0.005263157894736842,"unwrap-panic":0.005263157894736842,"map-get":0.005263157894736842,"updated-user":0.005263157894736842,"some":0.005263157894736842,"map-set":0.005263157894736842,"usage":0.005263157894736842,"map-insert":0.005263157894736842,"john":0.005263157894736842,"none":0.005263157894736842,"returns":0.005263157894736842,"true":0.005263157894736842,"'spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf":0.005263157894736842,"spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf":0.005263157894736842,"this":0.005263157894736842,"demonstrates":0.005263157894736842,"using":0.005263157894736842,"implementing":0.005263157894736842,"public":0.005263157894736842,"handling":0.005263157894736842,"both":0.005263157894736842,"retrieval":0.005263157894736842,"common":0.005263157894736842,"pitfalls":0.005263157894736842,"incompatible":0.005263157894736842,"causing":0.005263157894736842,"runtime":0.005263157894736842,"errors":0.005263157894736842,"assuming":0.005263157894736842,"will":0.005263157894736842,"always":0.005263157894736842,"expected":0.005263157894736842,"leading":0.005263157894736842,"unhandled":0.005263157894736842,"cases":0.005263157894736842,"not":0.005263157894736842,"all":0.005263157894736842,"possible":0.005263157894736842,"conditions":0.005263157894736842,"resulting":0.005263157894736842,"incomplete":0.005263157894736842,"overlooking":0.005263157894736842,"proper":0.005263157894736842,"error":0.005263157894736842,"validation":0.005263157894736842,"related":0.005263157894736842,"sets":0.005263157894736842,"value":0.005263157894736842,"associated":0.005263157894736842,"key":0.005263157894736842,"retrieves":0.005263157894736842,"an":0.005263157894736842,"entry":0.005263157894736842,"inserts":0.005263157894736842,"if":0.005263157894736842,"does":0.005263157894736842,"already":0.005263157894736842,"exist":0.005263157894736842,"conclusion":0.005263157894736842,"fundamental":0.005263157894736842,"tool":0.005263157894736842,"smart":0.005263157894736842,"contracts":0.005263157894736842,"allows":0.005263157894736842,"efficiently":0.005263157894736842,"used":0.005263157894736842,"effectively":0.005263157894736842,"enhances":0.005263157894736842,"reliability":0.005263157894736842,"your":0.005263157894736842,"contract":0.005263157894736842,"providing":0.005263157894736842,"clear":0.005263157894736842,"concise":0.005263157894736842,"way":0.005263157894736842},"190":{"0":0.0056179775280898875,"1":0.0056179775280898875,"2":0.0056179775280898875,"3":0.0056179775280898875,"4":0.0056179775280898875,"function":0.0056179775280898875,"signature":0.0056179775280898875,"clarity":0.0056179775280898875,"ft-get-balance":0.0056179775280898875,"token-name":0.0056179775280898875,"principal":0.0056179775280898875,"-":0.0056179775280898875,"input":0.0056179775280898875,"the":0.0056179775280898875,"name":0.0056179775280898875,"of":0.0056179775280898875,"fungible":0.0056179775280898875,"token":0.0056179775280898875,"whose":0.0056179775280898875,"balance":0.0056179775280898875,"to":0.0056179775280898875,"check":0.0056179775280898875,"output":0.0056179775280898875,"uint":0.0056179775280898875,"why":0.0056179775280898875,"it":0.0056179775280898875,"matters":0.0056179775280898875,"is":0.0056179775280898875,"crucial":0.0056179775280898875,"for":0.0056179775280898875,"querying":0.0056179775280898875,"current":0.0056179775280898875,"a":0.0056179775280898875,"any":0.0056179775280898875,"implementing":0.0056179775280898875,"checks":0.0056179775280898875,"before":0.0056179775280898875,"transfers":0.0056179775280898875,"or":0.0056179775280898875,"other":0.0056179775280898875,"operations":0.0056179775280898875,"providing":0.0056179775280898875,"transparency":0.0056179775280898875,"and":0.0056179775280898875,"visibility":0.0056179775280898875,"into":0.0056179775280898875,"holdings":0.0056179775280898875,"enabling":0.0056179775280898875,"contracts":0.0056179775280898875,"off-chain":0.0056179775280898875,"applications":0.0056179775280898875,"verify":0.0056179775280898875,"balances":0.0056179775280898875,"when":0.0056179775280898875,"use":0.0056179775280898875,"you":0.0056179775280898875,"need":0.0056179775280898875,"user's":0.0056179775280898875,"performing":0.0056179775280898875,"implement":0.0056179775280898875,"balance-dependent":0.0056179775280898875,"logic":0.0056179775280898875,"in":0.0056179775280898875,"your":0.0056179775280898875,"contract":0.0056179775280898875,"provide":0.0056179775280898875,"information":0.0056179775280898875,"users":0.0056179775280898875,"sufficient":0.0056179775280898875,"funds":0.0056179775280898875,"burns":0.0056179775280898875,"best":0.0056179775280898875,"practices":0.0056179775280898875,"attempting":0.0056179775280898875,"ensure":0.0056179775280898875,"consider":0.0056179775280898875,"caching":0.0056179775280898875,"results":0.0056179775280898875,"if":0.0056179775280898875,"queried":0.0056179775280898875,"frequently":0.0056179775280898875,"optimize":0.0056179775280898875,"gas":0.0056179775280898875,"usage":0.0056179775280898875,"be":0.0056179775280898875,"aware":0.0056179775280898875,"that":0.0056179775280898875,"can":0.0056179775280898875,"change":0.0056179775280898875,"between":0.0056179775280898875,"actual":0.0056179775280898875,"combination":0.0056179775280898875,"with":0.0056179775280898875,"ft-":0.0056179775280898875,"functions":0.0056179775280898875,"comprehensive":0.0056179775280898875,"management":0.0056179775280898875,"practical":0.0056179775280898875,"example":0.0056179775280898875,"transfer":0.0056179775280898875,"let's":0.0056179775280898875,"transferring":0.0056179775280898875,"tokens":0.0056179775280898875,"define-fungible-token":0.0056179775280898875,"cbtc":0.0056179775280898875,"define-public":0.0056179775280898875,"amount":0.0056179775280898875,"recipient":0.0056179775280898875,"let":0.0056179775280898875,"senderbalance":0.0056179775280898875,"tx-sender":0.0056179775280898875,"ft-transfer":0.0056179775280898875,"err":0.0056179775280898875,"u1":0.0056179775280898875,"ft-mint":0.0056179775280898875,"u100":0.0056179775280898875,"u50":0.0056179775280898875,"'spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf":0.0056179775280898875,"returns":0.0056179775280898875,"ok":0.0056179775280898875,"true":0.0056179775280898875,"this":0.0056179775280898875,"demonstrates":0.0056179775280898875,"using":0.0056179775280898875,"sender's":0.0056179775280898875,"conditional":0.0056179775280898875,"based":0.0056179775280898875,"on":0.0056179775280898875,"combining":0.0056179775280898875,"common":0.0056179775280898875,"pitfalls":0.0056179775280898875,"assuming":0.0056179775280898875,"remain":0.0056179775280898875,"constant":0.0056179775280898875,"checking":0.0056179775280898875,"not":0.0056179775280898875,"handling":0.0056179775280898875,"case":0.0056179775280898875,"where":0.0056179775280898875,"might":0.0056179775280898875,"have":0.0056179775280898875,"overusing":0.0056179775280898875,"loops":0.0056179775280898875,"which":0.0056179775280898875,"inefficient":0.0056179775280898875,"consumption":0.0056179775280898875,"related":0.0056179775280898875,"used":0.0056179775280898875,"principals":0.0056179775280898875,"create":0.0056179775280898875,"new":0.0056179775280898875,"increasing":0.0056179775280898875,"ft-burn":0.0056179775280898875,"destroy":0.0056179775280898875,"decreasing":0.0056179775280898875,"ft-get-supply":0.0056179775280898875,"get":0.0056179775280898875,"total":0.0056179775280898875,"supply":0.0056179775280898875,"conclusion":0.0056179775280898875,"fundamental":0.0056179775280898875,"tool":0.0056179775280898875,"managing":0.0056179775280898875,"smart":0.0056179775280898875,"provides":0.0056179775280898875,"straightforward":0.0056179775280898875,"way":0.0056179775280898875,"query":0.0056179775280898875,"robust":0.0056179775280898875,"token-based":0.0056179775280898875,"systems":0.0056179775280898875,"proper":0.0056179775280898875,"validations":0.0056179775280898875,"effectively":0.0056179775280898875,"ensures":0.0056179775280898875,"integrity":0.0056179775280898875,"accuracy":0.0056179775280898875,"within":0.0056179775280898875},"191":{"1":0.004149377593360996,"2":0.004149377593360996,"3":0.004149377593360996,"4":0.004149377593360996,"5":0.004149377593360996,"10":0.004149377593360996,"30":0.004149377593360996,"the":0.004149377593360996,"greater":0.004149377593360996,"than":0.004149377593360996,"or":0.004149377593360996,"equal":0.004149377593360996,"function":0.004149377593360996,"in":0.004149377593360996,"clarity":0.004149377593360996,"compares":0.004149377593360996,"two":0.004149377593360996,"values":0.004149377593360996,"and":0.004149377593360996,"returns":0.004149377593360996,"true":0.004149377593360996,"if":0.004149377593360996,"first":0.004149377593360996,"value":0.004149377593360996,"is":0.004149377593360996,"to":0.004149377593360996,"second":0.004149377593360996,"it's":0.004149377593360996,"a":0.004149377593360996,"fundamental":0.004149377593360996,"comparison":0.004149377593360996,"operation":0.004149377593360996,"used":0.004149377593360996,"many":0.004149377593360996,"smart":0.004149377593360996,"contract":0.004149377593360996,"conditions":0.004149377593360996,"logic":0.004149377593360996,"flows":0.004149377593360996,"signature":0.004149377593360996,"v1":0.004149377593360996,"v2":0.004149377593360996,"-":0.004149377593360996,"input":0.004149377593360996,"of":0.004149377593360996,"same":0.004149377593360996,"type":0.004149377593360996,"int":0.004149377593360996,"uint":0.004149377593360996,"string-ascii":0.004149377593360996,"string-utf8":0.004149377593360996,"buff":0.004149377593360996,"output":0.004149377593360996,"boolean":0.004149377593360996,"false":0.004149377593360996,"why":0.004149377593360996,"it":0.004149377593360996,"matters":0.004149377593360996,"crucial":0.004149377593360996,"for":0.004149377593360996,"implementing":0.004149377593360996,"conditional":0.004149377593360996,"contracts":0.004149377593360996,"comparing":0.004149377593360996,"numerical":0.004149377593360996,"financial":0.004149377593360996,"operations":0.004149377593360996,"ordering":0.004149377593360996,"sorting":0.004149377593360996,"data":0.004149377593360996,"minimum":0.004149377593360996,"thresholds":0.004149377593360996,"limits":0.004149377593360996,"checking":0.004149377593360996,"equality":0.004149377593360996,"alongside":0.004149377593360996,"comparisons":0.004149377593360996,"when":0.004149377593360996,"use":0.004149377593360996,"you":0.004149377593360996,"need":0.004149377593360996,"compare":0.004149377593360996,"determine":0.004149377593360996,"one":0.004149377593360996,"larger":0.004149377593360996,"implement":0.004149377593360996,"certain":0.004149377593360996,"including":0.004149377593360996,"threshold":0.004149377593360996,"itself":0.004149377593360996,"create":0.004149377593360996,"based":0.004149377593360996,"on":0.004149377593360996,"sort":0.004149377593360996,"order":0.004149377593360996,"lexicographical":0.004149377593360996,"best":0.004149377593360996,"practices":0.004149377593360996,"ensure":0.004149377593360996,"that":0.004149377593360996,"both":0.004149377593360996,"inputs":0.004149377593360996,"are":0.004149377593360996,"avoid":0.004149377593360996,"runtime":0.004149377593360996,"errors":0.004149377593360996,"be":0.004149377593360996,"aware":0.004149377593360996,"differences":0.004149377593360996,"between":0.004149377593360996,"signed":0.004149377593360996,"unsigned":0.004149377593360996,"integers":0.004149377593360996,"strings":0.004149377593360996,"buffers":0.004149377593360996,"understand":0.004149377593360996,"consider":0.004149377593360996,"edge":0.004149377593360996,"cases":0.004149377593360996,"especially":0.004149377593360996,"dealing":0.004149377593360996,"with":0.004149377593360996,"integer":0.004149377593360996,"ranges":0.004149377593360996,"instead":0.004149377593360996,"want":0.004149377593360996,"include":0.004149377593360996,"your":0.004149377593360996,"practical":0.004149377593360996,"example":0.004149377593360996,"token":0.004149377593360996,"unlock":0.004149377593360996,"schedule":0.004149377593360996,"let's":0.004149377593360996,"simple":0.004149377593360996,"uses":0.004149377593360996,"manage":0.004149377593360996,"releases":0.004149377593360996,"define":0.004149377593360996,"constants":0.004149377593360996,"define-constant":0.004149377593360996,"unlock_amount":0.004149377593360996,"u1000000":0.004149377593360996,"million":0.004149377593360996,"tokens":0.004149377593360996,"per":0.004149377593360996,"unlock_interval":0.004149377593360996,"u17280":0.004149377593360996,"approximately":0.004149377593360996,"days":0.004149377593360996,"blocks":0.004149377593360996,"total_unlocks":0.004149377593360996,"u10":0.004149377593360996,"total":0.004149377593360996,"unlocks":0.004149377593360996,"variables":0.004149377593360996,"define-data-var":0.004149377593360996,"startblock":0.004149377593360996,"u0":0.004149377593360996,"unlocksclaimed":0.004149377593360996,"start":0.004149377593360996,"define-public":0.004149377593360996,"start-unlock-schedule":0.004149377593360996,"begin":0.004149377593360996,"asserts":0.004149377593360996,"is-eq":0.004149377593360996,"var-get":0.004149377593360996,"err":0.004149377593360996,"u1":0.004149377593360996,"var-set":0.004149377593360996,"block-height":0.004149377593360996,"ok":0.004149377593360996,"calculate":0.004149377593360996,"claimable":0.004149377593360996,"define-read-only":0.004149377593360996,"get-claimable-tokens":0.004149377593360996,"let":0.004149377593360996,"elapsedblocks":0.004149377593360996,"unlocksdue":0.004149377593360996,"claim":0.004149377593360996,"claim-tokens":0.004149377593360996,"claimableamount":0.004149377593360996,"u2":0.004149377593360996,"here":0.004149377593360996,"would":0.004149377593360996,"typically":0.004149377593360996,"transfer":0.004149377593360996,"simplicity":0.004149377593360996,"we're":0.004149377593360996,"just":0.004149377593360996,"returning":0.004149377593360996,"claimed":0.004149377593360996,"amount":0.004149377593360996,"this":0.004149377593360996,"demonstrates":0.004149377593360996,"using":0.004149377593360996,"check":0.004149377593360996,"number":0.004149377593360996,"due":0.004149377593360996,"combining":0.004149377593360996,"other":0.004149377593360996,"system":0.004149377593360996,"interval":0.004149377593360996,"includes":0.004149377593360996,"exact":0.004149377593360996,"time":0.004149377593360996,"common":0.004149377593360996,"pitfalls":0.004149377593360996,"different":0.004149377593360996,"types":0.004149377593360996,"which":0.004149377593360996,"will":0.004149377593360996,"result":0.004149377593360996,"error":0.004149377593360996,"confusing":0.004149377593360996,"setting":0.004149377593360996,"potentially":0.004149377593360996,"excluding":0.004149377593360996,"valid":0.004149377593360996,"overlooking":0.004149377593360996,"inclusive":0.004149377593360996,"nature":0.004149377593360996,"boundary":0.004149377593360996,"related":0.004149377593360996,"functions":0.004149377593360996,"strict":0.004149377593360996,"less":0.004149377593360996,"conclusion":0.004149377593360996,"tool":0.004149377593360996,"by":0.004149377593360996,"understanding":0.004149377593360996,"its":0.004149377593360996,"behavior":0.004149377593360996,"potential":0.004149377593360996,"can":0.004149377593360996,"robust":0.004149377593360996,"enforce":0.004149377593360996,"important":0.004149377593360996,"scenarios":0.004149377593360996,"where":0.004149377593360996,"condition":0.004149377593360996},"192":{"1":0.005405405405405406,"2":0.005405405405405406,"3":0.005405405405405406,"4":0.005405405405405406,"function":0.005405405405405406,"signature":0.005405405405405406,"clarity":0.005405405405405406,"as-contract":0.005405405405405406,"expr":0.005405405405405406,"-":0.005405405405405406,"input":0.005405405405405406,"an":0.005405405405405406,"expression":0.005405405405405406,"output":0.005405405405405406,"the":0.005405405405405406,"result":0.005405405405405406,"of":0.005405405405405406,"why":0.005405405405405406,"it":0.005405405405405406,"matters":0.005405405405405406,"is":0.005405405405405406,"crucial":0.005405405405405406,"for":0.005405405405405406,"executing":0.005405405405405406,"operations":0.005405405405405406,"with":0.005405405405405406,"contract's":0.005405405405405406,"authority":0.005405405405405406,"allowing":0.005405405405405406,"contract":0.005405405405405406,"to":0.005405405405405406,"send":0.005405405405405406,"assets":0.005405405405405406,"or":0.005405405405405406,"perform":0.005405405405405406,"privileged":0.005405405405405406,"actions":0.005405405405405406,"implementing":0.005405405405405406,"contract-owned":0.005405405405405406,"resources":0.005405405405405406,"funds":0.005405405405405406,"enabling":0.005405405405405406,"more":0.005405405405405406,"complex":0.005405405405405406,"interactions":0.005405405405405406,"and":0.005405405405405406,"architectures":0.005405405405405406,"when":0.005405405405405406,"use":0.005405405405405406,"you":0.005405405405405406,"need":0.005405405405405406,"that":0.005405405405405406,"require":0.005405405405405406,"principal":0.005405405405405406,"like":0.005405405405405406,"stx":0.005405405405405406,"tokens":0.005405405405405406,"from":0.005405405405405406,"balance":0.005405405405405406,"execute":0.005405405405405406,"should":0.005405405405405406,"only":0.005405405405405406,"be":0.005405405405405406,"done":0.005405405405405406,"by":0.005405405405405406,"itself":0.005405405405405406,"implement":0.005405405405405406,"escrow-like":0.005405405405405406,"functionality":0.005405405405405406,"best":0.005405405405405406,"practices":0.005405405405405406,"sparingly":0.005405405405405406,"necessary":0.005405405405405406,"minimize":0.005405405405405406,"potential":0.005405405405405406,"security":0.005405405405405406,"risks":0.005405405405405406,"ensure":0.005405405405405406,"logic":0.005405405405405406,"leading":0.005405405405405406,"calls":0.005405405405405406,"properly":0.005405405405405406,"secured":0.005405405405405406,"access-controlled":0.005405405405405406,"aware":0.005405405405405406,"changes":0.005405405405405406,"tx-sender":0.005405405405405406,"context":0.005405405405405406,"duration":0.005405405405405406,"combine":0.005405405405405406,"other":0.005405405405405406,"measures":0.005405405405405406,"contract-caller":0.005405405405405406,"checks":0.005405405405405406,"robust":0.005405405405405406,"practical":0.005405405405405406,"example":0.005405405405405406,"contract-managed":0.005405405405405406,"treasury":0.005405405405405406,"let's":0.005405405405405406,"a":0.005405405405405406,"simple":0.005405405405405406,"system":0.005405405405405406,"where":0.005405405405405406,"can":0.005405405405405406,"distribute":0.005405405405405406,"define-constant":0.005405405405405406,"contract_owner":0.005405405405405406,"define-data-var":0.005405405405405406,"treasurybalance":0.005405405405405406,"uint":0.005405405405405406,"u0":0.005405405405405406,"define-public":0.005405405405405406,"deposit":0.005405405405405406,"amount":0.005405405405405406,"begin":0.005405405405405406,"try":0.005405405405405406,"stx-transfer":0.005405405405405406,"var-set":0.005405405405405406,"var-get":0.005405405405405406,"ok":0.005405405405405406,"true":0.005405405405405406,"withdraw":0.005405405405405406,"recipient":0.005405405405405406,"asserts":0.005405405405405406,"is-eq":0.005405405405405406,"err":0.005405405405405406,"u403":0.005405405405405406,"u401":0.005405405405405406,"this":0.005405405405405406,"demonstrates":0.005405405405405406,"using":0.005405405405405406,"in":0.005405405405405406,"receive":0.005405405405405406,"as":0.005405405405405406,"combining":0.005405405405405406,"access":0.005405405405405406,"control":0.005405405405405406,"common":0.005405405405405406,"pitfalls":0.005405405405405406,"unnecessarily":0.005405405405405406,"which":0.005405405405405406,"lead":0.005405405405405406,"unexpected":0.005405405405405406,"behavior":0.005405405405405406,"forgetting":0.005405405405405406,"potentially":0.005405405405405406,"affecting":0.005405405405405406,"parts":0.005405405405405406,"code":0.005405405405405406,"not":0.005405405405405406,"proper":0.005405405405405406,"controls":0.005405405405405406,"around":0.005405405405405406,"could":0.005405405405405406,"unauthorized":0.005405405405405406,"related":0.005405405405405406,"functions":0.005405405405405406,"used":0.005405405405405406,"get":0.005405405405405406,"original":0.005405405405405406,"caller":0.005405405405405406,"represents":0.005405405405405406,"current":0.005405405405405406,"sender":0.005405405405405406,"within":0.005405405405405406,"often":0.005405405405405406,"token":0.005405405405405406,"transfers":0.005405405405405406,"conclusion":0.005405405405405406,"powerful":0.005405405405405406,"tool":0.005405405405405406,"allows":0.005405405405405406,"contracts":0.005405405405405406,"their":0.005405405405405406,"own":0.005405405405405406,"while":0.005405405405405406,"enables":0.005405405405405406,"functionalities":0.005405405405405406,"judiciously":0.005405405405405406,"prevent":0.005405405405405406,"vulnerabilities":0.005405405405405406,"unintended":0.005405405405405406,"behaviors":0.005405405405405406,"smart":0.005405405405405406},"193":{"1":0.004784688995215311,"2":0.004784688995215311,"3":0.004784688995215311,"4":0.004784688995215311,"1000":0.004784688995215311,"function":0.004784688995215311,"signature":0.004784688995215311,"clarity":0.004784688995215311,"asserts":0.004784688995215311,"bool-expr":0.004784688995215311,"thrown-value":0.004784688995215311,"-":0.004784688995215311,"input":0.004784688995215311,"a":0.004784688995215311,"boolean":0.004784688995215311,"expression":0.004784688995215311,"the":0.004784688995215311,"value":0.004784688995215311,"to":0.004784688995215311,"be":0.004784688995215311,"returned":0.004784688995215311,"if":0.004784688995215311,"assertion":0.004784688995215311,"fails":0.004784688995215311,"output":0.004784688995215311,"bool":0.004784688995215311,"or":0.004784688995215311,"why":0.004784688995215311,"it":0.004784688995215311,"matters":0.004784688995215311,"is":0.004784688995215311,"crucial":0.004784688995215311,"for":0.004784688995215311,"implementing":0.004784688995215311,"conditional":0.004784688995215311,"checks":0.004784688995215311,"in":0.004784688995215311,"smart":0.004784688995215311,"contracts":0.004784688995215311,"enforcing":0.004784688995215311,"preconditions":0.004784688995215311,"before":0.004784688995215311,"executing":0.004784688995215311,"critical":0.004784688995215311,"operations":0.004784688995215311,"providing":0.004784688995215311,"meaningful":0.004784688995215311,"error":0.004784688995215311,"responses":0.004784688995215311,"when":0.004784688995215311,"conditions":0.004784688995215311,"are":0.004784688995215311,"not":0.004784688995215311,"met":0.004784688995215311,"improving":0.004784688995215311,"contract":0.004784688995215311,"security":0.004784688995215311,"by":0.004784688995215311,"validating":0.004784688995215311,"inputs":0.004784688995215311,"and":0.004784688995215311,"state":0.004784688995215311,"use":0.004784688995215311,"you":0.004784688995215311,"need":0.004784688995215311,"validate":0.004784688995215311,"proceeding":0.004784688995215311,"with":0.004784688995215311,"execution":0.004784688995215311,"ensure":0.004784688995215311,"certain":0.004784688995215311,"requirements":0.004784688995215311,"performing":0.004784688995215311,"sensitive":0.004784688995215311,"provide":0.004784688995215311,"clear":0.004784688995215311,"messages":0.004784688995215311,"codes":0.004784688995215311,"satisfied":0.004784688995215311,"implement":0.004784688995215311,"guard":0.004784688995215311,"clauses":0.004784688995215311,"protect":0.004784688995215311,"against":0.004784688995215311,"invalid":0.004784688995215311,"states":0.004784688995215311,"best":0.004784688995215311,"practices":0.004784688995215311,"early":0.004784688995215311,"functions":0.004784688995215311,"values":0.004784688995215311,"that":0.004784688995215311,"can":0.004784688995215311,"easily":0.004784688995215311,"interpreted":0.004784688995215311,"users":0.004784688995215311,"other":0.004784688995215311,"combine":0.004784688995215311,"multiple":0.004784688995215311,"using":0.004784688995215311,"complex":0.004784688995215311,"assertions":0.004784688995215311,"consider":0.004784688995215311,"combination":0.004784688995215311,"unwrap":0.004784688995215311,"handling":0.004784688995215311,"optional":0.004784688995215311,"practical":0.004784688995215311,"example":0.004784688995215311,"token":0.004784688995215311,"transfer":0.004784688995215311,"balance":0.004784688995215311,"check":0.004784688995215311,"let's":0.004784688995215311,"simple":0.004784688995215311,"uses":0.004784688995215311,"sender's":0.004784688995215311,"define-map":0.004784688995215311,"balances":0.004784688995215311,"principal":0.004784688995215311,"uint":0.004784688995215311,"define-public":0.004784688995215311,"amount":0.004784688995215311,"recipient":0.004784688995215311,"let":0.004784688995215311,"senderbalance":0.004784688995215311,"default-to":0.004784688995215311,"u0":0.004784688995215311,"map-get":0.004784688995215311,"tx-sender":0.004784688995215311,"err":0.004784688995215311,"u1":0.004784688995215311,"insufficient":0.004784688995215311,"is-eq":0.004784688995215311,"u2":0.004784688995215311,"can't":0.004784688995215311,"send":0.004784688995215311,"self":0.004784688995215311,"map-set":0.004784688995215311,"ok":0.004784688995215311,"true":0.004784688995215311,"u1000":0.004784688995215311,"set":0.004784688995215311,"usage":0.004784688995215311,"u100":0.004784688995215311,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":0.004784688995215311,"returns":0.004784688995215311,"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.004784688995215311,"this":0.004784688995215311,"demonstrates":0.004784688995215311,"sender":0.004784688995215311,"has":0.004784688995215311,"sufficient":0.004784688995215311,"transferring":0.004784688995215311,"prevent":0.004784688995215311,"sending":0.004784688995215311,"tokens":0.004784688995215311,"oneself":0.004784688995215311,"different":0.004784688995215311,"types":0.004784688995215311,"of":0.004784688995215311,"failures":0.004784688995215311,"common":0.004784688995215311,"pitfalls":0.004784688995215311,"forgetting":0.004784688995215311,"handle":0.004784688995215311,"case":0.004784688995215311,"calling":0.004784688995215311,"excessively":0.004784688995215311,"which":0.004784688995215311,"make":0.004784688995215311,"code":0.004784688995215311,"harder":0.004784688995215311,"read":0.004784688995215311,"maintain":0.004784688995215311,"vague":0.004784688995215311,"unhelpful":0.004784688995215311,"fail":0.004784688995215311,"related":0.004784688995215311,"used":0.004784688995215311,"extract":0.004784688995215311,"from":0.004784688995215311,"optionals":0.004784688995215311,"fallback":0.004784688995215311,"unwrap-panic":0.004784688995215311,"similar":0.004784688995215311,"but":0.004784688995215311,"causes":0.004784688995215311,"panic":0.004784688995215311,"instead":0.004784688995215311,"returning":0.004784688995215311,"an":0.004784688995215311,"try":0.004784688995215311,"propagating":0.004784688995215311,"errors":0.004784688995215311,"chain":0.004784688995215311,"conclusion":0.004784688995215311,"powerful":0.004784688995215311,"tool":0.004784688995215311,"invariants":0.004784688995215311,"effectively":0.004784688995215311,"create":0.004784688995215311,"more":0.004784688995215311,"robust":0.004784688995215311,"secure":0.004784688995215311,"gracefully":0.004784688995215311,"edge":0.004784688995215311,"cases":0.004784688995215311,"feedback":0.004784688995215311},"194":{"1":0.006134969325153374,"2":0.006134969325153374,"3":0.006134969325153374,"4":0.006134969325153374,"20":0.006134969325153374,"function":0.006134969325153374,"signature":0.006134969325153374,"clarity":0.006134969325153374,"slice":0.006134969325153374,"sequence":0.006134969325153374,"left-position":0.006134969325153374,"right-position":0.006134969325153374,"-":0.006134969325153374,"input":0.006134969325153374,"sequence_a":0.006134969325153374,"uint":0.006134969325153374,"output":0.006134969325153374,"optional":0.006134969325153374,"why":0.006134969325153374,"it":0.006134969325153374,"matters":0.006134969325153374,"the":0.006134969325153374,"is":0.006134969325153374,"crucial":0.006134969325153374,"for":0.006134969325153374,"extracting":0.006134969325153374,"sub-sequences":0.006134969325153374,"from":0.006134969325153374,"sequences":0.006134969325153374,"implementing":0.006134969325153374,"logic":0.006134969325153374,"that":0.006134969325153374,"requires":0.006134969325153374,"partial":0.006134969325153374,"data":0.006134969325153374,"extraction":0.006134969325153374,"ensuring":0.006134969325153374,"integrity":0.006134969325153374,"by":0.006134969325153374,"validating":0.006134969325153374,"indices":0.006134969325153374,"slicing":0.006134969325153374,"simplifying":0.006134969325153374,"process":0.006134969325153374,"of":0.006134969325153374,"handling":0.006134969325153374,"sub-sequence":0.006134969325153374,"in":0.006134969325153374,"smart":0.006134969325153374,"contracts":0.006134969325153374,"when":0.006134969325153374,"to":0.006134969325153374,"use":0.006134969325153374,"you":0.006134969325153374,"need":0.006134969325153374,"extract":0.006134969325153374,"a":0.006134969325153374,"implement":0.006134969325153374,"validate":0.006134969325153374,"ensure":0.006134969325153374,"handle":0.006134969325153374,"operations":0.006134969325153374,"best":0.006134969325153374,"practices":0.006134969325153374,"and":0.006134969325153374,"are":0.006134969325153374,"within":0.006134969325153374,"bounds":0.006134969325153374,"meaningful":0.006134969325153374,"variable":0.006134969325153374,"names":0.006134969325153374,"better":0.006134969325153374,"readability":0.006134969325153374,"combine":0.006134969325153374,"with":0.006134969325153374,"other":0.006134969325153374,"functions":0.006134969325153374,"comprehensive":0.006134969325153374,"management":0.006134969325153374,"possible":0.006134969325153374,"error":0.006134969325153374,"cases":0.006134969325153374,"robust":0.006134969325153374,"contract":0.006134969325153374,"behavior":0.006134969325153374,"practical":0.006134969325153374,"example":0.006134969325153374,"string":0.006134969325153374,"let's":0.006134969325153374,"extracts":0.006134969325153374,"define-read-only":0.006134969325153374,"extract-substring":0.006134969325153374,"string-ascii":0.006134969325153374,"start":0.006134969325153374,"end":0.006134969325153374,"usage":0.006134969325153374,"blockstack":0.006134969325153374,"u5":0.006134969325153374,"u10":0.006134969325153374,"returns":0.006134969325153374,"some":0.006134969325153374,"stack":0.006134969325153374,"u0":0.006134969325153374,"block":0.006134969325153374,"u15":0.006134969325153374,"none":0.006134969325153374,"out":0.006134969325153374,"this":0.006134969325153374,"demonstrates":0.006134969325153374,"using":0.006134969325153374,"public":0.006134969325153374,"both":0.006134969325153374,"successful":0.006134969325153374,"common":0.006134969325153374,"pitfalls":0.006134969325153374,"causing":0.006134969325153374,"operation":0.006134969325153374,"fail":0.006134969325153374,"assuming":0.006134969325153374,"will":0.006134969325153374,"always":0.006134969325153374,"be":0.006134969325153374,"valid":0.006134969325153374,"leading":0.006134969325153374,"unhandled":0.006134969325153374,"not":0.006134969325153374,"all":0.006134969325153374,"conditions":0.006134969325153374,"resulting":0.006134969325153374,"incomplete":0.006134969325153374,"overlooking":0.006134969325153374,"proper":0.006134969325153374,"validation":0.006134969325153374,"related":0.006134969325153374,"len":0.006134969325153374,"length":0.006134969325153374,"concat":0.006134969325153374,"concatenates":0.006134969325153374,"two":0.006134969325153374,"index-of":0.006134969325153374,"first":0.006134969325153374,"index":0.006134969325153374,"at":0.006134969325153374,"which":0.006134969325153374,"an":0.006134969325153374,"item":0.006134969325153374,"can":0.006134969325153374,"found":0.006134969325153374,"conclusion":0.006134969325153374,"fundamental":0.006134969325153374,"tool":0.006134969325153374,"allows":0.006134969325153374,"used":0.006134969325153374,"effectively":0.006134969325153374,"enhances":0.006134969325153374,"reliability":0.006134969325153374,"maintainability":0.006134969325153374,"your":0.006134969325153374,"code":0.006134969325153374,"providing":0.006134969325153374,"clear":0.006134969325153374,"concise":0.006134969325153374,"way":0.006134969325153374},"195":{"1":0.006097560975609756,"2":0.006097560975609756,"3":0.006097560975609756,"4":0.006097560975609756,"40":0.006097560975609756,"function":0.006097560975609756,"signature":0.006097560975609756,"clarity":0.006097560975609756,"nft-get-owner":0.006097560975609756,"asset-class":0.006097560975609756,"asset-identifier":0.006097560975609756,"-":0.006097560975609756,"input":0.006097560975609756,"assetname":0.006097560975609756,"a":0.006097560975609756,"output":0.006097560975609756,"optional":0.006097560975609756,"principal":0.006097560975609756,"why":0.006097560975609756,"it":0.006097560975609756,"matters":0.006097560975609756,"the":0.006097560975609756,"is":0.006097560975609756,"crucial":0.006097560975609756,"for":0.006097560975609756,"retrieving":0.006097560975609756,"owner":0.006097560975609756,"of":0.006097560975609756,"non-fungible":0.006097560975609756,"token":0.006097560975609756,"nft":0.006097560975609756,"implementing":0.006097560975609756,"logic":0.006097560975609756,"that":0.006097560975609756,"depends":0.006097560975609756,"on":0.006097560975609756,"ownership":0.006097560975609756,"nfts":0.006097560975609756,"ensuring":0.006097560975609756,"data":0.006097560975609756,"integrity":0.006097560975609756,"by":0.006097560975609756,"verifying":0.006097560975609756,"records":0.006097560975609756,"simplifying":0.006097560975609756,"process":0.006097560975609756,"accessing":0.006097560975609756,"information":0.006097560975609756,"in":0.006097560975609756,"smart":0.006097560975609756,"contracts":0.006097560975609756,"when":0.006097560975609756,"to":0.006097560975609756,"use":0.006097560975609756,"you":0.006097560975609756,"need":0.006097560975609756,"retrieve":0.006097560975609756,"an":0.006097560975609756,"implement":0.006097560975609756,"verify":0.006097560975609756,"your":0.006097560975609756,"contract":0.006097560975609756,"access":0.006097560975609756,"best":0.006097560975609756,"practices":0.006097560975609756,"ensure":0.006097560975609756,"correctly":0.006097560975609756,"formatted":0.006097560975609756,"and":0.006097560975609756,"exists":0.006097560975609756,"meaningful":0.006097560975609756,"variable":0.006097560975609756,"names":0.006097560975609756,"better":0.006097560975609756,"readability":0.006097560975609756,"combine":0.006097560975609756,"with":0.006097560975609756,"other":0.006097560975609756,"functions":0.006097560975609756,"comprehensive":0.006097560975609756,"management":0.006097560975609756,"handle":0.006097560975609756,"none":0.006097560975609756,"case":0.006097560975609756,"avoid":0.006097560975609756,"runtime":0.006097560975609756,"errors":0.006097560975609756,"practical":0.006097560975609756,"example":0.006097560975609756,"let's":0.006097560975609756,"retrieves":0.006097560975609756,"define-non-fungible-token":0.006097560975609756,"stackaroo":0.006097560975609756,"string-ascii":0.006097560975609756,"define-read-only":0.006097560975609756,"get-nft-owner":0.006097560975609756,"id":0.006097560975609756,"usage":0.006097560975609756,"nft-mint":0.006097560975609756,"roo":0.006097560975609756,"tx-sender":0.006097560975609756,"returns":0.006097560975609756,"ok":0.006097560975609756,"true":0.006097560975609756,"some":0.006097560975609756,"nonexistent":0.006097560975609756,"this":0.006097560975609756,"demonstrates":0.006097560975609756,"using":0.006097560975609756,"read-only":0.006097560975609756,"return":0.006097560975609756,"owner's":0.006097560975609756,"handling":0.006097560975609756,"both":0.006097560975609756,"where":0.006097560975609756,"does":0.006097560975609756,"not":0.006097560975609756,"common":0.006097560975609756,"pitfalls":0.006097560975609756,"incorrect":0.006097560975609756,"or":0.006097560975609756,"non-existent":0.006097560975609756,"causing":0.006097560975609756,"assuming":0.006097560975609756,"will":0.006097560975609756,"always":0.006097560975609756,"exist":0.006097560975609756,"leading":0.006097560975609756,"unhandled":0.006097560975609756,"cases":0.006097560975609756,"all":0.006097560975609756,"possible":0.006097560975609756,"conditions":0.006097560975609756,"resulting":0.006097560975609756,"incomplete":0.006097560975609756,"checks":0.006097560975609756,"overlooking":0.006097560975609756,"proper":0.006097560975609756,"error":0.006097560975609756,"validation":0.006097560975609756,"related":0.006097560975609756,"mints":0.006097560975609756,"new":0.006097560975609756,"nft-transfer":0.006097560975609756,"transfers":0.006097560975609756,"nft-burn":0.006097560975609756,"burns":0.006097560975609756,"conclusion":0.006097560975609756,"fundamental":0.006097560975609756,"tool":0.006097560975609756,"tokens":0.006097560975609756,"allows":0.006097560975609756,"based":0.006097560975609756,"used":0.006097560975609756,"effectively":0.006097560975609756,"enhances":0.006097560975609756,"reliability":0.006097560975609756,"maintainability":0.006097560975609756,"code":0.006097560975609756,"providing":0.006097560975609756,"clear":0.006097560975609756,"concise":0.006097560975609756,"way":0.006097560975609756,"manage":0.006097560975609756},"196":{"1":0.005813953488372093,"2":0.005813953488372093,"3":0.005813953488372093,"4":0.005813953488372093,"function":0.005813953488372093,"signature":0.005813953488372093,"clarity":0.005813953488372093,"if":0.005813953488372093,"bool":0.005813953488372093,"expr1":0.005813953488372093,"expr2":0.005813953488372093,"-":0.005813953488372093,"input":0.005813953488372093,"a":0.005813953488372093,"boolean":0.005813953488372093,"expression":0.005813953488372093,"an":0.005813953488372093,"to":0.005813953488372093,"evaluate":0.005813953488372093,"is":0.005813953488372093,"true":0.005813953488372093,"false":0.005813953488372093,"output":0.005813953488372093,"the":0.005813953488372093,"result":0.005813953488372093,"of":0.005813953488372093,"otherwise":0.005813953488372093,"why":0.005813953488372093,"it":0.005813953488372093,"matters":0.005813953488372093,"crucial":0.005813953488372093,"for":0.005813953488372093,"implementing":0.005813953488372093,"conditional":0.005813953488372093,"logic":0.005813953488372093,"in":0.005813953488372093,"smart":0.005813953488372093,"contracts":0.005813953488372093,"making":0.005813953488372093,"decisions":0.005813953488372093,"based":0.005813953488372093,"on":0.005813953488372093,"dynamic":0.005813953488372093,"conditions":0.005813953488372093,"controlling":0.005813953488372093,"flow":0.005813953488372093,"contract":0.005813953488372093,"execution":0.005813953488372093,"simplifying":0.005813953488372093,"complex":0.005813953488372093,"by":0.005813953488372093,"branching":0.005813953488372093,"when":0.005813953488372093,"use":0.005813953488372093,"you":0.005813953488372093,"need":0.005813953488372093,"execute":0.005813953488372093,"different":0.005813953488372093,"code":0.005813953488372093,"paths":0.005813953488372093,"condition":0.005813953488372093,"implement":0.005813953488372093,"that":0.005813953488372093,"depends":0.005813953488372093,"state":0.005813953488372093,"or":0.005813953488372093,"values":0.005813953488372093,"control":0.005813953488372093,"your":0.005813953488372093,"simplify":0.005813953488372093,"decision-making":0.005813953488372093,"processes":0.005813953488372093,"best":0.005813953488372093,"practices":0.005813953488372093,"ensure":0.005813953488372093,"both":0.005813953488372093,"and":0.005813953488372093,"return":0.005813953488372093,"same":0.005813953488372093,"type":0.005813953488372093,"clear":0.005813953488372093,"meaningful":0.005813953488372093,"expressions":0.005813953488372093,"readability":0.005813953488372093,"avoid":0.005813953488372093,"deeply":0.005813953488372093,"nested":0.005813953488372093,"statements":0.005813953488372093,"better":0.005813953488372093,"maintainability":0.005813953488372093,"combine":0.005813953488372093,"with":0.005813953488372093,"other":0.005813953488372093,"functions":0.005813953488372093,"like":0.005813953488372093,"match":0.005813953488372093,"more":0.005813953488372093,"practical":0.005813953488372093,"example":0.005813953488372093,"token":0.005813953488372093,"transfer":0.005813953488372093,"define-map":0.005813953488372093,"userbalances":0.005813953488372093,"userid":0.005813953488372093,"principal":0.005813953488372093,"balance":0.005813953488372093,"uint":0.005813953488372093,"define-public":0.005813953488372093,"transfer-tokens":0.005813953488372093,"amount":0.005813953488372093,"recipient":0.005813953488372093,"let":0.005813953488372093,"senderbalance":0.005813953488372093,"default-to":0.005813953488372093,"u0":0.005813953488372093,"map-get":0.005813953488372093,"tx-sender":0.005813953488372093,"begin":0.005813953488372093,"map-set":0.005813953488372093,"ok":0.005813953488372093,"err":0.005813953488372093,"u1":0.005813953488372093,"this":0.005813953488372093,"demonstrates":0.005813953488372093,"using":0.005813953488372093,"check":0.005813953488372093,"sender":0.005813953488372093,"has":0.005813953488372093,"sufficient":0.005813953488372093,"before":0.005813953488372093,"transferring":0.005813953488372093,"tokens":0.005813953488372093,"executing":0.005813953488372093,"handling":0.005813953488372093,"success":0.005813953488372093,"failure":0.005813953488372093,"cases":0.005813953488372093,"appropriately":0.005813953488372093,"common":0.005813953488372093,"pitfalls":0.005813953488372093,"forgetting":0.005813953488372093,"must":0.005813953488372093,"overly":0.005813953488372093,"hard":0.005813953488372093,"read":0.005813953488372093,"not":0.005813953488372093,"all":0.005813953488372093,"possible":0.005813953488372093,"leading":0.005813953488372093,"unexpected":0.005813953488372093,"behavior":0.005813953488372093,"overusing":0.005813953488372093,"could":0.005813953488372093,"be":0.005813953488372093,"simplified":0.005813953488372093,"related":0.005813953488372093,"used":0.005813953488372093,"pattern":0.005813953488372093,"matching":0.005813953488372093,"multiple":0.005813953488372093,"logical":0.005813953488372093,"operator":0.005813953488372093,"combining":0.005813953488372093,"conclusion":0.005813953488372093,"fundamental":0.005813953488372093,"tool":0.005813953488372093,"allows":0.005813953488372093,"enabling":0.005813953488372093,"responsive":0.005813953488372093,"effectively":0.005813953488372093,"simplifies":0.005813953488372093,"enhances":0.005813953488372093},"197":{"1":0.00625,"2":0.00625,"3":0.00625,"4":0.00625,"5":0.00625,"7":0.00625,"10":0.00625,"function":0.00625,"signature":0.00625,"clarity":0.00625,"mod":0.00625,"i1":0.00625,"i2":0.00625,"-":0.00625,"input":0.00625,"int":0.00625,"uint":0.00625,"string-ascii":0.00625,"string-utf8":0.00625,"buff":0.00625,"output":0.00625,"why":0.00625,"it":0.00625,"matters":0.00625,"the":0.00625,"is":0.00625,"crucial":0.00625,"for":0.00625,"calculating":0.00625,"remainder":0.00625,"of":0.00625,"integer":0.00625,"division":0.00625,"implementing":0.00625,"logic":0.00625,"that":0.00625,"depends":0.00625,"on":0.00625,"modular":0.00625,"arithmetic":0.00625,"simplifying":0.00625,"process":0.00625,"performing":0.00625,"operations":0.00625,"require":0.00625,"remainders":0.00625,"enhancing":0.00625,"code":0.00625,"readability":0.00625,"and":0.00625,"maintainability":0.00625,"by":0.00625,"abstracting":0.00625,"when":0.00625,"to":0.00625,"use":0.00625,"you":0.00625,"need":0.00625,"calculate":0.00625,"implement":0.00625,"perform":0.00625,"simplify":0.00625,"abstract":0.00625,"best":0.00625,"practices":0.00625,"ensure":0.00625,"divisor":0.00625,"not":0.00625,"zero":0.00625,"avoid":0.00625,"runtime":0.00625,"errors":0.00625,"meaningful":0.00625,"variable":0.00625,"names":0.00625,"better":0.00625,"combine":0.00625,"with":0.00625,"other":0.00625,"mathematical":0.00625,"functions":0.00625,"comprehensive":0.00625,"calculations":0.00625,"be":0.00625,"aware":0.00625,"performance":0.00625,"implications":0.00625,"frequent":0.00625,"practical":0.00625,"example":0.00625,"let's":0.00625,"a":0.00625,"calculates":0.00625,"dividing":0.00625,"two":0.00625,"numbers":0.00625,"define-read-only":0.00625,"calculate-remainder":0.00625,"b":0.00625,"usage":0.00625,"returns":0.00625,"this":0.00625,"demonstrates":0.00625,"using":0.00625,"read-only":0.00625,"return":0.00625,"handling":0.00625,"both":0.00625,"small":0.00625,"large":0.00625,"values":0.00625,"common":0.00625,"pitfalls":0.00625,"causing":0.00625,"error":0.00625,"assuming":0.00625,"result":0.00625,"will":0.00625,"always":0.00625,"positive":0.00625,"leading":0.00625,"incorrect":0.00625,"expectations":0.00625,"all":0.00625,"possible":0.00625,"conditions":0.00625,"resulting":0.00625,"in":0.00625,"incomplete":0.00625,"overlooking":0.00625,"proper":0.00625,"validation":0.00625,"related":0.00625,"adds":0.00625,"subtracts":0.00625,"one":0.00625,"number":0.00625,"from":0.00625,"another":0.00625,"multiplies":0.00625,"divides":0.00625,"conclusion":0.00625,"fundamental":0.00625,"tool":0.00625,"smart":0.00625,"contracts":0.00625,"allows":0.00625,"enabling":0.00625,"robust":0.00625,"used":0.00625,"effectively":0.00625,"enhances":0.00625,"reliability":0.00625,"your":0.00625,"contract":0.00625,"providing":0.00625,"clear":0.00625,"concise":0.00625,"way":0.00625,"manage":0.00625},"198":{"1":0.006622516556291391,"2":0.006622516556291391,"3":0.006622516556291391,"4":0.006622516556291391,"function":0.006622516556291391,"signature":0.006622516556291391,"clarity":0.006622516556291391,"stx-get-balance":0.006622516556291391,"owner":0.006622516556291391,"-":0.006622516556291391,"input":0.006622516556291391,"principal":0.006622516556291391,"output":0.006622516556291391,"uint":0.006622516556291391,"why":0.006622516556291391,"it":0.006622516556291391,"matters":0.006622516556291391,"the":0.006622516556291391,"is":0.006622516556291391,"crucial":0.006622516556291391,"for":0.006622516556291391,"querying":0.006622516556291391,"stx":0.006622516556291391,"balance":0.006622516556291391,"of":0.006622516556291391,"a":0.006622516556291391,"implementing":0.006622516556291391,"logic":0.006622516556291391,"that":0.006622516556291391,"requires":0.006622516556291391,"checking":0.006622516556291391,"account":0.006622516556291391,"balances":0.006622516556291391,"ensuring":0.006622516556291391,"data":0.006622516556291391,"integrity":0.006622516556291391,"by":0.006622516556291391,"providing":0.006622516556291391,"accurate":0.006622516556291391,"information":0.006622516556291391,"simplifying":0.006622516556291391,"process":0.006622516556291391,"handling":0.006622516556291391,"balance-related":0.006622516556291391,"operations":0.006622516556291391,"in":0.006622516556291391,"smart":0.006622516556291391,"contracts":0.006622516556291391,"when":0.006622516556291391,"to":0.006622516556291391,"use":0.006622516556291391,"you":0.006622516556291391,"need":0.006622516556291391,"query":0.006622516556291391,"implement":0.006622516556291391,"ensure":0.006622516556291391,"handle":0.006622516556291391,"your":0.006622516556291391,"contract":0.006622516556291391,"best":0.006622516556291391,"practices":0.006622516556291391,"correctly":0.006622516556291391,"formatted":0.006622516556291391,"and":0.006622516556291391,"valid":0.006622516556291391,"meaningful":0.006622516556291391,"variable":0.006622516556291391,"names":0.006622516556291391,"better":0.006622516556291391,"readability":0.006622516556291391,"combine":0.006622516556291391,"with":0.006622516556291391,"other":0.006622516556291391,"functions":0.006622516556291391,"comprehensive":0.006622516556291391,"management":0.006622516556291391,"possible":0.006622516556291391,"error":0.006622516556291391,"cases":0.006622516556291391,"robust":0.006622516556291391,"behavior":0.006622516556291391,"practical":0.006622516556291391,"example":0.006622516556291391,"let's":0.006622516556291391,"queries":0.006622516556291391,"given":0.006622516556291391,"define-read-only":0.006622516556291391,"get-stx-balance":0.006622516556291391,"usage":0.006622516556291391,"'sz2j6zy48gv1ez5v2v5rb9mp66sw86pykkq9h6dpr":0.006622516556291391,"returns":0.006622516556291391,"u0":0.006622516556291391,"if":0.006622516556291391,"has":0.006622516556291391,"no":0.006622516556291391,"as-contract":0.006622516556291391,"tx-sender":0.006622516556291391,"contract's":0.006622516556291391,"this":0.006622516556291391,"demonstrates":0.006622516556291391,"using":0.006622516556291391,"public":0.006622516556291391,"both":0.006622516556291391,"successful":0.006622516556291391,"common":0.006622516556291391,"pitfalls":0.006622516556291391,"an":0.006622516556291391,"incorrectly":0.006622516556291391,"or":0.006622516556291391,"invalid":0.006622516556291391,"causing":0.006622516556291391,"operation":0.006622516556291391,"fail":0.006622516556291391,"assuming":0.006622516556291391,"will":0.006622516556291391,"always":0.006622516556291391,"succeed":0.006622516556291391,"leading":0.006622516556291391,"unhandled":0.006622516556291391,"not":0.006622516556291391,"all":0.006622516556291391,"conditions":0.006622516556291391,"resulting":0.006622516556291391,"incomplete":0.006622516556291391,"overlooking":0.006622516556291391,"proper":0.006622516556291391,"validation":0.006622516556291391,"related":0.006622516556291391,"stx-transfer":0.006622516556291391,"transfers":0.006622516556291391,"from":0.006622516556291391,"one":0.006622516556291391,"another":0.006622516556291391,"stx-burn":0.006622516556291391,"burns":0.006622516556291391,"principal's":0.006622516556291391,"stx-account":0.006622516556291391,"detailed":0.006622516556291391,"conclusion":0.006622516556291391,"fundamental":0.006622516556291391,"tool":0.006622516556291391,"allows":0.006622516556291391,"used":0.006622516556291391,"effectively":0.006622516556291391,"enhances":0.006622516556291391,"reliability":0.006622516556291391,"maintainability":0.006622516556291391,"code":0.006622516556291391,"clear":0.006622516556291391,"concise":0.006622516556291391,"way":0.006622516556291391},"199":{"1":0.007194244604316547,"2":0.007194244604316547,"3":0.007194244604316547,"4":0.007194244604316547,"7":0.007194244604316547,"10":0.007194244604316547,"20":0.007194244604316547,"30":0.007194244604316547,"function":0.007194244604316547,"signature":0.007194244604316547,"clarity":0.007194244604316547,"print":0.007194244604316547,"expr":0.007194244604316547,"-":0.007194244604316547,"input":0.007194244604316547,"a":0.007194244604316547,"output":0.007194244604316547,"why":0.007194244604316547,"it":0.007194244604316547,"matters":0.007194244604316547,"the":0.007194244604316547,"is":0.007194244604316547,"crucial":0.007194244604316547,"for":0.007194244604316547,"debugging":0.007194244604316547,"and":0.007194244604316547,"logging":0.007194244604316547,"expressions":0.007194244604316547,"during":0.007194244604316547,"contract":0.007194244604316547,"development":0.007194244604316547,"evaluating":0.007194244604316547,"returning":0.007194244604316547,"expression":0.007194244604316547,"enhancing":0.007194244604316547,"code":0.007194244604316547,"readability":0.007194244604316547,"maintainability":0.007194244604316547,"by":0.007194244604316547,"providing":0.007194244604316547,"way":0.007194244604316547,"to":0.007194244604316547,"intermediate":0.007194244604316547,"values":0.007194244604316547,"when":0.007194244604316547,"use":0.007194244604316547,"you":0.007194244604316547,"need":0.007194244604316547,"debug":0.007194244604316547,"log":0.007194244604316547,"evaluate":0.007194244604316547,"return":0.007194244604316547,"an":0.007194244604316547,"better":0.007194244604316547,"understanding":0.007194244604316547,"of":0.007194244604316547,"behavior":0.007194244604316547,"best":0.007194244604316547,"practices":0.007194244604316547,"primarily":0.007194244604316547,"purposes":0.007194244604316547,"ensure":0.007194244604316547,"that":0.007194244604316547,"passed":0.007194244604316547,"meaningful":0.007194244604316547,"necessary":0.007194244604316547,"remove":0.007194244604316547,"or":0.007194244604316547,"comment":0.007194244604316547,"out":0.007194244604316547,"statements":0.007194244604316547,"in":0.007194244604316547,"production":0.007194244604316547,"avoid":0.007194244604316547,"unnecessary":0.007194244604316547,"practical":0.007194244604316547,"example":0.007194244604316547,"printing":0.007194244604316547,"let's":0.007194244604316547,"implement":0.007194244604316547,"prints":0.007194244604316547,"result":0.007194244604316547,"addition":0.007194244604316547,"operation":0.007194244604316547,"define-read-only":0.007194244604316547,"add-and-print":0.007194244604316547,"int":0.007194244604316547,"b":0.007194244604316547,"usage":0.007194244604316547,"returns":0.007194244604316547,"this":0.007194244604316547,"demonstrates":0.007194244604316547,"using":0.007194244604316547,"implementing":0.007194244604316547,"public":0.007194244604316547,"handle":0.007194244604316547,"handling":0.007194244604316547,"both":0.007194244604316547,"small":0.007194244604316547,"large":0.007194244604316547,"common":0.007194244604316547,"pitfalls":0.007194244604316547,"excessively":0.007194244604316547,"leading":0.007194244604316547,"cluttered":0.007194244604316547,"reduced":0.007194244604316547,"assuming":0.007194244604316547,"all":0.007194244604316547,"overuse":0.007194244604316547,"not":0.007194244604316547,"removing":0.007194244604316547,"commenting":0.007194244604316547,"resulting":0.007194244604316547,"related":0.007194244604316547,"functions":0.007194244604316547,"adds":0.007194244604316547,"two":0.007194244604316547,"more":0.007194244604316547,"numbers":0.007194244604316547,"subtracts":0.007194244604316547,"one":0.007194244604316547,"number":0.007194244604316547,"from":0.007194244604316547,"another":0.007194244604316547,"multiplies":0.007194244604316547,"divides":0.007194244604316547,"conclusion":0.007194244604316547,"fundamental":0.007194244604316547,"tool":0.007194244604316547,"smart":0.007194244604316547,"contracts":0.007194244604316547,"allows":0.007194244604316547,"used":0.007194244604316547,"effectively":0.007194244604316547,"enhances":0.007194244604316547,"reliability":0.007194244604316547,"your":0.007194244604316547,"clear":0.007194244604316547,"concise":0.007194244604316547},"200":{"1":0.006289308176100629,"2":0.006289308176100629,"3":0.006289308176100629,"4":0.006289308176100629,"20":0.006289308176100629,"40":0.006289308176100629,"function":0.006289308176100629,"signature":0.006289308176100629,"clarity":0.006289308176100629,"principal-construct":0.006289308176100629,"version-byte":0.006289308176100629,"hash-bytes":0.006289308176100629,"contract-name":0.006289308176100629,"-":0.006289308176100629,"input":0.006289308176100629,"buff":0.006289308176100629,"string-ascii":0.006289308176100629,"output":0.006289308176100629,"response":0.006289308176100629,"principal":0.006289308176100629,"error_code":0.006289308176100629,"uint":0.006289308176100629,"optional":0.006289308176100629,"why":0.006289308176100629,"it":0.006289308176100629,"matters":0.006289308176100629,"the":0.006289308176100629,"is":0.006289308176100629,"crucial":0.006289308176100629,"for":0.006289308176100629,"creating":0.006289308176100629,"standard":0.006289308176100629,"or":0.006289308176100629,"contract":0.006289308176100629,"principals":0.006289308176100629,"managing":0.006289308176100629,"identities":0.006289308176100629,"and":0.006289308176100629,"permissions":0.006289308176100629,"in":0.006289308176100629,"smart":0.006289308176100629,"contracts":0.006289308176100629,"ensuring":0.006289308176100629,"data":0.006289308176100629,"integrity":0.006289308176100629,"by":0.006289308176100629,"validating":0.006289308176100629,"construction":0.006289308176100629,"simplifying":0.006289308176100629,"process":0.006289308176100629,"of":0.006289308176100629,"when":0.006289308176100629,"to":0.006289308176100629,"use":0.006289308176100629,"you":0.006289308176100629,"need":0.006289308176100629,"create":0.006289308176100629,"a":0.006289308176100629,"manage":0.006289308176100629,"your":0.006289308176100629,"validate":0.006289308176100629,"handle":0.006289308176100629,"creation":0.006289308176100629,"operations":0.006289308176100629,"best":0.006289308176100629,"practices":0.006289308176100629,"ensure":0.006289308176100629,"are":0.006289308176100629,"correctly":0.006289308176100629,"formatted":0.006289308176100629,"meaningful":0.006289308176100629,"variable":0.006289308176100629,"names":0.006289308176100629,"better":0.006289308176100629,"readability":0.006289308176100629,"combine":0.006289308176100629,"with":0.006289308176100629,"other":0.006289308176100629,"functions":0.006289308176100629,"comprehensive":0.006289308176100629,"identity":0.006289308176100629,"management":0.006289308176100629,"possible":0.006289308176100629,"error":0.006289308176100629,"cases":0.006289308176100629,"robust":0.006289308176100629,"behavior":0.006289308176100629,"practical":0.006289308176100629,"example":0.006289308176100629,"constructing":0.006289308176100629,"let's":0.006289308176100629,"implement":0.006289308176100629,"that":0.006289308176100629,"constructs":0.006289308176100629,"define-public":0.006289308176100629,"create-standard-principal":0.006289308176100629,"versionbyte":0.006289308176100629,"hashbytes":0.006289308176100629,"usage":0.006289308176100629,"0x1a":0.006289308176100629,"0xfa6bf38ed557fe417333710d6033e9419391a320":0.006289308176100629,"returns":0.006289308176100629,"ok":0.006289308176100629,"'st3x6qwwetnbzwgbk6drgtr1kx50s74d3425q1tpk":0.006289308176100629,"this":0.006289308176100629,"demonstrates":0.006289308176100629,"using":0.006289308176100629,"implementing":0.006289308176100629,"public":0.006289308176100629,"handling":0.006289308176100629,"both":0.006289308176100629,"successful":0.006289308176100629,"common":0.006289308176100629,"pitfalls":0.006289308176100629,"incorrectly":0.006289308176100629,"causing":0.006289308176100629,"operation":0.006289308176100629,"fail":0.006289308176100629,"assuming":0.006289308176100629,"will":0.006289308176100629,"always":0.006289308176100629,"be":0.006289308176100629,"valid":0.006289308176100629,"leading":0.006289308176100629,"unhandled":0.006289308176100629,"not":0.006289308176100629,"all":0.006289308176100629,"conditions":0.006289308176100629,"resulting":0.006289308176100629,"incomplete":0.006289308176100629,"overlooking":0.006289308176100629,"proper":0.006289308176100629,"validation":0.006289308176100629,"related":0.006289308176100629,"principal-of":0.006289308176100629,"derived":0.006289308176100629,"from":0.006289308176100629,"key":0.006289308176100629,"contract-caller":0.006289308176100629,"caller":0.006289308176100629,"current":0.006289308176100629,"context":0.006289308176100629,"tx-sender":0.006289308176100629,"sender":0.006289308176100629,"transaction":0.006289308176100629,"conclusion":0.006289308176100629,"fundamental":0.006289308176100629,"tool":0.006289308176100629,"allows":0.006289308176100629,"used":0.006289308176100629,"effectively":0.006289308176100629,"enhances":0.006289308176100629,"reliability":0.006289308176100629,"maintainability":0.006289308176100629,"code":0.006289308176100629,"providing":0.006289308176100629,"clear":0.006289308176100629,"concise":0.006289308176100629,"way":0.006289308176100629},"201":{"1":0.004201680672268907,"2":0.004201680672268907,"3":0.004201680672268907,"4":0.004201680672268907,"clarity":0.004201680672268907,"provides":0.004201680672268907,"robust":0.004201680672268907,"mechanisms":0.004201680672268907,"for":0.004201680672268907,"dealing":0.004201680672268907,"with":0.004201680672268907,"optional":0.004201680672268907,"values":0.004201680672268907,"and":0.004201680672268907,"error":0.004201680672268907,"cases":0.004201680672268907,"these":0.004201680672268907,"features":0.004201680672268907,"are":0.004201680672268907,"crucial":0.004201680672268907,"writing":0.004201680672268907,"secure":0.004201680672268907,"predictable":0.004201680672268907,"smart":0.004201680672268907,"contracts":0.004201680672268907,"that":0.004201680672268907,"can":0.004201680672268907,"gracefully":0.004201680672268907,"handle":0.004201680672268907,"unexpected":0.004201680672268907,"situations":0.004201680672268907,"why":0.004201680672268907,"functions":0.004201680672268907,"matter":0.004201680672268907,"clarity's":0.004201680672268907,"value":0.004201680672268907,"handling":0.004201680672268907,"designed":0.004201680672268907,"several":0.004201680672268907,"important":0.004201680672268907,"considerations":0.004201680672268907,"in":0.004201680672268907,"mind":0.004201680672268907,"safety":0.004201680672268907,"they":0.004201680672268907,"prevent":0.004201680672268907,"null":0.004201680672268907,"or":0.004201680672268907,"undefined":0.004201680672268907,"errors":0.004201680672268907,"could":0.004201680672268907,"crash":0.004201680672268907,"a":0.004201680672268907,"contract":0.004201680672268907,"explicitness":0.004201680672268907,"force":0.004201680672268907,"developers":0.004201680672268907,"to":0.004201680672268907,"consider":0.004201680672268907,"all":0.004201680672268907,"possible":0.004201680672268907,"outcomes":0.004201680672268907,"readability":0.004201680672268907,"make":0.004201680672268907,"the":0.004201680672268907,"code's":0.004201680672268907,"intent":0.004201680672268907,"clear":0.004201680672268907,"improving":0.004201680672268907,"maintainability":0.004201680672268907,"composability":0.004201680672268907,"allow":0.004201680672268907,"clean":0.004201680672268907,"function":0.004201680672268907,"composition":0.004201680672268907,"chaining":0.004201680672268907,"of":0.004201680672268907,"operations":0.004201680672268907,"core":0.004201680672268907,"is-some":0.004201680672268907,"is-none":0.004201680672268907,"what":0.004201680672268907,"check":0.004201680672268907,"if":0.004201680672268907,"an":0.004201680672268907,"contains":0.004201680672268907,"some":0.004201680672268907,"is":0.004201680672268907,"empty":0.004201680672268907,"none":0.004201680672268907,"essential":0.004201680672268907,"safely":0.004201680672268907,"working":0.004201680672268907,"before":0.004201680672268907,"attempting":0.004201680672268907,"use":0.004201680672268907,"them":0.004201680672268907,"when":0.004201680672268907,"you":0.004201680672268907,"need":0.004201680672268907,"present":0.004201680672268907,"proceeding":0.004201680672268907,"how":0.004201680672268907,"best":0.004201680672268907,"practices":0.004201680672268907,"-":0.004201680672268907,"always":0.004201680672268907,"unwrapping":0.004201680672268907,"combination":0.004201680672268907,"unwrap":0.004201680672268907,"safe":0.004201680672268907,"extraction":0.004201680672268907,"example":0.004201680672268907,"case":0.004201680672268907,"checking":0.004201680672268907,"user":0.004201680672268907,"exists":0.004201680672268907,"map":0.004201680672268907,"performing":0.004201680672268907,"operation":0.004201680672268907,"define-map":0.004201680672268907,"users":0.004201680672268907,"principal":0.004201680672268907,"balance":0.004201680672268907,"uint":0.004201680672268907,"define-public":0.004201680672268907,"check-balance":0.004201680672268907,"map-get":0.004201680672268907,"ok":0.004201680672268907,"err":0.004201680672268907,"not":0.004201680672268907,"found":0.004201680672268907,"unwrap-panic":0.004201680672268907,"extract":0.004201680672268907,"from":0.004201680672268907,"response":0.004201680672268907,"type":0.004201680672268907,"allows":0.004201680672268907,"controlled":0.004201680672268907,"behavior":0.004201680672268907,"on":0.004201680672268907,"failure":0.004201680672268907,"you're":0.004201680672268907,"certain":0.004201680672268907,"want":0.004201680672268907,"halt":0.004201680672268907,"execution":0.004201680672268907,"it":0.004201680672268907,"doesn't":0.004201680672268907,"error-expr":0.004201680672268907,"provide":0.004201680672268907,"custom":0.004201680672268907,"message":0.004201680672268907,"sparingly":0.004201680672268907,"typically":0.004201680672268907,"only":0.004201680672268907,"where":0.004201680672268907,"truly":0.004201680672268907,"retrieving":0.004201680672268907,"user's":0.004201680672268907,"exist":0.004201680672268907,"get-balance":0.004201680672268907,"get":0.004201680672268907,"try":0.004201680672268907,"attempts":0.004201680672268907,"returning":0.004201680672268907,"early":0.004201680672268907,"fails":0.004201680672268907,"simplifies":0.004201680672268907,"return":0.004201680672268907,"responses":0.004201680672268907,"propagate":0.004201680672268907,"up":0.004201680672268907,"call":0.004201680672268907,"stack":0.004201680672268907,"expression":0.004201680672268907,"chain":0.004201680672268907,"multiple":0.004201680672268907,"might":0.004201680672268907,"fail":0.004201680672268907,"helps":0.004201680672268907,"keep":0.004201680672268907,"code":0.004201680672268907,"by":0.004201680672268907,"avoiding":0.004201680672268907,"nested":0.004201680672268907,"if-else":0.004201680672268907,"statements":0.004201680672268907,"transferring":0.004201680672268907,"tokens":0.004201680672268907,"between":0.004201680672268907,"checks":0.004201680672268907,"transfer":0.004201680672268907,"amount":0.004201680672268907,"let":0.004201680672268907,"senderbalance":0.004201680672268907,"recipientbalance":0.004201680672268907,"check-sufficient-balance":0.004201680672268907,"update-balance":0.004201680672268907,"true":0.004201680672268907,"practical":0.004201680672268907,"token":0.004201680672268907,"system":0.004201680672268907,"let's":0.004201680672268907,"implement":0.004201680672268907,"simple":0.004201680672268907,"demonstrates":0.004201680672268907,"balances":0.004201680672268907,"define-read-only":0.004201680672268907,"default-to":0.004201680672268907,"u0":0.004201680672268907,"tx-sender":0.004201680672268907,"begin":0.004201680672268907,"as-contract":0.004201680672268907,"stx-transfer":0.004201680672268907,"map-set":0.004201680672268907,"u1":0.004201680672268907,"deposit":0.004201680672268907,"currentbalance":0.004201680672268907,"this":0.004201680672268907,"using":0.004201680672268907,"potential":0.004201680672268907,"stx":0.004201680672268907,"proper":0.004201680672268907,"propagation":0.004201680672268907,"throughout":0.004201680672268907,"conclusion":0.004201680672268907,"reliable":0.004201680672268907,"leveraging":0.004201680672268907,"built-in":0.004201680672268907,"like":0.004201680672268907,"create":0.004201680672268907,"feedback":0.004201680672268907,"occur":0.004201680672268907,"tools":0.004201680672268907,"your":0.004201680672268907,"more":0.004201680672268907,"maintainable":0.004201680672268907},"202":{"1":0.003676470588235294,"2":0.003676470588235294,"3":0.003676470588235294,"4":0.003676470588235294,"block":0.003676470588235294,"info":0.003676470588235294,"functions":0.003676470588235294,"in":0.003676470588235294,"clarity":0.003676470588235294,"provide":0.003676470588235294,"crucial":0.003676470588235294,"tools":0.003676470588235294,"for":0.003676470588235294,"implementing":0.003676470588235294,"time-based":0.003676470588235294,"logic":0.003676470588235294,"smart":0.003676470588235294,"contracts":0.003676470588235294,"these":0.003676470588235294,"allow":0.003676470588235294,"developers":0.003676470588235294,"to":0.003676470588235294,"create":0.003676470588235294,"that":0.003676470588235294,"can":0.003676470588235294,"respond":0.003676470588235294,"the":0.003676470588235294,"passage":0.003676470588235294,"of":0.003676470588235294,"time":0.003676470588235294,"and":0.003676470588235294,"changing":0.003676470588235294,"blockchain":0.003676470588235294,"states":0.003676470588235294,"why":0.003676470588235294,"matter":0.003676470588235294,"clarity's":0.003676470588235294,"are":0.003676470588235294,"designed":0.003676470588235294,"with":0.003676470588235294,"blockchain-specific":0.003676470588235294,"considerations":0.003676470588235294,"mind":0.003676470588235294,"determinism":0.003676470588235294,"a":0.003676470588235294,"consistent":0.003676470588235294,"view":0.003676470588235294,"across":0.003676470588235294,"all":0.003676470588235294,"nodes":0.003676470588235294,"ensuring":0.003676470588235294,"contract":0.003676470588235294,"behavior":0.003676470588235294,"is":0.003676470588235294,"predictable":0.003676470588235294,"security":0.003676470588235294,"by":0.003676470588235294,"relying":0.003676470588235294,"on":0.003676470588235294,"information":0.003676470588235294,"rather":0.003676470588235294,"than":0.003676470588235294,"system":0.003676470588235294,"protected":0.003676470588235294,"against":0.003676470588235294,"manipulations":0.003676470588235294,"flexibility":0.003676470588235294,"time-locked":0.003676470588235294,"features":0.003676470588235294,"scheduled":0.003676470588235294,"events":0.003676470588235294,"other":0.003676470588235294,"time-dependent":0.003676470588235294,"awareness":0.003676470588235294,"make":0.003676470588235294,"decisions":0.003676470588235294,"based":0.003676470588235294,"current":0.003676470588235294,"state":0.003676470588235294,"core":0.003676470588235294,"block-height":0.003676470588235294,"what":0.003676470588235294,"returns":0.003676470588235294,"height":0.003676470588235294,"stacks":0.003676470588235294,"essential":0.003676470588235294,"creating":0.003676470588235294,"progression":0.003676470588235294,"when":0.003676470588235294,"use":0.003676470588235294,"you":0.003676470588235294,"need":0.003676470588235294,"trigger":0.003676470588235294,"actions":0.003676470588235294,"or":0.003676470588235294,"changes":0.003676470588235294,"milestones":0.003676470588235294,"how":0.003676470588235294,"best":0.003676470588235294,"practices":0.003676470588235294,"-":0.003676470588235294,"long-term":0.003676470588235294,"measurements":0.003676470588235294,"hours":0.003676470588235294,"days":0.003676470588235294,"short":0.003676470588235294,"intervals":0.003676470588235294,"consider":0.003676470588235294,"potential":0.003676470588235294,"variations":0.003676470588235294,"planning":0.003676470588235294,"time-sensitive":0.003676470588235294,"operations":0.003676470588235294,"example":0.003676470588235294,"case":0.003676470588235294,"phased":0.003676470588235294,"token":0.003676470588235294,"release":0.003676470588235294,"schedule":0.003676470588235294,"define-public":0.003676470588235294,"claim-tokens":0.003676470588235294,"let":0.003676470588235294,"release-height":0.003676470588235294,"u100000":0.003676470588235294,"if":0.003676470588235294,"ok":0.003676470588235294,"release-tokens":0.003676470588235294,"err":0.003676470588235294,"u1":0.003676470588235294,"burn-block-height":0.003676470588235294,"underlying":0.003676470588235294,"burn":0.003676470588235294,"chain":0.003676470588235294,"bitcoin":0.003676470588235294,"provides":0.003676470588235294,"more":0.003676470588235294,"stable":0.003676470588235294,"reference":0.003676470588235294,"as":0.003676470588235294,"has":0.003676470588235294,"times":0.003676470588235294,"precise":0.003676470588235294,"synchronizing":0.003676470588235294,"network":0.003676470588235294,"prefer":0.003676470588235294,"this":0.003676470588235294,"over":0.003676470588235294,"accurate":0.003676470588235294,"estimations":0.003676470588235294,"remember":0.003676470588235294,"still":0.003676470588235294,"vary":0.003676470588235294,"so":0.003676470588235294,"some":0.003676470588235294,"vault":0.003676470588235294,"opens":0.003676470588235294,"after":0.003676470588235294,"specific":0.003676470588235294,"define-constant":0.003676470588235294,"unlock-height":0.003676470588235294,"u700000":0.003676470588235294,"withdraw-from-vault":0.003676470588235294,"amount":0.003676470588235294,"uint":0.003676470588235294,"transfer-tokens":0.003676470588235294,"u2":0.003676470588235294,"get-block-info":0.003676470588235294,"retrieves":0.003676470588235294,"about":0.003676470588235294,"allows":0.003676470588235294,"access":0.003676470588235294,"historical":0.003676470588235294,"data":0.003676470588235294,"complex":0.003676470588235294,"verify":0.003676470588235294,"act":0.003676470588235294,"from":0.003676470588235294,"past":0.003676470588235294,"blocks":0.003676470588235294,"property-name":0.003676470588235294,"block-height-int":0.003676470588235294,"cache":0.003676470588235294,"retrieved":0.003676470588235294,"possible":0.003676470588235294,"save":0.003676470588235294,"processing":0.003676470588235294,"costs":0.003676470588235294,"be":0.003676470588235294,"aware":0.003676470588235294,"limit":0.003676470588235294,"far":0.003676470588235294,"back":0.003676470588235294,"query":0.003676470588235294,"reward":0.003676470588235294,"user":0.003676470588235294,"activity":0.003676470588235294,"periods":0.003676470588235294,"claim-period-reward":0.003676470588235294,"period":0.003676470588235294,"period-end-height":0.003676470588235294,"get-period-end-height":0.003676470588235294,"current-winner":0.003676470588235294,"winner-id":0.003676470588235294,"is-eq":0.003676470588235294,"tx-sender":0.003676470588235294,"distribute-reward":0.003676470588235294,"u3":0.003676470588235294,"practical":0.003676470588235294,"balance":0.003676470588235294,"snapshot":0.003676470588235294,"voting":0.003676470588235294,"let's":0.003676470588235294,"implement":0.003676470588235294,"simple":0.003676470588235294,"where":0.003676470588235294,"power":0.003676470588235294,"determined":0.003676470588235294,"user's":0.003676470588235294,"at":0.003676470588235294,"combines":0.003676470588235294,"at-block":0.003676470588235294,"mechanism":0.003676470588235294,"define":0.003676470588235294,"map":0.003676470588235294,"define-map":0.003676470588235294,"token-balances":0.003676470588235294,"principal":0.003676470588235294,"store":0.003676470588235294,"votes":0.003676470588235294,"set":0.003676470588235294,"define-data-var":0.003676470588235294,"snapshot-height":0.003676470588235294,"function":0.003676470588235294,"get":0.003676470588235294,"define-read-only":0.003676470588235294,"get-snapshot-balance":0.003676470588235294,"match":0.003676470588235294,"id-header-hash":0.003676470588235294,"var-get":0.003676470588235294,"snapshot-block":0.003676470588235294,"default-to":0.003676470588235294,"u0":0.003676470588235294,"map-get":0.003676470588235294,"cast":0.003676470588235294,"vote":0.003676470588235294,"cast-vote":0.003676470588235294,"snapshot-balance":0.003676470588235294,"current-votes":0.003676470588235294,"asserts":0.003676470588235294,"can't":0.003676470588235294,"prevent":0.003676470588235294,"overflow":0.003676470588235294,"map-set":0.003676470588235294,"true":0.003676470588235294,"check":0.003676470588235294,"total":0.003676470588235294,"get-total-votes":0.003676470588235294,"fold":0.003676470588235294,"map-values":0.003676470588235294,"conclusion":0.003676470588235294,"powerful":0.003676470588235294,"understanding":0.003676470588235294,"dynamically":0.003676470588235294,"enabling":0.003676470588235294,"like":0.003676470588235294,"time-locks":0.003676470588235294,"analysis":0.003676470588235294,"always":0.003676470588235294,"requirements":0.003676470588235294,"your":0.003676470588235294,"application":0.003676470588235294,"using":0.003676470588235294},"203":{"import":0.012658227848101266,"secondarycard":0.012658227848101266,"from":0.012658227848101266,"'":0.012658227848101266,"components":0.012658227848101266,"card'":0.012658227848101266,"lfg":0.012658227848101266,"related":0.012658227848101266,"tools":0.012658227848101266,"-":0.012658227848101266,"clarinet":0.012658227848101266,"stacks":0.012658227848101266,"build":0.012658227848101266,"your":0.012658227848101266,"app":0.012658227848101266,"in":0.012658227848101266,"a":0.012658227848101266,"local":0.012658227848101266,"environment":0.012658227848101266,"on":0.012658227848101266,"js":0.012658227848101266,"don":0.012658227848101266,"t":0.012658227848101266,"reinvent":0.012658227848101266,"the":0.012658227848101266,"wheel":0.012658227848101266,"and":0.012658227848101266,"faster":0.012658227848101266,"with":0.012658227848101266,"library":0.012658227848101266,"that":0.012658227848101266,"handles":0.012658227848101266,"basic":0.012658227848101266,"blockchain":0.012658227848101266,"functionality":0.012658227848101266,"api":0.012658227848101266,"fetch":0.012658227848101266,"data":0.012658227848101266,"broadcast":0.012658227848101266,"transactions":0.012658227848101266,"br":0.012658227848101266,"callout":0.012658227848101266,"title":0.012658227848101266,"need":0.012658227848101266,"help":0.012658227848101266,"building":0.012658227848101266,"sdk":0.012658227848101266,"type":0.012658227848101266,"reach":0.012658227848101266,"out":0.012658227848101266,"to":0.012658227848101266,"us":0.012658227848101266,"span":0.012658227848101266,"classname":0.012658227848101266,"font-bold":0.012658227848101266,"channel":0.012658227848101266,"discord":0.012658227848101266,"https":0.012658227848101266,"chat":0.012658227848101266,"under":0.012658227848101266,"hiro":0.012658227848101266,"developer":0.012658227848101266,"section":0.012658227848101266,"there's":0.012658227848101266,"also":0.012658227848101266,"weekly":0.012658227848101266,"office":0.012658227848101266,"hours":0.012658227848101266,"www":0.012658227848101266,"addevent":0.012658227848101266,"com":0.012658227848101266,"event":0.012658227848101266,"ki22007085":0.012658227848101266,"call":0.012658227848101266,"every":0.012658227848101266,"wednesday":0.012658227848101266,"at":0.012658227848101266,"1pm":0.012658227848101266,"et":0.012658227848101266},"204":{"import":0.012658227848101266,"secondarycard":0.012658227848101266,"from":0.012658227848101266,"'":0.012658227848101266,"components":0.012658227848101266,"card'":0.012658227848101266,"lfg":0.012658227848101266,"related":0.012658227848101266,"tools":0.012658227848101266,"-":0.012658227848101266,"clarinet":0.012658227848101266,"stacks":0.012658227848101266,"build":0.012658227848101266,"your":0.012658227848101266,"app":0.012658227848101266,"in":0.012658227848101266,"a":0.012658227848101266,"local":0.012658227848101266,"environment":0.012658227848101266,"on":0.012658227848101266,"js":0.012658227848101266,"don":0.012658227848101266,"t":0.012658227848101266,"reinvent":0.012658227848101266,"the":0.012658227848101266,"wheel":0.012658227848101266,"and":0.012658227848101266,"faster":0.012658227848101266,"with":0.012658227848101266,"library":0.012658227848101266,"that":0.012658227848101266,"handles":0.012658227848101266,"basic":0.012658227848101266,"blockchain":0.012658227848101266,"functionality":0.012658227848101266,"api":0.012658227848101266,"fetch":0.012658227848101266,"data":0.012658227848101266,"broadcast":0.012658227848101266,"transactions":0.012658227848101266,"br":0.012658227848101266,"callout":0.012658227848101266,"title":0.012658227848101266,"need":0.012658227848101266,"help":0.012658227848101266,"building":0.012658227848101266,"sdk":0.012658227848101266,"type":0.012658227848101266,"reach":0.012658227848101266,"out":0.012658227848101266,"to":0.012658227848101266,"us":0.012658227848101266,"span":0.012658227848101266,"classname":0.012658227848101266,"font-bold":0.012658227848101266,"channel":0.012658227848101266,"discord":0.012658227848101266,"https":0.012658227848101266,"chat":0.012658227848101266,"under":0.012658227848101266,"hiro":0.012658227848101266,"developer":0.012658227848101266,"section":0.012658227848101266,"there's":0.012658227848101266,"also":0.012658227848101266,"weekly":0.012658227848101266,"office":0.012658227848101266,"hours":0.012658227848101266,"www":0.012658227848101266,"addevent":0.012658227848101266,"com":0.012658227848101266,"event":0.012658227848101266,"ki22007085":0.012658227848101266,"call":0.012658227848101266,"every":0.012658227848101266,"wednesday":0.012658227848101266,"at":0.012658227848101266,"1pm":0.012658227848101266,"et":0.012658227848101266},"205":{},"206":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"signer-metrics-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"signer-metrics":0.0625,"v1":0.0625,"blocks":0.0625,"height_or_hash":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"207":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"signer-metrics-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"signer-metrics":0.06666666666666667,"v1":0.06666666666666667,"blocks'":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"208":{"import":0.007575757575757576,"secondarycard":0.007575757575757576,"from":0.007575757575757576,"'":0.007575757575757576,"components":0.007575757575757576,"card'":0.007575757575757576,"the":0.007575757575757576,"signer":0.007575757575757576,"metrics":0.007575757575757576,"api":0.007575757575757576,"enables":0.007575757575757576,"you":0.007575757575757576,"to":0.007575757575757576,"monitor":0.007575757575757576,"signers":0.007575757575757576,"on":0.007575757575757576,"stacks":0.007575757575757576,"network":0.007575757575757576,"with":0.007575757575757576,"a":0.007575757575757576,"familiar":0.007575757575757576,"rest":0.007575757575757576,"interface":0.007575757575757576,"can":0.007575757575757576,"easily":0.007575757575757576,"fetch":0.007575757575757576,"information":0.007575757575757576,"about":0.007575757575757576,"such":0.007575757575757576,"as":0.007575757575757576,"lists":0.007575757575757576,"of":0.007575757575757576,"active":0.007575757575757576,"in":0.007575757575757576,"particular":0.007575757575757576,"pox":0.007575757575757576,"cycle":0.007575757575757576,"and":0.007575757575757576,"for":0.007575757575757576,"block":0.007575757575757576,"this":0.007575757575757576,"also":0.007575757575757576,"lets":0.007575757575757576,"analyze":0.007575757575757576,"evaluate":0.007575757575757576,"behavior":0.007575757575757576,"individual":0.007575757575757576,"their":0.007575757575757576,"acceptance":0.007575757575757576,"rate":0.007575757575757576,"average":0.007575757575757576,"push":0.007575757575757576,"time":0.007575757575757576,"more":0.007575757575757576,"popular":0.007575757575757576,"endpoints":0.007575757575757576,"cards":0.007575757575757576,"href":0.007575757575757576,"signer-metrics-api":0.007575757575757576,"pox-cycle-signers":0.007575757575757576,"title":0.007575757575757576,"get":0.007575757575757576,"list":0.007575757575757576,"description":0.007575757575757576,"fetches":0.007575757575757576,"given":0.007575757575757576,"blocks":0.007575757575757576,"aggregated-signer-information-for-a-block":0.007575757575757576,"aggregated":0.007575757575757576,"specific":0.007575757575757576,"prometheus":0.007575757575757576,"query":0.007575757575757576,"behavioral":0.007575757575757576,"data":0.007575757575757576,"around":0.007575757575757576,"proposals":0.007575757575757576,"related":0.007575757575757576,"tools":0.007575757575757576,"-":0.007575757575757576,"blockchain":0.007575757575757576,"richer":0.007575757575757576,"hiro's":0.007575757575757576,"node":0.007575757575757576,"rpc":0.007575757575757576,"rpc-api":0.007575757575757576,"interact":0.007575757575757576,"smart":0.007575757575757576,"contracts":0.007575757575757576,"broadcast":0.007575757575757576,"transactions":0.007575757575757576,"all":0.007575757575757576,"via":0.007575757575757576,"token":0.007575757575757576,"metadata":0.007575757575757576,"token-metadata-api":0.007575757575757576,"fungible":0.007575757575757576,"non-fungible":0.007575757575757576,"br":0.007575757575757576,"callout":0.007575757575757576,"need":0.007575757575757576,"help":0.007575757575757576,"building":0.007575757575757576,"type":0.007575757575757576,"reach":0.007575757575757576,"out":0.007575757575757576,"us":0.007575757575757576,"span":0.007575757575757576,"classname":0.007575757575757576,"font-bold":0.007575757575757576,"channel":0.007575757575757576,"discord":0.007575757575757576,"https":0.007575757575757576,"chat":0.007575757575757576,"under":0.007575757575757576,"hiro":0.007575757575757576,"developer":0.007575757575757576,"section":0.007575757575757576,"there's":0.007575757575757576,"weekly":0.007575757575757576,"office":0.007575757575757576,"hours":0.007575757575757576,"www":0.007575757575757576,"addevent":0.007575757575757576,"com":0.007575757575757576,"event":0.007575757575757576,"ki22007085":0.007575757575757576,"call":0.007575757575757576,"every":0.007575757575757576,"wednesday":0.007575757575757576,"at":0.007575757575757576,"1pm":0.007575757575757576,"et":0.007575757575757576},"209":{},"210":{"apipage":0.07692307692307693,"document":0.07692307692307693,"openapi":0.07692307692307693,"signer-metrics-api":0.07692307692307693,"json":0.07692307692307693,"operations":0.07692307692307693,"path":0.07692307692307693,"'":0.07692307692307693,"signer-metrics":0.07692307692307693,"method":0.07692307692307693,"'get'":0.07692307692307693,"hashead":0.07692307692307693,"false":0.07692307692307693},"211":{},"212":{"apipage":0.07142857142857142,"document":0.07142857142857142,"openapi":0.07142857142857142,"signer-metrics-api":0.07142857142857142,"json":0.07142857142857142,"operations":0.07142857142857142,"path":0.07142857142857142,"'":0.07142857142857142,"signer-metrics":0.07142857142857142,"metrics'":0.07142857142857142,"method":0.07142857142857142,"'get'":0.07142857142857142,"hashead":0.07142857142857142,"false":0.07142857142857142},"213":{},"214":{"apipage":0.05555555555555555,"document":0.05555555555555555,"openapi":0.05555555555555555,"signer-metrics-api":0.05555555555555555,"json":0.05555555555555555,"operations":0.05555555555555555,"path":0.05555555555555555,"'":0.05555555555555555,"signer-metrics":0.05555555555555555,"v1":0.05555555555555555,"cycles":0.05555555555555555,"cycle_number":0.05555555555555555,"signers":0.05555555555555555,"signer_id":0.05555555555555555,"method":0.05555555555555555,"'get'":0.05555555555555555,"hashead":0.05555555555555555,"false":0.05555555555555555},"215":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"signer-metrics-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"signer-metrics":0.058823529411764705,"v1":0.058823529411764705,"cycles":0.058823529411764705,"cycle_number":0.058823529411764705,"signers'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"216":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"signer-metrics-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"signer-metrics":0.0625,"v1":0.0625,"block_proposals":0.0625,"block_hash":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"217":{},"218":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"signer-metrics-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"signer-metrics":0.06666666666666667,"v1":0.06666666666666667,"block_proposals'":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"219":{"0":0.003003003003003003,"1":0.003003003003003003,"2":0.003003003003003003,"3":0.003003003003003003,"4":0.003003003003003003,"6":0.003003003003003003,"8":0.003003003003003003,"13":0.003003003003003003,"nakamoto":0.003003003003003003,"is":0.003003003003003003,"an":0.003003003003003003,"upcoming":0.003003003003003003,"upgrade":0.003003003003003003,"to":0.003003003003003003,"stacks":0.003003003003003003,"that":0.003003003003003003,"brings":0.003003003003003003,"faster":0.003003003003003003,"blocks":0.003003003003003003,"and":0.003003003003003003,"paves":0.003003003003003003,"the":0.003003003003003003,"way":0.003003003003003003,"for":0.003003003003003003,"sbtc":0.003003003003003003,"start":0.003003003003003003,"here":0.003003003003003003,"https":0.003003003003003003,"docs":0.003003003003003003,"co":0.003003003003003003,"nakamoto-upgrade":0.003003003003003003,"nakamoto-upgrade-start-here":0.003003003003003003,"if":0.003003003003003003,"you":0.003003003003003003,"need":0.003003003003003003,"overview":0.003003003003003003,"of":0.003003003003003003,"how":0.003003003003003003,"impacts":0.003003003003003003,"network":0.003003003003003003,"this":0.003003003003003003,"document":0.003003003003003003,"about":0.003003003003003003,"your":0.003003003003003003,"applications":0.003003003003003003,"hiro":0.003003003003003003,"tooling":0.003003003003003003,"specifically":0.003003003003003003,"good":0.003003003003003003,"news":0.003003003003003003,"does":0.003003003003003003,"not":0.003003003003003003,"bring":0.003003003003003003,"breaking":0.003003003003003003,"changes":0.003003003003003003,"on":0.003003003003003003,"app":0.003003003003003003,"will":0.003003003003003003,"continue":0.003003003003003003,"work":0.003003003003003003,"as":0.003003003003003003,"expected":0.003003003003003003,"post-upgrade":0.003003003003003003,"apart":0.003003003003003003,"from":0.003003003003003003,"users":0.003003003003003003,"experiencing":0.003003003003003003,"better":0.003003003003003003,"ux":0.003003003003003003,"block":0.003003003003003003,"times":0.003003003003003003,"in":0.003003003003003003,"terms":0.003003003003003003,"what":0.003003003003003003,"do":0.003003003003003003,"prepare":0.003003003003003003,"just":0.003003003003003003,"make":0.003003003003003003,"sure":0.003003003003003003,"are":0.003003003003003003,"running":0.003003003003003003,"latest":0.003003003003003003,"versions":0.003003003003003003,"our":0.003003003003003003,"we":0.003003003003003003,"shipping":0.003003003003003003,"updates":0.003003003003003003,"across":0.003003003003003003,"all":0.003003003003003003,"tools":0.003003003003003003,"they":0.003003003003003003,"support":0.003003003003003003,"can":0.003003003003003003,"stay":0.003003003003003003,"focused":0.003003003003003003,"building":0.003003003003003003,"below":0.003003003003003003,"find":0.003003003003003003,"a":0.003003003003003003,"list":0.003003003003003003,"have":0.003003003003003003,"been":0.003003003003003003,"updated":0.003003003003003003,"explorer":0.003003003003003003,"what's":0.003003003003003003,"new":0.003003003003003003,"introducing":0.003003003003003003,"fresh":0.003003003003003003,"view":0.003003003003003003,"now":0.003003003003003003,"features":0.003003003003003003,"display":0.003003003003003003,"aligning":0.003003003003003003,"with":0.003003003003003003,"upgrade's":0.003003003003003003,"approach":0.003003003003003003,"multiple":0.003003003003003003,"stx":0.003003003003003003,"settling":0.003003003003003003,"into":0.003003003003003003,"one":0.003003003003003003,"btc":0.003003003003003003,"images":0.003003003003003003,"nakamoto-explorer":0.003003003003003003,"png":0.003003003003003003,"tailored":0.003003003003003003,"viewing":0.003003003003003003,"experience":0.003003003003003003,"live":0.003003003003003003,"both":0.003003003003003003,"testnet":0.003003003003003003,"so":0.003003003003003003,"chain":0.003003003003003003,"mainnet":0.003003003003003003,"accessible":0.003003003003003003,"via":0.003003003003003003,"dropdown":0.003003003003003003,"two":0.003003003003003003,"distinctive":0.003003003003003003,"modes":0.003003003003003003,"independent":0.003003003003003003,"focuses":0.003003003003003003,"progress":0.003003003003003003,"coming":0.003003003003003003,"soon":0.003003003003003003,"grouped":0.003003003003003003,"by":0.003003003003003003,"bitcoin":0.003003003003003003,"shows":0.003003003003003003,"flow":0.003003003003003003,"alongside":0.003003003003003003,"group-by-block":0.003003003003003003,"loop":0.003003003003003003,"keep":0.003003003003003003,"up-to-date":0.003003003003003003,"real-time":0.003003003003003003,"option":0.003003003003003003,"---":0.003003003003003003,"js":0.003003003003003003,"s":0.003003003003003003,"stackingclient":0.003003003003003003,"install":0.003003003003003003,"version":0.003003003003003003,"npm":0.003003003003003003,"stacking":0.003003003003003003,"was":0.003003003003003003,"match":0.003003003003003003,"pox-4":0.003003003003003003,"contract":0.003003003003003003,"-":0.003003003003003003,"added":0.003003003003003003,"signpoxsignature":0.003003003003003003,"pox4signaturetopic":0.003003003003003003,"enum":0.003003003003003003,"arguments":0.003003003003003003,"stack":0.003003003003003003,"stackextend":0.003003003003003003,"stackincrease":0.003003003003003003,"stackaggregationcommit":0.003003003003003003,"stackaggregationcommitindexed":0.003003003003003003,"learn":0.003003003003003003,"more":0.003003003003003003,"guides":0.003003003003003003,"stacks-js":0.003003003003003003,"clarinet":0.003003003003003003,"github":0.003003003003003003,"com":0.003003003003003003,"hirosystems":0.003003003003003003,"releases":0.003003003003003003,"tag":0.003003003003003003,"v2":0.003003003003003003,"or":0.003003003003003003,"above":0.003003003003003003,"clarinet's":0.003003003003003003,"devnet":0.003003003003003003,"be":0.003003003003003003,"used":0.003003003003003003,"test":0.003003003003003003,"functionality":0.003003003003003003,"starts":0.003003003003003003,"signer":0.003003003003003003,"nodes":0.003003003003003003,"mode":0.003003003003003003,"check":0.003003003003003003,"--enable-clarity-wasm":0.003003003003003003,"runs":0.003003003003003003,"current":0.003003003003003003,"interpreter":0.003003003003003003,"clarity":0.003003003003003003,"wasm":0.003003003003003003,"side-by-side":0.003003003003003003,"allow":0.003003003003003003,"comparing":0.003003003003003003,"outputs":0.003003003003003003,"console":0.003003003003003003,"automatically":0.003003003003003003,"logs":0.003003003003003003,"any":0.003003003003003003,"difference":0.003003003003003003,"default":0.003003003003003003,"won't":0.003003003003003003,"epoch":0.003003003003003003,"see":0.003003003003003003,"guide":0.003003003003003003,"configure":0.003003003003003003,"it":0.003003003003003003,"blockchain":0.003003003003003003,"api":0.003003003003003003,"_note":0.003003003003003003,"_":0.003003003003003003,"extended":0.003003003003003003,"endpoints":0.003003003003003003,"represent":0.003003003003003003,"modern":0.003003003003003003,"being":0.003003003003003003,"continually":0.003003003003003003,"expanded":0.003003003003003003,"encourage":0.003003003003003003,"developers":0.003003003003003003,"use":0.003003003003003003,"developments":0.003003003003003003,"aware":0.003003003003003003,"v1":0.003003003003003003,"older":0.003003003003003003,"set":0.003003003003003003,"though":0.003003003003003003,"function":0.003003003003003003,"deprecated":0.003003003003003003,"months":0.003003003003003003,"has":0.003003003003003003,"series":0.003003003003003003,"get":0.003003003003003003,"proof-of-transfer":0.003003003003003003,"details":0.003003003003003003,"per":0.003003003003003003,"cycle":0.003003003003003003,"including":0.003003003003003003,"signers":0.003003003003003003,"stackers":0.003003003003003003,"information":0.003003003003003003,"stacked":0.003003003003003003,"amounts":0.003003003003003003,"payout":0.003003003003003003,"addresses":0.003003003003003003,"weights":0.003003003003003003,"mining":0.003003003003003003,"mechanism":0.003003003003003003,"transactions":0.003003003003003003,"relevant":0.003003003003003003,"address":0.003003003003003003,"id":0.003003003003003003,"filters":0.003003003003003003,"ft":0.003003003003003003,"nft":0.003003003003003003,"transfers":0.003003003003003003,"tenure_change":0.003003003003003003,"transaction":0.003003003003003003,"type":0.003003003003003003,"summary":0.003003003003003003,"mempool":0.003003003003003003,"fees":0.003003003003003003,"statistics":0.003003003003003003,"confirmation":0.003003003003003003,"priorities":0.003003003003003003,"deployment":0.003003003003003003,"status":0.003003003003003003,"smart":0.003003003003003003,"contracts":0.003003003003003003,"call":0.003003003003003003,"these":0.003003003003003003,"backwards":0.003003003003003003,"compatible":0.003003003003003003,"earlier":0.003003003003003003,"event":0.003003003003003003,"replay":0.003003003003003003,"optimizations":0.003003003003003003,"optimize":0.003003003003003003,"speed":0.003003003003003003,"creating":0.003003003003003003,"parquet-based":0.003003003003003003,"ingestion":0.003003003003003003,"optimizes":0.003003003003003003,"canonical":0.003003003003003003,"classic":0.003003003003003003,"tsv":0.003003003003003003,"improving":0.003003003003003003,"affects":0.003003003003003003,"principal":0.003003003003003003,"tx":0.003003003003003003,"tx_id":0.003003003003003003,"raw":0.003003003003003003,"burn-blocks":0.003003003003003003,"height_or_hash":0.003003003003003003,"events":0.003003003003003003,"smart-contracts":0.003003003003003003,"pox":0.003003003003003003,"cycles":0.003003003003003003,"cycle_number":0.003003003003003003,"signer_key":0.003003003003003003,"hash":0.003003003003003003,"by_height":0.003003003003003003,"height":0.003003003003003003,"by_burn_block_hash":0.003003003003003003,"burn_block_hash":0.003003003003003003,"by_burn_block_height":0.003003003003003003,"burn_block_height":0.003003003003003003,"with_transfers":0.003003003003003003,"transactions_with_transfers":0.003003003003003003,"fee_rate":0.003003003003003003,"block_hash":0.003003003003003003,"block_height":0.003003003003003003,"reference":0.003003003003003003,"info":0.003003003003003003},"220":{"1":0.013157894736842105,"2":0.013157894736842105,"what's":0.013157894736842105,"new":0.013157894736842105,"introducing":0.013157894736842105,"a":0.013157894736842105,"fresh":0.013157894736842105,"view":0.013157894736842105,"for":0.013157894736842105,"blocks":0.013157894736842105,"the":0.013157894736842105,"stacks":0.013157894736842105,"explorer":0.013157894736842105,"now":0.013157894736842105,"features":0.013157894736842105,"way":0.013157894736842105,"to":0.013157894736842105,"display":0.013157894736842105,"aligning":0.013157894736842105,"with":0.013157894736842105,"nakamoto":0.013157894736842105,"upgrade's":0.013157894736842105,"approach":0.013157894736842105,"of":0.013157894736842105,"multiple":0.013157894736842105,"stx":0.013157894736842105,"settling":0.013157894736842105,"into":0.013157894736842105,"one":0.013157894736842105,"btc":0.013157894736842105,"block":0.013157894736842105,"images":0.013157894736842105,"nakamoto-explorer":0.013157894736842105,"png":0.013157894736842105,"tailored":0.013157894736842105,"viewing":0.013157894736842105,"experience":0.013157894736842105,"this":0.013157894736842105,"is":0.013157894736842105,"live":0.013157894736842105,"on":0.013157894736842105,"both":0.013157894736842105,"testnet":0.013157894736842105,"https":0.013157894736842105,"hiro":0.013157894736842105,"so":0.013157894736842105,"chain":0.013157894736842105,"and":0.013157894736842105,"mainnet":0.013157894736842105,"accessible":0.013157894736842105,"via":0.013157894736842105,"network":0.013157894736842105,"dropdown":0.013157894736842105,"two":0.013157894736842105,"distinctive":0.013157894736842105,"modes":0.013157894736842105,"independent":0.013157894736842105,"focuses":0.013157894736842105,"progress":0.013157894736842105,"coming":0.013157894736842105,"soon":0.013157894736842105,"grouped":0.013157894736842105,"by":0.013157894736842105,"bitcoin":0.013157894736842105,"shows":0.013157894736842105,"flow":0.013157894736842105,"alongside":0.013157894736842105,"group-by-block":0.013157894736842105,"stay":0.013157894736842105,"in":0.013157894736842105,"loop":0.013157894736842105,"keep":0.013157894736842105,"up-to-date":0.013157894736842105,"real-time":0.013157894736842105,"our":0.013157894736842105,"option":0.013157894736842105},"221":{"0":0.005714285714285714,"1":0.005714285714285714,"2":0.005714285714285714,"3":0.005714285714285714,"5":0.005714285714285714,"10":0.005714285714285714,"11":0.005714285714285714,"108":0.005714285714285714,"142":0.005714285714285714,"setting":0.005714285714285714,"up":0.005714285714285714,"a":0.005714285714285714,"project":0.005714285714285714,"for":0.005714285714285714,"nakamoto":0.005714285714285714,"as":0.005714285714285714,"of":0.005714285714285714,"version":0.005714285714285714,"https":0.005714285714285714,"github":0.005714285714285714,"com":0.005714285714285714,"hirosystems":0.005714285714285714,"clarinet":0.005714285714285714,"releases":0.005714285714285714,"tag":0.005714285714285714,"v2":0.005714285714285714,"runs":0.005714285714285714,"in":0.005714285714285714,"epoch":0.005714285714285714,"by":0.005714285714285714,"default":0.005714285714285714,"-":0.005714285714285714,"contracts":0.005714285714285714,"are":0.005714285714285714,"set":0.005714285714285714,"to":0.005714285714285714,"be":0.005714285714285714,"deployed":0.005714285714285714,"and":0.005714285714285714,"support":0.005714285714285714,"clarity":0.005714285714285714,"the":0.005714285714285714,"devnet":0.005714285714285714,"latest":0.005714285714285714,"stacks":0.005714285714285714,"blockchain":0.005714285714285714,"enabling":0.005714285714285714,"once":0.005714285714285714,"reaches":0.005714285714285714,"right":0.005714285714285714,"block":0.005714285714285714,"height":0.005714285714285714,"bitcoin":0.005714285714285714,"it":0.005714285714285714,"will":0.005714285714285714,"deploy":0.005714285714285714,"_":0.005714285714285714,"pox-4":0.005714285714285714,"clar":0.005714285714285714,"contract":0.005714285714285714,"run":0.005714285714285714,"from":0.005714285714285714,"there":0.005714285714285714,"send":0.005714285714285714,"stack-stx":0.005714285714285714,"stack-extend":0.005714285714285714,"requests":0.005714285714285714,"new":0.005714285714285714,"pox":0.005714285714285714,"eventually":0.005714285714285714,"you":0.005714285714285714,"can":0.005714285714285714,"observe":0.005714285714285714,"vote-for-aggregate-public-key":0.005714285714285714,"transactions":0.005714285714285714,"that":0.005714285714285714,"they":0.005714285714285714,"at":0.005714285714285714,"switch":0.005714285714285714,"end":0.005714285714285714,"toml":0.005714285714285714,"file":0.005714285714285714,"must":0.005714285714285714,"make":0.005714285714285714,"sure":0.005714285714285714,"pox_stacking_orders":0.005714285714285714,"properly":0.005714285714285714,"should":0.005714285714285714,"have":0.005714285714285714,"stacking":0.005714285714285714,"orders":0.005714285714285714,"different":0.005714285714285714,"accounts":0.005714285714285714,"all":0.005714285714285714,"start":0.005714285714285714,"cycle":0.005714285714285714,"take":0.005714285714285714,"least":0.005714285714285714,"slots":0.005714285714285714,"also":0.005714285714285714,"need":0.005714285714285714,"enable":0.005714285714285714,"auto-extend":0.005714285714285714,"property":0.005714285714285714,"because":0.005714285714285714,"relies":0.005714285714285714,"on":0.005714285714285714,"stackers":0.005714285714285714,"sign":0.005714285714285714,"blocks":0.005714285714285714,"these":0.005714285714285714,"settings":0.005714285714285714,"ensure":0.005714285714285714,"engouh":0.005714285714285714,"stacked":0.005714285714285714,"stx":0.005714285714285714,"each":0.005714285714285714,"cycles":0.005714285714285714,"here":0.005714285714285714,"is":0.005714285714285714,"what":0.005714285714285714,"looks":0.005714285714285714,"like":0.005714285714285714,"projects":0.005714285714285714,"start_at_cycle":0.005714285714285714,"duration":0.005714285714285714,"auto_extend":0.005714285714285714,"true":0.005714285714285714,"wallet":0.005714285714285714,"wallet_1":0.005714285714285714,"btc_address":0.005714285714285714,"mr1ipkd9n3rjzzxxrk7xf9d36gffa6exnc":0.005714285714285714,"wallet_2":0.005714285714285714,"muydxkmx9bbyauede6kffhd5ff1gdn9erg":0.005714285714285714,"wallet_3":0.005714285714285714,"mvztbibdaaa3wlpy7zxxfqra3t4xsknbx7":0.005714285714285714,"with":0.005714285714285714,"create":0.005714285714285714,"one":0.005714285714285714,"contract-name":0.005714285714285714,"needs":0.005714285714285714,"manually":0.005714285714285714,"update":0.005714285714285714,"manifest":0.005714285714285714,"nakademo":0.005714285714285714,"path":0.005714285714285714,"'contracts":0.005714285714285714,"clar'":0.005714285714285714,"clarity_version":0.005714285714285714,"see":0.005714285714285714,"fast":0.005714285714285714,"callout":0.005714285714285714,"title":0.005714285714285714,"keywords":0.005714285714285714,"introduces":0.005714285714285714,"two":0.005714285714285714,"after":0.005714285714285714,"hard":0.005714285714285714,"fork":0.005714285714285714,"tenure-height":0.005714285714285714,"returns":0.005714285714285714,"number":0.005714285714285714,"tenures":0.005714285714285714,"passed":0.005714285714285714,"stacks-block-height":0.005714285714285714,"current":0.005714285714285714,"note":0.005714285714285714,"block-height":0.005714285714285714,"removed":0.005714285714285714,"more":0.005714285714285714,"details":0.005714285714285714,"other":0.005714285714285714,"reference":0.005714285714285714,"docs":0.005714285714285714,"co":0.005714285714285714},"222":{"2":0.005952380952380952,"4":0.005952380952380952,"what's":0.005952380952380952,"new":0.005952380952380952,"callout":0.005952380952380952,"title":0.005952380952380952,"note":0.005952380952380952,"type":0.005952380952380952,"info":0.005952380952380952,"the":0.005952380952380952,"extended":0.005952380952380952,"v2":0.005952380952380952,"endpoints":0.005952380952380952,"represent":0.005952380952380952,"modern":0.005952380952380952,"api":0.005952380952380952,"that":0.005952380952380952,"is":0.005952380952380952,"being":0.005952380952380952,"continually":0.005952380952380952,"expanded":0.005952380952380952,"to":0.005952380952380952,"support":0.005952380952380952,"nakamoto":0.005952380952380952,"upgrade":0.005952380952380952,"we":0.005952380952380952,"encourage":0.005952380952380952,"developers":0.005952380952380952,"use":0.005952380952380952,"for":0.005952380952380952,"developments":0.005952380952380952,"be":0.005952380952380952,"aware":0.005952380952380952,"v1":0.005952380952380952,"are":0.005952380952380952,"older":0.005952380952380952,"set":0.005952380952380952,"of":0.005952380952380952,"though":0.005952380952380952,"they":0.005952380952380952,"continue":0.005952380952380952,"function":0.005952380952380952,"alongside":0.005952380952380952,"will":0.005952380952380952,"deprecated":0.005952380952380952,"in":0.005952380952380952,"coming":0.005952380952380952,"months":0.005952380952380952,"stacks":0.005952380952380952,"blockchain":0.005952380952380952,"has":0.005952380952380952,"a":0.005952380952380952,"series":0.005952380952380952,"upcoming":0.005952380952380952,"-":0.005952380952380952,"get":0.005952380952380952,"proof-of-transfer":0.005952380952380952,"details":0.005952380952380952,"per":0.005952380952380952,"cycle":0.005952380952380952,"including":0.005952380952380952,"signers":0.005952380952380952,"and":0.005952380952380952,"stackers":0.005952380952380952,"with":0.005952380952380952,"information":0.005952380952380952,"about":0.005952380952380952,"stacked":0.005952380952380952,"stx":0.005952380952380952,"amounts":0.005952380952380952,"payout":0.005952380952380952,"addresses":0.005952380952380952,"signer":0.005952380952380952,"weights":0.005952380952380952,"list":0.005952380952380952,"blocks":0.005952380952380952,"bitcoin":0.005952380952380952,"block":0.005952380952380952,"mining":0.005952380952380952,"mechanism":0.005952380952380952,"all":0.005952380952380952,"transactions":0.005952380952380952,"relevant":0.005952380952380952,"address":0.005952380952380952,"or":0.005952380952380952,"contract":0.005952380952380952,"id":0.005952380952380952,"filters":0.005952380952380952,"ft":0.005952380952380952,"nft":0.005952380952380952,"transfers":0.005952380952380952,"tenure_change":0.005952380952380952,"transaction":0.005952380952380952,"across":0.005952380952380952,"our":0.005952380952380952,"summary":0.005952380952380952,"current":0.005952380952380952,"network":0.005952380952380952,"mempool":0.005952380952380952,"fees":0.005952380952380952,"statistics":0.005952380952380952,"expected":0.005952380952380952,"confirmation":0.005952380952380952,"priorities":0.005952380952380952,"deployment":0.005952380952380952,"status":0.005952380952380952,"multiple":0.005952380952380952,"smart":0.005952380952380952,"contracts":0.005952380952380952,"one":0.005952380952380952,"call":0.005952380952380952,"these":0.005952380952380952,"backwards":0.005952380952380952,"compatible":0.005952380952380952,"nodes":0.005952380952380952,"running":0.005952380952380952,"version":0.005952380952380952,"earlier":0.005952380952380952,"event":0.005952380952380952,"replay":0.005952380952380952,"optimizations":0.005952380952380952,"optimize":0.005952380952380952,"speed":0.005952380952380952,"by":0.005952380952380952,"creating":0.005952380952380952,"parquet-based":0.005952380952380952,"ingestion":0.005952380952380952,"optimizes":0.005952380952380952,"canonical":0.005952380952380952,"chain":0.005952380952380952,"classic":0.005952380952380952,"tsv":0.005952380952380952,"improving":0.005952380952380952,"times":0.005952380952380952,"this":0.005952380952380952,"affects":0.005952380952380952,"following":0.005952380952380952,"principal":0.005952380952380952,"tx":0.005952380952380952,"tx_id":0.005952380952380952,"raw":0.005952380952380952,"important":0.005952380952380952,"difference":0.005952380952380952,"between":0.005952380952380952,"vs":0.005952380952380952,"_":0.005952380952380952,"burn-blocks":0.005952380952380952,"height_or_hash":0.005952380952380952,"events":0.005952380952380952,"smart-contracts":0.005952380952380952,"pox":0.005952380952380952,"cycles":0.005952380952380952,"cycle_number":0.005952380952380952,"signer_key":0.005952380952380952,"hash":0.005952380952380952,"by_height":0.005952380952380952,"height":0.005952380952380952,"by_burn_block_hash":0.005952380952380952,"burn_block_hash":0.005952380952380952,"by_burn_block_height":0.005952380952380952,"burn_block_height":0.005952380952380952,"with_transfers":0.005952380952380952,"transactions_with_transfers":0.005952380952380952,"fee_rate":0.005952380952380952,"block_hash":0.005952380952380952,"block_height":0.005952380952380952,"view":0.005952380952380952,"reference":0.005952380952380952},"223":{"2":0.010416666666666666,"what's":0.010416666666666666,"new":0.010416666666666666,"stackingclient":0.010416666666666666,"install":0.010416666666666666,"the":0.010416666666666666,"latest":0.010416666666666666,"nakamoto":0.010416666666666666,"version":0.010416666666666666,"with":0.010416666666666666,"npm":0.010416666666666666,"stacks":0.010416666666666666,"stacking":0.010416666666666666,"in":0.010416666666666666,"was":0.010416666666666666,"updated":0.010416666666666666,"to":0.010416666666666666,"match":0.010416666666666666,"pox-4":0.010416666666666666,"contract":0.010416666666666666,"-":0.010416666666666666,"added":0.010416666666666666,"signpoxsignature":0.010416666666666666,"pox4signaturetopic":0.010416666666666666,"enum":0.010416666666666666,"arguments":0.010416666666666666,"for":0.010416666666666666,"stack":0.010416666666666666,"stackextend":0.010416666666666666,"stackincrease":0.010416666666666666,"stackaggregationcommit":0.010416666666666666,"stackaggregationcommitindexed":0.010416666666666666,"and":0.010416666666666666,"stackaggregationincrease":0.010416666666666666,"network":0.010416666666666666,"test":0.010416666666666666,"using":0.010416666666666666,"testnet":0.010416666666666666,"you":0.010416666666666666,"can":0.010416666666666666,"use":0.010416666666666666,"stackstestnet":0.010416666666666666,"a":0.010416666666666666,"custom":0.010416666666666666,"url":0.010416666666666666,"is":0.010416666666666666,"being":0.010416666666666666,"hosted":0.010416666666666666,"at":0.010416666666666666,"https":0.010416666666666666,"api":0.010416666666666666,"hiro":0.010416666666666666,"so":0.010416666666666666,"this":0.010416666666666666,"like":0.010416666666666666,"tsx":0.010416666666666666,"import":0.010416666666666666,"from":0.010416666666666666,"const":0.010416666666666666,"example":0.010416666666666666,"snippets":0.010416666666666666,"ts":0.010416666666666666,"client":0.010416666666666666,"my_address":0.010416666666666666,"signature":0.010416666666666666,"topic":0.010416666666666666,"stack-stx":0.010416666666666666,"rewardcycle":0.010416666666666666,"await":0.010416666666666666,"getpoxinfo":0.010416666666666666,"reward_cycle_id":0.010416666666666666,"poxaddress":0.010416666666666666,"my_btc_address":0.010416666666666666,"period":0.010416666666666666,"maxamount":0.010416666666666666,"10_000_000_000_000":0.010416666666666666,"authid":0.010416666666666666,"123n":0.010416666666666666,"signerprivatekey":0.010416666666666666,"my_signer_private_key":0.010416666666666666,"e":0.010416666666666666,"g":0.010416666666666666,"txid":0.010416666666666666,"amountmicrostx":0.010416666666666666,"be":0.010416666666666666,"most":0.010416666666666666,"cycles":0.010416666666666666,"needs":0.010416666666666666,"burnblockheight":0.010416666666666666,"current_burn_block_height":0.010416666666666666,"args":0.010416666666666666,"signerkey":0.010416666666666666,"my_signer_public_key":0.010416666666666666,"signersignature":0.010416666666666666,"privatekey":0.010416666666666666,"my_stx_private_key":0.010416666666666666},"224":{"0":0.002688172043010753,"1":0.002688172043010753,"2":0.002688172043010753,"3":0.002688172043010753,"1000":0.002688172043010753,"import":0.002688172043010753,"accordions":0.002688172043010753,"accordion":0.002688172043010753,"from":0.002688172043010753,"'fumadocs-ui":0.002688172043010753,"components":0.002688172043010753,"accordion'":0.002688172043010753,"unit":0.002688172043010753,"testing":0.002688172043010753,"is":0.002688172043010753,"the":0.002688172043010753,"process":0.002688172043010753,"of":0.002688172043010753,"individual":0.002688172043010753,"or":0.002688172043010753,"functions":0.002688172043010753,"smart":0.002688172043010753,"contracts":0.002688172043010753,"to":0.002688172043010753,"ensure":0.002688172043010753,"they":0.002688172043010753,"work":0.002688172043010753,"as":0.002688172043010753,"expected":0.002688172043010753,"clarinet":0.002688172043010753,"js":0.002688172043010753,"sdk":0.002688172043010753,"provides":0.002688172043010753,"a":0.002688172043010753,"framework":0.002688172043010753,"that":0.002688172043010753,"allows":0.002688172043010753,"you":0.002688172043010753,"write":0.002688172043010753,"these":0.002688172043010753,"tests":0.002688172043010753,"using":0.002688172043010753,"vitest":0.002688172043010753,"helping":0.002688172043010753,"catch":0.002688172043010753,"bugs":0.002688172043010753,"and":0.002688172043010753,"errors":0.002688172043010753,"early":0.002688172043010753,"in":0.002688172043010753,"development":0.002688172043010753,"this":0.002688172043010753,"guide":0.002688172043010753,"will":0.002688172043010753,"set":0.002688172043010753,"up":0.002688172043010753,"new":0.002688172043010753,"project":0.002688172043010753,"with":0.002688172043010753,"defi":0.002688172043010753,"contract":0.002688172043010753,"set-up-a-new-clarinet-project":0.002688172043010753,"test":0.002688172043010753,"covering":0.002688172043010753,"deposit":0.002688172043010753,"function":0.002688172043010753,"test-the-deposit-function":0.002688172043010753,"run":0.002688172043010753,"generate":0.002688172043010753,"coverage":0.002688172043010753,"reports":0.002688172043010753,"run-tests-and-generate-coverage-reports":0.002688172043010753,"---":0.002688172043010753,"start":0.002688172043010753,"by":0.002688172043010753,"creating":0.002688172043010753,"cli":0.002688172043010753,"command":0.002688172043010753,"below":0.002688172043010753,"create":0.002688172043010753,"structure":0.002688172043010753,"inside":0.002688172043010753,"necessary":0.002688172043010753,"files":0.002688172043010753,"folders":0.002688172043010753,"including":0.002688172043010753,"already":0.002688172043010753,"for":0.002688172043010753,"terminal":0.002688172043010753,"stx-defi":0.002688172043010753,"cd":0.002688172043010753,"after":0.002688172043010753,"changing":0.002688172043010753,"into":0.002688172043010753,"your":0.002688172043010753,"directory":0.002688172043010753,"npm":0.002688172043010753,"install":0.002688172043010753,"package":0.002688172043010753,"dependencies":0.002688172043010753,"since":0.002688172043010753,"code":0.002688172043010753,"out":0.002688172043010753,"scope":0.002688172043010753,"we":0.002688172043010753,"are":0.002688172043010753,"going":0.002688172043010753,"use":0.002688172043010753,"pre-existing":0.002688172043010753,"first":0.002688172043010753,"file":0.002688172043010753,"order":0.002688172043010753,"configuration":0.002688172043010753,"now":0.002688172043010753,"clar":0.002688172043010753,"copy":0.002688172043010753,"paste":0.002688172043010753,"following":0.002688172043010753,"clarity":0.002688172043010753,"holds":0.002688172043010753,"total":0.002688172043010753,"amount":0.002688172043010753,"deposits":0.002688172043010753,"initialized":0.002688172043010753,"define-data-var":0.002688172043010753,"total-deposits":0.002688172043010753,"uint":0.002688172043010753,"u0":0.002688172043010753,"maps":0.002688172043010753,"user's":0.002688172043010753,"principal":0.002688172043010753,"address":0.002688172043010753,"their":0.002688172043010753,"deposited":0.002688172043010753,"define-map":0.002688172043010753,"owner":0.002688172043010753,"public":0.002688172043010753,"users":0.002688172043010753,"stx":0.002688172043010753,"updates":0.002688172043010753,"balance":0.002688172043010753,"define-public":0.002688172043010753,"let":0.002688172043010753,"fetch":0.002688172043010753,"current":0.002688172043010753,"default":0.002688172043010753,"if":0.002688172043010753,"none":0.002688172043010753,"exists":0.002688172043010753,"current-balance":0.002688172043010753,"default-to":0.002688172043010753,"get":0.002688172043010753,"map-get":0.002688172043010753,"tx-sender":0.002688172043010753,"transfer":0.002688172043010753,"sender":0.002688172043010753,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.002688172043010753,"recipient":0.002688172043010753,"ie":0.002688172043010753,"identifier":0.002688172043010753,"on":0.002688172043010753,"chain":0.002688172043010753,"try":0.002688172043010753,"stx-transfer":0.002688172043010753,"as-contract":0.002688172043010753,"update":0.002688172043010753,"map":0.002688172043010753,"map-set":0.002688172043010753,"variable":0.002688172043010753,"var-set":0.002688172043010753,"var-get":0.002688172043010753,"return":0.002688172043010753,"success":0.002688172043010753,"ok":0.002688172043010753,"true":0.002688172043010753,"read-only":0.002688172043010753,"define-read-only":0.002688172043010753,"get-balance-by-sender":0.002688172043010753,"check":0.002688172043010753,"valid":0.002688172043010753,"ready":0.002688172043010753,"callout":0.002688172043010753,"can":0.002688172043010753,"find":0.002688172043010753,"full":0.002688172043010753,"repo":0.002688172043010753,"https":0.002688172043010753,"github":0.002688172043010753,"com":0.002688172043010753,"hirosystems":0.002688172043010753,"clarity-examples":0.002688172043010753,"tree":0.002688172043010753,"main":0.002688172043010753,"examples":0.002688172043010753,"updating":0.002688172043010753,"adding":0.002688172043010753,"stored":0.002688172043010753,"key":0.002688172043010753,"want":0.002688172043010753,"cover":0.002688172043010753,"successful":0.002688172043010753,"well":0.002688172043010753,"contract's":0.002688172043010753,"updated":0.002688172043010753,"correctly":0.002688172043010753,"ts":0.002688172043010753,"replace":0.002688172043010753,"boilerplate":0.002688172043010753,"add":0.002688172043010753,"typescript":0.002688172043010753,"describe":0.002688172043010753,"it":0.002688172043010753,"expect":0.002688172043010753,"'vitest'":0.002688172043010753,"cl":0.002688172043010753,"'":0.002688172043010753,"stacks":0.002688172043010753,"transactions'":0.002688172043010753,"const":0.002688172043010753,"accounts":0.002688172043010753,"simnet":0.002688172043010753,"getaccounts":0.002688172043010753,"wallet1":0.002688172043010753,"'wallet_1'":0.002688172043010753,"imports":0.002688172043010753,"provide":0.002688172043010753,"utilities":0.002688172043010753,"need":0.002688172043010753,"also":0.002688172043010753,"wallet_1":0.002688172043010753,"account":0.002688172043010753,"which":0.002688172043010753,"act":0.002688172043010753,"our":0.002688172043010753,"user":0.002688172043010753,"next":0.002688172043010753,"define":0.002688172043010753,"suite":0.002688172043010753,"specific":0.002688172043010753,"case":0.002688172043010753,"'stx-defi'":0.002688172043010753,"'allows":0.002688172043010753,"stx'":0.002688172043010753,"go":0.002688172043010753,"here":0.002688172043010753,"comes":0.002688172043010753,"integration":0.002688172043010753,"organizes":0.002688172043010753,"describes":0.002688172043010753,"what":0.002688172043010753,"we're":0.002688172043010753,"block":0.002688172043010753,"groups":0.002688172043010753,"multiple":0.002688172043010753,"cases":0.002688172043010753,"together":0.002688172043010753,"while":0.002688172043010753,"represents":0.002688172043010753,"single":0.002688172043010753,"let's":0.002688172043010753,"simulate":0.002688172043010753,"call":0.002688172043010753,"callpublicfn":0.002688172043010753,"'defi'":0.002688172043010753,"'deposit'":0.002688172043010753,"simulates":0.002688172043010753,"calling":0.002688172043010753,"method":0.002688172043010753,"specified":0.002688172043010753,"just":0.002688172043010753,"would":0.002688172043010753,"real":0.002688172043010753,"world":0.002688172043010753,"making":0.002688172043010753,"an":0.002688172043010753,"assertion":0.002688172043010753,"verify":0.002688172043010753,"itself":0.002688172043010753,"was":0.002688172043010753,"returns":0.002688172043010753,"response":0.002688172043010753,"type":0.002688172043010753,"value":0.002688172043010753,"result":0.002688172043010753,"tobeok":0.002688172043010753,"bool":0.002688172043010753,"confirm":0.002688172043010753,"passes":0.002688172043010753,"over":0.002688172043010753,"some":0.002688172043010753,"-":0.002688172043010753,"makes":0.002688172043010753,"about":0.002688172043010753,"back":0.002688172043010753,"but":0.002688172043010753,"how":0.002688172043010753,"do":0.002688172043010753,"against":0.002688172043010753,"types":0.002688172043010753,"values":0.002688172043010753,"where":0.002688172043010753,"helpers":0.002688172043010753,"come":0.002688172043010753,"custom":0.002688172043010753,"matcher":0.002688172043010753,"built":0.002688172043010753,"checks":0.002688172043010753,"important":0.002688172043010753,"because":0.002688172043010753,"confirms":0.002688172043010753,"transaction":0.002688172043010753,"processed":0.002688172043010753,"successfully":0.002688172043010753,"helper":0.002688172043010753,"transactions":0.002688172043010753,"used":0.002688172043010753,"javascript":0.002688172043010753,"it's":0.002688172043010753,"boolean":0.002688172043010753,"see":0.002688172043010753,"more":0.002688172043010753,"reference":0.002688172043010753,"page":0.002688172043010753,"clarinet-js-sdk":0.002688172043010753,"references":0.002688172043010753,"custom-matchers":0.002688172043010753,"once":0.002688172043010753,"have":0.002688172043010753,"been":0.002688172043010753,"totaldeposits":0.002688172043010753,"getdatavar":0.002688172043010753,"'total-deposits'":0.002688172043010753,"tobeuint":0.002688172043010753,"again":0.002688172043010753,"ensures":0.002688172043010753,"accepted":0.002688172043010753,"without":0.002688172043010753,"any":0.002688172043010753,"issues":0.002688172043010753,"lastly":0.002688172043010753,"has":0.002688172043010753,"callreadonlyfn":0.002688172043010753,"'get-balance-by-sender'":0.002688172043010753,"tuple":0.002688172043010753,"matches":0.002688172043010753,"steps":0.002688172043010753,"comprehensively":0.002688172043010753,"verifies":0.002688172043010753,"works":0.002688172043010753,"intended":0.002688172043010753,"balances":0.002688172043010753,"accurately":0.002688172043010753,"title":0.002688172043010753,"snippet":0.002688172043010753,"report":0.002688172043010753,"produce":0.002688172043010753,"detailed":0.002688172043010753,"identify":0.002688172043010753,"untested":0.002688172043010753,"parts":0.002688172043010753,"cards":0.002688172043010753,"card":0.002688172043010753,"href":0.002688172043010753,"api":0.002688172043010753,"description":0.002688172043010753,"dive":0.002688172043010753,"deeper":0.002688172043010753,"properties":0.002688172043010753,"methods":0.002688172043010753,"available":0.002688172043010753,"matchers":0.002688172043010753,"learn":0.002688172043010753},"225":{"import":0.012658227848101266,"secondarycard":0.012658227848101266,"from":0.012658227848101266,"'":0.012658227848101266,"components":0.012658227848101266,"card'":0.012658227848101266,"lfg":0.012658227848101266,"related":0.012658227848101266,"tools":0.012658227848101266,"-":0.012658227848101266,"clarinet":0.012658227848101266,"stacks":0.012658227848101266,"build":0.012658227848101266,"your":0.012658227848101266,"app":0.012658227848101266,"in":0.012658227848101266,"a":0.012658227848101266,"local":0.012658227848101266,"environment":0.012658227848101266,"on":0.012658227848101266,"js":0.012658227848101266,"don":0.012658227848101266,"t":0.012658227848101266,"reinvent":0.012658227848101266,"the":0.012658227848101266,"wheel":0.012658227848101266,"and":0.012658227848101266,"faster":0.012658227848101266,"with":0.012658227848101266,"library":0.012658227848101266,"that":0.012658227848101266,"handles":0.012658227848101266,"basic":0.012658227848101266,"blockchain":0.012658227848101266,"functionality":0.012658227848101266,"api":0.012658227848101266,"fetch":0.012658227848101266,"data":0.012658227848101266,"broadcast":0.012658227848101266,"transactions":0.012658227848101266,"br":0.012658227848101266,"callout":0.012658227848101266,"title":0.012658227848101266,"need":0.012658227848101266,"help":0.012658227848101266,"building":0.012658227848101266,"sdk":0.012658227848101266,"type":0.012658227848101266,"reach":0.012658227848101266,"out":0.012658227848101266,"to":0.012658227848101266,"us":0.012658227848101266,"span":0.012658227848101266,"classname":0.012658227848101266,"font-bold":0.012658227848101266,"channel":0.012658227848101266,"discord":0.012658227848101266,"https":0.012658227848101266,"chat":0.012658227848101266,"under":0.012658227848101266,"hiro":0.012658227848101266,"developer":0.012658227848101266,"section":0.012658227848101266,"there's":0.012658227848101266,"also":0.012658227848101266,"weekly":0.012658227848101266,"office":0.012658227848101266,"hours":0.012658227848101266,"www":0.012658227848101266,"addevent":0.012658227848101266,"com":0.012658227848101266,"event":0.012658227848101266,"ki22007085":0.012658227848101266,"call":0.012658227848101266,"every":0.012658227848101266,"wednesday":0.012658227848101266,"at":0.012658227848101266,"1pm":0.012658227848101266,"et":0.012658227848101266},"226":{"0":0.0014005602240896359,"1":0.0014005602240896359,"2":0.0014005602240896359,"3":0.0014005602240896359,"10":0.0014005602240896359,"102":0.0014005602240896359,"111":0.0014005602240896359,"import":0.0014005602240896359,"root":0.0014005602240896359,"api":0.0014005602240896359,"apiexample":0.0014005602240896359,"from":0.0014005602240896359,"'fumadocs-openapi":0.0014005602240896359,"ui'":0.0014005602240896359,"property":0.0014005602240896359,"accordion":0.0014005602240896359,"accordions":0.0014005602240896359,"'fumadocs-ui":0.0014005602240896359,"components":0.0014005602240896359,"accordion'":0.0014005602240896359,"tabs":0.0014005602240896359,"tabscontent":0.0014005602240896359,"tabslist":0.0014005602240896359,"tabstrigger":0.0014005602240896359,"'":0.0014005602240896359,"ui":0.0014005602240896359,"tabs'":0.0014005602240896359,"badge":0.0014005602240896359,"badge'":0.0014005602240896359,"inlinecode":0.0014005602240896359,"inline-code'":0.0014005602240896359,"the":0.0014005602240896359,"stacks":0.0014005602240896359,"authentication":0.0014005602240896359,"process":0.0014005602240896359,"enables":0.0014005602240896359,"secure":0.0014005602240896359,"user":0.0014005602240896359,"sign-in":0.0014005602240896359,"for":0.0014005602240896359,"web":0.0014005602240896359,"apps":0.0014005602240896359,"by":0.0014005602240896359,"generating":0.0014005602240896359,"and":0.0014005602240896359,"handling":0.0014005602240896359,"encrypted":0.0014005602240896359,"requests":0.0014005602240896359,"it":0.0014005602240896359,"involves":0.0014005602240896359,"setting":0.0014005602240896359,"up":0.0014005602240896359,"an":0.0014005602240896359,"app":0.0014005602240896359,"domain":0.0014005602240896359,"configuring":0.0014005602240896359,"permissions":0.0014005602240896359,"creating":0.0014005602240896359,"a":0.0014005602240896359,"usersession":0.0014005602240896359,"to":0.0014005602240896359,"manage":0.0014005602240896359,"data":0.0014005602240896359,"installation":0.0014005602240896359,"package-install":0.0014005602240896359,"transactions":0.0014005602240896359,"classname":0.0014005602240896359,"'my-20'":0.0014005602240896359,"div":0.0014005602240896359,"'flex-1'":0.0014005602240896359,"h2":0.0014005602240896359,"'mt-0'":0.0014005602240896359,"appconfig":0.0014005602240896359,"configuration":0.0014005602240896359,"current":0.0014005602240896359,"on":0.0014005602240896359,"browser":0.0014005602240896359,"platforms":0.0014005602240896359,"instance":0.0014005602240896359,"of":0.0014005602240896359,"this":0.0014005602240896359,"class":0.0014005602240896359,"without":0.0014005602240896359,"any":0.0014005602240896359,"arguments":0.0014005602240896359,"will":0.0014005602240896359,"use":0.0014005602240896359,"window":0.0014005602240896359,"location":0.0014005602240896359,"origin":0.0014005602240896359,"as":0.0014005602240896359,"non-browser":0.0014005602240896359,"you":0.0014005602240896359,"need":0.0014005602240896359,"specify":0.0014005602240896359,"second":0.0014005602240896359,"argument":0.0014005602240896359,"parameters":0.0014005602240896359,"required":0.0014005602240896359,"true":0.0014005602240896359,"deprecated":0.0014005602240896359,"false":0.0014005602240896359,"name":0.0014005602240896359,"scopes":0.0014005602240896359,"type":0.0014005602240896359,"string":0.0014005602240896359,"array":0.0014005602240896359,"strings":0.0014005602240896359,"representing":0.0014005602240896359,"requested":0.0014005602240896359,"span":0.0014005602240896359,"default":0.0014005602240896359,"'store_write'":0.0014005602240896359,"appdomain":0.0014005602240896359,"are":0.0014005602240896359,"uniquely":0.0014005602240896359,"identified":0.0014005602240896359,"their":0.0014005602240896359,"redirectpath":0.0014005602240896359,"path":0.0014005602240896359,"redirect":0.0014005602240896359,"users":0.0014005602240896359,"after":0.0014005602240896359,"response":0.0014005602240896359,"token":0.0014005602240896359,"be":0.0014005602240896359,"postpended":0.0014005602240896359,"in":0.0014005602240896359,"query":0.0014005602240896359,"manifestpath":0.0014005602240896359,"relative":0.0014005602240896359,"app's":0.0014005602240896359,"manifest":0.0014005602240896359,"file":0.0014005602240896359,"json":0.0014005602240896359,"corenode":0.0014005602240896359,"url":0.0014005602240896359,"core":0.0014005602240896359,"node":0.0014005602240896359,"if":0.0014005602240896359,"is":0.0014005602240896359,"not":0.0014005602240896359,"specified":0.0014005602240896359,"used":0.0014005602240896359,"authenticatorurl":0.0014005602240896359,"web-based":0.0014005602240896359,"authenticator":0.0014005602240896359,"event":0.0014005602240896359,"doesn't":0.0014005602240896359,"have":0.0014005602240896359,"installed":0.0014005602240896359,"machine":0.0014005602240896359,"library":0.0014005602240896359,"defaultvalue":0.0014005602240896359,"config":0.0014005602240896359,"'flex":0.0014005602240896359,"flex-wrap'":0.0014005602240896359,"value":0.0014005602240896359,"'tab":0.0014005602240896359,"group'":0.0014005602240896359,"'badge":0.0014005602240896359,"transition-colors'":0.0014005602240896359,"basic":0.0014005602240896359,"options":0.0014005602240896359,"with":0.0014005602240896359,"advanced":0.0014005602240896359,"tsx":0.0014005602240896359,"twoslash":0.0014005602240896359,"noerrors":0.0014005602240896359,"code":0.0014005602240896359,"word":0.0014005602240896359,"auth'":0.0014005602240896359,"const":0.0014005602240896359,"'https":0.0014005602240896359,"www":0.0014005602240896359,"myapp":0.0014005602240896359,"com'":0.0014005602240896359,"new":0.0014005602240896359,"title":0.0014005602240896359,"full":0.0014005602240896359,"sample":0.0014005602240896359,"makeauthrequest":0.0014005602240896359,"payloads":0.0014005602240896359,"during":0.0014005602240896359,"transit":0.0014005602240896359,"encryption":0.0014005602240896359,"key":0.0014005602240896359,"generated":0.0014005602240896359,"below":0.0014005602240896359,"provides":0.0014005602240896359,"transitkey":0.0014005602240896359,"generateandstoretransitkey":0.0014005602240896359,"auth":0.0014005602240896359,"open":0.0014005602240896359,"compatible":0.0014005602240896359,"or":0.0014005602240896359,"extension":0.0014005602240896359,"perform":0.0014005602240896359,"so":0.0014005602240896359,"provide":0.0014005602240896359,"which":0.0014005602240896359,"can":0.0014005602240896359,"payload":0.0014005602240896359,"page":0.0014005602240896359,"should":0.0014005602240896359,"redirecturi":0.0014005602240896359,"com":0.0014005602240896359,"set":0.0014005602240896359,"your":0.0014005602240896359,"contains":0.0014005602240896359,"information":0.0014005602240896359,"about":0.0014005602240896359,"that":0.0014005602240896359,"shown":0.0014005602240896359,"manifesturi":0.0014005602240896359,"json'":0.0014005602240896359,"generate":0.0014005602240896359,"request":0.0014005602240896359,"authrequest":0.0014005602240896359,"publish_data":0.0014005602240896359,"email":0.0014005602240896359,"'publish_data'":0.0014005602240896359,"'email'":0.0014005602240896359,"represents":0.0014005602240896359,"signed":0.0014005602240896359,"particular":0.0014005602240896359,"functions":0.0014005602240896359,"issigninpending":0.0014005602240896359,"function":0.0014005602240896359,"determines":0.0014005602240896359,"there":0.0014005602240896359,"incoming":0.0014005602240896359,"handlependingsignin":0.0014005602240896359,"processes":0.0014005602240896359,"userdata":0.0014005602240896359,"object":0.0014005602240896359,"containing":0.0014005602240896359,"user's":0.0014005602240896359,"identity":0.0014005602240896359,"bns":0.0014005602240896359,"username":0.0014005602240896359,"profile":0.0014005602240896359,"isusersignedin":0.0014005602240896359,"checks":0.0014005602240896359,"already":0.0014005602240896359,"authenticated":0.0014005602240896359,"loaduserdata":0.0014005602240896359,"retrieves":0.0014005602240896359,"encryptcontent":0.0014005602240896359,"encrypts":0.0014005602240896359,"storage":0.0014005602240896359,"decryptcontent":0.0014005602240896359,"decrypts":0.0014005602240896359,"pending":0.0014005602240896359,"status":0.0014005602240896359,"checking":0.0014005602240896359,"user-data":0.0014005602240896359,"loading":0.0014005602240896359,"sign-out":0.0014005602240896359,"signing":0.0014005602240896359,"out":0.0014005602240896359,"encrypt":0.0014005602240896359,"encrypting":0.0014005602240896359,"decrypt":0.0014005602240896359,"decrypting":0.0014005602240896359,"ispending":0.0014005602240896359,"then":0.0014005602240896359,"do":0.0014005602240896359,"something":0.0014005602240896359,"'status'":0.0014005602240896359,"issignedin":0.0014005602240896359,"'user-data'":0.0014005602240896359,"'sign-out'":0.0014005602240896359,"signuserout":0.0014005602240896359,"'encrypt'":0.0014005602240896359,"message":0.0014005602240896359,"'my":0.0014005602240896359,"secret":0.0014005602240896359,"message'":0.0014005602240896359,"ciphertext":0.0014005602240896359,"await":0.0014005602240896359,"'decrypt'":0.0014005602240896359,"plaintext":0.0014005602240896359,"notes":0.0014005602240896359,"note":0.0014005602240896359,"here":0.0014005602240896359,"uses":0.0014005602240896359,"private":0.0014005602240896359,"associated":0.0014005602240896359,"only":0.0014005602240896359,"share":0.0014005602240896359,"another":0.0014005602240896359,"other":0.0014005602240896359,"equivalent":0.0014005602240896359,"methods":0.0014005602240896359,"custom":0.0014005602240896359,"additional":0.0014005602240896359,"requesting":0.0014005602240896359,"auth-request":0.0014005602240896359,"---cut---":0.0014005602240896359,"lookupprofile":0.0014005602240896359,"look":0.0014005602240896359,"network":0.0014005602240896359,"'mainnet'":0.0014005602240896359,"'testnet'":0.0014005602240896359,"'devnet'":0.0014005602240896359,"'mocknet'":0.0014005602240896359,"stacksnetwork":0.0014005602240896359,"defines":0.0014005602240896359,"connect":0.0014005602240896359,"zonefilelookupurl":0.0014005602240896359,"fetch":0.0014005602240896359,"zone":0.0014005602240896359,"needed":0.0014005602240896359,"does":0.0014005602240896359,"reside":0.0014005602240896359,"at":0.0014005602240896359,"lookup":0.0014005602240896359,"supports":0.0014005602240896359,"creation":0.0014005602240896359,"following":0.0014005602240896359,"transaction":0.0014005602240896359,"types":0.0014005602240896359,"stx":0.0014005602240896359,"transfer":0.0014005602240896359,"smart":0.0014005602240896359,"contract":0.0014005602240896359,"deploy":0.0014005602240896359,"call":0.0014005602240896359,"generation":0.0014005602240896359,"typescript":0.0014005602240896359,"createstacksprivatekey":0.0014005602240896359,"makerandomprivkey":0.0014005602240896359,"getpublickey":0.0014005602240896359,"transactions'":0.0014005602240896359,"random":0.0014005602240896359,"privatekey":0.0014005602240896359,"get":0.0014005602240896359,"public":0.0014005602240896359,"publickey":0.0014005602240896359,"hex":0.0014005602240896359,"'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01'":0.0014005602240896359,"makestxtokentransfer":0.0014005602240896359,"broadcasttransaction":0.0014005602240896359,"anchormode":0.0014005602240896359,"txoptions":0.0014005602240896359,"recipient":0.0014005602240896359,"'sp3fgq8z7jy9bwyz5wm53e0m9nk7whjf0691nz159'":0.0014005602240896359,"amount":0.0014005602240896359,"12345n":0.0014005602240896359,"senderkey":0.0014005602240896359,"mainnet":0.0014005602240896359,"memo":0.0014005602240896359,"'test":0.0014005602240896359,"memo'":0.0014005602240896359,"nonce":0.0014005602240896359,"0n":0.0014005602240896359,"manually":0.0014005602240896359,"don't":0.0014005602240896359,"want":0.0014005602240896359,"builder":0.0014005602240896359,"fee":0.0014005602240896359,"200n":0.0014005602240896359,"tx":0.0014005602240896359,"estimate":0.0014005602240896359,"see":0.0014005602240896359,"raw":0.0014005602240896359,"serialized":0.0014005602240896359,"serializedtx":0.0014005602240896359,"serialize":0.0014005602240896359,"uint8array":0.0014005602240896359,"serializedtxhex":0.0014005602240896359,"bytestohex":0.0014005602240896359,"broadcasting":0.0014005602240896359,"broadcastresponse":0.0014005602240896359,"txid":0.0014005602240896359,"makecontractdeploy":0.0014005602240896359,"stackstestnet":0.0014005602240896359,"stacksmainnet":0.0014005602240896359,"network'":0.0014005602240896359,"readfilesync":0.0014005602240896359,"'fs'":0.0014005602240896359,"contractname":0.0014005602240896359,"'contract_name'":0.0014005602240896359,"codebody":0.0014005602240896359,"clar'":0.0014005602240896359,"tostring":0.0014005602240896359,"makecontractcall":0.0014005602240896359,"fungibleconditioncode":0.0014005602240896359,"makestandardstxpostcondition":0.0014005602240896359,"buffercvfromstring":0.0014005602240896359,"add":0.0014005602240896359,"optional":0.0014005602240896359,"post":0.0014005602240896359,"condition":0.0014005602240896359,"details":0.0014005602240896359,"constructing":0.0014005602240896359,"conditions":0.0014005602240896359,"postconditionaddress":0.0014005602240896359,"'sp2zd731anqzt6j4k3f5n8a40zxwxc1xfxhvvqfke'":0.0014005602240896359,"postconditioncode":0.0014005602240896359,"greaterequal":0.0014005602240896359,"postconditionamount":0.0014005602240896359,"1000000n":0.0014005602240896359,"postconditions":0.0014005602240896359,"contractaddress":0.0014005602240896359,"'spbmrfrppgcde3f384wcjpk8pqjgz8k9qkk7f59x'":0.0014005602240896359,"functionname":0.0014005602240896359,"'contract_function'":0.0014005602240896359,"functionargs":0.0014005602240896359,"'foo'":0.0014005602240896359,"validatewithabi":0.0014005602240896359,"example":0.0014005602240896359,"we":0.0014005602240896359,"construct":0.0014005602240896359,"contract-call":0.0014005602240896359,"option":0.0014005602240896359,"attempt":0.0014005602240896359,"contracts":0.0014005602240896359,"abi":0.0014005602240896359,"validate":0.0014005602240896359,"provided":0.0014005602240896359,"match":0.0014005602240896359,"what":0.0014005602240896359,"described":0.0014005602240896359,"help":0.0014005602240896359,"avoid":0.0014005602240896359,"invalid":0.0014005602240896359,"would":0.0014005602240896359,"prefer":0.0014005602240896359,"own":0.0014005602240896359,"instead":0.0014005602240896359,"fetching":0.0014005602240896359,"also":0.0014005602240896359,"accepts":0.0014005602240896359,"clarityabi":0.0014005602240896359,"https":0.0014005602240896359,"github":0.0014005602240896359,"blockstack":0.0014005602240896359,"stacks-transactions-js":0.0014005602240896359,"blob":0.0014005602240896359,"master":0.0014005602240896359,"src":0.0014005602240896359,"contract-abi":0.0014005602240896359,"ts":0.0014005602240896359,"l231":0.0014005602240896359,"objects":0.0014005602240896359,"constructed":0.0014005602240896359,"files":0.0014005602240896359,"like":0.0014005602240896359,"parse":0.0014005602240896359,"'abi":0.0014005602240896359,"js":0.0014005602240896359,"packages":0.0014005602240896359,"tests":0.0014005602240896359,"test-abi":0.0014005602240896359,"sponsoring":0.0014005602240896359,"sponsored":0.0014005602240896359,"first":0.0014005602240896359,"create":0.0014005602240896359,"sign":0.0014005602240896359,"must":0.0014005602240896359,"common'":0.0014005602240896359,"buffercv":0.0014005602240896359,"now":0.0014005602240896359,"passed":0.0014005602240896359,"party":0.0014005602240896359,"sponsor":0.0014005602240896359,"portion":0.0014005602240896359,"sponsortransaction":0.0014005602240896359,"bytesreader":0.0014005602240896359,"deserializetransaction":0.0014005602240896359,"buffer":0.0014005602240896359,"'hex'":0.0014005602240896359,"deserializedtx":0.0014005602240896359,"sponsorkey":0.0014005602240896359,"'770287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01'":0.0014005602240896359,"1000n":0.0014005602240896359,"sponsoroptions":0.0014005602240896359,"sponsorprivatekey":0.0014005602240896359,"sponsornonce":0.0014005602240896359,"sponsoredtx":0.0014005602240896359,"supporting":0.0014005602240896359,"multi-signature":0.0014005602240896359,"multi-sig":0.0014005602240896359,"unsigned":0.0014005602240896359,"numsignatures":0.0014005602240896359,"publickeys":0.0014005602240896359,"properties":0.0014005602240896359,"makeunsignedstxtokentransfer":0.0014005602240896359,"pubkeyfromprivkey":0.0014005602240896359,"publickeytostring":0.0014005602240896359,"transactionsigner":0.0014005602240896359,"standardprincipalcv":0.0014005602240896359,"'sp3fgq8":0.0014005602240896359,"2500000n":0.0014005602240896359,"keys":0.0014005602240896359,"participants":0.0014005602240896359,"privkeystrings":0.0014005602240896359,"'6d430bb9":0.0014005602240896359,"'2a584d89":0.0014005602240896359,"'d5200dee":0.0014005602240896359,"privkeys":0.0014005602240896359,"map":0.0014005602240896359,"corresponding":0.0014005602240896359,"pubkeys":0.0014005602240896359,"pubkeystrings":0.0014005602240896359,"number":0.0014005602240896359,"signature":0.0014005602240896359,"elements":0.0014005602240896359,"along":0.0014005602240896359,"addition":0.0014005602240896359,"meeting":0.0014005602240896359,"requirement":0.0014005602240896359,"parties":0.0014005602240896359,"who":0.0014005602240896359,"did":0.0014005602240896359,"appended":0.0014005602240896359,"deserialize":0.0014005602240896359,"partially":0.0014005602240896359,"deserialized":0.0014005602240896359,"signatures":0.0014005602240896359,"signer":0.0014005602240896359,"signorigin":0.0014005602240896359,"appendorigin":0.0014005602240896359,"serializedsignedtx":0.0014005602240896359,"calling":0.0014005602240896359,"read-only":0.0014005602240896359,"called":0.0014005602240896359,"works":0.0014005602240896359,"via":0.0014005602240896359,"direct":0.0014005602240896359,"callreadonlyfunction":0.0014005602240896359,"'st3kc0mtnw34s1zxd36jykfd3jjmwa01m55dsj4je'":0.0014005602240896359,"'kv-store'":0.0014005602240896359,"'get-value'":0.0014005602240896359,"senderaddress":0.0014005602240896359,"'st2f4bk4gzh6yfbnhyddgn4t1rkba7da1bjzpjejj'":0.0014005602240896359,"result":0.0014005602240896359,"clarity":0.0014005602240896359,"values":0.0014005602240896359,"building":0.0014005602240896359,"deployed":0.0014005602240896359,"requires":0.0014005602240896359,"valid":0.0014005602240896359,"pass":0.0014005602240896359,"system":0.0014005602240896359,"stacksgov":0.0014005602240896359,"sips":0.0014005602240896359,"sip":0.0014005602240896359,"sip-002-smart-contract-language":0.0014005602240896359,"md":0.0014005602240896359,"clarity-type-system":0.0014005602240896359,"-":0.0014005602240896359,"tuple":0.0014005602240896359,"key-name-0":0.0014005602240896359,"key-type-0":0.0014005602240896359,"key-name-1":0.0014005602240896359,"key-type-1":0.0014005602240896359,"typed":0.0014005602240896359,"named":0.0014005602240896359,"fields":0.0014005602240896359,"list":0.0014005602240896359,"max-len":0.0014005602240896359,"entry-type":0.0014005602240896359,"maximum":0.0014005602240896359,"length":0.0014005602240896359,"entries":0.0014005602240896359,"ok-type":0.0014005602240896359,"err-type":0.0014005602240896359,"commit":0.0014005602240896359,"changes":0.0014005602240896359,"abort":0.0014005602240896359,"may":0.0014005602240896359,"returned":0.0014005602240896359,"well":0.0014005602240896359,"however":0.0014005602240896359,"behavior":0.0014005602240896359,"some-type":0.0014005602240896359,"either":0.0014005602240896359,"some":0.0014005602240896359,"none":0.0014005602240896359,"buff":0.0014005602240896359,"byte":0.0014005602240896359,"principal":0.0014005602240896359,"whether":0.0014005602240896359,"standard":0.0014005602240896359,"bool":0.0014005602240896359,"boolean":0.0014005602240896359,"int":0.0014005602240896359,"128-bit":0.0014005602240896359,"integer":0.0014005602240896359,"uint":0.0014005602240896359,"classes":0.0014005602240896359,"order":0.0014005602240896359,"make":0.0014005602240896359,"easy":0.0014005602240896359,"well-typed":0.0014005602240896359,"javascript":0.0014005602240896359,"these":0.0014005602240896359,"all":0.0014005602240896359,"extend":0.0014005602240896359,"abstract":0.0014005602240896359,"clarityvalue":0.0014005602240896359,"truecv":0.0014005602240896359,"falsecv":0.0014005602240896359,"nonecv":0.0014005602240896359,"somecv":0.0014005602240896359,"intcv":0.0014005602240896359,"uintcv":0.0014005602240896359,"contractprincipalcv":0.0014005602240896359,"responseerrorcv":0.0014005602240896359,"responseokcv":0.0014005602240896359,"listcv":0.0014005602240896359,"tuplecv":0.0014005602240896359,"utf8tobytes":0.0014005602240896359,"t":0.0014005602240896359,"f":0.0014005602240896359,"nothing":0.0014005602240896359,"existing":0.0014005602240896359,"bytes":0.0014005602240896359,"bufcv":0.0014005602240896359,"i":0.0014005602240896359,"-10":0.0014005602240896359,"u":0.0014005602240896359,"address":0.0014005602240896359,"'sp2jxkmsh007npyaqhkjpqmaqyad90nqgtvjvq02b'":0.0014005602240896359,"'contract-name'":0.0014005602240896359,"spcv":0.0014005602240896359,"cpcv":0.0014005602240896359,"errcv":0.0014005602240896359,"okcv":0.0014005602240896359,"tupcv":0.0014005602240896359,"b":0.0014005602240896359,"c":0.0014005602240896359,"l":0.0014005602240896359,"develop":0.0014005602240896359,"checker":0.0014005602240896359,"prevent":0.0014005602240896359,"wrongly-typed":0.0014005602240896359,"won't":0.0014005602240896359,"compile":0.0014005602240896359,"since":0.0014005602240896359,"lists":0.0014005602240896359,"homogeneous":0.0014005602240896359,"meaning":0.0014005602240896359,"they":0.0014005602240896359,"contain":0.0014005602240896359,"single":0.0014005602240896359,"important":0.0014005602240896359,"include":0.0014005602240896359,"variable":0.0014005602240896359,"booleancv":0.0014005602240896359,"otherwise":0.0014005602240896359,"know":0.0014005602240896359,"enforce":0.0014005602240896359,"homogeneity":0.0014005602240896359,"three":0.0014005602240896359,"added":0.0014005602240896359,"fungible":0.0014005602240896359,"non-fungible":0.0014005602240896359,"main":0.0014005602240896359,"sip-005":0.0014005602240896359,"sip-005-blocks-and-transactions":0.0014005602240896359,"transaction-post-conditions":0.0014005602240896359,"makecontractstxpostcondition":0.0014005602240896359,"standardstxpostcondition":0.0014005602240896359,"'test-contract'":0.0014005602240896359,"contractstxpostcondition":0.0014005602240896359,"createassetinfo":0.0014005602240896359,"makestandardfungiblepostcondition":0.0014005602240896359,"assetaddress":0.0014005602240896359,"'sp62m8mefh32wgsb7xsf9wjzd7tqb48vqb5anwsj'":0.0014005602240896359,"assetcontractname":0.0014005602240896359,"'test-asset-contract'":0.0014005602240896359,"assetname":0.0014005602240896359,"'test-token'":0.0014005602240896359,"fungibleassetinfo":0.0014005602240896359,"standardfungiblepostcondition":0.0014005602240896359,"contractfungiblepostcondition":0.0014005602240896359,"makecontractfungiblepostcondition":0.0014005602240896359,"warning":0.0014005602240896359,"blockchain's":0.0014005602240896359,"post-condition":0.0014005602240896359,"processor":0.0014005602240896359,"check":0.0014005602240896359,"ownership":0.0014005602240896359,"send":0.0014005602240896359,"nft":0.0014005602240896359,"post-conditions":0.0014005602240896359,"verify":0.0014005602240896359,"anything":0.0014005602240896359,"asset":0.0014005602240896359,"recipients":0.0014005602240896359,"docs":0.0014005602240896359,"co":0.0014005602240896359,"write-smart-contracts":0.0014005602240896359,"nonfungibleconditioncode":0.0014005602240896359,"makestandardnonfungiblepostcondition":0.0014005602240896359,"makecontractnonfungiblepostcondition":0.0014005602240896359,"doesnotsend":0.0014005602240896359,"'test-asset'":0.0014005602240896359,"assetid":0.0014005602240896359,"'test-token-asset-id'":0.0014005602240896359,"nonfungibleassetinfo":0.0014005602240896359,"standardnonfungiblepostcondition":0.0014005602240896359,"contractnonfungiblepostcondition":0.0014005602240896359,"conversion":0.0014005602240896359,"represent":0.0014005602240896359,"format":0.0014005602240896359,"helper":0.0014005602240896359,"cvtojson":0.0014005602240896359,"hextocv":0.0014005602240896359,"tx_result":0.0014005602240896359},"227":{"12345":0.0023923444976076554,"import":0.0023923444976076554,"root":0.0023923444976076554,"api":0.0023923444976076554,"apiexample":0.0023923444976076554,"from":0.0023923444976076554,"'fumadocs-openapi":0.0023923444976076554,"ui'":0.0023923444976076554,"property":0.0023923444976076554,"accordion":0.0023923444976076554,"accordions":0.0023923444976076554,"'fumadocs-ui":0.0023923444976076554,"components":0.0023923444976076554,"accordion'":0.0023923444976076554,"tabs":0.0023923444976076554,"tabscontent":0.0023923444976076554,"tabslist":0.0023923444976076554,"tabstrigger":0.0023923444976076554,"'":0.0023923444976076554,"ui":0.0023923444976076554,"tabs'":0.0023923444976076554,"badge":0.0023923444976076554,"badge'":0.0023923444976076554,"inlinecode":0.0023923444976076554,"inline-code'":0.0023923444976076554,"the":0.0023923444976076554,"stacks":0.0023923444976076554,"authentication":0.0023923444976076554,"process":0.0023923444976076554,"enables":0.0023923444976076554,"secure":0.0023923444976076554,"user":0.0023923444976076554,"sign-in":0.0023923444976076554,"for":0.0023923444976076554,"web":0.0023923444976076554,"apps":0.0023923444976076554,"by":0.0023923444976076554,"generating":0.0023923444976076554,"and":0.0023923444976076554,"handling":0.0023923444976076554,"encrypted":0.0023923444976076554,"requests":0.0023923444976076554,"it":0.0023923444976076554,"involves":0.0023923444976076554,"setting":0.0023923444976076554,"up":0.0023923444976076554,"an":0.0023923444976076554,"app":0.0023923444976076554,"domain":0.0023923444976076554,"configuring":0.0023923444976076554,"permissions":0.0023923444976076554,"creating":0.0023923444976076554,"a":0.0023923444976076554,"usersession":0.0023923444976076554,"to":0.0023923444976076554,"manage":0.0023923444976076554,"data":0.0023923444976076554,"installation":0.0023923444976076554,"package-install":0.0023923444976076554,"network":0.0023923444976076554,"classname":0.0023923444976076554,"'my-20'":0.0023923444976076554,"div":0.0023923444976076554,"'flex-1'":0.0023923444976076554,"h2":0.0023923444976076554,"'mt-0'":0.0023923444976076554,"appconfig":0.0023923444976076554,"configuration":0.0023923444976076554,"current":0.0023923444976076554,"on":0.0023923444976076554,"browser":0.0023923444976076554,"platforms":0.0023923444976076554,"instance":0.0023923444976076554,"of":0.0023923444976076554,"this":0.0023923444976076554,"class":0.0023923444976076554,"without":0.0023923444976076554,"any":0.0023923444976076554,"arguments":0.0023923444976076554,"will":0.0023923444976076554,"use":0.0023923444976076554,"window":0.0023923444976076554,"location":0.0023923444976076554,"origin":0.0023923444976076554,"as":0.0023923444976076554,"non-browser":0.0023923444976076554,"you":0.0023923444976076554,"need":0.0023923444976076554,"specify":0.0023923444976076554,"second":0.0023923444976076554,"argument":0.0023923444976076554,"parameters":0.0023923444976076554,"required":0.0023923444976076554,"true":0.0023923444976076554,"deprecated":0.0023923444976076554,"false":0.0023923444976076554,"name":0.0023923444976076554,"scopes":0.0023923444976076554,"type":0.0023923444976076554,"string":0.0023923444976076554,"array":0.0023923444976076554,"strings":0.0023923444976076554,"representing":0.0023923444976076554,"requested":0.0023923444976076554,"span":0.0023923444976076554,"default":0.0023923444976076554,"'store_write'":0.0023923444976076554,"appdomain":0.0023923444976076554,"are":0.0023923444976076554,"uniquely":0.0023923444976076554,"identified":0.0023923444976076554,"their":0.0023923444976076554,"redirectpath":0.0023923444976076554,"path":0.0023923444976076554,"redirect":0.0023923444976076554,"users":0.0023923444976076554,"after":0.0023923444976076554,"response":0.0023923444976076554,"token":0.0023923444976076554,"be":0.0023923444976076554,"postpended":0.0023923444976076554,"in":0.0023923444976076554,"query":0.0023923444976076554,"manifestpath":0.0023923444976076554,"relative":0.0023923444976076554,"app's":0.0023923444976076554,"manifest":0.0023923444976076554,"file":0.0023923444976076554,"json":0.0023923444976076554,"corenode":0.0023923444976076554,"url":0.0023923444976076554,"core":0.0023923444976076554,"node":0.0023923444976076554,"if":0.0023923444976076554,"is":0.0023923444976076554,"not":0.0023923444976076554,"specified":0.0023923444976076554,"used":0.0023923444976076554,"authenticatorurl":0.0023923444976076554,"web-based":0.0023923444976076554,"authenticator":0.0023923444976076554,"event":0.0023923444976076554,"doesn't":0.0023923444976076554,"have":0.0023923444976076554,"installed":0.0023923444976076554,"machine":0.0023923444976076554,"library":0.0023923444976076554,"defaultvalue":0.0023923444976076554,"config":0.0023923444976076554,"'flex":0.0023923444976076554,"flex-wrap'":0.0023923444976076554,"value":0.0023923444976076554,"'tab":0.0023923444976076554,"group'":0.0023923444976076554,"'badge":0.0023923444976076554,"transition-colors'":0.0023923444976076554,"basic":0.0023923444976076554,"options":0.0023923444976076554,"with":0.0023923444976076554,"advanced":0.0023923444976076554,"tsx":0.0023923444976076554,"twoslash":0.0023923444976076554,"noerrors":0.0023923444976076554,"code":0.0023923444976076554,"word":0.0023923444976076554,"auth'":0.0023923444976076554,"const":0.0023923444976076554,"'https":0.0023923444976076554,"www":0.0023923444976076554,"myapp":0.0023923444976076554,"com'":0.0023923444976076554,"new":0.0023923444976076554,"title":0.0023923444976076554,"full":0.0023923444976076554,"sample":0.0023923444976076554,"makeauthrequest":0.0023923444976076554,"payloads":0.0023923444976076554,"during":0.0023923444976076554,"transit":0.0023923444976076554,"encryption":0.0023923444976076554,"key":0.0023923444976076554,"generated":0.0023923444976076554,"below":0.0023923444976076554,"provides":0.0023923444976076554,"transitkey":0.0023923444976076554,"generateandstoretransitkey":0.0023923444976076554,"auth":0.0023923444976076554,"open":0.0023923444976076554,"compatible":0.0023923444976076554,"or":0.0023923444976076554,"extension":0.0023923444976076554,"perform":0.0023923444976076554,"so":0.0023923444976076554,"provide":0.0023923444976076554,"which":0.0023923444976076554,"can":0.0023923444976076554,"payload":0.0023923444976076554,"page":0.0023923444976076554,"should":0.0023923444976076554,"redirecturi":0.0023923444976076554,"com":0.0023923444976076554,"set":0.0023923444976076554,"your":0.0023923444976076554,"contains":0.0023923444976076554,"information":0.0023923444976076554,"about":0.0023923444976076554,"that":0.0023923444976076554,"shown":0.0023923444976076554,"manifesturi":0.0023923444976076554,"json'":0.0023923444976076554,"generate":0.0023923444976076554,"request":0.0023923444976076554,"authrequest":0.0023923444976076554,"publish_data":0.0023923444976076554,"email":0.0023923444976076554,"'publish_data'":0.0023923444976076554,"'email'":0.0023923444976076554,"represents":0.0023923444976076554,"signed":0.0023923444976076554,"particular":0.0023923444976076554,"functions":0.0023923444976076554,"issigninpending":0.0023923444976076554,"function":0.0023923444976076554,"determines":0.0023923444976076554,"there":0.0023923444976076554,"incoming":0.0023923444976076554,"handlependingsignin":0.0023923444976076554,"processes":0.0023923444976076554,"userdata":0.0023923444976076554,"object":0.0023923444976076554,"containing":0.0023923444976076554,"user's":0.0023923444976076554,"identity":0.0023923444976076554,"bns":0.0023923444976076554,"username":0.0023923444976076554,"profile":0.0023923444976076554,"isusersignedin":0.0023923444976076554,"checks":0.0023923444976076554,"already":0.0023923444976076554,"authenticated":0.0023923444976076554,"loaduserdata":0.0023923444976076554,"retrieves":0.0023923444976076554,"encryptcontent":0.0023923444976076554,"encrypts":0.0023923444976076554,"storage":0.0023923444976076554,"decryptcontent":0.0023923444976076554,"decrypts":0.0023923444976076554,"pending":0.0023923444976076554,"status":0.0023923444976076554,"checking":0.0023923444976076554,"user-data":0.0023923444976076554,"loading":0.0023923444976076554,"sign-out":0.0023923444976076554,"signing":0.0023923444976076554,"out":0.0023923444976076554,"encrypt":0.0023923444976076554,"encrypting":0.0023923444976076554,"decrypt":0.0023923444976076554,"decrypting":0.0023923444976076554,"ispending":0.0023923444976076554,"then":0.0023923444976076554,"do":0.0023923444976076554,"something":0.0023923444976076554,"'status'":0.0023923444976076554,"issignedin":0.0023923444976076554,"'user-data'":0.0023923444976076554,"'sign-out'":0.0023923444976076554,"signuserout":0.0023923444976076554,"'encrypt'":0.0023923444976076554,"message":0.0023923444976076554,"'my":0.0023923444976076554,"secret":0.0023923444976076554,"message'":0.0023923444976076554,"ciphertext":0.0023923444976076554,"await":0.0023923444976076554,"'decrypt'":0.0023923444976076554,"plaintext":0.0023923444976076554,"notes":0.0023923444976076554,"note":0.0023923444976076554,"here":0.0023923444976076554,"uses":0.0023923444976076554,"private":0.0023923444976076554,"associated":0.0023923444976076554,"only":0.0023923444976076554,"share":0.0023923444976076554,"another":0.0023923444976076554,"other":0.0023923444976076554,"equivalent":0.0023923444976076554,"methods":0.0023923444976076554,"custom":0.0023923444976076554,"additional":0.0023923444976076554,"requesting":0.0023923444976076554,"auth-request":0.0023923444976076554,"---cut---":0.0023923444976076554,"lookupprofile":0.0023923444976076554,"look":0.0023923444976076554,"'mainnet'":0.0023923444976076554,"'testnet'":0.0023923444976076554,"'devnet'":0.0023923444976076554,"'mocknet'":0.0023923444976076554,"stacksnetwork":0.0023923444976076554,"defines":0.0023923444976076554,"connect":0.0023923444976076554,"zonefilelookupurl":0.0023923444976076554,"fetch":0.0023923444976076554,"zone":0.0023923444976076554,"needed":0.0023923444976076554,"does":0.0023923444976076554,"reside":0.0023923444976076554,"at":0.0023923444976076554,"lookup":0.0023923444976076554,"usage":0.0023923444976076554,"create":0.0023923444976076554,"mainnet":0.0023923444976076554,"testnet":0.0023923444976076554,"mocknet":0.0023923444976076554,"typescript":0.0023923444976076554,"stacksmainnet":0.0023923444976076554,"stackstestnet":0.0023923444976076554,"stacksmocknet":0.0023923444976076554,"network'":0.0023923444976076554,"mystacksnode":0.0023923444976076554,"check":0.0023923444976076554,"ismainnet":0.0023923444976076554,"transaction":0.0023923444976076554,"building":0.0023923444976076554,"makestxtokentransfer":0.0023923444976076554,"transactions'":0.0023923444976076554,"txoptions":0.0023923444976076554,"recipient":0.0023923444976076554,"'sp2bs6hd7tn34v8z5bnf8q2aw3k8k2dpv4264cf26'":0.0023923444976076554,"amount":0.0023923444976076554,"bignum":0.0023923444976076554,"senderkey":0.0023923444976076554,"'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01'":0.0023923444976076554,"built-in":0.0023923444976076554,"middleware":0.0023923444976076554,"some":0.0023923444976076554,"apis":0.0023923444976076554,"make":0.0023923444976076554,"keys":0.0023923444976076554,"less":0.0023923444976076554,"rate-limited":0.0023923444976076554,"plans":0.0023923444976076554,"createapikeymiddleware":0.0023923444976076554,"createfetchfn":0.0023923444976076554,"broadcasttransaction":0.0023923444976076554,"getnonce":0.0023923444976076554,"myapimiddleware":0.0023923444976076554,"'example_e8e044a3_41d8b0fe_3dd3988ef302'":0.0023923444976076554,"myfetchfn":0.0023923444976076554,"middlewares":0.0023923444976076554,"mymainnet":0.0023923444976076554,"fetchfn":0.0023923444976076554,"passed":0.0023923444976076554,"override":0.0023923444976076554,"'sp3fgq8z7jy9bwyz5wm53e0m9nk7whjf0691nz159'":0.0023923444976076554,"12345n":0.0023923444976076554,"memo":0.0023923444976076554,"'some":0.0023923444976076554,"memo'":0.0023923444976076554,"anchormode":0.0023923444976076554,"sure":0.0023923444976076554,"pass":0.0023923444976076554,"fee-estimation":0.0023923444976076554,"broadcast":0.0023923444976076554,"via":0.0023923444976076554,"js":0.0023923444976076554,"take":0.0023923444976076554,"nonce":0.0023923444976076554,"hook":0.0023923444976076554,"into":0.0023923444976076554,"calls":0.0023923444976076554,"before":0.0023923444976076554,"sending":0.0023923444976076554,"receiving":0.0023923444976076554,"requestcontext":0.0023923444976076554,"responsecontext":0.0023923444976076554,"premiddleware":0.0023923444976076554,"ctx":0.0023923444976076554,"init":0.0023923444976076554,"headers":0.0023923444976076554,"'x-foo'":0.0023923444976076554,"'bar'":0.0023923444976076554,"x-foo":0.0023923444976076554,"header":0.0023923444976076554,"postmiddleware":0.0023923444976076554,"console":0.0023923444976076554,"log":0.0023923444976076554,"body":0.0023923444976076554,"pre":0.0023923444976076554,"post":0.0023923444976076554,"contain":0.0023923444976076554,"both":0.0023923444976076554,"get":0.0023923444976076554,"various":0.0023923444976076554,"urls":0.0023923444976076554,"txbroadcasturl":0.0023923444976076554,"getbroadcastapiurl":0.0023923444976076554,"feeestimateurl":0.0023923444976076554,"gettransferfeeestimateapiurl":0.0023923444976076554,"address":0.0023923444976076554,"accountinfourl":0.0023923444976076554,"getaccountapiurl":0.0023923444976076554,"contractname":0.0023923444976076554,"'hello_world'":0.0023923444976076554,"abiurl":0.0023923444976076554,"getabiapiurl":0.0023923444976076554,"functionname":0.0023923444976076554,"'hello'":0.0023923444976076554,"readonlyfunctioncallurl":0.0023923444976076554,"getreadonlyfunctioncallapiurl":0.0023923444976076554,"nodeinfourl":0.0023923444976076554,"getinfourl":0.0023923444976076554,"blocktimeurl":0.0023923444976076554,"getblocktimeinfourl":0.0023923444976076554,"poxinfourl":0.0023923444976076554,"getpoxinfourl":0.0023923444976076554},"228":{"import":0.007042253521126761,"globe":0.007042253521126761,"from":0.007042253521126761,"'lucide-react'":0.007042253521126761,"card":0.007042253521126761,"secondarycard":0.007042253521126761,"'":0.007042253521126761,"components":0.007042253521126761,"card'":0.007042253521126761,"stacks":0.007042253521126761,"js":0.007042253521126761,"is":0.007042253521126761,"a":0.007042253521126761,"javascript":0.007042253521126761,"typescript":0.007042253521126761,"sdk":0.007042253521126761,"for":0.007042253521126761,"building":0.007042253521126761,"on":0.007042253521126761,"the":0.007042253521126761,"blockchain":0.007042253521126761,"it's":0.007042253521126761,"collection":0.007042253521126761,"of":0.007042253521126761,"various":0.007042253521126761,"libraries":0.007042253521126761,"that":0.007042253521126761,"allow":0.007042253521126761,"you":0.007042253521126761,"to":0.007042253521126761,"broadcast":0.007042253521126761,"transaction":0.007042253521126761,"with":0.007042253521126761,"construct":0.007042253521126761,"post-conditions":0.007042253521126761,"and":0.007042253521126761,"more":0.007042253521126761,"some":0.007042253521126761,"most":0.007042253521126761,"important":0.007042253521126761,"blocks":0.007042253521126761,"all":0.007042253521126761,"in":0.007042253521126761,"one":0.007042253521126761,"place":0.007042253521126761,"separated":0.007042253521126761,"into":0.007042253521126761,"many":0.007042253521126761,"smaller":0.007042253521126761,"packages":0.007042253521126761,"which":0.007042253521126761,"can":0.007042253521126761,"be":0.007042253521126761,"installed":0.007042253521126761,"individually":0.007042253521126761,"are":0.007042253521126761,"published":0.007042253521126761,"npm":0.007042253521126761,"under":0.007042253521126761,"scope":0.007042253521126761,"details":0.007042253521126761,"check":0.007042253521126761,"out":0.007042253521126761,"our":0.007042253521126761,"installation":0.007042253521126761,"guide":0.007042253521126761,"icon":0.007042253521126761,"href":0.007042253521126761,"connect":0.007042253521126761,"title":0.007042253521126761,"build":0.007042253521126761,"web":0.007042253521126761,"app":0.007042253521126761,"description":0.007042253521126761,"integrate":0.007042253521126761,"your":0.007042253521126761,"apps":0.007042253521126761,"tag":0.007042253521126761,"guides":0.007042253521126761,"cards":0.007042253521126761,"broadcast-transactions":0.007042253521126761,"transactions":0.007042253521126761,"create":0.007042253521126761,"using":0.007042253521126761,"builder":0.007042253521126761,"helper":0.007042253521126761,"functions":0.007042253521126761,"constructing":0.007042253521126761,"smart":0.007042253521126761,"contracts":0.007042253521126761,"safe-guard":0.007042253521126761,"users":0.007042253521126761,"related":0.007042253521126761,"tools":0.007042253521126761,"-":0.007042253521126761,"clarinet":0.007042253521126761,"local":0.007042253521126761,"environment":0.007042253521126761,"interact":0.007042253521126761,"wallet":0.007042253521126761,"extension":0.007042253521126761,"hiro":0.007042253521126761,"platform":0.007042253521126761,"developer":0.007042253521126761,"deploying":0.007042253521126761,"scaling":0.007042253521126761,"bitcoin":0.007042253521126761,"api":0.007042253521126761,"fetch":0.007042253521126761,"data":0.007042253521126761,"br":0.007042253521126761,"callout":0.007042253521126761,"need":0.007042253521126761,"help":0.007042253521126761,"type":0.007042253521126761,"reach":0.007042253521126761,"us":0.007042253521126761,"span":0.007042253521126761,"classname":0.007042253521126761,"font-bold":0.007042253521126761,"stacks-js":0.007042253521126761,"channel":0.007042253521126761,"discord":0.007042253521126761,"https":0.007042253521126761,"chat":0.007042253521126761,"section":0.007042253521126761,"there's":0.007042253521126761,"also":0.007042253521126761,"weekly":0.007042253521126761,"office":0.007042253521126761,"hours":0.007042253521126761,"www":0.007042253521126761,"addevent":0.007042253521126761,"com":0.007042253521126761,"event":0.007042253521126761,"ki22007085":0.007042253521126761,"call":0.007042253521126761,"every":0.007042253521126761,"wednesday":0.007042253521126761,"at":0.007042253521126761,"1pm":0.007042253521126761,"et":0.007042253521126761},"229":{"1":0.001838235294117647,"11":0.001838235294117647,"12":0.001838235294117647,"163":0.001838235294117647,"245":0.001838235294117647,"602":0.001838235294117647,"2801":0.001838235294117647,"read":0.001838235294117647,"about":0.001838235294117647,"what's":0.001838235294117647,"new":0.001838235294117647,"in":0.001838235294117647,"the":0.001838235294117647,"latest":0.001838235294117647,"version":0.001838235294117647,"of":0.001838235294117647,"stacks":0.001838235294117647,"js":0.001838235294117647,"this":0.001838235294117647,"comes":0.001838235294117647,"with":0.001838235294117647,"a":0.001838235294117647,"lot":0.001838235294117647,"improvements":0.001838235294117647,"and":0.001838235294117647,"features":0.001838235294117647,"but":0.001838235294117647,"it":0.001838235294117647,"also":0.001838235294117647,"adds":0.001838235294117647,"some":0.001838235294117647,"breaking":0.001838235294117647,"changes":0.001838235294117647,"want":0.001838235294117647,"to":0.001838235294117647,"use":0.001838235294117647,"these":0.001838235294117647,"install":0.001838235294117647,"packages":0.001838235294117647,"using":0.001838235294117647,"tag":0.001838235294117647,"package-install":0.001838235294117647,"common":0.001838235294117647,"network":0.001838235294117647,"transactions":0.001838235294117647,"strings":0.001838235294117647,"_aka":0.001838235294117647,"reducing":0.001838235294117647,"wrapper":0.001838235294117647,"types":0.001838235294117647,"magic":0.001838235294117647,"numbers_":0.001838235294117647,"img":0.001838235294117647,"src":0.001838235294117647,"string-meme":0.001838235294117647,"png":0.001838235294117647,"classname":0.001838235294117647,"max-w-":0.001838235294117647,"300px":0.001838235294117647,"mx-auto":0.001838235294117647,"alt":0.001838235294117647,"string":0.001838235294117647,"meme":0.001838235294117647,"problem":0.001838235294117647,"many":0.001838235294117647,"representations":0.001838235294117647,"we're":0.001838235294117647,"not":0.001838235294117647,"debuggable":0.001838235294117647,"for":0.001838235294117647,"developers":0.001838235294117647,"logging":0.001838235294117647,"clarity":0.001838235294117647,"values":0.001838235294117647,"resulted":0.001838235294117647,"unintelligible":0.001838235294117647,"type":0.001838235294117647,"value":0.001838235294117647,"numbers":0.001838235294117647,"confusing":0.001838235294117647,"even":0.001838235294117647,"experienced":0.001838235294117647,"private":0.001838235294117647,"keys":0.001838235294117647,"were":0.001838235294117647,"included":0.001838235294117647,"unnecessary":0.001838235294117647,"properties":0.001838235294117647,"raw":0.001838235294117647,"byte":0.001838235294117647,"arrays":0.001838235294117647,"are":0.001838235294117647,"all":0.001838235294117647,"accross":0.001838235294117647,"codebase":0.001838235294117647,"as":0.001838235294117647,"they":0.001838235294117647,"needed":0.001838235294117647,"serialization":0.001838235294117647,"shouldn't":0.001838235294117647,"be":0.001838235294117647,"part":0.001838235294117647,"public":0.001838235294117647,"interfaces":0.001838235294117647,"solution":0.001838235294117647,"we":0.001838235294117647,"switched":0.001838235294117647,"system":0.001838235294117647,"where":0.001838235294117647,"most":0.001838235294117647,"will":0.001838235294117647,"represented":0.001838235294117647,"makes":0.001838235294117647,"them":0.001838235294117647,"easier":0.001838235294117647,"inspect":0.001838235294117647,"diff":0.001838235294117647,"example":0.001838235294117647,"more":0.001838235294117647,"clarity-representation":0.001838235294117647,"ts":0.001838235294117647,"-":0.001838235294117647,"12n":0.001838235294117647,"uint":0.001838235294117647,"key":0.001838235294117647,"concepts":0.001838235294117647,"private-keys":0.001838235294117647,"signmessagehashrsv":0.001838235294117647,"privatekey":0.001838235294117647,"createstacksprivatekey":0.001838235294117647,"f5a3":0.001838235294117647,"compressed":0.001838235294117647,"true":0.001838235294117647,"data":0.001838235294117647,"breaks":0.001838235294117647,"signatures":0.001838235294117647,"functions":0.001838235294117647,"signwithkey":0.001838235294117647,"now":0.001838235294117647,"return":0.001838235294117647,"message":0.001838235294117647,"signature":0.001838235294117647,"directly":0.001838235294117647,"nextsignature":0.001838235294117647,"nextverification":0.001838235294117647,"publickeyfromsignaturevrs":0.001838235294117647,"publickeyfromsignaturersv":0.001838235294117647,"take":0.001838235294117647,"long":0.001838235294117647,"time":0.001838235294117647,"instances":0.001838235294117647,"used":0.001838235294117647,"networking":0.001838235294117647,"definitions":0.001838235294117647,"caused":0.001838235294117647,"confusion":0.001838235294117647,"users":0.001838235294117647,"mainnet":0.001838235294117647,"or":0.001838235294117647,"testnet":0.001838235294117647,"their":0.001838235294117647,"interactions":0.001838235294117647,"aka":0.001838235294117647,"fetching":0.001838235294117647,"logic":0.001838235294117647,"is":0.001838235294117647,"clearly":0.001838235294117647,"customizable":0.001838235294117647,"from":0.001838235294117647,"on":0.001838235294117647,"objects":0.001838235294117647,"static":0.001838235294117647,"constants":0.001838235294117647,"don't":0.001838235294117647,"require":0.001838235294117647,"instantiation":0.001838235294117647,"should":0.001838235294117647,"make":0.001838235294117647,"obvious":0.001838235294117647,"when":0.001838235294117647,"object":0.001838235294117647,"vs":0.001838235294117647,"doing":0.001838235294117647,"actual":0.001838235294117647,"cases":0.001838235294117647,"need":0.001838235294117647,"package":0.001838235294117647,"anymore":0.001838235294117647,"parameter":0.001838235294117647,"can":0.001838235294117647,"literals":0.001838235294117647,"'mainnet'":0.001838235294117647,"'testnet'":0.001838235294117647,"'devnet'":0.001838235294117647,"'mocknet'":0.001838235294117647,"import":0.001838235294117647,"stackstestnet":0.001838235294117647,"'":0.001838235294117647,"network'":0.001838235294117647,"makestxtokentransfer":0.001838235294117647,"client":0.001838235294117647,"case":0.001838235294117647,"function":0.001838235294117647,"takes":0.001838235294117647,"way":0.001838235294117647,"you":0.001838235294117647,"literal":0.001838235294117647,"networks":0.001838235294117647,"custom":0.001838235294117647,"node":0.001838235294117647,"still":0.001838235294117647,"any":0.001838235294117647,"object-like":0.001838235294117647,"structure":0.001838235294117647,"containing":0.001838235294117647,"baseurl":0.001838235294117647,"fetch":0.001838235294117647,"property":0.001838235294117647,"base":0.001838235294117647,"url":0.001838235294117647,"https":0.001838235294117647,"developer":0.001838235294117647,"mozilla":0.001838235294117647,"org":0.001838235294117647,"en-us":0.001838235294117647,"docs":0.001838235294117647,"web":0.001838235294117647,"api":0.001838235294117647,"fetch_api":0.001838235294117647,"compatible":0.001838235294117647,"following":0.001838235294117647,"diffs":0.001838235294117647,"show":0.001838235294117647,"examples":0.001838235294117647,"how":0.001838235294117647,"migrate":0.001838235294117647,"pattern":0.001838235294117647,"const":0.001838235294117647,"transaction":0.001838235294117647,"await":0.001838235294117647,"mynode-optional":0.001838235294117647,"com":0.001838235294117647,"fetchfn":0.001838235294117647,"myfetch":0.001838235294117647,"optional":0.001838235294117647,"defaults":0.001838235294117647,"myfetchoptional":0.001838235294117647,"inferred":0.001838235294117647,"keep":0.001838235294117647,"one":0.001838235294117647,"single":0.001838235294117647,"your":0.001838235294117647,"whole":0.001838235294117647,"application":0.001838235294117647,"stacks_testnet":0.001838235294117647,"mynode":0.001838235294117647,"extending":0.001838235294117647,"b":0.001838235294117647,"helpers":0.001838235294117647,"possible":0.001838235294117647,"offers":0.001838235294117647,"translate":0.001838235294117647,"between":0.001838235294117647,"different":0.001838235294117647,"naming":0.001838235294117647,"consistent":0.001838235294117647,"across":0.001838235294117647,"board":0.001838235294117647,"uses":0.001838235294117647,"if":0.001838235294117647,"have":0.001838235294117647,"get":0.001838235294117647,"address":0.001838235294117647,"privatekeytoaddress":0.001838235294117647,"sp1mxszf4nfc8jq1ttygec2wadmc7y3ghvzyrx6rf":0.001838235294117647,"methods":0.001838235294117647,"discover":0.001838235294117647,"start":0.001838235294117647,"renamed":0.001838235294117647,"estimatefee":0.001838235294117647,"fetchfeeestimate":0.001838235294117647,"estimatetransfer":0.001838235294117647,"fetchfeeestimatetransfer":0.001838235294117647,"estimatetransaction":0.001838235294117647,"fetchfeeestimatetransaction":0.001838235294117647,"getabi":0.001838235294117647,"fetchabi":0.001838235294117647,"getnonce":0.001838235294117647,"fetchnonce":0.001838235294117647,"getcontractmapentry":0.001838235294117647,"fetchcontractmapentry":0.001838235294117647,"callreadonlyfunction":0.001838235294117647,"fetchcallreadonlyfunction":0.001838235294117647,"broadcasttransaction":0.001838235294117647,"wasn't":0.001838235294117647,"highlight":0.001838235294117647,"uniqueness":0.001838235294117647,"method":0.001838235294117647,"namely":0.001838235294117647,"sent":0.001838235294117647,"broadcast":0.001838235294117647,"mempool":0.001838235294117647,"an":0.001838235294117647,"irreversible":0.001838235294117647,"action":0.001838235294117647,"representation":0.001838235294117647,"claritytype":0.001838235294117647,"enum":0.001838235294117647,"was":0.001838235294117647,"replaced":0.001838235294117647,"by":0.001838235294117647,"readable":0.001838235294117647,"previous":0.001838235294117647,"wire":0.001838235294117647,"format":0.001838235294117647,"available":0.001838235294117647,"claritywiretype":0.001838235294117647,"considered":0.001838235294117647,"somewhat":0.001838235294117647,"internal":0.001838235294117647,"cause":0.001838235294117647,"use-cases":0.001838235294117647,"holding":0.001838235294117647,"called":0.001838235294117647,"previously":0.001838235294117647,"there":0.001838235294117647,"mix":0.001838235294117647,"list":0.001838235294117647,"buffer":0.001838235294117647,"etc":0.001838235294117647,"bigint":0.001838235294117647,"better":0.001838235294117647,"compatibility":0.001838235294117647,"post-conditions":0.001838235294117647,"old":0.001838235294117647,"postcondition":0.001838235294117647,"postconditionwire":0.001838235294117647,"human-readable":0.001838235294117647,"introduced":0.001838235294117647,"its":0.001838235294117647,"place":0.001838235294117647,"below":0.001838235294117647,"stx":0.001838235294117647,"post-condition":0.001838235294117647,"stxpostcondition":0.001838235294117647,"'stx-postcondition'":0.001838235294117647,"'sp2jxkmsh007npyaqhkjpqmaqyad90nqgtvjvq02b'":0.001838235294117647,"condition":0.001838235294117647,"'gte'":0.001838235294117647,"amount":0.001838235294117647,"'100'":0.001838235294117647,"fungible":0.001838235294117647,"token":0.001838235294117647,"ftpostcondition":0.001838235294117647,"fungiblepostcondition":0.001838235294117647,"'ft-postcondition'":0.001838235294117647,"'eq'":0.001838235294117647,"asset":0.001838235294117647,"'sp3d6pv2acbpekyjtcmh7hen02kp87qsp8kteh335":0.001838235294117647,"my-ft-token":0.001838235294117647,"my-token'":0.001838235294117647,"non-fungible":0.001838235294117647,"nftpostcondition":0.001838235294117647,"nonfungiblepostcondition":0.001838235294117647,"'nft-postcondition'":0.001838235294117647,"'sent'":0.001838235294117647,"my-nft":0.001838235294117647,"my-asset'":0.001838235294117647,"assetid":0.001838235294117647,"cl":0.001838235294117647,"advanced":0.001838235294117647,"serialize":0.001838235294117647,"existing":0.001838235294117647,"hex-encoded":0.001838235294117647,"_instead_":0.001838235294117647,"uint8array":0.001838235294117647,"s":0.001838235294117647,"already":0.001838235294117647,"converting":0.001838235294117647,"returned":0.001838235294117647,"bytes":0.001838235294117647,"hex-strings":0.001838235294117647,"code":0.001838235294117647,"skip":0.001838235294117647,"conversion":0.001838235294117647,"step":0.001838235294117647,"default":0.001838235294117647,"migrating":0.001838235294117647,"renaming":0.001838235294117647,"behavior":0.001838235294117647,"stackstransaction":0.001838235294117647,"serializebytes":0.001838235294117647,"serializecv":0.001838235294117647,"serializecvbytes":0.001838235294117647,"serializeaddress":0.001838235294117647,"serializeaddressbytes":0.001838235294117647,"deserializeaddress":0.001838235294117647,"deserializeaddressbytes":0.001838235294117647,"serializelplist":0.001838235294117647,"serializelplistbytes":0.001838235294117647,"deserializelplist":0.001838235294117647,"deserializelplistbytes":0.001838235294117647,"serializelpstring":0.001838235294117647,"serializelpstringbytes":0.001838235294117647,"deserializelpstring":0.001838235294117647,"deserializelpstringbytes":0.001838235294117647,"serializepayload":0.001838235294117647,"serializepayloadbytes":0.001838235294117647,"deserializepayload":0.001838235294117647,"deserializepayloadbytes":0.001838235294117647,"serializepublickey":0.001838235294117647,"serializepublickeybytes":0.001838235294117647,"deserializepublickey":0.001838235294117647,"deserializepublickeybytes":0.001838235294117647,"serializestacksmessage":0.001838235294117647,"serializestacksmessagebytes":0.001838235294117647,"deserializestacksmessage":0.001838235294117647,"deserializestacksmessagebytes":0.001838235294117647,"serializememostring":0.001838235294117647,"serializememostringbytes":0.001838235294117647,"deserializememostring":0.001838235294117647,"deserializememostringbytes":0.001838235294117647,"serializetransactionauthfield":0.001838235294117647,"serializetransactionauthfieldbytes":0.001838235294117647,"deserializetransactionauthfield":0.001838235294117647,"deserializetransactionauthfieldbytes":0.001838235294117647,"serializemessagesignature":0.001838235294117647,"serializemessagesignaturebytes":0.001838235294117647,"deserializemessagesignature":0.001838235294117647,"deserializemessagesignaturebytes":0.001838235294117647,"serializepostcondition":0.001838235294117647,"serializepostconditionbytes":0.001838235294117647,"deserializepostcondition":0.001838235294117647,"deserializepostconditionbytes":0.001838235294117647,"serializestackswirebytes":0.001838235294117647,"deserializestackswirebytes":0.001838235294117647,"helper":0.001838235294117647,"assetinfo":0.001838235294117647,"stackswiretype":0.001838235294117647,"createassetinfo":0.001838235294117647,"createasset":0.001838235294117647,"parseassetinfostring":0.001838235294117647,"parseassetstring":0.001838235294117647,"cli":0.001838235294117647,"removed":0.001838235294117647,"authenticator":0.001838235294117647,"legacy":0.001838235294117647,"blockstack":0.001838235294117647,"authentication":0.001838235294117647,"triplesec":0.001838235294117647,"support":0.001838235294117647,"encrypting":0.001838235294117647,"decrypting":0.001838235294117647,"mnemonics":0.001838235294117647,"impacts":0.001838235294117647,"decrypt":0.001838235294117647,"decryptmnemonic":0.001838235294117647,"decryptlegacy":0.001838235294117647,"sure":0.001838235294117647,"update":0.001838235294117647,"stored":0.001838235294117647,"somewhere":0.001838235294117647,"encrypted":0.001838235294117647,"wiretype":0.001838235294117647,"internals":0.001838235294117647,"avoid":0.001838235294117647,"wire-format":0.001838235294117647,"only":0.001838235294117647,"internally":0.001838235294117647,"stacksmessage":0.001838235294117647,"stackswire":0.001838235294117647,"stacksmessagetype":0.001838235294117647,"indicate":0.001838235294117647,"_wire-format_":0.001838235294117647,"messagesignature":0.001838235294117647,"messagesignaturewire":0.001838235294117647,"stackspublickey":0.001838235294117647,"publickeywire":0.001838235294117647,"transactionauthfield":0.001838235294117647,"transactionauthfieldwire":0.001838235294117647,"assetwire":0.001838235294117647,"addresswire":0.001838235294117647,"postconditionprincipal":0.001838235294117647,"postconditionprincipalwire":0.001838235294117647,"stxpostconditionwire":0.001838235294117647,"fungiblepostconditionwire":0.001838235294117647,"nonfungiblepostconditionwire":0.001838235294117647,"lengthprefixedstring":0.001838235294117647,"lengthprefixedstringwire":0.001838235294117647,"coinbasepayload":0.001838235294117647,"coinbasepayloadwire":0.001838235294117647,"poisonpayload":0.001838235294117647,"poisonpayloadwire":0.001838235294117647,"smartcontractpayload":0.001838235294117647,"smartcontractpayloadwire":0.001838235294117647,"tokentransferpayload":0.001838235294117647,"tokentransferpayloadwire":0.001838235294117647,"versionedsmartcontractpayload":0.001838235294117647,"versionedsmartcontractpayloadwire":0.001838235294117647,"nakamotocoinbasepayload":0.001838235294117647,"nakamotocoinbasepayloadwire":0.001838235294117647,"tenurechangepayload":0.001838235294117647,"tenurechangepayloadwire":0.001838235294117647,"standardprincipal":0.001838235294117647,"standardprincipalwire":0.001838235294117647,"contractprincipal":0.001838235294117647,"contractprincipalwire":0.001838235294117647,"signed":0.001838235294117647,"inttobigint":0.001838235294117647,"no":0.001838235294117647,"longer":0.001838235294117647,"supports":0.001838235294117647,"two's":0.001838235294117647,"complement":0.001838235294117647,"integers":0.001838235294117647,"boolean":0.001838235294117647,"likely":0.001838235294117647,"misunderstood":0.001838235294117647,"unused":0.001838235294117647,"feature":0.001838235294117647,"refactorings":0.001838235294117647,"addresshashmode":0.001838235294117647,"prefixes":0.001838235294117647,"brevity":0.001838235294117647,"makerandomprivkey":0.001838235294117647,"randomprivatekey":0.001838235294117647,"returns":0.001838235294117647,"generatesecretkey":0.001838235294117647,"randomseedphrase":0.001838235294117647,"callout":0.001838235294117647,"idea":0.001838235294117647,"please":0.001838235294117647,"let":0.001838235294117647,"us":0.001838235294117647,"know":0.001838235294117647,"discord":0.001838235294117647,"stacks-js":0.001838235294117647,"chat":0.001838235294117647,"open":0.001838235294117647,"issue":0.001838235294117647,"github":0.001838235294117647,"hirosystems":0.001838235294117647,"issues":0.001838235294117647,"choose":0.001838235294117647},"230":{"1":0.003816793893129771,"2":0.003816793893129771,"3":0.003816793893129771,"4":0.003816793893129771,"import":0.003816793893129771,"badge":0.003816793893129771,"from":0.003816793893129771,"'":0.003816793893129771,"components":0.003816793893129771,"ui":0.003816793893129771,"badge'":0.003816793893129771,"tabs":0.003816793893129771,"tabscontent":0.003816793893129771,"tabslist":0.003816793893129771,"tabstrigger":0.003816793893129771,"tabs'":0.003816793893129771,"accordion":0.003816793893129771,"accordions":0.003816793893129771,"'fumadocs-ui":0.003816793893129771,"accordion'":0.003816793893129771,"chevronright":0.003816793893129771,"code":0.003816793893129771,"terminal":0.003816793893129771,"'lucide-react'":0.003816793893129771,"file":0.003816793893129771,"folder":0.003816793893129771,"files":0.003816793893129771,"files'":0.003816793893129771,"the":0.003816793893129771,"process":0.003816793893129771,"of":0.003816793893129771,"broadcasting":0.003816793893129771,"transactions":0.003816793893129771,"is":0.003816793893129771,"fundamental":0.003816793893129771,"for":0.003816793893129771,"interacting":0.003816793893129771,"with":0.003816793893129771,"blockchains":0.003816793893129771,"whether":0.003816793893129771,"you're":0.003816793893129771,"transferring":0.003816793893129771,"tokens":0.003816793893129771,"deploying":0.003816793893129771,"contracts":0.003816793893129771,"or":0.003816793893129771,"executing":0.003816793893129771,"contract":0.003816793893129771,"functions":0.003816793893129771,"in":0.003816793893129771,"this":0.003816793893129771,"guide":0.003816793893129771,"you":0.003816793893129771,"will":0.003816793893129771,"learn":0.003816793893129771,"how":0.003816793893129771,"to":0.003816793893129771,"install":0.003816793893129771,"necessary":0.003816793893129771,"packages":0.003816793893129771,"building":0.003816793893129771,"and":0.003816793893129771,"setup-and-installation":0.003816793893129771,"build":0.003816793893129771,"different":0.003816793893129771,"types":0.003816793893129771,"create-a-transaction":0.003816793893129771,"sign":0.003816793893129771,"broadcast":0.003816793893129771,"those":0.003816793893129771,"stacks":0.003816793893129771,"blockchain":0.003816793893129771,"broadcasting-the-transaction":0.003816793893129771,"handle":0.003816793893129771,"results":0.003816793893129771,"handle-the-results":0.003816793893129771,"callout":0.003816793893129771,"title":0.003816793893129771,"example":0.003816793893129771,"repo":0.003816793893129771,"see":0.003816793893129771,"action":0.003816793893129771,"check":0.003816793893129771,"out":0.003816793893129771,"a":0.003816793893129771,"full":0.003816793893129771,"here":0.003816793893129771,"https":0.003816793893129771,"github":0.003816793893129771,"com":0.003816793893129771,"hiro-so":0.003816793893129771,"stacks-connect-example":0.003816793893129771,"---":0.003816793893129771,"setup":0.003816793893129771,"installation":0.003816793893129771,"required":0.003816793893129771,"start":0.003816793893129771,"package-install":0.003816793893129771,"network":0.003816793893129771,"connect":0.003816793893129771,"-":0.003816793893129771,"used":0.003816793893129771,"interact":0.003816793893129771,"authenticate":0.003816793893129771,"users":0.003816793893129771,"create":0.003816793893129771,"transaction":0.003816793893129771,"there":0.003816793893129771,"are":0.003816793893129771,"three":0.003816793893129771,"stx":0.003816793893129771,"transfer":0.003816793893129771,"deployment":0.003816793893129771,"execution":0.003816793893129771,"defaultvalue":0.003816793893129771,"classname":0.003816793893129771,"'flex":0.003816793893129771,"flex-wrap":0.003816793893129771,"md":0.003816793893129771,"w-max'":0.003816793893129771,"value":0.003816793893129771,"'tab":0.003816793893129771,"group'":0.003816793893129771,"variant":0.003816793893129771,"'outline'":0.003816793893129771,"'badge":0.003816793893129771,"transition-colors":0.003816793893129771,"hover":0.003816793893129771,"text-neutral-90":0.003816793893129771,"dark":0.003816793893129771,"group-hover":0.003816793893129771,"text-white'":0.003816793893129771,"deploy":0.003816793893129771,"execute":0.003816793893129771,"use":0.003816793893129771,"makestxtokentransfer":0.003816793893129771,"function":0.003816793893129771,"provided":0.003816793893129771,"by":0.003816793893129771,"package":0.003816793893129771,"ts":0.003816793893129771,"stx-transfer":0.003816793893129771,"-cn":0.003816793893129771,"broadcasttransaction":0.003816793893129771,"const":0.003816793893129771,"await":0.003816793893129771,"recipient":0.003816793893129771,"sp3fgq8z7jy9bwyz5wm53e0m9nk7whjf0691nz159":0.003816793893129771,"amount":0.003816793893129771,"12345n":0.003816793893129771,"senderkey":0.003816793893129771,"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601":0.003816793893129771,"devnet":0.003816793893129771,"builds":0.003816793893129771,"token":0.003816793893129771,"takes":0.003816793893129771,"parameters":0.003816793893129771,"like":0.003816793893129771,"address":0.003816793893129771,"sender's":0.003816793893129771,"private":0.003816793893129771,"key":0.003816793893129771,"ie":0.003816793893129771,"several":0.003816793893129771,"available":0.003816793893129771,"calling":0.003816793893129771,"more":0.003816793893129771,"our":0.003816793893129771,"reference":0.003816793893129771,"page":0.003816793893129771,"js":0.003816793893129771,"makecontractdeploy":0.003816793893129771,"contract-deploy":0.003816793893129771,"transactions'":0.003816793893129771,"contractname":0.003816793893129771,"'hello-world'":0.003816793893129771,"codebody":0.003816793893129771,"define-public":0.003816793893129771,"hello":0.003816793893129771,"ok":0.003816793893129771,"world":0.003816793893129771,"'753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601'":0.003816793893129771,"testnet":0.003816793893129771,"makecontractcall":0.003816793893129771,"function-call":0.003816793893129771,"buffercvfromstring":0.003816793893129771,"cl":0.003816793893129771,"pc":0.003816793893129771,"postcondition":0.003816793893129771,"principal":0.003816793893129771,"sp2zd731anqzt6j4k3f5n8a40zxwxc1xfxhvvqfke":0.003816793893129771,"willsendeq":0.003816793893129771,"1000000n":0.003816793893129771,"ustx":0.003816793893129771,"contractaddress":0.003816793893129771,"spbmrfrppgcde3f384wcjpk8pqjgz8k9qkk7f59x":0.003816793893129771,"contract_name":0.003816793893129771,"functionname":0.003816793893129771,"contract_function":0.003816793893129771,"functionargs":0.003816793893129771,"bufferfromascii":0.003816793893129771,"foo":0.003816793893129771,"b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01":0.003816793893129771,"validatewithabi":0.003816793893129771,"true":0.003816793893129771,"postconditions":0.003816793893129771,"call":0.003816793893129771,"anchormode":0.003816793893129771,"after":0.003816793893129771,"it":0.003816793893129771,"using":0.003816793893129771,"pass":0.003816793893129771,"object":0.003816793893129771,"created":0.003816793893129771,"previous":0.003816793893129771,"step":0.003816793893129771,"response":0.003816793893129771,"logging":0.003816793893129771,"broadcastresponse":0.003816793893129771,"sends":0.003816793893129771,"signed":0.003816793893129771,"returns":0.003816793893129771,"containing":0.003816793893129771,"id":0.003816793893129771,"which":0.003816793893129771,"can":0.003816793893129771,"be":0.003816793893129771,"track":0.003816793893129771,"on":0.003816793893129771,"checking":0.003816793893129771,"status":0.003816793893129771,"responding":0.003816793893129771,"accordingly":0.003816793893129771,"if":0.003816793893129771,"success":0.003816793893129771,"console":0.003816793893129771,"log":0.003816793893129771,"'transaction":0.003816793893129771,"successful":0.003816793893129771,"txid":0.003816793893129771,"else":0.003816793893129771,"error":0.003816793893129771,"failed":0.003816793893129771,"checks":0.003816793893129771,"was":0.003816793893129771,"logs":0.003816793893129771,"next":0.003816793893129771,"steps":0.003816793893129771,"cards":0.003816793893129771,"card":0.003816793893129771,"href":0.003816793893129771,"guides":0.003816793893129771,"post-conditions":0.003816793893129771,"deep":0.003816793893129771,"dive":0.003816793893129771,"into":0.003816793893129771,"description":0.003816793893129771,"secure":0.003816793893129771,"your":0.003816793893129771,"smart":0.003816793893129771,"api":0.003816793893129771,"references":0.003816793893129771},"231":{"0":0.0045045045045045045,"1":0.0045045045045045045,"2":0.0045045045045045045,"3":0.0045045045045045045,"4":0.0045045045045045045,"12":0.0045045045045045045,"500":0.0045045045045045045,"1000":0.0045045045045045045,"import":0.0045045045045045045,"badge":0.0045045045045045045,"from":0.0045045045045045045,"'":0.0045045045045045045,"components":0.0045045045045045045,"ui":0.0045045045045045045,"badge'":0.0045045045045045045,"accordion":0.0045045045045045045,"accordions":0.0045045045045045045,"'fumadocs-ui":0.0045045045045045045,"accordion'":0.0045045045045045045,"chevronright":0.0045045045045045045,"code":0.0045045045045045045,"terminal":0.0045045045045045045,"'lucide-react'":0.0045045045045045045,"file":0.0045045045045045045,"folder":0.0045045045045045045,"files":0.0045045045045045045,"files'":0.0045045045045045045,"post-conditions":0.0045045045045045045,"in":0.0045045045045045045,"stacks":0.0045045045045045045,"transactions":0.0045045045045045045,"provide":0.0045045045045045045,"an":0.0045045045045045045,"additional":0.0045045045045045045,"layer":0.0045045045045045045,"of":0.0045045045045045045,"security":0.0045045045045045045,"they":0.0045045045045045045,"ensure":0.0045045045045045045,"that":0.0045045045045045045,"execute":0.0045045045045045045,"as":0.0045045045045045045,"expected":0.0045045045045045045,"without":0.0045045045045045045,"requiring":0.0045045045045045045,"the":0.0045045045045045045,"user":0.0045045045045045045,"to":0.0045045045045045045,"know":0.0045045045045045045,"underlying":0.0045045045045045045,"smart":0.0045045045045045045,"contract":0.0045045045045045045,"this":0.0045045045045045045,"guide":0.0045045045045045045,"you":0.0045045045045045045,"will":0.0045045045045045045,"learn":0.0045045045045045045,"how":0.0045045045045045045,"construct":0.0045045045045045045,"constructing-post-conditions":0.0045045045045045045,"use":0.0045045045045045045,"using-post-conditions":0.0045045045045045045,"set":0.0045045045045045045,"post-condition":0.0045045045045045045,"mode":0.0045045045045045045,"setting-the-post-condition-mode":0.0045045045045045045,"usage":0.0045045045045045045,"examples":0.0045045045045045045,"usage-examples":0.0045045045045045045,"---":0.0045045045045045045,"constructing":0.0045045045045045045,"js":0.0045045045045045045,"can":0.0045045045045045045,"be":0.0045045045045045045,"constructed":0.0045045045045045045,"using":0.0045045045045045045,"pc":0.0045045045045045045,"helpers":0.0045045045045045045,"these":0.0045045045045045045,"are":0.0045045045045045045,"inspired":0.0045045045045045045,"by":0.0045045045045045045,"behavior":0.0045045045045045045,"driven":0.0045045045045045045,"development":0.0045045045045045045,"bdd":0.0045045045045045045,"start":0.0045045045045045045,"with":0.0045045045045045045,"principal":0.0045045045045045045,"initializer":0.0045045045045045045,"specify":0.0045045045045045045,"address":0.0045045045045045045,"verified":0.0045045045045045045,"then":0.0045045045045045045,"auto-complete":0.0045045045045045045,"rest":0.0045045045045045045,"added":0.0045045045045045045,"calls":0.0045045045045045045,"and":0.0045045045045045045,"ft":0.0045045045045045045,"nft":0.0045045045045045045,"transfers":0.0045045045045045045,"assets":0.0045045045045045045,"transferred":0.0045045045045045045,"specified":0.0045045045045045045,"for":0.0045045045045045045,"instance":0.0045045045045045045,"following":0.0045045045045045045,"ensures":0.0045045045045045045,"initiating":0.0045045045045045045,"transaction":0.0045045045045045045,"must":0.0045045045045045045,"send":0.0045045045045045045,"exactly":0.0045045045045045045,"ustx":0.0045045045045045045,"or":0.0045045045045045045,"else":0.0045045045045045045,"abort":0.0045045045045045045,"ts":0.0045045045045045045,"-cn":0.0045045045045045045,"transactions'":0.0045045045045045045,"const":0.0045045045045045045,"postcondition":0.0045045045045045045,"'stb44hypyat2bb2qe513nsp81htmywbjp02hpgk6'":0.0045045045045045045,"willsendeq":0.0045045045045045045,"title":0.0045045045045045045,"all":0.0045045045045045045,"transfer":0.0045045045045045045,"methods":0.0045045045045045045,"stx":0.0045045045045045045,"amount":0.0045045045045045045,"number":0.0045045045045045045,"sent":0.0045045045045045045,"is":0.0045045045045045045,"value":0.0045045045045045045,"willsendgte":0.0045045045045045045,"greater":0.0045045045045045045,"than":0.0045045045045045045,"equal":0.0045045045045045045,"willsendgt":0.0045045045045045045,"willsendlte":0.0045045045045045045,"less":0.0045045045045045045,"willsendlt":0.0045045045045045045,"asset":0.0045045045045045045,"_":0.0045045045045045045,"ends":0.0045045045045045045,"builder":0.0045045045045045045,"string":0.0045045045045045045,"tokenname":0.0045045045045045045,"a":0.0045045045045045045,"specific":0.0045045045045045045,"willsendasset":0.0045045045045045045,"should":0.0045045045045045045,"willnotsendasset":0.0045045045045045045,"not":0.0045045045045045045,"setting":0.0045045045045045045,"when":0.0045045045045045045,"creating":0.0045045045045045045,"allow":0.0045045045045045045,"deny":0.0045045045045045045,"whether":0.0045045045045045045,"unspecified":0.0045045045045045045,"permitted":0.0045045045045045045,"-n":0.0045045045045045045,"postconditionmode":0.0045045045045045045,"tx":0.0045045045045045045,"await":0.0045045045045045045,"makecontractcall":0.0045045045045045045,"essentially":0.0045045045045045045,"what":0.0045045045045045045,"tells":0.0045045045045045045,"node":0.0045045045045045045,"require":0.0045045045045045045,"ignore":0.0045045045045045045,"evaluating":0.0045045045045045045,"certain":0.0045045045045045045,"'stb44hypyat2bb2qe513nsp81htmywbjp02hpgk6":0.0045045045045045045,"token-ft'":0.0045045045045045045,"'token'":0.0045045045045045045,"sending":0.0045045045045045045,"not-sending":0.0045045045045045045,"token-nft":0.0045045045045045045,"token'":0.0045045045045045045,"cl":0.0045045045045045045,"uint":0.0045045045045045045,"sft":0.0045045045045045045,"semi-fungible":0.0045045045045045045,"token":0.0045045045045045045,"postconditionfornft":0.0045045045045045045,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.0045045045045045045,"semi-fungible-token":0.0045045045045045045,"semi-fungible-token-id":0.0045045045045045045,"tuple":0.0045045045045045045,"token-id":0.0045045045045045045,"owner":0.0045045045045045045,"postconditionforft":0.0045045045045045045,"callout":0.0045045045045045045,"note":0.0045045045045045045,"previous":0.0045045045045045045,"builders":0.0045045045045045045,"makestandardstxpostcondition":0.0045045045045045045,"makestandardfungiblepostcondition":0.0045045045045045045,"etc":0.0045045045045045045,"were":0.0045045045045045045,"removed":0.0045045045045045045,"v7":0.0045045045045045045,"next":0.0045045045045045045,"steps":0.0045045045045045045,"cards":0.0045045045045045045,"card":0.0045045045045045045,"href":0.0045045045045045045,"guides":0.0045045045045045045,"broadcast-transactions":0.0045045045045045045,"broadcast":0.0045045045045045045,"description":0.0045045045045045045,"packages":0.0045045045045045045,"api":0.0045045045045045045,"references":0.0045045045045045045,"dive":0.0045045045045045045,"deeper":0.0045045045045045045,"into":0.0045045045045045045,"package":0.0045045045045045045},"232":{"0":0.004273504273504274,"1":0.004273504273504274,"2":0.004273504273504274,"3":0.004273504273504274,"4":0.004273504273504274,"5":0.004273504273504274,"10":0.004273504273504274,"1000":0.004273504273504274,"import":0.004273504273504274,"badge":0.004273504273504274,"from":0.004273504273504274,"'":0.004273504273504274,"components":0.004273504273504274,"ui":0.004273504273504274,"badge'":0.004273504273504274,"accordion":0.004273504273504274,"accordions":0.004273504273504274,"'fumadocs-ui":0.004273504273504274,"accordion'":0.004273504273504274,"chevronright":0.004273504273504274,"code":0.004273504273504274,"terminal":0.004273504273504274,"'lucide-react'":0.004273504273504274,"file":0.004273504273504274,"folder":0.004273504273504274,"files":0.004273504273504274,"files'":0.004273504273504274,"using":0.004273504273504274,"stacks":0.004273504273504274,"js":0.004273504273504274,"with":0.004273504273504274,"react":0.004273504273504274,"native":0.004273504273504274,"allows":0.004273504273504274,"you":0.004273504273504274,"to":0.004273504273504274,"integrate":0.004273504273504274,"blockchain":0.004273504273504274,"functionalities":0.004273504273504274,"into":0.004273504273504274,"mobile":0.004273504273504274,"applications":0.004273504273504274,"in":0.004273504273504274,"this":0.004273504273504274,"guide":0.004273504273504274,"will":0.004273504273504274,"learn":0.004273504273504274,"how":0.004273504273504274,"set":0.004273504273504274,"up":0.004273504273504274,"the":0.004273504273504274,"expo":0.004273504273504274,"project":0.004273504273504274,"set-up-the-expo-project":0.004273504273504274,"install":0.004273504273504274,"necessary":0.004273504273504274,"dependencies":0.004273504273504274,"install-necessary-dependencies":0.004273504273504274,"add":0.004273504273504274,"nodejs":0.004273504273504274,"polyfills":0.004273504273504274,"add-nodejs-polyfills":0.004273504273504274,"global":0.004273504273504274,"add-global-polyfills":0.004273504273504274,"use":0.004273504273504274,"use-stacksjs-in-the-project":0.004273504273504274,"callout":0.004273504273504274,"see":0.004273504273504274,"action":0.004273504273504274,"check":0.004273504273504274,"out":0.004273504273504274,"a":0.004273504273504274,"full":0.004273504273504274,"example":0.004273504273504274,"here":0.004273504273504274,"https":0.004273504273504274,"github":0.004273504273504274,"com":0.004273504273504274,"hirosystems":0.004273504273504274,"js-react-native-expo-51":0.004273504273504274,"---":0.004273504273504274,"start":0.004273504273504274,"by":0.004273504273504274,"creating":0.004273504273504274,"new":0.004273504273504274,"create-expo-app":0.004273504273504274,"npx":0.004273504273504274,"latest":0.004273504273504274,"generate":0.004273504273504274,"boilerplate":0.004273504273504274,"can":0.004273504273504274,"run":0.004273504273504274,"npm":0.004273504273504274,"and":0.004273504273504274,"connect":0.004273504273504274,"device":0.004273504273504274,"for":0.004273504273504274,"previewing":0.004273504273504274,"via":0.004273504273504274,"shown":0.004273504273504274,"qr":0.004273504273504274,"libraries":0.004273504273504274,"along":0.004273504273504274,"other":0.004273504273504274,"needed":0.004273504273504274,"polyfilling":0.004273504273504274,"browser-specific":0.004273504273504274,"nodejs-specific":0.004273504273504274,"apis":0.004273504273504274,"transactions":0.004273504273504274,"wallet-sdk":0.004273504273504274,"--save-dev":0.004273504273504274,"buffer":0.004273504273504274,"process":0.004273504273504274,"react-native-get-random-values":0.004273504273504274,"text-encoding":0.004273504273504274,"readable-stream":0.004273504273504274,"crypto-browserify":0.004273504273504274,"peculiar":0.004273504273504274,"webcrypto":0.004273504273504274,"modify":0.004273504273504274,"project's":0.004273504273504274,"metro":0.004273504273504274,"configuration":0.004273504273504274,"include":0.004273504273504274,"missing":0.004273504273504274,"modules":0.004273504273504274,"customize":0.004273504273504274,"config":0.004273504273504274,"-cn":0.004273504273504274,"const":0.004273504273504274,"getdefaultconfig":0.004273504273504274,"require":0.004273504273504274,"metro-config":0.004273504273504274,"__dirname":0.004273504273504274,"resolver":0.004273504273504274,"extranodemodules":0.004273504273504274,"stream":0.004273504273504274,"resolve":0.004273504273504274,"crypto":0.004273504273504274,"module":0.004273504273504274,"exports":0.004273504273504274,"update":0.004273504273504274,"entry":0.004273504273504274,"point":0.004273504273504274,"create":0.004273504273504274,"polyfill":0.004273504273504274,"index":0.004273504273504274,"package":0.004273504273504274,"json":0.004273504273504274,"textdecoder":0.004273504273504274,"textencoder":0.004273504273504274,"object":0.004273504273504274,"assign":0.004273504273504274,"expo-router":0.004273504273504274,"main":0.004273504273504274,"ensure":0.004273504273504274,"that":0.004273504273504274,"live":0.004273504273504274,"their":0.004273504273504274,"own":0.004273504273504274,"as":0.004273504273504274,"specified":0.004273504273504274,"avoid":0.004273504273504274,"any":0.004273504273504274,"runtime":0.004273504273504274,"issues":0.004273504273504274,"edit":0.004273504273504274,"app":0.004273504273504274,"tabs":0.004273504273504274,"tsx":0.004273504273504274,"starting":0.004273504273504274,"imports":0.004273504273504274,"transactionversion":0.004273504273504274,"getaddressfromprivatekey":0.004273504273504274,"makestxtokentransfer":0.004273504273504274,"wallet":0.004273504273504274,"generatesecretkey":0.004273504273504274,"generatewallet":0.004273504273504274,"usestate":0.004273504273504274,"now":0.004273504273504274,"manage":0.004273504273504274,"state":0.004273504273504274,"follows":0.004273504273504274,"export":0.004273504273504274,"default":0.004273504273504274,"function":0.004273504273504274,"homescreen":0.004273504273504274,"mnemonic":0.004273504273504274,"setmnemonic":0.004273504273504274,"setwallet":0.004273504273504274,"null":0.004273504273504274,"log":0.004273504273504274,"setlog":0.004273504273504274,"next":0.004273504273504274,"sign":0.004273504273504274,"transaction":0.004273504273504274,"async":0.004273504273504274,"await":0.004273504273504274,"secretkey":0.004273504273504274,"password":0.004273504273504274,"amount":0.004273504273504274,"anchormode":0.004273504273504274,"recipient":0.004273504273504274,"sp3w993d3brdyb284cy3sbfdegtc5xedjpdea21cn":0.004273504273504274,"senderkey":0.004273504273504274,"accounts":0.004273504273504274,"stxprivatekey":0.004273504273504274,"fee":0.004273504273504274,"network":0.004273504273504274,"mainnet":0.004273504273504274,"nonce":0.004273504273504274,"signed":0.004273504273504274,"successfully":0.004273504273504274,"lastly":0.004273504273504274,"themedview":0.004273504273504274,"themedtext":0.004273504273504274,"type":0.004273504273504274,"subtitle":0.004273504273504274,"seed":0.004273504273504274,"phrase":0.004273504273504274,"button":0.004273504273504274,"title":0.004273504273504274,"onpress":0.004273504273504274,"address":0.004273504273504274,"steps":0.004273504273504274,"cards":0.004273504273504274,"card":0.004273504273504274,"href":0.004273504273504274,"packages":0.004273504273504274,"api":0.004273504273504274,"references":0.004273504273504274,"description":0.004273504273504274,"dive":0.004273504273504274},"233":{"0":0.0027472527472527475,"1":0.0027472527472527475,"2":0.0027472527472527475,"3":0.0027472527472527475,"4":0.0027472527472527475,"8":0.0027472527472527475,"10":0.0027472527472527475,"32":0.0027472527472527475,"144":0.0027472527472527475,"import":0.0027472527472527475,"accordion":0.0027472527472527475,"accordions":0.0027472527472527475,"from":0.0027472527472527475,"'fumadocs-ui":0.0027472527472527475,"components":0.0027472527472527475,"accordion'":0.0027472527472527475,"badge":0.0027472527472527475,"'":0.0027472527472527475,"ui":0.0027472527472527475,"badge'":0.0027472527472527475,"inlinecode":0.0027472527472527475,"inline-code'":0.0027472527472527475,"callout":0.0027472527472527475,"installation":0.0027472527472527475,"package-install":0.0027472527472527475,"sbtc":0.0027472527472527475,"architecture":0.0027472527472527475,"the":0.0027472527472527475,"protocol":0.0027472527472527475,"operates":0.0027472527472527475,"across":0.0027472527472527475,"multiple":0.0027472527472527475,"layers":0.0027472527472527475,"-":0.0027472527472527475,"bitcoin":0.0027472527472527475,"original":0.0027472527472527475,"funds":0.0027472527472527475,"are":0.0027472527472527475,"sourced":0.0027472527472527475,"a":0.0027472527472527475,"depositor":0.0027472527472527475,"sends":0.0027472527472527475,"these":0.0027472527472527475,"to":0.0027472527472527475,"group":0.0027472527472527475,"of":0.0027472527472527475,"signers":0.0027472527472527475,"which":0.0027472527472527475,"manage":0.0027472527472527475,"rotating":0.0027472527472527475,"multisignature":0.0027472527472527475,"address":0.0027472527472527475,"formatted":0.0027472527472527475,"for":0.0027472527472527475,"transactions":0.0027472527472527475,"api":0.0027472527472527475,"emily":0.0027472527472527475,"this":0.0027472527472527475,"is":0.0027472527472527475,"responsible":0.0027472527472527475,"tracking":0.0027472527472527475,"deposits":0.0027472527472527475,"and":0.0027472527472527475,"notifying":0.0027472527472527475,"about":0.0027472527472527475,"pending":0.0027472527472527475,"stacks":0.0027472527472527475,"network":0.0027472527472527475,"where":0.0027472527472527475,"minted":0.0027472527472527475,"once":0.0027472527472527475,"deposit":0.0027472527472527475,"confirmed":0.0027472527472527475,"mint":0.0027472527472527475,"corresponding":0.0027472527472527475,"amount":0.0027472527472527475,"depositor's":0.0027472527472527475,"specified":0.0027472527472527475,"on":0.0027472527472527475,"flow":0.0027472527472527475,"create":0.0027472527472527475,"transaction":0.0027472527472527475,"structure":0.0027472527472527475,"send":0.0027472527472527475,"use":0.0027472527472527475,"specialized":0.0027472527472527475,"format":0.0027472527472527475,"that":0.0027472527472527475,"includes":0.0027472527472527475,"script":0.0027472527472527475,"identifies":0.0027472527472527475,"will":0.0027472527472527475,"be":0.0027472527472527475,"what":0.0027472527472527475,"maximum":0.0027472527472527475,"fee":0.0027472527472527475,"in":0.0027472527472527475,"satoshis":0.0027472527472527475,"may":0.0027472527472527475,"take":0.0027472527472527475,"exchange":0.0027472527472527475,"minting":0.0027472527472527475,"reclaim":0.0027472527472527475,"allows":0.0027472527472527475,"sender":0.0027472527472527475,"their":0.0027472527472527475,"if":0.0027472527472527475,"not":0.0027472527472527475,"processed":0.0027472527472527475,"by":0.0027472527472527475,"sign":0.0027472527472527475,"broadcast":0.0027472527472527475,"with":0.0027472527472527475,"sender's":0.0027472527472527475,"private":0.0027472527472527475,"key":0.0027472527472527475,"regtest":0.0027472527472527475,"testnet":0.0027472527472527475,"notify":0.0027472527472527475,"inform":0.0027472527472527475,"submitting":0.0027472527472527475,"its":0.0027472527472527475,"details":0.0027472527472527475,"step":0.0027472527472527475,"ensures":0.0027472527472527475,"aware":0.0027472527472527475,"can":0.0027472527472527475,"track":0.0027472527472527475,"it":0.0027472527472527475,"processing":0.0027472527472527475,"no":0.0027472527472527475,"action":0.0027472527472527475,"required":0.0027472527472527475,"retrieve":0.0027472527472527475,"verify":0.0027472527472527475,"blockchain":0.0027472527472527475,"verified":0.0027472527472527475,"equivalent":0.0027472527472527475,"receive":0.0027472527472527475,"sent":0.0027472527472527475,"designated":0.0027472527472527475,"completing":0.0027472527472527475,"process":0.0027472527472527475,"sip-010":0.0027472527472527475,"compatible":0.0027472527472527475,"show":0.0027472527472527475,"up":0.0027472527472527475,"wallets":0.0027472527472527475,"explorers":0.0027472527472527475,"withdrawal":0.0027472527472527475,"_coming":0.0027472527472527475,"soon_":0.0027472527472527475,"package":0.0027472527472527475,"functions":0.0027472527472527475,"exports":0.0027472527472527475,"high-level":0.0027472527472527475,"building":0.0027472527472527475,"addresses":0.0027472527472527475,"examples":0.0027472527472527475,"buildsbtcdepositaddress":0.0027472527472527475,"build":0.0027472527472527475,"metadata":0.0027472527472527475,"using":0.0027472527472527475,"wallet":0.0027472527472527475,"provider":0.0027472527472527475,"sendtransfer":0.0027472527472527475,"ts":0.0027472527472527475,"sbtcapiclienttestnet":0.0027472527472527475,"'sbtc'":0.0027472527472527475,"const":0.0027472527472527475,"client":0.0027472527472527475,"new":0.0027472527472527475,"stacksaddress":0.0027472527472527475,"target_stx_address":0.0027472527472527475,"signerspublickey":0.0027472527472527475,"await":0.0027472527472527475,"fetchsignerspublickey":0.0027472527472527475,"optional":0.0027472527472527475,"defaults":0.0027472527472527475,"maxsignerfee":0.0027472527472527475,"80_000":0.0027472527472527475,"pay":0.0027472527472527475,"taken":0.0027472527472527475,"sats":0.0027472527472527475,"reclaimlocktime":0.0027472527472527475,"6_000":0.0027472527472527475,"lock":0.0027472527472527475,"time":0.0027472527472527475,"here":0.0027472527472527475,"aka":0.0027472527472527475,"as":0.0027472527472527475,"an":0.0027472527472527475,"output":0.0027472527472527475,"your":0.0027472527472527475,"favorite":0.0027472527472527475,"typically":0.0027472527472527475,"also":0.0027472527472527475,"broadcasted":0.0027472527472527475,"txid":0.0027472527472527475,"walletprovider":0.0027472527472527475,"recipient":0.0027472527472527475,"100_000":0.0027472527472527475,"notifysbtc":0.0027472527472527475,"buildsbtcdeposittx":0.0027472527472527475,"function":0.0027472527472527475,"similar":0.0027472527472527475,"but":0.0027472527472527475,"instead":0.0027472527472527475,"returning":0.0027472527472527475,"just":0.0027472527472527475,"constructs":0.0027472527472527475,"complete":0.0027472527472527475,"depositing":0.0027472527472527475,"amountsats":0.0027472527472527475,"deposit_amount":0.0027472527472527475,"same":0.0027472527472527475,"options":0.0027472527472527475,"has":0.0027472527472527475,"one":0.0027472527472527475,"combined":0.0027472527472527475,"taproot":0.0027472527472527475,"scripts":0.0027472527472527475,"your_btc_private_key":0.0027472527472527475,"finalize":0.0027472527472527475,"or":0.0027472527472527475,"via":0.0027472527472527475,"external":0.0027472527472527475,"psbtbytes":0.0027472527472527475,"topsbt":0.0027472527472527475,"broadcasttx":0.0027472527472527475,"sbtcdeposithelper":0.0027472527472527475,"fully-formed":0.0027472527472527475,"assuming":0.0027472527472527475,"spendable":0.0027472527472527475,"utxos":0.0027472527472527475,"helper":0.0027472527472527475,"you":0.0027472527472527475,"given":0.0027472527472527475,"5_000_000":0.0027472527472527475,"pub":0.0027472527472527475,"aggregated":0.0027472527472527475,"public":0.0027472527472527475,"feerate":0.0027472527472527475,"fetchfeerate":0.0027472527472527475,"'medium'":0.0027472527472527475,"fetchutxos":0.0027472527472527475,"your_btc_address":0.0027472527472527475,"bitcoinchangeaddress":0.0027472527472527475,"console":0.0027472527472527475,"log":0.0027472527472527475,"'txid'":0.0027472527472527475,"res":0.0027472527472527475,"'res'":0.0027472527472527475,"status":0.0027472527472527475,"statusmessage":0.0027472527472527475,"http":0.0027472527472527475,"clients":0.0027472527472527475,"additionally":0.0027472527472527475,"there":0.0027472527472527475,"two":0.0027472527472527475,"helpers":0.0027472527472527475,"make":0.0027472527472527475,"easier":0.0027472527472527475,"get":0.0027472527472527475,"all":0.0027472527472527475,"data":0.0027472527472527475,"needed":0.0027472527472527475,"above":0.0027472527472527475,"sbtcapiclientmainnet":0.0027472527472527475,"communicating":0.0027472527472527475,"different":0.0027472527472527475,"pieces":0.0027472527472527475,"deployment":0.0027472527472527475,"sbtcapiclientdevenv":0.0027472527472527475,"developing":0.0027472527472527475,"against":0.0027472527472527475,"local":0.0027472527472527475,"while":0.0027472527472527475,"final":0.0027472527472527475,"adjustments":0.0027472527472527475,"still":0.0027472527472527475,"being":0.0027472527472527475,"made":0.0027472527472527475,"pre-release":0.0027472527472527475,"phase":0.0027472527472527475,"change":0.0027472527472527475,"default":0.0027472527472527475,"urls":0.0027472527472527475,"contract":0.0027472527472527475,"every":0.0027472527472527475,"minor":0.0027472527472527475,"release":0.0027472527472527475,"version":0.0027472527472527475,"purpose":0.0027472527472527475,"functionality":0.0027472527472527475,"---":0.0027472527472527475,"x":0.0027472527472527475,"developer":0.0027472527472527475,"hackathon":0.0027472527472527475,"only":0.0027472527472527475,"mainnet":0.0027472527472527475,"fetches":0.0027472527472527475,"fetchsignersaddress":0.0027472527472527475,"p2tr":0.0027472527472527475,"'low'":0.0027472527472527475,"'high'":0.0027472527472527475,"unspents":0.0027472527472527475,"btc_address":0.0027472527472527475,"hex":0.0027472527472527475,"fetchtxhex":0.0027472527472527475,"deposit_btc_tx":0.0027472527472527475,"btc":0.0027472527472527475,"otherwise":0.0027472527472527475,"won't":0.0027472527472527475,"sbtcbalance":0.0027472527472527475,"fetchsbtcbalance":0.0027472527472527475,"stx_address":0.0027472527472527475,"fetch":0.0027472527472527475,"balance":0.0027472527472527475,"reference":0.0027472527472527475,"parameter":0.0027472527472527475,"description":0.0027472527472527475,"type":0.0027472527472527475,"schnorr":0.0027472527472527475,"string":0.0027472527472527475,"byte":0.0027472527472527475,"denominated":0.0027472527472527475,"number":0.0027472527472527475,"bigint":0.0027472527472527475,"rate":0.0027472527472527475,"sat":0.0027472527472527475,"vbyte":0.0027472527472527475,"fund":0.0027472527472527475,"utxowithtx":0.0027472527472527475,"reclaimpublickey":0.0027472527472527475,"x-only":0.0027472527472527475,"reclaiming":0.0027472527472527475,"failed":0.0027472527472527475,"bitcoinnetwork":0.0027472527472527475,"utxotospendable":0.0027472527472527475,"convert":0.0027472527472527475,"p2wpk":0.0027472527472527475,"p2sh":0.0027472527472527475,"inputs":0.0027472527472527475,"best":0.0027472527472527475,"effort":0.0027472527472527475,"implementation":0.0027472527472527475,"paymentpublickey":0.0027472527472527475,"payment":0.0027472527472527475,"currently":0.0027472527472527475,"used":0.0027472527472527475,"sh":0.0027472527472527475,"sbtcapiclient":0.0027472527472527475,"configuration":0.0027472527472527475,"sbtccontract":0.0027472527472527475,"multisig":0.0027472527472527475,"initial":0.0027472527472527475,"sbtcapiurl":0.0027472527472527475,"base":0.0027472527472527475,"url":0.0027472527472527475,"btcapiurl":0.0027472527472527475,"mempool":0.0027472527472527475,"electrs":0.0027472527472527475,"stxapiurl":0.0027472527472527475},"234":{"0":0.0018484288354898336,"1":0.0018484288354898336,"2":0.0018484288354898336,"3":0.0018484288354898336,"7":0.0018484288354898336,"10":0.0018484288354898336,"102":0.0018484288354898336,"111":0.0018484288354898336,"import":0.0018484288354898336,"root":0.0018484288354898336,"api":0.0018484288354898336,"apiexample":0.0018484288354898336,"from":0.0018484288354898336,"'fumadocs-openapi":0.0018484288354898336,"ui'":0.0018484288354898336,"property":0.0018484288354898336,"accordion":0.0018484288354898336,"accordions":0.0018484288354898336,"'fumadocs-ui":0.0018484288354898336,"components":0.0018484288354898336,"accordion'":0.0018484288354898336,"tabs":0.0018484288354898336,"tabscontent":0.0018484288354898336,"tabslist":0.0018484288354898336,"tabstrigger":0.0018484288354898336,"'":0.0018484288354898336,"ui":0.0018484288354898336,"tabs'":0.0018484288354898336,"badge":0.0018484288354898336,"badge'":0.0018484288354898336,"inlinecode":0.0018484288354898336,"inline-code'":0.0018484288354898336,"callout":0.0018484288354898336,"type":0.0018484288354898336,"info":0.0018484288354898336,"this":0.0018484288354898336,"reference":0.0018484288354898336,"refers":0.0018484288354898336,"to":0.0018484288354898336,"the":0.0018484288354898336,"x":0.0018484288354898336,"release":0.0018484288354898336,"of":0.0018484288354898336,"stacks":0.0018484288354898336,"js":0.0018484288354898336,"it's":0.0018484288354898336,"recommended":0.0018484288354898336,"version":0.0018484288354898336,"use":0.0018484288354898336,"but":0.0018484288354898336,"not":0.0018484288354898336,"needed":0.0018484288354898336,"for":0.0018484288354898336,"nakamoto":0.0018484288354898336,"read":0.0018484288354898336,"migration":0.0018484288354898336,"guide":0.0018484288354898336,"https":0.0018484288354898336,"github":0.0018484288354898336,"com":0.0018484288354898336,"hirosystems":0.0018484288354898336,"blob":0.0018484288354898336,"main":0.0018484288354898336,"md":0.0018484288354898336,"stacksjs-5xx--7xx":0.0018484288354898336,"learn":0.0018484288354898336,"how":0.0018484288354898336,"update":0.0018484288354898336,"latest":0.0018484288354898336,"installation":0.0018484288354898336,"package-install":0.0018484288354898336,"transactions":0.0018484288354898336,"library":0.0018484288354898336,"supports":0.0018484288354898336,"creation":0.0018484288354898336,"following":0.0018484288354898336,"transaction":0.0018484288354898336,"types":0.0018484288354898336,"stx":0.0018484288354898336,"token":0.0018484288354898336,"transfer":0.0018484288354898336,"smart":0.0018484288354898336,"contract":0.0018484288354898336,"deploy":0.0018484288354898336,"function":0.0018484288354898336,"call":0.0018484288354898336,"key":0.0018484288354898336,"generation":0.0018484288354898336,"typescript":0.0018484288354898336,"-n":0.0018484288354898336,"randomprivatekey":0.0018484288354898336,"privatekeytopublickey":0.0018484288354898336,"transactions'":0.0018484288354898336,"random":0.0018484288354898336,"const":0.0018484288354898336,"privatekey":0.0018484288354898336,"publickey":0.0018484288354898336,"private":0.0018484288354898336,"hex":0.0018484288354898336,"string":0.0018484288354898336,"'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01'":0.0018484288354898336,"makestxtokentransfer":0.0018484288354898336,"org":0.0018484288354898336,"functions":0.0018484288354898336,"_stacks_transactions":0.0018484288354898336,"with":0.0018484288354898336,"a":0.0018484288354898336,"sender":0.0018484288354898336,"or":0.0018484288354898336,"unsigned":0.0018484288354898336,"makeunsignedstxtokentransfer":0.0018484288354898336,"public":0.0018484288354898336,"without":0.0018484288354898336,"yet":0.0018484288354898336,"signing":0.0018484288354898336,"create":0.0018484288354898336,"ts":0.0018484288354898336,"broadcasttransaction":0.0018484288354898336,"txoptions":0.0018484288354898336,"recipient":0.0018484288354898336,"'sp3fgq8z7jy9bwyz5wm53e0m9nk7whjf0691nz159'":0.0018484288354898336,"amount":0.0018484288354898336,"12345n":0.0018484288354898336,"memo":0.0018484288354898336,"'test":0.0018484288354898336,"memo'":0.0018484288354898336,"senderkey":0.0018484288354898336,"network":0.0018484288354898336,"'testnet'":0.0018484288354898336,"mainnet":0.0018484288354898336,"'mainnet'":0.0018484288354898336,"await":0.0018484288354898336,"see":0.0018484288354898336,"raw":0.0018484288354898336,"serialized":0.0018484288354898336,"tx":0.0018484288354898336,"serializedtx":0.0018484288354898336,"serialize":0.0018484288354898336,"broadcast":0.0018484288354898336,"response":0.0018484288354898336,"console":0.0018484288354898336,"log":0.0018484288354898336,"txid":0.0018484288354898336,"makecontractdeploy":0.0018484288354898336,"makeunsignedcontractdeploy":0.0018484288354898336,"readfilesync":0.0018484288354898336,"'fs'":0.0018484288354898336,"claritycode":0.0018484288354898336,"path":0.0018484288354898336,"clar'":0.0018484288354898336,"tostring":0.0018484288354898336,"contractname":0.0018484288354898336,"'contract_name'":0.0018484288354898336,"codebody":0.0018484288354898336,"clarityversion":0.0018484288354898336,"optional":0.0018484288354898336,"defaults":0.0018484288354898336,"deployed":0.0018484288354898336,"on-chain":0.0018484288354898336,"if":0.0018484288354898336,"you":0.0018484288354898336,"want":0.0018484288354898336,"readonly":0.0018484288354898336,"fetchcallreadonlyfunction":0.0018484288354898336,"instead":0.0018484288354898336,"makecontractcall":0.0018484288354898336,"makeunsignedcontractcall":0.0018484288354898336,"cl":0.0018484288354898336,"pc":0.0018484288354898336,"add":0.0018484288354898336,"an":0.0018484288354898336,"post":0.0018484288354898336,"condition":0.0018484288354898336,"condition01":0.0018484288354898336,"principal":0.0018484288354898336,"'sp2zd731anqzt6j4k3f5n8a40zxwxc1xfxhvvqfke'":0.0018484288354898336,"willsendgte":0.0018484288354898336,"1000000n":0.0018484288354898336,"ustx":0.0018484288354898336,"contractaddress":0.0018484288354898336,"'spbmrfrppgcde3f384wcjpk8pqjgz8k9qkk7f59x'":0.0018484288354898336,"functionname":0.0018484288354898336,"'contract_function'":0.0018484288354898336,"functionargs":0.0018484288354898336,"bufferfromutf8":0.0018484288354898336,"'foo":0.0018484288354898336,"string'":0.0018484288354898336,"postconditions":0.0018484288354898336,"validatewithabi":0.0018484288354898336,"true":0.0018484288354898336,"check":0.0018484288354898336,"arguments":0.0018484288354898336,"given":0.0018484288354898336,"are":0.0018484288354898336,"compatible":0.0018484288354898336,"in":0.0018484288354898336,"example":0.0018484288354898336,"we":0.0018484288354898336,"construct":0.0018484288354898336,"contract-call":0.0018484288354898336,"have":0.0018484288354898336,"set":0.0018484288354898336,"option":0.0018484288354898336,"so":0.0018484288354898336,"builder":0.0018484288354898336,"will":0.0018484288354898336,"attempt":0.0018484288354898336,"fetch":0.0018484288354898336,"contracts":0.0018484288354898336,"abi":0.0018484288354898336,"specified":0.0018484288354898336,"and":0.0018484288354898336,"validate":0.0018484288354898336,"that":0.0018484288354898336,"provided":0.0018484288354898336,"match":0.0018484288354898336,"what":0.0018484288354898336,"is":0.0018484288354898336,"described":0.0018484288354898336,"should":0.0018484288354898336,"help":0.0018484288354898336,"avoid":0.0018484288354898336,"constructing":0.0018484288354898336,"invalid":0.0018484288354898336,"would":0.0018484288354898336,"prefer":0.0018484288354898336,"provide":0.0018484288354898336,"your":0.0018484288354898336,"own":0.0018484288354898336,"fetching":0.0018484288354898336,"it":0.0018484288354898336,"also":0.0018484288354898336,"accepts":0.0018484288354898336,"clarityabi":0.0018484288354898336,"interfaces":0.0018484288354898336,"objects":0.0018484288354898336,"sponsoring":0.0018484288354898336,"generate":0.0018484288354898336,"sponsored":0.0018484288354898336,"first":0.0018484288354898336,"sign":0.0018484288354898336,"as":0.0018484288354898336,"origin":0.0018484288354898336,"options":0.0018484288354898336,"object":0.0018484288354898336,"must":0.0018484288354898336,"be":0.0018484288354898336,"can't":0.0018484288354898336,"before":0.0018484288354898336,"they":0.0018484288354898336,"can":0.0018484288354898336,"now":0.0018484288354898336,"passed":0.0018484288354898336,"party":0.0018484288354898336,"which":0.0018484288354898336,"sponsor":0.0018484288354898336,"portion":0.0018484288354898336,"fee":0.0018484288354898336,"sponsortransaction":0.0018484288354898336,"deserializedtx":0.0018484288354898336,"deserializetransaction":0.0018484288354898336,"sponsorkey":0.0018484288354898336,"'770287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01'":0.0018484288354898336,"1000n":0.0018484288354898336,"sponsoroptions":0.0018484288354898336,"sponsorprivatekey":0.0018484288354898336,"sponsornonce":0.0018484288354898336,"sponsoredtx":0.0018484288354898336,"supporting":0.0018484288354898336,"multi-signature":0.0018484288354898336,"multi-sig":0.0018484288354898336,"numsignatures":0.0018484288354898336,"publickeys":0.0018484288354898336,"properties":0.0018484288354898336,"createstacksprivatekey":0.0018484288354898336,"pubkeyfromprivkey":0.0018484288354898336,"publickeytostring":0.0018484288354898336,"transactionsigner":0.0018484288354898336,"standardprincipalcv":0.0018484288354898336,"bytesreader":0.0018484288354898336,"anchormode":0.0018484288354898336,"'sp3fgq8":0.0018484288354898336,"2500000n":0.0018484288354898336,"0n":0.0018484288354898336,"keys":0.0018484288354898336,"participants":0.0018484288354898336,"privkeystrings":0.0018484288354898336,"'6d430bb9":0.0018484288354898336,"'2a584d89":0.0018484288354898336,"'d5200dee":0.0018484288354898336,"array":0.0018484288354898336,"privkeys":0.0018484288354898336,"map":0.0018484288354898336,"corresponding":0.0018484288354898336,"pubkeys":0.0018484288354898336,"pubkeystrings":0.0018484288354898336,"number":0.0018484288354898336,"signature":0.0018484288354898336,"required":0.0018484288354898336,"elements":0.0018484288354898336,"any":0.0018484288354898336,"payload":0.0018484288354898336,"along":0.0018484288354898336,"other":0.0018484288354898336,"addition":0.0018484288354898336,"meeting":0.0018484288354898336,"requirement":0.0018484288354898336,"parties":0.0018484288354898336,"who":0.0018484288354898336,"did":0.0018484288354898336,"appended":0.0018484288354898336,"deserialize":0.0018484288354898336,"new":0.0018484288354898336,"partially":0.0018484288354898336,"signed":0.0018484288354898336,"deserialized":0.0018484288354898336,"signatures":0.0018484288354898336,"signer":0.0018484288354898336,"signorigin":0.0018484288354898336,"second":0.0018484288354898336,"after":0.0018484288354898336,"appendorigin":0.0018484288354898336,"serializedsignedtx":0.0018484288354898336,"calling":0.0018484288354898336,"read-only":0.0018484288354898336,"called":0.0018484288354898336,"generating":0.0018484288354898336,"broadcasting":0.0018484288354898336,"works":0.0018484288354898336,"via":0.0018484288354898336,"direct":0.0018484288354898336,"node":0.0018484288354898336,"buffercvfromstring":0.0018484288354898336,"callreadonlyfunction":0.0018484288354898336,"stackstestnet":0.0018484288354898336,"network'":0.0018484288354898336,"'st3kc0mtnw34s1zxd36jykfd3jjmwa01m55dsj4je'":0.0018484288354898336,"'kv-store'":0.0018484288354898336,"'get-value'":0.0018484288354898336,"buffer":0.0018484288354898336,"'foo'":0.0018484288354898336,"senderaddress":0.0018484288354898336,"'st2f4bk4gzh6yfbnhyddgn4t1rkba7da1bjzpjejj'":0.0018484288354898336,"result":0.0018484288354898336,"clarity":0.0018484288354898336,"values":0.0018484288354898336,"building":0.0018484288354898336,"requires":0.0018484288354898336,"valid":0.0018484288354898336,"pass":0.0018484288354898336,"system":0.0018484288354898336,"stacksgov":0.0018484288354898336,"sips":0.0018484288354898336,"master":0.0018484288354898336,"sip":0.0018484288354898336,"sip-002-smart-contract-language":0.0018484288354898336,"clarity-type-system":0.0018484288354898336,"contains":0.0018484288354898336,"-":0.0018484288354898336,"tuple":0.0018484288354898336,"key-name-0":0.0018484288354898336,"key-type-0":0.0018484288354898336,"key-name-1":0.0018484288354898336,"key-type-1":0.0018484288354898336,"typed":0.0018484288354898336,"named":0.0018484288354898336,"fields":0.0018484288354898336,"list":0.0018484288354898336,"max-len":0.0018484288354898336,"entry-type":0.0018484288354898336,"maximum":0.0018484288354898336,"length":0.0018484288354898336,"entries":0.0018484288354898336,"ok-type":0.0018484288354898336,"err-type":0.0018484288354898336,"used":0.0018484288354898336,"by":0.0018484288354898336,"commit":0.0018484288354898336,"their":0.0018484288354898336,"changes":0.0018484288354898336,"abort":0.0018484288354898336,"may":0.0018484288354898336,"returned":0.0018484288354898336,"well":0.0018484288354898336,"however":0.0018484288354898336,"only":0.0018484288354898336,"behavior":0.0018484288354898336,"some-type":0.0018484288354898336,"either":0.0018484288354898336,"some":0.0018484288354898336,"value":0.0018484288354898336,"none":0.0018484288354898336,"buff":0.0018484288354898336,"byte":0.0018484288354898336,"representing":0.0018484288354898336,"whether":0.0018484288354898336,"standard":0.0018484288354898336,"bool":0.0018484288354898336,"boolean":0.0018484288354898336,"false":0.0018484288354898336,"int":0.0018484288354898336,"128-bit":0.0018484288354898336,"integer":0.0018484288354898336,"uint":0.0018484288354898336,"classes":0.0018484288354898336,"order":0.0018484288354898336,"make":0.0018484288354898336,"easy":0.0018484288354898336,"well-typed":0.0018484288354898336,"javascript":0.0018484288354898336,"these":0.0018484288354898336,"all":0.0018484288354898336,"extend":0.0018484288354898336,"abstract":0.0018484288354898336,"class":0.0018484288354898336,"clarityvalue":0.0018484288354898336,"truecv":0.0018484288354898336,"falsecv":0.0018484288354898336,"nonecv":0.0018484288354898336,"somecv":0.0018484288354898336,"intcv":0.0018484288354898336,"uintcv":0.0018484288354898336,"contractprincipalcv":0.0018484288354898336,"responseerrorcv":0.0018484288354898336,"responseokcv":0.0018484288354898336,"listcv":0.0018484288354898336,"tuplecv":0.0018484288354898336,"buffercv":0.0018484288354898336,"utf8tobytes":0.0018484288354898336,"common'":0.0018484288354898336,"t":0.0018484288354898336,"f":0.0018484288354898336,"nothing":0.0018484288354898336,"something":0.0018484288354898336,"existing":0.0018484288354898336,"bytes":0.0018484288354898336,"uint8array":0.0018484288354898336,"bufcv":0.0018484288354898336,"i":0.0018484288354898336,"-10":0.0018484288354898336,"u":0.0018484288354898336,"address":0.0018484288354898336,"'sp2jxkmsh007npyaqhkjpqmaqyad90nqgtvjvq02b'":0.0018484288354898336,"'contract-name'":0.0018484288354898336,"spcv":0.0018484288354898336,"cpcv":0.0018484288354898336,"errcv":0.0018484288354898336,"okcv":0.0018484288354898336,"tupcv":0.0018484288354898336,"b":0.0018484288354898336,"c":0.0018484288354898336,"l":0.0018484288354898336,"develop":0.0018484288354898336,"checker":0.0018484288354898336,"prevent":0.0018484288354898336,"creating":0.0018484288354898336,"wrongly-typed":0.0018484288354898336,"code":0.0018484288354898336,"won't":0.0018484288354898336,"compile":0.0018484288354898336,"since":0.0018484288354898336,"lists":0.0018484288354898336,"homogeneous":0.0018484288354898336,"meaning":0.0018484288354898336,"contain":0.0018484288354898336,"single":0.0018484288354898336,"important":0.0018484288354898336,"include":0.0018484288354898336,"variable":0.0018484288354898336,"booleancv":0.0018484288354898336,"otherwise":0.0018484288354898336,"know":0.0018484288354898336,"enforce":0.0018484288354898336,"homogeneity":0.0018484288354898336,"conditions":0.0018484288354898336,"three":0.0018484288354898336,"added":0.0018484288354898336,"fungible":0.0018484288354898336,"non-fungible":0.0018484288354898336,"details":0.0018484288354898336,"sip-005":0.0018484288354898336,"sip-005-blocks-and-transactions":0.0018484288354898336,"transaction-post-conditions":0.0018484288354898336,"fungibleconditioncode":0.0018484288354898336,"makestandardstxpostcondition":0.0018484288354898336,"makecontractstxpostcondition":0.0018484288354898336,"postconditionaddress":0.0018484288354898336,"postconditioncode":0.0018484288354898336,"greaterequal":0.0018484288354898336,"postconditionamount":0.0018484288354898336,"standardstxpostcondition":0.0018484288354898336,"'test-contract'":0.0018484288354898336,"contractstxpostcondition":0.0018484288354898336,"createassetinfo":0.0018484288354898336,"makestandardfungiblepostcondition":0.0018484288354898336,"assetaddress":0.0018484288354898336,"'sp62m8mefh32wgsb7xsf9wjzd7tqb48vqb5anwsj'":0.0018484288354898336,"assetcontractname":0.0018484288354898336,"'test-asset-contract'":0.0018484288354898336,"assetname":0.0018484288354898336,"'test-token'":0.0018484288354898336,"fungibleassetinfo":0.0018484288354898336,"standardfungiblepostcondition":0.0018484288354898336,"contractfungiblepostcondition":0.0018484288354898336,"makecontractfungiblepostcondition":0.0018484288354898336,"warning":0.0018484288354898336,"blockchain's":0.0018484288354898336,"post-condition":0.0018484288354898336,"processor":0.0018484288354898336,"ownership":0.0018484288354898336,"checks":0.0018484288354898336,"send":0.0018484288354898336,"nft":0.0018484288354898336,"post-conditions":0.0018484288354898336,"verify":0.0018484288354898336,"anything":0.0018484288354898336,"about":0.0018484288354898336,"asset":0.0018484288354898336,"recipients":0.0018484288354898336,"need":0.0018484288354898336,"docs":0.0018484288354898336,"co":0.0018484288354898336,"write-smart-contracts":0.0018484288354898336,"nonfungibleconditioncode":0.0018484288354898336,"makestandardnonfungiblepostcondition":0.0018484288354898336,"makecontractnonfungiblepostcondition":0.0018484288354898336,"doesnotsend":0.0018484288354898336,"'test-asset'":0.0018484288354898336,"assetid":0.0018484288354898336,"'test-token-asset-id'":0.0018484288354898336,"nonfungibleassetinfo":0.0018484288354898336,"standardnonfungiblepostcondition":0.0018484288354898336,"contractnonfungiblepostcondition":0.0018484288354898336,"conversion":0.0018484288354898336,"json":0.0018484288354898336,"represent":0.0018484288354898336,"format":0.0018484288354898336,"helper":0.0018484288354898336,"cvtojson":0.0018484288354898336,"hextocv":0.0018484288354898336,"tx_result":0.0018484288354898336},"235":{"0":0.007352941176470588,"1":0.007352941176470588,"7":0.007352941176470588,"20":0.007352941176470588,"22":0.007352941176470588,"100":0.007352941176470588,"385875968":0.007352941176470588,"import":0.007352941176470588,"root":0.007352941176470588,"api":0.007352941176470588,"apiexample":0.007352941176470588,"from":0.007352941176470588,"'fumadocs-openapi":0.007352941176470588,"ui'":0.007352941176470588,"property":0.007352941176470588,"accordion":0.007352941176470588,"accordions":0.007352941176470588,"'fumadocs-ui":0.007352941176470588,"components":0.007352941176470588,"accordion'":0.007352941176470588,"tabs":0.007352941176470588,"tabscontent":0.007352941176470588,"tabslist":0.007352941176470588,"tabstrigger":0.007352941176470588,"'":0.007352941176470588,"ui":0.007352941176470588,"tabs'":0.007352941176470588,"badge":0.007352941176470588,"badge'":0.007352941176470588,"inlinecode":0.007352941176470588,"inline-code'":0.007352941176470588,"callout":0.007352941176470588,"type":0.007352941176470588,"info":0.007352941176470588,"this":0.007352941176470588,"reference":0.007352941176470588,"refers":0.007352941176470588,"to":0.007352941176470588,"the":0.007352941176470588,"x":0.007352941176470588,"release":0.007352941176470588,"of":0.007352941176470588,"stacks":0.007352941176470588,"js":0.007352941176470588,"it's":0.007352941176470588,"recommended":0.007352941176470588,"version":0.007352941176470588,"use":0.007352941176470588,"but":0.007352941176470588,"not":0.007352941176470588,"needed":0.007352941176470588,"for":0.007352941176470588,"nakamoto":0.007352941176470588,"read":0.007352941176470588,"migration":0.007352941176470588,"guide":0.007352941176470588,"https":0.007352941176470588,"github":0.007352941176470588,"com":0.007352941176470588,"hirosystems":0.007352941176470588,"blob":0.007352941176470588,"main":0.007352941176470588,"md":0.007352941176470588,"stacksjs-5xx--7xx":0.007352941176470588,"learn":0.007352941176470588,"how":0.007352941176470588,"update":0.007352941176470588,"latest":0.007352941176470588,"network":0.007352941176470588,"package":0.007352941176470588,"contains":0.007352941176470588,"default":0.007352941176470588,"configurations":0.007352941176470588,"installation":0.007352941176470588,"tip":0.007352941176470588,"before":0.007352941176470588,"you":0.007352941176470588,"install":0.007352941176470588,"most":0.007352941176470588,"time":0.007352941176470588,"don't":0.007352941176470588,"need":0.007352941176470588,"or":0.007352941176470588,"even":0.007352941176470588,"library":0.007352941176470588,"directly":0.007352941176470588,"example":0.007352941176470588,"instead":0.007352941176470588,"stacks_mainnet":0.007352941176470588,"simply":0.007352941176470588,"string":0.007352941176470588,"mainnet":0.007352941176470588,"as":0.007352941176470588,"parameter":0.007352941176470588,"package-install":0.007352941176470588,"usage":0.007352941176470588,"object":0.007352941176470588,"a":0.007352941176470588,"in":0.007352941176470588,"is":0.007352941176470588,"an":0.007352941176470588,"defining":0.007352941176470588,"several":0.007352941176470588,"properties":0.007352941176470588,"ts":0.007352941176470588,"stacks_testnet":0.007352941176470588,"stacks_devnet":0.007352941176470588,"network'":0.007352941176470588,"console":0.007352941176470588,"log":0.007352941176470588,"chainid":0.007352941176470588,"transactionversion":0.007352941176470588,"peernetworkid":0.007352941176470588,"magicbytes":0.007352941176470588,"'x2'":0.007352941176470588,"bootaddress":0.007352941176470588,"'sp000000000000000000002q6vf78'":0.007352941176470588,"addressversion":0.007352941176470588,"singlesig":0.007352941176470588,"multisig":0.007352941176470588,"transaction":0.007352941176470588,"building":0.007352941176470588,"makestxtokentransfer":0.007352941176470588,"transactions'":0.007352941176470588,"const":0.007352941176470588,"txoptions":0.007352941176470588,"recipient":0.007352941176470588,"'sp2bs6hd7tn34v8z5bnf8q2aw3k8k2dpv4264cf26'":0.007352941176470588,"amount":0.007352941176470588,"'mainnet'":0.007352941176470588,"'testnet'":0.007352941176470588,"'devnet'":0.007352941176470588,"defaults":0.007352941176470588,"any":0.007352941176470588,"compatible":0.007352941176470588,"await":0.007352941176470588},"236":{"7":0.00510204081632653,"import":0.00510204081632653,"root":0.00510204081632653,"api":0.00510204081632653,"apiexample":0.00510204081632653,"from":0.00510204081632653,"'fumadocs-openapi":0.00510204081632653,"ui'":0.00510204081632653,"property":0.00510204081632653,"accordion":0.00510204081632653,"accordions":0.00510204081632653,"'fumadocs-ui":0.00510204081632653,"components":0.00510204081632653,"accordion'":0.00510204081632653,"tabs":0.00510204081632653,"tabscontent":0.00510204081632653,"tabslist":0.00510204081632653,"tabstrigger":0.00510204081632653,"'":0.00510204081632653,"ui":0.00510204081632653,"tabs'":0.00510204081632653,"badge":0.00510204081632653,"badge'":0.00510204081632653,"inlinecode":0.00510204081632653,"inline-code'":0.00510204081632653,"callout":0.00510204081632653,"type":0.00510204081632653,"info":0.00510204081632653,"this":0.00510204081632653,"reference":0.00510204081632653,"refers":0.00510204081632653,"to":0.00510204081632653,"the":0.00510204081632653,"x":0.00510204081632653,"release":0.00510204081632653,"of":0.00510204081632653,"stacks":0.00510204081632653,"js":0.00510204081632653,"it's":0.00510204081632653,"recommended":0.00510204081632653,"version":0.00510204081632653,"use":0.00510204081632653,"but":0.00510204081632653,"not":0.00510204081632653,"needed":0.00510204081632653,"for":0.00510204081632653,"nakamoto":0.00510204081632653,"read":0.00510204081632653,"migration":0.00510204081632653,"guide":0.00510204081632653,"https":0.00510204081632653,"github":0.00510204081632653,"com":0.00510204081632653,"hirosystems":0.00510204081632653,"blob":0.00510204081632653,"main":0.00510204081632653,"md":0.00510204081632653,"stacksjs-5xx--7xx":0.00510204081632653,"learn":0.00510204081632653,"how":0.00510204081632653,"update":0.00510204081632653,"latest":0.00510204081632653,"common":0.00510204081632653,"package":0.00510204081632653,"contains":0.00510204081632653,"utilities":0.00510204081632653,"working":0.00510204081632653,"with":0.00510204081632653,"includes":0.00510204081632653,"fetch":0.00510204081632653,"helpers":0.00510204081632653,"middleware":0.00510204081632653,"and":0.00510204081632653,"various":0.00510204081632653,"other":0.00510204081632653,"functions":0.00510204081632653,"installation":0.00510204081632653,"package-install":0.00510204081632653,"built-in":0.00510204081632653,"key":0.00510204081632653,"some":0.00510204081632653,"apis":0.00510204081632653,"make":0.00510204081632653,"keys":0.00510204081632653,"provide":0.00510204081632653,"less":0.00510204081632653,"rate-limited":0.00510204081632653,"plans":0.00510204081632653,"typescript":0.00510204081632653,"createapikeymiddleware":0.00510204081632653,"createfetchfn":0.00510204081632653,"stacksmainnet":0.00510204081632653,"network'":0.00510204081632653,"broadcasttransaction":0.00510204081632653,"getnonce":0.00510204081632653,"makestxtokentransfer":0.00510204081632653,"transactions'":0.00510204081632653,"const":0.00510204081632653,"myapimiddleware":0.00510204081632653,"'example_e8e044a3_41d8b0fe_3dd3988ef302'":0.00510204081632653,"myfetchfn":0.00510204081632653,"middlewares":0.00510204081632653,"can":0.00510204081632653,"be":0.00510204081632653,"used":0.00510204081632653,"create":0.00510204081632653,"a":0.00510204081632653,"new":0.00510204081632653,"function":0.00510204081632653,"txoptions":0.00510204081632653,"recipient":0.00510204081632653,"'sp3fgq8z7jy9bwyz5wm53e0m9nk7whjf0691nz159'":0.00510204081632653,"amount":0.00510204081632653,"12345n":0.00510204081632653,"senderkey":0.00510204081632653,"'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01'":0.00510204081632653,"memo":0.00510204081632653,"'some":0.00510204081632653,"memo'":0.00510204081632653,"anchormode":0.00510204081632653,"any":0.00510204081632653,"client":0.00510204081632653,"transaction":0.00510204081632653,"await":0.00510204081632653,"fee-estimation":0.00510204081632653,"will":0.00510204081632653,"custom":0.00510204081632653,"fetchfn":0.00510204081632653,"response":0.00510204081632653,"mymainnet":0.00510204081632653,"sure":0.00510204081632653,"broadcast":0.00510204081632653,"via":0.00510204081632653,"network":0.00510204081632653,"object":0.00510204081632653,"which":0.00510204081632653,"take":0.00510204081632653,"stacksnetwork":0.00510204081632653,"nonce":0.00510204081632653,"hook":0.00510204081632653,"into":0.00510204081632653,"calls":0.00510204081632653,"before":0.00510204081632653,"sending":0.00510204081632653,"request":0.00510204081632653,"or":0.00510204081632653,"after":0.00510204081632653,"receiving":0.00510204081632653,"requestcontext":0.00510204081632653,"responsecontext":0.00510204081632653,"common'":0.00510204081632653,"premiddleware":0.00510204081632653,"ctx":0.00510204081632653,"init":0.00510204081632653,"headers":0.00510204081632653,"set":0.00510204081632653,"'x-foo'":0.00510204081632653,"'bar'":0.00510204081632653,"override":0.00510204081632653,"x-foo":0.00510204081632653,"header":0.00510204081632653,"postmiddleware":0.00510204081632653,"console":0.00510204081632653,"log":0.00510204081632653,"json":0.00510204081632653,"body":0.00510204081632653,"as":0.00510204081632653,"pre":0.00510204081632653,"post":0.00510204081632653,"contain":0.00510204081632653,"both":0.00510204081632653,"stackstestnet":0.00510204081632653,"get":0.00510204081632653,"urls":0.00510204081632653,"txbroadcasturl":0.00510204081632653,"getbroadcastapiurl":0.00510204081632653,"feeestimateurl":0.00510204081632653,"gettransferfeeestimateapiurl":0.00510204081632653,"address":0.00510204081632653,"'sp2bs6hd7tn34v8z5bnf8q2aw3k8k2dpv4264cf26'":0.00510204081632653,"accountinfourl":0.00510204081632653,"getaccountapiurl":0.00510204081632653,"contractname":0.00510204081632653,"'hello_world'":0.00510204081632653,"abiurl":0.00510204081632653,"getabiapiurl":0.00510204081632653,"functionname":0.00510204081632653,"'hello'":0.00510204081632653,"readonlyfunctioncallurl":0.00510204081632653,"getreadonlyfunctioncallapiurl":0.00510204081632653,"nodeinfourl":0.00510204081632653,"getinfourl":0.00510204081632653,"blocktimeurl":0.00510204081632653,"getblocktimeinfourl":0.00510204081632653,"poxinfourl":0.00510204081632653,"getpoxinfourl":0.00510204081632653},"237":{"10000":0.011111111111111112,"the":0.011111111111111112,"following":0.011111111111111112,"shows":0.011111111111111112,"how":0.011111111111111112,"to":0.011111111111111112,"create":0.011111111111111112,"a":0.011111111111111112,"simple":0.011111111111111112,"transaction":0.011111111111111112,"stx":0.011111111111111112,"transfer":0.011111111111111112,"using":0.011111111111111112,"stacks":0.011111111111111112,"js":0.011111111111111112,"in":0.011111111111111112,"different":0.011111111111111112,"environments":0.011111111111111112,"creating":0.011111111111111112,"connect":0.011111111111111112,"ts":0.011111111111111112,"-n":0.011111111111111112,"import":0.011111111111111112,"openstxtransfer":0.011111111111111112,"from":0.011111111111111112,"'":0.011111111111111112,"connect'":0.011111111111111112,"network":0.011111111111111112,"'testnet'":0.011111111111111112,"recipient":0.011111111111111112,"'st39mj145br6s8c315ag2bd61sj16e208p1fdk3ak'":0.011111111111111112,"which":0.011111111111111112,"address":0.011111111111111112,"you":0.011111111111111112,"are":0.011111111111111112,"sending":0.011111111111111112,"amount":0.011111111111111112,"tokens":0.011111111111111112,"denominated":0.011111111111111112,"micro-stx":0.011111111111111112,"onfinish":0.011111111111111112,"response":0.011111111111111112,"console":0.011111111111111112,"log":0.011111111111111112,"txid":0.011111111111111112,"oncancel":0.011111111111111112,"'user":0.011111111111111112,"canceled'":0.011111111111111112,"private":0.011111111111111112,"key":0.011111111111111112,"for":0.011111111111111112,"full":0.011111111111111112,"manual":0.011111111111111112,"signing":0.011111111111111112,"need":0.011111111111111112,"provide":0.011111111111111112,"sender's":0.011111111111111112,"treat":0.011111111111111112,"as":0.011111111111111112,"secret":0.011111111111111112,"and":0.011111111111111112,"never":0.011111111111111112,"expose":0.011111111111111112,"it":0.011111111111111112,"public":0.011111111111111112,"makestxtokentransfer":0.011111111111111112,"transactions'":0.011111111111111112,"const":0.011111111111111112,"privatekey":0.011111111111111112,"randomprivatekey":0.011111111111111112,"see":0.011111111111111112,"keys":0.011111111111111112,"wallets":0.011111111111111112,"page":0.011111111111111112,"tx":0.011111111111111112,"await":0.011111111111111112,"senderkey":0.011111111111111112,"testnet":0.011111111111111112,"types":0.011111111111111112,"we":0.011111111111111112,"can":0.011111111111111112,"transactions":0.011111111111111112,"purposes":0.011111111111111112,"-":0.011111111111111112,"token":0.011111111111111112,"transfers":0.011111111111111112,"smart":0.011111111111111112,"contract":0.011111111111111112,"calls":0.011111111111111112,"deployments":0.011111111111111112},"238":{"602":0.0064516129032258064,"1000":0.0064516129032258064,"in":0.0064516129032258064,"stacks":0.0064516129032258064,"transactions":0.0064516129032258064,"can":0.0064516129032258064,"have":0.0064516129032258064,"post-conditions":0.0064516129032258064,"these":0.0064516129032258064,"offer":0.0064516129032258064,"additional":0.0064516129032258064,"security":0.0064516129032258064,"to":0.0064516129032258064,"ensure":0.0064516129032258064,"a":0.0064516129032258064,"transaction":0.0064516129032258064,"was":0.0064516129032258064,"executed":0.0064516129032258064,"as":0.0064516129032258064,"expected":0.0064516129032258064,"more":0.0064516129032258064,"precisely":0.0064516129032258064,"adding":0.0064516129032258064,"that":0.0064516129032258064,"-":0.0064516129032258064,"stx":0.0064516129032258064,"tokens":0.0064516129032258064,"were":0.0064516129032258064,"transferred":0.0064516129032258064,"from":0.0064516129032258064,"an":0.0064516129032258064,"address":0.0064516129032258064,"fts":0.0064516129032258064,"nfts":0.0064516129032258064,"callout":0.0064516129032258064,"title":0.0064516129032258064,"info":0.0064516129032258064,"aren't":0.0064516129032258064,"perfect":0.0064516129032258064,"they":0.0064516129032258064,"can't":0.0064516129032258064,"say":0.0064516129032258064,"anything":0.0064516129032258064,"about":0.0064516129032258064,"the":0.0064516129032258064,"end-state":0.0064516129032258064,"after":0.0064516129032258064,"other":0.0064516129032258064,"words":0.0064516129032258064,"guarantee":0.0064516129032258064,"receipt":0.0064516129032258064,"of":0.0064516129032258064,"since":0.0064516129032258064,"only":0.0064516129032258064,"check":0.0064516129032258064,"for":0.0064516129032258064,"sending":0.0064516129032258064,"here's":0.0064516129032258064,"example":0.0064516129032258064,"post-condition":0.0064516129032258064,"using":0.0064516129032258064,"pc":0.0064516129032258064,"helper":0.0064516129032258064,"where":0.0064516129032258064,"principal":0.0064516129032258064,"must":0.0064516129032258064,"send":0.0064516129032258064,"ustx":0.0064516129032258064,"or":0.0064516129032258064,"else":0.0064516129032258064,"will":0.0064516129032258064,"abort":0.0064516129032258064,"ts":0.0064516129032258064,"-n":0.0064516129032258064,"import":0.0064516129032258064,"'":0.0064516129032258064,"transactions'":0.0064516129032258064,"const":0.0064516129032258064,"tx":0.0064516129032258064,"await":0.0064516129032258064,"makecontractcall":0.0064516129032258064,"postconditions":0.0064516129032258064,"'stb44hypyat2bb2qe513nsp81htmywbjp02hpgk6'":0.0064516129032258064,"willsendeq":0.0064516129032258064,"if":0.0064516129032258064,"you":0.0064516129032258064,"prefer":0.0064516129032258064,"write":0.0064516129032258064,"manually":0.0064516129032258064,"do":0.0064516129032258064,"so":0.0064516129032258064,"following":0.0064516129032258064,"approach":0.0064516129032258064,"stxpostcondition":0.0064516129032258064,"fungiblepostcondition":0.0064516129032258064,"nonfungiblepostcondition":0.0064516129032258064,"type":0.0064516129032258064,"'stx-postcondition'":0.0064516129032258064,"'sp2jxkmsh007npyaqhkjpqmaqyad90nqgtvjvq02b'":0.0064516129032258064,"condition":0.0064516129032258064,"'gte'":0.0064516129032258064,"'eq'":0.0064516129032258064,"'gt'":0.0064516129032258064,"'lt'":0.0064516129032258064,"'lte'":0.0064516129032258064,"amount":0.0064516129032258064,"'100'":0.0064516129032258064,"fungible":0.0064516129032258064,"token":0.0064516129032258064,"ftpostcondition":0.0064516129032258064,"'ft-postcondition'":0.0064516129032258064,"asset":0.0064516129032258064,"'sp3d6pv2acbpekyjtcmh7hen02kp87qsp8kteh335":0.0064516129032258064,"my-ft-token":0.0064516129032258064,"my-token'":0.0064516129032258064,"non-fungible":0.0064516129032258064,"nftpostcondition":0.0064516129032258064,"'nft-postcondition'":0.0064516129032258064,"'sent'":0.0064516129032258064,"'not-sent'":0.0064516129032258064,"my-nft":0.0064516129032258064,"my-asset'":0.0064516129032258064,"assetid":0.0064516129032258064,"cl":0.0064516129032258064,"uint":0.0064516129032258064,"mode":0.0064516129032258064,"addition":0.0064516129032258064,"itself":0.0064516129032258064,"we":0.0064516129032258064,"also":0.0064516129032258064,"specify":0.0064516129032258064,"verify":0.0064516129032258064,"transfers":0.0064516129032258064,"be":0.0064516129032258064,"either":0.0064516129032258064,"allow":0.0064516129032258064,"deny":0.0064516129032258064,"means":0.0064516129032258064,"transfer":0.0064516129032258064,"any":0.0064516129032258064,"assuming":0.0064516129032258064,"no":0.0064516129032258064,"conflicting":0.0064516129032258064,"fail":0.0064516129032258064,"not":0.0064516129032258064,"specified":0.0064516129032258064,"are":0.0064516129032258064,"attempted":0.0064516129032258064,"case":0.0064516129032258064,"all":0.0064516129032258064,"still":0.0064516129032258064,"checked":0.0064516129032258064,"by":0.0064516129032258064,"default":0.0064516129032258064,"set":0.0064516129032258064},"239":{"0":0.0058823529411764705,"2":0.0058823529411764705,"24":0.0058823529411764705,"import":0.0058823529411764705,"card":0.0058823529411764705,"smallcard":0.0058823529411764705,"from":0.0058823529411764705,"'":0.0058823529411764705,"components":0.0058823529411764705,"card'":0.0058823529411764705,"play":0.0058823529411764705,"filesignature":0.0058823529411764705,"'lucide-react'":0.0058823529411764705,"without":0.0058823529411764705,"direct":0.0058823529411764705,"private":0.0058823529411764705,"key":0.0058823529411764705,"access":0.0058823529411764705,"most":0.0058823529411764705,"users":0.0058823529411764705,"interact":0.0058823529411764705,"with":0.0058823529411764705,"apps":0.0058823529411764705,"via":0.0058823529411764705,"their":0.0058823529411764705,"favorite":0.0058823529411764705,"stacks":0.0058823529411764705,"wallet":0.0058823529411764705,"developers":0.0058823529411764705,"can":0.0058823529411764705,"build":0.0058823529411764705,"web":0.0058823529411764705,"that":0.0058823529411764705,"prompt":0.0058823529411764705,"the":0.0058823529411764705,"user":0.0058823529411764705,"for":0.0058823529411764705,"an":0.0058823529411764705,"action":0.0058823529411764705,"e":0.0058823529411764705,"g":0.0058823529411764705,"sign":0.0058823529411764705,"a":0.0058823529411764705,"transaction":0.0058823529411764705,"and":0.0058823529411764705,"then":0.0058823529411764705,"will":0.0058823529411764705,"handle":0.0058823529411764705,"rest":0.0058823529411764705,"icon":0.0058823529411764705,"classname":0.0058823529411764705,"'transition-colors":0.0058823529411764705,"duration-500":0.0058823529411764705,"ease-in-out":0.0058823529411764705,"group-hover":0.0058823529411764705,"text-primary'":0.0058823529411764705,"href":0.0058823529411764705,"connect":0.0058823529411764705,"title":0.0058823529411764705,"description":0.0058823529411764705,"you":0.0058823529411764705,"enabled":0.0058823529411764705,"using":0.0058823529411764705,"scripts":0.0058823529411764705,"backends":0.0058823529411764705,"tools":0.0058823529411764705,"intended":0.0058823529411764705,"full":0.0058823529411764705,"control":0.0058823529411764705,"over":0.0058823529411764705,"keys":0.0058823529411764705,"-":0.0058823529411764705,"js":0.0058823529411764705,"cli":0.0058823529411764705,"directly":0.0058823529411764705,"to":0.0058823529411764705,"send":0.0058823529411764705,"transactions":0.0058823529411764705,"or":0.0058823529411764705,"perform":0.0058823529411764705,"common":0.0058823529411764705,"tasks":0.0058823529411764705,"building":0.0058823529411764705,"custom":0.0058823529411764705,"libraries":0.0058823529411764705,"manage":0.0058823529411764705,"generating":0.0058823529411764705,"random":0.0058823529411764705,"let's":0.0058823529411764705,"start":0.0058823529411764705,"by":0.0058823529411764705,"note":0.0058823529411764705,"this":0.0058823529411764705,"return":0.0058823529411764705,"different":0.0058823529411764705,"value":0.0058823529411764705,"each":0.0058823529411764705,"time":0.0058823529411764705,"run":0.0058823529411764705,"code":0.0058823529411764705,"ts":0.0058823529411764705,"-n":0.0058823529411764705,"randomprivatekey":0.0058823529411764705,"transactions'":0.0058823529411764705,"const":0.0058823529411764705,"privatekey":0.0058823529411764705,"'f5a31c1268a1e37d4edaa05c7d11183c5fbfdcdc48aae36ea4d8cd5cb709932801'":0.0058823529411764705,"are":0.0058823529411764705,"typically":0.0058823529411764705,"represented":0.0058823529411764705,"as":0.0058823529411764705,"hex":0.0058823529411764705,"strings":0.0058823529411764705,"in":0.0058823529411764705,"more":0.0058823529411764705,"use":0.0058823529411764705,"type":0.0058823529411764705,"which":0.0058823529411764705,"also":0.0058823529411764705,"accepts":0.0058823529411764705,"raw":0.0058823529411764705,"bytes":0.0058823529411764705,"uint8array":0.0058823529411764705,"javascript":0.0058823529411764705,"seed":0.0058823529411764705,"phrase":0.0058823529411764705,"we":0.0058823529411764705,"don't":0.0058823529411764705,"want":0.0058823529411764705,"generate":0.0058823529411764705,"but":0.0058823529411764705,"instead":0.0058823529411764705,"deterministic":0.0058823529411764705,"based":0.0058823529411764705,"on":0.0058823529411764705,"words":0.0058823529411764705,"randomseedphrase":0.0058823529411764705,"wallet-sdk'":0.0058823529411764705,"warrior":0.0058823529411764705,"volume":0.0058823529411764705,"sport":0.0058823529411764705,"figure":0.0058823529411764705,"cake":0.0058823529411764705,"since":0.0058823529411764705,"generatewallet":0.0058823529411764705,"seedphrase":0.0058823529411764705,"let":0.0058823529411764705,"await":0.0058823529411764705,"secretkey":0.0058823529411764705,"password":0.0058823529411764705,"secret":0.0058823529411764705,"console":0.0058823529411764705,"log":0.0058823529411764705,"accounts":0.0058823529411764705,"one":0.0058823529411764705,"account":0.0058823529411764705,"is":0.0058823529411764705,"generated":0.0058823529411764705,"default":0.0058823529411764705,"stxprivatekey":0.0058823529411764705,"'893fc4936c5350394bbe0053d2c31a4b5a44680f6dceb4be2aacaaa3c12e45ff01'":0.0058823529411764705,"dataprivatekey":0.0058823529411764705,"'676dc36d89ba04cf1789552fc35f3a6279b4b5f13f3d49fb469b0afecea9698f'":0.0058823529411764705,"appskey":0.0058823529411764705,"'xprva19evfhuzrzf3wulusv1uvcqnrp7xj2vn2myakauhbt8svjrrkkhanrg2bewmxhaedsouvubrpiztdc8wwgtz9ero2gxw5rk3vhhxmutb4v'":0.0058823529411764705,"salt":0.0058823529411764705,"'cf8a5c7142d842bb38f30c5ab626f7996dd7494236edf21ba00349bb09b9558d'":0.0058823529411764705,"index":0.0058823529411764705,"generatenewaccount":0.0058823529411764705,"length":0.0058823529411764705},"240":{"0":0.011494252873563218,"stacks":0.011494252873563218,"uses":0.011494252873563218,"the":0.011494252873563218,"concept":0.011494252873563218,"of":0.011494252873563218,"an":0.011494252873563218,"account":0.011494252873563218,"to":0.011494252873563218,"represent":0.011494252873563218,"a":0.011494252873563218,"user's":0.011494252873563218,"identity":0.011494252873563218,"on":0.011494252873563218,"blockchain":0.011494252873563218,"is":0.011494252873563218,"identified":0.011494252873563218,"by":0.011494252873563218,"unique":0.011494252873563218,"address":0.011494252873563218,"derived":0.011494252873563218,"from":0.011494252873563218,"account's":0.011494252873563218,"public":0.011494252873563218,"key":0.011494252873563218,"which":0.011494252873563218,"private":0.011494252873563218,"normal":0.011494252873563218,"mainnet":0.011494252873563218,"starts":0.011494252873563218,"with":0.011494252873563218,"sp":0.011494252873563218,"and":0.011494252873563218,"testnet":0.011494252873563218,"st":0.011494252873563218,"for":0.011494252873563218,"example":0.011494252873563218,"sp3fgq8z7jy9bwyz5wm53e0m9nk7whjf0691nz159":0.011494252873563218,"st2f4bk4gzh6yfbnhyddgn4t1rkba7da1bjzpjejj":0.011494252873563218,"getting":0.011494252873563218,"using":0.011494252873563218,"connect":0.011494252873563218,"tsx":0.011494252873563218,"-n":0.011494252873563218,"import":0.011494252873563218,"showconnect":0.011494252873563218,"'":0.011494252873563218,"connect'":0.011494252873563218,"appdetails":0.011494252873563218,"usersession":0.011494252873563218,"onfinish":0.011494252873563218,"const":0.011494252873563218,"user":0.011494252873563218,"loaduserdata":0.011494252873563218,"profile":0.011494252873563218,"stxaddress":0.011494252873563218,"'sp1mxszf4nfc8jq1ttygec2wadmc7y3ghvzyrx6rf'":0.011494252873563218,"seed":0.011494252873563218,"phrase":0.011494252873563218,"mnemonic":0.011494252873563218,"ts":0.011494252873563218,"randomseedphrase":0.011494252873563218,"generatewallet":0.011494252873563218,"wallet-sdk":0.011494252873563218,"privatekeytoaddress":0.011494252873563218,"transactions":0.011494252873563218,"wallet":0.011494252873563218,"await":0.011494252873563218,"secretkey":0.011494252873563218,"password":0.011494252873563218,"'secret'":0.011494252873563218,"accounts":0.011494252873563218,"stxprivatekey":0.011494252873563218,"'mainnet'":0.011494252873563218,"publickeytoaddress":0.011494252873563218,"transactions'":0.011494252873563218,"publickey":0.011494252873563218,"todo":0.011494252873563218,"add":0.011494252873563218,"code":0.011494252873563218,"sections":0.011494252873563218,"once":0.011494252873563218,"we":0.011494252873563218,"have":0.011494252873563218,"better":0.011494252873563218,"abstractions":0.011494252873563218,"multisig":0.011494252873563218},"241":{"import":0.008771929824561403,"star":0.008771929824561403,"from":0.008771929824561403,"'lucide-react'":0.008771929824561403,"typically":0.008771929824561403,"we":0.008771929824561403,"speak":0.008771929824561403,"of":0.008771929824561403,"mainnet":0.008771929824561403,"and":0.008771929824561403,"testnet":0.008771929824561403,"as":0.008771929824561403,"the":0.008771929824561403,"networks":0.008771929824561403,"stacks":0.008771929824561403,"most":0.008771929824561403,"wallets":0.008771929824561403,"are":0.008771929824561403,"configured":0.008771929824561403,"to":0.008771929824561403,"by":0.008771929824561403,"default":0.008771929824561403,"this":0.008771929824561403,"is":0.008771929824561403,"production":0.008771929824561403,"environment":0.008771929824561403,"actual":0.008771929824561403,"blockchain":0.008771929824561403,"that":0.008771929824561403,"holds":0.008771929824561403,"real":0.008771929824561403,"stx":0.008771929824561403,"tokens":0.008771929824561403,"name":0.008771929824561403,"suggests":0.008771929824561403,"a":0.008771929824561403,"public":0.008771929824561403,"network":0.008771929824561403,"for":0.008771929824561403,"testing":0.008771929824561403,"it's":0.008771929824561403,"separate":0.008771929824561403,"state":0.008771929824561403,"test":0.008771929824561403,"which":0.008771929824561403,"have":0.008771929824561403,"no":0.008771929824561403,"value":0.008771929824561403,"completeness":0.008771929824561403,"also":0.008771929824561403,"mention":0.008771929824561403,"devnet":0.008771929824561403,"isn't":0.008771929824561403,"one":0.008771929824561403,"but":0.008771929824561403,"how":0.008771929824561403,"developers":0.008771929824561403,"refer":0.008771929824561403,"ephemeral":0.008771929824561403,"local":0.008771929824561403,"used":0.008771929824561403,"it":0.008771929824561403,"same":0.008771929824561403,"development":0.008771929824561403,"learn":0.008771929824561403,"more":0.008771929824561403,"clarinet":0.008771929824561403,"guides":0.008771929824561403,"run-a-local-devnet":0.008771929824561403,"setting":0.008771929824561403,"js":0.008771929824561403,"functions":0.008771929824561403,"accept":0.008771929824561403,"parameter":0.008771929824561403,"or":0.008771929824561403,"an":0.008771929824561403,"optional":0.008771929824561403,"last":0.008771929824561403,"argument":0.008771929824561403,"type":0.008771929824561403,"string":0.008771929824561403,"can":0.008771929824561403,"be":0.008771929824561403,"-":0.008771929824561403,"'mainnet'":0.008771929824561403,"'testnet'":0.008771929824561403,"'devnet'":0.008771929824561403,"'mocknet'":0.008771929824561403,"alias":0.008771929824561403,"examples":0.008771929824561403,"in":0.008771929824561403,"transaction":0.008771929824561403,"signing":0.008771929824561403,"ts":0.008771929824561403,"const":0.008771929824561403,"tx":0.008771929824561403,"makestxtokentransfer":0.008771929824561403,"address":0.008771929824561403,"derivation":0.008771929824561403,"privatekeytoaddress":0.008771929824561403,"privatekey":0.008771929824561403,"st3nbrsfkx28fq2zj1makx58hkhsdgnv5n7r21xcp":0.008771929824561403,"callout":0.008771929824561403,"tip":0.008771929824561403,"advanced":0.008771929824561403,"uses":0.008771929824561403,"you":0.008771929824561403,"pass":0.008771929824561403,"object":0.008771929824561403,"configuration":0.008771929824561403,"read":0.008771929824561403,"about":0.008771929824561403,"packages":0.008771929824561403,"package":0.008771929824561403},"242":{"42000000":0.022222222222222223,"broadcasting":0.022222222222222223,"transactions":0.022222222222222223,"a":0.022222222222222223,"finalized":0.022222222222222223,"transaction":0.022222222222222223,"can":0.022222222222222223,"be":0.022222222222222223,"broadcasted":0.022222222222222223,"to":0.022222222222222223,"the":0.022222222222222223,"network":0.022222222222222223,"or":0.022222222222222223,"serialized":0.022222222222222223,"byte":0.022222222222222223,"representation":0.022222222222222223,"using":0.022222222222222223,"stacks":0.022222222222222223,"js":0.022222222222222223,"ts":0.022222222222222223,"-n":0.022222222222222223,"import":0.022222222222222223,"broadcasttransaction":0.022222222222222223,"makestxtokentransfer":0.022222222222222223,"from":0.022222222222222223,"const":0.022222222222222223,"await":0.022222222222222223,"recipient":0.022222222222222223,"st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":0.022222222222222223,"amount":0.022222222222222223,"senderkey":0.022222222222222223,"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601":0.022222222222222223,"devnet":0.022222222222222223,"tx":0.022222222222222223,"callout":0.022222222222222223,"title":0.022222222222222223,"info":0.022222222222222223,"for":0.022222222222222223,"web":0.022222222222222223,"applications":0.022222222222222223,"user":0.022222222222222223,"wallets":0.022222222222222223,"broadcast":0.022222222222222223,"via":0.022222222222222223,"connect":0.022222222222222223},"243":{"42000000":0.006172839506172839,"import":0.006172839506172839,"accordion":0.006172839506172839,"accordions":0.006172839506172839,"from":0.006172839506172839,"fumadocs-ui":0.006172839506172839,"components":0.006172839506172839,"chevronright":0.006172839506172839,"code":0.006172839506172839,"terminal":0.006172839506172839,"folder":0.006172839506172839,"as":0.006172839506172839,"foldericon":0.006172839506172839,"'lucide-react'":0.006172839506172839,"file":0.006172839506172839,"files":0.006172839506172839,"'fumadocs-ui":0.006172839506172839,"files'":0.006172839506172839,"steps":0.006172839506172839,"step":0.006172839506172839,"steps'":0.006172839506172839,"smallcard":0.006172839506172839,"'":0.006172839506172839,"card'":0.006172839506172839,"in":0.006172839506172839,"this":0.006172839506172839,"quickstart":0.006172839506172839,"guide":0.006172839506172839,"you":0.006172839506172839,"will":0.006172839506172839,"learn":0.006172839506172839,"how":0.006172839506172839,"to":0.006172839506172839,"build":0.006172839506172839,"a":0.006172839506172839,"transaction":0.006172839506172839,"transfer":0.006172839506172839,"stx":0.006172839506172839,"tokens":0.006172839506172839,"using":0.006172839506172839,"stacks":0.006172839506172839,"js":0.006172839506172839,"check":0.006172839506172839,"out":0.006172839506172839,"the":0.006172839506172839,"reference":0.006172839506172839,"page":0.006172839506172839,"packages":0.006172839506172839,"transactions":0.006172839506172839,"for":0.006172839506172839,"more":0.006172839506172839,"about":0.006172839506172839,"building":0.006172839506172839,"different":0.006172839506172839,"types":0.006172839506172839,"of":0.006172839506172839,"callout":0.006172839506172839,"view":0.006172839506172839,"full":0.006172839506172839,"click":0.006172839506172839,"here":0.006172839506172839,"https":0.006172839506172839,"github":0.006172839506172839,"com":0.006172839506172839,"hiro-so":0.006172839506172839,"tree":0.006172839506172839,"main":0.006172839506172839,"examples":0.006172839506172839,"hello-world":0.006172839506172839,"---":0.006172839506172839,"install":0.006172839506172839,"add":0.006172839506172839,"and":0.006172839506172839,"network":0.006172839506172839,"your":0.006172839506172839,"project":0.006172839506172839,"preferred":0.006172839506172839,"package":0.006172839506172839,"manager":0.006172839506172839,"package-install":0.006172839506172839,"title":0.006172839506172839,"set":0.006172839506172839,"up":0.006172839506172839,"token":0.006172839506172839,"use":0.006172839506172839,"makestxtokentransfer":0.006172839506172839,"function":0.006172839506172839,"requires":0.006172839506172839,"private":0.006172839506172839,"key":0.006172839506172839,"senderkey":0.006172839506172839,"specified":0.006172839506172839,"details":0.006172839506172839,"ts":0.006172839506172839,"stx-transfer":0.006172839506172839,"-cn":0.006172839506172839,"stacks_testnet":0.006172839506172839,"const":0.006172839506172839,"await":0.006172839506172839,"recipient":0.006172839506172839,"st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":0.006172839506172839,"amount":0.006172839506172839,"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601":0.006172839506172839,"there":0.006172839506172839,"are":0.006172839506172839,"few":0.006172839506172839,"optional":0.006172839506172839,"fields":0.006172839506172839,"including":0.006172839506172839,"memo":0.006172839506172839,"nonce":0.006172839506172839,"fee":0.006172839506172839,"example":0.006172839506172839,"other":0.006172839506172839,"ommitted":0.006172839506172839,"test":0.006172839506172839,"0n":0.006172839506172839,"200n":0.006172839506172839,"message":0.006172839506172839,"part":0.006172839506172839,"if":0.006172839506172839,"don't":0.006172839506172839,"want":0.006172839506172839,"builder":0.006172839506172839,"fetch":0.006172839506172839,"node":0.006172839506172839,"can":0.006172839506172839,"manually":0.006172839506172839,"these":0.006172839506172839,"broadcast":0.006172839506172839,"once":0.006172839506172839,"you've":0.006172839506172839,"constructed":0.006172839506172839,"valid":0.006172839506172839,"it":0.006172839506172839,"broadcasttransaction":0.006172839506172839,"mark":0.006172839506172839,"mg":0.006172839506172839,"broadcastresponse":0.006172839506172839,"txid":0.006172839506172839,"upon":0.006172839506172839,"success":0.006172839506172839,"return":0.006172839506172839,"stackstransaction":0.006172839506172839,"object":0.006172839506172839,"that":0.006172839506172839,"contains":0.006172839506172839,"information":0.006172839506172839,"next":0.006172839506172839,"cards":0.006172839506172839,"card":0.006172839506172839,"href":0.006172839506172839,"connect":0.006172839506172839,"guides":0.006172839506172839,"authenticate-users":0.006172839506172839,"authenticate":0.006172839506172839,"users":0.006172839506172839,"description":0.006172839506172839,"broadcast-transactions":0.006172839506172839,"sign":0.006172839506172839,"sign-messages":0.006172839506172839,"messages":0.006172839506172839},"244":{"import":0.007936507936507936,"accordion":0.007936507936507936,"accordions":0.007936507936507936,"from":0.007936507936507936,"'fumadocs-ui":0.007936507936507936,"components":0.007936507936507936,"accordion'":0.007936507936507936,"badge":0.007936507936507936,"'":0.007936507936507936,"ui":0.007936507936507936,"badge'":0.007936507936507936,"tabs":0.007936507936507936,"tabscontent":0.007936507936507936,"tabslist":0.007936507936507936,"tabstrigger":0.007936507936507936,"tabs'":0.007936507936507936,"stacks":0.007936507936507936,"js":0.007936507936507936,"is":0.007936507936507936,"separated":0.007936507936507936,"into":0.007936507936507936,"many":0.007936507936507936,"smaller":0.007936507936507936,"packages":0.007936507936507936,"which":0.007936507936507936,"can":0.007936507936507936,"be":0.007936507936507936,"installed":0.007936507936507936,"individually":0.007936507936507936,"and":0.007936507936507936,"are":0.007936507936507936,"published":0.007936507936507936,"under":0.007936507936507936,"the":0.007936507936507936,"scope":0.007936507936507936,"most":0.007936507936507936,"commonly":0.007936507936507936,"used":0.007936507936507936,"defaultvalue":0.007936507936507936,"connect":0.007936507936507936,"classname":0.007936507936507936,"'flex":0.007936507936507936,"flex-wrap":0.007936507936507936,"md":0.007936507936507936,"w-max'":0.007936507936507936,"value":0.007936507936507936,"'tab":0.007936507936507936,"group'":0.007936507936507936,"'badge":0.007936507936507936,"transition-colors":0.007936507936507936,"group-data-":0.007936507936507936,"state":0.007936507936507936,"active":0.007936507936507936,"bg-contrast":0.007936507936507936,"text-background":0.007936507936507936,"group-hover":0.007936507936507936,"bg-accent":0.007936507936507936,"text-muted-foreground'":0.007936507936507936,"common":0.007936507936507936,"network":0.007936507936507936,"transactions":0.007936507936507936,"client":0.007936507936507936,"blockchain-api-client":0.007936507936507936,"build":0.007936507936507936,"stacks-ready":0.007936507936507936,"web":0.007936507936507936,"apps":0.007936507936507936,"to":0.007936507936507936,"user":0.007936507936507936,"wallets":0.007936507936507936,"package-install":0.007936507936507936,"utilities":0.007936507936507936,"by":0.007936507936507936,"library":0.007936507936507936,"for":0.007936507936507936,"working":0.007936507936507936,"with":0.007936507936507936,"objects":0.007936507936507936,"construct":0.007936507936507936,"decode":0.007936507936507936,"work":0.007936507936507936,"clarity":0.007936507936507936,"smart":0.007936507936507936,"contracts":0.007936507936507936,"on":0.007936507936507936,"blockchain":0.007936507936507936,"api":0.007936507936507936,"all":0.007936507936507936,"endpoints":0.007936507936507936,"---":0.007936507936507936,"title":0.007936507936507936,"available":0.007936507936507936,"applications":0.007936507936507936,"auth":0.007936507936507936,"authentication":0.007936507936507936,"requests":0.007936507936507936,"wallet-sdk":0.007936507936507936,"a":0.007936507936507936,"building":0.007936507936507936,"managing":0.007936507936507936,"accounts":0.007936507936507936,"handling":0.007936507936507936,"keys":0.007936507936507936,"storage":0.007936507936507936,"store":0.007936507936507936,"fetch":0.007936507936507936,"files":0.007936507936507936,"gaia":0.007936507936507936,"decentralized":0.007936507936507936,"system":0.007936507936507936,"profile":0.007936507936507936,"functions":0.007936507936507936,"manipulating":0.007936507936507936,"profiles":0.007936507936507936,"encryption":0.007936507936507936,"nodes":0.007936507936507936,"bns":0.007936507936507936,"interacting":0.007936507936507936,"contract":0.007936507936507936,"stacking":0.007936507936507936,"pox":0.007936507936507936,"cli":0.007936507936507936,"command":0.007936507936507936,"line":0.007936507936507936,"interface":0.007936507936507936,"interact":0.007936507936507936},"245":{"0":0.002386634844868735,"1":0.002386634844868735,"2":0.002386634844868735,"3":0.002386634844868735,"10":0.002386634844868735,"100":0.002386634844868735,"1000":0.002386634844868735,"integration":0.002386634844868735,"testing":0.002386634844868735,"is":0.002386634844868735,"a":0.002386634844868735,"crucial":0.002386634844868735,"step":0.002386634844868735,"in":0.002386634844868735,"smart":0.002386634844868735,"contract":0.002386634844868735,"development":0.002386634844868735,"that":0.002386634844868735,"involves":0.002386634844868735,"how":0.002386634844868735,"different":0.002386634844868735,"components":0.002386634844868735,"of":0.002386634844868735,"your":0.002386634844868735,"system":0.002386634844868735,"work":0.002386634844868735,"together":0.002386634844868735,"the":0.002386634844868735,"clarinet":0.002386634844868735,"js":0.002386634844868735,"sdk":0.002386634844868735,"provides":0.002386634844868735,"powerful":0.002386634844868735,"tools":0.002386634844868735,"for":0.002386634844868735,"writing":0.002386634844868735,"and":0.002386634844868735,"running":0.002386634844868735,"tests":0.002386634844868735,"allowing":0.002386634844868735,"you":0.002386634844868735,"to":0.002386634844868735,"simulate":0.002386634844868735,"complex":0.002386634844868735,"scenarios":0.002386634844868735,"interactions":0.002386634844868735,"between":0.002386634844868735,"multiple":0.002386634844868735,"contracts":0.002386634844868735,"by":0.002386634844868735,"using":0.002386634844868735,"can":0.002386634844868735,"ensure":0.002386634844868735,"function":0.002386634844868735,"correctly":0.002386634844868735,"as":0.002386634844868735,"part":0.002386634844868735,"larger":0.002386634844868735,"catch":0.002386634844868735,"potential":0.002386634844868735,"issues":0.002386634844868735,"might":0.002386634844868735,"not":0.002386634844868735,"be":0.002386634844868735,"apparent":0.002386634844868735,"unit":0.002386634844868735,"alone":0.002386634844868735,"this":0.002386634844868735,"guide":0.002386634844868735,"will":0.002386634844868735,"set":0.002386634844868735,"up":0.002386634844868735,"project":0.002386634844868735,"with":0.002386634844868735,"defi":0.002386634844868735,"set-up-a-clarinet-project":0.002386634844868735,"write":0.002386634844868735,"an":0.002386634844868735,"test":0.002386634844868735,"test-the-deposit-and-borrow-functionality":0.002386634844868735,"run":0.002386634844868735,"generate":0.002386634844868735,"coverage":0.002386634844868735,"reports":0.002386634844868735,"run-tests-and-generate-coverage-reports":0.002386634844868735,"---":0.002386634844868735,"start":0.002386634844868735,"creating":0.002386634844868735,"new":0.002386634844868735,"command":0.002386634844868735,"create":0.002386634844868735,"directory":0.002386634844868735,"named":0.002386634844868735,"basic":0.002386634844868735,"inside":0.002386634844868735,"it":0.002386634844868735,"terminal":0.002386634844868735,"stx-defi":0.002386634844868735,"cd":0.002386634844868735,"after":0.002386634844868735,"changing":0.002386634844868735,"into":0.002386634844868735,"npm":0.002386634844868735,"install":0.002386634844868735,"package":0.002386634844868735,"dependencies":0.002386634844868735,"we":0.002386634844868735,"are":0.002386634844868735,"going":0.002386634844868735,"use":0.002386634844868735,"same":0.002386634844868735,"used":0.002386634844868735,"stacks":0.002386634844868735,"clarinet-js-sdk":0.002386634844868735,"guides":0.002386634844868735,"unit-testing":0.002386634844868735,"but":0.002386634844868735,"some":0.002386634844868735,"additional":0.002386634844868735,"functionality":0.002386634844868735,"-":0.002386634844868735,"ability":0.002386634844868735,"borrow":0.002386634844868735,"stx":0.002386634844868735,"from":0.002386634844868735,"if":0.002386634844868735,"don't":0.002386634844868735,"have":0.002386634844868735,"already":0.002386634844868735,"follow":0.002386634844868735,"steps":0.002386634844868735,"below":0.002386634844868735,"then":0.002386634844868735,"clar":0.002386634844868735,"file":0.002386634844868735,"copy":0.002386634844868735,"paste":0.002386634844868735,"following":0.002386634844868735,"code":0.002386634844868735,"clarity":0.002386634844868735,"error":0.002386634844868735,"constants":0.002386634844868735,"various":0.002386634844868735,"failure":0.002386634844868735,"define-constant":0.002386634844868735,"err-overborrow":0.002386634844868735,"err":0.002386634844868735,"u300":0.002386634844868735,"interest":0.002386634844868735,"rate":0.002386634844868735,"loans":0.002386634844868735,"represented":0.002386634844868735,"out":0.002386634844868735,"base":0.002386634844868735,"define-data-var":0.002386634844868735,"loan-interest-rate":0.002386634844868735,"uint":0.002386634844868735,"u10":0.002386634844868735,"representing":0.002386634844868735,"holds":0.002386634844868735,"total":0.002386634844868735,"amount":0.002386634844868735,"deposits":0.002386634844868735,"initialized":0.002386634844868735,"total-deposits":0.002386634844868735,"u0":0.002386634844868735,"maps":0.002386634844868735,"user's":0.002386634844868735,"principal":0.002386634844868735,"address":0.002386634844868735,"their":0.002386634844868735,"deposited":0.002386634844868735,"define-map":0.002386634844868735,"owner":0.002386634844868735,"borrower's":0.002386634844868735,"loan":0.002386634844868735,"details":0.002386634844868735,"last":0.002386634844868735,"interaction":0.002386634844868735,"block":0.002386634844868735,"last-interaction-block":0.002386634844868735,"public":0.002386634844868735,"users":0.002386634844868735,"deposit":0.002386634844868735,"updates":0.002386634844868735,"balance":0.002386634844868735,"define-public":0.002386634844868735,"let":0.002386634844868735,"fetch":0.002386634844868735,"current":0.002386634844868735,"or":0.002386634844868735,"default":0.002386634844868735,"none":0.002386634844868735,"exists":0.002386634844868735,"current-balance":0.002386634844868735,"default-to":0.002386634844868735,"get":0.002386634844868735,"map-get":0.002386634844868735,"tx-sender":0.002386634844868735,"transfer":0.002386634844868735,"sender":0.002386634844868735,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.002386634844868735,"recipient":0.002386634844868735,"ie":0.002386634844868735,"identifier":0.002386634844868735,"on":0.002386634844868735,"chain":0.002386634844868735,"try":0.002386634844868735,"stx-transfer":0.002386634844868735,"as-contract":0.002386634844868735,"update":0.002386634844868735,"map":0.002386634844868735,"map-set":0.002386634844868735,"variable":0.002386634844868735,"var-set":0.002386634844868735,"var-get":0.002386634844868735,"return":0.002386634844868735,"success":0.002386634844868735,"ok":0.002386634844868735,"true":0.002386634844868735,"based":0.002386634844868735,"user-deposit":0.002386634844868735,"calculate":0.002386634844868735,"maximum":0.002386634844868735,"user":0.002386634844868735,"allowed":0.002386634844868735,"which":0.002386634844868735,"upto":0.002386634844868735,"half":0.002386634844868735,"what":0.002386634844868735,"they":0.002386634844868735,"allowed-borrow":0.002386634844868735,"u2":0.002386634844868735,"initial":0.002386634844868735,"values":0.002386634844868735,"current-loan-details":0.002386634844868735,"accrued":0.002386634844868735,"accrued-interest":0.002386634844868735,"calculate-accrued-interest":0.002386634844868735,"due":0.002386634844868735,"including":0.002386634844868735,"total-due":0.002386634844868735,"unwrap-panic":0.002386634844868735,"borrowing":0.002386634844868735,"new-loan":0.002386634844868735,"requested":0.002386634844868735,"does":0.002386634844868735,"exceed":0.002386634844868735,"asserts":0.002386634844868735,"borrowed":0.002386634844868735,"block-height":0.002386634844868735,"read-only":0.002386634844868735,"define-read-only":0.002386634844868735,"get-balance-by-sender":0.002386634844868735,"owed":0.002386634844868735,"get-amount-owed":0.002386634844868735,"private":0.002386634844868735,"define-private":0.002386634844868735,"start-block":0.002386634844868735,"number":0.002386634844868735,"blocks":0.002386634844868735,"elapsed":0.002386634844868735,"since":0.002386634844868735,"elapsed-blocks":0.002386634844868735,"time":0.002386634844868735,"u10000":0.002386634844868735,"started":0.002386634844868735,"past":0.002386634844868735,"at":0.002386634844868735,"is-eq":0.002386634844868735,"calculated":0.002386634844868735,"check":0.002386634844868735,"valid":0.002386634844868735,"ready":0.002386634844868735,"callout":0.002386634844868735,"find":0.002386634844868735,"full":0.002386634844868735,"repo":0.002386634844868735,"https":0.002386634844868735,"github":0.002386634844868735,"com":0.002386634844868735,"hirosystems":0.002386634844868735,"clarity-examples":0.002386634844868735,"tree":0.002386634844868735,"main":0.002386634844868735,"examples":0.002386634844868735,"order":0.002386634844868735,"must":0.002386634844868735,"first":0.002386634844868735,"therefore":0.002386634844868735,"need":0.002386634844868735,"simulates":0.002386634844868735,"these":0.002386634844868735,"two":0.002386634844868735,"functions":0.002386634844868735,"ts":0.002386634844868735,"replace":0.002386634844868735,"boilerplate":0.002386634844868735,"add":0.002386634844868735,"typescript":0.002386634844868735,"import":0.002386634844868735,"describe":0.002386634844868735,"expect":0.002386634844868735,"'vitest'":0.002386634844868735,"cl":0.002386634844868735,"'":0.002386634844868735,"transactions'":0.002386634844868735,"const":0.002386634844868735,"accounts":0.002386634844868735,"simnet":0.002386634844868735,"getaccounts":0.002386634844868735,"wallet1":0.002386634844868735,"'wallet_1'":0.002386634844868735,"'stx-defi'":0.002386634844868735,"'borrows":0.002386634844868735,"verifies":0.002386634844868735,"10'":0.002386634844868735,"callpublicfn":0.002386634844868735,"'defi'":0.002386634844868735,"'deposit'":0.002386634844868735,"totaldeposits":0.002386634844868735,"getdatavar":0.002386634844868735,"'total-deposits'":0.002386634844868735,"tobeuint":0.002386634844868735,"'borrow'":0.002386634844868735,"result":0.002386634844868735,"callreadonlyfn":0.002386634844868735,"'get-amount-owed'":0.002386634844868735,"tobeok":0.002386634844868735,"we're":0.002386634844868735,"simulating":0.002386634844868735,"scenario":0.002386634844868735,"where":0.002386634844868735,"borrows":0.002386634844868735,"against":0.002386634844868735,"let's":0.002386634844868735,"walk":0.002386634844868735,"through":0.002386634844868735,"process":0.002386634844868735,"do":0.002386634844868735,"method":0.002386634844868735,"object":0.002386634844868735,"allows":0.002386634844868735,"us":0.002386634844868735,"call":0.002386634844868735,"our":0.002386634844868735,"just":0.002386634844868735,"would":0.002386634844868735,"actual":0.002386634844868735,"blockchain":0.002386634844868735,"making":0.002386634844868735,"want":0.002386634844868735,"verify":0.002386634844868735,"was":0.002386634844868735,"successful":0.002386634844868735,"checking":0.002386634844868735,"handy":0.002386634844868735,"lets":0.002386634844868735,"peek":0.002386634844868735,"value":0.002386634844868735,"data":0.002386634844868735,"variables":0.002386634844868735,"defined":0.002386634844868735,"learn":0.002386634844868735,"more":0.002386634844868735,"about":0.002386634844868735,"available":0.002386634844868735,"methods":0.002386634844868735,"reference":0.002386634844868735,"page":0.002386634844868735,"references":0.002386634844868735,"recorded":0.002386634844868735,"custom":0.002386634844868735,"matcher":0.002386634844868735,"specifically":0.002386634844868735,"designed":0.002386634844868735,"unsigned":0.002386634844868735,"integer":0.002386634844868735,"exact":0.002386634844868735,"confirmed":0.002386634844868735,"another":0.002386634844868735,"invoking":0.002386634844868735,"operation":0.002386634844868735,"much":0.002386634844868735,"owes":0.002386634844868735,"finally":0.002386634844868735,"particularly":0.002386634844868735,"useful":0.002386634844868735,"because":0.002386634844868735,"checks":0.002386634844868735,"things":0.002386634844868735,"once":0.002386634844868735,"returned":0.002386634844868735,"response":0.002386634844868735,"type":0.002386634844868735,"matchers":0.002386634844868735,"allow":0.002386634844868735,"make":0.002386634844868735,"detailed":0.002386634844868735,"assertions":0.002386634844868735,"results":0.002386634844868735,"report":0.002386634844868735,"produce":0.002386634844868735,"helping":0.002386634844868735,"identify":0.002386634844868735,"any":0.002386634844868735,"untested":0.002386634844868735,"parts":0.002386634844868735,"next":0.002386634844868735,"cards":0.002386634844868735,"card":0.002386634844868735,"href":0.002386634844868735,"title":0.002386634844868735,"api":0.002386634844868735,"description":0.002386634844868735,"dive":0.002386634844868735,"deeper":0.002386634844868735,"properties":0.002386634844868735,"custom-matchers":0.002386634844868735},"246":{"0":0.004830917874396135,"1":0.004830917874396135,"2":0.004830917874396135,"40":0.004830917874396135,"42":0.004830917874396135,"in":0.004830917874396135,"this":0.004830917874396135,"guide":0.004830917874396135,"you":0.004830917874396135,"will":0.004830917874396135,"learn":0.004830917874396135,"how":0.004830917874396135,"to":0.004830917874396135,"migrate":0.004830917874396135,"your":0.004830917874396135,"existing":0.004830917874396135,"clarinet":0.004830917874396135,"projects":0.004830917874396135,"the":0.004830917874396135,"sdk":0.004830917874396135,"run":0.004830917874396135,"tests":0.004830917874396135,"using":0.004830917874396135,"callout":0.004830917874396135,"title":0.004830917874396135,"note":0.004830917874396135,"is":0.004830917874396135,"for":0.004830917874396135,"that":0.004830917874396135,"have":0.004830917874396135,"been":0.004830917874396135,"created":0.004830917874396135,"with":0.004830917874396135,"v1":0.004830917874396135,"and":0.004830917874396135,"do":0.004830917874396135,"not":0.004830917874396135,"v2":0.004830917874396135,"boilerplate":0.004830917874396135,"code":0.004830917874396135,"auto-generated":0.004830917874396135,"their":0.004830917874396135,"---":0.004830917874396135,"executing":0.004830917874396135,"migration":0.004830917874396135,"script":0.004830917874396135,"inside":0.004830917874396135,"project":0.004830917874396135,"following":0.004830917874396135,"command":0.004830917874396135,"initialise":0.004830917874396135,"npm":0.004830917874396135,"vitest":0.004830917874396135,"it":0.004830917874396135,"also":0.004830917874396135,"create":0.004830917874396135,"a":0.004830917874396135,"sample":0.004830917874396135,"test":0.004830917874396135,"file":0.004830917874396135,"terminal":0.004830917874396135,"npx":0.004830917874396135,"hirosystems":0.004830917874396135,"clarinet-sdk":0.004830917874396135,"latest":0.004830917874396135,"follow":0.004830917874396135,"prompts":0.004830917874396135,"can":0.004830917874396135,"take":0.004830917874396135,"few":0.004830917874396135,"seconds":0.004830917874396135,"info":0.004830917874396135,"counter_test":0.004830917874396135,"ts":0.004830917874396135,"was":0.004830917874396135,"by":0.004830917874396135,"contract":0.004830917874396135,"new":0.004830917874396135,"counter":0.004830917874396135,"be":0.004830917874396135,"deleted":0.004830917874396135,"look":0.004830917874396135,"at":0.004830917874396135,"it's":0.004830917874396135,"showing":0.004830917874396135,"use":0.004830917874396135,"safely":0.004830917874396135,"unit":0.004830917874396135,"classname":0.004830917874396135,"'text-lg'":0.004830917874396135,"example":0.004830917874396135,"import":0.004830917874396135,"cl":0.004830917874396135,"from":0.004830917874396135,"'":0.004830917874396135,"stacks":0.004830917874396135,"transactions'":0.004830917874396135,"describe":0.004830917874396135,"expect":0.004830917874396135,"'vitest'":0.004830917874396135,"const":0.004830917874396135,"accounts":0.004830917874396135,"simnet":0.004830917874396135,"getaccounts":0.004830917874396135,"address1":0.004830917874396135,"get":0.004830917874396135,"'wallet_1'":0.004830917874396135,"'test":0.004830917874396135,"increment":0.004830917874396135,"public":0.004830917874396135,"function'":0.004830917874396135,"'increments":0.004830917874396135,"count":0.004830917874396135,"given":0.004830917874396135,"value'":0.004830917874396135,"incrementresponse":0.004830917874396135,"callpublicfn":0.004830917874396135,"'counter'":0.004830917874396135,"'increment'":0.004830917874396135,"uint":0.004830917874396135,"console":0.004830917874396135,"log":0.004830917874396135,"prettyprint":0.004830917874396135,"result":0.004830917874396135,"ok":0.004830917874396135,"u2":0.004830917874396135,"tobeok":0.004830917874396135,"count1":0.004830917874396135,"getdatavar":0.004830917874396135,"'count'":0.004830917874396135,"tobeuint":0.004830917874396135,"count2":0.004830917874396135,"'sends":0.004830917874396135,"print":0.004830917874396135,"event'":0.004830917874396135,"events":0.004830917874396135,"tohavelength":0.004830917874396135,"printevent":0.004830917874396135,"event":0.004830917874396135,"tobe":0.004830917874396135,"'print_event'":0.004830917874396135,"data":0.004830917874396135,"value":0.004830917874396135,"tobetuple":0.004830917874396135,"object":0.004830917874396135,"stringascii":0.004830917874396135,"action":0.004830917874396135,"'incremented'":0.004830917874396135,"go":0.004830917874396135,"back":0.004830917874396135,"preferred":0.004830917874396135,"package":0.004830917874396135,"manager":0.004830917874396135,"should":0.004830917874396135,"display":0.004830917874396135,"report":0.004830917874396135,"telling":0.004830917874396135,"succeeded":0.004830917874396135,"available":0.004830917874396135,"globally":0.004830917874396135,"automatically":0.004830917874396135,"initialized":0.004830917874396135,"before":0.004830917874396135,"each":0.004830917874396135,"config":0.004830917874396135,"js":0.004830917874396135,"root":0.004830917874396135,"of":0.004830917874396135,"more":0.004830917874396135,"details":0.004830917874396135,"getting":0.004830917874396135,"-":0.004830917874396135,"first":0.004830917874396135,"checks":0.004830917874396135,"function":0.004830917874396135,"returns":0.004830917874396135,"saves":0.004830917874396135,"variable":0.004830917874396135,"second":0.004830917874396135,"an":0.004830917874396135,"print_event":0.004830917874396135,"emitted":0.004830917874396135,"when":0.004830917874396135,"called":0.004830917874396135,"next":0.004830917874396135,"steps":0.004830917874396135,"cards":0.004830917874396135,"card":0.004830917874396135,"href":0.004830917874396135,"clarinet-js-sdk":0.004830917874396135,"references":0.004830917874396135,"api":0.004830917874396135,"reference":0.004830917874396135,"description":0.004830917874396135,"dive":0.004830917874396135,"deeper":0.004830917874396135,"into":0.004830917874396135,"properties":0.004830917874396135,"methods":0.004830917874396135,"custom-matchers":0.004830917874396135,"custom":0.004830917874396135,"matchers":0.004830917874396135,"about":0.004830917874396135,"are":0.004830917874396135,"guides":0.004830917874396135,"migrate-to-the-clarinet-sdk":0.004830917874396135,"migrating":0.004830917874396135},"247":{"import":0.1,"apikeyscontent":0.1,"from":0.1,"'":0.1,"content":0.1,"_shared":0.1,"api-keys":0.1,"mdx'":0.1,"components":0.1,"props":0.1},"248":{},"249":{"apipage":0.07142857142857142,"document":0.07142857142857142,"openapi":0.07142857142857142,"token-metadata-api":0.07142857142857142,"json":0.07142857142857142,"operations":0.07142857142857142,"path":0.07142857142857142,"'":0.07142857142857142,"metadata":0.07142857142857142,"v1":0.07142857142857142,"method":0.07142857142857142,"'get'":0.07142857142857142,"hashead":0.07142857142857142,"false":0.07142857142857142},"250":{},"251":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"token-metadata-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"metadata":0.0625,"v1":0.0625,"ft":0.0625,"principal":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"252":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"token-metadata-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"metadata":0.058823529411764705,"v1":0.058823529411764705,"sft":0.058823529411764705,"principal":0.058823529411764705,"token_id":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"253":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"token-metadata-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"metadata":0.06666666666666667,"v1":0.06666666666666667,"ft'":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"254":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"token-metadata-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"metadata":0.058823529411764705,"v1":0.058823529411764705,"nft":0.058823529411764705,"principal":0.058823529411764705,"token_id":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"255":{"0":0.01020408163265306,"10":0.01020408163265306,"22":0.01020408163265306,"37":0.01020408163265306,"308":0.01020408163265306,"14461":0.01020408163265306,"101922":0.01020408163265306,"1622875042":0.01020408163265306,"2147483647":0.01020408163265306,"to":0.01020408163265306,"make":0.01020408163265306,"api":0.01020408163265306,"responses":0.01020408163265306,"more":0.01020408163265306,"compact":0.01020408163265306,"lists":0.01020408163265306,"returned":0.01020408163265306,"by":0.01020408163265306,"the":0.01020408163265306,"are":0.01020408163265306,"paginated":0.01020408163265306,"for":0.01020408163265306,"response":0.01020408163265306,"body":0.01020408163265306,"includes":0.01020408163265306,"-":0.01020408163265306,"limit":0.01020408163265306,"number":0.01020408163265306,"of":0.01020408163265306,"list":0.01020408163265306,"items":0.01020408163265306,"return":0.01020408163265306,"per":0.01020408163265306,"offset":0.01020408163265306,"elements":0.01020408163265306,"skip":0.01020408163265306,"starting":0.01020408163265306,"from":0.01020408163265306,"total":0.01020408163265306,"all":0.01020408163265306,"available":0.01020408163265306,"results":0.01020408163265306,"array":0.01020408163265306,"length":0.01020408163265306,"equals":0.01020408163265306,"set":0.01020408163265306,"here":0.01020408163265306,"is":0.01020408163265306,"a":0.01020408163265306,"sample":0.01020408163265306,"json":0.01020408163265306,"tx_id":0.01020408163265306,"0x924e0a688664851f5f96b437fabaec19b7542cfcaaf92a97eae43384cacd83d0":0.01020408163265306,"nonce":0.01020408163265306,"fee_rate":0.01020408163265306,"sender_address":0.01020408163265306,"st39f7sa0akh7rb363w3ne2dthd3p32zhnx2ke7j9":0.01020408163265306,"sponsored":0.01020408163265306,"false":0.01020408163265306,"post_condition_mode":0.01020408163265306,"deny":0.01020408163265306,"post_conditions":0.01020408163265306,"anchor_mode":0.01020408163265306,"on_chain_only":0.01020408163265306,"block_hash":0.01020408163265306,"0x17ceb3da5f36aab351d6b14f5aa77f85bb6b800b954b2f24c564579f80116d99":0.01020408163265306,"parent_block_hash":0.01020408163265306,"0xe0d1e8d216a77526ae2ce40294fc77038798a179a6532bb8980d3c2183f58de6":0.01020408163265306,"block_height":0.01020408163265306,"burn_block_time":0.01020408163265306,"burn_block_time_iso":0.01020408163265306,"2021-06-05t06":0.01020408163265306,"000z":0.01020408163265306,"canonical":0.01020408163265306,"true":0.01020408163265306,"tx_index":0.01020408163265306,"tx_status":0.01020408163265306,"success":0.01020408163265306,"tx_result":0.01020408163265306,"microblock_hash":0.01020408163265306,"microblock_sequence":0.01020408163265306,"microblock_canonical":0.01020408163265306,"event_count":0.01020408163265306,"events":0.01020408163265306,"tx_type":0.01020408163265306,"coinbase":0.01020408163265306,"coinbase_payload":0.01020408163265306,"using":0.01020408163265306,"and":0.01020408163265306,"properties":0.01020408163265306,"you":0.01020408163265306,"can":0.01020408163265306,"paginate":0.01020408163265306,"through":0.01020408163265306,"entire":0.01020408163265306,"increasing":0.01020408163265306,"until":0.01020408163265306,"reach":0.01020408163265306},"256":{"595650":0.007246376811594203,"import":0.007246376811594203,"database":0.007246376811594203,"ticket":0.007246376811594203,"from":0.007246376811594203,"'lucide-react'":0.007246376811594203,"blockchain":0.007246376811594203,"bitcoinicon":0.007246376811594203,"clarinet":0.007246376811594203,"container":0.007246376811594203,"dao":0.007246376811594203,"js":0.007246376811594203,"plant":0.007246376811594203,"shapes":0.007246376811594203,"stacksicon":0.007246376811594203,"'":0.007246376811594203,"components":0.007246376811594203,"ui":0.007246376811594203,"icon'":0.007246376811594203,"secondarycard":0.007246376811594203,"smallcard":0.007246376811594203,"card'":0.007246376811594203,"div":0.007246376811594203,"classname":0.007246376811594203,"'flex":0.007246376811594203,"flex-col":0.007246376811594203,"space-y-10'":0.007246376811594203,"cards":0.007246376811594203,"icon":0.007246376811594203,"href":0.007246376811594203,"stacks":0.007246376811594203,"chainhook":0.007246376811594203,"quickstart":0.007246376811594203,"title":0.007246376811594203,"stream":0.007246376811594203,"custom":0.007246376811594203,"events":0.007246376811594203,"description":0.007246376811594203,"use":0.007246376811594203,"to":0.007246376811594203,"filter":0.007246376811594203,"for":0.007246376811594203,"contract":0.007246376811594203,"deployments":0.007246376811594203,"tag":0.007246376811594203,"'chainhook'":0.007246376811594203,"flex-col'":0.007246376811594203,"h4":0.007246376811594203,"id":0.007246376811594203,"learn-by-example":0.007246376811594203,"text-":0.007246376811594203,"dark":0.007246376811594203,"8c877d":0.007246376811594203,"scroll-m-20":0.007246376811594203,"a":0.007246376811594203,"not-prose":0.007246376811594203,"group":0.007246376811594203,"text-sm":0.007246376811594203,"uppercase":0.007246376811594203,"learn":0.007246376811594203,"by":0.007246376811594203,"example":0.007246376811594203,"---":0.007246376811594203,"guides":0.007246376811594203,"build-an-nft-marketplace":0.007246376811594203,"build":0.007246376811594203,"an":0.007246376811594203,"nft":0.007246376811594203,"marketplace":0.007246376811594203,"how":0.007246376811594203,"create":0.007246376811594203,"and":0.007246376811594203,"deploy":0.007246376811594203,"your":0.007246376811594203,"own":0.007246376811594203,"launch":0.007246376811594203,"decentralized":0.007246376811594203,"autonomous":0.007246376811594203,"organization":0.007246376811594203,"discover":0.007246376811594203,"the":0.007246376811594203,"steps":0.007246376811594203,"creating":0.007246376811594203,"no-loss-lottery":0.007246376811594203,"no-loss":0.007246376811594203,"lottery":0.007246376811594203,"pool":0.007246376811594203,"that":0.007246376811594203,"leverages":0.007246376811594203,"stacking":0.007246376811594203,"yield":0.007246376811594203,"build-a-decentralized-kickstarter":0.007246376811594203,"kickstarter":0.007246376811594203,"crowdfunding":0.007246376811594203,"app":0.007246376811594203,"enabling":0.007246376811594203,"creators":0.007246376811594203,"fund":0.007246376811594203,"their":0.007246376811594203,"projects":0.007246376811594203,"without":0.007246376811594203,"third":0.007246376811594203,"party":0.007246376811594203,"installation-guides":0.007246376811594203,"installation":0.007246376811594203,"sync-a-bitcoin-node":0.007246376811594203,"sync":0.007246376811594203,"bitcoin":0.007246376811594203,"node":0.007246376811594203,"set":0.007246376811594203,"up":0.007246376811594203,"run":0.007246376811594203,"tools":0.007246376811594203,"like":0.007246376811594203,"as":0.007246376811594203,"service":0.007246376811594203,"sync-a-stacks-node":0.007246376811594203,"or":0.007246376811594203,"spin":0.007246376811594203,"api":0.007246376811594203,"installing-docker":0.007246376811594203,"install":0.007246376811594203,"docker":0.007246376811594203,"on":0.007246376811594203,"machine":0.007246376811594203,"essential":0.007246376811594203,"running":0.007246376811594203,"local":0.007246376811594203,"development":0.007246376811594203,"with":0.007246376811594203,"callout":0.007246376811594203,"type":0.007246376811594203,"tip":0.007246376811594203,"more":0.007246376811594203,"check":0.007246376811594203,"out":0.007246376811594203,"our":0.007246376811594203,"section":0.007246376811594203},"257":{"import":0.01020408163265306,"secondarycard":0.01020408163265306,"from":0.01020408163265306,"'":0.01020408163265306,"components":0.01020408163265306,"card'":0.01020408163265306,"the":0.01020408163265306,"stacks":0.01020408163265306,"blockchain":0.01020408163265306,"api":0.01020408163265306,"expands":0.01020408163265306,"intentionally":0.01020408163265306,"minimal":0.01020408163265306,"rpc":0.01020408163265306,"endpoints":0.01020408163265306,"available":0.01020408163265306,"in":0.01020408163265306,"nodes":0.01020408163265306,"and":0.01020408163265306,"indexes":0.01020408163265306,"cleans":0.01020408163265306,"enriches":0.01020408163265306,"on-chain":0.01020408163265306,"data":0.01020408163265306,"to":0.01020408163265306,"put":0.01020408163265306,"everything":0.01020408163265306,"you":0.01020408163265306,"need":0.01020408163265306,"at":0.01020408163265306,"your":0.01020408163265306,"fingertips":0.01020408163265306,"who":0.01020408163265306,"knew":0.01020408163265306,"getting":0.01020408163265306,"reliable":0.01020408163265306,"could":0.01020408163265306,"be":0.01020408163265306,"this":0.01020408163265306,"easy":0.01020408163265306,"popular":0.01020408163265306,"callout":0.01020408163265306,"title":0.01020408163265306,"type":0.01020408163265306,"info":0.01020408163265306,"if":0.01020408163265306,"you're":0.01020408163265306,"looking":0.01020408163265306,"for":0.01020408163265306,"direct":0.01020408163265306,"access":0.01020408163265306,"node":0.01020408163265306,"including":0.01020408163265306,"ability":0.01020408163265306,"broadcast":0.01020408163265306,"transactions":0.01020408163265306,"interact":0.01020408163265306,"with":0.01020408163265306,"smart":0.01020408163265306,"contracts":0.01020408163265306,"check":0.01020408163265306,"out":0.01020408163265306,"our":0.01020408163265306,"rpc-api":0.01020408163265306,"documentation":0.01020408163265306,"help":0.01020408163265306,"building":0.01020408163265306,"reach":0.01020408163265306,"us":0.01020408163265306,"on":0.01020408163265306,"span":0.01020408163265306,"classname":0.01020408163265306,"font-bold":0.01020408163265306,"channel":0.01020408163265306,"discord":0.01020408163265306,"https":0.01020408163265306,"chat":0.01020408163265306,"under":0.01020408163265306,"hiro":0.01020408163265306,"developer":0.01020408163265306,"tools":0.01020408163265306,"section":0.01020408163265306,"there's":0.01020408163265306,"also":0.01020408163265306,"a":0.01020408163265306,"weekly":0.01020408163265306,"office":0.01020408163265306,"hours":0.01020408163265306,"www":0.01020408163265306,"addevent":0.01020408163265306,"com":0.01020408163265306,"event":0.01020408163265306,"ki22007085":0.01020408163265306,"call":0.01020408163265306,"every":0.01020408163265306,"wednesday":0.01020408163265306,"1pm":0.01020408163265306,"et":0.01020408163265306},"258":{"5":0.007407407407407408,"6":0.007407407407407408,"7":0.007407407407407408,"8":0.007407407407407408,"9":0.007407407407407408,"10":0.007407407407407408,"5893":0.007407407407407408,"5894":0.007407407407407408,"in":0.007407407407407408,"order":0.007407407407407408,"to":0.007407407407407408,"prevent":0.007407407407407408,"stuck":0.007407407407407408,"transactions":0.007407407407407408,"you":0.007407407407407408,"must":0.007407407407407408,"track":0.007407407407407408,"the":0.007407407407407408,"next":0.007407407407407408,"available":0.007407407407407408,"nonce":0.007407407407407408,"for":0.007407407407407408,"principals":0.007407407407407408,"issuing":0.007407407407407408,"stacks":0.007407407407407408,"blockchain":0.007407407407407408,"api":0.007407407407407408,"provides":0.007407407407407408,"an":0.007407407407407408,"endpoint":0.007407407407407408,"make":0.007407407407407408,"handling":0.007407407407407408,"simpler":0.007407407407407408,"when":0.007407407407407408,"using":0.007407407407407408,"following":0.007407407407407408,"command":0.007407407407407408,"terminal":0.007407407407407408,"curl":0.007407407407407408,"'https":0.007407407407407408,"testnet":0.007407407407407408,"hiro":0.007407407407407408,"so":0.007407407407407408,"extended":0.007407407407407408,"v1":0.007407407407407408,"address":0.007407407407407408,"principal":0.007407407407407408,"nonces'":0.007407407407407408,"json":0.007407407407407408,"last_executed_tx_nonce":0.007407407407407408,"last_mempool_tx_nonce":0.007407407407407408,"null":0.007407407407407408,"possible_next_nonce":0.007407407407407408,"detected_missing_nonces":0.007407407407407408,"property":0.007407407407407408,"is":0.007407407407407408,"suggested":0.007407407407407408,"a":0.007407407407407408,"given":0.007407407407407408,"principal's":0.007407407407407408,"transaction":0.007407407407407408,"it":0.007407407407407408,"derived":0.007407407407407408,"as":0.007407407407407408,"integer":0.007407407407407408,"largest":0.007407407407407408,"found":0.007407407407407408,"blocks":0.007407407407407408,"and":0.007407407407407408,"mempool":0.007407407407407408,"does":0.007407407407407408,"not":0.007407407407407408,"take":0.007407407407407408,"into":0.007407407407407408,"account":0.007407407407407408,"missing":0.007407407407407408,"nonces":0.007407407407407408,"finds":0.007407407407407408,"any":0.007407407407407408,"non-contiguous":0.007407407407407408,"after":0.007407407407407408,"inspecting":0.007407407407407408,"from":0.007407407407407408,"example":0.007407407407407408,"if":0.007407407407407408,"latest":0.007407407407407408,"included":0.007407407407407408,"block":0.007407407407407408,"has":0.007407407407407408,"of":0.007407407407407408,"the's":0.007407407407407408,"only":0.007407407407407408,"one":0.007407407407407408,"with":0.007407407407407408,"then":0.007407407407407408,"indicates":0.007407407407407408,"that":0.007407407407407408,"something":0.007407407407407408,"likely":0.007407407407407408,"went":0.007407407407407408,"wrong":0.007407407407407408,"either":0.007407407407407408,"was":0.007407407407407408,"created":0.007407407407407408,"or":0.007407407407407408,"broadcasted":0.007407407407407408,"correctly":0.007407407407407408,"by":0.007407407407407408,"client":0.007407407407407408,"dropped":0.007407407407407408,"whatever":0.007407407407407408,"reason":0.007407407407407408,"this":0.007407407407407408,"strong":0.007407407407407408,"indication":0.007407407407407408,"will":0.007407407407407408,"never":0.007407407407407408,"be":0.007407407407407408,"mined":0.007407407407407408,"since":0.007407407407407408,"previous":0.007407407407407408,"clients":0.007407407407407408,"continue":0.007407407407407408,"broadcast":0.007407407407407408,"result":0.007407407407407408,"all":0.007407407407407408,"their":0.007407407407407408,"pending":0.007407407407407408,"going":0.007407407407407408,"through":0.007407407407407408,"go":0.007407407407407408,"should":0.007407407407407408,"first":0.007407407407407408,"use":0.007407407407407408,"before":0.007407407407407408},"259":{"450":0.0040650406504065045,"750":0.0040650406504065045,"import":0.0040650406504065045,"imagezoom":0.0040650406504065045,"from":0.0040650406504065045,"'fumadocs-ui":0.0040650406504065045,"components":0.0040650406504065045,"image-zoom'":0.0040650406504065045,"width":0.0040650406504065045,"height":0.0040650406504065045,"alt":0.0040650406504065045,"stacks-api-architecture":0.0040650406504065045,"src":0.0040650406504065045,"'":0.0040650406504065045,"images":0.0040650406504065045,"api":0.0040650406504065045,"architecture":0.0040650406504065045,"svg'":0.0040650406504065045,"classname":0.0040650406504065045,"mt-0":0.0040650406504065045,"mb-6":0.0040650406504065045,"first-line":0.0040650406504065045,"rounded-xl":0.0040650406504065045,"bg-background":0.0040650406504065045,"priority":0.0040650406504065045,"rpc":0.0040650406504065045,"endpoints":0.0040650406504065045,"the":0.0040650406504065045,"stacks-node":0.0040650406504065045,"has":0.0040650406504065045,"its":0.0040650406504065045,"own":0.0040650406504065045,"minimal":0.0040650406504065045,"set":0.0040650406504065045,"of":0.0040650406504065045,"http":0.0040650406504065045,"referred":0.0040650406504065045,"to":0.0040650406504065045,"as":0.0040650406504065045,"-":0.0040650406504065045,"stacks-blockchain-api":0.0040650406504065045,"allows":0.0040650406504065045,"clients":0.0040650406504065045,"access":0.0040650406504065045,"by":0.0040650406504065045,"proxying":0.0040650406504065045,"requests":0.0040650406504065045,"a":0.0040650406504065045,"load-balanced":0.0040650406504065045,"pool":0.0040650406504065045,"stacks-nodes":0.0040650406504065045,"for":0.0040650406504065045,"more":0.0040650406504065045,"details":0.0040650406504065045,"on":0.0040650406504065045,"see":0.0040650406504065045,"documentation":0.0040650406504065045,"https":0.0040650406504065045,"github":0.0040650406504065045,"com":0.0040650406504065045,"blockstack":0.0040650406504065045,"stacks-blockchain":0.0040650406504065045,"blob":0.0040650406504065045,"master":0.0040650406504065045,"docs":0.0040650406504065045,"rpc-endpoints":0.0040650406504065045,"md":0.0040650406504065045,"common":0.0040650406504065045,"include":0.0040650406504065045,"post":0.0040650406504065045,"v2":0.0040650406504065045,"transactions":0.0040650406504065045,"broadcast":0.0040650406504065045,"transaction":0.0040650406504065045,"get":0.0040650406504065045,"pox":0.0040650406504065045,"retrieve":0.0040650406504065045,"current":0.0040650406504065045,"proof":0.0040650406504065045,"transfer":0.0040650406504065045,"relevant":0.0040650406504065045,"information":0.0040650406504065045,"contracts":0.0040650406504065045,"call-read":0.0040650406504065045,"contract":0.0040650406504065045,"function":0.0040650406504065045,"evaluate":0.0040650406504065045,"and":0.0040650406504065045,"return":0.0040650406504065045,"result":0.0040650406504065045,"calling":0.0040650406504065045,"clarity":0.0040650406504065045,"fees":0.0040650406504065045,"given":0.0040650406504065045,"provide":0.0040650406504065045,"fee":0.0040650406504065045,"estimation":0.0040650406504065045,"data":0.0040650406504065045,"accounts":0.0040650406504065045,"address":0.0040650406504065045,"fetch":0.0040650406504065045,"nonce":0.0040650406504065045,"required":0.0040650406504065045,"creating":0.0040650406504065045,"additional":0.0040650406504065045,"stacks":0.0040650406504065045,"blockchain":0.0040650406504065045,"implements":0.0040650406504065045,"that":0.0040650406504065045,"unavailable":0.0040650406504065045,"directly":0.0040650406504065045,"nodes":0.0040650406504065045,"due":0.0040650406504065045,"various":0.0040650406504065045,"constraints":0.0040650406504065045,"may":0.0040650406504065045,"not":0.0040650406504065045,"persist":0.0040650406504065045,"certain":0.0040650406504065045,"or":0.0040650406504065045,"serve":0.0040650406504065045,"it":0.0040650406504065045,"efficiently":0.0040650406504065045,"many":0.0040650406504065045,"instance":0.0040650406504065045,"while":0.0040650406504065045,"can":0.0040650406504065045,"stx":0.0040650406504065045,"balance":0.0040650406504065045,"an":0.0040650406504065045,"account":0.0040650406504065045,"cannot":0.0040650406504065045,"history":0.0040650406504065045,"rosetta":0.0040650406504065045,"specification":0.0040650406504065045,"coinbase":0.0040650406504065045,"open":0.0040650406504065045,"standard":0.0040650406504065045,"designed":0.0040650406504065045,"simplify":0.0040650406504065045,"deployment":0.0040650406504065045,"interaction":0.0040650406504065045,"be":0.0040650406504065045,"found":0.0040650406504065045,"at":0.0040650406504065045,"www":0.0040650406504065045,"rosetta-api":0.0040650406504065045,"org":0.0040650406504065045,"includes":0.0040650406504065045,"support":0.0040650406504065045,"naming":0.0040650406504065045,"system":0.0040650406504065045,"bns":0.0040650406504065045,"are":0.0040650406504065045,"available":0.0040650406504065045,"co":0.0040650406504065045,"example-contracts":0.0040650406504065045,"express":0.0040650406504065045,"js":0.0040650406504065045,"routes":0.0040650406504065045,"directory":0.0040650406504065045,"creates":0.0040650406504065045,"event":0.0040650406504065045,"observer":0.0040650406504065045,"server":0.0040650406504065045,"which":0.0040650406504065045,"listens":0.0040650406504065045,"events":0.0040650406504065045,"emitter":0.0040650406504065045,"containing":0.0040650406504065045,"blocks":0.0040650406504065045,"byproducts":0.0040650406504065045,"executed":0.0040650406504065045,"such":0.0040650406504065045,"asset":0.0040650406504065045,"transfers":0.0040650406504065045,"smart-contract":0.0040650406504065045,"log":0.0040650406504065045,"execution":0.0040650406504065045,"cost":0.0040650406504065045,"processes":0.0040650406504065045,"stores":0.0040650406504065045,"these":0.0040650406504065045,"relational":0.0040650406504065045,"in":0.0040650406504065045,"postgresql":0.0040650406504065045,"code":0.0040650406504065045,"event-stream":0.0040650406504065045,"openapi":0.0040650406504065045,"json":0.0040650406504065045,"schema":0.0040650406504065045,"all":0.0040650406504065045,"responses":0.0040650406504065045,"defined":0.0040650406504065045,"yaml":0.0040650406504065045,"used":0.0040650406504065045,"auto-generate":0.0040650406504065045,"hirosystems":0.0040650406504065045,"io":0.0040650406504065045,"schemas":0.0040650406504065045,"converted":0.0040650406504065045,"into":0.0040650406504065045,"typescript":0.0040650406504065045,"interfaces":0.0040650406504065045,"internally":0.0040650406504065045,"db":0.0040650406504065045,"controller":0.0040650406504065045,"module":0.0040650406504065045,"transform":0.0040650406504065045,"sql":0.0040650406504065045,"query":0.0040650406504065045,"results":0.0040650406504065045,"correct":0.0040650406504065045,"object":0.0040650406504065045,"shapes":0.0040650406504065045,"also":0.0040650406504065045,"generate":0.0040650406504065045,"standalone":0.0040650406504065045,"blockchain-api-client":0.0040650406504065045,"development":0.0040650406504065045,"setup":0.0040650406504065045,"easiest":0.0040650406504065045,"quickest":0.0040650406504065045,"way":0.0040650406504065045,"develop":0.0040650406504065045,"this":0.0040650406504065045,"repo":0.0040650406504065045,"is":0.0040650406504065045,"using":0.0040650406504065045,"vs":0.0040650406504065045,"debugger":0.0040650406504065045,"uses":0.0040650406504065045,"docker-compose":0.0040650406504065045,"up":0.0040650406504065045,"postgres":0.0040650406504065045,"alternatively":0.0040650406504065045,"you":0.0040650406504065045,"run":0.0040650406504065045,"npm":0.0040650406504065045,"dev":0.0040650406504065045,"integrated":0.0040650406504065045,"does":0.0040650406504065045,"same":0.0040650406504065045,"thing":0.0040650406504065045,"but":0.0040650406504065045,"without":0.0040650406504065045},"260":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v2":0.0625,"blocks":0.0625,"height_or_hash":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"261":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"stacks-blockchain-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"extended":0.06666666666666667,"v1":0.06666666666666667,"block":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"262":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v1":0.0625,"block":0.0625,"hash":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"263":{},"264":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v2":0.058823529411764705,"burn-blocks":0.058823529411764705,"height_or_hash":0.058823529411764705,"blocks'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"265":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"block":0.058823529411764705,"by_burn_block_height":0.058823529411764705,"burn_block_height":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"266":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v2":0.0625,"blocks":0.0625,"average-times'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"267":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"stacks-blockchain-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"extended":0.06666666666666667,"v2":0.06666666666666667,"blocks":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"268":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"block":0.058823529411764705,"by_burn_block_hash":0.058823529411764705,"burn_block_hash":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"269":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"block":0.058823529411764705,"by_height":0.058823529411764705,"height":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"270":{"apipage":0.07142857142857142,"document":0.07142857142857142,"openapi":0.07142857142857142,"stacks-blockchain-api":0.07142857142857142,"json":0.07142857142857142,"operations":0.07142857142857142,"path":0.07142857142857142,"'":0.07142857142857142,"v1":0.07142857142857142,"names":0.07142857142857142,"method":0.07142857142857142,"'get'":0.07142857142857142,"hashead":0.07142857142857142,"false":0.07142857142857142},"271":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"v1":0.0625,"names":0.0625,"name":0.0625,"subdomains'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"272":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"v1":0.0625,"names":0.0625,"name":0.0625,"zonefile'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"273":{},"274":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"v1":0.0625,"addresses":0.0625,"blockchain":0.0625,"address":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"275":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"v1":0.0625,"namespaces":0.0625,"tld":0.0625,"names'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"276":{"apipage":0.07142857142857142,"document":0.07142857142857142,"openapi":0.07142857142857142,"stacks-blockchain-api":0.07142857142857142,"json":0.07142857142857142,"operations":0.07142857142857142,"path":0.07142857142857142,"'":0.07142857142857142,"v1":0.07142857142857142,"namespaces":0.07142857142857142,"method":0.07142857142857142,"'get'":0.07142857142857142,"hashead":0.07142857142857142,"false":0.07142857142857142},"277":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"stacks-blockchain-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"v1":0.06666666666666667,"names":0.06666666666666667,"name":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"278":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"v1":0.058823529411764705,"names":0.058823529411764705,"name":0.058823529411764705,"zonefile":0.058823529411764705,"zonefilehash":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"279":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"stacks-blockchain-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"extended":0.06666666666666667,"v1":0.06666666666666667,"fee_rate":0.06666666666666667,"method":0.06666666666666667,"'post'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"280":{},"281":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v1":0.0625,"burnchain":0.0625,"rewards'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"282":{},"283":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"burnchain":0.058823529411764705,"rewards":0.058823529411764705,"address":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"284":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v1":0.0625,"burnchain":0.0625,"reward_slot_holders'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"285":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"burnchain":0.058823529411764705,"reward_slot_holders":0.058823529411764705,"address":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"286":{"apipage":0.05555555555555555,"document":0.05555555555555555,"openapi":0.05555555555555555,"stacks-blockchain-api":0.05555555555555555,"json":0.05555555555555555,"operations":0.05555555555555555,"path":0.05555555555555555,"'":0.05555555555555555,"extended":0.05555555555555555,"v1":0.05555555555555555,"burnchain":0.05555555555555555,"rewards":0.05555555555555555,"address":0.05555555555555555,"total'":0.05555555555555555,"method":0.05555555555555555,"'get'":0.05555555555555555,"hashead":0.05555555555555555,"false":0.05555555555555555},"287":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v2":0.0625,"pox":0.0625,"cycles'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"288":{},"289":{"apipage":0.05263157894736842,"document":0.05263157894736842,"openapi":0.05263157894736842,"stacks-blockchain-api":0.05263157894736842,"json":0.05263157894736842,"operations":0.05263157894736842,"path":0.05263157894736842,"'":0.05263157894736842,"extended":0.05263157894736842,"v2":0.05263157894736842,"pox":0.05263157894736842,"cycles":0.05263157894736842,"cycle_number":0.05263157894736842,"signers":0.05263157894736842,"signer_key":0.05263157894736842,"method":0.05263157894736842,"'get'":0.05263157894736842,"hashead":0.05263157894736842,"false":0.05263157894736842},"290":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v2":0.058823529411764705,"pox":0.058823529411764705,"cycles":0.058823529411764705,"cycle_number":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"291":{"apipage":0.05555555555555555,"document":0.05555555555555555,"openapi":0.05555555555555555,"stacks-blockchain-api":0.05555555555555555,"json":0.05555555555555555,"operations":0.05555555555555555,"path":0.05555555555555555,"'":0.05555555555555555,"extended":0.05555555555555555,"v2":0.05555555555555555,"pox":0.05555555555555555,"cycles":0.05555555555555555,"cycle_number":0.05555555555555555,"signers'":0.05555555555555555,"method":0.05555555555555555,"'get'":0.05555555555555555,"hashead":0.05555555555555555,"false":0.05555555555555555},"292":{"apipage":0.05,"document":0.05,"openapi":0.05,"stacks-blockchain-api":0.05,"json":0.05,"operations":0.05,"path":0.05,"'":0.05,"extended":0.05,"v2":0.05,"pox":0.05,"cycles":0.05,"cycle_number":0.05,"signers":0.05,"signer_key":0.05,"stackers'":0.05,"method":0.05,"'get'":0.05,"hashead":0.05,"false":0.05},"293":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v1":0.0625,"search":0.0625,"id":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"294":{},"295":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"stacks-blockchain-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"extended":0.06666666666666667,"v1":0.06666666666666667,"stx_supply":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"296":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"info":0.058823529411764705,"network_block_time":0.058823529411764705,"network":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"297":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"stx_supply":0.058823529411764705,"circulating":0.058823529411764705,"plain'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"298":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v1":0.0625,"info":0.0625,"network_block_times'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"299":{},"300":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"stx_supply":0.058823529411764705,"total":0.058823529411764705,"plain'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"301":{"apipage":0.07692307692307693,"document":0.07692307692307693,"openapi":0.07692307692307693,"stacks-blockchain-api":0.07692307692307693,"json":0.07692307692307693,"operations":0.07692307692307693,"path":0.07692307692307693,"'":0.07692307692307693,"extended'":0.07692307692307693,"method":0.07692307692307693,"'get'":0.07692307692307693,"hashead":0.07692307692307693,"false":0.07692307692307693},"302":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v1":0.0625,"stx_supply":0.0625,"legacy_format'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"303":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v2":0.058823529411764705,"addresses":0.058823529411764705,"address":0.058823529411764705,"transactions'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"304":{"apipage":0.05263157894736842,"document":0.05263157894736842,"openapi":0.05263157894736842,"stacks-blockchain-api":0.05263157894736842,"json":0.05263157894736842,"operations":0.05263157894736842,"path":0.05263157894736842,"'":0.05263157894736842,"extended":0.05263157894736842,"v2":0.05263157894736842,"addresses":0.05263157894736842,"address":0.05263157894736842,"transactions":0.05263157894736842,"tx_id":0.05263157894736842,"events'":0.05263157894736842,"method":0.05263157894736842,"'get'":0.05263157894736842,"hashead":0.05263157894736842,"false":0.05263157894736842},"305":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v1":0.0625,"tx":0.0625,"events'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"306":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"tx":0.058823529411764705,"mempool":0.058823529411764705,"stats'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"307":{},"308":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v1":0.0625,"address":0.0625,"mempool'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"309":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"tx":0.058823529411764705,"mempool":0.058823529411764705,"dropped'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"310":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v1":0.0625,"tx":0.0625,"tx_id":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"311":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v1":0.0625,"tx":0.0625,"multiple'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"312":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"stacks-blockchain-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"extended":0.06666666666666667,"v1":0.06666666666666667,"tx":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"313":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v1":0.0625,"tx":0.0625,"mempool'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"314":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v2":0.058823529411764705,"blocks":0.058823529411764705,"height_or_hash":0.058823529411764705,"transactions'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"315":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"tx":0.058823529411764705,"tx_id":0.058823529411764705,"raw'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"316":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"pox4":0.058823529411764705,"pool_principal":0.058823529411764705,"delegations":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"317":{},"318":{},"319":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v1":0.0625,"faucets":0.0625,"stx'":0.0625,"method":0.0625,"'post'":0.0625,"hashead":0.0625,"false":0.0625},"320":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"address":0.058823529411764705,"principal":0.058823529411764705,"transactions_with_transfers'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"321":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"address":0.058823529411764705,"principal":0.058823529411764705,"balances'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"322":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"address":0.058823529411764705,"principal":0.058823529411764705,"transactions'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"323":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"address":0.058823529411764705,"principal":0.058823529411764705,"nft_events'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"324":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"address":0.058823529411764705,"principal":0.058823529411764705,"assets'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"325":{"apipage":0.05555555555555555,"document":0.05555555555555555,"openapi":0.05555555555555555,"stacks-blockchain-api":0.05555555555555555,"json":0.05555555555555555,"operations":0.05555555555555555,"path":0.05555555555555555,"'":0.05555555555555555,"extended":0.05555555555555555,"v1":0.05555555555555555,"address":0.05555555555555555,"principal":0.05555555555555555,"tx_id":0.05555555555555555,"with_transfers'":0.05555555555555555,"method":0.05555555555555555,"'get'":0.05555555555555555,"hashead":0.05555555555555555,"false":0.05555555555555555},"326":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"address":0.058823529411764705,"principal":0.058823529411764705,"nonces'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"327":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"address":0.058823529411764705,"principal":0.058823529411764705,"stx'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"328":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"address":0.058823529411764705,"principal":0.058823529411764705,"stx_inbound'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"329":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"contract":0.058823529411764705,"contract_id":0.058823529411764705,"events'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"330":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v1":0.0625,"contract":0.0625,"by_trait'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"331":{},"332":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v1":0.0625,"contract":0.0625,"contract_id":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"333":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v2":0.0625,"smart-contracts":0.0625,"status'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"334":{},"335":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v2":0.0625,"mempool":0.0625,"fees'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"336":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-blockchain-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"extended":0.0625,"v2":0.0625,"burn-blocks":0.0625,"height_or_hash":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"337":{},"338":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"stacks-blockchain-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"extended":0.06666666666666667,"v2":0.06666666666666667,"burn-blocks":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"339":{},"340":{"apipage":0.05555555555555555,"document":0.05555555555555555,"openapi":0.05555555555555555,"stacks-blockchain-api":0.05555555555555555,"json":0.05555555555555555,"operations":0.05555555555555555,"path":0.05555555555555555,"'":0.05555555555555555,"extended":0.05555555555555555,"v1":0.05555555555555555,"tokens":0.05555555555555555,"ft":0.05555555555555555,"token":0.05555555555555555,"holders'":0.05555555555555555,"method":0.05555555555555555,"'get'":0.05555555555555555,"hashead":0.05555555555555555,"false":0.05555555555555555},"341":{},"342":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"tokens":0.058823529411764705,"nft":0.058823529411764705,"holdings'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"343":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"tokens":0.058823529411764705,"nft":0.058823529411764705,"mints'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"344":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-blockchain-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"extended":0.058823529411764705,"v1":0.058823529411764705,"tokens":0.058823529411764705,"nft":0.058823529411764705,"history'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"345":{"import":0.01020408163265306,"secondarycard":0.01020408163265306,"from":0.01020408163265306,"'":0.01020408163265306,"components":0.01020408163265306,"card'":0.01020408163265306,"the":0.01020408163265306,"stacks":0.01020408163265306,"blockchain":0.01020408163265306,"api":0.01020408163265306,"expands":0.01020408163265306,"intentionally":0.01020408163265306,"minimal":0.01020408163265306,"rpc":0.01020408163265306,"endpoints":0.01020408163265306,"available":0.01020408163265306,"in":0.01020408163265306,"nodes":0.01020408163265306,"and":0.01020408163265306,"indexes":0.01020408163265306,"cleans":0.01020408163265306,"enriches":0.01020408163265306,"on-chain":0.01020408163265306,"data":0.01020408163265306,"to":0.01020408163265306,"put":0.01020408163265306,"everything":0.01020408163265306,"you":0.01020408163265306,"need":0.01020408163265306,"at":0.01020408163265306,"your":0.01020408163265306,"fingertips":0.01020408163265306,"who":0.01020408163265306,"knew":0.01020408163265306,"getting":0.01020408163265306,"reliable":0.01020408163265306,"could":0.01020408163265306,"be":0.01020408163265306,"this":0.01020408163265306,"easy":0.01020408163265306,"popular":0.01020408163265306,"callout":0.01020408163265306,"title":0.01020408163265306,"type":0.01020408163265306,"info":0.01020408163265306,"if":0.01020408163265306,"you're":0.01020408163265306,"looking":0.01020408163265306,"for":0.01020408163265306,"direct":0.01020408163265306,"access":0.01020408163265306,"node":0.01020408163265306,"including":0.01020408163265306,"ability":0.01020408163265306,"broadcast":0.01020408163265306,"transactions":0.01020408163265306,"interact":0.01020408163265306,"with":0.01020408163265306,"smart":0.01020408163265306,"contracts":0.01020408163265306,"check":0.01020408163265306,"out":0.01020408163265306,"our":0.01020408163265306,"rpc-api":0.01020408163265306,"documentation":0.01020408163265306,"help":0.01020408163265306,"building":0.01020408163265306,"reach":0.01020408163265306,"us":0.01020408163265306,"on":0.01020408163265306,"span":0.01020408163265306,"classname":0.01020408163265306,"font-bold":0.01020408163265306,"channel":0.01020408163265306,"discord":0.01020408163265306,"https":0.01020408163265306,"chat":0.01020408163265306,"under":0.01020408163265306,"hiro":0.01020408163265306,"developer":0.01020408163265306,"tools":0.01020408163265306,"section":0.01020408163265306,"there's":0.01020408163265306,"also":0.01020408163265306,"a":0.01020408163265306,"weekly":0.01020408163265306,"office":0.01020408163265306,"hours":0.01020408163265306,"www":0.01020408163265306,"addevent":0.01020408163265306,"com":0.01020408163265306,"event":0.01020408163265306,"ki22007085":0.01020408163265306,"call":0.01020408163265306,"every":0.01020408163265306,"wednesday":0.01020408163265306,"1pm":0.01020408163265306,"et":0.01020408163265306},"346":{"0":0.015625,"several":0.015625,"endpoints":0.015625,"will":0.015625,"request":0.015625,"the":0.015625,"marf":0.015625,"merkel":0.015625,"proof":0.015625,"https":0.015625,"github":0.015625,"com":0.015625,"stacksgov":0.015625,"sips":0.015625,"blob":0.015625,"main":0.015625,"sip-004":0.015625,"sip-004-materialized-view":0.015625,"md":0.015625,"marf-merkle-proofs":0.015625,"by":0.015625,"default":0.015625,"provided":0.015625,"with":0.015625,"a":0.015625,"client":0.015625,"can":0.015625,"verify":0.015625,"value":0.015625,"cumulative":0.015625,"energy":0.015625,"spent":0.015625,"and":0.015625,"number":0.015625,"of":0.015625,"confirmation":0.015625,"for":0.015625,"response":0.015625,"api":0.015625,"requesting":0.015625,"requires":0.015625,"more":0.015625,"resources":0.015625,"computation":0.015625,"time":0.015625,"body":0.015625,"size":0.015625,"to":0.015625,"avoid":0.015625,"additional":0.015625,"in":0.015625,"case":0.015625,"verification":0.015625,"is":0.015625,"not":0.015625,"required":0.015625,"allow":0.015625,"setting":0.015625,"parameter":0.015625,"returned":0.015625,"object":0.015625,"have":0.015625,"any":0.015625,"fields":0.015625},"347":{"import":0.012658227848101266,"secondarycard":0.012658227848101266,"from":0.012658227848101266,"'":0.012658227848101266,"components":0.012658227848101266,"card'":0.012658227848101266,"lfg":0.012658227848101266,"related":0.012658227848101266,"tools":0.012658227848101266,"-":0.012658227848101266,"clarinet":0.012658227848101266,"stacks":0.012658227848101266,"build":0.012658227848101266,"your":0.012658227848101266,"app":0.012658227848101266,"in":0.012658227848101266,"a":0.012658227848101266,"local":0.012658227848101266,"environment":0.012658227848101266,"on":0.012658227848101266,"js":0.012658227848101266,"don":0.012658227848101266,"t":0.012658227848101266,"reinvent":0.012658227848101266,"the":0.012658227848101266,"wheel":0.012658227848101266,"and":0.012658227848101266,"faster":0.012658227848101266,"with":0.012658227848101266,"library":0.012658227848101266,"that":0.012658227848101266,"handles":0.012658227848101266,"basic":0.012658227848101266,"blockchain":0.012658227848101266,"functionality":0.012658227848101266,"api":0.012658227848101266,"fetch":0.012658227848101266,"data":0.012658227848101266,"broadcast":0.012658227848101266,"transactions":0.012658227848101266,"br":0.012658227848101266,"callout":0.012658227848101266,"title":0.012658227848101266,"need":0.012658227848101266,"help":0.012658227848101266,"building":0.012658227848101266,"sdk":0.012658227848101266,"type":0.012658227848101266,"reach":0.012658227848101266,"out":0.012658227848101266,"to":0.012658227848101266,"us":0.012658227848101266,"span":0.012658227848101266,"classname":0.012658227848101266,"font-bold":0.012658227848101266,"channel":0.012658227848101266,"discord":0.012658227848101266,"https":0.012658227848101266,"chat":0.012658227848101266,"under":0.012658227848101266,"hiro":0.012658227848101266,"developer":0.012658227848101266,"section":0.012658227848101266,"there's":0.012658227848101266,"also":0.012658227848101266,"weekly":0.012658227848101266,"office":0.012658227848101266,"hours":0.012658227848101266,"www":0.012658227848101266,"addevent":0.012658227848101266,"com":0.012658227848101266,"event":0.012658227848101266,"ki22007085":0.012658227848101266,"call":0.012658227848101266,"every":0.012658227848101266,"wednesday":0.012658227848101266,"at":0.012658227848101266,"1pm":0.012658227848101266,"et":0.012658227848101266},"348":{"0":0.002386634844868735,"1":0.002386634844868735,"2":0.002386634844868735,"3":0.002386634844868735,"10":0.002386634844868735,"100":0.002386634844868735,"1000":0.002386634844868735,"integration":0.002386634844868735,"testing":0.002386634844868735,"is":0.002386634844868735,"a":0.002386634844868735,"crucial":0.002386634844868735,"step":0.002386634844868735,"in":0.002386634844868735,"smart":0.002386634844868735,"contract":0.002386634844868735,"development":0.002386634844868735,"that":0.002386634844868735,"involves":0.002386634844868735,"how":0.002386634844868735,"different":0.002386634844868735,"components":0.002386634844868735,"of":0.002386634844868735,"your":0.002386634844868735,"system":0.002386634844868735,"work":0.002386634844868735,"together":0.002386634844868735,"the":0.002386634844868735,"clarinet":0.002386634844868735,"js":0.002386634844868735,"sdk":0.002386634844868735,"provides":0.002386634844868735,"powerful":0.002386634844868735,"tools":0.002386634844868735,"for":0.002386634844868735,"writing":0.002386634844868735,"and":0.002386634844868735,"running":0.002386634844868735,"tests":0.002386634844868735,"allowing":0.002386634844868735,"you":0.002386634844868735,"to":0.002386634844868735,"simulate":0.002386634844868735,"complex":0.002386634844868735,"scenarios":0.002386634844868735,"interactions":0.002386634844868735,"between":0.002386634844868735,"multiple":0.002386634844868735,"contracts":0.002386634844868735,"by":0.002386634844868735,"using":0.002386634844868735,"can":0.002386634844868735,"ensure":0.002386634844868735,"function":0.002386634844868735,"correctly":0.002386634844868735,"as":0.002386634844868735,"part":0.002386634844868735,"larger":0.002386634844868735,"catch":0.002386634844868735,"potential":0.002386634844868735,"issues":0.002386634844868735,"might":0.002386634844868735,"not":0.002386634844868735,"be":0.002386634844868735,"apparent":0.002386634844868735,"unit":0.002386634844868735,"alone":0.002386634844868735,"this":0.002386634844868735,"guide":0.002386634844868735,"will":0.002386634844868735,"set":0.002386634844868735,"up":0.002386634844868735,"project":0.002386634844868735,"with":0.002386634844868735,"defi":0.002386634844868735,"set-up-a-clarinet-project":0.002386634844868735,"write":0.002386634844868735,"an":0.002386634844868735,"test":0.002386634844868735,"test-the-deposit-and-borrow-functionality":0.002386634844868735,"run":0.002386634844868735,"generate":0.002386634844868735,"coverage":0.002386634844868735,"reports":0.002386634844868735,"run-tests-and-generate-coverage-reports":0.002386634844868735,"---":0.002386634844868735,"start":0.002386634844868735,"creating":0.002386634844868735,"new":0.002386634844868735,"command":0.002386634844868735,"create":0.002386634844868735,"directory":0.002386634844868735,"named":0.002386634844868735,"basic":0.002386634844868735,"inside":0.002386634844868735,"it":0.002386634844868735,"terminal":0.002386634844868735,"stx-defi":0.002386634844868735,"cd":0.002386634844868735,"after":0.002386634844868735,"changing":0.002386634844868735,"into":0.002386634844868735,"npm":0.002386634844868735,"install":0.002386634844868735,"package":0.002386634844868735,"dependencies":0.002386634844868735,"we":0.002386634844868735,"are":0.002386634844868735,"going":0.002386634844868735,"use":0.002386634844868735,"same":0.002386634844868735,"used":0.002386634844868735,"stacks":0.002386634844868735,"clarinet-js-sdk":0.002386634844868735,"guides":0.002386634844868735,"unit-testing":0.002386634844868735,"but":0.002386634844868735,"some":0.002386634844868735,"additional":0.002386634844868735,"functionality":0.002386634844868735,"-":0.002386634844868735,"ability":0.002386634844868735,"borrow":0.002386634844868735,"stx":0.002386634844868735,"from":0.002386634844868735,"if":0.002386634844868735,"don't":0.002386634844868735,"have":0.002386634844868735,"already":0.002386634844868735,"follow":0.002386634844868735,"steps":0.002386634844868735,"below":0.002386634844868735,"then":0.002386634844868735,"clar":0.002386634844868735,"file":0.002386634844868735,"copy":0.002386634844868735,"paste":0.002386634844868735,"following":0.002386634844868735,"code":0.002386634844868735,"clarity":0.002386634844868735,"error":0.002386634844868735,"constants":0.002386634844868735,"various":0.002386634844868735,"failure":0.002386634844868735,"define-constant":0.002386634844868735,"err-overborrow":0.002386634844868735,"err":0.002386634844868735,"u300":0.002386634844868735,"interest":0.002386634844868735,"rate":0.002386634844868735,"loans":0.002386634844868735,"represented":0.002386634844868735,"out":0.002386634844868735,"base":0.002386634844868735,"define-data-var":0.002386634844868735,"loan-interest-rate":0.002386634844868735,"uint":0.002386634844868735,"u10":0.002386634844868735,"representing":0.002386634844868735,"holds":0.002386634844868735,"total":0.002386634844868735,"amount":0.002386634844868735,"deposits":0.002386634844868735,"initialized":0.002386634844868735,"total-deposits":0.002386634844868735,"u0":0.002386634844868735,"maps":0.002386634844868735,"user's":0.002386634844868735,"principal":0.002386634844868735,"address":0.002386634844868735,"their":0.002386634844868735,"deposited":0.002386634844868735,"define-map":0.002386634844868735,"owner":0.002386634844868735,"borrower's":0.002386634844868735,"loan":0.002386634844868735,"details":0.002386634844868735,"last":0.002386634844868735,"interaction":0.002386634844868735,"block":0.002386634844868735,"last-interaction-block":0.002386634844868735,"public":0.002386634844868735,"users":0.002386634844868735,"deposit":0.002386634844868735,"updates":0.002386634844868735,"balance":0.002386634844868735,"define-public":0.002386634844868735,"let":0.002386634844868735,"fetch":0.002386634844868735,"current":0.002386634844868735,"or":0.002386634844868735,"default":0.002386634844868735,"none":0.002386634844868735,"exists":0.002386634844868735,"current-balance":0.002386634844868735,"default-to":0.002386634844868735,"get":0.002386634844868735,"map-get":0.002386634844868735,"tx-sender":0.002386634844868735,"transfer":0.002386634844868735,"sender":0.002386634844868735,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.002386634844868735,"recipient":0.002386634844868735,"ie":0.002386634844868735,"identifier":0.002386634844868735,"on":0.002386634844868735,"chain":0.002386634844868735,"try":0.002386634844868735,"stx-transfer":0.002386634844868735,"as-contract":0.002386634844868735,"update":0.002386634844868735,"map":0.002386634844868735,"map-set":0.002386634844868735,"variable":0.002386634844868735,"var-set":0.002386634844868735,"var-get":0.002386634844868735,"return":0.002386634844868735,"success":0.002386634844868735,"ok":0.002386634844868735,"true":0.002386634844868735,"based":0.002386634844868735,"user-deposit":0.002386634844868735,"calculate":0.002386634844868735,"maximum":0.002386634844868735,"user":0.002386634844868735,"allowed":0.002386634844868735,"which":0.002386634844868735,"upto":0.002386634844868735,"half":0.002386634844868735,"what":0.002386634844868735,"they":0.002386634844868735,"allowed-borrow":0.002386634844868735,"u2":0.002386634844868735,"initial":0.002386634844868735,"values":0.002386634844868735,"current-loan-details":0.002386634844868735,"accrued":0.002386634844868735,"accrued-interest":0.002386634844868735,"calculate-accrued-interest":0.002386634844868735,"due":0.002386634844868735,"including":0.002386634844868735,"total-due":0.002386634844868735,"unwrap-panic":0.002386634844868735,"borrowing":0.002386634844868735,"new-loan":0.002386634844868735,"requested":0.002386634844868735,"does":0.002386634844868735,"exceed":0.002386634844868735,"asserts":0.002386634844868735,"borrowed":0.002386634844868735,"block-height":0.002386634844868735,"read-only":0.002386634844868735,"define-read-only":0.002386634844868735,"get-balance-by-sender":0.002386634844868735,"owed":0.002386634844868735,"get-amount-owed":0.002386634844868735,"private":0.002386634844868735,"define-private":0.002386634844868735,"start-block":0.002386634844868735,"number":0.002386634844868735,"blocks":0.002386634844868735,"elapsed":0.002386634844868735,"since":0.002386634844868735,"elapsed-blocks":0.002386634844868735,"time":0.002386634844868735,"u10000":0.002386634844868735,"started":0.002386634844868735,"past":0.002386634844868735,"at":0.002386634844868735,"is-eq":0.002386634844868735,"calculated":0.002386634844868735,"check":0.002386634844868735,"valid":0.002386634844868735,"ready":0.002386634844868735,"callout":0.002386634844868735,"find":0.002386634844868735,"full":0.002386634844868735,"repo":0.002386634844868735,"https":0.002386634844868735,"github":0.002386634844868735,"com":0.002386634844868735,"hirosystems":0.002386634844868735,"clarity-examples":0.002386634844868735,"tree":0.002386634844868735,"main":0.002386634844868735,"examples":0.002386634844868735,"order":0.002386634844868735,"must":0.002386634844868735,"first":0.002386634844868735,"therefore":0.002386634844868735,"need":0.002386634844868735,"simulates":0.002386634844868735,"these":0.002386634844868735,"two":0.002386634844868735,"functions":0.002386634844868735,"ts":0.002386634844868735,"replace":0.002386634844868735,"boilerplate":0.002386634844868735,"add":0.002386634844868735,"typescript":0.002386634844868735,"import":0.002386634844868735,"describe":0.002386634844868735,"expect":0.002386634844868735,"'vitest'":0.002386634844868735,"cl":0.002386634844868735,"'":0.002386634844868735,"transactions'":0.002386634844868735,"const":0.002386634844868735,"accounts":0.002386634844868735,"simnet":0.002386634844868735,"getaccounts":0.002386634844868735,"wallet1":0.002386634844868735,"'wallet_1'":0.002386634844868735,"'stx-defi'":0.002386634844868735,"'borrows":0.002386634844868735,"verifies":0.002386634844868735,"10'":0.002386634844868735,"callpublicfn":0.002386634844868735,"'defi'":0.002386634844868735,"'deposit'":0.002386634844868735,"totaldeposits":0.002386634844868735,"getdatavar":0.002386634844868735,"'total-deposits'":0.002386634844868735,"tobeuint":0.002386634844868735,"'borrow'":0.002386634844868735,"result":0.002386634844868735,"callreadonlyfn":0.002386634844868735,"'get-amount-owed'":0.002386634844868735,"tobeok":0.002386634844868735,"we're":0.002386634844868735,"simulating":0.002386634844868735,"scenario":0.002386634844868735,"where":0.002386634844868735,"borrows":0.002386634844868735,"against":0.002386634844868735,"let's":0.002386634844868735,"walk":0.002386634844868735,"through":0.002386634844868735,"process":0.002386634844868735,"do":0.002386634844868735,"method":0.002386634844868735,"object":0.002386634844868735,"allows":0.002386634844868735,"us":0.002386634844868735,"call":0.002386634844868735,"our":0.002386634844868735,"just":0.002386634844868735,"would":0.002386634844868735,"actual":0.002386634844868735,"blockchain":0.002386634844868735,"making":0.002386634844868735,"want":0.002386634844868735,"verify":0.002386634844868735,"was":0.002386634844868735,"successful":0.002386634844868735,"checking":0.002386634844868735,"handy":0.002386634844868735,"lets":0.002386634844868735,"peek":0.002386634844868735,"value":0.002386634844868735,"data":0.002386634844868735,"variables":0.002386634844868735,"defined":0.002386634844868735,"learn":0.002386634844868735,"more":0.002386634844868735,"about":0.002386634844868735,"available":0.002386634844868735,"methods":0.002386634844868735,"reference":0.002386634844868735,"page":0.002386634844868735,"references":0.002386634844868735,"recorded":0.002386634844868735,"custom":0.002386634844868735,"matcher":0.002386634844868735,"specifically":0.002386634844868735,"designed":0.002386634844868735,"unsigned":0.002386634844868735,"integer":0.002386634844868735,"exact":0.002386634844868735,"confirmed":0.002386634844868735,"another":0.002386634844868735,"invoking":0.002386634844868735,"operation":0.002386634844868735,"much":0.002386634844868735,"owes":0.002386634844868735,"finally":0.002386634844868735,"particularly":0.002386634844868735,"useful":0.002386634844868735,"because":0.002386634844868735,"checks":0.002386634844868735,"things":0.002386634844868735,"once":0.002386634844868735,"returned":0.002386634844868735,"response":0.002386634844868735,"type":0.002386634844868735,"matchers":0.002386634844868735,"allow":0.002386634844868735,"make":0.002386634844868735,"detailed":0.002386634844868735,"assertions":0.002386634844868735,"results":0.002386634844868735,"report":0.002386634844868735,"produce":0.002386634844868735,"helping":0.002386634844868735,"identify":0.002386634844868735,"any":0.002386634844868735,"untested":0.002386634844868735,"parts":0.002386634844868735,"next":0.002386634844868735,"cards":0.002386634844868735,"card":0.002386634844868735,"href":0.002386634844868735,"title":0.002386634844868735,"api":0.002386634844868735,"description":0.002386634844868735,"dive":0.002386634844868735,"deeper":0.002386634844868735,"properties":0.002386634844868735,"custom-matchers":0.002386634844868735},"349":{"import":0.012658227848101266,"secondarycard":0.012658227848101266,"from":0.012658227848101266,"'":0.012658227848101266,"components":0.012658227848101266,"card'":0.012658227848101266,"lfg":0.012658227848101266,"related":0.012658227848101266,"tools":0.012658227848101266,"-":0.012658227848101266,"clarinet":0.012658227848101266,"stacks":0.012658227848101266,"build":0.012658227848101266,"your":0.012658227848101266,"app":0.012658227848101266,"in":0.012658227848101266,"a":0.012658227848101266,"local":0.012658227848101266,"environment":0.012658227848101266,"on":0.012658227848101266,"js":0.012658227848101266,"don":0.012658227848101266,"t":0.012658227848101266,"reinvent":0.012658227848101266,"the":0.012658227848101266,"wheel":0.012658227848101266,"and":0.012658227848101266,"faster":0.012658227848101266,"with":0.012658227848101266,"library":0.012658227848101266,"that":0.012658227848101266,"handles":0.012658227848101266,"basic":0.012658227848101266,"blockchain":0.012658227848101266,"functionality":0.012658227848101266,"api":0.012658227848101266,"fetch":0.012658227848101266,"data":0.012658227848101266,"broadcast":0.012658227848101266,"transactions":0.012658227848101266,"br":0.012658227848101266,"callout":0.012658227848101266,"title":0.012658227848101266,"need":0.012658227848101266,"help":0.012658227848101266,"building":0.012658227848101266,"sdk":0.012658227848101266,"type":0.012658227848101266,"reach":0.012658227848101266,"out":0.012658227848101266,"to":0.012658227848101266,"us":0.012658227848101266,"span":0.012658227848101266,"classname":0.012658227848101266,"font-bold":0.012658227848101266,"channel":0.012658227848101266,"discord":0.012658227848101266,"https":0.012658227848101266,"chat":0.012658227848101266,"under":0.012658227848101266,"hiro":0.012658227848101266,"developer":0.012658227848101266,"section":0.012658227848101266,"there's":0.012658227848101266,"also":0.012658227848101266,"weekly":0.012658227848101266,"office":0.012658227848101266,"hours":0.012658227848101266,"www":0.012658227848101266,"addevent":0.012658227848101266,"com":0.012658227848101266,"event":0.012658227848101266,"ki22007085":0.012658227848101266,"call":0.012658227848101266,"every":0.012658227848101266,"wednesday":0.012658227848101266,"at":0.012658227848101266,"1pm":0.012658227848101266,"et":0.012658227848101266},"350":{"import":0.00819672131147541,"secondarycard":0.00819672131147541,"from":0.00819672131147541,"'":0.00819672131147541,"components":0.00819672131147541,"card'":0.00819672131147541,"stacks":0.00819672131147541,"connect":0.00819672131147541,"is":0.00819672131147541,"a":0.00819672131147541,"javascript":0.00819672131147541,"library":0.00819672131147541,"that":0.00819672131147541,"can":0.00819672131147541,"authenticate":0.00819672131147541,"the":0.00819672131147541,"identity":0.00819672131147541,"of":0.00819672131147541,"your":0.00819672131147541,"users":0.00819672131147541,"and":0.00819672131147541,"prompt":0.00819672131147541,"them":0.00819672131147541,"to":0.00819672131147541,"sign":0.00819672131147541,"transactions":0.00819672131147541,"messages":0.00819672131147541,"in":0.00819672131147541,"other":0.00819672131147541,"words":0.00819672131147541,"handles":0.00819672131147541,"some":0.00819672131147541,"most":0.00819672131147541,"basic":0.00819672131147541,"functions":0.00819672131147541,"you":0.00819672131147541,"need":0.00819672131147541,"web":0.00819672131147541,"app":0.00819672131147541,"including":0.00819672131147541,"enabling":0.00819672131147541,"log":0.00819672131147541,"as":0.00819672131147541,"well":0.00819672131147541,"broadcasting":0.00819672131147541,"in-app":0.00819672131147541,"network":0.00819672131147541,"installation":0.00819672131147541,"package-install":0.00819672131147541,"guides":0.00819672131147541,"cards":0.00819672131147541,"href":0.00819672131147541,"authenticate-users":0.00819672131147541,"title":0.00819672131147541,"description":0.00819672131147541,"user":0.00819672131147541,"wallets":0.00819672131147541,"their":0.00819672131147541,"on-chain":0.00819672131147541,"broadcast-transactions":0.00819672131147541,"broadcast":0.00819672131147541,"enable":0.00819672131147541,"interact":0.00819672131147541,"with":0.00819672131147541,"smart":0.00819672131147541,"contracts":0.00819672131147541,"through":0.00819672131147541,"sign-messages":0.00819672131147541,"verify":0.00819672131147541,"related":0.00819672131147541,"tools":0.00819672131147541,"-":0.00819672131147541,"clarinet":0.00819672131147541,"build":0.00819672131147541,"go-to":0.00819672131147541,"development":0.00819672131147541,"environment":0.00819672131147541,"on":0.00819672131147541,"blockchain":0.00819672131147541,"api":0.00819672131147541,"fetch":0.00819672131147541,"data":0.00819672131147541,"js":0.00819672131147541,"collection":0.00819672131147541,"libraries":0.00819672131147541,"applications":0.00819672131147541,"br":0.00819672131147541,"callout":0.00819672131147541,"help":0.00819672131147541,"building":0.00819672131147541,"type":0.00819672131147541,"reach":0.00819672131147541,"out":0.00819672131147541,"us":0.00819672131147541,"span":0.00819672131147541,"classname":0.00819672131147541,"font-bold":0.00819672131147541,"stacks-js":0.00819672131147541,"channel":0.00819672131147541,"discord":0.00819672131147541,"https":0.00819672131147541,"chat":0.00819672131147541,"under":0.00819672131147541,"hiro":0.00819672131147541,"developer":0.00819672131147541,"section":0.00819672131147541,"there's":0.00819672131147541,"also":0.00819672131147541,"weekly":0.00819672131147541,"office":0.00819672131147541,"hours":0.00819672131147541,"www":0.00819672131147541,"addevent":0.00819672131147541,"com":0.00819672131147541,"event":0.00819672131147541,"ki22007085":0.00819672131147541,"call":0.00819672131147541,"every":0.00819672131147541,"wednesday":0.00819672131147541,"at":0.00819672131147541,"1pm":0.00819672131147541,"et":0.00819672131147541},"351":{"import":0.008064516129032258,"table":0.008064516129032258,"tablebody":0.008064516129032258,"tablecell":0.008064516129032258,"tablehead":0.008064516129032258,"tableheader":0.008064516129032258,"tablerow":0.008064516129032258,"from":0.008064516129032258,"components":0.008064516129032258,"ui":0.008064516129032258,"this":0.008064516129032258,"page":0.008064516129032258,"provides":0.008064516129032258,"detailed":0.008064516129032258,"information":0.008064516129032258,"about":0.008064516129032258,"which":0.008064516129032258,"methods":0.008064516129032258,"and":0.008064516129032258,"events":0.008064516129032258,"are":0.008064516129032258,"supported":0.008064516129032258,"by":0.008064516129032258,"different":0.008064516129032258,"wallet":0.008064516129032258,"providers":0.008064516129032258,"in":0.008064516129032258,"the":0.008064516129032258,"stacks":0.008064516129032258,"ecosystem":0.008064516129032258,"method":0.008064516129032258,"compatibility":0.008064516129032258,"leather":0.008064516129032258,"xverse-like":0.008064516129032258,"code":0.008064516129032258,"getaddresses":0.008064516129032258,"no":0.008064516129032258,"support":0.008064516129032258,"for":0.008064516129032258,"experimental":0.008064516129032258,"purposes":0.008064516129032258,"use":0.008064516129032258,"wallet_connect":0.008064516129032258,"instead":0.008064516129032258,"sendtransfer":0.008064516129032258,"expects":0.008064516129032258,"amount":0.008064516129032258,"as":0.008064516129032258,"string":0.008064516129032258,"number":0.008064516129032258,"signpsbt":0.008064516129032258,"uses":0.008064516129032258,"signing":0.008064516129032258,"index":0.008064516129032258,"array":0.008064516129032258,"only":0.008064516129032258,"signinputs":0.008064516129032258,"record":0.008064516129032258,"of":0.008064516129032258,"stx_getaddresses":0.008064516129032258,"stx_getaccounts":0.008064516129032258,"stx_getnetworks":0.008064516129032258,"stx_transferstx":0.008064516129032258,"stx_transfersip10ft":0.008064516129032258,"stx_transfersip9nft":0.008064516129032258,"stx_callcontract":0.008064516129032258,"hex-encoded":0.008064516129032258,"clarity":0.008064516129032258,"values":0.008064516129032258,"postconditions":0.008064516129032258,"stx_deploycontract":0.008064516129032258,"stx_signtransaction":0.008064516129032258,"stx_signmessage":0.008064516129032258,"stx_signstructuredmessage":0.008064516129032258,"stx_updateprofile":0.008064516129032258,"event":0.008064516129032258,"xverse":0.008064516129032258,"stx_accountchange":0.008064516129032258,"stx_networkchange":0.008064516129032258,"legend":0.008064516129032258,"-":0.008064516129032258,"yet":0.008064516129032258,"partial":0.008064516129032258,"layer":0.008064516129032258,"request":0.008064516129032258,"connect":0.008064516129032258,"adds":0.008064516129032258,"a":0.008064516129032258,"auto-compatibility":0.008064516129032258,"helps":0.008064516129032258,"unify":0.008064516129032258,"interface":0.008064516129032258,"where":0.008064516129032258,"may":0.008064516129032258,"implement":0.008064516129032258,"results":0.008064516129032258,"differently":0.008064516129032258,"status":0.008064516129032258,"notes":0.008064516129032258,"---------------------------":0.008064516129032258,"------":0.008064516129032258,"----------------------------------------------------------------------------------------------------":0.008064516129032258,"maps":0.008064516129032258,"to":0.008064516129032258,"wallets":0.008064516129032258,"converts":0.008064516129032258,"transforms":0.008064516129032258,"psbt":0.008064516129032258,"format":0.008064516129032258,"base64":0.008064516129032258,"hex":0.008064516129032258,"with":0.008064516129032258,"lossy":0.008064516129032258,"restructure":0.008064516129032258,"overrides":0.008064516129032258,"needed":0.008064516129032258,"any":0.008064516129032258,"has":0.008064516129032258,"that":0.008064516129032258,"maintain":0.008064516129032258,"functionality":0.008064516129032258,"breaking":0.008064516129032258,"lose":0.008064516129032258,"some":0.008064516129032258},"352":{"1":0.004424778761061947,"2":0.004424778761061947,"3":0.004424778761061947,"4":0.004424778761061947,"50":0.004424778761061947,"import":0.004424778761061947,"connectwalletbutton":0.004424778761061947,"from":0.004424778761061947,"'":0.004424778761061947,"components":0.004424778761061947,"code":0.004424778761061947,"connect-wallet-button'":0.004424778761061947,"contentbackground":0.004424778761061947,"ui":0.004424778761061947,"icon'":0.004424778761061947,"authentication":0.004424778761061947,"is":0.004424778761061947,"a":0.004424778761061947,"fundamental":0.004424778761061947,"part":0.004424778761061947,"of":0.004424778761061947,"many":0.004424778761061947,"web":0.004424778761061947,"applications":0.004424778761061947,"ensuring":0.004424778761061947,"that":0.004424778761061947,"users":0.004424778761061947,"are":0.004424778761061947,"who":0.004424778761061947,"they":0.004424778761061947,"claim":0.004424778761061947,"to":0.004424778761061947,"be":0.004424778761061947,"and":0.004424778761061947,"their":0.004424778761061947,"data":0.004424778761061947,"secure":0.004424778761061947,"with":0.004424778761061947,"the":0.004424778761061947,"stacks":0.004424778761061947,"blockchain":0.004424778761061947,"user":0.004424778761061947,"involves":0.004424778761061947,"connecting":0.004424778761061947,"users'":0.004424778761061947,"wallets":0.004424778761061947,"managing":0.004424778761061947,"sessions":0.004424778761061947,"securely":0.004424778761061947,"connect":0.004424778761061947,"package":0.004424778761061947,"provides":0.004424778761061947,"tools":0.004424778761061947,"needed":0.004424778761061947,"integrate":0.004424778761061947,"this":0.004424778761061947,"functionality":0.004424778761061947,"seamlessly":0.004424778761061947,"into":0.004424778761061947,"your":0.004424778761061947,"app":0.004424778761061947,"in":0.004424778761061947,"guide":0.004424778761061947,"you":0.004424778761061947,"will":0.004424778761061947,"learn":0.004424778761061947,"how":0.004424778761061947,"install":0.004424778761061947,"install-the-stacksconnect-package":0.004424778761061947,"user's":0.004424778761061947,"wallet":0.004424778761061947,"connect-to-a-users-wallet":0.004424778761061947,"manage":0.004424778761061947,"state":0.004424778761061947,"manage-authentication-state":0.004424778761061947,"access":0.004424778761061947,"access-user-data":0.004424778761061947,"callout":0.004424778761061947,"see":0.004424778761061947,"action":0.004424778761061947,"check":0.004424778761061947,"out":0.004424778761061947,"full":0.004424778761061947,"example":0.004424778761061947,"here":0.004424778761061947,"https":0.004424778761061947,"github":0.004424778761061947,"com":0.004424778761061947,"hiro-so":0.004424778761061947,"stacks-connect-example":0.004424778761061947,"---":0.004424778761061947,"package-install":0.004424778761061947,"after":0.004424778761061947,"installing":0.004424778761061947,"can":0.004424778761061947,"use":0.004424778761061947,"function":0.004424778761061947,"initiate":0.004424778761061947,"connection":0.004424778761061947,"trigger":0.004424778761061947,"popup":0.004424778761061947,"allows":0.004424778761061947,"select":0.004424778761061947,"ts":0.004424778761061947,"connect'":0.004424778761061947,"async":0.004424778761061947,"authenticate":0.004424778761061947,"const":0.004424778761061947,"response":0.004424778761061947,"await":0.004424778761061947,"contains":0.004424778761061947,"addresses":0.004424778761061947,"div":0.004424778761061947,"classname":0.004424778761061947,"not-prose":0.004424778761061947,"relative":0.004424778761061947,"overflow-hidden":0.004424778761061947,"bg-card":0.004424778761061947,"rounded-lg":0.004424778761061947,"border":0.004424778761061947,"border-border":0.004424778761061947,"overflow-auto":0.004424778761061947,"p-8":0.004424778761061947,"h-auto":0.004424778761061947,"absolute":0.004424778761061947,"inset-x-0":0.004424778761061947,"bottom-0":0.004424778761061947,"grid":0.004424778761061947,"place-items-center":0.004424778761061947,"h-full":0.004424778761061947,"stores":0.004424778761061947,"local":0.004424778761061947,"storage":0.004424778761061947,"by":0.004424778761061947,"default":0.004424778761061947,"making":0.004424778761061947,"it":0.004424778761061947,"easy":0.004424778761061947,"persist":0.004424778761061947,"session":0.004424778761061947,"across":0.004424778761061947,"page":0.004424778761061947,"reloads":0.004424778761061947,"browser":0.004424778761061947,"customize":0.004424778761061947,"behavior":0.004424778761061947,"passing":0.004424778761061947,"options":0.004424778761061947,"such":0.004424778761061947,"as":0.004424778761061947,"forcing":0.004424778761061947,"selection":0.004424778761061947,"or":0.004424778761061947,"specifying":0.004424778761061947,"providers":0.004424778761061947,"advanced":0.004424778761061947,"usage":0.004424778761061947,"packages":0.004424778761061947,"advanced-usage":0.004424778761061947,"section":0.004424778761061947,"for":0.004424778761061947,"more":0.004424778761061947,"details":0.004424778761061947,"using":0.004424778761061947,"following":0.004424778761061947,"functions":0.004424778761061947,"disconnect":0.004424778761061947,"isconnected":0.004424778761061947,"if":0.004424778761061947,"connected":0.004424778761061947,"authenticated":0.004424778761061947,"clears":0.004424778761061947,"selected":0.004424778761061947,"once":0.004424778761061947,"getlocalstorage":0.004424778761061947,"make":0.004424778761061947,"specific":0.004424778761061947,"requests":0.004424778761061947,"request":0.004424778761061947,"method":0.004424778761061947,"get":0.004424778761061947,"stored":0.004424778761061947,"userdata":0.004424778761061947,"stx":0.004424778761061947,"address":0.004424778761061947,"sp2mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn":0.004424778761061947,"btc":0.004424778761061947,"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae":0.004424778761061947,"detailed":0.004424778761061947,"account":0.004424778761061947,"information":0.004424778761061947,"accounts":0.004424778761061947,"'stx_getaccounts'":0.004424778761061947,"publickey":0.004424778761061947,"02d3331cbb9f72fe635e6f87c2cf1a13cd":0.004424778761061947,"gaiahuburl":0.004424778761061947,"hub":0.004424778761061947,"hiro":0.004424778761061947,"so":0.004424778761061947,"gaiaappkey":0.004424778761061947,"0488ade4040658015580000000dc81e3a5":0.004424778761061947,"title":0.004424778761061947,"note":0.004424778761061947,"list":0.004424778761061947,"all":0.004424778761061947,"available":0.004424778761061947,"methods":0.004424778761061947,"reference":0.004424778761061947,"next":0.004424778761061947,"steps":0.004424778761061947,"cards":0.004424778761061947,"card":0.004424778761061947,"href":0.004424778761061947,"guides":0.004424778761061947,"broadcast-transactions":0.004424778761061947,"broadcast":0.004424778761061947,"transactions":0.004424778761061947,"description":0.004424778761061947,"sign":0.004424778761061947,"js":0.004424778761061947,"post-conditions":0.004424778761061947,"deep":0.004424778761061947,"dive":0.004424778761061947,"build":0.004424778761061947,"smart":0.004424778761061947,"contracts":0.004424778761061947},"353":{"1":0.00411522633744856,"2":0.00411522633744856,"3":0.00411522633744856,"4":0.00411522633744856,"123":0.00411522633744856,"import":0.00411522633744856,"badge":0.00411522633744856,"from":0.00411522633744856,"'":0.00411522633744856,"components":0.00411522633744856,"ui":0.00411522633744856,"badge'":0.00411522633744856,"tabs":0.00411522633744856,"tabscontent":0.00411522633744856,"tabslist":0.00411522633744856,"tabstrigger":0.00411522633744856,"tabs'":0.00411522633744856,"accordion":0.00411522633744856,"accordions":0.00411522633744856,"'fumadocs-ui":0.00411522633744856,"accordion'":0.00411522633744856,"chevronright":0.00411522633744856,"code":0.00411522633744856,"terminal":0.00411522633744856,"'lucide-react'":0.00411522633744856,"file":0.00411522633744856,"folder":0.00411522633744856,"files":0.00411522633744856,"files'":0.00411522633744856,"the":0.00411522633744856,"process":0.00411522633744856,"of":0.00411522633744856,"broadcasting":0.00411522633744856,"transactions":0.00411522633744856,"is":0.00411522633744856,"fundamental":0.00411522633744856,"for":0.00411522633744856,"interacting":0.00411522633744856,"with":0.00411522633744856,"blockchains":0.00411522633744856,"whether":0.00411522633744856,"you're":0.00411522633744856,"transferring":0.00411522633744856,"tokens":0.00411522633744856,"deploying":0.00411522633744856,"contracts":0.00411522633744856,"or":0.00411522633744856,"executing":0.00411522633744856,"contract":0.00411522633744856,"functions":0.00411522633744856,"in":0.00411522633744856,"this":0.00411522633744856,"guide":0.00411522633744856,"you":0.00411522633744856,"will":0.00411522633744856,"learn":0.00411522633744856,"how":0.00411522633744856,"to":0.00411522633744856,"install":0.00411522633744856,"necessary":0.00411522633744856,"packages":0.00411522633744856,"setup-and-installation":0.00411522633744856,"connect":0.00411522633744856,"a":0.00411522633744856,"user's":0.00411522633744856,"wallet":0.00411522633744856,"connect-to-a-users-wallet":0.00411522633744856,"sign":0.00411522633744856,"and":0.00411522633744856,"broadcast":0.00411522633744856,"sign-and-broadcast-transactions":0.00411522633744856,"handle":0.00411522633744856,"transaction":0.00411522633744856,"results":0.00411522633744856,"handle-transaction-results":0.00411522633744856,"---":0.00411522633744856,"setup":0.00411522633744856,"installation":0.00411522633744856,"required":0.00411522633744856,"start":0.00411522633744856,"building":0.00411522633744856,"package-install":0.00411522633744856,"stacks":0.00411522633744856,"before":0.00411522633744856,"signing":0.00411522633744856,"users":0.00411522633744856,"need":0.00411522633744856,"their":0.00411522633744856,"your":0.00411522633744856,"application":0.00411522633744856,"use":0.00411522633744856,"function":0.00411522633744856,"initiate":0.00411522633744856,"connection":0.00411522633744856,"ts":0.00411522633744856,"isconnected":0.00411522633744856,"connect'":0.00411522633744856,"async":0.00411522633744856,"connectwallet":0.00411522633744856,"if":0.00411522633744856,"const":0.00411522633744856,"response":0.00411522633744856,"await":0.00411522633744856,"console":0.00411522633744856,"log":0.00411522633744856,"'connected":0.00411522633744856,"addresses":0.00411522633744856,"callout":0.00411522633744856,"more":0.00411522633744856,"details":0.00411522633744856,"on":0.00411522633744856,"see":0.00411522633744856,"authentication":0.00411522633744856,"guides":0.00411522633744856,"authenticate-users":0.00411522633744856,"there":0.00411522633744856,"are":0.00411522633744856,"three":0.00411522633744856,"types":0.00411522633744856,"can":0.00411522633744856,"create":0.00411522633744856,"stx":0.00411522633744856,"transfers":0.00411522633744856,"deployments":0.00411522633744856,"calls":0.00411522633744856,"defaultvalue":0.00411522633744856,"transfer":0.00411522633744856,"classname":0.00411522633744856,"'flex":0.00411522633744856,"flex-wrap":0.00411522633744856,"md":0.00411522633744856,"w-max'":0.00411522633744856,"value":0.00411522633744856,"'tab":0.00411522633744856,"group'":0.00411522633744856,"'badge":0.00411522633744856,"transition-colors'":0.00411522633744856,"deploy":0.00411522633744856,"deployment":0.00411522633744856,"execute":0.00411522633744856,"execution":0.00411522633744856,"request":0.00411522633744856,"method":0.00411522633744856,"stx_transferstx":0.00411522633744856,"transferstx":0.00411522633744856,"'stx_transferstx'":0.00411522633744856,"recipient":0.00411522633744856,"'st2eb9weqnr9p0k28d2dc352tm75yg3k0gt7v13cv'":0.00411522633744856,"amount":0.00411522633744856,"'100'":0.00411522633744856,"micro-stx":0.00411522633744856,"000":0.00411522633744856,"memo":0.00411522633744856,"'reimbursement'":0.00411522633744856,"optional":0.00411522633744856,"'transaction":0.00411522633744856,"id":0.00411522633744856,"txid":0.00411522633744856,"smart":0.00411522633744856,"stx_deploycontract":0.00411522633744856,"deploycontract":0.00411522633744856,"codebody":0.00411522633744856,"define-public":0.00411522633744856,"say-hi":0.00411522633744856,"ok":0.00411522633744856,"hello":0.00411522633744856,"world":0.00411522633744856,"'stx_deploycontract'":0.00411522633744856,"name":0.00411522633744856,"'my-contract'":0.00411522633744856,"clarityversion":0.00411522633744856,"defaults":0.00411522633744856,"latest":0.00411522633744856,"version":0.00411522633744856,"address":0.00411522633744856,"connected":0.00411522633744856,"call":0.00411522633744856,"'stx_callcontract'":0.00411522633744856,"here's":0.00411522633744856,"an":0.00411522633744856,"example":0.00411522633744856,"using":0.00411522633744856,"simple":0.00411522633744856,"clarity":0.00411522633744856,"print":0.00411522633744856,"hi":0.00411522633744856,"u0":0.00411522633744856,"cl":0.00411522633744856,"transactions'":0.00411522633744856,"callcontract":0.00411522633744856,"contractaddress":0.00411522633744856,"'st22t6zs7hvwemzhhfk77h4gtndtwnpqax8wzakhj'":0.00411522633744856,"contractname":0.00411522633744856,"functionname":0.00411522633744856,"'say-hi'":0.00411522633744856,"functionargs":0.00411522633744856,"array":0.00411522633744856,"values":0.00411522633744856,"that":0.00411522633744856,"take":0.00411522633744856,"arguments":0.00411522633744856,"namespace":0.00411522633744856,"construct":0.00411522633744856,"uint":0.00411522633744856,"stringascii":0.00411522633744856,"standardprincipalcv":0.00411522633744856,"st1x":0.00411522633744856,"when":0.00411522633744856,"signed":0.00411522633744856,"returns":0.00411522633744856,"object":0.00411522633744856,"containing":0.00411522633744856,"information":0.00411522633744856,"about":0.00411522633744856,"interface":0.00411522633744856,"transactionresponse":0.00411522633744856,"string":0.00411522633744856,"txraw":0.00411522633744856,"raw":0.00411522633744856,"hex":0.00411522633744856,"link":0.00411522633744856,"view":0.00411522633744856,"explorer":0.00411522633744856,"handletransaction":0.00411522633744856,"explorerurl":0.00411522633744856,"https":0.00411522633744856,"co":0.00411522633744856,"'view":0.00411522633744856,"next":0.00411522633744856,"steps":0.00411522633744856,"cards":0.00411522633744856,"card":0.00411522633744856,"href":0.00411522633744856,"sign-messages":0.00411522633744856,"title":0.00411522633744856,"messages":0.00411522633744856,"description":0.00411522633744856,"js":0.00411522633744856,"post-conditions":0.00411522633744856,"deep":0.00411522633744856,"dive":0.00411522633744856,"into":0.00411522633744856,"secure":0.00411522633744856},"354":{"0":0.005434782608695652,"1":0.005434782608695652,"2":0.005434782608695652,"3":0.005434782608695652,"4":0.005434782608695652,"import":0.005434782608695652,"badge":0.005434782608695652,"from":0.005434782608695652,"'":0.005434782608695652,"components":0.005434782608695652,"ui":0.005434782608695652,"badge'":0.005434782608695652,"tabs":0.005434782608695652,"tabscontent":0.005434782608695652,"tabslist":0.005434782608695652,"tabstrigger":0.005434782608695652,"tabs'":0.005434782608695652,"accordion":0.005434782608695652,"accordions":0.005434782608695652,"'fumadocs-ui":0.005434782608695652,"accordion'":0.005434782608695652,"chevronright":0.005434782608695652,"code":0.005434782608695652,"terminal":0.005434782608695652,"'lucide-react'":0.005434782608695652,"file":0.005434782608695652,"folder":0.005434782608695652,"files":0.005434782608695652,"files'":0.005434782608695652,"with":0.005434782608695652,"stacks":0.005434782608695652,"connect":0.005434782608695652,"users":0.005434782608695652,"can":0.005434782608695652,"sign":0.005434782608695652,"a":0.005434782608695652,"cryptographic":0.005434782608695652,"message":0.005434782608695652,"to":0.005434782608695652,"prove":0.005434782608695652,"ownership":0.005434782608695652,"of":0.005434782608695652,"particular":0.005434782608695652,"address":0.005434782608695652,"this":0.005434782608695652,"is":0.005434782608695652,"helpful":0.005434782608695652,"for":0.005434782608695652,"wide":0.005434782608695652,"range":0.005434782608695652,"use":0.005434782608695652,"cases":0.005434782608695652,"example":0.005434782608695652,"you":0.005434782608695652,"signing":0.005434782608695652,"create":0.005434782608695652,"token-gated":0.005434782608695652,"features":0.005434782608695652,"user":0.005434782608695652,"signs":0.005434782608695652,"they":0.005434782608695652,"control":0.005434782608695652,"an":0.005434782608695652,"holding":0.005434782608695652,"the":0.005434782608695652,"corresponding":0.005434782608695652,"token":0.005434782608695652,"requirements":0.005434782608695652,"or":0.005434782608695652,"agreed":0.005434782608695652,"your":0.005434782608695652,"terms":0.005434782608695652,"service":0.005434782608695652,"in":0.005434782608695652,"guide":0.005434782608695652,"will":0.005434782608695652,"learn":0.005434782608695652,"how":0.005434782608695652,"set":0.005434782608695652,"up":0.005434782608695652,"and":0.005434782608695652,"install":0.005434782608695652,"necessary":0.005434782608695652,"packages":0.005434782608695652,"setup-and-installation":0.005434782608695652,"user's":0.005434782608695652,"wallet":0.005434782608695652,"connect-to-a-users-wallet":0.005434782608695652,"messages":0.005434782608695652,"sign-messages":0.005434782608695652,"verify":0.005434782608695652,"signatures":0.005434782608695652,"verify-signatures":0.005434782608695652,"---":0.005434782608695652,"setup":0.005434782608695652,"installation":0.005434782608695652,"using":0.005434782608695652,"preferred":0.005434782608695652,"package":0.005434782608695652,"manager":0.005434782608695652,"following":0.005434782608695652,"package-install":0.005434782608695652,"encryption":0.005434782608695652,"before":0.005434782608695652,"need":0.005434782608695652,"their":0.005434782608695652,"application":0.005434782608695652,"function":0.005434782608695652,"initiate":0.005434782608695652,"connection":0.005434782608695652,"ts":0.005434782608695652,"isconnected":0.005434782608695652,"connect'":0.005434782608695652,"async":0.005434782608695652,"connectwallet":0.005434782608695652,"if":0.005434782608695652,"const":0.005434782608695652,"response":0.005434782608695652,"await":0.005434782608695652,"console":0.005434782608695652,"log":0.005434782608695652,"'connected":0.005434782608695652,"addresses":0.005434782608695652,"callout":0.005434782608695652,"more":0.005434782608695652,"details":0.005434782608695652,"on":0.005434782608695652,"see":0.005434782608695652,"authentication":0.005434782608695652,"guides":0.005434782608695652,"authenticate-users":0.005434782608695652,"request":0.005434782608695652,"signature":0.005434782608695652,"method":0.005434782608695652,"stx_signmessage":0.005434782608695652,"signmessage":0.005434782608695652,"'hello":0.005434782608695652,"world'":0.005434782608695652,"'stx_signmessage'":0.005434782608695652,"'signature":0.005434782608695652,"'public":0.005434782608695652,"key":0.005434782608695652,"publickey":0.005434782608695652,"structured":0.005434782608695652,"stx_signstructuredmessage":0.005434782608695652,"cl":0.005434782608695652,"transactions'":0.005434782608695652,"signstructuredmessage":0.005434782608695652,"tuple":0.005434782608695652,"stringascii":0.005434782608695652,"'message'":0.005434782608695652,"num":0.005434782608695652,"uint":0.005434782608695652,"domain":0.005434782608695652,"name":0.005434782608695652,"'my":0.005434782608695652,"app'":0.005434782608695652,"version":0.005434782608695652,"'1":0.005434782608695652,"0'":0.005434782608695652,"'chain-id'":0.005434782608695652,"'stx_signstructuredmessage'":0.005434782608695652,"verifymessagesignaturersv":0.005434782608695652,"encryption'":0.005434782608695652,"verifysignature":0.005434782608695652,"verified":0.005434782608695652,"next":0.005434782608695652,"steps":0.005434782608695652,"cards":0.005434782608695652,"card":0.005434782608695652,"href":0.005434782608695652,"broadcast-transactions":0.005434782608695652,"title":0.005434782608695652,"broadcast":0.005434782608695652,"transactions":0.005434782608695652,"description":0.005434782608695652,"js":0.005434782608695652,"post-conditions":0.005434782608695652,"deep":0.005434782608695652,"dive":0.005434782608695652,"into":0.005434782608695652,"secure":0.005434782608695652,"smart":0.005434782608695652,"contracts":0.005434782608695652},"355":{"1":0.0035211267605633804,"7":0.0035211267605633804,"8":0.0035211267605633804,"10":0.0035211267605633804,"import":0.0035211267605633804,"steps":0.0035211267605633804,"step":0.0035211267605633804,"from":0.0035211267605633804,"'fumadocs-ui":0.0035211267605633804,"components":0.0035211267605633804,"steps'":0.0035211267605633804,"for":0.0035211267605633804,"a":0.0035211267605633804,"while":0.0035211267605633804,"now":0.0035211267605633804,"the":0.0035211267605633804,"stacks":0.0035211267605633804,"community":0.0035211267605633804,"has":0.0035211267605633804,"been":0.0035211267605633804,"working":0.0035211267605633804,"on":0.0035211267605633804,"new":0.0035211267605633804,"standard":0.0035211267605633804,"wallet-to-dapp":0.0035211267605633804,"communication":0.0035211267605633804,"connect":0.0035211267605633804,"and":0.0035211267605633804,"related":0.0035211267605633804,"projects":0.0035211267605633804,"use":0.0035211267605633804,"standards":0.0035211267605633804,"like":0.0035211267605633804,"wbips":0.0035211267605633804,"https":0.0035211267605633804,"netlify":0.0035211267605633804,"app":0.0035211267605633804,"sip-030":0.0035211267605633804,"github":0.0035211267605633804,"com":0.0035211267605633804,"janniks":0.0035211267605633804,"sips":0.0035211267605633804,"blob":0.0035211267605633804,"main":0.0035211267605633804,"sip-030-wallet-interface":0.0035211267605633804,"md":0.0035211267605633804,"to":0.0035211267605633804,"allow":0.0035211267605633804,"wallets":0.0035211267605633804,"communicate":0.0035211267605633804,"with":0.0035211267605633804,"dapps":0.0035211267605633804,"in":0.0035211267605633804,"more":0.0035211267605633804,"simplified":0.0035211267605633804,"flexible":0.0035211267605633804,"way":0.0035211267605633804,"callout":0.0035211267605633804,"title":0.0035211267605633804,"migration":0.0035211267605633804,"status":0.0035211267605633804,"please":0.0035211267605633804,"be":0.0035211267605633804,"patient":0.0035211267605633804,"during":0.0035211267605633804,"this":0.0035211267605633804,"latest":0.0035211267605633804,"there":0.0035211267605633804,"long-running":0.0035211267605633804,"effort":0.0035211267605633804,"together":0.0035211267605633804,"modernize":0.0035211267605633804,"move":0.0035211267605633804,"forward":0.0035211267605633804,"web":0.0035211267605633804,"ecosystem":0.0035211267605633804,"it":0.0035211267605633804,"is":0.0035211267605633804,"culminating":0.0035211267605633804,"request":0.0035211267605633804,"method":0.0035211267605633804,"x":0.0035211267605633804,"bear":0.0035211267605633804,"us":0.0035211267605633804,"are":0.0035211267605633804,"still":0.0035211267605633804,"through":0.0035211267605633804,"some":0.0035211267605633804,"bugs":0.0035211267605633804,"details":0.0035211267605633804,"improvements":0.0035211267605633804,"_feel":0.0035211267605633804,"free":0.0035211267605633804,"continue":0.0035211267605633804,"using":0.0035211267605633804,"things":0.0035211267605633804,"stabilize":0.0035211267605633804,"_":0.0035211267605633804,"version":0.0035211267605633804,"may":0.0035211267605633804,"well":0.0035211267605633804,"supported":0.0035211267605633804,"by":0.0035211267605633804,"legacy":0.0035211267605633804,"of":0.0035211267605633804,"jwt":0.0035211267605633804,"tokens":0.0035211267605633804,"you":0.0035211267605633804,"can":0.0035211267605633804,"sh":0.0035211267605633804,"npm":0.0035211267605633804,"install":0.0035211267605633804,"deprecations":0.0035211267605633804,"following":0.0035211267605633804,"classes":0.0035211267605633804,"methods":0.0035211267605633804,"types":0.0035211267605633804,"deprecated":0.0035211267605633804,"favor":0.0035211267605633804,"rpc":0.0035211267605633804,"-":0.0035211267605633804,"show":0.0035211267605633804,"open":0.0035211267605633804,"authenticate":0.0035211267605633804,"usersession":0.0035211267605633804,"class":0.0035211267605633804,"functionality":0.0035211267605633804,"appconfig":0.0035211267605633804,"sessionoptions":0.0035211267605633804,"interface":0.0035211267605633804,"sessiondata":0.0035211267605633804,"userdata":0.0035211267605633804,"sessiondatastore":0.0035211267605633804,"instancedatastore":0.0035211267605633804,"localstoragestore":0.0035211267605633804,"backwards":0.0035211267605633804,"compatibility":0.0035211267605633804,"make":0.0035211267605633804,"migrating":0.0035211267605633804,"easier":0.0035211267605633804,"familiar":0.0035211267605633804,"exists":0.0035211267605633804,"semi-backwards":0.0035211267605633804,"compatible":0.0035211267605633804,"release":0.0035211267605633804,"will":0.0035211267605633804,"cache":0.0035211267605633804,"user's":0.0035211267605633804,"address":0.0035211267605633804,"local":0.0035211267605633804,"storage":0.0035211267605633804,"access":0.0035211267605633804,"via":0.0035211267605633804,"loaduserdata":0.0035211267605633804,"as":0.0035211267605633804,"previously":0.0035211267605633804,"done":0.0035211267605633804,"update":0.0035211267605633804,"follow":0.0035211267605633804,"these":0.0035211267605633804,"your":0.0035211267605633804,"replace":0.0035211267605633804,"switch":0.0035211267605633804,"showxyz":0.0035211267605633804,"openxyz":0.0035211267605633804,"doxyz":0.0035211267605633804,"follows":0.0035211267605633804,"pattern":0.0035211267605633804,"string":0.0035211267605633804,"params":0.0035211267605633804,"object":0.0035211267605633804,"see":0.0035211267605633804,"usage":0.0035211267605633804,"an":0.0035211267605633804,"async":0.0035211267605633804,"function":0.0035211267605633804,"so":0.0035211267605633804,"onfinish":0.0035211267605633804,"oncancel":0.0035211267605633804,"callbacks":0.0035211267605633804,"then":0.0035211267605633804,"catch":0.0035211267605633804,"or":0.0035211267605633804,"try":0.0035211267605633804,"await":0.0035211267605633804,"examples":0.0035211267605633804,"showconnect":0.0035211267605633804,"useconnect":0.0035211267605633804,"docontractcall":0.0035211267605633804,"stx_callcontract":0.0035211267605633804,"opencontractdeploy":0.0035211267605633804,"stx_deploycontract":0.0035211267605633804,"instead":0.0035211267605633804,"alias":0.0035211267605633804,"forcewalletselect":0.0035211267605633804,"true":0.0035211267605633804,"'getaddresses'":0.0035211267605633804,"default":0.0035211267605633804,"caches":0.0035211267605633804,"authentication":0.0035211267605633804,"state":0.0035211267605633804,"management":0.0035211267605633804,"issignedin":0.0035211267605633804,"isconnected":0.0035211267605633804,"signuserout":0.0035211267605633804,"disconnect":0.0035211267605633804,"remove":0.0035211267605633804,"code":0.0035211267605633804,"referencing":0.0035211267605633804,"etc":0.0035211267605633804,"connect-react":0.0035211267605633804,"package":0.0035211267605633804,"need":0.0035211267605633804,"manually":0.0035211267605633804,"reload":0.0035211267605633804,"component":0.0035211267605633804,"updates":0.0035211267605633804,"no":0.0035211267605633804,"custom":0.0035211267605633804,"hooks":0.0035211267605633804,"needed":0.0035211267605633804,"anymore":0.0035211267605633804,"we":0.0035211267605633804,"react":0.0035211267605633804,"that":0.0035211267605633804,"even":0.0035211267605633804,"future":0.0035211267605633804,"e":0.0035211267605633804,"g":0.0035211267605633804,"tracking":0.0035211267605633804,"transaction":0.0035211267605633804,"reloading":0.0035211267605633804,"when":0.0035211267605633804,"connection":0.0035211267605633804,"established":0.0035211267605633804,"updating":0.0035211267605633804,"page":0.0035211267605633804,"network":0.0035211267605633804,"changes":0.0035211267605633804,"was":0.0035211267605633804,"used":0.0035211267605633804,"addresses":0.0035211267605633804,"data":0.0035211267605633804,"which":0.0035211267605633804,"abstracted":0.0035211267605633804,"away":0.0035211267605633804,"underlying":0.0035211267605633804,"implementation":0.0035211267605633804,"directly":0.0035211267605633804,"interact":0.0035211267605633804,"wallet":0.0035211267605633804,"giving":0.0035211267605633804,"developers":0.0035211267605633804,"explicit":0.0035211267605633804,"control":0.0035211267605633804,"clarity":0.0035211267605633804,"over":0.0035211267605633804,"what's":0.0035211267605633804,"happening":0.0035211267605633804,"under":0.0035211267605633804,"hood":0.0035211267605633804,"manual":0.0035211267605633804,"approach":0.0035211267605633804,"makes":0.0035211267605633804,"interaction":0.0035211267605633804,"transparent":0.0035211267605633804,"customizable":0.0035211267605633804,"manage":0.0035211267605633804,"currently":0.0035211267605633804,"connected":0.0035211267605633804,"jotai":0.0035211267605633804,"security":0.0035211267605633804,"note":0.0035211267605633804,"reasons":0.0035211267605633804,"only":0.0035211267605633804,"returns":0.0035211267605633804,"current":0.0035211267605633804,"network's":0.0035211267605633804,"where":0.0035211267605633804,"both":0.0035211267605633804,"mainnet":0.0035211267605633804,"testnet":0.0035211267605633804,"were":0.0035211267605633804,"returned":0.0035211267605633804},"356":{"0":0.002403846153846154,"1":0.002403846153846154,"3":0.002403846153846154,"7":0.002403846153846154,"8":0.002403846153846154,"10":0.002403846153846154,"import":0.002403846153846154,"root":0.002403846153846154,"api":0.002403846153846154,"apiexample":0.002403846153846154,"from":0.002403846153846154,"'fumadocs-openapi":0.002403846153846154,"ui'":0.002403846153846154,"property":0.002403846153846154,"accordion":0.002403846153846154,"accordions":0.002403846153846154,"'fumadocs-ui":0.002403846153846154,"components":0.002403846153846154,"accordion'":0.002403846153846154,"tabs":0.002403846153846154,"tabscontent":0.002403846153846154,"tabslist":0.002403846153846154,"tabstrigger":0.002403846153846154,"'":0.002403846153846154,"ui":0.002403846153846154,"tabs'":0.002403846153846154,"badge":0.002403846153846154,"badge'":0.002403846153846154,"inlinecode":0.002403846153846154,"inline-code'":0.002403846153846154,"stacks":0.002403846153846154,"connect":0.002403846153846154,"enables":0.002403846153846154,"you":0.002403846153846154,"to":0.002403846153846154,"authenticate":0.002403846153846154,"your":0.002403846153846154,"users":0.002403846153846154,"and":0.002403846153846154,"app":0.002403846153846154,"their":0.002403846153846154,"wallet":0.002403846153846154,"this":0.002403846153846154,"reference":0.002403846153846154,"contains":0.002403846153846154,"more":0.002403846153846154,"detailed":0.002403846153846154,"information":0.002403846153846154,"on":0.002403846153846154,"how":0.002403846153846154,"can":0.002403846153846154,"sign":0.002403846153846154,"broadcast":0.002403846153846154,"transactions":0.002403846153846154,"behalf":0.002403846153846154,"enable":0.002403846153846154,"messages":0.002403846153846154,"callout":0.002403846153846154,"title":0.002403846153846154,"migration":0.002403846153846154,"note":0.002403846153846154,"please":0.002403846153846154,"be":0.002403846153846154,"patient":0.002403846153846154,"during":0.002403846153846154,"the":0.002403846153846154,"version":0.002403846153846154,"x":0.002403846153846154,"there":0.002403846153846154,"has":0.002403846153846154,"been":0.002403846153846154,"a":0.002403846153846154,"long-running":0.002403846153846154,"effort":0.002403846153846154,"together":0.002403846153846154,"with":0.002403846153846154,"wallets":0.002403846153846154,"modernize":0.002403846153846154,"web":0.002403846153846154,"ecosystem":0.002403846153846154,"culminating":0.002403846153846154,"in":0.002403846153846154,"sip-030":0.002403846153846154,"https":0.002403846153846154,"github":0.002403846153846154,"com":0.002403846153846154,"janniks":0.002403846153846154,"sips":0.002403846153846154,"blob":0.002403846153846154,"main":0.002403846153846154,"sip-030-wallet-interface":0.002403846153846154,"md":0.002403846153846154,"new":0.002403846153846154,"request":0.002403846153846154,"method":0.002403846153846154,"for":0.002403846153846154,"legacy":0.002403846153846154,"of":0.002403846153846154,"using":0.002403846153846154,"jwt":0.002403846153846154,"tokens":0.002403846153846154,"use":0.002403846153846154,"see":0.002403846153846154,"guide":0.002403846153846154,"docs":0.002403846153846154,"guides":0.002403846153846154,"details":0.002403846153846154,"installation":0.002403846153846154,"package-install":0.002403846153846154,"initiate":0.002403846153846154,"connection":0.002403846153846154,"addresses":0.002403846153846154,"typescript":0.002403846153846154,"connect'":0.002403846153846154,"const":0.002403846153846154,"response":0.002403846153846154,"await":0.002403846153846154,"stores":0.002403846153846154,"address":0.002403846153846154,"local":0.002403846153846154,"storage":0.002403846153846154,"by":0.002403846153846154,"default":0.002403846153846154,"get":0.002403846153846154,"data":0.002403846153846154,"stored":0.002403846153846154,"call":0.002403846153846154,"getlocalstorage":0.002403846153846154,"stx":0.002403846153846154,"sp2mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn":0.002403846153846154,"btc":0.002403846153846154,"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae":0.002403846153846154,"managing":0.002403846153846154,"state":0.002403846153846154,"disconnect":0.002403846153846154,"isconnected":0.002403846153846154,"false":0.002403846153846154,"similar":0.002403846153846154,"getaddresses":0.002403846153846154,"true":0.002403846153846154,"clears":0.002403846153846154,"selected":0.002403846153846154,"trigger":0.002403846153846154,"interactions":0.002403846153846154,"forcewalletselect":0.002403846153846154,"'getaddresses'":0.002403846153846154,"available":0.002403846153846154,"methods":0.002403846153846154,"-":0.002403846153846154,"sendtransfer":0.002403846153846154,"signpsbt":0.002403846153846154,"stx_getaddresses":0.002403846153846154,"stx_getaccounts":0.002403846153846154,"stx_transferstx":0.002403846153846154,"stx_callcontract":0.002403846153846154,"stx_deploycontract":0.002403846153846154,"stx_signmessage":0.002403846153846154,"stx_signstructuredmessage":0.002403846153846154,"publickey":0.002403846153846154,"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69":0.002403846153846154,"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr":0.002403846153846154,"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114":0.002403846153846154,"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304":0.002403846153846154,"'sendtransfer'":0.002403846153846154,"recipients":0.002403846153846154,"'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'":0.002403846153846154,"recipient":0.002403846153846154,"amount":0.002403846153846154,"'1000'":0.002403846153846154,"sats":0.002403846153846154,"specify":0.002403846153846154,"multiple":0.002403846153846154,"'bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh'":0.002403846153846154,"'2000'":0.002403846153846154,"txid":0.002403846153846154,"0x1234":0.002403846153846154,"transaction":0.002403846153846154,"id":0.002403846153846154,"'signpsbt'":0.002403846153846154,"psbt":0.002403846153846154,"'chnidp":0.002403846153846154,"base64":0.002403846153846154,"encoded":0.002403846153846154,"string":0.002403846153846154,"signinputs":0.002403846153846154,"index":0.002403846153846154,"indices":0.002403846153846154,"inputs":0.002403846153846154,"optional":0.002403846153846154,"whether":0.002403846153846154,"after":0.002403846153846154,"signing":0.002403846153846154,"if":0.002403846153846154,"is":0.002403846153846154,"chnidp":0.002403846153846154,"signed":0.002403846153846154,"format":0.002403846153846154,"'stx_getaddresses'":0.002403846153846154,"'stx_getaccounts'":0.002403846153846154,"02d3331cbb9f72fe635e6f87c2cf1a13cd":0.002403846153846154,"gaiahuburl":0.002403846153846154,"hub":0.002403846153846154,"hiro":0.002403846153846154,"so":0.002403846153846154,"gaiaappkey":0.002403846153846154,"0488ade4040658015580000000dc81e3a5":0.002403846153846154,"'stx_transferstx'":0.002403846153846154,"micro-stx":0.002403846153846154,"000":0.002403846153846154,"'sp2mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn'":0.002403846153846154,"network":0.002403846153846154,"'mainnet'":0.002403846153846154,"defaults":0.002403846153846154,"mainnet":0.002403846153846154,"memo":0.002403846153846154,"'optional":0.002403846153846154,"memo'":0.002403846153846154,"field":0.002403846153846154,"'stx_callcontract'":0.002403846153846154,"contract":0.002403846153846154,"'sp2mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn":0.002403846153846154,"counters'":0.002403846153846154,"contract-name":0.002403846153846154,"functionname":0.002403846153846154,"'count'":0.002403846153846154,"name":0.002403846153846154,"function":0.002403846153846154,"functionargs":0.002403846153846154,"cl":0.002403846153846154,"int":0.002403846153846154,"array":0.002403846153846154,"clarity":0.002403846153846154,"values":0.002403846153846154,"as":0.002403846153846154,"arguments":0.002403846153846154,"'stx_deploycontract'":0.002403846153846154,"'counters'":0.002403846153846154,"claritycode":0.002403846153846154,"define-map":0.002403846153846154,"counters":0.002403846153846154,"principal":0.002403846153846154,"define-public":0.002403846153846154,"count":0.002403846153846154,"change":0.002403846153846154,"ok":0.002403846153846154,"map-set":0.002403846153846154,"tx-sender":0.002403846153846154,"get-count":0.002403846153846154,"define-read-only":0.002403846153846154,"who":0.002403846153846154,"default-to":0.002403846153846154,"map-get":0.002403846153846154,"code":0.002403846153846154,"clarityversion":0.002403846153846154,"'2'":0.002403846153846154,"latest":0.002403846153846154,"'stx_signmessage'":0.002403846153846154,"message":0.002403846153846154,"'hello":0.002403846153846154,"world":0.002403846153846154,"signature":0.002403846153846154,"public":0.002403846153846154,"key":0.002403846153846154,"that":0.002403846153846154,"claritymessage":0.002403846153846154,"parse":0.002403846153846154,"structured":0.002403846153846154,"num":0.002403846153846154,"u3":0.002403846153846154,"claritydomain":0.002403846153846154,"tuple":0.002403846153846154,"domain":0.002403846153846154,"stringascii":0.002403846153846154,"'example":0.002403846153846154,"com'":0.002403846153846154,"'1":0.002403846153846154,"0'":0.002403846153846154,"'chain-id'":0.002403846153846154,"uint":0.002403846153846154,"'stx_signstructuredmessage'":0.002403846153846154,"value":0.002403846153846154,"representing":0.002403846153846154,"object":0.002403846153846154,"sip-018":0.002403846153846154,"style":0.002403846153846154,"error":0.002403846153846154,"handling":0.002403846153846154,"returns":0.002403846153846154,"promise":0.002403846153846154,"allowing":0.002403846153846154,"handle":0.002403846153846154,"errors":0.002403846153846154,"standard":0.002403846153846154,"promise-based":0.002403846153846154,"patterns":0.002403846153846154,"either":0.002403846153846154,"try":0.002403846153846154,"catch":0.002403846153846154,"async":0.002403846153846154,"or":0.002403846153846154,"chains":0.002403846153846154,"success":0.002403846153846154,"console":0.002403846153846154,"log":0.002403846153846154,"'transaction":0.002403846153846154,"successful":0.002403846153846154,"'wallet":0.002403846153846154,"returned":0.002403846153846154,"an":0.002403846153846154,"compatibility":0.002403846153846154,"adds":0.002403846153846154,"layer":0.002403846153846154,"auto-compatibility":0.002403846153846154,"different":0.002403846153846154,"providers":0.002403846153846154,"meant":0.002403846153846154,"unify":0.002403846153846154,"interface":0.002403846153846154,"where":0.002403846153846154,"may":0.002403846153846154,"not":0.002403846153846154,"implement":0.002403846153846154,"results":0.002403846153846154,"same":0.002403846153846154,"way":0.002403846153846154,"support":0.002403846153846154,"complete":0.002403846153846154,"list":0.002403846153846154,"status":0.002403846153846154,"page":0.002403846153846154,"advanced":0.002403846153846154,"usage":0.002403846153846154,"called":0.002403846153846154,"options":0.002403846153846154,"first":0.002403846153846154,"parameter":0.002403846153846154,"provider":0.002403846153846154,"stacksprovider":0.002403846153846154,"custom":0.002403846153846154,"boolean":0.002403846153846154,"force":0.002403846153846154,"user":0.002403846153846154,"select":0.002403846153846154,"persistwalletselect":0.002403846153846154,"persist":0.002403846153846154,"enableoverrides":0.002403846153846154,"enablelocalstorage":0.002403846153846154,"store":0.002403846153846154,"defaultproviders":0.002403846153846154,"wbipprovider":0.002403846153846154,"display":0.002403846153846154,"modal":0.002403846153846154,"approvedproviderids":0.002403846153846154,"approved":0.002403846153846154,"ids":0.002403846153846154,"show":0.002403846153846154,"'method'":0.002403846153846154,"params":0.002403846153846154,"without":0.002403846153846154,"option":0.002403846153846154,"automatic":0.002403846153846154,"fixes":0.002403846153846154,"example":0.002403846153846154,"it":0.002403846153846154,"handles":0.002403846153846154,"converting":0.002403846153846154,"numeric":0.002403846153846154,"types":0.002403846153846154,"between":0.002403846153846154,"number":0.002403846153846154,"formats":0.002403846153846154,"needed":0.002403846153846154,"remaps":0.002403846153846154,"certain":0.002403846153846154,"names":0.002403846153846154,"match":0.002403846153846154,"wallet-specific":0.002403846153846154,"implementations":0.002403846153846154,"ensures":0.002403846153846154,"consistent":0.002403846153846154,"behavior":0.002403846153846154,"across":0.002403846153846154,"requiring":0.002403846153846154,"manual":0.002403846153846154,"adjustments":0.002403846153846154,"allows":0.002403846153846154,"filter":0.002403846153846154,"which":0.002403846153846154,"are":0.002403846153846154,"shown":0.002403846153846154,"useful":0.002403846153846154,"when":0.002403846153846154,"want":0.002403846153846154,"limit":0.002403846153846154,"specific":0.002403846153846154,"might":0.002403846153846154,"only":0.002403846153846154,"leather":0.002403846153846154,"'leatherprovider'":0.002403846153846154,"'xverse'":0.002403846153846154,"requestraw":0.002403846153846154,"provides":0.002403846153846154,"direct":0.002403846153846154,"access":0.002403846153846154,"additional":0.002403846153846154,"features":0.002403846153846154,"raw":0.002403846153846154,"bypasses":0.002403846153846154,"selector":0.002403846153846154,"other":0.002403846153846154,"come":0.002403846153846154,"need":0.002403846153846154,"control":0.002403846153846154,"over":0.002403846153846154,"interaction":0.002403846153846154,"process":0.002403846153846154},"357":{"1":0.006369426751592357,"import":0.006369426751592357,"chevronright":0.006369426751592357,"code":0.006369426751592357,"terminal":0.006369426751592357,"folder":0.006369426751592357,"as":0.006369426751592357,"foldericon":0.006369426751592357,"from":0.006369426751592357,"'lucide-react'":0.006369426751592357,"file":0.006369426751592357,"files":0.006369426751592357,"'fumadocs-ui":0.006369426751592357,"components":0.006369426751592357,"files'":0.006369426751592357,"steps":0.006369426751592357,"step":0.006369426751592357,"steps'":0.006369426751592357,"in":0.006369426751592357,"this":0.006369426751592357,"quickstart":0.006369426751592357,"guide":0.006369426751592357,"you":0.006369426751592357,"will":0.006369426751592357,"learn":0.006369426751592357,"how":0.006369426751592357,"to":0.006369426751592357,"set":0.006369426751592357,"up":0.006369426751592357,"your":0.006369426751592357,"project":0.006369426751592357,"authenticate":0.006369426751592357,"users":0.006369426751592357,"with":0.006369426751592357,"a":0.006369426751592357,"web":0.006369426751592357,"wallet":0.006369426751592357,"and":0.006369426751592357,"initiate":0.006369426751592357,"stx":0.006369426751592357,"token":0.006369426751592357,"transfer":0.006369426751592357,"for":0.006369426751592357,"deeper":0.006369426751592357,"dive":0.006369426751592357,"into":0.006369426751592357,"the":0.006369426751592357,"authentication":0.006369426751592357,"process":0.006369426751592357,"check":0.006369426751592357,"out":0.006369426751592357,"stacks":0.006369426751592357,"connect":0.006369426751592357,"guides":0.006369426751592357,"authenticate-users":0.006369426751592357,"---":0.006369426751592357,"install":0.006369426751592357,"package":0.006369426751592357,"dependencies":0.006369426751592357,"add":0.006369426751592357,"necessary":0.006369426751592357,"packages":0.006369426751592357,"using":0.006369426751592357,"preferred":0.006369426751592357,"manager":0.006369426751592357,"package-install":0.006369426751592357,"function":0.006369426751592357,"stores":0.006369426751592357,"user's":0.006369426751592357,"address":0.006369426751592357,"local":0.006369426751592357,"storage":0.006369426751592357,"by":0.006369426751592357,"default":0.006369426751592357,"making":0.006369426751592357,"it":0.006369426751592357,"easy":0.006369426751592357,"persist":0.006369426751592357,"session":0.006369426751592357,"across":0.006369426751592357,"page":0.006369426751592357,"reloads":0.006369426751592357,"browser":0.006369426751592357,"sessions":0.006369426751592357,"ts":0.006369426751592357,"'":0.006369426751592357,"connect'":0.006369426751592357,"const":0.006369426751592357,"response":0.006369426751592357,"await":0.006369426751592357,"access":0.006369426751592357,"addresses":0.006369426751592357,"can":0.006369426751592357,"use":0.006369426751592357,"getlocalstorage":0.006369426751592357,"data":0.006369426751592357,"manage":0.006369426751592357,"connection's":0.006369426751592357,"state":0.006369426751592357,"following":0.006369426751592357,"disconnect":0.006369426751592357,"isconnected":0.006369426751592357,"false":0.006369426751592357,"similar":0.006369426751592357,"getaddresses":0.006369426751592357,"method":0.006369426751592357,"true":0.006369426751592357,"clears":0.006369426751592357,"selected":0.006369426751592357,"request":0.006369426751592357,"trigger":0.006369426751592357,"of":0.006369426751592357,"connecting":0.006369426751592357,"gives":0.006369426751592357,"app":0.006369426751592357,"information":0.006369426751592357,"about":0.006369426751592357,"account":0.006369426751592357,"which":0.006369426751592357,"enables":0.006369426751592357,"interactions":0.006369426751592357,"blockchain":0.006369426751592357,"like":0.006369426751592357,"calling":0.006369426751592357,"smart":0.006369426751592357,"contracts":0.006369426751592357,"stx_transferstx":0.006369426751592357,"tsx":0.006369426751592357,"'stx_transferstx'":0.006369426751592357,"amount":0.006369426751592357,"'1000'":0.006369426751592357,"micro-stx":0.006369426751592357,"000":0.006369426751592357,"recipient":0.006369426751592357,"'sp2mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn'":0.006369426751592357,"network":0.006369426751592357,"'mainnet'":0.006369426751592357,"optional":0.006369426751592357,"defaults":0.006369426751592357,"mainnet":0.006369426751592357,"memo":0.006369426751592357,"'optional":0.006369426751592357,"memo'":0.006369426751592357,"field":0.006369426751592357,"next":0.006369426751592357,"cards":0.006369426751592357,"card":0.006369426751592357,"href":0.006369426751592357,"title":0.006369426751592357,"description":0.006369426751592357,"js":0.006369426751592357,"broadcast-transactions":0.006369426751592357,"broadcast":0.006369426751592357,"transactions":0.006369426751592357,"sign":0.006369426751592357,"sign-messages":0.006369426751592357,"messages":0.006369426751592357},"358":{"import":0.013513513513513514,"accordion":0.013513513513513514,"accordioncontent":0.013513513513513514,"accordionitem":0.013513513513513514,"accordiontrigger":0.013513513513513514,"from":0.013513513513513514,"components":0.013513513513513514,"ui":0.013513513513513514,"badge":0.013513513513513514,"'":0.013513513513513514,"badge'":0.013513513513513514,"tabs":0.013513513513513514,"tabscontent":0.013513513513513514,"tabslist":0.013513513513513514,"tabstrigger":0.013513513513513514,"tabs'":0.013513513513513514,"initsimnet":0.013513513513513514,"the":0.013513513513513514,"function":0.013513513513513514,"initializes":0.013513513513513514,"a":0.013513513513513514,"simulated":0.013513513513513514,"network":0.013513513513513514,"it":0.013513513513513514,"will":0.013513513513513514,"often":0.013513513513513514,"be":0.013513513513513514,"first":0.013513513513513514,"you":0.013513513513513514,"call":0.013513513513513514,"when":0.013513513513513514,"using":0.013513513513513514,"sdk":0.013513513513513514,"parameters":0.013513513513513514,"manifestpath":0.013513513513513514,"is":0.013513513513513514,"path":0.013513513513513514,"to":0.013513513513513514,"clarinet":0.013513513513513514,"toml":0.013513513513513514,"manifest":0.013513513513513514,"file":0.013513513513513514,"defaultvalue":0.013513513513513514,"default":0.013513513513513514,"classname":0.013513513513513514,"'flex":0.013513513513513514,"flex-wrap'":0.013513513513513514,"value":0.013513513513513514,"'tab":0.013513513513513514,"group'":0.013513513513513514,"'transition-colors'":0.013513513513513514,"creating":0.013513513513513514,"new":0.013513513513513514,"instance":0.013513513513513514,"of":0.013513513513513514,"simnet":0.013513513513513514,"custom":0.013513513513513514,"'badge":0.013513513513513514,"transition-colors'":0.013513513513513514,"with":0.013513513513513514,"config":0.013513513513513514,"ts":0.013513513513513514,"hirosystems":0.013513513513513514,"clarinet-sdk'":0.013513513513513514,"const":0.013513513513513514,"await":0.013513513513513514,"toml'":0.013513513513513514,"type":0.013513513513513514,"single":0.013513513513513514,"collapsible":0.013513513513513514,"w-full":0.013513513513513514,"schema":0.013513513513513514,"string":0.013513513513513514,"promise":0.013513513513513514},"359":{"1":0.013513513513513514,"2":0.013513513513513514,"5":0.013513513513513514,"import":0.013513513513513514,"accordion":0.013513513513513514,"accordions":0.013513513513513514,"from":0.013513513513513514,"'fumadocs-ui":0.013513513513513514,"components":0.013513513513513514,"accordion'":0.013513513513513514,"badge":0.013513513513513514,"'":0.013513513513513514,"ui":0.013513513513513514,"badge'":0.013513513513513514,"tabs":0.013513513513513514,"tabscontent":0.013513513513513514,"tabslist":0.013513513513513514,"tabstrigger":0.013513513513513514,"tabs'":0.013513513513513514,"blockheight":0.013513513513513514,"returns":0.013513513513513514,"the":0.013513513513513514,"current":0.013513513513513514,"block":0.013513513513513514,"height":0.013513513513513514,"of":0.013513513513513514,"simnet":0.013513513513513514,"defaultvalue":0.013513513513513514,"default":0.013513513513513514,"classname":0.013513513513513514,"'flex":0.013513513513513514,"flex-wrap'":0.013513513513513514,"value":0.013513513513513514,"'tab":0.013513513513513514,"group'":0.013513513513513514,"'badge":0.013513513513513514,"transition-colors'":0.013513513513513514,"getting":0.013513513513513514,"ts":0.013513513513513514,"const":0.013513513513513514,"currentblockheight":0.013513513513513514,"title":0.013513513513513514,"response":0.013513513513513514,"deployer":0.013513513513513514,"address":0.013513513513513514,"as":0.013513513513513514,"defined":0.013513513513513514,"in":0.013513513513513514,"project":0.013513513513513514,"file":0.013513513513513514,"set-deployer":0.013513513513513514,"setting":0.013513513513513514,"to":0.013513513513513514,"a":0.013513513513513514,"new":0.013513513513513514,"currentdeployeraddress":0.013513513513513514,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.013513513513513514,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5'":0.013513513513513514,"newdeployer":0.013513513513513514,"st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":0.013513513513513514,"currentepoch":0.013513513513513514,"epoch":0.013513513513513514,"this":0.013513513513513514,"represents":0.013513513513513514,"stacks":0.013513513513513514,"blockchain's":0.013513513513513514,"progress":0.013513513513513514,"through":0.013513513513513514,"discrete":0.013513513513513514,"time":0.013513513513513514,"periods":0.013513513513513514,"cycles":0.013513513513513514,"or":0.013513513513513514,"upgrades":0.013513513513513514},"360":{"0":0.0044444444444444444,"1":0.0044444444444444444,"2":0.0044444444444444444,"3":0.0044444444444444444,"4":0.0044444444444444444,"19":0.0044444444444444444,"500":0.0044444444444444444,"19000000":0.0044444444444444444,"import":0.0044444444444444444,"accordion":0.0044444444444444444,"accordions":0.0044444444444444444,"from":0.0044444444444444444,"'fumadocs-ui":0.0044444444444444444,"components":0.0044444444444444444,"accordion'":0.0044444444444444444,"badge":0.0044444444444444444,"'":0.0044444444444444444,"ui":0.0044444444444444444,"badge'":0.0044444444444444444,"tabs":0.0044444444444444444,"tabscontent":0.0044444444444444444,"tabslist":0.0044444444444444444,"tabstrigger":0.0044444444444444444,"tabs'":0.0044444444444444444,"tohaveclaritytype":0.0044444444444444444,"check":0.0044444444444444444,"that":0.0044444444444444444,"a":0.0044444444444444444,"value":0.0044444444444444444,"has":0.0044444444444444444,"the":0.0044444444444444444,"right":0.0044444444444444444,"clarity":0.0044444444444444444,"type":0.0044444444444444444,"without":0.0044444444444444444,"checking":0.0044444444444444444,"its":0.0044444444444444444,"parameters":0.0044444444444444444,"expected":0.0044444444444444444,"should":0.0044444444444444444,"have":0.0044444444444444444,"defaultvalue":0.0044444444444444444,"default":0.0044444444444444444,"classname":0.0044444444444444444,"'flex":0.0044444444444444444,"flex-wrap'":0.0044444444444444444,"'tab":0.0044444444444444444,"group'":0.0044444444444444444,"'badge":0.0044444444444444444,"transition-colors'":0.0044444444444444444,"for":0.0044444444444444444,"an":0.0044444444444444444,"ok":0.0044444444444444444,"response":0.0044444444444444444,"ts":0.0044444444444444444,"const":0.0044444444444444444,"result":0.0044444444444444444,"simnet":0.0044444444444444444,"callpublicfn":0.0044444444444444444,"'counter'":0.0044444444444444444,"'increment'":0.0044444444444444444,"deployer":0.0044444444444444444,"expect":0.0044444444444444444,"claritytype":0.0044444444444444444,"responseok":0.0044444444444444444,"title":0.0044444444444444444,"source":0.0044444444444444444,"code":0.0044444444444444444,"counter":0.0044444444444444444,"clar":0.0044444444444444444,"define-data-var":0.0044444444444444444,"count":0.0044444444444444444,"uint":0.0044444444444444444,"u0":0.0044444444444444444,"define-public":0.0044444444444444444,"increment":0.0044444444444444444,"begin":0.0044444444444444444,"var-set":0.0044444444444444444,"var-get":0.0044444444444444444,"u1":0.0044444444444444444,"schema":0.0044444444444444444,"expectedtype":0.0044444444444444444,"tobeok":0.0044444444444444444,"is":0.0044444444444444444,"ok-type":0.0044444444444444444,"and":0.0044444444444444444,"any":0.0044444444444444444,"can":0.0044444444444444444,"be":0.0044444444444444444,"passed":0.0044444444444444444,"clarityvalue":0.0044444444444444444,"with":0.0044444444444444444,"specific":0.0044444444444444444,"cl":0.0044444444444444444,"tobeerr":0.0044444444444444444,"err":0.0044444444444444444,"error-type":0.0044444444444444444,"'add'":0.0044444444444444444,"define-constant":0.0044444444444444444,"too_big":0.0044444444444444444,"u10":0.0044444444444444444,"add":0.0044444444444444444,"amount":0.0044444444444444444,"let":0.0044444444444444444,"new-count":0.0044444444444444444,"if":0.0044444444444444444,"u500":0.0044444444444444444,"tobesome":0.0044444444444444444,"some":0.0044444444444444444,"optional":0.0044444444444444444,"callreadonlyfn":0.0044444444444444444,"'pool'":0.0044444444444444444,"'get-participant'":0.0044444444444444444,"standardprincipal":0.0044444444444444444,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5'":0.0044444444444444444,"bool":0.0044444444444444444,"true":0.0044444444444444444,"pool":0.0044444444444444444,"define-map":0.0044444444444444444,"participants":0.0044444444444444444,"principal":0.0044444444444444444,"participantstatus":0.0044444444444444444,"enrollmentblock":0.0044444444444444444,"contributionamount":0.0044444444444444444,"define-read-only":0.0044444444444444444,"get-participant":0.0044444444444444444,"who":0.0044444444444444444,"map-get":0.0044444444444444444,"map-set":0.0044444444444444444,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":0.0044444444444444444,"u19000000":0.0044444444444444444,"tobenone":0.0044444444444444444,"none":0.0044444444444444444,"tobebool":0.0044444444444444444,"asserts":0.0044444444444444444,"of":0.0044444444444444444,"boolean":0.0044444444444444444,"or":0.0044444444444444444,"false":0.0044444444444444444,"'has-contributed'":0.0044444444444444444,"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm'":0.0044444444444444444,"has-contributed":0.0044444444444444444,"is-some":0.0044444444444444444,"get":0.0044444444444444444,"tx-sender":0.0044444444444444444,"tobeint":0.0044444444444444444,"integer":0.0044444444444444444,"1n":0.0044444444444444444,"int":0.0044444444444444444,"number":0.0044444444444444444,"bigint":0.0044444444444444444,"tobeuint":0.0044444444444444444,"unsigned":0.0044444444444444444,"tobeascii":0.0044444444444444444,"string-ascii":0.0044444444444444444,"string":0.0044444444444444444,"'hello-world'":0.0044444444444444444,"'say-hi'":0.0044444444444444444,"'hello":0.0044444444444444444,"world'":0.0044444444444444444,"hello-world":0.0044444444444444444,"say-hi":0.0044444444444444444,"hello":0.0044444444444444444,"world":0.0044444444444444444,"tobeutf8":0.0044444444444444444,"string-utf8":0.0044444444444444444,"u":0.0044444444444444444,"tobeprincipal":0.0044444444444444444,"standard":0.0044444444444444444,"contract":0.0044444444444444444,"options":0.0044444444444444444,"contractprincipal":0.0044444444444444444,"tobebuff":0.0044444444444444444,"buffer":0.0044444444444444444,"it":0.0044444444444444444,"takes":0.0044444444444444444,"arraybuffer":0.0044444444444444444,"as":0.0044444444444444444,"input":0.0044444444444444444,"building":0.0044444444444444444,"stacks":0.0044444444444444444,"transactions":0.0044444444444444444,"provides":0.0044444444444444444,"helper":0.0044444444444444444,"functions":0.0044444444444444444,"-":0.0044444444444444444,"bufferfromascii":0.0044444444444444444,"bufferfromutf8":0.0044444444444444444,"bufferfromhex":0.0044444444444444444,"uint8array":0.0044444444444444444,"ascii":0.0044444444444444444,"hex":0.0044444444444444444,"'helpers'":0.0044444444444444444,"'get-byte-array'":0.0044444444444444444,"helpers":0.0044444444444444444,"0x01020304":0.0044444444444444444,"get-byte-array":0.0044444444444444444,"transactions'":0.0044444444444444444,"'get-btc-buffer'":0.0044444444444444444,"btc":0.0044444444444444444,"'btc'":0.0044444444444444444,"ascii_btc":0.0044444444444444444,"0x627463":0.0044444444444444444,"get-btc-buffer":0.0044444444444444444,"get-tx-hash":0.0044444444444444444,"tx":0.0044444444444444444,"73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e":0.0044444444444444444,"tx_hash":0.0044444444444444444,"0x73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e":0.0044444444444444444,"tobelist":0.0044444444444444444,"list":0.0044444444444444444,"containing":0.0044444444444444444,"array":0.0044444444444444444,"values":0.0044444444444444444,"'get-addresses'":0.0044444444444444444,"'st2cy5v39nhdpwsxmw9qdt3hc3gd6q6xx4cfrk9ag'":0.0044444444444444444,"get-addresses":0.0044444444444444444,"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.0044444444444444444,"'st2cy5v39nhdpwsxmw9qdt3hc3gd6q6xx4cfrk9ag":0.0044444444444444444,"tobetuple":0.0044444444444444444,"tuple":0.0044444444444444444,"object":0.0044444444444444444,"'get-participant-data'":0.0044444444444444444,"get-participant-data":0.0044444444444444444,"record":0.0044444444444444444},"361":{"0":0.002004008016032064,"1":0.002004008016032064,"2":0.002004008016032064,"3":0.002004008016032064,"5":0.002004008016032064,"6":0.002004008016032064,"7":0.002004008016032064,"9":0.002004008016032064,"10":0.002004008016032064,"11":0.002004008016032064,"26":0.002004008016032064,"37":0.002004008016032064,"42":0.002004008016032064,"53":0.002004008016032064,"58":0.002004008016032064,"61":0.002004008016032064,"87":0.002004008016032064,"100":0.002004008016032064,"108":0.002004008016032064,"109":0.002004008016032064,"120":0.002004008016032064,"123":0.002004008016032064,"138":0.002004008016032064,"191":0.002004008016032064,"193":0.002004008016032064,"195":0.002004008016032064,"206":0.002004008016032064,"220":0.002004008016032064,"222":0.002004008016032064,"223":0.002004008016032064,"242":0.002004008016032064,"246":0.002004008016032064,"1000":0.002004008016032064,"1000000":0.002004008016032064,"19000000":0.002004008016032064,"42000000":0.002004008016032064,"import":0.002004008016032064,"accordion":0.002004008016032064,"accordions":0.002004008016032064,"from":0.002004008016032064,"'fumadocs-ui":0.002004008016032064,"components":0.002004008016032064,"accordion'":0.002004008016032064,"badge":0.002004008016032064,"'":0.002004008016032064,"ui":0.002004008016032064,"badge'":0.002004008016032064,"tabs":0.002004008016032064,"tabscontent":0.002004008016032064,"tabslist":0.002004008016032064,"tabstrigger":0.002004008016032064,"tabs'":0.002004008016032064,"getaccounts":0.002004008016032064,"retrieve":0.002004008016032064,"a":0.002004008016032064,"list":0.002004008016032064,"of":0.002004008016032064,"all":0.002004008016032064,"stacks":0.002004008016032064,"addresses":0.002004008016032064,"configured":0.002004008016032064,"within":0.002004008016032064,"the":0.002004008016032064,"project":0.002004008016032064,"including":0.002004008016032064,"wallets":0.002004008016032064,"deployers":0.002004008016032064,"and":0.002004008016032064,"faucets":0.002004008016032064,"defaultvalue":0.002004008016032064,"get-accounts":0.002004008016032064,"classname":0.002004008016032064,"'flex":0.002004008016032064,"flex-wrap'":0.002004008016032064,"value":0.002004008016032064,"'tab":0.002004008016032064,"group'":0.002004008016032064,"'badge":0.002004008016032064,"transition-colors'":0.002004008016032064,"getting":0.002004008016032064,"your":0.002004008016032064,"accounts":0.002004008016032064,"get-account":0.002004008016032064,"selecting":0.002004008016032064,"specific":0.002004008016032064,"account":0.002004008016032064,"ts":0.002004008016032064,"const":0.002004008016032064,"simnet":0.002004008016032064,"title":0.002004008016032064,"response":0.002004008016032064,"map":0.002004008016032064,"wallet_7":0.002004008016032064,"st3pf13w7z0rrm42a8vzrvfq75sv1k26rxep8ygkj":0.002004008016032064,"wallet_1":0.002004008016032064,"st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":0.002004008016032064,"wallet_3":0.002004008016032064,"st2jhg361zxg51qtky2nqcvbpprre2kzb1hr05nnc":0.002004008016032064,"wallet_5":0.002004008016032064,"st2rehhs5j3cercrbepmgh7921q6pykaadt7jp2vb":0.002004008016032064,"wallet_8":0.002004008016032064,"st3nbrsfkx28fq2zj1makx58hkhsdgnv5n7r21xcp":0.002004008016032064,"wallet_4":0.002004008016032064,"st2neb84asendxkygjpqw86yxqcefex2zqpg87nd":0.002004008016032064,"deployer":0.002004008016032064,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.002004008016032064,"wallet_6":0.002004008016032064,"st3am1a56ak2c1xafj4115zsv26eb49bvq10mgcs0":0.002004008016032064,"wallet_2":0.002004008016032064,"st2cy5v39nhdpwsxmw9qdt3hc3gd6q6xx4cfrk9ag":0.002004008016032064,"faucet":0.002004008016032064,"stnhkepyepj8et55zz0m5a34j0r3n5fm2cmmmaz6":0.002004008016032064,"schema":0.002004008016032064,"string":0.002004008016032064,"wallet":0.002004008016032064,"get":0.002004008016032064,"'wallet_1'":0.002004008016032064,"getassetsmap":0.002004008016032064,"asset":0.002004008016032064,"balances":0.002004008016032064,"associated":0.002004008016032064,"with":0.002004008016032064,"fungible":0.002004008016032064,"non-fungible":0.002004008016032064,"tokens":0.002004008016032064,"default":0.002004008016032064,"stx":0.002004008016032064,"get-ft-balance":0.002004008016032064,"ft":0.002004008016032064,"get-nft-balance":0.002004008016032064,"nft":0.002004008016032064,"get-deployer-balance":0.002004008016032064,"filtering":0.002004008016032064,"for":0.002004008016032064,"an":0.002004008016032064,"assets":0.002004008016032064,"stxbalances":0.002004008016032064,"'stx'":0.002004008016032064,"100000000000000n":0.002004008016032064,"bigint":0.002004008016032064,"contractname":0.002004008016032064,"'token'":0.002004008016032064,"sourcecode":0.002004008016032064,"define-fungible-token":0.002004008016032064,"sbtc":0.002004008016032064,"ft-mint":0.002004008016032064,"u19":0.002004008016032064,"tx-sender":0.002004008016032064,"deploycontract":0.002004008016032064,"null":0.002004008016032064,"tokenbalance":0.002004008016032064,"token":0.002004008016032064,"sbtc'":0.002004008016032064,"19n":0.002004008016032064,"'nft'":0.002004008016032064,"define-non-fungible-token":0.002004008016032064,"ticket":0.002004008016032064,"uint":0.002004008016032064,"nft-mint":0.002004008016032064,"u42":0.002004008016032064,"nftbalance":0.002004008016032064,"ticket'":0.002004008016032064,"1n":0.002004008016032064,"deployerbalance":0.002004008016032064,"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm'":0.002004008016032064,"getdatavar":0.002004008016032064,"data-var":0.002004008016032064,"defined":0.002004008016032064,"in":0.002004008016032064,"contract":0.002004008016032064,"parameters":0.002004008016032064,"identifier":0.002004008016032064,"span":0.002004008016032064,"example":0.002004008016032064,"counter":0.002004008016032064,"name":0.002004008016032064,"count":0.002004008016032064,"data":0.002004008016032064,"variable":0.002004008016032064,"clarity-value":0.002004008016032064,"converting":0.002004008016032064,"clarity":0.002004008016032064,"values":0.002004008016032064,"currentcount":0.002004008016032064,"'counter'":0.002004008016032064,"'count'":0.002004008016032064,"source":0.002004008016032064,"code":0.002004008016032064,"clar":0.002004008016032064,"define-data-var":0.002004008016032064,"u0":0.002004008016032064,"contractowner":0.002004008016032064,"principal":0.002004008016032064,"var-set":0.002004008016032064,"var-get":0.002004008016032064,"u1":0.002004008016032064,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":0.002004008016032064,"type":0.002004008016032064,"datavar":0.002004008016032064,"clarityvalue":0.002004008016032064,"cvtovalue":0.002004008016032064,"transactions'":0.002004008016032064,"getmapentry":0.002004008016032064,"entry":0.002004008016032064,"by":0.002004008016032064,"its":0.002004008016032064,"key":0.002004008016032064,"note":0.002004008016032064,"that":0.002004008016032064,"this":0.002004008016032064,"method":0.002004008016032064,"will":0.002004008016032064,"always":0.002004008016032064,"return":0.002004008016032064,"optional":0.002004008016032064,"some":0.002004008016032064,"or":0.002004008016032064,"none":0.002004008016032064,"just":0.002004008016032064,"like":0.002004008016032064,"map-get":0.002004008016032064,"pool":0.002004008016032064,"participants":0.002004008016032064,"to":0.002004008016032064,"access":0.002004008016032064,"cl":0.002004008016032064,"standardprincipal":0.002004008016032064,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5'":0.002004008016032064,"hasparticipated":0.002004008016032064,"define-map":0.002004008016032064,"bool":0.002004008016032064,"map-set":0.002004008016032064,"true":0.002004008016032064,"mapname":0.002004008016032064,"mapkey":0.002004008016032064,"callreadonlyfn":0.002004008016032064,"call":0.002004008016032064,"read-only":0.002004008016032064,"functions":0.002004008016032064,"exposed":0.002004008016032064,"returns":0.002004008016032064,"object":0.002004008016032064,"result":0.002004008016032064,"function":0.002004008016032064,"as":0.002004008016032064,"it":0.002004008016032064,"takes":0.002004008016032064,"arguments":0.002004008016032064,"form":0.002004008016032064,"which":0.002004008016032064,"are":0.002004008016032064,"available":0.002004008016032064,"package":0.002004008016032064,"transactions":0.002004008016032064,"js":0.002004008016032064,"packages":0.002004008016032064,"get-participant":0.002004008016032064,"pass":0.002004008016032064,"if":0.002004008016032064,"no":0.002004008016032064,"needed":0.002004008016032064,"empty":0.002004008016032064,"array":0.002004008016032064,"address":0.002004008016032064,"sender":0.002004008016032064,"making":0.002004008016032064,"with-no-arguments":0.002004008016032064,"explicit":0.002004008016032064,"getcontributionamount":0.002004008016032064,"'pool'":0.002004008016032064,"'get-contribution-amount'":0.002004008016032064,"participantstatus":0.002004008016032064,"enrollmentblock":0.002004008016032064,"contributionamount":0.002004008016032064,"define-read-only":0.002004008016032064,"who":0.002004008016032064,"get-contribution-amount":0.002004008016032064,"default-to":0.002004008016032064,"is-active":0.002004008016032064,"block-height":0.002004008016032064,"u42000000":0.002004008016032064,"420000000n":0.002004008016032064,"parsedtransactionresult":0.002004008016032064,"events":0.002004008016032064,"clarityevent":0.002004008016032064,"args":0.002004008016032064,"isactive":0.002004008016032064,"'is-active'":0.002004008016032064,"'deployer'":0.002004008016032064,"contractaddress":0.002004008016032064,"getparticipant":0.002004008016032064,"'get-participant'":0.002004008016032064,"42000000n":0.002004008016032064,"callpublicfn":0.002004008016032064,"public":0.002004008016032064,"fired":0.002004008016032064,"during":0.002004008016032064,"execution":0.002004008016032064,"simulate":0.002004008016032064,"block":0.002004008016032064,"being":0.002004008016032064,"mined":0.002004008016032064,"increase":0.002004008016032064,"height":0.002004008016032064,"one":0.002004008016032064,"register-participant":0.002004008016032064,"broadcasting":0.002004008016032064,"transaction":0.002004008016032064,"registerparticipant":0.002004008016032064,"'register-participant'":0.002004008016032064,"define-public":0.002004008016032064,"begin":0.002004008016032064,"print":0.002004008016032064,"message":0.002004008016032064,"registered":0.002004008016032064,"at":0.002004008016032064,"ok":0.002004008016032064,"eventvalues":0.002004008016032064,"event":0.002004008016032064,"string-ascii":0.002004008016032064,"callprivatefn":0.002004008016032064,"private":0.002004008016032064,"any":0.002004008016032064,"reward-participant-points":0.002004008016032064,"address1":0.002004008016032064,"rewardparticipantpoints":0.002004008016032064,"participantpoints":0.002004008016032064,"int":0.002004008016032064,"define-private":0.002004008016032064,"map-insert":0.002004008016032064,"transferstx":0.002004008016032064,"transfer":0.002004008016032064,"another":0.002004008016032064,"amount":0.002004008016032064,"transferred":0.002004008016032064,"is":0.002004008016032064,"ustx":0.002004008016032064,"equals":0.002004008016032064,"recipient":0.002004008016032064,"transferring":0.002004008016032064,"stx_transfer_event":0.002004008016032064,"memo":0.002004008016032064,"number":0.002004008016032064,"deploy":0.002004008016032064,"be":0.002004008016032064,"deployed":0.002004008016032064,"hello-world":0.002004008016032064,"content":0.002004008016032064,"say-hi":0.002004008016032064,"hello":0.002004008016032064,"world":0.002004008016032064,"specify":0.002004008016032064,"options":0.002004008016032064,"such":0.002004008016032064,"version":0.002004008016032064,"clarityversion":0.002004008016032064,"deploying":0.002004008016032064,"specifying":0.002004008016032064,"interact":0.002004008016032064,"interacting":0.002004008016032064,"'hello-world'":0.002004008016032064,"deploycontractoptions":0.002004008016032064,"sayhi":0.002004008016032064,"mineblock":0.002004008016032064,"methods":0.002004008016032064,"mine":0.002004008016032064,"only":0.002004008016032064,"can":0.002004008016032064,"also":0.002004008016032064,"useful":0.002004008016032064,"multiple":0.002004008016032064,"what":0.002004008016032064,"objects":0.002004008016032064,"built":0.002004008016032064,"tx":0.002004008016032064,"helper":0.002004008016032064,"exported":0.002004008016032064,"sdk":0.002004008016032064,"has":0.002004008016032064,"three":0.002004008016032064,"-":0.002004008016032064,"these":0.002004008016032064,"have":0.002004008016032064,"same":0.002004008016032064,"interface":0.002004008016032064,"but":0.002004008016032064,"instead":0.002004008016032064,"performing":0.002004008016032064,"they":0.002004008016032064,"build":0.002004008016032064,"passed":0.002004008016032064,"epochs":0.002004008016032064,"on":0.002004008016032064,"chaintip":0.002004008016032064,"advanced":0.002004008016032064,"separately":0.002004008016032064,"burn":0.002004008016032064,"means":0.002004008016032064,"affect":0.002004008016032064,"you'd":0.002004008016032064,"blocks":0.002004008016032064,"use":0.002004008016032064,"mineemptyburnblock":0.002004008016032064,"included":0.002004008016032064,"mining":0.002004008016032064,"single":0.002004008016032064,"hirosystems":0.002004008016032064,"clarinet-sdk'":0.002004008016032064,"increment":0.002004008016032064,"add":0.002004008016032064,"foreach":0.002004008016032064,"console":0.002004008016032064,"log":0.002004008016032064,"length":0.002004008016032064,"txs":0.002004008016032064,"mineemptyblock":0.002004008016032064,"new":0.002004008016032064,"blockheight":0.002004008016032064,"mineemptyblocks":0.002004008016032064,"reach":0.002004008016032064,"certain":0.002004008016032064,"parameter":0.002004008016032064,"without":0.002004008016032064,"runsnippet":0.002004008016032064,"execute":0.002004008016032064,"arbitrary":0.002004008016032064,"directly":0.002004008016032064,"allows":0.002004008016032064,"you":0.002004008016032064,"test":0.002004008016032064,"smart":0.002004008016032064,"them":0.002004008016032064,"snippet":0.002004008016032064,"executed":0.002004008016032064,"get-balance":0.002004008016032064,"stx-balance":0.002004008016032064,"executing":0.002004008016032064,"running":0.002004008016032064,"codesnippet":0.002004008016032064,"stx-account":0.002004008016032064,"prettyprint":0.002004008016032064,"locked":0.002004008016032064,"unlock-height":0.002004008016032064,"unlocked":0.002004008016032064,"u100000000000000":0.002004008016032064,"stx-transfer":0.002004008016032064,"u19000000":0.002004008016032064,"getcontractsinterfaces":0.002004008016032064,"interfaces":0.002004008016032064,"contracts":0.002004008016032064,"keys":0.002004008016032064,"contain":0.002004008016032064,"information":0.002004008016032064,"data-vars":0.002004008016032064,"maps":0.002004008016032064,"nfts":0.002004008016032064,"fts":0.002004008016032064,"filter":0.002004008016032064,"contractinterfaces":0.002004008016032064,"read_only":0.002004008016032064,"outputs":0.002004008016032064,"variables":0.002004008016032064,"fungible_tokens":0.002004008016032064,"non_fungible_tokens":0.002004008016032064,"epoch":0.002004008016032064,"epoch25":0.002004008016032064,"clarity_version":0.002004008016032064,"clarity2":0.002004008016032064,"contractinterface":0.002004008016032064,"poolcontract":0.002004008016032064,"getcontractsource":0.002004008016032064,"requested":0.002004008016032064,"contractsource":0.002004008016032064,"undefined":0.002004008016032064,"getcontractast":0.002004008016032064,"full":0.002004008016032064,"ast":0.002004008016032064,"abstract":0.002004008016032064,"syntax":0.002004008016032064,"tree":0.002004008016032064,"throws":0.002004008016032064,"error":0.002004008016032064,"fails":0.002004008016032064,"encode":0.002004008016032064,"contractast":0.002004008016032064,"contract_identifier":0.002004008016032064,"issuer":0.002004008016032064,"pre_expressions":0.002004008016032064,"expressions":0.002004008016032064,"expr":0.002004008016032064,"id":0.002004008016032064,"pre_comments":0.002004008016032064,"end_line_comment":0.002004008016032064,"post_comments":0.002004008016032064,"top_level_expression_sorting":0.002004008016032064,"referenced_traits":0.002004008016032064,"implemented_traits":0.002004008016032064,"wasm_module":0.002004008016032064,"contractid":0.002004008016032064},"362":{"import":0.013513513513513514,"accordion":0.013513513513513514,"accordioncontent":0.013513513513513514,"accordionitem":0.013513513513513514,"accordiontrigger":0.013513513513513514,"from":0.013513513513513514,"components":0.013513513513513514,"ui":0.013513513513513514,"badge":0.013513513513513514,"'":0.013513513513513514,"badge'":0.013513513513513514,"tabs":0.013513513513513514,"tabscontent":0.013513513513513514,"tabslist":0.013513513513513514,"tabstrigger":0.013513513513513514,"tabs'":0.013513513513513514,"initsimnet":0.013513513513513514,"the":0.013513513513513514,"function":0.013513513513513514,"initializes":0.013513513513513514,"a":0.013513513513513514,"simulated":0.013513513513513514,"network":0.013513513513513514,"it":0.013513513513513514,"will":0.013513513513513514,"often":0.013513513513513514,"be":0.013513513513513514,"first":0.013513513513513514,"you":0.013513513513513514,"call":0.013513513513513514,"when":0.013513513513513514,"using":0.013513513513513514,"sdk":0.013513513513513514,"parameters":0.013513513513513514,"manifestpath":0.013513513513513514,"is":0.013513513513513514,"path":0.013513513513513514,"to":0.013513513513513514,"clarinet":0.013513513513513514,"toml":0.013513513513513514,"manifest":0.013513513513513514,"file":0.013513513513513514,"defaultvalue":0.013513513513513514,"default":0.013513513513513514,"classname":0.013513513513513514,"'flex":0.013513513513513514,"flex-wrap'":0.013513513513513514,"value":0.013513513513513514,"'tab":0.013513513513513514,"group'":0.013513513513513514,"'transition-colors'":0.013513513513513514,"creating":0.013513513513513514,"new":0.013513513513513514,"instance":0.013513513513513514,"of":0.013513513513513514,"simnet":0.013513513513513514,"custom":0.013513513513513514,"'badge":0.013513513513513514,"transition-colors'":0.013513513513513514,"with":0.013513513513513514,"config":0.013513513513513514,"ts":0.013513513513513514,"hirosystems":0.013513513513513514,"clarinet-sdk'":0.013513513513513514,"const":0.013513513513513514,"await":0.013513513513513514,"toml'":0.013513513513513514,"type":0.013513513513513514,"single":0.013513513513513514,"collapsible":0.013513513513513514,"w-full":0.013513513513513514,"schema":0.013513513513513514,"string":0.013513513513513514,"promise":0.013513513513513514},"363":{},"364":{"package-install":0.3333333333333333,"create":0.3333333333333333,"stacks":0.3333333333333333},"365":{"import":0.012987012987012988,"accordion":0.012987012987012988,"accordions":0.012987012987012988,"from":0.012987012987012988,"fumadocs-ui":0.012987012987012988,"components":0.012987012987012988,"blocks":0.012987012987012988,"braces":0.012987012987012988,"circleuserround":0.012987012987012988,"'lucide-react'":0.012987012987012988,"tab":0.012987012987012988,"tabs":0.012987012987012988,"'fumadocs-ui":0.012987012987012988,"tabs'":0.012987012987012988,"the":0.012987012987012988,"stacks":0.012987012987012988,"blockchain-api-client":0.012987012987012988,"library":0.012987012987012988,"provides":0.012987012987012988,"a":0.012987012987012988,"robust":0.012987012987012988,"interface":0.012987012987012988,"for":0.012987012987012988,"interacting":0.012987012987012988,"with":0.012987012987012988,"blockchain":0.012987012987012988,"api":0.012987012987012988,"by":0.012987012987012988,"offering":0.012987012987012988,"type-safe":0.012987012987012988,"methods":0.012987012987012988,"to":0.012987012987012988,"access":0.012987012987012988,"rest":0.012987012987012988,"and":0.012987012987012988,"websocket":0.012987012987012988,"endpoints":0.012987012987012988,"client":0.012987012987012988,"includes":0.012987012987012988,"automatically":0.012987012987012988,"generated":0.012987012987012988,"http":0.012987012987012988,"comprehensive":0.012987012987012988,"schemas":0.012987012987012988,"clarity":0.012987012987012988,"smart":0.012987012987012988,"contract":0.012987012987012988,"values":0.012987012987012988,"real-time":0.012987012987012988,"data":0.012987012987012988,"streaming":0.012987012987012988,"ts":0.012987012987012988,"accountsapi":0.012987012987012988,"'":0.012987012987012988,"blockchain-api-client'":0.012987012987012988,"const":0.012987012987012988,"accounts":0.012987012987012988,"new":0.012987012987012988,"apiconfig":0.012987012987012988,"await":0.012987012987012988,"getaccounttransactions":0.012987012987012988,"principal":0.012987012987012988,"'st000000000000000000002amw42h'":0.012987012987012988,"using":0.012987012987012988,"websockets":0.012987012987012988,"connectwebsocketclient":0.012987012987012988,"'ws":0.012987012987012988,"hiro":0.012987012987012988,"so":0.012987012987012988,"sub":0.012987012987012988,"subscribeaddresstransactions":0.012987012987012988,"contractcall":0.012987012987012988,"txid":0.012987012987012988,"event":0.012987012987012988,"console":0.012987012987012988,"log":0.012987012987012988,"unsubscribe":0.012987012987012988},"366":{"0":0.002403846153846154,"1":0.002403846153846154,"3":0.002403846153846154,"7":0.002403846153846154,"8":0.002403846153846154,"10":0.002403846153846154,"import":0.002403846153846154,"root":0.002403846153846154,"api":0.002403846153846154,"apiexample":0.002403846153846154,"from":0.002403846153846154,"'fumadocs-openapi":0.002403846153846154,"ui'":0.002403846153846154,"property":0.002403846153846154,"accordion":0.002403846153846154,"accordions":0.002403846153846154,"'fumadocs-ui":0.002403846153846154,"components":0.002403846153846154,"accordion'":0.002403846153846154,"tabs":0.002403846153846154,"tabscontent":0.002403846153846154,"tabslist":0.002403846153846154,"tabstrigger":0.002403846153846154,"'":0.002403846153846154,"ui":0.002403846153846154,"tabs'":0.002403846153846154,"badge":0.002403846153846154,"badge'":0.002403846153846154,"inlinecode":0.002403846153846154,"inline-code'":0.002403846153846154,"stacks":0.002403846153846154,"connect":0.002403846153846154,"enables":0.002403846153846154,"you":0.002403846153846154,"to":0.002403846153846154,"authenticate":0.002403846153846154,"your":0.002403846153846154,"users":0.002403846153846154,"and":0.002403846153846154,"app":0.002403846153846154,"their":0.002403846153846154,"wallet":0.002403846153846154,"this":0.002403846153846154,"reference":0.002403846153846154,"contains":0.002403846153846154,"more":0.002403846153846154,"detailed":0.002403846153846154,"information":0.002403846153846154,"on":0.002403846153846154,"how":0.002403846153846154,"can":0.002403846153846154,"sign":0.002403846153846154,"broadcast":0.002403846153846154,"transactions":0.002403846153846154,"behalf":0.002403846153846154,"enable":0.002403846153846154,"messages":0.002403846153846154,"callout":0.002403846153846154,"title":0.002403846153846154,"migration":0.002403846153846154,"note":0.002403846153846154,"please":0.002403846153846154,"be":0.002403846153846154,"patient":0.002403846153846154,"during":0.002403846153846154,"the":0.002403846153846154,"version":0.002403846153846154,"x":0.002403846153846154,"there":0.002403846153846154,"has":0.002403846153846154,"been":0.002403846153846154,"a":0.002403846153846154,"long-running":0.002403846153846154,"effort":0.002403846153846154,"together":0.002403846153846154,"with":0.002403846153846154,"wallets":0.002403846153846154,"modernize":0.002403846153846154,"web":0.002403846153846154,"ecosystem":0.002403846153846154,"culminating":0.002403846153846154,"in":0.002403846153846154,"sip-030":0.002403846153846154,"https":0.002403846153846154,"github":0.002403846153846154,"com":0.002403846153846154,"janniks":0.002403846153846154,"sips":0.002403846153846154,"blob":0.002403846153846154,"main":0.002403846153846154,"sip-030-wallet-interface":0.002403846153846154,"md":0.002403846153846154,"new":0.002403846153846154,"request":0.002403846153846154,"method":0.002403846153846154,"for":0.002403846153846154,"legacy":0.002403846153846154,"of":0.002403846153846154,"using":0.002403846153846154,"jwt":0.002403846153846154,"tokens":0.002403846153846154,"use":0.002403846153846154,"see":0.002403846153846154,"guide":0.002403846153846154,"docs":0.002403846153846154,"guides":0.002403846153846154,"details":0.002403846153846154,"installation":0.002403846153846154,"package-install":0.002403846153846154,"initiate":0.002403846153846154,"connection":0.002403846153846154,"addresses":0.002403846153846154,"typescript":0.002403846153846154,"connect'":0.002403846153846154,"const":0.002403846153846154,"response":0.002403846153846154,"await":0.002403846153846154,"stores":0.002403846153846154,"address":0.002403846153846154,"local":0.002403846153846154,"storage":0.002403846153846154,"by":0.002403846153846154,"default":0.002403846153846154,"get":0.002403846153846154,"data":0.002403846153846154,"stored":0.002403846153846154,"call":0.002403846153846154,"getlocalstorage":0.002403846153846154,"stx":0.002403846153846154,"sp2mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn":0.002403846153846154,"btc":0.002403846153846154,"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae":0.002403846153846154,"managing":0.002403846153846154,"state":0.002403846153846154,"disconnect":0.002403846153846154,"isconnected":0.002403846153846154,"false":0.002403846153846154,"similar":0.002403846153846154,"getaddresses":0.002403846153846154,"true":0.002403846153846154,"clears":0.002403846153846154,"selected":0.002403846153846154,"trigger":0.002403846153846154,"interactions":0.002403846153846154,"forcewalletselect":0.002403846153846154,"'getaddresses'":0.002403846153846154,"available":0.002403846153846154,"methods":0.002403846153846154,"-":0.002403846153846154,"sendtransfer":0.002403846153846154,"signpsbt":0.002403846153846154,"stx_getaddresses":0.002403846153846154,"stx_getaccounts":0.002403846153846154,"stx_transferstx":0.002403846153846154,"stx_callcontract":0.002403846153846154,"stx_deploycontract":0.002403846153846154,"stx_signmessage":0.002403846153846154,"stx_signstructuredmessage":0.002403846153846154,"publickey":0.002403846153846154,"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69":0.002403846153846154,"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr":0.002403846153846154,"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114":0.002403846153846154,"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304":0.002403846153846154,"'sendtransfer'":0.002403846153846154,"recipients":0.002403846153846154,"'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'":0.002403846153846154,"recipient":0.002403846153846154,"amount":0.002403846153846154,"'1000'":0.002403846153846154,"sats":0.002403846153846154,"specify":0.002403846153846154,"multiple":0.002403846153846154,"'bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh'":0.002403846153846154,"'2000'":0.002403846153846154,"txid":0.002403846153846154,"0x1234":0.002403846153846154,"transaction":0.002403846153846154,"id":0.002403846153846154,"'signpsbt'":0.002403846153846154,"psbt":0.002403846153846154,"'chnidp":0.002403846153846154,"base64":0.002403846153846154,"encoded":0.002403846153846154,"string":0.002403846153846154,"signinputs":0.002403846153846154,"index":0.002403846153846154,"indices":0.002403846153846154,"inputs":0.002403846153846154,"optional":0.002403846153846154,"whether":0.002403846153846154,"after":0.002403846153846154,"signing":0.002403846153846154,"if":0.002403846153846154,"is":0.002403846153846154,"chnidp":0.002403846153846154,"signed":0.002403846153846154,"format":0.002403846153846154,"'stx_getaddresses'":0.002403846153846154,"'stx_getaccounts'":0.002403846153846154,"02d3331cbb9f72fe635e6f87c2cf1a13cd":0.002403846153846154,"gaiahuburl":0.002403846153846154,"hub":0.002403846153846154,"hiro":0.002403846153846154,"so":0.002403846153846154,"gaiaappkey":0.002403846153846154,"0488ade4040658015580000000dc81e3a5":0.002403846153846154,"'stx_transferstx'":0.002403846153846154,"micro-stx":0.002403846153846154,"000":0.002403846153846154,"'sp2mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn'":0.002403846153846154,"network":0.002403846153846154,"'mainnet'":0.002403846153846154,"defaults":0.002403846153846154,"mainnet":0.002403846153846154,"memo":0.002403846153846154,"'optional":0.002403846153846154,"memo'":0.002403846153846154,"field":0.002403846153846154,"'stx_callcontract'":0.002403846153846154,"contract":0.002403846153846154,"'sp2mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn":0.002403846153846154,"counters'":0.002403846153846154,"contract-name":0.002403846153846154,"functionname":0.002403846153846154,"'count'":0.002403846153846154,"name":0.002403846153846154,"function":0.002403846153846154,"functionargs":0.002403846153846154,"cl":0.002403846153846154,"int":0.002403846153846154,"array":0.002403846153846154,"clarity":0.002403846153846154,"values":0.002403846153846154,"as":0.002403846153846154,"arguments":0.002403846153846154,"'stx_deploycontract'":0.002403846153846154,"'counters'":0.002403846153846154,"claritycode":0.002403846153846154,"define-map":0.002403846153846154,"counters":0.002403846153846154,"principal":0.002403846153846154,"define-public":0.002403846153846154,"count":0.002403846153846154,"change":0.002403846153846154,"ok":0.002403846153846154,"map-set":0.002403846153846154,"tx-sender":0.002403846153846154,"get-count":0.002403846153846154,"define-read-only":0.002403846153846154,"who":0.002403846153846154,"default-to":0.002403846153846154,"map-get":0.002403846153846154,"code":0.002403846153846154,"clarityversion":0.002403846153846154,"'2'":0.002403846153846154,"latest":0.002403846153846154,"'stx_signmessage'":0.002403846153846154,"message":0.002403846153846154,"'hello":0.002403846153846154,"world":0.002403846153846154,"signature":0.002403846153846154,"public":0.002403846153846154,"key":0.002403846153846154,"that":0.002403846153846154,"claritymessage":0.002403846153846154,"parse":0.002403846153846154,"structured":0.002403846153846154,"num":0.002403846153846154,"u3":0.002403846153846154,"claritydomain":0.002403846153846154,"tuple":0.002403846153846154,"domain":0.002403846153846154,"stringascii":0.002403846153846154,"'example":0.002403846153846154,"com'":0.002403846153846154,"'1":0.002403846153846154,"0'":0.002403846153846154,"'chain-id'":0.002403846153846154,"uint":0.002403846153846154,"'stx_signstructuredmessage'":0.002403846153846154,"value":0.002403846153846154,"representing":0.002403846153846154,"object":0.002403846153846154,"sip-018":0.002403846153846154,"style":0.002403846153846154,"error":0.002403846153846154,"handling":0.002403846153846154,"returns":0.002403846153846154,"promise":0.002403846153846154,"allowing":0.002403846153846154,"handle":0.002403846153846154,"errors":0.002403846153846154,"standard":0.002403846153846154,"promise-based":0.002403846153846154,"patterns":0.002403846153846154,"either":0.002403846153846154,"try":0.002403846153846154,"catch":0.002403846153846154,"async":0.002403846153846154,"or":0.002403846153846154,"chains":0.002403846153846154,"success":0.002403846153846154,"console":0.002403846153846154,"log":0.002403846153846154,"'transaction":0.002403846153846154,"successful":0.002403846153846154,"'wallet":0.002403846153846154,"returned":0.002403846153846154,"an":0.002403846153846154,"compatibility":0.002403846153846154,"adds":0.002403846153846154,"layer":0.002403846153846154,"auto-compatibility":0.002403846153846154,"different":0.002403846153846154,"providers":0.002403846153846154,"meant":0.002403846153846154,"unify":0.002403846153846154,"interface":0.002403846153846154,"where":0.002403846153846154,"may":0.002403846153846154,"not":0.002403846153846154,"implement":0.002403846153846154,"results":0.002403846153846154,"same":0.002403846153846154,"way":0.002403846153846154,"support":0.002403846153846154,"complete":0.002403846153846154,"list":0.002403846153846154,"status":0.002403846153846154,"page":0.002403846153846154,"advanced":0.002403846153846154,"usage":0.002403846153846154,"called":0.002403846153846154,"options":0.002403846153846154,"first":0.002403846153846154,"parameter":0.002403846153846154,"provider":0.002403846153846154,"stacksprovider":0.002403846153846154,"custom":0.002403846153846154,"boolean":0.002403846153846154,"force":0.002403846153846154,"user":0.002403846153846154,"select":0.002403846153846154,"persistwalletselect":0.002403846153846154,"persist":0.002403846153846154,"enableoverrides":0.002403846153846154,"enablelocalstorage":0.002403846153846154,"store":0.002403846153846154,"defaultproviders":0.002403846153846154,"wbipprovider":0.002403846153846154,"display":0.002403846153846154,"modal":0.002403846153846154,"approvedproviderids":0.002403846153846154,"approved":0.002403846153846154,"ids":0.002403846153846154,"show":0.002403846153846154,"'method'":0.002403846153846154,"params":0.002403846153846154,"without":0.002403846153846154,"option":0.002403846153846154,"automatic":0.002403846153846154,"fixes":0.002403846153846154,"example":0.002403846153846154,"it":0.002403846153846154,"handles":0.002403846153846154,"converting":0.002403846153846154,"numeric":0.002403846153846154,"types":0.002403846153846154,"between":0.002403846153846154,"number":0.002403846153846154,"formats":0.002403846153846154,"needed":0.002403846153846154,"remaps":0.002403846153846154,"certain":0.002403846153846154,"names":0.002403846153846154,"match":0.002403846153846154,"wallet-specific":0.002403846153846154,"implementations":0.002403846153846154,"ensures":0.002403846153846154,"consistent":0.002403846153846154,"behavior":0.002403846153846154,"across":0.002403846153846154,"requiring":0.002403846153846154,"manual":0.002403846153846154,"adjustments":0.002403846153846154,"allows":0.002403846153846154,"filter":0.002403846153846154,"which":0.002403846153846154,"are":0.002403846153846154,"shown":0.002403846153846154,"useful":0.002403846153846154,"when":0.002403846153846154,"want":0.002403846153846154,"limit":0.002403846153846154,"specific":0.002403846153846154,"might":0.002403846153846154,"only":0.002403846153846154,"leather":0.002403846153846154,"'leatherprovider'":0.002403846153846154,"'xverse'":0.002403846153846154,"requestraw":0.002403846153846154,"provides":0.002403846153846154,"direct":0.002403846153846154,"access":0.002403846153846154,"additional":0.002403846153846154,"features":0.002403846153846154,"raw":0.002403846153846154,"bypasses":0.002403846153846154,"selector":0.002403846153846154,"other":0.002403846153846154,"come":0.002403846153846154,"need":0.002403846153846154,"control":0.002403846153846154,"over":0.002403846153846154,"interaction":0.002403846153846154,"process":0.002403846153846154},"367":{"0":0.0027472527472527475,"1":0.0027472527472527475,"2":0.0027472527472527475,"3":0.0027472527472527475,"4":0.0027472527472527475,"8":0.0027472527472527475,"10":0.0027472527472527475,"32":0.0027472527472527475,"144":0.0027472527472527475,"import":0.0027472527472527475,"accordion":0.0027472527472527475,"accordions":0.0027472527472527475,"from":0.0027472527472527475,"'fumadocs-ui":0.0027472527472527475,"components":0.0027472527472527475,"accordion'":0.0027472527472527475,"badge":0.0027472527472527475,"'":0.0027472527472527475,"ui":0.0027472527472527475,"badge'":0.0027472527472527475,"inlinecode":0.0027472527472527475,"inline-code'":0.0027472527472527475,"callout":0.0027472527472527475,"installation":0.0027472527472527475,"package-install":0.0027472527472527475,"sbtc":0.0027472527472527475,"architecture":0.0027472527472527475,"the":0.0027472527472527475,"protocol":0.0027472527472527475,"operates":0.0027472527472527475,"across":0.0027472527472527475,"multiple":0.0027472527472527475,"layers":0.0027472527472527475,"-":0.0027472527472527475,"bitcoin":0.0027472527472527475,"original":0.0027472527472527475,"funds":0.0027472527472527475,"are":0.0027472527472527475,"sourced":0.0027472527472527475,"a":0.0027472527472527475,"depositor":0.0027472527472527475,"sends":0.0027472527472527475,"these":0.0027472527472527475,"to":0.0027472527472527475,"group":0.0027472527472527475,"of":0.0027472527472527475,"signers":0.0027472527472527475,"which":0.0027472527472527475,"manage":0.0027472527472527475,"rotating":0.0027472527472527475,"multisignature":0.0027472527472527475,"address":0.0027472527472527475,"formatted":0.0027472527472527475,"for":0.0027472527472527475,"transactions":0.0027472527472527475,"api":0.0027472527472527475,"emily":0.0027472527472527475,"this":0.0027472527472527475,"is":0.0027472527472527475,"responsible":0.0027472527472527475,"tracking":0.0027472527472527475,"deposits":0.0027472527472527475,"and":0.0027472527472527475,"notifying":0.0027472527472527475,"about":0.0027472527472527475,"pending":0.0027472527472527475,"stacks":0.0027472527472527475,"network":0.0027472527472527475,"where":0.0027472527472527475,"minted":0.0027472527472527475,"once":0.0027472527472527475,"deposit":0.0027472527472527475,"confirmed":0.0027472527472527475,"mint":0.0027472527472527475,"corresponding":0.0027472527472527475,"amount":0.0027472527472527475,"depositor's":0.0027472527472527475,"specified":0.0027472527472527475,"on":0.0027472527472527475,"flow":0.0027472527472527475,"create":0.0027472527472527475,"transaction":0.0027472527472527475,"structure":0.0027472527472527475,"send":0.0027472527472527475,"use":0.0027472527472527475,"specialized":0.0027472527472527475,"format":0.0027472527472527475,"that":0.0027472527472527475,"includes":0.0027472527472527475,"script":0.0027472527472527475,"identifies":0.0027472527472527475,"will":0.0027472527472527475,"be":0.0027472527472527475,"what":0.0027472527472527475,"maximum":0.0027472527472527475,"fee":0.0027472527472527475,"in":0.0027472527472527475,"satoshis":0.0027472527472527475,"may":0.0027472527472527475,"take":0.0027472527472527475,"exchange":0.0027472527472527475,"minting":0.0027472527472527475,"reclaim":0.0027472527472527475,"allows":0.0027472527472527475,"sender":0.0027472527472527475,"their":0.0027472527472527475,"if":0.0027472527472527475,"not":0.0027472527472527475,"processed":0.0027472527472527475,"by":0.0027472527472527475,"sign":0.0027472527472527475,"broadcast":0.0027472527472527475,"with":0.0027472527472527475,"sender's":0.0027472527472527475,"private":0.0027472527472527475,"key":0.0027472527472527475,"regtest":0.0027472527472527475,"testnet":0.0027472527472527475,"notify":0.0027472527472527475,"inform":0.0027472527472527475,"submitting":0.0027472527472527475,"its":0.0027472527472527475,"details":0.0027472527472527475,"step":0.0027472527472527475,"ensures":0.0027472527472527475,"aware":0.0027472527472527475,"can":0.0027472527472527475,"track":0.0027472527472527475,"it":0.0027472527472527475,"processing":0.0027472527472527475,"no":0.0027472527472527475,"action":0.0027472527472527475,"required":0.0027472527472527475,"retrieve":0.0027472527472527475,"verify":0.0027472527472527475,"blockchain":0.0027472527472527475,"verified":0.0027472527472527475,"equivalent":0.0027472527472527475,"receive":0.0027472527472527475,"sent":0.0027472527472527475,"designated":0.0027472527472527475,"completing":0.0027472527472527475,"process":0.0027472527472527475,"sip-010":0.0027472527472527475,"compatible":0.0027472527472527475,"show":0.0027472527472527475,"up":0.0027472527472527475,"wallets":0.0027472527472527475,"explorers":0.0027472527472527475,"withdrawal":0.0027472527472527475,"_coming":0.0027472527472527475,"soon_":0.0027472527472527475,"package":0.0027472527472527475,"functions":0.0027472527472527475,"exports":0.0027472527472527475,"high-level":0.0027472527472527475,"building":0.0027472527472527475,"addresses":0.0027472527472527475,"examples":0.0027472527472527475,"buildsbtcdepositaddress":0.0027472527472527475,"build":0.0027472527472527475,"metadata":0.0027472527472527475,"using":0.0027472527472527475,"wallet":0.0027472527472527475,"provider":0.0027472527472527475,"sendtransfer":0.0027472527472527475,"ts":0.0027472527472527475,"sbtcapiclienttestnet":0.0027472527472527475,"'sbtc'":0.0027472527472527475,"const":0.0027472527472527475,"client":0.0027472527472527475,"new":0.0027472527472527475,"stacksaddress":0.0027472527472527475,"target_stx_address":0.0027472527472527475,"signerspublickey":0.0027472527472527475,"await":0.0027472527472527475,"fetchsignerspublickey":0.0027472527472527475,"optional":0.0027472527472527475,"defaults":0.0027472527472527475,"maxsignerfee":0.0027472527472527475,"80_000":0.0027472527472527475,"pay":0.0027472527472527475,"taken":0.0027472527472527475,"sats":0.0027472527472527475,"reclaimlocktime":0.0027472527472527475,"6_000":0.0027472527472527475,"lock":0.0027472527472527475,"time":0.0027472527472527475,"here":0.0027472527472527475,"aka":0.0027472527472527475,"as":0.0027472527472527475,"an":0.0027472527472527475,"output":0.0027472527472527475,"your":0.0027472527472527475,"favorite":0.0027472527472527475,"typically":0.0027472527472527475,"also":0.0027472527472527475,"broadcasted":0.0027472527472527475,"txid":0.0027472527472527475,"walletprovider":0.0027472527472527475,"recipient":0.0027472527472527475,"100_000":0.0027472527472527475,"notifysbtc":0.0027472527472527475,"buildsbtcdeposittx":0.0027472527472527475,"function":0.0027472527472527475,"similar":0.0027472527472527475,"but":0.0027472527472527475,"instead":0.0027472527472527475,"returning":0.0027472527472527475,"just":0.0027472527472527475,"constructs":0.0027472527472527475,"complete":0.0027472527472527475,"depositing":0.0027472527472527475,"amountsats":0.0027472527472527475,"deposit_amount":0.0027472527472527475,"same":0.0027472527472527475,"options":0.0027472527472527475,"has":0.0027472527472527475,"one":0.0027472527472527475,"combined":0.0027472527472527475,"taproot":0.0027472527472527475,"scripts":0.0027472527472527475,"your_btc_private_key":0.0027472527472527475,"finalize":0.0027472527472527475,"or":0.0027472527472527475,"via":0.0027472527472527475,"external":0.0027472527472527475,"psbtbytes":0.0027472527472527475,"topsbt":0.0027472527472527475,"broadcasttx":0.0027472527472527475,"sbtcdeposithelper":0.0027472527472527475,"fully-formed":0.0027472527472527475,"assuming":0.0027472527472527475,"spendable":0.0027472527472527475,"utxos":0.0027472527472527475,"helper":0.0027472527472527475,"you":0.0027472527472527475,"given":0.0027472527472527475,"5_000_000":0.0027472527472527475,"pub":0.0027472527472527475,"aggregated":0.0027472527472527475,"public":0.0027472527472527475,"feerate":0.0027472527472527475,"fetchfeerate":0.0027472527472527475,"'medium'":0.0027472527472527475,"fetchutxos":0.0027472527472527475,"your_btc_address":0.0027472527472527475,"bitcoinchangeaddress":0.0027472527472527475,"console":0.0027472527472527475,"log":0.0027472527472527475,"'txid'":0.0027472527472527475,"res":0.0027472527472527475,"'res'":0.0027472527472527475,"status":0.0027472527472527475,"statusmessage":0.0027472527472527475,"http":0.0027472527472527475,"clients":0.0027472527472527475,"additionally":0.0027472527472527475,"there":0.0027472527472527475,"two":0.0027472527472527475,"helpers":0.0027472527472527475,"make":0.0027472527472527475,"easier":0.0027472527472527475,"get":0.0027472527472527475,"all":0.0027472527472527475,"data":0.0027472527472527475,"needed":0.0027472527472527475,"above":0.0027472527472527475,"sbtcapiclientmainnet":0.0027472527472527475,"communicating":0.0027472527472527475,"different":0.0027472527472527475,"pieces":0.0027472527472527475,"deployment":0.0027472527472527475,"sbtcapiclientdevenv":0.0027472527472527475,"developing":0.0027472527472527475,"against":0.0027472527472527475,"local":0.0027472527472527475,"while":0.0027472527472527475,"final":0.0027472527472527475,"adjustments":0.0027472527472527475,"still":0.0027472527472527475,"being":0.0027472527472527475,"made":0.0027472527472527475,"pre-release":0.0027472527472527475,"phase":0.0027472527472527475,"change":0.0027472527472527475,"default":0.0027472527472527475,"urls":0.0027472527472527475,"contract":0.0027472527472527475,"every":0.0027472527472527475,"minor":0.0027472527472527475,"release":0.0027472527472527475,"version":0.0027472527472527475,"purpose":0.0027472527472527475,"functionality":0.0027472527472527475,"---":0.0027472527472527475,"x":0.0027472527472527475,"developer":0.0027472527472527475,"hackathon":0.0027472527472527475,"only":0.0027472527472527475,"mainnet":0.0027472527472527475,"fetches":0.0027472527472527475,"fetchsignersaddress":0.0027472527472527475,"p2tr":0.0027472527472527475,"'low'":0.0027472527472527475,"'high'":0.0027472527472527475,"unspents":0.0027472527472527475,"btc_address":0.0027472527472527475,"hex":0.0027472527472527475,"fetchtxhex":0.0027472527472527475,"deposit_btc_tx":0.0027472527472527475,"btc":0.0027472527472527475,"otherwise":0.0027472527472527475,"won't":0.0027472527472527475,"sbtcbalance":0.0027472527472527475,"fetchsbtcbalance":0.0027472527472527475,"stx_address":0.0027472527472527475,"fetch":0.0027472527472527475,"balance":0.0027472527472527475,"reference":0.0027472527472527475,"parameter":0.0027472527472527475,"description":0.0027472527472527475,"type":0.0027472527472527475,"schnorr":0.0027472527472527475,"string":0.0027472527472527475,"byte":0.0027472527472527475,"denominated":0.0027472527472527475,"number":0.0027472527472527475,"bigint":0.0027472527472527475,"rate":0.0027472527472527475,"sat":0.0027472527472527475,"vbyte":0.0027472527472527475,"fund":0.0027472527472527475,"utxowithtx":0.0027472527472527475,"reclaimpublickey":0.0027472527472527475,"x-only":0.0027472527472527475,"reclaiming":0.0027472527472527475,"failed":0.0027472527472527475,"bitcoinnetwork":0.0027472527472527475,"utxotospendable":0.0027472527472527475,"convert":0.0027472527472527475,"p2wpk":0.0027472527472527475,"p2sh":0.0027472527472527475,"inputs":0.0027472527472527475,"best":0.0027472527472527475,"effort":0.0027472527472527475,"implementation":0.0027472527472527475,"paymentpublickey":0.0027472527472527475,"payment":0.0027472527472527475,"currently":0.0027472527472527475,"used":0.0027472527472527475,"sh":0.0027472527472527475,"sbtcapiclient":0.0027472527472527475,"configuration":0.0027472527472527475,"sbtccontract":0.0027472527472527475,"multisig":0.0027472527472527475,"initial":0.0027472527472527475,"sbtcapiurl":0.0027472527472527475,"base":0.0027472527472527475,"url":0.0027472527472527475,"btcapiurl":0.0027472527472527475,"mempool":0.0027472527472527475,"electrs":0.0027472527472527475,"stxapiurl":0.0027472527472527475},"368":{"0":0.0018484288354898336,"1":0.0018484288354898336,"2":0.0018484288354898336,"3":0.0018484288354898336,"7":0.0018484288354898336,"10":0.0018484288354898336,"102":0.0018484288354898336,"111":0.0018484288354898336,"import":0.0018484288354898336,"root":0.0018484288354898336,"api":0.0018484288354898336,"apiexample":0.0018484288354898336,"from":0.0018484288354898336,"'fumadocs-openapi":0.0018484288354898336,"ui'":0.0018484288354898336,"property":0.0018484288354898336,"accordion":0.0018484288354898336,"accordions":0.0018484288354898336,"'fumadocs-ui":0.0018484288354898336,"components":0.0018484288354898336,"accordion'":0.0018484288354898336,"tabs":0.0018484288354898336,"tabscontent":0.0018484288354898336,"tabslist":0.0018484288354898336,"tabstrigger":0.0018484288354898336,"'":0.0018484288354898336,"ui":0.0018484288354898336,"tabs'":0.0018484288354898336,"badge":0.0018484288354898336,"badge'":0.0018484288354898336,"inlinecode":0.0018484288354898336,"inline-code'":0.0018484288354898336,"callout":0.0018484288354898336,"type":0.0018484288354898336,"info":0.0018484288354898336,"this":0.0018484288354898336,"reference":0.0018484288354898336,"refers":0.0018484288354898336,"to":0.0018484288354898336,"the":0.0018484288354898336,"x":0.0018484288354898336,"release":0.0018484288354898336,"of":0.0018484288354898336,"stacks":0.0018484288354898336,"js":0.0018484288354898336,"it's":0.0018484288354898336,"recommended":0.0018484288354898336,"version":0.0018484288354898336,"use":0.0018484288354898336,"but":0.0018484288354898336,"not":0.0018484288354898336,"needed":0.0018484288354898336,"for":0.0018484288354898336,"nakamoto":0.0018484288354898336,"read":0.0018484288354898336,"migration":0.0018484288354898336,"guide":0.0018484288354898336,"https":0.0018484288354898336,"github":0.0018484288354898336,"com":0.0018484288354898336,"hirosystems":0.0018484288354898336,"blob":0.0018484288354898336,"main":0.0018484288354898336,"md":0.0018484288354898336,"stacksjs-5xx--7xx":0.0018484288354898336,"learn":0.0018484288354898336,"how":0.0018484288354898336,"update":0.0018484288354898336,"latest":0.0018484288354898336,"installation":0.0018484288354898336,"package-install":0.0018484288354898336,"transactions":0.0018484288354898336,"library":0.0018484288354898336,"supports":0.0018484288354898336,"creation":0.0018484288354898336,"following":0.0018484288354898336,"transaction":0.0018484288354898336,"types":0.0018484288354898336,"stx":0.0018484288354898336,"token":0.0018484288354898336,"transfer":0.0018484288354898336,"smart":0.0018484288354898336,"contract":0.0018484288354898336,"deploy":0.0018484288354898336,"function":0.0018484288354898336,"call":0.0018484288354898336,"key":0.0018484288354898336,"generation":0.0018484288354898336,"typescript":0.0018484288354898336,"-n":0.0018484288354898336,"randomprivatekey":0.0018484288354898336,"privatekeytopublickey":0.0018484288354898336,"transactions'":0.0018484288354898336,"random":0.0018484288354898336,"const":0.0018484288354898336,"privatekey":0.0018484288354898336,"publickey":0.0018484288354898336,"private":0.0018484288354898336,"hex":0.0018484288354898336,"string":0.0018484288354898336,"'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01'":0.0018484288354898336,"makestxtokentransfer":0.0018484288354898336,"org":0.0018484288354898336,"functions":0.0018484288354898336,"_stacks_transactions":0.0018484288354898336,"with":0.0018484288354898336,"a":0.0018484288354898336,"sender":0.0018484288354898336,"or":0.0018484288354898336,"unsigned":0.0018484288354898336,"makeunsignedstxtokentransfer":0.0018484288354898336,"public":0.0018484288354898336,"without":0.0018484288354898336,"yet":0.0018484288354898336,"signing":0.0018484288354898336,"create":0.0018484288354898336,"ts":0.0018484288354898336,"broadcasttransaction":0.0018484288354898336,"txoptions":0.0018484288354898336,"recipient":0.0018484288354898336,"'sp3fgq8z7jy9bwyz5wm53e0m9nk7whjf0691nz159'":0.0018484288354898336,"amount":0.0018484288354898336,"12345n":0.0018484288354898336,"memo":0.0018484288354898336,"'test":0.0018484288354898336,"memo'":0.0018484288354898336,"senderkey":0.0018484288354898336,"network":0.0018484288354898336,"'testnet'":0.0018484288354898336,"mainnet":0.0018484288354898336,"'mainnet'":0.0018484288354898336,"await":0.0018484288354898336,"see":0.0018484288354898336,"raw":0.0018484288354898336,"serialized":0.0018484288354898336,"tx":0.0018484288354898336,"serializedtx":0.0018484288354898336,"serialize":0.0018484288354898336,"broadcast":0.0018484288354898336,"response":0.0018484288354898336,"console":0.0018484288354898336,"log":0.0018484288354898336,"txid":0.0018484288354898336,"makecontractdeploy":0.0018484288354898336,"makeunsignedcontractdeploy":0.0018484288354898336,"readfilesync":0.0018484288354898336,"'fs'":0.0018484288354898336,"claritycode":0.0018484288354898336,"path":0.0018484288354898336,"clar'":0.0018484288354898336,"tostring":0.0018484288354898336,"contractname":0.0018484288354898336,"'contract_name'":0.0018484288354898336,"codebody":0.0018484288354898336,"clarityversion":0.0018484288354898336,"optional":0.0018484288354898336,"defaults":0.0018484288354898336,"deployed":0.0018484288354898336,"on-chain":0.0018484288354898336,"if":0.0018484288354898336,"you":0.0018484288354898336,"want":0.0018484288354898336,"readonly":0.0018484288354898336,"fetchcallreadonlyfunction":0.0018484288354898336,"instead":0.0018484288354898336,"makecontractcall":0.0018484288354898336,"makeunsignedcontractcall":0.0018484288354898336,"cl":0.0018484288354898336,"pc":0.0018484288354898336,"add":0.0018484288354898336,"an":0.0018484288354898336,"post":0.0018484288354898336,"condition":0.0018484288354898336,"condition01":0.0018484288354898336,"principal":0.0018484288354898336,"'sp2zd731anqzt6j4k3f5n8a40zxwxc1xfxhvvqfke'":0.0018484288354898336,"willsendgte":0.0018484288354898336,"1000000n":0.0018484288354898336,"ustx":0.0018484288354898336,"contractaddress":0.0018484288354898336,"'spbmrfrppgcde3f384wcjpk8pqjgz8k9qkk7f59x'":0.0018484288354898336,"functionname":0.0018484288354898336,"'contract_function'":0.0018484288354898336,"functionargs":0.0018484288354898336,"bufferfromutf8":0.0018484288354898336,"'foo":0.0018484288354898336,"string'":0.0018484288354898336,"postconditions":0.0018484288354898336,"validatewithabi":0.0018484288354898336,"true":0.0018484288354898336,"check":0.0018484288354898336,"arguments":0.0018484288354898336,"given":0.0018484288354898336,"are":0.0018484288354898336,"compatible":0.0018484288354898336,"in":0.0018484288354898336,"example":0.0018484288354898336,"we":0.0018484288354898336,"construct":0.0018484288354898336,"contract-call":0.0018484288354898336,"have":0.0018484288354898336,"set":0.0018484288354898336,"option":0.0018484288354898336,"so":0.0018484288354898336,"builder":0.0018484288354898336,"will":0.0018484288354898336,"attempt":0.0018484288354898336,"fetch":0.0018484288354898336,"contracts":0.0018484288354898336,"abi":0.0018484288354898336,"specified":0.0018484288354898336,"and":0.0018484288354898336,"validate":0.0018484288354898336,"that":0.0018484288354898336,"provided":0.0018484288354898336,"match":0.0018484288354898336,"what":0.0018484288354898336,"is":0.0018484288354898336,"described":0.0018484288354898336,"should":0.0018484288354898336,"help":0.0018484288354898336,"avoid":0.0018484288354898336,"constructing":0.0018484288354898336,"invalid":0.0018484288354898336,"would":0.0018484288354898336,"prefer":0.0018484288354898336,"provide":0.0018484288354898336,"your":0.0018484288354898336,"own":0.0018484288354898336,"fetching":0.0018484288354898336,"it":0.0018484288354898336,"also":0.0018484288354898336,"accepts":0.0018484288354898336,"clarityabi":0.0018484288354898336,"interfaces":0.0018484288354898336,"objects":0.0018484288354898336,"sponsoring":0.0018484288354898336,"generate":0.0018484288354898336,"sponsored":0.0018484288354898336,"first":0.0018484288354898336,"sign":0.0018484288354898336,"as":0.0018484288354898336,"origin":0.0018484288354898336,"options":0.0018484288354898336,"object":0.0018484288354898336,"must":0.0018484288354898336,"be":0.0018484288354898336,"can't":0.0018484288354898336,"before":0.0018484288354898336,"they":0.0018484288354898336,"can":0.0018484288354898336,"now":0.0018484288354898336,"passed":0.0018484288354898336,"party":0.0018484288354898336,"which":0.0018484288354898336,"sponsor":0.0018484288354898336,"portion":0.0018484288354898336,"fee":0.0018484288354898336,"sponsortransaction":0.0018484288354898336,"deserializedtx":0.0018484288354898336,"deserializetransaction":0.0018484288354898336,"sponsorkey":0.0018484288354898336,"'770287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01'":0.0018484288354898336,"1000n":0.0018484288354898336,"sponsoroptions":0.0018484288354898336,"sponsorprivatekey":0.0018484288354898336,"sponsornonce":0.0018484288354898336,"sponsoredtx":0.0018484288354898336,"supporting":0.0018484288354898336,"multi-signature":0.0018484288354898336,"multi-sig":0.0018484288354898336,"numsignatures":0.0018484288354898336,"publickeys":0.0018484288354898336,"properties":0.0018484288354898336,"createstacksprivatekey":0.0018484288354898336,"pubkeyfromprivkey":0.0018484288354898336,"publickeytostring":0.0018484288354898336,"transactionsigner":0.0018484288354898336,"standardprincipalcv":0.0018484288354898336,"bytesreader":0.0018484288354898336,"anchormode":0.0018484288354898336,"'sp3fgq8":0.0018484288354898336,"2500000n":0.0018484288354898336,"0n":0.0018484288354898336,"keys":0.0018484288354898336,"participants":0.0018484288354898336,"privkeystrings":0.0018484288354898336,"'6d430bb9":0.0018484288354898336,"'2a584d89":0.0018484288354898336,"'d5200dee":0.0018484288354898336,"array":0.0018484288354898336,"privkeys":0.0018484288354898336,"map":0.0018484288354898336,"corresponding":0.0018484288354898336,"pubkeys":0.0018484288354898336,"pubkeystrings":0.0018484288354898336,"number":0.0018484288354898336,"signature":0.0018484288354898336,"required":0.0018484288354898336,"elements":0.0018484288354898336,"any":0.0018484288354898336,"payload":0.0018484288354898336,"along":0.0018484288354898336,"other":0.0018484288354898336,"addition":0.0018484288354898336,"meeting":0.0018484288354898336,"requirement":0.0018484288354898336,"parties":0.0018484288354898336,"who":0.0018484288354898336,"did":0.0018484288354898336,"appended":0.0018484288354898336,"deserialize":0.0018484288354898336,"new":0.0018484288354898336,"partially":0.0018484288354898336,"signed":0.0018484288354898336,"deserialized":0.0018484288354898336,"signatures":0.0018484288354898336,"signer":0.0018484288354898336,"signorigin":0.0018484288354898336,"second":0.0018484288354898336,"after":0.0018484288354898336,"appendorigin":0.0018484288354898336,"serializedsignedtx":0.0018484288354898336,"calling":0.0018484288354898336,"read-only":0.0018484288354898336,"called":0.0018484288354898336,"generating":0.0018484288354898336,"broadcasting":0.0018484288354898336,"works":0.0018484288354898336,"via":0.0018484288354898336,"direct":0.0018484288354898336,"node":0.0018484288354898336,"buffercvfromstring":0.0018484288354898336,"callreadonlyfunction":0.0018484288354898336,"stackstestnet":0.0018484288354898336,"network'":0.0018484288354898336,"'st3kc0mtnw34s1zxd36jykfd3jjmwa01m55dsj4je'":0.0018484288354898336,"'kv-store'":0.0018484288354898336,"'get-value'":0.0018484288354898336,"buffer":0.0018484288354898336,"'foo'":0.0018484288354898336,"senderaddress":0.0018484288354898336,"'st2f4bk4gzh6yfbnhyddgn4t1rkba7da1bjzpjejj'":0.0018484288354898336,"result":0.0018484288354898336,"clarity":0.0018484288354898336,"values":0.0018484288354898336,"building":0.0018484288354898336,"requires":0.0018484288354898336,"valid":0.0018484288354898336,"pass":0.0018484288354898336,"system":0.0018484288354898336,"stacksgov":0.0018484288354898336,"sips":0.0018484288354898336,"master":0.0018484288354898336,"sip":0.0018484288354898336,"sip-002-smart-contract-language":0.0018484288354898336,"clarity-type-system":0.0018484288354898336,"contains":0.0018484288354898336,"-":0.0018484288354898336,"tuple":0.0018484288354898336,"key-name-0":0.0018484288354898336,"key-type-0":0.0018484288354898336,"key-name-1":0.0018484288354898336,"key-type-1":0.0018484288354898336,"typed":0.0018484288354898336,"named":0.0018484288354898336,"fields":0.0018484288354898336,"list":0.0018484288354898336,"max-len":0.0018484288354898336,"entry-type":0.0018484288354898336,"maximum":0.0018484288354898336,"length":0.0018484288354898336,"entries":0.0018484288354898336,"ok-type":0.0018484288354898336,"err-type":0.0018484288354898336,"used":0.0018484288354898336,"by":0.0018484288354898336,"commit":0.0018484288354898336,"their":0.0018484288354898336,"changes":0.0018484288354898336,"abort":0.0018484288354898336,"may":0.0018484288354898336,"returned":0.0018484288354898336,"well":0.0018484288354898336,"however":0.0018484288354898336,"only":0.0018484288354898336,"behavior":0.0018484288354898336,"some-type":0.0018484288354898336,"either":0.0018484288354898336,"some":0.0018484288354898336,"value":0.0018484288354898336,"none":0.0018484288354898336,"buff":0.0018484288354898336,"byte":0.0018484288354898336,"representing":0.0018484288354898336,"whether":0.0018484288354898336,"standard":0.0018484288354898336,"bool":0.0018484288354898336,"boolean":0.0018484288354898336,"false":0.0018484288354898336,"int":0.0018484288354898336,"128-bit":0.0018484288354898336,"integer":0.0018484288354898336,"uint":0.0018484288354898336,"classes":0.0018484288354898336,"order":0.0018484288354898336,"make":0.0018484288354898336,"easy":0.0018484288354898336,"well-typed":0.0018484288354898336,"javascript":0.0018484288354898336,"these":0.0018484288354898336,"all":0.0018484288354898336,"extend":0.0018484288354898336,"abstract":0.0018484288354898336,"class":0.0018484288354898336,"clarityvalue":0.0018484288354898336,"truecv":0.0018484288354898336,"falsecv":0.0018484288354898336,"nonecv":0.0018484288354898336,"somecv":0.0018484288354898336,"intcv":0.0018484288354898336,"uintcv":0.0018484288354898336,"contractprincipalcv":0.0018484288354898336,"responseerrorcv":0.0018484288354898336,"responseokcv":0.0018484288354898336,"listcv":0.0018484288354898336,"tuplecv":0.0018484288354898336,"buffercv":0.0018484288354898336,"utf8tobytes":0.0018484288354898336,"common'":0.0018484288354898336,"t":0.0018484288354898336,"f":0.0018484288354898336,"nothing":0.0018484288354898336,"something":0.0018484288354898336,"existing":0.0018484288354898336,"bytes":0.0018484288354898336,"uint8array":0.0018484288354898336,"bufcv":0.0018484288354898336,"i":0.0018484288354898336,"-10":0.0018484288354898336,"u":0.0018484288354898336,"address":0.0018484288354898336,"'sp2jxkmsh007npyaqhkjpqmaqyad90nqgtvjvq02b'":0.0018484288354898336,"'contract-name'":0.0018484288354898336,"spcv":0.0018484288354898336,"cpcv":0.0018484288354898336,"errcv":0.0018484288354898336,"okcv":0.0018484288354898336,"tupcv":0.0018484288354898336,"b":0.0018484288354898336,"c":0.0018484288354898336,"l":0.0018484288354898336,"develop":0.0018484288354898336,"checker":0.0018484288354898336,"prevent":0.0018484288354898336,"creating":0.0018484288354898336,"wrongly-typed":0.0018484288354898336,"code":0.0018484288354898336,"won't":0.0018484288354898336,"compile":0.0018484288354898336,"since":0.0018484288354898336,"lists":0.0018484288354898336,"homogeneous":0.0018484288354898336,"meaning":0.0018484288354898336,"contain":0.0018484288354898336,"single":0.0018484288354898336,"important":0.0018484288354898336,"include":0.0018484288354898336,"variable":0.0018484288354898336,"booleancv":0.0018484288354898336,"otherwise":0.0018484288354898336,"know":0.0018484288354898336,"enforce":0.0018484288354898336,"homogeneity":0.0018484288354898336,"conditions":0.0018484288354898336,"three":0.0018484288354898336,"added":0.0018484288354898336,"fungible":0.0018484288354898336,"non-fungible":0.0018484288354898336,"details":0.0018484288354898336,"sip-005":0.0018484288354898336,"sip-005-blocks-and-transactions":0.0018484288354898336,"transaction-post-conditions":0.0018484288354898336,"fungibleconditioncode":0.0018484288354898336,"makestandardstxpostcondition":0.0018484288354898336,"makecontractstxpostcondition":0.0018484288354898336,"postconditionaddress":0.0018484288354898336,"postconditioncode":0.0018484288354898336,"greaterequal":0.0018484288354898336,"postconditionamount":0.0018484288354898336,"standardstxpostcondition":0.0018484288354898336,"'test-contract'":0.0018484288354898336,"contractstxpostcondition":0.0018484288354898336,"createassetinfo":0.0018484288354898336,"makestandardfungiblepostcondition":0.0018484288354898336,"assetaddress":0.0018484288354898336,"'sp62m8mefh32wgsb7xsf9wjzd7tqb48vqb5anwsj'":0.0018484288354898336,"assetcontractname":0.0018484288354898336,"'test-asset-contract'":0.0018484288354898336,"assetname":0.0018484288354898336,"'test-token'":0.0018484288354898336,"fungibleassetinfo":0.0018484288354898336,"standardfungiblepostcondition":0.0018484288354898336,"contractfungiblepostcondition":0.0018484288354898336,"makecontractfungiblepostcondition":0.0018484288354898336,"warning":0.0018484288354898336,"blockchain's":0.0018484288354898336,"post-condition":0.0018484288354898336,"processor":0.0018484288354898336,"ownership":0.0018484288354898336,"checks":0.0018484288354898336,"send":0.0018484288354898336,"nft":0.0018484288354898336,"post-conditions":0.0018484288354898336,"verify":0.0018484288354898336,"anything":0.0018484288354898336,"about":0.0018484288354898336,"asset":0.0018484288354898336,"recipients":0.0018484288354898336,"need":0.0018484288354898336,"docs":0.0018484288354898336,"co":0.0018484288354898336,"write-smart-contracts":0.0018484288354898336,"nonfungibleconditioncode":0.0018484288354898336,"makestandardnonfungiblepostcondition":0.0018484288354898336,"makecontractnonfungiblepostcondition":0.0018484288354898336,"doesnotsend":0.0018484288354898336,"'test-asset'":0.0018484288354898336,"assetid":0.0018484288354898336,"'test-token-asset-id'":0.0018484288354898336,"nonfungibleassetinfo":0.0018484288354898336,"standardnonfungiblepostcondition":0.0018484288354898336,"contractnonfungiblepostcondition":0.0018484288354898336,"conversion":0.0018484288354898336,"json":0.0018484288354898336,"represent":0.0018484288354898336,"format":0.0018484288354898336,"helper":0.0018484288354898336,"cvtojson":0.0018484288354898336,"hextocv":0.0018484288354898336,"tx_result":0.0018484288354898336},"369":{"0":0.007352941176470588,"1":0.007352941176470588,"7":0.007352941176470588,"20":0.007352941176470588,"22":0.007352941176470588,"100":0.007352941176470588,"385875968":0.007352941176470588,"import":0.007352941176470588,"root":0.007352941176470588,"api":0.007352941176470588,"apiexample":0.007352941176470588,"from":0.007352941176470588,"'fumadocs-openapi":0.007352941176470588,"ui'":0.007352941176470588,"property":0.007352941176470588,"accordion":0.007352941176470588,"accordions":0.007352941176470588,"'fumadocs-ui":0.007352941176470588,"components":0.007352941176470588,"accordion'":0.007352941176470588,"tabs":0.007352941176470588,"tabscontent":0.007352941176470588,"tabslist":0.007352941176470588,"tabstrigger":0.007352941176470588,"'":0.007352941176470588,"ui":0.007352941176470588,"tabs'":0.007352941176470588,"badge":0.007352941176470588,"badge'":0.007352941176470588,"inlinecode":0.007352941176470588,"inline-code'":0.007352941176470588,"callout":0.007352941176470588,"type":0.007352941176470588,"info":0.007352941176470588,"this":0.007352941176470588,"reference":0.007352941176470588,"refers":0.007352941176470588,"to":0.007352941176470588,"the":0.007352941176470588,"x":0.007352941176470588,"release":0.007352941176470588,"of":0.007352941176470588,"stacks":0.007352941176470588,"js":0.007352941176470588,"it's":0.007352941176470588,"recommended":0.007352941176470588,"version":0.007352941176470588,"use":0.007352941176470588,"but":0.007352941176470588,"not":0.007352941176470588,"needed":0.007352941176470588,"for":0.007352941176470588,"nakamoto":0.007352941176470588,"read":0.007352941176470588,"migration":0.007352941176470588,"guide":0.007352941176470588,"https":0.007352941176470588,"github":0.007352941176470588,"com":0.007352941176470588,"hirosystems":0.007352941176470588,"blob":0.007352941176470588,"main":0.007352941176470588,"md":0.007352941176470588,"stacksjs-5xx--7xx":0.007352941176470588,"learn":0.007352941176470588,"how":0.007352941176470588,"update":0.007352941176470588,"latest":0.007352941176470588,"network":0.007352941176470588,"package":0.007352941176470588,"contains":0.007352941176470588,"default":0.007352941176470588,"configurations":0.007352941176470588,"installation":0.007352941176470588,"tip":0.007352941176470588,"before":0.007352941176470588,"you":0.007352941176470588,"install":0.007352941176470588,"most":0.007352941176470588,"time":0.007352941176470588,"don't":0.007352941176470588,"need":0.007352941176470588,"or":0.007352941176470588,"even":0.007352941176470588,"library":0.007352941176470588,"directly":0.007352941176470588,"example":0.007352941176470588,"instead":0.007352941176470588,"stacks_mainnet":0.007352941176470588,"simply":0.007352941176470588,"string":0.007352941176470588,"mainnet":0.007352941176470588,"as":0.007352941176470588,"parameter":0.007352941176470588,"package-install":0.007352941176470588,"usage":0.007352941176470588,"object":0.007352941176470588,"a":0.007352941176470588,"in":0.007352941176470588,"is":0.007352941176470588,"an":0.007352941176470588,"defining":0.007352941176470588,"several":0.007352941176470588,"properties":0.007352941176470588,"ts":0.007352941176470588,"stacks_testnet":0.007352941176470588,"stacks_devnet":0.007352941176470588,"network'":0.007352941176470588,"console":0.007352941176470588,"log":0.007352941176470588,"chainid":0.007352941176470588,"transactionversion":0.007352941176470588,"peernetworkid":0.007352941176470588,"magicbytes":0.007352941176470588,"'x2'":0.007352941176470588,"bootaddress":0.007352941176470588,"'sp000000000000000000002q6vf78'":0.007352941176470588,"addressversion":0.007352941176470588,"singlesig":0.007352941176470588,"multisig":0.007352941176470588,"transaction":0.007352941176470588,"building":0.007352941176470588,"makestxtokentransfer":0.007352941176470588,"transactions'":0.007352941176470588,"const":0.007352941176470588,"txoptions":0.007352941176470588,"recipient":0.007352941176470588,"'sp2bs6hd7tn34v8z5bnf8q2aw3k8k2dpv4264cf26'":0.007352941176470588,"amount":0.007352941176470588,"'mainnet'":0.007352941176470588,"'testnet'":0.007352941176470588,"'devnet'":0.007352941176470588,"defaults":0.007352941176470588,"any":0.007352941176470588,"compatible":0.007352941176470588,"await":0.007352941176470588},"370":{"7":0.00510204081632653,"import":0.00510204081632653,"root":0.00510204081632653,"api":0.00510204081632653,"apiexample":0.00510204081632653,"from":0.00510204081632653,"'fumadocs-openapi":0.00510204081632653,"ui'":0.00510204081632653,"property":0.00510204081632653,"accordion":0.00510204081632653,"accordions":0.00510204081632653,"'fumadocs-ui":0.00510204081632653,"components":0.00510204081632653,"accordion'":0.00510204081632653,"tabs":0.00510204081632653,"tabscontent":0.00510204081632653,"tabslist":0.00510204081632653,"tabstrigger":0.00510204081632653,"'":0.00510204081632653,"ui":0.00510204081632653,"tabs'":0.00510204081632653,"badge":0.00510204081632653,"badge'":0.00510204081632653,"inlinecode":0.00510204081632653,"inline-code'":0.00510204081632653,"callout":0.00510204081632653,"type":0.00510204081632653,"info":0.00510204081632653,"this":0.00510204081632653,"reference":0.00510204081632653,"refers":0.00510204081632653,"to":0.00510204081632653,"the":0.00510204081632653,"x":0.00510204081632653,"release":0.00510204081632653,"of":0.00510204081632653,"stacks":0.00510204081632653,"js":0.00510204081632653,"it's":0.00510204081632653,"recommended":0.00510204081632653,"version":0.00510204081632653,"use":0.00510204081632653,"but":0.00510204081632653,"not":0.00510204081632653,"needed":0.00510204081632653,"for":0.00510204081632653,"nakamoto":0.00510204081632653,"read":0.00510204081632653,"migration":0.00510204081632653,"guide":0.00510204081632653,"https":0.00510204081632653,"github":0.00510204081632653,"com":0.00510204081632653,"hirosystems":0.00510204081632653,"blob":0.00510204081632653,"main":0.00510204081632653,"md":0.00510204081632653,"stacksjs-5xx--7xx":0.00510204081632653,"learn":0.00510204081632653,"how":0.00510204081632653,"update":0.00510204081632653,"latest":0.00510204081632653,"common":0.00510204081632653,"package":0.00510204081632653,"contains":0.00510204081632653,"utilities":0.00510204081632653,"working":0.00510204081632653,"with":0.00510204081632653,"includes":0.00510204081632653,"fetch":0.00510204081632653,"helpers":0.00510204081632653,"middleware":0.00510204081632653,"and":0.00510204081632653,"various":0.00510204081632653,"other":0.00510204081632653,"functions":0.00510204081632653,"installation":0.00510204081632653,"package-install":0.00510204081632653,"built-in":0.00510204081632653,"key":0.00510204081632653,"some":0.00510204081632653,"apis":0.00510204081632653,"make":0.00510204081632653,"keys":0.00510204081632653,"provide":0.00510204081632653,"less":0.00510204081632653,"rate-limited":0.00510204081632653,"plans":0.00510204081632653,"typescript":0.00510204081632653,"createapikeymiddleware":0.00510204081632653,"createfetchfn":0.00510204081632653,"stacksmainnet":0.00510204081632653,"network'":0.00510204081632653,"broadcasttransaction":0.00510204081632653,"getnonce":0.00510204081632653,"makestxtokentransfer":0.00510204081632653,"transactions'":0.00510204081632653,"const":0.00510204081632653,"myapimiddleware":0.00510204081632653,"'example_e8e044a3_41d8b0fe_3dd3988ef302'":0.00510204081632653,"myfetchfn":0.00510204081632653,"middlewares":0.00510204081632653,"can":0.00510204081632653,"be":0.00510204081632653,"used":0.00510204081632653,"create":0.00510204081632653,"a":0.00510204081632653,"new":0.00510204081632653,"function":0.00510204081632653,"txoptions":0.00510204081632653,"recipient":0.00510204081632653,"'sp3fgq8z7jy9bwyz5wm53e0m9nk7whjf0691nz159'":0.00510204081632653,"amount":0.00510204081632653,"12345n":0.00510204081632653,"senderkey":0.00510204081632653,"'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01'":0.00510204081632653,"memo":0.00510204081632653,"'some":0.00510204081632653,"memo'":0.00510204081632653,"anchormode":0.00510204081632653,"any":0.00510204081632653,"client":0.00510204081632653,"transaction":0.00510204081632653,"await":0.00510204081632653,"fee-estimation":0.00510204081632653,"will":0.00510204081632653,"custom":0.00510204081632653,"fetchfn":0.00510204081632653,"response":0.00510204081632653,"mymainnet":0.00510204081632653,"sure":0.00510204081632653,"broadcast":0.00510204081632653,"via":0.00510204081632653,"network":0.00510204081632653,"object":0.00510204081632653,"which":0.00510204081632653,"take":0.00510204081632653,"stacksnetwork":0.00510204081632653,"nonce":0.00510204081632653,"hook":0.00510204081632653,"into":0.00510204081632653,"calls":0.00510204081632653,"before":0.00510204081632653,"sending":0.00510204081632653,"request":0.00510204081632653,"or":0.00510204081632653,"after":0.00510204081632653,"receiving":0.00510204081632653,"requestcontext":0.00510204081632653,"responsecontext":0.00510204081632653,"common'":0.00510204081632653,"premiddleware":0.00510204081632653,"ctx":0.00510204081632653,"init":0.00510204081632653,"headers":0.00510204081632653,"set":0.00510204081632653,"'x-foo'":0.00510204081632653,"'bar'":0.00510204081632653,"override":0.00510204081632653,"x-foo":0.00510204081632653,"header":0.00510204081632653,"postmiddleware":0.00510204081632653,"console":0.00510204081632653,"log":0.00510204081632653,"json":0.00510204081632653,"body":0.00510204081632653,"as":0.00510204081632653,"pre":0.00510204081632653,"post":0.00510204081632653,"contain":0.00510204081632653,"both":0.00510204081632653,"stackstestnet":0.00510204081632653,"get":0.00510204081632653,"urls":0.00510204081632653,"txbroadcasturl":0.00510204081632653,"getbroadcastapiurl":0.00510204081632653,"feeestimateurl":0.00510204081632653,"gettransferfeeestimateapiurl":0.00510204081632653,"address":0.00510204081632653,"'sp2bs6hd7tn34v8z5bnf8q2aw3k8k2dpv4264cf26'":0.00510204081632653,"accountinfourl":0.00510204081632653,"getaccountapiurl":0.00510204081632653,"contractname":0.00510204081632653,"'hello_world'":0.00510204081632653,"abiurl":0.00510204081632653,"getabiapiurl":0.00510204081632653,"functionname":0.00510204081632653,"'hello'":0.00510204081632653,"readonlyfunctioncallurl":0.00510204081632653,"getreadonlyfunctioncallapiurl":0.00510204081632653,"nodeinfourl":0.00510204081632653,"getinfourl":0.00510204081632653,"blocktimeurl":0.00510204081632653,"getblocktimeinfourl":0.00510204081632653,"poxinfourl":0.00510204081632653,"getpoxinfourl":0.00510204081632653},"371":{"0":0.003663003663003663,"3":0.003663003663003663,"32":0.003663003663003663,"import":0.003663003663003663,"root":0.003663003663003663,"api":0.003663003663003663,"apiexample":0.003663003663003663,"from":0.003663003663003663,"'fumadocs-openapi":0.003663003663003663,"ui'":0.003663003663003663,"property":0.003663003663003663,"accordion":0.003663003663003663,"accordions":0.003663003663003663,"'fumadocs-ui":0.003663003663003663,"components":0.003663003663003663,"accordion'":0.003663003663003663,"tabs":0.003663003663003663,"tabscontent":0.003663003663003663,"tabslist":0.003663003663003663,"tabstrigger":0.003663003663003663,"'":0.003663003663003663,"ui":0.003663003663003663,"tabs'":0.003663003663003663,"badge":0.003663003663003663,"badge'":0.003663003663003663,"tooltip":0.003663003663003663,"tooltipcontent":0.003663003663003663,"tooltipprovider":0.003663003663003663,"tooltiptrigger":0.003663003663003663,"inlinecode":0.003663003663003663,"inline-code'":0.003663003663003663,"bitcoin":0.003663003663003663,"scopes":0.003663003663003663,"are":0.003663003663003663,"parameters":0.003663003663003663,"you":0.003663003663003663,"use":0.003663003663003663,"to":0.003663003663003663,"define":0.003663003663003663,"the":0.003663003663003663,"if":0.003663003663003663,"this":0.003663003663003663,"specification":0.003663003663003663,"logic":0.003663003663003663,"of":0.003663003663003663,"your":0.003663003663003663,"chainhook":0.003663003663003663,"on":0.003663003663003663,"blockchain":0.003663003663003663,"in":0.003663003663003663,"other":0.003663003663003663,"words":0.003663003663003663,"specify":0.003663003663003663,"what":0.003663003663003663,"on-chain":0.003663003663003663,"events":0.003663003663003663,"looking":0.003663003663003663,"monitor":0.003663003663003663,"and":0.003663003663003663,"track":0.003663003663003663,"for":0.003663003663003663,"more":0.003663003663003663,"information":0.003663003663003663,"design":0.003663003663003663,"please":0.003663003663003663,"view":0.003663003663003663,"predicate":0.003663003663003663,"stacks":0.003663003663003663,"concepts":0.003663003663003663,"predicate-design":0.003663003663003663,"classname":0.003663003663003663,"'my-20'":0.003663003663003663,"div":0.003663003663003663,"'flex-1'":0.003663003663003663,"h2":0.003663003663003663,"'mt-0'":0.003663003663003663,"txid":0.003663003663003663,"scope":0.003663003663003663,"allows":0.003663003663003663,"query":0.003663003663003663,"transactions":0.003663003663003663,"based":0.003663003663003663,"their":0.003663003663003663,"transaction":0.003663003663003663,"id":0.003663003663003663,"is":0.003663003663003663,"particularly":0.003663003663003663,"useful":0.003663003663003663,"tracking":0.003663003663003663,"specific":0.003663003663003663,"or":0.003663003663003663,"auditing":0.003663003663003663,"histories":0.003663003663003663,"required":0.003663003663003663,"true":0.003663003663003663,"deprecated":0.003663003663003663,"false":0.003663003663003663,"name":0.003663003663003663,"equals":0.003663003663003663,"type":0.003663003663003663,"string":0.003663003663003663,"a":0.003663003663003663,"byte":0.003663003663003663,"hex":0.003663003663003663,"encoded":0.003663003663003663,"used":0.003663003663003663,"exact":0.003663003663003663,"match":0.003663003663003663,"'w-full'":0.003663003663003663,"defaultvalue":0.003663003663003663,"default":0.003663003663003663,"'flex":0.003663003663003663,"flex-wrap'":0.003663003663003663,"value":0.003663003663003663,"'tab":0.003663003663003663,"group'":0.003663003663003663,"'badge":0.003663003663003663,"transition-colors'":0.003663003663003663,"by":0.003663003663003663,"json":0.003663003663003663,"if_this":0.003663003663003663,"0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f":0.003663003663003663,"outputs":0.003663003663003663,"blocks":0.003663003663003663,"payload":0.003663003663003663,"returned":0.003663003663003663,"specified":0.003663003663003663,"operation":0.003663003663003663,"object":0.003663003663003663,"identify":0.003663003663003663,"that":0.003663003663003663,"will":0.003663003663003663,"trigger":0.003663003663003663,"as":0.003663003663003663,"it":0.003663003663003663,"observes":0.003663003663003663,"available":0.003663003663003663,"operations":0.003663003663003663,"op_return":0.003663003663003663,"p2pkh":0.003663003663003663,"p2sh":0.003663003663003663,"p2wpkh":0.003663003663003663,"p2wsh":0.003663003663003663,"using":0.003663003663003663,"p2kph":0.003663003663003663,"descriptor":0.003663003663003663,"0xbtc21000042stx016":0.003663003663003663,"title":0.003663003663003663,"32-byte":0.003663003663003663,"specifies":0.003663003663003663,"characters":0.003663003663003663,"starts_with":0.003663003663003663,"starting":0.003663003663003663,"ends_with":0.003663003663003663,"ending":0.003663003663003663,"callout":0.003663003663003663,"info":0.003663003663003663,"note":0.003663003663003663,"matching":0.003663003663003663,"against":0.003663003663003663,"desired":0.003663003663003663,"input":0.003663003663003663,"pay-to-public-key-hash":0.003663003663003663,"output":0.003663003663003663,"script":0.003663003663003663,"users":0.003663003663003663,"send":0.003663003663003663,"funds":0.003663003663003663,"recipient's":0.003663003663003663,"hashed":0.003663003663003663,"public":0.003663003663003663,"key":0.003663003663003663,"providing":0.003663003663003663,"security":0.003663003663003663,"privacy":0.003663003663003663,"concealing":0.003663003663003663,"actual":0.003663003663003663,"pay-to-script-hash":0.003663003663003663,"enables":0.003663003663003663,"instead":0.003663003663003663,"allowing":0.003663003663003663,"complex":0.003663003663003663,"conditions":0.003663003663003663,"multi-signature":0.003663003663003663,"addresses":0.003663003663003663,"pay-to-witness-public-key-hash":0.003663003663003663,"segregated":0.003663003663003663,"witness":0.003663003663003663,"segwit":0.003663003663003663,"efficient":0.003663003663003663,"secure":0.003663003663003663,"separating":0.003663003663003663,"data":0.003663003663003663,"storing":0.003663003663003663,"separate":0.003663003663003663,"block":0.003663003663003663,"pay-to-witness-script-hash":0.003663003663003663,"greater":0.003663003663003663,"scalability":0.003663003663003663,"expression":0.003663003663003663,"wpkh":0.003663003663003663,"tprv8zgxmbicqkspepxn6j3tjvb2mbzqkuhggc6orh2wzanczqgxktcnjzj44xdsriw3jnkbvtk9jw6kfhvnrkgamtsyubevmjprskz4ptfmtgv":0.003663003663003663,"84'":0.003663003663003663,"1'":0.003663003663003663,"0'":0.003663003663003663,"range":0.003663003663003663,"integer":0.003663003663003663,"array":0.003663003663003663,"integers":0.003663003663003663,"representing":0.003663003663003663,"indexes":0.003663003663003663,"wallet":0.003663003663003663,"descriptors":0.003663003663003663,"provide":0.003663003663003663,"compact":0.003663003663003663,"semi-standardized":0.003663003663003663,"method":0.003663003663003663,"describing":0.003663003663003663,"how":0.003663003663003663,"scripts":0.003663003663003663,"within":0.003663003663003663,"generated":0.003663003663003663,"want":0.003663003663003663,"derived":0.003663003663003663,"an":0.003663003663003663,"extended":0.003663003663003663,"pubkey":0.003663003663003663,"multisig-wallet":0.003663003663003663,"can":0.003663003663003663,"now":0.003663003663003663,"rely":0.003663003663003663,"feature":0.003663003663003663,"defining":0.003663003663003663,"one":0.003663003663003663,"per":0.003663003663003663,"address":0.003663003663003663,"example":0.003663003663003663,"let's":0.003663003663003663,"say":0.003663003663003663,"we":0.003663003663003663,"wanted":0.003663003663003663,"first":0.003663003663003663,"following":0.003663003663003663,"reads":0.003663003663003663,"describe":0.003663003663003663,"with":0.003663003663003663,"produces":0.003663003663003663,"these":0.003663003663003663,"bip84":0.003663003663003663,"bcrt1qzy2rdyvu8c57qd8exyyp0mw7dk5drsu9ewzdsu":0.003663003663003663,"bcrt1qsfsjnagr29m8h3a3vdand2s85cg4cefkcwk2fy":0.003663003663003663,"bcrt1qauewfytqe5mtr0xwp786r6fl39kmum2lr65kmj":0.003663003663003663,"stacks_protocol":0.003663003663003663,"related":0.003663003663003663,"proof":0.003663003663003663,"transfer":0.003663003663003663,"pot":0.003663003663003663,"concensus":0.003663003663003663,"mechanism":0.003663003663003663,"https":0.003663003663003663,"www":0.003663003663003663,"hiro":0.003663003663003663,"so":0.003663003663003663,"blog":0.003663003663003663,"securing-web3-apps-through-bitcoin-an-overview-of-stacks-consensus-mechanism":0.003663003663003663,"block_committed":0.003663003663003663,"leader_registered":0.003663003663003663,"inscription_feed":0.003663003663003663,"stx_transferred":0.003663003663003663,"stx_locked":0.003663003663003663,"reveal":0.003663003663003663,"ordinal":0.003663003663003663,"inscription":0.003663003663003663},"372":{"0":0.004273504273504274,"32":0.004273504273504274,"10000":0.004273504273504274,"141200":0.004273504273504274,"import":0.004273504273504274,"root":0.004273504273504274,"api":0.004273504273504274,"apiexample":0.004273504273504274,"from":0.004273504273504274,"'fumadocs-openapi":0.004273504273504274,"ui'":0.004273504273504274,"property":0.004273504273504274,"tabs":0.004273504273504274,"tabscontent":0.004273504273504274,"tabslist":0.004273504273504274,"tabstrigger":0.004273504273504274,"'":0.004273504273504274,"components":0.004273504273504274,"ui":0.004273504273504274,"tabs'":0.004273504273504274,"badge":0.004273504273504274,"badge'":0.004273504273504274,"inlinecode":0.004273504273504274,"inline-code'":0.004273504273504274,"stacks":0.004273504273504274,"scopes":0.004273504273504274,"are":0.004273504273504274,"parameters":0.004273504273504274,"you":0.004273504273504274,"use":0.004273504273504274,"to":0.004273504273504274,"define":0.004273504273504274,"the":0.004273504273504274,"if":0.004273504273504274,"this":0.004273504273504274,"specification":0.004273504273504274,"logic":0.004273504273504274,"of":0.004273504273504274,"your":0.004273504273504274,"chainhook":0.004273504273504274,"on":0.004273504273504274,"blockchain":0.004273504273504274,"in":0.004273504273504274,"other":0.004273504273504274,"words":0.004273504273504274,"specify":0.004273504273504274,"what":0.004273504273504274,"on-chain":0.004273504273504274,"events":0.004273504273504274,"looking":0.004273504273504274,"monitor":0.004273504273504274,"and":0.004273504273504274,"track":0.004273504273504274,"for":0.004273504273504274,"more":0.004273504273504274,"information":0.004273504273504274,"design":0.004273504273504274,"please":0.004273504273504274,"view":0.004273504273504274,"predicate":0.004273504273504274,"concepts":0.004273504273504274,"predicate-design":0.004273504273504274,"classname":0.004273504273504274,"'my-20'":0.004273504273504274,"div":0.004273504273504274,"'flex-1'":0.004273504273504274,"h2":0.004273504273504274,"'mt-0'":0.004273504273504274,"txid":0.004273504273504274,"scope":0.004273504273504274,"allows":0.004273504273504274,"query":0.004273504273504274,"transactions":0.004273504273504274,"based":0.004273504273504274,"their":0.004273504273504274,"transaction":0.004273504273504274,"id":0.004273504273504274,"is":0.004273504273504274,"particularly":0.004273504273504274,"useful":0.004273504273504274,"tracking":0.004273504273504274,"specific":0.004273504273504274,"or":0.004273504273504274,"auditing":0.004273504273504274,"histories":0.004273504273504274,"required":0.004273504273504274,"true":0.004273504273504274,"deprecated":0.004273504273504274,"false":0.004273504273504274,"name":0.004273504273504274,"equals":0.004273504273504274,"type":0.004273504273504274,"string":0.004273504273504274,"a":0.004273504273504274,"bytes":0.004273504273504274,"hex":0.004273504273504274,"encoded":0.004273504273504274,"used":0.004273504273504274,"exact":0.004273504273504274,"match":0.004273504273504274,"'w-full'":0.004273504273504274,"defaultvalue":0.004273504273504274,"default":0.004273504273504274,"'flex":0.004273504273504274,"flex-wrap'":0.004273504273504274,"value":0.004273504273504274,"'tab":0.004273504273504274,"group'":0.004273504273504274,"'badge":0.004273504273504274,"transition-colors'":0.004273504273504274,"by":0.004273504273504274,"json":0.004273504273504274,"if_this":0.004273504273504274,"0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f":0.004273504273504274,"block_height":0.004273504273504274,"blocks":0.004273504273504274,"height":0.004273504273504274,"identifying":0.004273504273504274,"ranges":0.004273504273504274,"integer":0.004273504273504274,"specifies":0.004273504273504274,"block":0.004273504273504274,"higher_than":0.004273504273504274,"that":0.004273504273504274,"should":0.004273504273504274,"be":0.004273504273504274,"greater":0.004273504273504274,"than":0.004273504273504274,"provided":0.004273504273504274,"lower_than":0.004273504273504274,"less":0.004273504273504274,"between":0.004273504273504274,"array":0.004273504273504274,"integers":0.004273504273504274,"range":0.004273504273504274,"heights":0.004273504273504274,"inclusive":0.004273504273504274,"start":0.004273504273504274,"end":0.004273504273504274,"values":0.004273504273504274,"using":0.004273504273504274,"two":0.004273504273504274,"ft_transfer":0.004273504273504274,"fungible":0.004273504273504274,"token":0.004273504273504274,"transfers":0.004273504273504274,"movements":0.004273504273504274,"transfer":0.004273504273504274,"asset_identifier":0.004273504273504274,"fully":0.004273504273504274,"qualified":0.004273504273504274,"asset":0.004273504273504274,"identifier":0.004273504273504274,"observe":0.004273504273504274,"actions":0.004273504273504274,"types":0.004273504273504274,"such":0.004273504273504274,"as":0.004273504273504274,"mint":0.004273504273504274,"burn":0.004273504273504274,"single":0.004273504273504274,"action":0.004273504273504274,"all":0.004273504273504274,"transition-colors0'":0.004273504273504274,"passing":0.004273504273504274,"ft":0.004273504273504274,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.004273504273504274,"cbtc-token":0.004273504273504274,"cbtc":0.004273504273504274,"nft_transfer":0.004273504273504274,"non-fungible":0.004273504273504274,"nft":0.004273504273504274,"strings":0.004273504273504274,"monkey-sip09":0.004273504273504274,"monkeys":0.004273504273504274,"stx_transfer":0.004273504273504274,"involving":0.004273504273504274,"stx":0.004273504273504274,"crucial":0.004273504273504274,"monitoring":0.004273504273504274,"including":0.004273504273504274,"minting":0.004273504273504274,"burning":0.004273504273504274,"locking":0.004273504273504274,"lock":0.004273504273504274,"print_event":0.004273504273504274,"print":0.004273504273504274,"emitted":0.004273504273504274,"during":0.004273504273504274,"contract":0.004273504273504274,"execution":0.004273504273504274,"purposes":0.004273504273504274,"contract_identifier":0.004273504273504274,"contains":0.004273504273504274,"matching":0.004273504273504274,"an":0.004273504273504274,"event":0.004273504273504274,"containing":0.004273504273504274,"specified":0.004273504273504274,"matches_regex":0.004273504273504274,"regex":0.004273504273504274,"matches":0.004273504273504274,"with":0.004273504273504274,"monkey":0.004273504273504274,"w":0.004273504273504274,"contract_call":0.004273504273504274,"involve":0.004273504273504274,"direct":0.004273504273504274,"calls":0.004273504273504274,"methods":0.004273504273504274,"within":0.004273504273504274,"smart":0.004273504273504274,"interactions":0.004273504273504274,"critical":0.004273504273504274,"functions":0.004273504273504274,"method":0.004273504273504274,"scoping":0.004273504273504274,"call":0.004273504273504274,"sp000000000000000000002q6vf78":0.004273504273504274,"pox":0.004273504273504274,"stack-stx":0.004273504273504274,"contract_deployment":0.004273504273504274,"deployment":0.004273504273504274,"contracts":0.004273504273504274,"new":0.004273504273504274,"deployments":0.004273504273504274,"ensuring":0.004273504273504274,"compliance":0.004273504273504274,"expected":0.004273504273504274,"deployer":0.004273504273504274,"address":0.004273504273504274,"implement_trait":0.004273504273504274,"trait":0.004273504273504274,"sip09-protocol":0.004273504273504274},"373":{"import":0.007407407407407408,"secondarycard":0.007407407407407408,"from":0.007407407407407408,"'":0.007407407407407408,"components":0.007407407407407408,"card'":0.007407407407407408,"chainhook":0.007407407407407408,"is":0.007407407407407408,"a":0.007407407407407408,"reorg-aware":0.007407407407407408,"indexer":0.007407407407407408,"that":0.007407407407407408,"serves":0.007407407407407408,"reliable":0.007407407407407408,"blockchain":0.007407407407407408,"data":0.007407407407407408,"you":0.007407407407407408,"don":0.007407407407407408,"t":0.007407407407407408,"have":0.007407407407407408,"to":0.007407407407407408,"waste":0.007407407407407408,"time":0.007407407407407408,"reindexing":0.007407407407407408,"your":0.007407407407407408,"database":0.007407407407407408,"every":0.007407407407407408,"there's":0.007407407407407408,"fork":0.007407407407407408,"also":0.007407407407407408,"lets":0.007407407407407408,"index":0.007407407407407408,"only":0.007407407407407408,"the":0.007407407407407408,"need":0.007407407407407408,"which":0.007407407407407408,"means":0.007407407407407408,"can":0.007407407407407408,"build":0.007407407407407408,"lighter":0.007407407407407408,"databases":0.007407407407407408,"get":0.007407407407407408,"faster":0.007407407407407408,"query":0.007407407407407408,"results":0.007407407407407408,"and":0.007407407407407408,"deliver":0.007407407407407408,"better":0.007407407407407408,"experience":0.007407407407407408,"users":0.007407407407407408,"started":0.007407407407407408,"check":0.007407407407407408,"out":0.007407407407407408,"our":0.007407407407407408,"installation":0.007407407407407408,"guide":0.007407407407407408,"stacks":0.007407407407407408,"create":0.007407407407407408,"event":0.007407407407407408,"streams":0.007407407407407408,"cards":0.007407407407407408,"href":0.007407407407407408,"guides":0.007407407407407408,"chainhook-as-a-service":0.007407407407407408,"title":0.007407407407407408,"bitcoin":0.007407407407407408,"description":0.007407407407407408,"indexes":0.007407407407407408,"events":0.007407407407407408,"on":0.007407407407407408,"chainhook-as-a-service-with-stacks-node":0.007407407407407408,"register-chainhooks-on-devnet":0.007407407407407408,"test":0.007407407407407408,"chainhooks":0.007407407407407408,"debug":0.007407407407407408,"in":0.007407407407407408,"local":0.007407407407407408,"environment":0.007407407407407408,"setting":0.007407407407407408,"up":0.007407407407407408,"predicates":0.007407407407407408,"concepts":0.007407407407407408,"bitcoin-predicates":0.007407407407407408,"list":0.007407407407407408,"of":0.007407407407407408,"quot":0.007407407407407408,"if":0.007407407407407408,"this":0.007407407407407408,"then":0.007407407407407408,"logic":0.007407407407407408,"for":0.007407407407407408,"stacks-predicates":0.007407407407407408,"related":0.007407407407407408,"tools":0.007407407407407408,"-":0.007407407407407408,"simplify":0.007407407407407408,"testing":0.007407407407407408,"with":0.007407407407407408,"clarinet":0.007407407407407408,"js":0.007407407407407408,"sdk":0.007407407407407408,"hiro":0.007407407407407408,"platform":0.007407407407407408,"developer":0.007407407407407408,"building":0.007407407407407408,"deploying":0.007407407407407408,"scaling":0.007407407407407408,"apps":0.007407407407407408,"br":0.007407407407407408,"callout":0.007407407407407408,"help":0.007407407407407408,"type":0.007407407407407408,"reach":0.007407407407407408,"us":0.007407407407407408,"span":0.007407407407407408,"classname":0.007407407407407408,"font-bold":0.007407407407407408,"channel":0.007407407407407408,"discord":0.007407407407407408,"https":0.007407407407407408,"chat":0.007407407407407408,"under":0.007407407407407408,"section":0.007407407407407408,"weekly":0.007407407407407408,"office":0.007407407407407408,"hours":0.007407407407407408,"www":0.007407407407407408,"addevent":0.007407407407407408,"com":0.007407407407407408,"ki22007085":0.007407407407407408,"call":0.007407407407407408,"wednesday":0.007407407407407408,"at":0.007407407407407408,"1pm":0.007407407407407408,"et":0.007407407407407408},"374":{"0":0.002932551319648094,"1":0.002932551319648094,"2":0.002932551319648094,"3":0.002932551319648094,"4":0.002932551319648094,"5":0.002932551319648094,"10":0.002932551319648094,"16":0.002932551319648094,"100":0.002932551319648094,"200":0.002932551319648094,"255":0.002932551319648094,"3000":0.002932551319648094,"6379":0.002932551319648094,"8332":0.002932551319648094,"8333":0.002932551319648094,"10200":0.002932551319648094,"18543":0.002932551319648094,"20443":0.002932551319648094,"20444":0.002932551319648094,"20455":0.002932551319648094,"20456":0.002932551319648094,"32000":0.002932551319648094,"34239":0.002932551319648094,"50000":0.002932551319648094,"you":0.002932551319648094,"can":0.002932551319648094,"run":0.002932551319648094,"chainhook":0.002932551319648094,"as":0.002932551319648094,"a":0.002932551319648094,"service":0.002932551319648094,"to":0.002932551319648094,"evaluate":0.002932551319648094,"stacks":0.002932551319648094,"blocks":0.002932551319648094,"against":0.002932551319648094,"your":0.002932551319648094,"predicates":0.002932551319648094,"also":0.002932551319648094,"dynamically":0.002932551319648094,"register":0.002932551319648094,"new":0.002932551319648094,"by":0.002932551319648094,"enabling":0.002932551319648094,"the":0.002932551319648094,"registration":0.002932551319648094,"api":0.002932551319648094,"in":0.002932551319648094,"this":0.002932551319648094,"guide":0.002932551319648094,"will":0.002932551319648094,"learn":0.002932551319648094,"how":0.002932551319648094,"configure":0.002932551319648094,"node":0.002932551319648094,"work":0.002932551319648094,"with":0.002932551319648094,"configure-your-stacks-node":0.002932551319648094,"configure-chainhook":0.002932551319648094,"create":0.002932551319648094,"predicate":0.002932551319648094,"events":0.002932551319648094,"create-a-predicate":0.002932551319648094,"initiate":0.002932551319648094,"watch":0.002932551319648094,"for":0.002932551319648094,"matching":0.002932551319648094,"transactions":0.002932551319648094,"initiate-chainhook-as-a-service":0.002932551319648094,"dynamically-register-predicates":0.002932551319648094,"callout":0.002932551319648094,"check":0.002932551319648094,"out":0.002932551319648094,"full":0.002932551319648094,"example":0.002932551319648094,"here":0.002932551319648094,"https":0.002932551319648094,"github":0.002932551319648094,"com":0.002932551319648094,"hiro-so":0.002932551319648094,"stacks-connect-example":0.002932551319648094,"---":0.002932551319648094,"if":0.002932551319648094,"followed":0.002932551319648094,"along":0.002932551319648094,"previous":0.002932551319648094,"on":0.002932551319648094,"syncing":0.002932551319648094,"should":0.002932551319648094,"generate":0.002932551319648094,"toml":0.002932551319648094,"file":0.002932551319648094,"within":0.002932551319648094,"repository":0.002932551319648094,"below":0.002932551319648094,"is":0.002932551319648094,"sample":0.002932551319648094,"title":0.002932551319648094,"working_dir":0.002932551319648094,"stacks-blockchain":0.002932551319648094,"rpc_bind":0.002932551319648094,"make":0.002932551319648094,"note":0.002932551319648094,"of":0.002932551319648094,"port":0.002932551319648094,"use":0.002932551319648094,"p2p_bind":0.002932551319648094,"bootstrap_node":0.002932551319648094,"02da7a464ac770ae8337a343670778b93410f2f3fef6bea98dd1c3e9224459d36b":0.002932551319648094,"seed-0":0.002932551319648094,"mainnet":0.002932551319648094,"co":0.002932551319648094,"02afeae522aab5f8c99a00ddf75fbcb4a641e052dd48836408d9cf437344b63516":0.002932551319648094,"seed-1":0.002932551319648094,"03652212ea76be0ed4cd83a25c06e57819993029a7b9999f7d63c36340b34a4e62":0.002932551319648094,"seed-2":0.002932551319648094,"burnchain":0.002932551319648094,"chain":0.002932551319648094,"bitcoin":0.002932551319648094,"mode":0.002932551319648094,"peer_host":0.002932551319648094,"localhost":0.002932551319648094,"username":0.002932551319648094,"bitcoind_username":0.002932551319648094,"must":0.002932551319648094,"match":0.002932551319648094,"rpcuser":0.002932551319648094,"conf":0.002932551319648094,"password":0.002932551319648094,"bitcoind_password":0.002932551319648094,"rpcpassword":0.002932551319648094,"rpc_port":0.002932551319648094,"rpcport":0.002932551319648094,"peer_port":0.002932551319648094,"events_observer":0.002932551319648094,"endpoint":0.002932551319648094,"retry_count":0.002932551319648094,"events_keys":0.002932551319648094,"ensure":0.002932551319648094,"that":0.002932551319648094,"and":0.002932551319648094,"values":0.002932551319648094,"configuration":0.002932551319648094,"next":0.002932551319648094,"section":0.002932551319648094,"communicate":0.002932551319648094,"network":0.002932551319648094,"following":0.002932551319648094,"command":0.002932551319648094,"terminal":0.002932551319648094,"config":0.002932551319648094,"--mainnet":0.002932551319648094,"several":0.002932551319648094,"parameters":0.002932551319648094,"generated":0.002932551319648094,"need":0.002932551319648094,"those":0.002932551319648094,"created":0.002932551319648094,"earlier":0.002932551319648094,"setting":0.002932551319648094,"up":0.002932551319648094,"update":0.002932551319648094,"accordingly":0.002932551319648094,"bitcoind_rpc_username":0.002932551319648094,"set":0.002932551319648094,"bitcoind_rpc_password":0.002932551319648094,"bitcoind_rpc_url":0.002932551319648094,"same":0.002932551319648094,"host":0.002932551319648094,"used":0.002932551319648094,"stacks_node_rpc_url":0.002932551319648094,"matches":0.002932551319648094,"look":0.002932551319648094,"like":0.002932551319648094,"storage":0.002932551319648094,"cache":0.002932551319648094,"http":0.002932551319648094,"allows":0.002932551319648094,"deregister":0.002932551319648094,"disabled":0.002932551319648094,"default":0.002932551319648094,"http_api":0.002932551319648094,"http_port":0.002932551319648094,"database_uri":0.002932551319648094,"redis":0.002932551319648094,"devnet":0.002932551319648094,"block":0.002932551319648094,"be":0.002932551319648094,"received":0.002932551319648094,"either":0.002932551319648094,"through":0.002932551319648094,"node's":0.002932551319648094,"zeromq":0.002932551319648094,"interface":0.002932551319648094,"or":0.002932551319648094,"stacks_events_ingestion_port":0.002932551319648094,"but":0.002932551319648094,"zmq":0.002932551319648094,"instead":0.002932551319648094,"bitcoind_zmq_url":0.002932551319648094,"tcp":0.002932551319648094,"limits":0.002932551319648094,"max_number_of_bitcoin_predicates":0.002932551319648094,"max_number_of_concurrent_bitcoin_scans":0.002932551319648094,"max_number_of_stacks_predicates":0.002932551319648094,"max_number_of_concurrent_stacks_scans":0.002932551319648094,"max_number_of_processing_threads":0.002932551319648094,"max_number_of_networking_threads":0.002932551319648094,"max_caching_memory_size_mb":0.002932551319648094,"event_source":0.002932551319648094,"tsv_file_url":0.002932551319648094,"archive":0.002932551319648094,"hiro":0.002932551319648094,"so":0.002932551319648094,"stacks-blockchain-api":0.002932551319648094,"mainnet-stacks-blockchain-api-latest":0.002932551319648094,"configurations":0.002932551319648094,"are":0.002932551319648094,"matched":0.002932551319648094,"allow":0.002932551319648094,"both":0.002932551319648094,"--------------------":0.002932551319648094,"-------------":0.002932551319648094,"-----------------------------":0.002932551319648094,"zmqpubhashblock":0.002932551319648094,"optional":0.002932551319648094,"when":0.002932551319648094,"running":0.002932551319648094,"using":0.002932551319648094,"because":0.002932551319648094,"pull":0.002932551319648094,"from":0.002932551319648094,"now":0.002932551319648094,"done":0.002932551319648094,"scan":0.002932551319648094,"defining":0.002932551319648094,"appending":0.002932551319648094,"json":0.002932551319648094,"print-event":0.002932551319648094,"--stacks":0.002932551319648094,"once":0.002932551319648094,"boilerplate":0.002932551319648094,"code":0.002932551319648094,"has":0.002932551319648094,"been":0.002932551319648094,"content":0.002932551319648094,"uuid":0.002932551319648094,"6ad27176-2b83-4381-b51c-50baede11e3f":0.002932551319648094,"name":0.002932551319648094,"hello":0.002932551319648094,"world":0.002932551319648094,"version":0.002932551319648094,"networks":0.002932551319648094,"testnet":0.002932551319648094,"start_block":0.002932551319648094,"end_block":0.002932551319648094,"if_this":0.002932551319648094,"scope":0.002932551319648094,"print_event":0.002932551319648094,"contract_identifier":0.002932551319648094,"st1sva0sst0edt4mfygwgp6gnsxmmqjdvp1g8qttc":0.002932551319648094,"arkadiko-freddie-v1-1":0.002932551319648094,"contains":0.002932551319648094,"vault":0.002932551319648094,"then_that":0.002932551319648094,"file_append":0.002932551319648094,"path":0.002932551319648094,"arkadiko":0.002932551319648094,"txt":0.002932551319648094,"sp2c2yfp12ajzb4mabjbaj55xecvs7e4pmmz89yzr":0.002932551319648094,"based":0.002932551319648094,"defined":0.002932551319648094,"output":0.002932551319648094,"above":0.002932551319648094,"definition":0.002932551319648094,"sending":0.002932551319648094,"an":0.002932551319648094,"print-event-post":0.002932551319648094,"e5fa09b2-ec3e-4b6a-9a4a-0ebb454f6e19":0.002932551319648094,"http_post":0.002932551319648094,"url":0.002932551319648094,"authorization_header":0.002932551319648094,"bearer":0.002932551319648094,"cn389ncoiwuencr":0.002932551319648094,"expire_after_occurrence":0.002932551319648094,"required":0.002932551319648094,"field":0.002932551319648094,"posts":0.002932551319648094,"mentioned":0.002932551319648094,"start":0.002932551319648094,"--predicate-path":0.002932551319648094,"--config-path":0.002932551319648094,"registers":0.002932551319648094,"starts":0.002932551319648094,"requirements":0.002932551319648094,"type":0.002932551319648094,"warn":0.002932551319648094,"requires":0.002932551319648094,"have":0.002932551319648094,"locally":0.002932551319648094,"install":0.002932551319648094,"refer":0.002932551319648094,"documentation":0.002932551319648094,"io":0.002932551319648094,"docs":0.002932551319648094,"getting-started":0.002932551319648094,"first":0.002932551319648094,"lines":0.002932551319648094,"uncommented":0.002932551319648094,"enable":0.002932551319648094,"server":0.002932551319648094,"send":0.002932551319648094,"post":0.002932551319648094,"request":0.002932551319648094,"at":0.002932551319648094,"v1":0.002932551319648094,"chainhooks":0.002932551319648094,"curl":0.002932551319648094,"template":0.002932551319648094,"-x":0.002932551319648094,"-h":0.002932551319648094,"content-type":0.002932551319648094,"application":0.002932551319648094,"-d":0.002932551319648094,"result":0.002932551319648094,"status":0.002932551319648094,"passing":0.002932551319648094,"multiple":0.002932551319648094,"predicate_1":0.002932551319648094,"predicate_2":0.002932551319648094,"steps":0.002932551319648094,"cards":0.002932551319648094,"card":0.002932551319648094,"href":0.002932551319648094,"guides":0.002932551319648094,"register-chainhooks-on-devnet":0.002932551319648094,"description":0.002932551319648094,"references":0.002932551319648094,"scopes":0.002932551319648094,"specific":0.002932551319648094,"blockchain":0.002932551319648094},"375":{"0":0.005434782608695652,"1":0.005434782608695652,"2":0.005434782608695652,"5":0.005434782608695652,"15":0.005434782608695652,"20":0.005434782608695652,"21":0.005434782608695652,"233382":0.005434782608695652,"import":0.005434782608695652,"file":0.005434782608695652,"folder":0.005434782608695652,"files":0.005434782608695652,"from":0.005434782608695652,"'fumadocs-ui":0.005434782608695652,"components":0.005434782608695652,"files'":0.005434782608695652,"follow":0.005434782608695652,"these":0.005434782608695652,"steps":0.005434782608695652,"to":0.005434782608695652,"register":0.005434782608695652,"your":0.005434782608695652,"chainhooks":0.005434782608695652,"on":0.005434782608695652,"devnet":0.005434782608695652,"using":0.005434782608695652,"clarinet":0.005434782608695652,"callout":0.005434782608695652,"title":0.005434782608695652,"requirements":0.005434782608695652,"type":0.005434782608695652,"warn":0.005434782608695652,"this":0.005434782608695652,"feature":0.005434782608695652,"requires":0.005434782608695652,"version":0.005434782608695652,"or":0.005434782608695652,"higher":0.005434782608695652,"upgrade":0.005434782608695652,"install":0.005434782608695652,"refer":0.005434782608695652,"our":0.005434782608695652,"installation":0.005434782608695652,"stacks":0.005434782608695652,"page":0.005434782608695652,"for":0.005434782608695652,"create":0.005434782608695652,"chainhook":0.005434782608695652,"predicates":0.005434782608695652,"first":0.005434782608695652,"within":0.005434782608695652,"project":0.005434782608695652,"you'll":0.005434782608695652,"need":0.005434782608695652,"predicate":0.005434782608695652,"should":0.005434782608695652,"be":0.005434782608695652,"situated":0.005434782608695652,"in":0.005434782608695652,"the":0.005434782608695652,"root":0.005434782608695652,"of":0.005434782608695652,"directory":0.005434782608695652,"can":0.005434782608695652,"either":0.005434782608695652,"separate":0.005434782608695652,"stored":0.005434782608695652,"a":0.005434782608695652,"specific":0.005434782608695652,"e":0.005434782608695652,"g":0.005434782608695652,"classname":0.005434782608695652,"'pointer-events-none'":0.005434782608695652,"name":0.005434782608695652,"contracts":0.005434782608695652,"defaultopen":0.005434782608695652,"counter":0.005434782608695652,"clar":0.005434782608695652,"'bg-":0.005434782608695652,"hsl":0.005434782608695652,"var":0.005434782608695652,"--highlight":0.005434782608695652,"'":0.005434782608695652,"increment":0.005434782608695652,"json":0.005434782608695652,"decrement":0.005434782608695652,"settings":0.005434782608695652,"tests":0.005434782608695652,"test":0.005434782608695652,"ts":0.005434782608695652,"gitignore":0.005434782608695652,"toml":0.005434782608695652,"package":0.005434782608695652,"tsconfig":0.005434782608695652,"vitest":0.005434782608695652,"config":0.005434782608695652,"js":0.005434782608695652,"examples":0.005434782608695652,"how":0.005434782608695652,"define":0.005434782608695652,"scopes":0.005434782608695652,"references":0.005434782608695652,"reference":0.005434782608695652,"start":0.005434782608695652,"run":0.005434782608695652,"_":0.005434782608695652,"command":0.005434782608695652,"running":0.005434782608695652,"will":0.005434782608695652,"begin":0.005434782608695652,"local":0.005434782608695652,"service":0.005434782608695652,"background":0.005434782608695652,"that":0.005434782608695652,"automatically":0.005434782608695652,"registers":0.005434782608695652,"against":0.005434782608695652,"network":0.005434782608695652,"confirm":0.005434782608695652,"registration":0.005434782608695652,"once":0.005434782608695652,"starts":0.005434782608695652,"initiates":0.005434782608695652,"process":0.005434782608695652,"know":0.005434782608695652,"was":0.005434782608695652,"successful":0.005434782608695652,"by":0.005434782608695652,"checking":0.005434782608695652,"confirmation":0.005434782608695652,"message":0.005434782608695652,"terminal":0.005434782608695652,"info":0.005434782608695652,"feb":0.005434782608695652,"07":0.005434782608695652,"registered":0.005434782608695652,"if":0.005434782608695652,"you":0.005434782608695652,"do":0.005434782608695652,"not":0.005434782608695652,"see":0.005434782608695652,"at":0.005434782608695652,"top":0.005434782608695652,"logs":0.005434782608695652,"verify":0.005434782608695652,"are":0.005434782608695652,"working":0.005434782608695652,"with":0.005434782608695652,"completed":0.005434782608695652,"ready":0.005434782608695652,"trigger":0.005434782608695652,"whenever":0.005434782608695652,"contract":0.005434782608695652,"actions":0.005434782608695652,"occur":0.005434782608695652,"monitor":0.005434782608695652,"activity":0.005434782608695652,"locally":0.005434782608695652,"through":0.005434782608695652,"execution":0.005434782608695652,"as":0.005434782608695652,"further":0.005434782608695652,"develop":0.005434782608695652,"and":0.005434782608695652,"smart":0.005434782608695652,"when":0.005434782608695652,"an":0.005434782608695652,"action":0.005434782608695652,"occurs":0.005434782608695652,"something":0.005434782608695652,"like":0.005434782608695652,"hooks":0.005434782608695652,"triggered":0.005434782608695652,"point":0.005434782608695652,"payload":0.005434782608695652,"depending":0.005434782608695652,"whether":0.005434782608695652,"expecting":0.005434782608695652,"_json":0.005434782608695652,"http_post":0.005434782608695652,"file_append":0.005434782608695652,"result":0.005434782608695652,"then_that":0.005434782608695652,"configuration":0.005434782608695652},"376":{"0":0.002770083102493075,"1":0.002770083102493075,"2":0.002770083102493075,"3":0.002770083102493075,"4":0.002770083102493075,"5":0.002770083102493075,"10":0.002770083102493075,"16":0.002770083102493075,"100":0.002770083102493075,"200":0.002770083102493075,"3000":0.002770083102493075,"6379":0.002770083102493075,"8332":0.002770083102493075,"12345":0.002770083102493075,"18543":0.002770083102493075,"20443":0.002770083102493075,"20456":0.002770083102493075,"32000":0.002770083102493075,"801500":0.002770083102493075,"802000":0.002770083102493075,"in":0.002770083102493075,"order":0.002770083102493075,"to":0.002770083102493075,"build":0.002770083102493075,"out":0.002770083102493075,"a":0.002770083102493075,"more":0.002770083102493075,"robust":0.002770083102493075,"and":0.002770083102493075,"secure":0.002770083102493075,"web":0.002770083102493075,"app":0.002770083102493075,"you":0.002770083102493075,"can":0.002770083102493075,"run":0.002770083102493075,"chainhook":0.002770083102493075,"as":0.002770083102493075,"service":0.002770083102493075,"stream":0.002770083102493075,"your":0.002770083102493075,"events":0.002770083102493075,"continously":0.002770083102493075,"server":0.002770083102493075,"designate":0.002770083102493075,"this":0.002770083102493075,"guide":0.002770083102493075,"will":0.002770083102493075,"learn":0.002770083102493075,"how":0.002770083102493075,"configure":0.002770083102493075,"an":0.002770083102493075,"existing":0.002770083102493075,"bitcoin":0.002770083102493075,"node":0.002770083102493075,"work":0.002770083102493075,"with":0.002770083102493075,"configure-an-existing-bitcoin-node-to-work-with-chainhook":0.002770083102493075,"generate":0.002770083102493075,"predicate":0.002770083102493075,"target":0.002770083102493075,"specific":0.002770083102493075,"transactions":0.002770083102493075,"generate-a-chainhook-predicate-to-target-specific-transactions":0.002770083102493075,"scan":0.002770083102493075,"the":0.002770083102493075,"blockchain":0.002770083102493075,"for":0.002770083102493075,"that":0.002770083102493075,"match":0.002770083102493075,"scan-the-bitcoin-blockchain-for-transactions-that-match-your-predicate":0.002770083102493075,"initiate":0.002770083102493075,"watch":0.002770083102493075,"matching":0.002770083102493075,"initiate-a-chainhook-service-to-watch-for-matching-transactions":0.002770083102493075,"dynamically":0.002770083102493075,"register":0.002770083102493075,"dynamically-register-your-predicate-with-chainhook":0.002770083102493075,"---":0.002770083102493075,"section":0.002770083102493075,"network":0.002770083102493075,"configurations":0.002770083102493075,"config":0.002770083102493075,"file":0.002770083102493075,"first":0.002770083102493075,"install":0.002770083102493075,"latest":0.002770083102493075,"version":0.002770083102493075,"of":0.002770083102493075,"stacks":0.002770083102493075,"installation":0.002770083102493075,"next":0.002770083102493075,"toml":0.002770083102493075,"connect":0.002770083102493075,"bitcoind":0.002770083102493075,"navigate":0.002770083102493075,"directory":0.002770083102493075,"where":0.002770083102493075,"want":0.002770083102493075,"use":0.002770083102493075,"following":0.002770083102493075,"command":0.002770083102493075,"terminal":0.002770083102493075,"--mainnet":0.002770083102493075,"several":0.002770083102493075,"parameters":0.002770083102493075,"generated":0.002770083102493075,"configuration":0.002770083102493075,"need":0.002770083102493075,"those":0.002770083102493075,"conf":0.002770083102493075,"created":0.002770083102493075,"earlier":0.002770083102493075,"setting":0.002770083102493075,"up":0.002770083102493075,"guides":0.002770083102493075,"sync-a-bitcoin-node":0.002770083102493075,"update":0.002770083102493075,"accordingly":0.002770083102493075,"bitcoind_rpc_username":0.002770083102493075,"username":0.002770083102493075,"set":0.002770083102493075,"rpcuser":0.002770083102493075,"bitcoind_rpc_password":0.002770083102493075,"password":0.002770083102493075,"rpcpassword":0.002770083102493075,"bitcoind_rpc_url":0.002770083102493075,"same":0.002770083102493075,"host":0.002770083102493075,"port":0.002770083102493075,"used":0.002770083102493075,"rpcport":0.002770083102493075,"additionally":0.002770083102493075,"if":0.002770083102493075,"receive":0.002770083102493075,"from":0.002770083102493075,"configured":0.002770083102493075,"substitute":0.002770083102493075,"stacks_node_rpc_url":0.002770083102493075,"bitcoind_zmq_url":0.002770083102493075,"follows":0.002770083102493075,"storage":0.002770083102493075,"working_dir":0.002770083102493075,"cache":0.002770083102493075,"http":0.002770083102493075,"api":0.002770083102493075,"allows":0.002770083102493075,"deregister":0.002770083102493075,"predicates":0.002770083102493075,"is":0.002770083102493075,"disabled":0.002770083102493075,"by":0.002770083102493075,"default":0.002770083102493075,"http_api":0.002770083102493075,"http_port":0.002770083102493075,"database_uri":0.002770083102493075,"redis":0.002770083102493075,"localhost":0.002770083102493075,"mode":0.002770083102493075,"mainnet":0.002770083102493075,"devnet":0.002770083102493075,"block":0.002770083102493075,"be":0.002770083102493075,"received":0.002770083102493075,"either":0.002770083102493075,"through":0.002770083102493075,"node's":0.002770083102493075,"zeromq":0.002770083102493075,"interface":0.002770083102493075,"or":0.002770083102493075,"but":0.002770083102493075,"zmq":0.002770083102493075,"instead":0.002770083102493075,"tcp":0.002770083102493075,"limits":0.002770083102493075,"max_number_of_bitcoin_predicates":0.002770083102493075,"max_number_of_concurrent_bitcoin_scans":0.002770083102493075,"max_number_of_stacks_predicates":0.002770083102493075,"max_number_of_concurrent_stacks_scans":0.002770083102493075,"max_number_of_processing_threads":0.002770083102493075,"max_number_of_networking_threads":0.002770083102493075,"max_caching_memory_size_mb":0.002770083102493075,"event_source":0.002770083102493075,"tsv_file_url":0.002770083102493075,"https":0.002770083102493075,"archive":0.002770083102493075,"hiro":0.002770083102493075,"so":0.002770083102493075,"stacks-blockchain-api":0.002770083102493075,"mainnet-stacks-blockchain-api-latest":0.002770083102493075,"here":0.002770083102493075,"table":0.002770083102493075,"relevant":0.002770083102493075,"changes":0.002770083102493075,"our":0.002770083102493075,"files":0.002770083102493075,"---------------":0.002770083102493075,"---------------------":0.002770083102493075,"zmqpubhashblock":0.002770083102493075,"based":0.002770083102493075,"on":0.002770083102493075,"now":0.002770083102493075,"are":0.002770083102493075,"complete":0.002770083102493075,"define":0.002770083102493075,"scope":0.002770083102493075,"references":0.002770083102493075,"scopes":0.002770083102493075,"would":0.002770083102493075,"like":0.002770083102493075,"these":0.002770083102493075,"specify":0.002770083102493075,"if_this":0.002770083102493075,"then_that":0.002770083102493075,"pattern":0.002770083102493075,"trigger":0.002770083102493075,"deliver":0.002770083102493075,"result":0.002770083102493075,"appendation":0.002770083102493075,"post":0.002770083102493075,"request":0.002770083102493075,"appending":0.002770083102493075,"sample":0.002770083102493075,"json":0.002770083102493075,"execute":0.002770083102493075,"new":0.002770083102493075,"stacking-pool":0.002770083102493075,"--bitcoin":0.002770083102493075,"replace":0.002770083102493075,"contents":0.002770083102493075,"chain":0.002770083102493075,"uuid":0.002770083102493075,"name":0.002770083102493075,"stacking":0.002770083102493075,"pool":0.002770083102493075,"networks":0.002770083102493075,"start_block":0.002770083102493075,"end_block":0.002770083102493075,"outputs":0.002770083102493075,"p2wpkh":0.002770083102493075,"equals":0.002770083102493075,"bc1qs0kkdpsrzh3ngqgth7mkavlwlzr7lms2zv3wxe":0.002770083102493075,"file_append":0.002770083102493075,"path":0.002770083102493075,"bitcoin-transactions":0.002770083102493075,"txt":0.002770083102493075,"example":0.002770083102493075,"demonstrates":0.002770083102493075,"scanning":0.002770083102493075,"portion":0.002770083102493075,"capture":0.002770083102493075,"address":0.002770083102493075,"associated":0.002770083102493075,"case":0.002770083102493075,"friedgar":0.002770083102493075,"friedger":0.002770083102493075,"de":0.002770083102493075,"notice":0.002770083102493075,"specifying":0.002770083102493075,"callout":0.002770083102493075,"title":0.002770083102493075,"note":0.002770083102493075,"get":0.002770083102493075,"height":0.002770083102493075,"current":0.002770083102493075,"referring":0.002770083102493075,"explorer":0.002770083102493075,"blocks":0.002770083102493075,"defined":0.002770083102493075,"--config-path":0.002770083102493075,"output":0.002770083102493075,"above":0.002770083102493075,"text":0.002770083102493075,"definition":0.002770083102493075,"sending":0.002770083102493075,"endpoint":0.002770083102493075,"another":0.002770083102493075,"time":0.002770083102493075,"send":0.002770083102493075,"payload":0.002770083102493075,"stacking-pool-api":0.002770083102493075,"http_post":0.002770083102493075,"url":0.002770083102493075,"authorization_header":0.002770083102493075,"required":0.002770083102493075,"field":0.002770083102493075,"when":0.002770083102493075,"using":0.002770083102493075,"once":0.002770083102493075,"finished":0.002770083102493075,"posts":0.002770083102493075,"mentioned":0.002770083102493075,"examples":0.002770083102493075,"scanned":0.002770083102493075,"historical":0.002770083102493075,"data":0.002770083102493075,"against":0.002770083102493075,"delivered":0.002770083102493075,"results":0.002770083102493075,"acts":0.002770083102493075,"ongoing":0.002770083102493075,"observer":0.002770083102493075,"event-streaming":0.002770083102493075,"start":0.002770083102493075,"also":0.002770083102493075,"making":0.002770083102493075,"call":0.002770083102493075,"both":0.002770083102493075,"instances":0.002770083102493075,"delivering":0.002770083102493075,"their":0.002770083102493075,"passing":0.002770083102493075,"shown":0.002770083102493075,"below":0.002770083102493075,"--predicate-path":0.002770083102493075,"registers":0.002770083102493075,"means":0.002770083102493075,"long-running":0.002770083102493075,"process":0.002770083102493075,"exposes":0.002770083102493075,"endpoints":0.002770083102493075,"report":0.002770083102493075,"requirements":0.002770083102493075,"type":0.002770083102493075,"warn":0.002770083102493075,"requires":0.002770083102493075,"have":0.002770083102493075,"running":0.002770083102493075,"locally":0.002770083102493075,"refer":0.002770083102493075,"documentation":0.002770083102493075,"io":0.002770083102493075,"docs":0.002770083102493075,"getting-started":0.002770083102493075,"ensure":0.002770083102493075,"lines":0.002770083102493075,"code":0.002770083102493075,"uncommented":0.002770083102493075,"enable":0.002770083102493075,"registration":0.002770083102493075,"instance":0.002770083102493075,"at":0.002770083102493075,"v1":0.002770083102493075,"chainhooks":0.002770083102493075,"curl":0.002770083102493075,"template":0.002770083102493075,"-x":0.002770083102493075,"-h":0.002770083102493075,"content-type":0.002770083102493075,"application":0.002770083102493075,"-d":0.002770083102493075,"status":0.002770083102493075,"multiple":0.002770083102493075,"ie":0.002770083102493075,"predicate_1":0.002770083102493075,"predicate_2":0.002770083102493075,"steps":0.002770083102493075,"cards":0.002770083102493075,"card":0.002770083102493075,"href":0.002770083102493075,"register-chainhooks-on-devnet":0.002770083102493075,"description":0.002770083102493075},"377":{"0":0.002257336343115124,"1":0.002257336343115124,"2":0.002257336343115124,"3":0.002257336343115124,"4":0.002257336343115124,"21443":0.002257336343115124,"21544":0.002257336343115124,"1722208524":0.002257336343115124,"import":0.002257336343115124,"step":0.002257336343115124,"steps":0.002257336343115124,"from":0.002257336343115124,"fumadocs-ui":0.002257336343115124,"components":0.002257336343115124,"tooltip":0.002257336343115124,"tooltipcontent":0.002257336343115124,"tooltipprovider":0.002257336343115124,"tooltiptrigger":0.002257336343115124,"ui":0.002257336343115124,"the":0.002257336343115124,"_json":0.002257336343115124,"contract_call":0.002257336343115124,"_":0.002257336343115124,"predicate":0.002257336343115124,"scope":0.002257336343115124,"is":0.002257336343115124,"designed":0.002257336343115124,"to":0.002257336343115124,"target":0.002257336343115124,"direct":0.002257336343115124,"function":0.002257336343115124,"calls":0.002257336343115124,"within":0.002257336343115124,"a":0.002257336343115124,"smart":0.002257336343115124,"contract":0.002257336343115124,"when":0.002257336343115124,"triggered":0.002257336343115124,"chainhook":0.002257336343115124,"will":0.002257336343115124,"return":0.002257336343115124,"payload":0.002257336343115124,"with":0.002257336343115124,"transaction":0.002257336343115124,"data":0.002257336343115124,"detailing":0.002257336343115124,"on-chain":0.002257336343115124,"events":0.002257336343115124,"contained":0.002257336343115124,"in":0.002257336343115124,"these":0.002257336343115124,"functions":0.002257336343115124,"this":0.002257336343115124,"guide":0.002257336343115124,"you":0.002257336343115124,"learn":0.002257336343115124,"how":0.002257336343115124,"build":0.002257336343115124,"cast-vote":0.002257336343115124,"creating-the-predicate":0.002257336343115124,"scan":0.002257336343115124,"stacks":0.002257336343115124,"blockchain":0.002257336343115124,"using":0.002257336343115124,"your":0.002257336343115124,"running-the-predicate":0.002257336343115124,"use":0.002257336343115124,"clarity":0.002257336343115124,"specific":0.002257336343115124,"return-contract-data-with-the-clarity-function":0.002257336343115124,"find":0.002257336343115124,"related":0.002257336343115124,"call":0.002257336343115124,"chainhook-payload":0.002257336343115124,"callout":0.002257336343115124,"type":0.002257336343115124,"warn":0.002257336343115124,"title":0.002257336343115124,"requirements":0.002257336343115124,"follow":0.002257336343115124,"make":0.002257336343115124,"sure":0.002257336343115124,"have":0.002257336343115124,"installed":0.002257336343115124,"directly":0.002257336343115124,"installation":0.002257336343115124,"create":0.002257336343115124,"main":0.002257336343115124,"interface":0.002257336343115124,"for":0.002257336343115124,"querying":0.002257336343115124,"indexer":0.002257336343115124,"uses":0.002257336343115124,"select":0.002257336343115124,"appropriate":0.002257336343115124,"network":0.002257336343115124,"and":0.002257336343115124,"monitoring":0.002257336343115124,"transactions":0.002257336343115124,"run":0.002257336343115124,"following":0.002257336343115124,"command":0.002257336343115124,"generate":0.002257336343115124,"template":0.002257336343115124,"terminal":0.002257336343115124,"predicates":0.002257336343115124,"new":0.002257336343115124,"contract-call-chainhook":0.002257336343115124,"json":0.002257336343115124,"--stacks":0.002257336343115124,"note":0.002257336343115124,"alternatively":0.002257336343115124,"hiro":0.002257336343115124,"platform":0.002257336343115124,"https":0.002257336343115124,"so":0.002257336343115124,"has":0.002257336343115124,"an":0.002257336343115124,"excellent":0.002257336343115124,"help":0.002257336343115124,"form":0.002257336343115124,"builder":0.002257336343115124,"or":0.002257336343115124,"upload":0.002257336343115124,"file":0.002257336343115124,"containing":0.002257336343115124,"there":0.002257336343115124,"are":0.002257336343115124,"that":0.002257336343115124,"need":0.002257336343115124,"address":0.002257336343115124,"targeting":0.002257336343115124,"defining":0.002257336343115124,"want":0.002257336343115124,"observe":0.002257336343115124,"destination":0.002257336343115124,"begin":0.002257336343115124,"configure":0.002257336343115124,"voting":0.002257336343115124,"-":0.002257336343115124,"specify":0.002257336343115124,"testnet":0.002257336343115124,"object":0.002257336343115124,"set":0.002257336343115124,"start_block":0.002257336343115124,"property":0.002257336343115124,"inline":0.002257336343115124,"aschild":0.002257336343115124,"span":0.002257336343115124,"classname":0.002257336343115124,"'cursor-default":0.002257336343115124,"border-dotted":0.002257336343115124,"border-b":0.002257336343115124,"border-primary'":0.002257336343115124,"value":0.002257336343115124,"represents":0.002257336343115124,"block":0.002257336343115124,"height":0.002257336343115124,"our":0.002257336343115124,"was":0.002257336343115124,"deployed":0.002257336343115124,"at":0.002257336343115124,"chain":0.002257336343115124,"uuid":0.002257336343115124,"name":0.002257336343115124,"version":0.002257336343115124,"networks":0.002257336343115124,"decode_clarity_values":0.002257336343115124,"true":0.002257336343115124,"expire_after_occurrence":0.002257336343115124,"next":0.002257336343115124,"define":0.002257336343115124,"of":0.002257336343115124,"if_this":0.002257336343115124,"specification":0.002257336343115124,"allows":0.002257336343115124,"specified":0.002257336343115124,"called":0.002257336343115124,"its":0.002257336343115124,"contract_identifier":0.002257336343115124,"stj81c2wpqhfb6xtg518jkpabwm639r2x37vfkjv":0.002257336343115124,"simple-vote-v0":0.002257336343115124,"method":0.002257336343115124,"warning":0.002257336343115124,"defined":0.002257336343115124,"must":0.002257336343115124,"be":0.002257336343115124,"order":0.002257336343115124,"calling":0.002257336343115124,"another":0.002257336343115124,"different":0.002257336343115124,"on":0.002257336343115124,"same":0.002257336343115124,"not":0.002257336343115124,"below":0.002257336343115124,"example":0.002257336343115124,"would":0.002257336343115124,"trigger":0.002257336343115124,"event":0.002257336343115124,"define-public":0.002257336343115124,"call-cast-vote":0.002257336343115124,"finally":0.002257336343115124,"delivers":0.002257336343115124,"it":0.002257336343115124,"by":0.002257336343115124,"then_that":0.002257336343115124,"file_append":0.002257336343115124,"path":0.002257336343115124,"where":0.002257336343115124,"post":0.002257336343115124,"tmp":0.002257336343115124,"accordion":0.002257336343115124,"single":0.002257336343115124,"collapsible":0.002257336343115124,"w-full":0.002257336343115124,"accordionitem":0.002257336343115124,"full-predicate":0.002257336343115124,"accordiontrigger":0.002257336343115124,"full":0.002257336343115124,"accordioncontent":0.002257336343115124,"more":0.002257336343115124,"details":0.002257336343115124,"optional":0.002257336343115124,"configurations":0.002257336343115124,"other":0.002257336343115124,"elements":0.002257336343115124,"scopes":0.002257336343115124,"check":0.002257336343115124,"out":0.002257336343115124,"design":0.002257336343115124,"concepts":0.002257336343115124,"predicate-design":0.002257336343115124,"references":0.002257336343115124,"pages":0.002257336343115124,"up":0.002257336343115124,"can":0.002257336343115124,"now":0.002257336343115124,"blocks":0.002257336343115124,"match":0.002257336343115124,"analyze":0.002257336343115124,"returned":0.002257336343115124,"track":0.002257336343115124,"invoked":0.002257336343115124,"deliver":0.002257336343115124,"detailed":0.002257336343115124,"level":0.002257336343115124,"based":0.002257336343115124,"configuration":0.002257336343115124,"replacing":0.002257336343115124,"actual":0.002257336343115124,"--testnet":0.002257336343115124,"if":0.002257336343115124,"creating":0.002257336343115124,"automatically":0.002257336343115124,"_clarity":0.002257336343115124,"records":0.002257336343115124,"vote":0.002257336343115124,"storing":0.002257336343115124,"also":0.002257336343115124,"logs":0.002257336343115124,"relevant":0.002257336343115124,"print":0.002257336343115124,"which":0.002257336343115124,"useful":0.002257336343115124,"additional":0.002257336343115124,"part":0.002257336343115124,"built-in":0.002257336343115124,"examine":0.002257336343115124,"look":0.002257336343115124,"clar":0.002257336343115124,"voter":0.002257336343115124,"already":0.002257336343115124,"voted":0.002257336343115124,"asserts":0.002257336343115124,"is-none":0.002257336343115124,"map-get":0.002257336343115124,"uservotes":0.002257336343115124,"tx-sender":0.002257336343115124,"err":0.002257336343115124,"err_already_voted":0.002257336343115124,"update":0.002257336343115124,"map":0.002257336343115124,"been":0.002257336343115124,"cast":0.002257336343115124,"map-set":0.002257336343115124,"hasvoted":0.002257336343115124,"var-set":0.002257336343115124,"votecount":0.002257336343115124,"var-get":0.002257336343115124,"u1":0.002257336343115124,"notification":0.002257336343115124,"status":0.002257336343115124,"totalvotes":0.002257336343115124,"get-total-votes":0.002257336343115124,"ok":0.002257336343115124,"successfully":0.002257336343115124,"explorer":0.002257336343115124,"txid":0.002257336343115124,"0x312a3c559af0f75381a9eb4540912c310d74682ed3036207ec890ad8cd1aebe6":0.002257336343115124,"under":0.002257336343115124,"dive":0.002257336343115124,"deeper":0.002257336343115124,"into":0.002257336343115124,"standarized":0.002257336343115124,"observation":0.002257336343115124,"format":0.002257336343115124,"apply":0.002257336343115124,"arrays":0.002257336343115124,"element":0.002257336343115124,"block_identifer":0.002257336343115124,"gives":0.002257336343115124,"us":0.002257336343115124,"index":0.002257336343115124,"observed":0.002257336343115124,"contract-call-payload":0.002257336343115124,"block_identifier":0.002257336343115124,"hash":0.002257336343115124,"0x4d88015a6df9ec4f6df875941d87337ce64f8d51608563f80b6e27adeb327e4d":0.002257336343115124,"see":0.002257336343115124,"but":0.002257336343115124,"index_block_hash":0.002257336343115124,"api's":0.002257336343115124,"get":0.002257336343115124,"api":0.002257336343115124,"get-block":0.002257336343115124,"endpoint":0.002257336343115124,"array's":0.002257336343115124,"metadata":0.002257336343115124,"stacks_block_hash":0.002257336343115124,"we":0.002257336343115124,"retrieve":0.002257336343115124,"navigating":0.002257336343115124,"display":0.002257336343115124,"0x4ad36f77ff76042f3b7355006556375970b0f99d1232b14a3b4a2eadda4a806a":0.002257336343115124,"timestamp":0.002257336343115124,"array":0.002257336343115124,"unix":0.002257336343115124,"time":0.002257336343115124,"stamp":0.002257336343115124,"initiation":0.002257336343115124,"finalized":0.002257336343115124,"block_time":0.002257336343115124,"because":0.002257336343115124,"receive":0.002257336343115124,"response":0.002257336343115124,"contains":0.002257336343115124,"each":0.002257336343115124,"matches":0.002257336343115124,"predicate's":0.002257336343115124,"start":0.002257336343115124,"makes":0.002257336343115124,"child":0.002257336343115124,"every":0.002257336343115124,"own":0.002257336343115124,"children":0.002257336343115124,"seen":0.002257336343115124,"transaction_identifier":0.002257336343115124,"metdata":0.002257336343115124,"operations":0.002257336343115124,"rollback":0.002257336343115124,"once":0.002257336343115124,"examining":0.002257336343115124,"important":0.002257336343115124,"first":0.002257336343115124,"includes":0.002257336343115124,"uniquely":0.002257336343115124,"identifies":0.002257336343115124,"0x98195af8f888d2f9ca3462c41c1691e7798ea6d9e5e3afe42955c0921f981f2c":0.002257336343115124,"focus":0.002257336343115124,"it's":0.002257336343115124,"crucial":0.002257336343115124,"determine":0.002257336343115124,"success":0.002257336343115124,"state":0.002257336343115124,"captures":0.002257336343115124,"reports":0.002257336343115124,"regardless":0.002257336343115124,"their":0.002257336343115124,"outcome":0.002257336343115124,"utilize":0.002257336343115124,"assess":0.002257336343115124,"extract":0.002257336343115124,"sender":0.002257336343115124,"result":0.002257336343115124,"moving":0.002257336343115124,"forward":0.002257336343115124,"kind":0.002257336343115124,"information":0.002257336343115124,"specifies":0.002257336343115124,"resides":0.002257336343115124,"args":0.002257336343115124,"lists":0.002257336343115124,"arguments":0.002257336343115124,"passed":0.002257336343115124,"invoking":0.002257336343115124,"case":0.002257336343115124,"accepts":0.002257336343115124,"no":0.002257336343115124,"resulting":0.002257336343115124,"empty":0.002257336343115124,"object's":0.002257336343115124,"receipt":0.002257336343115124,"holds":0.002257336343115124,"key":0.002257336343115124,"since":0.002257336343115124,"statement":0.002257336343115124,"contain":0.002257336343115124,"topic":0.002257336343115124,"keys":0.002257336343115124,"representing":0.002257336343115124,"output":0.002257336343115124,"contract_calls_stack":0.002257336343115124,"position":0.002257336343115124,"smartcontractevent":0.002257336343115124,"mutated_assets_radius":0.002257336343115124,"mutated_contracts_radius":0.002257336343115124,"info":0.002257336343115124,"view":0.002257336343115124,"here":0.002257336343115124,"---":0.002257336343115124,"you've":0.002257336343115124,"located":0.002257336343115124,"might":0.002257336343115124,"store":0.002257336343115124,"database":0.002257336343115124,"table":0.002257336343115124,"identifier":0.002257336343115124,"------------":0.002257336343115124,"----------":0.002257336343115124,"------------------------------------------------------------------":0.002257336343115124,"-------":0.002257336343115124,"----------------------------------------":0.002257336343115124,"-----------------------------":0.002257336343115124,"----":0.002257336343115124,"-------------------------------------------------------":0.002257336343115124,"---------":0.002257336343115124,"-------------------------------------------------------------------------------------------------------------------------------------------------------":0.002257336343115124,"cards":0.002257336343115124,"card":0.002257336343115124,"href":0.002257336343115124,"guides":0.002257336343115124,"create-chainhooks":0.002257336343115124,"description":0.002257336343115124},"378":{"1":0.005714285714285714,"154670":0.005714285714285714,"import":0.005714285714285714,"accordion":0.005714285714285714,"accordions":0.005714285714285714,"from":0.005714285714285714,"fumadocs-ui":0.005714285714285714,"components":0.005714285714285714,"steps":0.005714285714285714,"step":0.005714285714285714,"'fumadocs-ui":0.005714285714285714,"steps'":0.005714285714285714,"in":0.005714285714285714,"this":0.005714285714285714,"quickstart":0.005714285714285714,"guide":0.005714285714285714,"you":0.005714285714285714,"will":0.005714285714285714,"set":0.005714285714285714,"up":0.005714285714285714,"chainhook":0.005714285714285714,"to":0.005714285714285714,"generate":0.005714285714285714,"and":0.005714285714285714,"scan":0.005714285714285714,"predicates":0.005714285714285714,"on":0.005714285714285714,"the":0.005714285714285714,"stacks":0.005714285714285714,"blockchain":0.005714285714285714,"learn":0.005714285714285714,"how":0.005714285714285714,"run":0.005714285714285714,"basic":0.005714285714285714,"commands":0.005714285714285714,"using":0.005714285714285714,"cli":0.005714285714285714,"inspect":0.005714285714285714,"events":0.005714285714285714,"check":0.005714285714285714,"out":0.005714285714285714,"as":0.005714285714285714,"a":0.005714285714285714,"service":0.005714285714285714,"guides":0.005714285714285714,"chainhook-as-a-service":0.005714285714285714,"for":0.005714285714285714,"more":0.005714285714285714,"advanced":0.005714285714285714,"use":0.005714285714285714,"case":0.005714285714285714,"predicate":0.005714285714285714,"file":0.005714285714285714,"new":0.005714285714285714,"command":0.005714285714285714,"generates":0.005714285714285714,"template":0.005714285714285714,"that":0.005714285714285714,"can":0.005714285714285714,"help":0.005714285714285714,"your":0.005714285714285714,"own":0.005714285714285714,"terminal":0.005714285714285714,"stx-transfer":0.005714285714285714,"json":0.005714285714285714,"--stacks":0.005714285714285714,"callout":0.005714285714285714,"title":0.005714285714285714,"note":0.005714285714285714,"flag":0.005714285714285714,"is":0.005714285714285714,"required":0.005714285714285714,"allows":0.005714285714285714,"specify":0.005714285714285714,"network":0.005714285714285714,"other":0.005714285714285714,"options":0.005714285714285714,"include":0.005714285714285714,"--bitcoin":0.005714285714285714,"track":0.005714285714285714,"latest":0.005714285714285714,"stx_event":0.005714285714285714,"given":0.005714285714285714,"address":0.005714285714285714,"generated":0.005714285714285714,"contains":0.005714285714285714,"helpful":0.005714285714285714,"boilerplate":0.005714285714285714,"configuration":0.005714285714285714,"but":0.005714285714285714,"still":0.005714285714285714,"need":0.005714285714285714,"make":0.005714285714285714,"some":0.005714285714285714,"edits":0.005714285714285714,"tell":0.005714285714285714,"it":0.005714285714285714,"specific":0.005714285714285714,"stacks-related":0.005714285714285714,"transactions":0.005714285714285714,"do":0.005714285714285714,"update":0.005714285714285714,"if_this":0.005714285714285714,"construct":0.005714285714285714,"scope":0.005714285714285714,"actions":0.005714285714285714,"transfer":0.005714285714285714,"full":0.005714285714285714,"code":0.005714285714285714,"example":0.005714285714285714,"chain":0.005714285714285714,"uuid":0.005714285714285714,"87ac9bff-1052-4d02-9c79-3768a6f08a09":0.005714285714285714,"name":0.005714285714285714,"stx":0.005714285714285714,"version":0.005714285714285714,"networks":0.005714285714285714,"mainnet":0.005714285714285714,"start_block":0.005714285714285714,"contract_identifier":0.005714285714285714,"spm113ay78vcmjj0sdfj4xjxfhhq6r9kb3710x7d":0.005714285714285714,"then_that":0.005714285714285714,"file_append":0.005714285714285714,"path":0.005714285714285714,"stx-transfers":0.005714285714285714,"txt":0.005714285714285714,"available":0.005714285714285714,"mint":0.005714285714285714,"burn":0.005714285714285714,"lock":0.005714285714285714,"information":0.005714285714285714,"these":0.005714285714285714,"concepts":0.005714285714285714,"stacks-predicates":0.005714285714285714,"section":0.005714285714285714,"scanning":0.005714285714285714,"with":0.005714285714285714,"updated":0.005714285714285714,"now":0.005714285714285714,"--mainnet":0.005714285714285714,"when":0.005714285714285714,"running":0.005714285714285714,"first":0.005714285714285714,"time":0.005714285714285714,"chainstate":0.005714285714285714,"archive":0.005714285714285714,"be":0.005714285714285714,"downloaded":0.005714285714285714,"subsequent":0.005714285714285714,"scans":0.005714285714285714,"cached":0.005714285714285714,"if":0.005714285714285714,"already":0.005714285714285714,"present":0.005714285714285714,"speeding":0.005714285714285714,"iterations":0.005714285714285714,"overall":0.005714285714285714,"feedback":0.005714285714285714,"loop":0.005714285714285714,"hiro":0.005714285714285714,"click":0.005714285714285714,"here":0.005714285714285714,"---":0.005714285714285714,"next":0.005714285714285714,"cards":0.005714285714285714,"card":0.005714285714285714,"href":0.005714285714285714,"description":0.005714285714285714,"bitcoin":0.005714285714285714,"indexer":0.005714285714285714,"sync-a-stacks-node":0.005714285714285714,"sync":0.005714285714285714,"node":0.005714285714285714,"local":0.005714285714285714,"devnet":0.005714285714285714},"379":{"1":0.0035587188612099642,"2":0.0035587188612099642,"101":0.0035587188612099642,"201":0.0035587188612099642,"3000":0.0035587188612099642,"10200":0.0035587188612099642,"12345":0.0035587188612099642,"21443":0.0035587188612099642,"90232":0.0035587188612099642,"142221":0.0035587188612099642,"the":0.0035587188612099642,"core":0.0035587188612099642,"design":0.0035587188612099642,"of":0.0035587188612099642,"chainhook":0.0035587188612099642,"revolves":0.0035587188612099642,"around":0.0035587188612099642,"concept":0.0035587188612099642,"predicates":0.0035587188612099642,"each":0.0035587188612099642,"individual":0.0035587188612099642,"has":0.0035587188612099642,"a":0.0035587188612099642,"customizable":0.0035587188612099642,"predicate":0.0035587188612099642,"that":0.0035587188612099642,"specifies":0.0035587188612099642,"what":0.0035587188612099642,"bitcoin":0.0035587188612099642,"or":0.0035587188612099642,"stacks":0.0035587188612099642,"blockchain":0.0035587188612099642,"data":0.0035587188612099642,"you":0.0035587188612099642,"are":0.0035587188612099642,"scanning":0.0035587188612099642,"for":0.0035587188612099642,"callout":0.0035587188612099642,"type":0.0035587188612099642,"warn":0.0035587188612099642,"title":0.0035587188612099642,"requirements":0.0035587188612099642,"commands":0.0035587188612099642,"outlined":0.0035587188612099642,"here":0.0035587188612099642,"will":0.0035587188612099642,"require":0.0035587188612099642,"have":0.0035587188612099642,"installed":0.0035587188612099642,"directly":0.0035587188612099642,"installation":0.0035587188612099642,"first":0.0035587188612099642,"below":0.0035587188612099642,"is":0.0035587188612099642,"general":0.0035587188612099642,"strucure":0.0035587188612099642,"json":0.0035587188612099642,"with":0.0035587188612099642,"its":0.0035587188612099642,"primary":0.0035587188612099642,"elements":0.0035587188612099642,"these":0.0035587188612099642,"and":0.0035587188612099642,"their":0.0035587188612099642,"values":0.0035587188612099642,"required":0.0035587188612099642,"-":0.0035587188612099642,"evaluate":0.0035587188612099642,"against":0.0035587188612099642,"specfied":0.0035587188612099642,"specified":0.0035587188612099642,"in":0.0035587188612099642,"chain":0.0035587188612099642,"uuid":0.0035587188612099642,"be":0.0035587188612099642,"returned":0.0035587188612099642,"payload":0.0035587188612099642,"providing":0.0035587188612099642,"record":0.0035587188612099642,"triggers":0.0035587188612099642,"it":0.0035587188612099642,"identify":0.0035587188612099642,"your":0.0035587188612099642,"app":0.0035587188612099642,"using":0.0035587188612099642,"name":0.0035587188612099642,"version":0.0035587188612099642,"stx_transfer_predicate":0.0035587188612099642,"networks":0.0035587188612099642,"other":0.0035587188612099642,"configurations":0.0035587188612099642,"info":0.0035587188612099642,"note":0.0035587188612099642,"can":0.0035587188612099642,"use":0.0035587188612099642,"following":0.0035587188612099642,"command":0.0035587188612099642,"to":0.0035587188612099642,"verify":0.0035587188612099642,"check":0.0035587188612099642,"your-predicate-file":0.0035587188612099642,"--mainnet":0.0035587188612099642,"element":0.0035587188612099642,"contains":0.0035587188612099642,"an":0.0035587188612099642,"object":0.0035587188612099642,"who's":0.0035587188612099642,"key":0.0035587188612099642,"determines":0.0035587188612099642,"network":0.0035587188612099642,"want":0.0035587188612099642,"scan":0.0035587188612099642,"this":0.0035587188612099642,"object's":0.0035587188612099642,"value":0.0035587188612099642,"contain":0.0035587188612099642,"if_this":0.0035587188612099642,"then":0.0035587188612099642,"then_that":0.0035587188612099642,"specifications":0.0035587188612099642,"multple":0.0035587188612099642,"mainnet":0.0035587188612099642,"testnet":0.0035587188612099642,"additional":0.0035587188612099642,"information":0.0035587188612099642,"out":0.0035587188612099642,"scopes":0.0035587188612099642,"references":0.0035587188612099642,"pages":0.0035587188612099642,"specification":0.0035587188612099642,"identifies":0.0035587188612099642,"scope":0.0035587188612099642,"define":0.0035587188612099642,"within":0.0035587188612099642,"arguments":0.0035587188612099642,"specific":0.0035587188612099642,"also":0.0035587188612099642,"passed":0.0035587188612099642,"contract_call":0.0035587188612099642,"contract_identifier":0.0035587188612099642,"stj81c2wpqhfb6xtg518jkpabwm639r2x37vfkjv":0.0035587188612099642,"simple-vote-v0":0.0035587188612099642,"method":0.0035587188612099642,"cast-vote":0.0035587188612099642,"delivers":0.0035587188612099642,"when":0.0035587188612099642,"triggered":0.0035587188612099642,"by":0.0035587188612099642,"there":0.0035587188612099642,"options":0.0035587188612099642,"available":0.0035587188612099642,"file_append":0.0035587188612099642,"http_post":0.0035587188612099642,"choosing":0.0035587188612099642,"specify":0.0035587188612099642,"path":0.0035587188612099642,"where":0.0035587188612099642,"post":0.0035587188612099642,"tmp":0.0035587188612099642,"events":0.0035587188612099642,"endpoint's":0.0035587188612099642,"url":0.0035587188612099642,"authorization_header":0.0035587188612099642,"https":0.0035587188612099642,"webhook":0.0035587188612099642,"site":0.0035587188612099642,"abc123456-789e-0fgh-1ijk-23lmno456789":0.0035587188612099642,"requires":0.0035587188612099642,"endpoint":0.0035587188612099642,"service":0.0035587188612099642,"like":0.0035587188612099642,"localtunnel":0.0035587188612099642,"github":0.0035587188612099642,"com":0.0035587188612099642,"test":0.0035587188612099642,"locally":0.0035587188612099642,"webhooksite":0.0035587188612099642,"tabs":0.0035587188612099642,"defaultvalue":0.0035587188612099642,"tabslist":0.0035587188612099642,"tabstrigger":0.0035587188612099642,"tabscontent":0.0035587188612099642,"wrap":0.0035587188612099642,"btc":0.0035587188612099642,"ordinals_protocol":0.0035587188612099642,"operation":0.0035587188612099642,"inscription_feed":0.0035587188612099642,"http":0.0035587188612099642,"localhost":0.0035587188612099642,"api":0.0035587188612099642,"v1":0.0035587188612099642,"ordinals":0.0035587188612099642,"bearer":0.0035587188612099642,"cn389ncoiwuencr":0.0035587188612099642,"start_block":0.0035587188612099642,"my-protocol":0.0035587188612099642,"xyz":0.0035587188612099642,"accordion":0.0035587188612099642,"single":0.0035587188612099642,"collapsible":0.0035587188612099642,"classname":0.0035587188612099642,"w-full":0.0035587188612099642,"accordionitem":0.0035587188612099642,"start-block":0.0035587188612099642,"accordiontrigger":0.0035587188612099642,"ignore":0.0035587188612099642,"blocks":0.0035587188612099642,"before":0.0035587188612099642,"start":0.0035587188612099642,"block":0.0035587188612099642,"accordioncontent":0.0035587188612099642,"end-block":0.0035587188612099642,"after":0.0035587188612099642,"end":0.0035587188612099642,"end_block":0.0035587188612099642,"expire":0.0035587188612099642,"stop":0.0035587188612099642,"number":0.0035587188612099642,"occurrences":0.0035587188612099642,"expire_after_occurrence":0.0035587188612099642,"proofs":0.0035587188612099642,"exclude":0.0035587188612099642,"from":0.0035587188612099642,"include_proof":0.0035587188612099642,"false":0.0035587188612099642,"inputs":0.0035587188612099642,"transaction":0.0035587188612099642,"include_inputs":0.0035587188612099642,"outputs":0.0035587188612099642,"include_outputs":0.0035587188612099642,"witness":0.0035587188612099642,"witnesses":0.0035587188612099642,"include_witness":0.0035587188612099642,"allows":0.0035587188612099642,"generate":0.0035587188612099642,"template":0.0035587188612099642,"new":0.0035587188612099642,"your-bitcoin-predicate":0.0035587188612099642,"--bitcoin":0.0035587188612099642,"contract-call-chainhook":0.0035587188612099642,"item-1":0.0035587188612099642,"p":0.0035587188612099642,"used":0.0035587188612099642,"improve":0.0035587188612099642,"performance":0.0035587188612099642,"preventing":0.0035587188612099642,"full":0.0035587188612099642,"any":0.0035587188612099642,"given":0.0035587188612099642,"evaluating":0.0035587188612099642,"found":0.0035587188612099642,"include":0.0035587188612099642,"decoded":0.0035587188612099642,"clarity":0.0035587188612099642,"decode_clarity_values":0.0035587188612099642,"true":0.0035587188612099642,"contract":0.0035587188612099642,"abi":0.0035587188612099642,"transactions":0.0035587188612099642,"deploy":0.0035587188612099642,"contracts":0.0035587188612099642,"include_contract_abi":0.0035587188612099642,"your-stacks-predicate":0.0035587188612099642,"--stacks":0.0035587188612099642,"next":0.0035587188612099642,"steps":0.0035587188612099642,"cards":0.0035587188612099642,"card":0.0035587188612099642,"href":0.0035587188612099642,"guides":0.0035587188612099642,"observing-contract-calls":0.0035587188612099642,"observing":0.0035587188612099642,"calls":0.0035587188612099642,"description":0.0035587188612099642,"learn":0.0035587188612099642,"observe":0.0035587188612099642,"platform":0.0035587188612099642,"create-chainhooks":0.0035587188612099642,"create":0.0035587188612099642,"how":0.0035587188612099642,"hiro":0.0035587188612099642},"380":{"tabs":0.029411764705882353,"defaultvalue":0.029411764705882353,"macos":0.029411764705882353,"tabslist":0.029411764705882353,"tabstrigger":0.029411764705882353,"value":0.029411764705882353,"linux":0.029411764705882353,"windows":0.029411764705882353,"cargo":0.029411764705882353,"using":0.029411764705882353,"tabscontent":0.029411764705882353,"terminal":0.029411764705882353,"brew":0.029411764705882353,"install":0.029411764705882353,"chainhook":0.029411764705882353,"sudo":0.029411764705882353,"snap":0.029411764705882353,"winget":0.029411764705882353,"hirosystems":0.029411764705882353,"clone":0.029411764705882353,"the":0.029411764705882353,"repo":0.029411764705882353,"https":0.029411764705882353,"github":0.029411764705882353,"com":0.029411764705882353,"git":0.029411764705882353,"navigate":0.029411764705882353,"to":0.029411764705882353,"root":0.029411764705882353,"directory":0.029411764705882353,"and":0.029411764705882353,"run":0.029411764705882353,"chainhook-install":0.029411764705882353,"cd":0.029411764705882353},"381":{"595650":0.006329113924050633,"import":0.006329113924050633,"database":0.006329113924050633,"ticket":0.006329113924050633,"from":0.006329113924050633,"'lucide-react'":0.006329113924050633,"blockchain":0.006329113924050633,"bitcoinicon":0.006329113924050633,"clarinet":0.006329113924050633,"container":0.006329113924050633,"dao":0.006329113924050633,"js":0.006329113924050633,"plant":0.006329113924050633,"shapes":0.006329113924050633,"stacksicon":0.006329113924050633,"'":0.006329113924050633,"components":0.006329113924050633,"ui":0.006329113924050633,"icon'":0.006329113924050633,"secondarycard":0.006329113924050633,"smallcard":0.006329113924050633,"card'":0.006329113924050633,"div":0.006329113924050633,"classname":0.006329113924050633,"'flex":0.006329113924050633,"flex-col":0.006329113924050633,"space-y-10'":0.006329113924050633,"cards":0.006329113924050633,"icon":0.006329113924050633,"href":0.006329113924050633,"stacks":0.006329113924050633,"quickstart":0.006329113924050633,"title":0.006329113924050633,"create":0.006329113924050633,"your":0.006329113924050633,"first":0.006329113924050633,"smart":0.006329113924050633,"contract":0.006329113924050633,"description":0.006329113924050633,"build":0.006329113924050633,"a":0.006329113924050633,"simple":0.006329113924050633,"counter":0.006329113924050633,"using":0.006329113924050633,"tag":0.006329113924050633,"'clarinet'":0.006329113924050633,"clarinet-js-sdk":0.006329113924050633,"write":0.006329113924050633,"unit":0.006329113924050633,"tests":0.006329113924050633,"for":0.006329113924050633,"contracts":0.006329113924050633,"learn":0.006329113924050633,"how":0.006329113924050633,"run":0.006329113924050633,"with":0.006329113924050633,"sdk":0.006329113924050633,"'clarinet":0.006329113924050633,"sdk'":0.006329113924050633,"make":0.006329113924050633,"call":0.006329113924050633,"to":0.006329113924050633,"integrate":0.006329113924050633,"into":0.006329113924050633,"app":0.006329113924050633,"'stacks":0.006329113924050633,"js'":0.006329113924050633,"chainhook":0.006329113924050633,"stream":0.006329113924050633,"custom":0.006329113924050633,"events":0.006329113924050633,"use":0.006329113924050633,"filter":0.006329113924050633,"deployments":0.006329113924050633,"'chainhook'":0.006329113924050633,"flex-col'":0.006329113924050633,"h4":0.006329113924050633,"id":0.006329113924050633,"learn-by-example":0.006329113924050633,"text-":0.006329113924050633,"dark":0.006329113924050633,"8c877d":0.006329113924050633,"scroll-m-20":0.006329113924050633,"not-prose":0.006329113924050633,"group":0.006329113924050633,"text-sm":0.006329113924050633,"uppercase":0.006329113924050633,"by":0.006329113924050633,"example":0.006329113924050633,"---":0.006329113924050633,"guides":0.006329113924050633,"build-an-nft-marketplace":0.006329113924050633,"an":0.006329113924050633,"nft":0.006329113924050633,"marketplace":0.006329113924050633,"and":0.006329113924050633,"deploy":0.006329113924050633,"own":0.006329113924050633,"launch":0.006329113924050633,"decentralized":0.006329113924050633,"autonomous":0.006329113924050633,"organization":0.006329113924050633,"discover":0.006329113924050633,"the":0.006329113924050633,"steps":0.006329113924050633,"creating":0.006329113924050633,"no-loss-lottery":0.006329113924050633,"no-loss":0.006329113924050633,"lottery":0.006329113924050633,"pool":0.006329113924050633,"that":0.006329113924050633,"leverages":0.006329113924050633,"stacking":0.006329113924050633,"yield":0.006329113924050633,"build-a-decentralized-kickstarter":0.006329113924050633,"kickstarter":0.006329113924050633,"crowdfunding":0.006329113924050633,"enabling":0.006329113924050633,"creators":0.006329113924050633,"fund":0.006329113924050633,"their":0.006329113924050633,"projects":0.006329113924050633,"without":0.006329113924050633,"third":0.006329113924050633,"party":0.006329113924050633,"installation-guides":0.006329113924050633,"installation":0.006329113924050633,"sync-a-bitcoin-node":0.006329113924050633,"sync":0.006329113924050633,"bitcoin":0.006329113924050633,"node":0.006329113924050633,"set":0.006329113924050633,"up":0.006329113924050633,"tools":0.006329113924050633,"like":0.006329113924050633,"as":0.006329113924050633,"service":0.006329113924050633,"sync-a-stacks-node":0.006329113924050633,"or":0.006329113924050633,"spin":0.006329113924050633,"api":0.006329113924050633,"installing-docker":0.006329113924050633,"install":0.006329113924050633,"docker":0.006329113924050633,"on":0.006329113924050633,"machine":0.006329113924050633,"essential":0.006329113924050633,"running":0.006329113924050633,"local":0.006329113924050633,"development":0.006329113924050633,"callout":0.006329113924050633,"type":0.006329113924050633,"tip":0.006329113924050633,"more":0.006329113924050633,"check":0.006329113924050633,"out":0.006329113924050633,"our":0.006329113924050633,"section":0.006329113924050633},"382":{"import":0.015873015873015872,"accordion":0.015873015873015872,"accordions":0.015873015873015872,"from":0.015873015873015872,"fumadocs-ui":0.015873015873015872,"components":0.015873015873015872,"blocks":0.015873015873015872,"braces":0.015873015873015872,"circleuserround":0.015873015873015872,"'lucide-react'":0.015873015873015872,"tab":0.015873015873015872,"tabs":0.015873015873015872,"'fumadocs-ui":0.015873015873015872,"tabs'":0.015873015873015872,"the":0.015873015873015872,"stacks":0.015873015873015872,"blockchain-api-client":0.015873015873015872,"library":0.015873015873015872,"provides":0.015873015873015872,"a":0.015873015873015872,"robust":0.015873015873015872,"interface":0.015873015873015872,"for":0.015873015873015872,"interacting":0.015873015873015872,"with":0.015873015873015872,"blockchain":0.015873015873015872,"api":0.015873015873015872,"by":0.015873015873015872,"offering":0.015873015873015872,"type-safe":0.015873015873015872,"methods":0.015873015873015872,"to":0.015873015873015872,"access":0.015873015873015872,"rest":0.015873015873015872,"and":0.015873015873015872,"websocket":0.015873015873015872,"endpoints":0.015873015873015872,"client":0.015873015873015872,"includes":0.015873015873015872,"automatically":0.015873015873015872,"generated":0.015873015873015872,"http":0.015873015873015872,"comprehensive":0.015873015873015872,"schemas":0.015873015873015872,"clarity":0.015873015873015872,"smart":0.015873015873015872,"contract":0.015873015873015872,"values":0.015873015873015872,"real-time":0.015873015873015872,"data":0.015873015873015872,"streaming":0.015873015873015872,"ts":0.015873015873015872,"accountsapi":0.015873015873015872,"'":0.015873015873015872,"blockchain-api-client'":0.015873015873015872,"const":0.015873015873015872,"accounts":0.015873015873015872,"new":0.015873015873015872,"apiconfig":0.015873015873015872,"await":0.015873015873015872,"getaccounttransactions":0.015873015873015872,"principal":0.015873015873015872,"'st000000000000000000002amw42h'":0.015873015873015872},"383":{"import":0.015873015873015872,"accordion":0.015873015873015872,"accordions":0.015873015873015872,"from":0.015873015873015872,"fumadocs-ui":0.015873015873015872,"components":0.015873015873015872,"blocks":0.015873015873015872,"braces":0.015873015873015872,"circleuserround":0.015873015873015872,"'lucide-react'":0.015873015873015872,"tab":0.015873015873015872,"tabs":0.015873015873015872,"'fumadocs-ui":0.015873015873015872,"tabs'":0.015873015873015872,"the":0.015873015873015872,"stacks":0.015873015873015872,"blockchain-api-client":0.015873015873015872,"library":0.015873015873015872,"provides":0.015873015873015872,"a":0.015873015873015872,"robust":0.015873015873015872,"interface":0.015873015873015872,"for":0.015873015873015872,"interacting":0.015873015873015872,"with":0.015873015873015872,"blockchain":0.015873015873015872,"api":0.015873015873015872,"by":0.015873015873015872,"offering":0.015873015873015872,"type-safe":0.015873015873015872,"methods":0.015873015873015872,"to":0.015873015873015872,"access":0.015873015873015872,"rest":0.015873015873015872,"and":0.015873015873015872,"websocket":0.015873015873015872,"endpoints":0.015873015873015872,"client":0.015873015873015872,"includes":0.015873015873015872,"automatically":0.015873015873015872,"generated":0.015873015873015872,"http":0.015873015873015872,"comprehensive":0.015873015873015872,"schemas":0.015873015873015872,"clarity":0.015873015873015872,"smart":0.015873015873015872,"contract":0.015873015873015872,"values":0.015873015873015872,"real-time":0.015873015873015872,"data":0.015873015873015872,"streaming":0.015873015873015872,"ts":0.015873015873015872,"accountsapi":0.015873015873015872,"'":0.015873015873015872,"blockchain-api-client'":0.015873015873015872,"const":0.015873015873015872,"accounts":0.015873015873015872,"new":0.015873015873015872,"apiconfig":0.015873015873015872,"await":0.015873015873015872,"getaccounttransactions":0.015873015873015872,"principal":0.015873015873015872,"'st000000000000000000002amw42h'":0.015873015873015872},"384":{"import":0.015873015873015872,"accordion":0.015873015873015872,"accordions":0.015873015873015872,"from":0.015873015873015872,"fumadocs-ui":0.015873015873015872,"components":0.015873015873015872,"blocks":0.015873015873015872,"braces":0.015873015873015872,"circleuserround":0.015873015873015872,"'lucide-react'":0.015873015873015872,"tab":0.015873015873015872,"tabs":0.015873015873015872,"'fumadocs-ui":0.015873015873015872,"tabs'":0.015873015873015872,"the":0.015873015873015872,"stacks":0.015873015873015872,"blockchain-api-client":0.015873015873015872,"library":0.015873015873015872,"provides":0.015873015873015872,"a":0.015873015873015872,"robust":0.015873015873015872,"interface":0.015873015873015872,"for":0.015873015873015872,"interacting":0.015873015873015872,"with":0.015873015873015872,"blockchain":0.015873015873015872,"api":0.015873015873015872,"by":0.015873015873015872,"offering":0.015873015873015872,"type-safe":0.015873015873015872,"methods":0.015873015873015872,"to":0.015873015873015872,"access":0.015873015873015872,"rest":0.015873015873015872,"and":0.015873015873015872,"websocket":0.015873015873015872,"endpoints":0.015873015873015872,"client":0.015873015873015872,"includes":0.015873015873015872,"automatically":0.015873015873015872,"generated":0.015873015873015872,"http":0.015873015873015872,"comprehensive":0.015873015873015872,"schemas":0.015873015873015872,"clarity":0.015873015873015872,"smart":0.015873015873015872,"contract":0.015873015873015872,"values":0.015873015873015872,"real-time":0.015873015873015872,"data":0.015873015873015872,"streaming":0.015873015873015872,"ts":0.015873015873015872,"accountsapi":0.015873015873015872,"'":0.015873015873015872,"blockchain-api-client'":0.015873015873015872,"const":0.015873015873015872,"accounts":0.015873015873015872,"new":0.015873015873015872,"apiconfig":0.015873015873015872,"await":0.015873015873015872,"getaccounttransactions":0.015873015873015872,"principal":0.015873015873015872,"'st000000000000000000002amw42h'":0.015873015873015872},"385":{"import":0.015873015873015872,"accordion":0.015873015873015872,"accordions":0.015873015873015872,"from":0.015873015873015872,"fumadocs-ui":0.015873015873015872,"components":0.015873015873015872,"blocks":0.015873015873015872,"braces":0.015873015873015872,"circleuserround":0.015873015873015872,"'lucide-react'":0.015873015873015872,"tab":0.015873015873015872,"tabs":0.015873015873015872,"'fumadocs-ui":0.015873015873015872,"tabs'":0.015873015873015872,"the":0.015873015873015872,"stacks":0.015873015873015872,"blockchain-api-client":0.015873015873015872,"library":0.015873015873015872,"provides":0.015873015873015872,"a":0.015873015873015872,"robust":0.015873015873015872,"interface":0.015873015873015872,"for":0.015873015873015872,"interacting":0.015873015873015872,"with":0.015873015873015872,"blockchain":0.015873015873015872,"api":0.015873015873015872,"by":0.015873015873015872,"offering":0.015873015873015872,"type-safe":0.015873015873015872,"methods":0.015873015873015872,"to":0.015873015873015872,"access":0.015873015873015872,"rest":0.015873015873015872,"and":0.015873015873015872,"websocket":0.015873015873015872,"endpoints":0.015873015873015872,"client":0.015873015873015872,"includes":0.015873015873015872,"automatically":0.015873015873015872,"generated":0.015873015873015872,"http":0.015873015873015872,"comprehensive":0.015873015873015872,"schemas":0.015873015873015872,"clarity":0.015873015873015872,"smart":0.015873015873015872,"contract":0.015873015873015872,"values":0.015873015873015872,"real-time":0.015873015873015872,"data":0.015873015873015872,"streaming":0.015873015873015872,"ts":0.015873015873015872,"accountsapi":0.015873015873015872,"'":0.015873015873015872,"blockchain-api-client'":0.015873015873015872,"const":0.015873015873015872,"accounts":0.015873015873015872,"new":0.015873015873015872,"apiconfig":0.015873015873015872,"await":0.015873015873015872,"getaccounttransactions":0.015873015873015872,"principal":0.015873015873015872,"'st000000000000000000002amw42h'":0.015873015873015872},"386":{"import":0.015873015873015872,"accordion":0.015873015873015872,"accordions":0.015873015873015872,"from":0.015873015873015872,"fumadocs-ui":0.015873015873015872,"components":0.015873015873015872,"blocks":0.015873015873015872,"braces":0.015873015873015872,"circleuserround":0.015873015873015872,"'lucide-react'":0.015873015873015872,"tab":0.015873015873015872,"tabs":0.015873015873015872,"'fumadocs-ui":0.015873015873015872,"tabs'":0.015873015873015872,"the":0.015873015873015872,"stacks":0.015873015873015872,"blockchain-api-client":0.015873015873015872,"library":0.015873015873015872,"provides":0.015873015873015872,"a":0.015873015873015872,"robust":0.015873015873015872,"interface":0.015873015873015872,"for":0.015873015873015872,"interacting":0.015873015873015872,"with":0.015873015873015872,"blockchain":0.015873015873015872,"api":0.015873015873015872,"by":0.015873015873015872,"offering":0.015873015873015872,"type-safe":0.015873015873015872,"methods":0.015873015873015872,"to":0.015873015873015872,"access":0.015873015873015872,"rest":0.015873015873015872,"and":0.015873015873015872,"websocket":0.015873015873015872,"endpoints":0.015873015873015872,"client":0.015873015873015872,"includes":0.015873015873015872,"automatically":0.015873015873015872,"generated":0.015873015873015872,"http":0.015873015873015872,"comprehensive":0.015873015873015872,"schemas":0.015873015873015872,"clarity":0.015873015873015872,"smart":0.015873015873015872,"contract":0.015873015873015872,"values":0.015873015873015872,"real-time":0.015873015873015872,"data":0.015873015873015872,"streaming":0.015873015873015872,"ts":0.015873015873015872,"accountsapi":0.015873015873015872,"'":0.015873015873015872,"blockchain-api-client'":0.015873015873015872,"const":0.015873015873015872,"accounts":0.015873015873015872,"new":0.015873015873015872,"apiconfig":0.015873015873015872,"await":0.015873015873015872,"getaccounttransactions":0.015873015873015872,"principal":0.015873015873015872,"'st000000000000000000002amw42h'":0.015873015873015872},"387":{"import":0.015873015873015872,"accordion":0.015873015873015872,"accordions":0.015873015873015872,"from":0.015873015873015872,"fumadocs-ui":0.015873015873015872,"components":0.015873015873015872,"blocks":0.015873015873015872,"braces":0.015873015873015872,"circleuserround":0.015873015873015872,"'lucide-react'":0.015873015873015872,"tab":0.015873015873015872,"tabs":0.015873015873015872,"'fumadocs-ui":0.015873015873015872,"tabs'":0.015873015873015872,"the":0.015873015873015872,"stacks":0.015873015873015872,"blockchain-api-client":0.015873015873015872,"library":0.015873015873015872,"provides":0.015873015873015872,"a":0.015873015873015872,"robust":0.015873015873015872,"interface":0.015873015873015872,"for":0.015873015873015872,"interacting":0.015873015873015872,"with":0.015873015873015872,"blockchain":0.015873015873015872,"api":0.015873015873015872,"by":0.015873015873015872,"offering":0.015873015873015872,"type-safe":0.015873015873015872,"methods":0.015873015873015872,"to":0.015873015873015872,"access":0.015873015873015872,"rest":0.015873015873015872,"and":0.015873015873015872,"websocket":0.015873015873015872,"endpoints":0.015873015873015872,"client":0.015873015873015872,"includes":0.015873015873015872,"automatically":0.015873015873015872,"generated":0.015873015873015872,"http":0.015873015873015872,"comprehensive":0.015873015873015872,"schemas":0.015873015873015872,"clarity":0.015873015873015872,"smart":0.015873015873015872,"contract":0.015873015873015872,"values":0.015873015873015872,"real-time":0.015873015873015872,"data":0.015873015873015872,"streaming":0.015873015873015872,"ts":0.015873015873015872,"accountsapi":0.015873015873015872,"'":0.015873015873015872,"blockchain-api-client'":0.015873015873015872,"const":0.015873015873015872,"accounts":0.015873015873015872,"new":0.015873015873015872,"apiconfig":0.015873015873015872,"await":0.015873015873015872,"getaccounttransactions":0.015873015873015872,"principal":0.015873015873015872,"'st000000000000000000002amw42h'":0.015873015873015872},"388":{},"389":{"apipage":0.07142857142857142,"document":0.07142857142857142,"openapi":0.07142857142857142,"stacks-node-rpc-api":0.07142857142857142,"json":0.07142857142857142,"operations":0.07142857142857142,"path":0.07142857142857142,"'":0.07142857142857142,"v2":0.07142857142857142,"block_proposal'":0.07142857142857142,"method":0.07142857142857142,"'post'":0.07142857142857142,"hashead":0.07142857142857142,"false":0.07142857142857142},"390":{},"391":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"stacks-node-rpc-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"v2":0.06666666666666667,"stacker_set":0.06666666666666667,"cycle_number":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"392":{"apipage":0.07142857142857142,"document":0.07142857142857142,"openapi":0.07142857142857142,"stacks-node-rpc-api":0.07142857142857142,"json":0.07142857142857142,"operations":0.07142857142857142,"path":0.07142857142857142,"'":0.07142857142857142,"v2":0.07142857142857142,"pox'":0.07142857142857142,"method":0.07142857142857142,"'get'":0.07142857142857142,"hashead":0.07142857142857142,"false":0.07142857142857142},"393":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-node-rpc-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"v2":0.0625,"prices":0.0625,"namespaces":0.0625,"tld":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"394":{},"395":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-node-rpc-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"v2":0.0625,"prices":0.0625,"names":0.0625,"name":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"396":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"stacks-node-rpc-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"v2":0.06666666666666667,"fees":0.06666666666666667,"transaction'":0.06666666666666667,"method":0.06666666666666667,"'post'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"397":{},"398":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"stacks-node-rpc-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"v2":0.06666666666666667,"fees":0.06666666666666667,"transfer'":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"399":{"import":0.0078125,"secondarycard":0.0078125,"from":0.0078125,"'":0.0078125,"components":0.0078125,"card'":0.0078125,"the":0.0078125,"stacks":0.0078125,"node":0.0078125,"rpc":0.0078125,"api":0.0078125,"allows":0.0078125,"you":0.0078125,"to":0.0078125,"query":0.0078125,"blockchain":0.0078125,"and":0.0078125,"interact":0.0078125,"with":0.0078125,"smart":0.0078125,"contracts":0.0078125,"note":0.0078125,"this":0.0078125,"is":0.0078125,"not":0.0078125,"a":0.0078125,"hiro-maintained":0.0078125,"service":0.0078125,"generated":0.0078125,"by":0.0078125,"every":0.0078125,"self-host":0.0078125,"your":0.0078125,"own":0.0078125,"minimalist":0.0078125,"configuration":0.0078125,"for":0.0078125,"richer":0.0078125,"data":0.0078125,"set":0.0078125,"an":0.0078125,"that":0.0078125,"easier":0.0078125,"use":0.0078125,"try":0.0078125,"hiro's":0.0078125,"popular":0.0078125,"endpoints":0.0078125,"cards":0.0078125,"href":0.0078125,"rpc-api":0.0078125,"transactions":0.0078125,"broadcast-transaction":0.0078125,"title":0.0078125,"broadcast":0.0078125,"transaction":0.0078125,"description":0.0078125,"network":0.0078125,"smart-contracts":0.0078125,"read-only":0.0078125,"call":0.0078125,"public":0.0078125,"function":0.0078125,"on":0.0078125,"contract":0.0078125,"pox":0.0078125,"pox-details":0.0078125,"retrieve":0.0078125,"protocol":0.0078125,"details":0.0078125,"get":0.0078125,"proof":0.0078125,"of":0.0078125,"transfer":0.0078125,"including":0.0078125,"cycles":0.0078125,"stacking":0.0078125,"thresholds":0.0078125,"related":0.0078125,"tools":0.0078125,"-":0.0078125,"fetch":0.0078125,"token":0.0078125,"metadata":0.0078125,"token-metadata-api":0.0078125,"fungible":0.0078125,"non-fungible":0.0078125,"explorer":0.0078125,"https":0.0078125,"hiro":0.0078125,"so":0.0078125,"verify":0.0078125,"activity":0.0078125,"easy-to-use":0.0078125,"front":0.0078125,"end":0.0078125,"br":0.0078125,"callout":0.0078125,"need":0.0078125,"help":0.0078125,"building":0.0078125,"type":0.0078125,"reach":0.0078125,"out":0.0078125,"us":0.0078125,"span":0.0078125,"classname":0.0078125,"font-bold":0.0078125,"channel":0.0078125,"discord":0.0078125,"chat":0.0078125,"under":0.0078125,"developer":0.0078125,"section":0.0078125,"there's":0.0078125,"also":0.0078125,"weekly":0.0078125,"office":0.0078125,"hours":0.0078125,"www":0.0078125,"addevent":0.0078125,"com":0.0078125,"event":0.0078125,"ki22007085":0.0078125,"wednesday":0.0078125,"at":0.0078125,"1pm":0.0078125,"et":0.0078125},"400":{},"401":{"apipage":0.07142857142857142,"document":0.07142857142857142,"openapi":0.07142857142857142,"stacks-node-rpc-api":0.07142857142857142,"json":0.07142857142857142,"operations":0.07142857142857142,"path":0.07142857142857142,"'":0.07142857142857142,"v2":0.07142857142857142,"info'":0.07142857142857142,"method":0.07142857142857142,"'get'":0.07142857142857142,"hashead":0.07142857142857142,"false":0.07142857142857142},"402":{"apipage":0.07142857142857142,"document":0.07142857142857142,"openapi":0.07142857142857142,"stacks-node-rpc-api":0.07142857142857142,"json":0.07142857142857142,"operations":0.07142857142857142,"path":0.07142857142857142,"'":0.07142857142857142,"v2":0.07142857142857142,"transactions'":0.07142857142857142,"method":0.07142857142857142,"'post'":0.07142857142857142,"hashead":0.07142857142857142,"false":0.07142857142857142},"403":{},"404":{},"405":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"stacks-node-rpc-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"v2":0.06666666666666667,"accounts":0.06666666666666667,"principal":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"406":{},"407":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"stacks-node-rpc-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"v3":0.06666666666666667,"tenures":0.06666666666666667,"info'":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"408":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"stacks-node-rpc-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"v3":0.06666666666666667,"blocks":0.06666666666666667,"block_id":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"409":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"stacks-node-rpc-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"v3":0.06666666666666667,"tenures":0.06666666666666667,"block_id":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"410":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-node-rpc-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"v2":0.058823529411764705,"contracts":0.058823529411764705,"interface":0.058823529411764705,"contract_address":0.058823529411764705,"contract_name":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"411":{"apipage":0.05263157894736842,"document":0.05263157894736842,"openapi":0.05263157894736842,"stacks-node-rpc-api":0.05263157894736842,"json":0.05263157894736842,"operations":0.05263157894736842,"path":0.05263157894736842,"'":0.05263157894736842,"v2":0.05263157894736842,"traits":0.05263157894736842,"contract_address":0.05263157894736842,"contract_name":0.05263157894736842,"trait_contract_address":0.05263157894736842,"trait_contract_name":0.05263157894736842,"trait_name":0.05263157894736842,"method":0.05263157894736842,"'get'":0.05263157894736842,"hashead":0.05263157894736842,"false":0.05263157894736842},"412":{},"413":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-node-rpc-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"v2":0.058823529411764705,"map_entry":0.058823529411764705,"contract_address":0.058823529411764705,"contract_name":0.058823529411764705,"map_name":0.058823529411764705,"method":0.058823529411764705,"'post'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"414":{"apipage":0.05555555555555555,"document":0.05555555555555555,"openapi":0.05555555555555555,"stacks-node-rpc-api":0.05555555555555555,"json":0.05555555555555555,"operations":0.05555555555555555,"path":0.05555555555555555,"'":0.05555555555555555,"v2":0.05555555555555555,"contracts":0.05555555555555555,"call-read":0.05555555555555555,"contract_address":0.05555555555555555,"contract_name":0.05555555555555555,"function_name":0.05555555555555555,"method":0.05555555555555555,"'post'":0.05555555555555555,"hashead":0.05555555555555555,"false":0.05555555555555555},"415":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-node-rpc-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"v2":0.058823529411764705,"contracts":0.058823529411764705,"source":0.058823529411764705,"contract_address":0.058823529411764705,"contract_name":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"416":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"stacks-node-rpc-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"v2":0.058823529411764705,"constant_val":0.058823529411764705,"contract_address":0.058823529411764705,"contract_name":0.058823529411764705,"constant_name":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"417":{},"418":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"stacks-node-rpc-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"v2":0.0625,"burn_ops":0.0625,"burn_height":0.0625,"op_type":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"419":{"import":0.1,"contributorsguidecontent":0.1,"from":0.1,"'":0.1,"content":0.1,"_shared":0.1,"contributors-guide":0.1,"mdx'":0.1,"components":0.1,"props":0.1},"420":{"import":0.014492753623188406,"secondarycard":0.014492753623188406,"smallcard":0.014492753623188406,"from":0.014492753623188406,"'":0.014492753623188406,"components":0.014492753623188406,"card'":0.014492753623188406,"api":0.014492753623188406,"container":0.014492753623188406,"chainhook":0.014492753623188406,"bitcoinicon":0.014492753623188406,"ui":0.014492753623188406,"icon'":0.014492753623188406,"div":0.014492753623188406,"classname":0.014492753623188406,"'flex":0.014492753623188406,"flex-col":0.014492753623188406,"space-y-10'":0.014492753623188406,"cards":0.014492753623188406,"group":0.014492753623188406,"icon":0.014492753623188406,"'transition-colors":0.014492753623188406,"duration-500":0.014492753623188406,"ease-in-out":0.014492753623188406,"group-hover":0.014492753623188406,"text-primary'":0.014492753623188406,"href":0.014492753623188406,"bitcoin":0.014492753623188406,"ordinals":0.014492753623188406,"title":0.014492753623188406,"integrate":0.014492753623188406,"data":0.014492753623188406,"into":0.014492753623188406,"your":0.014492753623188406,"app":0.014492753623188406,"description":0.014492753623188406,"use":0.014492753623188406,"the":0.014492753623188406,"to":0.014492753623188406,"get":0.014492753623188406,"reliable":0.014492753623188406,"for":0.014492753623188406,"and":0.014492753623188406,"brc-20":0.014492753623188406,"tokens":0.014492753623188406,"tag":0.014492753623188406,"'ordinals":0.014492753623188406,"api'":0.014492753623188406,"indexer":0.014492753623188406,"stream":0.014492753623188406,"custom":0.014492753623188406,"blockchain":0.014492753623188406,"events":0.014492753623188406,"filter":0.014492753623188406,"contract":0.014492753623188406,"deployments":0.014492753623188406,"'bitcoin":0.014492753623188406,"indexer'":0.014492753623188406,"runes":0.014492753623188406,"'runes":0.014492753623188406,"callout":0.014492753623188406,"type":0.014492753623188406,"tip":0.014492753623188406,"more":0.014492753623188406,"check":0.014492753623188406,"out":0.014492753623188406,"our":0.014492753623188406,"guides":0.014492753623188406,"section":0.014492753623188406},"421":{"import":0.1,"ratelimitingcontent":0.1,"from":0.1,"'":0.1,"content":0.1,"_shared":0.1,"rate-limiting":0.1,"mdx'":0.1,"components":0.1,"props":0.1},"422":{"import":0.009523809523809525,"step":0.009523809523809525,"steps":0.009523809523809525,"from":0.009523809523809525,"'fumadocs-ui":0.009523809523809525,"components":0.009523809523809525,"steps'":0.009523809523809525,"runehook":0.009523809523809525,"is":0.009523809523809525,"a":0.009523809523809525,"reorg-aware":0.009523809523809525,"indexer":0.009523809523809525,"that":0.009523809523809525,"automatically":0.009523809523809525,"handles":0.009523809523809525,"chain":0.009523809523809525,"forks":0.009523809523809525,"so":0.009523809523809525,"you":0.009523809523809525,"don":0.009523809523809525,"t":0.009523809523809525,"need":0.009523809523809525,"to":0.009523809523809525,"waste":0.009523809523809525,"time":0.009523809523809525,"or":0.009523809523809525,"resources":0.009523809523809525,"reindexing":0.009523809523809525,"your":0.009523809523809525,"database":0.009523809523809525,"yourself":0.009523809523809525,"with":0.009523809523809525,"familiar":0.009523809523809525,"event-driven":0.009523809523809525,"framework":0.009523809523809525,"can":0.009523809523809525,"customize":0.009523809523809525,"what":0.009523809523809525,"rune":0.009523809523809525,"data":0.009523809523809525,"index":0.009523809523809525,"in":0.009523809523809525,"order":0.009523809523809525,"create":0.009523809523809525,"lightweight":0.009523809523809525,"databases":0.009523809523809525,"for":0.009523809523809525,"faster":0.009523809523809525,"query":0.009523809523809525,"responses":0.009523809523809525,"and":0.009523809523809525,"better":0.009523809523809525,"user":0.009523809523809525,"experience":0.009523809523809525,"event":0.009523809523809525,"streams":0.009523809523809525,"related":0.009523809523809525,"tools":0.009523809523809525,"-":0.009523809523809525,"runes":0.009523809523809525,"api":0.009523809523809525,"bitcoin":0.009523809523809525,"skip":0.009523809523809525,"the":0.009523809523809525,"infrastructure":0.009523809523809525,"setup":0.009523809523809525,"get":0.009523809523809525,"our":0.009523809523809525,"which":0.009523809523809525,"powered":0.009523809523809525,"by":0.009523809523809525,"ordinals":0.009523809523809525,"explorer":0.009523809523809525,"explore":0.009523809523809525,"inscriptions":0.009523809523809525,"brc-20":0.009523809523809525,"tokens":0.009523809523809525,"rapidly":0.009523809523809525,"---":0.009523809523809525,"_need":0.009523809523809525,"help":0.009523809523809525,"building":0.009523809523809525,"_":0.009523809523809525,"reach":0.009523809523809525,"out":0.009523809523809525,"us":0.009523809523809525,"on":0.009523809523809525,"chainhook":0.009523809523809525,"channel":0.009523809523809525,"discord":0.009523809523809525,"under":0.009523809523809525,"hiro":0.009523809523809525,"developer":0.009523809523809525,"section":0.009523809523809525,"we":0.009523809523809525,"also":0.009523809523809525,"host":0.009523809523809525,"weekly":0.009523809523809525,"office":0.009523809523809525,"hours":0.009523809523809525,"every":0.009523809523809525,"monday":0.009523809523809525,"at":0.009523809523809525,"11am":0.009523809523809525,"et":0.009523809523809525},"423":{"import":0.010638297872340425,"chevronright":0.010638297872340425,"code":0.010638297872340425,"terminal":0.010638297872340425,"from":0.010638297872340425,"'lucide-react'":0.010638297872340425,"file":0.010638297872340425,"folder":0.010638297872340425,"files":0.010638297872340425,"'fumadocs-ui":0.010638297872340425,"components":0.010638297872340425,"files'":0.010638297872340425,"step":0.010638297872340425,"steps'":0.010638297872340425,"smallcard":0.010638297872340425,"'":0.010638297872340425,"card'":0.010638297872340425,"in":0.010638297872340425,"this":0.010638297872340425,"quickstart":0.010638297872340425,"guide":0.010638297872340425,"you":0.010638297872340425,"will":0.010638297872340425,"set":0.010638297872340425,"up":0.010638297872340425,"runehook":0.010638297872340425,"to":0.010638297872340425,"explore":0.010638297872340425,"and":0.010638297872340425,"index":0.010638297872340425,"rune":0.010638297872340425,"activity":0.010638297872340425,"on":0.010638297872340425,"the":0.010638297872340425,"bitcoin":0.010638297872340425,"blockchain":0.010638297872340425,"learn":0.010638297872340425,"how":0.010638297872340425,"install":0.010638297872340425,"configure":0.010638297872340425,"run":0.010638297872340425,"basic":0.010638297872340425,"commands":0.010638297872340425,"scan":0.010638297872340425,"stream":0.010638297872340425,"inscriptions":0.010638297872340425,"transfers":0.010638297872340425,"check":0.010638297872340425,"out":0.010638297872340425,"as":0.010638297872340425,"a":0.010638297872340425,"service":0.010638297872340425,"guides":0.010638297872340425,"runehook-as-a-service":0.010638297872340425,"for":0.010638297872340425,"more":0.010638297872340425,"advanced":0.010638297872340425,"use":0.010638297872340425,"case":0.010638297872340425,"---":0.010638297872340425,"prerequisites":0.010638297872340425,"before":0.010638297872340425,"starting":0.010638297872340425,"ensure":0.010638297872340425,"have":0.010638297872340425,"installed":0.010638297872340425,"if":0.010638297872340425,"haven't":0.010638297872340425,"already":0.010638297872340425,"installation":0.010638297872340425,"next":0.010638297872340425,"steps":0.010638297872340425,"cards":0.010638297872340425,"classname":0.010638297872340425,"'sm":0.010638297872340425,"grid-cols-1'":0.010638297872340425,"icon":0.010638297872340425,"href":0.010638297872340425,"runes":0.010638297872340425,"api":0.010638297872340425,"title":0.010638297872340425,"integrate":0.010638297872340425,"data":0.010638297872340425,"into":0.010638297872340425,"your":0.010638297872340425,"app":0.010638297872340425,"description":0.010638297872340425,"get":0.010638297872340425,"reliable":0.010638297872340425,"brc-20":0.010638297872340425,"tokens":0.010638297872340425,"tag":0.010638297872340425,"'runes":0.010638297872340425,"api'":0.010638297872340425},"424":{"clone":0.05,"the":0.05,"runehook":0.05,"repository":0.05,"https":0.05,"github":0.05,"com":0.05,"hirosystems":0.05,"to":0.05,"your":0.05,"local":0.05,"machine":0.05,"and":0.05,"install":0.05,"via":0.05,"cargo":0.05,"terminal":0.05,"git":0.05,"cd":0.05,"runehook-install":0.05},"425":{"import":0.009345794392523364,"link":0.009345794392523364,"from":0.009345794392523364,"next":0.009345794392523364,"button":0.009345794392523364,"components":0.009345794392523364,"ui":0.009345794392523364,"the":0.009345794392523364,"ordinals":0.009345794392523364,"explorer":0.009345794392523364,"lets":0.009345794392523364,"you":0.009345794392523364,"explore":0.009345794392523364,"and":0.009345794392523364,"verify":0.009345794392523364,"bitcoin":0.009345794392523364,"brc-20":0.009345794392523364,"token":0.009345794392523364,"data":0.009345794392523364,"can":0.009345794392523364,"also":0.009345794392523364,"use":0.009345794392523364,"a":0.009345794392523364,"variety":0.009345794392523364,"of":0.009345794392523364,"filters":0.009345794392523364,"to":0.009345794392523364,"discover":0.009345794392523364,"inscriptions":0.009345794392523364,"we":0.009345794392523364,"maintain":0.009345794392523364,"support":0.009345794392523364,"https":0.009345794392523364,"hiro":0.009345794392523364,"so":0.009345794392523364,"as":0.009345794392523364,"service":0.009345794392523364,"for":0.009345794392523364,"community":0.009345794392523364,"but":0.009345794392523364,"run":0.009345794392523364,"your":0.009345794392523364,"own":0.009345794392523364,"instance":0.009345794392523364,"if":0.009345794392523364,"choose":0.009345794392523364,"div":0.009345794392523364,"classname":0.009345794392523364,"flex":0.009345794392523364,"gap-4":0.009345794392523364,"bg-orange-500":0.009345794392523364,"hover":0.009345794392523364,"bg-orange-600":0.009345794392523364,"href":0.009345794392523364,"target":0.009345794392523364,"_blank":0.009345794392523364,"no-underline":0.009345794392523364,"view":0.009345794392523364,"variant":0.009345794392523364,"outline":0.009345794392523364,"guides":0.009345794392523364,"build-explorer":0.009345794392523364,"set":0.009345794392523364,"up":0.009345794392523364,"related":0.009345794392523364,"tools":0.009345794392523364,"-":0.009345794392523364,"api":0.009345794392523364,"looking":0.009345794392523364,"on-chain":0.009345794392523364,"without":0.009345794392523364,"front":0.009345794392523364,"end":0.009345794392523364,"leverage":0.009345794392523364,"stacks":0.009345794392523364,"activity":0.009345794392523364,"on":0.009345794392523364,"blockchain":0.009345794392523364,"try":0.009345794392523364,"---":0.009345794392523364,"need":0.009345794392523364,"help":0.009345794392523364,"building":0.009345794392523364,"with":0.009345794392523364,"reach":0.009345794392523364,"out":0.009345794392523364,"us":0.009345794392523364,"channel":0.009345794392523364,"discord":0.009345794392523364,"under":0.009345794392523364,"developer":0.009345794392523364,"section":0.009345794392523364,"chat":0.009345794392523364,"there":0.009345794392523364,"s":0.009345794392523364,"weekly":0.009345794392523364,"office":0.009345794392523364,"hours":0.009345794392523364,"events":0.009345794392523364,"co":0.009345794392523364,"event":0.009345794392523364,"hd16484710":0.009345794392523364,"every":0.009345794392523364,"thursday":0.009345794392523364,"at":0.009345794392523364,"11am":0.009345794392523364,"et":0.009345794392523364},"426":{"after":0.025,"installing":0.025,"and":0.025,"configuring":0.025,"your":0.025,"environment":0.025,"you":0.025,"can":0.025,"run":0.025,"the":0.025,"ordinals":0.025,"explorer":0.025,"locally":0.025,"if":0.025,"wish":0.025,"by":0.025,"running":0.025,"followning":0.025,"npm":0.025,"command":0.025,"dev":0.025,"building":0.025,"for":0.025,"production":0.025,"may":0.025,"also":0.025,"build":0.025,"a":0.025,"version":0.025,"of":0.025,"to":0.025,"do":0.025,"that":0.025,"simply":0.025,"following":0.025,"callout":0.025,"default":0.025,"next":0.025,"js":0.025,"task":0.025},"427":{"the":0.00819672131147541,"runes":0.00819672131147541,"api":0.00819672131147541,"is":0.00819672131147541,"a":0.00819672131147541,"service":0.00819672131147541,"that":0.00819672131147541,"helps":0.00819672131147541,"you":0.00819672131147541,"with":0.00819672131147541,"complete":0.00819672131147541,"ingestion":0.00819672131147541,"of":0.00819672131147541,"bitcoin":0.00819672131147541,"data":0.00819672131147541,"using":0.00819672131147541,"our":0.00819672131147541,"endpoints":0.00819672131147541,"can":0.00819672131147541,"retrieve":0.00819672131147541,"metadata":0.00819672131147541,"for":0.00819672131147541,"particular":0.00819672131147541,"rune":0.00819672131147541,"trading":0.00819672131147541,"activity":0.00819672131147541,"all":0.00819672131147541,"held":0.00819672131147541,"by":0.00819672131147541,"address":0.00819672131147541,"and":0.00819672131147541,"more":0.00819672131147541,"uses":0.00819672131147541,"rest":0.00819672131147541,"cached":0.00819672131147541,"responses":0.00819672131147541,"in":0.00819672131147541,"order":0.00819672131147541,"to":0.00819672131147541,"optimize":0.00819672131147541,"performance":0.00819672131147541,"reduce":0.00819672131147541,"unnecessary":0.00819672131147541,"requests":0.00819672131147541,"reliable":0.00819672131147541,"consistent":0.00819672131147541,"one":0.00819672131147541,"request":0.00819672131147541,"away":0.00819672131147541,"popular":0.00819672131147541,"cards":0.00819672131147541,"card":0.00819672131147541,"href":0.00819672131147541,"etchings":0.00819672131147541,"get-etchings":0.00819672131147541,"title":0.00819672131147541,"fetch":0.00819672131147541,"description":0.00819672131147541,"retrieves":0.00819672131147541,"list":0.00819672131147541,"balances":0.00819672131147541,"holders":0.00819672131147541,"showcase":0.00819672131147541,"user":0.00819672131147541,"portfolios":0.00819672131147541,"activities":0.00819672131147541,"track":0.00819672131147541,"your":0.00819672131147541,"favorite":0.00819672131147541,"related":0.00819672131147541,"tools":0.00819672131147541,"-":0.00819672131147541,"runehook":0.00819672131147541,"runeshook":0.00819672131147541,"want":0.00819672131147541,"run":0.00819672131147541,"own":0.00819672131147541,"infra":0.00819672131147541,"set":0.00819672131147541,"up":0.00819672131147541,"guides":0.00819672131147541,"runehook-as-a-service":0.00819672131147541,"indexer":0.00819672131147541,"powers":0.00819672131147541,"ordinals":0.00819672131147541,"looking":0.00819672131147541,"on-chain":0.00819672131147541,"without":0.00819672131147541,"front":0.00819672131147541,"end":0.00819672131147541,"leverage":0.00819672131147541,"explorer":0.00819672131147541,"https":0.00819672131147541,"hiro":0.00819672131147541,"so":0.00819672131147541,"s":0.00819672131147541,"which":0.00819672131147541,"lets":0.00819672131147541,"rapidly":0.00819672131147541,"discover":0.00819672131147541,"inscriptions":0.00819672131147541,"verify":0.00819672131147541,"---":0.00819672131147541,"need":0.00819672131147541,"help":0.00819672131147541,"building":0.00819672131147541,"reach":0.00819672131147541,"out":0.00819672131147541,"us":0.00819672131147541,"on":0.00819672131147541,"channel":0.00819672131147541,"discord":0.00819672131147541,"or":0.00819672131147541,"join":0.00819672131147541,"at":0.00819672131147541,"weekly":0.00819672131147541,"office":0.00819672131147541,"hours":0.00819672131147541,"every":0.00819672131147541,"monday":0.00819672131147541,"11am":0.00819672131147541,"et":0.00819672131147541},"428":{},"429":{"apipage":0.07142857142857142,"document":0.07142857142857142,"openapi":0.07142857142857142,"runes-api":0.07142857142857142,"json":0.07142857142857142,"operations":0.07142857142857142,"path":0.07142857142857142,"'":0.07142857142857142,"runes":0.07142857142857142,"v1":0.07142857142857142,"method":0.07142857142857142,"'get'":0.07142857142857142,"hashead":0.07142857142857142,"false":0.07142857142857142},"430":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"runes-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"runes":0.058823529411764705,"v1":0.058823529411764705,"addresses":0.058823529411764705,"address":0.058823529411764705,"balances'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"431":{},"432":{"apipage":0.05555555555555555,"document":0.05555555555555555,"openapi":0.05555555555555555,"runes-api":0.05555555555555555,"json":0.05555555555555555,"operations":0.05555555555555555,"path":0.05555555555555555,"'":0.05555555555555555,"runes":0.05555555555555555,"v1":0.05555555555555555,"etchings":0.05555555555555555,"etching":0.05555555555555555,"holders":0.05555555555555555,"address":0.05555555555555555,"method":0.05555555555555555,"'get'":0.05555555555555555,"hashead":0.05555555555555555,"false":0.05555555555555555},"433":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"runes-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"runes":0.058823529411764705,"v1":0.058823529411764705,"etchings":0.058823529411764705,"etching":0.058823529411764705,"holders'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"434":{},"435":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"runes-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"runes":0.058823529411764705,"v1":0.058823529411764705,"transactions":0.058823529411764705,"tx_id":0.058823529411764705,"activity'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"436":{"apipage":0.05555555555555555,"document":0.05555555555555555,"openapi":0.05555555555555555,"runes-api":0.05555555555555555,"json":0.05555555555555555,"operations":0.05555555555555555,"path":0.05555555555555555,"'":0.05555555555555555,"runes":0.05555555555555555,"v1":0.05555555555555555,"etchings":0.05555555555555555,"etching":0.05555555555555555,"activity":0.05555555555555555,"address":0.05555555555555555,"method":0.05555555555555555,"'get'":0.05555555555555555,"hashead":0.05555555555555555,"false":0.05555555555555555},"437":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"runes-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"runes":0.058823529411764705,"v1":0.058823529411764705,"blocks":0.058823529411764705,"block":0.058823529411764705,"activity'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"438":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"runes-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"runes":0.058823529411764705,"v1":0.058823529411764705,"etchings":0.058823529411764705,"etching":0.058823529411764705,"activity'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"439":{"the":0.015151515151515152,"usage":0.015151515151515152,"section":0.015151515151515152,"should":0.015151515151515152,"focus":0.015151515151515152,"on":0.015151515151515152,"practical":0.015151515151515152,"hands-on":0.015151515151515152,"instructions":0.015151515151515152,"for":0.015151515151515152,"getting":0.015151515151515152,"started":0.015151515151515152,"with":0.015151515151515152,"api":0.015151515151515152,"this":0.015151515151515152,"includes":0.015151515151515152,"authentication":0.015151515151515152,"how":0.015151515151515152,"to":0.015151515151515152,"authenticate":0.015151515151515152,"e":0.015151515151515152,"g":0.015151515151515152,"keys":0.015151515151515152,"oauth":0.015151515151515152,"tokens":0.015151515151515152,"making":0.015151515151515152,"requests":0.015151515151515152,"basic":0.015151515151515152,"examples":0.015151515151515152,"of":0.015151515151515152,"including":0.015151515151515152,"request":0.015151515151515152,"format":0.015151515151515152,"essential":0.015151515151515152,"headers":0.015151515151515152,"and":0.015151515151515152,"parameters":0.015151515151515152,"handling":0.015151515151515152,"responses":0.015151515151515152,"information":0.015151515151515152,"response":0.015151515151515152,"structure":0.015151515151515152,"understanding":0.015151515151515152,"status":0.015151515151515152,"codes":0.015151515151515152,"error":0.015151515151515152,"rate":0.015151515151515152,"limits":0.015151515151515152,"if":0.015151515151515152,"applicable":0.015151515151515152,"explain":0.015151515151515152,"any":0.015151515151515152,"best":0.015151515151515152,"practices":0.015151515151515152,"avoiding":0.015151515151515152,"them":0.015151515151515152,"goal":0.015151515151515152,"is":0.015151515151515152,"equip":0.015151515151515152,"developers":0.015151515151515152,"knowledge":0.015151515151515152,"make":0.015151515151515152,"successful":0.015151515151515152,"calls":0.015151515151515152,"handle":0.015151515151515152,"effectively":0.015151515151515152},"440":{},"441":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"runes-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"runes":0.06666666666666667,"v1":0.06666666666666667,"etchings'":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"442":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"runes-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"runes":0.0625,"v1":0.0625,"etchings":0.0625,"etching":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"443":{"import":0.009345794392523364,"link":0.009345794392523364,"from":0.009345794392523364,"next":0.009345794392523364,"button":0.009345794392523364,"components":0.009345794392523364,"ui":0.009345794392523364,"the":0.009345794392523364,"ordinals":0.009345794392523364,"explorer":0.009345794392523364,"lets":0.009345794392523364,"you":0.009345794392523364,"explore":0.009345794392523364,"and":0.009345794392523364,"verify":0.009345794392523364,"bitcoin":0.009345794392523364,"brc-20":0.009345794392523364,"token":0.009345794392523364,"data":0.009345794392523364,"can":0.009345794392523364,"also":0.009345794392523364,"use":0.009345794392523364,"a":0.009345794392523364,"variety":0.009345794392523364,"of":0.009345794392523364,"filters":0.009345794392523364,"to":0.009345794392523364,"discover":0.009345794392523364,"inscriptions":0.009345794392523364,"we":0.009345794392523364,"maintain":0.009345794392523364,"support":0.009345794392523364,"https":0.009345794392523364,"hiro":0.009345794392523364,"so":0.009345794392523364,"as":0.009345794392523364,"service":0.009345794392523364,"for":0.009345794392523364,"community":0.009345794392523364,"but":0.009345794392523364,"run":0.009345794392523364,"your":0.009345794392523364,"own":0.009345794392523364,"instance":0.009345794392523364,"if":0.009345794392523364,"choose":0.009345794392523364,"div":0.009345794392523364,"classname":0.009345794392523364,"flex":0.009345794392523364,"gap-4":0.009345794392523364,"bg-orange-500":0.009345794392523364,"hover":0.009345794392523364,"bg-orange-600":0.009345794392523364,"href":0.009345794392523364,"target":0.009345794392523364,"_blank":0.009345794392523364,"no-underline":0.009345794392523364,"view":0.009345794392523364,"variant":0.009345794392523364,"outline":0.009345794392523364,"guides":0.009345794392523364,"build-explorer":0.009345794392523364,"set":0.009345794392523364,"up":0.009345794392523364,"related":0.009345794392523364,"tools":0.009345794392523364,"-":0.009345794392523364,"api":0.009345794392523364,"looking":0.009345794392523364,"on-chain":0.009345794392523364,"without":0.009345794392523364,"front":0.009345794392523364,"end":0.009345794392523364,"leverage":0.009345794392523364,"stacks":0.009345794392523364,"activity":0.009345794392523364,"on":0.009345794392523364,"blockchain":0.009345794392523364,"try":0.009345794392523364,"---":0.009345794392523364,"need":0.009345794392523364,"help":0.009345794392523364,"building":0.009345794392523364,"with":0.009345794392523364,"reach":0.009345794392523364,"out":0.009345794392523364,"us":0.009345794392523364,"channel":0.009345794392523364,"discord":0.009345794392523364,"under":0.009345794392523364,"developer":0.009345794392523364,"section":0.009345794392523364,"chat":0.009345794392523364,"there":0.009345794392523364,"s":0.009345794392523364,"weekly":0.009345794392523364,"office":0.009345794392523364,"hours":0.009345794392523364,"events":0.009345794392523364,"co":0.009345794392523364,"event":0.009345794392523364,"hd16484710":0.009345794392523364,"every":0.009345794392523364,"thursday":0.009345794392523364,"at":0.009345794392523364,"11am":0.009345794392523364,"et":0.009345794392523364},"444":{"after":0.022727272727272728,"installing":0.022727272727272728,"and":0.022727272727272728,"configuring":0.022727272727272728,"your":0.022727272727272728,"environment":0.022727272727272728,"you":0.022727272727272728,"can":0.022727272727272728,"run":0.022727272727272728,"the":0.022727272727272728,"ordinals":0.022727272727272728,"explorer":0.022727272727272728,"locally":0.022727272727272728,"if":0.022727272727272728,"wish":0.022727272727272728,"by":0.022727272727272728,"running":0.022727272727272728,"followning":0.022727272727272728,"npm":0.022727272727272728,"command":0.022727272727272728,"dev":0.022727272727272728,"building":0.022727272727272728,"for":0.022727272727272728,"production":0.022727272727272728,"may":0.022727272727272728,"also":0.022727272727272728,"build":0.022727272727272728,"a":0.022727272727272728,"version":0.022727272727272728,"of":0.022727272727272728,"to":0.022727272727272728,"do":0.022727272727272728,"that":0.022727272727272728,"simply":0.022727272727272728,"following":0.022727272727272728,"callout":0.022727272727272728,"title":0.022727272727272728,"note":0.022727272727272728,"type":0.022727272727272728,"info":0.022727272727272728,"default":0.022727272727272728,"next":0.022727272727272728,"js":0.022727272727272728,"task":0.022727272727272728},"445":{},"446":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"ordinals-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"ordinals":0.0625,"v1":0.0625,"stats":0.0625,"inscriptions'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"447":{"apipage":0.05555555555555555,"document":0.05555555555555555,"openapi":0.05555555555555555,"ordinals-api":0.05555555555555555,"json":0.05555555555555555,"operations":0.05555555555555555,"path":0.05555555555555555,"'":0.05555555555555555,"ordinals":0.05555555555555555,"v1":0.05555555555555555,"brc-20":0.05555555555555555,"tokens":0.05555555555555555,"ticker":0.05555555555555555,"holders'":0.05555555555555555,"method":0.05555555555555555,"'get'":0.05555555555555555,"hashead":0.05555555555555555,"false":0.05555555555555555},"448":{},"449":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"ordinals-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"ordinals":0.058823529411764705,"v1":0.058823529411764705,"brc-20":0.058823529411764705,"balances":0.058823529411764705,"address":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"450":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"ordinals-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"ordinals":0.058823529411764705,"v1":0.058823529411764705,"brc-20":0.058823529411764705,"tokens":0.058823529411764705,"ticker":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"451":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"ordinals-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"ordinals":0.0625,"v1":0.0625,"brc-20":0.0625,"tokens'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"452":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"ordinals-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"ordinals":0.0625,"v1":0.0625,"brc-20":0.0625,"activity'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"453":{},"454":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"ordinals-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"ordinals":0.058823529411764705,"v1":0.058823529411764705,"inscriptions":0.058823529411764705,"id":0.058823529411764705,"transfers'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"455":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"ordinals-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"ordinals":0.06666666666666667,"v1":0.06666666666666667,"inscriptions'":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"456":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"ordinals-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"ordinals":0.058823529411764705,"v1":0.058823529411764705,"inscriptions":0.058823529411764705,"id":0.058823529411764705,"content'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"457":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"ordinals-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"ordinals":0.0625,"v1":0.0625,"inscriptions":0.0625,"transfers'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"458":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"ordinals-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"ordinals":0.0625,"v1":0.0625,"inscriptions":0.0625,"id":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"459":{"import":0.006666666666666667,"secondarycard":0.006666666666666667,"from":0.006666666666666667,"'":0.006666666666666667,"components":0.006666666666666667,"card'":0.006666666666666667,"the":0.006666666666666667,"ordinals":0.006666666666666667,"api":0.006666666666666667,"is":0.006666666666666667,"a":0.006666666666666667,"service":0.006666666666666667,"that":0.006666666666666667,"helps":0.006666666666666667,"you":0.006666666666666667,"with":0.006666666666666667,"complete":0.006666666666666667,"ingestion":0.006666666666666667,"of":0.006666666666666667,"inscription":0.006666666666666667,"data":0.006666666666666667,"using":0.006666666666666667,"our":0.006666666666666667,"endpoints":0.006666666666666667,"can":0.006666666666666667,"retrieve":0.006666666666666667,"metadata":0.006666666666666667,"for":0.006666666666666667,"particular":0.006666666666666667,"trading":0.006666666666666667,"activity":0.006666666666666667,"all":0.006666666666666667,"inscriptions":0.006666666666666667,"held":0.006666666666666667,"by":0.006666666666666667,"address":0.006666666666666667,"and":0.006666666666666667,"more":0.006666666666666667,"uses":0.006666666666666667,"rest":0.006666666666666667,"cached":0.006666666666666667,"responses":0.006666666666666667,"in":0.006666666666666667,"order":0.006666666666666667,"to":0.006666666666666667,"optimize":0.006666666666666667,"performance":0.006666666666666667,"reduce":0.006666666666666667,"unnecessary":0.006666666666666667,"requests":0.006666666666666667,"start":0.006666666666666667,"integrating":0.006666666666666667,"brc-20":0.006666666666666667,"tokens":0.006666666666666667,"into":0.006666666666666667,"your":0.006666666666666667,"app":0.006666666666666667,"one":0.006666666666666667,"most":0.006666666666666667,"reliable":0.006666666666666667,"apis":0.006666666666666667,"on":0.006666666666666667,"market":0.006666666666666667,"today":0.006666666666666667,"popular":0.006666666666666667,"cards":0.006666666666666667,"href":0.006666666666666667,"bitcoin":0.006666666666666667,"get-inscription-content":0.006666666666666667,"title":0.006666666666666667,"fetch":0.006666666666666667,"content":0.006666666666666667,"description":0.006666666666666667,"related":0.006666666666666667,"individual":0.006666666666666667,"brc20":0.006666666666666667,"get-brc20-tokens":0.006666666666666667,"integrate":0.006666666666666667,"get-inscriptions":0.006666666666666667,"showcase":0.006666666666666667,"user":0.006666666666666667,"portfolios":0.006666666666666667,"get":0.006666666666666667,"addresses":0.006666666666666667,"satoshis":0.006666666666666667,"get-satoshi":0.006666666666666667,"specific":0.006666666666666667,"satoshi":0.006666666666666667,"get-transfers-per-block":0.006666666666666667,"graph":0.006666666666666667,"marketplace":0.006666666666666667,"pull":0.006666666666666667,"transfers":0.006666666666666667,"block":0.006666666666666667,"tools":0.006666666666666667,"-":0.006666666666666667,"indexer":0.006666666666666667,"want":0.006666666666666667,"run":0.006666666666666667,"own":0.006666666666666667,"infra":0.006666666666666667,"set":0.006666666666666667,"up":0.006666666666666667,"powers":0.006666666666666667,"explorer":0.006666666666666667,"https":0.006666666666666667,"hiro":0.006666666666666667,"so":0.006666666666666667,"s":0.006666666666666667,"which":0.006666666666666667,"lets":0.006666666666666667,"rapidly":0.006666666666666667,"discover":0.006666666666666667,"verify":0.006666666666666667,"on-chain":0.006666666666666667,"br":0.006666666666666667,"callout":0.006666666666666667,"need":0.006666666666666667,"help":0.006666666666666667,"building":0.006666666666666667,"type":0.006666666666666667,"reach":0.006666666666666667,"out":0.006666666666666667,"us":0.006666666666666667,"span":0.006666666666666667,"classname":0.006666666666666667,"font-bold":0.006666666666666667,"channel":0.006666666666666667,"discord":0.006666666666666667,"stacks":0.006666666666666667,"chat":0.006666666666666667,"under":0.006666666666666667,"developer":0.006666666666666667,"section":0.006666666666666667,"there's":0.006666666666666667,"also":0.006666666666666667,"weekly":0.006666666666666667,"office":0.006666666666666667,"hours":0.006666666666666667,"www":0.006666666666666667,"addevent":0.006666666666666667,"com":0.006666666666666667,"event":0.006666666666666667,"ki22007085":0.006666666666666667,"call":0.006666666666666667,"every":0.006666666666666667,"wednesday":0.006666666666666667,"at":0.006666666666666667,"1pm":0.006666666666666667,"et":0.006666666666666667},"460":{},"461":{"apipage":0.07142857142857142,"document":0.07142857142857142,"openapi":0.07142857142857142,"ordinals-api":0.07142857142857142,"json":0.07142857142857142,"operations":0.07142857142857142,"path":0.07142857142857142,"'":0.07142857142857142,"ordinals":0.07142857142857142,"v1":0.07142857142857142,"method":0.07142857142857142,"'get'":0.07142857142857142,"hashead":0.07142857142857142,"false":0.07142857142857142},"462":{"the":0.015151515151515152,"usage":0.015151515151515152,"section":0.015151515151515152,"should":0.015151515151515152,"focus":0.015151515151515152,"on":0.015151515151515152,"practical":0.015151515151515152,"hands-on":0.015151515151515152,"instructions":0.015151515151515152,"for":0.015151515151515152,"getting":0.015151515151515152,"started":0.015151515151515152,"with":0.015151515151515152,"api":0.015151515151515152,"this":0.015151515151515152,"includes":0.015151515151515152,"authentication":0.015151515151515152,"how":0.015151515151515152,"to":0.015151515151515152,"authenticate":0.015151515151515152,"e":0.015151515151515152,"g":0.015151515151515152,"keys":0.015151515151515152,"oauth":0.015151515151515152,"tokens":0.015151515151515152,"making":0.015151515151515152,"requests":0.015151515151515152,"basic":0.015151515151515152,"examples":0.015151515151515152,"of":0.015151515151515152,"including":0.015151515151515152,"request":0.015151515151515152,"format":0.015151515151515152,"essential":0.015151515151515152,"headers":0.015151515151515152,"and":0.015151515151515152,"parameters":0.015151515151515152,"handling":0.015151515151515152,"responses":0.015151515151515152,"information":0.015151515151515152,"response":0.015151515151515152,"structure":0.015151515151515152,"understanding":0.015151515151515152,"status":0.015151515151515152,"codes":0.015151515151515152,"error":0.015151515151515152,"rate":0.015151515151515152,"limits":0.015151515151515152,"if":0.015151515151515152,"applicable":0.015151515151515152,"explain":0.015151515151515152,"any":0.015151515151515152,"best":0.015151515151515152,"practices":0.015151515151515152,"avoiding":0.015151515151515152,"them":0.015151515151515152,"goal":0.015151515151515152,"is":0.015151515151515152,"equip":0.015151515151515152,"developers":0.015151515151515152,"knowledge":0.015151515151515152,"make":0.015151515151515152,"successful":0.015151515151515152,"calls":0.015151515151515152,"handle":0.015151515151515152,"effectively":0.015151515151515152},"463":{},"464":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"ordinals-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"ordinals":0.0625,"v1":0.0625,"sats":0.0625,"ordinal":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"465":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"ordinals-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"ordinals":0.058823529411764705,"v1":0.058823529411764705,"sats":0.058823529411764705,"ordinal":0.058823529411764705,"inscriptions'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"466":{"595650":0.008064516129032258,"import":0.008064516129032258,"card":0.008064516129032258,"smallcard":0.008064516129032258,"from":0.008064516129032258,"'":0.008064516129032258,"components":0.008064516129032258,"card'":0.008064516129032258,"imagezoom":0.008064516129032258,"'fumadocs-ui":0.008064516129032258,"image-zoom'":0.008064516129032258,"pagefooter":0.008064516129032258,"footer'":0.008064516129032258,"database":0.008064516129032258,"play":0.008064516129032258,"'lucide-react'":0.008064516129032258,"api":0.008064516129032258,"backend":0.008064516129032258,"chainhook":0.008064516129032258,"newspaper":0.008064516129032258,"ordinals":0.008064516129032258,"questionicon":0.008064516129032258,"bugicon":0.008064516129032258,"pulse":0.008064516129032258,"ui":0.008064516129032258,"icon'":0.008064516129032258,"heroimage":0.008064516129032258,"public":0.008064516129032258,"bitcoin-hero":0.008064516129032258,"svg'":0.008064516129032258,"div":0.008064516129032258,"classname":0.008064516129032258,"'flex":0.008064516129032258,"flex-col":0.008064516129032258,"space-y-10'":0.008064516129032258,"space-x-6":0.008064516129032258,"items-end'":0.008064516129032258,"alt":0.008064516129032258,"banner":0.008064516129032258,"src":0.008064516129032258,"mt-0":0.008064516129032258,"mb-6":0.008064516129032258,"first-line":0.008064516129032258,"rounded-xl":0.008064516129032258,"bg-background":0.008064516129032258,"priority":0.008064516129032258,"_h2":0.008064516129032258,"mb-2":0.008064516129032258,"_p":0.008064516129032258,"mb-6'":0.008064516129032258,"build":0.008064516129032258,"with":0.008064516129032258,"bitcoin":0.008064516129032258,"find":0.008064516129032258,"all":0.008064516129032258,"the":0.008064516129032258,"guides":0.008064516129032258,"and":0.008064516129032258,"resources":0.008064516129032258,"you":0.008064516129032258,"need":0.008064516129032258,"to":0.008064516129032258,"on":0.008064516129032258,"runes":0.008064516129032258,"cards":0.008064516129032258,"'group":0.008064516129032258,"space-y-1'":0.008064516129032258,"icon":0.008064516129032258,"'transition-colors":0.008064516129032258,"duration-500":0.008064516129032258,"ease-in-out":0.008064516129032258,"group-hover":0.008064516129032258,"text-primary'":0.008064516129032258,"href":0.008064516129032258,"get-started":0.008064516129032258,"title":0.008064516129032258,"get":0.008064516129032258,"started":0.008064516129032258,"description":0.008064516129032258,"our":0.008064516129032258,"end-to-end":0.008064516129032258,"tutorials":0.008064516129032258,"quickstart":0.008064516129032258,"across":0.008064516129032258,"hiro's":0.008064516129032258,"tools":0.008064516129032258,"reference":0.008064516129032258,"explore":0.008064516129032258,"endpoints":0.008064516129032258,"for":0.008064516129032258,"interacting":0.008064516129032258,"meta-protocols":0.008064516129032258,"flex-col'":0.008064516129032258,"h4":0.008064516129032258,"id":0.008064516129032258,"explore-bitcoin":0.008064516129032258,"text-":0.008064516129032258,"dark":0.008064516129032258,"8c877d":0.008064516129032258,"scroll-m-20":0.008064516129032258,"a":0.008064516129032258,"not-prose":0.008064516129032258,"group":0.008064516129032258,"text-sm":0.008064516129032258,"uppercase":0.008064516129032258,"---":0.008064516129032258,"indexer":0.008064516129032258,"use":0.008064516129032258,"index":0.008064516129032258,"query":0.008064516129032258,"blockchain":0.008064516129032258,"data":0.008064516129032258,"fetch":0.008064516129032258,"on-chain":0.008064516129032258,"hosted":0.008064516129032258,"https":0.008064516129032258,"hiro":0.008064516129032258,"so":0.008064516129032258,"explorer":0.008064516129032258,"view":0.008064516129032258,"interact":0.008064516129032258,"protocol":0.008064516129032258,"your":0.008064516129032258,"via":0.008064516129032258},"467":{"import":0.1,"apikeyscontent":0.1,"from":0.1,"'":0.1,"content":0.1,"_shared":0.1,"api-keys":0.1,"mdx'":0.1,"components":0.1,"props":0.1},"468":{},"469":{"apipage":0.07142857142857142,"document":0.07142857142857142,"openapi":0.07142857142857142,"runes-api":0.07142857142857142,"json":0.07142857142857142,"operations":0.07142857142857142,"path":0.07142857142857142,"'":0.07142857142857142,"runes":0.07142857142857142,"v1":0.07142857142857142,"method":0.07142857142857142,"'get'":0.07142857142857142,"hashead":0.07142857142857142,"false":0.07142857142857142},"470":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"runes-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"runes":0.058823529411764705,"v1":0.058823529411764705,"addresses":0.058823529411764705,"address":0.058823529411764705,"balances'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"471":{},"472":{"apipage":0.05555555555555555,"document":0.05555555555555555,"openapi":0.05555555555555555,"runes-api":0.05555555555555555,"json":0.05555555555555555,"operations":0.05555555555555555,"path":0.05555555555555555,"'":0.05555555555555555,"runes":0.05555555555555555,"v1":0.05555555555555555,"etchings":0.05555555555555555,"etching":0.05555555555555555,"holders":0.05555555555555555,"address":0.05555555555555555,"method":0.05555555555555555,"'get'":0.05555555555555555,"hashead":0.05555555555555555,"false":0.05555555555555555},"473":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"runes-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"runes":0.058823529411764705,"v1":0.058823529411764705,"etchings":0.058823529411764705,"etching":0.058823529411764705,"holders'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"474":{},"475":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"runes-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"runes":0.058823529411764705,"v1":0.058823529411764705,"transactions":0.058823529411764705,"tx_id":0.058823529411764705,"activity'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"476":{"apipage":0.05555555555555555,"document":0.05555555555555555,"openapi":0.05555555555555555,"runes-api":0.05555555555555555,"json":0.05555555555555555,"operations":0.05555555555555555,"path":0.05555555555555555,"'":0.05555555555555555,"runes":0.05555555555555555,"v1":0.05555555555555555,"etchings":0.05555555555555555,"etching":0.05555555555555555,"activity":0.05555555555555555,"address":0.05555555555555555,"method":0.05555555555555555,"'get'":0.05555555555555555,"hashead":0.05555555555555555,"false":0.05555555555555555},"477":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"runes-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"runes":0.058823529411764705,"v1":0.058823529411764705,"blocks":0.058823529411764705,"block":0.058823529411764705,"activity'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"478":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"runes-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"runes":0.058823529411764705,"v1":0.058823529411764705,"etchings":0.058823529411764705,"etching":0.058823529411764705,"activity'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"479":{},"480":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"runes-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"runes":0.06666666666666667,"v1":0.06666666666666667,"etchings'":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"481":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"runes-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"runes":0.0625,"v1":0.0625,"etchings":0.0625,"etching":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"482":{},"483":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"ordinals-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"ordinals":0.0625,"v1":0.0625,"stats":0.0625,"inscriptions'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"484":{"apipage":0.05555555555555555,"document":0.05555555555555555,"openapi":0.05555555555555555,"ordinals-api":0.05555555555555555,"json":0.05555555555555555,"operations":0.05555555555555555,"path":0.05555555555555555,"'":0.05555555555555555,"ordinals":0.05555555555555555,"v1":0.05555555555555555,"brc-20":0.05555555555555555,"tokens":0.05555555555555555,"ticker":0.05555555555555555,"holders'":0.05555555555555555,"method":0.05555555555555555,"'get'":0.05555555555555555,"hashead":0.05555555555555555,"false":0.05555555555555555},"485":{},"486":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"ordinals-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"ordinals":0.058823529411764705,"v1":0.058823529411764705,"brc-20":0.058823529411764705,"balances":0.058823529411764705,"address":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"487":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"ordinals-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"ordinals":0.058823529411764705,"v1":0.058823529411764705,"brc-20":0.058823529411764705,"tokens":0.058823529411764705,"ticker":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"488":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"ordinals-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"ordinals":0.0625,"v1":0.0625,"brc-20":0.0625,"tokens'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"489":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"ordinals-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"ordinals":0.0625,"v1":0.0625,"brc-20":0.0625,"activity'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"490":{},"491":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"ordinals-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"ordinals":0.058823529411764705,"v1":0.058823529411764705,"inscriptions":0.058823529411764705,"id":0.058823529411764705,"transfers'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"492":{"apipage":0.06666666666666667,"document":0.06666666666666667,"openapi":0.06666666666666667,"ordinals-api":0.06666666666666667,"json":0.06666666666666667,"operations":0.06666666666666667,"path":0.06666666666666667,"'":0.06666666666666667,"ordinals":0.06666666666666667,"v1":0.06666666666666667,"inscriptions'":0.06666666666666667,"method":0.06666666666666667,"'get'":0.06666666666666667,"hashead":0.06666666666666667,"false":0.06666666666666667},"493":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"ordinals-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"ordinals":0.058823529411764705,"v1":0.058823529411764705,"inscriptions":0.058823529411764705,"id":0.058823529411764705,"content'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"494":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"ordinals-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"ordinals":0.0625,"v1":0.0625,"inscriptions":0.0625,"transfers'":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"495":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"ordinals-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"ordinals":0.0625,"v1":0.0625,"inscriptions":0.0625,"id":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"496":{},"497":{"apipage":0.07142857142857142,"document":0.07142857142857142,"openapi":0.07142857142857142,"ordinals-api":0.07142857142857142,"json":0.07142857142857142,"operations":0.07142857142857142,"path":0.07142857142857142,"'":0.07142857142857142,"ordinals":0.07142857142857142,"v1":0.07142857142857142,"method":0.07142857142857142,"'get'":0.07142857142857142,"hashead":0.07142857142857142,"false":0.07142857142857142},"498":{},"499":{"apipage":0.0625,"document":0.0625,"openapi":0.0625,"ordinals-api":0.0625,"json":0.0625,"operations":0.0625,"path":0.0625,"'":0.0625,"ordinals":0.0625,"v1":0.0625,"sats":0.0625,"ordinal":0.0625,"method":0.0625,"'get'":0.0625,"hashead":0.0625,"false":0.0625},"500":{"apipage":0.058823529411764705,"document":0.058823529411764705,"openapi":0.058823529411764705,"ordinals-api":0.058823529411764705,"json":0.058823529411764705,"operations":0.058823529411764705,"path":0.058823529411764705,"'":0.058823529411764705,"ordinals":0.058823529411764705,"v1":0.058823529411764705,"sats":0.058823529411764705,"ordinal":0.058823529411764705,"inscriptions'":0.058823529411764705,"method":0.058823529411764705,"'get'":0.058823529411764705,"hashead":0.058823529411764705,"false":0.058823529411764705},"501":{"595650":0.007246376811594203,"import":0.007246376811594203,"database":0.007246376811594203,"ticket":0.007246376811594203,"from":0.007246376811594203,"'lucide-react'":0.007246376811594203,"blockchain":0.007246376811594203,"bitcoinicon":0.007246376811594203,"clarinet":0.007246376811594203,"container":0.007246376811594203,"dao":0.007246376811594203,"js":0.007246376811594203,"plant":0.007246376811594203,"shapes":0.007246376811594203,"stacksicon":0.007246376811594203,"'":0.007246376811594203,"components":0.007246376811594203,"ui":0.007246376811594203,"icon'":0.007246376811594203,"secondarycard":0.007246376811594203,"smallcard":0.007246376811594203,"card'":0.007246376811594203,"div":0.007246376811594203,"classname":0.007246376811594203,"'flex":0.007246376811594203,"flex-col":0.007246376811594203,"space-y-10'":0.007246376811594203,"cards":0.007246376811594203,"icon":0.007246376811594203,"href":0.007246376811594203,"stacks":0.007246376811594203,"chainhook":0.007246376811594203,"quickstart":0.007246376811594203,"title":0.007246376811594203,"stream":0.007246376811594203,"custom":0.007246376811594203,"events":0.007246376811594203,"description":0.007246376811594203,"use":0.007246376811594203,"to":0.007246376811594203,"filter":0.007246376811594203,"for":0.007246376811594203,"contract":0.007246376811594203,"deployments":0.007246376811594203,"tag":0.007246376811594203,"'chainhook'":0.007246376811594203,"flex-col'":0.007246376811594203,"h4":0.007246376811594203,"id":0.007246376811594203,"learn-by-example":0.007246376811594203,"text-":0.007246376811594203,"dark":0.007246376811594203,"8c877d":0.007246376811594203,"scroll-m-20":0.007246376811594203,"a":0.007246376811594203,"not-prose":0.007246376811594203,"group":0.007246376811594203,"text-sm":0.007246376811594203,"uppercase":0.007246376811594203,"learn":0.007246376811594203,"by":0.007246376811594203,"example":0.007246376811594203,"---":0.007246376811594203,"guides":0.007246376811594203,"build-an-nft-marketplace":0.007246376811594203,"build":0.007246376811594203,"an":0.007246376811594203,"nft":0.007246376811594203,"marketplace":0.007246376811594203,"how":0.007246376811594203,"create":0.007246376811594203,"and":0.007246376811594203,"deploy":0.007246376811594203,"your":0.007246376811594203,"own":0.007246376811594203,"launch":0.007246376811594203,"decentralized":0.007246376811594203,"autonomous":0.007246376811594203,"organization":0.007246376811594203,"discover":0.007246376811594203,"the":0.007246376811594203,"steps":0.007246376811594203,"creating":0.007246376811594203,"no-loss-lottery":0.007246376811594203,"no-loss":0.007246376811594203,"lottery":0.007246376811594203,"pool":0.007246376811594203,"that":0.007246376811594203,"leverages":0.007246376811594203,"stacking":0.007246376811594203,"yield":0.007246376811594203,"build-a-decentralized-kickstarter":0.007246376811594203,"kickstarter":0.007246376811594203,"crowdfunding":0.007246376811594203,"app":0.007246376811594203,"enabling":0.007246376811594203,"creators":0.007246376811594203,"fund":0.007246376811594203,"their":0.007246376811594203,"projects":0.007246376811594203,"without":0.007246376811594203,"third":0.007246376811594203,"party":0.007246376811594203,"installation-guides":0.007246376811594203,"installation":0.007246376811594203,"sync-a-bitcoin-node":0.007246376811594203,"sync":0.007246376811594203,"bitcoin":0.007246376811594203,"node":0.007246376811594203,"set":0.007246376811594203,"up":0.007246376811594203,"run":0.007246376811594203,"tools":0.007246376811594203,"like":0.007246376811594203,"as":0.007246376811594203,"service":0.007246376811594203,"sync-a-stacks-node":0.007246376811594203,"or":0.007246376811594203,"spin":0.007246376811594203,"api":0.007246376811594203,"installing-docker":0.007246376811594203,"install":0.007246376811594203,"docker":0.007246376811594203,"on":0.007246376811594203,"machine":0.007246376811594203,"essential":0.007246376811594203,"running":0.007246376811594203,"local":0.007246376811594203,"development":0.007246376811594203,"with":0.007246376811594203,"callout":0.007246376811594203,"type":0.007246376811594203,"tip":0.007246376811594203,"more":0.007246376811594203,"check":0.007246376811594203,"out":0.007246376811594203,"our":0.007246376811594203,"section":0.007246376811594203},"502":{"17":0.006097560975609756,"4096":0.006097560975609756,"import":0.006097560975609756,"secondarycard":0.006097560975609756,"from":0.006097560975609756,"'":0.006097560975609756,"components":0.006097560975609756,"card'":0.006097560975609756,"step":0.006097560975609756,"steps":0.006097560975609756,"'fumadocs-ui":0.006097560975609756,"steps'":0.006097560975609756,"the":0.006097560975609756,"bitcoin":0.006097560975609756,"indexer":0.006097560975609756,"is":0.006097560975609756,"a":0.006097560975609756,"reorg-aware":0.006097560975609756,"that":0.006097560975609756,"automatically":0.006097560975609756,"handles":0.006097560975609756,"chain":0.006097560975609756,"forks":0.006097560975609756,"so":0.006097560975609756,"you":0.006097560975609756,"don't":0.006097560975609756,"need":0.006097560975609756,"to":0.006097560975609756,"waste":0.006097560975609756,"time":0.006097560975609756,"or":0.006097560975609756,"resources":0.006097560975609756,"reindexing":0.006097560975609756,"your":0.006097560975609756,"database":0.006097560975609756,"yourself":0.006097560975609756,"can":0.006097560975609756,"customize":0.006097560975609756,"what":0.006097560975609756,"ordinals":0.006097560975609756,"data":0.006097560975609756,"index":0.006097560975609756,"in":0.006097560975609756,"order":0.006097560975609756,"create":0.006097560975609756,"lightweight":0.006097560975609756,"databases":0.006097560975609756,"for":0.006097560975609756,"faster":0.006097560975609756,"query":0.006097560975609756,"responses":0.006097560975609756,"and":0.006097560975609756,"better":0.006097560975609756,"user":0.006097560975609756,"experience":0.006097560975609756,"installation":0.006097560975609756,"terminal":0.006097560975609756,"git":0.006097560975609756,"clone":0.006097560975609756,"https":0.006097560975609756,"github":0.006097560975609756,"com":0.006097560975609756,"hirosystems":0.006097560975609756,"bitcoin-indexer":0.006097560975609756,"cd":0.006097560975609756,"cargo":0.006097560975609756,"bitcoin-indexer-install":0.006097560975609756,"alternatively":0.006097560975609756,"use":0.006097560975609756,"docker":0.006097560975609756,"images":0.006097560975609756,"hub":0.006097560975609756,"r":0.006097560975609756,"get":0.006097560975609756,"started":0.006097560975609756,"cards":0.006097560975609756,"href":0.006097560975609756,"quickstart":0.006097560975609756,"title":0.006097560975609756,"description":0.006097560975609756,"learn":0.006097560975609756,"how":0.006097560975609756,"scan":0.006097560975609756,"activity":0.006097560975609756,"using":0.006097560975609756,"system":0.006097560975609756,"requirements":0.006097560975609756,"before":0.006097560975609756,"running":0.006097560975609756,"ensure":0.006097560975609756,"meets":0.006097560975609756,"these":0.006097560975609756,"-":0.006097560975609756,"cpu":0.006097560975609756,"multi-core":0.006097560975609756,"support":0.006097560975609756,"parallel":0.006097560975609756,"processing":0.006097560975609756,"memory":0.006097560975609756,"minimum":0.006097560975609756,"16gb":0.006097560975609756,"ram":0.006097560975609756,"storage":0.006097560975609756,"ssd":0.006097560975609756,"nvme":0.006097560975609756,"recommended":0.006097560975609756,"os":0.006097560975609756,"open":0.006097560975609756,"file":0.006097560975609756,"descriptors":0.006097560975609756,"postgres":0.006097560975609756,"version":0.006097560975609756,"related":0.006097560975609756,"tools":0.006097560975609756,"api":0.006097560975609756,"skip":0.006097560975609756,"infrastructure":0.006097560975609756,"setup":0.006097560975609756,"our":0.006097560975609756,"which":0.006097560975609756,"powered":0.006097560975609756,"by":0.006097560975609756,"explorer":0.006097560975609756,"hiro":0.006097560975609756,"explore":0.006097560975609756,"inscriptions":0.006097560975609756,"brc-20":0.006097560975609756,"tokens":0.006097560975609756,"rapidly":0.006097560975609756,"br":0.006097560975609756,"callout":0.006097560975609756,"help":0.006097560975609756,"building":0.006097560975609756,"with":0.006097560975609756,"type":0.006097560975609756,"reach":0.006097560975609756,"out":0.006097560975609756,"us":0.006097560975609756,"on":0.006097560975609756,"span":0.006097560975609756,"classname":0.006097560975609756,"font-bold":0.006097560975609756,"channel":0.006097560975609756,"discord":0.006097560975609756,"stacks":0.006097560975609756,"chat":0.006097560975609756,"under":0.006097560975609756,"developer":0.006097560975609756,"section":0.006097560975609756,"there's":0.006097560975609756,"also":0.006097560975609756,"weekly":0.006097560975609756,"office":0.006097560975609756,"hours":0.006097560975609756,"www":0.006097560975609756,"addevent":0.006097560975609756,"event":0.006097560975609756,"ki22007085":0.006097560975609756,"call":0.006097560975609756,"every":0.006097560975609756,"wednesday":0.006097560975609756,"at":0.006097560975609756,"1pm":0.006097560975609756,"et":0.006097560975609756},"503":{},"504":{"5432":0.01020408163265306,"import":0.01020408163265306,"steps":0.01020408163265306,"step":0.01020408163265306,"from":0.01020408163265306,"'fumadocs-ui":0.01020408163265306,"components":0.01020408163265306,"steps'":0.01020408163265306,"in":0.01020408163265306,"this":0.01020408163265306,"quickstart":0.01020408163265306,"guide":0.01020408163265306,"you":0.01020408163265306,"will":0.01020408163265306,"set":0.01020408163265306,"up":0.01020408163265306,"the":0.01020408163265306,"bitcoin":0.01020408163265306,"indexer":0.01020408163265306,"to":0.01020408163265306,"index":0.01020408163265306,"ordinals":0.01020408163265306,"or":0.01020408163265306,"runes":0.01020408163265306,"activity":0.01020408163265306,"on":0.01020408163265306,"blockchain":0.01020408163265306,"title":0.01020408163265306,"install":0.01020408163265306,"clone":0.01020408163265306,"repository":0.01020408163265306,"and":0.01020408163265306,"terminal":0.01020408163265306,"git":0.01020408163265306,"https":0.01020408163265306,"github":0.01020408163265306,"com":0.01020408163265306,"hirosystems":0.01020408163265306,"bitcoin-indexer":0.01020408163265306,"cd":0.01020408163265306,"cargo":0.01020408163265306,"bitcoin-indexer-install":0.01020408163265306,"configure":0.01020408163265306,"generate":0.01020408163265306,"a":0.01020408163265306,"new":0.01020408163265306,"configuration":0.01020408163265306,"file":0.01020408163265306,"config":0.01020408163265306,"your":0.01020408163265306,"postgres":0.01020408163265306,"database":0.01020408163265306,"generated":0.01020408163265306,"toml":0.01020408163265306,"db":0.01020408163265306,"metaprotocols":0.01020408163265306,"host":0.01020408163265306,"localhost":0.01020408163265306,"port":0.01020408163265306,"username":0.01020408163265306,"password":0.01020408163265306,"start":0.01020408163265306,"run":0.01020408163265306,"following":0.01020408163265306,"command":0.01020408163265306,"indexing":0.01020408163265306,"service":0.01020408163265306,"--config-path":0.01020408163265306,"path":0.01020408163265306,"for":0.01020408163265306,"use":0.01020408163265306,"callout":0.01020408163265306,"type":0.01020408163265306,"info":0.01020408163265306,"fully":0.01020408163265306,"synced":0.01020408163265306,"node":0.01020408163265306,"is":0.01020408163265306,"required":0.01020408163265306,"next":0.01020408163265306,"cards":0.01020408163265306,"card":0.01020408163265306,"href":0.01020408163265306,"explorer":0.01020408163265306,"description":0.01020408163265306,"explore":0.01020408163265306,"view":0.01020408163265306,"inscriptions":0.01020408163265306,"transfers":0.01020408163265306,"api":0.01020408163265306,"learn":0.01020408163265306,"how":0.01020408163265306,"interact":0.01020408163265306,"with":0.01020408163265306,"data":0.01020408163265306,"using":0.01020408163265306,"our":0.01020408163265306,"documentation":0.01020408163265306},"505":{"595650":0.006329113924050633,"import":0.006329113924050633,"database":0.006329113924050633,"ticket":0.006329113924050633,"from":0.006329113924050633,"'lucide-react'":0.006329113924050633,"blockchain":0.006329113924050633,"bitcoinicon":0.006329113924050633,"clarinet":0.006329113924050633,"container":0.006329113924050633,"dao":0.006329113924050633,"js":0.006329113924050633,"plant":0.006329113924050633,"shapes":0.006329113924050633,"stacksicon":0.006329113924050633,"'":0.006329113924050633,"components":0.006329113924050633,"ui":0.006329113924050633,"icon'":0.006329113924050633,"secondarycard":0.006329113924050633,"smallcard":0.006329113924050633,"card'":0.006329113924050633,"div":0.006329113924050633,"classname":0.006329113924050633,"'flex":0.006329113924050633,"flex-col":0.006329113924050633,"space-y-10'":0.006329113924050633,"cards":0.006329113924050633,"icon":0.006329113924050633,"href":0.006329113924050633,"stacks":0.006329113924050633,"quickstart":0.006329113924050633,"title":0.006329113924050633,"create":0.006329113924050633,"your":0.006329113924050633,"first":0.006329113924050633,"smart":0.006329113924050633,"contract":0.006329113924050633,"description":0.006329113924050633,"build":0.006329113924050633,"a":0.006329113924050633,"simple":0.006329113924050633,"counter":0.006329113924050633,"using":0.006329113924050633,"tag":0.006329113924050633,"'clarinet'":0.006329113924050633,"clarinet-js-sdk":0.006329113924050633,"write":0.006329113924050633,"unit":0.006329113924050633,"tests":0.006329113924050633,"for":0.006329113924050633,"contracts":0.006329113924050633,"learn":0.006329113924050633,"how":0.006329113924050633,"run":0.006329113924050633,"with":0.006329113924050633,"sdk":0.006329113924050633,"'clarinet":0.006329113924050633,"sdk'":0.006329113924050633,"make":0.006329113924050633,"call":0.006329113924050633,"to":0.006329113924050633,"integrate":0.006329113924050633,"into":0.006329113924050633,"app":0.006329113924050633,"'stacks":0.006329113924050633,"js'":0.006329113924050633,"chainhook":0.006329113924050633,"stream":0.006329113924050633,"custom":0.006329113924050633,"events":0.006329113924050633,"use":0.006329113924050633,"filter":0.006329113924050633,"deployments":0.006329113924050633,"'chainhook'":0.006329113924050633,"flex-col'":0.006329113924050633,"h4":0.006329113924050633,"id":0.006329113924050633,"learn-by-example":0.006329113924050633,"text-":0.006329113924050633,"dark":0.006329113924050633,"8c877d":0.006329113924050633,"scroll-m-20":0.006329113924050633,"not-prose":0.006329113924050633,"group":0.006329113924050633,"text-sm":0.006329113924050633,"uppercase":0.006329113924050633,"by":0.006329113924050633,"example":0.006329113924050633,"---":0.006329113924050633,"guides":0.006329113924050633,"build-an-nft-marketplace":0.006329113924050633,"an":0.006329113924050633,"nft":0.006329113924050633,"marketplace":0.006329113924050633,"and":0.006329113924050633,"deploy":0.006329113924050633,"own":0.006329113924050633,"launch":0.006329113924050633,"decentralized":0.006329113924050633,"autonomous":0.006329113924050633,"organization":0.006329113924050633,"discover":0.006329113924050633,"the":0.006329113924050633,"steps":0.006329113924050633,"creating":0.006329113924050633,"no-loss-lottery":0.006329113924050633,"no-loss":0.006329113924050633,"lottery":0.006329113924050633,"pool":0.006329113924050633,"that":0.006329113924050633,"leverages":0.006329113924050633,"stacking":0.006329113924050633,"yield":0.006329113924050633,"build-a-decentralized-kickstarter":0.006329113924050633,"kickstarter":0.006329113924050633,"crowdfunding":0.006329113924050633,"enabling":0.006329113924050633,"creators":0.006329113924050633,"fund":0.006329113924050633,"their":0.006329113924050633,"projects":0.006329113924050633,"without":0.006329113924050633,"third":0.006329113924050633,"party":0.006329113924050633,"installation-guides":0.006329113924050633,"installation":0.006329113924050633,"sync-a-bitcoin-node":0.006329113924050633,"sync":0.006329113924050633,"bitcoin":0.006329113924050633,"node":0.006329113924050633,"set":0.006329113924050633,"up":0.006329113924050633,"tools":0.006329113924050633,"like":0.006329113924050633,"as":0.006329113924050633,"service":0.006329113924050633,"sync-a-stacks-node":0.006329113924050633,"or":0.006329113924050633,"spin":0.006329113924050633,"api":0.006329113924050633,"installing-docker":0.006329113924050633,"install":0.006329113924050633,"docker":0.006329113924050633,"on":0.006329113924050633,"machine":0.006329113924050633,"essential":0.006329113924050633,"running":0.006329113924050633,"local":0.006329113924050633,"development":0.006329113924050633,"callout":0.006329113924050633,"type":0.006329113924050633,"tip":0.006329113924050633,"more":0.006329113924050633,"check":0.006329113924050633,"out":0.006329113924050633,"our":0.006329113924050633,"section":0.006329113924050633},"506":{"import":0.1,"contributorsguidecontent":0.1,"from":0.1,"'":0.1,"content":0.1,"_shared":0.1,"contributors-guide":0.1,"mdx'":0.1,"components":0.1,"props":0.1},"507":{"import":0.1,"ratelimitingcontent":0.1,"from":0.1,"'":0.1,"content":0.1,"_shared":0.1,"rate-limiting":0.1,"mdx'":0.1,"components":0.1,"props":0.1},"508":{"import":0.023255813953488372,"link":0.023255813953488372,"from":0.023255813953488372,"fumadocs-core":0.023255813953488372,"imagezoom":0.023255813953488372,"'fumadocs-ui":0.023255813953488372,"components":0.023255813953488372,"image-zoom'":0.023255813953488372,"secondarycard":0.023255813953488372,"card":0.023255813953488372,"guidesimage":0.023255813953488372,"'":0.023255813953488372,"public":0.023255813953488372,"guides":0.023255813953488372,"svg'":0.023255813953488372,"data":0.023255813953488372,"lib":0.023255813953488372,"all-guides":0.023255813953488372,"json'":0.023255813953488372,"div":0.023255813953488372,"classname":0.023255813953488372,"'flex":0.023255813953488372,"flex-col":0.023255813953488372,"space-y-10'":0.023255813953488372,"space-x-6":0.023255813953488372,"items-end'":0.023255813953488372,"alt":0.023255813953488372,"banner":0.023255813953488372,"src":0.023255813953488372,"mt-0":0.023255813953488372,"mb-6":0.023255813953488372,"first-line":0.023255813953488372,"rounded-xl":0.023255813953488372,"bg-background":0.023255813953488372,"priority":0.023255813953488372,"cards":0.023255813953488372,"map":0.023255813953488372,"guide":0.023255813953488372,"return":0.023255813953488372,"key":0.023255813953488372,"title":0.023255813953488372,"href":0.023255813953488372,"description":0.023255813953488372},"509":{"1":0.007751937984496124,"2":0.007751937984496124,"3":0.007751937984496124,"import":0.007751937984496124,"code":0.007751937984496124,"terminal":0.007751937984496124,"from":0.007751937984496124,"'lucide-react'":0.007751937984496124,"smallcard":0.007751937984496124,"'":0.007751937984496124,"components":0.007751937984496124,"card'":0.007751937984496124,"inlinecode":0.007751937984496124,"inline-code'":0.007751937984496124,"running":0.007751937984496124,"a":0.007751937984496124,"stacks":0.007751937984496124,"node":0.007751937984496124,"is":0.007751937984496124,"crucial":0.007751937984496124,"for":0.007751937984496124,"developers":0.007751937984496124,"aiming":0.007751937984496124,"to":0.007751937984496124,"interact":0.007751937984496124,"directly":0.007751937984496124,"with":0.007751937984496124,"the":0.007751937984496124,"blockchain":0.007751937984496124,"it":0.007751937984496124,"allows":0.007751937984496124,"verification":0.007751937984496124,"of":0.007751937984496124,"transactions":0.007751937984496124,"ensures":0.007751937984496124,"decentralized":0.007751937984496124,"operations":0.007751937984496124,"and":0.007751937984496124,"enhances":0.007751937984496124,"security":0.007751937984496124,"in":0.007751937984496124,"this":0.007751937984496124,"guide":0.007751937984496124,"you":0.007751937984496124,"will":0.007751937984496124,"learn":0.007751937984496124,"how":0.007751937984496124,"clone":0.007751937984496124,"docker":0.007751937984496124,"repository":0.007751937984496124,"clone-the-stacks-blockchain-docker-repository":0.007751937984496124,"start":0.007751937984496124,"service":0.007751937984496124,"start-the-service":0.007751937984496124,"monitor":0.007751937984496124,"node's":0.007751937984496124,"synchronization":0.007751937984496124,"process":0.007751937984496124,"monitor-the-nodes-synchronization-process":0.007751937984496124,"---":0.007751937984496124,"github":0.007751937984496124,"git":0.007751937984496124,"https":0.007751937984496124,"com":0.007751937984496124,"blockstack":0.007751937984496124,"stacks-blockchain-docker":0.007751937984496124,"cd":0.007751937984496124,"inside":0.007751937984496124,"directory":0.007751937984496124,"run":0.007751937984496124,"following":0.007751937984496124,"command":0.007751937984496124,"manage":0.007751937984496124,"sh":0.007751937984496124,"-n":0.007751937984496124,"network":0.007751937984496124,"-a":0.007751937984496124,"placeholder":0.007751937984496124,"used":0.007751937984496124,"below":0.007751937984496124,"can":0.007751937984496124,"be":0.007751937984496124,"replaced":0.007751937984496124,"one":0.007751937984496124,"-":0.007751937984496124,"mainnet":0.007751937984496124,"testnet":0.007751937984496124,"mocknet":0.007751937984496124,"follow":0.007751937984496124,"logs":0.007751937984496124,"networks":0.007751937984496124,"other":0.007751937984496124,"than":0.007751937984496124,"downloading":0.007751937984496124,"initial":0.007751937984496124,"headers":0.007751937984496124,"take":0.007751937984496124,"several":0.007751937984496124,"minutes":0.007751937984496124,"until":0.007751937984496124,"are":0.007751937984496124,"downloaded":0.007751937984496124,"v2":0.007751937984496124,"info":0.007751937984496124,"endpoints":0.007751937984496124,"won't":0.007751937984496124,"return":0.007751937984496124,"any":0.007751937984496124,"data":0.007751937984496124,"next":0.007751937984496124,"steps":0.007751937984496124,"cards":0.007751937984496124,"card":0.007751937984496124,"href":0.007751937984496124,"chainhook":0.007751937984496124,"guides":0.007751937984496124,"chainhook-as-a-service":0.007751937984496124,"title":0.007751937984496124,"as":0.007751937984496124,"description":0.007751937984496124,"use":0.007751937984496124,"build":0.007751937984496124,"your":0.007751937984496124,"own":0.007751937984496124,"custom":0.007751937984496124,"api":0.007751937984496124,"sync-a-bitcoin-node":0.007751937984496124,"sync":0.007751937984496124,"bitcoin":0.007751937984496124},"510":{"1":0.008547008547008548,"2":0.008547008547008548,"3":0.008547008547008548,"4":0.008547008547008548,"5":0.008547008547008548,"6":0.008547008547008548,"7":0.008547008547008548,"8":0.008547008547008548,"import":0.008547008547008548,"tab":0.008547008547008548,"tabs":0.008547008547008548,"from":0.008547008547008548,"'fumadocs-ui":0.008547008547008548,"components":0.008547008547008548,"tabs'":0.008547008547008548,"id":0.008547008547008548,"docker":0.008547008547008548,"items":0.008547008547008548,"'macos'":0.008547008547008548,"'windows'":0.008547008547008548,"value":0.008547008547008548,"macos":0.008547008547008548,"go":0.008547008547008548,"to":0.008547008547008548,"the":0.008547008547008548,"desktop":0.008547008547008548,"for":0.008547008547008548,"mac":0.008547008547008548,"https":0.008547008547008548,"www":0.008547008547008548,"com":0.008547008547008548,"products":0.008547008547008548,"docker-desktop":0.008547008547008548,"page":0.008547008547008548,"download":0.008547008547008548,"dmg":0.008547008547008548,"file":0.008547008547008548,"open":0.008547008547008548,"downloaded":0.008547008547008548,"drag":0.008547008547008548,"icon":0.008547008547008548,"applications":0.008547008547008548,"folder":0.008547008547008548,"grant":0.008547008547008548,"necessary":0.008547008547008548,"permissions":0.008547008547008548,"if":0.008547008547008548,"prompted":0.008547008547008548,"will":0.008547008547008548,"appear":0.008547008547008548,"in":0.008547008547008548,"menu":0.008547008547008548,"bar":0.008547008547008548,"indicating":0.008547008547008548,"that":0.008547008547008548,"is":0.008547008547008548,"running":0.008547008547008548,"verify":0.008547008547008548,"installation":0.008547008547008548,"run":0.008547008547008548,"--version":0.008547008547008548,"your":0.008547008547008548,"terminal":0.008547008547008548,"you":0.008547008547008548,"should":0.008547008547008548,"see":0.008547008547008548,"version":0.008547008547008548,"information":0.008547008547008548,"windows":0.008547008547008548,"executable":0.008547008547008548,"follow":0.008547008547008548,"wizard":0.008547008547008548,"steps":0.008547008547008548,"may":0.008547008547008548,"need":0.008547008547008548,"restart":0.008547008547008548,"computer":0.008547008547008548,"ensure":0.008547008547008548,"wsl":0.008547008547008548,"subsystem":0.008547008547008548,"linux":0.008547008547008548,"backend":0.008547008547008548,"checked":0.008547008547008548,"during":0.008547008547008548,"applicable":0.008547008547008548,"start":0.008547008547008548,"system":0.008547008547008548,"tray":0.008547008547008548,"callout":0.008547008547008548,"title":0.008547008547008548,"might":0.008547008547008548,"install":0.008547008547008548,"additional":0.008547008547008548,"like":0.008547008547008548,"hyper-v":0.008547008547008548,"or":0.008547008547008548,"---":0.008547008547008548,"next":0.008547008547008548,"cards":0.008547008547008548,"card":0.008547008547008548,"href":0.008547008547008548,"guides":0.008547008547008548,"sync-a-bitcoin-node":0.008547008547008548,"sync":0.008547008547008548,"a":0.008547008547008548,"bitcoin":0.008547008547008548,"node":0.008547008547008548,"description":0.008547008547008548,"learn":0.008547008547008548,"how":0.008547008547008548,"chainhook":0.008547008547008548,"as":0.008547008547008548,"service":0.008547008547008548,"sync-a-stacks-node":0.008547008547008548,"stacks":0.008547008547008548,"local":0.008547008547008548,"devnet":0.008547008547008548},"511":{"1":0.003472222222222222,"2":0.003472222222222222,"3":0.003472222222222222,"4":0.003472222222222222,"import":0.003472222222222222,"code":0.003472222222222222,"terminal":0.003472222222222222,"from":0.003472222222222222,"'lucide-react'":0.003472222222222222,"smallcard":0.003472222222222222,"'":0.003472222222222222,"components":0.003472222222222222,"card'":0.003472222222222222,"in":0.003472222222222222,"this":0.003472222222222222,"guide":0.003472222222222222,"you":0.003472222222222222,"will":0.003472222222222222,"learn":0.003472222222222222,"how":0.003472222222222222,"to":0.003472222222222222,"create":0.003472222222222222,"an":0.003472222222222222,"nft":0.003472222222222222,"marketplace":0.003472222222222222,"that":0.003472222222222222,"allows":0.003472222222222222,"users":0.003472222222222222,"list":0.003472222222222222,"nfts":0.003472222222222222,"for":0.003472222222222222,"sale":0.003472222222222222,"can":0.003472222222222222,"specify":0.003472222222222222,"the":0.003472222222222222,"following":0.003472222222222222,"details":0.003472222222222222,"their":0.003472222222222222,"listings":0.003472222222222222,"-":0.003472222222222222,"token":0.003472222222222222,"sell":0.003472222222222222,"listing":0.003472222222222222,"expiry":0.003472222222222222,"block":0.003472222222222222,"height":0.003472222222222222,"payment":0.003472222222222222,"asset":0.003472222222222222,"either":0.003472222222222222,"stx":0.003472222222222222,"or":0.003472222222222222,"a":0.003472222222222222,"sip010":0.003472222222222222,"fungible":0.003472222222222222,"price":0.003472222222222222,"chosen":0.003472222222222222,"optional":0.003472222222222222,"intended":0.003472222222222222,"taker":0.003472222222222222,"if":0.003472222222222222,"set":0.003472222222222222,"only":0.003472222222222222,"principal":0.003472222222222222,"be":0.003472222222222222,"able":0.003472222222222222,"fulfil":0.003472222222222222,"leverages":0.003472222222222222,"clarity":0.003472222222222222,"traits":0.003472222222222222,"nft-trait":0.003472222222222222,"handling":0.003472222222222222,"ft-trait":0.003472222222222222,"tokens":0.003472222222222222,"over":0.003472222222222222,"course":0.003472222222222222,"of":0.003472222222222222,"define":0.003472222222222222,"and":0.003472222222222222,"handle":0.003472222222222222,"errors":0.003472222222222222,"manage":0.003472222222222222,"whitelist":0.003472222222222222,"contracts":0.003472222222222222,"purchases":0.003472222222222222,"---":0.003472222222222222,"first":0.003472222222222222,"constants":0.003472222222222222,"various":0.003472222222222222,"may":0.003472222222222222,"occur":0.003472222222222222,"during":0.003472222222222222,"cancelling":0.003472222222222222,"fulfilling":0.003472222222222222,"transactions":0.003472222222222222,"helps":0.003472222222222222,"maintaining":0.003472222222222222,"clean":0.003472222222222222,"readable":0.003472222222222222,"define-constant":0.003472222222222222,"err_expiry_in_past":0.003472222222222222,"err":0.003472222222222222,"u1000":0.003472222222222222,"err_price_zero":0.003472222222222222,"u1001":0.003472222222222222,"err_unknown_listing":0.003472222222222222,"u2000":0.003472222222222222,"err_unauthorised":0.003472222222222222,"u2001":0.003472222222222222,"err_listing_expired":0.003472222222222222,"u2002":0.003472222222222222,"err_nft_asset_mismatch":0.003472222222222222,"u2003":0.003472222222222222,"err_payment_asset_mismatch":0.003472222222222222,"u2004":0.003472222222222222,"err_maker_taker_equal":0.003472222222222222,"u2005":0.003472222222222222,"err_unintended_taker":0.003472222222222222,"u2006":0.003472222222222222,"err_asset_contract_not_whitelisted":0.003472222222222222,"u2007":0.003472222222222222,"err_payment_contract_not_whitelisted":0.003472222222222222,"u2008":0.003472222222222222,"data":0.003472222222222222,"structures":0.003472222222222222,"map":0.003472222222222222,"structure":0.003472222222222222,"variable":0.003472222222222222,"unique":0.003472222222222222,"ids":0.003472222222222222,"define-map":0.003472222222222222,"uint":0.003472222222222222,"maker":0.003472222222222222,"token-id":0.003472222222222222,"nft-asset-contract":0.003472222222222222,"payment-asset-contract":0.003472222222222222,"used":0.003472222222222222,"each":0.003472222222222222,"define-data-var":0.003472222222222222,"listing-nonce":0.003472222222222222,"u0":0.003472222222222222,"public":0.003472222222222222,"function":0.003472222222222222,"along":0.003472222222222222,"with":0.003472222222222222,"its":0.003472222222222222,"contract":0.003472222222222222,"verifies":0.003472222222222222,"checks":0.003472222222222222,"transfers":0.003472222222222222,"ownership":0.003472222222222222,"define-public":0.003472222222222222,"list-asset":0.003472222222222222,"nft-asset":0.003472222222222222,"let":0.003472222222222222,"listing-id":0.003472222222222222,"var-get":0.003472222222222222,"verify":0.003472222222222222,"is":0.003472222222222222,"whitelisted":0.003472222222222222,"asserts":0.003472222222222222,"is-whitelisted":0.003472222222222222,"contract-of":0.003472222222222222,"not":0.003472222222222222,"expired":0.003472222222222222,"get":0.003472222222222222,"block-height":0.003472222222222222,"greater":0.003472222222222222,"than":0.003472222222222222,"zero":0.003472222222222222,"match":0.003472222222222222,"payment-asset":0.003472222222222222,"true":0.003472222222222222,"transfer":0.003472222222222222,"contract's":0.003472222222222222,"try":0.003472222222222222,"transfer-nft":0.003472222222222222,"tx-sender":0.003472222222222222,"as-contract":0.003472222222222222,"map-set":0.003472222222222222,"merge":0.003472222222222222,"increment":0.003472222222222222,"nonce":0.003472222222222222,"use":0.003472222222222222,"next":0.003472222222222222,"id":0.003472222222222222,"var-set":0.003472222222222222,"u1":0.003472222222222222,"return":0.003472222222222222,"created":0.003472222222222222,"ok":0.003472222222222222,"retrieve":0.003472222222222222,"read-only":0.003472222222222222,"by":0.003472222222222222,"define-read-only":0.003472222222222222,"get-listing":0.003472222222222222,"map-get":0.003472222222222222,"cancel":0.003472222222222222,"nft's":0.003472222222222222,"creator":0.003472222222222222,"it":0.003472222222222222,"must":0.003472222222222222,"same":0.003472222222222222,"uses":0.003472222222222222,"cancel-listing":0.003472222222222222,"unwrap":0.003472222222222222,"caller":0.003472222222222222,"cancelled":0.003472222222222222,"is-eq":0.003472222222222222,"one":0.003472222222222222,"delete":0.003472222222222222,"map-delete":0.003472222222222222,"back":0.003472222222222222,"creator's":0.003472222222222222,"requires":0.003472222222222222,"any":0.003472222222222222,"assets":0.003472222222222222,"payments":0.003472222222222222,"owner":0.003472222222222222,"store":0.003472222222222222,"check":0.003472222222222222,"whitelisted-asset-contracts":0.003472222222222222,"bool":0.003472222222222222,"asset-contract":0.003472222222222222,"default-to":0.003472222222222222,"false":0.003472222222222222,"set-whitelisted":0.003472222222222222,"begin":0.003472222222222222,"contract-owner":0.003472222222222222,"fulfill":0.003472222222222222,"purchase":0.003472222222222222,"using":0.003472222222222222,"as":0.003472222222222222,"fulfil-listing-stx":0.003472222222222222,"given":0.003472222222222222,"exists":0.003472222222222222,"purchaser":0.003472222222222222,"validate":0.003472222222222222,"fulfilled":0.003472222222222222,"assert-can-fulfil":0.003472222222222222,"none":0.003472222222222222,"stx-transfer":0.003472222222222222,"remove":0.003472222222222222,"was":0.003472222222222222,"just":0.003472222222222222,"purchased":0.003472222222222222,"sip-010":0.003472222222222222,"another":0.003472222222222222,"follows":0.003472222222222222,"standard":0.003472222222222222,"fulfil-listing-ft":0.003472222222222222,"some":0.003472222222222222,"transfer-ft":0.003472222222222222,"private":0.003472222222222222,"listing's":0.003472222222222222,"payment's":0.003472222222222222,"define-private":0.003472222222222222,"buyer":0.003472222222222222,"has":0.003472222222222222,"been":0.003472222222222222,"metadata":0.003472222222222222,"intended-taker":0.003472222222222222,"on":0.003472222222222222,"have":0.003472222222222222,"basic":0.003472222222222222,"buy":0.003472222222222222,"implementation":0.003472222222222222,"includes":0.003472222222222222,"essential":0.003472222222222222,"functionalities":0.003472222222222222,"such":0.003472222222222222,"whitelisting":0.003472222222222222,"validating":0.003472222222222222,"steps":0.003472222222222222,"cards":0.003472222222222222,"card":0.003472222222222222,"href":0.003472222222222222,"stacks":0.003472222222222222,"connect":0.003472222222222222,"guides":0.003472222222222222,"authenticate-users":0.003472222222222222,"title":0.003472222222222222,"authenticate":0.003472222222222222,"description":0.003472222222222222,"package":0.003472222222222222,"js":0.003472222222222222,"broadcast-transactions":0.003472222222222222,"broadcast":0.003472222222222222,"sign":0.003472222222222222},"512":{"import":0.1,"apikeyscontent":0.1,"from":0.1,"'":0.1,"content":0.1,"_shared":0.1,"api-keys":0.1,"mdx'":0.1,"components":0.1,"props":0.1},"513":{"1":0.003472222222222222,"2":0.003472222222222222,"3":0.003472222222222222,"4":0.003472222222222222,"import":0.003472222222222222,"code":0.003472222222222222,"terminal":0.003472222222222222,"from":0.003472222222222222,"'lucide-react'":0.003472222222222222,"smallcard":0.003472222222222222,"'":0.003472222222222222,"components":0.003472222222222222,"card'":0.003472222222222222,"in":0.003472222222222222,"this":0.003472222222222222,"guide":0.003472222222222222,"you":0.003472222222222222,"will":0.003472222222222222,"learn":0.003472222222222222,"how":0.003472222222222222,"to":0.003472222222222222,"create":0.003472222222222222,"an":0.003472222222222222,"nft":0.003472222222222222,"marketplace":0.003472222222222222,"that":0.003472222222222222,"allows":0.003472222222222222,"users":0.003472222222222222,"list":0.003472222222222222,"nfts":0.003472222222222222,"for":0.003472222222222222,"sale":0.003472222222222222,"can":0.003472222222222222,"specify":0.003472222222222222,"the":0.003472222222222222,"following":0.003472222222222222,"details":0.003472222222222222,"their":0.003472222222222222,"listings":0.003472222222222222,"-":0.003472222222222222,"token":0.003472222222222222,"sell":0.003472222222222222,"listing":0.003472222222222222,"expiry":0.003472222222222222,"block":0.003472222222222222,"height":0.003472222222222222,"payment":0.003472222222222222,"asset":0.003472222222222222,"either":0.003472222222222222,"stx":0.003472222222222222,"or":0.003472222222222222,"a":0.003472222222222222,"sip010":0.003472222222222222,"fungible":0.003472222222222222,"price":0.003472222222222222,"chosen":0.003472222222222222,"optional":0.003472222222222222,"intended":0.003472222222222222,"taker":0.003472222222222222,"if":0.003472222222222222,"set":0.003472222222222222,"only":0.003472222222222222,"principal":0.003472222222222222,"be":0.003472222222222222,"able":0.003472222222222222,"fulfil":0.003472222222222222,"leverages":0.003472222222222222,"clarity":0.003472222222222222,"traits":0.003472222222222222,"nft-trait":0.003472222222222222,"handling":0.003472222222222222,"ft-trait":0.003472222222222222,"tokens":0.003472222222222222,"over":0.003472222222222222,"course":0.003472222222222222,"of":0.003472222222222222,"define":0.003472222222222222,"and":0.003472222222222222,"handle":0.003472222222222222,"errors":0.003472222222222222,"manage":0.003472222222222222,"whitelist":0.003472222222222222,"contracts":0.003472222222222222,"purchases":0.003472222222222222,"---":0.003472222222222222,"first":0.003472222222222222,"constants":0.003472222222222222,"various":0.003472222222222222,"may":0.003472222222222222,"occur":0.003472222222222222,"during":0.003472222222222222,"cancelling":0.003472222222222222,"fulfilling":0.003472222222222222,"transactions":0.003472222222222222,"helps":0.003472222222222222,"maintaining":0.003472222222222222,"clean":0.003472222222222222,"readable":0.003472222222222222,"define-constant":0.003472222222222222,"err_expiry_in_past":0.003472222222222222,"err":0.003472222222222222,"u1000":0.003472222222222222,"err_price_zero":0.003472222222222222,"u1001":0.003472222222222222,"err_unknown_listing":0.003472222222222222,"u2000":0.003472222222222222,"err_unauthorised":0.003472222222222222,"u2001":0.003472222222222222,"err_listing_expired":0.003472222222222222,"u2002":0.003472222222222222,"err_nft_asset_mismatch":0.003472222222222222,"u2003":0.003472222222222222,"err_payment_asset_mismatch":0.003472222222222222,"u2004":0.003472222222222222,"err_maker_taker_equal":0.003472222222222222,"u2005":0.003472222222222222,"err_unintended_taker":0.003472222222222222,"u2006":0.003472222222222222,"err_asset_contract_not_whitelisted":0.003472222222222222,"u2007":0.003472222222222222,"err_payment_contract_not_whitelisted":0.003472222222222222,"u2008":0.003472222222222222,"data":0.003472222222222222,"structures":0.003472222222222222,"map":0.003472222222222222,"structure":0.003472222222222222,"variable":0.003472222222222222,"unique":0.003472222222222222,"ids":0.003472222222222222,"define-map":0.003472222222222222,"uint":0.003472222222222222,"maker":0.003472222222222222,"token-id":0.003472222222222222,"nft-asset-contract":0.003472222222222222,"payment-asset-contract":0.003472222222222222,"used":0.003472222222222222,"each":0.003472222222222222,"define-data-var":0.003472222222222222,"listing-nonce":0.003472222222222222,"u0":0.003472222222222222,"public":0.003472222222222222,"function":0.003472222222222222,"along":0.003472222222222222,"with":0.003472222222222222,"its":0.003472222222222222,"contract":0.003472222222222222,"verifies":0.003472222222222222,"checks":0.003472222222222222,"transfers":0.003472222222222222,"ownership":0.003472222222222222,"define-public":0.003472222222222222,"list-asset":0.003472222222222222,"nft-asset":0.003472222222222222,"let":0.003472222222222222,"listing-id":0.003472222222222222,"var-get":0.003472222222222222,"verify":0.003472222222222222,"is":0.003472222222222222,"whitelisted":0.003472222222222222,"asserts":0.003472222222222222,"is-whitelisted":0.003472222222222222,"contract-of":0.003472222222222222,"not":0.003472222222222222,"expired":0.003472222222222222,"get":0.003472222222222222,"block-height":0.003472222222222222,"greater":0.003472222222222222,"than":0.003472222222222222,"zero":0.003472222222222222,"match":0.003472222222222222,"payment-asset":0.003472222222222222,"true":0.003472222222222222,"transfer":0.003472222222222222,"contract's":0.003472222222222222,"try":0.003472222222222222,"transfer-nft":0.003472222222222222,"tx-sender":0.003472222222222222,"as-contract":0.003472222222222222,"map-set":0.003472222222222222,"merge":0.003472222222222222,"increment":0.003472222222222222,"nonce":0.003472222222222222,"use":0.003472222222222222,"next":0.003472222222222222,"id":0.003472222222222222,"var-set":0.003472222222222222,"u1":0.003472222222222222,"return":0.003472222222222222,"created":0.003472222222222222,"ok":0.003472222222222222,"retrieve":0.003472222222222222,"read-only":0.003472222222222222,"by":0.003472222222222222,"define-read-only":0.003472222222222222,"get-listing":0.003472222222222222,"map-get":0.003472222222222222,"cancel":0.003472222222222222,"nft's":0.003472222222222222,"creator":0.003472222222222222,"it":0.003472222222222222,"must":0.003472222222222222,"same":0.003472222222222222,"uses":0.003472222222222222,"cancel-listing":0.003472222222222222,"unwrap":0.003472222222222222,"caller":0.003472222222222222,"cancelled":0.003472222222222222,"is-eq":0.003472222222222222,"one":0.003472222222222222,"delete":0.003472222222222222,"map-delete":0.003472222222222222,"back":0.003472222222222222,"creator's":0.003472222222222222,"requires":0.003472222222222222,"any":0.003472222222222222,"assets":0.003472222222222222,"payments":0.003472222222222222,"owner":0.003472222222222222,"store":0.003472222222222222,"check":0.003472222222222222,"whitelisted-asset-contracts":0.003472222222222222,"bool":0.003472222222222222,"asset-contract":0.003472222222222222,"default-to":0.003472222222222222,"false":0.003472222222222222,"set-whitelisted":0.003472222222222222,"begin":0.003472222222222222,"contract-owner":0.003472222222222222,"fulfill":0.003472222222222222,"purchase":0.003472222222222222,"using":0.003472222222222222,"as":0.003472222222222222,"fulfil-listing-stx":0.003472222222222222,"given":0.003472222222222222,"exists":0.003472222222222222,"purchaser":0.003472222222222222,"validate":0.003472222222222222,"fulfilled":0.003472222222222222,"assert-can-fulfil":0.003472222222222222,"none":0.003472222222222222,"stx-transfer":0.003472222222222222,"remove":0.003472222222222222,"was":0.003472222222222222,"just":0.003472222222222222,"purchased":0.003472222222222222,"sip-010":0.003472222222222222,"another":0.003472222222222222,"follows":0.003472222222222222,"standard":0.003472222222222222,"fulfil-listing-ft":0.003472222222222222,"some":0.003472222222222222,"transfer-ft":0.003472222222222222,"private":0.003472222222222222,"listing's":0.003472222222222222,"payment's":0.003472222222222222,"define-private":0.003472222222222222,"buyer":0.003472222222222222,"has":0.003472222222222222,"been":0.003472222222222222,"metadata":0.003472222222222222,"intended-taker":0.003472222222222222,"on":0.003472222222222222,"have":0.003472222222222222,"basic":0.003472222222222222,"buy":0.003472222222222222,"implementation":0.003472222222222222,"includes":0.003472222222222222,"essential":0.003472222222222222,"functionalities":0.003472222222222222,"such":0.003472222222222222,"whitelisting":0.003472222222222222,"validating":0.003472222222222222,"steps":0.003472222222222222,"cards":0.003472222222222222,"card":0.003472222222222222,"href":0.003472222222222222,"stacks":0.003472222222222222,"connect":0.003472222222222222,"guides":0.003472222222222222,"authenticate-users":0.003472222222222222,"title":0.003472222222222222,"authenticate":0.003472222222222222,"description":0.003472222222222222,"package":0.003472222222222222,"js":0.003472222222222222,"broadcast-transactions":0.003472222222222222,"broadcast":0.003472222222222222,"sign":0.003472222222222222},"514":{"22":0.008849557522123894,"3999":0.008849557522123894,"some":0.008849557522123894,"endpoints":0.008849557522123894,"like":0.008849557522123894,"the":0.008849557522123894,"read-only":0.008849557522123894,"function":0.008849557522123894,"contract":0.008849557522123894,"call":0.008849557522123894,"https":0.008849557522123894,"docs":0.008849557522123894,"hiro":0.008849557522123894,"so":0.008849557522123894,"api":0.008849557522123894,"operation":0.008849557522123894,"call_read_only_function":0.008849557522123894,"require":0.008849557522123894,"input":0.008849557522123894,"to":0.008849557522123894,"a":0.008849557522123894,"serialized":0.008849557522123894,"clarity":0.008849557522123894,"value":0.008849557522123894,"stacks":0.008849557522123894,"co":0.008849557522123894,"other":0.008849557522123894,"return":0.008849557522123894,"values":0.008849557522123894,"that":0.008849557522123894,"need":0.008849557522123894,"be":0.008849557522123894,"deserialized":0.008849557522123894,"example":0.008849557522123894,"shown":0.008849557522123894,"below":0.008849557522123894,"illustrates":0.008849557522123894,"usage":0.008849557522123894,"in":0.008849557522123894,"combination":0.008849557522123894,"with":0.008849557522123894,"transactions":0.008849557522123894,"library":0.008849557522123894,"supports":0.008849557522123894,"typed":0.008849557522123894,"calls":0.008849557522123894,"and":0.008849557522123894,"makes":0.008849557522123894,"response":0.008849557522123894,"utilization":0.008849557522123894,"much":0.008849557522123894,"simpler":0.008849557522123894,"ts":0.008849557522123894,"import":0.008849557522123894,"configuration":0.008849557522123894,"smartcontractsapiinterface":0.008849557522123894,"smartcontractsapi":0.008849557522123894,"readonlyfunctionsuccessresponse":0.008849557522123894,"from":0.008849557522123894,"'":0.008849557522123894,"blockchain-api-client'":0.008849557522123894,"uintcv":0.008849557522123894,"cvtohex":0.008849557522123894,"hextocv":0.008849557522123894,"claritytype":0.008849557522123894,"transactions'":0.008849557522123894,"async":0.008849557522123894,"const":0.008849557522123894,"apiconfig":0.008849557522123894,"new":0.008849557522123894,"fetchapi":0.008849557522123894,"fetch":0.008849557522123894,"for":0.008849557522123894,"mainnet":0.008849557522123894,"replace":0.008849557522123894,"testnet":0.008849557522123894,"basepath":0.008849557522123894,"'https":0.008849557522123894,"so'":0.008849557522123894,"defaults":0.008849557522123894,"http":0.008849557522123894,"localhost":0.008849557522123894,"contractsapi":0.008849557522123894,"principal":0.008849557522123894,"string":0.008849557522123894,"'st000000000000000000002amw42h'":0.008849557522123894,"use":0.008849557522123894,"most":0.008849557522123894,"recent":0.008849557522123894,"v2":0.008849557522123894,"pox":0.008849557522123894,"rewardcycle":0.008849557522123894,"fncall":0.008849557522123894,"await":0.008849557522123894,"callreadonlyfunction":0.008849557522123894,"contractaddress":0.008849557522123894,"contractname":0.008849557522123894,"'pox'":0.008849557522123894,"functionname":0.008849557522123894,"'is-pox-active'":0.008849557522123894,"readonlyfunctionargs":0.008849557522123894,"sender":0.008849557522123894,"arguments":0.008849557522123894,"console":0.008849557522123894,"log":0.008849557522123894,"status":0.008849557522123894,"okay":0.008849557522123894,"result":0.008849557522123894,"representation":0.008849557522123894,"type":0.008849557522123894,"booltrue":0.008849557522123894,"catch":0.008849557522123894,"error":0.008849557522123894},"515":{"0":0.0033333333333333335,"1":0.0033333333333333335,"2":0.0033333333333333335,"3":0.0033333333333333335,"4":0.0033333333333333335,"8":0.0033333333333333335,"25":0.0033333333333333335,"4096":0.0033333333333333335,"8332":0.0033333333333333335,"18543":0.0033333333333333335,"import":0.0033333333333333335,"inlinecode":0.0033333333333333335,"from":0.0033333333333333335,"'":0.0033333333333333335,"components":0.0033333333333333335,"inline-code'":0.0033333333333333335,"accordion":0.0033333333333333335,"accordions":0.0033333333333333335,"'fumadocs-ui":0.0033333333333333335,"accordion'":0.0033333333333333335,"tab":0.0033333333333333335,"tabs":0.0033333333333333335,"tabs'":0.0033333333333333335,"syncing":0.0033333333333333335,"a":0.0033333333333333335,"bitcoin":0.0033333333333333335,"node":0.0033333333333333335,"is":0.0033333333333333335,"often":0.0033333333333333335,"one":0.0033333333333333335,"of":0.0033333333333333335,"the":0.0033333333333333335,"first":0.0033333333333333335,"steps":0.0033333333333333335,"developer":0.0033333333333333335,"takes":0.0033333333333333335,"when":0.0033333333333333335,"building":0.0033333333333333335,"application":0.0033333333333333335,"it's":0.0033333333333333335,"great":0.0033333333333333335,"introduction":0.0033333333333333335,"to":0.0033333333333333335,"ecosystem":0.0033333333333333335,"and":0.0033333333333333335,"if":0.0033333333333333335,"you're":0.0033333333333333335,"relying":0.0033333333333333335,"on":0.0033333333333333335,"on-chain":0.0033333333333333335,"data":0.0033333333333333335,"there's":0.0033333333333333335,"no":0.0033333333333333335,"safer":0.0033333333333333335,"way":0.0033333333333333335,"get":0.0033333333333333335,"that":0.0033333333333333335,"than":0.0033333333333333335,"doing":0.0033333333333333335,"it":0.0033333333333333335,"yourself":0.0033333333333333335,"in":0.0033333333333333335,"this":0.0033333333333333335,"guide":0.0033333333333333335,"you":0.0033333333333333335,"will":0.0033333333333333335,"learn":0.0033333333333333335,"how":0.0033333333333333335,"download":0.0033333333333333335,"core":0.0033333333333333335,"daemon":0.0033333333333333335,"your":0.0033333333333333335,"machine":0.0033333333333333335,"configure":0.0033333333333333335,"bitcoind":0.0033333333333333335,"start":0.0033333333333333335,"properly":0.0033333333333333335,"shutdown":0.0033333333333333335,"restart":0.0033333333333333335,"callout":0.0033333333333333335,"title":0.0033333333333333335,"requirements":0.0033333333333333335,"type":0.0033333333333333335,"warn":0.0033333333333333335,"started":0.0033333333333333335,"we":0.0033333333333333335,"need":0.0033333333333333335,"our":0.0033333333333333335,"example":0.0033333333333333335,"we'll":0.0033333333333333335,"be":0.0033333333333333335,"using":0.0033333333333333335,"version":0.0033333333333333335,"can":0.0033333333333333335,"select":0.0033333333333333335,"software":0.0033333333333333335,"compatible":0.0033333333333333335,"with":0.0033333333333333335,"device":0.0033333333333333335,"list":0.0033333333333333335,"https":0.0033333333333333335,"bitcoincore":0.0033333333333333335,"org":0.0033333333333333335,"bin":0.0033333333333333335,"bitcoin-core-25":0.0033333333333333335,"---":0.0033333333333333335,"once":0.0033333333333333335,"complete":0.0033333333333333335,"make":0.0033333333333333335,"note":0.0033333333333333335,"path":0.0033333333333333335,"executable":0.0033333333333333335,"sync":0.0033333333333333335,"running":0.0033333333333333335,"program":0.0033333333333333335,"at":0.0033333333333333335,"bitcoin-25":0.0033333333333333335,"which":0.0033333333333333335,"where":0.0033333333333333335,"located":0.0033333333333333335,"next":0.0033333333333333335,"up":0.0033333333333333335,"couple":0.0033333333333333335,"configuration":0.0033333333333333335,"or":0.0033333333333333335,"create":0.0033333333333333335,"directory":0.0033333333333333335,"store":0.0033333333333333335,"update":0.0033333333333333335,"conf":0.0033333333333333335,"file":0.0033333333333333335,"include":0.0033333333333333335,"chainstate":0.0033333333333333335,"pretty":0.0033333333333333335,"large":0.0033333333333333335,"place":0.0033333333333333335,"are":0.0033333333333333335,"going":0.0033333333333333335,"set":0.0033333333333333335,"called":0.0033333333333333335,"bitcoin-data":0.0033333333333333335,"an":0.0033333333333333335,"external":0.0033333333333333335,"hard":0.0033333333333333335,"drive":0.0033333333333333335,"have":0.0033333333333333335,"mounted":0.0033333333333333335,"volumes":0.0033333333333333335,"ssd":0.0033333333333333335,"folder":0.0033333333333333335,"named":0.0033333333333333335,"whatever":0.0033333333333333335,"like":0.0033333333333333335,"exist":0.0033333333333333335,"locally":0.0033333333333333335,"most":0.0033333333333333335,"important":0.0033333333333333335,"thing":0.0033333333333333335,"should":0.0033333333333333335,"has":0.0033333333333333335,"enough":0.0033333333333333335,"storage":0.0033333333333333335,"hold":0.0033333333333333335,"all":0.0033333333333333335,"receiving":0.0033333333333333335,"starts":0.0033333333333333335,"now":0.0033333333333333335,"navigate":0.0033333333333333335,"datadir":0.0033333333333333335,"field":0.0033333333333333335,"would":0.0033333333333333335,"look":0.0033333333333333335,"bash":0.0033333333333333335,"override":0.0033333333333333335,"default":0.0033333333333333335,"following":0.0033333333333333335,"including":0.0033333333333333335,"storing":0.0033333333333333335,"your-path-to":0.0033333333333333335,"server":0.0033333333333333335,"rpcuser":0.0033333333333333335,"devnet":0.0033333333333333335,"rpcpassword":0.0033333333333333335,"rpcport":0.0033333333333333335,"rpcallowip":0.0033333333333333335,"txindex":0.0033333333333333335,"listen":0.0033333333333333335,"discover":0.0033333333333333335,"dns":0.0033333333333333335,"dnsseed":0.0033333333333333335,"listenonion":0.0033333333333333335,"rpcserialversion":0.0033333333333333335,"disablewallet":0.0033333333333333335,"fallbackfee":0.0033333333333333335,"00001":0.0033333333333333335,"rpcthreads":0.0033333333333333335,"blocksonly":0.0033333333333333335,"dbcache":0.0033333333333333335,"zeromq":0.0033333333333333335,"zmqpubhashblock":0.0033333333333333335,"tcp":0.0033333333333333335,"plan":0.0033333333333333335,"use":0.0033333333333333335,"receive":0.0033333333333333335,"transactions":0.0033333333333333335,"username":0.0033333333333333335,"password":0.0033333333333333335,"fields":0.0033333333333333335,"for":0.0033333333333333335,"above":0.0033333333333333335,"listed":0.0033333333333333335,"as":0.0033333333333333335,"run":0.0033333333333333335,"finished":0.0033333333333333335,"time":0.0033333333333333335,"form":0.0033333333333333335,"-conf":0.0033333333333333335,"looks":0.0033333333333333335,"terminal":0.0033333333333333335,"after":0.0033333333333333335,"command":0.0033333333333333335,"see":0.0033333333333333335,"zmq_url":0.0033333333333333335,"entries":0.0033333333333333335,"console's":0.0033333333333333335,"stdout":0.0033333333333333335,"displaying":0.0033333333333333335,"logs":0.0033333333333333335,"congrats":0.0033333333333333335,"might":0.0033333333333333335,"take":0.0033333333333333335,"anywhere":0.0033333333333333335,"few":0.0033333333333333335,"hours":0.0033333333333333335,"days":0.0033333333333333335,"fully":0.0033333333333333335,"depending":0.0033333333333333335,"proper":0.0033333333333333335,"procedure":0.0033333333333333335,"shutting":0.0033333333333333335,"down":0.0033333333333333335,"restarting":0.0033333333333333335,"shut":0.0033333333333333335,"safely":0.0033333333333333335,"bitcoin-cli":0.0033333333333333335,"inside":0.0033333333333333335,"stop":0.0033333333333333335,"--conf":0.0033333333333333335,"--rpcuser":0.0033333333333333335,"your-rpc-username":0.0033333333333333335,"--rpcpassword":0.0033333333333333335,"your-rpc-password":0.0033333333333333335,"back":0.0033333333333333335,"do":0.0033333333333333335,"refer":0.0033333333333333335,"previous":0.0033333333333333335,"by":0.0033333333333333335,"eject":0.0033333333333333335,"items":0.0033333333333333335,"macos":0.0033333333333333335,"windows":0.0033333333333333335,"value":0.0033333333333333335,"go":0.0033333333333333335,"finder":0.0033333333333333335,"then":0.0033333333333333335,"sidebar":0.0033333333333333335,"disk":0.0033333333333333335,"want":0.0033333333333333335,"under":0.0033333333333333335,"devices":0.0033333333333333335,"click":0.0033333333333333335,"icon":0.0033333333333333335,"name":0.0033333333333333335,"wait":0.0033333333333333335,"confirmation":0.0033333333333333335,"message":0.0033333333333333335,"saying":0.0033333333333333335,"safe":0.0033333333333333335,"before":0.0033333333333333335,"unplug":0.0033333333333333335,"open":0.0033333333333333335,"explorer":0.0033333333333333335,"pc":0.0033333333333333335,"drives":0.0033333333333333335,"button":0.0033333333333333335,"cards":0.0033333333333333335,"card":0.0033333333333333335,"href":0.0033333333333333335,"stacks":0.0033333333333333335,"chainhook":0.0033333333333333335,"guides":0.0033333333333333335,"chainhook-as-a-service":0.0033333333333333335,"service":0.0033333333333333335,"description":0.0033333333333333335,"build":0.0033333333333333335,"own":0.0033333333333333335,"custom":0.0033333333333333335,"api":0.0033333333333333335,"sync-a-stacks-node":0.0033333333333333335,"local":0.0033333333333333335},"516":{"1":0.0027397260273972603,"2":0.0027397260273972603,"3":0.0027397260273972603,"4":0.0027397260273972603,"5":0.0027397260273972603,"10":0.0027397260273972603,"2000":0.0027397260273972603,"700000":0.0027397260273972603,"import":0.0027397260273972603,"code":0.0027397260273972603,"terminal":0.0027397260273972603,"from":0.0027397260273972603,"'lucide-react'":0.0027397260273972603,"a":0.0027397260273972603,"no-loss":0.0027397260273972603,"lottery":0.0027397260273972603,"contract":0.0027397260273972603,"offers":0.0027397260273972603,"unique":0.0027397260273972603,"way":0.0027397260273972603,"for":0.0027397260273972603,"participants":0.0027397260273972603,"to":0.0027397260273972603,"stack":0.0027397260273972603,"their":0.0027397260273972603,"assets":0.0027397260273972603,"and":0.0027397260273972603,"potentially":0.0027397260273972603,"earn":0.0027397260273972603,"larger":0.0027397260273972603,"reward":0.0027397260273972603,"without":0.0027397260273972603,"the":0.0027397260273972603,"risk":0.0027397260273972603,"of":0.0027397260273972603,"losing":0.0027397260273972603,"initial":0.0027397260273972603,"deposit":0.0027397260273972603,"this":0.0027397260273972603,"ensures":0.0027397260273972603,"that":0.0027397260273972603,"can":0.0027397260273972603,"in":0.0027397260273972603,"yield-generating":0.0027397260273972603,"pool":0.0027397260273972603,"receive":0.0027397260273972603,"an":0.0027397260273972603,"nft":0.0027397260273972603,"ticket":0.0027397260273972603,"have":0.0027397260273972603,"chance":0.0027397260273972603,"win":0.0027397260273972603,"additional":0.0027397260273972603,"rewards":0.0027397260273972603,"while":0.0027397260273972603,"retaining":0.0027397260273972603,"original":0.0027397260273972603,"investment":0.0027397260273972603,"guide":0.0027397260273972603,"you":0.0027397260273972603,"will":0.0027397260273972603,"learn":0.0027397260273972603,"how":0.0027397260273972603,"define":0.0027397260273972603,"constants":0.0027397260273972603,"data":0.0027397260273972603,"variables":0.0027397260273972603,"create":0.0027397260273972603,"manage":0.0027397260273972603,"tickets":0.0027397260273972603,"implement":0.0027397260273972603,"functionality":0.0027397260273972603,"handle":0.0027397260273972603,"selection":0.0027397260273972603,"winners":0.0027397260273972603,"claim":0.0027397260273972603,"distribute":0.0027397260273972603,"callout":0.0027397260273972603,"title":0.0027397260273972603,"note":0.0027397260273972603,"example":0.0027397260273972603,"uses":0.0027397260273972603,"citycoins":0.0027397260273972603,"protocol":0.0027397260273972603,"stacking":0.0027397260273972603,"yield":0.0027397260273972603,"mechanism":0.0027397260273972603,"but":0.0027397260273972603,"leveraging":0.0027397260273972603,"using":0.0027397260273972603,"proof":0.0027397260273972603,"transfer":0.0027397260273972603,"pox4":0.0027397260273972603,"also":0.0027397260273972603,"be":0.0027397260273972603,"used":0.0027397260273972603,"---":0.0027397260273972603,"first":0.0027397260273972603,"some":0.0027397260273972603,"state":0.0027397260273972603,"your":0.0027397260273972603,"are":0.0027397260273972603,"fixed":0.0027397260273972603,"values":0.0027397260273972603,"store":0.0027397260273972603,"change":0.0027397260273972603,"during":0.0027397260273972603,"execution":0.0027397260273972603,"clarity":0.0027397260273972603,"define-constant":0.0027397260273972603,"owner":0.0027397260273972603,"tx-sender":0.0027397260273972603,"err_unauthorized":0.0027397260273972603,"err":0.0027397260273972603,"u101000":0.0027397260273972603,"define-data-var":0.0027397260273972603,"lotterypool":0.0027397260273972603,"uint":0.0027397260273972603,"u0":0.0027397260273972603,"totalyield":0.0027397260273972603,"ticketcounter":0.0027397260273972603,"constant":0.0027397260273972603,"defines":0.0027397260273972603,"with":0.0027397260273972603,"administrative":0.0027397260273972603,"privileges":0.0027397260273972603,"handles":0.0027397260273972603,"unauthorized":0.0027397260273972603,"access":0.0027397260273972603,"attempts":0.0027397260273972603,"key":0.0027397260273972603,"include":0.0027397260273972603,"tracking":0.0027397260273972603,"stacked":0.0027397260273972603,"accumulated":0.0027397260273972603,"earnings":0.0027397260273972603,"managing":0.0027397260273972603,"issued":0.0027397260273972603,"next":0.0027397260273972603,"represent":0.0027397260273972603,"map":0.0027397260273972603,"participant":0.0027397260273972603,"information":0.0027397260273972603,"define-map":0.0027397260273972603,"principal":0.0027397260273972603,"ticketid":0.0027397260273972603,"amount":0.0027397260273972603,"cycle":0.0027397260273972603,"ticketexpirationatcycle":0.0027397260273972603,"iswinner":0.0027397260273972603,"bool":0.0027397260273972603,"define-non-fungible-token":0.0027397260273972603,"lotteryticket":0.0027397260273972603,"links":0.0027397260273972603,"details":0.0027397260273972603,"associates":0.0027397260273972603,"owners":0.0027397260273972603,"crucial":0.0027397260273972603,"entries":0.0027397260273972603,"now":0.0027397260273972603,"it's":0.0027397260273972603,"time":0.0027397260273972603,"core":0.0027397260273972603,"function":0.0027397260273972603,"where":0.0027397260273972603,"enter":0.0027397260273972603,"by":0.0027397260273972603,"depositing":0.0027397260273972603,"define-public":0.0027397260273972603,"roll-the-dice":0.0027397260273972603,"cityname":0.0027397260273972603,"string-ascii":0.0027397260273972603,"lockperiod":0.0027397260273972603,"optional":0.0027397260273972603,"let":0.0027397260273972603,"var-get":0.0027397260273972603,"u1":0.0027397260273972603,"actuallockperiod":0.0027397260273972603,"default-to":0.0027397260273972603,"rewardcycle":0.0027397260273972603,"contract-call":0.0027397260273972603,"'sp8a9hz3pkst0s42vm9523z9nv42sz026v4k39wh":0.0027397260273972603,"ccd007-citycoin-stacking":0.0027397260273972603,"get-current-reward-cycle":0.0027397260273972603,"begin":0.0027397260273972603,"try":0.0027397260273972603,"'sp1h1733v5mz3sz9xrw9fkygezt0jdgeb8y634c7r":0.0027397260273972603,"miamicoin-token-v2":0.0027397260273972603,"as-contract":0.0027397260273972603,"none":0.0027397260273972603,"nft-mint":0.0027397260273972603,"map-insert":0.0027397260273972603,"false":0.0027397260273972603,"map-set":0.0027397260273972603,"var-set":0.0027397260273972603,"ok":0.0027397260273972603,"enables":0.0027397260273972603,"join":0.0027397260273972603,"specifying":0.0027397260273972603,"city":0.0027397260273972603,"lock":0.0027397260273972603,"period":0.0027397260273972603,"is":0.0027397260273972603,"ensuring":0.0027397260273972603,"properly":0.0027397260273972603,"locked":0.0027397260273972603,"specified":0.0027397260273972603,"duration":0.0027397260273972603,"when":0.0027397260273972603,"calls":0.0027397260273972603,"following":0.0027397260273972603,"steps":0.0027397260273972603,"occur":0.0027397260273972603,"generate":0.0027397260273972603,"determine":0.0027397260273972603,"new":0.0027397260273972603,"id":0.0027397260273972603,"generated":0.0027397260273972603,"set":0.0027397260273972603,"defaulting":0.0027397260273972603,"if":0.0027397260273972603,"not":0.0027397260273972603,"mint":0.0027397260273972603,"transferred":0.0027397260273972603,"representing":0.0027397260273972603,"minted":0.0027397260273972603,"assigned":0.0027397260273972603,"update":0.0027397260273972603,"participant's":0.0027397260273972603,"including":0.0027397260273972603,"expiration":0.0027397260273972603,"stored":0.0027397260273972603,"ticket's":0.0027397260273972603,"ownership":0.0027397260273972603,"updated":0.0027397260273972603,"return":0.0027397260273972603,"total":0.0027397260273972603,"counter":0.0027397260273972603,"incremented":0.0027397260273972603,"returns":0.0027397260273972603,"newly":0.0027397260273972603,"streamlined":0.0027397260273972603,"process":0.0027397260273972603,"each":0.0027397260273972603,"entry":0.0027397260273972603,"recorded":0.0027397260273972603,"securely":0.0027397260273972603,"managed":0.0027397260273972603,"within":0.0027397260273972603,"system":0.0027397260273972603,"handling":0.0027397260273972603,"select":0.0027397260273972603,"winner":0.0027397260273972603,"randomly":0.0027397260273972603,"define-private":0.0027397260273972603,"select-winner":0.0027397260273972603,"match":0.0027397260273972603,"'spscwdv3rkv5zrn1fqd84ye1nqfedj9r1f4dyq11":0.0027397260273972603,"citycoin-vrf-v2":0.0027397260273972603,"get-save-rnd":0.0027397260273972603,"-":0.0027397260273972603,"block-height":0.0027397260273972603,"randomticketnumber":0.0027397260273972603,"ticketcount":0.0027397260273972603,"winningticketid":0.0027397260273972603,"mod":0.0027397260273972603,"unwrap":0.0027397260273972603,"get-ticket":0.0027397260273972603,"u404":0.0027397260273972603,"get":0.0027397260273972603,"get-participant":0.0027397260273972603,"true":0.0027397260273972603,"selectionerror":0.0027397260273972603,"selects":0.0027397260273972603,"number":0.0027397260273972603,"vrf":0.0027397260273972603,"updates":0.0027397260273972603,"status":0.0027397260273972603,"fair":0.0027397260273972603,"transparent":0.0027397260273972603,"called":0.0027397260273972603,"fetch":0.0027397260273972603,"random":0.0027397260273972603,"obtained":0.0027397260273972603,"calling":0.0027397260273972603,"previous":0.0027397260273972603,"block":0.0027397260273972603,"height":0.0027397260273972603,"winning":0.0027397260273972603,"calculated":0.0027397260273972603,"taking":0.0027397260273972603,"modulus":0.0027397260273972603,"retrieve":0.0027397260273972603,"winner's":0.0027397260273972603,"retrieved":0.0027397260273972603,"indicate":0.0027397260273972603,"they":0.0027397260273972603,"setting":0.0027397260273972603,"selected":0.0027397260273972603,"fairly":0.0027397260273972603,"accurately":0.0027397260273972603,"lastly":0.0027397260273972603,"claim-rewards":0.0027397260273972603,"cityid":0.0027397260273972603,"unwrap-panic":0.0027397260273972603,"ccd004-city-registry":0.0027397260273972603,"get-city-id":0.0027397260273972603,"cycleamount":0.0027397260273972603,"ccd002-treasury-mia-stacking":0.0027397260273972603,"get-balance-stx":0.0027397260273972603,"is-eq":0.0027397260273972603,"mia":0.0027397260273972603,"ccd011-stacking-payouts":0.0027397260273972603,"send-stacking-reward-mia":0.0027397260273972603,"send-stacking-reward-nyc":0.0027397260273972603,"claim-stacking-reward":0.0027397260273972603,"distribute-rewards":0.0027397260273972603,"staking":0.0027397260273972603,"distribution":0.0027397260273972603,"balance":0.0027397260273972603,"treasury":0.0027397260273972603,"send":0.0027397260273972603,"depending":0.0027397260273972603,"on":0.0027397260273972603,"or":0.0027397260273972603,"nyc":0.0027397260273972603,"appropriate":0.0027397260273972603,"claims":0.0027397260273972603,"it":0.0027397260273972603,"performs":0.0027397260273972603,"step":0.0027397260273972603,"rewarded":0.0027397260273972603,"testing":0.0027397260273972603,"test":0.0027397260273972603,"contracts":0.0027397260273972603,"use":0.0027397260273972603,"inside":0.0027397260273972603,"clarinet":0.0027397260273972603,"console":0.0027397260273972603,"advance_chain_tip":0.0027397260273972603,"set_tx_sender":0.0027397260273972603,"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":0.0027397260273972603,"no-loss-lottery-pool":0.0027397260273972603,"u500":0.0027397260273972603,"deposit-stx":0.0027397260273972603,"u5000000000":0.0027397260273972603,"u17":0.0027397260273972603,"bootstrap":0.0027397260273972603,"follow":0.0027397260273972603,"these":0.0027397260273972603,"get-or-create-city-id":0.0027397260273972603,"set-allowed":0.0027397260273972603,"ccd002-treasury-nyc-stacking":0.0027397260273972603,"newyorkcitycoin-token-v2":0.0027397260273972603,"cards":0.0027397260273972603,"card":0.0027397260273972603,"href":0.0027397260273972603,"stacks":0.0027397260273972603,"guides":0.0027397260273972603,"create-a-new-project":0.0027397260273972603,"project":0.0027397260273972603,"description":0.0027397260273972603,"deploy-a-contract":0.0027397260273972603,"deploy":0.0027397260273972603,"network":0.0027397260273972603},"517":{"0":0.002512562814070352,"1":0.002512562814070352,"2":0.002512562814070352,"3":0.002512562814070352,"4":0.002512562814070352,"5":0.002512562814070352,"8":0.002512562814070352,"9":0.002512562814070352,"10":0.002512562814070352,"11":0.002512562814070352,"13":0.002512562814070352,"14":0.002512562814070352,"15":0.002512562814070352,"16":0.002512562814070352,"27":0.002512562814070352,"250":0.002512562814070352,"3000000":0.002512562814070352,"1726104636":0.002512562814070352,"features":0.002512562814070352,"docskit":0.002512562814070352,"-":0.002512562814070352,"adds":0.002512562814070352,"flags":0.002512562814070352,"and":0.002512562814070352,"annotations":0.002512562814070352,"to":0.002512562814070352,"codeblocks":0.002512562814070352,"includes":0.002512562814070352,"a":0.002512562814070352,"special":0.002512562814070352,"syntax":0.002512562814070352,"for":0.002512562814070352,"inline":0.002512562814070352,"code":0.002512562814070352,"inline-code":0.002512562814070352,"three":0.002512562814070352,"components":0.002512562814070352,"that":0.002512562814070352,"can":0.002512562814070352,"be":0.002512562814070352,"used":0.002512562814070352,"in":0.002512562814070352,"mdx":0.002512562814070352,"_":0.002512562814070352,"codetabs":0.002512562814070352,"withnotes":0.002512562814070352,"terminalpicker":0.002512562814070352,"terminal-picker":0.002512562814070352,"language":0.002512562814070352,"switcher":0.002512562814070352,"language-switcher":0.002512562814070352,"which":0.002512562814070352,"is":0.002512562814070352,"another":0.002512562814070352,"usage":0.002512562814070352,"of":0.002512562814070352,"with":0.002512562814070352,"terminal":0.002512562814070352,"or":0.002512562814070352,"package-install":0.002512562814070352,"are":0.002512562814070352,"rendered":0.002512562814070352,"different":0.002512562814070352,"component":0.002512562814070352,"txt":0.002512562814070352,"flags-example":0.002512562814070352,"md":0.002512562814070352,"mark":0.002512562814070352,"-wn":0.002512562814070352,"js":0.002512562814070352,"index":0.002512562814070352,"-n":0.002512562814070352,"add":0.002512562814070352,"line":0.002512562814070352,"numbers":0.002512562814070352,"-c":0.002512562814070352,"copy":0.002512562814070352,"button":0.002512562814070352,"-w":0.002512562814070352,"word":0.002512562814070352,"wrap":0.002512562814070352,"-a":0.002512562814070352,"animate":0.002512562814070352,"tabs":0.002512562814070352,"annotations-example":0.002512562814070352,"const":0.002512562814070352,"x":0.002512562814070352,"y":0.002512562814070352,"z":0.002512562814070352,"highlight":0.002512562814070352,"range":0.002512562814070352,"lines":0.002512562814070352,"regex":0.002512562814070352,"diff":0.002512562814070352,"added":0.002512562814070352,"removed":0.002512562814070352,"collapse":0.002512562814070352,"fold":0.002512562814070352,"pattern":0.002512562814070352,"link":0.002512562814070352,"tooltip":0.002512562814070352,"callout":0.002512562814070352,"learn":0.002512562814070352,"more":0.002512562814070352,"about":0.002512562814070352,"using":0.002512562814070352,"from":0.002512562814070352,"hike":0.002512562814070352,"docs":0.002512562814070352,"annotation":0.002512562814070352,"comments":0.002512562814070352,"https":0.002512562814070352,"codehike":0.002512562814070352,"org":0.002512562814070352,"concepts":0.002512562814070352,"annotation-comments":0.002512562814070352,"regular":0.002512562814070352,"expressions":0.002512562814070352,"using-regular-expressions-instead-of-ranges":0.002512562814070352,"you":0.002512562814070352,"use":0.002512562814070352,"it":0.002512562814070352,"one":0.002512562814070352,"columns":0.002512562814070352,"provide":0.002512562814070352,"any":0.002512562814070352,"valid":0.002512562814070352,"css":0.002512562814070352,"color":0.002512562814070352,"example":0.002512562814070352,"red":0.002512562814070352,"hsl":0.002512562814070352,"var":0.002512562814070352,"--hiro":0.002512562814070352,"clarity":0.002512562814070352,"counters":0.002512562814070352,"mg":0.002512562814070352,"define-map":0.002512562814070352,"principal":0.002512562814070352,"uint":0.002512562814070352,"define-public":0.002512562814070352,"count-up":0.002512562814070352,"ok":0.002512562814070352,"map-set":0.002512562814070352,"tx-sender":0.002512562814070352,"get-count":0.002512562814070352,"u1":0.002512562814070352,"define-read-only":0.002512562814070352,"who":0.002512562814070352,"default-to":0.002512562814070352,"u0":0.002512562814070352,"map-get":0.002512562814070352,"function":0.002512562814070352,"lorem":0.002512562814070352,"ipsum":0.002512562814070352,"dolor":0.002512562814070352,"sit":0.002512562814070352,"amet":0.002512562814070352,"return":0.002512562814070352,"consectetur":0.002512562814070352,"jsonc":0.002512562814070352,"sample-alert-payload":0.002512562814070352,"json":0.002512562814070352,"-cwn":0.002512562814070352,"nonce":0.002512562814070352,"fee_rate":0.002512562814070352,"sponsored":0.002512562814070352,"false":0.002512562814070352,"post_condition_mode":0.002512562814070352,"deny":0.002512562814070352,"collapsed":0.002512562814070352,"post_conditions":0.002512562814070352,"type":0.002512562814070352,"stx":0.002512562814070352,"condition_code":0.002512562814070352,"sent_equal_to":0.002512562814070352,"amount":0.002512562814070352,"type_id":0.002512562814070352,"principal_standard":0.002512562814070352,"anchor_mode":0.002512562814070352,"tx_status":0.002512562814070352,"pending":0.002512562814070352,"receipt_time":0.002512562814070352,"tx_type":0.002512562814070352,"contract_call":0.002512562814070352,"function_name":0.002512562814070352,"donate":0.002512562814070352,"function_signature":0.002512562814070352,"function_args":0.002512562814070352,"hex":0.002512562814070352,"0x01000000000000000000000000002dc6c0":0.002512562814070352,"repr":0.002512562814070352,"u3000000":0.002512562814070352,"name":0.002512562814070352,"jsx":0.002512562814070352,"classname":0.002512562814070352,"gm":0.002512562814070352,"foo":0.002512562814070352,"div":0.002512562814070352,"bg-red-200":0.002512562814070352,"opacity-50":0.002512562814070352,"span":0.002512562814070352,"block":0.002512562814070352,"hey":0.002512562814070352,"com":0.002512562814070352,"bar":0.002512562814070352,"import":0.002512562814070352,"baz":0.002512562814070352,"tabs-example":0.002512562814070352,"ac":0.002512562814070352,"ts":0.002512562814070352,"styles":0.002512562814070352,"note":0.002512562814070352,"the":0.002512562814070352,"inside":0.002512562814070352,"should":0.002512562814070352,"have":0.002512562814070352,"decoration":0.002512562814070352,"title":0.002512562814070352,"pass":0.002512562814070352,"apply":0.002512562814070352,"them":0.002512562814070352,"all":0.002512562814070352,"flag":0.002512562814070352,"will":0.002512562814070352,"transition":0.002512562814070352,"between":0.002512562814070352,"clar":0.002512562814070352,"increment":0.002512562814070352,"define-data-var":0.002512562814070352,"count":0.002512562814070352,"begin":0.002512562814070352,"var-set":0.002512562814070352,"var-get":0.002512562814070352,"solidity":0.002512562814070352,"two":0.002512562814070352,"sol":0.002512562814070352,"uint256":0.002512562814070352,"constant":0.002512562814070352,"too_big":0.002512562814070352,"public":0.002512562814070352,"returns":0.002512562814070352,"newcount":0.002512562814070352,"if":0.002512562814070352,"revert":0.002512562814070352,"too":0.002512562814070352,"large":0.002512562814070352,"switch":0.002512562814070352,"languages":0.002512562814070352,"storage":0.002512562814070352,"prop":0.002512562814070352,"store":0.002512562814070352,"selected":0.002512562814070352,"local":0.002512562814070352,"sync":0.002512562814070352,"some-id":0.002512562814070352,"same":0.002512562814070352,"key":0.002512562814070352,"typescript":0.002512562814070352,"async":0.002512562814070352,"apiconfig":0.002512562814070352,"configuration":0.002512562814070352,"new":0.002512562814070352,"fetchapi":0.002512562814070352,"fetch":0.002512562814070352,"mainnet":0.002512562814070352,"replace":0.002512562814070352,"testnet":0.002512562814070352,"basepath":0.002512562814070352,"api":0.002512562814070352,"hiro":0.002512562814070352,"so":0.002512562814070352,"catch":0.002512562814070352,"console":0.002512562814070352,"error":0.002512562814070352,"javascript":0.002512562814070352,"define":0.002512562814070352,"content":0.002512562814070352,"want":0.002512562814070352,"show":0.002512562814070352,"callouts":0.002512562814070352,"description":0.002512562814070352,"inspect":0.002512562814070352,"b":0.002512562814070352,"value":0.002512562814070352,"default":0.002512562814070352,"export":0.002512562814070352,"package":0.002512562814070352,"an":0.002512562814070352,"array":0.002512562814070352,"kind":0.002512562814070352,"like":0.002512562814070352,"object":0.002512562814070352,"entries":0.002512562814070352,"but":0.002512562814070352,"tooltips":0.002512562814070352,"demo":0.002512562814070352,"install":0.002512562814070352,"read":0.002512562814070352,"write":0.002512562814070352,"data":0.002512562814070352,"test-123":0.002512562814070352,"apikey":0.002512562814070352,"we":0.002512562814070352,"also":0.002512562814070352,"here":0.002512562814070352,"prose":0.002512562814070352,"text":0.002512562814070352,"this":0.002512562814070352,"fake":0.002512562814070352,"library":0.002512562814070352,"npm":0.002512562814070352,"lets":0.002512562814070352,"sample":0.002512562814070352,"test":0.002512562814070352,"mode":0.002512562814070352,"don":0.002512562814070352,"t":0.002512562814070352,"submit":0.002512562814070352,"personally":0.002512562814070352,"information":0.002512562814070352,"your":0.002512562814070352,"secret":0.002512562814070352,"found":0.002512562814070352,"on":0.002512562814070352,"keys":0.002512562814070352,"page":0.002512562814070352,"dashboard":0.002512562814070352,"codeyou":0.002512562814070352,"need":0.002512562814070352,"allows":0.002512562814070352,"specify":0.002512562814070352,"_clarity":0.002512562814070352,"contract-call":0.002512562814070352,"counter":0.002512562814070352,"renders":0.002512562814070352,"set":0.002512562814070352,"codeblock":0.002512562814070352,"start":0.002512562814070352,"each":0.002512562814070352,"command":0.002512562814070352,"tar":0.002512562814070352,"-xf":0.002512562814070352,"clarinet-linux-x64":0.002512562814070352,"gz":0.002512562814070352,"chmod":0.002512562814070352,"clarinet":0.002512562814070352,"mv":0.002512562814070352,"usr":0.002512562814070352,"bin":0.002512562814070352,"don't":0.002512562814070352,"as":0.002512562814070352,"output":0.002512562814070352,"ansi":0.002512562814070352,"colors":0.002512562814070352,"npx":0.002512562814070352,"create-next-app":0.002512562814070352,"latest":0.002512562814070352,"32m":0.002512562814070352,"0m":0.002512562814070352,"1mwhat":0.002512562814070352,"project":0.002512562814070352,"90m":0.002512562814070352,"my-app":0.002512562814070352,"run":0.002512562814070352,"dev":0.002512562814070352,"picker":0.002512562814070352,"macos":0.002512562814070352,"brew":0.002512562814070352,"windows":0.002512562814070352,"winget":0.002512562814070352,"cargo":0.002512562814070352,"sudo":0.002512562814070352,"apt":0.002512562814070352,"build-essential":0.002512562814070352,"pkg-config":0.002512562814070352,"libssl-dev":0.002512562814070352,"get":0.002512562814070352,"managers":0.002512562814070352,"stacks":0.002512562814070352,"connect":0.002512562814070352,"opting":0.002512562814070352,"out":0.002512562814070352,"normal":0.002512562814070352,"still":0.002512562814070352,"sh":0.002512562814070352,"bash":0.002512562814070352,"even":0.002512562814070352,"v0":0.002512562814070352,"change":0.002512562814070352,"version":0.002512562814070352,"available":0.002512562814070352,"releases":0.002512562814070352,"wget":0.002512562814070352,"-nv":0.002512562814070352,"download":0.002512562814070352,"clarinet-linux-x64-glibc":0.002512562814070352,"-o":0.002512562814070352}},"url":{"1":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"contributors-guide":0.3333333333333333},"2":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"get-started":0.3333333333333333},"3":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"rate-limiting":0.3333333333333333},"4":{"docs":0.2,"stacks":0.2,"clarinet-js-sdk":0.2,"references":0.2,"simnet":0.2},"5":{"docs":0.2,"stacks":0.2,"clarinet-js-sdk":0.2,"references":0.2,"properties":0.2},"6":{"docs":0.2,"stacks":0.2,"clarinet-js-sdk":0.2,"references":0.2,"custom-matchers":0.2},"7":{"docs":0.2,"stacks":0.2,"clarinet-js-sdk":0.2,"references":0.2,"methods":0.2},"8":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"clarinet-js-sdk":0.3333333333333333},"9":{"docs":0.25,"stacks":0.25,"clarinet-js-sdk":0.25,"quickstart":0.25},"10":{"docs":0.25,"stacks":0.25,"clarinet-js-sdk":0.25,"installation":0.25},"11":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"reference":0.3333333333333333},"12":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"testing-best-practices":0.3333333333333333},"13":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"archive":0.3333333333333333},"14":{"docs":0.2,"stacks":0.2,"archive":0.2,"guides":0.2,"stacks-api":0.2},"15":{"docs":0.2,"stacks":0.2,"archive":0.2,"guides":0.2,"token-metadata-api":0.2},"16":{"docs":0.2,"stacks":0.2,"archive":0.2,"guides":0.2,"verify-archive-data":0.2},"17":{"docs":0.2,"stacks":0.2,"archive":0.2,"guides":0.2,"stacks-blockchain":0.2},"18":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"clarinet":0.3333333333333333},"19":{"docs":0.25,"stacks":0.25,"clarinet":0.25,"concepts":0.25},"20":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"add-a-contract":0.2},"21":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"validate-a-contract":0.2},"22":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"estimate-costs":0.2},"23":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"start-a-development-console":0.2},"24":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"run-a-local-devnet":0.2},"25":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"deploy-a-contract":0.2},"26":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"debug-a-contract":0.2},"27":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"create-deployment-plans":0.2},"28":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"working-with-sbtc":0.2},"29":{"docs":0.2,"stacks":0.2,"clarinet":0.2,"examples":0.2,"create-a-new-project":0.2},"30":{"docs":0.25,"stacks":0.25,"clarinet":0.25,"quickstart":0.25},"31":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"platform-api":0.3333333333333333},"32":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"devnet":0.2,"bitcoin-node":0.2},"33":{"docs":0.25,"stacks":0.25,"platform-api":0.25,"devnet":0.25},"34":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"devnet":0.2,"stop":0.2},"35":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"devnet":0.2,"start":0.2},"36":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"devnet":0.2,"stacks-blockchain-api":0.2},"37":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"chainhooks":0.2,"list":0.2},"38":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"chainhooks":0.2,"create":0.2},"39":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"chainhooks":0.2,"get":0.2},"40":{"docs":0.25,"stacks":0.25,"platform-api":0.25,"chainhooks":0.25},"41":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"chainhooks":0.2,"update":0.2},"42":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"chainhooks":0.2,"delete":0.2},"43":{"docs":0.2,"stacks":0.2,"platform-api":0.2,"chainhooks":0.2,"status":0.2},"44":{"docs":0.5,"stacks":0.5},"45":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"platform":0.3333333333333333},"46":{"docs":0.2,"stacks":0.2,"platform":0.2,"examples":0.2,"deploy-contracts":0.2},"47":{"docs":0.2,"stacks":0.2,"platform":0.2,"examples":0.2,"create-project":0.2},"48":{"docs":0.2,"stacks":0.2,"platform":0.2,"examples":0.2,"archive-project":0.2},"49":{"docs":0.2,"stacks":0.2,"platform":0.2,"examples":0.2,"faucet":0.2},"50":{"docs":0.2,"stacks":0.2,"platform":0.2,"examples":0.2,"devnet":0.2},"51":{"docs":0.2,"stacks":0.2,"platform":0.2,"examples":0.2,"contract-monitoring":0.2},"52":{"docs":0.2,"stacks":0.2,"platform":0.2,"examples":0.2,"create-chainhooks":0.2},"53":{"docs":0.25,"stacks":0.25,"platform":0.25,"quickstart":0.25},"54":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"token-metadata-api":0.3333333333333333},"55":{"docs":0.25,"stacks":0.25,"token-metadata-api":0.25,"architecture":0.25},"56":{"docs":0.25,"stacks":0.25,"token-metadata-api":0.25,"info":0.25},"57":{"docs":0.2,"stacks":0.2,"token-metadata-api":0.2,"info":0.2,"status":0.2},"58":{"docs":0.25,"stacks":0.25,"token-metadata-api":0.25,"usage":0.25},"59":{"docs":0.25,"stacks":0.25,"token-metadata-api":0.25,"tokens":0.25},"60":{"docs":0.2,"stacks":0.2,"token-metadata-api":0.2,"tokens":0.2,"fungible-token-metadata":0.2},"61":{"docs":0.2,"stacks":0.2,"token-metadata-api":0.2,"tokens":0.2,"semi-fungible-token-metadata":0.2},"62":{"docs":0.2,"stacks":0.2,"token-metadata-api":0.2,"tokens":0.2,"fungible-tokens":0.2},"63":{"docs":0.2,"stacks":0.2,"token-metadata-api":0.2,"tokens":0.2,"non-fungible-token-metadata":0.2},"64":{"docs":0.25,"stacks":0.25,"token-metadata-api":0.25,"client":0.25},"65":{"docs":0.2,"stacks":0.2,"token-metadata-api":0.2,"client":0.2,"quickstart":0.2},"66":{"docs":0.2,"stacks":0.2,"token-metadata-api":0.2,"client":0.2,"tokens":0.2},"67":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"token-metadata-api":0.16666666666666666,"client":0.16666666666666666,"tokens":0.16666666666666666,"get-ft-metadata":0.16666666666666666},"68":{"docs":0.2,"stacks":0.2,"hacks":0.2,"archive":0.2,"build-a-custom-api":0.2},"69":{"docs":0.2,"stacks":0.2,"hacks":0.2,"archive":0.2,"build-a-decentralized-grants-program":0.2},"70":{"docs":0.2,"stacks":0.2,"hacks":0.2,"archive":0.2,"ai":0.2},"71":{"docs":0.2,"stacks":0.2,"hacks":0.2,"archive":0.2,"build-a-friend-tech-clone":0.2},"72":{"docs":0.25,"stacks":0.25,"hacks":0.25,"recipes":0.25},"73":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"hacks":0.3333333333333333},"74":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"explorer":0.3333333333333333},"75":{"docs":0.2,"stacks":0.2,"explorer":0.2,"guides":0.2,"build-explorer":0.2},"76":{"docs":0.25,"stacks":0.25,"clarity":0.25,"bit-manipulation":0.25},"77":{"docs":0.25,"stacks":0.25,"clarity":0.25,"basic-arithmetic":0.25},"78":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"clarity":0.3333333333333333},"79":{"docs":0.25,"stacks":0.25,"clarity":0.25,"optimizations":0.25},"80":{"docs":0.25,"stacks":0.25,"clarity":0.25,"cryptographic-functions":0.25},"81":{"docs":0.25,"stacks":0.25,"clarity":0.25,"access-control":0.25},"82":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"list":0.2},"83":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"tuple":0.2},"84":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"sha256":0.2},"85":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"unwrap":0.2},"86":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"contract-call":0.2},"87":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"buff-to-int-be":0.2},"88":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"int-to-ascii":0.2},"89":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"map-delete":0.2},"90":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"contract-of":0.2},"91":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"keccak256":0.2},"92":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-constant":0.2},"93":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"xor":0.2},"94":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"principal-of":0.2},"95":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"get-burn-block-info":0.2},"96":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"fold":0.2},"97":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-map":0.2},"98":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"stx-account":0.2},"99":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-public":0.2},"100":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-data-var":0.2},"101":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"nft-transfer":0.2},"102":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"multiply":0.2},"103":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"default-to":0.2},"104":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"get-stacks-block-info":0.2},"105":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"map":0.2},"106":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"sqrti":0.2},"107":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"log2":0.2},"108":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"and":0.2},"109":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"replace-at":0.2},"110":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"len":0.2},"111":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"sha512-256":0.2},"112":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"divide":0.2},"113":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"bit-and":0.2},"114":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"less-than":0.2},"115":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"ft-burn":0.2},"116":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"get":0.2},"117":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"use-trait":0.2},"118":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"to-uint":0.2},"119":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-trait":0.2},"120":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"int-to-utf8":0.2},"121":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"ok":0.2},"122":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-non-fungible-token":0.2},"123":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"ft-transfer":0.2},"124":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"is-err":0.2},"125":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"ft-get-supply":0.2},"126":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"as-max-len":0.2},"127":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"get-tenure-info":0.2},"128":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"bit-xor":0.2},"129":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-private":0.2},"130":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"bit-or":0.2},"131":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"var-get":0.2},"132":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"map-set":0.2},"133":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"buff-to-uint-be":0.2},"134":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-read-only":0.2},"135":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"nft-burn":0.2},"136":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"is-ok":0.2},"137":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"add":0.2},"138":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"string-to-int":0.2},"139":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"is-none":0.2},"140":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"subtract":0.2},"141":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"principal-destruct":0.2},"142":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"to-consensus-buff":0.2},"143":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"stx-burn":0.2},"144":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"from-consensus-buff":0.2},"145":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"bit-shift-right":0.2},"146":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"is-some":0.2},"147":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"is-standard":0.2},"148":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"unwrap-err-panic":0.2},"149":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"append":0.2},"150":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"stx-transfer":0.2},"151":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"unwrap-panic":0.2},"152":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"impl-trait":0.2},"153":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"to-int":0.2},"154":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"greater-than":0.2},"155":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"not":0.2},"156":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"get-block-info":0.2},"157":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"string-to-uint":0.2},"158":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"buff-to-uint-le":0.2},"159":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"unwrap-err":0.2},"160":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"define-fungible-token":0.2},"161":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"at-block":0.2},"162":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"secp256k1-recover":0.2},"163":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"begin":0.2},"164":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"err":0.2},"165":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"or":0.2},"166":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"try":0.2},"167":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"map-insert":0.2},"168":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"some":0.2},"169":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"secp256k1-verify":0.2},"170":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"match":0.2},"171":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"let":0.2},"172":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"map-get":0.2},"173":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"is-eq":0.2},"174":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"bit-shift-left":0.2},"175":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"var-set":0.2},"176":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"less-than-or-equal":0.2},"177":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"filter":0.2},"178":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"ft-mint":0.2},"179":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"buff-to-int-le":0.2},"180":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"element-at":0.2},"181":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"sha512":0.2},"182":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"concat":0.2},"183":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"index-of":0.2},"184":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"stx-transfer-memo":0.2},"185":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"pow":0.2},"186":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"nft-mint":0.2},"187":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"bit-not":0.2},"188":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"hash160":0.2},"189":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"merge":0.2},"190":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"ft-get-balance":0.2},"191":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"greater-than-or-equal":0.2},"192":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"as-contract":0.2},"193":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"asserts":0.2},"194":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"slice":0.2},"195":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"nft-get-owner":0.2},"196":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"if":0.2},"197":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"mod":0.2},"198":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"stx-get-balance":0.2},"199":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"print":0.2},"200":{"docs":0.2,"stacks":0.2,"clarity":0.2,"functions":0.2,"principal-construct":0.2},"201":{"docs":0.25,"stacks":0.25,"clarity":0.25,"handling-optionals-and-errors":0.25},"202":{"docs":0.25,"stacks":0.25,"clarity":0.25,"time-and-blocks":0.25},"203":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"web-app-development":0.3333333333333333},"204":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"token-development":0.3333333333333333},"205":{"docs":0.25,"stacks":0.25,"signer-metrics-api":0.25,"blocks":0.25},"206":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"blocks":0.2,"aggregated-signer-information-for-a-block":0.2},"207":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"blocks":0.2,"aggregated-signer-information-for-most-recent-blocks":0.2},"208":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"signer-metrics-api":0.3333333333333333},"209":{"docs":0.25,"stacks":0.25,"signer-metrics-api":0.25,"info":0.25},"210":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"info":0.2,"status":0.2},"211":{"docs":0.25,"stacks":0.25,"signer-metrics-api":0.25,"prometheus":0.25},"212":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"prometheus":0.2,"metrics":0.2},"213":{"docs":0.25,"stacks":0.25,"signer-metrics-api":0.25,"signers":0.25},"214":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"signers":0.2,"pox-cycle-signer":0.2},"215":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"signers":0.2,"pox-cycle-signers":0.2},"216":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"block-proposals":0.2,"signer-information-for-a-block":0.2},"217":{"docs":0.25,"stacks":0.25,"signer-metrics-api":0.25,"block-proposals":0.25},"218":{"docs":0.2,"stacks":0.2,"signer-metrics-api":0.2,"block-proposals":0.2,"signer-information-for-most-recent-block-proposals":0.2},"219":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"nakamoto":0.3333333333333333},"220":{"docs":0.2,"stacks":0.2,"nakamoto":0.2,"guides":0.2,"explorer":0.2},"221":{"docs":0.2,"stacks":0.2,"nakamoto":0.2,"guides":0.2,"clarinet":0.2},"222":{"docs":0.2,"stacks":0.2,"nakamoto":0.2,"guides":0.2,"stacks-api":0.2},"223":{"docs":0.2,"stacks":0.2,"nakamoto":0.2,"guides":0.2,"stacks-js":0.2},"224":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"unit-testing":0.3333333333333333},"225":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"smart-contract-development":0.3333333333333333},"226":{"docs":0.2,"stacks":0.2,"js":0.2,"v6":0.2,"transactions":0.2},"227":{"docs":0.2,"stacks":0.2,"js":0.2,"v6":0.2,"network":0.2},"228":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"js":0.3333333333333333},"229":{"docs":0.25,"stacks":0.25,"js":0.25,"roadmap":0.25},"230":{"docs":0.2,"stacks":0.2,"js":0.2,"examples":0.2,"broadcast-transactions":0.2},"231":{"docs":0.2,"stacks":0.2,"js":0.2,"examples":0.2,"post-conditions":0.2},"232":{"docs":0.2,"stacks":0.2,"js":0.2,"examples":0.2,"use-with-react-native":0.2},"233":{"docs":0.2,"stacks":0.2,"js":0.2,"packages":0.2,"sbtc":0.2},"234":{"docs":0.2,"stacks":0.2,"js":0.2,"packages":0.2,"transactions":0.2},"235":{"docs":0.2,"stacks":0.2,"js":0.2,"packages":0.2,"network":0.2},"236":{"docs":0.2,"stacks":0.2,"js":0.2,"packages":0.2,"common":0.2},"237":{"docs":0.2,"stacks":0.2,"js":0.2,"concepts":0.2,"transactions":0.2},"238":{"docs":0.2,"stacks":0.2,"js":0.2,"concepts":0.2,"post-conditions":0.2},"239":{"docs":0.2,"stacks":0.2,"js":0.2,"concepts":0.2,"private-keys":0.2},"240":{"docs":0.2,"stacks":0.2,"js":0.2,"concepts":0.2,"accounts-and-addresses":0.2},"241":{"docs":0.2,"stacks":0.2,"js":0.2,"concepts":0.2,"networks":0.2},"242":{"docs":0.2,"stacks":0.2,"js":0.2,"concepts":0.2,"broadcasting":0.2},"243":{"docs":0.25,"stacks":0.25,"js":0.25,"quickstart":0.25},"244":{"docs":0.25,"stacks":0.25,"js":0.25,"installation":0.25},"245":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"integration-testing":0.3333333333333333},"246":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"migration-guide":0.3333333333333333},"247":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"api-keys":0.3333333333333333},"248":{"docs":0.2,"stacks":0.2,"api":0.2,"token-metadata":0.2,"info":0.2},"249":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"token-metadata":0.16666666666666666,"info":0.16666666666666666,"status":0.16666666666666666},"250":{"docs":0.2,"stacks":0.2,"api":0.2,"token-metadata":0.2,"tokens":0.2},"251":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"token-metadata":0.16666666666666666,"tokens":0.16666666666666666,"fungible-token-metadata":0.16666666666666666},"252":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"token-metadata":0.16666666666666666,"tokens":0.16666666666666666,"semi-fungible-token-metadata":0.16666666666666666},"253":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"token-metadata":0.16666666666666666,"tokens":0.16666666666666666,"fungible-tokens":0.16666666666666666},"254":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"token-metadata":0.16666666666666666,"tokens":0.16666666666666666,"non-fungible-token-metadata":0.16666666666666666},"255":{"docs":0.25,"stacks":0.25,"api":0.25,"pagination":0.25},"256":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"api":0.3333333333333333},"257":{"docs":0.25,"stacks":0.25,"api":0.25,"authentication":0.25},"258":{"docs":0.25,"stacks":0.25,"api":0.25,"nonce-handling":0.25},"259":{"docs":0.25,"stacks":0.25,"api":0.25,"architecture":0.25},"260":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"get-block":0.16666666666666666},"261":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"recent-blocks":0.16666666666666666},"262":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"block-by-hash":0.16666666666666666},"263":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"blocks":0.2},"264":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"get-blocks-by-burn-block":0.16666666666666666},"265":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"block-by-burn-block-height":0.16666666666666666},"266":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"average-times":0.16666666666666666},"267":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"get-blocks":0.16666666666666666},"268":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"block-by-burn-block-hash":0.16666666666666666},"269":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"blocks":0.16666666666666666,"block-by-height":0.16666666666666666},"270":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"names":0.2},"271":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"names":0.16666666666666666,"name-subdomains":0.16666666666666666},"272":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"names":0.16666666666666666,"name-zonefile":0.16666666666666666},"273":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"names":0.2},"274":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"names":0.16666666666666666,"owned-by-address":0.16666666666666666},"275":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"names":0.16666666666666666,"namespace-names":0.16666666666666666},"276":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"names":0.16666666666666666,"namespaces":0.16666666666666666},"277":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"names":0.16666666666666666,"name-details":0.16666666666666666},"278":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"names":0.16666666666666666,"historical-zonefile":0.16666666666666666},"279":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"fees":0.16666666666666666,"fee-rate":0.16666666666666666},"280":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"fees":0.2},"281":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"stacking-rewards":0.16666666666666666,"recent-burnchain-reward-recipients":0.16666666666666666},"282":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"stacking-rewards":0.2},"283":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"stacking-rewards":0.16666666666666666,"recent-burnchain-reward-recipient":0.16666666666666666},"284":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"stacking-rewards":0.16666666666666666,"recent-reward-slot-holders":0.16666666666666666},"285":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"stacking-rewards":0.16666666666666666,"recent-reward-slot-holder-entries":0.16666666666666666},"286":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"stacking-rewards":0.16666666666666666,"total-burnchain-rewards-for-recipient":0.16666666666666666},"287":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"proof-of-transfer":0.16666666666666666,"cycles":0.16666666666666666},"288":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"proof-of-transfer":0.2},"289":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"proof-of-transfer":0.16666666666666666,"signer-in-cycle":0.16666666666666666},"290":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"proof-of-transfer":0.16666666666666666,"cycle":0.16666666666666666},"291":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"proof-of-transfer":0.16666666666666666,"signers-in-cycle":0.16666666666666666},"292":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"proof-of-transfer":0.16666666666666666,"stackers-for-signer-in-cycle":0.16666666666666666},"293":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"search":0.16666666666666666,"search-by-id":0.16666666666666666},"294":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"search":0.2},"295":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"info":0.16666666666666666,"total-and-unlocked-stx-supply":0.16666666666666666},"296":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"info":0.16666666666666666,"network-given-block-time":0.16666666666666666},"297":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"info":0.16666666666666666,"circulating-stx-supply-in-plain-text":0.16666666666666666},"298":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"info":0.16666666666666666,"network-block-time":0.16666666666666666},"299":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"info":0.2},"300":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"info":0.16666666666666666,"total-stx-supply-in-plain-text":0.16666666666666666},"301":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"info":0.16666666666666666,"status":0.16666666666666666},"302":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"info":0.16666666666666666,"legacy-total-and-unlocked-stx-supply":0.16666666666666666},"303":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"address-transactions":0.16666666666666666},"304":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"events-for-an-address-transaction":0.16666666666666666},"305":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"transaction-events":0.16666666666666666},"306":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"statistics-for-mempool-transactions":0.16666666666666666},"307":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"transactions":0.2},"308":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"transactions-for-address":0.16666666666666666},"309":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"dropped-mempool-transactions":0.16666666666666666},"310":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"get-transaction":0.16666666666666666},"311":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"details-for-transactions":0.16666666666666666},"312":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"recent-transactions":0.16666666666666666},"313":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"mempool-transactions":0.16666666666666666},"314":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"transactions-by-block":0.16666666666666666},"315":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"transactions":0.16666666666666666,"get-raw-transaction":0.16666666666666666},"316":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"stacking-pool":0.16666666666666666,"members":0.16666666666666666},"317":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"stacking-pool":0.2},"318":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"faucets":0.2},"319":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"faucets":0.16666666666666666,"stx":0.16666666666666666},"320":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"transactions-with-transfers":0.16666666666666666},"321":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"balances":0.16666666666666666},"322":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"transactions":0.16666666666666666},"323":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"nft-events":0.16666666666666666},"324":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"assets":0.16666666666666666},"325":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"transaction-with-transfers":0.16666666666666666},"326":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"latest-nonce":0.16666666666666666},"327":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"stx-balances":0.16666666666666666},"328":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"accounts":0.16666666666666666,"inbound-stx-transfers":0.16666666666666666},"329":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"smart-contracts":0.16666666666666666,"events":0.16666666666666666},"330":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"smart-contracts":0.16666666666666666,"by-trait":0.16666666666666666},"331":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"smart-contracts":0.2},"332":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"smart-contracts":0.16666666666666666,"info":0.16666666666666666},"333":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"smart-contracts":0.16666666666666666,"status":0.16666666666666666},"334":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"mempool":0.2},"335":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"mempool":0.16666666666666666,"transaction-fee-priorities":0.16666666666666666},"336":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"burn-blocks":0.16666666666666666,"get-burn-block":0.16666666666666666},"337":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"burn-blocks":0.2},"338":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"burn-blocks":0.16666666666666666,"get-burn-blocks":0.16666666666666666},"339":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"tokens":0.2},"340":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"tokens":0.16666666666666666,"holders":0.16666666666666666},"341":{"docs":0.2,"stacks":0.2,"api":0.2,"stacks-blockchain":0.2,"non-fungible-tokens":0.2},"342":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"non-fungible-tokens":0.16666666666666666,"holdings":0.16666666666666666},"343":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"non-fungible-tokens":0.16666666666666666,"mints":0.16666666666666666},"344":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"api":0.16666666666666666,"stacks-blockchain":0.16666666666666666,"non-fungible-tokens":0.16666666666666666,"history":0.16666666666666666},"345":{"docs":0.25,"stacks":0.25,"api":0.25,"getting-started":0.25},"346":{"docs":0.25,"stacks":0.25,"api":0.25,"requesting-proofs":0.25},"347":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"setup":0.3333333333333333},"348":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"testing-environments":0.3333333333333333},"349":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"blockchain-development":0.3333333333333333},"350":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"connect":0.3333333333333333},"351":{"docs":0.25,"stacks":0.25,"connect":0.25,"support":0.25},"352":{"docs":0.2,"stacks":0.2,"connect":0.2,"examples":0.2,"authenticate-users":0.2},"353":{"docs":0.2,"stacks":0.2,"connect":0.2,"examples":0.2,"broadcast-transactions":0.2},"354":{"docs":0.2,"stacks":0.2,"connect":0.2,"examples":0.2,"sign-messages":0.2},"355":{"docs":0.2,"stacks":0.2,"connect":0.2,"examples":0.2,"migration":0.2},"356":{"docs":0.25,"stacks":0.25,"connect":0.25,"packages":0.25},"357":{"docs":0.25,"stacks":0.25,"connect":0.25,"quickstart":0.25},"358":{"docs":0.2,"stacks":0.2,"reference":0.2,"clarinet-js-sdk":0.2,"simnet":0.2},"359":{"docs":0.2,"stacks":0.2,"reference":0.2,"clarinet-js-sdk":0.2,"properties":0.2},"360":{"docs":0.2,"stacks":0.2,"reference":0.2,"clarinet-js-sdk":0.2,"custom-matchers":0.2},"361":{"docs":0.2,"stacks":0.2,"reference":0.2,"clarinet-js-sdk":0.2,"methods":0.2},"362":{"docs":0.2,"stacks":0.2,"reference":0.2,"clarinet-js-sdk":0.2,"clarinet-sdk":0.2},"363":{"docs":0.2,"stacks":0.2,"reference":0.2,"cli":0.2,"clarinet":0.2},"364":{"docs":0.2,"stacks":0.2,"reference":0.2,"cli":0.2,"stacks-js":0.2},"365":{"docs":0.2,"stacks":0.2,"reference":0.2,"stacks-blockchain-api":0.2,"client":0.2},"366":{"docs":0.2,"stacks":0.2,"reference":0.2,"js":0.2,"connect":0.2},"367":{"docs":0.2,"stacks":0.2,"reference":0.2,"js":0.2,"sbtc":0.2},"368":{"docs":0.2,"stacks":0.2,"reference":0.2,"js":0.2,"transactions":0.2},"369":{"docs":0.2,"stacks":0.2,"reference":0.2,"js":0.2,"network":0.2},"370":{"docs":0.2,"stacks":0.2,"reference":0.2,"js":0.2,"common":0.2},"371":{"docs":0.16666666666666666,"stacks":0.16666666666666666,"chainhook":0.16666666666666666,"references":0.16666666666666666,"scopes":0.16666666666666666,"bitcoin":0.16666666666666666},"372":{"docs":0.2,"stacks":0.2,"chainhook":0.2,"references":0.2,"scopes":0.2},"373":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"chainhook":0.3333333333333333},"374":{"docs":0.2,"stacks":0.2,"chainhook":0.2,"examples":0.2,"chainhook-as-a-service-with-stacks-node":0.2},"375":{"docs":0.2,"stacks":0.2,"chainhook":0.2,"examples":0.2,"register-chainhooks-on-devnet":0.2},"376":{"docs":0.2,"stacks":0.2,"chainhook":0.2,"examples":0.2,"chainhook-as-a-service":0.2},"377":{"docs":0.2,"stacks":0.2,"chainhook":0.2,"examples":0.2,"observing-contract-calls":0.2},"378":{"docs":0.25,"stacks":0.25,"chainhook":0.25,"quickstart":0.25},"379":{"docs":0.25,"stacks":0.25,"chainhook":0.25,"predicate-design":0.25},"380":{"docs":0.25,"stacks":0.25,"chainhook":0.25,"installation":0.25},"381":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"quickstarts":0.3333333333333333},"382":{"docs":0.25,"stacks":0.25,"quickstarts":0.25,"event-streaming":0.25},"383":{"docs":0.25,"stacks":0.25,"quickstarts":0.25,"wallet-integration":0.25},"384":{"docs":0.25,"stacks":0.25,"quickstarts":0.25,"app-templates":0.25},"385":{"docs":0.25,"stacks":0.25,"quickstarts":0.25,"nft-minting":0.25},"386":{"docs":0.25,"stacks":0.25,"quickstarts":0.25,"contract-templates":0.25},"387":{"docs":0.25,"stacks":0.25,"quickstarts":0.25,"token-transfers":0.25},"388":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"blocks":0.25},"389":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"blocks":0.2,"block-proposal":0.2},"390":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"pox":0.25},"391":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"pox":0.2,"stacker-set":0.2},"392":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"pox":0.2,"pox-details":0.2},"393":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"names":0.2,"namespace-price":0.2},"394":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"names":0.25},"395":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"names":0.2,"name-price":0.2},"396":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"fees":0.2,"estimate":0.2},"397":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"fees":0.25},"398":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"fees":0.2,"transfer-estimate":0.2},"399":{"docs":0.3333333333333333,"stacks":0.3333333333333333,"rpc-api":0.3333333333333333},"400":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"info":0.25},"401":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"info":0.2,"core-api":0.2},"402":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"transactions":0.2,"broadcast-transaction":0.2},"403":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"transactions":0.25},"404":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"accounts":0.25},"405":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"accounts":0.2,"info":0.2},"406":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"v3":0.25},"407":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"v3":0.2,"tenure-metadata":0.2},"408":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"v3":0.2,"nakamoto-block":0.2},"409":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"v3":0.2,"tenure-blocks":0.2},"410":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"smart-contracts":0.2,"interface":0.2},"411":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"smart-contracts":0.2,"traits":0.2},"412":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"smart-contracts":0.25},"413":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"smart-contracts":0.2,"map-entry":0.2},"414":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"smart-contracts":0.2,"read-only":0.2},"415":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"smart-contracts":0.2,"source":0.2},"416":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"smart-contracts":0.2,"constants":0.2},"417":{"docs":0.25,"stacks":0.25,"rpc-api":0.25,"burn-ops":0.25},"418":{"docs":0.2,"stacks":0.2,"rpc-api":0.2,"burn-ops":0.2,"get-burn-operations":0.2},"419":{"docs":0.3333333333333333,"bitcoin":0.3333333333333333,"contributors-guide":0.3333333333333333},"420":{"docs":0.3333333333333333,"bitcoin":0.3333333333333333,"get-started":0.3333333333333333},"421":{"docs":0.3333333333333333,"bitcoin":0.3333333333333333,"rate-limiting":0.3333333333333333},"422":{"docs":0.25,"bitcoin":0.25,"runes":0.25,"runehook":0.25},"423":{"docs":0.2,"bitcoin":0.2,"runes":0.2,"runehook":0.2,"quickstart":0.2},"424":{"docs":0.2,"bitcoin":0.2,"runes":0.2,"runehook":0.2,"installation":0.2},"425":{"docs":0.25,"bitcoin":0.25,"runes":0.25,"explorer":0.25},"426":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"explorer":0.16666666666666666,"guides":0.16666666666666666,"build-explorer":0.16666666666666666},"427":{"docs":0.25,"bitcoin":0.25,"runes":0.25,"api":0.25},"428":{"docs":0.2,"bitcoin":0.2,"runes":0.2,"api":0.2,"info":0.2},"429":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"info":0.16666666666666666,"status":0.16666666666666666},"430":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"balances":0.16666666666666666,"address":0.16666666666666666},"431":{"docs":0.2,"bitcoin":0.2,"runes":0.2,"api":0.2,"balances":0.2},"432":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"balances":0.16666666666666666,"holder-balance":0.16666666666666666},"433":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"balances":0.16666666666666666,"holders":0.16666666666666666},"434":{"docs":0.2,"bitcoin":0.2,"runes":0.2,"api":0.2,"activities":0.2},"435":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"activities":0.16666666666666666,"for-transaction":0.16666666666666666},"436":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"activities":0.16666666666666666,"for-address":0.16666666666666666},"437":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"activities":0.16666666666666666,"for-block":0.16666666666666666},"438":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"activities":0.16666666666666666,"activity":0.16666666666666666},"439":{"docs":0.2,"bitcoin":0.2,"runes":0.2,"api":0.2,"usage":0.2},"440":{"docs":0.2,"bitcoin":0.2,"runes":0.2,"api":0.2,"etchings":0.2},"441":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"etchings":0.16666666666666666,"get-etchings":0.16666666666666666},"442":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"runes":0.16666666666666666,"api":0.16666666666666666,"etchings":0.16666666666666666,"get-etching":0.16666666666666666},"443":{"docs":0.25,"bitcoin":0.25,"ordinals":0.25,"explorer":0.25},"444":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"explorer":0.16666666666666666,"guides":0.16666666666666666,"build-explorer":0.16666666666666666},"445":{"docs":0.2,"bitcoin":0.2,"ordinals":0.2,"api":0.2,"statistics":0.2},"446":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"statistics":0.16666666666666666,"get-stats-inscription-count":0.16666666666666666},"447":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-token-holders":0.16666666666666666},"448":{"docs":0.2,"bitcoin":0.2,"ordinals":0.2,"api":0.2,"brc20":0.2},"449":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-balances":0.16666666666666666},"450":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-token-details":0.16666666666666666},"451":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-tokens":0.16666666666666666},"452":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-activity":0.16666666666666666},"453":{"docs":0.2,"bitcoin":0.2,"ordinals":0.2,"api":0.2,"inscriptions":0.2},"454":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscription-transfers":0.16666666666666666},"455":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscriptions":0.16666666666666666},"456":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscription-content":0.16666666666666666},"457":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"inscriptions":0.16666666666666666,"get-transfers-per-block":0.16666666666666666},"458":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscription":0.16666666666666666},"459":{"docs":0.25,"bitcoin":0.25,"ordinals":0.25,"api":0.25},"460":{"docs":0.2,"bitcoin":0.2,"ordinals":0.2,"api":0.2,"info":0.2},"461":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"info":0.16666666666666666,"status":0.16666666666666666},"462":{"docs":0.2,"bitcoin":0.2,"ordinals":0.2,"api":0.2,"usage":0.2},"463":{"docs":0.2,"bitcoin":0.2,"ordinals":0.2,"api":0.2,"satoshis":0.2},"464":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"satoshis":0.16666666666666666,"get-satoshi":0.16666666666666666},"465":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"ordinals":0.16666666666666666,"api":0.16666666666666666,"satoshis":0.16666666666666666,"get-satoshi-inscriptions":0.16666666666666666},"466":{"docs":0.5,"bitcoin":0.5},"467":{"docs":0.3333333333333333,"bitcoin":0.3333333333333333,"api-keys":0.3333333333333333},"468":{"docs":0.2,"bitcoin":0.2,"api":0.2,"runes":0.2,"info":0.2},"469":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"info":0.16666666666666666,"status":0.16666666666666666},"470":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"balances":0.16666666666666666,"address":0.16666666666666666},"471":{"docs":0.2,"bitcoin":0.2,"api":0.2,"runes":0.2,"balances":0.2},"472":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"balances":0.16666666666666666,"holder-balance":0.16666666666666666},"473":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"balances":0.16666666666666666,"holders":0.16666666666666666},"474":{"docs":0.2,"bitcoin":0.2,"api":0.2,"runes":0.2,"activities":0.2},"475":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"activities":0.16666666666666666,"for-transaction":0.16666666666666666},"476":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"activities":0.16666666666666666,"for-address":0.16666666666666666},"477":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"activities":0.16666666666666666,"for-block":0.16666666666666666},"478":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"activities":0.16666666666666666,"activity":0.16666666666666666},"479":{"docs":0.2,"bitcoin":0.2,"api":0.2,"runes":0.2,"etchings":0.2},"480":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"etchings":0.16666666666666666,"get-etchings":0.16666666666666666},"481":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"runes":0.16666666666666666,"etchings":0.16666666666666666,"get-etching":0.16666666666666666},"482":{"docs":0.2,"bitcoin":0.2,"api":0.2,"ordinals":0.2,"statistics":0.2},"483":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"statistics":0.16666666666666666,"get-stats-inscription-count":0.16666666666666666},"484":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-token-holders":0.16666666666666666},"485":{"docs":0.2,"bitcoin":0.2,"api":0.2,"ordinals":0.2,"brc20":0.2},"486":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-balances":0.16666666666666666},"487":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-token-details":0.16666666666666666},"488":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-tokens":0.16666666666666666},"489":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"brc20":0.16666666666666666,"get-brc20-activity":0.16666666666666666},"490":{"docs":0.2,"bitcoin":0.2,"api":0.2,"ordinals":0.2,"inscriptions":0.2},"491":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscription-transfers":0.16666666666666666},"492":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscriptions":0.16666666666666666},"493":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscription-content":0.16666666666666666},"494":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"inscriptions":0.16666666666666666,"get-transfers-per-block":0.16666666666666666},"495":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"inscriptions":0.16666666666666666,"get-inscription":0.16666666666666666},"496":{"docs":0.2,"bitcoin":0.2,"api":0.2,"ordinals":0.2,"info":0.2},"497":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"info":0.16666666666666666,"status":0.16666666666666666},"498":{"docs":0.2,"bitcoin":0.2,"api":0.2,"ordinals":0.2,"satoshis":0.2},"499":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"satoshis":0.16666666666666666,"get-satoshi":0.16666666666666666},"500":{"docs":0.16666666666666666,"bitcoin":0.16666666666666666,"api":0.16666666666666666,"ordinals":0.16666666666666666,"satoshis":0.16666666666666666,"get-satoshi-inscriptions":0.16666666666666666},"501":{"docs":0.3333333333333333,"bitcoin":0.3333333333333333,"api":0.3333333333333333},"502":{"docs":0.3333333333333333,"bitcoin":0.3333333333333333,"indexer":0.3333333333333333},"503":{"docs":0.2,"bitcoin":0.2,"indexer":0.2,"guides":0.2,"run-indexer":0.2},"504":{"docs":0.25,"bitcoin":0.25,"indexer":0.25,"quickstart":0.25},"505":{"docs":0.3333333333333333,"bitcoin":0.3333333333333333,"quickstarts":0.3333333333333333},"506":{"docs":0.3333333333333333,"guides":0.3333333333333333,"contributors-guide":0.3333333333333333},"507":{"docs":0.3333333333333333,"guides":0.3333333333333333,"rate-limiting":0.3333333333333333},"508":{"docs":0.5,"guides":0.5},"509":{"docs":0.3333333333333333,"guides":0.3333333333333333,"sync-a-stacks-node":0.3333333333333333},"510":{"docs":0.3333333333333333,"guides":0.3333333333333333,"installing-docker":0.3333333333333333},"511":{"docs":0.3333333333333333,"guides":0.3333333333333333,"build-a-decentralized-kickstarter":0.3333333333333333},"512":{"docs":0.3333333333333333,"guides":0.3333333333333333,"api-keys":0.3333333333333333},"513":{"docs":0.3333333333333333,"guides":0.3333333333333333,"build-an-nft-marketplace":0.3333333333333333},"514":{"docs":0.3333333333333333,"guides":0.3333333333333333,"using-clarity-values":0.3333333333333333},"515":{"docs":0.3333333333333333,"guides":0.3333333333333333,"sync-a-bitcoin-node":0.3333333333333333},"516":{"docs":0.3333333333333333,"guides":0.3333333333333333,"no-loss-lottery":0.3333333333333333},"517":{"docs":0.3333333333333333,"guides":0.3333333333333333,"docskit":0.3333333333333333}}},"tokenOccurrences":{"id":{"docs":517,"stacks":418,"contributors-guide":3,"get-started":2,"rate-limiting":3,"clarinet-js-sdk":12,"references":6,"simnet":2,"properties":2,"custom-matchers":2,"methods":2,"quickstart":9,"installation":4,"reference":14,"testing-best-practices":1,"archive":9,"guides":24,"stacks-api":2,"token-metadata-api":15,"verify-archive-data":1,"stacks-blockchain":86,"clarinet":15,"concepts":7,"examples":28,"add-a-contract":1,"validate-a-contract":1,"estimate-costs":1,"start-a-development-console":1,"run-a-local-devnet":1,"deploy-a-contract":1,"debug-a-contract":1,"create-deployment-plans":1,"working-with-sbtc":1,"create-a-new-project":1,"platform-api":13,"devnet":6,"bitcoin-node":1,"stop":1,"start":1,"stacks-blockchain-api":2,"chainhooks":7,"list":2,"create":1,"get":2,"update":1,"delete":1,"status":10,"platform":9,"deploy-contracts":1,"create-project":1,"archive-project":1,"faucet":1,"contract-monitoring":1,"create-chainhooks":1,"architecture":2,"info":26,"usage":3,"tokens":14,"fungible-token-metadata":2,"semi-fungible-token-metadata":2,"fungible-tokens":2,"non-fungible-token-metadata":2,"client":5,"get-ft-metadata":1,"hacks":6,"build-a-custom-api":1,"build-a-decentralized-grants-program":1,"ai":1,"build-a-friend-tech-clone":1,"recipes":1,"explorer":7,"build-explorer":3,"clarity":127,"bit-manipulation":1,"basic-arithmetic":1,"optimizations":1,"cryptographic-functions":1,"access-control":1,"functions":119,"tuple":1,"sha256":1,"unwrap":1,"contract-call":1,"buff-to-int-be":1,"int-to-ascii":1,"map-delete":1,"contract-of":1,"keccak256":1,"define-constant":1,"xor":1,"principal-of":1,"get-burn-block-info":1,"fold":1,"define-map":1,"stx-account":1,"define-public":1,"define-data-var":1,"nft-transfer":1,"multiply":1,"default-to":1,"get-stacks-block-info":1,"map":1,"sqrti":1,"log2":1,"and":1,"replace-at":1,"len":1,"sha512-256":1,"divide":1,"bit-and":1,"less-than":1,"ft-burn":1,"use-trait":1,"to-uint":1,"define-trait":1,"int-to-utf8":1,"ok":1,"define-non-fungible-token":1,"ft-transfer":1,"is-err":1,"ft-get-supply":1,"as-max-len":1,"get-tenure-info":1,"bit-xor":1,"define-private":1,"bit-or":1,"var-get":1,"map-set":1,"buff-to-uint-be":1,"define-read-only":1,"nft-burn":1,"is-ok":1,"add":1,"string-to-int":1,"is-none":1,"subtract":1,"principal-destruct":1,"to-consensus-buff":1,"stx-burn":1,"from-consensus-buff":1,"bit-shift-right":1,"is-some":1,"is-standard":1,"unwrap-err-panic":1,"append":1,"stx-transfer":1,"unwrap-panic":1,"impl-trait":1,"to-int":1,"greater-than":1,"not":1,"get-block-info":1,"string-to-uint":1,"buff-to-uint-le":1,"unwrap-err":1,"define-fungible-token":1,"at-block":1,"secp256k1-recover":1,"begin":1,"err":1,"or":1,"try":1,"map-insert":1,"some":1,"secp256k1-verify":1,"match":1,"let":1,"map-get":1,"is-eq":1,"bit-shift-left":1,"var-set":1,"less-than-or-equal":1,"filter":1,"ft-mint":1,"buff-to-int-le":1,"element-at":1,"sha512":1,"concat":1,"index-of":1,"stx-transfer-memo":1,"pow":1,"nft-mint":1,"bit-not":1,"hash160":1,"merge":1,"ft-get-balance":1,"greater-than-or-equal":1,"as-contract":1,"asserts":1,"slice":1,"nft-get-owner":1,"if":1,"mod":1,"stx-get-balance":1,"print":1,"principal-construct":1,"handling-optionals-and-errors":1,"time-and-blocks":1,"web-app-development":1,"token-development":1,"signer-metrics-api":14,"blocks":15,"aggregated-signer-information-for-a-block":1,"aggregated-signer-information-for-most-recent-blocks":1,"prometheus":2,"metrics":1,"signers":3,"pox-cycle-signer":1,"pox-cycle-signers":1,"block-proposals":3,"signer-information-for-a-block":1,"signer-information-for-most-recent-block-proposals":1,"nakamoto":5,"stacks-js":2,"unit-testing":1,"smart-contract-development":1,"js":24,"v6":2,"transactions":20,"network":3,"roadmap":1,"broadcast-transactions":2,"post-conditions":2,"use-with-react-native":1,"packages":5,"sbtc":2,"common":2,"private-keys":1,"accounts-and-addresses":1,"networks":1,"broadcasting":1,"integration-testing":1,"migration-guide":1,"api-keys":3,"api":170,"token-metadata":7,"pagination":1,"authentication":1,"nonce-handling":1,"get-block":1,"recent-blocks":1,"block-by-hash":1,"get-blocks-by-burn-block":1,"block-by-burn-block-height":1,"average-times":1,"get-blocks":1,"block-by-burn-block-hash":1,"block-by-height":1,"names":12,"name-subdomains":1,"name-zonefile":1,"owned-by-address":1,"namespace-names":1,"namespaces":1,"name-details":1,"historical-zonefile":1,"fees":5,"fee-rate":1,"stacking-rewards":6,"recent-burnchain-reward-recipients":1,"recent-burnchain-reward-recipient":1,"recent-reward-slot-holders":1,"recent-reward-slot-holder-entries":1,"total-burnchain-rewards-for-recipient":1,"proof-of-transfer":6,"cycles":1,"signer-in-cycle":1,"cycle":1,"signers-in-cycle":1,"stackers-for-signer-in-cycle":1,"search":2,"search-by-id":1,"total-and-unlocked-stx-supply":1,"network-given-block-time":1,"circulating-stx-supply-in-plain-text":1,"network-block-time":1,"total-stx-supply-in-plain-text":1,"legacy-total-and-unlocked-stx-supply":1,"address-transactions":1,"events-for-an-address-transaction":1,"transaction-events":1,"statistics-for-mempool-transactions":1,"transactions-for-address":1,"dropped-mempool-transactions":1,"get-transaction":1,"details-for-transactions":1,"recent-transactions":1,"mempool-transactions":1,"transactions-by-block":1,"get-raw-transaction":1,"stacking-pool":2,"members":1,"faucets":2,"stx":1,"accounts":11,"transactions-with-transfers":1,"balances":9,"nft-events":1,"assets":1,"transaction-with-transfers":1,"latest-nonce":1,"stx-balances":1,"inbound-stx-transfers":1,"smart-contracts":12,"events":1,"by-trait":1,"mempool":2,"transaction-fee-priorities":1,"burn-blocks":3,"get-burn-block":1,"get-burn-blocks":1,"holders":3,"non-fungible-tokens":4,"holdings":1,"mints":1,"history":1,"getting-started":1,"requesting-proofs":1,"setup":1,"testing-environments":1,"blockchain-development":1,"connect":9,"support":1,"authenticate-users":1,"sign-messages":1,"migration":1,"clarinet-sdk":1,"cli":2,"chainhook":10,"scopes":2,"bitcoin":88,"chainhook-as-a-service-with-stacks-node":1,"register-chainhooks-on-devnet":1,"chainhook-as-a-service":1,"observing-contract-calls":1,"predicate-design":1,"quickstarts":8,"event-streaming":1,"wallet-integration":1,"app-templates":1,"nft-minting":1,"contract-templates":1,"token-transfers":1,"rpc-api":31,"block-proposal":1,"pox":3,"stacker-set":1,"pox-details":1,"namespace-price":1,"name-price":1,"estimate":1,"transfer-estimate":1,"core-api":1,"broadcast-transaction":1,"v3":4,"tenure-metadata":1,"nakamoto-block":1,"tenure-blocks":1,"interface":1,"traits":1,"map-entry":1,"read-only":1,"source":1,"constants":1,"burn-ops":2,"get-burn-operations":1,"runes":35,"runehook":3,"address":2,"holder-balance":2,"activities":10,"for-transaction":2,"for-address":2,"for-block":2,"activity":2,"etchings":6,"get-etchings":2,"get-etching":2,"ordinals":42,"statistics":4,"get-stats-inscription-count":2,"brc20":12,"get-brc20-token-holders":2,"get-brc20-balances":2,"get-brc20-token-details":2,"get-brc20-tokens":2,"get-brc20-activity":2,"inscriptions":12,"get-inscription-transfers":2,"get-inscriptions":2,"get-inscription-content":2,"get-transfers-per-block":2,"get-inscription":2,"satoshis":6,"get-satoshi":2,"get-satoshi-inscriptions":2,"indexer":3,"run-indexer":1,"sync-a-stacks-node":1,"installing-docker":1,"build-a-decentralized-kickstarter":1,"build-an-nft-marketplace":1,"using-clarity-values":1,"sync-a-bitcoin-node":1,"no-loss-lottery":1,"docskit":1},"title":{"256":1,"contributors":3,"guide":5,"introduction":2,"rate":4,"limiting":3,"simnet":2,"properties":2,"custom":3,"matchers":2,"methods":2,"overview":21,"quickstart":9,"installation":4,"sdks":1,"libraries":1,"best":1,"practices":1,"use":3,"the":9,"stacks":25,"blockchain":5,"api":15,"archive":5,"token":18,"metadata":9,"verify":1,"data":1,"concepts":1,"add":2,"a":32,"contract":13,"validate":2,"estimating":1,"costs":1,"start":2,"development":5,"console":1,"run":3,"local":1,"devnet":6,"deploy":2,"debug":1,"create":6,"deployment":1,"plans":1,"working":1,"with":6,"sbtc":3,"new":1,"project":3,"bitcoin":3,"node":4,"stop":1,"get":149,"all":5,"chainhooks":3,"chainhook":9,"specific":1,"update":1,"delete":1,"status":14,"home":3,"contracts":6,"request":1,"testnet":2,"stx":8,"using":3,"monitor":1,"architecture":2,"info":8,"usage":3,"tokens":10,"fungible":6,"semi-fungible":2,"non-fungible":6,"build":9,"decentralized":2,"grants":1,"program":1,"ai":1,"x":1,"friend":1,"tech":1,"clone":1,"recipe":1,"for":23,"hiro":1,"cookbook":1,"explorer":4,"bit":1,"manipulation":1,"basic":1,"arithmetic":1,"map":3,"functions":2,"cryptographic":1,"access":1,"control":1,"list":1,"tuple":1,"sha256":1,"unwrap":1,"contract-call":1,"buff-to-int-be":1,"int-to-ascii":1,"map-delete":1,"contract-of":1,"keccak256":1,"define-constant":1,"xor":1,"principal-of":1,"get-burn-block-info":1,"fold":1,"define-map":1,"stx-account":1,"define-public":1,"define-data-var":1,"nft-transfer":1,"multiply":1,"default-to":1,"get-stacks-block-info":1,"sqrti":1,"log2":1,"and":5,"replace-at":1,"len":1,"sha512":2,"divide":1,"bit-and":1,"less":2,"than":4,"ft-burn":1,"use-trait":1,"to-uint":1,"define-trait":1,"int-to-utf8":1,"ok":1,"define-non-fungible-token":1,"ft-transfer":1,"is-err":1,"ft-get-supply":1,"as-max-len":1,"get-tenure-info":1,"bit-xor":1,"define-private":1,"bit-or":1,"var-get":1,"map-set":1,"buff-to-uint-be":1,"define-read-only":1,"nft-burn":1,"is-ok":1,"string-to-int":1,"is-none":1,"subtract":1,"principal-destruct":1,"to-consensus-buff":1,"stx-burn":1,"from-consensus-buff":1,"bit-shift-right":1,"is-some":1,"is-standard":1,"unwrap-err-panic":1,"append":1,"stx-transfer":1,"unwrap-panic":1,"impl-trait":1,"to-int":1,"greater":2,"not":1,"get-block-info":1,"string-to-uint":1,"buff-to-uint-le":1,"unwrap-err":1,"define-fungible-token":1,"at-block":1,"secp256k1-recover":1,"begin":1,"err":1,"or":3,"try":1,"map-insert":1,"some":1,"secp256k1-verify":1,"match":1,"let":1,"map-get":1,"is-eq":1,"bit-shift-left":1,"var-set":1,"equal":2,"filter":1,"ft-mint":1,"buff-to-int-le":1,"element-at":1,"concat":1,"index-of":1,"stx-transfer-memo":1,"pow":1,"nft-mint":1,"bit-not":1,"hash160":1,"merge":1,"ft-get-balance":1,"as-contract":1,"asserts":1,"slice":1,"nft-get-owner":1,"if":1,"mod":1,"stx-get-balance":1,"print":1,"principal-construct":1,"optional":1,"values":2,"error":1,"handling":2,"time-based":1,"logic":1,"web":1,"app":2,"blocks":10,"aggregated":2,"signer":8,"information":5,"block":23,"most":2,"recent":8,"prometheus":2,"metrics":2,"signers":3,"pox":7,"cycle":6,"proposals":2,"updates":4,"clarinet":2,"js":4,"unit":1,"testing":3,"smart":3,"transactions":18,"network":4,"announcing":1,"v7":1,"broadcast":3,"deep":1,"dive":1,"into":1,"post-conditions":2,"react":1,"native":1,"common":2,"private":1,"keys":4,"wallets":1,"accounts":2,"addresses":1,"networks":1,"broadcasting":1,"integration":2,"migration":2,"pagination":1,"apis":2,"authentication":1,"nonce":2,"by":9,"hash":2,"burn":6,"burnchain":5,"height":2,"average":1,"times":1,"names":5,"name":4,"subdomains":1,"zone":2,"file":2,"owned":1,"address":8,"namespace":2,"namespaces":1,"details":6,"historical":1,"fee":3,"fees":3,"reward":4,"recipients":1,"stacking":3,"rewards":2,"given":4,"recipient":2,"slot":2,"holders":6,"holder":3,"entries":1,"total":4,"cycles":1,"proof":2,"of":2,"transfer":3,"in":5,"stackers":1,"search":2,"id":1,"unlocked":2,"supply":4,"network's":1,"target":2,"time":2,"circulating":1,"plain":2,"text":2,"format":2,"legacy":1,"events":4,"an":4,"transaction":10,"statistics":3,"mempool":4,"dropped":1,"raw":1,"pool":3,"members":1,"faucets":1,"account":6,"transfers":8,"user":1,"balances":7,"nft":3,"assets":1,"latest":1,"balance":3,"inbound":1,"trait":2,"priorities":1,"holdings":1,"mints":1,"history":1,"getting":1,"started":2,"requesting":1,"proofs":1,"developer":1,"environment":1,"setup":1,"environments":1,"wallet":2,"support":1,"authenticate":1,"users":1,"sign":1,"messages":1,"connect":2,"hirosystems":1,"clarinet-sdk":1,"cli":2,"blockchain-api-client":1,"scopes":2,"as":2,"service":2,"register":1,"on":1,"observing":1,"calls":1,"predicate":1,"design":1,"quickstarts":2,"event":1,"streaming":1,"templates":2,"minting":1,"proposed":1,"stacker":1,"set":1,"proof-of-transfer":1,"price":2,"approximate":1,"estimate":1,"core":1,"v3":1,"nakamoto":3,"tenure":2,"interface":1,"implementation":1,"entry":1,"call":1,"read-only":1,"function":1,"source":1,"constant":1,"value":1,"operations":2,"ordinals":2,"rune":2,"activities":2,"activity":10,"etchings":4,"etching":2,"inscription":8,"count":2,"per":4,"brc-20":12,"inscriptions":6,"content":2,"satoshis":2,"satoshi":4,"ordinal":2,"tbd":1,"how":3,"to":3,"sync":2,"install":1,"docker":1,"kickstarter":1,"marketplace":1,"clarity":1,"no-loss":1,"lottery":1,"docskit":1},"description":{"0":1,"1":1,"2":3,"3":1,"256":1,"learn":40,"how":44,"to":112,"contribute":3,"hiro's":3,"documentation":3,"and":103,"content":5,"get":23,"started":2,"with":64,"the":202,"stacks":73,"ecosystem":2,"understand":6,"rate":8,"limits":6,"for":154,"hiro":27,"apis":4,"stx":25,"faucet":3,"simnet":6,"class":3,"is":16,"main":3,"entry":8,"point":3,"clarinet":27,"js":26,"sdk":16,"it":5,"provides":11,"properties":5,"methods":5,"interacting":6,"network":19,"that":23,"can":12,"be":8,"used":8,"interact":9,"a":230,"set":6,"of":109,"vitest":5,"matchers":2,"make":3,"assertions":3,"on":44,"clarity":139,"values":7,"several":2,"javascript":7,"library":9,"write":3,"unit":2,"tests":4,"smart":147,"contracts":144,"test":3,"simple":2,"counter":2,"contract":29,"using":22,"installed":1,"your":36,"preferred":1,"package":3,"manager":1,"following":7,"guides":6,"cover":6,"ways":8,"use":41,"tools":7,"build":20,"apps":7,"best":1,"practices":1,"writing":1,"running":5,"archive":5,"series":2,"data":19,"snapshots":1,"services":2,"in":150,"discover":10,"spin":3,"up":4,"blockchain":31,"api":43,"token":33,"metadata":13,"verify":5,"integrity":1,"particular":3,"snapshot":1,"node":9,"local":5,"development":11,"environment":4,"offers":1,"everything":1,"you":10,"need":4,"create":20,"deploy":5,"about":38,"concepts":1,"behind":1,"handle":7,"adding":1,"configuring":1,"new":6,"project":6,"syntax":1,"semantics":1,"checkers":1,"language":1,"analyze":2,"execution":1,"costs":3,"pertaining":1,"launch":1,"console":1,"interactive":1,"integrate":2,"publish":1,"devnet":10,"testnet":5,"or":21,"mainnet":4,"networks":2,"step":1,"through":8,"debug":1,"inside":2,"command":1,"line":1,"deployment":2,"plans":1,"helps":1,"building":6,"testing":2,"deploying":2,"sbtc":3,"once":1,"install":3,"leverage":1,"programmatic":1,"access":2,"order":2,"seamlessly":1,"manage":6,"chainhooks":4,"proxy":2,"bitcoin":28,"retrieves":164,"information":66,"platform":14,"such":2,"as":8,"more":1,"stop":1,"start":1,"all":20,"chainhook":13,"specific":31,"update":1,"delete":1,"retrieve":17,"status":14,"developer":1,"scaling":1,"import":2,"projects":4,"easily":1,"request":1,"so":3,"validate":2,"code":2,"devnet's":1,"private":2,"monitor":2,"custom":2,"alerts":1,"after":1,"first":4,"app":3,"fetch":8,"any":1,"fungible":15,"non-fungible":15,"semi-fungible":3,"architecture":2,"including":14,"server":7,"version":8,"go":1,"over":1,"multiple":3,"requests":5,"tokens":24,"sip-010":2,"sip-009":2,"client":2,"less":5,"than":7,"minutes":3,"ids":1,"uris":1,"traits":5,"list":52,"assets":1,"events":8,"associated":7,"an":30,"account":12,"identifier":6,"decentralized":2,"grants":1,"program":1,"governance":1,"submissions":1,"voting":2,"something":1,"combines":1,"ai":1,"capabilities":1,"social":1,"own":1,"recipe":1,"cookbook":1,"share":1,"community":1,"coding":1,"challenges":1,"sharpen":1,"skills":1,"explore":4,"run":6,"instance":1,"explorer":2,"bit":1,"manipulation":1,"compact":1,"storage":2,"flags":1,"brief":2,"overview":2,"arithmetic":5,"operations":14,"their":5,"importance":2,"master":1,"clarity's":1,"built-in":1,"functions":11,"optimizing":1,"retrieval":2,"map":7,"cryptographic":1,"permissions":1,"control":2,"principal":14,"construct":8,"lists":3,"tuples":2,"group":1,"named":1,"fields":1,"compute":5,"sha-256":1,"hash":10,"value":15,"unpack":4,"optional":9,"response":5,"types":3,"execute":2,"public":7,"other":2,"from":17,"within":3,"convert":10,"byte":4,"buffer":7,"signed":4,"integer":10,"big-endian":2,"encoding":4,"integers":2,"ascii":1,"string":4,"representations":2,"remove":1,"implementing":2,"trait":2,"keccak-256":1,"define":9,"immutable":1,"constants":1,"perform":1,"bitwise":7,"exclusive":2,"operation":3,"derive":1,"key":3,"burnchain":6,"blocks":14,"reduce":1,"sequence":7,"single":14,"query":3,"mutable":1,"variables":4,"transfer":8,"ownership":1,"nft":7,"multiplication":1,"function":26,"provide":5,"default":1,"apply":1,"each":3,"element":4,"calculate":4,"square":1,"root":1,"number":7,"base-2":1,"logarithm":1,"logical":3,"replace":1,"at":7,"index":4,"length":2,"sha-512":2,"division":2,"bit-and":1,"comparisons":4,"burn":8,"tuple":1,"unsigned":5,"interface-like":1,"behavior":2,"utf-8":1,"successful":1,"type":5,"between":2,"principals":2,"check":6,"if":6,"error":5,"total":6,"supply":7,"as-max-len":1,"limit":1,"lengths":1,"tenures":1,"bit-xor":1,"bit-or":1,"variable":2,"read-only":4,"ok":1,"addition":1,"none":1,"subtraction":1,"decompose":1,"into":4,"its":3,"components":1,"serialize":1,"consensus":1,"principal's":1,"deserialize":1,"bit-shift-right":1,"right":1,"shift":2,"some":1,"standard":4,"responses":3,"throwing":2,"runtime":2,"errors":3,"append":1,"add":1,"elements":2,"considerations":1,"maximum":1,"implement":1,"greater":2,"negation":1,"little-endian":2,"at-block":1,"evaluate":5,"expressions":5,"block":34,"recover":1,"message":3,"signature":2,"begin":1,"disjunction":1,"try":1,"insert":1,"against":3,"different":4,"branches":1,"cases":2,"bind":1,"compare":1,"equality":1,"bit-shift-left":1,"left":1,"equal":2,"filter":3,"based":3,"predicate":1,"mint":3,"concatenate":1,"sequences":1,"find":1,"memo":1,"field":1,"power":1,"bit-not":1,"complement":1,"ripemd160":1,"sha256":1,"x":2,"merge":1,"balance":6,"as-contract":1,"asserts":1,"conditional":2,"extract":1,"sub-sequence":1,"owner":1,"evaluation":1,"remainder":1,"printing":1,"safely":1,"handling":1,"time-based":1,"logic":1,"info":3,"web":5,"aggregated":3,"signer":12,"most":2,"recent":6,"service":3,"endpoints":4,"displays":1,"current":1,"workload":1,"prometheus":2,"metrics":2,"signers":4,"stats":3,"given":26,"pox":10,"cycle":7,"proposals":2,"updates":3,"related":7,"nakamoto":8,"upgrade":4,"upgrades":1,"release":1,"changes":1,"decode":3,"transactions":26,"work":3,"working":5,"nodes":4,"collection":1,"libraries":1,"applications":4,"future":1,"broadcast":8,"this":2,"guide":3,"explains":1,"post-conditions":1,"secure":1,"react":1,"native":1,"ts":2,"helper":2,"common":2,"utilities":2,"secrets":1,"address":19,"installing":1,"packages":1,"integration":1,"migrate":2,"existing":1,"developers":3,"who":3,"beyond":3,"paginate":1,"authenticate":2,"nonces":1,"recently":4,"mined":3,"details":15,"chain":2,"height":6,"management":1,"various":1,"identifiers":1,"confirmed":2,"by":12,"average":1,"times":2,"names":5,"known":2,"subdomains":1,"name":5,"zone":2,"file":2,"manages":2,"namespaces":3,"owned":2,"namespace":2,"last":1,"transaction":16,"id":7,"historical":1,"estimated":4,"fee":4,"estimates":2,"rates":2,"approximate":2,"calculations":2,"e":3,"g":3,"reward":2,"recipients":2,"amounts":3,"rewards":3,"earned":1,"recipient":3,"addresses":3,"would":2,"validly":2,"receive":2,"proof-of-transfer":4,"commitments":2,"slot":1,"holder":3,"cycles":2,"stackers":2,"search":2,"accounts":1,"unlocked":2,"target":3,"time":1,"circulating":1,"plain":2,"text":2,"core":3,"legacy":1,"format":2,"sent":1,"received":1,"statistics":3,"mempool":6,"counts":1,"ages":1,"fees":2,"recently-broadcast":1,"have":3,"been":3,"dropped":1,"these":1,"are":4,"pending":1,"awaiting":1,"confirmation":1,"hex":1,"encoded":1,"serialized":1,"stacking":3,"pool":3,"members":2,"delegator":2,"distribute":1,"specified":4,"delivers":1,"transfers":7,"asset":2,"latest":1,"nonce":1,"inspecting":1,"anchored":1,"memos":1,"triggered":1,"listed":1,"json":1,"-":1,"maps":2,"facilitate":2,"interactions":2,"around":1,"priorities":2,"micro-stx":1,"currently":1,"also":1,"returns":1,"separated":1,"burned":1,"obtain":2,"holders":7,"mints":1,"history":1,"proof":2,"setup":1,"configure":1,"environments":1,"authenticating":1,"users":5,"well":1,"signing":1,"messages":1,"compatibility":1,"wallet":3,"providers":1,"connect":5,"user":1,"wallets":1,"prompt":2,"sign":2,"them":2,"prove":1,"they":1,"authorize":1,"in-app":1,"action":1,"v7":1,"v8":1,"connected":2,"via":4,"cli":3,"command-line":2,"tool":3,"creating":1,"reference":2,"available":2,"scopes":2,"enables":3,"important":1,"case":1,"trigger":1,"actions":1,"those":1,"predicates":3,"register":1,"then":1,"blockchains":1,"observe":1,"call":1,"scan":3,"allows":2,"event":3,"streams":3,"stream":1,"template":2,"proposal":1,"proposed":1,"stacker":1,"price":2,"supplied":1,"rpc":2,"familiar":1,"rest":3,"interface":3,"broadcasts":1,"raw":1,"ongoing":1,"tenure":2,"determine":1,"whether":1,"not":1,"implemented":1,"either":1,"explicitly":1,"implicitly":1,"calls":1,"source":1,"along":1,"was":2,"published":1,"marf":1,"constant":1,"op_type":2,"successfully":2,"read":2,"burn_height":2,"ordinals":12,"brc-20":16,"runes":3,"runehook":2,"rune":25,"accurate":2,"lightweight":2,"databases":2,"gracefully":2,"forks":2,"reorgs":2,"activity":12,"developed":1,"environment-agnostic":1,"below":1,"indexer":2,"machine":1,"fast":2,"reliable":2,"easy-to-use":2,"paginated":10,"balances":8,"activities":2,"etchings":4,"etching":2,"inscriptions":10,"per":4,"revealed":2,"filtered":2,"ticker":2,"inscription":8,"options":2,"sort":2,"results":2,"ocurred":2,"ordinal":4,"satoshis":2,"satoshi":4,"tbd":1,"sync":2,"docker":1,"crowdfunding":1,"enabling":1,"creators":1,"fund":1,"without":1,"third":1,"party":1,"marketplace":1,"nfts":1,"sale":1,"purchase":1,"no-loss":1,"lottery":1,"leverages":1,"yield":1,"docskit":1,"usage":1},"content":{"0":61,"1":190,"2":179,"3":171,"4":156,"5":40,"6":14,"7":19,"8":14,"9":6,"10":37,"11":6,"12":3,"13":2,"14":1,"15":5,"16":8,"17":1,"18":2,"19":2,"20":15,"21":2,"22":4,"24":1,"25":2,"26":2,"27":2,"30":4,"32":23,"33":4,"34":4,"36":1,"37":3,"38":1,"40":10,"41":2,"42":10,"50":13,"53":2,"58":2,"61":2,"64":2,"65":3,"81":1,"87":2,"100":16,"101":2,"102":3,"108":3,"109":2,"111":3,"120":2,"121":1,"123":6,"128":3,"138":2,"142":1,"144":2,"163":1,"165":1,"191":2,"193":2,"195":2,"200":3,"201":1,"206":2,"220":2,"222":3,"223":2,"242":2,"245":3,"246":2,"250":2,"255":1,"256":6,"308":1,"315":2,"450":1,"456":1,"500":5,"602":2,"750":1,"770":2,"1000":17,"1011":1,"1309":1,"1337":1,"1440":1,"2000":1,"2025":2,"2801":1,"3000":5,"3999":2,"4096":2,"4752":2,"4791":1,"5432":1,"5893":1,"5894":1,"5960":2,"6379":2,"6940":1,"8332":3,"8333":1,"8400":1,"10000":4,"10200":2,"12345":4,"14461":1,"15000":2,"18443":1,"18543":3,"20443":4,"20444":1,"20455":1,"20456":2,"21443":2,"21544":1,"32000":2,"34239":1,"50000":1,"90232":1,"101922":1,"108606":1,"138339":1,"141200":1,"142221":1,"154670":1,"233382":1,"262144":2,"443257":1,"545094":1,"595650":7,"700000":1,"801500":1,"802000":1,"1000000":3,"1048576":2,"3000000":2,"15000000":2,"19000000":4,"42000000":4,"100000000":4,"385875968":2,"1600000000":1,"1622875042":1,"1722208524":1,"1726104636":2,"2147483647":1,"import":139,"contributorsguidecontent":3,"from":225,"'":272,"content":14,"_shared":9,"contributors-guide":3,"mdx'":9,"components":125,"props":9,"secondarycard":33,"card'":35,"lfg":6,"related":147,"tools":48,"-":207,"clarinet":49,"stacks":143,"build":44,"your":219,"app":36,"in":238,"a":276,"local":46,"environment":23,"on":165,"js":67,"don":11,"t":17,"reinvent":8,"the":281,"wheel":8,"and":270,"faster":15,"with":258,"library":28,"that":224,"handles":19,"basic":41,"blockchain":98,"functionality":31,"api":97,"fetch":37,"data":164,"broadcast":35,"transactions":77,"br":18,"callout":92,"title":104,"need":197,"help":39,"building":61,"sdk":30,"type":131,"reach":31,"out":67,"to":279,"us":33,"span":27,"classname":65,"font-bold":20,"channel":29,"discord":32,"https":85,"chat":30,"under":30,"hiro":63,"developer":32,"section":45,"there's":22,"also":62,"weekly":25,"office":25,"hours":30,"www":30,"addevent":20,"com":64,"event":42,"ki22007085":20,"call":64,"every":38,"wednesday":20,"at":73,"1pm":20,"et":26,"ratelimitingcontent":3,"rate-limiting":4,"accordion":44,"accordioncontent":5,"accordionitem":5,"accordiontrigger":5,"ui":56,"badge":33,"badge'":30,"tabs":41,"tabscontent":28,"tabslist":28,"tabstrigger":28,"tabs'":37,"initsimnet":3,"function":176,"initializes":3,"simulated":7,"network":61,"it":187,"will":154,"often":24,"be":177,"first":47,"you":241,"when":159,"using":202,"parameters":25,"manifestpath":5,"is":224,"path":188,"toml":17,"manifest":7,"file":50,"defaultvalue":19,"default":61,"'flex":26,"flex-wrap'":14,"value":119,"'tab":17,"group'":17,"'transition-colors'":3,"creating":67,"new":94,"instance":17,"of":236,"simnet":20,"custom":37,"'badge":17,"transition-colors'":15,"config":17,"ts":54,"hirosystems":35,"clarinet-sdk'":5,"const":59,"await":46,"toml'":3,"single":37,"collapsible":5,"w-full":5,"schema":8,"string":40,"promise":5,"accordions":39,"'fumadocs-ui":59,"accordion'":29,"blockheight":7,"returns":120,"current":44,"block":55,"height":26,"getting":14,"currentblockheight":2,"response":70,"deployer":10,"address":79,"as":121,"defined":18,"project":39,"set-deployer":2,"setting":26,"currentdeployeraddress":2,"st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":15,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5'":6,"newdeployer":2,"st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":6,"currentepoch":2,"epoch":12,"this":224,"represents":17,"blockchain's":7,"progress":6,"through":25,"discrete":2,"time":46,"periods":4,"cycles":13,"or":189,"upgrades":2,"tohaveclaritytype":2,"check":88,"has":51,"right":14,"clarity":177,"without":53,"checking":38,"its":46,"expected":20,"should":42,"have":61,"for":266,"an":156,"ok":107,"result":51,"callpublicfn":10,"'counter'":5,"'increment'":3,"expect":14,"claritytype":4,"responseok":2,"source":6,"code":139,"counter":19,"clar":21,"define-data-var":42,"count":13,"uint":123,"u0":63,"define-public":100,"increment":14,"begin":42,"var-set":37,"var-get":42,"u1":68,"expectedtype":2,"tobeok":8,"ok-type":5,"any":57,"can":162,"passed":17,"clarityvalue":7,"specific":63,"cl":21,"tobeerr":2,"err":69,"error-type":2,"'add'":2,"define-constant":31,"too_big":3,"u10":13,"add":43,"amount":75,"let":67,"new-count":2,"if":142,"u500":3,"tobesome":2,"some":58,"optional":69,"callreadonlyfn":9,"'pool'":4,"'get-participant'":4,"standardprincipal":5,"bool":46,"true":93,"pool":12,"define-map":60,"participants":9,"principal":127,"participantstatus":4,"enrollmentblock":4,"contributionamount":4,"define-read-only":98,"get-participant":5,"who":22,"map-get":59,"map-set":59,"'st1sj3dte5dn7x54ydh5d64r3bcb6a2ag2zq8ypd5":8,"u19000000":4,"tobenone":2,"none":49,"tobebool":2,"asserts":36,"boolean":24,"false":212,"'has-contributed'":2,"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm'":4,"has-contributed":2,"is-some":8,"get":80,"tx-sender":81,"tobeint":2,"integer":48,"1n":4,"int":59,"number":43,"bigint":7,"tobeuint":8,"unsigned":30,"tobeascii":2,"string-ascii":41,"'hello-world'":5,"'say-hi'":3,"'hello":5,"world'":3,"hello-world":5,"say-hi":5,"hello":9,"world":13,"tobeutf8":2,"string-utf8":16,"u":6,"tobeprincipal":2,"standard":17,"contract":192,"options":18,"contractprincipal":3,"tobebuff":2,"buffer":25,"takes":10,"arraybuffer":2,"input":125,"provides":53,"helper":19,"functions":167,"bufferfromascii":3,"bufferfromutf8":4,"bufferfromhex":2,"uint8array":7,"ascii":6,"hex":14,"'helpers'":2,"'get-byte-array'":2,"helpers":10,"0x01020304":2,"get-byte-array":2,"transactions'":31,"'get-btc-buffer'":2,"btc":12,"'btc'":2,"ascii_btc":2,"0x627463":2,"get-btc-buffer":2,"get-tx-hash":2,"tx":22,"73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e":2,"tx_hash":2,"0x73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e":2,"tobelist":2,"list":42,"containing":21,"array":19,"values":97,"'get-addresses'":2,"'st2cy5v39nhdpwsxmw9qdt3hc3gd6q6xx4cfrk9ag'":2,"get-addresses":2,"'st1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":8,"'st2cy5v39nhdpwsxmw9qdt3hc3gd6q6xx4cfrk9ag":3,"tobetuple":3,"tuple":21,"object":34,"'get-participant-data'":2,"get-participant-data":2,"record":7,"getaccounts":8,"retrieve":32,"all":119,"addresses":26,"configured":8,"within":58,"including":31,"wallets":17,"deployers":2,"faucets":3,"get-accounts":2,"accounts":28,"get-account":2,"selecting":3,"account":28,"map":43,"wallet_7":2,"st3pf13w7z0rrm42a8vzrvfq75sv1k26rxep8ygkj":2,"wallet_1":5,"wallet_3":3,"st2jhg361zxg51qtky2nqcvbpprre2kzb1hr05nnc":2,"wallet_5":2,"st2rehhs5j3cercrbepmgh7921q6pykaadt7jp2vb":2,"wallet_8":2,"st3nbrsfkx28fq2zj1makx58hkhsdgnv5n7r21xcp":3,"wallet_4":2,"st2neb84asendxkygjpqw86yxqcefex2zqpg87nd":2,"wallet_6":2,"st3am1a56ak2c1xafj4115zsv26eb49bvq10mgcs0":2,"wallet_2":3,"st2cy5v39nhdpwsxmw9qdt3hc3gd6q6xx4cfrk9ag":2,"faucet":5,"stnhkepyepj8et55zz0m5a34j0r3n5fm2cmmmaz6":2,"wallet":26,"'wallet_1'":7,"getassetsmap":2,"asset":18,"balances":22,"associated":19,"fungible":21,"non-fungible":18,"tokens":65,"stx":46,"get-ft-balance":2,"ft":10,"get-nft-balance":2,"nft":30,"get-deployer-balance":2,"filtering":4,"assets":10,"stxbalances":2,"'stx'":2,"100000000000000n":2,"contractname":13,"'token'":3,"sourcecode":2,"define-fungible-token":10,"sbtc":7,"ft-mint":9,"u19":2,"deploycontract":3,"null":6,"tokenbalance":2,"token":64,"sbtc'":2,"19n":2,"'nft'":2,"define-non-fungible-token":9,"ticket":8,"nft-mint":9,"u42":4,"nftbalance":2,"ticket'":2,"deployerbalance":2,"getdatavar":7,"data-var":3,"identifier":15,"example":174,"name":70,"variable":83,"clarity-value":2,"converting":18,"currentcount":2,"'count'":5,"contractowner":4,"datavar":2,"cvtovalue":2,"getmapentry":2,"entry":11,"by":202,"key":53,"note":38,"method":191,"always":91,"return":60,"just":24,"like":56,"access":54,"hasparticipated":2,"mapname":6,"mapkey":2,"read-only":37,"exposed":2,"arguments":20,"form":10,"which":84,"are":134,"available":36,"package":32,"packages":17,"pass":13,"no":30,"needed":31,"empty":13,"sender":35,"making":22,"with-no-arguments":2,"explicit":5,"getcontributionamount":2,"'get-contribution-amount'":2,"get-contribution-amount":2,"default-to":51,"is-active":2,"block-height":20,"u42000000":2,"420000000n":2,"parsedtransactionresult":2,"events":38,"clarityevent":2,"args":6,"isactive":4,"'is-active'":2,"'deployer'":2,"contractaddress":10,"getparticipant":2,"42000000n":2,"public":85,"fired":2,"during":24,"execution":24,"simulate":8,"being":27,"mined":6,"increase":4,"one":55,"register-participant":3,"broadcasting":10,"transaction":56,"registerparticipant":2,"'register-participant'":2,"print":12,"message":20,"registered":5,"eventvalues":2,"callprivatefn":2,"private":31,"reward-participant-points":2,"address1":3,"rewardparticipantpoints":2,"participantpoints":2,"define-private":16,"map-insert":10,"transferstx":3,"transfer":56,"another":32,"transferred":5,"ustx":8,"equals":6,"recipient":53,"transferring":14,"stx_transfer_event":2,"memo":19,"deploy":28,"deployed":15,"specify":24,"such":14,"version":44,"clarityversion":7,"deploying":15,"specifying":9,"interact":29,"interacting":19,"deploycontractoptions":2,"sayhi":2,"mineblock":2,"methods":31,"mine":2,"only":45,"useful":23,"multiple":46,"what":35,"objects":8,"built":6,"exported":2,"three":11,"these":53,"same":41,"interface":32,"but":39,"instead":33,"performing":24,"they":31,"epochs":3,"chaintip":2,"advanced":16,"separately":2,"burn":13,"means":7,"affect":3,"you'd":2,"blocks":50,"use":209,"mineemptyburnblock":2,"included":6,"mining":4,"foreach":3,"console":34,"log":34,"length":26,"txs":2,"mineemptyblock":2,"mineemptyblocks":2,"certain":39,"parameter":15,"runsnippet":2,"execute":14,"arbitrary":2,"directly":20,"allows":110,"test":29,"smart":187,"them":25,"snippet":4,"executed":10,"get-balance":11,"stx-balance":2,"executing":10,"running":34,"codesnippet":2,"stx-account":5,"prettyprint":3,"locked":4,"unlock-height":3,"unlocked":2,"u100000000000000":2,"stx-transfer":25,"getcontractsinterfaces":2,"interfaces":11,"contracts":193,"keys":26,"contain":12,"information":55,"data-vars":2,"maps":21,"nfts":9,"fts":3,"filter":14,"contractinterfaces":2,"read_only":2,"outputs":9,"variables":28,"fungible_tokens":2,"non_fungible_tokens":2,"epoch25":2,"clarity_version":5,"clarity2":2,"contractinterface":2,"poolcontract":2,"getcontractsource":3,"requested":8,"contractsource":3,"undefined":3,"getcontractast":2,"full":25,"ast":2,"abstract":11,"syntax":5,"tree":10,"throws":8,"error":100,"fails":14,"encode":2,"contractast":2,"contract_identifier":8,"issuer":2,"pre_expressions":2,"expressions":13,"expr":6,"id":34,"pre_comments":2,"end_line_comment":2,"post_comments":2,"top_level_expression_sorting":2,"referenced_traits":2,"implemented_traits":2,"wasm_module":2,"contractid":2,"write":18,"unit":14,"tests":20,"theoretically":1,"javascript":12,"framework":3,"supports":7,"vitest":8,"box":1,"leverages":8,"offers":10,"rapid":3,"feedback":8,"loop":8,"initial":15,"testing":19,"here":36,"non-exhaustive":1,"simnet's":1,"use-cases":2,"requirements":18,"warn":13,"requires":38,"node":31,"npm":18,"installed":12,"guides":64,"cards":57,"href":61,"clarinet-js-sdk":15,"quickstart":20,"description":65,"learn":52,"how":73,"migrate-to-the-clarinet-sdk":3,"migrate":4,"v1":142,"existing":18,"references":18,"reference":36,"dive":16,"deeper":11,"into":68,"properties":18,"types":58,"chevronright":10,"terminal":57,"'lucide-react'":33,"folder":23,"files":27,"files'":16,"steps":45,"step":22,"steps'":10,"smallcard":17,"guide":47,"initialize":4,"development":32,"you'll":12,"results":33,"page":31,"about":42,"different":52,"ways":5,"---":46,"importing":3,"dependencies":12,"before":47,"we":35,"navigate":8,"'pointer-events-none'":4,"defaultopen":5,"settings":10,"'bg-":3,"hsl":4,"var":4,"--highlight":3,"gitignore":5,"json":193,"tsconfig":5,"describe":7,"namespace":2,"simplifies":7,"process":84,"handling":108,"particularly":8,"environments":3,"where":66,"developers":26,"interactions":16,"accurately":5,"most":20,"cases":84,"want":34,"order":34,"following":48,"uses":31,"achieve":1,"--stacks":5,"flag":8,"required":32,"scan":9,"other":137,"include":18,"--bitcoin":4,"writing":8,"follows":12,"structured":8,"approach":8,"similar":12,"here's":5,"breakdown":1,"involved":1,"define":42,"group":14,"run":46,"assert":2,"now":26,"understand":13,"start":41,"ensures":14,"been":21,"tobedefined":1,"count-up":5,"it's":39,"user's":31,"ensure":114,"behaves":1,"increments":4,"countupcall":1,"getcountcall":1,"get-count":7,"above":14,"called":26,"asserted":1,"then":20,"retrieved":7,"matchers":6,"p":3,"used":157,"proper":66,"more":101,"details":34,"custom-matchers":6,"generated":22,"comes":7,"contains":24,"necessary":18,"scripts":7,"report":8,"--":3,"--coverage":1,"--costs":1,"watch":3,"chokidar":1,"-c":4,"preferred":6,"manager":5,"command":33,"coverage":5,"cost":7,"analysis":5,"automatically":20,"produce":5,"ran":2,"lcov":1,"info":36,"costs-reports":1,"appear":3,"root":19,"output":129,"since":15,"was":28,"our":39,"would":23,"look":12,"test_name":1,"ts__counter":1,"contract__increments":1,"contract_id":4,"cost_result":1,"total":25,"write_length":1,"write_count":1,"read_length":1,"read_count":1,"runtime":28,"limit":11,"5000000000":2,"memory":3,"memory_limit":1,"read":19,"human-readable":4,"format":25,"install":34,"github":44,"linux-test-project":1,"helps":8,"generate":32,"graphical":1,"front-end":2,"brew":5,"we'll":5,"genhtml":1,"below":27,"actual":10,"html":3,"additional":26,"branch":2,"store":23,"--branch-coverage":1,"-o":3,"open":17,"index":21,"view":22,"addition":12,"summary":3,"outputted":1,"next":45,"card":37,"migrating":5,"projects":19,"package-install":25,"clarinet-sdk":2,"database":17,"bitcoinicon":6,"container":7,"dao":7,"plant":5,"shapes":6,"stacksicon":5,"icon'":13,"div":19,"flex-col":9,"space-y-10'":8,"icon":17,"create":104,"simple":51,"tag":15,"'clarinet'":7,"'clarinet":7,"sdk'":7,"make":50,"integrate":12,"'stacks":3,"js'":3,"chainhook":29,"stream":10,"deployments":15,"'chainhook'":5,"flex-col'":7,"h4":7,"learn-by-example":5,"text-":7,"dark":8,"8c877d":7,"scroll-m-20":7,"not-prose":8,"text-sm":7,"uppercase":8,"build-an-nft-marketplace":5,"marketplace":9,"own":31,"launch":10,"decentralized":16,"autonomous":6,"organization":10,"discover":13,"no-loss-lottery":5,"no-loss":6,"lottery":6,"stacking":15,"yield":6,"build-a-decentralized-kickstarter":5,"kickstarter":5,"crowdfunding":5,"enabling":49,"creators":5,"fund":9,"their":68,"third":6,"party":8,"installation-guides":5,"installation":33,"sync-a-bitcoin-node":8,"sync":10,"bitcoin":43,"set":75,"up":61,"service":30,"sync-a-stacks-node":8,"spin":7,"installing-docker":5,"docker":10,"machine":13,"essential":28,"tip":9,"integration":9,"crucial":133,"involves":10,"system":35,"work":16,"together":12,"powerful":45,"allowing":21,"complex":52,"scenarios":10,"between":36,"correctly":32,"part":11,"larger":12,"catch":11,"potential":34,"issues":14,"might":33,"not":159,"apparent":3,"alone":3,"defi":4,"set-up-a-clarinet-project":3,"test-the-deposit-and-borrow-functionality":3,"reports":6,"run-tests-and-generate-coverage-reports":4,"directory":17,"named":11,"inside":17,"stx-defi":4,"cd":12,"after":36,"changing":7,"going":7,"unit-testing":5,"ability":12,"borrow":3,"don't":24,"already":27,"follow":15,"copy":8,"paste":5,"constants":21,"various":27,"failure":12,"err-overborrow":3,"u300":3,"interest":5,"rate":13,"loans":3,"represented":8,"base":8,"loan-interest-rate":3,"representing":23,"holds":6,"deposits":6,"initialized":9,"total-deposits":4,"deposited":4,"owner":17,"borrower's":3,"loan":3,"last":8,"interaction":9,"last-interaction-block":3,"users":43,"deposit":10,"updates":12,"balance":40,"exists":17,"current-balance":4,"ie":7,"chain":28,"try":34,"as-contract":18,"update":36,"success":24,"based":50,"user-deposit":3,"calculate":14,"maximum":19,"user":60,"allowed":18,"upto":3,"half":3,"allowed-borrow":3,"u2":33,"current-loan-details":3,"accrued":3,"accrued-interest":3,"calculate-accrued-interest":3,"due":17,"total-due":3,"unwrap-panic":16,"borrowing":3,"new-loan":3,"does":22,"exceed":8,"borrowed":3,"get-balance-by-sender":4,"owed":3,"get-amount-owed":3,"start-block":4,"elapsed":5,"elapsed-blocks":3,"u10000":3,"started":15,"past":7,"is-eq":36,"calculated":4,"valid":42,"ready":12,"find":15,"repo":8,"clarity-examples":4,"main":26,"examples":19,"must":27,"therefore":5,"simulates":4,"two":51,"replace":10,"boilerplate":10,"typescript":16,"'vitest'":5,"wallet1":4,"'stx-defi'":4,"'borrows":3,"verifies":8,"10'":3,"'defi'":4,"'deposit'":4,"totaldeposits":4,"'total-deposits'":4,"'borrow'":3,"'get-amount-owed'":3,"we're":10,"simulating":3,"scenario":4,"borrows":3,"against":20,"let's":134,"walk":6,"do":24,"verify":47,"successful":47,"handy":3,"lets":13,"peek":3,"recorded":4,"matcher":4,"specifically":6,"designed":13,"exact":11,"confirmed":6,"invoking":4,"operation":55,"much":5,"owes":3,"finally":4,"because":13,"checks":46,"things":4,"once":28,"returned":25,"allow":25,"detailed":15,"assertions":5,"helping":4,"identify":8,"untested":4,"parts":11,"button":17,"archive":11,"enables":29,"quickly":6,"bootstrap":4,"supported":5,"services":3,"pre-loaded":1,"otherwise":9,"could":13,"take":25,"days":8,"weeks":1,"acquire":2,"syncing":3,"genesis":1,"free":6,"benefit":1,"community":8,"bg-orange-500":5,"hover":7,"bg-orange-600":5,"so":57,"target":9,"_blank":5,"no-underline":5,"mainnet":42,"testnet":36,"snapshots":1,"night":1,"verify-archive-data":4,"integrity":50,"particular":12,"snapshot":2,"stacks-blockchain":6,"stacks-api":1,"token-metadata-api":18,"metadata":27,"prerequisites":4,"depends":25,"restore":1,"restoring":3,"may":33,"encounter":1,"errors":59,"archives":4,"compatible":19,"meet":2,"criteria":2,"both":76,"correspond":1,"see":37,"release":11,"notes":5,"stacks-blockchain-api":76,"releases":6,"guidance":2,"were":8,"created":17,"date":3,"restoration":3,"there":28,"download":9,"depend":3,"via":28,"postgres":6,"dump":2,"recommended":11,"quickest":2,"direct":13,"suitable":2,"consists":1,"backup":1,"api's":2,"taken":3,"pg_dump":1,"generally":3,"recommend":1,"starting":9,"attempting":18,"reason":3,"tab-separated-values":1,"tsv":3,"several":14,"times":10,"slower":1,"than":32,"raw":12,"unprocessed":1,"ingest":1,"cannot":8,"depending":9,"each":38,"found":14,"locations":3,"stacks-blockchain-api-pg":1,"patterns":12,"stacks-blockchain-api-pg-":1,"yyyymmdd":3,"shasum":4,"sha256":12,"-stacks-blockchain-api-":1,"gz":5,"continually":5,"updated":14,"points":5,"recent":7,"upload":6,"-latest":2,"-stacks-blockchain-api-latest":1,"appropriate":25,"hour":2,"specs":2,"tuning":2,"export":4,"pgpassword":2,"password":9,"pg_restore":2,"--username":2,"--verbose":2,"--jobs":2,"--dbname":2,"stacks_blockchain_api":1,"dataset":3,"comparing":12,"nodes":13,"http":19,"localhost":10,"extended":66,"status":30,"hiro's":5,"matches":11,"close":2,"few":9,"minutes":6,"respond":5,"endpoint":11,"hundred":2,"away":5,"age":12,"relatively":2,"extract":12,"desired":4,"gzip":1,"-d":3,"--stdout":1,"extracted":3,"directions":1,"export-and-import":1,"instructions":6,"token-metadata-api-pg":1,"token-metadata-api-pg-":1,"token_metadata_api":1,"viewing":3,"tracked":1,"property":24,"greater":16,"zero":14,"datasets":2,"hash":20,"downloaded":4,"quite":1,"large":30,"you've":7,"maintained":1,"downloading":2,"echo":1,"cat":1,"awk":1,"--check":1,"mainnet-stacks-blockchain-api-latest":3,"printed":1,"indicating":5,"failed":7,"warning":5,"computed":4,"checksum":1,"did":4,"match":44,"delete":7,"re-attempt":1,"persist":6,"switch":4,"again":5,"-stacks-blockchain-":1,"tar":3,"-stacks-blockchain-latest":1,"-stacks-blockchain-2":1,"2-latest":1,"-zxvf":1,"configure":12,"working_dir":3,"docs":16,"co":17,"nodes-and-miners":1,"stacks-node-configuration":1,"configuration":24,"stacks-network":1,"master":7,"stacks-node":3,"conf":4,"v2":46,"arrowupright":1,"lucide-react":3,"tooltip":5,"tooltipcontent":4,"tooltipprovider":4,"tooltiptrigger":4,"line":5,"iterate":4,"locally":15,"moving":4,"production":8,"inline":4,"aschild":3,"'cursor-default":3,"border-b":3,"border-dotted":3,"border-primary'":3,"support":14,"vscode":3,"extension":7,"visualstudio":1,"items":6,"itemname":1,"clarity-lsp":1,"text":4,"20vs":1,"20code":1,"20extension":1,"20brings":1,"safety":5,"20checks":1,"2c":1,"20debugger":1,"20and":1,"20more":1,"debug":5,"rapidly":5,"terminalpicker":2,"storage":26,"macos":5,"windows":5,"winget":3,"cargo":6,"sudo":3,"apt":2,"build-essential":2,"pkg-config":2,"libssl-dev":2,"pre-built":2,"binary":6,"wget":2,"-nv":2,"v0":3,"clarinet-linux-x64-glibc":2,"clarinet-linux-x64":2,"-xf":2,"chmod":2,"x":18,"mv":2,"usr":2,"bin":3,"shell":2,"completions":1,"many":17,"commands":6,"tab":14,"completion":2,"common":127,"shells":1,"bash":3,"elvish":1,"fish":1,"powershell":1,"zsh":1,"generating":11,"refer":8,"documentation":9,"determine":15,"moved":1,"enable":16,"create-a-new-project":3,"leverage":11,"comprehensive":70,"ensuring":61,"performs":12,"create-deployment-plans":1,"deployment":19,"plans":9,"employ":1,"customizable":6,"streamline":1,"run-a-local-devnet":5,"devnet":28,"developing":3,"controlled":4,"simplify":20,"platform":17,"scaling":9,"apps":12,"authentication":17,"signing":15,"cater":1,"needs":15,"case":48,"--------------":1,"-------------------------------------------------------------------------------":1,"--------------------------------------------------------------------------------":1,"optimized":1,"fast":2,"loops":6,"introspection":1,"portability":1,"ideal":2,"frontend":8,"pre-production":1,"realistic":1,"final":6,"real":6,"occur":6,"you're":15,"plan":9,"contained":3,"specifications":3,"manually":10,"adding":15,"calls":32,"across":20,"commit":4,"audit":2,"secrets":1,"share":7,"exposing":2,"sensitive":7,"primitives":2,"primitive":1,"typical":1,"usage":116,"-----------------------":1,"---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------":1,"publish":2,"in-memory":2,"networks":12,"external":17,"purposes":13,"devnets":1,"send":20,"perform":31,"p2pkh":3,"wait":2,"automate":1,"along":10,"my-contract":5,"structure":17,"'contracts":3,"clar'":7,"however":19,"recognize":1,"validate":47,"semantics":1,"32m":3,"0m":5,"1m1":2,"checked":13,"_txt":3,"_":20,"locate":1,"analyze":7,"indicate":8,"_console":3,"warnings":1,"fumadocs-ui":12,"costs":18,"dictate":1,"fees":9,"contract's":18,"continue":9,"counters":9,"analyzing":2,"get_costs":1,"display":12,"given":29,"expression":17,"well":13,"expects":3,"contract-call":18,"happens":3,"----------------------":1,"-------------":2,"----------------":1,"-----------------":1,"consumed":1,"percentage":2,"00":1,"03":1,"bytes":13,"01":1,"chart":1,"broken":1,"categories":1,"pertaining":1,"limited":2,"lists":16,"book":2,"clarity-lang":2,"org":9,"ch12-00-runtime-cost-analysis":1,"limits":14,"overall":3,"complexity":2,"negating":1,"less":15,"calculating":11,"sha512":4,"consume":2,"category":2,"affected":2,"size":5,"state":32,"piece":1,"reading":2,"intermediate":6,"save":6,"calling":16,"increases":2,"equal":17,"000":6,"twice":2,"increased":1,"column":2,"shows":5,"toggle":5,"displayed":1,"toggling":3,"feature":8,"toggle_costs":1,"turn":1,"off":3,"optimization":2,"techniques":2,"recommendations":2,"automated":2,"run-your-tests-with-code-coverage-and-cost-analysis":1,"cli-commands":3,"validate-a-contract":3,"rpc-api":5,"estimate":3,"fee":11,"estimates":1,"'api'":1,"interactive":3,"starts":7,"repl":1,"session":4,"installing":5,"install-docker":1,"unable":1,"sure":14,"apply":7,"contract-principal":1,"sp2pabaf9ftajynfzh93xenaj8fvy99rrm50d2jg9":2,"nft-trait":4,"operations":256,"yaml":3,"contract-publish":2,"contract-name":7,"expected-sender":2,"clarity-version":2,"contract-id":2,"my-function":2,"transfers":29,"mstx-amount":2,"'0x01'":2,"btc-transfer":2,"mjsrb3ws4xab3kyqfktwbzftdpg367zj2d":2,"bcrt1qnxknq3wqtphv7sfwy07m7e4sr6ut9yt6ed99jg":2,"sats-amount":2,"sats-per-byte":2,"emulated-contract-publish":2,"emulated-sender":2,"emulated-contract-call":2,"debugging":6,"trace":1,"break":3,"navigation":1,"s":11,"finish":1,"f":4,"n":7,"over":16,"c":7,"clarity_":1,"_clarity":4,"30m":1,"30mcounter":1,"31m":1,"1mst1pqhqkv0rjxzfy1dgx8mnsnyve3vgzjsrtpgzgm":1,"34mu0":1,"34m":1,"breakpoints":1,"breakpoint":1,"better":79,"what's":7,"happening":2,"mark":4,"count-twice":1,"double":2,"step-in":1,"sub-expressions":1,"step-out":1,"complete":17,"parent":1,"step-over":1,"stepping":1,"until":4,"hitting":1,"completing":4,"trigger":12,"estimate-costs":1,"minimize":2,"inherent":1,"chaining":2,"reproducible":1,"critical":6,"workflow":1,"generate-a-deployment-plan":1,"deployment-plan-specifications":1,"adding-project-contract-requirements":1,"customize":6,"edit-your-deployment-plan":1,"whether":21,"saved":1,"disk":2,"upon":3,"project's":5,"devnet-plan":1,"bitcoin-node":2,"batches":1,"anchor-block-only":1,"corresponding":10,"change":16,"emulates":1,"names":82,"features":22,"ports":1,"orders":2,"derivation":3,"mnemonic":3,"100_000_000_000_000":1,"m":1,"44'":1,"5757'":1,"0'":5,"improvement":1,"proposal":5,"009":1,"stacksgov":6,"sips":9,"blob":15,"sip-010":7,"sip-010-fungible-token-standard":2,"md":18,"specifies":6,"trait":7,"redeploying":1,"separate":6,"collection":4,"published":3,"booted":1,"alongside":7,"remap":1,"publishes":1,"specified":29,"permits":1,"maintain":18,"minimum":4,"impl-trait":5,"statement":10,"edit":5,"recall":1,"comprising":1,"programmatically":3,"orchestrating":1,"publication":1,"beyond":5,"plan's":1,"defaults":13,"prompts":2,"overwrite":1,"added":10,"edited":1,"changes":17,"differ":1,"laid":2,"proceed":2,"relevant":8,"configurations":7,"configuring":7,"requirement-publish":1,"currently":4,"experimental":2,"regtest":3,"extension-trait":3,"traits":9,"wants":2,"emulate":1,"cbtc":6,"application":19,"develop":8,"clarinet-cli":1,"core":15,"sp3fbr2agk5h9qbdh3een6df8ek8jy7rx8qj5svte":1,"sip-010-trait-ft-standard":1,"remap-sender":1,"remap-principals":1,"cache":6,"bitcoin-dao":1,"add-new-member":1,"0x01":1,"u4":11,"username":8,"satoshi":2,"'sp1htbvd3jg9c05j7hbjthgr0ggw7kxw28m5js8qe":1,"originating":1,"quantity":1,"denominated":4,"microstacks":1,"field":11,"ch02-02-sequence-types":1,"pre-fixed":1,"0x":1,"0x68656c6c6f21":1,"strings":14,"wrap-btc":1,"includes":28,"emulated":1,"advantage":2,"later":7,"even":8,"though":4,"easier":7,"sbtc-deposit":1,"sm3vdxk3wzzsa84xxfkafaf15nnzx32ctsg82jfq4":1,"explorer":23,"txid":19,"sbtc-token":1,"sbtc-registry":1,"detects":2,"say":3,"mint":15,"spending":4,"demo":2,"doesn't":11,"implement":134,"sip-009":2,"nft-name":1,"sats":9,"sats-sbtc-mint-price":1,"u100":20,"next-id":1,"mint-one-with-sbtc":1,"sbtcs":1,"'sm3vdxk3wzzsa84xxfkafaf15nnzx32ctsg82jfq4":1,"took":2,"care":1,"funding":2,"remain":3,"worry":2,"official":1,"st1f7qa2mdf17s807epa36tss8amefy4ka9tvgwxt":1,"linked":1,"sbtc-contract":1,"re-mapped":1,"unchanged":3,"my-project":1,"32mcreate":2,"1mmy-project":1,"1mcontracts":2,"1msettings":2,"1mtests":2,"1mclarinet":2,"1m":2,"tasks":5,"gitattributes":2,"1mpackage":2,"1mtsconfig":2,"1mvitest":2,"layout":1,"seed":5,"phrases":1,"out-of-the-box":1,"throughout":4,"tutorial":1,"cli":6,"1mcounter":1,"pointer-events-none":1,"32mcreated":1,"33mupdated":1,"1mwith":1,"typos":1,"validated":1,"incremented":3,"argument":11,"32mu1":1,"add-a-contract":1,"unlocks":2,"automation":2,"opportunities":2,"ci":1,"familiar":5,"rest":16,"query":19,"chainhooks":12,"platform-hosted":2,"receive":14,"that's":2,"endpoints":27,"api-keys":4,"popular":8,"platform-api":13,"hosted":5,"streams":6,"independently":2,"react":8,"on-chain":23,"hiro-platform":3,"apipage":166,"document":170,"openapi":167,"ext":10,"apikey":11,"'get'":154,"hashead":166,"devnet'":1,"'delete'":2,"projectname":1,"'put'":2,"chainhooks'":2,"'post'":8,"chainhookuuid":4,"status'":2,"maincard":1,"imagezoom":4,"image-zoom'":4,"pagefooter":2,"footer'":2,"messagecircle":1,"braces":9,"play":3,"rocket":1,"star":2,"backend":3,"bugicon":2,"cloud":1,"newspaper":2,"pulse":2,"questionicon":2,"heroimage":2,"stacks-hero":1,"svg'":4,"space-y-10":1,"pt-0'":1,"space-x-6":3,"items-end'":3,"alt":5,"banner":3,"src":8,"mt-0":4,"mb-6":4,"first-line":4,"rounded-xl":4,"bg-background":4,"priority":4,"_h2":2,"mb-2":2,"_p":2,"mb-6'":2,"resources":10,"'group":2,"space-y-1'":2,"'transition-colors":4,"duration-500":4,"ease-in-out":4,"group-hover":6,"text-primary'":4,"get-started":2,"end-to-end":2,"tutorials":2,"explore":13,"explore-by-category":1,"templates":4,"full-stack":1,"starter-kits":1,"back-end":1,"kickstart":1,"journey":2,"streaming":9,"amp":1,"real-time":14,"web":16,"apis":6,"offering":10,"management":57,"fetching":6,"explore-by-tool":1,"tool":115,"libraries":6,"applications":29,"lightweight":3,"databases":4,"link":9,"all-in-one":1,"solution":2,"production-ready":1,"dedicated":2,"onchain":1,"monitoring":5,"analytics":2,"everything":4,"bring":3,"life":1,"images":14,"o1":1,"png":12,"create-chainhooks":5,"manage":48,"webhook-like":1,"triggers":2,"deploy-contracts":4,"handle":89,"experience":7,"contract-monitoring":2,"monitor":8,"activity":14,"alerts":2,"track":14,"device":3,"create-project":3,"connected":5,"setup":10,"d1":1,"select":15,"top":10,"choose":13,"connect":30,"click":11,"d2":1,"issue":3,"hiro-pbc":1,"canny":1,"io":6,"scratch":2,"template":9,"repository":8,"approaches":1,"selection":4,"c2":1,"contract-only":1,"rich":1,"pre-configured":1,"simply":8,"c1":1,"clone":10,"haven't":3,"authorize":3,"repositories":3,"imported":2,"clicking":5,"c3":1,"clarinet-generated":1,"successfully":10,"sometimes":1,"important":22,"archiving":1,"deleting":3,"wish":7,"move":3,"active":6,"visible":1,"sign":27,"authenticated":5,"redirected":1,"far-right":1,"dots":1,"remove":10,"place":8,"archive-project":1,"unarchive":1,"archived":4,"three-dots":1,"far":2,"unarchived":1,"back":12,"yet":5,"beta":1,"utility":3,"aid":1,"we've":4,"provided":9,"easy":8,"window":6,"request":26,"why":128,"native":2,"facilitate":2,"executions":1,"sourcing":1,"cumbersome":1,"hassle-free":1,"way":82,"visit":1,"either":19,"straightforward":8,"frequently":9,"asked":1,"questions":2,"dispenses":1,"optimizing":2,"remember":13,"real-world":2,"sold":2,"enter":2,"sends":4,"small":10,"curious":1,"transaction's":1,"secure":19,"securely":4,"provide":36,"while":16,"processing":11,"shared":1,"i":6,"requests":17,"limiting":1,"policies":1,"long":2,"arrive":1,"my":1,"busy":1,"average":3,"seems":1,"stuck":2,"feel":4,"daily":1,"fair":2,"distribution":6,"availability":2,"per":10,"day":3,"accordingly":7,"personal":1,"expedite":1,"think":3,"sandbox":3,"else":6,"breaking":6,"stop":4,"restart":3,"eliminates":1,"miners":3,"still":12,"produces":2,"processes":14,"offloads":1,"computational":1,"overhead":3,"infrastructure":3,"providing":67,"intuitive":1,"risk-free":1,"ground":1,"convenience":1,"prototyping":1,"savings":1,"privacy":2,"benefits":1,"advantages":1,"resource-efficient":1,"demands":1,"quick":2,"iterations":2,"immediate":2,"cost-efficiency":1,"cryptocurrency":1,"expenses":2,"seamless":1,"isolated":1,"confidential":1,"managing":22,"initially":3,"inactive":5,"dashboard":2,"dev1":1,"programmatic":2,"vs":7,"editor":1,"moments":1,"indicator":1,"keep":10,"'active'":1,"refresh":1,"timer":1,"mind":9,"seamlessly":2,"transition":2,"monthly":2,"sessions":3,"schedule":5,"exploring":1,"platform's":1,"visual":1,"assembly":1,"inspect":4,"contents":2,"search":5,"efficiently":10,"demand":1,"dev2":1,"blog":2,"5-ways-to-interact-with-devnet-in-the-hiro-platform":1,"goes":2,"security":25,"gain":1,"insight":1,"receiving":7,"alert":1,"logging":9,"start-monitoring":1,"'add":1,"contract'":1,"slideout":1,"modal":3,"fields":13,"regardless":2,"alternatively":4,"history":5,"ve":1,"previously":4,"add-contract":1,"pending":9,"mempool":10,"added-contract":1,"set-contract-owner":1,"anything":6,"implemented":3,"further":6,"hone":1,"filters":7,"conditions":78,"email":4,"those":4,"triggered":5,"webhook":2,"kinds":1,"customized":1,"alerting":1,"flows":7,"create-alert-form":1,"made":3,"notification":2,"preferences":1,"view-alerts-page":1,"emails":1,"come":4,"payload":13,"sample-alert-payload":2,"tx_status":3,"notifications":1,"hits":1,"gets":1,"'sample":1,"payload'":1,"'alert":1,"interface'":1,"sample":9,"tx_id":10,"0xa7f511b3f379efef6fe71d0de57712ed13a89c5b6e24dd049eb2cc9a7c24fcb5":1,"nonce":14,"fee_rate":6,"sender_address":2,"sp2w9qyahjns7ytqy9ek2mstqgx9e2ndmv766jp9z":1,"sponsored":6,"post_condition_mode":3,"deny":5,"post_conditions":3,"condition_code":2,"sent_equal_to":2,"type_id":2,"principal_standard":2,"anchor_mode":3,"receipt_time":2,"receipt_time_iso":1,"2024-09-12t01":1,"000z":2,"tx_type":3,"contract_call":6,"sphw0ejk5kpdmk03zx792emp0q5j3a39zmtvzzcy":1,"sample-contract":1,"function_name":3,"donate":2,"function_signature":2,"function_args":2,"0x01000000000000000000000000002dc6c0":2,"repr":2,"u3000000":2,"sample-alert-interface":1,"body":8,"postcondition":4,"contractcall":3,"functionarg":1,"action":13,"ifttt":1,"if_this":9,"then_that":8,"logic":82,"power":5,"overview":3,"login":3,"select-chainhook-tab":1,"create-chainhook-window":1,"panel":1,"observe":5,"if-this":1,"selected":8,"scopes":10,"condition":18,"predicate":13,"-for":1,"stacks_protocols":1,"block_height":5,"fungible_token_event":1,"non-fungible_token_event":1,"stx_event":2,"print_event":4,"contract_deployment":2,"_refer":1,"predicates":8,"concepts":8,"bitcoin-predicates":2,"stacks-predicates":3,"documents":2,"then-that":1,"defaulted":1,"http_post":6,"post":13,"url":12,"authorization":3,"header":8,"secret":8,"posting":1,"payloads":4,"end":20,"optimize":11,"expire":2,"occurrence":1,"occurrences":2,"leave":2,"blank":1,"decode":2,"enabled":6,"proof":7,"option":10,"evidence":1,"verified":6,"authorized":6,"cryptographic":19,"signature":129,"inputs":28,"previous":10,"known":3,"unspent":1,"utxos":3,"spent":4,"spend":1,"funds":8,"refers":7,"destinations":1,"amounts":9,"sent":6,"represent":11,"recipients'":1,"witness":3,"signatures":11,"placed":1,"headers":8,"chosen":4,"respective":1,"columns":2,"drag":2,"drop":1,"area":1,"prepare":5,"ellipse":1,"edit-chainhook":1,"reflect":2,"duplicate":2,"opens":2,"pane":1,"populated":1,"confirmation":6,"confirm":3,"displays":2,"actively":1,"scanning":4,"reached":1,"e":17,"g":15,"longer":7,"hovering":1,"element":11,"status-info":1,"bitcoind":3,"chainhook-as-a-service":5,"chainhook-as-a-service-with-stacks-node":2,"fundraising":1,"campaign":1,"contributions":1,"refunds":1,"withdrawal":3,"fundraiser":1,"google":1,"q1":1,"signed":32,"onboarding":1,"screen":2,"showing":2,"offer":3,"welcome":3,"q2":1,"prompted":2,"starter":4,"equipped":1,"q5":1,"presented":1,"q3":1,"able":4,"browser":6,"codespaces":1,"q4":1,"easily":4,"pull":3,"sip":4,"standards":4,"fungible-token-metadata":1,"non-fungible-token-metadata":1,"semi-fungible-token-metadata":1,"semi-fungible":2,"looking":10,"simpler":4,"ordinals":42,"brc-20":19,"architecture":4,"gives":4,"internal":3,"architectural":1,"diagrams":1,"diagram":1,"systems":17,"svg":1,"interacts":1,"referred":2,"db":4,"historical":8,"booting":1,"listen":3,"afterwards":1,"never":4,"responds":1,"uris":1,"etc":4,"stores":13,"processed":5,"jsons":1,"internet":1,"flowchart":1,"curl":4,"-l":1,"'https":6,"-h":3,"'accept":1,"json'":5,"api-key":1,"hiro_api_key":1,"'x-api-key":1,"hiro_api_key'":1,"resembles":1,"server_version":1,"1aa1603":1,"sft":4,"token_contracts":1,"sip-013":1,"job_queue":1,"done":5,"client":19,"standalone":2,"token-metadata-api-client":1,"tokensapi":1,"getftmetadata":1,"'sp1h1733v5mz3sz9xrw9fkygezt0jdgeb8y634c7r":2,"miamicoin-token-v2'":1,"token_id":4,"ft'":2,"circleuserround":8,"blockchain-api-client":10,"robust":77,"type-safe":8,"websocket":9,"schemas":9,"accountsapi":9,"blockchain-api-client'":11,"apiconfig":11,"getaccounttransactions":8,"'st000000000000000000002amw42h'":10,"focus":5,"practical":130,"hands-on":3,"authenticate":14,"oauth":3,"responses":21,"understanding":29,"codes":8,"applicable":15,"explain":6,"best":132,"practices":130,"avoiding":5,"goal":3,"equip":3,"knowledge":3,"effectively":91,"websockets":2,"subscribe":1,"near":2,"connectwebsocketclient":2,"'ws":2,"sub":2,"subscribeaddresstransactions":2,"unsubscribe":2,"apiexample":13,"'fumadocs-openapi":13,"ui'":13,"'api":1,"my-3'":1,"'flex-1'":5,"h2":5,"'mt-0'":5,"getaccountassets":1,"retrieves":25,"mints":7,"tracking":7,"movements":2,"ownership":15,"deprecated":10,"whose":4,"initoverrides":1,"requestinit":1,"overrides":2,"initialization":1,"get-assets":1,"tsx":9,"basepath":3,"so'":2,"usersession":5,"makeauthrequest":3,"appconfig":4,"auth'":3,"appdomain":3,"myapp":3,"com'":5,"'store_write'":3,"encrypted":4,"transit":3,"encryption":8,"transitkey":3,"generateandstoretransitkey":3,"auth":4,"authenticator":4,"redirect":3,"redirecturi":3,"location":3,"shown":9,"manifesturi":3,"authrequest":3,"sign-in":3,"domain":6,"permissions":13,"issigninpending":3,"determines":4,"incoming":4,"handlependingsignin":3,"userdata":12,"identity":8,"bns":5,"profile":11,"isusersignedin":3,"loaduserdata":5,"encryptcontent":3,"encrypts":4,"decryptcontent":3,"decrypts":4,"user-data":3,"load":1,"sign-out":3,"encrypt":4,"encrypting":4,"decrypt":5,"decrypting":4,"ispending":3,"something":11,"'status'":3,"issignedin":4,"'user-data'":3,"'sign-out'":3,"logout":1,"signuserout":4,"'encrypt'":3,"'my":4,"message'":3,"ciphertext":3,"'decrypt'":3,"plaintext":3,"equivalent":6,"hackbadge":3,"hack":4,"introduction":4,"hacks":4,"pretty":2,"ux":2,"around":4,"challenging":2,"nature":5,"blockchains":3,"grants":2,"program":3,"build-a-decentralized-grants-program":1,"anyone":3,"propose":2,"grant":3,"proposals":4,"voted":3,"holders":5,"stored":18,"querying":7,"application's":1,"slow":1,"inefficient":3,"formatted":24,"organized":2,"makes":6,"sense":3,"submission":5,"actions":9,"inserting":3,"off-chain":5,"integrating":3,"server":5,"briefly":1,"discuss":1,"express":3,"walkthrough":1,"scope":14,"illustrate":1,"require":21,"req":1,"res":3,"received":4,"port":4,"listens":2,"route":1,"parsing":1,"lot":2,"down":4,"truncated":1,"receipt":3,"item":6,"attribute":1,"happened":1,"_token":1,"transfer_":1,"occured":1,"attributes":1,"regarding":1,"async":11,"acknowledge":1,"expose":3,"deliver":4,"npx":4,"localtunnel":2,"--port":1,"your-port-number":1,"prefer":6,"user-friendly":1,"requesting":4,"go":7,"straight":1,"proposal-submission":2,"submitted":2,"uuid":6,"st2bsv94a650wgz2yz5y8hm93w01ngt4gy0mgjecg":1,"your-https-server-url":1,"authorization_header":4,"bearer":3,"start_block":6,"swap":1,"abi":5,"listening":1,"ignoring":1,"_chainhooks_":1,"_upload":1,"chainhook_":1,"uploaded":1,"aligns":1,"logged":1,"presents":1,"challenges":3,"put":3,"finishing":1,"touches":1,"foundation":3,"well-equipped":1,"congratulations":3,"reaching":1,"point":3,"significant":2,"towards":1,"enhancing":14,"verifying":11,"working":23,"revisit":1,"variant":7,"dapp":5,"parse":5,"consumer-facing":1,"capture":2,"challenge":3,"present":7,"filtered":2,"consumer-friendly":1,"involve":7,"layer":5,"organizing":2,"context":9,"transforming":5,"supabase":1,"getting-started":3,"quickstarts":1,"reactjs":2,"createclient":1,"your-anon-key":1,"insert":3,"taking":2,"displaying":3,"meaningful":76,"dynamic":8,"elements":18,"incorporating":1,"visualizations":2,"innovative":3,"fluid":1,"proposition":1,"executordao":1,"marvinjanssen":1,"executor-dao":1,"protocol":7,"governance":3,"holding":3,"membership-token":1,"vote":6,"encouraging":1,"wide":4,"range":18,"ideas":3,"aspects":1,"voting":6,"transparency":5,"tamper-proof":1,"walks":2,"basics":2,"course":3,"functioning":1,"stretch":3,"skills":4,"cover":2,"functionalities":7,"flexible":7,"creation":15,"organizations":1,"daos":1,"high":2,"degree":1,"modularity":5,"customization":1,"operates":3,"tenets":1,"expressed":2,"precise":5,"logical":9,"descriptions":1,"duties":1,"members":2,"executes":1,"extensions":2,"give":2,"sole":1,"purpose":11,"disabled":4,"_proposing":1,"grants_":1,"_voting":1,"_distributing":1,"funds_":1,"control":20,"sending":11,"single-address":1,"model":1,"de":2,"facto":1,"ownable":1,"act":3,"sections":4,"prepared":2,"git":7,"hiro-hacks-template":2,"establishing":3,"implementing":113,"proposal-trait":1,"respectively":1,"define-trait":5,"callback":2,"buff":38,"use-trait":4,"err_unauthorized":2,"u1000":6,"err_already_executed":1,"u1001":3,"err_invalid_extension":1,"u1002":1,"executive":1,"executedproposals":1,"is-self-or-extension":1,"caller":13,"itself":8,"is-extension":2,"contract-caller":8,"executed-at":1,"contract-of":6,"disable":1,"set-extension":2,"inserts":6,"construct":15,"sets":11,"request-extension-callback":2,"membership":1,"non-transferable":1,"rights":1,"distributed":2,"bootstrapping":1,"minting":9,"burning":7,"removal":1,"managed":4,"defines":7,"u2000":3,"err_not_token_owner":1,"u2001":3,"err_membership_limit_reached":1,"u2002":3,"sgrant":1,"tokenname":2,"tokensymbol":1,"sgt":1,"tokenuri":1,"tokendecimals":1,"u6":5,"symbol":1,"uri":1,"decimals":2,"is-dao-or-extension":1,"distribute":4,"granting":1,"future":7,"ft-burn":7,"approved":3,"token's":2,"get-name":2,"get-symbol":2,"get-decimals":2,"supply":10,"get-total-supply":1,"get-token-uri":2,"ft-get-balance":8,"ft-get-supply":7,"second":10,"u3000":1,"err_unknown_parameter":1,"u3001":1,"proposal-duration":1,"duration":5,"approximately":2,"u1440":1,"minute":1,"get-parameter":1,"unwrap":18,"proposal-voting":1,"add-proposal":1,"end-block-height":1,"proposer":2,"passing":6,"plus":1,"proposed":1,"err_proposal_already_executed":1,"u3002":1,"err_proposal_already_exists":1,"u3003":1,"err_unknown_proposal":1,"u3004":1,"err_proposal_already_concluded":1,"u3005":1,"err_proposal_inactive":1,"u3006":1,"err_proposal_not_concluded":1,"u3007":1,"err_no_votes_to_return":1,"u3008":1,"err_end_block_height_not_reached":1,"u3009":1,"err_disabled":1,"u3010":1,"votes":4,"member":2,"votes-for":1,"votes-against":1,"concluded":1,"member-total-votes":1,"voter":3,"is-none":9,"merge":9,"holder":2,"least":3,"proposal-data":1,"get-current-total-votes":1,"conclusion":127,"conclude":1,"concludes":1,"met":3,"prints":2,"tries":2,"foundations":1,"sharpening":1,"wrote":1,"allocation":1,"responsible":3,"little":1,"edp000-bootstrap":1,"initializing":1,"period":6,"milestone-based":1,"tracks":1,"milestones":2,"released":1,"milestone":1,"achieved":1,"accountable":1,"recipients":7,"round":1,"submit":6,"callreadonlyfunction":7,"standardprincipalcv":6,"senderaddress":5,"functionname":13,"extensionaddress":1,"functionargs":9,"january":1,"ai":2,"combines":4,"capabilities":3,"technology":1,"timeline":2,"22-28":2,"month's":3,"invites":2,"intersection":1,"artificial":1,"intelligence":1,"solutions":1,"hirohacks25":3,"paperform":3,"iframe":2,"width":4,"youtube":2,"embed":2,"gikrsamqnqo":1,"si":1,"eq74otytsozcpik-":1,"video":1,"player":1,"accelerometer":2,"autoplay":2,"clipboard-write":2,"encrypted-media":2,"gyroscope":2,"picture-in-picture":2,"web-share":2,"referrerpolicy":2,"strict-origin-when-cross-origin":2,"allowfullscreen":2,"analyzer":1,"llms":1,"improve":9,"ai-powered":1,"suggestions":1,"improvements":4,"optimizations":5,"assistant":1,"informed":1,"decisions":3,"personalized":2,"insights":3,"predictive":1,"detective":1,"analyzes":1,"interesting":1,"_review":1,"guidelines":2,"rules":3,"join":7,"builders":3,"codex":1,"leahjlou":1,"clarity-codex":1,"gamify":1,"reward":7,"friend":1,"idea":2,"behind":1,"tech":1,"social":1,"web3":1,"storm":1,"recreate":1,"namely":2,"subjects":1,"buy":4,"low":1,"price":5,"people":1,"rewarding":2,"friends":1,"bought":1,"early":4,"owners":2,"sell":3,"profit":1,"hold":2,"signal":1,"friendship":1,"reputation":1,"exclusive":5,"chatrooms":1,"subject":1,"airdrops":2,"learning":1,"assuming":77,"referring":2,"friendtech":1,"defining":14,"_holder_":1,"clarity's":8,"keysbalance":1,"keyssupply":1,"holder's":1,"buying":2,"selling":1,"prices":3,"thing":3,"calculates":6,"get-price":1,"base-price":1,"micro-stx":6,"price-change-factor":1,"factor":1,"u3":19,"formula":3,"dividing":3,"buy-keys":1,"initiating":3,"succeeds":1,"_subject_":1,"circulation":1,"principal-a":1,"principal-b":1,"sell-keys":1,"deduct":1,"seller":1,"owns":3,"enough":5,"keyholders":1,"keyholder":1,"is-keyholder":1,"u10010":1,"purchase":4,"groundwork":1,"get-keys-balance":1,"get-keys-supply":1,"valuable":3,"get-buy-price":1,"get-sell-price":1,"buys":1,"sells":1,"introduce":1,"level":9,"protocolfeepercent":1,"subjectfeepercent":1,"destination":2,"protocolfeedestination":1,"revenue":1,"incorporate":3,"u200":3,"adjust":1,"wouldn't":1,"set-fee":1,"designated":4,"set-protocol-fee-percent":1,"feepercent":1,"indeed":1,"consider":54,"kind":3,"someone":1,"implementation":18,"works":8,"clone-the-starter-template":1,"pattern":9,"show":9,"hide":1,"keyholdings":1,"exchange":3,"planning":2,"experiment":1,"leather":4,"install-extension":1,"enhance":9,"authenticity":5,"implemement":1,"_login_":1,"sign-messages":6,"opensignaturerequestpopup":1,"verifymessagesignaturersv":2,"stacksmocknet":2,"getaddressfrompublickey":1,"chatroom":1,"onfinish":4,"publickey":10,"iskeyholder":1,"checkiskeyholder":1,"serve":2,"_proof":1,"identity_":1,"claim":6,"messages":13,"february":1,"recipe":2,"cookbook":2,"19-25":2,"reusable":3,"written":1,"annotations":2,"readers":1,"know":7,"exactly":2,"z9ulvhygkce":1,"convert":15,"verification":9,"non-sequential":1,"multisig":6,"_for":1,"pr":2,"recipes":2,"review":1,"general":5,"hackathons":1,"ecosystem":8,"month":1,"unique":17,"theme":1,"creativity":1,"devs":1,"fun":1,"compete":1,"swag":1,"seat":1,"hacker":1,"house":1,"prizes":1,"coming":4,"year":3,"midnight":1,"week":1,"jan":1,"feb":2,"mar":1,"tba":1,"soon":3,"apr":2,"23-29":1,"21-27":1,"jun":1,"18-24":1,"host":5,"livestream":1,"submissions":1,"announcing":1,"winning":3,"prize":1,"fame":1,"glory":1,"invited":1,"participate":1,"tied":1,"year's":1,"biggest":1,"conferences":1,"covered":2,"stay":3,"tuned":1,"hacking":1,"builder-general":1,"having":1,"problems":1,"team":1,"forget":1,"eligible":1,"clear":59,"readme":1,"submitting":3,"covers":2,"problem":2,"solved":1,"technical":1,"terms":3,"winners":2,"evaluated":5,"innovation":1,"presentation":1,"hiro-hacks-rules":1,"troubleshoot":1,"flex":3,"gap-4":3,"outline":3,"build-explorer":3,"front":5,"stacks-explorer":1,"hd16484710":3,"thursday":3,"11am":5,"vercel":1,"obtain":2,"cloned":1,"nodejs":2,"dev":5,"en":1,"pnpm":1,"homebrew":1,"sh":6,"_note":2,"although":1,"operate":1,"highly":1,"task":4,"bit":7,"manipulation":7,"efficient":20,"pack":1,"pieces":4,"saving":1,"space":2,"potentially":13,"reducing":8,"gas":13,"matter":8,"considerations":8,"efficiency":7,"compact":5,"versatility":1,"bitfields":1,"flags":8,"low-level":6,"structures":18,"performance":20,"higher-level":1,"manipulations":10,"interoperability":5,"bitwise":8,"representations":9,"bit-and":7,"integers":34,"bits":7,"clearing":2,"isolate":1,"bitmask":2,"i1":12,"i2":9,"bitfield":2,"combine":74,"bit-or":6,"permission":4,"permission_read":2,"0001":4,"permission_write":2,"0010":4,"permission_exec":1,"0100":4,"has-permission":2,"user-permissions":1,"required-permission":1,"combining":28,"add-permission":1,"current-permissions":1,"new-permission":1,"u7":2,"bit-not":5,"inverting":2,"flip":1,"carefully":5,"affects":3,"remove-permission":1,"permission-to-remove":1,"u5":12,"setting_newsletter":1,"setting_2fa":1,"setting_private_profile":1,"setting_dark_mode":1,"u8":5,"user-settings":1,"update-setting":1,"current-settings":1,"has-setting":1,"get-all-settings":1,"demonstrates":124,"individual":10,"updating":13,"storing":7,"compactly":1,"storage-efficient":1,"ease":1,"trade-off":1,"readability":78,"calculations":11,"weights":3,"financial":8,"arithmetic":7,"blockchain-specific":5,"overflow":10,"protection":2,"unlike":1,"languages":3,"prevents":1,"precision":2,"128-bit":4,"high-precision":1,"determinism":4,"behavior":82,"consistent":7,"consensus":3,"adds":12,"involving":7,"cumulative":2,"quantities":3,"additive":1,"calculation":2,"non-negative":4,"rewards":7,"stackingrewards":1,"add-stacking-reward":1,"stacker":1,"newreward":1,"currentrewards":1,"subtraction":5,"subtracts":5,"decreasing":7,"finding":2,"differences":11,"decrease":3,"subtractive":1,"guard":2,"underflow":3,"shouldn't":3,"negative":16,"userpoints":1,"deduct-points":1,"currentpoints":1,"get-points":1,"multiplication":6,"multiplies":5,"rates":3,"proportions":2,"scale":2,"multiplicative":1,"calculate-rewards":1,"rewardrate":1,"stacked":5,"division":7,"sharing":1,"divide":2,"bulk":2,"calculate-price-per-item":1,"totalprice":1,"itemcount":1,"operator":2,"precedence":1,"parentheses":2,"explicitly":2,"remainders":2,"combination":30,"modulo":3,"dealing":7,"percentages":2,"fractions":3,"numbers":25,"guarding":1,"avoid":33,"can't":8,"possible":65,"calculator":1,"calculate-interest":1,"scaled-rate":1,"decimal":2,"u365":2,"u30":8,"appropriately":8,"mastering":2,"nuances":1,"economics":1,"series":4,"introducing":3,"depth":1,"focusing":1,"explaining":1,"demonstrating":1,"samples":1,"discussing":1,"basic-arithmetic":1,"access-control":1,"handling-optionals-and-errors":1,"optionals":3,"safely":8,"discussion":1,"retrieval":6,"key-value":4,"gas-efficient":2,"manner":4,"o":1,"lookup":5,"retrieving":11,"flexibility":4,"accessed":9,"significantly":7,"reduce":7,"compared":5,"maintaining":9,"scalability":3,"degradation":1,"map-name":6,"key-type":2,"value-type":2,"composite":2,"tuples":7,"relationships":2,"tracker":1,"user-balances":1,"unintended":2,"overwrites":2,"conjunction":9,"controls":8,"update-balance":2,"new-balance":1,"exist":12,"map-delete":8,"removes":4,"removing":6,"cautious":6,"recovered":2,"deleted":3,"soft":1,"referenced":1,"delete-account":1,"demonstrate":1,"registration":5,"yes":1,"voters":1,"register":5,"register-voter":1,"cast":3,"cast-vote":4,"proposal-votes":1,"get-votes":1,"counts":1,"scalable":1,"gas-optimized":2,"designing":3,"strategy":1,"hashes":12,"built-in":9,"identifiers":6,"hasn't":2,"tampered":1,"authenticating":1,"keccak256":6,"compatibility":11,"computes":8,"widely":1,"fixed-size":1,"hashing":10,"prevent":14,"rainbow":1,"table":4,"attacks":1,"submit-document-hash":1,"document-hash":1,"user-submission-id":1,"concat":10,"document-submissions":1,"ethereum-compatible":1,"ethereum":1,"alternative":2,"aware":53,"get-eth-address":1,"public-key":3,"hashed-key":1,"secp256k1-recover":3,"message-hash":3,"buff-to-hex-string":1,"slice":3,"u12":1,"u32":1,"recovers":3,"needing":1,"advance":1,"schemes":2,"especially":14,"secp256k1-verify":2,"submit-vote":1,"signer":7,"principal-of":5,"signers":9,"doc-hash":1,"eth-compatible-hash":1,"submit-document":1,"submission-id":1,"eth-hash":1,"sign-document":1,"doc-info":1,"verify-document":1,"get-eth-hash":1,"trustlessness":1,"choosing":3,"entities":1,"parties":5,"role-based":2,"multi-signature":5,"enhanced":1,"enforcing":3,"validating":30,"proceeding":3,"enforce":8,"sufficient":9,"senderbalance":11,"assertion":3,"passes":3,"keyword":3,"identifying":2,"rely":2,"solely":1,"restricting":3,"restricted-function":1,"granular":1,"contract-to-contract":1,"distinguish":3,"original":9,"confusion":4,"chains":3,"whitelist":3,"allowedcallers":1,"whitelisted-function":1,"principals":14,"matching":9,"requiring":6,"approval":1,"approver_one":1,"approver_two":1,"approve-transaction":1,"transactionid":1,"administrators":1,"regular":2,"roles":2,"proposalcounter":1,"votesfor":1,"votesagainst":1,"administrator":1,"add-administrator":1,"newadmin":1,"add-member":1,"newmember":1,"create-proposal":1,"proposalid":1,"votefor":1,"transfer-ownership":1,"newowner":1,"mechanisms":11,"expr1":5,"expr2":4,"expr3":2,"matters":119,"constructing":11,"simplifying":63,"sequences":7,"facilitating":7,"collections":2,"manipulate":2,"creates":5,"create-list":1,"len":10,"binding":2,"returning":24,"pitfalls":119,"causing":56,"leading":73,"unhandled":48,"resulting":67,"incomplete":57,"overlooking":73,"validation":66,"append":6,"concatenates":4,"fundamental":81,"enhances":68,"reliability":58,"maintainability":65,"concise":54,"definition":11,"label-0":1,"value-type-0":1,"label-1":1,"value-type-1":1,"grouping":2,"grouped":3,"descriptive":11,"userinfo":3,"userid":18,"set-user-info":1,"get-user-info":1,"alice":8,"non-descriptive":2,"computing":4,"sha-256":6,"compute":4,"compute-sha256":1,"0x68656c6c6f20776f726c64000000000000000000000000000000000000000000":3,"0x28effae679c457da1e5158c063b3dfa78d0ade721b9aa9f1fc3f46dba4c0ea15":1,"computation":5,"incorrectly":18,"invalid":30,"fail":29,"sha-512":3,"keccak-256":4,"option-input":2,"thrown-value":3,"b":19,"unpacking":4,"inner":4,"unpack":4,"unpacks":4,"get-user-age":2,"'sz2j6zy48gv1ez5v2v5rb9mp66sw86pykkq9h6dpr":7,"succeed":19,"throwing":5,"function-name":4,"arg0":1,"arg1":1,"inter-contract":1,"communication":3,"composability":4,"upgradeable":2,"standardized":4,"split":1,"newer":3,"versions":6,"budget":1,"transfer-tokens":7,"token-contract":1,"forgetting":42,"lead":13,"unexpected":21,"considering":29,"possibility":5,"upgraded":1,"propagating":3,"promotes":1,"reuse":2,"upgradability":1,"careful":1,"implications":16,"buff-to-int-be":4,"byte":13,"sources":6,"big-endian":5,"encoding":5,"protocols":5,"algorithms":12,"representation":15,"interoperating":4,"encoded":8,"mathematical":13,"smaller":14,"buffers":13,"zero-padded":4,"left":4,"affecting":7,"buff-to-uint-be":3,"decoding":4,"process-external-data":2,"0x0000000000000001":1,"0xffffffffffffffff":1,"0x7fffffffffffffff":1,"9223372036854775807":2,"positive":11,"conversion":11,"converted":5,"interprets":2,"actually":2,"little-endian":6,"shorter":5,"left-padding":2,"buff-to-int-le":3,"converts":10,"int-to-ascii":7,"sizes":5,"numeric":6,"contexts":2,"concatenation":3,"characters":3,"logs":9,"userbalances":6,"log-balance":2,"balancestr":2,"fit":2,"performance-critical":2,"concatenate":3,"usability":4,"key-tuple":4,"entries":11,"deletion":1,"obsolete":1,"incorrect":13,"clean":6,"accurate":6,"identifies":6,"frequent":5,"deletions":1,"deletes":1,"delete-user-data":1,"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef":5,"removed":5,"trait-reference":1,"contract-agnostic":1,"adhering":1,"composable":2,"interacted":1,"routing":1,"restrict":2,"expecting":2,"proxy":1,"router":1,"modular":3,"extensiontrait":1,"explanation":1,"'sp2j4zq6zq6zq6zq6zq6zq6zq6zq6zq6zq6zq6zq6":1,"extension-contract":1,"properly":9,"compare":7,"interoperable":3,"dynamically":7,"trait-implementing":1,"generic":1,"correct":10,"hash-user-data":1,"non-buffer":1,"collision-resistant":2,"limitations":4,"hash160":4,"ripemd-160":3,"mechanism":11,"constant":7,"assigned":2,"declaring":1,"immutable":2,"reused":1,"improving":8,"giving":2,"fixed":3,"repeated":1,"computations":3,"lifecycle":3,"won't":8,"magic":2,"declare":2,"contract-wide":2,"definitions":3,"visibility":2,"token_name":1,"dog-go-to-the-moon":2,"token_symbol":1,"dog":4,"token_decimals":1,"token_supply":1,"u1000000000000":1,"million":3,"referencing":2,"modify":10,"overusing":11,"mutable":2,"xor":3,"int1":1,"int2":1,"conditional":23,"states":6,"decryption":1,"edge":13,"encrypteddata":1,"non-integer":1,"misunderstanding":1,"deriving":1,"identities":3,"derived":7,"derive":1,"derives":1,"derive-principal":1,"0x0390a5cac7c33fda49f70bc1b0866fa0ba7a9440d9de647fecb8132ceb76a94dfa":1,"principal-construct":3,"constructs":10,"principal-destruct":2,"decomposes":1,"get-burn-block-info":2,"prop-name":4,"burnblockinfopropertyname":1,"burnchain":9,"addrs":1,"hashbytes":2,"payout":3,"accessing":11,"underlying":5,"cross-chain":1,"pox":15,"payouts":1,"non-existent":5,"reorganizations":3,"caching":5,"verify-btc-block-hash":1,"expectedhash":2,"header-hash":4,"u700000":2,"0x00000000000000000009a11b3972c8e532e964e262c196556bd958b7fd0c55c3":1,"32-byte":4,"pox-addrs":1,"paid":1,"misinterpreting":1,"phases":1,"fact":1,"get-block-info":6,"burn-block-height":4,"pox-related":1,"sophisticated":10,"fold":6,"sequence":9,"initial-value":1,"accumulation":1,"accumulated":2,"aggregating":1,"recursive-like":1,"recursion":1,"sum":3,"product":1,"aggregate":1,"transform":3,"typically":10,"commutative":1,"aggregation":1,"cleaner":1,"functional":1,"mindful":11,"folding":1,"summing":1,"sums":1,"sum-list":1,"u15":2,"applying":4,"wrong":3,"non-commutative":1,"clearly":7,"applies":3,"selects":2,"map's":1,"mappings":1,"dictionaries":1,"contract-specific":1,"tables":1,"organize":1,"queried":3,"userprofiles":5,"set-profile":2,"get-profile":1,"deactivate-profile":1,"u404":4,"ryan":1,"u38":1,"iterable":1,"suited":2,"pair":2,"pairs":2,"lookups":3,"stx-locked":1,"account-related":1,"queries":5,"get-stx-account-info":1,"stx-get-balance":5,"stx-burn":5,"burns":11,"principal's":6,"arg-name-0":3,"arg-type-0":3,"function-body":3,"arg-name-n":3,"arg-type-n":3,"responsetype":1,"outside":3,"accessible":4,"externally":1,"invoked":2,"increment-counter":2,"incrementing":3,"meets":2,"storedvalue":1,"set-value":1,"cause":5,"unauthorized":6,"too":4,"gas-intensive":1,"design":5,"changeable":1,"modified":1,"accumulator":1,"temporary":1,"configurable":1,"decrement":3,"get-counter":1,"variable's":1,"becoming":1,"value's":1,"impact":5,"relies":2,"judiciously":5,"greatly":1,"modifying":4,"nft-transfer":5,"asset-class":4,"asset-identifier":4,"assetname":7,"records":4,"stackaroo":4,"transfer-nft":3,"roo":4,"'spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf":11,"nonexistent":2,"nft-get-owner":5,"nft-burn":5,"adjusting":1,"proportionally":1,"compound":1,"formulas":4,"multiplying":2,"ranges":10,"mul-overflow":1,"detection":3,"vesting":2,"vested":2,"vesting_period":2,"total_allocation":2,"u1000000":11,"vest":1,"starttime":1,"beneficiary":1,"start-vesting":2,"get-vested-amount":2,"elapsed-time":2,"vesting-rate":1,"claim-tokens":4,"vested-amount":2,"simplicity":3,"linear":1,"effect":4,"combined":5,"default-value":1,"option-value":1,"fallback":2,"missing":4,"nested":4,"conditionals":1,"readable":5,"get-user-profile":1,"anonymous":1,"profiles":2,"safe":6,"indistinguishable":1,"handled":7,"replaces":2,"get-stacks-block-info":2,"stacksblockinfopropertyname":1,"globally":2,"time-based":4,"block-related":2,"timestamps":2,"id-header-hash":4,"global":3,"uniqueness":4,"timestamp":4,"verify-block-hash":1,"0x374708fff7719dd5979ec875d56cd2286f6d3cf7ec317a3b25632aab28ec37bb":1,"block's":2,"unix":4,"heights":3,"accuracy":4,"varies":1,"pre-epoch":1,"post-epoch":1,"seconds":3,"get-tenure-info":2,"tenures":5,"at-block":3,"introduced":3,"reliable":10,"abstracting":6,"repetitive":1,"applied":1,"doubling":1,"doubles":1,"double-elements":1,"transformed":1,"incompatible":4,"transformations":1,"reduces":2,"sqrti":2,"largest":3,"square":2,"roots":1,"calculate-sqrti":1,"u11":2,"divides":5,"log2":1,"base-2":1,"logarithm":1,"logarithmic":1,"determining":7,"logarithms":1,"rounding":2,"calculate-log2":1,"u16":1,"expectations":2,"pow":3,"raises":1,"sqrt":1,"b1":2,"b2":2,"short-circuiting":1,"evaluations":2,"multi-factor":1,"comparison":5,"likely":3,"very":5,"contract_owner":3,"isadmin":1,"set-admin":1,"perform-sensitive-action":1,"admin":3,"leveraging":4,"unnecessary":5,"short-circuits":2,"side":2,"effects":4,"intended":7,"over-complicating":1,"hard":5,"optimal":2,"negate":1,"simultaneously":1,"replace-at":1,"new-element":1,"sequence_a":5,"replacement":1,"modifications":1,"modification":1,"bounds":3,"replacing":2,"replace-element":1,"newelement":1,"index-of":3,"lengths":2,"validates":3,"validate-list-length":1,"as-max-len":4,"detected":5,"compute-sha512-256":1,"0xcf0edb437886eae39b21ebad0caeea342d2bd61c98e9d09d0e89109a546d01fc":1,"distributing":1,"evenly":1,"among":1,"rounded":1,"allocate":1,"total_tokens":1,"distribution_rounds":1,"participantshares":1,"currentround":1,"participantscount":1,"participant":2,"currentparticipants":1,"distribute-tokens":1,"tokensperparticipant":1,"participant's":2,"get-participant-share":1,"causes":4,"accounting":3,"losing":2,"divisions":1,"packing":1,"bitmasking":1,"isolating":1,"leaving":1,"others":3,"meanings":1,"role":2,"role_admin":1,"role_moderator":1,"role_user":1,"userroles":2,"has-role":1,"userrole":2,"add-role":1,"currentrole":1,"remove-role":1,"overcomplicating":1,"invert":3,"bit-xor":4,"flag-based":1,"compares":4,"numerical":4,"ordering":4,"sorting":4,"thresholds":5,"comparisons":5,"sort":4,"lexicographical":4,"auction":1,"bid":1,"max_bid":1,"u1000000000":1,"auction_end_height":1,"currenthighestbid":1,"highestbidder":1,"place-bid":1,"current-block-height":1,"higher":2,"highest":1,"get-highest-bid":1,"ended":1,"auction-ended":1,"inclusive":5,"token-name":6,"burned":2,"tokenomics":1,"models":1,"destroy":7,"deflationary":1,"circulating":6,"voluntarily":1,"economy":4,"emitting":1,"tokenadmin":2,"burn-tokens":1,"burn-tokens-from":1,"permanently":1,"destroyed":1,"increasing":5,"ft-transfer":5,"component":5,"caution":2,"key-name":1,"extracting":3,"safer":3,"get-profile-name":1,"get-profile-age":1,"getter":2,"case-sensitive":1,"maintainable":4,"trait-alias":1,"trait-identifier":1,"varname":3,"traitidentifier":1,"conformance":1,"reusability":2,"imports":3,"aliases":1,"token-trait":3,"'sp2j6zy48gv1ez5v2v5rb9mp66sw86pykkq9h6dpr":1,"forward-get-balance":1,"implements":5,"to-uint":2,"conversions":4,"convert-to-uint":1,"-1":4,"to-int":2,"int-to-utf8":5,"trait-name":2,"func1-name":1,"arg1-type":1,"arg2-type":1,"return-type":1,"function's":1,"polymorphic":1,"dispatch":1,"adhere":2,"establish":3,"architectures":2,"focused":3,"responsibility":1,"concept":3,"overly":3,"difficult":2,"implementations":4,"backwards":4,"ecosystems":1,"predictable":4,"fostering":1,"utf-8":2,"versatile":2,"distinguishing":1,"get-successful-response":1,"branches":3,"asset-name":1,"asset-identifier-type":1,"class":6,"classes":5,"digital":1,"collectibles":1,"art":1,"token-based":4,"nft-related":1,"distinct":1,"nft-based":1,"sharkobarko":1,"artwork-uri":1,"tokenid":1,"get-owner":1,"u403":3,"artwork":1,"collisions":1,"payment":6,"failures":3,"gracefully":7,"guards":1,"u50":10,"sender's":7,"assign":4,"economies":3,"is-err":3,"is-ok":2,"recipientbalance":5,"transferresult":2,"resulted":2,"harder":4,"supply-dependent":1,"supply-limited":1,"cap":2,"max_supply":1,"currentsupply":1,"u500000":1,"u600000":1,"remains":1,"consumption":3,"max_length":1,"literal":2,"appending":4,"preventing":4,"excessive":1,"resource":1,"constraints":3,"appends":1,"mylist":1,"safe-append":1,"newlist":2,"get-list":1,"consistently":1,"vulnerabilities":2,"unbounded":1,"growth":1,"tenureinfopropertyname":1,"tenure":1,"vrf":2,"seeds":1,"randomness-based":1,"miner":2,"participation":1,"tenure-specific":1,"maturity":1,"two-hour":1,"get-miner-spend-ratio":1,"winnerspend":1,"miner-spend-winner":1,"totalspend":1,"miner-spend-total":2,"winner":2,"burnchain-header-hash":2,"miner-address":2,"miner's":2,"vrf-seed":1,"block-reward":2,"relying":6,"detecting":1,"extensively":3,"comments":3,"get-flag":1,"flagposition":2,"bit-shift-left":5,"toggle-flag":2,"position":4,"toggles":1,"3rd":1,"mixing":2,"bit-shift-right":5,"right-shifting":5,"bit-level":2,"encapsulating":1,"callable":1,"hidden":1,"callers":2,"manageable":1,"duplication":1,"validate-amount":1,"separating":2,"bitmasks":3,"manipulating":6,"permission_execute":1,"permission_admin":1,"userpermissions":1,"grant-permission":1,"currentpermissions":1,"revoke-permission":1,"userpermission":1,"left-shifting":3,"var-name":2,"cursor":2,"get-cursor":1,"value-tuple":2,"tuple_a":2,"tuple_b":2,"set-user-data":1,"0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef":2,"newly":4,"0x00000001":1,"0x000f4240":1,"0x00989680":1,"buff-to-uint-le":4,"uint-to-buff":2,"risking":2,"incurring":1,"attempt":4,"utilize":3,"checker":4,"transparent":3,"accessibility":1,"destruction":1,"owned":1,"burn-nft":1,"string-to-int":2,"string-to-integer":1,"convert-string-to-int":1,"-456":1,"abc":2,"string-to-uint":2,"presence":4,"absence":1,"absent":2,"is-profile-missing":1,"non-optional":2,"difference":3,"subtracting":1,"escrow":1,"escrow_fee":1,"escrowbalance":1,"currentbalance":2,"initiate":9,"start-escrow":1,"complete-escrow":1,"escrowamount":1,"decrementing":1,"decrements":1,"principal-address":1,"hash-bytes":2,"decomposing":1,"decompose":1,"decomposition":1,"destructs":1,"destruct-principal":1,"'st3x6qwwetnbzwgbk6drgtr1kx50s74d3425q1tpk":2,"0xfa6bf38ed557fe417333710d6033e9419391a320":2,"0x1a":2,"foo":3,"to-consensus-buff":2,"serializing":1,"serialization":2,"serialize":6,"serializes":1,"serialize-int":1,"serialize-tuple":1,"0x000000000000000000000000000000000000000000000000000000000000002a":1,"serialized":7,"harper":2,"0x0c00000002036167650100000000000000000000000000000005046e616d650d0000000a48617270657220446f67":2,"from-consensus-buff":2,"deserializes":2,"holdings":2,"burn-stx":1,"non-positive":3,"type-signature":1,"deserialize":4,"deserializing":1,"sip-005":4,"transmission":1,"cross-contract":1,"deserialization":1,"serialization-deserialization":1,"workflows":1,"deserialize-user-data":1,"serializeddata":1,"attempts":3,"wasn't":2,"out-of-memory":1,"forcibly":1,"commonly":3,"typed":6,"shamt":2,"places":3,"shift":2,"powers":4,"shifting":2,"preserved":1,"shifts":1,"divide-by-power-of-2":1,"extract-lowest-bits":1,"numbits":1,"-128":1,"-16":1,"u171":1,"preserves":1,"non-uint":2,"masking":2,"is-profile-existing":1,"is-standard":1,"performed":1,"'sp12":1,"restricts":1,"non-principal":1,"initiated":1,"unwrap-err-panic":1,"response-input":2,"throw":2,"process-error-response":2,"errorvalue":2,"exception":2,"thrown":3,"unwrap-err":3,"appended":4,"growing":1,"queue-like":1,"behaviors":4,"incrementally":1,"joining":1,"repeatedly":1,"in-place":1,"type-appropriate":1,"list's":2,"declared":1,"max":1,"eventlog":1,"log-event":1,"current-log":1,"get-eventlog":1,"inefficiently":1,"exceeds":2,"necessity":1,"responsive":2,"designs":1,"safeguards":1,"exceeding":1,"predefined":2,"transfer-stx":2,"u60":3,"stx-transfer-memo":2,"conform":1,"promoting":1,"adheres":1,"inconsistent":2,"documenting":1,"convert-to-int":1,"sale":3,"min_purchase":1,"u100000000":1,"token_price":1,"u50000":1,"0005":1,"tokenssold":1,"purchase-tokens":1,"tokenstomint":1,"buyer":3,"get-tokenssold":1,"threshold":4,"spam":1,"boolean-expression":1,"negation":2,"statements":5,"is-not-zero":1,"non-boolean":2,"disjunction":2,"blockinfopropertyname":1,"block-specific":1,"block-after-time":1,"targettime":1,"u1600000000":1,"mature":1,"inaccurate":1,"time-aware":1,"string-to-unsigned-integer":1,"convert-string-to-uint":1,"u123":1,"u456":1,"process-external-data-le":2,"0x01000000":1,"0x40420f00":1,"0x80969800":1,"confusing":5,"right-padding":2,"total-supply":1,"token-related":1,"unlimited":2,"admin-only":1,"omitting":1,"pausing":1,"instruments":1,"id-block-hash":1,"evaluating":5,"time-dependent":2,"checkpoints":1,"evaluate":8,"time-locked":2,"checkpoint-based":1,"computationally":3,"expensive":3,"assetprices":1,"set-price":1,"was-price-above-at-block":1,"blockhash":1,"pastprice":1,"0x123456":1,"inconsistencies":1,"forks":3,"history-dependent":1,"verifications":1,"complexities":1,"recovering":1,"recover-public-key":1,"messagehash":2,"0xde5b9eb9e7c5592930eb2e30a01369c36586d872082ed8181ee83d2a0ec20f04":2,"0x8738487ebe69b93d8e51583be8eee50bb4213fc49c767d329632730cc193b873554428fc936ca3569afc15f1c9365f6591d6251a89fee9c9ac661116824d3a1301":2,"0x03adb8de4bfb65db2cfd6120d55c6526ae9c52e675db7e47308636534ba7786110":2,"recover":1,"recovery":1,"expr-last":1,"bodies":1,"multi-step":1,"sequentially":2,"expressive":1,"usercount":1,"register-user":1,"printing":2,"earlier":5,"bindings":2,"expressiveness":1,"capability":1,"triggering":1,"automatic":4,"rollback":2,"reverted":1,"diagnose":1,"rolled":1,"insufficient":2,"pairing":1,"revert":2,"reporting":1,"propagate":2,"stack":6,"construction":4,"communicate":3,"error-handling":1,"contributes":1,"is-zero-or-negative":1,"-3":1,"propagation":2,"unwraps":2,"overwritten":1,"insert-user-data":1,"inserted":1,"insertion":1,"overwriting":1,"wrapped":2,"wrap-in-optional":1,"verify-signature":1,"opt-input":1,"some-binding-name":1,"some-branch":1,"none-branch":1,"match-resp":1,"ok-binding-name":1,"ok-branch":1,"err-binding-name":1,"err-branch":1,"flow":7,"extensive":1,"branching":2,"add-10":1,"add-or-pass-err":1,"to-add":1,"err-value":1,"covering":2,"binds":1,"name1":1,"name2":1,"expr-body1":1,"expr-body2":1,"expr-body-last":1,"anytype":2,"sequential":1,"evaluation":1,"bind":1,"prior":1,"calculate-sum":1,"evaluates":1,"expression's":1,"existence":1,"get-user-data":1,"equality":3,"short-circuit":1,"admin_role":1,"is-admin":1,"unset":1,"masks":1,"flag_read":1,"flag_write":1,"flag_execute":1,"create-flag":1,"set-flag":1,"currentflags":1,"check-flag":1,"risks":2,"overflows":1,"increment-cursor":1,"u31536000":1,"vestingstarttime":1,"tokensclaimed":1,"vesting-ratio":1,"claimable-amount":1,"claimed":2,"excluding":2,"boundary":2,"strict":2,"selectively":1,"unwanted":1,"subset":1,"irrelevant":1,"is-even":1,"num":4,"mod":3,"get-even-numbers":1,"refined":1,"subsets":1,"list-based":1,"minted":5,"issuance":1,"emit":1,"rewardtoken":1,"mint-reward":1,"economic":1,"imbalances":1,"responsibly":1,"0x01000000000000000000000000000000":1,"0xffffffffffffffffffffffffffffffff":1,"0xffffffffffffffffffffffffffffff7f":1,"element-at":1,"list-expr":1,"out-of-bounds":1,"varying":1,"positions":2,"zero-based":1,"indexing":2,"todo":2,"todolist":1,"add-todo":1,"currentlist":1,"newlistvalue":1,"get-todo":1,"milk":1,"indices":4,"question":1,"had":1,"slightly":1,"predecessor":1,"error-resistant":1,"compute-sha512":1,"0x638f0da7489fae1f981a47199a2854d0fa117cea82bd86049930aa86e565c6cdccd52fc0e6bba5a135961ed5b7360d5e2b0ff65889acbac01361f5e291a6da45":1,"sequence1":1,"sequence2":1,"concatenated":1,"distinguishes":1,"create-greeting":1,"nesting":1,"static":2,"truncation":1,"concatenations":1,"locating":1,"searching":1,"finds":2,"find-index":1,"0-based":1,"recording":1,"memos":1,"transfer-stx-with-memo":1,"0x010203":1,"0x040506":1,"exponent":1,"exponentiation":1,"raising":1,"raise":1,"acceptable":1,"micro_tokens":1,"userbalance":1,"reprented":1,"get-total-micro-balance":1,"useraddress":1,"micro":1,"exponents":1,"assigning":1,"assigns":1,"mint-nft":1,"non-unique":1,"complement":2,"two's":2,"flag_a":1,"flag_b":1,"flag_c":1,"flag_d":1,"userflags":1,"clear-all-flags-except":1,"set-all-flags-except":1,"has-flag":1,"except":1,"bitcoin-style":1,"short":2,"generation":4,"ripemd160":1,"strong":2,"collision":1,"resistance":1,"reversible":1,"one-way":1,"measures":2,"salting":1,"generates":2,"hash-based":1,"generate-identifier":1,"0x000000000000000000000000000000000000000000000000000000000000000a":1,"0x3bf3d2e8f7a4d7c5f9e6d0d5c6b0f5c7d8e9f0a1":1,"20-byte":1,"reasons":2,"hashed":2,"compactness":1,"concern":1,"tuple1":1,"tuple2":1,"mutating":1,"ones":1,"merging":1,"merged":1,"merges":1,"update-user-address":1,"user-id":1,"new-address":1,"updated-user":1,"john":1,"spaxya5xs51713fdtq8h94ej4v579cxmtrnbzksf":1,"balance-dependent":1,"ft-":1,"validations":1,"unlock":1,"unlock_amount":1,"unlock_interval":1,"u17280":1,"total_unlocks":1,"startblock":1,"unlocksclaimed":1,"start-unlock-schedule":1,"claimable":1,"get-claimable-tokens":1,"elapsedblocks":1,"unlocksdue":1,"claimableamount":1,"interval":1,"authority":1,"privileged":1,"contract-owned":1,"escrow-like":1,"sparingly":2,"secured":1,"access-controlled":1,"contract-managed":1,"treasury":2,"treasurybalance":1,"withdraw":1,"u401":1,"unnecessarily":1,"bool-expr":1,"preconditions":1,"satisfied":1,"clauses":1,"protect":1,"interpreted":1,"self":1,"oneself":1,"excessively":2,"vague":1,"unhelpful":1,"panic":1,"invariants":1,"left-position":1,"right-position":1,"sub-sequences":1,"partial":2,"extraction":2,"slicing":1,"sub-sequence":1,"extracts":1,"extract-substring":1,"blockstack":5,"get-nft-owner":1,"owner's":1,"controlling":1,"paths":1,"decision-making":1,"deeply":1,"simplified":2,"remainder":1,"divisor":1,"calculate-remainder":1,"balance-related":1,"get-stx-balance":1,"primarily":1,"comment":1,"add-and-print":1,"cluttered":1,"reduced":1,"overuse":1,"commenting":1,"version-byte":1,"error_code":1,"create-standard-principal":1,"versionbyte":1,"situations":1,"crash":1,"explicitness":1,"force":3,"outcomes":1,"code's":1,"intent":1,"composition":1,"unwrapping":1,"check-balance":1,"halt":1,"error-expr":1,"truly":1,"if-else":1,"check-sufficient-balance":1,"passage":1,"rather":1,"protected":1,"scheduled":1,"awareness":1,"progression":1,"long-term":1,"measurements":1,"intervals":1,"variations":1,"time-sensitive":1,"phased":1,"release-height":1,"u100000":1,"release-tokens":1,"stable":1,"synchronizing":1,"estimations":1,"vary":1,"vault":2,"withdraw-from-vault":1,"property-name":1,"block-height-int":1,"claim-period-reward":1,"period-end-height":1,"get-period-end-height":1,"current-winner":1,"winner-id":1,"distribute-reward":1,"determined":1,"token-balances":1,"snapshot-height":1,"get-snapshot-balance":1,"snapshot-block":1,"snapshot-balance":1,"current-votes":1,"get-total-votes":2,"map-values":1,"time-locks":1,"signer-metrics-api":9,"signer-metrics":8,"height_or_hash":7,"blocks'":2,"metrics":1,"cycle":5,"acceptance":1,"push":1,"pox-cycle-signers":1,"fetches":3,"aggregated-signer-information-for-a-block":1,"aggregated":3,"prometheus":1,"behavioral":1,"richer":2,"rpc":6,"metrics'":1,"cycle_number":9,"signer_id":1,"signers'":2,"block_proposals":1,"block_hash":4,"block_proposals'":1,"nakamoto":11,"upcoming":2,"upgrade":3,"brings":1,"paves":1,"nakamoto-upgrade":1,"nakamoto-upgrade-start-here":1,"impacts":2,"tooling":1,"good":1,"news":1,"post-upgrade":1,"apart":1,"experiencing":1,"latest":20,"shipping":1,"fresh":2,"aligning":2,"upgrade's":2,"settling":2,"nakamoto-explorer":2,"tailored":2,"live":3,"dropdown":2,"distinctive":2,"modes":2,"independent":2,"focuses":2,"group-by-block":2,"up-to-date":2,"stackingclient":2,"pox-4":3,"signpoxsignature":2,"pox4signaturetopic":2,"enum":3,"stackextend":2,"stackincrease":2,"stackaggregationcommit":2,"stackaggregationcommitindexed":2,"stacks-js":4,"clarinet's":1,"mode":6,"--enable-clarity-wasm":1,"runs":2,"interpreter":1,"wasm":1,"side-by-side":1,"modern":2,"expanded":2,"encourage":2,"developments":2,"older":2,"months":2,"proof-of-transfer":2,"stackers":3,"tenure_change":2,"statistics":2,"priorities":2,"replay":2,"speed":2,"parquet-based":2,"ingestion":4,"optimizes":2,"canonical":3,"classic":2,"burn-blocks":5,"smart-contracts":4,"signer_key":4,"by_height":3,"by_burn_block_hash":3,"burn_block_hash":3,"by_burn_block_height":3,"burn_block_height":3,"with_transfers":2,"transactions_with_transfers":2,"reaches":1,"stack-stx":3,"stack-extend":1,"eventually":1,"vote-for-aggregate-public-key":1,"pox_stacking_orders":1,"slots":1,"auto-extend":1,"engouh":1,"looks":2,"start_at_cycle":1,"auto_extend":1,"btc_address":3,"mr1ipkd9n3rjzzxxrk7xf9d36gffa6exnc":1,"muydxkmx9bbyauede6kffhd5ff1gdn9erg":1,"mvztbibdaaa3wlpy7zxxfqra3t4xsknbx7":1,"nakademo":1,"keywords":1,"introduces":1,"fork":2,"tenure-height":1,"stacks-block-height":1,"stackaggregationincrease":1,"stackstestnet":8,"snippets":1,"my_address":1,"topic":2,"rewardcycle":3,"getpoxinfo":1,"reward_cycle_id":1,"poxaddress":1,"my_btc_address":1,"maxamount":1,"10_000_000_000_000":1,"authid":1,"123n":1,"signerprivatekey":1,"my_signer_private_key":1,"amountmicrostx":1,"burnblockheight":1,"current_burn_block_height":1,"signerkey":1,"my_signer_public_key":1,"signersignature":1,"privatekey":8,"my_stx_private_key":1,"bugs":2,"set-up-a-new-clarinet-project":1,"test-the-deposit-function":1,"folders":1,"pre-existing":1,"utilities":4,"suite":1,"'allows":1,"stx'":3,"organizes":1,"describes":1,"groups":1,"confirms":1,"accepted":1,"lastly":3,"'get-balance-by-sender'":1,"comprehensively":1,"inlinecode":16,"inline-code'":16,"'my-20'":4,"platforms":2,"origin":4,"non-browser":2,"uniquely":3,"identified":3,"redirectpath":2,"postpended":2,"relative":3,"app's":2,"corenode":2,"authenticatorurl":2,"web-based":2,"twoslash":2,"noerrors":2,"word":3,"publish_data":2,"'publish_data'":2,"'email'":2,"loading":2,"auth-request":2,"---cut---":2,"lookupprofile":2,"'mainnet'":12,"'testnet'":9,"'devnet'":6,"'mocknet'":4,"stacksnetwork":4,"zonefilelookupurl":2,"zone":2,"reside":2,"createstacksprivatekey":4,"makerandomprivkey":2,"getpublickey":1,"random":5,"'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01'":6,"makestxtokentransfer":15,"broadcasttransaction":10,"anchormode":8,"txoptions":8,"'sp3fgq8z7jy9bwyz5wm53e0m9nk7whjf0691nz159'":6,"12345n":7,"senderkey":11,"'test":4,"memo'":9,"0n":4,"builder":7,"200n":2,"serializedtx":3,"serializedtxhex":1,"bytestohex":1,"broadcastresponse":3,"makecontractdeploy":4,"stacksmainnet":4,"network'":9,"readfilesync":3,"'fs'":3,"'contract_name'":3,"codebody":5,"tostring":3,"makecontractcall":6,"fungibleconditioncode":3,"makestandardstxpostcondition":4,"buffercvfromstring":4,"postconditionaddress":3,"'sp2zd731anqzt6j4k3f5n8a40zxwxc1xfxhvvqfke'":3,"postconditioncode":3,"greaterequal":3,"postconditionamount":3,"1000000n":4,"postconditions":6,"'spbmrfrppgcde3f384wcjpk8pqjgz8k9qkk7f59x'":3,"'contract_function'":3,"'foo'":3,"validatewithabi":4,"described":3,"accepts":5,"clarityabi":3,"stacks-transactions-js":1,"contract-abi":1,"l231":1,"constructed":3,"'abi":1,"test-abi":1,"sponsoring":3,"common'":5,"buffercv":3,"sponsor":3,"portion":4,"sponsortransaction":3,"bytesreader":3,"deserializetransaction":3,"'hex'":1,"deserializedtx":3,"sponsorkey":3,"'770287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01'":3,"1000n":3,"sponsoroptions":3,"sponsorprivatekey":3,"sponsornonce":3,"sponsoredtx":3,"supporting":3,"multi-sig":3,"numsignatures":3,"publickeys":3,"makeunsignedstxtokentransfer":3,"pubkeyfromprivkey":3,"publickeytostring":3,"transactionsigner":3,"'sp3fgq8":3,"2500000n":3,"privkeystrings":3,"'6d430bb9":3,"'2a584d89":3,"'d5200dee":3,"privkeys":3,"pubkeys":3,"pubkeystrings":3,"meeting":3,"requirement":3,"partially":3,"deserialized":4,"signorigin":3,"appendorigin":3,"serializedsignedtx":3,"'st3kc0mtnw34s1zxd36jykfd3jjmwa01m55dsj4je'":3,"'kv-store'":3,"'get-value'":3,"'st2f4bk4gzh6yfbnhyddgn4t1rkba7da1bjzpjejj'":3,"sip-002-smart-contract-language":3,"clarity-type-system":3,"key-name-0":3,"key-type-0":3,"key-name-1":3,"key-type-1":3,"max-len":3,"entry-type":3,"err-type":3,"abort":5,"some-type":3,"well-typed":3,"extend":3,"truecv":3,"falsecv":3,"nonecv":3,"somecv":3,"intcv":3,"uintcv":4,"contractprincipalcv":3,"responseerrorcv":3,"responseokcv":3,"listcv":3,"tuplecv":3,"utf8tobytes":3,"nothing":3,"bufcv":3,"-10":3,"'sp2jxkmsh007npyaqhkjpqmaqyad90nqgtvjvq02b'":5,"'contract-name'":3,"spcv":3,"cpcv":3,"errcv":3,"okcv":3,"tupcv":3,"l":3,"wrongly-typed":3,"compile":3,"homogeneous":3,"meaning":3,"booleancv":3,"homogeneity":3,"sip-005-blocks-and-transactions":3,"transaction-post-conditions":3,"makecontractstxpostcondition":3,"standardstxpostcondition":3,"'test-contract'":3,"contractstxpostcondition":3,"createassetinfo":4,"makestandardfungiblepostcondition":4,"assetaddress":3,"'sp62m8mefh32wgsb7xsf9wjzd7tqb48vqb5anwsj'":3,"assetcontractname":3,"'test-asset-contract'":3,"'test-token'":3,"fungibleassetinfo":3,"standardfungiblepostcondition":3,"contractfungiblepostcondition":3,"makecontractfungiblepostcondition":3,"post-condition":6,"processor":3,"post-conditions":11,"write-smart-contracts":3,"nonfungibleconditioncode":3,"makestandardnonfungiblepostcondition":3,"makecontractnonfungiblepostcondition":3,"doesnotsend":3,"'test-asset'":3,"assetid":5,"'test-token-asset-id'":3,"nonfungibleassetinfo":3,"standardnonfungiblepostcondition":3,"contractnonfungiblepostcondition":3,"cvtojson":3,"hextocv":4,"tx_result":4,"mocknet":2,"mystacksnode":1,"ismainnet":1,"'sp2bs6hd7tn34v8z5bnf8q2aw3k8k2dpv4264cf26'":5,"bignum":1,"middleware":3,"rate-limited":3,"createapikeymiddleware":3,"createfetchfn":3,"getnonce":4,"myapimiddleware":3,"'example_e8e044a3_41d8b0fe_3dd3988ef302'":3,"myfetchfn":3,"middlewares":3,"mymainnet":3,"fetchfn":4,"override":4,"'some":3,"fee-estimation":3,"hook":3,"requestcontext":3,"responsecontext":3,"premiddleware":3,"ctx":3,"init":3,"'x-foo'":3,"'bar'":3,"x-foo":3,"postmiddleware":3,"pre":3,"urls":5,"txbroadcasturl":3,"getbroadcastapiurl":3,"feeestimateurl":3,"gettransferfeeestimateapiurl":3,"accountinfourl":3,"getaccountapiurl":3,"'hello_world'":3,"abiurl":3,"getabiapiurl":3,"'hello'":3,"readonlyfunctioncallurl":3,"getreadonlyfunctioncallapiurl":3,"nodeinfourl":3,"getinfourl":3,"blocktimeurl":3,"getblocktimeinfourl":3,"poxinfourl":3,"getpoxinfourl":3,"globe":1,"separated":2,"individually":2,"broadcast-transactions":9,"safe-guard":1,"_aka":1,"wrapper":1,"numbers_":1,"img":1,"string-meme":1,"max-w-":1,"300px":1,"mx-auto":1,"meme":1,"debuggable":1,"unintelligible":1,"experienced":1,"arrays":2,"accross":1,"codebase":1,"switched":1,"diff":2,"clarity-representation":1,"12n":1,"private-keys":1,"signmessagehashrsv":1,"f5a3":1,"compressed":1,"breaks":1,"signwithkey":1,"nextsignature":1,"nextverification":1,"publickeyfromsignaturevrs":1,"publickeyfromsignaturersv":1,"instances":2,"networking":1,"caused":1,"aka":3,"instantiation":1,"obvious":1,"doing":2,"anymore":2,"literals":1,"object-like":1,"baseurl":1,"mozilla":1,"en-us":1,"fetch_api":1,"diffs":1,"mynode-optional":1,"myfetch":1,"myfetchoptional":1,"inferred":1,"whole":1,"stacks_testnet":4,"mynode":1,"extending":1,"translate":1,"naming":2,"board":1,"privatekeytoaddress":3,"sp1mxszf4nfc8jq1ttygec2wadmc7y3ghvzyrx6rf":1,"renamed":1,"estimatefee":1,"fetchfeeestimate":1,"estimatetransfer":1,"fetchfeeestimatetransfer":1,"estimatetransaction":1,"fetchfeeestimatetransaction":1,"getabi":1,"fetchabi":1,"fetchnonce":1,"getcontractmapentry":1,"fetchcontractmapentry":1,"fetchcallreadonlyfunction":3,"highlight":2,"irreversible":1,"replaced":2,"wire":1,"claritywiretype":1,"considered":1,"somewhat":1,"mix":1,"old":1,"postconditionwire":1,"stxpostcondition":2,"'stx-postcondition'":2,"'gte'":2,"'100'":3,"ftpostcondition":2,"fungiblepostcondition":2,"'ft-postcondition'":2,"'eq'":2,"'sp3d6pv2acbpekyjtcmh7hen02kp87qsp8kteh335":2,"my-ft-token":2,"my-token'":2,"nftpostcondition":2,"nonfungiblepostcondition":2,"'nft-postcondition'":2,"'sent'":2,"my-nft":2,"my-asset'":2,"hex-encoded":2,"_instead_":1,"hex-strings":1,"skip":4,"renaming":1,"stackstransaction":2,"serializebytes":1,"serializecv":1,"serializecvbytes":1,"serializeaddress":1,"serializeaddressbytes":1,"deserializeaddress":1,"deserializeaddressbytes":1,"serializelplist":1,"serializelplistbytes":1,"deserializelplist":1,"deserializelplistbytes":1,"serializelpstring":1,"serializelpstringbytes":1,"deserializelpstring":1,"deserializelpstringbytes":1,"serializepayload":1,"serializepayloadbytes":1,"deserializepayload":1,"deserializepayloadbytes":1,"serializepublickey":1,"serializepublickeybytes":1,"deserializepublickey":1,"deserializepublickeybytes":1,"serializestacksmessage":1,"serializestacksmessagebytes":1,"deserializestacksmessage":1,"deserializestacksmessagebytes":1,"serializememostring":1,"serializememostringbytes":1,"deserializememostring":1,"deserializememostringbytes":1,"serializetransactionauthfield":1,"serializetransactionauthfieldbytes":1,"deserializetransactionauthfield":1,"deserializetransactionauthfieldbytes":1,"serializemessagesignature":1,"serializemessagesignaturebytes":1,"deserializemessagesignature":1,"deserializemessagesignaturebytes":1,"serializepostcondition":1,"serializepostconditionbytes":1,"deserializepostcondition":1,"deserializepostconditionbytes":1,"serializestackswirebytes":1,"deserializestackswirebytes":1,"assetinfo":1,"stackswiretype":1,"createasset":1,"parseassetinfostring":1,"parseassetstring":1,"legacy":4,"triplesec":1,"mnemonics":1,"decryptmnemonic":1,"decryptlegacy":1,"somewhere":1,"wiretype":1,"internals":1,"wire-format":1,"internally":2,"stacksmessage":1,"stackswire":1,"stacksmessagetype":1,"_wire-format_":1,"messagesignature":1,"messagesignaturewire":1,"stackspublickey":1,"publickeywire":1,"transactionauthfield":1,"transactionauthfieldwire":1,"assetwire":1,"addresswire":1,"postconditionprincipal":1,"postconditionprincipalwire":1,"stxpostconditionwire":1,"fungiblepostconditionwire":1,"nonfungiblepostconditionwire":1,"lengthprefixedstring":1,"lengthprefixedstringwire":1,"coinbasepayload":1,"coinbasepayloadwire":1,"poisonpayload":1,"poisonpayloadwire":1,"smartcontractpayload":1,"smartcontractpayloadwire":1,"tokentransferpayload":1,"tokentransferpayloadwire":1,"versionedsmartcontractpayload":1,"versionedsmartcontractpayloadwire":1,"nakamotocoinbasepayload":1,"nakamotocoinbasepayloadwire":1,"tenurechangepayload":1,"tenurechangepayloadwire":1,"standardprincipalwire":1,"contractprincipalwire":1,"inttobigint":1,"misunderstood":1,"unused":1,"refactorings":1,"addresshashmode":1,"prefixes":1,"brevity":1,"randomprivatekey":5,"generatesecretkey":2,"randomseedphrase":3,"please":6,"setup-and-installation":3,"create-a-transaction":1,"broadcasting-the-transaction":1,"handle-the-results":1,"hiro-so":4,"stacks-connect-example":3,"flex-wrap":3,"w-max'":3,"'outline'":1,"transition-colors":2,"text-neutral-90":1,"text-white'":1,"-cn":4,"sp3fgq8z7jy9bwyz5wm53e0m9nk7whjf0691nz159":2,"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601":3,"builds":1,"contract-deploy":1,"'753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601'":1,"function-call":1,"pc":6,"sp2zd731anqzt6j4k3f5n8a40zxwxc1xfxhvvqfke":1,"willsendeq":3,"spbmrfrppgcde3f384wcjpk8pqjgz8k9qkk7f59x":1,"contract_name":7,"contract_function":1,"b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01":1,"responding":1,"'transaction":4,"deep":4,"constructing-post-conditions":1,"using-post-conditions":1,"setting-the-post-condition-mode":1,"usage-examples":1,"inspired":1,"driven":1,"bdd":1,"initializer":1,"auto-complete":1,"'stb44hypyat2bb2qe513nsp81htmywbjp02hpgk6'":2,"willsendgte":3,"willsendgt":1,"willsendlte":1,"willsendlt":1,"ends":1,"willsendasset":1,"willnotsendasset":1,"unspecified":1,"permitted":1,"-n":10,"postconditionmode":1,"essentially":1,"tells":1,"ignore":2,"'stb44hypyat2bb2qe513nsp81htmywbjp02hpgk6":1,"token-ft'":1,"not-sending":1,"token-nft":1,"token'":1,"postconditionfornft":1,"semi-fungible-token":1,"semi-fungible-token-id":1,"token-id":3,"postconditionforft":1,"v7":1,"mobile":1,"expo":1,"set-up-the-expo-project":1,"install-necessary-dependencies":1,"polyfills":1,"add-nodejs-polyfills":1,"add-global-polyfills":1,"use-stacksjs-in-the-project":1,"js-react-native-expo-51":1,"create-expo-app":1,"previewing":1,"qr":1,"polyfilling":1,"browser-specific":1,"nodejs-specific":1,"wallet-sdk":3,"--save-dev":1,"react-native-get-random-values":1,"text-encoding":1,"readable-stream":1,"crypto-browserify":1,"peculiar":1,"webcrypto":1,"metro":1,"modules":1,"getdefaultconfig":1,"metro-config":1,"__dirname":1,"resolver":1,"extranodemodules":1,"resolve":1,"crypto":1,"module":2,"exports":3,"polyfill":1,"textdecoder":1,"textencoder":1,"expo-router":1,"transactionversion":3,"getaddressfromprivatekey":1,"generatewallet":3,"usestate":1,"homescreen":1,"setmnemonic":1,"setwallet":1,"setlog":1,"secretkey":3,"sp3w993d3brdyb284cy3sbfdegtc5xedjpdea21cn":1,"stxprivatekey":3,"themedview":1,"themedtext":1,"subtitle":1,"phrase":3,"onpress":1,"layers":2,"sourced":2,"depositor":2,"rotating":2,"multisignature":2,"emily":2,"notifying":2,"depositor's":2,"specialized":2,"script":4,"satoshis":3,"reclaim":2,"notify":2,"inform":2,"explorers":2,"_coming":2,"soon_":2,"high-level":2,"buildsbtcdepositaddress":2,"provider":4,"sendtransfer":5,"sbtcapiclienttestnet":2,"'sbtc'":2,"stacksaddress":2,"target_stx_address":2,"signerspublickey":2,"fetchsignerspublickey":2,"maxsignerfee":2,"80_000":2,"pay":2,"reclaimlocktime":2,"6_000":2,"lock":5,"favorite":4,"broadcasted":4,"walletprovider":2,"100_000":2,"notifysbtc":2,"buildsbtcdeposittx":2,"depositing":3,"amountsats":2,"deposit_amount":2,"taproot":2,"your_btc_private_key":2,"finalize":2,"psbtbytes":2,"topsbt":2,"broadcasttx":2,"sbtcdeposithelper":2,"fully-formed":2,"spendable":2,"5_000_000":2,"pub":2,"feerate":2,"fetchfeerate":2,"'medium'":2,"fetchutxos":2,"your_btc_address":2,"bitcoinchangeaddress":2,"'txid'":2,"'res'":2,"statusmessage":2,"clients":4,"additionally":3,"sbtcapiclientmainnet":2,"communicating":2,"sbtcapiclientdevenv":2,"adjustments":4,"pre-release":2,"phase":2,"minor":2,"hackathon":2,"fetchsignersaddress":2,"p2tr":2,"'low'":2,"'high'":2,"unspents":2,"fetchtxhex":2,"deposit_btc_tx":2,"sbtcbalance":2,"fetchsbtcbalance":2,"stx_address":2,"schnorr":2,"sat":2,"vbyte":2,"utxowithtx":2,"reclaimpublickey":2,"x-only":2,"reclaiming":2,"bitcoinnetwork":2,"utxotospendable":2,"p2wpk":2,"p2sh":3,"effort":5,"paymentpublickey":2,"sbtcapiclient":2,"sbtccontract":2,"sbtcapiurl":2,"btcapiurl":2,"electrs":2,"stxapiurl":2,"migration":10,"stacksjs-5xx--7xx":6,"privatekeytopublickey":2,"_stacks_transactions":2,"makeunsignedcontractdeploy":2,"claritycode":4,"readonly":2,"makeunsignedcontractcall":2,"condition01":2,"'foo":2,"string'":2,"stacks_mainnet":2,"stacks_devnet":2,"chainid":2,"peernetworkid":2,"magicbytes":2,"'x2'":2,"bootaddress":2,"'sp000000000000000000002q6vf78'":2,"addressversion":2,"singlesig":2,"openstxtransfer":1,"connect'":8,"'st39mj145br6s8c315ag2bd61sj16e208p1fdk3ak'":1,"oncancel":2,"'user":1,"canceled'":1,"manual":4,"treat":1,"precisely":1,"aren't":1,"perfect":1,"end-state":1,"words":5,"guarantee":1,"'gt'":1,"'lt'":1,"'lte'":1,"'not-sent'":1,"conflicting":1,"attempted":1,"filesignature":1,"prompt":2,"backends":1,"'f5a31c1268a1e37d4edaa05c7d11183c5fbfdcdc48aae36ea4d8cd5cb709932801'":1,"deterministic":1,"wallet-sdk'":1,"warrior":1,"volume":1,"sport":1,"figure":1,"cake":1,"seedphrase":1,"'893fc4936c5350394bbe0053d2c31a4b5a44680f6dceb4be2aacaaa3c12e45ff01'":1,"dataprivatekey":1,"'676dc36d89ba04cf1789552fc35f3a6279b4b5f13f3d49fb469b0afecea9698f'":1,"appskey":1,"'xprva19evfhuzrzf3wulusv1uvcqnrp7xj2vn2myakauhbt8svjrrkkhanrg2bewmxhaedsouvubrpiztdc8wwgtz9ero2gxw5rk3vhhxmutb4v'":1,"salt":1,"'cf8a5c7142d842bb38f30c5ab626f7996dd7494236edf21ba00349bb09b9558d'":1,"generatenewaccount":1,"account's":1,"normal":2,"sp":1,"st":1,"st2f4bk4gzh6yfbnhyddgn4t1rkba7da1bjzpjejj":1,"showconnect":2,"appdetails":1,"stxaddress":1,"'sp1mxszf4nfc8jq1ttygec2wadmc7y3ghvzyrx6rf'":1,"'secret'":1,"publickeytoaddress":1,"abstractions":1,"speak":1,"suggests":1,"completeness":1,"mention":1,"isn't":1,"ephemeral":1,"accept":1,"alias":2,"finalized":2,"foldericon":2,"ommitted":1,"mg":2,"authenticate-users":7,"group-data-":1,"bg-contrast":1,"text-background":1,"bg-accent":1,"text-muted-foreground'":1,"stacks-ready":1,"gaia":1,"auto-generated":1,"initialise":1,"counter_test":1,"'text-lg'":1,"function'":1,"'increments":1,"value'":1,"incrementresponse":1,"count1":1,"count2":1,"'sends":1,"event'":1,"tohavelength":1,"printevent":1,"tobe":1,"'print_event'":1,"stringascii":5,"'incremented'":1,"telling":1,"succeeded":1,"saves":1,"emitted":2,"apikeyscontent":3,"paginated":1,"offset":1,"0x924e0a688664851f5f96b437fabaec19b7542cfcaaf92a97eae43384cacd83d0":1,"st39f7sa0akh7rb363w3ne2dthd3p32zhnx2ke7j9":1,"on_chain_only":1,"0x17ceb3da5f36aab351d6b14f5aa77f85bb6b800b954b2f24c564579f80116d99":1,"parent_block_hash":1,"0xe0d1e8d216a77526ae2ce40294fc77038798a179a6532bb8980d3c2183f58de6":1,"burn_block_time":1,"burn_block_time_iso":1,"2021-06-05t06":1,"tx_index":1,"microblock_hash":1,"microblock_sequence":1,"microblock_canonical":1,"event_count":1,"coinbase":2,"coinbase_payload":1,"paginate":1,"entire":1,"expands":2,"intentionally":2,"minimal":3,"indexes":4,"cleans":2,"enriches":2,"fingertips":2,"knew":2,"issuing":1,"nonces'":2,"last_executed_tx_nonce":1,"last_mempool_tx_nonce":1,"possible_next_nonce":1,"detected_missing_nonces":1,"suggested":1,"nonces":1,"non-contiguous":1,"inspecting":1,"the's":1,"indicates":1,"went":1,"dropped":1,"whatever":2,"indication":1,"stacks-api-architecture":1,"proxying":1,"load-balanced":1,"stacks-nodes":1,"rpc-endpoints":1,"call-read":2,"estimation":1,"unavailable":1,"rosetta":1,"specification":5,"rosetta-api":1,"example-contracts":1,"routes":1,"observer":2,"emitter":1,"byproducts":1,"smart-contract":1,"relational":1,"postgresql":1,"event-stream":1,"auto-generate":1,"controller":1,"sql":1,"easiest":1,"debugger":1,"docker-compose":1,"integrated":1,"average-times'":1,"subdomains'":1,"zonefile'":1,"namespaces":3,"tld":2,"names'":1,"zonefile":1,"zonefilehash":1,"rewards'":1,"reward_slot_holders'":1,"reward_slot_holders":1,"total'":1,"cycles'":1,"stackers'":1,"stx_supply":4,"network_block_time":1,"plain'":2,"network_block_times'":1,"extended'":1,"legacy_format'":1,"events'":3,"stats'":1,"mempool'":2,"dropped'":1,"multiple'":1,"raw'":1,"pox4":2,"pool_principal":1,"delegations":1,"transactions_with_transfers'":1,"balances'":3,"nft_events'":1,"assets'":1,"with_transfers'":1,"stx_inbound'":1,"by_trait'":1,"fees'":1,"holders'":5,"holdings'":1,"mints'":1,"history'":1,"marf":1,"merkel":1,"sip-004":1,"sip-004-materialized-view":1,"marf-merkle-proofs":1,"energy":1,"in-app":1,"go-to":1,"tablebody":1,"tablecell":1,"tablehead":1,"tableheader":1,"tablerow":1,"providers":4,"xverse-like":1,"getaddresses":4,"wallet_connect":1,"signpsbt":3,"signinputs":3,"stx_getaddresses":3,"stx_getaccounts":3,"stx_getnetworks":1,"stx_transferstx":5,"stx_transfersip10ft":1,"stx_transfersip9nft":1,"stx_callcontract":4,"stx_deploycontract":5,"stx_signtransaction":1,"stx_signmessage":4,"stx_signstructuredmessage":4,"stx_updateprofile":1,"xverse":1,"stx_accountchange":1,"stx_networkchange":1,"legend":1,"auto-compatibility":3,"unify":3,"differently":1,"---------------------------":1,"------":1,"----------------------------------------------------------------------------------------------------":1,"transforms":1,"psbt":3,"base64":3,"lossy":1,"restructure":1,"lose":1,"connectwalletbutton":1,"connect-wallet-button'":1,"contentbackground":1,"connecting":2,"users'":1,"install-the-stacksconnect-package":1,"connect-to-a-users-wallet":3,"manage-authentication-state":1,"access-user-data":1,"connection":6,"popup":1,"overflow-hidden":1,"bg-card":1,"rounded-lg":1,"border":1,"border-border":1,"overflow-auto":1,"p-8":1,"h-auto":1,"absolute":1,"inset-x-0":1,"bottom-0":1,"grid":1,"place-items-center":1,"h-full":1,"reloads":2,"forcing":1,"advanced-usage":1,"disconnect":5,"isconnected":7,"clears":4,"getlocalstorage":4,"sp2mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn":3,"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae":3,"'stx_getaccounts'":3,"02d3331cbb9f72fe635e6f87c2cf1a13cd":3,"gaiahuburl":3,"hub":4,"gaiaappkey":3,"0488ade4040658015580000000dc81e3a5":3,"sign-and-broadcast-transactions":1,"handle-transaction-results":1,"connectwallet":2,"'connected":2,"'stx_transferstx'":4,"'st2eb9weqnr9p0k28d2dc352tm75yg3k0gt7v13cv'":1,"'reimbursement'":1,"'stx_deploycontract'":3,"'my-contract'":1,"'stx_callcontract'":3,"hi":1,"callcontract":1,"'st22t6zs7hvwemzhhfk77h4gtndtwnpqax8wzakhj'":1,"st1x":1,"transactionresponse":1,"txraw":1,"handletransaction":1,"explorerurl":1,"'view":1,"prove":1,"helpful":2,"token-gated":1,"signs":1,"agreed":1,"verify-signatures":1,"signmessage":1,"'stx_signmessage'":3,"'signature":1,"'public":1,"signstructuredmessage":1,"'message'":1,"app'":1,"'1":3,"'chain-id'":3,"'stx_signstructuredmessage'":3,"encryption'":1,"verifysignature":1,"wallet-to-dapp":1,"wbips":1,"netlify":1,"sip-030":3,"janniks":3,"sip-030-wallet-interface":3,"dapps":1,"patient":3,"long-running":4,"modernize":3,"forward":2,"culminating":3,"bear":1,"_feel":1,"stabilize":1,"jwt":3,"deprecations":1,"favor":1,"sessionoptions":1,"sessiondata":1,"sessiondatastore":1,"instancedatastore":1,"localstoragestore":1,"semi-backwards":1,"showxyz":1,"openxyz":1,"doxyz":1,"params":3,"callbacks":1,"useconnect":1,"docontractcall":1,"opencontractdeploy":1,"forcewalletselect":3,"'getaddresses'":3,"caches":1,"connect-react":1,"reload":1,"hooks":2,"reloading":1,"established":1,"abstracted":1,"hood":1,"jotai":1,"network's":1,"behalf":2,"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69":2,"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr":2,"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114":2,"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304":2,"'sendtransfer'":2,"'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4'":2,"'1000'":3,"'bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh'":2,"'2000'":2,"0x1234":2,"'signpsbt'":2,"'chnidp":2,"chnidp":2,"'stx_getaddresses'":2,"'sp2mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn'":3,"'optional":3,"'sp2mf04vagyhgazwgtedw5vycpdwwsy08z1qfndsn":2,"counters'":2,"'counters'":2,"'2'":2,"claritymessage":2,"claritydomain":2,"'example":2,"sip-018":2,"style":2,"promise-based":2,"'wallet":2,"meant":2,"stacksprovider":2,"persistwalletselect":2,"enableoverrides":2,"enablelocalstorage":2,"defaultproviders":2,"wbipprovider":2,"approvedproviderids":2,"ids":4,"'method'":2,"fixes":2,"formats":2,"remaps":2,"wallet-specific":2,"'leatherprovider'":2,"'xverse'":2,"requestraw":2,"bypasses":2,"selector":2,"connection's":1,"predicate-design":3,"auditing":2,"histories":2,"'w-full'":2,"0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f":2,"observes":1,"op_return":1,"p2wpkh":2,"p2wsh":1,"p2kph":1,"descriptor":1,"0xbtc21000042stx016":1,"starts_with":1,"ends_with":1,"ending":1,"pay-to-public-key-hash":1,"recipient's":1,"concealing":1,"pay-to-script-hash":1,"pay-to-witness-public-key-hash":1,"segregated":1,"segwit":1,"pay-to-witness-script-hash":1,"wpkh":1,"tprv8zgxmbicqkspepxn6j3tjvb2mbzqkuhggc6orh2wzanczqgxktcnjzj44xdsriw3jnkbvtk9jw6kfhvnrkgamtsyubevmjprskz4ptfmtgv":1,"84'":1,"1'":1,"descriptors":2,"semi-standardized":1,"describing":1,"pubkey":1,"multisig-wallet":1,"wanted":1,"reads":1,"bip84":1,"bcrt1qzy2rdyvu8c57qd8exyyp0mw7dk5drsu9ewzdsu":1,"bcrt1qsfsjnagr29m8h3a3vdand2s85cg4cefkcwk2fy":1,"bcrt1qauewfytqe5mtr0xwp786r6fl39kmum2lr65kmj":1,"stacks_protocol":1,"pot":1,"concensus":1,"securing-web3-apps-through-bitcoin-an-overview-of-stacks-consensus-mechanism":1,"block_committed":1,"leader_registered":1,"inscription_feed":2,"stx_transferred":1,"stx_locked":1,"reveal":1,"ordinal":5,"inscription":2,"higher_than":1,"lower_than":1,"ft_transfer":1,"asset_identifier":1,"fully":3,"qualified":1,"transition-colors0'":1,"cbtc-token":1,"nft_transfer":1,"monkey-sip09":1,"monkeys":1,"stx_transfer":1,"locking":1,"matches_regex":1,"regex":2,"monkey":1,"w":1,"scoping":1,"sp000000000000000000002q6vf78":1,"compliance":1,"implement_trait":1,"sip09-protocol":1,"reorg-aware":3,"indexer":10,"serves":1,"waste":3,"reindexing":3,"lighter":1,"register-chainhooks-on-devnet":3,"quot":1,"configure-your-stacks-node":1,"configure-chainhook":1,"create-a-predicate":1,"initiate-chainhook-as-a-service":1,"dynamically-register-predicates":1,"followed":1,"rpc_bind":1,"p2p_bind":1,"bootstrap_node":1,"02da7a464ac770ae8337a343670778b93410f2f3fef6bea98dd1c3e9224459d36b":1,"seed-0":1,"02afeae522aab5f8c99a00ddf75fbcb4a641e052dd48836408d9cf437344b63516":1,"seed-1":1,"03652212ea76be0ed4cd83a25c06e57819993029a7b9999f7d63c36340b34a4e62":1,"seed-2":1,"peer_host":1,"bitcoind_username":1,"rpcuser":3,"bitcoind_password":1,"rpcpassword":3,"rpc_port":1,"rpcport":3,"peer_port":1,"events_observer":1,"retry_count":1,"events_keys":1,"--mainnet":4,"bitcoind_rpc_username":2,"bitcoind_rpc_password":2,"bitcoind_rpc_url":2,"stacks_node_rpc_url":2,"deregister":2,"http_api":2,"http_port":2,"database_uri":2,"redis":2,"node's":3,"zeromq":3,"stacks_events_ingestion_port":1,"zmq":2,"bitcoind_zmq_url":2,"tcp":3,"max_number_of_bitcoin_predicates":2,"max_number_of_concurrent_bitcoin_scans":2,"max_number_of_stacks_predicates":2,"max_number_of_concurrent_stacks_scans":2,"max_number_of_processing_threads":2,"max_number_of_networking_threads":2,"max_caching_memory_size_mb":2,"event_source":2,"tsv_file_url":2,"matched":1,"--------------------":1,"-----------------------------":2,"zmqpubhashblock":3,"print-event":1,"6ad27176-2b83-4381-b51c-50baede11e3f":1,"end_block":3,"st1sva0sst0edt4mfygwgp6gnsxmmqjdvp1g8qttc":1,"arkadiko-freddie-v1-1":1,"file_append":6,"arkadiko":1,"txt":4,"sp2c2yfp12ajzb4mabjbaj55xecvs7e4pmmz89yzr":1,"print-event-post":1,"e5fa09b2-ec3e-4b6a-9a4a-0ebb454f6e19":1,"cn389ncoiwuencr":2,"expire_after_occurrence":3,"posts":2,"mentioned":2,"--predicate-path":2,"--config-path":3,"registers":3,"lines":3,"uncommented":2,"-x":2,"content-type":2,"predicate_1":2,"predicate_2":2,"situated":1,"background":1,"initiates":1,"07":1,"completed":1,"whenever":1,"occurs":1,"_json":2,"continously":1,"designate":1,"configure-an-existing-bitcoin-node-to-work-with-chainhook":1,"generate-a-chainhook-predicate-to-target-specific-transactions":1,"scan-the-bitcoin-blockchain-for-transactions-that-match-your-predicate":1,"initiate-a-chainhook-service-to-watch-for-matching-transactions":1,"dynamically-register-your-predicate-with-chainhook":1,"substitute":1,"---------------":1,"---------------------":1,"appendation":1,"stacking-pool":1,"bc1qs0kkdpsrzh3ngqgth7mkavlwlzr7lms2zv3wxe":1,"bitcoin-transactions":1,"friedgar":1,"friedger":1,"notice":1,"stacking-pool-api":1,"finished":2,"scanned":1,"delivered":1,"acts":1,"ongoing":1,"event-streaming":1,"delivering":1,"exposes":1,"detailing":1,"creating-the-predicate":1,"running-the-predicate":1,"return-contract-data-with-the-clarity-function":1,"chainhook-payload":1,"contract-call-chainhook":2,"excellent":1,"targeting":1,"decode_clarity_values":2,"stj81c2wpqhfb6xtg518jkpabwm639r2x37vfkjv":2,"simple-vote-v0":2,"call-cast-vote":1,"delivers":2,"tmp":2,"full-predicate":1,"pages":2,"--testnet":1,"examine":1,"uservotes":1,"err_already_voted":1,"hasvoted":1,"votecount":1,"totalvotes":1,"0x312a3c559af0f75381a9eb4540912c310d74682ed3036207ec890ad8cd1aebe6":1,"standarized":1,"observation":1,"block_identifer":1,"observed":1,"contract-call-payload":1,"block_identifier":1,"0x4d88015a6df9ec4f6df875941d87337ce64f8d51608563f80b6e27adeb327e4d":1,"index_block_hash":1,"get-block":1,"array's":1,"stacks_block_hash":1,"navigating":1,"0x4ad36f77ff76042f3b7355006556375970b0f99d1232b14a3b4a2eadda4a806a":1,"stamp":1,"initiation":1,"block_time":1,"predicate's":1,"child":1,"children":1,"seen":1,"transaction_identifier":1,"metdata":1,"examining":1,"0x98195af8f888d2f9ca3462c41c1691e7798ea6d9e5e3afe42955c0921f981f2c":1,"captures":1,"outcome":1,"assess":1,"resides":1,"object's":2,"contract_calls_stack":1,"smartcontractevent":1,"mutated_assets_radius":1,"mutated_contracts_radius":1,"located":2,"------------":1,"----------":1,"------------------------------------------------------------------":1,"-------":1,"----------------------------------------":1,"----":1,"-------------------------------------------------------":1,"---------":1,"-------------------------------------------------------------------------------------------------------------------------------------------------------":1,"edits":1,"tell":1,"stacks-related":1,"87ac9bff-1052-4d02-9c79-3768a6f08a09":1,"spm113ay78vcmjj0sdfj4xjxfhhq6r9kb3710x7d":1,"stx-transfers":1,"chainstate":2,"subsequent":1,"scans":1,"cached":3,"speeding":1,"revolves":1,"outlined":1,"strucure":1,"primary":1,"specfied":1,"stx_transfer_predicate":1,"your-predicate-file":1,"who's":1,"multple":1,"endpoint's":1,"site":1,"abc123456-789e-0fgh-1ijk-23lmno456789":1,"webhooksite":1,"wrap":2,"ordinals_protocol":1,"my-protocol":1,"xyz":1,"end-block":1,"proofs":1,"exclude":1,"include_proof":1,"include_inputs":1,"include_outputs":1,"witnesses":1,"include_witness":1,"your-bitcoin-predicate":1,"item-1":1,"decoded":1,"include_contract_abi":1,"your-stacks-predicate":1,"observing-contract-calls":1,"observing":1,"linux":2,"snap":1,"chainhook-install":1,"stacks-node-rpc-api":20,"block_proposal'":1,"stacker_set":1,"pox'":1,"transaction'":1,"transfer'":1,"hiro-maintained":1,"self-host":1,"minimalist":1,"broadcast-transaction":1,"pox-details":1,"easy-to-use":1,"info'":2,"v3":3,"block_id":2,"contract_address":6,"trait_contract_address":1,"trait_contract_name":1,"trait_name":1,"map_entry":1,"map_name":1,"constant_val":1,"constant_name":1,"burn_ops":1,"burn_height":1,"op_type":1,"'ordinals":1,"api'":2,"'bitcoin":1,"indexer'":1,"runes":26,"'runes":2,"runehook":4,"yourself":3,"event-driven":1,"rune":3,"powered":2,"inscriptions":16,"_need":1,"monday":2,"runehook-as-a-service":2,"'sm":1,"grid-cols-1'":1,"runehook-install":1,"variety":2,"followning":2,"trading":2,"held":2,"etchings":11,"get-etchings":1,"showcase":2,"portfolios":2,"activities":1,"runeshook":1,"infra":2,"runes-api":20,"etching":10,"activity'":8,"etchings'":2,"ordinals-api":28,"stats":2,"inscriptions'":6,"ticker":4,"tokens'":2,"transfers'":4,"content'":2,"market":1,"today":1,"get-inscription-content":1,"brc20":1,"get-brc20-tokens":1,"get-inscriptions":1,"get-satoshi":1,"get-transfers-per-block":1,"graph":1,"bitcoin-hero":1,"meta-protocols":1,"explore-bitcoin":1,"bitcoin-indexer":2,"bitcoin-indexer-install":2,"r":1,"cpu":1,"multi-core":1,"parallel":1,"16gb":1,"ram":1,"ssd":2,"nvme":1,"os":1,"metaprotocols":1,"synced":1,"fumadocs-core":1,"guidesimage":1,"lib":1,"all-guides":1,"aiming":1,"clone-the-stacks-blockchain-docker-repository":1,"start-the-service":1,"synchronization":1,"monitor-the-nodes-synchronization-process":1,"stacks-blockchain-docker":1,"-a":2,"placeholder":1,"'macos'":1,"'windows'":1,"desktop":1,"mac":1,"products":1,"docker-desktop":1,"dmg":1,"menu":1,"bar":2,"--version":1,"executable":2,"wizard":1,"computer":1,"wsl":1,"subsystem":1,"tray":1,"hyper-v":1,"listings":2,"listing":2,"expiry":2,"sip010":2,"taker":2,"fulfil":2,"ft-trait":2,"purchases":2,"cancelling":2,"fulfilling":2,"err_expiry_in_past":2,"err_price_zero":2,"err_unknown_listing":2,"err_unauthorised":2,"err_listing_expired":2,"err_nft_asset_mismatch":2,"u2003":2,"err_payment_asset_mismatch":2,"u2004":2,"err_maker_taker_equal":2,"u2005":2,"err_unintended_taker":2,"u2006":2,"err_asset_contract_not_whitelisted":2,"u2007":2,"err_payment_contract_not_whitelisted":2,"u2008":2,"maker":2,"nft-asset-contract":2,"payment-asset-contract":2,"listing-nonce":2,"list-asset":2,"nft-asset":2,"listing-id":2,"whitelisted":2,"is-whitelisted":2,"expired":2,"payment-asset":2,"get-listing":2,"cancel":2,"nft's":2,"creator":2,"cancel-listing":2,"cancelled":2,"creator's":2,"payments":2,"whitelisted-asset-contracts":2,"asset-contract":2,"set-whitelisted":2,"contract-owner":2,"fulfill":2,"fulfil-listing-stx":2,"purchaser":2,"fulfilled":2,"assert-can-fulfil":2,"purchased":2,"fulfil-listing-ft":2,"transfer-ft":2,"listing's":2,"payment's":2,"intended-taker":2,"whitelisting":2,"call_read_only_function":1,"illustrates":1,"utilization":1,"smartcontractsapiinterface":1,"smartcontractsapi":1,"readonlyfunctionsuccessresponse":1,"cvtohex":1,"fetchapi":2,"contractsapi":1,"fncall":1,"'pox'":1,"'is-pox-active'":1,"readonlyfunctionargs":1,"okay":1,"booltrue":1,"great":1,"daemon":1,"shutdown":1,"software":1,"bitcoincore":1,"bitcoin-core-25":1,"bitcoin-25":1,"couple":1,"bitcoin-data":1,"drive":1,"mounted":1,"volumes":1,"datadir":1,"your-path-to":1,"rpcallowip":1,"txindex":1,"dns":1,"dnsseed":1,"listenonion":1,"rpcserialversion":1,"disablewallet":1,"fallbackfee":1,"00001":1,"rpcthreads":1,"blocksonly":1,"dbcache":1,"listed":1,"-conf":1,"zmq_url":1,"console's":1,"stdout":1,"congrats":1,"anywhere":1,"procedure":1,"shutting":1,"restarting":1,"shut":1,"bitcoin-cli":1,"--conf":1,"--rpcuser":1,"your-rpc-username":1,"--rpcpassword":1,"your-rpc-password":1,"eject":1,"finder":1,"sidebar":1,"devices":1,"saying":1,"unplug":1,"drives":1,"earn":1,"risk":1,"yield-generating":1,"chance":1,"win":1,"retaining":1,"investment":1,"tickets":1,"citycoins":1,"u101000":1,"lotterypool":1,"totalyield":1,"ticketcounter":1,"administrative":1,"privileges":1,"earnings":1,"issued":1,"ticketid":1,"ticketexpirationatcycle":1,"iswinner":1,"lotteryticket":1,"links":1,"associates":1,"roll-the-dice":1,"cityname":1,"lockperiod":1,"actuallockperiod":1,"'sp8a9hz3pkst0s42vm9523z9nv42sz026v4k39wh":1,"ccd007-citycoin-stacking":1,"get-current-reward-cycle":1,"miamicoin-token-v2":1,"city":1,"defaulting":1,"expiration":1,"ticket's":1,"streamlined":1,"randomly":1,"select-winner":1,"'spscwdv3rkv5zrn1fqd84ye1nqfedj9r1f4dyq11":1,"citycoin-vrf-v2":1,"get-save-rnd":1,"randomticketnumber":1,"ticketcount":1,"winningticketid":1,"get-ticket":1,"selectionerror":1,"obtained":1,"modulus":1,"winner's":1,"fairly":1,"claim-rewards":1,"cityid":1,"ccd004-city-registry":1,"get-city-id":1,"cycleamount":1,"ccd002-treasury-mia-stacking":1,"get-balance-stx":1,"mia":1,"ccd011-stacking-payouts":1,"send-stacking-reward-mia":1,"send-stacking-reward-nyc":1,"claim-stacking-reward":1,"distribute-rewards":1,"staking":1,"nyc":1,"claims":1,"rewarded":1,"advance_chain_tip":1,"set_tx_sender":1,"no-loss-lottery-pool":1,"deposit-stx":1,"u5000000000":1,"u17":1,"get-or-create-city-id":1,"set-allowed":1,"ccd002-treasury-nyc-stacking":1,"newyorkcitycoin-token-v2":1,"deploy-a-contract":1,"docskit":1,"codeblocks":1,"special":1,"inline-code":1,"mdx":1,"codetabs":1,"withnotes":1,"terminal-picker":1,"language":1,"switcher":1,"language-switcher":1,"rendered":1,"flags-example":1,"-wn":1,"-w":1,"animate":1,"annotations-example":1,"y":1,"z":1,"collapse":1,"hike":1,"annotation":1,"codehike":1,"annotation-comments":1,"using-regular-expressions-instead-of-ranges":1,"css":1,"color":1,"red":1,"--hiro":1,"lorem":1,"ipsum":1,"dolor":1,"sit":1,"amet":1,"consectetur":1,"jsonc":1,"-cwn":1,"collapsed":1,"jsx":1,"gm":1,"bg-red-200":1,"opacity-50":1,"hey":1,"baz":1,"tabs-example":1,"ac":1,"styles":1,"decoration":1,"solidity":1,"sol":1,"uint256":1,"newcount":1,"prop":1,"some-id":1,"callouts":1,"tooltips":1,"test-123":1,"prose":1,"fake":1,"personally":1,"codeyou":1,"renders":1,"codeblock":1,"ansi":1,"colors":1,"create-next-app":1,"1mwhat":1,"90m":1,"my-app":1,"picker":1,"managers":1,"opting":1},"url":{"docs":517,"stacks":418,"contributors-guide":3,"get-started":2,"rate-limiting":3,"clarinet-js-sdk":12,"references":6,"simnet":2,"properties":2,"custom-matchers":2,"methods":2,"quickstart":9,"installation":4,"reference":14,"testing-best-practices":1,"archive":9,"guides":24,"stacks-api":2,"token-metadata-api":15,"verify-archive-data":1,"stacks-blockchain":86,"clarinet":15,"concepts":7,"examples":28,"add-a-contract":1,"validate-a-contract":1,"estimate-costs":1,"start-a-development-console":1,"run-a-local-devnet":1,"deploy-a-contract":1,"debug-a-contract":1,"create-deployment-plans":1,"working-with-sbtc":1,"create-a-new-project":1,"platform-api":13,"devnet":6,"bitcoin-node":1,"stop":1,"start":1,"stacks-blockchain-api":2,"chainhooks":7,"list":2,"create":1,"get":2,"update":1,"delete":1,"status":10,"platform":9,"deploy-contracts":1,"create-project":1,"archive-project":1,"faucet":1,"contract-monitoring":1,"create-chainhooks":1,"architecture":2,"info":26,"usage":3,"tokens":14,"fungible-token-metadata":2,"semi-fungible-token-metadata":2,"fungible-tokens":2,"non-fungible-token-metadata":2,"client":5,"get-ft-metadata":1,"hacks":6,"build-a-custom-api":1,"build-a-decentralized-grants-program":1,"ai":1,"build-a-friend-tech-clone":1,"recipes":1,"explorer":7,"build-explorer":3,"clarity":127,"bit-manipulation":1,"basic-arithmetic":1,"optimizations":1,"cryptographic-functions":1,"access-control":1,"functions":119,"tuple":1,"sha256":1,"unwrap":1,"contract-call":1,"buff-to-int-be":1,"int-to-ascii":1,"map-delete":1,"contract-of":1,"keccak256":1,"define-constant":1,"xor":1,"principal-of":1,"get-burn-block-info":1,"fold":1,"define-map":1,"stx-account":1,"define-public":1,"define-data-var":1,"nft-transfer":1,"multiply":1,"default-to":1,"get-stacks-block-info":1,"map":1,"sqrti":1,"log2":1,"and":1,"replace-at":1,"len":1,"sha512-256":1,"divide":1,"bit-and":1,"less-than":1,"ft-burn":1,"use-trait":1,"to-uint":1,"define-trait":1,"int-to-utf8":1,"ok":1,"define-non-fungible-token":1,"ft-transfer":1,"is-err":1,"ft-get-supply":1,"as-max-len":1,"get-tenure-info":1,"bit-xor":1,"define-private":1,"bit-or":1,"var-get":1,"map-set":1,"buff-to-uint-be":1,"define-read-only":1,"nft-burn":1,"is-ok":1,"add":1,"string-to-int":1,"is-none":1,"subtract":1,"principal-destruct":1,"to-consensus-buff":1,"stx-burn":1,"from-consensus-buff":1,"bit-shift-right":1,"is-some":1,"is-standard":1,"unwrap-err-panic":1,"append":1,"stx-transfer":1,"unwrap-panic":1,"impl-trait":1,"to-int":1,"greater-than":1,"not":1,"get-block-info":1,"string-to-uint":1,"buff-to-uint-le":1,"unwrap-err":1,"define-fungible-token":1,"at-block":1,"secp256k1-recover":1,"begin":1,"err":1,"or":1,"try":1,"map-insert":1,"some":1,"secp256k1-verify":1,"match":1,"let":1,"map-get":1,"is-eq":1,"bit-shift-left":1,"var-set":1,"less-than-or-equal":1,"filter":1,"ft-mint":1,"buff-to-int-le":1,"element-at":1,"sha512":1,"concat":1,"index-of":1,"stx-transfer-memo":1,"pow":1,"nft-mint":1,"bit-not":1,"hash160":1,"merge":1,"ft-get-balance":1,"greater-than-or-equal":1,"as-contract":1,"asserts":1,"slice":1,"nft-get-owner":1,"if":1,"mod":1,"stx-get-balance":1,"print":1,"principal-construct":1,"handling-optionals-and-errors":1,"time-and-blocks":1,"web-app-development":1,"token-development":1,"signer-metrics-api":14,"blocks":15,"aggregated-signer-information-for-a-block":1,"aggregated-signer-information-for-most-recent-blocks":1,"prometheus":2,"metrics":1,"signers":3,"pox-cycle-signer":1,"pox-cycle-signers":1,"block-proposals":3,"signer-information-for-a-block":1,"signer-information-for-most-recent-block-proposals":1,"nakamoto":5,"stacks-js":2,"unit-testing":1,"smart-contract-development":1,"js":24,"v6":2,"transactions":20,"network":3,"roadmap":1,"broadcast-transactions":2,"post-conditions":2,"use-with-react-native":1,"packages":5,"sbtc":2,"common":2,"private-keys":1,"accounts-and-addresses":1,"networks":1,"broadcasting":1,"integration-testing":1,"migration-guide":1,"api-keys":3,"api":170,"token-metadata":7,"pagination":1,"authentication":1,"nonce-handling":1,"get-block":1,"recent-blocks":1,"block-by-hash":1,"get-blocks-by-burn-block":1,"block-by-burn-block-height":1,"average-times":1,"get-blocks":1,"block-by-burn-block-hash":1,"block-by-height":1,"names":12,"name-subdomains":1,"name-zonefile":1,"owned-by-address":1,"namespace-names":1,"namespaces":1,"name-details":1,"historical-zonefile":1,"fees":5,"fee-rate":1,"stacking-rewards":6,"recent-burnchain-reward-recipients":1,"recent-burnchain-reward-recipient":1,"recent-reward-slot-holders":1,"recent-reward-slot-holder-entries":1,"total-burnchain-rewards-for-recipient":1,"proof-of-transfer":6,"cycles":1,"signer-in-cycle":1,"cycle":1,"signers-in-cycle":1,"stackers-for-signer-in-cycle":1,"search":2,"search-by-id":1,"total-and-unlocked-stx-supply":1,"network-given-block-time":1,"circulating-stx-supply-in-plain-text":1,"network-block-time":1,"total-stx-supply-in-plain-text":1,"legacy-total-and-unlocked-stx-supply":1,"address-transactions":1,"events-for-an-address-transaction":1,"transaction-events":1,"statistics-for-mempool-transactions":1,"transactions-for-address":1,"dropped-mempool-transactions":1,"get-transaction":1,"details-for-transactions":1,"recent-transactions":1,"mempool-transactions":1,"transactions-by-block":1,"get-raw-transaction":1,"stacking-pool":2,"members":1,"faucets":2,"stx":1,"accounts":11,"transactions-with-transfers":1,"balances":9,"nft-events":1,"assets":1,"transaction-with-transfers":1,"latest-nonce":1,"stx-balances":1,"inbound-stx-transfers":1,"smart-contracts":12,"events":1,"by-trait":1,"mempool":2,"transaction-fee-priorities":1,"burn-blocks":3,"get-burn-block":1,"get-burn-blocks":1,"holders":3,"non-fungible-tokens":4,"holdings":1,"mints":1,"history":1,"getting-started":1,"requesting-proofs":1,"setup":1,"testing-environments":1,"blockchain-development":1,"connect":9,"support":1,"authenticate-users":1,"sign-messages":1,"migration":1,"clarinet-sdk":1,"cli":2,"chainhook":10,"scopes":2,"bitcoin":88,"chainhook-as-a-service-with-stacks-node":1,"register-chainhooks-on-devnet":1,"chainhook-as-a-service":1,"observing-contract-calls":1,"predicate-design":1,"quickstarts":8,"event-streaming":1,"wallet-integration":1,"app-templates":1,"nft-minting":1,"contract-templates":1,"token-transfers":1,"rpc-api":31,"block-proposal":1,"pox":3,"stacker-set":1,"pox-details":1,"namespace-price":1,"name-price":1,"estimate":1,"transfer-estimate":1,"core-api":1,"broadcast-transaction":1,"v3":4,"tenure-metadata":1,"nakamoto-block":1,"tenure-blocks":1,"interface":1,"traits":1,"map-entry":1,"read-only":1,"source":1,"constants":1,"burn-ops":2,"get-burn-operations":1,"runes":35,"runehook":3,"address":2,"holder-balance":2,"activities":10,"for-transaction":2,"for-address":2,"for-block":2,"activity":2,"etchings":6,"get-etchings":2,"get-etching":2,"ordinals":42,"statistics":4,"get-stats-inscription-count":2,"brc20":12,"get-brc20-token-holders":2,"get-brc20-balances":2,"get-brc20-token-details":2,"get-brc20-tokens":2,"get-brc20-activity":2,"inscriptions":12,"get-inscription-transfers":2,"get-inscriptions":2,"get-inscription-content":2,"get-transfers-per-block":2,"get-inscription":2,"satoshis":6,"get-satoshi":2,"get-satoshi-inscriptions":2,"indexer":3,"run-indexer":1,"sync-a-stacks-node":1,"installing-docker":1,"build-a-decentralized-kickstarter":1,"build-an-nft-marketplace":1,"using-clarity-values":1,"sync-a-bitcoin-node":1,"no-loss-lottery":1,"docskit":1}},"avgFieldLength":{"id":4.912959381044487,"title":2.3384912959381037,"description":9.586073500967123,"content":106.82205029013538,"url":4.912959381044487},"fieldLengths":{"id":{"1":3,"2":3,"3":3,"4":5,"5":5,"6":5,"7":5,"8":3,"9":4,"10":4,"11":3,"12":3,"13":3,"14":5,"15":5,"16":5,"17":5,"18":3,"19":4,"20":5,"21":5,"22":5,"23":5,"24":5,"25":5,"26":5,"27":5,"28":5,"29":5,"30":4,"31":3,"32":5,"33":4,"34":5,"35":5,"36":5,"37":5,"38":5,"39":5,"40":4,"41":5,"42":5,"43":5,"44":2,"45":3,"46":5,"47":5,"48":5,"49":5,"50":5,"51":5,"52":5,"53":4,"54":3,"55":4,"56":4,"57":5,"58":4,"59":4,"60":5,"61":5,"62":5,"63":5,"64":4,"65":5,"66":5,"67":6,"68":5,"69":5,"70":5,"71":5,"72":4,"73":3,"74":3,"75":5,"76":4,"77":4,"78":3,"79":4,"80":4,"81":4,"82":5,"83":5,"84":5,"85":5,"86":5,"87":5,"88":5,"89":5,"90":5,"91":5,"92":5,"93":5,"94":5,"95":5,"96":5,"97":5,"98":5,"99":5,"100":5,"101":5,"102":5,"103":5,"104":5,"105":5,"106":5,"107":5,"108":5,"109":5,"110":5,"111":5,"112":5,"113":5,"114":5,"115":5,"116":5,"117":5,"118":5,"119":5,"120":5,"121":5,"122":5,"123":5,"124":5,"125":5,"126":5,"127":5,"128":5,"129":5,"130":5,"131":5,"132":5,"133":5,"134":5,"135":5,"136":5,"137":5,"138":5,"139":5,"140":5,"141":5,"142":5,"143":5,"144":5,"145":5,"146":5,"147":5,"148":5,"149":5,"150":5,"151":5,"152":5,"153":5,"154":5,"155":5,"156":5,"157":5,"158":5,"159":5,"160":5,"161":5,"162":5,"163":5,"164":5,"165":5,"166":5,"167":5,"168":5,"169":5,"170":5,"171":5,"172":5,"173":5,"174":5,"175":5,"176":5,"177":5,"178":5,"179":5,"180":5,"181":5,"182":5,"183":5,"184":5,"185":5,"186":5,"187":5,"188":5,"189":5,"190":5,"191":5,"192":5,"193":5,"194":5,"195":5,"196":5,"197":5,"198":5,"199":5,"200":5,"201":4,"202":4,"203":3,"204":3,"205":4,"206":5,"207":5,"208":3,"209":4,"210":5,"211":4,"212":5,"213":4,"214":5,"215":5,"216":5,"217":4,"218":5,"219":3,"220":5,"221":5,"222":5,"223":5,"224":3,"225":3,"226":5,"227":5,"228":3,"229":4,"230":5,"231":5,"232":5,"233":5,"234":5,"235":5,"236":5,"237":5,"238":5,"239":5,"240":5,"241":5,"242":5,"243":4,"244":4,"245":3,"246":3,"247":3,"248":5,"249":6,"250":5,"251":6,"252":6,"253":6,"254":6,"255":4,"256":3,"257":4,"258":4,"259":4,"260":6,"261":6,"262":6,"263":5,"264":6,"265":6,"266":6,"267":6,"268":6,"269":6,"270":5,"271":6,"272":6,"273":5,"274":6,"275":6,"276":6,"277":6,"278":6,"279":6,"280":5,"281":6,"282":5,"283":6,"284":6,"285":6,"286":6,"287":6,"288":5,"289":6,"290":6,"291":6,"292":6,"293":6,"294":5,"295":6,"296":6,"297":6,"298":6,"299":5,"300":6,"301":6,"302":6,"303":6,"304":6,"305":6,"306":6,"307":5,"308":6,"309":6,"310":6,"311":6,"312":6,"313":6,"314":6,"315":6,"316":6,"317":5,"318":5,"319":6,"320":6,"321":6,"322":6,"323":6,"324":6,"325":6,"326":6,"327":6,"328":6,"329":6,"330":6,"331":5,"332":6,"333":6,"334":5,"335":6,"336":6,"337":5,"338":6,"339":5,"340":6,"341":5,"342":6,"343":6,"344":6,"345":4,"346":4,"347":3,"348":3,"349":3,"350":3,"351":4,"352":5,"353":5,"354":5,"355":5,"356":4,"357":4,"358":5,"359":5,"360":5,"361":5,"362":5,"363":5,"364":5,"365":5,"366":5,"367":5,"368":5,"369":5,"370":5,"371":6,"372":5,"373":3,"374":5,"375":5,"376":5,"377":5,"378":4,"379":4,"380":4,"381":3,"382":4,"383":4,"384":4,"385":4,"386":4,"387":4,"388":4,"389":5,"390":4,"391":5,"392":5,"393":5,"394":4,"395":5,"396":5,"397":4,"398":5,"399":3,"400":4,"401":5,"402":5,"403":4,"404":4,"405":5,"406":4,"407":5,"408":5,"409":5,"410":5,"411":5,"412":4,"413":5,"414":5,"415":5,"416":5,"417":4,"418":5,"419":3,"420":3,"421":3,"422":4,"423":5,"424":5,"425":4,"426":6,"427":4,"428":5,"429":6,"430":6,"431":5,"432":6,"433":6,"434":5,"435":6,"436":6,"437":6,"438":6,"439":5,"440":5,"441":6,"442":6,"443":4,"444":6,"445":5,"446":6,"447":6,"448":5,"449":6,"450":6,"451":6,"452":6,"453":5,"454":6,"455":6,"456":6,"457":6,"458":6,"459":4,"460":5,"461":6,"462":5,"463":5,"464":6,"465":6,"466":2,"467":3,"468":5,"469":6,"470":6,"471":5,"472":6,"473":6,"474":5,"475":6,"476":6,"477":6,"478":6,"479":5,"480":6,"481":6,"482":5,"483":6,"484":6,"485":5,"486":6,"487":6,"488":6,"489":6,"490":5,"491":6,"492":6,"493":6,"494":6,"495":6,"496":5,"497":6,"498":5,"499":6,"500":6,"501":3,"502":3,"503":5,"504":4,"505":3,"506":3,"507":3,"508":2,"509":3,"510":3,"511":3,"512":3,"513":3,"514":3,"515":3,"516":3,"517":3},"title":{"1":2,"2":1,"3":2,"4":1,"5":1,"6":2,"7":1,"8":1,"9":1,"10":1,"11":2,"12":2,"13":1,"14":6,"15":6,"16":3,"17":5,"18":1,"19":1,"20":3,"21":3,"22":3,"23":3,"24":4,"25":3,"26":3,"27":3,"28":3,"29":4,"30":1,"31":1,"32":2,"33":1,"34":2,"35":2,"36":3,"37":3,"38":3,"39":4,"40":1,"41":3,"42":3,"43":4,"44":1,"45":1,"46":2,"47":3,"48":3,"49":3,"50":2,"51":2,"52":3,"53":1,"54":1,"55":1,"56":1,"57":2,"58":1,"59":1,"60":4,"61":4,"62":3,"63":4,"64":1,"65":1,"66":1,"67":4,"68":5,"69":5,"70":3,"71":5,"72":7,"73":1,"74":1,"75":4,"76":2,"77":2,"78":1,"79":2,"80":2,"81":2,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":2,"112":1,"113":1,"114":2,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":2,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":4,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":4,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":5,"202":2,"203":3,"204":2,"205":1,"206":6,"207":7,"208":1,"209":1,"210":2,"211":2,"212":2,"213":1,"214":3,"215":3,"216":5,"217":2,"218":7,"219":1,"220":4,"221":3,"222":4,"223":4,"224":2,"225":3,"226":2,"227":2,"228":1,"229":4,"230":2,"231":4,"232":6,"233":1,"234":2,"235":2,"236":2,"237":1,"238":1,"239":3,"240":2,"241":1,"242":1,"243":1,"244":1,"245":2,"246":2,"247":2,"248":1,"249":2,"250":1,"251":4,"252":4,"253":3,"254":4,"255":1,"256":1,"257":1,"258":2,"259":1,"260":2,"261":3,"262":4,"263":1,"264":5,"265":5,"266":4,"267":2,"268":5,"269":4,"270":3,"271":3,"272":4,"273":1,"274":5,"275":3,"276":3,"277":3,"278":4,"279":3,"280":1,"281":5,"282":2,"283":8,"284":5,"285":6,"286":8,"287":3,"288":3,"289":5,"290":3,"291":5,"292":7,"293":3,"294":1,"295":6,"296":7,"297":8,"298":6,"299":1,"300":8,"301":3,"302":7,"303":3,"304":6,"305":3,"306":5,"307":1,"308":4,"309":4,"310":2,"311":4,"312":3,"313":3,"314":4,"315":3,"316":4,"317":2,"318":1,"319":3,"320":5,"321":3,"322":3,"323":3,"324":3,"325":5,"326":4,"327":4,"328":4,"329":3,"330":4,"331":2,"332":3,"333":3,"334":1,"335":4,"336":3,"337":2,"338":3,"339":1,"340":4,"341":2,"342":4,"343":4,"344":4,"345":2,"346":2,"347":3,"348":2,"349":2,"350":1,"351":2,"352":2,"353":2,"354":2,"355":2,"356":2,"357":1,"358":1,"359":1,"360":2,"361":1,"362":2,"363":2,"364":3,"365":2,"366":2,"367":1,"368":2,"369":2,"370":2,"371":2,"372":2,"373":1,"374":8,"375":4,"376":5,"377":5,"378":1,"379":2,"380":1,"381":1,"382":2,"383":2,"384":2,"385":2,"386":2,"387":2,"388":1,"389":3,"390":3,"391":6,"392":3,"393":3,"394":1,"395":3,"396":7,"397":1,"398":4,"399":1,"400":1,"401":4,"402":2,"403":1,"404":1,"405":3,"406":1,"407":4,"408":3,"409":4,"410":3,"411":4,"412":2,"413":4,"414":3,"415":3,"416":3,"417":2,"418":3,"419":2,"420":2,"421":2,"422":1,"423":1,"424":1,"425":1,"426":3,"427":1,"428":1,"429":3,"430":3,"431":1,"432":3,"433":3,"434":1,"435":5,"436":5,"437":5,"438":3,"439":1,"440":1,"441":2,"442":2,"443":1,"444":3,"445":1,"446":5,"447":4,"448":1,"449":3,"450":4,"451":3,"452":3,"453":1,"454":3,"455":2,"456":3,"457":4,"458":2,"459":1,"460":1,"461":3,"462":1,"463":1,"464":3,"465":3,"466":1,"467":2,"468":1,"469":3,"470":3,"471":1,"472":3,"473":3,"474":1,"475":5,"476":5,"477":5,"478":3,"479":1,"480":2,"481":2,"482":1,"483":5,"484":4,"485":1,"486":3,"487":4,"488":3,"489":3,"490":1,"491":3,"492":2,"493":3,"494":4,"495":2,"496":1,"497":3,"498":1,"499":3,"500":3,"501":1,"502":1,"503":1,"504":1,"505":1,"506":2,"507":2,"508":1,"509":6,"510":4,"511":4,"512":2,"513":4,"514":3,"515":6,"516":5,"517":1},"description":{"1":8,"2":6,"3":10,"4":19,"5":14,"6":20,"7":15,"8":17,"9":13,"10":11,"11":13,"12":18,"13":14,"14":13,"15":13,"16":9,"17":12,"18":20,"19":6,"20":12,"21":12,"22":7,"23":7,"24":8,"25":12,"26":10,"27":6,"28":11,"29":11,"30":10,"31":14,"32":10,"33":16,"34":5,"35":5,"36":11,"37":9,"38":7,"39":8,"40":7,"41":7,"42":7,"43":10,"44":0,"45":10,"46":9,"47":12,"48":10,"49":12,"50":10,"51":13,"52":7,"53":10,"54":11,"55":7,"56":10,"57":10,"58":11,"59":8,"60":7,"61":5,"62":5,"63":7,"64":10,"65":9,"66":8,"67":14,"68":9,"69":13,"70":8,"71":8,"72":13,"73":9,"74":8,"75":8,"76":13,"77":13,"78":10,"79":9,"80":13,"81":8,"82":6,"83":13,"84":11,"85":9,"86":12,"87":14,"88":10,"89":10,"90":12,"91":11,"92":7,"93":10,"94":10,"95":9,"96":10,"97":8,"98":8,"99":7,"100":7,"101":11,"102":11,"103":11,"104":9,"105":12,"106":12,"107":11,"108":11,"109":12,"110":10,"111":12,"112":11,"113":11,"114":11,"115":7,"116":9,"117":10,"118":11,"119":9,"120":10,"121":9,"122":10,"123":9,"124":11,"125":12,"126":14,"127":9,"128":13,"129":7,"130":12,"131":11,"132":9,"133":15,"134":8,"135":9,"136":10,"137":11,"138":11,"139":11,"140":11,"141":10,"142":11,"143":10,"144":9,"145":13,"146":11,"147":11,"148":11,"149":18,"150":8,"151":12,"152":6,"153":11,"154":11,"155":6,"156":9,"157":12,"158":15,"159":7,"160":9,"161":15,"162":14,"163":13,"164":7,"165":6,"166":10,"167":10,"168":11,"169":13,"170":9,"171":8,"172":10,"173":8,"174":13,"175":11,"176":13,"177":13,"178":8,"179":14,"180":13,"181":11,"182":6,"183":12,"184":10,"185":10,"186":9,"187":12,"188":10,"189":6,"190":13,"191":13,"192":14,"193":11,"194":9,"195":12,"196":6,"197":10,"198":11,"199":8,"200":7,"201":11,"202":9,"203":6,"204":5,"205":6,"206":8,"207":8,"208":9,"209":3,"210":9,"211":7,"212":7,"213":8,"214":10,"215":9,"216":7,"217":5,"218":8,"219":9,"220":9,"221":8,"222":10,"223":9,"224":19,"225":6,"226":13,"227":10,"228":11,"229":6,"230":11,"231":11,"232":9,"233":9,"234":13,"235":10,"236":6,"237":10,"238":0,"239":8,"240":8,"241":6,"242":8,"243":9,"244":4,"245":19,"246":10,"247":11,"248":10,"249":10,"250":8,"251":7,"252":5,"253":5,"254":7,"255":6,"256":13,"257":6,"258":7,"259":7,"260":4,"261":7,"262":10,"263":11,"264":10,"265":10,"266":4,"267":7,"268":10,"269":10,"270":10,"271":9,"272":8,"273":10,"274":10,"275":8,"276":10,"277":14,"278":9,"279":7,"280":9,"281":18,"282":10,"283":20,"284":13,"285":20,"286":13,"287":6,"288":8,"289":8,"290":6,"291":8,"292":10,"293":9,"294":6,"295":7,"296":9,"297":8,"298":9,"299":9,"300":8,"301":8,"302":13,"303":12,"304":6,"305":6,"306":13,"307":9,"308":6,"309":11,"310":6,"311":7,"312":5,"313":16,"314":7,"315":9,"316":12,"317":12,"318":6,"319":8,"320":11,"321":10,"322":6,"323":14,"324":14,"325":10,"326":14,"327":12,"328":12,"329":13,"330":22,"331":8,"332":7,"333":8,"334":10,"335":20,"336":5,"337":6,"338":7,"339":6,"340":11,"341":7,"342":17,"343":11,"344":7,"345":5,"346":6,"347":7,"348":10,"349":5,"350":12,"351":6,"352":10,"353":11,"354":15,"355":10,"356":12,"357":13,"358":19,"359":14,"360":20,"361":15,"362":16,"363":11,"364":12,"365":10,"366":12,"367":9,"368":13,"369":10,"370":6,"371":6,"372":6,"373":22,"374":16,"375":7,"376":21,"377":12,"378":10,"379":7,"380":18,"381":13,"382":2,"383":4,"384":6,"385":3,"386":6,"387":2,"388":4,"389":5,"390":4,"391":10,"392":4,"393":6,"394":10,"395":6,"396":8,"397":9,"398":9,"399":19,"400":9,"401":9,"402":6,"403":9,"404":3,"405":10,"406":6,"407":7,"408":8,"409":8,"410":15,"411":15,"412":8,"413":8,"414":9,"415":22,"416":8,"417":10,"418":11,"419":8,"420":15,"421":10,"422":21,"423":10,"424":19,"425":8,"426":0,"427":16,"428":7,"429":5,"430":7,"431":5,"432":7,"433":8,"434":5,"435":9,"436":8,"437":9,"438":6,"439":9,"440":5,"441":7,"442":6,"443":8,"444":0,"445":9,"446":10,"447":12,"448":5,"449":8,"450":10,"451":5,"452":11,"453":5,"454":7,"455":12,"456":7,"457":12,"458":4,"459":19,"460":10,"461":7,"462":9,"463":5,"464":7,"465":8,"466":0,"467":11,"468":7,"469":5,"470":7,"471":5,"472":7,"473":8,"474":5,"475":9,"476":8,"477":9,"478":6,"479":5,"480":7,"481":6,"482":9,"483":10,"484":12,"485":5,"486":8,"487":10,"488":5,"489":11,"490":5,"491":7,"492":12,"493":7,"494":12,"495":4,"496":10,"497":7,"498":5,"499":7,"500":8,"501":13,"502":22,"503":1,"504":10,"505":13,"506":8,"507":10,"508":0,"509":13,"510":7,"511":15,"512":11,"513":19,"514":10,"515":10,"516":12,"517":2},"content":{"1":10,"2":79,"3":10,"4":74,"5":74,"6":225,"7":499,"8":161,"9":336,"10":18,"11":158,"12":419,"13":86,"14":226,"15":137,"16":92,"17":146,"18":254,"19":142,"20":73,"21":59,"22":264,"23":30,"24":47,"25":90,"26":182,"27":430,"28":179,"29":87,"30":214,"31":141,"32":16,"33":0,"34":16,"35":17,"36":16,"37":16,"38":16,"39":17,"40":0,"41":17,"42":17,"43":18,"44":180,"45":169,"46":105,"47":160,"48":92,"49":216,"50":263,"51":277,"52":331,"53":170,"54":112,"55":96,"56":0,"57":14,"58":118,"59":0,"60":16,"61":17,"62":15,"63":17,"64":63,"65":103,"66":0,"67":268,"68":521,"69":619,"70":156,"71":520,"72":137,"73":215,"74":109,"75":105,"76":225,"77":269,"78":100,"79":261,"80":245,"81":277,"82":152,"83":167,"84":143,"85":166,"86":188,"87":176,"88":164,"89":173,"90":241,"91":153,"92":184,"93":152,"94":153,"95":207,"96":192,"97":206,"98":148,"99":192,"100":196,"101":172,"102":212,"103":179,"104":187,"105":165,"106":155,"107":165,"108":191,"109":161,"110":173,"111":143,"112":202,"113":204,"114":217,"115":179,"116":180,"117":151,"118":143,"119":175,"120":167,"121":144,"122":186,"123":211,"124":170,"125":177,"126":181,"127":188,"128":188,"129":174,"130":197,"131":145,"132":174,"133":176,"134":183,"135":172,"136":175,"137":156,"138":152,"139":173,"140":196,"141":161,"142":168,"143":152,"144":184,"145":172,"146":172,"147":177,"148":150,"149":193,"150":155,"151":162,"152":172,"153":146,"154":215,"155":145,"156":223,"157":155,"158":175,"159":150,"160":189,"161":201,"162":156,"163":191,"164":184,"165":152,"166":164,"167":177,"168":146,"169":156,"170":176,"171":165,"172":169,"173":176,"174":191,"175":149,"176":234,"177":189,"178":205,"179":175,"180":226,"181":144,"182":177,"183":166,"184":165,"185":183,"186":169,"187":177,"188":174,"189":190,"190":178,"191":241,"192":185,"193":209,"194":163,"195":164,"196":172,"197":160,"198":151,"199":139,"200":159,"201":238,"202":272,"203":79,"204":79,"205":0,"206":16,"207":15,"208":132,"209":0,"210":13,"211":0,"212":14,"213":0,"214":18,"215":17,"216":16,"217":0,"218":15,"219":333,"220":76,"221":175,"222":168,"223":96,"224":372,"225":79,"226":714,"227":418,"228":142,"229":544,"230":262,"231":222,"232":234,"233":364,"234":541,"235":136,"236":196,"237":90,"238":155,"239":170,"240":87,"241":114,"242":45,"243":162,"244":126,"245":419,"246":207,"247":10,"248":0,"249":14,"250":0,"251":16,"252":17,"253":15,"254":17,"255":98,"256":138,"257":98,"258":135,"259":246,"260":16,"261":15,"262":16,"263":0,"264":17,"265":17,"266":16,"267":15,"268":17,"269":17,"270":14,"271":16,"272":16,"273":0,"274":16,"275":16,"276":14,"277":15,"278":17,"279":15,"280":0,"281":16,"282":0,"283":17,"284":16,"285":17,"286":18,"287":16,"288":0,"289":19,"290":17,"291":18,"292":20,"293":16,"294":0,"295":15,"296":17,"297":17,"298":16,"299":0,"300":17,"301":13,"302":16,"303":17,"304":19,"305":16,"306":17,"307":0,"308":16,"309":17,"310":16,"311":16,"312":15,"313":16,"314":17,"315":17,"316":17,"317":0,"318":0,"319":16,"320":17,"321":17,"322":17,"323":17,"324":17,"325":18,"326":17,"327":17,"328":17,"329":17,"330":16,"331":0,"332":16,"333":16,"334":0,"335":16,"336":16,"337":0,"338":15,"339":0,"340":18,"341":0,"342":17,"343":17,"344":17,"345":98,"346":64,"347":79,"348":419,"349":79,"350":122,"351":124,"352":226,"353":243,"354":184,"355":284,"356":416,"357":157,"358":74,"359":74,"360":225,"361":499,"362":74,"363":0,"364":3,"365":77,"366":416,"367":364,"368":541,"369":136,"370":196,"371":273,"372":234,"373":135,"374":341,"375":184,"376":361,"377":443,"378":175,"379":281,"380":34,"381":158,"382":63,"383":63,"384":63,"385":63,"386":63,"387":63,"388":0,"389":14,"390":0,"391":15,"392":14,"393":16,"394":0,"395":16,"396":15,"397":0,"398":15,"399":128,"400":0,"401":14,"402":14,"403":0,"404":0,"405":15,"406":0,"407":15,"408":15,"409":15,"410":17,"411":19,"412":0,"413":17,"414":18,"415":17,"416":17,"417":0,"418":16,"419":10,"420":69,"421":10,"422":105,"423":94,"424":20,"425":107,"426":40,"427":122,"428":0,"429":14,"430":17,"431":0,"432":18,"433":17,"434":0,"435":17,"436":18,"437":17,"438":17,"439":66,"440":0,"441":15,"442":16,"443":107,"444":44,"445":0,"446":16,"447":18,"448":0,"449":17,"450":17,"451":16,"452":16,"453":0,"454":17,"455":15,"456":17,"457":16,"458":16,"459":150,"460":0,"461":14,"462":66,"463":0,"464":16,"465":17,"466":124,"467":10,"468":0,"469":14,"470":17,"471":0,"472":18,"473":17,"474":0,"475":17,"476":18,"477":17,"478":17,"479":0,"480":15,"481":16,"482":0,"483":16,"484":18,"485":0,"486":17,"487":17,"488":16,"489":16,"490":0,"491":17,"492":15,"493":17,"494":16,"495":16,"496":0,"497":14,"498":0,"499":16,"500":17,"501":138,"502":164,"503":0,"504":98,"505":158,"506":10,"507":10,"508":43,"509":129,"510":117,"511":288,"512":10,"513":288,"514":113,"515":300,"516":365,"517":398},"url":{"1":3,"2":3,"3":3,"4":5,"5":5,"6":5,"7":5,"8":3,"9":4,"10":4,"11":3,"12":3,"13":3,"14":5,"15":5,"16":5,"17":5,"18":3,"19":4,"20":5,"21":5,"22":5,"23":5,"24":5,"25":5,"26":5,"27":5,"28":5,"29":5,"30":4,"31":3,"32":5,"33":4,"34":5,"35":5,"36":5,"37":5,"38":5,"39":5,"40":4,"41":5,"42":5,"43":5,"44":2,"45":3,"46":5,"47":5,"48":5,"49":5,"50":5,"51":5,"52":5,"53":4,"54":3,"55":4,"56":4,"57":5,"58":4,"59":4,"60":5,"61":5,"62":5,"63":5,"64":4,"65":5,"66":5,"67":6,"68":5,"69":5,"70":5,"71":5,"72":4,"73":3,"74":3,"75":5,"76":4,"77":4,"78":3,"79":4,"80":4,"81":4,"82":5,"83":5,"84":5,"85":5,"86":5,"87":5,"88":5,"89":5,"90":5,"91":5,"92":5,"93":5,"94":5,"95":5,"96":5,"97":5,"98":5,"99":5,"100":5,"101":5,"102":5,"103":5,"104":5,"105":5,"106":5,"107":5,"108":5,"109":5,"110":5,"111":5,"112":5,"113":5,"114":5,"115":5,"116":5,"117":5,"118":5,"119":5,"120":5,"121":5,"122":5,"123":5,"124":5,"125":5,"126":5,"127":5,"128":5,"129":5,"130":5,"131":5,"132":5,"133":5,"134":5,"135":5,"136":5,"137":5,"138":5,"139":5,"140":5,"141":5,"142":5,"143":5,"144":5,"145":5,"146":5,"147":5,"148":5,"149":5,"150":5,"151":5,"152":5,"153":5,"154":5,"155":5,"156":5,"157":5,"158":5,"159":5,"160":5,"161":5,"162":5,"163":5,"164":5,"165":5,"166":5,"167":5,"168":5,"169":5,"170":5,"171":5,"172":5,"173":5,"174":5,"175":5,"176":5,"177":5,"178":5,"179":5,"180":5,"181":5,"182":5,"183":5,"184":5,"185":5,"186":5,"187":5,"188":5,"189":5,"190":5,"191":5,"192":5,"193":5,"194":5,"195":5,"196":5,"197":5,"198":5,"199":5,"200":5,"201":4,"202":4,"203":3,"204":3,"205":4,"206":5,"207":5,"208":3,"209":4,"210":5,"211":4,"212":5,"213":4,"214":5,"215":5,"216":5,"217":4,"218":5,"219":3,"220":5,"221":5,"222":5,"223":5,"224":3,"225":3,"226":5,"227":5,"228":3,"229":4,"230":5,"231":5,"232":5,"233":5,"234":5,"235":5,"236":5,"237":5,"238":5,"239":5,"240":5,"241":5,"242":5,"243":4,"244":4,"245":3,"246":3,"247":3,"248":5,"249":6,"250":5,"251":6,"252":6,"253":6,"254":6,"255":4,"256":3,"257":4,"258":4,"259":4,"260":6,"261":6,"262":6,"263":5,"264":6,"265":6,"266":6,"267":6,"268":6,"269":6,"270":5,"271":6,"272":6,"273":5,"274":6,"275":6,"276":6,"277":6,"278":6,"279":6,"280":5,"281":6,"282":5,"283":6,"284":6,"285":6,"286":6,"287":6,"288":5,"289":6,"290":6,"291":6,"292":6,"293":6,"294":5,"295":6,"296":6,"297":6,"298":6,"299":5,"300":6,"301":6,"302":6,"303":6,"304":6,"305":6,"306":6,"307":5,"308":6,"309":6,"310":6,"311":6,"312":6,"313":6,"314":6,"315":6,"316":6,"317":5,"318":5,"319":6,"320":6,"321":6,"322":6,"323":6,"324":6,"325":6,"326":6,"327":6,"328":6,"329":6,"330":6,"331":5,"332":6,"333":6,"334":5,"335":6,"336":6,"337":5,"338":6,"339":5,"340":6,"341":5,"342":6,"343":6,"344":6,"345":4,"346":4,"347":3,"348":3,"349":3,"350":3,"351":4,"352":5,"353":5,"354":5,"355":5,"356":4,"357":4,"358":5,"359":5,"360":5,"361":5,"362":5,"363":5,"364":5,"365":5,"366":5,"367":5,"368":5,"369":5,"370":5,"371":6,"372":5,"373":3,"374":5,"375":5,"376":5,"377":5,"378":4,"379":4,"380":4,"381":3,"382":4,"383":4,"384":4,"385":4,"386":4,"387":4,"388":4,"389":5,"390":4,"391":5,"392":5,"393":5,"394":4,"395":5,"396":5,"397":4,"398":5,"399":3,"400":4,"401":5,"402":5,"403":4,"404":4,"405":5,"406":4,"407":5,"408":5,"409":5,"410":5,"411":5,"412":4,"413":5,"414":5,"415":5,"416":5,"417":4,"418":5,"419":3,"420":3,"421":3,"422":4,"423":5,"424":5,"425":4,"426":6,"427":4,"428":5,"429":6,"430":6,"431":5,"432":6,"433":6,"434":5,"435":6,"436":6,"437":6,"438":6,"439":5,"440":5,"441":6,"442":6,"443":4,"444":6,"445":5,"446":6,"447":6,"448":5,"449":6,"450":6,"451":6,"452":6,"453":5,"454":6,"455":6,"456":6,"457":6,"458":6,"459":4,"460":5,"461":6,"462":5,"463":5,"464":6,"465":6,"466":2,"467":3,"468":5,"469":6,"470":6,"471":5,"472":6,"473":6,"474":5,"475":6,"476":6,"477":6,"478":6,"479":5,"480":6,"481":6,"482":5,"483":6,"484":6,"485":5,"486":6,"487":6,"488":6,"489":6,"490":5,"491":6,"492":6,"493":6,"494":6,"495":6,"496":5,"497":6,"498":5,"499":6,"500":6,"501":3,"502":3,"503":5,"504":4,"505":3,"506":3,"507":3,"508":2,"509":3,"510":3,"511":3,"512":3,"513":3,"514":3,"515":3,"516":3,"517":3}}},"docs":{"docs":{"1":{"id":"/docs/stacks/contributors-guide","title":"Contributors guide","description":"Learn how to contribute to Hiro's documentation and content.","content":"\nimport ContributorsGuideContent from '@/content/_shared/contributors-guide.mdx';\n\n<ContributorsGuideContent components={props.components} />\n","url":"/docs/stacks/contributors-guide"},"2":{"id":"/docs/stacks/get-started","title":"Introduction","description":"Get started with the Stacks ecosystem.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>","url":"/docs/stacks/get-started"},"3":{"id":"/docs/stacks/rate-limiting","title":"Rate limiting","description":"Understand the rate limits for Hiro APIs and the STX Faucet.","content":"\nimport RateLimitingContent from '@/content/_shared/rate-limiting.mdx';\n\n<RateLimitingContent components={props.components} />\n","url":"/docs/stacks/rate-limiting"},"4":{"id":"/docs/stacks/clarinet-js-sdk/references/simnet","title":"Simnet","description":"The Simnet class is the main entry point for the Clarinet JS SDK. It provides properties and methods for interacting with the Clarinet network.","content":"\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/components/ui/accordion\"\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n# `initSimnet`\n\nThe `initSimnet` function initializes a simulated network. It will often be the first function you call when using the SDK.\n\n## Parameters\n\nThe `manifestPath` is the path to the `Clarinet.toml` manifest file.\n\n <Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='transition-colors'>Creating a new instance of simnet</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"custom\" className='tab group'>\n <Badge className='badge transition-colors'>With a custom config path</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet();\n ```\n </TabsContent>\n <TabsContent value=\"custom\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet('./config/Clarinet.toml');\n ```\n </TabsContent>\n </Tabs>\n\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"schema\">\n <AccordionTrigger>Schema</AccordionTrigger>\n <AccordionContent>\n ```ts\n initSimnet(manifestPath?: string): Promise<Simnet>\n ```\n </AccordionContent>\n </AccordionItem>\n </Accordion>","url":"/docs/stacks/clarinet-js-sdk/references/simnet"},"5":{"id":"/docs/stacks/clarinet-js-sdk/references/properties","title":"Properties","description":"The Clarinet JS SDK provides properties that can be used to interact with simnet.","content":"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `blockHeight`\n\nReturns the current block height of simnet.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the current block height</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentBlockHeight = simnet.blockHeight;\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n <Accordion title=\"Response\">\n ```ts\n 1\n ```\n </Accordion>\n</Accordions>\n\n\n# `deployer`\n\nReturns the default deployer address as defined in the project file.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the deployer address</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"set-deployer\" className='tab group'>\n <Badge className='badge transition-colors'>Setting the deployer to a new address</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentDeployerAddress = simnet.deployer;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"set-deployer\">\n ```ts\n simnet.deployer = 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5';\n const newDeployer = simnet.deployer\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `currentEpoch`\n\nReturns the current epoch of simnet.\n\nThis represents the Stacks blockchain's progress through discrete time periods, cycles, or upgrades.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the current epoch of simnet</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const epoch = simnet.currentEpoch;\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2.5\n ```\n </Accordion>\n</Accordions>\n\n","url":"/docs/stacks/clarinet-js-sdk/references/properties"},"6":{"id":"/docs/stacks/clarinet-js-sdk/references/custom-matchers","title":"Custom Matchers","description":"A set of Vitest matchers that can be used to make assertions on Clarity values with the Clarinet JS SDK.","content":"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `toHaveClarityType`\n\nCheck that a value has the right Clarity type, without checking its value.\n\n## Parameters\n\n\nThe Clarity type that the expected value should have.\n\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ok response</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toHaveClarityType(ClarityType.ResponseOk);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toHaveClarityType(expectedType: ClarityType)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeOk`\n\nCheck that a response is `(ok <ok-type>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ok response with a specific value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeOk(Cl.uint(1));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeOk(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeErr`\n\nCheck that a response is `(err <error-type>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an err response with a specific value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'add',\n [Cl.uint(19)],\n simnet.deployer\n );\n\n expect(result).toBeErr(Cl.uint(500));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-constant TOO_BIG u10)\n (define-data-var count uint u0)\n\n (define-public (add (amount uint))\n (begin\n (let ((new-count (+ (var-get count) amount)))\n (if (<= new-count TOO_BIG)\n (begin\n (var-set count new-count)\n (ok (var-get count))\n )\n (err u500)\n )\n )\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeErr(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n# `toBeSome`\n\nCheck that a response is `(some <value>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an optional value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant',\n [Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5')],\n simnet.deployer\n );\n\n expect(result).toBeSome(Cl.bool(true));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n (map-set ParticipantStatus 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeSome(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeNone`\n\nCheck that a response is `(none)`.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a none value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant',\n [Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5')],\n simnet.deployer\n );\n\n expect(result).toBeNone();\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeNone()\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeBool`\n\nAsserts the value of Clarity boolean (`true` or `false`).\n\n## Parameters\n\n\nThe `boolean` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a boolean value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'has-contributed',\n [Cl.standardPrincipal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM')],\n simnet.deployer\n );\n\n expect(result).toBeBool(true);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (has-contributed (who principal))\n (is-some (get contributionAmount (map-get? ParticipantStatus who)))\n )\n\n (map-set ParticipantStatus tx-sender { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBool(expected: boolean)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeInt`\n\nAsserts the value of a Clarity integer.\n\n## Parameters\n\n\nThe `integer` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an integer value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeInt(1); // or `1n`\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count int 0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) 1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeInt(expected: number | bigint)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeUint`\n\nAsserts the value of a Clarity unsigned integer.\n\n## Parameters\n\n\nThe `unsigned integer` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an unsigned integer value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeUint(1); // or `1n`\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeUint(expected: number | bigint)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeAscii`\n\nAsserts the value of a Clarity string-ascii.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a string-ascii value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'hello-world',\n 'say-hi',\n [],\n simnet.deployer\n );\n\n expect(result).toBeAscii('Hello World');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity hello-world.clar\n (define-read-only (say-hi)\n \"Hello World\"\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeAscii(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeUtf8`\n\nAsserts the value of a Clarity string-utf8.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a string-utf8 value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'hello-world',\n 'say-hi',\n [],\n simnet.deployer\n );\n\n expect(result).toBeUtf8('Hello World');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity hello-world.clar\n (define-read-only (say-hi)\n u\"Hello World\"\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeUtf8(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBePrincipal`\n\nAsserts the value of a Clarity principal.\n\nThe principal can be a standard or a contract principal.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a standard principal</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a contract principal</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const deployer = simnet.deployer;\n\n expect(Cl.standardPrincipal(deployer)).toBePrincipal(deployer);\n ```\n\n <Accordions>\n <Accordion title=\"Schema\">\n ```ts\n toBePrincipal(expected: string) \n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n const contract = `${simnet.deployer}.hello-world`;\n\n expect(Cl.contractPrincipal(contract)).toBePrincipal(contract);\n ```\n\n <Accordions>\n <Accordion title=\"Schema\">\n ```ts\n toBePrincipal(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeBuff`\n\nAsserts the value of a Clarity buffer. It takes an ArrayBuffer as an input.\n\nFor building a buffer, `@stacks/transactions` provides some helper functions:\n\n- `bufferFromAscii`\n- `bufferFromUtf8`\n- `bufferFromHex`\n\n## Parameters\n\n\nThe `Uint8Array` buffer that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a Uint8Array buffer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"ascii\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ASCII string buffer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"hex\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a hex string buffer</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-byte-array',\n [],\n simnet.deployer\n );\n\n const buffer = Uint8Array.from([1, 2, 3, 4]);\n expect(result).toBeBuff(buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant BUFFER 0x01020304)\n\n (define-read-only (get-byte-array)\n BUFFER\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"ascii\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-btc-buffer',\n [],\n simnet.deployer\n );\n\n const btc = Cl.bufferFromAscii('btc'); // or Cl.bufferFromUtf8('btc')\n\n expect(result).toBeBuff(btc.buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant ASCII_BTC 0x627463)\n\n (define-read-only (get-btc-buffer)\n ASCII_BTC\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"hex\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n \"helpers\",\n \"get-tx-hash\",\n [],\n simnet.deployer\n );\n\n const tx = Cl.bufferFromHex(\n \"73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e\"\n );\n\n expect(result).toBeBuff(tx.buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant TX_HASH 0x73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e)\n\n (define-read-only (get-tx-hash)\n TX_HASH\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeList`\n\nAsserts the value of a Clarity list containing an array of Clarity values.\n\n## Parameters\n\n\nThe `Uint8Array` buffer that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a list of Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-addresses',\n [],\n simnet.deployer\n );\n\n expect(result).toBeList(\n [\n Cl.standardPrincipal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM'),\n Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'),\n Cl.standardPrincipal('ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG')\n ]\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-read-only (get-addresses)\n (list\n 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeList(expected: ClarityValue[])\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeTuple`\n\nAsserts the value of a Clarity tuple.\n\n## Parameters\n\n\nThe `object` of Clarity values that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a tuple</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n \n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant-data',\n [Cl.standardPrincipal(simnet.deployer)],\n simnet.deployer\n );\n\n expect(result).toBeTuple({\n enrollmentBlock: Cl.some(Cl.uint(1)),\n contributionAmount: Cl.some(Cl.uint(19000000)),\n });\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-participant-data (who principal))\n {\n enrollmentBlock: (get enrollmentBlock (map-get? ParticipantStatus who)),\n contributionAmount: (get contributionAmount (map-get? ParticipantStatus who))\n }\n )\n\n (map-set ParticipantStatus tx-sender { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeTuple(expected: Record<string, ClarityValue>)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n","url":"/docs/stacks/clarinet-js-sdk/references/custom-matchers"},"7":{"id":"/docs/stacks/clarinet-js-sdk/references/methods","title":"Methods","description":"The Clarinet JS SDK provides several methods that can be used to interact with simnet.","content":"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `getAccounts`\n\nRetrieve a list of all Stacks addresses configured within the project, including wallets, deployers, and faucets.\n\n\n\n\n<Tabs defaultValue=\"get-accounts\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"get-accounts\" className='tab group'>\n <Badge className='badge transition-colors'>Getting your accounts</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-account\" className='tab group'>\n <Badge className='badge transition-colors'>Selecting a specific account</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"get-accounts\">\n ```ts\n const accounts = simnet.getAccounts();\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(10) {\n \"wallet_7\": \"ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ\",\n \"wallet_1\": \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n \"wallet_3\": \"ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC\",\n \"wallet_5\": \"ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB\",\n \"wallet_8\": \"ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP\",\n \"wallet_4\": \"ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND\",\n \"deployer\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n \"wallet_6\": \"ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0\",\n \"wallet_2\": \"ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\",\n \"faucet\": \"STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6\",\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAccounts(): Map<string, string>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"get-account\">\n ```ts\n const accounts = simnet.getAccounts();\n\n const wallet = accounts.get('wallet_1')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAccounts(): Map<string, string>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getAssetsMap`\n\nRetrieve a list of asset balances associated with Stacks addresses, including fungible and non-fungible tokens.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting STX account balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-ft-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Getting ft balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-nft-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Getting nft balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-deployer-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for an account</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const assets = simnet.getAssetsMap();\n\n const stxBalances = assets.get('STX')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(10) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 100000000000000n,\n \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\": 100000000000000n,\n \"ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\": 100000000000000n,\n \"ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC\": 100000000000000n,\n \"ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND\": 100000000000000n,\n \"ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB\": 100000000000000n,\n \"ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0\": 100000000000000n,\n \"ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP\": 100000000000000n,\n \"ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ\": 100000000000000n,\n \"STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6\": 100000000000000n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-ft-balance\">\n ```ts\n const contractName = 'token';\n const sourceCode = `\n (define-fungible-token sbtc)\n (ft-mint? sbtc u19 tx-sender)\n `;\n\n simnet.deployContract(\n contractName,\n sourceCode,\n null,\n simnet.deployer\n );\n\n const assets = simnet.getAssetsMap();\n\n const tokenBalance = assets.get('.token.sbtc')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(1) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 19n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-nft-balance\">\n ```ts\n const contractName = 'nft';\n const sourceCode = `\n (define-non-fungible-token ticket uint)\n (nft-mint? ticket u42 tx-sender)\n `;\n\n simnet.deployContract(\n contractName,\n sourceCode,\n null,\n simnet.deployer\n );\n\n const assets = simnet.getAssetsMap();\n\n const nftBalance = assets.get('.nft.ticket')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(1) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 1n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-deployer-balance\">\n ```ts\n const assets = simnet.getAssetsMap();\n const stxBalances = assets.get('STX')!;\n\n const deployerBalance = stxBalances.get('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 100000000000000n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `getDataVar`\n\nGet the value of a `data-var` defined in a contract.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `counter`</span>\n\nThe name of the `data-var` for the contract.\n\n<span>Example: `count`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the value of a data variable</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentCount = simnet.getDataVar('counter', 'count');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n (define-data-var contractOwner principal tx-sender)\n \n (var-set count (+ (var-get count) u1))\n (var-set contractOwner 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 1,\n value: 1n\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getDataVar(contract: string, dataVar: string): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const contractOwner = simnet.getDataVar(\"counter\", \"contractOwner\");\n\n const response = cvToValue(contractOwner);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n (define-data-var contractOwner principal tx-sender)\n \n (var-set count (+ (var-get count) u1))\n (var-set contractOwner 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getDataVar(contract: string, dataVar: string): ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getMapEntry`\n\nGet the value of a map entry by its key. Note that this method will always return an optional value `some` or `none`, just like Clarity `map-get?`.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the map within the contract.\n\n<span>Example: `Participants`</span>\n\nThe key to access the value in the map.\n\n<span>Example: `Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the value of an entry</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const hasParticipated = simnet.getMapEntry(\n \"pool\",\n \"Participants\",\n Cl.standardPrincipal(wallet)\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 10,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getMapEntry(\n contract: string,\n mapName: string,\n mapKey: ClarityValue\n ): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const hasParticipated = simnet.getMapEntry(\n \"pool\",\n \"Participants\",\n Cl.standardPrincipal(wallet)\n );\n\n const response = cvToValue(hasParticipated);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getMapEntry(\n contract: string,\n mapName: string,\n mapKey: ClarityValue\n ): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n# `callReadOnlyFn`\n\nCall read-only functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue`. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the read-only function within the contract.\n\n<span>Example: `get-participant`</span>\n\nThe arguments to pass to the read-only function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Making a function call</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"with-no-arguments\" className='tab group'>\n <Badge className='badge transition-colors'>With no arguments</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"deployer\" className='tab group'>\n <Badge className='badge transition-colors'>With an explicit contract address</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const getContributionAmount = simnet.callReadOnlyFn(\n 'pool',\n 'get-contribution-amount',\n [Cl.standardPrincipal(wallet)],\n wallet\n ); \n \n const response = getContributionAmount.result\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 1,\n value: 420000000n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"with-no-arguments\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const isActive = simnet.callReadOnlyFn(\n 'pool',\n 'is-active',\n [],\n wallet\n );\n \n const response = isActive.result\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 10,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"deployer\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const contractAddress = `${wallet}.pool`;\n\n const getParticipant = simnet.callReadOnlyFn(\n contractAddress,\n 'get-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = getParticipant.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 9,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const getContributionAmount = simnet.callReadOnlyFn(\n 'pool',\n 'get-contribution-amount',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = cvToValue(getContributionAmount.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n 42000000n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n \n </TabsContent>\n</Tabs>\n\n\n# `callPublicFn`\n\nCall public functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue` and the events fired during the function execution. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the public function within the contract.\n\n<span>Example: `register-participant`</span>\n\nThe arguments to pass to the public function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Broadcasting your transaction</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"events\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract events</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = registerParticipant.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 7,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n \n const response = cvToValue(registerParticipant.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"events\">\n ```ts\n import { Cl, cvToValue, type ClarityValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n \n const eventValues = registerParticipant.events.map((event) =>\n cvToValue(event.data.value as ClarityValue)\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n at: {\n type: \"uint\",\n value: \"2\",\n },\n message: {\n type: \"(string-ascii 10)\",\n value: \"Registered\",\n },\n who: {\n type: \"principal\",\n value: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `callPrivateFn`\n\nCall private functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue` and the events, if any, fired during the function execution. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the private function within the contract.\n\n<span>Example: `reward-participant-points`</span>\n\nThe arguments to pass to the private function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Broadcasting your transaction</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const address1 = accounts.get(\"wallet_1\")!\n\n const rewardParticipantPoints = simnet.callPrivateFn(\n \"pool\",\n \"reward-participant-points\",\n [Cl.standardPrincipal(address1)],\n wallet\n );\n\n const response = rewardParticipantPoints.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n (define-map ParticipantPoints principal int)\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (reward-participant-points who)\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (define-private (reward-participant-points (who principal))\n (map-insert ParticipantPoints who 100)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n (map-set ParticipantPoints tx-sender 1000)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 3,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n\n callPrivateFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const address1 = accounts.get(\"wallet_1\")!\n\n const rewardParticipantPoints = simnet.callPrivateFn(\n \"pool\",\n \"reward-participant-points\",\n [Cl.standardPrincipal(address1)],\n wallet\n );\n\n const response = cvToValue(registerParticipant.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n (define-map ParticipantPoints principal int)\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (reward-participant-points who)\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (define-private (reward-participant-points (who principal))\n (map-insert ParticipantPoints who 100)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n (map-set ParticipantPoints tx-sender 1000)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n\n callPrivateFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n \n</Tabs>\n\n\n\n# `transferSTX`\n\nTransfer STX from one address to another. The amount transferred is in `uSTX`.\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe amount of `uSTX` to transfer.\n\n<span>Example: `1000000` equals 1 STX</span>\n\nThe Stacks address of the recipient.\n\n<span>Example: `ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Transferring STX</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"events\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract events</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n result: {\n type: 7,\n value: {\n type: 3,\n },\n },\n events: [\n {\n event: \"stx_transfer_event\",\n data: [\n {\n amount: \"42000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n ],\n }\n ],\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n \n const response = cvToValue(transfer.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"events\">\n ```ts\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n\n const events = transfer.events.map((event) => event);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n event: \"stx_transfer_event\",\n data: {\n amount: \"42000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `deployContract`\n\nDeploy a contract to simnet.\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe name of the contract to be deployed.\n\n<span>Example: `hello-world`</span>\n\nThe Clarity source code (or content) of the contract.\n\n<span>Example: `(define-read-only (say-hi) (ok \"Hello World\"))`</span>\n\nAn object to specify options, such as the Clarity version.\n\n<span>Example: `{ clarityVersion: 2 }` | `null`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Deploying your contract</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Specifying a Clarity version</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"interact\" className='tab group'>\n <Badge className='badge transition-colors'>Interacting with your contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n const contract = simnet.deployContract(\n 'hello-world',\n sourceCode,\n null,\n simnet.deployer\n );\n\n const response = cvToValue(contract.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n true\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n const contract = simnet.deployContract(\n 'hello-world',\n sourceCode,\n { clarityVersion: 2 },\n simnet.deployer\n );\n\n const response = cvToValue(contract.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n true\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"interact\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n simnet.deployContract(\n 'hello-world',\n sourceCode,\n null,\n simnet.deployer\n );\n\n const sayHi = simnet.callReadOnlyFn(\"hello-world\", \"say-hi\", [], simnet.deployer);\n\n const response = sayHi.result\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"(string-ascii 11)\",\n value: \"Hello World\",\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineBlock`\n\nThe `callPublicFn`, `transferSTX`, and `deployContract` methods all mine one block with only one transaction. It can also be useful to mine a block with multiple transactions.\n\nThis is what `mineBlock` is for.\n\nThis method takes an array of transaction objects. The transactions can be built with the `tx` helper exported by the SDK.\n\nThe `tx` helper has three methods:\n- `callPublicFn`\n- `transferSTX`\n- `deployContract`\n\nThese methods have the same interface as simnet methods but instead of performing a transaction, they will build a transaction object that can be passed to the `mineBlock` function.\n\nIn epochs from 3.0 on, the stacks chaintip is advanced separately from the burn chaintip. This means `mineBlock` will only affect the stacks chaintip. If you'd like to also mine burn blocks, use the `mineEmptyBurnBlock` function.\n\n## Parameters\n\nAn array of transactions to be included in the block.\n\n<span>Example: `[tx.transferSTX(100, recipient, sender), ...]`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining multiple transactions in a single block</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { tx } from '@hirosystems/clarinet-sdk';\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get(\"wallet_1\")!;\n\n const block = simnet.mineBlock([\n tx.callPublicFn(\"counter\", \"increment\", [], simnet.deployer),\n tx.callPublicFn(\"counter\", \"add\", [Cl.uint(10)], simnet.deployer),\n tx.transferSTX(19000000, wallet, simnet.deployer),\n ]);\n\n block.forEach((transaction) => {\n console.log(cvToValue(transaction.result));\n if (transaction.events.length > 0) console.log(transaction.events);\n });\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n\n (define-public (add (amount uint))\n (begin\n (var-set count (+ (var-get count) amount))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"uint\",\n value: \"1\",\n }\n {\n type: \"uint\",\n value: \"11\",\n }\n {\n type: \"bool\",\n value: true,\n }\n [\n {\n event: \"stx_transfer_event\",\n data: {\n amount: \"19000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n mineBlock(txs: Tx[]): ParsedTransactionResult[]\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineEmptyBlock`\n\nMine one empty block and increase the block height by one.\n\nReturns the new block height.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining an empty block</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n simnet.mineEmptyBlock();\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlock(): number\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineEmptyBlocks`\n\nMine multiple empty blocks to reach a certain block height.\n\nReturns the new block height.\n\n## Parameters\n\nThe number of empty blocks to mine. This parameter is optional.\n\n<span>Example: `5`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining multiple empty blocks</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Mining an empty block without a count</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n simnet.mineEmptyBlocks(5);\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 6\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlocks(count?: number): number\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n simnet.mineEmptyBlocks();\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlocks(count?: number): number\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `runSnippet`\n\nExecute arbitrary Clarity code directly, which allows you to test and interact with smart contract functions without deploying them.\n\n## Parameters\n\nThe Clarity code snippet to be executed.\n\n<span>Example: `(define-read-only (get-balance) (ok stx-balance))`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Executing arbitrary Clarity code</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"transfer\" className='tab group'>\n <Badge className='badge transition-colors'>Running a snippet for a STX transfer</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const codeSnippet = simnet.runSnippet(\n '(stx-account tx-sender)'\n );\n\n const response = Cl.prettyPrint(codeSnippet, 2);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n locked: u0,\n unlock-height: u0,\n unlocked: u100000000000000\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n runSnippet(snippet: string): string | ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"transfer\">\n ```ts\n import { cvToValue } from \"@stacks/transactions\";\n\n const accounts = simnet.getAccounts();\n const recipient = accounts.get(\"wallet_1\")!;\n\n const codeSnippet = simnet.runSnippet(\n `(stx-transfer? u19000000 tx-sender '${recipient})`\n );\n\n const response = cvToValue(codeSnippet);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n runSnippet(snippet: string): string | ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `getContractsInterfaces`\n\nReturns the interfaces of the project contracts as a Map of Contracts, with the keys being the contract addresses.\n\nThese interfaces contain information such as the available `functions`, `data-vars`, `maps`, `NFTs`, and `FTs` defined in the contract.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting a specific contract interface</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"filter\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract functions</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractInterfaces = simnet.getContractsInterfaces();\n\n const response = contractInterfaces.get(`${simnet.deployer}.pool`);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n functions: [\n {\n name: \"get-participant\",\n access: \"read_only\",\n args: [\n [Object ...]\n ],\n outputs: [Object ...],\n }, {\n name: \"is-active\",\n access: \"read_only\",\n args: [],\n outputs: [Object ...],\n }\n ],\n variables: [],\n maps: [\n {\n name: \"ParticipantStatus\",\n key: \"principal\",\n value: [Object ...],\n }, {\n name: \"Participants\",\n key: \"principal\",\n value: \"bool\",\n }\n ],\n fungible_tokens: [],\n non_fungible_tokens: [],\n epoch: \"Epoch25\",\n clarity_version: \"Clarity2\",\n }\n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractsInterfaces(): Map<string, ContractInterface>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"filter\">\n ```ts\n const poolContract = contractInterfaces.get(`${simnet.deployer}.pool`);\n\n const response = poolContract?.functions;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n name: \"get-participant\",\n access: \"read_only\",\n args: [\n [Object ...]\n ],\n outputs: [Object ...],\n }, {\n name: \"is-active\",\n access: \"read_only\",\n args: [],\n outputs: [Object ...],\n }\n ]\n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractsInterfaces(): Map<string, ContractInterface>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getContractSource`\n\nGet the source code of a contract as a string.\n\n## Parameters\n\nThe identifier of the contract for which the source code is requested.\n\n<span>Example: `pool`</span>\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the source code of a contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractSource = simnet.getContractSource('pool');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```clarity\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractSource(contract: string): string | undefined\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `getContractAST`\n\nGet the full AST (Abstract Syntax Tree) of a Clarity contract.\n\nThis method throws an error if it fails to get the AST or to encode it.\n\n## Parameters\n\nThe identifier of the contract for which the AST (Abstract Syntax Tree) is requested.\n\n<span>Example: `pool`</span>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the source code of a contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractAST = simnet.getContractAST('pool');\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n contract_identifier: {\n issuer: [ 26, [\n 109, 120, 222, 123, 6, 37, 223, 191, 193, 108, 58, 138, 87, 53, 246, 220,\n 61, 195, 242, 206\n ] ],\n name: \"pool\",\n },\n pre_expressions: [],\n expressions: [\n {\n expr: [Object ...],\n id: 1,\n span: [Object ...],\n pre_comments: [],\n end_line_comment: undefined,\n post_comments: [],\n },\n ...\n ],\n top_level_expression_sorting: [ 0, 1, 2, 3 ],\n referenced_traits: Map {},\n implemented_traits: [],\n wasm_module: undefined,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractAST(contractId: string): ContractAST\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n","url":"/docs/stacks/clarinet-js-sdk/references/methods"},"8":{"id":"/docs/stacks/clarinet-js-sdk","title":"Overview","description":"The Clarinet JS SDK is a JavaScript library used to write unit tests for Clarity smart contracts.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nThe Clarinet JS SDK allows you to write unit tests for your Clarity smart contracts. You can theoretically use any JavaScript test framework, but the SDK supports Vitest out of the box. This SDK leverages `simnet`, a simulated network that offers a rapid feedback loop for initial testing.\n\nHere is a non-exhaustive list of some of simnet's use-cases:\n\n- Call public and read-only functions from smart contracts\n- Get Clarity maps or data-var values\n- Get contract interfaces (available functions and data)\n- Write unit tests for Clarity smart contracts\n\n<Callout title=\"Requirements\" type=\"warn\">\n The SDK requires Node.js >= 18.0 and NPM to be installed.\n</Callout>\n\n## Guides\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Simulate a blockchain with Clarinet JS SDK\"\n description=\"Learn how to interact with a simulated network without running a node.\"\n />\n <SecondaryCard\n href=\"/stacks/clarinet-js-sdk/guides/migrate-to-the-clarinet-sdk\"\n title=\"Migrate v1 tests to Clarinet JS SDK\"\n description=\"Learn how to migrate your existing tests to the Clarinet JS SDK.\"\n />\n <SecondaryCard\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"SDK reference\"\n description=\"Dive deeper into the methods, properties, and types available in the Clarinet JS SDK.\" />\n</Cards>\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>","url":"/docs/stacks/clarinet-js-sdk"},"9":{"id":"/docs/stacks/clarinet-js-sdk/quickstart","title":"Quickstart","description":"Learn how to test a simple counter contract using the Clarinet JS SDK.","content":"\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\nimport { SmallCard } from '@/components/card';\n\nIn this quickstart guide, you will initialize a simulated development network for testing a smart contract using the Clarinet JS SDK. You'll learn how to initialize your project, interact with a smart contract, call its functions, and test the results.\n\nCheck out the [methods](/stacks/clarinet-js-sdk/references/methods) page for the Clarinet JS SDK to learn about the different ways that you can interact with simnet.\n\n---\n\n<Steps>\n <Step>\n ## Importing dependencies\n \n Before we dive in, navigate to your project and import the `Cl` helper from the `@stacks/transactions` package in your test file.\n\n <Files className='pointer-events-none'>\n <Folder name=\"contracts\" defaultOpen>\n <File name=\"counter.clar\" />\n </Folder>\n <Folder name=\"settings\" />\n <Folder name=\"tests\" defaultOpen>\n <File name=\"counter.test.ts\" className='bg-[hsl(var(--highlight))]' />\n </Folder>\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n </Files>\n\n ```ts counter.test.ts\n import { describe, expect, it } from \"vitest\";\n import { Cl } from \"@stacks/transactions\";\n ```\n\n The `Cl` namespace simplifies the process of creating and handling Clarity values. This functionality is particularly useful in testing environments where developers need to simulate contract interactions accurately.\n \n </Step>\n <Step>\n ## Retrieve an account from the simnet\n \n For most test cases, you'll want to retrieve an account from the network in order to interact with your smart contracts. The following code uses the `getAccounts` method to achieve this.\n\n ```ts counter.test.ts\n import { describe, expect, it } from \"vitest\";\n import { Cl } from \"@stacks/transactions\";\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get(\"wallet_1\")!;\n ```\n\n <Callout title=\"Note\">\n The `--stacks` flag is required and allows you to specify the network to scan. Other options include `--bitcoin`.\n </Callout>\n </Step>\n <Step>\n ## Write your first test\n \n The process for writing tests for smart contracts with the Clarinet JS SDK follows a structured approach similar to testing in JavaScript. Here's a breakdown of the steps involved:\n\n 1. Define the group of tests you want to run using the `describe` block.\n 2. Define the test you want to run using the `it` block.\n 3. Call the function and assert the result using the `expect` function.\n\n Now that you understand the key components for writing tests, start by writing a test that ensures the `counter` contract has been deployed.\n\n ```ts counter.test.ts\n describe(\"counter contract\", () => {\n it(\"ensures the contract is deployed\", () => {\n const contractSource = simnet.getContractSource(\"counter\");\n expect(contractSource).toBeDefined();\n });\n });\n ```\n </Step>\n <Step>\n ## Test the count-up function\n \n Now it's time to call a public function and assert the result. The <code>count-up</code> function is expected to increment the count of the user's principal by 1. Write a test to ensure this behaves as expected.\n\n ```ts counter.test.ts\n describe(\"counter contract\", () => {\n it(\"increments the count of the user's principal by 1\", () => {\n const countUpCall = simnet.callPublicFn(\"counter\", \"count-up\", [], wallet);\n expect(countUpCall.result).toBeOk(Cl.bool(true));\n \n const getCountCall = simnet.callReadOnlyFn(\n \"counter\",\n \"get-count\",\n [Cl.principal(wallet)],\n wallet\n );\n expect(getCountCall.result).toBeUint(1);\n });\n });\n ```\n\n Above, the `count-up` function is called, and the result is asserted to return an `(ok true)`. Then, the count for the user's principal is retrieved and asserted to be `u1`.\n\n <Callout title=\"Custom matchers\">\n <p>The <code>toBeOk</code> and <code>toBeUint</code> methods are used to ensure the `count-up` function returns the proper Clarity values. For more details, check out the [custom matchers](/stacks/clarinet-js-sdk/references/custom-matchers) page.</p>\n </Callout>\n </Step>\n <Step>\n ## Run your tests\n\n Every generated project comes with a <code>package.json</code> file that contains the necessary dependencies and scripts to run your tests.\n \n ```json package.json\n \"scripts\": {\n \"test\": \"vitest run\",\n \"test:report\": \"vitest run -- --coverage --costs\",\n \"test:watch\": \"chokidar \\\"tests/**/*.ts\\\" \\\"contracts/**/*.clar\\\" -c \\\"npm run test:report\\\"\"\n }\n ```\n\n You can now run your tests, with your preferred package manager, by executing the following command:\n \n ```terminal\n $ npm run test\n ```\n </Step>\n <Step>\n ## Run your tests with code coverage and cost analysis\n\n Clarinet can automatically also produce a code coverage report and cost analysis on the test you ran.\n\n ```json package.json\n \"scripts\": {\n \"test\": \"vitest run\",\n \"test:report\": \"vitest run -- --coverage --costs\",\n \"test:watch\": \"chokidar \\\"tests/**/*.ts\\\" \\\"contracts/**/*.clar\\\" -c \\\"npm run test:report\\\"\"\n }\n ```\n\n By running the `npm run test:report` command in your terminal, an `lcov.info` and `costs-reports.json` file will appear in your root folder:\n\n <Files className='pointer-events-none'>\n <Folder name=\"contracts\" defaultOpen>\n <File name=\"counter.clar\" />\n </Folder>\n <Folder name=\"settings\" />\n <Folder name=\"tests\" defaultOpen>\n <File name=\"counter.test.ts\" />\n </Folder>\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"costs-reports.json\" className='bg-[hsl(var(--highlight))]' />\n <File name=\"lcov.info\" className='bg-[hsl(var(--highlight))]' />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n </Files>\n\n The `costs-reports.json` file will output the cost analysis for every function ran in your tests. Since the `count-up` function was used in our test, this is how the cost analysis output would look like for that function:\n\n ```json costs-reports.json\n {\n \"test_name\": \"tests/counter.test.ts__counter contract__increments the count of the user's principal by 1\",\n \"contract_id\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.counter\",\n \"method\": \"count-up\",\n \"args\": [],\n \"cost_result\": {\n \"total\": {\n \"write_length\": 41,\n \"write_count\": 1,\n \"read_length\": 245,\n \"read_count\": 5,\n \"runtime\": 4752\n },\n \"limit\": {\n \"write_length\": 15000000,\n \"write_count\": 15000,\n \"read_length\": 100000000,\n \"read_count\": 15000,\n \"runtime\": 5000000000\n },\n \"memory\": 40,\n \"memory_limit\": 100000000\n }\n }\n ```\n\n To access and read the `lcov.info` file in a human-readable format, we can first install the `lcov` [package](https://github.com/linux-test-project/lcov) that helps generate a graphical front-end for coverage testing tools.\n\n ```terminal\n $ brew install lcov\n ```\n\n Then we'll run the `genhtml` command below with the following options. This command and its options will generate the actual html file, add in additional branch coverage, and will automatically store the files in a new folder called `coverage`.\n\n ```terminal\n $ genhtml lcov.info --branch-coverage -o coverage\n ```\n\n You can then navigate into the new `coverage` folder and run the command `open index.html` to view your coverage report. In addition, a summary of the coverage report will be outputted in the terminal.\n </Step>\n</Steps>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API Reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/guides/migrate-to-the-clarinet-sdk\"\n title=\"Migrating your tests to Clarinet SDK\"\n description=\"Learn how to migrate your existing Clarinet projects to the Clarinet JS SDK\"\n />\n</Cards>","url":"/docs/stacks/clarinet-js-sdk/quickstart"},"10":{"id":"/docs/stacks/clarinet-js-sdk/installation","title":"Installation","description":"Clarinet JS SDK can be installed using your preferred package manager.","content":"\n<Callout type=\"warn\">\n The SDK requires Node.js >= 18.0 and NPM to be installed.\n</Callout>\n\n```package-install\n@hirosystems/clarinet-sdk\n```\n","url":"/docs/stacks/clarinet-js-sdk/installation"},"11":{"id":"/docs/stacks/reference","title":"SDKs & Libraries","description":"The following guides cover ways to use Hiro tools to build apps on Stacks.","content":"\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/quickstart\"\n title=\"Create your first smart contract\"\n description=\"Build a simple counter contract using Clarinet.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Blockchain />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write unit tests for your smart contracts\"\n description=\"Learn how run unit tests with Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/stacks.js/quickstart\"\n title=\"Make a contract call with Stacks.js\"\n description=\"Learn how to integrate smart contracts into your app.\"\n tag='Stacks.js'\n />\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n","url":"/docs/stacks/reference"},"12":{"id":"/docs/stacks/testing-best-practices","title":"Best practices","description":"Learn best practices for writing and running tests for your Clarity smart contracts using the Clarinet JS SDK and Vitest.","content":"\nIntegration testing is a crucial step in smart contract development that involves testing how different components of your system work together. The Clarinet JS SDK provides powerful tools for writing and running integration tests, allowing you to simulate complex scenarios and interactions between multiple contracts.\n\nBy using integration tests, you can ensure that your smart contracts function correctly as part of a larger system and catch potential issues that might not be apparent in unit tests alone.\n\nIn this guide, you will:\n\n1. [Set up a Clarinet project with a `defi` contract.](#set-up-a-clarinet-project)\n2. [Write an integration test for the smart contract.](#test-the-deposit-and-borrow-functionality)\n3. [Run tests and generate coverage reports.](#run-tests-and-generate-coverage-reports)\n\n---\n\n## Set up a Clarinet project\n\nStart by creating a new Clarinet project. This command will create a new directory named `defi` and set up a basic Clarinet project inside it.\n\n```terminal\n$ clarinet new stx-defi\n$ cd stx-defi\n```\n\nAfter changing into your project directory, run `npm install` to install the package dependencies for testing.\n\n```terminal\n$ npm install\n```\n\nWe are going to use the same `defi` contract that we used in the [unit testing guide](/stacks/clarinet-js-sdk/guides/unit-testing), but with some additional functionality - the ability to `borrow` STX from the contract. If you don't have this project set up already, follow the steps below:\n\n```terminal\n$ clarinet contract new defi\n```\n\nThen, inside your `defi.clar` file, copy and paste the following contract code:\n\n```clarity\n;; Error constants for various failure scenarios.\n(define-constant err-overborrow (err u300))\n\n;; The interest rate for loans, represented as 10% (out of a base of 100).\n(define-data-var loan-interest-rate uint u10) ;; Representing 10% interest rate\n\n\n;; Holds the total amount of deposits in the contract, initialized to 0.\n(define-data-var total-deposits uint u0)\n\n;; Maps a user's principal address to their deposited amount.\n(define-map deposits { owner: principal } { amount: uint })\n\n;; Maps a borrower's principal address to their loan details: amount and the last interaction block.\n(define-map loans principal { amount: uint, last-interaction-block: uint })\n\n;; Public function for users to deposit STX into the contract.\n;; Updates their balance and the total deposits in the contract.\n(define-public (deposit (amount uint))\n (let\n (\n ;; Fetch the current balance or default to 0 if none exists.\n (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n )\n ;; Transfer the STX from sender = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\" to recipient = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)\".\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n ;; Update the user's deposit amount in the map.\n (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })\n ;; Update the total deposits variable.\n (var-set total-deposits (+ (var-get total-deposits) amount))\n ;; Return success.\n (ok true)\n )\n)\n\n;; Public function for users to borrow STX based on their deposits.\n(define-public (borrow (amount uint))\n (let\n (\n ;; Fetch user's deposit or default to 0.\n (user-deposit (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n ;; Calculate the maximum amount the user is allowed to borrow. (which will be upto HALF of what they deposited)\n (allowed-borrow (/ user-deposit u2))\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n ;; Calculate the new loan total after borrowing additional amount.\n (new-loan (+ amount))\n )\n ;; Ensure the requested borrow amount does not exceed the allowed amount.\n (asserts! (<= new-loan allowed-borrow) err-overborrow)\n ;; Transfer the borrowed STX to the user.\n (let\n (\n (recipient tx-sender)\n )\n (try! (as-contract (stx-transfer? amount tx-sender recipient)))\n )\n ;; Update the user's loan details in the map.\n (map-set loans tx-sender { amount: new-loan, last-interaction-block: block-height })\n ;; Return success.\n (ok true)\n )\n)\n\n;; Read-only function to get the total balance by tx-sender\n(define-read-only (get-balance-by-sender)\n (ok (map-get? deposits { owner: tx-sender }))\n)\n\n;; Read-only function to get the total amount owed by the user.\n(define-read-only (get-amount-owed)\n (let\n (\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n )\n ;; Return the total amount due.\n (ok total-due)\n )\n)\n\n;; Private function to calculate the accrued interest on a loan.\n(define-private (calculate-accrued-interest (principal uint) (start-block uint))\n (let\n (\n ;; Calculate the number of blocks elapsed since the last interaction.\n (elapsed-blocks (- block-height start-block))\n ;; Calculate the interest based on the principal, rate, and elapsed time.\n (interest (/ (* principal (var-get loan-interest-rate) elapsed-blocks) u10000))\n )\n ;; Ensure the loan started in the past (not at block 0).\n (asserts! (not (is-eq start-block u0)) (ok u0))\n ;; Return the calculated interest.\n (ok interest)\n )\n)\n```\n\nRun `clarinet check` to ensure that your smart contract is valid and ready for testing.\n\n<Callout>\nYou can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi).\n</Callout>\n\n## Test the deposit and borrow functionality\n\nIn order to `borrow` STX from the contract, users must first `deposit` STX into it. Therefore, we need to write an integration test that simulates the interaction between these two functions.\n\nInside of your `defi.test.ts` file, replace the boilerplate code and add the following:\n\n```typescript\nimport { describe, it, expect } from 'vitest';\nimport { Cl } from '@stacks/transactions';\n\nconst accounts = simnet.getAccounts();\nconst wallet1 = accounts.get('wallet_1')!;\n\ndescribe('stx-defi', () => {\n it('borrows 10 and verifies the amount owed to be 10', () => {\n simnet.callPublicFn('defi', 'deposit', [Cl.uint(1000)], wallet1);\n const totalDeposits = simnet.getDataVar('defi', 'total-deposits');\n expect(totalDeposits).toBeUint(1000);\n\n simnet.callPublicFn('defi', 'borrow', [Cl.uint(10)], wallet1);\n const { result } = simnet.callReadOnlyFn('defi', 'get-amount-owed', [], wallet1);\n expect(result).toBeOk(Cl.uint(10));\n });\n});\n```\n\nIn this integration test, we're simulating a scenario where a user deposits STX into the DeFi contract and then borrows against that deposit. Let's walk through the process step by step.\n\nWe start by simulating a deposit of 1000 STX from `wallet1`. To do this, we use the `callPublicFn` method from the Clarinet JS SDK `simnet` object, which allows us to call public functions in our smart contract just as we would on the actual blockchain.\n\nAfter making the deposit, we want to verify that it was successful. We do this by checking the total deposits in the contract using `getDataVar`.\n\nThis handy method lets us peek at the value of data variables defined in your contract.\n\n<Callout>\nTo learn more about available methods for integration testing, check out the [reference page](/stacks/clarinet-js-sdk/references/methods).\n</Callout>\n\nTo ensure the deposit was recorded correctly, we use a custom matcher, `toBeUint`. This matcher is specifically designed to check if a value is a Clarity unsigned integer with the exact value we expect.\n\nWith the deposit confirmed, we simulate `wallet1` borrowing 10 STX. We do this with another call to `callPublicFn`, this time invoking the `borrow` function of our contract.\n\nAfter the borrowing operation, we want to check how much `wallet1` owes. We use `callReadOnlyFn` to call a read-only function named `get-amount-owed` in our contract.\n\nFinally, we verify the amount owed using another custom matcher, `toBeOk(Cl.uint(10))`. This matcher is particularly useful because it checks two things at once:\n\n1. That our contract returned a successful Clarity response type.\n2. That the value returned is a Clarity unsigned integer with the exact value we expect (`10`).\n\nThese custom matchers and simnet methods are powerful tools and allow you to simulate complex interactions with your smart contracts and make detailed assertions about the results.\n\n## Run tests and generate coverage reports\n\nTo run your tests, use:\n\n```terminal\n$ npm run test\n```\n\nTo generate a coverage report, use:\n\n```terminal\n$ npm run coverage\n```\n\nThis will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/methods\"\n title=\"SDK methods\"\n description=\"Learn about the methods available in the Clarinet JS SDK.\"\n />\n</Cards>\n","url":"/docs/stacks/testing-best-practices"},"13":{"id":"/docs/stacks/archive","title":"Overview","description":"The Hiro Archive is a series of data snapshots for services in the Stacks ecosystem.","content":"\nimport { Button } from \"@/components/ui/button\"\nimport { SecondaryCard } from \"@/components/card\"\n\nThe Hiro Archive enables you to quickly bootstrap supported services with pre-loaded data, which otherwise could take you days or weeks to acquire when syncing from genesis. This is a public service Hiro offers as a free benefit to the Stacks community.\n\n<Button className=\"bg-orange-500 hover:bg-orange-600\">\n <a href=\"https://archive.hiro.so/\" target=\"_blank\" className=\"no-underline\">\n View the Hiro Archive\n </a>\n</Button>\n\n## Supported services\n\nWe record and archive mainnet and testnet snapshots for the following services every night:\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/archive/guides/verify-archive-data\"\n title=\"Verify archive data\"\n description=\"Verify the integrity of the data in a particular snapshot.\"\n />\n <SecondaryCard\n href=\"/stacks/archive/guides/stacks-blockchain\"\n title=\"Stacks blockchain\"\n description=\"Quickly spin up a new Stacks node.\"\n />\n <SecondaryCard\n href=\"/stacks/archive/guides/stacks-api\"\n title=\"Stacks Blockchain API\"\n description=\"Spin up a new instance of the Stacks Blockchain API.\"\n />\n <SecondaryCard\n href=\"/stacks/archive/guides/token-metadata-api\"\n title=\"Token Metadata API\"\n description=\"Spin up a new instance of the Token Metadata API.\"\n />\n</Cards>\n","url":"/docs/stacks/archive"},"14":{"id":"/docs/stacks/archive/guides/stacks-api","title":"Use the Stacks Blockchain API archive","description":"Discover how to use the Hiro Archive to spin up a Stacks Blockchain API.","content":"\n## Prerequisites\n\nSince the Stacks Blockchain API depends on a Stacks blockchain node being at the same block height, you will need to first [restore a Stacks blockchain node using the Hiro Archive](/stacks/archive/guides/stacks-blockchain) before restoring the Stacks Blockchain API. Otherwise, you may encounter errors when running the API.\n\nIn order for the Stacks blockchain and Stacks Blockchain API archives to be compatible, they must meet the following criteria:\n\n- Both archives correspond to the same Stacks network (mainnet/testnet).\n- The API archive version must be compatible with the Stacks blockchain archive version (See [API release notes](https://github.com/hirosystems/stacks-blockchain-api/releases) for guidance).\n- Both archives were created on the same date.\n\n## Restoration methods\n\nThere are two ways to restore a Stacks Blockchain API using the Hiro Archive. The archive file you'll need to download will depend on your method of restoration. There is no scenario where you would need both restoration methods.\n\n**Restore via Postgres database dump (Recommended)**\n\nThis is the quickest and most direct method, and it is suitable for most scenarios. It consists of a backup of the API's Postgres database taken using `pg_dump`. We generally recommend starting with this method before attempting the method below if this one does not work for any reason.\n\n**Restore via tab-separated-values (TSV) file**\n\nThis method is several times slower than restoring from a Postgres dump. The API TSV file contains the raw unprocessed events from a Stacks blockchain node. The API can ingest this file to process events into a Postgres database.\nRestoring from a TSV file can be useful when a Postgres database archive for a particular API version is not available or when it cannot be used for any reason.\n\n## Where to download archives\n\nDepending on the restoration method used above, the Stacks Blockchain API archives for each network can be found at the following locations:\n\n- Postgres database dump\n - mainnet: https://archive.hiro.so/mainnet/stacks-blockchain-api-pg/\n - testnet: https://archive.hiro.so/testnet/stacks-blockchain-api-pg/\n- TSV file\n - mainnet: https://archive.hiro.so/mainnet/stacks-blockchain-api/\n - testnet: https://archive.hiro.so/testnet/stacks-blockchain-api/\n\nThe file name patterns are as follows:\n\n- Postgres database dump\n - archive: `stacks-blockchain-api-pg-<DATABASE VERSION>-<API VERSION>-<DATE(YYYYMMDD)>.dump`\n - shasum: `stacks-blockchain-api-pg-<DATABASE VERSION>-<API VERSION>-<DATE(YYYYMMDD)>.sha256`\n- TSV file\n - archive: `<network>-stacks-blockchain-api-<API VERSION>-<DATE(YYYYMMDD)>.gz`\n - shasum: `<network>-stacks-blockchain-api-<API VERSION>-<DATE(YYYYMMDD)>.sha256`\n\nThere is a continually updated archive and shasum which always points to the most recent upload:\n\n- Postgres database dump\n - archive: `stacks-blockchain-api-pg-<DATABASE VERSION>-latest.dump`\n - shasum: `stacks-blockchain-api-pg-<DATABASE VERSION>-latest.sha256`\n- TSV file\n - archive: `<network>-stacks-blockchain-api-latest.gz`\n - shasum: `<network>-stacks-blockchain-api-latest.sha256`\n\nor the most recent upload for a particular version:\n\n- Postgres database dump\n - archive: `stacks-blockchain-api-pg-<DATABASE VERSION>-<API VERSION>-latest.dump`\n - shasum: `stacks-blockchain-api-pg-<DATABASE VERSION>-<API VERSION>-latest.sha256`\n- TSV file\n - archive: `<network>-stacks-blockchain-api-<API VERSION>-latest.gz`\n - shasum: `<network>-stacks-blockchain-api-<API VERSION>-latest.sha256`\n\n## Restoring the Stacks Blockchain API using the Hiro Archive\n\n**If restoring via Postgres dump**\n\n1. Download the archive and shasum for the appropriate network and restoration method.\n1. [Verify the archive](/stacks/archive/guides/verify-archive-data) with the shasum.\n1. Import the archive file into a running Postgres database (may take up to an hour depending on database specs and tuning):\n ```terminal\n $ export PGPASSWORD=<YOUR POSTGRES PASSWORD>\n $ pg_restore --username postgres --verbose --jobs 4 --dbname stacks_blockchain_api /path/to/archive/file\n ```\n1. Launch the Stacks Blockchain API service.\n1. Verify the dataset is being used by comparing your nodes [local block height](http://localhost:3999/extended/v1/status) with [Hiro's](https://api.hiro.so/extended/v1/status). If the block height matches or is close to Hiro's block height, the restoration was successful.\n 1. It may take a few minutes for the local node to respond on this endpoint.\n 1. Your block height may be up to a few hundred blocks away from Hiro's depending on the age of the archive. It should catch up relatively quickly.\n\n**If restoring via TSV file**\n\n1. Download the archive and shasum for the appropriate network and restoration method.\n1. [Verify the archive](/stacks/archive/guides/verify-archive-data) with the shasum.\n1. Extract the archive into the desired directory:\n ```terminal\n $ gzip -d <ARCHIVE FILE> --stdout > /path/to/extracted/file\n ```\n1. [Follow these directions](https://github.com/hirosystems/stacks-blockchain-api#export-and-import) to process and import the events in the TSV file into your Postgres database.\n1. Launch the Stacks Blockchain API service.\n1. Verify the dataset is being used by comparing your nodes [local block height](http://localhost:3999/extended/v1/status) with [Hiro's](https://api.hiro.so/extended/v1/status). If the block height matches or is close to Hiro's block height, the restoration was successful.\n 1. It may take a few minutes for the local node to respond on this endpoint.\n 1. Your block height may be up to a few hundred blocks away from Hiro's depending on the age of the archive. It should catch up relatively quickly.\n","url":"/docs/stacks/archive/guides/stacks-api"},"15":{"id":"/docs/stacks/archive/guides/token-metadata-api","title":"Use the Token Metadata API archive","description":"Discover how to use the Hiro Archive to spin up a Token Metadata API.","content":"\n## Prerequisites\n\nSince the Token Metadata API depends on a Stacks Blockchain API, you will need to first launch a Stacks Blockchain API configured for the same Stacks network.\n\nIf you don't already have one, you can follow [these instructions](/stacks/archive/guides/stacks-blockchain) to launch one with an archive.\n\n## Where to download archives\n\nToken Metadata API archives for each network can be found at the following locations:\n\n- mainnet: https://archive.hiro.so/mainnet/token-metadata-api-pg/\n- testnet: https://archive.hiro.so/testnet/token-metadata-api-pg/\n\nThe file name patterns are as follows:\n\n- archive: `token-metadata-api-pg-<DATABASE VERSION>-<API VERSION>-<DATE(YYYYMMDD)>.dump`\n- shasum: `token-metadata-api-pg-<DATABASE VERSION>-<API VERSION>-<DATE(YYYYMMDD)>.sha256`\n\nThere is a continually updated archive and shasum which always points to the most recent upload:\n\n- archive: `token-metadata-api-pg-<DATABASE VERSION>-latest.dump`\n- shasum: `token-metadata-api-pg-<DATABASE VERSION>-latest.sha256`\n\nor the most recent upload for a particular version:\n\n- archive: `token-metadata-api-pg-<DATABASE VERSION>-<API VERSION>-latest.dump`\n- shasum: `token-metadata-api-pg-<DATABASE VERSION>-<API VERSION>-latest.sha256`\n\n## Restoring the Token Metadata API using the Hiro Archive\n\n1. Download the archive and shasum for the appropriate network.\n1. [Verify the archive](/stacks/archive/guides/verify-archive-data) with the shasum.\n1. Import the archive file into a running Postgres database (may take up to an hour depending on database specs and tuning):\n ```terminal\n $ export PGPASSWORD=<YOUR POSTGRES PASSWORD>\n $ pg_restore --username postgres --verbose --jobs 4 --dbname token_metadata_api /path/to/archive/file\n ```\n1. Launch the Token Metadata API service.\n1. Verify the restoration was successful by viewing the [total number of tokens and contracts tracked in the service.](http://localhost:3000/metadata) If the total number of each property is greater than zero, the restoration was successful.\n 1. It may take a few minutes for the local node to respond on this endpoint.\n","url":"/docs/stacks/archive/guides/token-metadata-api"},"16":{"id":"/docs/stacks/archive/guides/verify-archive-data","title":"Verify archive data","description":"Verify the integrity of the data in a particular snapshot.","content":"\nAll datasets have an associated SHA256 hash file which can be used to verify the integrity of the downloaded dataset.\nAs some of the archives are quite large, this is useful to ensure the file you've downloaded matches the file maintained in the Hiro Archive.\n\nAfter downloading an archive file and its associated shasum file, you can verify the integrity of the archive file like so:\n\n```terminal\n$ echo \"$(cat <SHASUM FILE> | awk '{print $1}') <ARCHIVE FILE>\" | shasum --check\n<ARCHIVE FILE>: OK\n\n$ echo \"$(cat mainnet-stacks-blockchain-api-latest.sha256 | awk '{print $1}') mainnet-stacks-blockchain-api-latest.gz\" | shasum --check\n\nmainnet-stacks-blockchain-api-latest.gz: OK\n\n# Otherwise a log will be printed indicating failure\nmainnet-stacks-blockchain-api-latest.gz: FAILED\nshasum: WARNING: 1 computed checksum did NOT match\n```\n\n<Callout title=\"Note\" type=\"warn\">\nIf the integrity check fails for any reason, you may need to delete the local archive and re-attempt the download. If issues persist, switch to a different network and try again.\n</Callout>","url":"/docs/stacks/archive/guides/verify-archive-data"},"17":{"id":"/docs/stacks/archive/guides/stacks-blockchain","title":"Use the Stacks blockchain archive","description":"Discover how to use the Hiro Archive to spin up a Stacks node.","content":"\n## Where to download archives\n\nStacks blockchain archives for each network can be found at the following locations:\n\n- mainnet: https://archive.hiro.so/mainnet/stacks-blockchain/\n- testnet: https://archive.hiro.so/testnet/stacks-blockchain/\n\nThe file name patterns are as follows:\n\n- archive: `<NETWORK>-stacks-blockchain-<VERSION>-<DATE(YYYYMMDD)>.tar.gz`\n- shasum: `<NETWORK>-stacks-blockchain-<VERSION>-<DATE(YYYYMMDD)>.sha256`\n\nThere is a continually updated archive and shasum which always points to the most recent upload:\n\n- archive: `<NETWORK>-stacks-blockchain-latest.tar.gz`\n- shasum: `<NETWORK>-stacks-blockchain-latest.sha256`\n\nor the most recent upload for a particular version:\n\n- archive: `<NETWORK>-stacks-blockchain-2.3.0.0.2-latest.tar.gz`\n- shasum: `<NETWORK>-stacks-blockchain-2.3.0.0.2-latest.sha256`\n\n## Restoring a Stacks blockchain node using the Hiro Archive\n\n1. Download the archive and shasum for the appropriate network.\n1. [Verify the archive](/stacks/archive/guides/verify-archive-data) with the shasum.\n1. Extract the archive into the desired directory:\n ```terminal\n $ tar -zxvf <ARCHIVE FILE> -C /target/directory\n ```\n1. [Configure the `working_dir` property](https://docs.stacks.co/docs/nodes-and-miners/stacks-node-configuration#node) in your Stacks blockchain node Config.toml file to match the directory you extracted the archive to.\n1. Launch your Stacks blockchain node. You can use [one of these example configuration files](https://github.com/stacks-network/stacks-blockchain/tree/master/testnet/stacks-node/conf) as a reference.\n1. Verify the dataset is being used by comparing your nodes [local block height](http://localhost:20443/v2/info) with [Hiro's](https://api.hiro.so/v2/info). If the block height matches or is close to Hiro's block height, the restoration was successful.\n 1. It may take a few minutes for the local node to respond on this endpoint.\n 1. Your block height may be up to a few hundred blocks away from Hiro's depending on the age of the archive. It should catch up relatively quickly.\n","url":"/docs/stacks/archive/guides/stacks-blockchain"},"18":{"id":"/docs/stacks/clarinet","title":"Overview","description":"Clarinet is a local development environment that offers everything you need to create, test, and deploy smart contracts on Stacks.","content":"\nimport { ArrowUpRight } from \"lucide-react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\"\nimport { SecondaryCard } from \"@/components/card\";\n\nUsing a simple command line interface, Clarinet enables you to build and iterate on your contracts locally before moving into production on the `mainnet` network.\n\nYou can code with <TooltipProvider inline><Tooltip><TooltipTrigger asChild><span className='cursor-default border-b border-dotted border-primary'>Clarity syntax support</span></TooltipTrigger><TooltipContent>Using the [Clarity VSCode extension](https://marketplace.visualstudio.com/items?itemName=HiroSystems.clarity-lsp#:~:text=This%20VS%20Code%20extension%20brings,safety%20checks%2C%20debugger%20and%20more)</TooltipContent></Tooltip></TooltipProvider>, run tests, debug your code line by line, and deploy your contracts to a local Stacks blockchain environment to rapidly iterate on your code.\n\n## Installation\n\n<TerminalPicker storage=\"macOs\">\n\n```terminal !! macOS\n$ brew install clarinet\n```\n\n```terminal !! Windows\n$ winget install clarinet\n```\n\n```terminal !! Cargo\n$ sudo apt install build-essential pkg-config libssl-dev\n```\n\n```terminal !! Pre-built binary\n$ wget -nv https://github.com/hirosystems/clarinet/releases/download/v0.27.0/clarinet-linux-x64-glibc.tar.gz -O clarinet-linux-x64.tar.gz\n$ tar -xf clarinet-linux-x64.tar.gz\n$ chmod +x ./clarinet\n$ mv ./clarinet /usr/local/bin\n```\n\n</TerminalPicker>\n\n## Set up shell completions\n\nClarinet already has many different commands built in. Therefore, enabling tab completion in your shell may be useful. Using the command below, you can use `clarinet` to generate the shell completion scripts for many common shells.\n\n```terminal\n$ clarinet completions (bash|elvish|fish|powershell|zsh)\n```\n\nAfter generating the file, you can refer to the documentation for your shell to determine where this file should be moved to and what other steps may be necessary to enable tab completion for `clarinet`.\n\n## Guides\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/clarinet/guides/create-a-new-project\"\n title=\"Create a new contract\"\n description=\"Add new contracts to your project and have them automatically configured in your project file.\"\n />\n <SecondaryCard\n href=\"/stacks/clarinet-js-sdk/guides/unit-testing\"\n title=\"Write unit tests\"\n description=\"Leverage the Clarinet JS SDK to write comprehensive unit tests, ensuring your contract performs as expected.\"\n />\n <SecondaryCard\n href=\"/stacks/clarinet/guides/create-deployment-plans\"\n title=\"Create deployment plans\"\n description=\"Employ customizable deployment plans to streamline your contract deployments.\"\n />\n <SecondaryCard\n href=\"/stacks/clarinet/guides/run-a-local-devnet\"\n title=\"Run a local development environment\"\n description=\"Set up a local devnet environment for developing and testing in a controlled environment before deployment.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Clarinet JS SDK](/stacks/clarinet-js-sdk)**: Simplify your testing with the Clarinet JS SDK.\n- **[Hiro Platform](/stacks/platform)**: A developer platform for building, deploying and scaling Bitcoin apps.\n- **[Stacks.js](/stacks/stacks.js)**: Leverage a JavaScript library that handles basic functions, such as user authentication and transaction signing.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n","url":"/docs/stacks/clarinet"},"19":{"id":"/docs/stacks/clarinet/concepts","title":"Concepts","description":"Learn about the concepts behind Clarinet.","content":"\n## Network types\n\nClarinet supports different network types to cater to various development and testing needs:\n\n| Network | Description | Use case\n| -------------- | ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |\n| `simnet` | Optimized for fast feedback loops, introspection, and portability. | Ideal for initial development and unit-testing. |\n| `devnet` | Local Stacks and Bitcoin nodes running on Docker for faster feedback loops. | Use for integration tests or local frontend development. |\n| `testnet` | A pre-production network that offers a realistic environment for testing. | Ideal for final testing before deploying to Mainnet. |\n| `mainnet` | The production network where real transactions occur. | Use when you're ready to deploy your smart contract to production. |\n\n## Deployment plans\n\nThe default deployment plan of every Clarinet project is contained within specifications set inside certain files. In addition to this default deployment plan, the user can manually configure each plan, adding additional transactions or contract calls across multiple Stacks or Bitcoin blocks.\n\nYou can commit, audit, and test contracts without including any secrets in the deployment plan, and you can share these contracts without exposing any sensitive information.\n\n### Primitives\n\n| Transaction primitive | Typical usage |\n| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Publish contracts | Deploy contracts to an in-memory simulated Stacks chain, public networks like testnet and mainnet, or deploy external contracts to your local network for testing purposes. |\n| Call contract functions | Call a contract deployed to any of your local devnets or public networks. |\n| Send BTC | Perform a simple bitcoin transfer from a p2pkh address to a p2pkh address. |\n| Wait for block | Test or automate contract deployment across multiple Stacks or Bitcoin blocks. |\n| Send STX | Send stacks to an address or contract. |","url":"/docs/stacks/clarinet/concepts"},"20":{"id":"/docs/stacks/clarinet/examples/add-a-contract","title":"Add a contract","description":"Clarinet can handle adding and configuring a new contract to your project.","content":"\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nTo add a new contract, run the `clarinet contract new` command, along with your contract name, inside your project.\n\n```terminal\n$ clarinet contract new my-contract\n```\n\n## Project structure\n\n**Clarinet** will add 2 files to your project: `my-contract.clar` and `my-contract.test.ts`.\n\n<Files className='pointer-events-none'>\n <Folder name=\"contracts\" defaultOpen>\n <File name=\"my-contract.clar\" className='bg-[hsl(var(--highlight))]' />\n </Folder>\n <Folder name=\"settings\" />\n <Folder name=\"tests\" defaultOpen>\n <File name=\"my-contract.test.ts\" className='bg-[hsl(var(--highlight))]' />\n </Folder>\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n</Files>\n\n**Clarinet** will also add the configuration to the `Clarinet.toml` file for your contract.\n\n```toml\n[contracts.my-contract]\npath = 'contracts/my-contract.clar'\nclarity_version = 2\nepoch = 2.4\n```\n\n<Callout title=\"Adding contracts manually\">\nYou can also add contracts to your project by adding the files manually. However, you must add the appropriate configuration to `Clarinet.toml` in order for **Clarinet** to recognize the contracts.\n</Callout>","url":"/docs/stacks/clarinet/examples/add-a-contract"},"21":{"id":"/docs/stacks/clarinet/examples/validate-a-contract","title":"Validate a contract","description":"Clarinet provides syntax and semantics checkers for the smart contract language Clarity.","content":"\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nValidate the syntax and semantics of your contracts:\n\n```terminal\n$ clarinet check\n\u001b[32m✔\u001b[0m \u001b[1m1 contract checked\u001b[0m\n$ clarinet check path/to/my-contract.clar\n\u001b[32m✔\u001b[0m \u001b[1m1 contract checked\u001b[0m\n```\n\nThis command uses the _txt`Clarinet.toml`_ file to locate and analyze all the contracts in the project. If the Clarity code is valid, the command will indicate success with the response below.\n\n<Callout title=\"Note\">\nThe _console`clarinet check`_ command may also report warnings indicating the code is valid.\n</Callout>","url":"/docs/stacks/clarinet/examples/validate-a-contract"},"22":{"id":"/docs/stacks/clarinet/examples/estimate-costs","title":"Estimating contract costs","description":"Analyze execution costs pertaining to your contract.","content":"\nimport { API, Clarinet, Js } from '@/components/ui/icon';\nimport { File, Folder, Files } from \"fumadocs-ui/components/files\"\n\nTransactions on the Stacks blockchain comes with execution costs that can dictate transaction fees for your users. To analyze the execution costs of your contract's functions, let's continue with the simple `counter` contract from the [Clarinet quickstart](/stacks/clarinet/quickstart) as an example.\n\n```clarity\n(define-map Counters principal uint)\n\n(define-read-only (get-count (who principal))\n (default-to u0 (map-get? Counters who))\n)\n\n(define-public (count-up)\n (ok (map-set Counters tx-sender (+ (get-count tx-sender) u1)))\n)\n```\n\nTo start analyzing execution costs, first run the `clarinet console` command inside your project.\n\n```terminal\n$ clarinet console\n```\n\n## Get Costs\n\nThe `::get_costs <expr>` command in the Clarinet console will display the cost analysis of the given expression as well as the return value of the given expression. The `::get_costs` command expects an expression, so make a `contract-call?` with our `count-up` function and see what happens.\n\n```terminal\n$ ::get_costs (contract-call? .counter count-up)\n+----------------------+-------------+----------------+-----------------+\n| | Consumed | Limit | Percentage |\n+----------------------+-------------+----------------+-----------------+\n| Runtime | 4752 | 5000000000 | 0.00 % |\n+----------------------+-------------+----------------+-----------------+\n| Read count | 5 | 15000 | 0.03 % |\n+----------------------+-------------+----------------+-----------------+\n| Read length (bytes) | 245 | 100000000 | 0.00 % |\n+----------------------+-------------+----------------+-----------------+\n| Write count | 1 | 15000 | 0.01 % |\n+----------------------+-------------+----------------+-----------------+\n| Write length (bytes) | 41 | 15000000 | 0.00 % |\n+----------------------+-------------+----------------+-----------------+\n\n\n(ok true)\n```\n\nAs you can see from the chart, execution costs are broken into 5 different categories, each with its own limit. The limit is pertaining to what each Stacks block is limited to.\n\n<Callout title=\"Execution Cost Categories\">\nThe below lists out each of the 5 different categories of Clarity execution costs. ([source](https://book.clarity-lang.org/ch12-00-runtime-cost-analysis.html))\n\n- **Runtime** costs limits overall complexity of the code that can be executed. For example, negating a boolean value is less complex than calculating SHA512 hash, therefore (not false) will consume less runtime costs than (sha512 \"hello world\"). This category is also affected by contract size.\n- **Read count** limits how many times we can read from memory or chain state to a extract piece of information. It is affected by reading constants, variables, intermediate variables created with let, maps, but also by some functions that needs to save intermediate results during execution.\n- **Read length (bytes)** limits how much data we can read from memory or the chain. It is also affected by contract size. Calling into a contract using contract-call? Increases the read length by an amount equal to the contract size in bytes, every time. If you call into a contract with a length of 2,000 bytes twice, the read length is increased twice.\n- **Write count** limits how many times we can write data into chain. It increments when writing to variables and maps.\n- **Write length (bytes)** limits how much data we can write to the chain.\n\n</Callout>\n\nThe percentage column shows what percentage of the execution costs your expression consumed out of the block limit given.\n\n## Toggle costs\n\nYou can toggle the cost analysis to always be displayed after every expression execution in the console by toggling this feature on with the command `::toggle_costs`.\n\n```terminal\n$ ::toggle_costs\n```\n\nTo turn it off, just run the `::toggle_costs` command again.\n\nCheck out the Clarity Book section on [runtime cost analysis](https://book.clarity-lang.org/ch12-00-runtime-cost-analysis.html) to read up on cost optimization techniques and recommendations.\n\nTo see how you can run automated cost analysis on your unit tests, check out our [quickstart](/stacks/clarinet-js-sdk/quickstart#run-your-tests-with-code-coverage-and-cost-analysis) section for the Clarinet JS SDK.\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/guides/cli-commands/validate-a-contract\"\n title=\"Validate a contract\"\n description=\"Learn how to validate a contract.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<API />}\n href=\"/stacks/rpc-api/fees/estimate\"\n title=\"Get fee estimates for a transaction\"\n description=\"Learn how to fetch transaction costs.\"\n tag='API'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write tests for your smart contracts\"\n description=\"Learn how to write unit tests using the Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n</Cards>","url":"/docs/stacks/clarinet/examples/estimate-costs"},"23":{"id":"/docs/stacks/clarinet/examples/start-a-development-console","title":"Start development console","description":"Launch the Clarinet console for interactive development.","content":"\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nLaunch the Clarinet console for interactive development:\n\n```terminal\n$ clarinet console\n```\n\nThis commands starts a new interactive REPL session so you can interact with your contracts.","url":"/docs/stacks/clarinet/examples/start-a-development-console"},"24":{"id":"/docs/stacks/clarinet/examples/run-a-local-devnet","title":"Run a local devnet","description":"Integrate your contracts with a local development environment.","content":"\nLaunch a local development network with all required services:\n\n```terminal\n$ clarinet devnet start\n```\n\nRequires Docker to be running locally. See [installing Docker](/guides/install-docker) guide for more information.\n\n<Callout title=\"Common errors\" type=\"warn\">\n <p>If you are getting `error: clarinet was unable to create network`, make sure you have a container service running locally.</p>\n</Callout>","url":"/docs/stacks/clarinet/examples/run-a-local-devnet"},"25":{"id":"/docs/stacks/clarinet/examples/deploy-a-contract","title":"Deploy a contract","description":"Use Clarinet to publish your contracts to the devnet, testnet, or mainnet networks.","content":"\nGenerate a deployment plan:\n\n```terminal\n$ clarinet deployments generate --<network>\n```\nSupported networks: console`devnet`_, console`testnet`_, console`mainnet`_\n\nDeploy contracts:\n\n```terminal\n$ clarinet deployments apply --<network>\n```\n\n## Add Contract Requirements\nAdd external contract dependencies:\n\n```terminal\n$ clarinet requirements add <contract-principal>\n```\n\nExample:\n```terminal\n$ clarinet requirements add SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait\n```\n\n## Deployment Plan Transactions\n\nYour deployment plans can include various transaction types:\n\n### Contract Operations\n```yaml\n- contract-publish:\n contract-name: my-contract\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n cost: 5960\n path: contracts/my-contract.clar\n clarity-version: 2\n\n- contract-call:\n contract-id: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n method: my-function\n parameters: []\n cost: 5960\n```\n\n### Asset Transfers\n```yaml\n- stx-transfer:\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n recipient: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract\n mstx-amount: 1000\n memo: '0x01'\n cost: 10000\n\n- btc-transfer:\n expected-sender: mjSrB3wS4xab3kYqFktwBzfTdPg367ZJ2d\n recipient: bcrt1qnxknq3wqtphv7sfwy07m7e4sr6ut9yt6ed99jg\n sats-amount: 100000000\n sats-per-byte: 10\n```\n\n### Simnet Operations\n```yaml\n- emulated-contract-publish:\n contract-name: my-contract\n emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n path: contracts/my-contract.clar\n clarity-version: 2\n\n- emulated-contract-call:\n contract-id: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract\n emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n method: my-function\n parameters: []\n```\n\n<Callout title=\"Note\">\nFor functions that take no arguments or read-only functions, use an empty parameters list: `parameters: []`\n</Callout>","url":"/docs/stacks/clarinet/examples/deploy-a-contract"},"26":{"id":"/docs/stacks/clarinet/examples/debug-a-contract","title":"Debug a contract","description":"Step through and debug your contracts inside the command line.","content":"\nimport { Clarinet, Js } from '@/components/ui/icon';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nInside the console, you can use these debugging commands:\n\n```terminal\n$ ::trace (contract-call? .my-contract my-function)\n$ ::debug (contract-call? .my-contract my-function)\n$ break my-function\n```\n\nDebug navigation commands:\n- _console`step`_ or _console`s`_ - Step into\n- _console`finish`_ or _console`f`_ - Step out\n- _console`next`_ or _console`n`_ - Step over\n- _console`continue`_ or _console`c`_ - Continue execution\n\nLet's take the clarity_`counter`_ contract as an example:\n\n```clarity\n(define-map Counters principal uint)\n\n(define-read-only (get-count (who principal))\n (default-to u0 (map-get? Counters who))\n)\n\n(define-public (count-up)\n (ok (map-set Counters tx-sender (+ (get-count tx-sender) u1)))\n)\n```\n\n### Trace\n\nThe _console`::trace`_ command expects an expression, so make a _clarity`contract-call?`_ with our _clarity`count-up`_ function and see what happens.\n\n```terminal\n$ ::trace (contract-call? .counter count-up)\n(contract-call? .counter count-up) \u001b[30m<console>\u001b[0m\n( get-count tx-sender ) \u001b[30mcounter:4:38\u001b[0m\n \u001b[31m↳ args:\u001b[0m \u001b[1mST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\u001b[0m\n \u001b[34mu0\u001b[0m\n\u001b[34m(ok true)\u001b[0m\n```\n\n### Breakpoints\n\nYou can also set a breakpoint at a specific line to better understand what's happening in your contract.\n\nWith `::debug`, you can add breakpoints at a specific line of a contract or function to better understand what's happening in your contracts.\n\n```clarity\n(define-map Counters principal uint)\n\n(define-read-only (get-count (who principal))\n (default-to u0 (map-get? Counters who))\n)\n\n(define-public (count-up)\n (ok (map-set Counters tx-sender (+ (get-count tx-sender) u1)))\n)\n\n;; !mark(1:3)\n(define-public (count-twice)\n (double)\n)\n\n;; !mark(1:6)\n(define-private (double)\n (begin\n (unwrap-panic (count-up))\n (count-up)\n )\n)\n```\n\n```terminal\n$ ::debug (contract-call? .counter count-twice)\n$ break count-up\n```\n\n\n<Callout title=\"Breakpoint Commands\">\nTo step through these breakpoints, you can use one of the following commands:\n\n- **Step-in (`step` or `s`)**: Step into the sub-expressions.\n- **Step-out (`finish` or `f`)**: Complete execution of the current expression and return the result to the parent.\n- **Step-over (`next` or `n`)**: Continue to completion of the current expression, stepping over sub-expressions.\n- **Continue (`continue` or `c`)**: Continue execution until hitting a breakpoint or completing execution.\n</Callout>\n\nUsing the _console`continue`_ command, the breakpoint you set in the _clarity`double`_ function will trigger twice due to two _clarity`count-up`_ calls, which enables you to do variable and map analysis.\n\n## Next steps\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/guides/cli-commands/validate-a-contract\"\n title=\"Validate a contract\"\n description=\"Learn how to validate a contract.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/clarinet/guides/estimate-costs\"\n title=\"Estimate costs for a contract\"\n description=\"Learn how to estimate costs for a contract.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write tests for your smart contracts\"\n description=\"Learn how to write unit tests using the Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n</Cards>","url":"/docs/stacks/clarinet/examples/debug-a-contract"},"27":{"id":"/docs/stacks/clarinet/examples/create-deployment-plans","title":"Create deployment plans","description":"Learn how to create deployment plans.","content":"\nimport { Clarinet, Js } from '@/components/ui/icon';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\n\nDeployment plans minimize the inherent complexity of deployments, such as smart contract dependencies and interactions, transaction chaining limits, deployment costs, and more. Deployment plans ensure reproducible deployments, a critical workflow for testing purposes.\n\nIn this guide, you will learn how to:\n\n1. [Generate and configure a deployment plan.](#generate-a-deployment-plan)\n2. [Set deployment plan specifications.](#deployment-plan-specifications)\n3. [Add project contract requirements.](#adding-project-contract-requirements)\n4. [Customize your deployment plan.](#edit-your-deployment-plan)\n\n---\n\n## Generate a deployment plan\n\nClarinet uses a deployment plan for every deployment—whether for a basic `simnet`, `devnet` (for use with the `clarinet devnet start` command), or the public `testnet` and `mainnet`.\n\nYou can view the current deployment plan saved to disk at any time with the following command (specifying the network `simnet`, `devnet`, `testnet`, `mainnet`)\n\n```terminal\n$ clarinet deployments generate --<network>\n```\n\nUpon this command, your project's default deployment plan, a `.yaml` file (for example, `default.devnet-plan.yaml`), is generated from your project specifications and contracts. Here, for example, is the deployment plan for [the counter smart contract](/stacks/clarinet/quickstart) used in our quickstart guide:\n\n```yaml deployments/default.devnet-plan.yaml\n---\nid: 0\nname: Devnet deployment\nnetwork: devnet\nstacks-node: \"http://localhost:20443\"\nbitcoin-node: \"http://devnet:devnet@localhost:18443\"\nplan:\n batches:\n - id: 0\n transactions:\n - contract-publish:\n contract-name: counter\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n cost: 6940\n path: contracts/counter.clar\n anchor-block-only: true\n clarity-version: 2\n epoch: \"2.5\"\n```\n\n## Deployment plan specifications\n\nA project's deployment plan specifications are set on two files within a Clarinet project—the `Clarinet.toml` file as well as the network’s corresponding `.toml` file (for example, `Devnet.toml`) in the `settings/` folder.\n\nSpecifications in the `Clarinet.toml` file you can change include:\n\n- The Clarity version or blockchain epoch that Clarinet emulates for your smart contracts\n- Project requirements in the form of contract dependencies (see next section)\n\nSpecifications in the `Devnet.toml` file you can change include:\n\n- Accounts, balances, and names\n- Blockchain environment features of your devnet, such as block time or API ports\n- Stacking orders\n- Specifying derivation path of a given account:\n\n```toml settings/devnet.toml\n[accounts.deployer]\nmnemonic = \"<YOUR PRIVATE TESTNET MNEMONIC HERE>\"\nbalance = 100_000_000_000_000\nderivation = \"m/44'/5757'/0'/0/2\"\n```\n\n## Adding project contract requirements\n\nYour project can reference a smart contract that already exists on the blockchain.\n\nFor example, [Stacks Improvement Proposal 009](https://github.com/stacksgov/sips/blob/main/sips/sip-010/sip-010-fungible-token-standard.md) specifies a trait reference for all non-fungible tokens. Instead of redeploying this trait as a separate contract each time a new NFT collection is published, you can reference the contract directly within deployment plans with the following Clarinet command, including the contract principal reference:\n\n```terminal\n$ clarinet requirements add SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait\n```\n\nThis command updates a Clarinet project's deployment plan for use in development.\n\nFor instance, `clarinet devnet start` would now download a copy of the contract principal via the Stacks API node that is booted alongside each devnet deployment, and it would remap the principal that publishes this contract to one of the accounts specified in your `Devnet.toml` file.\n\nThis permits a developer to maintain the minimum set of contracts their Clarinet project will deploy to mainnet (with a single use of an `impl-trait` statement in their Clarity contract).\n\n## Edit your deployment plan\n\nRecall that a default deployment plan is used for every deployment, comprising your projects specifications as set in your `Clarinet.toml` and `<network>.toml` files.\n\nThe default plan is generated upon each `clarinet deployments generate --<network>` shell command to your `deployments/` folder.\n\nHowever, you can also manually edit this default deployment `.yaml` file directly—programmatically orchestrating your contract publication and user interaction beyond your plan's defaults.\n\n<Callout title=\"Note\">\nWhen deploying, Clarinet prompts you to overwrite any manually added or edited changes that differ from the specifications laid out in your project's .toml files. Type `no` to proceed with your manually configured deployment plan instead of the default.\n</Callout>\n\nHere are some of the relevant transactions and configurations available to developers manually configuring their deployment plans:\n\n[`emulated-contract-publish:`](#emulated-contract-publish) Deploy a contract in an in-memory simulated chain.\n\n[`emulated-contract-call:`](#emulated-contract-call) Call a contract that has been deployed in an in-memory simulated chain.\n\n[`requirement-publish:`](#requirement-publish) <TooltipProvider inline><Tooltip><TooltipTrigger asChild><span className='cursor-default border-b border-dotted border-primary'>Deploy an external contract</span></TooltipTrigger><TooltipContent>One that is not published by the same set of private keys as the user wallet currently deploying.</TooltipContent></Tooltip></TooltipProvider> on another `testnet`/`devnet` using another wallet.\n\n[`contract-publish:`](#contract-publish) Deploy a contract.\n\n[`contract-call:`](#contract-call) Call a contract.\n\n[`stx-transfer:`](#stx-transfer) Transfer STX between specified accounts.\n\n[`btc-transfer:`](#btc-transfer) Simple bitcoin transfer from a p2pkh address to a p2pkh address (experimental, `regtest`/`testnet`/`mainnet`).\n\n### emulated-contract-publish\n\nThis default transaction is included in every generated deployment for a `simnet` deployment.\n\n```yaml\n- emulated-contract-publish:\n contract-name: extension-trait\n emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n path: contracts/dao/traits/extension-trait.clar\n clarity-version: 1\n```\n\n### emulated-contract-call\n\nThis is a transaction type for a `simnet` deployment where the developer wants to emulate a contract call.\n\n```yaml\n- emulated-contract-call:\n contract-id: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.counter\n emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n method: increment\n parameters:\n - u1\n```\n\n<Callout title=\"Note\">\nRead-only functions and functions that take no arguments are passed an empty list like so: `parameters: []`\n</Callout>\n\n### requirement-publish\n\nThis cBTC smart contract application has a [devnet deployment plan](https://github.com/hirosystems/clarinet/blob/develop/components/clarinet-cli/examples/cbtc/deployments/default.devnet-plan.yaml) that publishes the contract required by its core smart contract.\n\n```yaml\n- requirement-publish:\n contract-id: SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard\n remap-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n remap-principals:\n SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n cost: 8400\n path: '.cache/requirements/SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.clar'\n```\n\n### contract-publish\n\nThis default transaction is included in every generated deployment plan for every contract your Clarinet project has. This `counter` application has a [devnet deployment plan](https://github.com/hirosystems/clarinet/blob/develop/components/clarinet-cli/examples/counter/deployments/default.devnet-plan.yaml) that publishes its core smart contract.\n\n```yaml\n- contract-publish:\n contract-name: counter\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n cost: 5960\n path: contracts/counter.clar\n anchor-block-only: true\n clarity-version: 1\n```\n\n### contract-call\n\nThe developer can call a function and pass arguments of any valid Clarity type.\n\n```yaml\n- contract-call:\n contract-id: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.bitcoin-dao\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n method: add-new-member\n parameters:\n - u1\n - \"0x01\"\n - \"{ id: u4, username: \"Satoshi\", address: 'SP1HTBVD3JG9C05J7HBJTHGR0GGW7KXW28M5JS8QE }\"\n - \"'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\n cost: 5960\n```\n\n<Callout title=\"Note\">\nRead-only functions and functions that take no arguments are passed an empty list like so: `parameters: []`\n</Callout>\n\n### stx-transfer\n\nThe developer can specify the originating account of an STX transfer, the quantity denominated in microstacks, and the recipient, as well as an optional memo field (Note: the memo field can only contain a Clarity [buffer type](https://book.clarity-lang.org/ch02-02-sequence-types.html) up to 34 bytes in size, pre-fixed with `0x` (for example, `0x68656c6c6f21`), not ASCII text or strings)\n\n```yaml\n- stx-transfer:\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n recipient: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract\n mstx-amount: 1000\n memo: '0x01'\n cost: 10000\n```\n\n### btc-transfer\n\nThis cBTC smart contract application has a [devnet deployment plan](https://github.com/hirosystems/clarinet/blob/develop/components/clarinet-cli/examples/cbtc/deployments/wrap-btc.devnet-plan.yaml) that includes broadcasting a BTC transfer transaction to the emulated bitcoin chain with these parameters.\n\n```yaml\n- btc-transfer:\n expected-sender: mjSrB3wS4xab3kYqFktwBzfTdPg367ZJ2d\n recipient: bcrt1qnxknq3wqtphv7sfwy07m7e4sr6ut9yt6ed99jg\n sats-amount: 100000000\n sats-per-byte: 10\n```\n\n---\n\n## Next steps\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/guides/cli-commands/run-a-local-devnet\"\n title=\"Run a local devnet\"\n description=\"Learn how to run a local devnet.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"Simnet reference\"\n description=\"Learn how to use simnet with the Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n</Cards>","url":"/docs/stacks/clarinet/examples/create-deployment-plans"},"28":{"id":"/docs/stacks/clarinet/examples/working-with-sbtc","title":"Working with sBTC","description":"Clarinet helps with building, testing, and deploying contracts that use sBTC.","content":"\nTo take advantage of these features, make sure to use Clarinet 2.15.0 or later.\n\n## About sBTC\n\nsBTC is a fungible token on the Stacks blockchain. It follows the\n[SIP-010 standard](https://github.com/stacksgov/sips/blob/main/sips/sip-010/sip-010-fungible-token-standard.md)\nfor fungible tokens.\n\nEven though it's *just* a fungible token, Clarinet has some helpers to make it easier to work with.\n\n## Using sBTC in your contract\n\nTo use sBTC in your contract, you need to add the `sbtc-deposit` smart contract to your requirements.\n\nIn a Clarinet project, run the following command:\n\n```terminal\n$ clarinet requirements add SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-deposit\n```\n\nThis will add the [`sbtc-deposit`](https://explorer.hiro.so/txid/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-deposit)\nsmart contract to your project, along with it's dependencies:\n- [`sbtc-token`](https://explorer.hiro.so/txid/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token)\n- [`sbtc-registry`](https://explorer.hiro.so/txid/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-registry)\n\nWhen Clarinet detects the `sbtc-deposit` contract, it will automatically fund your test wallets with \nsBTC that you can use to test your contract in Clarinet simnet and devnet.\n\n## Using sBTC in your contract\n\nAs a SIP-010 token, sBTC let you call the `transfer` function to transfer tokens from one address to another.\n\nLet's say we have an NFT contract that allows users to mint an NFT by spending sBTC. \n\n\n```clarity\n;; this code is for demo purposes\n;; it doesn't implement SIP-009 NFT standard\n(define-non-fungible-token nft-name uint)\n\n;; mint for 100 sats\n(define-data-var sats-sbtc-mint-price uint u100)\n(define-data-var next-id uint u0)\n\n(define-public (mint-one-with-sbtc)\n (begin\n ;; call the sbtc-token contract to transfer the sbtcs\n (try! (contract-call? 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token transfer\n (var-get sats-sbtc-mint-price)\n tx-sender\n (as-contract tx-sender)\n none\n ))\n\n (try! (nft-mint? nft-name (var-get next-id) tx-sender))\n\n (ok (var-set next-id (+ (var-get next-id) u1)))\n )\n)\n```\n\nBecause Clarinet already took care of funding the test wallets with sBTC, you can call the\n`mint-one-with-sbtc` function with one of your test wallets.\n\nIn simnet (unit tests or `clarinet console`), the deployer address of the contract will remain\n`SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4`, but in devnet, like every other requirements, the contract will\nbe deployed by the default deployer address. You don't have to worry about this—Clarinet always make\nsure that your contracts call the right address.\n\n## Deploying your contract on testnet\n\nOn testnet, the official Hiro sBTC contract is\n[ST1F7QA2MDF17S807EPA36TSS8AMEFY4KA9TVGWXT.sbtc-token](https://explorer.hiro.so/txid/ST1F7QA2MDF17S807EPA36TSS8AMEFY4KA9TVGWXT.sbtc-token?chain=testnet).\nThis is the contract that is linked to the sBTC faucet: `ST1F7QA2MDF17S807EPA36TSS8AMEFY4KA9TVGWXT.sbtc-deposit`.\n\nAgain, Clarinet will make sure that your contracts call this address when being deployed on mainnet.\nYou can see the address of the sbtc-contract being re-mapped in the testnet deployment plan.\n\n## Deploying your contract on mainnet\n\nOn mainnet, your contract will remain unchanged and call the one and only sBTC contract.\n","url":"/docs/stacks/clarinet/examples/working-with-sbtc"},"29":{"id":"/docs/stacks/clarinet/examples/create-a-new-project","title":"Create a new project","description":"Once you install Clarinet, you can use Clarinet to create a new project.","content":"\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nCreate a new Clarinet project with the basic directory structure and configuration files:\n\n```terminal\n$ clarinet new my-project\n\u001b[32mCreate directory\u001b[0m \u001b[1mmy-project\u001b[0m\n\u001b[32mCreate directory\u001b[0m \u001b[1mcontracts\u001b[0m\n\u001b[32mCreate directory\u001b[0m \u001b[1msettings\u001b[0m\n\u001b[32mCreate directory\u001b[0m \u001b[1mtests\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1mClarinet.toml\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1msettings/Mainnet.toml\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1msettings/Testnet.toml\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1msettings/Devnet.toml\u001b[0m\n\u001b[32mCreate directory\u001b[0m \u001b[1m.vscode\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1m.vscode/settings.json\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1m.vscode/tasks.json\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1m.gitignore\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1m.gitattributes\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1mpackage.json\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1mtsconfig.json\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1mvitest.config.js\u001b[0m\n```\nThis will create a project directory with the following directory layout:\n\n<Files className='pointer-events-none'>\n <Folder name=\"contracts\" />\n <Folder name=\"settings\" defaultOpen>\n <File name=\"Devnet.toml\" />\n <File name=\"Mainnet.toml\" />\n <File name=\"Testnet.toml\" />\n </Folder>\n <Folder name=\"tests\" />\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n</Files>\n\nThe _txt`Clarinet.toml`_ file contains configuration for the smart contracts in your project. When you create contracts in your project, Clarinet will automatically add them to this file.\n\nThe _txt`settings/Devnet.toml`_ file contains configuration for accounts in the Clarinet console, including the seed phrases and initial balances for a set of out-of-the-box wallets that you can use for testing in the devnet environment.","url":"/docs/stacks/clarinet/examples/create-a-new-project"},"30":{"id":"/docs/stacks/clarinet/quickstart","title":"Quickstart","description":"Learn how to create a simple counter contract using Clarinet.","content":"\nimport { Clarinet, Js } from '@/components/ui/icon';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\n\nIn this quickstart guide, you will write a simple counter contract with Clarity. Throughout this tutorial, you'll learn how to generate a new project, create a smart contract, and validate your smart contract code using the Clarinet CLI.\n\nCheck out the [create a new project](/stacks/clarinet/guides/create-a-new-project) and [validate a contract](/stacks/clarinet/guides/validate-a-contract) guides for a deeper look.\n\n---\n\n<Steps>\n <Step>\n ## Generate your counter project\n \n Start by creating a new Clarinet project. This command will create a new directory named _console`counter`_ and set up a basic Clarinet project inside it.\n\n ```terminal\n $ clarinet new counter\n \u001b[32mCreate directory\u001b[0m \u001b[1mcounter\u001b[0m\n \u001b[32mCreate directory\u001b[0m \u001b[1mcontracts\u001b[0m\n \u001b[32mCreate directory\u001b[0m \u001b[1msettings\u001b[0m\n \u001b[32mCreate directory\u001b[0m \u001b[1mtests\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1mClarinet.toml\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1msettings/Mainnet.toml\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1msettings/Testnet.toml\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1msettings/Devnet.toml\u001b[0m\n \u001b[32mCreate directory\u001b[0m \u001b[1m.vscode\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1m.vscode/settings.json\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1m.vscode/tasks.json\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1m.gitignore\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1m.gitattributes\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1mpackage.json\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1mtsconfig.json\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1mvitest.config.js\u001b[0m\n ```\n\n <Files className=\"pointer-events-none\">\n <Folder name=\"contracts\" />\n <Folder name=\"settings\" defaultOpen>\n <File name=\"Devnet.toml\" />\n <File name=\"Mainnet.toml\" />\n <File name=\"Testnet.toml\" />\n </Folder>\n <Folder name=\"tests\" />\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n </Files>\n </Step>\n <Step>\n ## Create a counter contract\n \n Inside your project directory, run _console`clarinet contract new counter`_ to create your contract. This will generate and update the proper files for writing and testing your code.\n\n ```terminal\n $ cd counter\n $ clarinet contract new counter\n \u001b[32mCreated file\u001b[0m \u001b[1mcontracts/counter.clar\u001b[0m\n \u001b[32mCreated file\u001b[0m \u001b[1mtests/counter.test.ts\u001b[0m\n \u001b[33mUpdated Clarinet.toml\u001b[0m \u001b[1mwith contract counter\u001b[0m\n ```\n\n ```toml Clarinet.toml\n [contracts.counter]\n path = 'contracts/counter.clar'\n clarity_version = 2\n epoch = 2.5\n ```\n </Step>\n <Step>\n ## Variables and functions\n \n Inside your _txt`contracts/counter.clar`_ file:\n\n 1. Define a map called _clarity`Counters`_ to store the count associated with each user.\n 2. Define a public function called _clarity`count-up`_ that increments the count of the user who calls it.\n 3. Add a read-only function called _clarity`get-count`_ that returns the count of the user who calls it.\n\n ```clarity counter.clar -c\n (define-map Counters principal uint)\n\n (define-public (count-up)\n (ok (map-set Counters tx-sender (+ (get-count tx-sender) u1)))\n )\n\n (define-read-only (get-count (who principal))\n (default-to u0 (map-get? Counters who))\n )\n ```\n </Step>\n <Step>\n ## Validate your contract\n \n Now it's time to validate your contract. This command will check your contract for errors and typos.\n\n ```terminal\n $ clarinet check\n \u001b[32m✔\u001b[0m \u001b[1m1 contract checked\u001b[0m\n ```\n\n Once your contract is validated, you can interact with it locally with the _console`clarinet console`_ inside your project directory.\n\n ```terminal\n $ clarinet console\n ```\n\n Here are some example interactions you can perform with your contract:\n\n 1. Call the _clarity`count-up`_ function on your contract to increment the count.\n 2. Verify the count of the user has been incremented by calling the _clarity`get-count`_ function with the _clarity`tx-sender`_ as the argument.\n \n ```terminal\n $ (contract-call? .counter count-up)\n \u001b[32m(ok true)\u001b[0m\n $ (contract-call? .counter get-count tx-sender)\n \u001b[32mu1\u001b[0m\n ```\n </Step>\n</Steps>\n\n## Next steps\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/guides/add-a-contract\"\n title=\"Add a contract to your project\"\n description=\"Learn how to add a contract to your project.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/guides/run-a-local-devnet\"\n title=\"Run a local devnet\"\n description=\"Learn how to set up and run a local development network for your project.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write tests for your smart contracts\"\n description=\"Learn how to write unit tests using the Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n</Cards>","url":"/docs/stacks/clarinet/quickstart"},"31":{"id":"/docs/stacks/platform-api","title":"Overview","description":"Leverage programmatic API access in order to seamlessly interact with devnet and manage chainhooks.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nThe Platform API unlocks powerful automation opportunities in your application code, development and CI scripts, and more, via a familiar REST interface.\n\nIn particular, this API lets you programmatically create, update, query, and delete chainhooks as well as interact with a platform-hosted devnet from your local machine.\n\nWhen you create a Platform account, you'll automatically receive an API key that's required to use these endpoints. You can also create additional API keys in the [Hiro Platform](/stacks/api-keys) as needed.\n\n## Popular endpoints\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/platform-api/devnet/stacks-blockchain-api\"\n title=\"Query devnet API endpoints\"\n description=\"Query Stacks API endpoints for data related to your devnet.\"\n />\n <SecondaryCard\n href=\"/stacks/platform-api/devnet/start\"\n title=\"Start a devnet service\"\n description=\"Start a hosted devnet through the Platform API.\"\n />\n <SecondaryCard\n href=\"/stacks/platform-api/chainhooks/create\"\n title=\"Create a chainhook\"\n description=\"Create a chainhook through the Platform API.\"\n />\n</Cards>\n\n\n## Related tools\n\n- **[Hiro Platform](/stacks/platform)**: A developer platform for building, deploying and scaling Bitcoin apps.\n- **[Chainhook](/stacks/chainhook)**: You don't need the platform to create event streams. Leverage chainhook independently, so your app can react to on-chain events in real time.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch on-chain data from the Stacks blockchain.\n- **[Token Metadata API](/stacks/token-metadata-api)**: Fetch fungible and non-fungible token data on the Stacks blockchain.\n\n<br />\n\n<Callout title=\"Need help building with the Platform API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#hiro-platform</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n\n","url":"/docs/stacks/platform-api"},"32":{"id":"/docs/stacks/platform-api/devnet/bitcoin-node","title":"Bitcoin node","description":"Proxy for the Bitcoin node on a development network (devnet).","content":"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/bitcoin-node/{*}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/platform-api/devnet/bitcoin-node"},"33":{"id":"/docs/stacks/platform-api/devnet","title":"Devnet","description":"Retrieves information about the Platform Devnet services such as Stacks Blockchain API, Bitcoin node, and more.","content":"","url":"/docs/stacks/platform-api/devnet"},"34":{"id":"/docs/stacks/platform-api/devnet/stop","title":"Stop devnet","description":"Stop a development network (devnet).","content":"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/devnet', method: 'delete' }]}\n hasHead={false}\n/>","url":"/docs/stacks/platform-api/devnet/stop"},"35":{"id":"/docs/stacks/platform-api/devnet/start","title":"Start devnet","description":"Start a development network (devnet).","content":"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/devnet/{projectName}', method: 'put' }]}\n hasHead={false}\n/>","url":"/docs/stacks/platform-api/devnet/start"},"36":{"id":"/docs/stacks/platform-api/devnet/stacks-blockchain-api","title":"Stacks Blockchain API","description":"Proxy for the Stacks Blockchain API on a development network (devnet).","content":"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/stacks-blockchain-api/{*}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/platform-api/devnet/stacks-blockchain-api"},"37":{"id":"/docs/stacks/platform-api/chainhooks/list","title":"Get all chainhooks","description":"Get all of your chainhooks through the Hiro Platform.","content":"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/platform-api/chainhooks/list"},"38":{"id":"/docs/stacks/platform-api/chainhooks/create","title":"Create a chainhook","description":"Create a chainhook through the Hiro Platform.","content":"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks', method: 'post' }]}\n hasHead={false}\n/>","url":"/docs/stacks/platform-api/chainhooks/create"},"39":{"id":"/docs/stacks/platform-api/chainhooks/get","title":"Get a specific chainhook","description":"Get a specific chainhook through the Hiro Platform.","content":"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks/{chainhookUuid}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/platform-api/chainhooks/get"},"40":{"id":"/docs/stacks/platform-api/chainhooks","title":"Chainhooks","description":"Retrieves information about the Platform Chainhooks API.","content":"","url":"/docs/stacks/platform-api/chainhooks"},"41":{"id":"/docs/stacks/platform-api/chainhooks/update","title":"Update a chainhook","description":"Update a chainhook through the Hiro Platform.","content":"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks/{chainhookUuid}', method: 'put' }]}\n hasHead={false}\n/>","url":"/docs/stacks/platform-api/chainhooks/update"},"42":{"id":"/docs/stacks/platform-api/chainhooks/delete","title":"Delete a chainhook","description":"Delete a chainhook through the Hiro Platform.","content":"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks/{chainhookUuid}', method: 'delete' }]}\n hasHead={false}\n/>","url":"/docs/stacks/platform-api/chainhooks/delete"},"43":{"id":"/docs/stacks/platform-api/chainhooks/status","title":"Get a chainhook status","description":"Retrieve the status of a specific chainhook through the Hiro Platform.","content":"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks/{chainhookUuid}/status', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/platform-api/chainhooks/status"},"44":{"id":"/docs/stacks","title":"Home","description":"","content":"\nimport { Card as MainCard, SmallCard } from '@/components/card';\nimport { ImageZoom } from 'fumadocs-ui/components/image-zoom';\nimport { PageFooter } from '@/components/footer';\nimport { MessageCircle, Braces, ChevronRight, Code, Database, Play, Rocket, Star, Terminal, Wallet } from 'lucide-react';\nimport { API, Backend, BugIcon, Clarinet, Cloud, Chainhook, Frontend, Hiro, Js, Newspaper, Pulse, QuestionIcon } from '@/components/ui/icon';\nimport heroImage from '@/public/stacks-hero.svg';\n\n<div className='flex flex-col space-y-10 pt-0'>\n\n<div className='flex space-x-6 items-end'>\n <ImageZoom\n alt=\"banner\"\n src={heroImage}\n className=\"mt-0 mb-6 first-line:rounded-xl bg-background\"\n priority\n />\n\n <div className='flex flex-col [&_h2]:mt-0 [&_h2]:mb-2 [&_p]:mb-6'>\n\n ## Build with Stacks\n\n Find all the guides and resources you need to build on Stacks.\n\n </div>\n</div>\n\n<Cards>\n <MainCard\n className='group space-y-1'\n icon={<Play className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/stacks/get-started\"\n title=\"Get Started\"\n description=\"Get started with our end-to-end tutorials and quickstart guides across all Hiro tools.\"\n />\n <MainCard\n className='group space-y-1'\n icon={<API className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/stacks/api\"\n title=\"Stacks API Reference\"\n description=\"Explore API endpoints for interacting with the Stacks Blockchain.\"\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"explore-by-category\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#explore-by-category\" className=\"not-prose group text-sm uppercase\">Explore by category</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Cloud />}\n href=\"/stacks/platform\"\n title=\"Quickstart App Templates\"\n description=\"Full-stack starter-kits, including front-end, back-end, and smart contract components.\"\n />\n <SmallCard\n icon={<Code />}\n href=\"/stacks/clarinet\"\n title=\"Smart Contract Development\"\n description=\"Kickstart your smart contract journey with Clarinet and the Clarinet JS SDK.\"\n />\n <SmallCard\n icon={<Database />}\n href=\"/stacks/chainhook\"\n title=\"Data Streaming & Events\"\n description=\"Create custom event streams for real-time data with Chainhook.\"\n />\n <SmallCard\n icon={<Frontend />}\n href=\"/stacks/stacks.js\"\n title=\"Frontend Web Development\"\n description=\"Interact with smart contracts on the web with the Stacks.js library.\"\n />\n <SmallCard\n icon={<Backend />}\n href=\"/stacks/api\"\n title=\"Backend Development\"\n description=\"Explore our hosted APIs offering a familiar REST interface.\"\n />\n <SmallCard\n icon={<Braces />}\n href=\"/stacks/token-metadata-api\"\n title=\"Token Management\"\n description=\"Explore our hosted API for fetching token metadata on Stacks.\"\n />\n</Cards>\n\n</div>\n\n\n<div className='flex flex-col'>\n\n<h4 id=\"explore-by-tool\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#explore-by-tool\" className=\"not-prose group text-sm uppercase\">Explore by tool</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Hiro />}\n href=\"/stacks/platform\"\n title=\"Hiro Platform\"\n description=\"A developer platform for building, deploying and scaling Bitcoin apps.\"\n />\n <SmallCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet\"\n title=\"Clarinet\"\n description=\"Create, test, and deploy smart contracts on the Stacks blockchain.\"\n />\n <SmallCard\n icon={<API />}\n href=\"/stacks/api\"\n title=\"Stacks Blockchain API\"\n description=\"Interact with the Stacks blockchain from your backend via our hosted API.\"\n />\n <SmallCard\n icon={<Js />}\n href=\"/stacks/stacks.js\"\n title=\"Stacks.js\"\n description=\"A collection of JavaScript libraries to build web applications on Stacks.\"\n />\n <SmallCard\n icon={<Chainhook />}\n href=\"/stacks/chainhook\"\n title=\"Chainhook\"\n description=\"Create customizable, lightweight databases for on-chain events for Bitcoin and Stacks.\"\n />\n</Cards>\n\n</div>\n\n</div>\n\n<PageFooter />","url":"/docs/stacks"},"45":{"id":"/docs/stacks/platform","title":"Overview","description":"A developer platform for building, deploying, and scaling Bitcoin apps.","content":"\nimport Link from \"next/link\";\nimport { Button } from \"@/components/ui/button\"\n\nThe Hiro Platform is your all-in-one solution for building and scaling Bitcoin applications. It provides essential tools including API key management, customizable data streams, production-ready app templates, dedicated testing environments, and onchain monitoring and analytics - everything developers need to bring their Bitcoin apps to life.\n\n<Button className=\"bg-orange-500 hover:bg-orange-600\">\n <Link\n target=\"_blank\"\n href=\"https://platform.hiro.so/\"\n className=\"no-underline\"\n >\n Get started on the platform\n </Link>\n</Button>\n\n![Projects](./images/o1.png)\n\n## Guides\n\n<Cards>\n\n<Card\n href=\"/stacks/platform/guides/create-chainhooks\"\n title=\"Create event streams with Chainhook\"\n description=\"Create and manage webhook-like triggers that react to on-chain events in real time.\"\n/>\n\n{\" \"}\n\n<Card\n href=\"/stacks/platform/guides/deploy-contracts\"\n title=\"Deploy your contracts\"\n description=\"Deploy your project with customizable deployment plans that can handle contract dependencies.\"\n/>\n\n<Card \n href=\"/stacks/platform/guides/devnet\"\n title=\"Iterate quickly with devnet\"\n description=\"Leverage devnet, a private instance of the blockchain, for rapid feedback loops and a better debugging experience.\"\n/>\n\n<Card \n href=\"/stacks/platform/guides/contract-monitoring\"\n title=\"Monitor your contract activity\"\n description=\"Set up monitoring for your smart contracts with customizable alerts to track on-chain activity after deployment.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build and deploy smart contracts locally on your device with Clarinet.\n- **[Chainhook](/stacks/chainhook)**: You don’t need the platform to create event streams. Leverage chainhook independently, so your app can react to on-chain events in real time.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel. Build faster with a JS library that handles basic functions.\n\n<br />\n\n<Callout title=\"Need help building with the Hiro Platform?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#hiro-platform</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n","url":"/docs/stacks/platform"},"46":{"id":"/docs/stacks/platform/examples/deploy-contracts","title":"Deploy contracts","description":"Learn how to deploy contracts in the Hiro Platform.","content":"\n## Prerequisites\n\n- Follow the [create project](/stacks/platform/guides/create-project) guide to create or import a project.\n- Make sure you have installed and connected a Stacks wallet to deploy your contracts.\n\n## Use the deploy button\n\nOnce your project is setup, you can deploy the contracts to testnet or mainnet using the \"Deploy\" button on the Hiro Platform.\n\n![deploy contracts](../images/deploy-contracts/d1.png)\n\nThe following are the steps to deploy your contracts using the deploy button.\n\n1. On the projects page, select the project you want to deploy contracts from.\n2. Use the \"Deploy Contracts\" button available at the top right of the page.\n3. Choose the network you want to deploy to. Note: for devnet, [reference this guide](/stacks/platform/guides/devnet). The steps below are specific to testnet and mainnet.\n4. Once you choose a network, you will see a button to generate a deployment plan.\n5. Once the deployment plan is generated, you will see the list of contracts to be deployed - you can now connect your wallet and click \"Deploy\" to deploy your contracts.\n\n![deploy contracts](../images/deploy-contracts/d2.png)\n\nIf you find issues with your deployment process, you can reach out to us on the [#hiro-platform channel](https://stacks.chat) on Discord under the Hiro Developer Tools section or file an issue [here](https://hiro-pbc.canny.io/hiro-platform).\n","url":"/docs/stacks/platform/examples/deploy-contracts"},"47":{"id":"/docs/stacks/platform/examples/create-project","title":"Create a project","description":"Learn how to create or import a project in the Hiro Platform.","content":"\nimport { Code, Terminal } from \"lucide-react\"\nimport { SmallCard } from \"@/components/card\"\n\nimport { Callout } from \"@/components/callout\"\nimport { Card, Cards } from \"@/components/card\"\n\nThe Hiro Platform offers multiple ways to create projects, whether you're starting from scratch with a template or importing an existing repository. This guide will walk you through both approaches.\n\n## Using templates\n\nFrom the main projects page, click the \"Add a project\" button to begin creating a new project.\n\n![template selection](../images/create-project/c2.png)\n\nThe Platform provides 2 types of pre-built templates to help you get started quickly:\n\n1. App templates\n2. Contract-only templates\n\n**App templates** are feature rich templates pre-configured with a frontend and smart contracts.\n\n**Contract-only templates** are pre-configured with just that: a smart contract to help you start building.\n\nSimply select the template you want to get started with to open up a more detailed view of the app.\n\n![template selection](../images/create-project/c1.png)\n\nOnce you are ready, click the \"Clone\" button to copy the template to your GitHub account. From there, you will see instructions on how to clone the repository locally to start development.\n\n## Importing existing projects\n\nIf you have an existing project on GitHub, you can import it directly into the Hiro Platform:\n\n1. If you haven't already, authorize your GitHub account with the Hiro Platform\n2. You'll see a list of your repositories that can be imported\n3. Select the repository you want by clicking the \"Import\" button\n\n![import from github](../images/create-project/c3.png)\n\n<Callout type=\"info\">\nThe Platform requires specific Clarinet-generated files and a directory structure to import projects successfully. Your project should include:\n\n- `.clar` files containing your smart contracts\n- A `Clarinet.toml` configuration file\n- A specific directory structure with contracts in a `contracts` folder\n</Callout>\n\nOnce your project is ready, you will see instructions on next steps to get started.\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/platform/guides/deploy-contracts\"\n title=\"Deploy contracts\"\n description=\"Learn how to deploy your contracts to testnet and mainnet in the Hiro Platform.\"\n />\n <Card\n href=\"/stacks/platform/guides/devnet\"\n title=\"Running Devnet\"\n description=\"Learn how to use devnet to test your smart contracts in a local environment.\"\n />\n</Cards>\n","url":"/docs/stacks/platform/examples/create-project"},"48":{"id":"/docs/stacks/platform/examples/archive-project","title":"Archive a project","description":"Discover how to archive your projects in the Hiro Platform.","content":"\n## Archive a project\n\nSometimes, you may find it necessary to archive a project from your project list. It is important to understand that archiving a project is not the same as deleting a project. Archiving a project means you wish to move the project status from an active project to one that is not active and visible in your project list.\n\nFollow the steps below to archive a project:\n\n1. Sign in to the [Hiro Platform](https://platform.hiro.so/).\n2. Once you are authenticated, you will be redirected to the project page.\n3. From your list of projects, find the project you wish to archive.\n4. Click on the far-right three dots and select \"Archive.\" This will remove the project from the project list and place it into an archive folder.\n\n![Archive project](../images/archive-project/archive.png)\n\n## Unarchive a project\n\nFollow the steps below to unarchive a project:\n\n1. From the projects page in the Hiro Platform, select the \"Archive\" button at the top right. and select the far-right three dots and select \"Unarchive.\"\n2. You will now see a list of archived projects. Select three-dots on the far right and click \"Unarchive\" for any project you want to unarchive.\n3. You will now see any unarchived projects back in your project list.\n\n![Unarchive project](../images/archive-project/unarchive.png)\n\n<Callout title=\"Note\" type=\"info\">\n Deleting a project is not yet available in the BETA version.\n</Callout>\n","url":"/docs/stacks/platform/examples/archive-project"},"49":{"id":"/docs/stacks/platform/examples/faucet","title":"Request testnet STX","description":"Easily request testnet STX, so you can deploy and interact with Stacks testnet.","content":"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nThe Stacks Testnet Faucet is a dedicated utility for developers building on the Stacks blockchain. To aid you in deploying and running smart contracts on Stacks testnet, we've provided this faucet that offers easy access to testnet STX tokens.\n\n![Create Chainhook Window](../images/faucet/request.png)\n\n## Why use the Stacks Testnet Faucet?\n\nBuilding and testing on a blockchain requires a certain amount of native tokens to facilitate various operations, from contract deployments to transaction executions. However, sourcing these tokens can often be cumbersome. The Stacks Testnet Faucet simplifies this by offering a hassle-free way to acquire STX tokens for testing purposes.\n\n## How to request testnet STX\n\n1. **Visit the faucet page**: Navigate to [platform.hiro.so/faucet](https://platform.hiro.so/faucet).\n2. **Select the token**: Select which token you want, either STX or sBTC.\n3. **Request tokens**: You'll find a straightforward interface with a button to request tokens. Simply click on the button \"Receive x STX/sBTC.\"\n4. **Receive 500 STX tokens or 1 sBTC**: By clicking the button, you'll receive 500 STX tokens or 1 sBTC to your testnet account.\n\n## Frequently Asked Questions\n\n\n<Accordions>\n<Accordion title=\"What is a faucet?\">\nA faucet is an application that dispenses free tokens on a Testnet (a blockchain network used for development and testing). The Stacks faucet provides developers with free test tokens for deploying, testing, and optimizing smart contracts that leverage STX and sBTC.\n\n**It's important to remember that Testnet tokens have no real-world value and cannot be sold or used on the main Stacks network.**\n</Accordion>\n<Accordion title=\"How does the faucet work?\">\nSelect the type of test token you wish to receive and enter the wallet address where you want to receive them. The faucet will create a transaction on the Stacks Testnet that sends a small amount of test tokens to the provided address.\n\nIf you're curious, you can track the transaction's status using [Stacks Explorer](https://explorer.stacks.so/).\n</Accordion>\n<Accordion title=\"Is it secure?\">\nWe securely handle the wallet address you provide while processing your request. This data is not used or shared with any other Hiro services.\n</Accordion>\n<Accordion title=\"Is there a limit for the number of tokens I can request?\">\nYou can make up to 5 requests every 5 minutes. For more details, see our [rate limiting policies](/stacks/rate-limiting).\n</Accordion>\n<Accordion title=\"How long does it take for the Testnet tokens to arrive in my account?\">\nThe time for tokens to arrive to your wallet depends on how busy the network is. On average, it should take x amount of time. If the transaction seems stuck, feel free to reach out to us on our [support channel](https://stacks.chat/).\n</Accordion>\n</Accordions>\n\n<Callout type=\"info\">\n **Daily Limit**: To ensure fair distribution and availability for all\n developers, there's a limit of one request per day. Plan your testing\n accordingly!\n</Callout>{\" \"}\n","url":"/docs/stacks/platform/examples/faucet"},"50":{"id":"/docs/stacks/platform/examples/devnet","title":"Using devnet","description":"Test and validate your code using devnet's private blockchain environment.","content":"\nDevnet is a personal blockchain environment that lets you test and validate your contract code before deploying on a public network like testnet or mainnet. In this guide, you'll learn how to interact with devnet in the Hiro Platform to expedite your development.\n\n## What is devnet?\n\nDevnet is a private blockchain environment that lets you test and validate smart contracts quickly. Think of it as your personal sandbox: no one else can see your devnet instance, you don't have to worry about breaking it, and you can stop and restart it as many times as you need.\n\nWhile developers can run devnet locally using Clarinet, the Hiro Platform provides a hosted version that eliminates the need to manage blockchain nodes and miners on your machine. The Platform-hosted devnet still produces blocks and processes transactions, but offloads the computational overhead to our infrastructure while providing a more intuitive interface for development.\n\nDevnet provides a risk-free testing ground with the convenience of rapid prototyping, cost savings, and privacy.\n\n## Benefits of devnet on the Hiro Platform\n\nThe Platform-hosted devnet offers several advantages:\n\n- **Zero local setup**: No need to configure or maintain blockchain nodes locally\n- **Resource-efficient**: Offloads computational demands to our infrastructure\n- **Rapid prototyping**: Quick iterations with immediate feedback\n- **Cost-efficiency**: No real cryptocurrency expenses for testing\n- **Seamless local integration**: Connect your local development environment to the hosted devnet\n- **Isolated development**: A personal sandbox for confidential and secure testing\n\n## Using devnet in the Hiro Platform\n\nFirst, log into the [Hiro Platform](https://platform.hiro.so/). After [setting up your project](/stacks/platform/guides/create-project), navigate to the project page where you can select the \"Devnet\" tab to manage your devnet instance.\n\n## Starting and managing devnet\n\nIn your project page, you'll click on the \"Devnet\" tab to start and manage your devnet instance. Initially, it should read \"Inactive.\" Click on the \"Start Devnet\" button to start your private devnet instance.\n\n![Dashboard](../images/devnet/dev1.png)\n\n<Callout title=\"Programmatic API\">\n You can also start and stop devnet programmatically via the [Platform API](/stacks/platform-api/devnet).\n</Callout>\n\nIf you want to configure your devnet (like you can locally using `clarinet devnet start` in the terminal), open your project's `devnet.toml` file in the platform VS Code editor before you start devnet. From there, you can configure the settings to match your development needs.\n\nOnce you start devnet, it will take a few moments to spin up. The status indicator on the project dashboard will keep you updated on the progress.\n\n## Active session management\n\nWhen devnet is ready, the status will change to 'Active'.\n\nIf needed, you can restart devnet to refresh the timer. Keep in mind that only one devnet instance can run at a time per user account. If you need to work on a different project, simply start devnet within that project to seamlessly transition your session. There is also a monthly limit of 100 devnet sessions per account, so plan your development schedule accordingly.\n\n## Exploring the devnet dashboard\n\nThe Platform's devnet dashboard provides a comprehensive interface for monitoring and interacting with your private blockchain. You can:\n\n- Track real-time block production through the visual \"assembly line\"\n- Inspect block contents and transaction details\n- Search through blocks efficiently\n- Monitor contract deployments and function calls\n- Mint new blocks on demand\n\n![Devnet Dashboard](../images/devnet/dev2.png)\n\n## Additional devnet features\n\nOn the dashboard, you can also click the \"Interact with devnet\" button to call contract functions, make API requests, view devnet wallets, and more.\n\nFor more information on devnet features, [start here](https://www.hiro.so/blog/5-ways-to-interact-with-devnet-in-the-hiro-platform).\n","url":"/docs/stacks/platform/examples/devnet"},"51":{"id":"/docs/stacks/platform/examples/contract-monitoring","title":"Monitor contracts","description":"Learn how to monitor your contract with custom alerts after you deploy to mainnet.","content":"\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThis feature goes beyond just security—it's also a way to better understand how your contracts are being used. You can also set up alerts for various public functions in your smart contract to gain insight on which functions are receiving the most calls and how users are interacting with your contract.\n\n## Set up contract monitoring\n\n<Callout title=\"Note\">\n Make sure to have successfully deployed your contracts to the Stacks mainnet if you plan on setting up alert monitoring for your own contracts.\n</Callout>\n\nIf you have successfully deployed your contracts or want to set up alert monitoring for other contracts on mainnet, toggle to the Monitor tab after logging into the [Hiro Platform](https://platform.hiro.so).\n\n![Start monitoring](../images/contract-monitoring/start-monitoring.png)\n\n## Add contract for monitoring\n\nAfter clicking on the 'Add contract' button, a slideout modal will appear with fields for you to look up any smart contract on mainnet using the contract's principal and contract name. All contracts deployed to mainnet are public, and you can monitor and set up alerts for any of them, regardless of whether you are the deployer.\n\nAlternatively, you can also connect your wallet to view your deployment history and choose any contracts you’ve previously deployed in order to set up alerts for them.\n\n![Add contract](../images/contract-monitoring/add-contract.png)\n\nYour contract will then appear under Contract Monitoring. Once you are monitoring a particular contract, you can view its transaction history and any pending transactions in the mempool. Click on \"Create an alert\" to create a specific alert you want to monitor for. \n\n![Added contract](../images/contract-monitoring/added-contract.png)\n\n## Add custom alert\n\nYou can configure alerts for any contract calls on mainnet, whether that’s a `set-contract-owner` function, a transfer/mint/burn function, or anything else you’ve implemented that you want to monitor.\n\nOnce you identify the function calls you want to monitor, you can further hone in on the specific calls by creating filters for argument values and the address of the wallet which called the function. \n\nThe specific conditions you can choose to monitor for include:\n\n- When a particular function is called\n- When a particular function is called with a specified argument\n- When a particular function is called by a specified address\n\nYou can monitor these alerts in the Hiro Platform, and you can also choose to receive email alerts every time one of those alerts is triggered. Alternatively, you can configure webhook calls, which can be used for all kinds of customized alerting flows.\n\n![Create alert form](../images/contract-monitoring/create-alert-form.png)\n\n## Monitor your alerts\n\nWith each alert you set up, you can view the alert’s history and the response status from any webhook calls made. You also have the ability to edit existing alerts to change your alert conditions or notification preferences at any time.\n\n![View alerts page](../images/contract-monitoring/view-alerts-page.png)\n\n## What to expect from alerts\n\nIf you've specified an email as the notification type, alert notification emails will come from Hiro Platform `<platform@hiro.so>`.\n\nIf you've specified a webhook to send an alert to an API endpoint, then the alert payload will look like `sample-alert-payload.json` below.\n\n<Callout type=\"info\">\n Note that `tx_status` will always return a \"pending\" status for monitor alert notifications. This is because contract monitoring alerts will only send notifications when your custom notification alert on a particular function hits the mempool, but not when it gets confirmed in the blockchain.\n</Callout>\n\n<Tabs items={['Sample Alert Payload', 'Alert Payload Interface']}>\n <Tab value=\"Sample Alert Payload\">\n ```json sample-alert-payload.json\n {\n \"tx_id\": \"0xa7f511b3f379efef6fe71d0de57712ed13a89c5b6e24dd049eb2cc9a7c24fcb5\",\n \"nonce\": 5,\n \"fee_rate\": \"250\",\n \"sender_address\": \"SP2W9QYAHJNS7YTQY9EK2MSTQGX9E2NDMV766JP9Z\",\n \"sponsored\": false,\n \"post_condition_mode\": \"deny\",\n \"post_conditions\": [\n {\n \"type\": \"stx\",\n \"condition_code\": \"sent_equal_to\",\n \"amount\": \"3000000\",\n \"principal\": {\n \"type_id\": \"principal_standard\",\n \"address\": \"SP2W9QYAHJNS7YTQY9EK2MSTQGX9E2NDMV766JP9Z\"\n }\n }\n ],\n \"anchor_mode\": \"any\",\n \"tx_status\": \"pending\",\n \"receipt_time\": 1726104636,\n \"receipt_time_iso\": \"2024-09-12T01:30:36.000Z\",\n \"tx_type\": \"contract_call\",\n \"contract_call\": {\n \"contract_id\": \"SPHW0EJK5KPDMK03ZX792EMP0Q5J3A39ZMTVZZCY.sample-contract\",\n \"function_name\": \"donate\",\n \"function_signature\": \"(define-public (donate (amount uint)))\",\n \"function_args\": [\n {\n \"hex\": \"0x01000000000000000000000000002dc6c0\",\n \"repr\": \"u3000000\",\n \"name\": \"amount\",\n \"type\": \"uint\"\n }\n ]\n }\n }\n ```\n </Tab>\n <Tab value=\"Alert Payload Interface\">\n ```ts title=\"sample-alert-interface.ts\"\n interface Body {\n tx_id: string;\n nonce: number;\n fee_rate: string;\n sender_address: string;\n sponsored: boolean;\n post_condition_mode: string;\n post_conditions: Postcondition[];\n anchor_mode: string;\n tx_status: string;\n receipt_time: number;\n receipt_time_iso: string;\n tx_type: string;\n contract_call: Contractcall;\n }\n interface Contractcall {\n contract_id: string;\n function_name: string;\n function_signature: string;\n function_args: Functionarg[];\n }\n interface Functionarg {\n hex: string;\n repr: string;\n name: string;\n type: string;\n }\n interface Postcondition {\n type: string;\n condition_code: string;\n amount: string;\n principal: Principal;\n }\n interface Principal {\n type_id: string;\n address: string;\n }\n ```\n </Tab>\n</Tabs>","url":"/docs/stacks/platform/examples/contract-monitoring"},"52":{"id":"/docs/stacks/platform/examples/create-chainhooks","title":"Create a chainhook","description":"Create a chainhook using the Hiro Platform.","content":"\nWith Chainhook, you can automatically trigger an action in response to on-chain events on Stacks and Bitcoin, enabling you to use IFTTT (if_this, then_that) logic to power your applications. To learn more about Chainhook, refer to the [Chainhook overview](/stacks/chainhook).\n\n<Callout title=\"Programmatic API\">\n You can also create and manage chainhooks via the [Platform API](/stacks/platform-api/chainhooks).\n</Callout>\n\nTo get started in the Hiro Platform, login and toggle to the Chainhook page. There are two ways to create a chainhook. You can either create a chainhook from scratch using the platform UI, or you can upload chainhooks that you have already defined in JSON.\n\n![Create Chainhook Window](../images/chainhook/select-chainhook-tab.png)\n\nSelect the \"New Chainhook\" button.\n\n![Create Chainhook Window](../images/chainhook/create-chainhook-window.png)\n\nThis will open a panel on the right to create a chainhook. Use the following fields to create a Chainhook:\n\n**Name**: Input the name of your chainhook.\n\n**Chain**: Select which chain you want to build a chainhook for (Bitcoin or Stacks).\n\n**Network**: Choose which network the chainhook will observe.\n\n**If-this**: Based on the selected chain, you will see a list of available scopes for the `If-this` condition (also called a \"predicate\").\n\n<Callout title=\"Available Predicate Scopes\">\n -For Bitcoin, the available predicate options are `txid`,`outputs`, and\n `stacks_protocols`.\n \n -For Stacks, the available predicate options are\n `txid`, `block_height`, `fungible_token_event`, `non-fungible_token_event`,\n `stx_event`, `print_event`, and `contract_deployment`.\n\n_Refer to the [Bitcoin predicates](/stacks/chainhook/concepts/bitcoin-predicates) and [Stacks predicates](/stacks/chainhook/concepts/stacks-predicates) documents to understand the available predicates and how to use them._\n\n</Callout>\n\n**Then-that**: This action is defaulted to `http_post` to allow the chainhook to post events to the URL specified in the next field below.\n\n**URL**: Specify a URL to post chainhook events to the HTTP_post method.\n\n**Authorization Header**: This field is optional to add a Secret to the `authorization` header when posting payloads.\n\n**Start Block**: This field must specify the start block to search the chain.\n\n**End Block**: It is optional to specify the end block. However, to optimize your scan time, we recommended you specify this field.\n\n**Expire After Occurrence**: You can specify the chainhook to expire after a specific number of occurrences (a number greater than or equal to 1). You can leave this blank if you don't want to set any limit.\n\n**Decode Clarity Values**: This is enabled by default for Stacks predicates to help you decode Clarity values in your contract.\n\nYou'll also see the following options for Bitcoin chainhooks:\n\n**Include Proof**: Enable this option when you have evidence that the transaction or block has been verified and authorized by the sender using their private key. This proof is generally a cryptographic signature to a transaction or block on the Bitcoin blockchain.\n\n**Include Inputs**: Enable this option to include Bitcoin transaction inputs in the payload. In a Bitcoin transaction, inputs are references to previous transactions' outputs (also known as unspent transaction outputs or UTXOs) that are being spent in the current transaction. These inputs provide evidence that the sender has the right to spend the funds.\n\n**Include Outputs**: Enable this option to include Bitcoin transaction outputs in the payload. Including outputs in a Bitcoin transaction refers to specifying the destinations and amounts of Bitcoin being sent as part of a transaction. Outputs in a Bitcoin transaction represent the recipients' addresses and the corresponding amounts of Bitcoin they are receiving.\n\n**Include Witness**: Enable this option to include Bitcoin transaction witness in the payload. The witness data for a transaction includes the cryptographic signatures and other related information placed alongside the transaction data in the block.\n\nOnce you define all the required fields, you can select \"Create Chainhook\", and you can now see your created chainhook on the Chainhook page.\n\n![Chainhook created](../images/chainhook/created.png)\n\nThe `NAME`, `CHAIN`, `START BLOCK`, `NETWORK`, `STATUS`, and `LAST UPDATED` headers are updated based on the selected fields used to create a Chainhook.\n\nBased on the chosen network, the respective status columns in the Chainhook list page will be updated to \"Deployed.\"\n\nNote: there may be other fields in the UI to create a Chainhook based on the predicates defined above.\n\n## Upload a chainhook\n\nTo upload a chainhook, you can either select the \"Upload Chainhook\" button and choose the .json file that has the chainhook(s) you want to upload, or you can drag and drop the .json file into the file upload area.\n\n![Upload Chainhook](../images/chainhook/upload.png)\n\nThe upload file must be a .json file containing either a single json object representing a Chainhook predicate, or an array of json objects representing one or more Chainhook predicates.\n\nRefer to the [Bitcoin predicates](/stacks/chainhook/concepts/bitcoin-predicates) and [Stacks predicates](/stacks/chainhook/concepts/stacks-predicates) documents to understand the available predicates and how to prepare your Chainhook predicate JSON for upload.\n\n## Edit a chainhook\n\nOnce a chainhook is created, you can edit the chainhook by clicking the ellipse on the specific chainhook you want to edit.\n\n![Edit chainhook](../images/chainhook/edit-chainhook.png)\n\nUpdate the fields to reflect your desired changes and then select \"Update chainhook.\"\n\n## Duplicate a chainhook\n\nSelect the ellipse on the chainhook you want to duplicate and select \"Duplicate.\" This opens a right pane with all the fields populated to use to create a duplicate Chainhook.\n\nYou can update any fields or publish a direct copy by clicking \"Create Chainhook.\"\n\n## Delete a chainhook\n\nSelect the ellipse on the chainhook you wish to delete and select \"Delete.\" You will see a confirmation window to confirm if you want to delete the Chainhook.\n\n## Chainhook status\n\nThe Chainhook page has a `STATUS` column that displays whether your chainhooks are in an active, inactive, or error state. Active means the Chainhook is actively scanning blocks against its defined predicate, inactive means the Chainhook has reached a terminal state (e.g. its end block has been reached, and it is no longer scanning blocks), and error means the Chainhook ran into an error during its execution.\n\nMore status info can be found by hovering over the status element. For example, to understand why the Chainhook is in an error state, hover over the status element to find out.\n\n![Chainhook status](../images/chainhook/status-info.png)\n\n## References\n\n- [Use Chainhooks with Bitcoin](/stacks/chainhook/concepts/bitcoin-predicates)\n- [Use Chainhooks with Stacks](/stacks/chainhook/concepts/stacks-predicates)\n- [Run Chainhook as a service using Bitcoind](/stacks/chainhook/guides/chainhook-as-a-service)\n- [Run Chainhook as a service using Stacks](/stacks/chainhook/guides/chainhook-as-a-service-with-stacks-node)\n","url":"/docs/stacks/platform/examples/create-chainhooks"},"53":{"id":"/docs/stacks/platform/quickstart","title":"Quickstart","description":"Create and deploy your first app in the Hiro Platform.","content":"\nimport { Code, Terminal } from \"lucide-react\"\nimport { SmallCard } from \"@/components/card\"\n\nIn this quickstart guide, you will create a simple fundraising app using one of the app templates available. This app features a single page that displays a fundraising campaign, and functionality that handles campaign contributions, refunds, and withdrawal by the fundraiser.\n\n## Create your account\n\nStart by creating an account in the Hiro Platform. You can create an account with:\n\n- Email\n- Google\n- GitHub\n- Discord\n\n![Platform Login](./images/quickstart/q1.png)\n\nOnce signed in, you will see an onboarding screen showing all the Hiro Platform has to offer:\n\n![Platform Welcome Screen](./images/quickstart/q2.png)\n\n## Create your project\n\nIf you do not have any existing projects, you will be prompted to create one on the projects page. Click the \"Add a project\" button to get started.\n\n<Callout type=\"info\">\nIf you already have projects, you can find the \"Add a project\" button at the top right of the page.\n</Callout>\n\nFrom here, you have the option to choose from a set of templates or import an existing project from your GitHub account. For this quickstart, select the \"Fundraising App\" template, which is a starter project that comes equipped with both a frontend and smart contracts.\n\n![choose template](./images/quickstart/q5.png)\n\n<Callout type=\"info\">\nTo see a list of your repositories and import an existing project, you will first need to authorize with GitHub.\n</Callout>\n\n## Clone your project\n\nOnce you have selected your project, you will be presented with the full set of details for the project. From here, you can clone the project to your GitHub account by clicking the \"Clone\" button.\n\n![template details](./images/quickstart/q3.png)\n\n<Callout type=\"info\">\nYou will need to authorize with Github before being able to clone the project.\n</Callout>\n\nOnce the project is ready and available in your GitHub account, you will see instructions on how to clone the project to your local machine or develop in the browser via Github Codespaces.\n\n![template ready](./images/quickstart/q4.png)\n\nYou are now ready to start building!\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/platform/guides/deploy-contracts\"\n title=\"Deploy contracts\"\n description=\"Learn how to deploy your contracts to testnet and mainnet using deployment plans in the Hiro Platform.\"\n />\n <Card\n href=\"/stacks/platform/guides/devnet\"\n title=\"Running Devnet\"\n description=\"Learn how to use devnet, a private blockchain environment, to test and interact with your app.\"\n />\n <Card\n href=\"/stacks/platform/guides/create-chainhooks\"\n title=\"Create and manage Chainhooks\"\n description=\"Learn how to create custom event streams for Stacks or Bitcoin with Chainhook on the Platform.\"\n />\n</Cards>\n","url":"/docs/stacks/platform/quickstart"},"54":{"id":"/docs/stacks/token-metadata-api","title":"Overview","description":"Fetch data for any fungible, non-fungible, and semi-fungible token on Stacks.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nThe Token Metadata API is a service that offers a REST API, so you can easily pull any data you need for any token on Stacks that follows SIP standards. Every token, one request away.\n\n## Popular endpoints\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/token-metadata-api/tokens/fungible-token-metadata\"\n title=\"Get data for fungible tokens\"\n description=\"Retrieve data related to fungible tokens.\"\n />\n <SecondaryCard\n href=\"/stacks/token-metadata-api/tokens/non-fungible-token-metadata\"\n title=\"Get data for non-fungible tokens\"\n description=\"Retrieve data related to non-fungible tokens.\"\n />\n <SecondaryCard\n href=\"/stacks/token-metadata-api/tokens/semi-fungible-token-metadata\"\n title=\"Get data for semi-fungible tokens\"\n description=\"Retrieve data related to semi-fungible tokens.\"\n />\n</Cards>\n\n\n## Related tools\n\n- **[Hiro Archive](/stacks/archive)**: Bootstrap your own instance of the Token Metadata API with the Hiro Archive and save days of setup time.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch on-chain data from the Stacks blockchain.\n- **[Stacks Explorer](https://explorer.hiro.so)**: Looking for a simpler way to verify token data on the Stacks blockchain? Try the Stacks Explorer.\n- **[Ordinals API](/bitcoin/ordinals/api)**: Get data for Bitcoin ordinals and BRC-20 tokens.\n\n<br />\n\n<Callout title=\"Need help building with the Token Metadata API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#api</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n\n","url":"/docs/stacks/token-metadata-api"},"55":{"id":"/docs/stacks/token-metadata-api/architecture","title":"Architecture","description":"Understand the architecture of the Token Metadata API.","content":"\n## Service architecture\n\nThis section gives you an overview of external and internal architectural diagrams.\n\n## External architecture\n\nThe external architectural diagram shows how the Token metadata API is connected to three systems: a Stacks node, a Stacks Blockchain API database, and a Postgres database.\n\n![Architecture](../../../../public/images/token-metadata-api/architecture.svg)\n\n1. The Token Metadata API interacts with the Stacks Blockchain API database (referred to as a \"Local Metadata DB\" in the diagram above) to import all historical smart contracts when booting up and to listen for new contracts that may be deployed afterwards. Read-only access is recommended as this service will never need to write anything to this database.\n2. A Stacks node responds to all read-only contract calls required when fetching token metadata (calls to get token count, token metadata URIs, etc.).\n3. A local Postgres DB stores all processed metadata info.\n\nThe service needs to fetch external metadata files (JSONs, images) from the internet, so it must have access to external networks.\n\n## Internal architecture\n\nThe following is the internal architectural diagram of the Token Metadata API.\n\n![Flowchart](../../../../public/images/token-metadata-api/flowchart.svg)\n","url":"/docs/stacks/token-metadata-api/architecture"},"56":{"id":"/docs/stacks/token-metadata-api/info","title":"Info","description":"Retrieves information about the Token Metadata API, including the server version.","content":"","url":"/docs/stacks/token-metadata-api/info"},"57":{"id":"/docs/stacks/token-metadata-api/info/status","title":"Get status","description":"Retrieves information about the Token Metadata API, including the server version.","content":"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/token-metadata-api/info/status"},"58":{"id":"/docs/stacks/token-metadata-api/usage","title":"Usage","description":"Go over the multiple ways to make requests to the Token Metadata API.","content":"\n## Making requests\n\nTo make a request to the Stacks API, you can paste the `curl` command below in your terminal.\n\n```terminal\n$ curl -L 'https://api.hiro.so/metadata/v1/' -H 'Accept: application/json'\n```\n\nIf you are using an `api-key`, you will need to replace `$HIRO_API_KEY` with your secret API key.\n\n```terminal\n$ curl -L 'https://api.hiro.so/metadata/v1/' \\\n -H 'Accept: application/json' \\\n -H 'X-API-Key: $HIRO_API_KEY'\n```\n\nYou should get a response back that resembles the following:\n\n```json\n{\n \"server_version\": \"token-metadata-api v0.7.0 (master:1aa1603)\",\n \"status\": \"ready\",\n \"tokens\": {\n \"ft\": 1309,\n \"nft\": 545094,\n \"sft\": 121\n },\n \"token_contracts\": {\n \"sip-009\": 4791,\n \"sip-010\": 1309,\n \"sip-013\": 21\n },\n \"job_queue\": {\n \"done\": 443257,\n \"failed\": 108606\n }\n}\n```\n\n## Making requests using API Client\n\nWe also maintain a standalone API client that you can use to make requests to the Stacks API. This client is available as a package and can be installed with the following command:\n\n```package-install title=\"Terminal\"\n@hirosystems/token-metadata-api-client\n```\n\nExample usage:\n\n```ts\nimport { Configuration, TokensApi } from \"@hirosystems/token-metadata-api-client\";\n\nconst config: Configuration = {}\nconst api = new TokensApi(config);\nconst result = await api.getFtMetadata(\n 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2'\n);\n```\n\n{/* For more information on the API client, you can check out the [API Client documentation](/stacks/token-metadata-api/client). */}","url":"/docs/stacks/token-metadata-api/usage"},"59":{"id":"/docs/stacks/token-metadata-api/tokens","title":"Tokens","description":"Retrieves information about tokens on the Stacks blockchain.","content":"\n","url":"/docs/stacks/token-metadata-api/tokens"},"60":{"id":"/docs/stacks/token-metadata-api/tokens/fungible-token-metadata","title":"Get fungible token metadata","description":"Retrieves metadata for a SIP-010 fungible token.","content":"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/ft/{principal}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/token-metadata-api/tokens/fungible-token-metadata"},"61":{"id":"/docs/stacks/token-metadata-api/tokens/semi-fungible-token-metadata","title":"Get semi-fungible token metadata","description":"Retrieves information about semi-fungible tokens.","content":"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/sft/{principal}/{token_id}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/token-metadata-api/tokens/semi-fungible-token-metadata"},"62":{"id":"/docs/stacks/token-metadata-api/tokens/fungible-tokens","title":"Get fungible tokens","description":"Retrieves information about fungible tokens.","content":"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/ft', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/token-metadata-api/tokens/fungible-tokens"},"63":{"id":"/docs/stacks/token-metadata-api/tokens/non-fungible-token-metadata","title":"Get non-fungible token metadata","description":"Retrieves metadata for a SIP-009 non-fungible token.","content":"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/nft/{principal}/{token_id}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/token-metadata-api/tokens/non-fungible-token-metadata"},"64":{"id":"/docs/stacks/token-metadata-api/client","title":"Overview","description":"Interact with the Stacks blockchain using a Javascript client library.","content":"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```","url":"/docs/stacks/token-metadata-api/client"},"65":{"id":"/docs/stacks/token-metadata-api/client/quickstart","title":"Quickstart","description":"Create your first project in less than 2 minutes","content":"\nThe Usage section should focus on practical, hands-on instructions for getting started with the API. This includes:\nAuthentication: How to authenticate with the API (e.g., API keys, OAuth tokens).\nMaking Requests: Basic examples of making requests to the API, including request format, essential headers, and parameters.\nHandling Responses: Information on response structure, understanding status codes, and error handling.\nRate Limits: If applicable, explain any rate limits and best practices for avoiding them.\nThe goal of the \"Usage\" section is to equip developers with the knowledge to make successful API calls and handle responses effectively.\n\n## Using Websockets\n\nThe WebSocket components enable you to subscribe to specific updates, providing a near real-time display of updates on transactions and accounts.\n\n```ts\nimport { connectWebSocketClient } from '@stacks/blockchain-api-client';\nconst client = await connectWebSocketClient('ws://api.hiro.so/');\nconst sub = await client.subscribeAddressTransactions(contractCall.txId, event => {\n console.log(event);\n});\n\nawait sub.unsubscribe();\n```","url":"/docs/stacks/token-metadata-api/client/quickstart"},"66":{"id":"/docs/stacks/token-metadata-api/client/tokens","title":"Tokens","description":"Manage token metadata, including token IDs, token URIs, and token traits.","content":"","url":"/docs/stacks/token-metadata-api/client/tokens"},"67":{"id":"/docs/stacks/token-metadata-api/client/tokens/get-ft-metadata","title":"Get Fungible Token Metadata","description":"Retrieves a list of all assets events associated with an account or a Contract Identifier.","content":"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\n<Root>\n\n<API className='api my-3'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`getAccountAssets`</h2>\n\nThis API endpoint retrieves a comprehensive list of asset events associated with a specific account or Contract Identifier, including asset transfers and mints. It is essential for tracking asset movements and changes in ownership within the Stacks blockchain.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"principal\"} type={\"string\"}>\nThe account address or contract identifier whose asset events are to be retrieved.\n</Property>\n\n<Property required={false} deprecated={false} name={\"initOverrides\"} type={\"RequestInit\"}>\nOptional overrides for the request initialization settings.\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"get-assets\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"get-assets\" className='tab group'>\n <Badge className='badge transition-colors'>Retrieve Account Assets</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"get-assets\">\n ```tsx\n import { Configuration, AccountsApi } from '@stacks/blockchain-api-client';\n \n const apiConfig = new Configuration({\n basePath: 'https://api.testnet.hiro.so',\n });\n\n const accountsApi = new AccountsApi(apiConfig);\n const principal = 'ST000000000000000000002AMW42H';\n // Retrieve all asset events for the specified account or contract identifier\n const assets = await accountsApi.getAccountAssets({\n principal: principal,\n });\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n \n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='api my-3'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`UserSession`</h2>\n\nThe Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a UserSession to manage user data.\n\n## Functions\n\n<Property required={false} deprecated={false} name={\"isSignInPending\"} type={\"function\"}>\n\nDetermines if there is an incoming authentication response.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"handlePendingSignIn\"} type={\"function\"}>\n\nProcesses the response and provides a `userData` object containing the user's identity, BNS username and profile information.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"isUserSignedIn\"} type={\"function\"}>\n\nChecks if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"loadUserData\"} type={\"function\"}>\n\nRetrieves the user's profile data if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"encryptContent\"} type={\"function\"}>\n\nEncrypts user data for secure storage.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"decryptContent\"} type={\"function\"}>\n\nDecrypts user data for secure storage.\n\n</Property>\n\n</div>\n\n<APIExample>\n<Tabs defaultValue=\"pending\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"pending\" className='tab group'>\n <Badge className='badge transition-colors'>Handle incoming authentication response</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"status\" className='tab group'>\n <Badge className='badge transition-colors'>Check if a user is signed in</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"user-data\" className='tab group'>\n <Badge className='badge transition-colors'>Load data for signed in user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"sign-out\" className='tab group'>\n <Badge className='badge transition-colors'>Signing out a user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"encrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Encrypting user data</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"decrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Decrypting user data</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"pending\">\n ```tsx\n const isPending = userSession.isSignInPending();\n\n if (isPending) {\n userSession.handlePendingSignIn().then(userData => {\n // Do something with userData\n });\n }\n ```\n </TabsContent>\n <TabsContent value='status'>\n ```tsx\n const isSignedIn = userSession.isUserSignedIn();\n ```\n </TabsContent>\n <TabsContent value='user-data'>\n ```tsx\n const isSignedIn = userSession.isUserSignedIn();\n\n if (isSignedIn) {\n // Do something with the signed in user\n const userData = userSession.loadUserData();\n }\n ```\n </TabsContent>\n <TabsContent value='sign-out'>\n ```tsx\n function logout() {\n userSession.signUserOut();\n }\n ```\n </TabsContent>\n <TabsContent value='encrypt'>\n ```tsx\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n ```\n </TabsContent>\n <TabsContent value='decrypt'>\n ```tsx\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n const plainText = await userSession.decryptContent(cipherText);\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n\n<Accordion title={\"Notes\"}>\n Note that encryption here uses the user's private key associated with your app only. If you need to share this data with another app or other users, you should use the equivalent methods from `@stacks/encryption` and provide a custom private key.\n</Accordion>\n\n</Accordions>\n\n</APIExample>\n\n</API>\n\n</Root>","url":"/docs/stacks/token-metadata-api/client/tokens/get-ft-metadata"},"68":{"id":"/docs/stacks/hacks/archive/build-a-custom-api","title":"Build a custom blockchain API","description":"Learn how to build a custom API with Chainhook.","content":"\nimport { HackBadge } from \"@/components/badge\";\n\n<Callout title=\"Inactive\" type=\"warn\">\nThis hack has been archived. Feel free to continue to use the code in this guide as a reference for your own projects.\n</Callout>\n\n## Introduction\n\nIn the previous hacks, you built some pretty complex smart contracts. But building a robust UI/UX around these smart contracts and their on-chain data can be challenging due to the nature of blockchains.\n\nLet's take the [decentralized grants program](/stacks/hacks/build-a-decentralized-grants-program) hack as an example. In this project, anyone can propose a grant, and these proposals are voted on by token holders. The details of each proposal, including the title, description, and the proposal contract, are stored on the blockchain.\n\nHowever, directly querying the blockchain for this data every time you want to display it in your application's UI can be slow and inefficient. And that information might not always be formatted and organized in a way that makes sense for your use case.\n\nThis is where [Chainhook](/stacks/chainhook) comes in. Chainhook allows you to listen for specific on-chain events, such as the submission of a new grant proposal, and trigger actions in response - like inserting specific data into a database to query off-chain.\n\nIn this guide, you'll build a custom API with Chainhook using the [Hiro Platform](https://platform.hiro.so/), with a focus on integrating it with the contracts you built for the decentralized grants program hack.\n\n## Creating a server\n\nIn this section, we'll briefly discuss setting up an Express server to handle incoming event data from Chainhook. While a detailed walkthrough of setting up an Express server is beyond the scope of this guide, you can reference an example app [here](https://github.com/hirosystems/examples/tree/main/apps/chainhook).\n\nTo illustrate how to handle this event data, here is an example `server.ts` file:\n\n```typescript\nconst express = require(\"express\")\nconst app = express()\napp.use(express.json())\n\napp.post(\"/api/events\", (req, res) => {\n const events = req.body\n // Process the event data here\n res.status(200).send({ message: \"Event received\" })\n})\n\napp.listen(3000, () => {\n console.log(\"Server is running on port 3000\")\n})\n```\n\nIn this example, the server listens for POST requests at the `/api/events` route. When a request is received from your chainhook (which you will set up in the next section), you can extract the event data from the request body and process it.\n\n## Parsing the event data\n\nThe Chainhook payload comes with a lot of information, so let's break down some of the more important parts inside of the `req.body` for this guide.\n\nHere is a truncated look at the payload structure from Chainhook:\n\n```json\n{\n \"apply\": [\n {\n \"transactions\": [\n {\n \"metadata\": {\n \"receipt\": \"...\"\n },\n \"operations\": [\n {\n \"...\": \"...\"\n }\n ]\n }\n ]\n }\n ]\n}\n```\n\nEach item in the `apply` array should contain a `transactions` array. Each `transaction` object should have a `metadata` object with a `receipt` attribute and an `operations` array.\n\n- `transaction.metadata.receipt`: This attribute contains information about any events that were triggered from the function.\n- `transaction.operations`: This is an array that contains more specific information about what happened as a result of the function call. For instance if a _token transfer_ occured, each object inside this array would contain various attributes and information regarding the account, amount, type, and status of the token transfer.\n\nHere's what your POST route might look like after filtering for the relevant data in your `server.ts` file:\n\n```typescript\napp.post(\"/api/events\", async (req, res) => {\n const events = req.body\n // Loop through each item in the apply array\n events.apply.forEach((item: any) => {\n // Loop through each transaction in the item\n item.transactions.forEach((transaction: any) => {\n // If the transaction has operations, loop through them\n if (transaction.operations) {\n transaction.operations.forEach((operation: any) => {\n // Log the operation\n console.log({ operation })\n })\n }\n })\n })\n\n // Send a response back to Chainhook to acknowledge receipt of the event\n res.status(200).send({ message: \"Proposal added!\" })\n})\n```\n\nFor the next section, you will need to expose your local server via `https` so that Chainhook can deliver the `payload`. To do that, run the following command:\n\n```terminal\n$ npx localtunnel --port <your-port-number>\n```\n\n> _**Note**_\n>\n> There are several tools for exposing localhost to the world so choose the one you prefer. For more information on `localtunnel`, click [here](https://github.com/localtunnel/localtunnel).\n\n## Integrating with Chainhook\n\nIn this section, you will integrate Chainhook with your smart contracts. This involves creating a chainhook predicate that matches the specific on-chain events you want to respond to. For this process, you'll use the [Hiro Platform](https://platform.hiro.so/), which provides a user-friendly interface for creating and managing your chainhooks. By the end of this section, you'll have a chainhook set up and ready to trigger actions in response to on-chain events.\n\n## Deploying your contracts to testnet\n\nIn order to create your chainhook, you need to deploy your contracts to `testnet`. From your projects page, click on the Deploy button near the top right of your screen. You'll see your deployment options: choose \"Generate for Testnet.\"\n\n> _**Note**_\n>\n> The Platform will provide a step for requesting Testnet STX, but you can also go straight to the [Stacks Testnet Faucet](https://explorer.hiro.so/sandbox/faucet?chain=testnet). Once you have testnet STX tokens, you can deploy your contracts to testnet using the same methods you used for devnet, but with the network parameter set to testnet.\n\n## Creating a Chainhook\n\nNow it's time to create your first Chainhook. Start by creating a predicate that matches the `propose` function in your `proposal-submission` contract. This function is called when a new grant proposal is submitted.\n\nHere's an example of how you might define this `predicate.json` file for your contract:\n\n```json\n{\n \"chain\": \"stacks\",\n \"uuid\": \"1\",\n \"name\": \"New Grant Proposal\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"ST2BSV94A650WGZ2YZ5Y8HM93W01NGT4GY0MGJECG.proposal-submission\",\n \"method\": \"propose\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"<your-https-server-url>\",\n \"authorization_header\": \"Bearer 12345\"\n }\n },\n \"start_block\": 138339\n }\n }\n}\n```\n\n<Callout title=\"Note\" type=\"info\">\n Make sure to swap out the details in your `predicate.json` file to match your\n contracts ABI.\n</Callout>\n\nThe `if_this` section specifies the conditions for the events that this Chainhook will respond to. In this case, it's looking for calls to the `propose` method in the `proposal-submission` contract on the Stacks testnet.\n\nThe `then_that` section specifies what action the Chainhook should take when it detects an event that matches the `if_this` conditions. Here, it's set up to send a POST request to your specified URL with the event data.\n\nThe `start_block` field is used to specify the starting block for the Chainhook to start listening from. This is useful for ignoring blocks that were mined before the Chainhook was set up.\n\nOnce you have created a similar file for your specific contract. select the _Chainhooks_ tab inside your project and upload your predicate file using the _Upload Chainhook_ option. For more information, you can follow the [Create Chainhooks](/stacks/platform/guides/create-chainhooks) section.\n\n## Testing your chainhook\n\nOnce you've successfully uploaded your chainhook predicate, it's time to test it out. You can do this by performing an action that aligns with your `if_this` - `then_that` logic.\n\nFor instance, if your Chainhook is set up to respond to a specific contract call, you can trigger that call and then check your `/api/post` endpoint. If everything is set up correctly, you should see any information you've requested to be logged.\n\nThe next section presents several challenges that will help you put the finishing touches on your API. With the foundation you've built, you're well-equipped to take on these challenges and continue your journey in building robust, decentralized applications.\n\nCongratulations on reaching this point! You now have all the building blocks needed to create a custom API using Chainhook and integrate it with your smart contracts. This is a significant step towards enhancing the functionality and user experience of your decentralized applications.\n\n<Callout title=\"Note\" type=\"warn\">\n This is a crucial step in verifying that your Chainhook is working as\n expected. If you don't see the expected output, you may need to revisit your\n predicate and ensure it's correctly configured.\n</Callout>\n\n## Challenges\n\nThe following challenges are additional features you can implement to further explore building on Stacks. Feel free to add any other features you want.\n\n<HackBadge variant=\"starter\" />\n\n**Create more than 1 chainhook**: Don't stop at just 1! Follow the process above to create more than 1 chainhook for your dApp and parse the data accordingly.\n\n<HackBadge variant=\"intermediate\" />\n\n**Create consumer-facing API endpoints**: Up until now, we've shown you how to capture and process the initial `payload` data sent from a chainhook. However, to provide a robust user experience, you'll want to do more than just output raw data. The challenge here is to create additional API endpoints that present the filtered and extracted data from the initial `/api/events` payload in a consumer-friendly format. This could involve adding a database layer for organizing the data, adding additional context, or transforming the data to match the needs of your application's frontend. For a quick db setup, you can try using something like [Supabase](https://supabase.com/docs/guides/getting-started/quickstarts/reactjs).\n\n```typescript\n// Example using Supabase\n\nconst supabase = createClient(\n \"https://<project>.supabase.co\",\n \"<your-anon-key>\"\n)\n\napp.post(\"/api/events\", async (req, res) => {\n // ...\n\n item.transactions.forEach((transaction: any) => {\n if (transaction.operations) {\n transaction.operations.forEach((operation: any) => {\n const data = operation // Parse out the data you want\n // Insert and save it to db\n const { error } = await supabase.from(\"proposals\").insert(data)\n })\n }\n })\n\n // ...\n})\n```\n\n<HackBadge variant=\"advanced\" />\n\n**UI integration**: The final challenge is to integrate your consumer-facing API into your frontend. This involves taking the data you've processed and organized in your API and displaying it in a meaningful and user-friendly way in your application. This could involve creating dynamic components that update in response to new data, adding interactive elements that allow users to explore the data, or incorporating visualizations to help users understand the data.\n","url":"/docs/stacks/hacks/archive/build-a-custom-api"},"69":{"id":"/docs/stacks/hacks/archive/build-a-decentralized-grants-program","title":"Build a decentralized grants program","description":"Learn how to build a decentralized grants program with governance, submissions, and voting.","content":"\nimport { HackBadge } from \"@/components/badge\";\n\n<Callout title=\"Inactive\" type=\"warn\">\nThis hack has been archived. Feel free to continue to use the code in this guide as a reference for your own projects.\n</Callout>\n\n## Introduction\n\nWelcome to a world where funding for innovative projects is fluid and controlled by a community of token holders, not just a select few. This is the value proposition of a decentralized grants program. In this guide, you will build such a program using the [ExecutorDAO](https://github.com/MarvinJanssen/executor-dao) protocol on the Stacks blockchain.\n\nKey features of this project include:\n\n**Decentralized Governance**: Anyone holding a `membership-token` can vote on grant proposals.\n\n**Open Proposal Submission**: Anyone can propose a grant, encouraging a wide range of ideas and projects.\n\n**Smart Contract Automation**: All aspects of the grants program, from proposal submission to voting and fund distribution, are automated through smart contracts, ensuring transparency and tamper-proof processes.\n\nThis Hack walks you through the basics of building a decentralized grants program. Over the course of this hack, you will deploy your own functioning grants program.\n\nThere are also optional challenges at the end to further stretch your skills.\n\nNow it's time to hack. First, we'll cover the basics of the core functionalities of our grants program and look at 4 contracts. Let's dive in.\n\n## Understanding the ExecutorDAO protocol\n\nExecutorDAO is a powerful and flexible protocol that allows for the creation of decentralized autonomous organizations (DAOs) with a high degree of modularity and customization. ExecutorDAO operates on three core tenets:\n\n**Proposals are smart contracts**:\nProposals in ExecutorDAO are expressed as smart contracts, allowing for precise, logical descriptions of the operations, duties, and members of the DAO. In our case, each grant application is a proposal expressed as a smart contract.\n\n**The core executes, the extensions give form**:\nExecutorDAO starts with a single core contract whose sole purpose is to execute proposals and keep a list of authorized `extensions`. Extensions are contracts that can be enabled or disabled by proposals and add specific features to the DAO - like _proposing grants_, _voting on grants_, _distributing funds_, and more.\n\n**Ownership control happens via sending context**:\nExecutorDAO follows a single-address ownership model. The core contract is the de facto owner of external ownable contracts. This allows any proposal or extension to act upon it, like the `membership-token` we will build out in the sections below.\n\nFor more details, you can [view the standard contracts](https://github.com/MarvinJanssen/executor-dao/tree/main/contracts) in the ExecutorDAO repository.\n\n## Clone the starter template\n\nStart by setting up your development environment. We've prepared a repository that includes an initialized Clarinet project and a React frontend with some boilerplate code and all the required packages.\n\nTo clone the repository, open your terminal and run the following command:\n\n```terminal\n$ git clone https://github.com/hirosystems/hiro-hacks-template.git\n$ cd hiro-hacks-template\n```\n\n## Establishing your core contract\n\nBefore creating your core contract, you need to create `trait` contracts that you'll be implementing for your grants program.\n\nTraits in Clarity define a set of functions that a contract must implement. In this case, any contract that wants to be a `proposal` or an `extension` must implement the functions defined in the `proposal-trait` and `extension-trait` respectively.\n\nIn your project's directory, run the following command:\n\n```terminal\n$ clarinet contract new extension-trait && clarinet contract new proposal-trait\n```\n\nNow in your contracts, respectively, add the following code:\n\n```clarity extension-trait.clar\n(define-trait extension-trait\n (\n (callback (principal (buff 34)) (response bool uint))\n )\n)\n```\n\n```clarity proposal-trait.clar\n(define-trait proposal-trait\n (\n (execute (principal) (response bool uint))\n )\n)\n```\n\nNow that you've defined how your set of functions must be implemented, you can begin to create your core contract. First run the following command:\n\n```terminal\n$ clarinet contract new core\n```\n\nThis will create a new contract in the `contracts` directory called `core.clar`.\n\nInside your `core.clar` contract, add the two trait contracts you've just created from the steps above:\n\n```clarity core.clar\n(use-trait proposal-trait .proposal-trait.proposal-trait)\n(use-trait extension-trait .extension-trait.extension-trait)\n```\n\n## Error handling and state management\n\nNext, you need to define some basic error handling and variables for managing your contracts:\n\n```clarity core.clar\n(define-constant ERR_UNAUTHORIZED (err u1000))\n(define-constant ERR_ALREADY_EXECUTED (err u1001))\n(define-constant ERR_INVALID_EXTENSION (err u1002))\n\n(define-data-var executive principal tx-sender)\n(define-map executedProposals principal uint)\n(define-map extensions principal bool)\n```\n\nThese constants represent error codes that the contract can return. The variables store the executive principal (the owner of the grants program), a map of executed proposals, and a map of authorized extensions.\n\n## Authorization check\n\nThe `is-self-or-extension` function is a private function that checks if the caller of a function is the contract itself or an authorized extension:\n\n```clarity core.clar\n(define-private (is-self-or-extension)\n (ok (asserts! (or (is-eq tx-sender (as-contract tx-sender)) (is-extension contract-caller)) ERR_UNAUTHORIZED))\n)\n\n(define-read-only (is-extension (extension principal))\n (default-to false (map-get? extensions extension))\n)\n\n(define-read-only (executed-at (proposal <proposal-trait>))\n (map-get? executedProposals (contract-of proposal))\n)\n```\n\n## Extension management\n\nHere's a function to enable or disable an extension (`set-extension`):\n\n```clarity core.clar\n(define-public (set-extension (extension principal) (enabled bool))\n (begin\n (try! (is-self-or-extension))\n (print {event: \"extension\", extension: extension, enabled: enabled})\n (ok (map-set extensions extension enabled))\n )\n)\n```\n\n## Proposal execution\n\nThe `execute` function allows for the execution of a proposal:\n\n```clarity core.clar\n(define-public (execute (proposal <proposal-trait>) (sender principal))\n (begin\n (try! (is-self-or-extension))\n (asserts! (map-insert executedProposals (contract-of proposal) block-height) ERR_ALREADY_EXECUTED)\n (print {event: \"execute\", proposal: proposal})\n (as-contract (contract-call? proposal execute sender))\n )\n)\n```\n\nThis function checks if the caller is authorized, inserts the proposal into the `executedProposals` map, and then calls the `execute` function of the proposal contract.\n\n## Bootstrap\n\nThe `construct` function is used to bootstrap the grants program:\n\n```clarity core.clar\n(define-public (construct (proposal <proposal-trait>))\n (let\n (\n (sender tx-sender)\n )\n (asserts! (is-eq sender (var-get executive)) ERR_UNAUTHORIZED)\n (var-set executive (as-contract tx-sender))\n (as-contract (execute proposal sender))\n )\n)\n```\n\nThis function checks if the caller is the executive, sets the executive to the contract itself, and then executes the provided proposal.\n\n## Extension requests\n\nThe request-extension-callback function allows an extension to request a callback:\n\n```clarity core.clar\n(define-public (request-extension-callback (extension <extension-trait>) (memo (buff 34)))\n (let\n (\n (sender tx-sender)\n )\n (asserts! (is-extension contract-caller) ERR_INVALID_EXTENSION)\n (asserts! (is-eq contract-caller (contract-of extension)) ERR_INVALID_EXTENSION)\n (as-contract (contract-call? extension callback sender memo))\n )\n)\n```\n\nThis function checks if the caller is an authorized extension and then calls the `callback` function of the extension contract.\n\nThese are the key components of the ExecutorDAO core contract. Understanding these will help you in building your own extensions and proposals.\n\n## Create your membership token\n\nIn this section, you will create your first `extension`, a non-transferable membership token, which will be used to grant voting rights on proposals. The token will be initially distributed to certain addresses during the bootstrapping process. However, new minting (distribution) and burning (removal) of tokens can be managed through proposals.\n\nTo create your membership token, navigate to your project's directory and run the following command:\n\n```terminal\n$ clarinet contract new membership-token\n```\n\nThis will create a new contract in the contracts directory called `membership-token.clar`.\n\nLet's walk through the key components of this contract.\n\n## Constants and variables\n\nThe contract defines some constants and variables:\n\n```clarity membership-token.clar\n(define-constant ERR_UNAUTHORIZED (err u2000))\n(define-constant ERR_NOT_TOKEN_OWNER (err u2001))\n(define-constant ERR_MEMBERSHIP_LIMIT_REACHED (err u2002))\n\n(define-fungible-token sGrant)\n\n(define-data-var tokenName (string-ascii 32) \"sGrant\")\n(define-data-var tokenSymbol (string-ascii 10) \"SGT\")\n(define-data-var tokenUri (optional (string-utf8 256)) none)\n(define-data-var tokenDecimals uint u6)\n```\n\nThese constants represent error codes that the contract can return. The variables store the token name, symbol, URI, and decimals. The define-fungible-token function is used to define our sGrant token.\n\n## Authorization check\n\nThe `is-dao-or-extension`, function is a private function that checks if the caller of a function is the core contract itself or an authorized extension:\n\n```clarity membership-token.clar\n(define-public (is-dao-or-extension)\n (ok (asserts! (or (is-eq tx-sender .core) (contract-call? .core is-extension contract-caller)) ERR_UNAUTHORIZED))\n)\n```\n\nThis function will allow you to distribute (or burn) tokens to new members, granting them the ability to vote on future grant proposals.\n\n## Token minting and burning\n\nThe contract provides functions to `mint` and `burn` tokens:\n\n```clarity membership-token.clar\n(define-public (mint (amount uint) (recipient principal))\n (begin\n (try! (is-dao-or-extension))\n (ft-mint? sGrant amount recipient)\n )\n)\n\n(define-public (burn (amount uint) (owner principal))\n (begin\n (try! (is-dao-or-extension))\n (ft-burn? sGrant amount owner)\n )\n)\n```\n\nThese functions check if the caller is authorized and then mint or burn the specified amount of sGrant tokens. And as you can see, these functions must be executed either through an approved grant proposal or an enabled `extension` (more on this later).\n\n## Token information\n\nThe contract provides functions to get the token's name (`get-name`), symbol (`get-symbol`), decimals (`get-decimals`), balance (`get-balance`), total supply (`get-total-supply`), and URI (`get-token-uri`):\n\n```clarity membership-token.clar\n(define-read-only (get-name)\n (ok (var-get tokenName))\n)\n\n(define-read-only (get-symbol)\n (ok (var-get tokenSymbol))\n)\n\n(define-read-only (get-decimals)\n (ok (var-get tokenDecimals))\n)\n\n(define-read-only (get-balance (who principal))\n (ok (ft-get-balance sGrant who))\n)\n\n(define-read-only (get-total-supply)\n (ok (ft-get-supply sGrant))\n)\n\n(define-read-only (get-token-uri)\n (ok (var-get tokenUri))\n)\n```\n\nThese functions return the corresponding information about the `sGrant` token.\n\nThese are the key components of the `sGrant` token contract. Understanding these will help you in managing the distribution and burning of tokens through proposals.\n\n## Proposal submission contract (extension)\n\nIn this section, you will create your second `extension`, a proposal submission contract. This contract will allow anyone to propose a grant, which will then be voted on by the token holders.\n\nTo create your proposal submission contract, navigate to your project's directory and run the following command:\n\n```terminal\n$ clarinet contract new proposal-submission\n```\n\nThis will create a new contract in the contracts directory called proposal-submission.clar.\n\nLet's walk through the key components of this contract.\n\n## Traits and constants\n\nFirst, you need to implement the `extension-trait` and use the `proposal-trait`:\n\n```clarity proposal-submission.clar\n(impl-trait .extension-trait.extension-trait)\n(use-trait proposal-trait .proposal-trait.proposal-trait)\n```\n\nNext, define some constants that represent error codes:\n\n```clarity proposal-submission.clar\n(define-constant ERR_UNAUTHORIZED (err u3000))\n(define-constant ERR_UNKNOWN_PARAMETER (err u3001))\n```\n\n## Variables\n\nFirst, define a map to store the parameters of your contract:\n\n```clarity proposal-submission.clar\n(define-map parameters (string-ascii 34) uint)\n```\n\nSet the proposal-duration parameter to a default value. This value represents the duration of a proposal in blocks. For example, if a block is mined approximately every 10 minutes, a proposal-duration of 1440 would be approximately 10 days.\n\n```clarity proposal-submission.clar\n(map-set parameters \"proposal-duration\" u1440) ;; ~10 days based on a ~10 minute block time.\n```\n\n## Authorization check\n\nThe `is-dao-or-extension` function is a private function that checks if the caller of a function is the core contract itself or an authorized extension:\n\n```clarity proposal-submission.clar\n(define-public (is-dao-or-extension)\n (ok (asserts! (or (is-eq tx-sender .core) (contract-call? .core is-extension contract-caller)) ERR_UNAUTHORIZED))\n)\n```\n\n## Parameters\n\nThe get-parameter function is a read-only function that returns the value of a parameter:\n\n```clarity proposal-submission.clar\n(define-read-only (get-parameter (parameter (string-ascii 34)))\n (ok (unwrap! (map-get? parameters parameter) ERR_UNKNOWN_PARAMETER))\n)\n```\n\n## Proposals\n\nThe propose function allows anyone to propose a grant:\n\n```clarity proposal-submission.clar\n(define-public (propose (proposal <proposal-trait>) (title (string-ascii 50)) (description (string-utf8 500)))\n (begin\n (contract-call? .proposal-voting add-proposal\n proposal\n {\n end-block-height: (+ block-height (try! (get-parameter \"proposal-duration\"))),\n proposer: tx-sender,\n title: title,\n description: description\n }\n )\n )\n)\n```\n\nThis function calls the add-proposal function of the proposal-voting contract, passing the proposal contract, the current block height as the start block height, the current block height plus the proposal-duration as the end block height, the sender as the proposer, and the title and description of the proposal.\n\n## Extension callback\n\nThe callback function allows the core contract to request a callback:\n\n```clarity proposal-submission.clar\n(define-public (callback (sender principal) (memo (buff 34)))\n (ok true)\n)\n```\n\nThese are the key components of the proposal submission contract. Understanding these will help you in managing the submission of proposals.\n\n## Proposal voting contract (extension)\n\nIn this section, you will create your third extension, a proposal voting contract. This contract will allow token holders to vote on the proposed grants.\n\nTo create your proposal voting contract, navigate to your project's directory and run the following command:\n\n```terminal\n$ clarinet contract new proposal-voting\n```\n\nThis will create a new contract in the contracts directory called proposal-voting.clar.\n\nLet's walk through the key components of this contract.\n\n## Traits and constants\n\nFirst, you need to implement the extension-trait and use the proposal-trait:\n\n```clarity proposal-voting.clar\n(impl-trait .extension-trait.extension-trait)\n(use-trait proposal-trait .proposal-trait.proposal-trait)\n```\n\nNext, define some constants that represent error codes:\n\n```clarity proposal-voting.clar\n(define-constant ERR_UNAUTHORIZED (err u3000))\n(define-constant ERR_PROPOSAL_ALREADY_EXECUTED (err u3002))\n(define-constant ERR_PROPOSAL_ALREADY_EXISTS (err u3003))\n(define-constant ERR_UNKNOWN_PROPOSAL (err u3004))\n(define-constant ERR_PROPOSAL_ALREADY_CONCLUDED (err u3005))\n(define-constant ERR_PROPOSAL_INACTIVE (err u3006))\n(define-constant ERR_PROPOSAL_NOT_CONCLUDED (err u3007))\n(define-constant ERR_NO_VOTES_TO_RETURN (err u3008))\n(define-constant ERR_END_BLOCK_HEIGHT_NOT_REACHED (err u3009))\n(define-constant ERR_DISABLED (err u3010))\n```\n\n## Variables\n\nYou need to define a map to store the proposals and another map to store the total votes of each member:\n\n```clarity proposal-voting.clar\n(define-map proposals\n principal\n {\n votes-for: uint,\n votes-against: uint,\n end-block-height: uint,\n concluded: bool,\n passed: bool,\n proposer: principal,\n title: (string-ascii 50),\n description: (string-utf8 500)\n }\n)\n\n(define-map member-total-votes {proposal: principal, voter: principal} uint)\n```\n\n## Authorization check\n\nThe `is-dao-or-extension` function is a private function that checks if the caller of a function is the core contract itself or an authorized extension:\n\n```clarity proposal-voting.clar\n(define-public (is-dao-or-extension)\n (ok (asserts! (or (is-eq tx-sender .core) (contract-call? .core is-extension contract-caller)) ERR_UNAUTHORIZED))\n)\n```\n\n## Proposals\n\nThe add-proposal function allows the core contract or an authorized extension to add a new proposal:\n\n```clarity proposal-voting.clar\n(define-public (add-proposal (proposal <proposal-trait>) (data {end-block-height: uint, proposer: principal, title: (string-ascii 50), description: (string-utf8 500)}))\n (begin\n (try! (is-dao-or-extension))\n (asserts! (is-none (contract-call? .core executed-at proposal)) ERR_PROPOSAL_ALREADY_EXECUTED)\n (print {event: \"propose\", proposal: proposal, proposer: tx-sender})\n (ok (asserts! (map-insert proposals (contract-of proposal) (merge {votes-for: u0, votes-against: u0, concluded: false, passed: false} data)) ERR_PROPOSAL_ALREADY_EXISTS))\n )\n)\n```\n\n## Votes\n\nThe vote function allows a token holder to vote on a proposal. It checks if the voter has at least 1 membership-token:\n\n```clarity proposal-voting.clar\n(define-public (vote (amount uint) (for bool) (proposal principal))\n (let\n (\n (proposal-data (unwrap! (map-get? proposals proposal) ERR_UNKNOWN_PROPOSAL))\n )\n (asserts! (>= (unwrap-panic (contract-call? .membership-token get-balance tx-sender)) u1) ERR_UNAUTHORIZED)\n (map-set member-total-votes {proposal: proposal, voter: tx-sender}\n (+ (get-current-total-votes proposal tx-sender) amount)\n )\n (map-set proposals proposal\n (if for\n (merge proposal-data {votes-for: (+ (get votes-for proposal-data) amount)})\n (merge proposal-data {votes-against: (+ (get votes-against proposal-data) amount)})\n )\n )\n (ok (print {event: \"vote\", proposal: proposal, voter: tx-sender, for: for, amount: amount}))\n )\n)\n\n(define-read-only (get-current-total-votes (proposal principal) (voter principal))\n (default-to u0 (map-get? member-total-votes {proposal: proposal, voter: voter}))\n)\n```\n\n## Conclusion\n\nThe `conclude` function allows the core contract or an authorized extension to conclude a proposal:\n\n```clarity proposal-voting.clar\n(define-public (conclude (proposal <proposal-trait>))\n (let\n (\n (proposal-data (unwrap! (map-get? proposals (contract-of proposal)) ERR_UNKNOWN_PROPOSAL))\n (passed (> (get votes-for proposal-data) (get votes-against proposal-data)))\n )\n (asserts! (not (get concluded proposal-data)) ERR_PROPOSAL_ALREADY_CONCLUDED)\n (asserts! (>= block-height (get end-block-height proposal-data)) ERR_END_BLOCK_HEIGHT_NOT_REACHED)\n (map-set proposals (contract-of proposal) (merge proposal-data {concluded: true, passed: passed}))\n (print {event: \"conclude\", proposal: proposal, passed: passed})\n (and passed (try! (contract-call? .core execute proposal tx-sender)))\n (ok passed)\n )\n)\n```\n\nThis function concludes a proposal. It first retrieves the proposal data and checks if the proposal has more votes for than against. It then asserts that the proposal has not already been concluded and that the current block height is greater than or equal to the end block height of the proposal. If these conditions are met, it sets the concluded and passed fields of the proposal data and prints an event. If the proposal passed, it also tries to execute the proposal. The function returns whether the proposal passed.\n\n## Extension callback\n\nThe callback function allows the core contract to request a callback:\n\n```clarity proposal-voting.clar\n(define-public (callback (sender principal) (memo (buff 34)))\n (ok true)\n)\n```\n\nCongratulations! You've successfully created the foundations for a decentralized grants program!\n\n## Challenges\n\nThe following challenges are additional features you can implement to continue building and sharpening your skills.\n\n<HackBadge variant=\"starter\" />\n\n**Initialize your grants program**: Now that you have your core extension contracts, you can initialize the project. The way you do this is through the `construct` function you wrote inside your `core.clar` contract. Create your first proposal enabling your extensions (`membership-token`, `proposal-submission`, `proposal-voting`) and distribute the initial token allocation to addresses responsible for voting on grants. If you need a little more guidance, check out the example [here](https://github.com/MarvinJanssen/executor-dao/blob/main/contracts/proposals/edp000-bootstrap.clar).\n\n<HackBadge variant=\"starter\" />\n\n**Create grant proposals**: After initializing your grants program, the next step is to create grant proposals. This involves using the `propose` function in the `proposal-submission` contract. This function allows anyone to propose a grant, which will then be voted on by the token holders. The proposal includes details such as the title, description, and the proposal contract. Once a proposal is submitted, it can be voted on during the voting period defined by the `proposal-duration` parameter.\n\n<HackBadge variant=\"intermediate\" />\n\n**Implement milestone-based funding**: To implement milestone-based funding, you'll need to create a new extension contract that tracks the progress of each grant proposal. This extension will manage the milestones for each grant, allowing funds to be released as each milestone is achieved. To enable this extension, you'll need to create a proposal using the propose function in the `proposal-submission` contract. Once enabled, the milestone-based funding extension will provide a more structured and accountable way to distribute funds, ensuring that the grant recipients are making progress before they receive their next round of funding.\n\n<HackBadge variant=\"advanced\" />\n\n**UI integration**: Using the provided starter template, integrate your contracts using Stacks.js. This will allow users to submit proposals, vote on them, and view the status of their proposals directly from the UI.\n\n```tsx\nimport { callReadOnlyFunction, standardPrincipalCV } from \"@stacks/transactions\"\n\nconst senderAddress = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\nconst contractAddress = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\nconst contractName = \"core\"\nconst functionName = \"is-extension\"\nconst extensionAddress =\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.membership-token\"\n\nconst functionArgs = [standardPrincipalCV(extensionAddress)]\n\nawait callReadOnlyFunction({\n network,\n contractAddress,\n contractName,\n functionName,\n functionArgs,\n senderAddress\n})\n```\n","url":"/docs/stacks/hacks/archive/build-a-decentralized-grants-program"},"70":{"id":"/docs/stacks/hacks/archive/ai","title":"AI x Stacks","description":"Build something that combines AI capabilities with Stacks.","content":"\n## January: AI x Stacks\n\n*Build something that combines AI capabilities with Stacks blockchain technology*\n\n**Timeline**: January 22-28, 2025\n\nThis month's challenge invites you to explore the intersection of artificial intelligence and blockchain technology. Create innovative solutions that leverage both AI capabilities and the Stacks blockchain.\n\nSubmit your project [here](https://hirohacks25.paperform.co/).\n\n<iframe width=\"770\" height=\"315\" src=\"https://www.youtube.com/embed/GiKRSAMQNqo?si=EQ74OTyTsOzcPIK-\" title=\"YouTube video player\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerPolicy=\"strict-origin-when-cross-origin\" allowFullScreen></iframe>\n\n## Example project ideas\n\n### 1. AI Contract Analyzer\n- Build a tool that uses LLMs to audit and explain [Clarity contracts](/stacks/clarity)\n- Help developers understand and improve their smart contracts through AI-powered analysis\n- Provide suggestions for security improvements and optimizations\n\n### 2. Smart Wallet Assistant \n- Create an AI-powered [wallet](/stacks/stacks.js) that helps users make informed decisions\n- Analyze transaction history and provide personalized insights\n- Offer predictive analytics and spending recommendations\n\n### 3. Chain Detective\n- Develop an AI tool that analyzes on-chain data to discover interesting patterns\n- Use [Chainhook](/stacks/chainhook) to stream and analyze blockchain events in real-time\n- Generate visualizations and reports of blockchain activity\n\n_Review the [submission guidelines](/stacks/hacks/#rules) for project requirements and join the [Stacks Discord](https://stacks.chat) to connect with other builders._\n\n---\n\n## Resources\n\n- [Clarity Codex](https://github.com/leahjlou/clarity-codex/)\n- [Stacks Discord](https://stacks.chat)","url":"/docs/stacks/hacks/archive/ai"},"71":{"id":"/docs/stacks/hacks/archive/build-a-friend-tech-clone","title":"Build a Friend.tech clone","description":"Learn how to build a decentralized social network.","content":"\nimport { HackBadge } from \"@/components/badge\";\n\n<Callout title=\"Inactive\" type=\"warn\">\nThis hack has been archived. Feel free to continue to use the code in this guide as a reference for your own projects.\n</Callout>\n\n## Introduction\n\nWhat if we could gamify—and reward—being a friend? That's the idea behind Friend.tech, the decentralized social network that took Web3 by storm. In this hack, you'll recreate Friend.tech on the Stacks blockchain.\n\nThere are a few key components to this hack: namely, **subjects** that have **keys** that anyone can buy. These keys start off low in price, but as people buy more keys, the price goes up faster and faster, rewarding friends who bought keys early. Key owners can sell their keys for a profit, or they can hold on to them to signal their friendship and build reputation. These keys can also be used to access exclusive chatrooms with their corresponding subject, receive exclusive airdrops, and more\n\nThis Hack walks you through the basics of building a Friend.tech clone. There are also challenges at the end, which are opportunities to stretch your skills and keep learning.\n\n## Clone the starter template\n\nStart by setting up your development environment. We've prepared a repository that includes an initialized Clarinet project and a React frontend with some boilerplate code and all the required packages.\n\nTo clone the repository, open your terminal and run the following command:\n\n```terminal\n$ git clone https://github.com/hirosystems/hiro-hacks-template.git\n$ cd hiro-hacks-template\n```\n\n## Create your contract\n\nBefore you begin, we're assuming that you have `clarinet` installed and a basic understanding of how to use it. If you haven't installed `clarinet` yet, you can do so by referring to our [installation guide](/stacks/clarinet/installation).\n\nTo create your contract, navigate to your project's directory and run the following command:\n\n```terminal\n$ clarinet contract new keys\n```\n\nThis will create a new contract in the `contracts` directory called `keys.clar`.\n\n<Callout type=\"info\">\n If you don't want to clone the provided starter template, you can create your\n `Clarinet` project manually by running `clarinet new friendtech && cd\n friendtech`.\n</Callout>\n\n## Defining `key` balances and supply\n\nInside your `keys.clar` contract, you need to keep track of the balance of `keys` for each user (or _holder_) and the total supply of `keys` for each subject. You can do this using Clarity's `define-map` function:\n\n```clarity keys.clar\n(define-map keysBalance { subject: principal, holder: principal } uint)\n(define-map keysSupply { subject: principal } uint)\n```\n\nThe `keysBalance` stores each holder's `key` balance for a given subject and the `keysSupply` stores the total supply for each subject. These maps will be used in your contract's functions to manage the creation, buying, and selling of `keys`.\n\n## Calculating `key` prices\n\nThe next thing you need to do is define a function that calculates the price of `keys` for a given a `supply` and `amount`. You can do this by defining a `get-price` function:\n\n```clarity keys.clar\n(define-read-only (get-price (supply uint) (amount uint))\n (let (\n (base-price u10) ;; Base price per key in micro-STX\n (price-change-factor u100) ;; Factor to control the rate of price change\n )\n ;; Average price per token over the range of supply\n (/\n (+\n (* base-price amount)\n (* amount (/ (+ (* supply supply) (* supply amount) (* amount amount)) (* u3 price-change-factor)))\n )\n amount\n )\n))\n```\n\nThe `get-price` function calculates the price of `keys` using a formula that calculates the average price per token over the range of supply affected. This can be done by integrating the price function over the range of supply and dividing by the amount.\n\n## Creating, buying, and selling `keys`\n\nThese functions form the core of the contract's operations, enabling users to manage keys through buying and selling.\n\nLet's first take a look at the `buy-keys` function:\n\n```clarity keys.clar\n(define-public (buy-keys (subject principal) (amount uint))\n (let\n (\n (supply (default-to u0 (map-get? keysSupply { subject: subject })))\n (price (get-price supply amount))\n )\n (if (or (> supply u0) (is-eq tx-sender subject))\n (begin\n (match (stx-transfer? price tx-sender (as-contract tx-sender))\n success\n (begin\n (map-set keysBalance { subject: subject, holder: tx-sender }\n (+ (default-to u0 (map-get? keysBalance { subject: subject, holder: tx-sender })) amount)\n )\n (map-set keysSupply { subject: subject } (+ supply amount))\n (ok true)\n )\n error\n (err u2)\n )\n )\n (err u1)\n )\n )\n)\n```\n\nThis function allows subjects to create their first `keys`, initiating their supply in the contract. The transaction only succeeds if the _subject_ is creating the initial `keys` or if there are already `keys` in circulation, ie `principal-a` cannot buy the initial `keys` for `principal-b`.\n\nNext up, the `sell-keys` function:\n\n```clarity keys.clar\n(define-public (sell-keys (subject principal) (amount uint))\n (let\n (\n (balance (default-to u0 (map-get? keysBalance { subject: subject, holder: tx-sender })))\n (supply (default-to u0 (map-get? keysSupply { subject: subject })))\n (price (get-price (- supply amount) amount))\n (recipient tx-sender)\n )\n (if (and (>= balance amount) (or (> supply u0) (is-eq tx-sender subject)))\n (begin\n (match (as-contract (stx-transfer? price tx-sender recipient))\n success\n (begin\n (map-set keysBalance { subject: subject, holder: tx-sender } (- balance amount))\n (map-set keysSupply { subject: subject } (- supply amount))\n (ok true)\n )\n error\n (err u2)\n )\n )\n (err u1)\n )\n )\n)\n```\n\nThis is more or less the same logic as the `buy-keys` function, but instead you deduct the `keysBalance` and `keysSupply` and check if the seller owns enough keys and if they are authorized to sell.\n\n## Verifying keyholders\n\nNow that you have the ability to buy and sell `keys`, you need a way to verify if a user is a keyholder. You can do this by defining an `is-keyholder` read-only function:\n\n```clarity keys.clar\n(define-read-only (is-keyholder (subject principal) (holder principal))\n (>= (default-to u0 (map-get? keysBalance { subject: subject, holder: holder })) u1)\n)\n```\n\nThis function checks if the `keysBalance` for a given `subject` and `holder` is greater than or equal to 1. If it is, then the user `is-keyholder`.\n\n## Testing locally\n\nMake sure your contract is valid and doesn't have any errors. To do this, run the following command:\n\n```terminal\n$ clarinet check\n```\n\nNext, check some of your contract functionality inside `clarinet console`:\n\n```clarity keys.clar\n;; Get the price of 100 keys when the supply is 0\n(contract-call? .keys get-price u0 u100) ;; u10010\n\n;; Initial purchase of keys\n(contract-call? .keys buy-keys tx-sender u100)\n\n;; Check if the sender is a keyholder\n(contract-call? .keys is-keyholder tx-sender tx-sender) ;; true\n\n(contract-call? .keys is-keyholder tx-sender 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5) ;; false\n```\n\nCongratulations! You've successfully created your contract. You've laid the groundwork for a decentralized social network, just like Friend.tech.\n\n## Challenges\n\nThe following challenges are additional features you can implement to keep learning and building on Stacks.\n\n<HackBadge variant=\"starter\" />\n\n**Balance and supply query functions**: Add two new read-only functions: `get-keys-balance` and `get-keys-supply`. These functions will provide valuable information to users about the distribution and availability of `keys`, and can be used in various parts of your application to display this information to users.\n\n```clarity keys.clar\n(define-read-only (get-keys-balance (subject principal) (holder principal))\n ;; Return the keysBalance for the given subject and holder\n)\n\n(define-read-only (get-keys-supply (subject principal))\n ;; Return the keysSupply for the given subject\n)\n```\n\n<HackBadge variant=\"starter\" />\n\n**Price query functions**: Add two new read-only functions: `get-buy-price` and `get-sell-price`. These helper functions will allow users to query the current price for buying or selling a specific amount of `keys` for a given `subject`.\n\n```clarity keys.clar\n(define-read-only (get-buy-price (subject principal) (amount uint))\n ;; Implement buy price logic\n)\n\n(define-read-only (get-sell-price (subject principal) (amount uint))\n ;; Implement sell price logic\n)\n```\n\n<HackBadge variant=\"intermediate\" />\n\n**Fee management**: When a user buys or sells `keys`, you might want to introduce a fee, either at the protocol or subject level that can be distributed accordingly. Add a `protocolFeePercent` and/or `subjectFeePercent` variable, as well as a destination Stacks principal `protocolFeeDestination` for this new revenue. Now make sure to update the `buy-keys` and `sell-keys` functions to incorporate these fees and `stx-transfer?` into the buying and selling logic.\n\n```clarity keys.clar\n;; Change the fee values as you wish\n(define-data-var protocolFeePercent uint u200) ;; or subjectFeePercent\n(define-data-var protocolFeeDestination principal tx-sender)\n```\n\n<HackBadge variant=\"intermediate\" />\n\n**Access control**: In a real-world application, you might need to adjust the `protocolFeePercent`, `subjectFeePercent`, or `protocolFeeDestination` values over time. However, you wouldn't want just anyone to be able to make these changes. This is where access control comes in. Specifically, you should add a set-fee function (or functions) that allows only a designated `contractOwner` to change the `protocolFeePercent`, `subjectFeePercent`, or `protocolFeeDestination` values.\n\n```clarity keys.clar\n(define-public (set-protocol-fee-percent (feePercent uint))\n ;; Check if the caller is the contractOwner\n ;; Update the protocolFeePercent value\n)\n```\n\nThink about how you can verify whether the caller of the function is indeed the `contractOwner`. Also, consider what kind of feedback the function should give when someone else tries to call it. Test your implementation to ensure it works as expected.\n\n<HackBadge variant=\"intermediate\" />\n\n**UI integration**: Using the provided [starter template](#clone-the-starter-template), integrate your contract using [Stacks.js](/stacks/stacks.js). For example, if you were calling the `is-keyholder` function, your code might look something like this:\n\n```tsx\nimport { callReadOnlyFunction, standardPrincipalCV } from \"@stacks/transactions\"\n\nconst senderAddress = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\nconst contractAddress = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\nconst contractName = \"keys\"\nconst functionName = \"is-keyholder\"\n\nconst functionArgs = [standardPrincipalCV(senderAddress)]\n\nawait callReadOnlyFunction({\n network,\n contractAddress,\n contractName,\n functionName,\n functionArgs,\n senderAddress\n})\n```\n\nBy using a similar pattern to the code above, you will be able to **show/hide chatrooms based on keyholdings**, **create an exchange for buying/selling keys**, or **add a search for displaying subject keyholdings**.\n\n> _**Note**_\n>\n> If you are planning to experiment with your contract on `devnet`, make sure to run `clarinet devnet start` [to deploy and test your contract locally](/stacks/clarinet/guides/run-a-local-devnet). You can then use the `devnet` network when calling your contract in the [Leather wallet](https://leather.io/install-extension).\n\n<HackBadge variant=\"advanced\" />\n\n**Message signature**: To further enhance the security and authenticity of your app, try to implemement a _login_ feature using [message signing](/stacks/connect/guides/sign-messages).\n\n```tsx\nimport { openSignatureRequestPopup } from \"@stacks/connect\"\nimport { verifyMessageSignatureRsv } from \"@stacks/encryption\"\nimport { StacksMocknet } from \"@stacks/network\"\nimport { getAddressFromPublicKey } from \"@stacks/transactions\"\n\nconst message = \"Log in to chatroom\"\nconst network = new StacksMocknet()\n\nopenSignatureRequestPopup({\n message,\n network,\n onFinish: async ({ publicKey, signature }) => {\n const verified = verifyMessageSignatureRsv({\n message,\n publicKey,\n signature\n })\n if (verified) {\n // The signature is verified, so now we can check if the user is a keyholder\n const address = getAddressFromPublicKey(publicKey, network.version)\n const isKeyHolder = await checkIsKeyHolder(address)\n if (isKeyHolder) {\n // The user is a keyholder, so they are authorized to access the chatroom\n }\n }\n }\n})\n```\n\nThe signed message will serve as a _proof of identity_ - similar to a login, verifying that the user is indeed who they claim to be. This can be particularly useful in a chatroom setting, where only `is-keyholder` users are allowed to send messages.\n","url":"/docs/stacks/hacks/archive/build-a-friend-tech-clone"},"72":{"id":"/docs/stacks/hacks/recipes","title":"Create a recipe for the Hiro Cookbook","description":"Create your own recipe for the Hiro Cookbook and share it with the community.","content":"\n## February: Create your own recipe for the Hiro Cookbook\n\n*Create your own recipe that you think will help other developers build on Stacks*\n\n**Timeline**: February 19-25, 2025\n\nThis month's challenge invites you to create your own recipe for the [Hiro Cookbook](/cookbook) and share it with the community. Each recipe is a reusable code snippet that handles some specific function, and each recipe has written annotations, so readers know exactly how the code in a given recipe works and what parameters you can customize. Your submission should be a recipe that you think will help other developers build on Stacks.\n\nSubmit your project [here](https://hirohacks25.paperform.co/).\n\n<iframe width=\"770\" height=\"315\" src=\"https://www.youtube.com/embed/z9ULVhygKCE\" title=\"Hiro Hacks: Cookbook\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerPolicy=\"strict-origin-when-cross-origin\" allowFullScreen></iframe>\n\n## Some example recipe ideas to explore\n\n- Using the `Cl` parse helper function to convert string values into Clarity Values\n- Creating and signing a message for smart contract verification\n- How to construct a non-sequential multisig transaction\n- Create a helper function to determine if a transaction has been signed\n\n_For this month's submission, provide a link to your recipe in a PR to the [Recipes](https://github.com/hirosystems/recipes) repo. To review the general submission guidelines, see the [Hiro Hacks](/stacks/hacks) page._\n\n---\n\n## Resources\n\n- [Hiro Cookbook](/cookbook)\n- [Recipes repo](https://github.com/hirosystems/recipes)\n- [Submission form](https://hirohacks25.paperform.co/)\n- [Stacks Discord](https://stacks.chat)\n","url":"/docs/stacks/hacks/recipes"},"73":{"id":"/docs/stacks/hacks","title":"Overview","description":"A series of coding challenges to sharpen your skills.","content":"\nimport { Code } from 'lucide-react';\nimport { SecondaryCard } from '@/components/card';\n\nHiro Hacks are monthly hackathons designed to bring together the most innovative builders in the Stacks ecosystem. Each month features a unique theme, challenging you to stretch your creativity, show off your skills, and learn from other devs in the process.\n\nHave fun. Build something new. Compete against other devs for Hiro swag and your seat in a [hacker house](#prizes) coming later this year.\n\nTo submit your projects each month, [complete this form](https://hirohacks25.paperform.co/) before midnight ET on the last day of that month's hack.\n\n## Schedule\n\n| Week | Theme | Description |\n| --- | --- | --- |\n| Jan 22-28 | [AI x Stacks](/stacks/hacks/archive/ai) | Build something that combines AI capabilities with Stacks. |\n| Feb 19-25 | [Create your own recipe](/stacks/hacks/recipes) | Create your own recipe for the Hiro Cookbook and share it with the community. |\n| Mar 19-25 | TBA | Coming soon |\n| Apr 23-29 | TBA | Coming soon |\n| May 21-27 | TBA | Coming soon |\n| Jun 18-24 | TBA | Coming soon |\n| ??? | ??? | ??? |\n\n## Prizes\n\nAt the end of each monthly hack, Hiro will host a livestream on X going over submissions and announcing that month's winning developer. The prize? Fame, glory and Hiro swag.\n\nTop developers from these monthly hacks will be invited to participate in a Hiro hacker house tied to one of the year's biggest conferences, key expenses covered. We'll share more details on that house soon, so stay tuned.\n\n## Resources\n\nNeed help hacking on your project? [Join the Stacks Discord](https://stacks.chat) and get help from other devs in the #builder-general channel. If you're having problems using Hiro tools, you can also reach out to our team in the relevant tool channel in the Hiro Developer Tools section.\n\nAnd don't forget to take advantage of all of the resources in our docs as well as [Stacks docs](https://docs.stacks.co/).\n\n## Rules\n\nTo be eligible for swag and the hacker house, you must submit your project through [this paperform](https://hirohacks25.paperform.co/) before midnight ET on the last day of that month's hack.\n\nIn that submission, we expect to see:\n\n- A link to your project (if applicable)\n- A link to your code with a clear README (or link to a PR if submitting a recipe)\n- A description that covers the problem being solved, the technical approach, and future improvements for the project\n\nIn terms of selecting winners, submissions will be evaluated on their technical implementation, their innovation/creativity, and their documentation/presentation. To learn more about the rules, read [Hiro Hacks Terms & Conditions](https://www.hiro.so/hiro-hacks-rules).\n","url":"/docs/stacks/hacks"},"74":{"id":"/docs/stacks/explorer","title":"Overview","description":"Explore and verify data on the Stacks blockchain.","content":"\nimport Link from \"next/link\";\nimport { Button } from \"@/components/ui/button\"\n\nThe Stacks Explorer lets you explore on-chain data, troubleshoot pending transactions, edit and deploy contracts via the sandbox, discover new tokens, and more. We maintain and support the [Stacks Explorer](https://explorer.hiro.so) as a service for the community, but you can also run your own instance of the explorer.\n\n<div className=\"flex gap-4\">\n <Button className=\"bg-orange-500 hover:bg-orange-600\">\n <a href=\"https://explorer.hiro.so\" target=\"_blank\" className=\"no-underline\">\n View Stacks Explorer\n </a>\n </Button>\n {/* <Button variant=\"outline\">\n <Link\n href=\"/stacks/explorer/guides/build-explorer\"\n className=\"no-underline\"\n >\n Set up your own explorer\n </Link>\n </Button> */}\n</div>\n\n## Related tools\n\n- **[Stacks Blockchain API](/stacks/api)**: Looking for on-chain data without the front end? Leverage the Stacks Blockchain API.\n- **[Ordinals Explorer](/bitcoin/explorer)**: Explore Bitcoin Ordinals and BRC-20 tokens via the Ordinals Explorer.\n\n---\n\nNeed help building with Stacks Explorer? Reach out to us on the `#stacks-explorer` channel on Discord under the [Hiro Developer Tools section](https://stacks.chat/). There’s also a [weekly office hours](https://events.stacks.co/event/HD16484710) on Discord every Thursday at 11am ET.\n","url":"/docs/stacks/explorer"},"75":{"id":"/docs/stacks/explorer/guides/build-explorer","title":"Build a Stacks Explorer","description":"Run a local instance of the Stacks Explorer.","content":"\nThe Stacks Explorer frontend user interface is built with [React](https://reactjs.org/), [next.js](https://github.com/vercel/next.js) and [@stacks/ui](https://github.com/hirosystems/ui).\n\nBefore you can run the explorer on your machine locally, you must first clone the [Stacks Explorer](https://github.com/hirosystems/explorer) repository to obtain all of the necessary files and libraries needed.\n\n# Project dependencies\n\nOnce you have cloned the Stacks Explorer repositories, you will need to install the following project dependencies:\n\n- [NodeJS](https://nodejs.dev/en/) that includes `npm`\n- [PNPM](https://pnpm.io/installation/)\n- [Homebrew](https://brew.sh/)\n\n> **_NOTE:_**\n>\n> Although Homebrew is not required to install and operate the Stacks Explorer, it is highly recommended.\n\nOpen your terminal window, and make sure you are in the `/explorer` folder. Run the below command to install the dependencies:\n\n`pnpm i`\n\nAfter installing and configuring your environment, you can run the Stacks Explorer locally if you wish by running the following command:\n\n`pnpm dev`\n\n## Building for production\n\nYou may also build a production version of the Stacks Explorer. To do that, simply run the following command:\n\n`pnpm build`\n\n> **NOTE:**\n>\n> Running `pnpm build` also run the default next.js build task.\n","url":"/docs/stacks/explorer/guides/build-explorer"},"76":{"id":"/docs/stacks/clarity/bit-manipulation","title":"Bit manipulation","description":"Using bit manipulation for compact data storage and flags in Clarity smart contracts.","content":"\nBit manipulation functions in Clarity provide powerful tools for efficient data storage and flag management in smart contracts. These functions allow developers to pack multiple pieces of information into a single integer, saving storage space and potentially reducing gas costs.\n\n## Why these functions matter\n\nClarity's bit manipulation functions are designed with several important considerations in mind:\n\n1. Efficiency: They allow for compact data storage, potentially reducing contract storage costs.\n2. Versatility: These functions enable the implementation of bitfields, flags, and other low-level data structures.\n3. Performance: Bit operations are generally faster than higher-level data manipulations.\n4. Interoperability: They facilitate working with data from other systems that use bitwise representations.\n\n## Core Bit Manipulation Functions\n\n### 1. bit-and\n\n**What**: Performs a bitwise AND operation on two or more integers.\n**Why**: Useful for checking if specific bits are set or for clearing certain bits.\n**When**: Use when you need to isolate specific bits or apply a bitmask.\n**How**: \n```clarity\n(bit-and i1 i2...)\n```\n\n**Best Practices**: \n- Use to check if a specific flag is set in a bitfield.\n- Combine with bit-or for more complex flag manipulations.\n\n**Example Use Case**: Checking if a user has a specific permission in a compact permission system.\n\n```clarity\n(define-constant PERMISSION_READ u1) ;; 0001\n(define-constant PERMISSION_WRITE u2) ;; 0010\n(define-constant PERMISSION_EXEC u4) ;; 0100\n\n(define-public (has-permission? (user-permissions uint) (required-permission uint))\n (is-eq (bit-and user-permissions required-permission) required-permission))\n\n;; Usage\n(has-permission? u3 PERMISSION_READ) ;; Returns true (3 & 1 == 1)\n(has-permission? u3 PERMISSION_EXEC) ;; Returns false (3 & 4 == 0)\n```\n\n### 2. bit-or\n\n**What**: Performs a bitwise OR operation on two or more integers.\n**Why**: Useful for setting specific bits or combining flags.\n**When**: Use when you need to add flags or set specific bits.\n**How**: \n```clarity\n(bit-or i1 i2...)\n```\n\n**Best Practices**: \n- Use to add new permissions or flags to an existing set.\n- Combine with bit-and for more complex flag manipulations.\n\n**Example Use Case**: Adding a new permission to a user's existing permissions.\n\n```clarity\n(define-public (add-permission (current-permissions uint) (new-permission uint))\n (ok (bit-or current-permissions new-permission)))\n\n;; Usage\n(add-permission u3 PERMISSION_EXEC) ;; Returns (ok u7)\n```\n\n### 3. bit-not\n\n**What**: Performs a bitwise NOT operation on an integer.\n**Why**: Useful for inverting all bits in a value.\n**When**: Use when you need to flip all bits or create a bitmask.\n**How**: \n```clarity\n(bit-not i1)\n```\n\n**Best Practices**: \n- Use carefully with signed integers, as it affects the sign bit.\n- Combine with bit-and to clear specific bits.\n\n**Example Use Case**: Creating a bitmask to clear specific permissions.\n\n```clarity\n(define-public (remove-permission (current-permissions uint) (permission-to-remove uint))\n (ok (bit-and current-permissions (bit-not permission-to-remove))))\n\n;; Usage\n(remove-permission u7 PERMISSION_WRITE) ;; Returns (ok u5)\n```\n\n## Practical Example: Compact User Profile Flags\n\nLet's implement a system that stores multiple user profile settings in a single integer using bit flags:\n\n```clarity\n(define-constant SETTING_NEWSLETTER u1) ;; 0001\n(define-constant SETTING_2FA u2) ;; 0010\n(define-constant SETTING_PRIVATE_PROFILE u4) ;; 0100\n(define-constant SETTING_DARK_MODE u8) ;; 1000\n\n(define-map user-settings principal uint)\n\n(define-public (update-setting (setting uint) (enabled bool))\n (let ((current-settings (default-to u0 (map-get? user-settings tx-sender))))\n (if enabled\n (map-set user-settings tx-sender (bit-or current-settings setting))\n (map-set user-settings tx-sender (bit-and current-settings (bit-not setting))))\n (ok true)))\n\n(define-read-only (has-setting? (user principal) (setting uint))\n (let ((user-settings (default-to u0 (map-get? user-settings user))))\n (is-eq (bit-and user-settings setting) setting)))\n\n(define-read-only (get-all-settings (user principal))\n (default-to u0 (map-get? user-settings user)))\n```\n\nThis example demonstrates:\n1. Using bit constants to define individual settings.\n2. Updating settings using bit-or to set flags and bit-and with bit-not to clear flags.\n3. Checking individual settings with bit-and.\n4. Storing all user settings compactly in a single uint.\n\n## Conclusion\n\nBit manipulation functions in Clarity provide powerful tools for efficient data storage and flag management in smart contracts. By understanding when and how to use these functions, developers can create more storage-efficient contracts and implement complex flag systems with ease. Always consider the trade-off between storage efficiency and code readability when using these techniques.\n","url":"/docs/stacks/clarity/bit-manipulation"},"77":{"id":"/docs/stacks/clarity/basic-arithmetic","title":"Basic arithmetic","description":"Brief overview of arithmetic operations in Clarity and their importance in smart contract development.","content":"\nSmart contracts often need to perform calculations, whether it's for token balances, voting weights, or complex financial operations. Understanding Clarity's arithmetic functions is crucial for implementing these features efficiently and securely.\n\n## Why these functions matter\nClarity's arithmetic functions are designed with blockchain-specific considerations in mind:\n\n1. Overflow protection: Unlike some languages, Clarity prevents integer overflow by default, enhancing contract security.\n2. Precision: Clarity uses 128-bit integers, allowing for high-precision calculations crucial in financial applications.\n3. Determinism: The behavior of these functions is consistent across all nodes, ensuring blockchain consensus.\n\n## Core functions\n\n### 1. Addition (+)\n\n**What**: Adds two or more integers.\n\n**Why**: Essential for calculations involving cumulative values.\n\n**When**: Use when you need to increase values, combine quantities, or perform any additive calculation.\n\n**Best practices**: \n- Consider overflow protection\n- Use with uint for non-negative values like token amounts\n\n**Example use case**: Calculating total rewards in a stacking system.\n\n```clarity\n(define-map StackingRewards principal uint)\n\n(define-public (add-stacking-reward (stacker principal) (newReward uint))\n (let\n (\n (currentRewards (default-to u0 (map-get? StackingRewards stacker)))\n )\n (map-set StackingRewards stacker (+ currentRewards newReward))\n (ok true)\n )\n)\n```\n\n### 2. Subtraction (-)\n\n**What**: Subtracts integers from the first argument.\n\n**Why**: Crucial for calculations involving decreasing values or finding differences.\n\n**When**: Use when you need to decrease values, calculate differences, or perform any subtractive operation.\n\n**Best practices**: \n- Guard against underflow\n- Consider using uint for values that shouldn't go negative\n\n**Example use case**: Updating user points in a rewards system.\n\n```clarity\n(define-map UserPoints principal uint)\n\n(define-public (deduct-points (amount uint))\n (let\n (\n (currentPoints (default-to u0 (map-get? UserPoints tx-sender)))\n )\n (asserts! (>= currentPoints amount) (err u1))\n (map-set UserPoints tx-sender (- currentPoints amount))\n (ok true)\n )\n)\n\n(define-read-only (get-points (user principal))\n (default-to u0 (map-get? UserPoints user))\n)\n```\n\n### 3. Multiplication (*)\n\n**What**: Multiplies two or more integers.\n\n**Why**: Important for calculations involving scaling, rates, or proportions.\n\n**When**: Use when you need to scale values, calculate rates, or perform any multiplicative operation.\n\n**Best practices**: \n- Consider overflow protection\n- Use with uint for non-negative values like token amounts\n\n**Example use case**: Calculating rewards based on stacking amount and duration.\n\n```clarity\n(define-public (calculate-rewards (amount uint) (days uint))\n (let\n (\n (rewardRate u10) ;; 10 tokens per day per 1000 stacked\n (rewards (* amount days rewardRate))\n )\n (ok (/ rewards u1000))\n )\n)\n```\n\n### 4. Division (/)\n\n**What**: Performs integer division.\n\n**Why**: Crucial for calculations involving rates, proportions, or sharing.\n\n**When**: Use when you need to divide values, calculate rates, or perform any division operation.\n\n**Best practices**: \n- Guard against division by zero\n- Consider using uint for non-negative values like token amounts\n\n**Example use case**: Calculating price per item when buying in bulk.\n\n```clarity\n(define-read-only (calculate-price-per-item (totalPrice uint) (itemCount uint))\n (if (> itemCount u0)\n (ok (/ totalPrice itemCount))\n (err u0)\n )\n)\n```\n\n## Best practices and considerations\n\n1. **Order of operations**: Clarity doesn't have operator precedence. Use parentheses to explicitly define the order of operations.\n\n2. **Handling remainders**: When using division, consider how to handle remainders. You might need to use combination of division and modulo.\n\n3. **Scaling for precision**: When dealing with percentages or fractions, consider scaling up your numbers to maintain precision.\n\n4. **Guarding against division by zero**: Always check for zero before performing division to avoid runtime errors.\n\n5. **Using uint vs int**: Choose `uint` for values that can't be negative (like token amounts) and `int` when negative values are possible.\n\n## Practical example: simple interest calculator\n\nLet's combine these functions to create a simple interest calculator:\n\n```clarity\n(define-public (calculate-interest (principal uint) (rate uint) (time uint))\n (let (\n (scaled-rate (/ rate u100)) ;; Convert percentage to decimal\n (interest (/ (* principal scaled-rate time) u365)) ;; Simple interest formula\n )\n (ok interest))\n)\n\n;; Usage: calculate interest for 1000 tokens at 5% APR for 30 days\n(calculate-interest u1000 u5 u30)\n```\n\nThis example demonstrates how to combine multiple arithmetic operations while handling precision (scaling the rate) and using integer division appropriately.\n\n## Conclusion\n\nMastering Clarity's arithmetic functions is essential for building robust smart contracts. By understanding these operations and their nuances, you can implement complex financial logic, manage token economics, and create secure, efficient blockchain applications.\n","url":"/docs/stacks/clarity/basic-arithmetic"},"78":{"id":"/docs/stacks/clarity","title":"Introduction","description":"Explore and master Clarity's built-in functions for smart contract development.","content":"\nimport { Code } from 'lucide-react';\nimport { SecondaryCard } from '@/components/card';\n\n<Callout title=\"New series\" type=\"info\">\nWe're introducing a new series of guides that explore Clarity functions in depth, focusing on their practical applications in blockchain development.\n</Callout>\n\nEach page in this section covers one or more related Clarity functions, explaining their purpose, demonstrating implementation with code samples, and discussing best practices. Ready to enhance your Clarity smart contract development skills?\n\n## Explore guides\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/clarity/basic-arithmetic\"\n title=\"Arithmetic operations\"\n description=\"Master basic and advanced arithmetic functions for precise calculations in smart contracts.\"\n />\n <SecondaryCard\n href=\"/stacks/clarity/access-control\"\n title=\"Access control\"\n description=\"Manage permissions and control access for smart contracts.\"\n />\n <SecondaryCard\n href=\"/stacks/clarity/handling-optionals-and-errors\"\n title=\"Handling optionals and errors\"\n description=\"Safely handling optional values and error cases in Clarity smart contracts.\"\n />\n</Cards>\n\nNeed help or have questions? Join the discussion in the [#clarity channel](https://stacks.chat) on Discord and connect with other Clarity developers.\n","url":"/docs/stacks/clarity"},"79":{"id":"/docs/stacks/clarity/optimizations","title":"Map functions","description":"Optimizing storage and retrieval with map functions in Clarity.","content":"\nMap functions in Clarity provide powerful tools for efficient data storage and retrieval in smart contracts. These functions allow developers to create key-value stores that can be used to maintain complex state in a gas-efficient manner.\n\n## Why these functions matter\n\nClarity's map functions are designed with blockchain-specific considerations in mind:\n\n1. Efficiency: Maps provide O(1) lookup time, making them ideal for storing and retrieving data in smart contracts.\n2. Flexibility: They allow for complex data structures to be stored and accessed easily.\n3. Gas Optimization: Using maps can significantly reduce gas costs compared to other data storage methods.\n4. State Management: Maps are crucial for maintaining contract state across multiple transactions.\n5. Scalability: They enable contracts to handle large amounts of data without significant performance degradation.\n\n## Core Map Functions\n\n### 1. define-map\n\n**What**: Defines a new map with a specified key and value type.\n**Why**: Essential for creating structured data storage in your contract.\n**When**: Use when you need to store and retrieve data associated with unique keys.\n**How**: \n```clarity\n(define-map map-name {key-type} {value-type})\n```\n\n**Best Practices**: \n- Choose appropriate key and value types to represent your data efficiently.\n- Consider using composite keys (tuples) for more complex data relationships.\n\n**Example Use Case**: Creating a user balance tracker.\n\n```clarity\n(define-map user-balances principal uint)\n```\n\n### 2. map-set\n\n**What**: Sets the value for a given key in the map.\n**Why**: Allows updating or inserting data into the map.\n**When**: Use when you need to store or update a value associated with a key.\n**How**: \n```clarity\n(map-set map-name key value)\n```\n\n**Best Practices**: \n- Always check if the key exists before updating to avoid unintended overwrites.\n- Use in conjunction with appropriate access controls.\n\n**Example Use Case**: Updating a user's balance.\n\n```clarity\n(define-public (update-balance (user principal) (new-balance uint))\n (begin\n (asserts! (is-eq tx-sender user) (err u1))\n (ok (map-set user-balances user new-balance))))\n```\n\n### 3. map-get?\n\n**What**: Retrieves the value associated with a given key in the map.\n**Why**: Allows reading data from the map efficiently.\n**When**: Use when you need to retrieve stored data based on a key.\n**How**: \n```clarity\n(map-get? map-name key)\n```\n\n**Best Practices**: \n- Always handle the case where the key might not exist (returns none).\n- Use `unwrap!` or `unwrap-panic` when you're certain the key exists.\n\n**Example Use Case**: Retrieving a user's balance.\n\n```clarity\n(define-read-only (get-balance (user principal))\n (default-to u0 (map-get? user-balances user)))\n```\n\n### 4. map-delete\n\n**What**: Removes the entry for a given key from the map.\n**Why**: Allows removing data from the map when it's no longer needed.\n**When**: Use when you need to delete stored data associated with a key.\n**How**: \n```clarity\n(map-delete map-name key)\n```\n\n**Best Practices**: \n- Be cautious when deleting data, as it can't be recovered once deleted.\n- Consider using a \"soft delete\" approach for data that might need to be referenced later.\n\n**Example Use Case**: Removing a user's account.\n\n```clarity\n(define-public (delete-account (user principal))\n (begin\n (asserts! (is-eq tx-sender user) (err u1))\n (ok (map-delete user-balances user))))\n```\n\n## Practical Example: Simple Voting System\n\nLet's implement a basic voting system using map functions to demonstrate their practical use:\n\n```clarity\n;; Define maps for votes and voter registration\n(define-map votes { proposal: uint } { yes: uint, no: uint })\n(define-map voters principal bool)\n\n;; Function to register a voter\n(define-public (register-voter)\n (ok (map-set voters tx-sender true)))\n\n;; Function to cast a vote\n(define-public (cast-vote (proposal uint) (vote bool))\n (let ((proposal-votes (default-to { yes: u0, no: u0 } (map-get? votes { proposal: proposal }))))\n (asserts! (is-some (map-get? voters tx-sender)) (err u1))\n (asserts! (is-none (map-get? votes { proposal: proposal })) (err u2))\n (if vote\n (map-set votes { proposal: proposal } \n (merge proposal-votes { yes: (+ (get yes proposal-votes) u1) }))\n (map-set votes { proposal: proposal } \n (merge proposal-votes { no: (+ (get no proposal-votes) u1) })))\n (ok true)))\n\n;; Function to get vote count\n(define-read-only (get-votes (proposal uint))\n (default-to { yes: u0, no: u0 } (map-get? votes { proposal: proposal })))\n```\n\nThis example demonstrates:\n1. Using `define-map` to create data structures for votes and voter registration.\n2. Using `map-set` to register voters and record votes.\n3. Using `map-get?` to check voter registration and retrieve vote counts.\n4. Combining map functions with other Clarity features for a complete voting system.\n\n## Conclusion\n\nMap functions in Clarity provide a powerful and efficient way to store and retrieve data in smart contracts. By understanding when and how to use these functions, developers can create more efficient, scalable, and gas-optimized contracts. Always consider the specific requirements of your application when designing your data storage strategy using map functions.\n","url":"/docs/stacks/clarity/optimizations"},"80":{"id":"/docs/stacks/clarity/cryptographic-functions","title":"Cryptographic functions","description":"Brief overview of cryptographic functions in Clarity and their importance in smart contract development.","content":"\nCryptographic functions are essential in blockchain smart contracts for ensuring data integrity, creating secure hashes, and verifying signatures. Clarity provides several built-in cryptographic functions that are crucial for these purposes.\n\n## Why these functions matter\n\nClarity's cryptographic functions are designed with blockchain-specific considerations in mind:\n\n1. Security: These functions provide cryptographic primitives essential for building secure smart contracts.\n2. Data Integrity: They allow for the creation and verification of unique identifiers for data, ensuring data hasn't been tampered with.\n3. Authentication: Cryptographic functions enable signature verification, crucial for authenticating transactions and messages.\n4. Determinism: The behavior of these functions is consistent across all nodes, ensuring blockchain consensus.\n5. Interoperability: Some functions (like keccak256) provide compatibility with other blockchain systems.\n\n## Core Cryptographic Functions\n\n### 1. sha256\n\n**What**: Computes the SHA256 hash of the input.\n**Why**: SHA256 is widely used for creating unique, fixed-size representations of data, crucial for data integrity checks.\n**When**: Use when you need to create a unique identifier for data or verify data integrity.\n**How**: \n```clarity\n(sha256 value)\n```\n**Best Practices**: \n- Use for creating unique identifiers for data\n- Combine with other data before hashing to prevent rainbow table attacks\n\n**Example Use Case**: Creating a unique identifier for a document or transaction.\n\n```clarity\n(define-public (submit-document-hash (document-hash (buff 32)))\n (let ((user-submission-id (sha256 (concat document-hash tx-sender))))\n (map-set document-submissions user-submission-id true)\n (ok user-submission-id)))\n```\n\n### 2. keccak256\n\n**What**: Computes the Keccak256 hash of the input.\n**Why**: Keccak256 is another cryptographic hash function, often used in Ethereum-compatible systems.\n**When**: Use when interoperability with Ethereum systems is needed or when an alternative to SHA256 is required.\n**How**: \n```clarity\n(keccak256 value)\n```\n**Best Practices**: \n- Use when SHA256 is not suitable for your specific use case\n- Be aware of the differences in output compared to SHA256\n\n**Example Use Case**: Creating a hash for Ethereum address compatibility.\n\n```clarity\n(define-read-only (get-eth-address (public-key (buff 33)))\n (let ((hashed-key (keccak256 (unwrap-panic (secp256k1-recover? message-hash signature public-key)))))\n (buff-to-hex-string (unwrap-panic (slice? hashed-key u12 u32)))))\n```\n\n### 3. secp256k1-recover?\n\n**What**: Recovers the public key from a signed message and signature.\n**Why**: Essential for verifying signatures without needing the public key in advance.\n**When**: Use when implementing signature verification schemes, especially for transactions or messages.\n**How**: \n```clarity\n(secp256k1-recover? message-hash signature)\n```\n**Best Practices**: \n- Always check the return value as it's an optional type\n- Use in combination with `secp256k1-verify` for complete signature verification\n\n**Example Use Case**: Verifying a signed message in a decentralized voting system.\n\n```clarity\n(define-public (submit-vote (vote uint) (signature (buff 65)) (message-hash (buff 32)))\n (let ((signer (unwrap! (secp256k1-recover? message-hash signature) (err u1))))\n (asserts! (is-eq (principal-of? signer) (some tx-sender)) (err u2))\n (map-set votes tx-sender vote)\n (ok true)))\n\n## Practical Example: Document Verification System\n\nLet's implement a basic document verification system that demonstrates the use of Clarity's cryptographic functions. This system will allow users to submit document hashes, sign them, and later verify the authenticity of the document and the signer.\n\n```clarity\n;; Define a map to store document hashes and their signers\n(define-map documents\n { doc-hash: (buff 32) }\n { signer: principal, eth-compatible-hash: (buff 32) })\n\n;; Function to submit a document hash\n(define-public (submit-document (doc-hash (buff 32)))\n (let\n (\n (submission-id (sha256 (concat doc-hash tx-sender)))\n (eth-hash (keccak256 doc-hash))\n )\n (map-set documents { doc-hash: submission-id }\n { signer: tx-sender, eth-compatible-hash: eth-hash })\n (ok submission-id)))\n\n;; Function to sign a document hash\n(define-public (sign-document (doc-hash (buff 32)) (signature (buff 65)))\n (let\n ((submission-id (sha256 (concat doc-hash tx-sender))))\n (match (map-get? documents { doc-hash: submission-id })\n doc-info\n (let\n ((signer (unwrap! (secp256k1-recover? doc-hash signature) (err u1))))\n (asserts! (is-eq (principal-of? signer) (some tx-sender)) (err u2))\n (ok true))\n (err u3))))\n\n;; Function to verify a document and its signer\n(define-read-only (verify-document (doc-hash (buff 32)) (signature (buff 65)))\n (let\n ((submission-id (sha256 (concat doc-hash tx-sender))))\n (match (map-get? documents { doc-hash: submission-id })\n doc-info\n (let\n ((signer (unwrap! (secp256k1-recover? doc-hash signature) (err u1))))\n (if (is-eq (some (get signer doc-info)) (principal-of? signer))\n (ok true)\n (err u2)))\n (err u3))))\n\n;; Function to get Ethereum-compatible hash\n(define-read-only (get-eth-hash (doc-hash (buff 32)))\n (match (map-get? documents { doc-hash: doc-hash })\n doc-info (ok (get eth-compatible-hash doc-info))\n (err u1)))\n```\n\n## Conclusion\n\nCryptographic functions in Clarity provide powerful tools for ensuring data integrity and implementing secure signature schemes. By understanding when and how to use these functions, developers can create robust smart contracts that maintain the security and trustlessness essential to blockchain applications. Always consider the specific security requirements of your application when choosing and implementing these cryptographic functions.","url":"/docs/stacks/clarity/cryptographic-functions"},"81":{"id":"/docs/stacks/clarity/access-control","title":"Access control","description":"Manage permissions and access control with principal functions.","content":"\nPrincipal functions in Clarity are essential tools for implementing robust access control and permission management in smart contracts. These functions allow you to identify, authenticate, and authorize different entities interacting with the contract, ensuring that only the right parties can perform specific actions or access certain data.\n\n## Why these functions matter\n\nClarity's principal functions are designed with blockchain-specific considerations in mind. They can:\n\n1. Identify and authenticate users and contracts interacting with your smart contract.\n2. Implement role-based access control for different contract functions.\n3. Ensure that only authorized entities can perform certain actions or access specific data.\n4. Create multi-signature schemes for enhanced security.\n\n## Key elements for access control\n\n### 1. asserts!\n\n**What**: A function that checks a condition and throws an error if it's not met.\n\n**Why**: Essential for enforcing access control rules and validating conditions.\n\n**When**: Use when you need to ensure a condition is true before proceeding with a function.\n\n**Best practices**: \n- Use `asserts!` to enforce access control rules and validate conditions.\n- Consider using `asserts!` in combination with other principal functions for robust access control.\n\n**Example use case**: Using `asserts!` to check if a user has sufficient balance before performing a transfer.\n\n```clarity\n;; Define a map to store user balances\n(define-map Balances principal uint)\n\n;; Function to transfer tokens\n(define-public (transfer (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? Balances tx-sender)))\n )\n ;; Assert that the sender has sufficient balance\n (asserts! (>= senderBalance amount) (err u1))\n \n ;; If assertion passes, proceed with the transfer\n (map-set Balances tx-sender (- senderBalance amount))\n (map-set Balances recipient (+ (default-to u0 (map-get? Balances recipient)) amount))\n (ok true)\n )\n)\n\n;; Function to check balance\n(define-read-only (get-balance (user principal))\n (default-to u0 (map-get? Balances user))\n)\n```\n\n### 2. tx-sender\n\n**What**: A keyword that represents the current transaction sender.\n\n**Why**: Important for identifying who is calling a contract function.\n\n**When**: Use when you need to check permissions or record actions associated with the caller.\n\n**Best practices**: \n- Always validate `tx-sender` before performing sensitive operations.\n- Don't rely solely on `tx-sender` for complex authentication schemes.\n\n**Example use case**: Restricting a function to be called only by the contract owner.\n\n```clarity\n(define-data-var contractOwner principal tx-sender)\n\n(define-public (restricted-function)\n (begin\n (asserts! (is-eq tx-sender (var-get contractOwner)) (err u1))\n ;; Function logic here\n (ok true)\n )\n)\n```\n\n### 3. contract-caller\n\n**What**: A keyword that represents the immediate caller of the current contract.\n\n**Why**: Allows for more granular control in contract-to-contract interactions.\n\n**When**: Use when your contract might be called by other contracts and you need to distinguish between the original sender and the immediate caller.\n\n**Best practices**: \n- Use in conjunction with `tx-sender` for comprehensive access control.\n- Be cautious of potential confusion between `tx-sender` and `contract-caller` in complex call chains.\n\n**Example use case**: Implementing a whitelist for contracts allowed to call a function.\n\n```clarity\n(define-map AllowedCallers principal bool)\n\n(define-public (whitelisted-function)\n (begin\n (asserts! (default-to false (map-get? AllowedCallers contract-caller)) (err u2))\n ;; Function logic here\n (ok true)\n )\n)\n```\n\n### 4. is-eq\n\n**What**: Checks if two values are equal.\n\n**Why**: Crucial for comparing principals and implementing access control logic.\n\n**When**: Use when you need to verify if a caller matches a specific principal or if two principals are the same.\n\n**Best practices**: \n- Use for exact matching of principals.\n- Consider using in combination with other checks for more robust authentication.\n\n**Example use case**: Multi-signature functionality requiring approval from specific principals.\n\n```clarity\n(define-constant APPROVER_ONE 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5)\n(define-constant APPROVER_TWO 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG)\n \n(define-public (approve-transaction (transactionId uint))\n (begin\n (asserts! (or (is-eq tx-sender APPROVER_ONE) (is-eq tx-sender APPROVER_TWO)) (err u3))\n ;; Approval logic here\n (ok true)\n )\n)\n```\n\n## Practical example: simple governance contract\n\nLet's implement a basic governance contract that demonstrates role-based access control using principal functions. This contract will have an owner, administrators, and regular members, each with different permissions.\n\n```clarity\n;; Define maps to store roles\n(define-map Administrators principal bool)\n(define-map Members principal bool)\n\n;; Define data variables\n(define-data-var contractOwner principal tx-sender)\n(define-data-var proposalCounter uint u0)\n\n;; Define a map to store proposals\n(define-map Proposals\n uint\n {\n title: (string-ascii 50),\n proposer: principal,\n votesFor: uint,\n votesAgainst: uint\n }\n)\n\n;; Function to add an administrator (only owner can do this)\n(define-public (add-administrator (newAdmin principal))\n (begin\n (asserts! (is-eq tx-sender (var-get contractOwner)) (err u1))\n (ok (map-set Administrators newAdmin true))\n )\n)\n\n;; Function to add a member (only Administrators can do this)\n(define-public (add-member (newMember principal))\n (begin\n (asserts! (default-to false (map-get? Administrators contract-caller)) (err u2))\n (ok (map-set Members newMember true))\n )\n)\n\n;; Function to create a proposal (only members can do this)\n(define-public (create-proposal (title (string-ascii 50)))\n (let\n (\n (proposalId (var-get proposalCounter))\n )\n (asserts! (default-to false (map-get? Members tx-sender)) (err u3))\n (map-set Proposals proposalId\n {\n title: title,\n proposer: tx-sender,\n votesFor: u0,\n votesAgainst: u0\n })\n (var-set proposalCounter (+ proposalId u1))\n (ok proposalId)\n )\n)\n\n;; Function to vote on a proposal (only members can do this)\n(define-public (vote (proposalId uint) (voteFor bool))\n (let\n (\n (proposal (unwrap! (map-get? Proposals proposalId) (err u4)))\n )\n (asserts! (default-to false (map-get? Members tx-sender)) (err u5))\n (if voteFor\n (map-set Proposals proposalId (merge proposal { votesFor: (+ (get votesFor proposal) u1) }))\n (map-set Proposals proposalId (merge proposal { votesAgainst: (+ (get votesAgainst proposal) u1) }))\n )\n (ok true)\n )\n)\n\n;; Function to transfer ownership (only current owner can do this)\n(define-public (transfer-ownership (newOwner principal))\n (begin\n (asserts! (is-eq tx-sender (var-get contractOwner)) (err u6))\n (var-set contractOwner newOwner)\n (ok true)\n )\n)\n```\n\n## Conclusion\n\nPrincipal functions in Clarity provide powerful tools for implementing secure and flexible access control in smart contracts. By understanding when and how to use these functions, you can create robust permission systems, ensuring that only authorized entities can perform specific actions or access certain data. Always consider the specific security requirements of your application when implementing access control mechanisms using these principal functions.\n","url":"/docs/stacks/clarity/access-control"},"82":{"id":"/docs/stacks/clarity/functions/list","title":"list","description":"Construct lists in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(list expr1 expr2 expr3 ...)\n```\n\n- Input: `A, ...`\n- Output: `(list A)`\n\n## Why it matters\n\nThe `list` function is crucial for:\n\n1. Constructing lists of elements in Clarity.\n2. Enabling the use of lists for data storage and manipulation.\n3. Simplifying the creation of sequences of values.\n4. Facilitating operations on collections of data.\n\n## When to use it\n\nUse `list` when you need to:\n\n- Construct a list of elements.\n- Store and manipulate sequences of values.\n- Pass lists as arguments to functions.\n- Perform operations on collections of data.\n\n## Best Practices\n\n- Ensure all elements in the list are of the same type.\n- Use meaningful variable names for better readability.\n- Combine with other list functions for comprehensive list handling.\n- Be aware of the maximum length of lists in Clarity.\n\n## Practical Example: Creating a List of Integers\n\nLet's implement a function that creates a list of integers and returns its length:\n\n```clarity\n(define-read-only (create-list)\n (let\n (\n (numbers (list 1 2 3 4 5))\n )\n (len numbers)\n )\n)\n\n;; Usage\n(create-list) ;; Returns u5\n```\n\nThis example demonstrates:\n1. Using `list` to create a list of integers.\n2. Binding the list to a variable using `let`.\n3. Returning the length of the list using `len`.\n\n## Common Pitfalls\n\n1. Using `list` with elements of different types, causing type errors.\n2. Assuming the list will always be within a certain length, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete list checks.\n4. Overlooking the need for comprehensive validation and error checking.\n\n## Related Functions\n\n- `len`: Returns the length of a list.\n- `append`: Adds an element to the end of a list.\n- `concat`: Concatenates multiple lists.\n\n## Conclusion\n\nThe `list` function is a fundamental tool for constructing lists in Clarity smart contracts. It allows you to create sequences of values, enabling robust and comprehensive list handling and manipulation. When used effectively, `list` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage collections of data.\n","url":"/docs/stacks/clarity/functions/list"},"83":{"id":"/docs/stacks/clarity/functions/tuple","title":"tuple","description":"Use tuples to group data values with named fields in Clarity smart contracts.","content":"\n## Type Definition\n\n```clarity\n{label-0: value-type-0, label-1: value-type-1, ...}\n```\n\n- Input: `various types`\n- Output: `tuple`\n\n## Why it matters\n\nThe `tuple` type is crucial for:\n\n1. Grouping related data values with named fields.\n2. Implementing complex data structures in smart contracts.\n3. Ensuring data integrity by providing a clear structure for related values.\n4. Simplifying the process of handling grouped data in smart contracts.\n\n## When to use it\n\nUse `tuple` when you need to:\n\n- Group related data values with named fields.\n- Implement complex data structures in your smart contract.\n- Ensure data integrity by providing a clear structure for related values.\n- Handle grouped data in your smart contract.\n\n## Best Practices\n\n- Use descriptive names for tuple fields for better readability.\n- Ensure the types of the tuple fields are appropriate for the data they represent.\n- Combine with other data types and functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Using Tuples to Store User Information\n\nLet's implement a function that stores and retrieves user information using tuples:\n\n```clarity\n(define-map UserInfo { userId: principal } { name: (string-ascii 20), age: uint })\n\n(define-public (set-user-info (user principal) (name (string-ascii 20)) (age uint))\n (begin\n (map-set UserInfo { userId: user } { name: name, age: age })\n (ok true)\n )\n)\n\n(define-read-only (get-user-info (user principal))\n (map-get? UserInfo { userId: user })\n)\n\n;; Usage\n(set-user-info tx-sender \"Alice\" u30) ;; Sets the user info\n(get-user-info tx-sender) ;; Returns (some { name: \"Alice\", age: u30 })\n```\n\nThis example demonstrates:\n1. Using tuples to store user information with named fields.\n2. Implementing functions to set and get user information using tuples.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using non-descriptive names for tuple fields, causing confusion.\n2. Assuming the tuple structure will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-set`: Sets a value in a map.\n- `map-get?`: Retrieves a value from a map.\n- `default-to`: Provides a default value if an optional is `none`.\n\n## Conclusion\n\nThe `tuple` type is a fundamental tool for grouping related data values with named fields in Clarity smart contracts. It allows you to implement complex data structures, ensuring data integrity and simplifying data management. When used effectively, `tuple` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle grouped data.\n","url":"/docs/stacks/clarity/functions/tuple"},"84":{"id":"/docs/stacks/clarity/functions/sha256","title":"sha256","description":"Compute the SHA-256 hash of a value in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(sha256 value)\n```\n\n- Input: `buff | uint | int`\n- Output: `(buff 32)`\n\n## Why it matters\n\nThe `sha256` function is crucial for:\n\n1. Computing the SHA-256 hash of a given value.\n2. Implementing cryptographic operations in smart contracts.\n3. Ensuring data integrity by generating unique hashes.\n4. Simplifying the process of handling cryptographic hashing in smart contracts.\n\n## When to use it\n\nUse `sha256` when you need to:\n\n- Compute the SHA-256 hash of a given value.\n- Implement cryptographic operations in your smart contract.\n- Generate unique hashes to ensure data integrity.\n- Handle cryptographic hashing operations.\n\n## Best Practices\n\n- Ensure the input value is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for comprehensive security management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Computing a SHA-256 Hash\n\nLet's implement a function that computes the SHA-256 hash of a given buffer:\n\n```clarity\n(define-read-only (compute-sha256 (input (buff 32)))\n (sha256 input)\n)\n\n;; Usage\n(compute-sha256 0x68656c6c6f20776f726c64000000000000000000000000000000000000000000)\n;; Returns 0x28effae679c457da1e5158c063b3dfa78d0ade721b9aa9f1fc3f46dba4c0ea15\n```\n\nThis example demonstrates:\n1. Using `sha256` to compute the hash of a given buffer.\n2. Implementing a public function to handle the hash computation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `sha256` with incorrectly formatted or invalid input values, causing the operation to fail.\n2. Assuming the hash will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete cryptographic hashing.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `sha512`: Computes the SHA-512 hash of the input.\n- `sha512/256`: Computes the SHA-512/256 hash of the input.\n- `keccak256`: Computes the KECCAK-256 hash of the input.\n\n## Conclusion\n\nThe `sha256` function is a fundamental tool for computing SHA-256 hashes in Clarity smart contracts. It allows you to implement cryptographic operations, ensuring data integrity and simplifying cryptographic hashing. When used effectively, `sha256` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle cryptographic hashing operations.\n","url":"/docs/stacks/clarity/functions/sha256"},"85":{"id":"/docs/stacks/clarity/functions/unwrap","title":"unwrap!","description":"Unpack optional and response types in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(unwrap! option-input thrown-value)\n```\n\n- Input: `(optional A) | (response A B), C`\n- Output: `A`\n\n## Why it matters\n\nThe `unwrap!` function is crucial for:\n\n1. Unpacking optional and response types to access their inner values.\n2. Implementing logic that requires handling optional and response types.\n3. Ensuring data integrity by validating the unpacking process.\n4. Simplifying the process of handling optional and response types in smart contracts.\n\n## When to use it\n\nUse `unwrap!` when you need to:\n\n- Unpack optional and response types to access their inner values.\n- Implement logic that requires handling optional and response types.\n- Validate the unpacking process to ensure data integrity.\n- Handle optional and response types in your smart contract.\n\n## Best Practices\n\n- Ensure the input value is an optional or response type.\n- Use meaningful variable names for better readability.\n- Combine with other error handling functions for comprehensive error management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Unpacking an Optional Value\n\nLet's implement a function that retrieves a value from a map and unpacks it using `unwrap!`:\n\n```clarity\n(define-map UserInfo { userId: principal } { name: (string-ascii 20), age: uint })\n\n(define-public (get-user-age (user principal))\n (let\n (\n (userData (unwrap! (map-get? UserInfo { userId: user }) (err \"User not found\")))\n )\n (ok (get age userData))\n )\n)\n\n;; Usage\n(map-set UserInfo { userId: tx-sender } { name: \"Alice\", age: u30 })\n(get-user-age tx-sender) ;; Returns (ok u30)\n(get-user-age 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) ;; Returns (err \"User not found\")\n```\n\nThis example demonstrates:\n1. Using `unwrap!` to unpack an optional value from a map.\n2. Implementing a public function to handle the unpacking process.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `unwrap!` with values that are not optional or response types, causing runtime errors.\n2. Assuming the unpacking will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete error management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `try!`: Unpacks optional and response types, returning `none` or the `err` value if unpacking fails.\n- `unwrap-panic`: Unpacks optional and response types, throwing a runtime error if unpacking fails.\n- `default-to`: Provides a default value if an optional is `none`.\n\n## Conclusion\n\nThe `unwrap!` function is a fundamental tool for unpacking optional and response types in Clarity smart contracts. It allows you to implement logic that requires handling optional and response types, ensuring data integrity and simplifying the unpacking process. When used effectively, `unwrap!` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle optional and response types.\n","url":"/docs/stacks/clarity/functions/unwrap"},"86":{"id":"/docs/stacks/clarity/functions/contract-call","title":"contract-call?","description":"Execute public functions in other smart contracts from within a Clarity smart contract.","content":"\n## Function Signature\n\n```clarity\n(contract-call? .contract-name function-name arg0 arg1 ...)\n```\n\n- Input: \n - `.contract-name`: The name of the contract to call\n - `function-name`: The name of the public function to execute\n - `arg0, arg1, ...`: Arguments to pass to the function\n- Output: `(response A B)` where A and B are the types returned by the called function\n\n## Why it matters\n\nThe `contract-call?` function is crucial for:\n\n1. Enabling inter-contract communication and composability.\n2. Allowing contracts to leverage functionality from other contracts.\n3. Building complex systems of interacting smart contracts.\n4. Implementing upgradeable contract patterns.\n\n## When to use it\n\nUse the `contract-call?` function when you need to:\n\n- Call a public function in another contract.\n- Interact with standardized contracts (e.g., token contracts).\n- Split complex logic across multiple contracts for better organization.\n- Implement upgradeable systems by calling into newer contract versions.\n\n## Best Practices\n\n- Always check the return value of `contract-call?` as it returns a response type.\n- Be aware that `contract-call?` cannot be used to call functions within the same contract.\n- Consider the gas costs of external contract calls in your overall transaction budget.\n- Use `as-contract` when appropriate to make calls with the contract's own principal.\n\n## Practical Example: Interacting with a Token Contract\n\nLet's implement a function that transfers tokens using a standard token contract:\n\n```clarity\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (contract-call? .token-contract transfer amount tx-sender recipient)\n)\n\n;; Usage\n(transfer-tokens u100 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM)\n```\n\nThis example demonstrates:\n1. Using `contract-call?` to interact with another contract (`.token-contract`).\n2. Passing arguments to the called function, including the current `tx-sender`.\n3. Returning the response from the called function directly.\n\n## Common Pitfalls\n\n1. Forgetting to handle the response from `contract-call?`, which can lead to unexpected behavior.\n2. Attempting to use `contract-call?` to call functions within the same contract, which is not allowed.\n3. Not considering the possibility of the called contract changing or being upgraded.\n\n## Related Functions\n\n- `as-contract`: Often used in combination with `contract-call?` to make calls as the contract principal.\n- `try!`: Useful for handling the response from `contract-call?` and propagating errors.\n- `unwrap!`: Can be used to extract the success value from a `contract-call?` response or return an error.\n\n## Conclusion\n\nThe `contract-call?` function is a fundamental building block for creating complex, interacting systems of smart contracts on the Stacks blockchain. By enabling contracts to call functions in other contracts, this function promotes code reuse, modularity, and upgradability. However, you must be careful to handle responses correctly and consider the implications of external calls on your contract's behavior and gas usage.\n","url":"/docs/stacks/clarity/functions/contract-call"},"87":{"id":"/docs/stacks/clarity/functions/buff-to-int-be","title":"buff-to-int-be","description":"Convert a byte buffer to a signed integer using big-endian encoding in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(buff-to-int-be (buff 16))\n```\n\n- Input: A byte buffer of up to 16 bytes\n- Output: A signed integer (`int`)\n\n## Why it matters\n\nThe `buff-to-int-be` function is crucial for:\n\n1. Converting byte data to signed integers in smart contracts.\n2. Handling data from external sources or other contracts that use big-endian encoding.\n3. Implementing protocols or algorithms that require big-endian integer representation.\n4. Interoperating with systems that use big-endian byte order.\n\n## When to use it\n\nUse the `buff-to-int-be` function when you need to:\n\n- Convert a big-endian encoded byte buffer to a signed integer.\n- Process input data that represents signed integers in big-endian format.\n- Implement cryptographic or mathematical operations that expect big-endian integer inputs.\n- Ensure compatibility with external systems using big-endian encoding.\n\n## Best Practices\n\n- Ensure the input buffer is no larger than 16 bytes to avoid errors.\n- Be aware that smaller buffers are zero-padded on the left, affecting the resulting integer value.\n- Consider using `buff-to-uint-be` for unsigned integers if the sign is not needed.\n- Handle potential errors when the input buffer might be invalid or empty.\n\n## Practical Example: Decoding a Signed Integer from External Data\n\nLet's implement a function that processes external data containing a big-endian encoded signed integer:\n\n```clarity\n(define-read-only (process-external-data (data (buff 16)))\n (let\n (\n (value (buff-to-int-be data))\n )\n (if (< value 0)\n (err \"Negative value not allowed\")\n (ok value)\n )\n )\n)\n\n;; Usage\n(process-external-data 0x0000000000000001) ;; Returns (ok 1)\n(process-external-data 0xffffffffffffffff) ;; Returns (err \"Negative value not allowed\")\n(process-external-data 0x7fffffffffffffff) ;; Returns (ok 9223372036854775807)\n```\n\nThis example demonstrates:\n1. Using `buff-to-int-be` to convert external data to a signed integer.\n2. Handling both positive and negative values resulting from the conversion.\n3. Implementing input validation based on the converted integer value.\n\n## Common Pitfalls\n\n1. Forgetting that the function interprets the input as big-endian, which might lead to unexpected values if the data is actually little-endian.\n2. Not handling potential negative values when working with signed integers.\n3. Assuming a specific buffer length, which could lead to unexpected results with shorter inputs due to left-padding.\n\n## Related Functions\n\n- `buff-to-int-le`: Converts a byte buffer to a signed integer using little-endian encoding.\n- `buff-to-uint-be`: Converts a byte buffer to an unsigned integer using big-endian encoding.\n- `int-to-ascii`: Converts an integer to its ASCII string representation.\n\n## Conclusion\n\nThe `buff-to-int-be` function is a powerful tool for working with big-endian encoded signed integers in Clarity smart contracts. By understanding its behavior with different input sizes and potential sign issues, you can effectively process and validate external data, implement complex algorithms, and ensure compatibility with big-endian systems in your smart contract applications.\n","url":"/docs/stacks/clarity/functions/buff-to-int-be"},"88":{"id":"/docs/stacks/clarity/functions/int-to-ascii","title":"int-to-ascii","description":"Convert integers to ASCII string representations in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(int-to-ascii value)\n```\n\n- Input: `int | uint`\n- Output: `(string-ascii 40)`\n\n## Why it matters\n\nThe `int-to-ascii` function is crucial for:\n\n1. Converting integer values to their string representations.\n2. Facilitating the display and logging of numeric data.\n3. Enabling the use of numeric values in contexts that require strings.\n4. Simplifying the process of creating human-readable outputs from numeric data.\n\n## When to use it\n\nUse `int-to-ascii` when you need to:\n\n- Convert an integer or unsigned integer to a string.\n- Display numeric values in a human-readable format.\n- Log or store numeric data as strings.\n- Prepare numeric data for concatenation with other strings.\n\n## Best Practices\n\n- Ensure the integer value is within the range that can be represented as a string.\n- Use meaningful variable names for better readability.\n- Combine with other string functions for more complex string manipulations.\n- Be aware of the maximum length of the resulting string (40 characters).\n\n## Practical Example: Logging a User's Balance\n\nLet's implement a function that logs a user's balance as a string:\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (log-balance (user principal))\n (let\n (\n (balance (default-to u0 (map-get? UserBalances { userId: user })))\n (balanceStr (int-to-ascii balance))\n )\n (print balanceStr)\n )\n)\n\n;; Usage\n(map-set UserBalances { userId: tx-sender } { balance: u100 })\n(log-balance tx-sender) ;; Logs \"100\"\n```\n\nThis example demonstrates:\n1. Using `int-to-ascii` to convert a user's balance to a string.\n2. Logging the string representation of the balance using `print`.\n3. Handling the case where the user has no balance set.\n\n## Common Pitfalls\n\n1. Assuming the resulting string will always fit within 40 characters.\n2. Forgetting to handle cases where the integer value is not set or is zero.\n3. Using `int-to-ascii` in performance-critical sections without considering the overhead.\n4. Not combining with other string functions for more complex manipulations.\n\n## Related Functions\n\n- `print`: Used to log or display string values.\n- `concat`: Used to concatenate multiple strings.\n- `default-to`: Used to provide default values for optional types.\n\n## Conclusion\n\nThe `int-to-ascii` function is a powerful tool for converting integer values to their string representations in Clarity smart contracts. This function enables you to create human-readable outputs from numeric data, facilitating logging, display, and storage of numeric values as strings. When used effectively, `int-to-ascii` enhances the readability and usability of numeric data within your smart contract code.\n","url":"/docs/stacks/clarity/functions/int-to-ascii"},"89":{"id":"/docs/stacks/clarity/functions/map-delete","title":"map-delete","description":"Remove an entry from a map in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(map-delete map-name key-tuple)\n```\n\n- Input: `MapName, tuple`\n- Output: `bool`\n\n## Why it matters\n\nThe `map-delete` function is crucial for:\n\n1. Removing entries from a map.\n2. Managing and updating the state of data stored in maps.\n3. Ensuring data integrity by allowing the deletion of obsolete or incorrect entries.\n4. Simplifying the process of maintaining clean and accurate data in smart contracts.\n\n## When to use it\n\nUse `map-delete` when you need to:\n\n- Remove an entry from a map.\n- Manage and update the state of data stored in maps.\n- Ensure data integrity by deleting obsolete or incorrect entries.\n- Maintain clean and accurate data in your smart contract.\n\n## Best Practices\n\n- Ensure the key-tuple accurately identifies the entry to be deleted.\n- Use meaningful variable names for better readability.\n- Combine with other map functions for comprehensive map management.\n- Be aware of the performance implications of frequent deletions in large maps.\n\n## Practical Example: Deleting a User's Data\n\nLet's implement a function that deletes a user's data from a map:\n\n```clarity\n(define-map UserData { userId: principal } { data: (buff 32) })\n\n(define-public (delete-user-data (user principal))\n (ok (map-delete UserData { userId: user }))\n)\n\n;; Usage\n(map-set UserData { userId: tx-sender } { data: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef }) ;; Returns true\n(delete-user-data tx-sender) ;; Returns (ok true)\n```\n\nThis example demonstrates:\n1. Using `map-delete` to remove a user's data from the `UserData` map.\n2. Implementing a public function to delete the data.\n3. Handling the case where the user's data is present and needs to be removed.\n\n## Common Pitfalls\n\n1. Using `map-delete` with an incorrect key-tuple, causing the deletion to fail.\n2. Assuming the entry will always exist, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-set`: Sets the value associated with a key in a map.\n- `map-get?`: Retrieves an entry from a map.\n- `map-insert`: Inserts a value into a map if the key does not already exist.\n\n## Conclusion\n\nThe `map-delete` function is a fundamental tool for managing data in Clarity smart contracts. It allows you to remove entries from maps, ensuring data integrity and maintaining clean and accurate data. When used effectively, `map-delete` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage map entries.\n","url":"/docs/stacks/clarity/functions/map-delete"},"90":{"id":"/docs/stacks/clarity/functions/contract-of","title":"contract-of","description":"Retrieve the principal of a contract implementing a trait in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(contract-of <trait-reference>)\n```\n\n- Input: A trait reference\n- Output: The principal of the contract implementing the trait\n\n## Why it matters\n\nThe `contract-of` function is crucial for:\n\n1. Retrieving the principal (address) of a contract implementing a specific trait.\n2. Enabling dynamic interactions with contracts based on traits.\n3. Implementing contract-agnostic functions that work with any contract adhering to a specific interface.\n4. Enhancing interoperability between contracts in a composable ecosystem.\n\n## When to use it\n\nUse the `contract-of` function when you need to:\n\n- Get the actual contract address from a trait reference.\n- Perform operations that require the contract's principal, such as authorization checks.\n- Implement functions that can work with multiple contracts implementing the same trait.\n- Debug or log information about which contract is being interacted with.\n- Manage routing logic between different versions of contracts for upgradeable smart contracts.\n- Implement access control mechanisms to restrict function calls to designated contracts.\n\n## Best Practices\n\n- Use `contract-of` in combination with traits to create more flexible and composable smart contracts.\n- Remember that `contract-of` returns a principal, which can be used in other Clarity functions expecting a contract address.\n- Consider using `contract-of` when implementing proxy or router contracts that work with multiple similar contracts.\n- Be aware that `contract-of` can only be used with trait references, not with direct contract references.\n\n## Practical Example: Modular Approach to Extension Contracts\n\nLet's implement a system where specific functions can only be called by designated extension contracts:\n\n### Define the Extension Trait\n\nFirst, define a trait for the extension contract:\n\n```clarity\n(define-trait extension-trait\n\t(\n\t\t(callback (principal (buff 34)) (response bool uint))\n\t)\n)\n```\n\n### Implement the Main Contract\n\nNext, implement the main contract with the `request-extension-callback` function:\n\n```clarity\n(use-trait extensionTrait .extension-trait.extension-trait)\n(define-map Extensions principal bool)\n\n(define-public (set-extension (extension principal) (enabled bool))\n (ok (map-set Extensions extension enabled))\n)\n\n(define-public (request-extension-callback (extension <extensionTrait>) (memo (buff 34)))\n (let\n (\n (sender tx-sender)\n )\n (asserts! (and (is-extension contract-caller) (is-eq contract-caller (contract-of extension))) (err u1))\n (as-contract (contract-call? extension callback sender memo))\n )\n)\n\n(define-read-only (is-extension (extension principal))\n (default-to false (map-get? Extensions extension))\n)\n```\n\n### Explanation\n\n1. **Define the Extension Trait**: The `extensionTrait` defines a `callback` function that the extension contract must implement.\n2. **Data Map for Valid Extensions**: `Extensions` is a map that stores the status (enabled/disabled) of extension contracts.\n3. **Public Function `set-extension`**: This function allows adding or removing an extension contract from the `Extensions` map.\n4. **Public Function `request-extension-callback`**: This function:\n - Retrieves the principal of the extension contract using `contract-of`.\n - Asserts that the caller is a valid extension and matches the extension principal.\n - Calls the `callback` function on the extension contract using `contract-call?`.\n5. **Read-Only Function `is-extension`**: This function checks if a given contract principal is in the `Extensions` map and is enabled.\n\n### Usage\n\n1. **Set an Extension**:\n ```clarity\n (set-extension 'SP2J4ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6 true)\n ```\n\n2. **Request Extension Callback**:\n ```clarity\n (request-extension-callback .extension-contract (buff 34 \"example memo\"))\n ```\n\nThis example demonstrates:\n1. Using `contract-of` to get the principal of the extension contract implementing the extension trait.\n2. Implementing a read-only function to check if the caller is a valid extension.\n3. Restricting access to certain functions based on the authorized extension contracts.\n4. Allowing the authorized extension contracts to call specific functions.\n\n## Common Pitfalls\n\n1. Attempting to use `contract-of` with a direct contract reference instead of a trait reference.\n2. Forgetting that `contract-of` returns a principal, not a contract reference itself.\n3. Not handling potential errors when working with trait references that might not be properly initialized.\n\n## Related Functions\n\n- `use-trait`: Used to define trait references that can be used with `contract-of`.\n- `contract-call?`: Often used in combination with `contract-of` to call functions on the retrieved contract.\n- `is-eq`: Can be used to compare the returned principal with known contract addresses.\n\n## Conclusion\n\nThe `contract-of` function is a powerful tool for creating flexible and interoperable smart contracts in Clarity. By allowing contracts to dynamically retrieve the principal of trait-implementing contracts, this function enables the creation of more generic and reusable code. When used effectively, `contract-of` can significantly enhance the composability and modularity of your smart contract ecosystem, especially in scenarios like access control management where restricting function calls to designated contracts is essential.\n","url":"/docs/stacks/clarity/functions/contract-of"},"91":{"id":"/docs/stacks/clarity/functions/keccak256","title":"keccak256","description":"Compute the Keccak-256 hash of a buffer in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(keccak256 value)\n```\n\n- Input: `buff`\n- Output: `(buff 32)`\n\n## Why it matters\n\nThe `keccak256` function is crucial for:\n\n1. Computing cryptographic hashes of data.\n2. Ensuring data integrity and authenticity.\n3. Implementing cryptographic operations in smart contracts.\n4. Creating unique identifiers for data.\n\n## When to use it\n\nUse `keccak256` when you need to:\n\n- Compute a cryptographic hash of a buffer.\n- Verify data integrity and authenticity.\n- Generate unique identifiers for data.\n- Implement cryptographic operations in your contract.\n\n## Best Practices\n\n- Ensure the input buffer is of the correct length and format.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for more complex operations.\n- Be aware of the security implications of using cryptographic hashes.\n\n## Practical Example: Hashing a User's Data\n\nLet's implement a function that computes the Keccak-256 hash of a user's data:\n\n```clarity\n(define-map UserData { userId: principal } { data: (buff 32) })\n\n(define-public (hash-user-data (user principal))\n (let\n (\n (data (default-to (buff 0) (map-get? UserData { userId: user })))\n (hash (keccak256 data))\n )\n (ok hash)\n )\n)\n\n;; Usage\n(map-set UserData { userId: tx-sender } { data: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef })\n(hash-user-data tx-sender) ;; Returns the Keccak-256 hash of the data\n```\n\nThis example demonstrates:\n1. Using `keccak256` to compute the hash of a user's data.\n2. Implementing a public function to return the hash.\n3. Handling the case where the user's data is not set by providing a default value.\n\n## Common Pitfalls\n\n1. Using `keccak256` on non-buffer types, causing type errors.\n2. Not handling cases where the input buffer is empty or invalid.\n3. Overlooking the need for proper error handling and validation.\n4. Assuming the hash function is collision-resistant without understanding its limitations.\n\n## Related Functions\n\n- `sha256`: Computes the SHA-256 hash of a buffer.\n- `hash160`: Computes the RIPEMD-160 hash of the SHA-256 hash of a buffer.\n- `concat`: Concatenates multiple buffers.\n\n## Conclusion\n\nThe `keccak256` function is a powerful tool for computing cryptographic hashes in Clarity smart contracts. It allows you to ensure data integrity and authenticity, generate unique identifiers, and implement cryptographic operations. When used effectively, `keccak256` enhances the security and reliability of your smart contract code by providing a robust mechanism for hashing data.\n","url":"/docs/stacks/clarity/functions/keccak256"},"92":{"id":"/docs/stacks/clarity/functions/define-constant","title":"define-constant","description":"Define immutable constants in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(define-constant name expression)\n```\n\n- Input: \n - `name`: The name of the constant\n - `expression`: The value to be assigned to the constant\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-constant` function is crucial for:\n\n1. Declaring immutable values that can be reused throughout the contract.\n2. Improving code readability by giving meaningful names to fixed values.\n3. Optimizing gas costs by avoiding repeated computations of fixed values.\n4. Ensuring certain values remain unchanged throughout the contract's lifecycle.\n\n## When to use it\n\nUse `define-constant` when you need to:\n\n- Define fixed values that won't change during contract execution.\n- Create named constants for magic numbers or frequently used values.\n- Declare contract-wide configuration parameters.\n- Optimize gas usage for values that are computed but never change.\n\n## Best Practices\n\n- Use uppercase names for constants to distinguish them from variables.\n- Place constant definitions at the top of your contract for better visibility.\n- Use constants for values that are used multiple times in your contract.\n- Consider using constants for contract configuration that might need to change between deployments.\n\n## Practical Example: Token Configuration\n\nLet's implement a simple token contract using constants for configuration:\n\n```clarity\n(define-constant TOKEN_NAME \"DOG-GO-TO-THE-MOON\")\n(define-constant TOKEN_SYMBOL \"DOG\")\n(define-constant TOKEN_DECIMALS u6)\n(define-constant TOKEN_SUPPLY u1000000000000) ;; 1 million tokens with 6 decimals\n\n(define-fungible-token DOG-GO-TO-THE-MOON TOKEN_SUPPLY)\n\n(define-read-only (get-name)\n TOKEN_NAME\n)\n\n(define-read-only (get-symbol)\n TOKEN_SYMBOL\n)\n\n(define-read-only (get-decimals)\n TOKEN_DECIMALS\n)\n\n(define-read-only (get-balance (who principal))\n (ok (ft-get-balance DOG-GO-TO-THE-MOON who))\n)\n```\n\nThis example demonstrates:\n1. Using `define-constant` to set up token configuration parameters.\n2. Referencing these constants in various parts of the contract.\n3. Improving readability and maintainability of the contract.\n\n## Common Pitfalls\n\n1. Attempting to modify a constant after it's defined, which is not allowed.\n2. Using `define-constant` for values that need to change during contract execution (use `define-data-var` instead).\n3. Overusing constants for values used only once, which can decrease readability.\n\n## Related Functions\n\n- `define-data-var`: Used for defining mutable variables.\n- `define-map`: Used for defining data maps.\n- `var-get`: Used to retrieve the value of a data variable (not needed for constants).\n\n## Conclusion\n\nThe `define-constant` function is a powerful tool for creating immutable, named values in Clarity smart contracts. By using constants effectively, you can improve code readability, optimize gas usage, and ensure certain values remain fixed throughout your contract's lifecycle. When designing your contract, consider which values should be constants and which might need to be mutable variables.\n","url":"/docs/stacks/clarity/functions/define-constant"},"93":{"id":"/docs/stacks/clarity/functions/xor","title":"xor","description":"Perform a bitwise exclusive OR operation in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(xor int1 int2)\n```\n\n- Input: `int, int`\n- Output: `int`\n\n## Why it matters\n\nThe `xor` function is crucial for:\n\n1. Performing bitwise operations essential for cryptographic functions.\n2. Implementing conditional logic that requires toggling between states.\n3. Enhancing data security through simple encryption mechanisms.\n4. Simplifying the process of handling bitwise operations in smart contracts.\n\n## When to use it\n\nUse `xor` when you need to:\n\n- Perform bitwise exclusive OR operations.\n- Implement simple encryption or decryption mechanisms.\n- Toggle between two states based on certain conditions.\n- Enhance the security of your smart contract through cryptographic operations.\n\n## Best Practices\n\n- Ensure the integers used with `xor` are within the valid range for your application.\n- Use meaningful variable names to enhance code readability.\n- Combine `xor` with other logical operations to implement complex conditions.\n- Handle possible edge cases to ensure robust contract behavior.\n\n## Practical Example: Simple Encryption\n\nLet's implement a simple encryption and decryption mechanism using the `xor` function:\n\n```clarity\n(define-public (encrypt (data int) (key int))\n (ok (xor data key))\n)\n\n(define-public (decrypt (encryptedData int) (key int))\n (ok (xor encryptedData key))\n)\n\n;; Usage\n(encrypt 42 123) ;; Encrypts 42 with key 123, returns (ok 81)\n(decrypt 165 123) ;; Decrypts 165 with key 123, returns (ok 222)\n```\n\nThis example demonstrates:\n1. Using `xor` to perform a bitwise exclusive OR operation.\n2. Implementing public functions to handle encryption and decryption.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `xor` with non-integer types, causing runtime errors.\n2. Misunderstanding the behavior of `xor`, leading to incorrect logic implementation.\n3. Not considering edge cases, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `and`: Performs a bitwise AND operation.\n- `or`: Performs a bitwise OR operation.\n- `not`: Performs a bitwise NOT operation.\n\n## Conclusion\n\nThe `xor` function is a powerful tool for performing bitwise exclusive OR operations in Clarity smart contracts. It allows you to implement cryptographic functions, conditional logic, and simple encryption mechanisms, enhancing the security and functionality of your smart contracts. When used effectively, `xor` simplifies the process of handling bitwise operations and ensures robust contract behavior.\n","url":"/docs/stacks/clarity/functions/xor"},"94":{"id":"/docs/stacks/clarity/functions/principal-of","title":"principal-of?","description":"Derive a principal from a public key in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(principal-of? public-key)\n```\n\n- Input: `(buff 33)`\n- Output: `(response principal uint)`\n\n## Why it matters\n\nThe `principal-of?` function is crucial for:\n\n1. Deriving a principal from a public key.\n2. Managing identities and permissions in smart contracts.\n3. Ensuring data integrity by validating public key to principal conversion.\n4. Simplifying the process of handling principals derived from public keys.\n\n## When to use it\n\nUse `principal-of?` when you need to:\n\n- Derive a principal from a public key.\n- Manage identities and permissions in your smart contract.\n- Validate the conversion of a public key to a principal.\n- Handle principal derivation operations.\n\n## Best Practices\n\n- Ensure the `public-key` is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other principal functions for comprehensive identity management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Deriving a Principal\n\nLet's implement a function that derives a principal from a public key:\n\n```clarity\n(define-public (derive-principal (public-key (buff 33)))\n (principal-of? public-key)\n)\n\n;; Usage\n(derive-principal 0x0390a5cac7c33fda49f70bc1b0866fa0ba7a9440d9de647fecb8132ceb76a94dfa) ;; Returns (ok 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM)\n```\n\nThis example demonstrates:\n1. Using `principal-of?` to derive a principal from a public key.\n2. Implementing a public function to handle the principal derivation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `principal-of?` with an incorrectly formatted or invalid `public-key`, causing the operation to fail.\n2. Assuming the principal will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete principal management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `principal-construct?`: Constructs a principal from its components.\n- `principal-destruct?`: Decomposes a principal into its components.\n- `contract-caller`: Returns the caller of the current contract context.\n\n## Conclusion\n\nThe `principal-of?` function is a fundamental tool for deriving principals from public keys in Clarity smart contracts. It allows you to manage identities and permissions, ensuring data integrity and simplifying principal handling. When used effectively, `principal-of?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle principal derivation operations.\n","url":"/docs/stacks/clarity/functions/principal-of"},"95":{"id":"/docs/stacks/clarity/functions/get-burn-block-info","title":"get-burn-block-info?","description":"Fetch information about burnchain blocks in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(get-burn-block-info? prop-name block-height)\n```\n\n- Input: \n - `prop-name`: A BurnBlockInfoPropertyName\n - `block-height`: A uint representing the burnchain block height\n- Output: `(optional buff) | (optional (tuple (addrs (list 2 (tuple (hashbytes (buff 32)) (version (buff 1))))) (payout uint)))`\n\n## Why it matters\n\nThe `get-burn-block-info?` function is crucial for:\n\n1. Accessing historical data from the underlying burnchain (Bitcoin).\n2. Implementing cross-chain verification or logic based on Bitcoin block information.\n3. Retrieving PoX (Proof of Transfer) related data for advanced stacking operations.\n4. Enabling contracts to react to or validate burnchain events.\n\n## When to use it\n\nUse `get-burn-block-info?` when you need to:\n\n- Verify Bitcoin block hashes within your Stacks contract.\n- Access information about PoX payouts and addresses.\n- Implement logic that depends on burnchain block data.\n- Build cross-chain applications that reference Bitcoin state.\n\n## Best Practices\n\n- Always check if the returned value is `none`, as it will be for non-existent or future blocks.\n- Be aware of the potential for chain reorganizations when using recent block data.\n- Use the appropriate property name for the data you need to retrieve.\n- Consider caching results for frequently accessed block information to save on execution costs.\n\n## Practical Example: Verifying a Bitcoin Block Hash\n\nLet's implement a function that verifies if a given Bitcoin block hash matches a specific height:\n\n```clarity\n(define-read-only (verify-btc-block-hash (height uint) (expectedHash (buff 32)))\n (match (get-burn-block-info? header-hash height) hash\n (is-eq hash expectedHash)\n false\n )\n)\n\n;; Usage\n(verify-btc-block-hash u700000 0x00000000000000000009a11b3972c8e532e964e262c196556bd958b7fd0c55c3)\n```\n\nThis example demonstrates:\n1. Using `get-burn-block-info?` to retrieve the `header-hash` of a burnchain block.\n2. Handling the optional return value with `match`.\n3. Comparing the retrieved hash with an expected value.\n\n## Available Properties\n\n- `header-hash`: Returns a 32-byte buffer representing the header hash of the burnchain block.\n- `pox-addrs`: Returns a tuple containing PoX payout information:\n - `addrs`: A list of up to two PoX addresses that received payouts.\n - `payout`: The amount of burnchain tokens paid to each address.\n\n## Common Pitfalls\n\n1. Assuming all properties are available for all blocks.\n2. Not handling the `none` case when the block height is invalid or in the future.\n3. Misinterpreting the `pox-addrs` data, especially during different PoX phases.\n4. Overlooking the fact that burn addresses may be included in the `pox-addrs` list.\n\n## Related Functions\n\n- `get-block-info?`: Used to get information about Stacks blocks.\n- `burn-block-height`: Keyword that returns the current burn chain block height.\n\n## Conclusion\n\nThe `get-burn-block-info?` function is a powerful tool for accessing burnchain data in Clarity smart contracts. It allows you to incorporate Bitcoin blockchain information into your contract logic, enabling cross-chain verification and advanced PoX-related functionalities. When used correctly, this function provides valuable insights into the underlying Bitcoin blockchain's state and can be used to implement sophisticated, cross-chain aware contract behavior.\n","url":"/docs/stacks/clarity/functions/get-burn-block-info"},"96":{"id":"/docs/stacks/clarity/functions/fold","title":"fold","description":"Reduce a sequence to a single value in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(fold <function> <sequence> <initial-value>)\n```\n\n- Input: \n - `<function>`: A function that takes two arguments and returns a single value\n - `<sequence>`: A list, buffer, or string to iterate over\n - `<initial-value>`: The starting value for the accumulation\n- Output: The final accumulated value\n\n## Why it matters\n\nThe `fold` function is crucial for:\n\n1. Aggregating values from a sequence into a single result.\n2. Performing complex computations on list elements.\n3. Transforming data structures efficiently.\n4. Implementing recursive-like operations without explicit recursion.\n\n## When to use it\n\nUse `fold` when you need to:\n\n- Calculate a sum, product, or other aggregate value from a list.\n- Transform a list into a single value or different data structure.\n- Apply a function to each element of a sequence while maintaining state.\n- Implement algorithms that would typically require recursion.\n\n## Best Practices\n\n- Ensure the function passed to `fold` is commutative if the order of operations doesn't matter.\n- Use meaningful initial values that make sense for your aggregation.\n- Consider using `fold` instead of explicit loops for cleaner, more functional code.\n- Be mindful of the performance implications when folding over large sequences.\n\n## Practical Example: Summing a List of Numbers\n\nLet's implement a function that sums all numbers in a list:\n\n```clarity\n(define-read-only (sum-list (numbers (list 10 uint)))\n (fold + numbers u0)\n)\n\n;; Usage\n(sum-list (list u1 u2 u3 u4 u5)) ;; Returns u15\n```\n\nThis example demonstrates:\n1. Using `fold` with the built-in `+` function to sum numbers.\n2. Starting with an initial value of `u0`.\n3. Applying the operation to each element in the list.\n\n## Common Pitfalls\n\n1. Using an initial value of the wrong type or that doesn't make sense for the operation.\n2. Forgetting that `fold` processes elements from left to right, which matters for non-commutative operations.\n3. Overusing `fold` for operations that might be more clearly expressed with other functions like `map` or `filter`.\n\n## Related Functions\n\n- `map`: Applies a function to each element in a sequence, returning a new sequence.\n- `filter`: Selects elements from a sequence based on a predicate function.\n- `reduce`: Similar to `fold` in other languages, but Clarity uses `fold` for this operation.\n\n## Conclusion\n\nThe `fold` function is a powerful tool for aggregating and transforming data in Clarity smart contracts. It allows you to express complex computations on sequences in a concise and functional manner. When used effectively, `fold` can simplify code, improve readability, and provide an efficient way to process collections of data within smart contracts.\n","url":"/docs/stacks/clarity/functions/fold"},"97":{"id":"/docs/stacks/clarity/functions/define-map","title":"define-map","description":"Define a data map in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(define-map map-name key-type value-type)\n```\n\n- Input: \n - `map-name`: The name of the map\n - `key-type`: The type of the map's keys\n - `value-type`: The type of the map's values\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-map` function is crucial for:\n\n1. Creating key-value stores within smart contracts.\n2. Efficiently organizing and accessing structured data.\n3. Implementing complex data structures like mappings or dictionaries.\n4. Storing and retrieving contract-specific data associated with unique keys.\n\n## When to use it\n\nUse `define-map` when you need to:\n\n- Store and retrieve data associated with unique keys.\n- Implement lookup tables or dictionaries in your contract.\n- Organize data that needs to be accessed by a specific identifier.\n- Create data structures that can be efficiently updated and queried.\n\n## Best Practices\n\n- Choose appropriate types for keys and values to ensure efficient storage and retrieval.\n- Use meaningful names for your maps that reflect their purpose in the contract.\n- Consider using composite keys (tuples) for more complex data relationships.\n- Be mindful of the gas costs associated with map operations, especially for large datasets.\n\n## Practical Example: Simple User Profile System\n\nLet's implement a basic user profile system using `define-map`:\n\n```clarity\n(define-map UserProfiles principal { name: (string-ascii 50), age: uint, isActive: bool })\n\n(define-public (set-profile (name (string-ascii 50)) (age uint))\n (ok (map-set UserProfiles tx-sender { name: name, age: age, isActive: true }))\n)\n\n(define-read-only (get-profile (user principal))\n (default-to { name: \"\", age: u0, isActive: false } (map-get? UserProfiles user))\n)\n\n(define-public (deactivate-profile)\n (match (map-get? UserProfiles tx-sender) profile\n (ok (map-set UserProfiles tx-sender (merge profile { isActive: false })))\n (err u404)\n )\n)\n\n;; Usage\n(set-profile \"Ryan\" u38)\n(get-profile tx-sender)\n(deactivate-profile)\n```\n\nThis example demonstrates:\n1. Using `define-map` to create a user profile storage system.\n2. Implementing functions to set, get, and update profile data.\n3. Using map operations like `map-set`, `map-get?`, and `merge` to manipulate map data.\n4. Handling cases where a profile might not exist using `default-to`.\n\n## Common Pitfalls\n\n1. Forgetting that maps are not iterable in Clarity; you can't loop through all entries.\n2. Not handling cases where a key might not exist in the map.\n3. Overusing maps for data that might be better suited for other data structures.\n4. Not considering the gas costs of map operations in complex contracts.\n\n## Related Functions\n\n- `map-get?`: Used to retrieve a value from a map, returns an optional.\n- `map-set`: Used to set or update a value in a map.\n- `map-delete`: Used to remove a key-value pair from a map.\n- `map-insert`: Used to insert a new key-value pair only if the key doesn't already exist.\n- `merge`: Used to merge two maps, combining their key-value pairs.\n\n## Conclusion\n\nThe `define-map` function is a powerful tool for creating structured data storage in Clarity smart contracts. It allows you to implement efficient key-value stores, enabling complex data relationships and lookups. When used effectively, maps can significantly enhance the functionality and organization of data within your smart contracts.\n","url":"/docs/stacks/clarity/functions/define-map"},"98":{"id":"/docs/stacks/clarity/functions/stx-account","title":"stx-account","description":"Query STX account information in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(stx-account principal)\n```\n\n- Input: `principal`\n- Output: `(tuple (balance uint) (nonce uint) (stx-locked uint))`\n\n## Why it matters\n\nThe `stx-account` function is crucial for:\n\n1. Querying detailed information about a STX account.\n2. Implementing logic that requires account balance, nonce, and locked STX information.\n3. Ensuring data integrity by providing accurate account details.\n4. Simplifying the process of handling account-related operations in smart contracts.\n\n## When to use it\n\nUse `stx-account` when you need to:\n\n- Query detailed information about a STX account.\n- Implement logic that requires account balance, nonce, and locked STX information.\n- Ensure accurate account details for data integrity.\n- Handle account-related operations in your smart contract.\n\n## Best Practices\n\n- Ensure the `principal` is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other account functions for comprehensive account management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Querying STX Account Information\n\nLet's implement a function that queries the STX account information for a given principal:\n\n```clarity\n(define-read-only (get-stx-account-info (account principal))\n (stx-account account)\n)\n\n;; Usage\n(get-stx-account-info 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns (tuple (balance u0) (nonce u0) (stx-locked u0))\n```\n\nThis example demonstrates:\n1. Using `stx-account` to query detailed information about a STX account.\n2. Implementing a public function to handle the account information query.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `stx-account` with an incorrectly formatted or invalid `principal`, causing the operation to fail.\n2. Assuming the account information will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete account management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `stx-get-balance`: Queries the STX balance of a principal.\n- `stx-transfer?`: Transfers STX from one principal to another.\n- `stx-burn?`: Burns STX from a principal's account.\n\n## Conclusion\n\nThe `stx-account` function is a fundamental tool for querying detailed STX account information in Clarity smart contracts. It allows you to implement logic that requires account balance, nonce, and locked STX information, ensuring data integrity and simplifying account-related operations. When used effectively, `stx-account` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle account information queries.\n","url":"/docs/stacks/clarity/functions/stx-account"},"99":{"id":"/docs/stacks/clarity/functions/define-public","title":"define-public","description":"Define public functions in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(define-public (function-name (arg-name-0 arg-type-0) ...) function-body)\n```\n\n- Input: \n - `function-name`: The name of the public function\n - `arg-name-N`: The name of each argument\n - `arg-type-N`: The type of each argument\n - `function-body`: The code to be executed when the function is called\n- Output: A ResponseType (using `ok` or `err`)\n\n## Why it matters\n\nThe `define-public` function is crucial for:\n\n1. Creating functions that can be called from outside the contract.\n2. Enabling interaction with the contract through transactions.\n3. Implementing the main entry points for contract functionality.\n4. Allowing other contracts to call this contract's functions.\n\n## When to use it\n\nUse `define-public` when you need to:\n\n- Create functions that users can directly interact with.\n- Implement core contract functionality that should be accessible externally.\n- Define functions that other contracts can call via `contract-call?`.\n- Create functions that modify contract state and need to be invoked through transactions.\n\n## Best Practices\n\n- Always return a response type (`(response T E)`) from public functions.\n- Use descriptive names for public functions to clearly indicate their purpose.\n- Implement proper access control for sensitive operations.\n- Handle potential errors and edge cases within the function.\n- Consider gas costs when designing public functions.\n\n## Practical Examples\n\n### Example 1: Simple Counter\n\nLet's implement a simple counter that can be incremented by users:\n\n```clarity\n(define-data-var counter int 0)\n\n(define-public (increment-counter)\n (begin\n (var-set counter (+ (var-get counter) 1))\n (ok (var-get counter))\n )\n)\n```\n\nThis example demonstrates:\n1. Using `define-public` to create a function that can be called externally.\n2. Incrementing a counter and returning the new value.\n3. Returning a response type to indicate success.\n\n### Example 2: Setting a Value\n\nLet's implement a function that sets a value if it meets certain conditions:\n\n```clarity\n(define-data-var storedValue uint u0)\n\n(define-public (set-value (value uint))\n (if (> value u0)\n (begin\n (var-set storedValue value)\n (ok value)\n )\n (err u1)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `define-public` to create a function that can be called externally.\n2. Setting a value only if it meets a condition.\n3. Returning a response type to indicate success or failure.\n\n## Common Pitfalls\n\n1. Forgetting to return a response type, which will cause a contract to be invalid.\n2. Not implementing proper access controls, potentially allowing unauthorized actions.\n3. Overlooking potential error conditions or edge cases.\n4. Creating functions that are too complex or gas-intensive for practical use.\n\n## Related Functions\n\n- `define-private`: Used to define private functions that can only be called within the contract.\n- `define-read-only`: Used to define public read-only functions that don't modify contract state.\n- `contract-call?`: Used by other contracts to call public functions defined with `define-public`.\n\n## Conclusion\n\nThe `define-public` function is a fundamental building block for creating interactive and composable smart contracts in Clarity. By defining public functions, you can create contracts that users and other contracts can interact with, enabling complex decentralized applications. However, it's crucial to design these functions with security, efficiency, and usability in mind.\n","url":"/docs/stacks/clarity/functions/define-public"},"100":{"id":"/docs/stacks/clarity/functions/define-data-var","title":"define-data-var","description":"Define mutable variables in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(define-data-var name type value)\n```\n\n- Input: \n - `name`: The name of the variable\n - `type`: The type of the variable\n - `value`: The initial value of the variable\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-data-var` function is crucial for:\n\n1. Creating mutable state variables that can be updated throughout the contract's lifecycle.\n2. Storing and managing changeable data within the smart contract.\n3. Implementing counters, flags, or other dynamic values that need to be modified.\n4. Maintaining contract-wide state that can be accessed and modified by multiple functions.\n\n## When to use it\n\nUse `define-data-var` when you need to:\n\n- Create a variable that will change its value during contract execution.\n- Implement a counter or accumulator that needs to be updated.\n- Store temporary or intermediate state that may be modified by contract functions.\n- Maintain configurable parameters that can be updated by authorized parties.\n\n## Best Practices\n\n- Use `define-data-var` for values that need to change; for immutable values, use `define-constant` instead.\n- Initialize variables with meaningful default values.\n- Consider access control for functions that modify important data variables.\n- Use clear and descriptive names for your variables to enhance readability.\n\n## Practical Example: Simple Counter\n\nLet's implement a basic counter using `define-data-var`:\n\n```clarity\n(define-data-var counter uint u0)\n\n(define-public (increment)\n (begin\n (var-set counter (+ (var-get counter) u1))\n (ok (var-get counter))\n )\n)\n\n(define-public (decrement)\n (begin\n (asserts! (> (var-get counter) u0) (err u\"Counter cannot be negative\"))\n (var-set counter (- (var-get counter) u1))\n (ok (var-get counter))\n )\n)\n\n(define-read-only (get-counter)\n (ok (var-get counter))\n)\n```\n\nThis example demonstrates:\n1. Using `define-data-var` to create a mutable counter.\n2. Implementing functions to increment and decrement the counter.\n3. Using `var-get` and `var-set` to read and modify the variable's value.\n4. Adding a safety check to prevent the counter from becoming negative.\n\n## Common Pitfalls\n\n1. Forgetting that `define-data-var` creates mutable state, which can lead to unexpected behavior if not managed carefully.\n2. Not considering the initial value's impact on contract logic, especially if the contract relies on the variable's state.\n3. Overusing mutable variables when constants or maps might be more appropriate for the use case.\n\n## Related Functions\n\n- `var-get`: Used to retrieve the current value of a data variable.\n- `var-set`: Used to update the value of a data variable.\n- `define-constant`: Used for defining immutable values.\n- `define-map`: Used for defining key-value stores when more complex data structures are needed.\n\n## Conclusion\n\nThe `define-data-var` function is essential for creating mutable state in Clarity smart contracts. It allows you to implement dynamic behavior and maintain changeable data throughout your contract's lifecycle. When used judiciously, data variables can greatly enhance the functionality and flexibility of smart contracts. However, you should be mindful of the implications of mutable state and ensure proper access control and error handling when modifying these variables.\n","url":"/docs/stacks/clarity/functions/define-data-var"},"101":{"id":"/docs/stacks/clarity/functions/nft-transfer","title":"nft-transfer?","description":"Transfer ownership of a non-fungible token (NFT) in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(nft-transfer? asset-class asset-identifier sender recipient)\n```\n\n- Input: `AssetName, A, principal, principal`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `nft-transfer?` function is crucial for:\n\n1. Changing the ownership of a non-fungible token (NFT).\n2. Implementing logic that depends on the transfer of NFTs.\n3. Ensuring data integrity by updating ownership records.\n4. Simplifying the process of transferring NFTs in smart contracts.\n\n## When to use it\n\nUse `nft-transfer?` when you need to:\n\n- Change the ownership of an NFT.\n- Implement logic that depends on the transfer of NFTs.\n- Update ownership records in your smart contract.\n- Handle NFT transfer operations.\n\n## Best Practices\n\n- Ensure the `sender` principal owns the NFT before attempting to transfer it.\n- Ensure the `sender` and `recipient` are different principals.\n- Use meaningful variable names for better readability.\n- Combine with other NFT functions for comprehensive NFT management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Transferring an NFT\n\nLet's implement a function that transfers an NFT from the sender to the recipient:\n\n```clarity\n(define-non-fungible-token Stackaroo (string-ascii 40))\n\n(define-public (transfer-nft (id (string-ascii 40)) (recipient principal))\n (nft-transfer? Stackaroo id tx-sender recipient)\n)\n\n;; Usage\n(nft-mint? Stackaroo \"Roo\" tx-sender) ;; Returns (ok true)\n(transfer-nft \"Roo\" 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true)\n(nft-transfer? Stackaroo \"Roo\" tx-sender 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (err u1) because the sender no longer owns the asset\n(nft-transfer? Stackaroo \"NonExistent\" tx-sender 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (err u2) because the asset does not exist\n```\n\nThis example demonstrates:\n1. Using `nft-transfer?` to transfer an NFT from the sender to the recipient.\n2. Implementing a public function to handle the transfer operation.\n3. Handling both the successful transfer and the case where the sender no longer owns the asset.\n4. Handling the case where the asset does not exist.\n\n## Common Pitfalls\n\n1. Using `nft-transfer?` without ensuring the `sender` owns the NFT, causing the operation to fail.\n2. Assuming the `sender` and `recipient` are the same principal, leading to an invalid transfer.\n3. Not handling all possible conditions, resulting in incomplete NFT management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `nft-mint?`: Mints a new non-fungible token.\n- `nft-get-owner?`: Retrieves the owner of a non-fungible token.\n- `nft-burn?`: Burns a non-fungible token.\n\n## Conclusion\n\nThe `nft-transfer?` function is a fundamental tool for transferring ownership of non-fungible tokens in Clarity smart contracts. It allows you to change NFT ownership, implement transfer logic, and ensure data integrity. When used effectively, `nft-transfer?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle NFT transfer operations.\n","url":"/docs/stacks/clarity/functions/nft-transfer"},"102":{"id":"/docs/stacks/clarity/functions/multiply","title":"multiply","description":"Use the multiplication function for arithmetic operations in Clarity smart contracts.","content":"\nThe multiplication function (`*`) in Clarity performs multiplication on a variable number of integer inputs. It's a fundamental arithmetic operation used in many smart contract calculations.\n\n## Function Signature\n\n```clarity\n(* i1 i2...)\n```\n\n- Input: Two or more integers (int or uint)\n- Output: A single integer (int or uint)\n\n## Why it matters\n\nThe multiplication function is crucial for:\n\n1. Performing basic arithmetic calculations within smart contracts.\n2. Scaling values, such as calculating fees or interest.\n3. Implementing more complex mathematical operations.\n4. Adjusting token amounts in financial contracts.\n\n## When to use it\n\nUse the multiplication function when you need to:\n\n- Perform basic multiplication in your contract logic.\n- Scale values proportionally.\n- Calculate compound values or rates.\n- Implement mathematical formulas that involve multiplication.\n\n## Best Practices\n\n- Always consider the possibility of overflow when multiplying large numbers.\n- Use appropriate types (int or uint) based on your needs and expected value ranges.\n- Consider using `mul-overflow?` for checked multiplication if overflow detection is needed.\n- Be aware that multiplying by zero will always return zero.\n\n## Practical Example: Token Vesting Contract\n\nLet's implement a simple token vesting contract that uses multiplication to calculate vested amounts:\n\n```clarity\n;; Define constants\n(define-constant VESTING_PERIOD u365) ;; 1 year in days\n(define-constant TOTAL_ALLOCATION u1000000) ;; Total tokens to vest\n\n;; Define data variables\n(define-data-var startTime uint u0)\n(define-data-var beneficiary principal tx-sender)\n\n;; Function to initialize vesting\n(define-public (start-vesting (recipient principal))\n (begin\n (asserts! (is-eq tx-sender (var-get beneficiary)) (err u1))\n (var-set startTime block-height)\n (var-set beneficiary recipient)\n (ok true)\n )\n)\n\n;; Function to calculate vested amount\n(define-read-only (get-vested-amount)\n (let\n (\n (elapsed-time (- block-height (var-get startTime)))\n (vesting-rate (/ TOTAL_ALLOCATION VESTING_PERIOD))\n )\n (if (>= elapsed-time VESTING_PERIOD)\n TOTAL_ALLOCATION\n (* vesting-rate elapsed-time)\n )\n )\n)\n\n;; Function to claim vested tokens\n(define-public (claim-tokens)\n (let\n (\n (vested-amount (get-vested-amount))\n )\n (asserts! (> vested-amount u0) (err u2))\n ;; Here you would typically transfer tokens\n ;; For simplicity, we're just returning the amount\n (ok vested-amount)\n )\n)\n```\n\nThis example demonstrates:\n1. Using multiplication to calculate the vested amount based on elapsed time and vesting rate.\n2. Combining multiplication with division to implement a linear vesting schedule.\n3. Using multiplication as part of a larger mathematical formula in a smart contract context.\n\n## Common Pitfalls\n\n1. Overlooking potential overflow when multiplying large numbers.\n2. Not considering the effect of integer division when combined with multiplication.\n3. Assuming multiplication always increases a value (forgetting about multiplication by fractions < 1 in integer arithmetic).\n\n## Related Functions\n\n- `/`: Used for division operations.\n- `+`: Used for addition operations.\n- `-`: Used for subtraction operations.\n- `mul-overflow?`: Used for checked multiplication with overflow detection.\n\n## Conclusion\n\nThe multiplication function is a fundamental tool for performing arithmetic operations in Clarity smart contracts. By understanding its behavior with different types of inputs and potential edge cases, you can use it effectively to implement various mathematical operations in your contracts, from simple scaling to more complex financial calculations.\n","url":"/docs/stacks/clarity/functions/multiply"},"103":{"id":"/docs/stacks/clarity/functions/default-to","title":"default-to","description":"Provide a default value for optional types in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(default-to default-value option-value)\n```\n\n- Input: \n - `default-value`: A value of type A\n - `option-value`: An optional value of type (optional A)\n- Output: A value of type A\n\n## Why it matters\n\nThe `default-to` function is crucial for:\n\n1. Safely handling optional values in smart contracts.\n2. Providing fallback values when dealing with potentially missing data.\n3. Simplifying code that works with map lookups or other operations that may return `none`.\n4. Improving readability by reducing nested conditionals for optional handling.\n\n## When to use it\n\nUse the `default-to` function when you need to:\n\n- Provide a default value for a map lookup that might return `none`.\n- Handle optional function parameters or return values.\n- Set a fallback value for potentially missing data in your contract logic.\n- Simplify error handling for operations that might not return a value.\n\n## Best Practices\n\n- Choose meaningful default values that make sense in the context of your contract logic.\n- Use `default-to` to make your code more concise and readable when dealing with optionals.\n- Consider the implications of using the default value in your contract's logic.\n- Combine `default-to` with other Clarity functions like `map-get?` for efficient data handling.\n\n## Practical Example: User Profile Lookup\n\nLet's implement a function that retrieves a user's profile information with default values:\n\n```clarity\n(define-map UserProfiles principal { name: (string-ascii 50), age: uint })\n\n(define-read-only (get-user-profile (user principal))\n (let\n (\n (profile (map-get? UserProfiles user))\n )\n {\n name: (default-to \"Anonymous\" (get name profile)),\n age: (default-to u0 (get age profile))\n }\n )\n)\n\n;; Usage\n(map-set UserProfiles tx-sender { name: \"Alice\", age: u30 })\n(get-user-profile tx-sender) ;; Returns { name: \"Alice\", age: u30 }\n(get-user-profile 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5) ;; Returns { name: \"Anonymous\", age: u0 }\n```\n\nThis example demonstrates:\n1. Using `default-to` with `map-get?` to handle potentially missing user profiles.\n2. Providing default values for individual fields within the profile.\n3. Creating a safe way to retrieve user information without explicit null checks.\n\n## Common Pitfalls\n\n1. Forgetting that `default-to` only works with optional types, not with general error handling.\n2. Using default values that might be indistinguishable from valid data, leading to confusion.\n3. Overusing `default-to` where explicit error handling might be more appropriate.\n\n## Related Functions\n\n- `map-get?`: Often used in combination with `default-to` for safe map lookups.\n- `get`: Can return optional values that are then handled by `default-to`.\n- `some`: Used to create optional values that can be handled by `default-to`.\n\n## Conclusion\n\nThe `default-to` function is a powerful tool for handling optional values in Clarity smart contracts. By providing a clean way to specify fallback values, this function enhances code readability and safety when dealing with potentially missing data. When used judiciously, `default-to` can significantly simplify your contract logic and make it more robust against unexpected inputs or states.\n","url":"/docs/stacks/clarity/functions/default-to"},"104":{"id":"/docs/stacks/clarity/functions/get-stacks-block-info","title":"get-stacks-block-info?","description":"Fetch information about Stacks blocks in Clarity smart contracts.","content":"\n<Callout>\nIn Clarity 3, this function replaces the deprecated `get-block-info?` function.\n</Callout>\n\n## Function Signature\n\n```clarity\n(get-stacks-block-info? prop-name block-height)\n```\n\n- Input: \n - `prop-name`: A StacksBlockInfoPropertyName\n - `block-height`: A uint representing the Stacks block height\n- Output: `(optional buff) | (optional uint)` depending on the property\n\n## Why it matters\n\nThe `get-stacks-block-info?` function is crucial for:\n\n1. Accessing historical Stacks block data within smart contracts\n2. Retrieving globally unique block identifiers\n3. Implementing time-based logic using block information\n4. Verifying block-related properties for security or validation purposes\n\n## When to use it\n\nUse `get-stacks-block-info?` when you need to:\n\n- Retrieve unique identifiers for Stacks blocks\n- Access block timestamps for time-based logic\n- Verify block hashes for validation purposes\n- Implement logic that depends on block information\n\n## Best Practices\n\n- Always use `id-header-hash` when global uniqueness is required\n- Handle the `none` case for non-existent or future blocks\n- Be aware of the different timestamp sources before and after epoch 3.0\n- Consider caching frequently accessed block information\n\n## Practical Example: Block Hash Verification\n\n```clarity\n(define-read-only (verify-block-hash (blockHeight uint) (expectedHash (buff 32)))\n (match (get-stacks-block-info? id-header-hash blockHeight)\n hash (is-eq hash expectedHash)\n false\n )\n)\n\n;; Usage\n(verify-block-hash u100 0x374708fff7719dd5979ec875d56cd2286f6d3cf7ec317a3b25632aab28ec37bb)\n```\n\nThis example demonstrates:\n1. Retrieving a block's unique identifier\n2. Handling the optional return value\n3. Comparing block hashes for verification\n\n## Available Properties\n\n- `id-header-hash`: Returns the globally unique index block hash (buff 32)\n- `header-hash`: Returns the Stacks block's header hash (buff 32)\n- `time`: Returns the block time as Unix epoch timestamp (uint)\n\n## Common Pitfalls\n\n1. Using `header-hash` when global uniqueness is required (use `id-header-hash` instead)\n2. Not handling the `none` case for invalid or future block heights\n3. Assuming block times are exact (accuracy varies by epoch):\n - Pre-epoch 3.0: Accurate within two hours\n - Post-epoch 3.0: Must be greater than previous block and at most 15 seconds in the future\n4. Not considering the different timestamp sources across epochs\n\n## Related Functions\n\n- `get-tenure-info?`: Used to get information about block tenures\n- `block-height`: Returns the current block height\n- `at-block`: Used with `id-header-hash` for historical state access\n\n## Conclusion\n\nThe `get-stacks-block-info?` function, introduced in Clarity 3, provides essential access to Stacks block data in smart contracts. This function offers reliable ways to access block identifiers and timestamps, with important considerations for global uniqueness and time accuracy across different epochs. Understanding its properties and limitations is crucial for building robust smart contracts that interact with historical blockchain state.\n\n","url":"/docs/stacks/clarity/functions/get-stacks-block-info"},"105":{"id":"/docs/stacks/clarity/functions/map","title":"map","description":"Apply a function to each element of a list in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(map function list)\n```\n\n- Input: `(function (A) => B)`, `(list A)`\n- Output: `(list B)`\n\n## Why it matters\n\nThe `map` function is crucial for:\n\n1. Applying a function to each element of a list.\n2. Transforming lists by applying operations to their elements.\n3. Simplifying the process of performing bulk operations on lists.\n4. Enhancing code readability and maintainability by abstracting repetitive operations.\n\n## When to use it\n\nUse `map` when you need to:\n\n- Apply a function to each element of a list.\n- Transform a list by applying operations to its elements.\n- Perform bulk operations on lists.\n- Simplify and abstract repetitive operations on list elements.\n\n## Best Practices\n\n- Ensure the function being applied is compatible with the elements of the list.\n- Use meaningful variable names for better readability.\n- Combine with other list functions for comprehensive list handling.\n- Be aware of the performance implications of applying functions to large lists.\n\n## Practical Example: Doubling Each Element in a List\n\nLet's implement a function that doubles each element in a list of integers:\n\n```clarity\n(define-private (double (n int))\n (* n 2)\n)\n\n(define-read-only (double-elements (numbers (list 10 int)))\n (map double numbers)\n)\n\n;; Usage\n(double-elements (list 1 2 3 4 5)) ;; Returns (list 2 4 6 8 10)\n```\n\nThis example demonstrates:\n1. Defining a private function `double` to double an integer.\n2. Using `map` to apply the `double` function to each element in a list.\n3. Implementing a read-only function to return the transformed list.\n4. Handling both small and large input lists.\n\n## Common Pitfalls\n\n1. Using `map` with incompatible function and list element types, causing type errors.\n2. Assuming the list will always be within a certain length, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete list transformations.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `filter`: Filters elements of a list based on a predicate function.\n- `fold`: Reduces a list to a single value by applying a function.\n- `len`: Returns the length of a list.\n\n## Conclusion\n\nThe `map` function is a fundamental tool for applying functions to each element of a list in Clarity smart contracts. It allows you to transform lists, perform bulk operations, and simplify repetitive tasks. When used effectively, `map` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage list transformations.\n","url":"/docs/stacks/clarity/functions/map"},"106":{"id":"/docs/stacks/clarity/functions/sqrti","title":"sqrti","description":"Calculate the integer square root of a number in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(sqrti n)\n```\n\n- Input: `int | uint`\n- Output: `int | uint`\n\n## Why it matters\n\nThe `sqrti` function is crucial for:\n\n1. Calculating the largest integer less than or equal to the square root of a number.\n2. Implementing mathematical operations in smart contracts.\n3. Ensuring data integrity by providing precise integer square root calculations.\n4. Simplifying the process of handling square root operations in smart contracts.\n\n## When to use it\n\nUse `sqrti` when you need to:\n\n- Calculate the integer square root of a number.\n- Implement mathematical operations in your smart contract.\n- Ensure precise integer square root calculations.\n- Handle square root operations.\n\n## Best Practices\n\n- Ensure the input value is non-negative to avoid runtime errors.\n- Use meaningful variable names for better readability.\n- Combine with other mathematical functions for comprehensive calculations.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Calculating Integer Square Roots\n\nLet's implement a function that calculates the integer square root of a given number:\n\n```clarity\n(define-read-only (calculate-sqrti (input uint))\n (sqrti input)\n)\n\n;; Usage\n(calculate-sqrti u11) ;; Returns u3\n(calculate-sqrti u1000000) ;; Returns u1000\n(calculate-sqrti u1) ;; Returns u1\n(calculate-sqrti u0) ;; Returns u0\n```\n\nThis example demonstrates:\n1. Using `sqrti` to calculate the integer square root of a given number.\n2. Implementing a public function to handle the square root calculation.\n3. Handling both small and large input values.\n\n## Common Pitfalls\n\n1. Using `sqrti` with negative numbers, causing the operation to fail.\n2. Assuming the result will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete mathematical operations.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `*`: Multiplies two or more numbers.\n- `+`: Adds two or more numbers.\n- `-`: Subtracts one number from another.\n- `/`: Divides one number by another.\n\n## Conclusion\n\nThe `sqrti` function is a fundamental tool for calculating integer square roots in Clarity smart contracts. It allows you to implement precise mathematical operations, ensuring data integrity and simplifying square root calculations. When used effectively, `sqrti` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle integer square root operations.\n","url":"/docs/stacks/clarity/functions/sqrti"},"107":{"id":"/docs/stacks/clarity/functions/log2","title":"log2","description":"Calculate the base-2 logarithm of a number in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(log2 n)\n```\n\n- Input: `int | uint`\n- Output: `int | uint`\n\n## Why it matters\n\nThe `log2` function is crucial for:\n\n1. Calculating the base-2 logarithm of a number.\n2. Implementing mathematical operations that require logarithmic calculations.\n3. Simplifying the process of determining the power of 2 needed to obtain a given value.\n4. Facilitating operations that depend on logarithmic scaling.\n\n## When to use it\n\nUse `log2` when you need to:\n\n- Calculate the base-2 logarithm of an integer or unsigned integer.\n- Implement logic that depends on logarithmic calculations.\n- Determine the power of 2 needed to obtain a given value.\n- Simplify mathematical operations involving logarithms.\n\n## Best Practices\n\n- Ensure the input value is non-negative, as `log2` fails on negative numbers.\n- Use meaningful variable names for better readability.\n- Combine with other mathematical functions for comprehensive calculations.\n- Be aware of the integer rounding behavior of `log2`.\n\n## Practical Example: Calculating Logarithm of a Number\n\nLet's implement a function that calculates the base-2 logarithm of a given number:\n\n```clarity\n(define-read-only (calculate-log2 (n uint))\n (log2 n)\n)\n\n;; Usage\n(calculate-log2 u8) ;; Returns u3\n(calculate-log2 u16) ;; Returns u4\n```\n\nThis example demonstrates:\n1. Using `log2` to calculate the base-2 logarithm of a given number.\n2. Implementing a read-only function to return the logarithm.\n3. Handling both small and large input values.\n\n## Common Pitfalls\n\n1. Using `log2` on negative numbers, causing the function to fail.\n2. Assuming the result will always be an integer, leading to incorrect expectations.\n3. Not handling all possible conditions, resulting in incomplete calculations.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `sqrti`: Returns the largest integer that is less than or equal to the square root of a number.\n- `pow`: Raises a number to the power of another number.\n- `sqrt`: Returns the square root of a number.\n\n## Conclusion\n\nThe `log2` function is a fundamental tool for calculating the base-2 logarithm of numbers in Clarity smart contracts. It allows you to perform logarithmic calculations, enabling robust and comprehensive mathematical operations. When used effectively, `log2` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage logarithmic calculations.\n","url":"/docs/stacks/clarity/functions/log2"},"108":{"id":"/docs/stacks/clarity/functions/and","title":"and","description":"Use the and function for logical operations in Clarity smart contracts.","content":"\nThe `and` function in Clarity performs a logical AND operation on two or more boolean inputs. It's a fundamental logical operation used in many smart contract conditions and control flows.\n\n## Function Signature\n\n```clarity\n(and b1 b2 ...)\n```\n\n- Input: Two or more boolean values\n- Output: A single boolean value\n\n## Why it matters\n\nThe `and` function is crucial for:\n\n1. Implementing complex conditional logic in smart contracts.\n2. Combining multiple conditions that all need to be true.\n3. Short-circuiting evaluations for efficiency.\n4. Creating sophisticated access control mechanisms.\n\n## When to use it\n\nUse the `and` function when you need to:\n\n- Check if multiple conditions are all true.\n- Implement multi-factor authentication or permissions.\n- Optimize condition checking by short-circuiting.\n- Combine the results of multiple comparison operations.\n\n## Best Practices\n\n- Leverage the short-circuiting behavior for efficiency.\n- Order conditions from most likely to fail to least likely for better performance.\n- Use parentheses to group complex logical expressions for clarity.\n- Consider breaking very complex `and` expressions into separate functions or variables for readability.\n\n## Practical Example: Simple Access Control\n\nLet's implement a simple access control function that uses the `and` function to check multiple conditions:\n\n```clarity\n(define-constant CONTRACT_OWNER tx-sender)\n(define-data-var isAdmin bool false)\n(define-data-var isActive bool true)\n\n(define-public (set-admin (enabled bool))\n (begin\n (asserts! (is-eq tx-sender CONTRACT_OWNER) (err u1))\n (ok (var-set isAdmin enabled))\n )\n)\n\n(define-public (perform-sensitive-action)\n (begin\n (asserts! (and (var-get isAdmin) (var-get isActive)) (err u2))\n ;; Perform the sensitive action here\n (ok true)\n )\n)\n\n;; Usage\n(perform-sensitive-action) ;; Returns (err u2)\n(set-admin true) ;; Returns (ok true)\n(perform-sensitive-action) ;; Returns (ok true)\n```\n\nThis example demonstrates:\n1. Using `and` to check if the sender is an admin and if the contract is active.\n2. Combining multiple conditions in a single `and` expression.\n3. Leveraging short-circuiting to avoid unnecessary computations if the first condition fails.\n\n## Common Pitfalls\n\n1. Forgetting that `and` short-circuits, which might lead to unexpected behavior if side effects are intended in later conditions.\n2. Over-complicating logical expressions, making them hard to read and maintain.\n3. Not considering the order of conditions for optimal performance.\n\n## Related Functions\n\n- `or`: Used for logical OR operations.\n- `not`: Used to negate boolean values.\n- `asserts!`: Often used in combination with `and` for multiple condition checks.\n\n## Conclusion\n\nThe `and` function is a powerful tool for creating complex logical conditions in Clarity smart contracts. By understanding its short-circuiting behavior and using it effectively, you can create efficient and sophisticated contract logic, especially for scenarios requiring multiple conditions to be true simultaneously.\n","url":"/docs/stacks/clarity/functions/and"},"109":{"id":"/docs/stacks/clarity/functions/replace-at","title":"replace-at?","description":"Replace an element at a specific index in a sequence in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(replace-at? sequence index new-element)\n```\n\n- Input: `sequence_A, uint, A`\n- Output: `(response sequence_A uint)`\n\n## Why it matters\n\nThe `replace-at?` function is crucial for:\n\n1. Modifying elements in a sequence at a specific index.\n2. Implementing logic that requires updating sequences.\n3. Ensuring data integrity by validating index and element replacement.\n4. Simplifying the process of handling sequence modifications in smart contracts.\n\n## When to use it\n\nUse `replace-at?` when you need to:\n\n- Modify an element in a sequence at a specific index.\n- Implement logic that requires updating sequences.\n- Validate the index and element replacement in your smart contract.\n- Handle sequence modification operations.\n\n## Best Practices\n\n- Ensure the `index` is within the bounds of the sequence.\n- Use meaningful variable names for better readability.\n- Combine with other sequence functions for comprehensive sequence management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Replacing an Element in a List\n\nLet's implement a function that replaces an element in a list at a specific index:\n\n```clarity\n(define-read-only (replace-element (items (list 5 int)) (index uint) (newElement int))\n (replace-at? items index newElement)\n)\n\n;; Usage\n(replace-element (list 1 2 3 4 5) u2 10) ;; Returns (some (list (1 2 10 4 5)))\n(replace-element (list 1 2 3 4 5) u5 10) ;; Returns (none) because the index is out of bounds\n```\n\nThis example demonstrates:\n1. Using `replace-at?` to modify an element in a list at a specific index.\n2. Implementing a public function to handle the element replacement.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `replace-at?` with an index that is out of bounds, causing the operation to fail.\n2. Assuming the sequence will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete sequence management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `append`: Adds an element to the end of a list.\n- `index-of?`: Returns the first index at which an item can be found in a sequence.\n- `get`: Retrieves an element from a sequence at a specific index.\n\n## Conclusion\n\nThe `replace-at?` function is a fundamental tool for modifying elements in sequences in Clarity smart contracts. It allows you to update sequences, ensuring data integrity and simplifying sequence handling. When used effectively, `replace-at?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle sequence modification operations.\n","url":"/docs/stacks/clarity/functions/replace-at"},"110":{"id":"/docs/stacks/clarity/functions/len","title":"len","description":"Get the length of a sequence in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(len sequence)\n```\n\n- Input: `sequence_A`\n- Output: `uint`\n\n## Why it matters\n\nThe `len` function is crucial for:\n\n1. Determining the length of various sequence types.\n2. Implementing logic that depends on the size of sequences.\n3. Ensuring data integrity by validating sequence lengths.\n4. Simplifying length checks in smart contract code.\n\n## When to use it\n\nUse `len` when you need to:\n\n- Get the length of a list, buffer, or string.\n- Implement logic that depends on the size of sequences.\n- Validate the length of input data.\n- Handle cases where the size of a sequence is important.\n\n## Best Practices\n\n- Ensure the sequence type is compatible with the `len` function.\n- Use meaningful variable names for better readability.\n- Combine with other functions for comprehensive sequence handling.\n- Be aware of the maximum length of sequences in Clarity.\n\n## Practical Example: Validating a List Length\n\nLet's implement a function that validates the length of a list of integers:\n\n```clarity\n(define-read-only (validate-list-length (numbers (list 10 int)))\n (let\n (\n (length (len numbers))\n )\n (if (<= length u10)\n (ok length)\n (err u1)\n )\n )\n)\n\n;; Usage\n(validate-list-length (list 1 2 3 4 5)) ;; Returns (ok u5)\n(validate-list-length (list 1 2 3 4 5 6 7 8 9 10 11)) ;; Returns (err u1)\n```\n\nThis example demonstrates:\n1. Using `len` to get the length of a list of integers.\n2. Implementing conditional logic based on the length of the list.\n3. Handling both the case where the list length is valid and where it is not.\n\n## Common Pitfalls\n\n1. Using `len` on incompatible types, causing type errors.\n2. Assuming the length will always be within a certain range, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete length checks.\n4. Overlooking the need for comprehensive validation and error checking.\n\n## Related Functions\n\n- `as-max-len?`: Ensures a sequence does not exceed a maximum length.\n- `concat`: Concatenates multiple sequences.\n- `default-to`: Provides default values for optional types.\n\n## Conclusion\n\nThe `len` function is a fundamental tool for getting the length of sequences in Clarity smart contracts. It allows you to determine the size of lists, buffers, and strings, enabling robust and comprehensive sequence handling and validation logic. When used effectively, `len` enhances the reliability and maintainability of your smart contract code by ensuring that sequence lengths are detected and handled appropriately.\n","url":"/docs/stacks/clarity/functions/len"},"111":{"id":"/docs/stacks/clarity/functions/sha512-256","title":"sha512/256","description":"Compute the SHA-512/256 hash of a value in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(sha512/256 value)\n```\n\n- Input: `buff | uint | int`\n- Output: `(buff 32)`\n\n## Why it matters\n\nThe `sha512/256` function is crucial for:\n\n1. Computing the SHA-512/256 hash of a given value.\n2. Implementing cryptographic operations in smart contracts.\n3. Ensuring data integrity by generating unique hashes.\n4. Simplifying the process of handling cryptographic hashing in smart contracts.\n\n## When to use it\n\nUse `sha512/256` when you need to:\n\n- Compute the SHA-512/256 hash of a given value.\n- Implement cryptographic operations in your smart contract.\n- Generate unique hashes to ensure data integrity.\n- Handle cryptographic hashing operations.\n\n## Best Practices\n\n- Ensure the input value is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for comprehensive security management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Computing a SHA-512/256 Hash\n\nLet's implement a function that computes the SHA-512/256 hash of a given buffer:\n\n```clarity\n(define-read-only (compute-sha512-256 (input (buff 32)))\n (sha512/256 input)\n)\n\n;; Usage\n(compute-sha512-256 0x68656c6c6f20776f726c64000000000000000000000000000000000000000000)\n;; Returns 0xcf0edb437886eae39b21ebad0caeea342d2bd61c98e9d09d0e89109a546d01fc\n```\n\nThis example demonstrates:\n1. Using `sha512/256` to compute the hash of a given buffer.\n2. Implementing a public function to handle the hash computation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `sha512/256` with incorrectly formatted or invalid input values, causing the operation to fail.\n2. Assuming the hash will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete cryptographic hashing.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `sha256`: Computes the SHA-256 hash of the input.\n- `sha512`: Computes the SHA-512 hash of the input.\n- `keccak256`: Computes the KECCAK-256 hash of the input.\n\n## Conclusion\n\nThe `sha512/256` function is a fundamental tool for computing SHA-512/256 hashes in Clarity smart contracts. It allows you to implement cryptographic operations, ensuring data integrity and simplifying cryptographic hashing. When used effectively, `sha512/256` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle cryptographic hashing operations.\n","url":"/docs/stacks/clarity/functions/sha512-256"},"112":{"id":"/docs/stacks/clarity/functions/divide","title":"divide","description":"Use the division function for arithmetic operations in Clarity smart contracts.","content":"\nThe division function (`/`) in Clarity performs integer division on a variable number of integer inputs. It's a fundamental arithmetic operation used in many smart contract calculations.\n\n## Function Signature\n\n```clarity\n(/ i1 i2...)\n```\n\n- Input: Two or more integers (int or uint)\n- Output: A single integer (int or uint)\n\n## Why it matters\n\nThe division function is crucial for:\n\n1. Performing basic arithmetic calculations within smart contracts.\n2. Calculating rates, percentages, or proportions.\n3. Distributing resources or tokens evenly.\n4. Implementing mathematical formulas that involve division.\n\n## When to use it\n\nUse the division function when you need to:\n\n- Perform basic division in your contract logic.\n- Calculate rates or percentages.\n- Distribute resources evenly among participants.\n- Implement mathematical formulas that involve division.\n\n## Best Practices\n\n- Always consider the possibility of division by zero, which throws a runtime error.\n- Be aware that Clarity uses integer division, so results are always rounded down.\n- Use appropriate types (int or uint) based on your needs and expected value ranges.\n- Consider using multiplication by fractions instead of division for more precise calculations.\n\n## Practical Example: Token Distribution Contract\n\nLet's implement a simple token distribution contract that uses division to allocate tokens evenly:\n\n```clarity\n;; Define constants\n(define-constant TOTAL_TOKENS u1000000)\n(define-constant DISTRIBUTION_ROUNDS u10)\n\n;; Define data variables\n(define-map ParticipantShares principal uint)\n(define-data-var currentRound uint u0)\n(define-data-var participantsCount uint u0)\n\n;; Function to register as a participant\n(define-public (register-participant)\n (let\n (\n (currentParticipants (var-get participantsCount))\n )\n (asserts! (< currentParticipants DISTRIBUTION_ROUNDS) (err u1))\n (map-set ParticipantShares tx-sender u0)\n (var-set participantsCount (+ currentParticipants u1))\n (ok true)\n )\n)\n\n;; Function to distribute tokens\n(define-public (distribute-tokens)\n (let\n (\n (currentParticipants (var-get participantsCount))\n (tokensPerParticipant (/ TOTAL_TOKENS currentParticipants))\n )\n (asserts! (> currentParticipants u0) (err u2))\n (asserts! (< (var-get currentRound) DISTRIBUTION_ROUNDS) (err u3))\n (map-set ParticipantShares tx-sender tokensPerParticipant)\n (var-set currentRound (+ (var-get currentRound) u1))\n (ok tokensPerParticipant)\n )\n)\n\n;; Function to check participant's share\n(define-read-only (get-participant-share (participant principal))\n (default-to u0 (map-get? ParticipantShares participant))\n)\n```\n\nThis example demonstrates:\n1. Using division to calculate the number of tokens each participant should receive.\n2. Handling potential division by zero by checking the number of participants.\n3. Using integer division to evenly distribute tokens among participants.\n\n## Common Pitfalls\n\n1. Forgetting to handle division by zero, which causes a runtime error.\n2. Not accounting for integer division rounding down, which can lead to unexpected results.\n3. Dividing before multiplying in complex calculations, potentially losing precision.\n\n## Related Functions\n\n- `*`: Used for multiplication operations.\n- `+`: Used for addition operations.\n- `-`: Used for subtraction operations.\n\n## Conclusion\n\nThe division function is a fundamental tool for performing arithmetic operations in Clarity smart contracts. By understanding its behavior with integer division and potential edge cases, you can use it effectively to implement various mathematical operations in their contracts, from simple divisions to more complex token distribution algorithms.\n","url":"/docs/stacks/clarity/functions/divide"},"113":{"id":"/docs/stacks/clarity/functions/bit-and","title":"bit-and","description":"Use the bit-and function for bitwise operations in Clarity smart contracts.","content":"\nThe `bit-and` function in Clarity performs a bitwise AND operation on two or more integer inputs. It's a powerful tool for working with compact data representations and flag systems in smart contracts.\n\n## Function Signature\n\n```clarity\n(bit-and i1 i2...)\n```\n\n- Input: Two or more integers (int or uint)\n- Output: A single integer (int or uint)\n\n## Why it matters\n\nThe `bit-and` function is crucial for:\n\n1. Efficient data storage: Allows packing multiple boolean flags into a single integer.\n2. Permission systems: Enables checking for specific permissions in a compact format.\n3. Bitmasking: Useful for isolating specific bits in a larger integer.\n4. Low-level optimizations: Can be used for certain mathematical operations.\n\n## When to use it\n\nUse `bit-and` when you need to:\n\n- Check if specific bits are set in a bitfield\n- Implement compact permission or flag systems\n- Clear specific bits while leaving others unchanged\n- Perform certain low-level optimizations\n\n## Best Practices\n\n- Always use constants for bit flags to improve readability and maintainability.\n- Be cautious when using with signed integers, as the sign bit can affect results.\n- Combine with other bitwise operations like `bit-or` and `bit-not` for more complex manipulations.\n- Document your bit flag meanings clearly in your contract.\n\n## Practical Example: Role-Based Access Control\n\nLet's implement a simple role-based access control system using `bit-and`:\n\n```clarity\n;; Define role constants\n(define-constant ROLE_ADMIN u1) ;; 0001\n(define-constant ROLE_MODERATOR u2) ;; 0010\n(define-constant ROLE_USER u4) ;; 0100\n\n;; Map to store user roles\n(define-map UserRoles principal uint)\n\n;; Function to check if a user has a specific role\n(define-read-only (has-role? (user principal) (role uint))\n (let\n ((userRole (default-to u0 (map-get? UserRoles user))))\n (is-eq (bit-and userRole role) role)\n )\n)\n\n;; Function to add a role to a user\n(define-public (add-role (user principal) (role uint))\n (let\n ((currentRole (default-to u0 (map-get? UserRoles user))))\n (ok (map-set UserRoles user (bit-or currentRole role)))\n )\n)\n\n;; Function to remove a role from a user\n(define-public (remove-role (user principal) (role uint))\n (let\n ((currentRole (default-to u0 (map-get? UserRoles user))))\n (ok (map-set UserRoles user (bit-and currentRole (bit-not role))))\n )\n)\n\n;; Example usage\n(add-role tx-sender (bit-or ROLE_MODERATOR ROLE_USER))\n(has-role? tx-sender ROLE_MODERATOR) ;; Returns true\n(has-role? tx-sender ROLE_ADMIN) ;; Returns false\n(remove-role tx-sender ROLE_USER)\n(has-role? tx-sender ROLE_USER) ;; Returns false\n```\n\nThis example demonstrates:\n1. Using `bit-and` to check for specific roles.\n2. Combining `bit-and` with `bit-or` and `bit-not` for role management.\n3. Efficient storage of multiple roles in a single integer.\n\n## Common Pitfalls\n\n1. Forgetting that `bit-and` with 0 always results in 0.\n2. Not accounting for the sign bit when using signed integers.\n3. Overcomplicating bit flag systems, making them hard to maintain.\n\n## Related Functions\n\n- `bit-or`: Used to set bits or combine flags.\n- `bit-not`: Used to invert bits, often in combination with `bit-and` for clearing specific bits.\n- `bit-xor`: Used for toggling specific bits.\n\n## Conclusion\n\nThe `bit-and` function is a powerful tool for working with compact data representations in Clarity. By mastering this function along with other bitwise operations, you can create efficient and sophisticated smart contracts that make optimal use of storage and perform complex flag-based logic.\n","url":"/docs/stacks/clarity/functions/bit-and"},"114":{"id":"/docs/stacks/clarity/functions/less-than","title":"less than","description":"Use the less than function for comparisons in Clarity smart contracts.","content":"\nThe less than function (`<`) in Clarity compares two values and returns true if the first value is less than the second. It's a fundamental comparison operation used in many smart contract conditions and logic flows.\n\n## Function Signature\n\n```clarity\n(< v1 v2)\n```\n\n- Input: Two values of the same type (int, uint, string-ascii, string-utf8, or buff)\n- Output: A boolean (true or false)\n\n## Why it matters\n\nThe less than function is crucial for:\n\n1. Implementing conditional logic in smart contracts.\n2. Comparing numerical values for financial operations.\n3. Ordering and sorting data.\n4. Implementing maximum thresholds or limits in contract logic.\n\n## When to use it\n\nUse the less than function when you need to:\n\n- Compare two numerical values to determine if one is smaller.\n- Implement maximum thresholds for certain operations.\n- Create conditional logic based on numerical comparisons.\n- Sort or order data based on numerical or lexicographical order.\n\n## Best Practices\n\n- Ensure that both inputs are of the same type to avoid runtime errors.\n- Be aware of the differences in comparison between signed (int) and unsigned (uint) integers.\n- When comparing strings or buffers, understand that the comparison is lexicographical.\n- Consider edge cases, especially when dealing with the limits of integer ranges.\n\n## Practical Example: Auction Contract with Maximum Bid\n\nLet's implement a simple auction contract that uses the less than function to enforce a maximum bid amount:\n\n```clarity\n;; Define constants\n(define-constant MAX_BID u1000000000) ;; 1000 STX\n(define-constant AUCTION_END_HEIGHT u100)\n\n;; Define data variables\n(define-data-var currentHighestBid uint u0)\n(define-data-var highestBidder (optional principal) none)\n\n;; Function to place a bid\n(define-public (place-bid (bid uint))\n (let\n (\n (current-block-height block-height)\n )\n ;; Check if the auction is still open\n (asserts! (< current-block-height AUCTION_END_HEIGHT) (err u1))\n ;; Check if the bid is less than the maximum allowed bid\n (asserts! (< bid MAX_BID) (err u2))\n ;; Check if the bid is higher than the current highest bid\n (asserts! (> bid (var-get currentHighestBid)) (err u3))\n ;; Place the bid\n (try! (stx-transfer? bid tx-sender (as-contract tx-sender)))\n (var-set currentHighestBid bid)\n (var-set highestBidder (some tx-sender))\n (ok bid)\n )\n)\n\n;; Function to check current highest bid\n(define-read-only (get-highest-bid)\n (ok (var-get currentHighestBid))\n)\n\n;; Function to check if auction has ended\n(define-read-only (auction-ended)\n (>= block-height AUCTION_END_HEIGHT)\n)\n```\n\nThis example demonstrates:\n1. Using `<` to check if the current block height is less than the auction end height.\n2. Using `<` to ensure the bid is less than the maximum allowed bid.\n3. Combining the less than check with other contract logic for an auction system.\n\n## Common Pitfalls\n\n1. Comparing values of different types, which will result in a runtime error.\n2. Not considering the inclusive nature of `<=` vs the exclusive nature of `<` when setting thresholds.\n3. Overlooking potential integer underflow when working with very small numbers.\n\n## Related Functions\n\n- `>`: Used for greater than comparisons.\n- `<=`: Used for less than or equal to comparisons.\n- `>=`: Used for greater than or equal to comparisons.\n\n## Conclusion\n\nThe less than function is a fundamental tool for implementing comparison logic in Clarity smart contracts. By understanding its behavior with different types and potential edge cases, you can create robust conditional logic and enforce important thresholds in your contracts.\n","url":"/docs/stacks/clarity/functions/less-than"},"115":{"id":"/docs/stacks/clarity/functions/ft-burn","title":"ft-burn?","description":"Burn fungible tokens in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(ft-burn? token-name amount sender)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n - `amount`: The amount of tokens to burn (uint)\n - `sender`: The principal from whose balance the tokens will be burned\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `ft-burn?` function is crucial for:\n\n1. Decreasing the total supply of a fungible token.\n2. Implementing token burning mechanisms in tokenomics models.\n3. Allowing users to destroy their own tokens.\n4. Managing token supply in deflationary token systems.\n\n## When to use it\n\nUse `ft-burn?` when you need to:\n\n- Implement a token burning feature in your contract.\n- Reduce the circulating supply of a token.\n- Allow users to voluntarily destroy their tokens.\n- Execute deflationary mechanisms in your token economy.\n\n## Best Practices\n\n- Ensure that the `sender` has sufficient balance before attempting to burn.\n- Use `ft-burn?` in conjunction with proper access controls.\n- Consider emitting events or logging burns for transparency.\n- Be cautious when burning tokens from a different principal than `tx-sender`.\n\n## Practical Example: Token Burning Mechanism\n\nLet's implement a simple token burning function:\n\n```clarity\n(define-fungible-token cBtc)\n\n(define-data-var tokenAdmin principal tx-sender)\n\n(define-public (burn-tokens (amount uint))\n (ft-burn? cBtc amount tx-sender)\n)\n\n(define-public (burn-tokens-from (amount uint) (owner principal))\n (begin\n (asserts! (is-eq tx-sender (var-get tokenAdmin)) (err u3))\n (ft-burn? cBtc amount owner)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `ft-burn?` to burn tokens from the transaction sender.\n2. Implementing an admin function to burn tokens from any account.\n3. Using assertions to ensure only the admin can burn tokens from other accounts.\n\n## Common Pitfalls\n\n1. Attempting to burn more tokens than the `sender` has in their balance.\n2. Not checking the return value of `ft-burn?` to handle potential errors.\n3. Allowing unauthorized burning of tokens from other accounts.\n4. Forgetting that burned tokens are permanently destroyed and cannot be recovered.\n\n## Related Functions\n\n- `ft-mint?`: Used to create new tokens, increasing the total supply.\n- `ft-transfer?`: Used to transfer tokens between principals.\n- `ft-get-balance`: Used to check the token balance of a principal.\n- `ft-get-supply`: Used to get the current total supply of tokens.\n\n## Conclusion\n\nThe `ft-burn?` function is a powerful tool for managing the supply of fungible tokens in Clarity smart contracts. It allows for the implementation of deflationary mechanisms and gives users the ability to destroy their own tokens. When used correctly, this function can be a key component in sophisticated tokenomics models. However, it should be used with caution and with proper checks to ensure the integrity of your token system.\n","url":"/docs/stacks/clarity/functions/ft-burn"},"116":{"id":"/docs/stacks/clarity/functions/get","title":"get","description":"Retrieve a value from a tuple in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(get key-name tuple)\n```\n\n- Input: \n - `key-name`: The name of the key in the tuple\n - `tuple`: The tuple to retrieve the value from\n- Output: The value associated with the key in the tuple\n\n## Why it matters\n\nThe `get` function is crucial for:\n\n1. Accessing specific values within tuple data structures.\n2. Extracting information from complex data types in contracts.\n3. Enabling efficient data retrieval in contract logic.\n4. Working with structured data returned by other functions or stored in variables.\n\n## When to use it\n\nUse `get` when you need to:\n\n- Access a specific field in a tuple.\n- Extract values from structured data returned by other functions.\n- Work with complex data types in your contract logic.\n- Implement data processing that involves tuple manipulation.\n\n## Best Practices\n\n- Ensure the key exists in the tuple to avoid runtime errors.\n- Use meaningful key names for better code readability.\n- Consider using `get` in combination with `optional` for safer data access.\n- Be aware of the performance implications when working with large tuples.\n\n## Practical Example: User Profile Management\n\nLet's implement a simple user profile system using tuples and the `get` function:\n\n```clarity\n(define-map UserProfiles { userId: principal } { name: (string-ascii 50), age: uint })\n\n(define-public (set-profile (name (string-ascii 50)) (age uint))\n (ok (map-set UserProfiles { userId: tx-sender } { name: name, age: age }))\n)\n\n(define-read-only (get-profile-name (user principal))\n (match (map-get? UserProfiles { userId: user }) profile\n (ok (get name profile))\n (err u404)\n )\n)\n\n(define-read-only (get-profile-age (user principal))\n (match (map-get? UserProfiles { userId: user }) profile\n (ok (get age profile))\n (err u404)\n )\n)\n\n;; Usage\n(set-profile \"Alice\" u30)\n(get-profile-name tx-sender) ;; Returns (ok \"Alice\")\n(get-profile-age tx-sender) ;; Returns (ok u30)\n```\n\nThis example demonstrates:\n1. Using `get` to retrieve specific fields from a tuple stored in a map.\n2. Implementing getter functions that use `get` to access tuple data.\n3. Handling cases where the profile might not exist.\n\n## Common Pitfalls\n\n1. Attempting to `get` a key that doesn't exist in the tuple, causing a runtime error.\n2. Forgetting that `get` is case-sensitive for key names.\n3. Not considering the performance impact of frequently accessing large tuples.\n\n## Related Functions\n\n- `merge`: Used to combine tuples, potentially creating new fields to `get`.\n- `tuple`: Used to create tuples that can be accessed with `get`.\n- `map-get?`: Often used in combination with `get` to retrieve data from maps.\n\n## Conclusion\n\nThe `get` function is a fundamental tool for working with tuples in Clarity smart contracts. It provides a straightforward way to access structured data, enabling developers to work with complex data types efficiently. When used effectively, `get` enhances the contract's ability to manage and process structured information, leading to more organized and maintainable smart contract code.\n","url":"/docs/stacks/clarity/functions/get"},"117":{"id":"/docs/stacks/clarity/functions/use-trait","title":"use-trait","description":"Import and use traits from other contracts in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(use-trait trait-alias trait-identifier)\n```\n\n- Input: `VarName, TraitIdentifier`\n- Output: `Not Applicable`\n\n## Why it matters\n\nThe `use-trait` function is crucial for:\n\n1. Importing traits defined in other contracts.\n2. Implementing logic that requires conformance to specific interfaces.\n3. Ensuring code reusability and modularity by leveraging traits.\n4. Simplifying the process of using external traits in smart contracts.\n\n## When to use it\n\nUse `use-trait` when you need to:\n\n- Import traits defined in other contracts.\n- Implement logic that requires conformance to specific interfaces.\n- Ensure code reusability and modularity by leveraging traits.\n- Handle trait imports in your smart contract.\n\n## Best Practices\n\n- Use descriptive names for trait aliases for better readability.\n- Ensure the trait identifier is correctly formatted and valid.\n- Combine with other contract functions for comprehensive contract management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Importing and Using a Trait\n\nLet's implement a function that imports a trait and uses it in a contract:\n\n```clarity\n(use-trait token-trait 'SP2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR.token-trait)\n\n(define-public (forward-get-balance (user principal) (contract <token-trait>))\n (ok (contract-of contract))\n)\n\n;; Usage\n(forward-get-balance tx-sender 'SP2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR.token-trait)\n;; Returns the principal of the contract implementing the token-trait\n```\n\nThis example demonstrates:\n1. Using `use-trait` to import a trait from another contract.\n2. Implementing a public function to use the imported trait.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `use-trait` with incorrectly formatted or invalid trait identifiers, causing runtime errors.\n2. Assuming the trait import will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete contract management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `contract-of`: Returns the principal of the contract implementing the trait.\n- `define-trait`: Defines a new trait in the current contract.\n- `impl-trait`: Implements a trait in the current contract.\n\n## Conclusion\n\nThe `use-trait` function is a fundamental tool for importing and using traits from other contracts in Clarity smart contracts. It allows you to implement logic that requires conformance to specific interfaces, ensuring code reusability and modularity. When used effectively, `use-trait` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle trait imports.\n","url":"/docs/stacks/clarity/functions/use-trait"},"118":{"id":"/docs/stacks/clarity/functions/to-uint","title":"to-uint","description":"Convert a signed integer to an unsigned integer in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(to-uint value)\n```\n\n- Input: `int`\n- Output: `uint`\n\n## Why it matters\n\nThe `to-uint` function is crucial for:\n\n1. Converting signed integers to unsigned integers.\n2. Implementing logic that requires unsigned integer operations.\n3. Ensuring data integrity by validating the conversion process.\n4. Simplifying the process of handling integer conversions in smart contracts.\n\n## When to use it\n\nUse `to-uint` when you need to:\n\n- Convert a signed integer to an unsigned integer.\n- Implement logic that requires unsigned integer operations.\n- Validate the conversion process to ensure data integrity.\n- Handle integer conversions in your smart contract.\n\n## Best Practices\n\n- Ensure the input value is non-negative to avoid runtime errors.\n- Use meaningful variable names for better readability.\n- Combine with other integer functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Converting Signed Integer to Unsigned Integer\n\nLet's implement a function that converts a signed integer to an unsigned integer:\n\n```clarity\n(define-read-only (convert-to-uint (input int))\n (to-uint input)\n)\n\n;; Usage\n(convert-to-uint 42) ;; Returns u42\n(convert-to-uint 0) ;; Returns u0\n(convert-to-uint -1) ;; Causes a runtime error\n```\n\nThis example demonstrates:\n1. Using `to-uint` to convert a signed integer to an unsigned integer.\n2. Implementing a public function to handle the conversion process.\n3. Handling both positive and zero input values.\n\n## Common Pitfalls\n\n1. Using `to-uint` with negative values, causing a runtime error.\n2. Assuming the conversion will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `to-int`: Converts an unsigned integer to a signed integer.\n- `int-to-ascii`: Converts an integer to a string-ascii representation.\n- `int-to-utf8`: Converts an integer to a string-utf8 representation.\n\n## Conclusion\n\nThe `to-uint` function is a fundamental tool for converting signed integers to unsigned integers in Clarity smart contracts. It allows you to implement logic that requires unsigned integer operations, ensuring data integrity and simplifying integer conversions. When used effectively, `to-uint` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle integer conversions.\n","url":"/docs/stacks/clarity/functions/to-uint"},"119":{"id":"/docs/stacks/clarity/functions/define-trait","title":"define-trait","description":"Define traits for interface-like behavior in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(define-trait trait-name ((func1-name (arg1-type arg2-type ...) (return-type)) ...))\n```\n\n- Input: \n - `trait-name`: The name of the trait being defined\n - `func1-name`: The name of a function in the trait\n - `arg1-type, arg2-type, ...`: The types of the function's arguments\n - `return-type`: The return type of the function\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-trait` function is crucial for:\n\n1. Creating standardized interfaces for contracts to implement.\n2. Enabling polymorphic behavior in smart contract interactions.\n3. Facilitating contract composability and interoperability.\n4. Allowing for dynamic dispatch of contract calls based on traits.\n\n## When to use it\n\nUse `define-trait` when you need to:\n\n- Define a common interface that multiple contracts should adhere to.\n- Create a contract that can interact with any other contract implementing a specific trait.\n- Establish standards for token contracts or other common smart contract patterns.\n- Enable more flexible and modular smart contract architectures.\n\n## Best Practices\n\n- Use clear and descriptive names for traits and their functions.\n- Keep traits focused on a single responsibility or concept.\n- Consider creating traits for common patterns like token standards.\n- Use traits in combination with `use-trait` and `contract-call?` for dynamic contract interactions.\n\n## Practical Example: Token Trait\n\nLet's define a simple trait for a token contract:\n\n```clarity\n(define-trait token-trait\n (\n (transfer? (principal principal uint) (response bool uint))\n (get-balance (principal) (response uint uint))\n (get-token-uri () (response (optional (string-utf8 256)) uint))\n )\n)\n```\n\nThis example demonstrates:\n1. Defining a trait with multiple functions.\n2. Specifying function signatures with argument types and return types.\n3. Using response types to handle success and failure cases.\n\n## Common Pitfalls\n\n1. Defining overly complex traits that are difficult for other contracts to implement.\n2. Forgetting that traits are not implementations, just interface definitions.\n3. Not considering backwards compatibility when updating traits in newer contract versions.\n\n## Related Functions\n\n- `use-trait`: Used to import trait definitions from other contracts.\n- `impl-trait`: Used to declare that a contract implements a specific trait.\n- `contract-call?`: Often used in combination with traits for dynamic contract calls.\n- `contract-of`: Used to get the principal of a contract implementing a trait.\n\n## Conclusion\n\nThe `define-trait` function is a powerful tool for creating standardized interfaces in Clarity smart contracts. By defining traits, you can create more modular, interoperable, and flexible smart contract ecosystems. Traits enable contracts to interact with each other in a predictable way, fostering the development of complex decentralized applications and standards within the Stacks ecosystem.\n","url":"/docs/stacks/clarity/functions/define-trait"},"120":{"id":"/docs/stacks/clarity/functions/int-to-utf8","title":"int-to-utf8","description":"Convert integers to UTF-8 string representations in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(int-to-utf8 value)\n```\n\n\n\n\n- Input: `int | uint`\n- Output: `(string-utf8 40)`\n\n## Why it matters\n\nThe `int-to-utf8` function is crucial for:\n\n1. Converting integer values to their UTF-8 string representations.\n2. Facilitating the display and logging of numeric data in a more versatile encoding.\n3. Enabling the use of numeric values in contexts that require UTF-8 strings.\n4. Simplifying the process of creating human-readable outputs from numeric data.\n\n## When to use it\n\nUse `int-to-utf8` when you need to:\n\n- Convert an integer or unsigned integer to a UTF-8 string.\n- Display numeric values in a human-readable format.\n- Log or store numeric data as UTF-8 strings.\n- Prepare numeric data for concatenation with other UTF-8 strings.\n\n## Best Practices\n\n- Ensure the integer value is within the range that can be represented as a string.\n- Use meaningful variable names for better readability.\n- Combine with other string functions for more complex string manipulations.\n- Be aware of the maximum length of the resulting string (40 characters).\n\n## Practical Example: Logging a User's Balance\n\nLet's implement a function that logs a user's balance as a UTF-8 string:\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (log-balance (user principal))\n (let\n (\n (balance (default-to u0 (map-get? UserBalances { userId: user })))\n (balanceStr (int-to-utf8 balance))\n )\n (print balanceStr)\n )\n)\n\n;; Usage\n(map-set UserBalances { userId: tx-sender } { balance: u100 })\n(log-balance tx-sender) ;; Logs \"100\"\n```\n\n\n\n\nThis example demonstrates:\n1. Using `int-to-utf8` to convert a user's balance to a UTF-8 string.\n2. Logging the string representation of the balance using `print`.\n3. Handling the case where the user has no balance set.\n\n## Common Pitfalls\n\n1. Assuming the resulting string will always fit within 40 characters.\n2. Forgetting to handle cases where the integer value is not set or is zero.\n3. Using `int-to-utf8` in performance-critical sections without considering the overhead.\n4. Not combining with other string functions for more complex manipulations.\n\n## Related Functions\n\n- `print`: Used to log or display string values.\n- `concat`: Used to concatenate multiple strings.\n- `default-to`: Used to provide default values for optional types.\n\n## Conclusion\n\nThe `int-to-utf8` function is a powerful tool for converting integer values to their UTF-8 string representations in Clarity smart contracts. It enables you to create human-readable outputs from numeric data, facilitating logging, display, and storage of numeric values as strings. When used effectively, `int-to-utf8` enhances the readability and usability of numeric data within your smart contract code.\n","url":"/docs/stacks/clarity/functions/int-to-utf8"},"121":{"id":"/docs/stacks/clarity/functions/ok","title":"ok","description":"Construct a successful response type in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(ok value)\n```\n\n- Input: `A`\n- Output: `(response A B)`\n\n## Why it matters\n\nThe `ok` function is crucial for:\n\n1. Constructing a successful response type.\n2. Indicating that a function executed successfully.\n3. Ensuring data integrity by clearly distinguishing between success and error states.\n4. Simplifying the process of handling function return values in smart contracts.\n\n## When to use it\n\nUse `ok` when you need to:\n\n- Construct a successful response type.\n- Indicate that a function executed successfully.\n- Clearly distinguish between success and error states.\n- Handle function return values in your smart contract.\n\n## Best Practices\n\n- Ensure the value passed to `ok` is the intended successful result.\n- Use meaningful variable names for better readability.\n- Combine with `err` for comprehensive response handling.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Returning a Successful Response\n\nLet's implement a function that returns a successful response with a value:\n\n```clarity\n(define-read-only (get-successful-response (value int))\n (ok value)\n)\n\n;; Usage\n(get-successful-response 5) ;; Returns (ok 5)\n```\n\nThis example demonstrates:\n1. Using `ok` to construct a successful response type.\n2. Implementing a read-only function to return a successful response.\n3. Handling the successful response case.\n\n## Common Pitfalls\n\n1. Using `ok` with an incorrect or invalid value, causing unexpected behavior.\n2. Assuming the response will always be successful, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete response handling.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `err`: Constructs an error response type.\n- `match`: Handles different branches or cases for optional and response types.\n\n## Conclusion\n\nThe `ok` function is a fundamental tool for constructing successful response types in Clarity smart contracts. It allows you to indicate successful function execution, ensure data integrity, and simplify response handling. When used effectively, `ok` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle successful responses.\n","url":"/docs/stacks/clarity/functions/ok"},"122":{"id":"/docs/stacks/clarity/functions/define-non-fungible-token","title":"define-non-fungible-token","description":"Define a new non-fungible token class in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(define-non-fungible-token asset-name asset-identifier-type)\n```\n\n- Input: \n - `asset-name`: The name of the non-fungible token class\n - `asset-identifier-type`: The type of the unique identifier for each token\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-non-fungible-token` function is crucial for:\n\n1. Creating new non-fungible token (NFT) classes within a smart contract.\n2. Establishing unique digital assets with individual identifiers.\n3. Implementing collectibles, digital art, or other unique token-based systems.\n4. Enabling NFT-related operations like minting, transferring, and ownership checks.\n\n## When to use it\n\nUse `define-non-fungible-token` when you need to:\n\n- Create a new NFT class for your smart contract or dApp.\n- Implement unique digital assets with distinct identifiers.\n- Establish a foundation for NFT-based features in your contract.\n- Create collectibles, digital art tokens, or other unique digital assets.\n\n## Best Practices\n\n- Place `define-non-fungible-token` at the top level of your contract, as it's a definition statement.\n- Choose an appropriate asset identifier type that ensures uniqueness for each token.\n- Use meaningful and descriptive names for your NFT classes.\n- Consider the scalability and gas costs associated with your chosen identifier type.\n\n## Practical Example: Simple Digital Art NFT\n\nLet's implement a basic digital art NFT system:\n\n```clarity\n(define-non-fungible-token SharkoBarko uint)\n\n(define-data-var index uint u0)\n\n(define-public (mint (who principal) (artwork-uri (string-utf8 256)))\n (let\n (\n (tokenId (var-get index))\n )\n (try! (nft-mint? SharkoBarko tokenId who))\n (var-set index (+ tokenId u1))\n (ok tokenId)\n )\n)\n\n(define-read-only (get-owner (tokenId uint))\n (ok (nft-get-owner? SharkoBarko tokenId))\n)\n\n(define-public (transfer (tokenId uint) (sender principal) (recipient principal))\n (begin\n (asserts! (is-eq tx-sender sender) (err u403))\n (nft-transfer? SharkoBarko tokenId sender recipient)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `define-non-fungible-token` to create a new NFT class for digital artwork.\n2. Implementing basic NFT operations like minting, checking ownership, and transferring.\n3. Using a simple incrementing integer as the token identifier.\n\n## Common Pitfalls\n\n1. Forgetting that each token in an NFT class must have a unique identifier.\n2. Not implementing proper access controls for minting and transferring operations.\n3. Choosing an identifier type that may lead to collisions or scalability issues.\n\n## Related Functions\n\n- `nft-mint?`: Used to create new tokens within the NFT class.\n- `nft-transfer?`: Used to transfer ownership of an NFT.\n- `nft-get-owner?`: Used to check the current owner of an NFT.\n- `nft-burn?`: Used to destroy an existing NFT.\n\n## Conclusion\n\nThe `define-non-fungible-token` function is a fundamental building block for creating NFT-based systems in Clarity smart contracts. It allows you to define custom non-fungible token classes with unique identifiers. When combined with other NFT-related functions, it enables the implementation of sophisticated systems for digital collectibles, art, and other unique digital assets on the Stacks blockchain.\n","url":"/docs/stacks/clarity/functions/define-non-fungible-token"},"123":{"id":"/docs/stacks/clarity/functions/ft-transfer","title":"ft-transfer?","description":"Transfer fungible tokens between principals in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(ft-transfer? token-name amount sender recipient)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n - `amount`: The amount of tokens to transfer (uint)\n - `sender`: The principal sending the tokens\n - `recipient`: The principal receiving the tokens\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `ft-transfer?` function is crucial for:\n\n1. Moving fungible tokens between different principals within a smart contract.\n2. Implementing token transfer functionality in decentralized applications.\n3. Enabling token-based transactions and interactions between users or contracts.\n4. Facilitating token economy mechanisms within smart contracts.\n\n## When to use it\n\nUse `ft-transfer?` when you need to:\n\n- Transfer tokens from one account to another.\n- Implement payment or reward systems using custom tokens.\n- Allow users to send tokens to each other within your dApp.\n- Move tokens as part of more complex contract operations.\n\n## Best Practices\n\n- Always check the return value to ensure the transfer was successful.\n- Implement proper access controls to prevent unauthorized transfers.\n- Consider using `asserts!` or `try!` to handle transfer failures gracefully.\n- Be aware that any principal can call this function, so add necessary guards.\n- Verify sender has sufficient balance before attempting a transfer.\n\n## Practical Example: Token Transfer Function\n\nLet's implement a public function for transferring tokens with some basic checks:\n\n```clarity\n(define-fungible-token cBtc)\n\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (let\n (\n (sender tx-sender)\n )\n (asserts! (not (is-eq sender recipient)) (err u2))\n (asserts! (> amount u0) (err u3))\n (match (ft-transfer? cBtc amount sender recipient)\n success (ok success)\n error (err error)\n )\n )\n)\n\n;; Usage\n(ft-mint? cBtc u100 tx-sender)\n(transfer-tokens u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true)\n```\n\nThis example demonstrates:\n1. Using `ft-transfer?` within a public function to transfer tokens.\n2. Implementing basic checks for valid transfer conditions.\n3. Handling the response from `ft-transfer?` and propagating it to the caller.\n\n## Common Pitfalls\n\n1. Forgetting that `ft-transfer?` can be called by any principal, potentially leading to unauthorized transfers.\n2. Not handling all possible error cases returned by `ft-transfer?`.\n3. Attempting to transfer more tokens than the sender's balance.\n4. Using `ft-transfer?` with a token name that hasn't been defined in the contract.\n\n## Related Functions\n\n- `ft-mint?`: Used to create new tokens and assign them to a principal.\n- `ft-burn?`: Used to destroy tokens, reducing the balance of a principal.\n- `ft-get-balance`: Used to check the token balance of a principal.\n- `ft-get-supply`: Used to get the current total supply of tokens.\n\n## Conclusion\n\nThe `ft-transfer?` function is a fundamental component for implementing token transfers in Clarity smart contracts. It provides a straightforward way to move tokens between principals, enabling a wide range of token-based functionalities. When used with proper checks and balances, this function allows for the creation of secure and efficient token economies within decentralized applications on the Stacks blockchain.\n","url":"/docs/stacks/clarity/functions/ft-transfer"},"124":{"id":"/docs/stacks/clarity/functions/is-err","title":"is-err","description":"Check if a response is an error in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(is-err value)\n```\n\n- Input: `(response A B)`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-err` function is crucial for:\n\n1. Determining if a response value represents an error.\n2. Implementing error handling and validation logic.\n3. Ensuring robust contract behavior by checking for errors.\n4. Simplifying conditional checks based on response types.\n\n## When to use it\n\nUse `is-err` when you need to:\n\n- Check if a response value is an error.\n- Implement conditional logic based on the success or failure of operations.\n- Validate the results of function calls that return response types.\n- Handle errors gracefully in your contract logic.\n\n## Best Practices\n\n- Use `is-err` in combination with `match` or `if` for comprehensive error handling.\n- Ensure that the response value being checked is of the correct type.\n- Use meaningful variable names for better readability.\n- Combine with other response handling functions like `is-ok` for complete validation.\n\n## Practical Example: Validating a Token Transfer\n\nLet's implement a function that validates a token transfer and checks for errors:\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? UserBalances { userId: tx-sender })))\n (recipientBalance (default-to u0 (map-get? UserBalances { userId: recipient })))\n (transferResult (if (>= senderBalance amount)\n (begin\n (map-set UserBalances { userId: tx-sender } { balance: (- senderBalance amount) })\n (map-set UserBalances { userId: recipient } { balance: (+ recipientBalance amount) })\n (ok true)\n )\n (err u1)\n ))\n )\n (if (is-err transferResult)\n (err u2)\n (ok true)\n )\n )\n)\n\n;; Usage\n(map-set UserBalances { userId: tx-sender } { balance: u100 })\n(transfer-tokens u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true)\n(transfer-tokens u200 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (err u2)\n```\n\nThis example demonstrates:\n1. Using `is-err` to check if the token transfer operation resulted in an error.\n2. Implementing conditional logic based on the success or failure of the transfer.\n3. Handling both the success and error cases appropriately.\n\n## Common Pitfalls\n\n1. Assuming the response value is always of the correct type, leading to type errors.\n2. Not handling all possible error cases, resulting in incomplete error handling.\n3. Overlooking the need for comprehensive validation and error checking.\n4. Using `is-err` without meaningful error codes or messages, making debugging harder.\n\n## Related Functions\n\n- `is-ok`: Checks if a response value is `ok`.\n- `err`: Constructs an error response.\n- `ok`: Constructs a success response.\n\n## Conclusion\n\nThe `is-err` function is a fundamental tool for error handling in Clarity smart contracts. It allows you to check if a response value represents an error, enabling robust and comprehensive error handling and validation logic. When used effectively, `is-err` enhances the reliability and maintainability of your smart contract code by ensuring that errors are detected and handled appropriately.\n","url":"/docs/stacks/clarity/functions/is-err"},"125":{"id":"/docs/stacks/clarity/functions/ft-get-supply","title":"ft-get-supply","description":"Retrieve the total supply of a fungible token in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(ft-get-supply token-name)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n- Output: `uint`\n\n## Why it matters\n\nThe `ft-get-supply` function is crucial for:\n\n1. Querying the current total supply of a fungible token.\n2. Implementing supply-dependent logic in token contracts.\n3. Providing transparency about the token's circulating supply.\n4. Enabling other contracts or off-chain applications to verify token supply.\n\n## When to use it\n\nUse `ft-get-supply` when you need to:\n\n- Check the current total supply of a token.\n- Implement logic that depends on the token's supply (e.g., minting limits).\n- Provide supply information to users or other contracts.\n- Verify the integrity of token operations by checking supply changes.\n\n## Best Practices\n\n- Use `ft-get-supply` in combination with `ft-mint?` and `ft-burn?` to manage token supply.\n- Consider caching the supply result if queried frequently to optimize gas usage.\n- Be aware that the supply can change between checks due to minting or burning operations.\n- Use in conjunction with `ft-get-balance` for comprehensive token management.\n\n## Practical Example: Supply-Limited Minting\n\nLet's implement a function that mints tokens only if it doesn't exceed a certain supply cap:\n\n```clarity\n(define-fungible-token cBtc)\n(define-constant MAX_SUPPLY u1000000)\n\n(define-public (mint (amount uint) (recipient principal))\n (let\n (\n (currentSupply (ft-get-supply cBtc))\n )\n (if (<= (+ currentSupply amount) MAX_SUPPLY)\n (ft-mint? cBtc amount recipient)\n (err u1)\n )\n )\n)\n\n;; Usage\n(mint u500000 tx-sender) ;; Returns (ok true)\n(ft-get-supply cBtc) ;; Returns u500000\n(mint u600000 tx-sender) ;; Returns (err u1)\n```\n\nThis example demonstrates:\n1. Using `ft-get-supply` to check the current token supply before minting.\n2. Implementing a supply cap check to limit token minting.\n3. Combining `ft-get-supply` with `ft-mint?` for supply management.\n\n## Common Pitfalls\n\n1. Assuming the supply remains constant between checks and operations.\n2. Not considering the potential for overflow when adding to the supply.\n3. Overusing `ft-get-supply` in loops, which can be inefficient for gas consumption.\n\n## Related Functions\n\n- `ft-mint?`: Used to create new tokens, increasing the total supply.\n- `ft-burn?`: Used to destroy tokens, decreasing the total supply.\n- `ft-get-balance`: Used to get the token balance of a specific principal.\n- `define-fungible-token`: Used to define the fungible token initially.\n\n## Conclusion\n\nThe `ft-get-supply` function is an essential tool for managing and querying the total supply of fungible tokens in Clarity smart contracts. It provides a straightforward way to access the current circulating supply, enabling you to implement supply-dependent logic and maintain transparency in token operations. When used effectively in combination with other token functions, this function ensures the integrity and accuracy of token supply management within your smart contracts.\n","url":"/docs/stacks/clarity/functions/ft-get-supply"},"126":{"id":"/docs/stacks/clarity/functions/as-max-len","title":"as-max-len?","description":"Use the as-max-len? function to check and limit sequence lengths in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(as-max-len? sequence max_length)\n```\n\n- Input: \n - `sequence`: A sequence of type A (list, buff, string-ascii, or string-utf8)\n - `max_length`: A uint literal representing the maximum allowed length\n- Output: `(optional sequence_A)`\n\n## Why it matters\n\nThe `as-max-len?` function is crucial for:\n\n1. Enforcing length limits on sequences in smart contracts.\n2. Safely appending to lists or other sequences with maximum lengths.\n3. Validating input data before processing.\n4. Preventing potential overflow or excessive resource consumption.\n\n## When to use it\n\nUse the `as-max-len?` function when you need to:\n\n- Check if a sequence is within a specified maximum length.\n- Safely append to a list or other sequence with a known maximum length.\n- Validate user input or data from external sources.\n- Implement logic that depends on sequence length constraints.\n\n## Best Practices\n\n- Always use `as-max-len?` before appending to lists or other sequences with maximum lengths.\n- Combine with `unwrap!` or `unwrap-panic` when you're certain the length should be within limits.\n- Use meaningful error handling when the length check fails.\n- Consider the performance impact of frequent length checks in your contract logic.\n\n## Practical Example: Safe List Append\n\nLet's implement a function that safely appends to a list with a maximum length:\n\n```clarity\n(define-data-var myList (list 5 uint) (list))\n\n(define-public (safe-append (item uint))\n (let\n (\n (newList (unwrap! (as-max-len? (append (var-get myList) item) u5) (err u1)))\n )\n (ok (var-set myList newList))\n )\n)\n\n(define-read-only (get-list)\n (var-get myList)\n)\n\n;; Usage\n(safe-append u1) ;; Returns (ok true)\n(safe-append u2) ;; Returns (ok true)\n(safe-append u3) ;; Returns (ok true)\n(safe-append u4) ;; Returns (ok true)\n(safe-append u5) ;; Returns (ok true)\n(safe-append u6) ;; Returns (err u1)\n\n(get-list) ;; Returns (list u1 u2 u3 u4 u5)\n```\n\nThis example demonstrates:\n1. Using `as-max-len?` to check if appending to the list would exceed the maximum length.\n2. Combining `as-max-len?` with `unwrap!` for concise error handling.\n3. Safely updating a list variable only if the length check passes.\n\n## Common Pitfalls\n\n1. Forgetting to use `as-max-len?` when appending to sequences with maximum lengths.\n2. Using a variable for the `max_length` parameter, which is not allowed (it must be a uint literal).\n3. Not handling the `none` case when `as-max-len?` returns an optional.\n\n## Related Functions\n\n- `append`: Used to add elements to lists.\n- `concat`: Used to join two sequences together.\n- `len`: Used to get the current length of a sequence.\n\n## Conclusion\n\nThe `as-max-len?` function is a critical tool for managing sequence lengths in Clarity smart contracts. By using it consistently, you can create more robust and secure contracts that properly handle length constraints, preventing potential vulnerabilities related to unbounded data growth or unexpected input sizes.\n","url":"/docs/stacks/clarity/functions/as-max-len"},"127":{"id":"/docs/stacks/clarity/functions/get-tenure-info","title":"get-tenure-info?","description":"Fetch information about Stacks tenures in Clarity smart contracts.","content":"\n## Function Signature\n\n\n```clarity\n(get-tenure-info? prop-name block-height)\n```\n\n- Input: \n - `prop-name`: A TenureInfoPropertyName\n - `block-height`: A uint representing the Stacks block height\n- Output: `(optional buff) | (optional uint) | (optional principal)` depending on the property\n\n## Why it matters\n\nThe `get-tenure-info?` function is essential for:\n\n1. Accessing historical tenure data within smart contracts\n2. Retrieving information about block miners and rewards\n3. Accessing VRF seeds for randomness-based applications\n4. Analyzing miner participation and spending patterns\n\n## When to use it\n\nUse `get-tenure-info?` when you need to:\n\n- Access tenure-specific data like VRF seeds or miner addresses\n- Verify tenure timestamps or burnchain information\n- Analyze block rewards and miner spending patterns\n- Implement logic that depends on historical tenure data\n\n## Best Practices\n\n- Always handle the `none` case, as it will be returned for non-existent or future blocks\n- Be aware that block rewards are only available after maturity (101 blocks on mainnet)\n- Consider the two-hour accuracy window when working with tenure timestamps\n- Cache frequently accessed tenure information to optimize execution costs\n\n## Practical Example: Checking Miner Spending\n\n```clarity\n(define-read-only (get-miner-spend-ratio (blockHeight uint)))\n(let\n (\n (winnerSpend (get-tenure-info? miner-spend-winner blockHeight))\n (totalSpend (get-tenure-info? miner-spend-total blockHeight))\n )\n (match (tuple (winner winnerSpend) (total totalSpend))\n success (some (/ (get success \"winner\") (get success \"total\")))\n error none\n )\n)\n```\n\n## Available Properties\n\n- `burnchain-header-hash`: Returns the burnchain block header hash (buff 32)\n- `miner-address`: Returns the tenure miner's principal\n- `time`: Returns the tenure time as Unix epoch timestamp (uint)\n- `vrf-seed`: Returns the VRF seed for the tenure (buff 32)\n- `block-reward`: Returns the total block reward (uint)\n- `miner-spend-total`: Returns total spent by all miners for this tenure (uint)\n- `miner-spend-winner`: Returns amount spent by winning miner (uint)\n\n## Common Pitfalls\n\n1. Not accounting for block reward maturity period (101 blocks)\n2. Relying on exact tenure times (accuracy window of two hours)\n3. Not handling the `none` case for invalid or future block heights\n\n## Related Functions\n\n- `get-block-info?`: Used to get information about Stacks blocks\n- `block-height`: Returns the current block height\n- `burn-block-height`: Returns the current burn chain block height\n\n## Conclusion\n\nThe `get-tenure-info?` function provides crucial access to historical tenure data in Clarity smart contracts. Introduced in Clarity 3, this function enables developers to access detailed information about past tenures, including miner participation, block rewards, and VRF seeds. When used properly, `get-tenure-info?` is a powerful tool for implementing sophisticated contract logic that depends on historical blockchain state.\n","url":"/docs/stacks/clarity/functions/get-tenure-info"},"128":{"id":"/docs/stacks/clarity/functions/bit-xor","title":"bit-xor","description":"Use the bit-xor function for bitwise exclusive OR operations in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(bit-xor i1 i2...)\n```\n\n- Input: Two or more integers (`int` or `uint`)\n- Output: An integer of the same type as the inputs (`int` or `uint`)\n\n## Why it matters\n\nThe `bit-xor` function is crucial for:\n\n1. Performing bitwise exclusive OR operations in smart contracts.\n2. Implementing certain cryptographic algorithms and hash functions.\n3. Creating toggle mechanisms for binary flags.\n4. Detecting changes between two bit patterns.\n\n## When to use it\n\nUse the `bit-xor` function when you need to:\n\n- Implement exclusive OR logic on binary data.\n- Toggle specific bits in a value without affecting others.\n- Compare two bit patterns to find differences.\n- Create simple encryption or hashing mechanisms.\n\n## Best Practices\n\n- Ensure all input values are of the same type (either all `int` or all `uint`).\n- Remember that `bit-xor` with 0 returns the original value, which can be useful for conditional operations.\n- Use `bit-xor` in combination with other bitwise operations for complex bit manipulations.\n- Consider the readability of your code when using bitwise operations extensively; add comments to explain the purpose.\n\n## Practical Example: Simple Toggle Mechanism\n\nLet's implement a simple toggle mechanism using `bit-xor`:\n\n```clarity\n(define-data-var flags uint u0)\n\n(define-read-only (get-flag (flagPosition uint))\n (is-eq (bit-and (var-get flags) (bit-shift-left u1 flagPosition)) u0)\n)\n\n(define-public (toggle-flag (flagPosition uint))\n (begin\n (asserts! (< flagPosition u8) (err u1)) ;; Ensure flag position is valid\n (ok (var-set flags (bit-xor (var-get flags) (bit-shift-left u1 flagPosition))))\n )\n)\n\n;; Usage\n(toggle-flag u2) ;; Toggles the 3rd bit (position 2)\n(get-flag u2) ;; Returns false\n(toggle-flag u2) ;; Toggles the 3rd bit again (position 2)\n(get-flag u2) ;; Returns true\n```\n\nThis example demonstrates:\n1. Using `bit-xor` to toggle individual bits in a flags variable.\n2. Combining `bit-xor` with other bitwise operations like `bit-and` and `bit-shift-left`.\n3. Implementing a simple flag system using bitwise operations for efficient storage and manipulation.\n\n## Common Pitfalls\n\n1. Mixing signed (`int`) and unsigned (`uint`) integers in a single `bit-xor` operation.\n2. Forgetting that `bit-xor` of a value with itself always results in 0.\n3. Not considering the full range of bits when using `bit-xor` with smaller integer values.\n\n## Related Functions\n\n- `bit-and`: Used for bitwise AND operations.\n- `bit-or`: Used for bitwise OR operations.\n- `bit-not`: Used for bitwise NOT operations.\n- `bit-shift-left`: Often used in combination with `bit-xor` for flag operations.\n- `bit-shift-right`: Used for right-shifting bits.\n\n## Conclusion\n\nThe `bit-xor` function is a powerful tool for bitwise operations in Clarity smart contracts. When used in combination with other bitwise functions, it enables efficient implementation of toggles, flags, and other bit-level data manipulations. To avoid unexpected results, be mindful of the types of integers used and the effects of the operation on the full range of bits.\n","url":"/docs/stacks/clarity/functions/bit-xor"},"129":{"id":"/docs/stacks/clarity/functions/define-private","title":"define-private","description":"Define private functions in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(define-private (function-name (arg-name-0 arg-type-0) ...) function-body)\n```\n\n- Input: \n - `function-name`: The name of the private function\n - `arg-name-N`: The name of each argument\n - `arg-type-N`: The type of each argument\n - `function-body`: The code to be executed when the function is called\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-private` function is crucial for:\n\n1. Creating internal helper functions that are only accessible within the contract.\n2. Encapsulating logic that shouldn't be directly callable from outside the contract.\n3. Improving code organization and reusability within a contract.\n4. Implementing complex operations that are used by multiple public functions.\n\n## When to use it\n\nUse `define-private` when you need to:\n\n- Create utility functions that are used by multiple public functions.\n- Implement complex logic that needs to be hidden from external callers.\n- Break down large functions into smaller, more manageable pieces.\n- Improve the readability and maintainability of your contract.\n\n## Best Practices\n\n- Use descriptive names for private functions to clearly indicate their purpose.\n- Keep private functions focused on a single task or operation.\n- Use private functions to avoid code duplication within your contract.\n- Remember that private functions can return any type, not just response types.\n\n## Practical Example: Helper Function for Validation\n\nLet's implement a private function for input validation:\n\n```clarity\n(define-private (validate-amount (amount uint))\n (and (> amount u0) (<= amount u1000000))\n)\n\n(define-public (transfer (recipient principal) (amount uint))\n (if (validate-amount amount)\n (begin\n ;; Perform transfer logic here\n (ok true)\n )\n (err u1)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `define-private` to create a helper function for input validation.\n2. Calling the private function from within a public function.\n3. Improving code readability by separating validation logic.\n\n## Common Pitfalls\n\n1. Attempting to call private functions from outside the contract, which is not allowed.\n2. Overusing private functions, leading to overly complex contract structure.\n3. Forgetting that private functions can modify contract state, which may lead to unexpected behavior if not carefully managed.\n\n## Related Functions\n\n- `define-public`: Used to define public functions that can be called from outside the contract.\n- `define-read-only`: Used to define public read-only functions that don't modify contract state.\n\n## Conclusion\n\nThe `define-private` function is a powerful tool for creating internal helper functions and encapsulating logic within Clarity smart contracts. By using private functions effectively, you can improve code organization, reduce duplication, and create more maintainable and secure smart contracts.\n","url":"/docs/stacks/clarity/functions/define-private"},"130":{"id":"/docs/stacks/clarity/functions/bit-or","title":"bit-or","description":"Use the bit-or function for bitwise OR operations in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(bit-or i1 i2...)\n```\n\n- Input: Two or more integers (`int` or `uint`)\n- Output: An integer of the same type as the inputs (`int` or `uint`)\n\n## Why it matters\n\nThe `bit-or` function is crucial for:\n\n1. Performing bitwise OR operations in smart contracts.\n2. Combining flags or bitmasks efficiently.\n3. Implementing certain logical operations and algorithms.\n4. Manipulating binary data at the bit level.\n\n## When to use it\n\nUse the `bit-or` function when you need to:\n\n- Combine multiple flags or bitmasks into a single value.\n- Set specific bits in an integer without affecting others.\n- Implement certain bitwise algorithms or data structures.\n- Perform low-level data manipulations involving binary operations.\n\n## Best Practices\n\n- Ensure all input values are of the same type (either all `int` or all `uint`).\n- Remember that `bit-or` with `0` has no effect, which can be useful for conditional operations.\n- Use `bit-or` in combination with other bitwise operations for complex bit manipulations.\n- Consider readability when using bitwise operations extensively; add comments to explain the purpose.\n\n## Practical Example: Permission System\n\nLet's implement a simple permission system using `bit-or` and other bitwise operations:\n\n```clarity\n(define-constant PERMISSION_READ u1) ;; 0001\n(define-constant PERMISSION_WRITE u2) ;; 0010\n(define-constant PERMISSION_EXECUTE u4) ;; 0100\n(define-constant PERMISSION_ADMIN u8) ;; 1000\n\n(define-map UserPermissions principal uint)\n\n(define-public (grant-permission (user principal) (permission uint))\n (let\n (\n (currentPermissions (default-to u0 (map-get? UserPermissions user)))\n )\n (ok (map-set UserPermissions user (bit-or currentPermissions permission)))\n )\n)\n\n(define-public (revoke-permission (user principal) (permission uint))\n (let\n (\n (currentPermissions (default-to u0 (map-get? UserPermissions user)))\n )\n (ok (map-set UserPermissions user (bit-and currentPermissions (bit-not permission))))\n )\n)\n\n(define-read-only (has-permission (user principal) (permission uint))\n (let\n (\n (userPermission (default-to u0 (map-get? UserPermissions user)))\n )\n (is-eq permission (bit-and userPermission permission))\n )\n)\n\n;; Usage\n(grant-permission tx-sender (bit-or PERMISSION_READ PERMISSION_WRITE))\n(has-permission tx-sender PERMISSION_READ) ;; Returns true\n(has-permission tx-sender PERMISSION_EXECUTE) ;; Returns false\n```\n\n\n\nThis example demonstrates:\n1. Using `bit-or` to combine multiple permissions into a single value.\n2. Implementing a permission system using bitwise operations for efficient storage and checks.\n3. Combining `bit-or` with other bitwise operations like `bit-and` and `bit-not` for complex permission management.\n\n## Common Pitfalls\n\n1. Mixing signed (`int`) and unsigned (`uint`) integers in a single `bit-or` operation.\n2. Forgetting that `bit-or` with all bits set (`-1` for `int`, maximum value for `uint`) always results in all bits set.\n3. Not considering the full range of bits when using `bit-or` with smaller integer values.\n\n## Related Functions\n\n- `bit-and`: Used for bitwise AND operations.\n- `bit-xor`: Used for bitwise XOR operations.\n- `bit-not`: Used for bitwise NOT operations.\n- `bit-shift-left`: Used for left-shifting bits.\n- `bit-shift-right`: Used for right-shifting bits.\n\n## Conclusion\n\nThe `bit-or` function is a powerful tool for bitwise operations in Clarity smart contracts. When used in combination with other bitwise functions, this function enables efficient implementation of flags, permissions, and other bit-level data manipulations. However, be mindful of the types of integers used and the effects of the operation on the full range of bits to avoid unexpected results.\n","url":"/docs/stacks/clarity/functions/bit-or"},"131":{"id":"/docs/stacks/clarity/functions/var-get","title":"var-get","description":"Retrieve the value of a data variable in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(var-get var-name)\n```\n\n- Input: `VarName`\n- Output: `A`\n\n## Why it matters\n\nThe `var-get` function is crucial for:\n\n1. Retrieving the value of a data variable.\n2. Implementing logic that requires accessing stored data.\n3. Ensuring data integrity by validating the retrieval process.\n4. Simplifying the process of handling data variables in smart contracts.\n\n## When to use it\n\nUse `var-get` when you need to:\n\n- Retrieve the value of a data variable.\n- Implement logic that requires accessing stored data.\n- Validate the retrieval process to ensure data integrity.\n- Handle data variables in your smart contract.\n\n## Best Practices\n\n- Ensure the variable name is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other data functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Retrieving a Data Variable\n\n```clarity\n(define-data-var cursor int 6)\n\n(define-public (get-cursor)\n (ok (var-get cursor))\n)\n\n;; Usage\n(get-cursor) ;; Returns (ok 6)\n```\n\nThis example demonstrates:\n1. Using `var-get` to retrieve the value of a data variable.\n2. Implementing a public function to handle the retrieval process.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `var-get` with incorrectly formatted or invalid variable names, causing runtime errors.\n2. Assuming the retrieval will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `var-set`: Sets the value of a data variable.\n- `map-get?`: Retrieves a value from a map.\n- `default-to`: Provides a default value if an optional is `none`.\n\n## Conclusion\n\nThe `var-get` function is a fundamental tool for retrieving the value of a data variable in Clarity smart contracts. It allows you to implement logic that requires accessing stored data, ensuring data integrity and simplifying the retrieval process. When used effectively, `var-get` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle data variables.\n","url":"/docs/stacks/clarity/functions/var-get"},"132":{"id":"/docs/stacks/clarity/functions/map-set","title":"map-set","description":"Set an entry in a map in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(map-set map-name key-tuple value-tuple)\n```\n\n- Input: `MapName, tuple_A, tuple_B`\n- Output: `bool`\n\n## Why it matters\n\nThe `map-set` function is crucial for:\n\n1. Setting or updating entries in a map.\n2. Managing and updating the state of data stored in maps.\n3. Ensuring data integrity by allowing updates to existing entries.\n4. Simplifying the process of maintaining accurate data in smart contracts.\n\n## When to use it\n\nUse `map-set` when you need to:\n\n- Set or update an entry in a map.\n- Manage and update the state of data stored in maps.\n- Ensure data integrity by updating existing entries.\n- Maintain accurate data in your smart contract.\n\n## Best Practices\n\n- Ensure the key-tuple and value-tuple are correctly formatted.\n- Use meaningful variable names for better readability.\n- Combine with other map functions for comprehensive map management.\n- Be aware of the performance implications of frequent updates in large maps.\n\n## Practical Example: Setting User Data\n\nLet's implement a function that sets a user's data in a map:\n\n```clarity\n(define-map UserData { userId: principal } { data: (buff 32) })\n\n(define-public (set-user-data (user principal) (data (buff 32)))\n (ok (map-set UserData { userId: user } { data: data }))\n)\n\n;; Usage\n(set-user-data tx-sender 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef) ;; Returns (ok true)\n(set-user-data tx-sender 0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef) ;; Returns (ok true)\n```\n\nThis example demonstrates:\n1. Using `map-set` to set a user's data in the `UserData` map.\n2. Implementing a public function to set the data.\n3. Handling both the case where the entry is newly created and where it is updated.\n\n## Common Pitfalls\n\n1. Using `map-set` with incorrectly formatted tuples, causing the operation to fail.\n2. Assuming the entry will always be updated, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-insert`: Inserts a value into a map if the key does not already exist.\n- `map-delete`: Removes an entry from a map.\n- `map-get?`: Retrieves an entry from a map.\n\n## Conclusion\n\nThe `map-set` function is a fundamental tool for setting or updating entries in maps in Clarity smart contracts. It allows you to manage data, ensure data integrity, and maintain accurate data. When used effectively, `map-set` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage map entries.\n","url":"/docs/stacks/clarity/functions/map-set"},"133":{"id":"/docs/stacks/clarity/functions/buff-to-uint-be","title":"buff-to-uint-be","description":"Convert a byte buffer to an unsigned integer using big-endian encoding in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(buff-to-uint-be (buff 16))\n```\n\n- Input: A byte buffer of up to 16 bytes\n- Output: An unsigned integer (`uint`)\n\n## Why it matters\n\nThe `buff-to-uint-be` function is crucial for:\n\n1. Converting byte data to unsigned integers using big-endian encoding.\n2. Handling data from external sources or other contracts that use big-endian encoding.\n3. Implementing protocols or algorithms that require big-endian integer representation.\n4. Interoperating with systems that use big-endian byte order.\n\n## When to use it\n\nUse the `buff-to-uint-be` function when you need to:\n\n- Convert a big-endian encoded byte buffer to an unsigned integer.\n- Process input data that represents unsigned integers in big-endian format.\n- Implement cryptographic or mathematical operations that expect big-endian integer inputs.\n- Ensure compatibility with external systems using big-endian encoding.\n\n## Best Practices\n\n- Ensure the input buffer is no larger than 16 bytes to avoid errors.\n- Be aware that smaller buffers are zero-padded on the left, affecting the resulting integer value.\n- Use `buff-to-int-be` if you need to handle signed integers instead.\n- Handle potential errors when the input buffer might be invalid or empty.\n\n## Practical Example: Decoding an Unsigned Integer from External Data\n\nLet's implement a function that processes external data containing a big-endian encoded unsigned integer:\n\n```clarity\n(define-read-only (process-external-data (data (buff 16)))\n (let\n (\n (value (buff-to-uint-be data))\n )\n (if (> value u1000000)\n (err \"Value too large\")\n (ok value)\n )\n )\n)\n\n;; Usage\n(process-external-data 0x00000001) ;; Returns (ok u1)\n(process-external-data 0x000f4240) ;; Returns (ok u1000000)\n(process-external-data 0x00989680) ;; Returns (err \"Value too large\")\n```\n\nThis example demonstrates:\n1. Using `buff-to-uint-be` to convert external data to an unsigned integer.\n2. Implementing input validation based on the converted integer value.\n3. Handling different input sizes and values.\n\n## Common Pitfalls\n\n1. Forgetting that the function interprets the input as big-endian, which might lead to unexpected values if the data is actually little-endian.\n2. Not considering the full range of possible uint values when processing the result.\n3. Assuming a specific buffer length, which could lead to unexpected results with shorter inputs due to left-padding.\n\n## Related Functions\n\n- `buff-to-uint-le`: Converts a byte buffer to an unsigned integer using little-endian encoding.\n- `buff-to-int-be`: Converts a byte buffer to a signed integer using big-endian encoding.\n- `uint-to-buff`: Converts an unsigned integer to a byte buffer.\n\n## Conclusion\n\nThe `buff-to-uint-be` function is a powerful tool for working with big-endian encoded unsigned integers in Clarity smart contracts. By understanding its behavior with different input sizes and potential edge cases, you can effectively process and validate external data, implement complex algorithms, and ensure compatibility with big-endian systems in your smart contract applications.\n","url":"/docs/stacks/clarity/functions/buff-to-uint-be"},"134":{"id":"/docs/stacks/clarity/functions/define-read-only","title":"define-read-only","description":"Define public read-only functions in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(define-read-only (function-name (arg-name-0 arg-type-0) ...) function-body)\n```\n\n- Input: \n - `function-name`: The name of the read-only function\n - `arg-name-N`: The name of each argument\n - `arg-type-N`: The type of each argument\n - `function-body`: The code to be executed when the function is called\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-read-only` function is crucial for:\n\n1. Creating public functions that can query contract state without modifying it.\n2. Enabling efficient and gas-optimized read operations on the contract.\n3. Implementing view functions that other contracts or off-chain applications can call.\n4. Providing a safe way to expose contract data without risking state changes.\n\n## When to use it\n\nUse `define-read-only` when you need to:\n\n- Create functions that return contract state or computed values.\n- Implement getter functions for contract variables or complex data structures.\n- Provide public interfaces for querying contract data without modifying state.\n- Create helper functions that other contracts can call without incurring state change costs.\n\n## Best Practices\n\n- Use descriptive names for read-only functions to clearly indicate their purpose.\n- Ensure that read-only functions do not attempt to modify contract state.\n- Utilize read-only functions for complex calculations that don't require state changes.\n- Consider using read-only functions in combination with public functions to separate read and write operations.\n\n## Practical Example: Token Balance Checker\n\nLet's implement a read-only function for checking token balances:\n\n```clarity\n(define-map Balances principal uint)\n\n(define-read-only (get-balance (account principal))\n (default-to u0 (map-get? Balances account))\n)\n```\n\nThis example demonstrates:\n1. Using `define-read-only` to create functions for querying token balances.\n2. Implementing a getter function for individual account balances.\n\n## Common Pitfalls\n\n1. Attempting to modify contract state within a read-only function, which will cause an error.\n2. Overusing read-only functions for complex calculations that might be better suited for off-chain computation.\n3. Forgetting that read-only functions can still consume gas when called, even though they don't modify state.\n\n## Related Functions\n\n- `define-public`: Used to define public functions that can modify contract state.\n- `define-private`: Used to define private functions that can only be called within the contract.\n- `map-get?`: Often used within read-only functions to retrieve data from maps.\n\n## Conclusion\n\nThe `define-read-only` function is an essential tool for creating efficient and safe query interfaces in Clarity smart contracts. By providing a way to expose contract data and perform calculations without modifying state, read-only functions enable you to create more transparent and gas-efficient contracts. When used effectively, this function can significantly enhance the usability and accessibility of smart contract data for both on-chain and off-chain applications.\n","url":"/docs/stacks/clarity/functions/define-read-only"},"135":{"id":"/docs/stacks/clarity/functions/nft-burn","title":"nft-burn?","description":"Burn a non-fungible token (NFT) in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(nft-burn? asset-class asset-identifier sender)\n```\n\n- Input: `AssetName, A, principal`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `nft-burn?` function is crucial for:\n\n1. Reducing the circulating supply of a non-fungible token (NFT).\n2. Managing the lifecycle of NFTs by allowing their destruction.\n3. Ensuring data integrity by removing ownership records of burned NFTs.\n4. Simplifying the process of handling NFT burn operations in smart contracts.\n\n## When to use it\n\nUse `nft-burn?` when you need to:\n\n- Reduce the circulating supply of an NFT.\n- Manage the lifecycle of NFTs by allowing their destruction.\n- Remove ownership records of burned NFTs.\n- Handle NFT burn operations in your smart contract.\n\n## Best Practices\n\n- Ensure the `sender` principal owns the NFT before attempting to burn it.\n- Use meaningful variable names for better readability.\n- Combine with other NFT functions for comprehensive NFT management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Burning an NFT\n\nLet's implement a function that burns an NFT owned by the sender:\n\n```clarity\n(define-non-fungible-token Stackaroo (string-ascii 40))\n\n(define-public (burn-nft (id (string-ascii 40)))\n (nft-burn? Stackaroo id tx-sender)\n)\n\n;; Usage\n(nft-mint? Stackaroo \"Roo\" tx-sender) ;; Returns (ok true)\n(burn-nft \"Roo\") ;; Returns (ok true)\n(nft-burn? Stackaroo \"Roo\" tx-sender) ;; Returns (err u3) because the asset no longer exists\n```\n\nThis example demonstrates:\n1. Using `nft-burn?` to burn an NFT owned by the sender.\n2. Implementing a public function to handle the burn operation.\n3. Handling both the successful burn and the case where the asset no longer exists.\n\n## Common Pitfalls\n\n1. Using `nft-burn?` without ensuring the `sender` owns the NFT, causing the operation to fail.\n2. Assuming the NFT will always exist, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete NFT management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `nft-mint?`: Mints a new non-fungible token.\n- `nft-transfer?`: Transfers ownership of a non-fungible token.\n- `nft-get-owner?`: Retrieves the owner of a non-fungible token.\n\n## Conclusion\n\nThe `nft-burn?` function is a fundamental tool for managing the lifecycle of non-fungible tokens in Clarity smart contracts. It allows you to reduce the circulating supply of NFTs, manage their destruction, and ensure data integrity. When used effectively, `nft-burn?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle NFT burn operations.\n","url":"/docs/stacks/clarity/functions/nft-burn"},"136":{"id":"/docs/stacks/clarity/functions/is-ok","title":"is-ok","description":"Check if a response is ok in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(is-ok value)\n```\n\n- Input: `(response A B)`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-ok` function is crucial for:\n\n1. Determining if a response value represents a successful operation.\n2. Implementing conditional logic based on the success or failure of operations.\n3. Ensuring robust contract behavior by checking for successful responses.\n4. Simplifying checks for response types in smart contract code.\n\n## When to use it\n\nUse `is-ok` when you need to:\n\n- Check if a response value is `ok`.\n- Implement logic that depends on the success of operations.\n- Validate the results of function calls that return response types.\n- Handle success cases gracefully in your contract logic.\n\n## Best Practices\n\n- Use `is-ok` in combination with `match` or `if` for comprehensive response handling.\n- Ensure that the response value being checked is of the correct type.\n- Use meaningful variable names for better readability.\n- Combine with other response handling functions like `is-err` for complete validation.\n\n## Practical Example: Validating a Token Transfer\n\nLet's implement a function that validates a token transfer and checks for success:\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? UserBalances { userId: tx-sender })))\n (recipientBalance (default-to u0 (map-get? UserBalances { userId: recipient })))\n (transferResult (if (>= senderBalance amount)\n (begin\n (map-set UserBalances { userId: tx-sender } { balance: (- senderBalance amount) })\n (map-set UserBalances { userId: recipient } { balance: (+ recipientBalance amount) })\n (ok true)\n )\n (err u1)\n ))\n )\n (if (is-ok transferResult)\n (ok true)\n (err u2)\n )\n )\n)\n\n;; Usage\n(map-set UserBalances { userId: tx-sender } { balance: u100 })\n(transfer-tokens u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true)\n(transfer-tokens u200 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (err u2)\n```\n\nThis example demonstrates:\n1. Using `is-ok` to check if the token transfer operation was successful.\n2. Implementing conditional logic based on the success of the transfer.\n3. Handling both the success and error cases appropriately.\n\n## Common Pitfalls\n\n1. Assuming the response value is always of the correct type, leading to type errors.\n2. Not handling all possible success and error cases, resulting in incomplete response handling.\n3. Overlooking the need for comprehensive validation and error checking.\n4. Using `is-ok` without meaningful success codes or messages, making debugging harder.\n\n## Related Functions\n\n- `is-err`: Checks if a response value is `err`.\n- `err`: Constructs an error response.\n- `ok`: Constructs a success response.\n\n## Conclusion\n\nThe `is-ok` function is a fundamental tool for checking response values in Clarity smart contracts. It allows you to determine if a response value represents a successful operation, enabling robust and comprehensive response handling and validation logic. When used effectively, `is-ok` enhances the reliability and maintainability of your smart contract code by ensuring that successful operations are detected and handled appropriately.\n","url":"/docs/stacks/clarity/functions/is-ok"},"137":{"id":"/docs/stacks/clarity/functions/add","title":"add","description":"Use the addition function for arithmetic operations in Clarity smart contracts.","content":"\nThe addition function (`+`) in Clarity performs addition on a variable number of integer inputs. It's a fundamental arithmetic operation used in many smart contract calculations.\n\n## Function Signature\n\n```clarity\n(+ i1 i2...)\n```\n\n- Input: Two or more integers (int or uint)\n- Output: A single integer (int or uint)\n\n## Why it matters\n\nThe addition function is crucial for:\n\n1. Performing basic arithmetic calculations within smart contracts.\n2. Incrementing counters or values.\n3. Combining multiple quantities or balances.\n4. Implementing mathematical formulas that involve addition.\n\n## When to use it\n\nUse the addition function when you need to:\n\n- Perform basic addition in your contract logic.\n- Increment values or counters.\n- Sum up multiple values.\n- Implement mathematical formulas that involve addition.\n\n## Best Practices\n\n- Always consider the possibility of overflow when adding large numbers.\n- Use appropriate types (int or uint) based on your needs and expected value ranges.\n- Be aware that adding negative numbers to positive numbers can result in subtraction.\n- Consider using checked arithmetic functions if overflow detection is critical.\n\n## Practical Example: Simple Counter\n\nLet's implement a simple counter that uses the addition function to increment its value:\n\n```clarity\n(define-data-var counter int 0)\n\n(define-public (increment-counter (amount int))\n (begin\n (var-set counter (+ (var-get counter) amount))\n (ok (var-get counter))\n )\n)\n\n;; Usage\n(increment-counter 1) ;; Increments the counter by 1\n(increment-counter 5) ;; Increments the counter by 5\n```\n\nThis example demonstrates:\n1. Using addition to increment the value of a counter.\n2. Implementing a public function to handle the increment operation.\n3. Returning the updated counter value.\n\n## Common Pitfalls\n\n1. Overlooking potential overflow when adding large numbers.\n2. Not considering the effect of adding negative numbers (for int types).\n3. Forgetting to update related variables or state when incrementing values.\n\n## Related Functions\n\n- `-`: Used for subtraction operations.\n- `*`: Used for multiplication operations.\n- `/`: Used for division operations.\n\n## Conclusion\n\nThe addition function is a fundamental tool for performing arithmetic operations in Clarity smart contracts. By understanding its behavior with different types of inputs and potential edge cases, you can use it effectively to implement various mathematical operations in your contracts, from simple increments to more complex calculations.\n","url":"/docs/stacks/clarity/functions/add"},"138":{"id":"/docs/stacks/clarity/functions/string-to-int","title":"string-to-int?","description":"Convert a string to an optional integer in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(string-to-int? string)\n```\n\n- Input: `(string-ascii 1048576) | (string-utf8 262144)`\n- Output: `(optional int)`\n\n## Why it matters\n\nThe `string-to-int?` function is crucial for:\n\n1. Converting string representations of numbers to integers.\n2. Implementing logic that requires numeric values from string inputs.\n3. Ensuring data integrity by validating string-to-integer conversions.\n4. Simplifying the process of handling numeric conversions in smart contracts.\n\n## When to use it\n\nUse `string-to-int?` when you need to:\n\n- Convert a string representation of a number to an integer.\n- Implement logic that requires numeric values from string inputs.\n- Validate string-to-integer conversions to ensure data integrity.\n- Handle numeric conversions in your smart contract.\n\n## Best Practices\n\n- Ensure the input string is correctly formatted and represents a valid integer.\n- Use meaningful variable names for better readability.\n- Combine with other string and numeric functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Converting a String to an Integer\n\nLet's implement a function that converts a string to an optional integer:\n\n```clarity\n(define-read-only (convert-string-to-int (input (string-ascii 20)))\n (string-to-int? input)\n)\n\n;; Usage\n(convert-string-to-int \"123\") ;; Returns (some 123)\n(convert-string-to-int \"-456\") ;; Returns (some -456)\n(convert-string-to-int \"abc\") ;; Returns none\n```\n\nThis example demonstrates:\n1. Using `string-to-int?` to convert a string to an optional integer.\n2. Implementing a public function to handle the string-to-integer conversion.\n3. Handling both valid and invalid string inputs.\n\n## Common Pitfalls\n\n1. Using `string-to-int?` with incorrectly formatted or invalid string inputs, causing the operation to return `none`.\n2. Assuming the conversion will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `string-to-uint?`: Converts a string to an optional unsigned integer.\n- `int-to-ascii`: Converts an integer to a string-ascii representation.\n- `int-to-utf8`: Converts an integer to a string-utf8 representation.\n\n## Conclusion\n\nThe `string-to-int?` function is a fundamental tool for converting string representations of numbers to integers in Clarity smart contracts. It allows you to implement logic that requires numeric values from string inputs, ensuring data integrity and simplifying numeric conversions. When used effectively, `string-to-int?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle string-to-integer conversions.\n","url":"/docs/stacks/clarity/functions/string-to-int"},"139":{"id":"/docs/stacks/clarity/functions/is-none","title":"is-none","description":"Check if an optional value is none in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(is-none value)\n```\n\n- Input: `(optional A)`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-none` function is crucial for:\n\n1. Determining if an optional value is `none`.\n2. Implementing conditional logic based on the presence or absence of values.\n3. Ensuring robust contract behavior by checking for missing values.\n4. Simplifying checks for optional values in smart contract code.\n\n## When to use it\n\nUse `is-none` when you need to:\n\n- Check if an optional value is `none`.\n- Implement logic that depends on whether a value is present or absent.\n- Validate the results of function calls that return optional types.\n- Handle cases where values might be missing or not set.\n\n## Best Practices\n\n- Use `is-none` in combination with `match` or `if` for comprehensive value handling.\n- Ensure that the value being checked is of the correct optional type.\n- Use meaningful variable names for better readability.\n- Combine with other optional handling functions like `is-some` for complete validation.\n\n## Practical Example: Checking for Missing User Data\n\nLet's implement a function that checks if a user's profile data is missing:\n\n```clarity\n(define-map UserProfiles { userId: principal } { name: (string-ascii 50), age: uint })\n\n(define-read-only (is-profile-missing (user principal))\n (is-none (map-get? UserProfiles { userId: user }))\n)\n\n;; Usage\n(map-set UserProfiles { userId: tx-sender } { name: \"Alice\", age: u30 })\n(is-profile-missing tx-sender) ;; Returns false\n(is-profile-missing 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns true\n```\n\nThis example demonstrates:\n1. Using `is-none` to check if a user's profile data is missing.\n2. Implementing a read-only function to determine the presence of user data.\n3. Handling both the case where the profile data is present and where it is missing.\n\n## Common Pitfalls\n\n1. Assuming the value will always be `some`, leading to unhandled `none` cases.\n2. Using `is-none` on non-optional types, causing type errors.\n3. Not handling all possible conditions, resulting in incomplete value checks.\n4. Overlooking the need for comprehensive validation and error checking.\n\n## Related Functions\n\n- `is-some`: Checks if an optional value is `some`.\n- `match`: Used for pattern matching and handling multiple conditions.\n- `default-to`: Provides default values for optional types.\n\n## Conclusion\n\nThe `is-none` function is a fundamental tool for checking optional values in Clarity smart contracts. It allows you to determine if a value is `none`, enabling robust and comprehensive value handling and validation logic. When used effectively, `is-none` enhances the reliability and maintainability of your smart contract code by ensuring that missing values are detected and handled appropriately.\n","url":"/docs/stacks/clarity/functions/is-none"},"140":{"id":"/docs/stacks/clarity/functions/subtract","title":"subtract","description":"Use the subtraction function for arithmetic operations in Clarity smart contracts.","content":"\nThe subtraction function (`-`) in Clarity performs subtraction on a variable number of integer inputs. It's a fundamental arithmetic operation used in many smart contract calculations.\n\n## Function Signature\n\n```clarity\n(- i1 i2...)\n```\n\n- Input: Two or more integers (int or uint)\n- Output: A single integer (int or uint)\n\n## Why it matters\n\nThe subtraction function is crucial for:\n\n1. Performing basic arithmetic calculations within smart contracts.\n2. Decreasing values or counters.\n3. Calculating differences between quantities.\n4. Implementing mathematical formulas that involve subtraction.\n\n## When to use it\n\nUse the subtraction function when you need to:\n\n- Perform basic subtraction in your contract logic.\n- Decrement values or counters.\n- Calculate the difference between two or more values.\n- Implement mathematical formulas that involve subtraction.\n\n## Best Practices\n\n- Always consider the possibility of underflow when subtracting from small numbers.\n- Use appropriate types (int or uint) based on your needs and expected value ranges.\n- Be aware that subtracting a negative number results in addition.\n- Consider using checked arithmetic functions if underflow detection is critical.\n\n## Practical Example: Simple Escrow Contract\n\nLet's implement a basic escrow contract that uses subtraction to manage balances:\n\n```clarity\n;; Define constants\n(define-constant ESCROW_FEE u100) ;; 100 tokens as escrow fee\n\n;; Define data variables\n(define-map Balances principal uint)\n(define-data-var escrowBalance uint u0)\n\n;; Function to deposit funds\n(define-public (deposit (amount uint))\n (let\n (\n (currentBalance (default-to u0 (map-get? Balances tx-sender)))\n )\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n (map-set Balances tx-sender (+ currentBalance amount))\n (ok true)\n )\n)\n\n;; Function to initiate escrow\n(define-public (start-escrow (recipient principal) (amount uint))\n (let\n (\n (senderBalance (default-to u0 (map-get? Balances tx-sender)))\n )\n (asserts! (>= senderBalance (+ amount ESCROW_FEE)) (err u1))\n (map-set Balances tx-sender (- senderBalance (+ amount ESCROW_FEE)))\n (var-set escrowBalance (+ (var-get escrowBalance) amount))\n (ok true)\n )\n)\n\n;; Function to complete escrow and transfer funds\n(define-public (complete-escrow (recipient principal) (amount uint))\n (let\n (\n (escrowAmount (var-get escrowBalance))\n )\n (asserts! (>= escrowAmount amount) (err u2))\n (try! (as-contract (stx-transfer? amount tx-sender recipient)))\n (var-set escrowBalance (- escrowAmount amount))\n (ok true)\n )\n)\n```\n\nThis example demonstrates:\n1. Using subtraction to update `Balances` when initiating an escrow.\n2. Using subtraction to update the escrow balance when completing a transfer.\n3. Combining subtraction with addition to handle fees and balance updates.\n\n## Common Pitfalls\n\n1. Overlooking potential underflow when subtracting from small numbers.\n2. Not considering the effect of subtracting negative numbers (for int types).\n3. Forgetting to update related variables or state when decrementing values.\n\n## Related Functions\n\n- `+`: Used for addition operations.\n- `*`: Used for multiplication operations.\n- `/`: Used for division operations.\n\n## Conclusion\n\nThe subtraction function is a fundamental tool for performing arithmetic operations in Clarity smart contracts. By understanding its behavior with different types of inputs and potential edge cases, you can use it effectively to implement various mathematical operations in your contracts, from simple decrements to more complex financial calculations.\n","url":"/docs/stacks/clarity/functions/subtract"},"141":{"id":"/docs/stacks/clarity/functions/principal-destruct","title":"principal-destruct?","description":"Decompose a principal into its components in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(principal-destruct? principal-address)\n```\n\n- Input: `principal`\n- Output: `(response (tuple (hash-bytes (buff 20)) (name (optional (string-ascii 40))) (version (buff 1))) (tuple (hash-bytes (buff 20)) (name (optional (string-ascii 40))) (version (buff 1)))`\n\n## Why it matters\n\nThe `principal-destruct?` function is crucial for:\n\n1. Decomposing a principal into its component parts.\n2. Managing identities and permissions in smart contracts.\n3. Ensuring data integrity by validating principal components.\n4. Simplifying the process of handling principals in smart contracts.\n\n## When to use it\n\nUse `principal-destruct?` when you need to:\n\n- Decompose a principal into its component parts.\n- Manage identities and permissions in your smart contract.\n- Validate the components of a principal.\n- Handle principal decomposition operations.\n\n## Best Practices\n\n- Ensure the `principal` is correctly formatted.\n- Use meaningful variable names for better readability.\n- Combine with other principal functions for comprehensive identity management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Decomposing a Principal\n\nLet's implement a function that destructs a principal back into its components:\n\n```clarity\n(define-public (destruct-principal (principal principal))\n (principal-destruct? principal)\n)\n\n;; Usage\n(destruct-principal 'ST3X6QWWETNBZWGBK6DRGTR1KX50S74D3425Q1TPK) \n;; Returns (ok (tuple (hash-bytes 0xfa6bf38ed557fe417333710d6033e9419391a320) (name none) (version 0x1a)))\n(destruct-principal 'ST3X6QWWETNBZWGBK6DRGTR1KX50S74D3425Q1TPK.foo) \n;; Returns (ok (tuple (hash-bytes 0xfa6bf38ed557fe417333710d6033e9419391a320) (name (some \"foo\")) (version 0x1a)))\n```\n\nThis example demonstrates:\n1. Using `principal-destruct?` to decompose a principal into its components.\n2. Implementing a public function to handle the principal decomposition.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `principal-destruct?` with incorrectly formatted principals, causing the operation to fail.\n2. Assuming the principal will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete principal management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `principal-construct?`: Constructs a principal from its components.\n- `principal-of?`: Returns the principal derived from a public key.\n- `contract-caller`: Returns the caller of the current contract context.\n\n## Conclusion\n\nThe `principal-destruct?` function is a fundamental tool for decomposing principals into their component parts in Clarity smart contracts. It allows you to manage identities and permissions, ensuring data integrity and simplifying principal handling. When used effectively, `principal-destruct?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle principal decomposition operations.\n","url":"/docs/stacks/clarity/functions/principal-destruct"},"142":{"id":"/docs/stacks/clarity/functions/to-consensus-buff","title":"to-consensus-buff?","description":"Serialize a Clarity value into a buffer for consensus in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(to-consensus-buff? value)\n```\n\n- Input: `any`\n- Output: `(optional (buff 32))`\n\n## Why it matters\n\nThe `to-consensus-buff?` function is crucial for:\n\n1. Serializing Clarity values into buffers for consensus.\n2. Implementing logic that requires converting Clarity values to a standardized buffer format.\n3. Ensuring data integrity by validating the serialization process.\n4. Simplifying the process of handling value serialization in smart contracts.\n\n## When to use it\n\nUse `to-consensus-buff?` when you need to:\n\n- Serialize Clarity values into buffers for consensus.\n- Implement logic that requires converting Clarity values to a standardized buffer format.\n- Validate the serialization process to ensure data integrity.\n- Handle value serialization in your smart contract.\n\n## Best Practices\n\n- Ensure the input value is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other serialization functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Serializing a Clarity Value\n\nLet's implement a function that serializes an integer value into a buffer:\n\n```clarity\n(define-read-only (serialize-int (input int))\n (to-consensus-buff? input)\n)\n\n(define-read-only (serialize-tuple (input (tuple (name (string-ascii 50)) (age uint))))\n (to-consensus-buff? input)\n)\n\n;; Usage\n(serialize-int 42) ;; Returns (some 0x000000000000000000000000000000000000000000000000000000000000002a)\n(serialize-int -1) ;; Returns none (since negative integers cannot be serialized)\n(serialize-tuple (tuple (name \"Harper Dog\") (age u5))) ;; Returns (some 0x0c00000002036167650100000000000000000000000000000005046e616d650d0000000a48617270657220446f67)\n```\n\nThis example demonstrates:\n1. Using `to-consensus-buff?` to serialize an integer value into a buffer.\n2. Implementing a public function to handle the serialization process.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `to-consensus-buff?` with incorrectly formatted or invalid input values, causing the operation to fail.\n2. Assuming the serialization will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `from-consensus-buff?`: Deserializes a buffer into a Clarity value.\n- `buff-to-int-be`: Converts a big-endian buffer to an integer.\n- `buff-to-uint-le`: Converts a little-endian buffer to an unsigned integer.\n\n## Conclusion\n\nThe `to-consensus-buff?` function is a fundamental tool for serializing Clarity values into buffers for consensus in Clarity smart contracts. It allows you to implement logic that requires converting Clarity values to a standardized buffer format, ensuring data integrity and simplifying value serialization. When used effectively, `to-consensus-buff?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle value serialization.\n","url":"/docs/stacks/clarity/functions/to-consensus-buff"},"143":{"id":"/docs/stacks/clarity/functions/stx-burn","title":"stx-burn?","description":"Burn STX from a principal's account in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(stx-burn? amount sender)\n```\n\n- Input: `uint, principal`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `stx-burn?` function is crucial for:\n\n1. Decreasing the STX holdings of a principal by burning the specified amount.\n2. Implementing logic that requires reducing the circulating supply of STX.\n3. Ensuring data integrity by validating the burn operation.\n4. Simplifying the process of handling STX burning in smart contracts.\n\n## When to use it\n\nUse `stx-burn?` when you need to:\n\n- Decrease the STX holdings of a principal by burning the specified amount.\n- Implement logic that requires reducing the circulating supply of STX.\n- Validate the burn operation to ensure data integrity.\n- Handle STX burning operations in your smart contract.\n\n## Best Practices\n\n- Ensure the `amount` is positive and the `sender` has sufficient balance.\n- Use meaningful variable names for better readability.\n- Combine with other STX functions for comprehensive account management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Burning STX from an Account\n\nLet's implement a function that burns a specified amount of STX from the `tx-sender`:\n\n```clarity\n(define-public (burn-stx (amount uint))\n (stx-burn? amount tx-sender)\n)\n\n;; Usage\n(burn-stx u50) ;; Returns (ok true)\n```\n\nThis example demonstrates:\n1. Using `stx-burn?` to burn a specified amount of STX from the `tx-sender`.\n2. Implementing a public function to handle the STX burning operation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `stx-burn?` with a non-positive amount, causing the operation to fail.\n2. Assuming the burn operation will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete account management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `stx-get-balance`: Queries the STX balance of a principal.\n- `stx-transfer?`: Transfers STX from one principal to another.\n- `stx-account`: Queries detailed STX account information.\n\n## Conclusion\n\nThe `stx-burn?` function is a fundamental tool for burning STX from a principal's account in Clarity smart contracts. It allows you to implement logic that requires reducing the circulating supply of STX, ensuring data integrity and simplifying STX burning operations. When used effectively, `stx-burn?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle STX burning operations.\n","url":"/docs/stacks/clarity/functions/stx-burn"},"144":{"id":"/docs/stacks/clarity/functions/from-consensus-buff","title":"from-consensus-buff?","description":"Deserialize a buffer into a Clarity value in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(from-consensus-buff? type-signature buffer)\n```\n\n- Input: \n - `type-signature`: The type to deserialize into\n - `buffer`: A buffer containing the serialized data\n- Output: `(optional t)` where t is the type specified in the type signature\n\n## Why it matters\n\nThe `from-consensus-buff?` function is crucial for:\n\n1. Deserializing data that has been serialized using the SIP-005 standard.\n2. Enabling interoperability between different contracts or systems.\n3. Handling complex data structures that have been serialized for storage or transmission.\n4. Safely converting buffers back into Clarity values with type checking.\n\n## When to use it\n\nUse `from-consensus-buff?` when you need to:\n\n- Convert serialized data back into Clarity values.\n- Interact with data that has been serialized by other contracts or off-chain systems.\n- Implement cross-contract communication protocols involving serialized data.\n- Deserialize stored data that was previously serialized for efficiency.\n\n## Best Practices\n\n- Always specify the correct type signature to ensure proper deserialization.\n- Handle the `none` case when the deserialization fails.\n- Use in conjunction with `to-consensus-buff?` for serialization-deserialization workflows.\n- Be aware of the gas costs associated with deserializing large or complex data structures.\n\n## Practical Example: Deserializing a Tuple\n\nLet's implement a function that deserializes a buffer into a tuple:\n\n```clarity\n(define-read-only (deserialize-user-data (serializedData (buff 128)))\n (match (from-consensus-buff? { name: (string-ascii 50), age: uint } serializedData)\n success success\n (err u1)\n )\n)\n\n;; Usage\n(deserialize-user-data 0x0c00000002036167650100000000000000000000000000000005046e616d650d0000000a48617270657220446f67)\n;; Returns (ok (tuple (name \"Harper Dog\") (age u5)))\n```\n\nThis example demonstrates:\n1. Using `from-consensus-buff?` to deserialize a buffer into a tuple.\n2. Specifying the expected type structure for the deserialization.\n3. Handling both successful and failed deserialization attempts.\n\n## Common Pitfalls\n\n1. Specifying an incorrect type signature, leading to deserialization failures.\n2. Not handling the `none` case when deserialization fails.\n3. Attempting to deserialize data that wasn't properly serialized using the SIP-005 standard.\n4. Overlooking potential out-of-memory errors when deserializing very large structures.\n\n## Related Functions\n\n- `to-consensus-buff?`: Used to serialize Clarity values into buffers.\n- `unwrap-panic`: Often used to forcibly unwrap the optional result (use with caution).\n- `match`: Commonly used to handle both success and failure cases of deserialization.\n\n## Conclusion\n\nThe `from-consensus-buff?` function is a powerful tool for working with serialized data in Clarity smart contracts. It enables contracts to safely deserialize complex data structures, facilitating interoperability and efficient data handling. When used correctly, this function provides a robust way to convert buffers back into typed Clarity values, enhancing the contract's ability to process and validate external data.\n","url":"/docs/stacks/clarity/functions/from-consensus-buff"},"145":{"id":"/docs/stacks/clarity/functions/bit-shift-right","title":"bit-shift-right","description":"Use the bit-shift-right function for bitwise right shift operations in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(bit-shift-right i1 shamt)\n```\n\n- Input: \n - `i1`: An integer (`int` or `uint`)\n - `shamt`: A `uint` representing the number of places to shift\n- Output: An integer of the same type as `i1` (`int` or `uint`)\n\n## Why it matters\n\nThe `bit-shift-right` function is crucial for:\n\n1. Performing efficient division by powers of 2.\n2. Implementing certain bitwise algorithms and data structures.\n3. Manipulating binary data at the bit level.\n4. Extracting specific bit patterns from integers.\n\n## When to use it\n\nUse the `bit-shift-right` function when you need to:\n\n- Divide a number by a power of 2 efficiently.\n- Implement certain cryptographic or hashing algorithms.\n- Perform low-level data manipulations involving binary operations.\n- Extract specific bits or bit patterns from integers.\n\n## Best Practices\n\n- Be aware that shifting right by `n` bits is equivalent to integer division by 2^n.\n- Remember that for signed integers (`int`), the sign bit is preserved during right shifts.\n- Use `uint` for `shamt` to avoid potential issues with negative shift amounts.\n- Consider the differences in behavior between signed and unsigned integers when right-shifting.\n\n## Practical Example: Efficient Power of 2 Division\n\nLet's implement a function that efficiently divides by powers of 2 using `bit-shift-right`:\n\n```clarity\n(define-read-only (divide-by-power-of-2 (value int) (power uint))\n (bit-shift-right value power)\n)\n\n(define-read-only (extract-lowest-bits (value uint) (numBits uint))\n (bit-and value (- (bit-shift-left u1 numBits) u1))\n)\n\n;; Usage\n(divide-by-power-of-2 128 u3) ;; Returns 16 (128 / 2^3)\n(divide-by-power-of-2 -128 u3) ;; Returns -16 (-128 / 2^3)\n(extract-lowest-bits u171 u4) ;; Returns u11 (binary: 1011)\n```\n\nThis example demonstrates:\n1. Using `bit-shift-right` for efficient division by powers of 2.\n2. Handling both positive and negative numbers in division.\n3. Combining `bit-shift-right` with other bitwise operations to extract specific bit patterns.\n\n## Common Pitfalls\n\n1. Forgetting that right-shifting signed integers preserves the sign bit.\n2. Not considering the modulo behavior when shifting by amounts greater than or equal to 128.\n3. Using a negative or non-uint value for the shift amount, which is not allowed.\n\n## Related Functions\n\n- `bit-shift-left`: Used for left-shifting bits.\n- `bit-and`: Often used in combination with `bit-shift-right` for masking operations.\n- `/`: Used for general division, but less efficient for powers of 2 compared to bit shifting.\n\n## Conclusion\n\nThe `bit-shift-right` function is a powerful tool for bitwise operations in Clarity smart contracts. This function enables efficient division by powers of 2 and is essential for extracting specific bit patterns and implementing various bitwise algorithms. However, be mindful of the differences between signed and unsigned integers when using this function, as well as its behavior with large shift amounts.\n","url":"/docs/stacks/clarity/functions/bit-shift-right"},"146":{"id":"/docs/stacks/clarity/functions/is-some","title":"is-some","description":"Check if an optional value is some in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(is-some value)\n```\n\n- Input: `(optional A)`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-some` function is crucial for:\n\n1. Determining if an optional value is `some`.\n2. Implementing conditional logic based on the presence of values.\n3. Ensuring robust contract behavior by checking for existing values.\n4. Simplifying checks for optional values in smart contract code.\n\n## When to use it\n\nUse `is-some` when you need to:\n\n- Check if an optional value is `some`.\n- Implement logic that depends on whether a value is present.\n- Validate the results of function calls that return optional types.\n- Handle cases where values might be present or absent.\n\n## Best Practices\n\n- Use `is-some` in combination with `match` or `if` for comprehensive value handling.\n- Ensure that the value being checked is of the correct optional type.\n- Use meaningful variable names for better readability.\n- Combine with other optional handling functions like `is-none` for complete validation.\n\n## Practical Example: Checking for Existing User Data\n\nLet's implement a function that checks if a user's profile data exists:\n\n```clarity\n(define-map UserProfiles { userId: principal } { name: (string-ascii 50), age: uint })\n\n(define-read-only (is-profile-existing (user principal))\n (is-some (map-get? UserProfiles { userId: user }))\n)\n\n;; Usage\n(map-set UserProfiles { userId: tx-sender } { name: \"Alice\", age: u30 })\n(is-profile-existing tx-sender) ;; Returns true\n(is-profile-existing 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns false\n```\n\nThis example demonstrates:\n1. Using `is-some` to check if a user's profile data exists.\n2. Implementing a read-only function to determine the presence of user data.\n3. Handling both the case where the profile data is present and where it is absent.\n\n## Common Pitfalls\n\n1. Assuming the value will always be `some`, leading to unhandled `none` cases.\n2. Using `is-some` on non-optional types, causing type errors.\n3. Not handling all possible conditions, resulting in incomplete value checks.\n4. Overlooking the need for comprehensive validation and error checking.\n\n## Related Functions\n\n- `is-none`: Checks if an optional value is `none`.\n- `match`: Used for pattern matching and handling multiple conditions.\n- `default-to`: Provides default values for optional types.\n\n## Conclusion\n\nThe `is-some` function is a fundamental tool for checking optional values in Clarity smart contracts. It allows you to determine if a value is `some`, enabling robust and comprehensive value handling and validation logic. When used effectively, `is-some` enhances the reliability and maintainability of your smart contract code by ensuring that existing values are detected and handled appropriately.\n","url":"/docs/stacks/clarity/functions/is-some"},"147":{"id":"/docs/stacks/clarity/functions/is-standard","title":"is-standard","description":"Check if a value is a standard principal in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(is-standard value)\n```\n\n- Input: `principal`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-standard` function is crucial for:\n\n1. Determining if a principal is a standard principal (i.e., a user address).\n2. Implementing conditional logic based on the type of principal.\n3. Ensuring that certain operations are only performed by standard principals.\n4. Simplifying checks for principal types in smart contract code.\n\n## When to use it\n\nUse `is-standard` when you need to:\n\n- Check if a principal is a standard user address.\n- Implement logic that depends on the type of principal.\n- Validate the type of principal before performing certain operations.\n- Handle cases where only standard principals are allowed.\n\n## Best Practices\n\n- Use `is-standard` in combination with `if` or `match` for comprehensive principal type handling.\n- Ensure that the value being checked is of the correct principal type.\n- Use meaningful variable names for better readability.\n- Note that you can pass in a valid contract principal as well, not just a standard principal (e.g., `'SP12` or `'SP12.contract`).\n\n## Practical Example: Restricting Access to Standard Principals\n\nLet's implement a function that restricts access to standard principals:\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (if (is-standard tx-sender)\n (let\n (\n (senderBalance (default-to u0 (map-get? UserBalances { userId: tx-sender })))\n (recipientBalance (default-to u0 (map-get? UserBalances { userId: recipient })))\n )\n (if (>= senderBalance amount)\n (begin\n (map-set UserBalances { userId: tx-sender } { balance: (- senderBalance amount) })\n (map-set UserBalances { userId: recipient } { balance: (+ recipientBalance amount) })\n (ok true)\n )\n (err u1)\n )\n )\n (err u2)\n )\n)\n\n;; Usage\n(map-set UserBalances { userId: tx-sender } { balance: u100 })\n(transfer-tokens u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true) if tx-sender is a standard principal\n```\n\nThis example demonstrates:\n1. Using `is-standard` to check if the transaction sender is a standard principal.\n2. Implementing conditional logic based on the type of principal.\n3. Handling both the case where the principal is standard and where it is not.\n\n## Common Pitfalls\n\n1. Assuming the principal will always be standard, leading to unhandled cases.\n2. Using `is-standard` on non-principal types, causing type errors.\n3. Not handling all possible conditions, resulting in incomplete principal type checks.\n4. Overlooking the need for comprehensive validation and error checking.\n\n## Related Functions\n\n- `tx-sender`: Returns the principal that initiated the transaction.\n- `contract-caller`: Returns the caller of the current contract context.\n\n## Conclusion\n\nThe `is-standard` function is a fundamental tool for checking principal types in Clarity smart contracts. It allows you to determine if a principal is a standard user address, enabling robust and comprehensive principal type handling and validation logic. When used effectively, `is-standard` enhances the reliability and maintainability of your smart contract code by ensuring that operations are performed by the correct type of principal.\n","url":"/docs/stacks/clarity/functions/is-standard"},"148":{"id":"/docs/stacks/clarity/functions/unwrap-err-panic","title":"unwrap-err-panic","description":"Unpack error responses and throwing runtime errors in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(unwrap-err-panic response-input)\n```\n\n- Input: `(response A B)`\n- Output: `B`\n\n## Why it matters\n\nThe `unwrap-err-panic` function is crucial for:\n\n1. Unpacking error responses to access their inner values.\n2. Implementing logic that requires handling error responses.\n3. Ensuring data integrity by validating the error unpacking process.\n4. Simplifying the process of handling error responses in smart contracts by throwing runtime errors when necessary.\n\n## When to use it\n\nUse `unwrap-err-panic` when you need to:\n\n- Unpack error responses to access their inner values.\n- Implement logic that requires handling error responses.\n- Validate the error unpacking process to ensure data integrity.\n- Handle error responses in your smart contract and throw runtime errors when necessary.\n\n## Best Practices\n\n- Ensure the input value is a response type.\n- Use meaningful variable names for better readability.\n- Combine with other error handling functions for comprehensive error management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Unpacking an Error Response and Throwing a Runtime Error\n\nLet's implement a function that processes an error response using `unwrap-err-panic`:\n\n```clarity\n(define-public (process-error-response (input (response int int)))\n (let\n (\n (errorValue (unwrap-err-panic input))\n )\n (ok errorValue)\n )\n)\n\n;; Usage\n(process-error-response (err 42)) ;; Returns (ok 42)\n(process-error-response (ok 1)) ;; Throws a runtime exception\n```\n\nThis example demonstrates:\n1. Using `unwrap-err-panic` to unpack an error response.\n2. Implementing a public function to handle the error unpacking process.\n3. Handling both successful and error cases, with runtime errors thrown for `ok` values.\n\n## Common Pitfalls\n\n1. Using `unwrap-err-panic` with values that are not response types, causing runtime errors.\n2. Assuming the error unpacking will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete error management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `unwrap!`: Unpacks optional and response types, returning a thrown value if unpacking fails.\n- `unwrap-err!`: Unpacks error responses, returning a thrown value if the response is `ok`.\n- `try!`: Unpacks optional and response types, returning `none` or the `err` value if unpacking fails.\n\n## Conclusion\n\nThe `unwrap-err-panic` function is a fundamental tool for unpacking error responses and throwing runtime errors in Clarity smart contracts. It allows you to implement logic that requires handling error responses, ensuring data integrity and simplifying the error unpacking process. When used effectively, `unwrap-err-panic` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle error responses and throw runtime errors when necessary.\n","url":"/docs/stacks/clarity/functions/unwrap-err-panic"},"149":{"id":"/docs/stacks/clarity/functions/append","title":"append","description":"Use the append function to add elements to lists in Clarity smart contracts, with considerations for maximum list length.","content":"\n## Function Signature\n\n```clarity\n(append (list A) A)\n```\n\n- Input: A list of type A, and a single element of type A\n- Output: A new list of type A with the element appended\n\n## Why it matters\n\nThe `append` function is crucial for:\n\n1. Dynamically growing lists within smart contracts.\n2. Adding new elements to existing data structures.\n3. Implementing queue-like behaviors in contract logic.\n4. Constructing lists incrementally during contract execution.\n\n## When to use it\n\nUse the `append` function when you need to:\n\n- Add a new element to the end of an existing list.\n- Construct a list by adding elements one at a time.\n- Implement data structures that require adding elements in order.\n- Combine existing lists with single elements.\n\n## Best Practices\n\n- Always use `as-max-len?` before appending to ensure the list doesn't exceed its maximum length.\n- Be mindful of the maximum list length specified when defining the list.\n- Consider using `concat` for joining two lists instead of repeatedly using `append`.\n- Remember that `append` creates a new list; it doesn't modify the original list in-place.\n- Use type-appropriate elements that match the list's declared type.\n\n## Practical Example: Event Log with Max Length Check\n\nLet's implement a simple event log system using `append` with a maximum length check:\n\n```clarity\n(define-data-var eventLog (list 50 (string-ascii 50)) (list))\n\n(define-public (log-event (event (string-ascii 50)))\n (let\n (\n (current-log (var-get eventLog))\n )\n (match (as-max-len? (append current-log event) u2) success\n (ok (var-set eventLog success))\n (err u1)\n )\n )\n)\n\n(define-read-only (get-eventLog)\n (ok (var-get eventLog))\n)\n\n;; Usage\n(log-event \"Contract initialized\")\n(log-event \"User registered\")\n(get-eventLog) ;; Returns (ok (\"Contract initialized\" \"User registered\"))\n```\n\nThis example demonstrates:\n1. Using `append` to add new events to an existing log.\n2. Using `as-max-len?` to check if appending would exceed the maximum list length.\n3. Handling the case where the list would exceed its maximum length.\n4. Combining `append` with other Clarity functions like `var-set` and `var-get`.\n\n## Common Pitfalls\n\n1. Forgetting to use `as-max-len?` when appending to a list with a maximum length.\n2. Attempting to append an element of the wrong type to a typed list.\n3. Assuming `append` will always succeed without checking the list's current length.\n4. Inefficiently using `append` in a loop when `concat` might be more appropriate.\n\n## Related Functions\n\n- `as-max-len?`: Used to check if a sequence exceeds a maximum length.\n- `concat`: Used for joining two lists together.\n- `list`: Used for creating new lists.\n- `len`: Used for getting the current length of a list.\n\n## Conclusion\n\nThe `append` function is a powerful tool for manipulating lists in Clarity smart contracts. By understanding its behavior, limitations, and the necessity of using `as-max-len?` with lists that have a maximum length, you can effectively manage dynamic data structures within your contracts. This enables more flexible and responsive smart contract designs while maintaining safeguards against exceeding predefined list size limits.\n","url":"/docs/stacks/clarity/functions/append"},"150":{"id":"/docs/stacks/clarity/functions/stx-transfer","title":"stx-transfer?","description":"Transfer STX between principals in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(stx-transfer? amount sender recipient)\n```\n\n- Input: `uint, principal, principal`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `stx-transfer?` function is crucial for:\n\n1. Transferring STX between principals.\n2. Implementing logic that requires moving STX from one account to another.\n3. Ensuring data integrity by validating the transfer operation.\n4. Simplifying the process of handling STX transfers in smart contracts.\n\n## When to use it\n\nUse `stx-transfer?` when you need to:\n\n- Transfer STX between principals.\n- Implement logic that requires moving STX from one account to another.\n- Validate the transfer operation to ensure data integrity.\n- Handle STX transfers in your smart contract.\n\n## Best Practices\n\n- Ensure the `amount` is positive and the `sender` has sufficient balance.\n- Use meaningful variable names for better readability.\n- Combine with other STX functions for comprehensive account management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Transferring STX\n\nLet's implement a function that transfers STX from the `tx-sender` to a recipient:\n\n```clarity\n(define-public (transfer-stx (amount uint) (recipient principal))\n (stx-transfer? amount tx-sender recipient)\n)\n\n;; Usage\n(transfer-stx u60 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns (ok true) if successful\n(transfer-stx u50 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns (err u1) if the sender does not have enough balance\n```\n\nThis example demonstrates:\n1. Using `stx-transfer?` to transfer STX from the `tx-sender` to a recipient.\n2. Implementing a public function to handle the STX transfer.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `stx-transfer?` with a non-positive amount, causing the operation to fail.\n2. Assuming the transfer operation will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete account management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `stx-get-balance`: Queries the STX balance of a principal.\n- `stx-transfer-memo?`: Transfers STX from one principal to another with a memo.\n- `stx-burn?`: Burns STX from a principal's account.\n\n## Conclusion\n\nThe `stx-transfer?` function is a fundamental tool for transferring STX between principals in Clarity smart contracts. It allows you to implement logic that requires moving STX from one account to another, ensuring data integrity and simplifying STX transfer operations. When used effectively, `stx-transfer?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle STX transfers.\n","url":"/docs/stacks/clarity/functions/stx-transfer"},"151":{"id":"/docs/stacks/clarity/functions/unwrap-panic","title":"unwrap-panic","description":"Unpack optional and response types and throwing runtime errors in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(unwrap-panic option-input)\n```\n\n- Input: `(optional A) | (response A B)`\n- Output: `A`\n\n## Why it matters\n\nThe `unwrap-panic` function is crucial for:\n\n1. Unpacking optional and response types to access their inner values.\n2. Implementing logic that requires handling optional and response types.\n3. Ensuring data integrity by validating the unpacking process.\n4. Simplifying the process of handling optional and response types in smart contracts by throwing runtime errors when necessary.\n\n## When to use it\n\nUse `unwrap-panic` when you need to:\n\n- Unpack optional and response types to access their inner values.\n- Implement logic that requires handling optional and response types.\n- Validate the unpacking process to ensure data integrity.\n- Handle optional and response types in your smart contract and throw runtime errors when necessary.\n\n## Best Practices\n\n- Ensure the input value is an optional or response type.\n- Use meaningful variable names for better readability.\n- Combine with other error handling functions for comprehensive error management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Unpacking an Optional Value and Throwing a Runtime Error\n\nLet's implement a function that retrieves a value from a map and unpacks it using `unwrap-panic`:\n\n```clarity\n(define-map UserInfo { userId: principal } { name: (string-ascii 20), age: uint })\n\n(define-public (get-user-age (user principal))\n (let\n (\n (userData (unwrap-panic (map-get? UserInfo { userId: user })))\n )\n (ok (get age userData))\n )\n)\n\n;; Usage\n(map-set UserInfo { userId: tx-sender } { name: \"Alice\", age: u30 })\n(get-user-age tx-sender) ;; Returns (ok u30)\n(get-user-age 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) ;; Throws a runtime exception\n```\n\n## Common Pitfalls\n\n1. Using `unwrap-panic` with values that are not optional or response types, causing runtime errors.\n2. Assuming the unpacking will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete error management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `unwrap!`: Unpacks optional and response types, returning a thrown value if unpacking fails.\n- `unwrap-err!`: Unpacks error responses, returning a thrown value if the response is `ok`.\n- `try!`: Unpacks optional and response types, returning `none` or the `err` value if unpacking fails.\n\n## Conclusion\n\nThe `unwrap-panic` function is a fundamental tool for unpacking optional and response types and throwing runtime errors in Clarity smart contracts. It allows you to implement logic that requires handling optional and response types, ensuring data integrity and simplifying the unpacking process. When used effectively, `unwrap-panic` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle optional and response types and throw runtime errors when necessary.\n","url":"/docs/stacks/clarity/functions/unwrap-panic"},"152":{"id":"/docs/stacks/clarity/functions/impl-trait","title":"impl-trait","description":"Implement traits in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(impl-trait trait-name)\n```\n\n- Input: \n - `trait-name`: The name of the trait to implement\n- Output: Not applicable\n\n## Why it matters\n\nThe `impl-trait` function is crucial for:\n\n1. Enabling contracts to conform to specific interfaces.\n2. Allowing dynamic function calls between contracts.\n3. Promoting code reuse and modularity in smart contract development.\n4. Ensuring contracts adhere to predefined behaviors and standards.\n\n## When to use it\n\nUse `impl-trait` when you need to:\n\n- Implement a predefined interface in your contract.\n- Allow other contracts to interact with your contract through a common interface.\n- Ensure your contract adheres to specific standards or behaviors.\n- Enable dynamic function calls using `contract-call?`.\n\n## Best Practices\n\n- Define traits at the top level of your contract for clarity and organization.\n- Ensure all required functions in the trait are implemented in your contract.\n- Use meaningful and descriptive names for traits and their functions.\n- Document the purpose and usage of each trait in your contract.\n\n## Practical Example: Implementing a Token Trait\n\nLet's define a simple token trait and implement it in a contract:\n\n```clarity\n(define-trait token-trait\n (\n (transfer (principal principal uint) (response bool uint))\n (get-balance (principal) (response uint uint))\n )\n)\n\n(impl-trait token-trait)\n\n(define-map Balances { user: principal } { balance: uint })\n\n(define-public (transfer (sender principal) (recipient principal) (amount uint))\n (let\n (\n (senderBalance (default-to u0 (map-get? Balances { user: sender })))\n (recipientBalance (default-to u0 (map-get? Balances { user: recipient })))\n )\n (if (>= senderBalance amount)\n (begin\n (map-set Balances { user: sender } { balance: (- senderBalance amount) })\n (map-set Balances { user: recipient } { balance: (+ recipientBalance amount) })\n (ok true)\n )\n (err u1)\n )\n )\n)\n\n(define-read-only (get-balance (user principal))\n (ok (default-to u0 (map-get? Balances { user: user })))\n)\n```\n\nThis example demonstrates:\n1. Defining a `token-trait` with `transfer` and `get-balance` functions.\n2. Implementing the `token-trait` in a contract using `impl-trait`.\n3. Providing implementations for the `transfer` and `get-balance` functions.\n\n## Common Pitfalls\n\n1. Forgetting to implement all required functions in the trait, leading to deployment errors.\n2. Using inconsistent function signatures between the trait and the implementation.\n3. Not documenting the purpose and usage of traits, making the contract harder to understand.\n4. Overlooking the need for proper error handling in trait functions.\n\n## Related Functions\n\n- `define-trait`: Used to define a new trait.\n- `contract-call?`: Used to call functions dynamically on contracts that implement a trait.\n- `define-public`: Used to define public functions that can be called from outside the contract.\n\n## Conclusion\n\nThe `impl-trait` function is a powerful tool for promoting modularity and code reuse in Clarity smart contracts. By implementing predefined interfaces, contracts can interact dynamically and adhere to specific standards and behaviors. When used effectively, `impl-trait` enhances the flexibility and maintainability of your smart contract code, enabling more robust and interoperable decentralized applications.\n","url":"/docs/stacks/clarity/functions/impl-trait"},"153":{"id":"/docs/stacks/clarity/functions/to-int","title":"to-int","description":"Convert an unsigned integer to a signed integer in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(to-int value)\n```\n\n- Input: `uint`\n- Output: `int`\n\n## Why it matters\n\nThe `to-int` function is crucial for:\n\n1. Converting unsigned integers to signed integers.\n2. Implementing logic that requires signed integer operations.\n3. Ensuring data integrity by validating the conversion process.\n4. Simplifying the process of handling integer conversions in smart contracts.\n\n## When to use it\n\nUse `to-int` when you need to:\n\n- Convert an unsigned integer to a signed integer.\n- Implement logic that requires signed integer operations.\n- Validate the conversion process to ensure data integrity.\n- Handle integer conversions in your smart contract.\n\n## Best Practices\n\n- Ensure the input value is within the range that can be represented as a signed integer.\n- Use meaningful variable names for better readability.\n- Combine with other integer functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Converting Unsigned Integer to Signed Integer\n\nLet's implement a function that converts an unsigned integer to a signed integer:\n\n```clarity\n(define-read-only (convert-to-int (input uint))\n (to-int input)\n)\n\n;; Usage\n(convert-to-int u42) ;; Returns 42\n(convert-to-int u0) ;; Returns 0\n(convert-to-int u1000000) ;; Returns 1000000\n```\n\nThis example demonstrates:\n1. Using `to-int` to convert an unsigned integer to a signed integer.\n2. Implementing a public function to handle the conversion process.\n3. Handling both small and large input values.\n\n## Common Pitfalls\n\n1. Using `to-int` with values that exceed the range of signed integers, causing unexpected behavior.\n2. Assuming the conversion will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `to-uint`: Converts a signed integer to an unsigned integer.\n- `int-to-ascii`: Converts an integer to a string-ascii representation.\n- `int-to-utf8`: Converts an integer to a string-utf8 representation.\n\n## Conclusion\n\nThe `to-int` function is a fundamental tool for converting unsigned integers to signed integers in Clarity smart contracts. It allows you to implement logic that requires signed integer operations, ensuring data integrity and simplifying integer conversions. When used effectively, `to-int` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle integer conversions.\n","url":"/docs/stacks/clarity/functions/to-int"},"154":{"id":"/docs/stacks/clarity/functions/greater-than","title":"greater than","description":"Use the greater than function for comparisons in Clarity smart contracts.","content":"\nThe greater than function (`>`) in Clarity compares two values and returns true if the first value is greater than the second. It's a fundamental comparison operation used in many smart contract conditions and logic flows.\n\n## Function Signature\n\n```clarity\n(> v1 v2)\n```\n\n- Input: Two values of the same type (int, uint, string-ascii, string-utf8, or buff)\n- Output: A boolean (true or false)\n\n## Why it matters\n\nThe greater than function is crucial for:\n\n1. Implementing conditional logic in smart contracts.\n2. Comparing numerical values for financial operations.\n3. Ordering and sorting data.\n4. Implementing thresholds or limits in contract logic.\n\n## When to use it\n\nUse the greater than function when you need to:\n\n- Compare two numerical values to determine if one is larger.\n- Implement minimum thresholds for certain operations.\n- Create conditional logic based on numerical comparisons.\n- Sort or order data based on numerical or lexicographical order.\n\n## Best Practices\n\n- Ensure that both inputs are of the same type to avoid runtime errors.\n- Be aware of the differences in comparison between signed (int) and unsigned (uint) integers.\n- When comparing strings or buffers, understand that the comparison is lexicographical.\n- Consider edge cases, especially when dealing with the limits of integer ranges.\n\n## Practical Example: Token Sale with Minimum Purchase\n\nLet's implement a simple token sale contract that uses the greater than function to enforce a minimum purchase amount:\n\n```clarity\n;; Define constants\n(define-constant MIN_PURCHASE u100000000) ;; 1 STX\n(define-constant TOKEN_PRICE u50000) ;; 0.0005 STX per token\n\n;; Define data variables\n(define-data-var tokensSold uint u0)\n\n;; Function to purchase tokens\n(define-public (purchase-tokens (amount uint))\n (let\n (\n (tokensToMint (/ amount TOKEN_PRICE))\n (payment amount)\n )\n ;; Check if the purchase amount is greater than the minimum\n (asserts! (> payment MIN_PURCHASE) (err u1))\n ;; Perform the token purchase\n (try! (stx-transfer? payment tx-sender (as-contract tx-sender)))\n (var-set tokensSold (+ (var-get tokensSold) tokensToMint))\n ;; Here you would typically mint or transfer tokens to the buyer\n (ok tokensToMint)\n )\n)\n\n;; Function to check total tokens sold\n(define-read-only (get-tokensSold)\n (ok (var-get tokensSold))\n)\n```\n\nThis example demonstrates:\n1. Using `>` to check if the payment amount exceeds the minimum purchase threshold.\n2. Combining the greater than check with other contract logic for a token sale.\n3. Implementing a minimum purchase amount to prevent small, potentially spam transactions.\n\n## Common Pitfalls\n\n1. Comparing values of different types, which will result in a runtime error.\n2. Not considering the inclusive nature of `>=` vs the exclusive nature of `>` when setting thresholds.\n3. Overlooking potential integer overflow when working with very large numbers.\n\n## Related Functions\n\n- `<`: Used for less than comparisons.\n- `>=`: Used for greater than or equal to comparisons.\n- `<=`: Used for less than or equal to comparisons.\n\n## Conclusion\n\nThe greater than function is a fundamental tool for implementing comparison logic in Clarity smart contracts. By understanding its behavior with different types and potential edge cases, you can create robust conditional logic and enforce important thresholds in your contracts.\n","url":"/docs/stacks/clarity/functions/greater-than"},"155":{"id":"/docs/stacks/clarity/functions/not","title":"not","description":"Logical negation in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(not boolean-expression)\n```\n\n- Input: `bool`\n- Output: `bool`\n\n## Why it matters\n\nThe `not` function is crucial for:\n\n1. Implementing logical negation in conditional statements.\n2. Simplifying the process of inverting boolean expressions.\n3. Enhancing code readability and maintainability by abstracting logical negation.\n\n## When to use it\n\nUse `not` when you need to:\n\n- Invert a boolean expression.\n- Implement logical negation in conditional statements.\n- Simplify and abstract the process of inverting boolean values.\n\n## Best Practices\n\n- Ensure the input is a boolean expression.\n- Use meaningful variable names for better readability.\n- Combine with other logical functions for comprehensive boolean logic.\n- Be aware of the performance implications of complex logical operations.\n\n## Practical Example: Inverting a Boolean Expression\n\nLet's implement a function that checks if a number is not zero:\n\n```clarity\n(define-read-only (is-not-zero (n int))\n (not (is-eq n 0))\n)\n\n;; Usage\n(is-not-zero 5) ;; Returns true\n(is-not-zero 0) ;; Returns false\n```\n\nThis example demonstrates:\n1. Using `not` to invert the result of a boolean expression.\n2. Implementing a read-only function to check if a number is not zero.\n3. Handling both true and false cases.\n\n## Common Pitfalls\n\n1. Using `not` with non-boolean expressions, causing type errors.\n2. Assuming the result will always be true or false, leading to incorrect logic.\n3. Not handling all possible conditions, resulting in incomplete boolean logic.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `and`: Logical conjunction of multiple boolean expressions.\n- `or`: Logical disjunction of multiple boolean expressions.\n- `is-eq`: Checks if two values are equal.\n\n## Conclusion\n\nThe `not` function is a fundamental tool for implementing logical negation in Clarity smart contracts. It allows you to invert boolean expressions, enabling robust and comprehensive boolean logic. When used effectively, `not` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage logical negation.\n","url":"/docs/stacks/clarity/functions/not"},"156":{"id":"/docs/stacks/clarity/functions/get-block-info","title":"get-block-info?","description":"Fetch information about Stacks blocks in Clarity smart contracts.","content":"\n<Callout>\nIn Clarity 3, this function is being deprecated for [`get-stacks-block-info?`](/stacks/clarity/functions/get-stacks-block-info).\n</Callout>\n\n## Function Signature\n\n```clarity\n(get-block-info? prop-name block-height)\n```\n\n- Input: \n - `prop-name`: A BlockInfoPropertyName\n - `block-height`: A uint representing the Stacks block height\n- Output: `(optional buff) | (optional uint) | (optional principal)` depending on the property\n\n## Why it matters\n\nThe `get-block-info?` function is crucial for:\n\n1. Accessing historical block data within smart contracts.\n2. Implementing time-based logic using block information.\n3. Verifying block-related properties for security or validation purposes.\n4. Building applications that need to reference specific blockchain states.\n\n## When to use it\n\nUse `get-block-info?` when you need to:\n\n- Retrieve information about past Stacks blocks.\n- Implement logic that depends on block times or miner information.\n- Verify block hashes or other block-specific data.\n- Access block rewards or miner spending data (in Stacks 2.1+).\n\n## Best Practices\n\n- Always check if the returned value is `none`, as it will be for non-existent or future blocks.\n- Be aware of the potential for chain reorganizations when using recent block data.\n- Use the appropriate property name for the data you need to retrieve.\n- Consider caching results for frequently accessed block information to save on execution costs.\n\n## Practical Example: Block Time Verification\n\nLet's implement a function that checks if a given block was mined after a certain time:\n\n```clarity\n(define-read-only (block-after-time? (blockHeight uint) (targetTime uint))\n (match (get-block-info? time blockHeight) time\n (> time targetTime)\n false\n )\n)\n\n;; Usage\n(block-after-time? u100 u1600000000) ;; Returns true if block 100 was mined after Unix timestamp 1600000000\n```\n\nThis example demonstrates:\n1. Using `get-block-info?` to retrieve the `time` property of a block.\n2. Handling the optional return value with `match`.\n3. Comparing the block time to a target time.\n\n## Available Properties\n\n- `burnchain-header-hash`: Returns the burnchain block header hash (buff 32).\n- `id-header-hash`: Returns the Stacks block's index block hash (buff 32).\n- `header-hash`: Returns the Stacks block's header hash (buff 32).\n- `miner-address`: Returns the block miner's principal.\n- `time`: Returns the block time as a Unix epoch timestamp (uint).\n\nNew in Stacks 2.1:\n- `block-reward`: Returns the total block reward (uint).\n- `miner-spend-total`: Returns the total spent by miners for this block (uint).\n\n## Common Pitfalls\n\n1. Assuming all properties are available for all blocks (e.g., `block-reward` is only available for mature blocks).\n2. Not handling the `none` case when the block height is invalid or in the future.\n3. Relying on exact block times, which can be inaccurate up to two hours.\n4. Using `header-hash` when global uniqueness is required (use `id-header-hash` instead).\n\n## Related Functions\n\n- `get-burn-block-info?`: Used to get information about the underlying burn chain blocks.\n- `block-height`: Keyword that returns the current block height.\n- `burn-block-height`: Keyword that returns the current burn chain block height.\n\n## Conclusion\n\nThe `get-block-info?` function is a powerful tool for accessing historical block data in Clarity smart contracts. It allows you to incorporate block-specific information into your contract logic, enabling a wide range of applications that can reference and utilize blockchain state. When used correctly, it provides valuable insights into the Stacks blockchain's history and can be used to implement sophisticated, time-aware contract behaviors.\n","url":"/docs/stacks/clarity/functions/get-block-info"},"157":{"id":"/docs/stacks/clarity/functions/string-to-uint","title":"string-to-uint?","description":"Convert a string to an optional unsigned integer in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(string-to-uint? string)\n```\n\n- Input: `(string-ascii 1048576) | (string-utf8 262144)`\n- Output: `(optional uint)`\n\n## Why it matters\n\nThe `string-to-uint?` function is crucial for:\n\n1. Converting string representations of numbers to unsigned integers.\n2. Implementing logic that requires numeric values from string inputs.\n3. Ensuring data integrity by validating string-to-unsigned-integer conversions.\n4. Simplifying the process of handling numeric conversions in smart contracts.\n\n## When to use it\n\nUse `string-to-uint?` when you need to:\n\n- Convert a string representation of a number to an unsigned integer.\n- Implement logic that requires numeric values from string inputs.\n- Validate string-to-unsigned-integer conversions to ensure data integrity.\n- Handle numeric conversions in your smart contract.\n\n## Best Practices\n\n- Ensure the input string is correctly formatted and represents a valid unsigned integer.\n- Use meaningful variable names for better readability.\n- Combine with other string and numeric functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Converting a String to an Unsigned Integer\n\nLet's implement a function that converts a string to an optional unsigned integer:\n\n```clarity\n(define-read-only (convert-string-to-uint (input (string-ascii 20)))\n (string-to-uint? input)\n)\n\n;; Usage\n(convert-string-to-uint \"123\") ;; Returns (some u123)\n(convert-string-to-uint \"456\") ;; Returns (some u456)\n(convert-string-to-uint \"abc\") ;; Returns none\n```\n\nThis example demonstrates:\n1. Using `string-to-uint?` to convert a string to an optional unsigned integer.\n2. Implementing a public function to handle the string-to-unsigned-integer conversion.\n3. Handling both valid and invalid string inputs.\n\n## Common Pitfalls\n\n1. Using `string-to-uint?` with incorrectly formatted or invalid string inputs, causing the operation to return `none`.\n2. Assuming the conversion will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `string-to-int?`: Converts a string to an optional signed integer.\n- `int-to-ascii`: Converts an integer to a string-ascii representation.\n- `int-to-utf8`: Converts an integer to a string-utf8 representation.\n\n## Conclusion\n\nThe `string-to-uint?` function is a fundamental tool for converting string representations of numbers to unsigned integers in Clarity smart contracts. It allows you to implement logic that requires numeric values from string inputs, ensuring data integrity and simplifying numeric conversions. When used effectively, `string-to-uint?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle string-to-unsigned-integer conversions.\n","url":"/docs/stacks/clarity/functions/string-to-uint"},"158":{"id":"/docs/stacks/clarity/functions/buff-to-uint-le","title":"buff-to-uint-le","description":"Convert a byte buffer to an unsigned integer using little-endian encoding in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(buff-to-uint-le (buff 16))\n```\n\n- Input: A byte buffer of up to 16 bytes\n- Output: An unsigned integer (`uint`)\n\n## Why it matters\n\nThe `buff-to-uint-le` function is crucial for:\n\n1. Converting byte data to unsigned integers using little-endian encoding.\n2. Handling data from external sources or other contracts that use little-endian encoding.\n3. Implementing protocols or algorithms that require little-endian integer representation.\n4. Interoperating with systems that use little-endian byte order.\n\n## When to use it\n\nUse the `buff-to-uint-le` function when you need to:\n\n- Convert a little-endian encoded byte buffer to an unsigned integer.\n- Process input data that represents unsigned integers in little-endian format.\n- Implement cryptographic or mathematical operations that expect little-endian integer inputs.\n- Ensure compatibility with external systems using little-endian encoding.\n\n## Best Practices\n\n- Ensure the input buffer is no larger than 16 bytes to avoid errors.\n- Be aware that smaller buffers are zero-padded on the right, affecting the resulting integer value.\n- Use `buff-to-int-le` if you need to handle signed integers instead.\n- Handle potential errors when the input buffer might be invalid or empty.\n\n## Practical Example: Decoding an Unsigned Integer from External Data\n\nLet's implement a function that processes external data containing a little-endian encoded unsigned integer:\n\n```clarity\n(define-read-only (process-external-data-le (data (buff 16)))\n (let\n (\n (value (buff-to-uint-le data))\n )\n (if (> value u1000000)\n (err \"Value too large\")\n (ok value)\n )\n )\n)\n\n;; Usage\n(process-external-data-le 0x01000000) ;; Returns (ok u1)\n(process-external-data-le 0x40420f00) ;; Returns (ok u1000000)\n(process-external-data-le 0x80969800) ;; Returns (err \"Value too large\")\n```\n\nThis example demonstrates:\n1. Using `buff-to-uint-le` to convert external data to an unsigned integer.\n2. Implementing input validation based on the converted integer value.\n3. Handling different input sizes and values.\n\n## Common Pitfalls\n\n1. Confusing little-endian with big-endian encoding, leading to incorrect integer values.\n2. Not considering the full range of possible uint values when processing the result.\n3. Assuming a specific buffer length, which could lead to unexpected results with shorter inputs due to right-padding.\n\n## Related Functions\n\n- `buff-to-uint-be`: Converts a byte buffer to an unsigned integer using big-endian encoding.\n- `buff-to-int-le`: Converts a byte buffer to a signed integer using little-endian encoding.\n- `uint-to-buff`: Converts an unsigned integer to a byte buffer.\n\n## Conclusion\n\nThe `buff-to-uint-le` function is a powerful tool for working with little-endian encoded unsigned integers in Clarity smart contracts. By understanding its behavior with different input sizes and potential edge cases, you can effectively process and validate external data, implement complex algorithms, and ensure compatibility with little-endian systems in your smart contract applications.\n","url":"/docs/stacks/clarity/functions/buff-to-uint-le"},"159":{"id":"/docs/stacks/clarity/functions/unwrap-err","title":"unwrap-err!","description":"Unpack error responses in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(unwrap-err! response-input thrown-value)\n```\n\n- Input: `(response A B), C`\n- Output: `B`\n\n## Why it matters\n\nThe `unwrap-err!` function is crucial for:\n\n1. Unpacking error responses to access their inner values.\n2. Implementing logic that requires handling error responses.\n3. Ensuring data integrity by validating the error unpacking process.\n4. Simplifying the process of handling error responses in smart contracts.\n\n## When to use it\n\nUse `unwrap-err!` when you need to:\n\n- Unpack error responses to access their inner values.\n- Implement logic that requires handling error responses.\n- Validate the error unpacking process to ensure data integrity.\n- Handle error responses in your smart contract.\n\n## Best Practices\n\n- Ensure the input value is a response type.\n- Use meaningful variable names for better readability.\n- Combine with other error handling functions for comprehensive error management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Unpacking an Error Response\n\nLet's implement a function that processes an error response using `unwrap-err!`:\n\n```clarity\n(define-public (process-error-response (input (response int int)))\n (let\n (\n (errorValue (unwrap-err! input (err \"No error found\")))\n )\n (ok errorValue)\n )\n)\n\n;; Usage\n(process-error-response (err 42)) ;; Returns (ok 42)\n(process-error-response (ok 1)) ;; Returns (err \"No error found\")\n```\n\nThis example demonstrates:\n1. Using `unwrap-err!` to unpack an error response.\n2. Implementing a public function to handle the error unpacking process.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `unwrap-err!` with values that are not response types, causing runtime errors.\n2. Assuming the error unpacking will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete error management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `unwrap!`: Unpacks optional and response types, returning a thrown value if unpacking fails.\n- `unwrap-panic`: Unpacks optional and response types, throwing a runtime error if unpacking fails.\n- `try!`: Unpacks optional and response types, returning `none` or the `err` value if unpacking fails.\n\n## Conclusion\n\nThe `unwrap-err!` function is a fundamental tool for unpacking error responses in Clarity smart contracts. It allows you to implement logic that requires handling error responses, ensuring data integrity and simplifying the error unpacking process. When used effectively, `unwrap-err!` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle error responses.\n","url":"/docs/stacks/clarity/functions/unwrap-err"},"160":{"id":"/docs/stacks/clarity/functions/define-fungible-token","title":"define-fungible-token","description":"Define a new fungible token in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(define-fungible-token token-name <total-supply>)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n - `<total-supply>`: (Optional) An unsigned integer representing the total supply of tokens\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-fungible-token` function is crucial for:\n\n1. Creating new fungible tokens within a smart contract.\n2. Establishing a token economy or system within your dApp.\n3. Implementing custom tokens with specific supply constraints.\n4. Enabling token-related operations like minting, transferring, and burning.\n\n## When to use it\n\nUse `define-fungible-token` when you need to:\n\n- Create a new fungible token for your smart contract or dApp.\n- Implement a token with a fixed total supply.\n- Establish a foundation for token-based features in your contract.\n- Create utility tokens, governance tokens, or other custom fungible assets.\n\n## Best Practices\n\n- Place `define-fungible-token` at the top level of your contract, as it's a definition statement.\n- Consider carefully whether to specify a total supply or leave it unlimited.\n- Use meaningful and descriptive names for your tokens.\n- Implement proper access controls for minting and burning operations if required.\n\n## Practical Example: Simple Token Creation\n\nLet's implement a basic fungible token with a fixed supply:\n\n```clarity\n(define-fungible-token DOG-GO-TO-THE-MOON u1000000)\n\n(define-data-var tokenAdmin principal tx-sender)\n\n(define-public (transfer (amount uint) (sender principal) (recipient principal))\n (begin\n (asserts! (is-eq tx-sender sender) (err u1))\n (ft-transfer? DOG-GO-TO-THE-MOON amount sender recipient)\n )\n)\n\n(define-read-only (get-balance (account principal))\n (ok (ft-get-balance DOG-GO-TO-THE-MOON account))\n)\n\n(define-public (mint (amount uint) (recipient principal))\n (begin\n (asserts! (is-eq tx-sender (var-get tokenAdmin)) (err u3))\n (ft-mint? DOG-GO-TO-THE-MOON amount recipient)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `define-fungible-token` to create a new token with a fixed supply of 1,000,000.\n2. Implementing basic token operations like transfer and balance checking.\n3. Adding a mint function with admin-only access control.\n\n## Common Pitfalls\n\n1. Forgetting that omitting the total supply parameter allows unlimited minting, if not handled manually.\n2. Not implementing proper access controls for sensitive operations like minting.\n3. Overlooking the need for additional functionality like burning or pausing.\n\n## Related Functions\n\n- `ft-transfer?`: Used to transfer tokens between principals.\n- `ft-mint?`: Used to create new tokens (if allowed by the token definition).\n- `ft-burn?`: Used to destroy tokens, reducing the circulating supply.\n- `ft-get-balance`: Used to check the token balance of a principal.\n- `ft-get-supply`: Used to get the current total supply of tokens.\n\n## Conclusion\n\nThe `define-fungible-token` function is a fundamental building block for creating token-based systems in Clarity smart contracts. It allows you to define custom fungible tokens with or without supply constraints. When combined with other token-related functions, it enables the implementation of sophisticated token economies and financial instruments on the Stacks blockchain.\n","url":"/docs/stacks/clarity/functions/define-fungible-token"},"161":{"id":"/docs/stacks/clarity/functions/at-block","title":"at-block","description":"Use the at-block function to evaluate expressions at a specific block in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(at-block id-block-hash expr)\n```\n\n\n- Input: \n - `id-block-hash`: A 32-byte buffer representing a block hash\n - `expr`: An expression to be evaluated\n- Output: The result of evaluating `expr`\n\n## Why it matters\n\nThe `at-block` function is crucial for:\n\n1. Accessing historical contract state at a specific block.\n2. Implementing time-dependent logic based on blockchain state.\n3. Verifying past conditions or values in the contract.\n4. Creating mechanisms that depend on specific blockchain checkpoints.\n\n## When to use it\n\nUse the `at-block` function when you need to:\n\n- Evaluate contract state or expressions as they were at a specific past block.\n- Implement logic that depends on historical blockchain data.\n- Verify past conditions without relying on stored state.\n- Create time-locked or checkpoint-based features in your contract.\n\n## Best Practices\n\n- Only use `at-block` when historical data is necessary, as it can be computationally expensive.\n- Ensure the block hash used is from the `id-header-hash` property, not `header-hash`.\n- Use read-only expressions within `at-block` to maintain determinism.\n- Be aware of the potential for chain reorganizations when using recent block hashes.\n\n## Practical Example: Historical Price Check\n\nLet's implement a simple function that checks if a price was above a certain threshold at a specific block:\n\n```clarity\n(define-map AssetPrices uint uint)\n\n(define-public (set-price (price uint))\n (ok (map-set AssetPrices block-height price))\n)\n\n(define-read-only (was-price-above-at-block (threshold uint) (blockHash (buff 32)))\n (at-block blockHash\n (let\n (\n (pastPrice (default-to u0 (map-get? AssetPrices block-height)))\n )\n (> pastPrice threshold)\n )\n )\n)\n\n;; Usage\n(set-price u100)\n;; ... several blocks later\n(was-price-above-at-block u50 0x123456...) ;; Returns true if the price was above 50 at the specified block\n```\n\n\nThis example demonstrates:\n1. Using `at-block` to evaluate a condition based on historical data.\n2. Combining `at-block` with map lookups to access past state.\n3. Implementing a read-only function that depends on blockchain history.\n\n## Common Pitfalls\n\n1. Using `header-hash` instead of `id-header-hash`, which can lead to inconsistencies across forks.\n2. Attempting to modify state within an `at-block` expression, which is not allowed.\n3. Overusing `at-block`, which can lead to performance issues due to the cost of historical lookups.\n\n## Related Functions\n\n- `get-block-info?`: Used to retrieve information about specific blocks.\n- `block-height`: Often used in conjunction with `at-block` for time-based logic.\n- `id-header-hash`: Provides the correct hash to use with `at-block`.\n\n## Conclusion\n\nThe `at-block` function is a powerful tool for implementing history-dependent logic in Clarity smart contracts. By allowing contracts to evaluate expressions as they would have at a specific past block, it enables sophisticated time-based mechanisms and historical verifications. However, this function should be used judiciously due to its potential performance impact and the complexities of working with blockchain history.\n","url":"/docs/stacks/clarity/functions/at-block"},"162":{"id":"/docs/stacks/clarity/functions/secp256k1-recover","title":"secp256k1-recover?","description":"Recover the public key from a message hash and signature in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(secp256k1-recover? message-hash signature)\n```\n\n- Input: `(buff 32), (buff 65)`\n- Output: `(response (buff 33) uint)`\n\n## Why it matters\n\nThe `secp256k1-recover?` function is crucial for:\n\n1. Verifying the authenticity of a message by recovering the public key from a signature.\n2. Implementing cryptographic verification in smart contracts.\n3. Ensuring data integrity by validating signatures.\n4. Simplifying the process of handling cryptographic operations in smart contracts.\n\n## When to use it\n\nUse `secp256k1-recover?` when you need to:\n\n- Verify the authenticity of a message by recovering the public key from a signature.\n- Implement cryptographic verification in your smart contract.\n- Validate signatures to ensure data integrity.\n- Handle cryptographic operations.\n\n## Best Practices\n\n- Ensure the `message-hash` and `signature` are correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for comprehensive security management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Recovering a Public Key\n\nLet's implement a function that recovers the public key from a message hash and signature:\n\n```clarity\n(define-read-only (recover-public-key (messageHash (buff 32)) (signature (buff 65)))\n (secp256k1-recover? messageHash signature)\n)\n\n;; Usage\n(recover-public-key 0xde5b9eb9e7c5592930eb2e30a01369c36586d872082ed8181ee83d2a0ec20f04 0x8738487ebe69b93d8e51583be8eee50bb4213fc49c767d329632730cc193b873554428fc936ca3569afc15f1c9365f6591d6251a89fee9c9ac661116824d3a1301) \n;; Returns (ok 0x03adb8de4bfb65db2cfd6120d55c6526ae9c52e675db7e47308636534ba7786110)\n```\n\nThis example demonstrates:\n1. Using `secp256k1-recover?` to recover a public key from a message hash and signature.\n2. Implementing a public function to handle the public key recovery.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `secp256k1-recover?` with incorrectly formatted or invalid `message-hash` or `signature`, causing the operation to fail.\n2. Assuming the public key will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete cryptographic verification.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `principal-of?`: Returns the principal derived from a public key.\n- `hash160`: Computes the RIPEMD-160 hash of the SHA-256 hash of the input.\n- `sha256`: Computes the SHA-256 hash of the input.\n\n## Conclusion\n\nThe `secp256k1-recover?` function is a fundamental tool for recovering public keys from message hashes and signatures in Clarity smart contracts. It allows you to verify the authenticity of messages, ensuring data integrity and simplifying cryptographic operations. When used effectively, `secp256k1-recover?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle cryptographic verification.\n","url":"/docs/stacks/clarity/functions/secp256k1-recover"},"163":{"id":"/docs/stacks/clarity/functions/begin","title":"begin","description":"Use the begin function to evaluate multiple expressions in sequence in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(begin expr1 expr2 expr3 ... expr-last)\n```\n\n\n- Input: Two or more expressions of any type\n- Output: The value of the last expression\n\n## Why it matters\n\nThe `begin` function is crucial for:\n\n1. Grouping multiple expressions into a single expression.\n2. Executing a series of operations in a specific order.\n3. Creating complex logic flows within functions or conditions.\n4. Allowing side effects while returning a specific value.\n\n## When to use it\n\nUse the `begin` function when you need to:\n\n- Perform multiple operations in sequence within a single expression.\n- Execute side effects before returning a final value.\n- Group multiple expressions where only one is allowed (e.g., in function bodies or condition branches).\n- Create more complex, multi-step logic within your smart contract functions.\n\n## Best Practices\n\n- Use `begin` to keep related operations together for better readability.\n- Ensure that any expressions that return a response type (ok or err) are properly checked.\n- Be mindful of the order of expressions, as they are evaluated sequentially.\n- Use `begin` to make your code more expressive and easier to understand.\n\n## Practical Example: User Registration with Logging\n\nLet's implement a simple user registration function that performs multiple actions:\n\n```clarity\n(define-map Users principal bool)\n(define-data-var userCount uint u0)\n\n(define-public (register-user)\n (begin\n (asserts! (is-none (map-get? Users tx-sender)) (err u1))\n (map-set Users tx-sender true)\n (var-set userCount (+ (var-get userCount) u1))\n (print { registered: true, user: tx-sender })\n (ok true)\n )\n)\n\n;; Usage\n(register-user) ;; Returns (ok true) and logs the new user\n```\n\n\nThis example demonstrates:\n1. Using `begin` to group multiple operations in a single function.\n2. Performing checks, updates, and logging in a specific order.\n3. Executing side effects (printing) before returning the final value.\n\n## Common Pitfalls\n\n1. Forgetting to return a value in the last expression of a `begin` block.\n2. Not properly handling responses from functions that return (ok) or (err) within the `begin` block.\n3. Relying on side effects of earlier expressions without considering their order of execution.\n\n## Related Functions\n\n- `let`: Used for creating local bindings within a limited scope.\n- `asserts!`: Often used within `begin` blocks for condition checking.\n- `print`: Useful for logging within `begin` blocks during development.\n\n## Conclusion\n\nThe `begin` function is a fundamental tool in Clarity for grouping multiple expressions and creating more complex logic flows. By allowing you to execute a series of operations in a specific order while returning a single value, `begin` enhances the expressiveness and capability of Clarity smart contracts. When used judiciously, this function can significantly improve code readability and organization.\n","url":"/docs/stacks/clarity/functions/begin"},"164":{"id":"/docs/stacks/clarity/functions/err","title":"err","description":"Construct error responses in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(err value)\n```\n\n- Input: `value` - Any type A\n- Output: `(response A B)` where A is the type of the input value\n\n## Why it matters\n\nThe `err` function is crucial for:\n\n1. Creating standardized error responses in public functions.\n2. Indicating that a function execution has failed.\n3. Providing meaningful error information to callers.\n4. Triggering automatic rollback of any database changes during function execution.\n\n## When to use it\n\nUse `err` when you need to:\n\n- Return an error state from a public function.\n- Indicate that a condition or operation has failed.\n- Provide specific error information or codes to the caller.\n- Ensure that any state changes are reverted due to a failure condition.\n\n## Best Practices\n\n- Use descriptive error values that help diagnose the issue.\n- Consider using standardized error codes across your contract.\n- Pair `err` with `ok` to create comprehensive response handling.\n- Remember that returning an `err` will cause all state changes in the current function to be rolled back.\n\n## Practical Example: Token Transfer with Error Handling\n\nLet's implement a simple token transfer function with error handling:\n\n```clarity\n(define-map Balances principal uint)\n\n(define-public (transfer (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? Balances tx-sender)))\n )\n (if (>= senderBalance amount)\n (begin\n (map-set Balances tx-sender (- senderBalance amount))\n (map-set Balances recipient (+ (default-to u0 (map-get? Balances recipient)) amount))\n (ok true)\n )\n (err u1)\n )\n )\n)\n\n;; Usage\n(transfer u100 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM) ;; Returns (err u1) if balance is insufficient\n```\n\nThis example demonstrates:\n1. Using `err` to return an error when the sender has insufficient balance.\n2. Pairing `err` with `ok` to handle both success and failure cases.\n3. Using a simple error code (u1) to indicate the type of error.\n\n## Common Pitfalls\n\n1. Forgetting that returning an `err` will revert all state changes in the current function.\n2. Using non-descriptive error values that make debugging difficult.\n3. Inconsistent error handling across different functions in the contract.\n\n## Related Functions\n\n- `ok`: Used to construct successful responses in public functions.\n- `asserts!`: Often used with `err` for condition checking and error reporting.\n- `try!`: Used to propagate errors up the call stack.\n\n## Conclusion\n\nThe `err` function is a fundamental tool for error handling and response construction in Clarity smart contracts. By providing a standardized way to indicate and communicate errors, this function enables robust and predictable contract behavior. When used effectively in combination with `ok` and other error-handling mechanisms, `err` contributes to creating more reliable and maintainable smart contracts.\n","url":"/docs/stacks/clarity/functions/err"},"165":{"id":"/docs/stacks/clarity/functions/or","title":"or","description":"Logical disjunction in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(or b1 b2 ...)\n```\n\n- Input: `bool, ...`\n- Output: `bool`\n\n## Why it matters\n\nThe `or` function is crucial for:\n\n1. Implementing logical disjunction in conditional statements.\n2. Simplifying the process of evaluating multiple boolean expressions.\n3. Enhancing code readability and maintainability by abstracting logical disjunction.\n\n## When to use it\n\nUse `or` when you need to:\n\n- Evaluate multiple boolean expressions and return `true` if any are `true`.\n- Implement logical disjunction in conditional statements.\n- Simplify and abstract the process of evaluating multiple boolean values.\n\n## Best Practices\n\n- Ensure all inputs are boolean expressions.\n- Use meaningful variable names for better readability.\n- Combine with other logical functions for comprehensive boolean logic.\n- Be aware of the performance implications of complex logical operations.\n\n## Practical Example: Evaluating Multiple Conditions\n\nLet's implement a function that checks if a number is either zero or negative:\n\n```clarity\n(define-read-only (is-zero-or-negative (n int))\n (or (is-eq n 0) (< n 0))\n)\n\n;; Usage\n(is-zero-or-negative 5) ;; Returns false\n(is-zero-or-negative 0) ;; Returns true\n(is-zero-or-negative -3) ;; Returns true\n```\n\nThis example demonstrates:\n1. Using `or` to evaluate multiple boolean expressions.\n2. Implementing a read-only function to check if a number is either zero or negative.\n3. Handling both true and false cases.\n\n## Common Pitfalls\n\n1. Using `or` with non-boolean expressions, causing type errors.\n2. Assuming the result will always be true or false, leading to incorrect logic.\n3. Not handling all possible conditions, resulting in incomplete boolean logic.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `and`: Logical conjunction of multiple boolean expressions.\n- `not`: Logical negation of a boolean expression.\n- `is-eq`: Checks if two values are equal.\n\n## Conclusion\n\nThe `or` function is a fundamental tool for implementing logical disjunction in Clarity smart contracts. It allows you to evaluate multiple boolean expressions, enabling robust and comprehensive boolean logic. When used effectively, `or` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage logical disjunction.\n","url":"/docs/stacks/clarity/functions/or"},"166":{"id":"/docs/stacks/clarity/functions/try","title":"try!","description":"Handle errors in Clarity smart contracts using the `try!` function.","content":"\n## Function Signature\n\n```clarity\n(try! expression)\n```\n\n- Input: `expression` (of type `(response T E)`)\n- Output: `T` (if the response is `ok`) or causes a runtime error (if the response is `err`)\n\n## Why it matters\n\nThe `try!` function is crucial for:\n\n1. Simplifying error handling in Clarity smart contracts.\n2. Implementing logic that requires automatic error propagation.\n3. Ensuring data integrity by validating operations and handling errors gracefully.\n4. Simplifying the process of handling responses in smart contracts.\n\n## When to use it\n\nUse `try!` when you need to:\n\n- Simplify error handling in your smart contract.\n- Implement logic that requires automatic error propagation.\n- Validate operations and handle errors gracefully.\n- Handle responses in your smart contract.\n\n## Best Practices\n\n- Ensure the expression returns a response type `(response T E)`.\n- Use meaningful variable names for better readability.\n- Combine with other error handling functions for comprehensive error management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Handling Errors in a Transfer Function\n\nLet's implement a function that transfers STX and handles errors using `try!`:\n\n```clarity\n(define-public (transfer-stx (amount uint) (recipient principal))\n (begin\n (try! (stx-transfer? amount tx-sender recipient))\n (ok true)\n )\n)\n\n;; Usage\n(transfer-stx u60 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns (ok true) if successful\n(transfer-stx u50 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns (err u1) if the sender does not have enough balance\n```\n\nThis example demonstrates:\n1. Using `try!` to handle errors in a STX transfer operation.\n2. Implementing a public function to handle the transfer and error propagation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `try!` with expressions that do not return a response type, causing runtime errors.\n2. Assuming the operation will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete error management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `unwrap!`: Unwraps an optional value, causing a runtime error if the value is `none`.\n- `asserts!`: Asserts a condition, causing a runtime error if the condition is false.\n- `is-err`: Checks if a response is an error.\n\n## Conclusion\n\nThe `try!` function is a fundamental tool for handling errors in Clarity smart contracts. It allows you to simplify error handling, ensuring data integrity and automatic error propagation. When used effectively, `try!` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle responses and errors.\n","url":"/docs/stacks/clarity/functions/try"},"167":{"id":"/docs/stacks/clarity/functions/map-insert","title":"map-insert","description":"Insert an entry into a map in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(map-insert map-name key-tuple value-tuple)\n```\n\n- Input: `MapName, tuple_A, tuple_B`\n- Output: `bool`\n\n## Why it matters\n\nThe `map-insert` function is crucial for:\n\n1. Adding new entries to a map.\n2. Ensuring data integrity by preventing overwrites of existing entries.\n3. Simplifying the process of managing data in smart contracts.\n4. Enabling the creation of unique key-value pairs in maps.\n\n## When to use it\n\nUse `map-insert` when you need to:\n\n- Add a new entry to a map.\n- Ensure that existing entries are not overwritten.\n- Manage data in your smart contract.\n- Create unique key-value pairs in maps.\n\n## Best Practices\n\n- Ensure the key-tuple and value-tuple are correctly formatted.\n- Use meaningful variable names for better readability.\n- Combine with other map functions for comprehensive map management.\n- Handle the case where the key already exists to avoid unexpected behavior.\n\n## Practical Example: Inserting User Data\n\nLet's implement a function that inserts a user's data into a map:\n\n```clarity\n(define-map UserData { userId: principal } { data: (buff 32) })\n\n(define-public (insert-user-data (user principal) (data (buff 32)))\n (ok (map-insert UserData { userId: user } { data: data }))\n)\n\n;; Usage\n(insert-user-data tx-sender 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef) ;; Returns (ok true) if the entry is inserted\n(insert-user-data tx-sender 0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef) ;; Returns (ok false) if the entry already exists\n```\n\nThis example demonstrates:\n1. Using `map-insert` to add a user's data to the `UserData` map.\n2. Implementing a public function to insert the data.\n3. Handling both the case where the entry is successfully inserted and where it already exists.\n\n## Common Pitfalls\n\n1. Using `map-insert` with incorrectly formatted tuples, causing the insertion to fail.\n2. Assuming the entry will always be inserted, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-set`: Sets the value associated with a key in a map, overwriting any existing value.\n- `map-delete`: Removes an entry from a map.\n- `map-get?`: Retrieves an entry from a map.\n\n## Conclusion\n\nThe `map-insert` function is a fundamental tool for adding entries to maps in Clarity smart contracts. It allows you to manage data, ensure data integrity, and create unique key-value pairs. When used effectively, `map-insert` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage data insertion.\n","url":"/docs/stacks/clarity/functions/map-insert"},"168":{"id":"/docs/stacks/clarity/functions/some","title":"some","description":"Construct an optional type from a value in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(some value)\n```\n\n- Input: `A`\n- Output: `(optional A)`\n\n## Why it matters\n\nThe `some` function is crucial for:\n\n1. Constructing an optional type from a given value.\n2. Implementing logic that requires optional types.\n3. Ensuring data integrity by explicitly handling optional values.\n4. Simplifying the process of working with optional types in smart contracts.\n\n## When to use it\n\nUse `some` when you need to:\n\n- Construct an optional type from a given value.\n- Implement logic that requires optional types.\n- Explicitly handle optional values to ensure data integrity.\n- Work with optional types in your smart contract.\n\n## Best Practices\n\n- Ensure the value passed to `some` is the intended value to be wrapped in an optional type.\n- Use meaningful variable names for better readability.\n- Combine with other optional functions for comprehensive optional type management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Constructing an Optional Type\n\nLet's implement a function that constructs an optional type from a given integer:\n\n```clarity\n(define-read-only (wrap-in-optional (input int))\n (some input)\n)\n\n;; Usage\n(wrap-in-optional 42) ;; Returns (some 42)\n(wrap-in-optional -1) ;; Returns (some -1)\n```\n\nThis example demonstrates:\n1. Using `some` to construct an optional type from a given integer.\n2. Implementing a public function to handle the optional type construction.\n3. Handling both positive and negative input values.\n\n## Common Pitfalls\n\n1. Using `some` without ensuring the value is the intended value to be wrapped, causing unexpected behavior.\n2. Assuming the optional type will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete optional type management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `is-some`: Checks if an optional type contains a value.\n- `is-none`: Checks if an optional type is empty.\n- `unwrap!`: Unwraps an optional type, returning the contained value or throwing an error if empty.\n\n## Conclusion\n\nThe `some` function is a fundamental tool for constructing optional types in Clarity smart contracts. It allows you to implement logic that requires optional types, ensuring data integrity and simplifying optional type handling. When used effectively, `some` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle optional type construction.\n","url":"/docs/stacks/clarity/functions/some"},"169":{"id":"/docs/stacks/clarity/functions/secp256k1-verify","title":"secp256k1-verify","description":"Verify a signature against a message hash and public key in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(secp256k1-verify message-hash signature public-key)\n```\n\n- Input: `(buff 32), (buff 64) | (buff 65), (buff 33)`\n- Output: `bool`\n\n## Why it matters\n\nThe `secp256k1-verify` function is crucial for:\n\n1. Verifying the authenticity of a message by checking the signature against the public key.\n2. Implementing cryptographic verification in smart contracts.\n3. Ensuring data integrity by validating signatures.\n4. Simplifying the process of handling cryptographic operations in smart contracts.\n\n## When to use it\n\nUse `secp256k1-verify` when you need to:\n\n- Verify the authenticity of a message by checking the signature against the public key.\n- Implement cryptographic verification in your smart contract.\n- Validate signatures to ensure data integrity.\n- Handle cryptographic operations.\n\n## Best Practices\n\n- Ensure the `message-hash`, `signature`, and `public-key` are correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for comprehensive security management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Verifying a Signature\n\nLet's implement a function that verifies a signature against a message hash and public key:\n\n```clarity\n(define-read-only (verify-signature (messageHash (buff 32)) (signature (buff 65)) (publicKey (buff 33)))\n (secp256k1-verify messageHash signature publicKey)\n)\n\n;; Usage\n(verify-signature 0xde5b9eb9e7c5592930eb2e30a01369c36586d872082ed8181ee83d2a0ec20f04 0x8738487ebe69b93d8e51583be8eee50bb4213fc49c767d329632730cc193b873554428fc936ca3569afc15f1c9365f6591d6251a89fee9c9ac661116824d3a1301 0x03adb8de4bfb65db2cfd6120d55c6526ae9c52e675db7e47308636534ba7786110) \n;; Returns true\n```\n\nThis example demonstrates:\n1. Using `secp256k1-verify` to verify a signature against a message hash and public key.\n2. Implementing a public function to handle the signature verification.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `secp256k1-verify` with incorrectly formatted or invalid `message-hash`, `signature`, or `public-key`, causing the operation to fail.\n2. Assuming the verification will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete cryptographic verification.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `secp256k1-recover?`: Recovers the public key from a message hash and signature.\n- `sha256`: Computes the SHA-256 hash of the input.\n- `hash160`: Computes the RIPEMD-160 hash of the SHA-256 hash of the input.\n\n## Conclusion\n\nThe `secp256k1-verify` function is a fundamental tool for verifying signatures against message hashes and public keys in Clarity smart contracts. It allows you to ensure data integrity and simplify cryptographic operations. When used effectively, `secp256k1-verify` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle cryptographic verification.\n","url":"/docs/stacks/clarity/functions/secp256k1-verify"},"170":{"id":"/docs/stacks/clarity/functions/match","title":"match","description":"Handle different branches or cases in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(match opt-input some-binding-name some-branch none-branch)\n(match-resp input ok-binding-name ok-branch err-binding-name err-branch)\n```\n\n- Input: `(optional A) name expression expression | (response A B) name expression name expression`\n- Output: `C`\n\n## Why it matters\n\nThe `match` function is crucial for:\n\n1. Handling different branches or cases for optional and response types.\n2. Simplifying complex conditional logic.\n3. Enhancing code readability and maintainability.\n4. Ensuring comprehensive handling of all possible cases.\n\n## When to use it\n\nUse `match` when you need to:\n\n- Handle different branches or cases for optional and response types.\n- Simplify complex conditional logic.\n- Enhance the readability and maintainability of your code.\n- Ensure comprehensive handling of all possible cases.\n\n## Best Practices\n\n- Ensure all possible branches are covered to avoid unhandled cases.\n- Use meaningful variable names for better readability.\n- Combine with other control flow functions for more complex logic.\n- Be aware of the performance implications of extensive branching.\n\n## Practical Example: Handling Optional and Response Values\n\nLet's implement functions that handle optional and response values using `match`:\n\n```clarity\n(define-private (add-10 (x (optional int))) \n (match x \n value (+ 10 value)\n 10\n )\n)\n(add-10 (some 5)) ;; Returns 15\n(add-10 none) ;; Returns 10\n\n(define-private (add-or-pass-err (x (response int (string-ascii 10))) (to-add int)) \n (match x\n value (ok (+ to-add value))\n err-value (err err-value)\n )\n)\n(add-or-pass-err (ok 5) 20) ;; Returns (ok 25)\n(add-or-pass-err (err \"ERROR\") 20) ;; Returns (err \"ERROR\")\n```\n\nThis example demonstrates:\n1. Using `match` to handle the result of an optional value.\n2. Using `match` to handle the result of a response value.\n3. Implementing functions to return the appropriate result based on the input type.\n\n## Common Pitfalls\n\n1. Using `match` without covering all possible branches, leading to unhandled cases.\n2. Assuming the value will always match a certain branch, causing runtime errors.\n3. Not handling all possible conditions, resulting in incomplete logic.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `if`: Implements conditional logic based on boolean expressions.\n- `let`: Binds variables to expressions within a local scope.\n- `default-to`: Provides default values for optional types.\n\n## Conclusion\n\nThe `match` function is a fundamental tool for handling different branches or cases in Clarity smart contracts. It allows you to manage optional and response types, simplify complex conditional logic, and ensure comprehensive handling of all possible cases. When used effectively, `match` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage branching logic.\n","url":"/docs/stacks/clarity/functions/match"},"171":{"id":"/docs/stacks/clarity/functions/let","title":"let","description":"Bind variables to expressions in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(let ((name1 expr1) (name2 expr2) ...) expr-body1 expr-body2 ... expr-body-last)\n```\n\n- Input: `((name1 AnyType) (name2 AnyType) ...), AnyType, ... A`\n- Output: `A`\n\n## Why it matters\n\nThe `let` function is crucial for:\n\n1. Binding variables to expressions within a local scope.\n2. Simplifying complex expressions by breaking them into smaller parts.\n3. Improving code readability and maintainability.\n4. Enabling sequential evaluation of expressions.\n\n## When to use it\n\nUse `let` when you need to:\n\n- Bind variables to expressions within a local scope.\n- Simplify complex expressions by breaking them into smaller parts.\n- Improve the readability and maintainability of your code.\n- Ensure sequential evaluation of expressions.\n\n## Best Practices\n\n- Use meaningful variable names for better readability.\n- Ensure that the expressions are evaluated in the correct order.\n- Combine with other control flow functions for more complex logic.\n- Be aware that `let` bindings are sequential and can refer to prior bindings.\n\n## Practical Example: Calculating a Sum\n\nLet's implement a function that calculates the sum of two numbers using `let`:\n\n```clarity\n(define-public (calculate-sum (a int) (b int))\n (let\n (\n (sum (+ a b))\n )\n (ok sum)\n )\n)\n\n;; Usage\n(calculate-sum 3 5) ;; Returns (ok 8)\n```\n\nThis example demonstrates:\n1. Using `let` to bind the variable `sum` to the result of adding `a` and `b`.\n2. Returning the sum as the result of the function.\n3. Simplifying the function body by breaking it into smaller parts.\n\n## Common Pitfalls\n\n1. Using `let` bindings out of order, leading to incorrect evaluations.\n2. Not handling all possible conditions, resulting in incomplete logic.\n3. Overlooking the need for proper error handling and validation.\n4. Using `let` for simple expressions where it is not necessary.\n\n## Related Functions\n\n- `begin`: Evaluates multiple expressions sequentially, returning the last expression's value.\n- `if`: Implements conditional logic based on boolean expressions.\n- `match`: Used for pattern matching and handling multiple conditions.\n\n## Conclusion\n\nThe `let` function is a fundamental tool for binding variables to expressions in Clarity smart contracts. It allows you to simplify complex expressions, improve code readability, and ensure sequential evaluation of expressions. When used effectively, `let` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage local variables and expressions.\n","url":"/docs/stacks/clarity/functions/let"},"172":{"id":"/docs/stacks/clarity/functions/map-get","title":"map-get?","description":"Retrieve an entry from a map in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(map-get? map-name key-tuple)\n```\n\n- Input: `MapName, tuple`\n- Output: `(optional (tuple))`\n\n## Why it matters\n\nThe `map-get?` function is crucial for:\n\n1. Retrieving entries from a map.\n2. Implementing logic that depends on the presence of map entries.\n3. Ensuring data integrity by checking for the existence of values.\n4. Simplifying the process of accessing stored data in smart contracts.\n\n## When to use it\n\nUse `map-get?` when you need to:\n\n- Retrieve an entry from a map.\n- Implement logic that depends on the presence of map entries.\n- Check for the existence of values in a map.\n- Access stored data in your smart contract.\n\n## Best Practices\n\n- Ensure the key-tuple accurately identifies the entry to be retrieved.\n- Use meaningful variable names for better readability.\n- Combine with other map functions for comprehensive map management.\n- Handle the `none` case to avoid runtime errors.\n\n## Practical Example: Retrieving User Data\n\nLet's implement a function that retrieves a user's data from a map:\n\n```clarity\n(define-map UserData { userId: principal } { data: (buff 32) })\n\n(define-read-only (get-user-data (user principal))\n (map-get? UserData { userId: user })\n)\n\n;; Usage\n(map-set UserData { userId: tx-sender } { data: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef })\n(get-user-data tx-sender) ;; Returns (some (tuple (data 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef)))\n(get-user-data 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns none\n```\n\nThis example demonstrates:\n1. Using `map-get?` to retrieve a user's data from the `UserData` map.\n2. Implementing a read-only function to return the retrieved data.\n3. Handling both the case where the user's data is present and where it is not.\n\n## Common Pitfalls\n\n1. Using `map-get?` with an incorrect key-tuple, causing the retrieval to fail.\n2. Assuming the entry will always exist, leading to unhandled `none` cases.\n3. Not handling all possible conditions, resulting in incomplete data retrieval.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-set`: Sets the value associated with a key in a map.\n- `map-delete`: Removes an entry from a map.\n- `map-insert`: Inserts a value into a map if the key does not already exist.\n\n## Conclusion\n\nThe `map-get?` function is a fundamental tool for retrieving entries from maps in Clarity smart contracts. It allows you to access stored data, implement logic based on map entries, and ensure data integrity. When used effectively, `map-get?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to retrieve map entries.\n","url":"/docs/stacks/clarity/functions/map-get"},"173":{"id":"/docs/stacks/clarity/functions/is-eq","title":"is-eq","description":"Compare values for equality in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(is-eq v1 v2 ...)\n```\n\n\n\n\n- Input: `A, A, ...`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-eq` function is crucial for:\n\n1. Comparing values to check for equality.\n2. Implementing conditional logic based on value comparisons.\n3. Ensuring data integrity by verifying that values match expected results.\n4. Simplifying equality checks in smart contract code.\n\n## When to use it\n\nUse `is-eq` when you need to:\n\n- Compare multiple values for equality.\n- Implement logic that depends on whether values are equal.\n- Verify that input values match expected constants or variables.\n- Simplify equality checks in your contract.\n\n## Best Practices\n\n- Ensure all values being compared are of the same type to avoid type errors.\n- Use `is-eq` for simple equality checks and combine with other logical functions for complex conditions.\n- Be aware that `is-eq` does not short-circuit; all values are evaluated.\n- Use meaningful variable names for better readability.\n\n## Practical Example: Checking User Role\n\nLet's implement a function that checks if a user has a specific role:\n\n```clarity\n(define-constant ADMIN_ROLE \"admin\")\n(define-map UserRoles { userId: principal } { role: (string-ascii 10) })\n\n(define-read-only (is-admin (user principal))\n (let\n (\n (userRole (default-to \"none\" (map-get? UserRoles { userId: user })))\n )\n (is-eq userRole ADMIN_ROLE)\n )\n)\n\n;; Usage\n(map-set UserRoles { userId: tx-sender } { role: \"admin\" })\n(is-admin tx-sender) ;; Returns true\n```\n\n\n\n\nThis example demonstrates:\n1. Using `is-eq` to compare a user's role with the constant `ADMIN_ROLE`.\n2. Handling the case where the user role is not set by providing a default value.\n3. Implementing a read-only function to check if a user is an admin.\n\n## Common Pitfalls\n\n1. Comparing values of different types, leading to type errors.\n2. Assuming `is-eq` short-circuits like `and` or `or` (it does not).\n3. Using `is-eq` for complex conditions where other logical functions might be more appropriate.\n4. Not handling cases where values might be `none` or unset.\n\n## Related Functions\n\n- `is-some`: Checks if an optional value is `some`.\n- `is-none`: Checks if an optional value is `none`.\n- `asserts!`: Asserts a condition and throws an error if it is false.\n\n## Conclusion\n\nThe `is-eq` function is a fundamental tool for comparing values in Clarity smart contracts. It provides a straightforward way to check for equality, enabling you to implement conditional logic and verify data integrity. When used effectively, `is-eq` simplifies equality checks and enhances the readability and maintainability of your smart contract code.\n","url":"/docs/stacks/clarity/functions/is-eq"},"174":{"id":"/docs/stacks/clarity/functions/bit-shift-left","title":"bit-shift-left","description":"Use the bit-shift-left function for bitwise left shift operations in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(bit-shift-left i1 shamt)\n```\n\n- Input: \n - `i1`: An integer (`int` or `uint`)\n - `shamt`: A `uint` representing the number of places to shift\n- Output: An integer of the same type as `i1` (`int` or `uint`)\n\n## Why it matters\n\nThe `bit-shift-left` function is crucial for:\n\n1. Implementing certain bitwise algorithms and data structures.\n2. Manipulating binary data at the bit level.\n3. Creating bitmasks for various purposes.\n4. Low-level optimizations in specific scenarios.\n\n## When to use it\n\nUse the `bit-shift-left` function when you need to:\n\n- Implement certain cryptographic or hashing algorithms.\n- Perform low-level data manipulations involving binary operations.\n- Create specific bit patterns or masks.\n- Optimize certain bitwise operations.\n\n## Best Practices\n\n- Remember that shifting beyond the bit width of the integer (128 bits in Clarity) will result in zero.\n- Use `uint` for `shamt` to avoid potential issues with negative shift amounts.\n- Be aware of the potential for overflow when shifting left, especially with large numbers or shift amounts.\n- For multiplication by powers of 2, use the `pow` function instead, as it provides built-in overflow protection.\n\n## Practical Example: Flag Management\n\nLet's implement a simple flag management system using `bit-shift-left`:\n\n```clarity\n(define-constant FLAG_READ u1)\n(define-constant FLAG_WRITE u2)\n(define-constant FLAG_EXECUTE u4)\n\n(define-read-only (create-flag (flagPosition uint))\n (bit-shift-left u1 flagPosition)\n)\n\n(define-read-only (set-flag (currentFlags uint) (flag uint))\n (bit-or currentFlags flag)\n)\n\n(define-read-only (check-flag (flags uint) (flag uint))\n (is-eq (bit-and flags flag) flag)\n)\n\n;; Usage\n(set-flag (bit-or FLAG_READ FLAG_WRITE) FLAG_EXECUTE) ;; Returns u7 (READ | WRITE | EXECUTE)\n(check-flag u7 FLAG_WRITE) ;; Returns true\n(check-flag u7 (create-flag u3)) ;; Returns false\n```\n\nThis example demonstrates:\n1. Using `bit-shift-left` to create individual flags.\n2. Combining `bit-shift-left` with `bit-or` to set flags.\n3. Using `bit-and` to check if a specific flag is set.\n\n## Common Pitfalls\n\n1. Using `bit-shift-left` for multiplication without considering overflow risks.\n2. Not considering the modulo behavior when shifting by amounts greater than or equal to 128.\n3. Using a negative or non-uint value for the shift amount, which is not allowed.\n\n## Related Functions\n\n- `bit-shift-right`: Used for right-shifting bits.\n- `bit-and`: Often used in combination with `bit-shift-left` for masking operations.\n- `bit-or`: Used for combining flags or masks created with `bit-shift-left`.\n- `pow`: Preferred for safe multiplication by powers of 2.\n\n## Conclusion\n\nThe `bit-shift-left` function is a powerful tool for bitwise operations in Clarity smart contracts. This function is essential for creating bitmasks, implementing various bitwise algorithms, and performing low-level optimizations. However, you should be cautious about potential overflows and avoid using it for general multiplication tasks, where the `pow` function is more appropriate due to its built-in overflow protection.\n","url":"/docs/stacks/clarity/functions/bit-shift-left"},"175":{"id":"/docs/stacks/clarity/functions/var-set","title":"var-set","description":"Set the value of a data variable in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(var-set var-name expr1)\n```\n\n- Input: `VarName, AnyType`\n- Output: `bool`\n\n## Why it matters\n\nThe `var-set` function is crucial for:\n\n1. Setting the value of a data variable.\n2. Implementing logic that requires updating stored data.\n3. Ensuring data integrity by validating the update process.\n4. Simplifying the process of handling data variables in smart contracts.\n\n## When to use it\n\nUse `var-set` when you need to:\n\n- Set the value of a data variable.\n- Implement logic that requires updating stored data.\n- Validate the update process to ensure data integrity.\n- Handle data variables in your smart contract.\n\n## Best Practices\n\n- Ensure the variable name is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other data functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Setting a Data Variable\n\nLet's implement a function that sets the value of a data variable:\n\n```clarity\n(define-data-var cursor int 6)\n\n(define-public (increment-cursor)\n (ok (var-set cursor (+ (var-get cursor) 1)))\n)\n\n;; Usage\n(increment-cursor) ;; Sets cursor to 7\n(var-get cursor) ;; Returns 7\n```\n\nThis example demonstrates:\n1. Using `var-set` to set the value of a data variable.\n2. Implementing a public function to handle the update process.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `var-set` with incorrectly formatted or invalid variable names, causing runtime errors.\n2. Assuming the update will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `var-get`: Retrieves the value of a data variable.\n- `map-set`: Sets a value in a map.\n- `default-to`: Provides a default value if an optional is `none`.\n\n## Conclusion\n\nThe `var-set` function is a fundamental tool for setting the value of a data variable in Clarity smart contracts. It allows you to implement logic that requires updating stored data, ensuring data integrity and simplifying the update process. When used effectively, `var-set` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle data variables.\n","url":"/docs/stacks/clarity/functions/var-set"},"176":{"id":"/docs/stacks/clarity/functions/less-than-or-equal","title":"less than or equal","description":"Use the less than or equal function for comparisons in Clarity smart contracts.","content":"\nThe less than or equal function (`<=`) in Clarity compares two values and returns true if the first value is less than or equal to the second. It's a fundamental comparison operation used in many smart contract conditions and logic flows.\n\n## Function Signature\n\n```clarity\n(<= v1 v2)\n```\n\n- Input: Two values of the same type (int, uint, string-ascii, string-utf8, or buff)\n- Output: A boolean (true or false)\n\n## Why it matters\n\nThe less than or equal function is crucial for:\n\n1. Implementing conditional logic in smart contracts.\n2. Comparing numerical values for financial operations.\n3. Ordering and sorting data.\n4. Implementing maximum thresholds or limits in contract logic.\n5. Checking for equality alongside less than comparisons.\n\n## When to use it\n\nUse the less than or equal function when you need to:\n\n- Compare two numerical values to determine if one is smaller or equal.\n- Implement maximum thresholds for certain operations, including the threshold value itself.\n- Create conditional logic based on numerical comparisons, including equality.\n- Sort or order data based on numerical or lexicographical order, including equal values.\n\n## Best Practices\n\n- Ensure that both inputs are of the same type to avoid runtime errors.\n- Be aware of the differences in comparison between signed (int) and unsigned (uint) integers.\n- When comparing strings or buffers, understand that the comparison is lexicographical.\n- Consider edge cases, especially when dealing with the limits of integer ranges.\n- Use `<=` instead of `<` when you want to include equality in your comparison.\n\n## Practical Example: Token Vesting Contract\n\nLet's implement a simple token vesting contract that uses the less than or equal function to manage vesting periods:\n\n```clarity\n;; Define constants\n(define-constant VESTING_PERIOD u31536000) ;; 1 year in seconds\n(define-constant TOTAL_ALLOCATION u1000000) ;; 1 million tokens\n\n;; Define data variables\n(define-data-var vestingStartTime uint u0)\n(define-data-var tokensClaimed uint u0)\n\n;; Function to start vesting\n(define-public (start-vesting)\n (begin\n (asserts! (is-eq (var-get vestingStartTime) u0) (err u1))\n (var-set vestingStartTime block-height)\n (ok true)\n )\n)\n\n;; Function to calculate vested amount\n(define-read-only (get-vested-amount)\n (let\n (\n (elapsed-time (- block-height (var-get vestingStartTime)))\n (vesting-ratio (/ elapsed-time VESTING_PERIOD))\n )\n (if (<= elapsed-time VESTING_PERIOD)\n (* TOTAL_ALLOCATION vesting-ratio)\n TOTAL_ALLOCATION\n )\n )\n)\n\n;; Function to claim vested tokens\n(define-public (claim-tokens)\n (let\n (\n (vested-amount (get-vested-amount))\n (claimable-amount (- vested-amount (var-get tokensClaimed)))\n )\n (asserts! (> claimable-amount u0) (err u2))\n (var-set tokensClaimed vested-amount)\n ;; Here you would typically transfer tokens\n ;; For simplicity, we're just returning the claimed amount\n (ok claimable-amount)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `<=` to check if the elapsed time is within or equal to the vesting period.\n2. Combining the less than or equal check with other contract logic for a vesting system.\n3. Implementing a maximum threshold (the vesting period) that includes the exact end time.\n\n## Common Pitfalls\n\n1. Comparing values of different types, which will result in a runtime error.\n2. Confusing `<=` with `<` when setting thresholds, potentially excluding valid values.\n3. Overlooking the inclusive nature of `<=` in boundary conditions.\n\n## Related Functions\n\n- `<`: Used for strict less than comparisons.\n- `>`: Used for greater than comparisons.\n- `>=`: Used for greater than or equal to comparisons.\n\n## Conclusion\n\nThe less than or equal function is a fundamental tool for implementing comparison logic in Clarity smart contracts. By understanding its behavior with different types and potential edge cases, you can create robust conditional logic and enforce important thresholds in your contracts, including scenarios where equality is a valid condition.\n","url":"/docs/stacks/clarity/functions/less-than-or-equal"},"177":{"id":"/docs/stacks/clarity/functions/filter","title":"filter","description":"Filter elements from a list based on a predicate function in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(filter <function> <sequence>)\n```\n\n- Input: \n - `<function>`: A function that takes one argument and returns a boolean\n - `<sequence>`: A list, buffer, or string to iterate over\n- Output: A new list containing only the elements for which the function returned true\n\n## Why it matters\n\nThe `filter` function is crucial for:\n\n1. Selectively processing elements from a list based on specific criteria.\n2. Removing unwanted elements from a list without modifying the original.\n3. Implementing complex data filtering logic within smart contracts.\n4. Enhancing data manipulation capabilities in list processing.\n\n## When to use it\n\nUse `filter` when you need to:\n\n- Create a subset of a list based on certain conditions.\n- Remove elements from a list that don't meet specific criteria.\n- Implement data validation or selection logic on lists.\n- Prepare data for further processing by removing irrelevant elements.\n\n## Best Practices\n\n- Ensure the predicate function is efficient, especially for large lists.\n- Use `filter` in combination with other list functions like `map` or `fold` for complex list operations.\n- Be mindful of gas costs when filtering large lists.\n- Consider using `filter` with `define-private` functions for reusable filtering logic.\n\n## Practical Example: Filtering Even Numbers\n\nLet's implement a function that filters even numbers from a list:\n\n```clarity\n(define-private (is-even (num int))\n (is-eq (mod num 2) 0)\n)\n\n(define-read-only (get-even-numbers (numbers (list 10 int)))\n (filter is-even numbers)\n)\n\n;; Usage\n(get-even-numbers (list 1 2 3 4 5 6 7 8 9 10)) ;; Returns (2 4 6 8 10)\n```\n\nThis example demonstrates:\n1. Defining a private helper function `is-even` to check if a number is even.\n2. Using `filter` with the `is-even` function to create a new list of even numbers.\n3. Applying the filter operation to a list of integers.\n\n## Common Pitfalls\n\n1. Forgetting that `filter` creates a new list and does not modify the original.\n2. Using a computationally expensive predicate function, which could lead to high gas costs.\n3. Not considering the potential for an empty result list if no elements match the predicate.\n\n## Related Functions\n\n- `map`: Applies a function to each element in a list, transforming the elements.\n- `fold`: Reduces a list to a single value by applying a function to each element.\n- `len`: Can be used to check the length of the resulting filtered list.\n\n## Conclusion\n\nThe `filter` function is a powerful tool for list manipulation in Clarity smart contracts. It allows you to create refined subsets of data based on specific criteria, enhancing the contract's ability to process and analyze list-based information. When used effectively, `filter` can significantly improve the efficiency and clarity of list operations in smart contracts.\n","url":"/docs/stacks/clarity/functions/filter"},"178":{"id":"/docs/stacks/clarity/functions/ft-mint","title":"ft-mint?","description":"Mint new fungible tokens in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(ft-mint? token-name amount recipient)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n - `amount`: The amount of tokens to mint (uint)\n - `recipient`: The principal to receive the newly minted tokens\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `ft-mint?` function is crucial for:\n\n1. Creating new tokens and increasing the total supply of a fungible token.\n2. Implementing token issuance mechanisms in smart contracts.\n3. Rewarding users or other contracts with newly created tokens.\n4. Managing the token economy within a decentralized application.\n\n## When to use it\n\nUse `ft-mint?` when you need to:\n\n- Create new tokens as part of your contract's logic.\n- Implement token distribution mechanisms (e.g., airdrops, rewards).\n- Increase the balance of a specific principal with new tokens.\n- Execute token minting operations based on certain conditions or events.\n\n## Best Practices\n\n- Implement proper access controls to restrict who can mint new tokens.\n- Consider using a maximum supply cap to prevent unlimited minting.\n- Emit events or use a logging mechanism to track minting operations for transparency.\n- Be cautious of potential overflow when minting large amounts of tokens.\n\n## Practical Example: Reward Minting\n\nLet's implement a simple reward system that mints tokens:\n\n```clarity\n(define-fungible-token RewardToken)\n\n(define-constant CONTRACT_OWNER tx-sender)\n\n(define-public (mint-reward (amount uint) (recipient principal))\n (begin\n (asserts! (is-eq tx-sender CONTRACT_OWNER) (err u403))\n (ft-mint? RewardToken amount recipient)\n )\n)\n\n;; Usage\n(mint-reward u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true) if called by CONTRACT_OWNER\n```\n\nThis example demonstrates:\n1. Using `ft-mint?` to create new tokens and assign them to a recipient.\n2. Implementing a basic access control check before minting.\n3. Returning the result of the minting operation.\n\n## Common Pitfalls\n\n1. Minting tokens without proper access controls, allowing unauthorized token creation.\n2. Not considering the total supply limit, potentially leading to economic imbalances.\n3. Forgetting to handle the error case when minting fails (e.g., due to supply cap).\n4. Overlooking the gas costs associated with minting, especially for large amounts.\n\n## Related Functions\n\n- `ft-burn?`: Used to destroy tokens, decreasing the total supply.\n- `ft-transfer?`: Used to transfer tokens between principals.\n- `ft-get-balance`: Used to check the token balance of a principal.\n- `ft-get-supply`: Used to get the current total supply of tokens.\n\n## Conclusion\n\nThe `ft-mint?` function is a fundamental tool for managing fungible token creation in Clarity smart contracts. It allows for controlled increase of token supply and distribution to specified recipients. When used responsibly with proper access controls and supply management, this function enables the implementation of sophisticated token economies within decentralized applications on the Stacks blockchain.\n","url":"/docs/stacks/clarity/functions/ft-mint"},"179":{"id":"/docs/stacks/clarity/functions/buff-to-int-le","title":"buff-to-int-le","description":"Convert a byte buffer to a signed integer using little-endian encoding in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(buff-to-int-le (buff 16))\n```\n\n- Input: A byte buffer of up to 16 bytes\n- Output: A signed integer (`int`)\n\n## Why it matters\n\nThe `buff-to-int-le` function is crucial for:\n\n1. Converting byte data to signed integers using little-endian encoding.\n2. Handling data from external sources or other contracts that use little-endian encoding.\n3. Implementing protocols or algorithms that require little-endian integer representation.\n4. Interoperating with systems that use little-endian byte order.\n\n## When to use it\n\nUse the `buff-to-int-le` function when you need to:\n\n- Convert a little-endian encoded byte buffer to a signed integer.\n- Process input data that represents signed integers in little-endian format.\n- Implement cryptographic or mathematical operations that expect little-endian integer inputs.\n- Ensure compatibility with external systems using little-endian encoding.\n\n## Best Practices\n\n- Ensure the input buffer is no larger than 16 bytes to avoid errors.\n- Be aware that smaller buffers are zero-padded on the right, affecting the resulting integer value.\n- Consider using `buff-to-uint-le` for unsigned integers if the sign is not needed.\n- Handle potential errors when the input buffer might be invalid or empty.\n\n## Practical Example: Decoding a Signed Integer from External Data\n\nLet's implement a function that processes external data containing a little-endian encoded signed integer:\n\n```clarity\n(define-read-only (process-external-data-le (data (buff 16)))\n (let\n (\n (value (buff-to-int-le data))\n )\n (if (< value 0)\n (err \"Negative value not allowed\")\n (ok value)\n )\n )\n)\n\n;; Usage\n(process-external-data-le 0x01000000000000000000000000000000) ;; Returns (ok 1)\n(process-external-data-le 0xffffffffffffffffffffffffffffffff) ;; Returns (err \"Negative value not allowed\")\n(process-external-data-le 0xffffffffffffffffffffffffffffff7f) ;; Returns (ok 9223372036854775807)\n```\n\nThis example demonstrates:\n1. Using `buff-to-int-le` to convert external data to a signed integer.\n2. Handling both positive and negative values resulting from the conversion.\n3. Implementing input validation based on the converted integer value.\n\n## Common Pitfalls\n\n1. Confusing little-endian with big-endian encoding, leading to incorrect integer values.\n2. Not handling potential negative values when working with signed integers.\n3. Assuming a specific buffer length, which could lead to unexpected results with shorter inputs due to right-padding.\n\n## Related Functions\n\n- `buff-to-int-be`: Converts a byte buffer to a signed integer using big-endian encoding.\n- `buff-to-uint-le`: Converts a byte buffer to an unsigned integer using little-endian encoding.\n- `int-to-ascii`: Converts an integer to its ASCII string representation.\n\n## Conclusion\n\nThe `buff-to-int-le` function is a powerful tool for working with little-endian encoded signed integers in Clarity smart contracts. By understanding its behavior with different input sizes and potential sign issues, you can effectively process and validate external data, implement complex algorithms, and ensure compatibility with little-endian systems in your smart contract applications.\n","url":"/docs/stacks/clarity/functions/buff-to-int-le"},"180":{"id":"/docs/stacks/clarity/functions/element-at","title":"element-at?","description":"Retrieve an element from a list at a specific index in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(element-at? list-expr uint)\n```\n\n- Input: \n - `list-expr`: A list expression\n - `uint`: An unsigned integer representing the index\n- Output: `(optional A)` where A is the type of elements in the list\n\n## Why it matters\n\nThe `element-at?` function is crucial for:\n\n1. Safely accessing elements in a list at a specific index.\n2. Handling potential out-of-bounds access without causing errors.\n3. Implementing logic that depends on retrieving specific elements from lists.\n4. Providing a way to work with lists in a more flexible manner.\n\n## When to use it\n\nUse `element-at?` when you need to:\n\n- Retrieve a specific element from a list by its position.\n- Implement algorithms that require access to list elements by index.\n- Safely handle potential out-of-bounds access in list operations.\n- Work with lists in a way that may involve accessing elements at varying positions.\n\n## Best Practices\n\n- Always check the returned optional value to handle cases where the index is out of bounds.\n- Use in combination with `len` to ensure you're not attempting to access beyond the list's length.\n- Consider using `map` or `fold` for operations that need to process all elements instead of accessing by index.\n- Be mindful of the zero-based indexing when using `element-at?`.\n\n## Practical Example: Retrieving a Specific Item\n\nLet's implement a function that retrieves an item from a todo list:\n\n```clarity\n(define-data-var todoList (list 10 (string-ascii 50)) (list))\n\n(define-public (add-todo (item (string-ascii 50)))\n (let\n (\n (currentList (var-get todoList))\n (newList (as-max-len? (append currentList item) u10))\n )\n (match newList\n newListValue (ok (var-set todoList newListValue))\n (err u1)\n )\n )\n)\n\n(define-read-only (get-todo (index uint))\n (match (element-at? (var-get todoList) index) item\n (ok item)\n (err u404)\n )\n)\n\n;; Usage\n(add-todo \"Buy milk\")\n(add-todo \"Walk the dog\")\n(get-todo u1) ;; Returns (ok \"Walk the dog\")\n(get-todo u5) ;; Returns (err u404)\n```\n\nThis example demonstrates:\n1. Using `element-at?` to retrieve an item from a list stored in a data variable.\n2. Handling the optional return value with `match` to provide meaningful responses.\n3. Safely accessing list elements without risking out-of-bounds errors.\n\n## Common Pitfalls\n\n1. Forgetting that list indices are zero-based in Clarity.\n2. Not handling the case where `element-at?` returns `none` for out-of-bounds access.\n3. Using `element-at?` in a loop to process all elements, which is less efficient than using `map` or `fold`.\n\n## Related Functions\n\n- `list`: Used to create lists that can be accessed with `element-at?`.\n- `len`: Often used in conjunction with `element-at?` to check list bounds.\n- `map`: An alternative for processing all elements in a list.\n- `fold`: Another alternative for reducing a list to a single value.\n\n## Clarity 1 Version: element-at\n\nIn Clarity 1, this function was named `element-at` (without the question mark) and had a slightly different behavior:\n\n```clarity\n(element-at list-expr uint)\n```\n\nThe key differences are:\n1. It returns the element directly, not wrapped in an optional.\n2. It throws a runtime error if the index is out of bounds.\n\nWhen migrating from Clarity 1 to newer versions, replace `element-at` with `element-at?` and add appropriate error handling for out-of-bounds cases.\n\n## Conclusion\n\nThe `element-at?` function is a safer and more flexible way to access list elements in Clarity smart contracts compared to its predecessor. By returning an optional value, this function allows you to handle out-of-bounds access gracefully, leading to more robust and error-resistant code. When working with lists in Clarity, `element-at?` is an essential tool for accessing specific elements while maintaining the integrity and safety of your contract operations.\n","url":"/docs/stacks/clarity/functions/element-at"},"181":{"id":"/docs/stacks/clarity/functions/sha512","title":"sha512","description":"Compute the SHA-512 hash of a value in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(sha512 value)\n```\n\n- Input: `buff | uint | int`\n- Output: `(buff 64)`\n\n## Why it matters\n\nThe `sha512` function is crucial for:\n\n1. Computing the SHA-512 hash of a given value.\n2. Implementing cryptographic operations in smart contracts.\n3. Ensuring data integrity by generating unique hashes.\n4. Simplifying the process of handling cryptographic hashing in smart contracts.\n\n## When to use it\n\nUse `sha512` when you need to:\n\n- Compute the SHA-512 hash of a given value.\n- Implement cryptographic operations in your smart contract.\n- Generate unique hashes to ensure data integrity.\n- Handle cryptographic hashing operations.\n\n## Best Practices\n\n- Ensure the input value is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for comprehensive security management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Computing a SHA-512 Hash\n\nLet's implement a function that computes the SHA-512 hash of a given buffer:\n\n```clarity\n(define-read-only (compute-sha512 (input (buff 32)))\n (sha512 input)\n)\n\n;; Usage\n(compute-sha512 0x68656c6c6f20776f726c64000000000000000000000000000000000000000000)\n;; Returns 0x638f0da7489fae1f981a47199a2854d0fa117cea82bd86049930aa86e565c6cdccd52fc0e6bba5a135961ed5b7360d5e2b0ff65889acbac01361f5e291a6da45\n```\n\nThis example demonstrates:\n1. Using `sha512` to compute the hash of a given buffer.\n2. Implementing a public function to handle the hash computation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `sha512` with incorrectly formatted or invalid input values, causing the operation to fail.\n2. Assuming the hash will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete cryptographic hashing.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `sha256`: Computes the SHA-256 hash of the input.\n- `sha512/256`: Computes the SHA-512/256 hash of the input.\n- `keccak256`: Computes the KECCAK-256 hash of the input.\n\n## Conclusion\n\nThe `sha512` function is a fundamental tool for computing SHA-512 hashes in Clarity smart contracts. It allows you to implement cryptographic operations, ensuring data integrity and simplifying cryptographic hashing. When used effectively, `sha512` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle cryptographic hashing operations.\n","url":"/docs/stacks/clarity/functions/sha512"},"182":{"id":"/docs/stacks/clarity/functions/concat","title":"concat","description":"Concatenate sequences in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(concat sequence1 sequence2)\n```\n\n- Input: Two sequences of the same type (`sequence_A`, `sequence_A`)\n- Output: A concatenated sequence of the same type (`sequence_A`)\n\n## Why it matters\n\nThe `concat` function is crucial for:\n\n1. Combining two sequences of the same type into a single sequence.\n2. Building longer strings, buffers, or lists from smaller components.\n3. Dynamically constructing data structures in smart contracts.\n4. Implementing string or data manipulation operations.\n\n## When to use it\n\nUse the `concat` function when you need to:\n\n- Join two strings together.\n- Combine two byte buffers into a single buffer.\n- Merge two lists into a single list.\n- Build complex data structures from simpler components.\n\n## Best Practices\n\n- Ensure that both input sequences are of the same type (e.g., both strings, both buffers, or both lists).\n- Be aware of the maximum length limitations for the resulting sequence type.\n- Consider using `concat` in combination with other sequence manipulation functions for more complex operations.\n- When working with strings, remember that Clarity distinguishes between ASCII and UTF-8 strings.\n\n## Practical Example: Dynamic Message Construction\n\nLet's implement a function that constructs a personalized message:\n\n```clarity\n(define-public (create-greeting (name (string-ascii 20)))\n (ok (concat (concat \"Hello, \" name) \"! Welcome to our dApp.\"))\n)\n\n;; Usage\n(create-greeting \"Alice\") ;; Returns (ok \"Hello, Alice! Welcome to our dApp.\")\n```\n\nThis example demonstrates:\n1. Using `concat` to join multiple string components.\n2. Nesting `concat` calls to build a more complex string.\n3. Combining static and dynamic parts of a message.\n\n## Common Pitfalls\n\n1. Attempting to concatenate sequences of different types, which will result in an error.\n2. Not considering the maximum length of the resulting sequence, potentially leading to truncation.\n3. Forgetting that `concat` only works with two sequences at a time, requiring nested calls for multiple concatenations.\n\n## Related Functions\n\n- `len`: Used to get the length of a sequence.\n- `slice?`: Can be used to extract parts of a sequence before concatenation.\n- `append`: Used to add elements to the end of a list (similar to `concat` for lists).\n\n## Conclusion\n\nThe `concat` function is a versatile tool for combining sequences in Clarity smart contracts. Whether you're working with strings, byte buffers, or lists, `concat` provides a straightforward way to join sequences together. By understanding its behavior and limitations, you can effectively use `concat` to build dynamic data structures and implement various string and data manipulation operations in your smart contracts.\n","url":"/docs/stacks/clarity/functions/concat"},"183":{"id":"/docs/stacks/clarity/functions/index-of","title":"index-of","description":"Find the index of an element in a list in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(index-of list element)\n```\n\n- Input: \n - `list`: A list of elements\n - `element`: The element to find in the list\n- Output: `(optional uint)`\n\n## Why it matters\n\nThe `index-of` function is crucial for:\n\n1. Locating the position of an element within a list.\n2. Implementing search functionality in smart contracts.\n3. Enabling conditional logic based on the presence and position of elements.\n4. Simplifying list operations by providing a built-in search mechanism.\n\n## When to use it\n\nUse `index-of` when you need to:\n\n- Determine the position of an element in a list.\n- Check if an element exists in a list and retrieve its index.\n- Implement logic that depends on the order or position of elements.\n- Simplify list search operations without writing custom loops.\n\n## Best Practices\n\n- Ensure the list and element types are compatible.\n- Handle the `none` case when the element is not found in the list.\n- Use meaningful variable names for better readability.\n- Consider the performance implications when searching large lists.\n\n## Practical Example: Finding an Element in a List\n\nLet's implement a function that finds the index of a given element in a list of integers:\n\n```clarity\n(define-read-only (find-index (element int) (numbers (list 10 int)))\n (index-of numbers element)\n)\n\n;; Usage\n(find-index 3 (list 1 2 3 4 5)) ;; Returns (some u2)\n(find-index 6 (list 1 2 3 4 5)) ;; Returns none\n```\n\nThis example demonstrates:\n1. Using `index-of` to find the position of an element in a list.\n2. Handling both the case where the element is found and where it is not found.\n\n## Common Pitfalls\n\n1. Assuming the element will always be found, leading to unhandled `none` cases.\n2. Using `index-of` on lists with incompatible element types.\n3. Overlooking the performance impact of searching very large lists.\n4. Not considering that `index-of` returns a 0-based index.\n\n## Related Functions\n\n- `filter`: Used to create a new list containing only elements that match a condition.\n- `map`: Applies a function to each element in a list, transforming the elements.\n- `len`: Returns the length of a list.\n\n## Conclusion\n\nThe `index-of` function is a powerful tool for locating elements within lists in Clarity smart contracts. It provides a straightforward way to search for elements and retrieve their positions, enabling more complex list operations and conditional logic. When used effectively, `index-of` simplifies list search operations and enhances the readability and maintainability of your smart contract code.\n","url":"/docs/stacks/clarity/functions/index-of"},"184":{"id":"/docs/stacks/clarity/functions/stx-transfer-memo","title":"stx-transfer-memo?","description":"Transfer STX with a memo field in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(stx-transfer-memo? amount sender recipient memo)\n```\n\n- Input: `uint, principal, principal, buff`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `stx-transfer-memo?` function is crucial for:\n\n1. Transferring STX between principals with an additional memo field.\n2. Implementing logic that requires recording a memo with each transfer.\n3. Ensuring data integrity by validating the transfer operation.\n4. Simplifying the process of handling STX transfers with memos in smart contracts.\n\n## When to use it\n\nUse `stx-transfer-memo?` when you need to:\n\n- Transfer STX between principals with an additional memo field.\n- Implement logic that requires recording a memo with each transfer.\n- Validate the transfer operation to ensure data integrity.\n- Handle STX transfers with memos in your smart contract.\n\n## Best Practices\n\n- Ensure the `amount` is positive and the `sender` has sufficient balance.\n- Use meaningful variable names for better readability.\n- Combine with other STX functions for comprehensive account management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Transferring STX with a Memo\n\nLet's implement a function that transfers STX with a memo from the `tx-sender` to a recipient:\n\n```clarity\n(define-public (transfer-stx-with-memo (amount uint) (recipient principal) (memo (buff 34)))\n (stx-transfer-memo? amount tx-sender recipient memo)\n)\n\n;; Usage\n(transfer-stx-with-memo u60 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x010203) \n;; Returns (ok true) if successful\n(transfer-stx-with-memo u50 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x040506) \n;; Returns (err u1) if the sender does not have enough balance\n```\n\nThis example demonstrates:\n1. Using `stx-transfer-memo?` to transfer STX with a memo.\n2. Implementing a public function to handle the STX transfer with a memo.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `stx-transfer-memo?` with a non-positive amount, causing the operation to fail.\n2. Assuming the transfer operation will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete account management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `stx-get-balance`: Queries the STX balance of a principal.\n- `stx-transfer?`: Transfers STX from one principal to another without a memo.\n- `stx-burn?`: Burns STX from a principal's account.\n\n## Conclusion\n\nThe `stx-transfer-memo?` function is a fundamental tool for transferring STX with a memo in Clarity smart contracts. It allows you to implement logic that requires recording a memo with each transfer, ensuring data integrity and simplifying STX transfer operations. When used effectively, `stx-transfer-memo?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle STX transfers with memos.\n","url":"/docs/stacks/clarity/functions/stx-transfer-memo"},"185":{"id":"/docs/stacks/clarity/functions/pow","title":"pow","description":"Calculate the power of a number in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(pow base exponent)\n```\n\n- Input: `int, int | uint, uint`\n- Output: `int | uint`\n\n## Why it matters\n\nThe `pow` function is crucial for:\n\n1. Performing exponentiation operations.\n2. Implementing logic that depends on power calculations.\n3. Simplifying the process of raising numbers to a power.\n4. Enhancing code readability and maintainability by abstracting exponentiation.\n\n## When to use it\n\nUse `pow` when you need to:\n\n- Perform exponentiation operations.\n- Implement logic that depends on power calculations.\n- Raise numbers to a power.\n- Simplify and abstract exponentiation operations.\n\n## Best Practices\n\n- Ensure the base and exponent are correctly formatted and within acceptable ranges.\n- Use meaningful variable names for better readability.\n- Combine with other mathematical functions for comprehensive calculations.\n- Be aware of the performance implications of large exponentiation operations.\n\n## Practical Example: Calculating Token Balances in Decimal Format\n\nLet's implement a function that calculates the power of a number, specifically for converting integer representations of tokens or uStx:\n\n```clarity\n(define-constant MICRO_TOKENS (pow u10 u6)) ;; 6 decimal places\n(define-data-var userBalance uint u100) ;; Amount reprented in a clear and readable format\n\n(define-read-only (get-total-micro-balance (userAddress principal))\n (* (var-get userBalance) MICRO_TOKENS)\n)\n\n;; Usage\n(get-total-micro-balance tx-sender)\n```\n\nThis example demonstrates:\n1. Using `pow` to define a constant for micro tokens with 6 decimal places.\n2. Implementing a read-only function to calculate the total balance in decimal format.\n3. Handling balances from different versions of a token contract.\n\n## Common Pitfalls\n\n1. Using `pow` with negative exponents, which is not supported and will cause a runtime error.\n2. Assuming the result will always be within acceptable ranges, leading to overflow errors.\n3. Not handling all possible conditions, resulting in incomplete calculations.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `*`: Multiplies two or more numbers.\n- `+`: Adds two or more numbers.\n- `-`: Subtracts one number from another.\n- `/`: Divides one number by another.\n\n## Conclusion\n\nThe `pow` function is a fundamental tool for performing exponentiation in Clarity smart contracts. It allows you to raise numbers to a power, enabling robust and comprehensive mathematical operations. When used effectively, `pow` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage power calculations.\n","url":"/docs/stacks/clarity/functions/pow"},"186":{"id":"/docs/stacks/clarity/functions/nft-mint","title":"nft-mint?","description":"Mint a non-fungible token (NFT) in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(nft-mint? asset-class asset-identifier recipient)\n```\n\n- Input: `AssetName, A, principal`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `nft-mint?` function is crucial for:\n\n1. Creating new non-fungible tokens (NFTs).\n2. Assigning ownership of newly created NFTs.\n3. Ensuring data integrity by preventing duplicate NFT creation.\n4. Simplifying the process of minting NFTs in smart contracts.\n\n## When to use it\n\nUse `nft-mint?` when you need to:\n\n- Create a new NFT.\n- Assign ownership of a newly created NFT.\n- Prevent duplicate NFT creation.\n- Handle NFT minting operations in your smart contract.\n\n## Best Practices\n\n- Ensure the `asset-identifier` is unique and correctly formatted.\n- Use meaningful variable names for better readability.\n- Combine with other NFT functions for comprehensive NFT management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Minting an NFT\n\nLet's implement a function that mints a new NFT and assigns it to the recipient:\n\n```clarity\n(define-non-fungible-token Stackaroo (string-ascii 40))\n\n(define-public (mint-nft (id (string-ascii 40)) (recipient principal))\n (nft-mint? Stackaroo id recipient)\n)\n\n;; Usage\n(mint-nft \"Roo\" tx-sender) ;; Returns (ok true)\n(mint-nft \"Roo\" tx-sender) ;; Returns (err u1) because the asset already exists\n```\n\nThis example demonstrates:\n1. Using `nft-mint?` to create a new NFT and assign it to the recipient.\n2. Implementing a public function to handle the minting operation.\n3. Handling both the successful mint and the case where the asset already exists.\n\n## Common Pitfalls\n\n1. Using `nft-mint?` with a non-unique `asset-identifier`, causing the operation to fail.\n2. Assuming the NFT will always be minted, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete NFT management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `nft-get-owner?`: Retrieves the owner of a non-fungible token.\n- `nft-transfer?`: Transfers ownership of a non-fungible token.\n- `nft-burn?`: Burns a non-fungible token.\n\n## Conclusion\n\nThe `nft-mint?` function is a fundamental tool for creating non-fungible tokens in Clarity smart contracts. It allows you to mint new NFTs, assign ownership, and ensure data integrity by preventing duplicate NFT creation. When used effectively, `nft-mint?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage NFT minting operations.\n","url":"/docs/stacks/clarity/functions/nft-mint"},"187":{"id":"/docs/stacks/clarity/functions/bit-not","title":"bit-not","description":"Use the bit-not function for bitwise complement operations in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(bit-not i1)\n```\n\n- Input: An integer (`int` or `uint`)\n- Output: An integer of the same type as the input (`int` or `uint`)\n\n## Why it matters\n\nThe `bit-not` function is crucial for:\n\n1. Performing bitwise complement operations in smart contracts.\n2. Implementing certain logical operations and algorithms.\n3. Manipulating binary data at the bit level.\n4. Creating bitmasks for various purposes.\n\n## When to use it\n\nUse the `bit-not` function when you need to:\n\n- Invert all bits in an integer value.\n- Create a bitmask for bitwise operations.\n- Implement certain cryptographic or hashing algorithms.\n- Perform low-level data manipulations.\n\n## Best Practices\n\n- Be aware of the differences between signed (`int`) and unsigned (`uint`) integers when using `bit-not`.\n- Remember that `bit-not` on a `uint` will result in a large positive number due to two's complement representation.\n- Use `bit-not` in combination with other bitwise operations (`bit-and`, `bit-or`, `bit-xor`) for complex bit manipulations.\n- Consider the readability of your code when using bitwise operations extensively.\n\n## Practical Example: Simple Flag System\n\nLet's implement a simple flag system using `bit-not` and other bitwise operations:\n\n```clarity\n(define-constant FLAG_A u1) ;; 0001\n(define-constant FLAG_B u2) ;; 0010\n(define-constant FLAG_C u4) ;; 0100\n(define-constant FLAG_D u8) ;; 1000\n\n(define-data-var userFlags uint u0)\n\n(define-public (toggle-flag (flag uint))\n (ok (var-set userFlags (bit-xor (var-get userFlags) flag)))\n)\n\n(define-public (clear-all-flags-except (flag uint))\n (ok (var-set userFlags (bit-and (var-get userFlags) flag)))\n)\n\n(define-public (set-all-flags-except (flag uint))\n (ok (var-set userFlags (bit-and (bit-not (var-get userFlags)) flag)))\n)\n\n(define-read-only (has-flag (flag uint))\n (is-eq flag (bit-and (var-get userFlags) flag))\n)\n```\n\nThis example demonstrates:\n1. Using `bit-not` in combination with `bit-and` to set all flags except a specific one.\n2. Implementing a flag system using bitwise operations for efficient storage and manipulation.\n3. Combining `bit-not` with other bitwise operations for complex flag manipulations.\n\n## Common Pitfalls\n\n1. Forgetting that `bit-not` on a `uint` results in a large positive number, not a negative number.\n2. Overlooking the sign bit when using `bit-not` with signed integers.\n3. Not considering the full range of bits when applying `bit-not` to smaller integer values.\n\n## Related Functions\n\n- `bit-and`: Used for bitwise AND operations.\n- `bit-or`: Used for bitwise OR operations.\n- `bit-xor`: Used for bitwise XOR operations.\n- `bit-shift-left`: Used for left-shifting bits.\n- `bit-shift-right`: Used for right-shifting bits.\n\n## Conclusion\n\nThe `bit-not` function is a powerful tool for bitwise operations in Clarity smart contracts. When used in combination with other bitwise functions, this function enables efficient implementation of flags, bitmasks, and low-level data manipulations. However, you should be mindful of the differences between signed and unsigned integers and the potential for unexpected results when not used carefully.\n","url":"/docs/stacks/clarity/functions/bit-not"},"188":{"id":"/docs/stacks/clarity/functions/hash160","title":"hash160","description":"Compute the RIPEMD160(SHA256(x)) hash in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(hash160 value)\n```\n\n- Input: `buff|uint|int`\n- Output: `(buff 20)`\n\n## Why it matters\n\nThe `hash160` function is crucial for:\n\n1. Creating compact, unique identifiers for data or addresses.\n2. Implementing cryptographic operations commonly used in blockchain systems.\n3. Generating Bitcoin-style addresses from public keys.\n4. Providing a way to create short, collision-resistant hashes.\n\n## When to use it\n\nUse `hash160` when you need to:\n\n- Generate a compact hash of data, especially for address creation.\n- Implement Bitcoin-style address generation within Clarity contracts.\n- Create short, unique identifiers for data structures.\n- Perform cryptographic operations that require RIPEMD160(SHA256(x)).\n\n## Best Practices\n\n- Use `hash160` when you need a shorter hash than SHA256 but still want strong collision resistance.\n- Be aware that `hash160` is not reversible; it's a one-way function.\n- When hashing sensitive data, consider using additional security measures like salting.\n- Remember that for integers, the hash is computed over their little-endian representation.\n\n## Practical Example: Simple Address Generation\n\nLet's implement a function that generates a simple hash-based identifier:\n\n```clarity\n(define-read-only (generate-identifier (input (buff 32)))\n (hash160 input)\n)\n\n;; Usage\n(generate-identifier 0x000000000000000000000000000000000000000000000000000000000000000a)\n;; Returns 0x3bf3d2e8f7a4d7c5f9e6d0d5c6b0f5c7d8e9f0a1\n```\n\nThis example demonstrates:\n1. Using `hash160` to create a compact identifier from input data.\n2. The function takes a 32-byte buffer and returns a 20-byte hash.\n\n## Common Pitfalls\n\n1. Assuming `hash160` output is the same length as `sha256` output (it's shorter at 20 bytes).\n2. Using `hash160` where a longer hash might be more appropriate for security reasons.\n3. Forgetting that integer inputs are hashed in their little-endian representation.\n4. Not considering that `hash160` is computationally more expensive than a single `sha256`.\n\n## Related Functions\n\n- `sha256`: Computes the SHA256 hash of the input.\n- `ripemd160`: Computes the RIPEMD160 hash of the input (not directly available in Clarity, but `hash160` combines SHA256 and RIPEMD160).\n- `keccak256`: Another cryptographic hash function available in Clarity.\n\n## Conclusion\n\nThe `hash160` function is a powerful tool for creating compact, unique identifiers in Clarity smart contracts. It combines the security of SHA256 with the compactness of RIPEMD160, making it particularly useful for address generation and creating short but collision-resistant hashes. When used appropriately, `hash160` can enhance the efficiency and security of your smart contract operations, especially in scenarios where space efficiency is a concern.\n","url":"/docs/stacks/clarity/functions/hash160"},"189":{"id":"/docs/stacks/clarity/functions/merge","title":"merge","description":"Merge tuples in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(merge tuple1 tuple2)\n```\n\n- Input: `tuple, tuple`\n- Output: `tuple`\n\n## Why it matters\n\nThe `merge` function is crucial for:\n\n1. Combining fields from two tuples into a single tuple.\n2. Simplifying the process of updating and managing data structures.\n3. Ensuring data integrity by creating new tuples without mutating the original ones.\n4. Enhancing code readability and maintainability by abstracting tuple merging operations.\n\n## When to use it\n\nUse `merge` when you need to:\n\n- Combine fields from two tuples into a single tuple.\n- Update and manage data structures in a clean and efficient manner.\n- Ensure data integrity by creating new tuples without mutating the original ones.\n- Simplify and abstract tuple merging operations.\n\n## Best Practices\n\n- Ensure the tuples being merged have compatible fields.\n- Use meaningful variable names for better readability.\n- Combine with other tuple and map functions for comprehensive data management.\n- Be aware of the performance implications of frequent tuple merging in large data structures.\n\n## Practical Example: Merging User Data\n\nLet's implement a function that merges additional data into a user's existing data:\n\n```clarity\n(define-map Users { id: int } { name: (string-ascii 12), address: (optional principal) })\n\n(define-public (update-user-address (user-id int) (new-address principal))\n (let\n (\n (user (unwrap-panic (map-get? Users { id: user-id })))\n (updated-user (merge user { address: (some new-address) }))\n )\n (map-set Users { id: user-id } updated-user)\n )\n)\n\n;; Usage\n(map-insert Users { id: 1337 } { name: \"john\", address: none }) ;; Returns true\n(update-user-address 1337 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns true\n(map-get? Users { id: 1337 }) ;; Returns (some (tuple (name \"john\") (address (some SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF))))\n```\n\nThis example demonstrates:\n1. Using `merge` to combine a user's existing data with new address data.\n2. Implementing a public function to update the user's address.\n3. Handling both the retrieval and updating of user data in a clean and efficient manner.\n\n## Common Pitfalls\n\n1. Using `merge` with tuples that have incompatible fields, causing runtime errors.\n2. Assuming the tuples will always have the expected fields, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-set`: Sets the value associated with a key in a map.\n- `map-get?`: Retrieves an entry from a map.\n- `map-insert`: Inserts a value into a map if the key does not already exist.\n\n## Conclusion\n\nThe `merge` function is a fundamental tool for combining tuples in Clarity smart contracts. It allows you to manage and update data structures efficiently, ensuring data integrity and enhancing code readability. When used effectively, `merge` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage tuple merging operations.\n","url":"/docs/stacks/clarity/functions/merge"},"190":{"id":"/docs/stacks/clarity/functions/ft-get-balance","title":"ft-get-balance","description":"Retrieve the balance of a fungible token for a principal in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(ft-get-balance token-name principal)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n - `principal`: The principal whose balance to check\n- Output: `uint`\n\n## Why it matters\n\nThe `ft-get-balance` function is crucial for:\n\n1. Querying the current balance of a fungible token for any principal.\n2. Implementing balance checks before transfers or other token operations.\n3. Providing transparency and visibility into token holdings.\n4. Enabling other contracts or off-chain applications to verify token balances.\n\n## When to use it\n\nUse `ft-get-balance` when you need to:\n\n- Check a user's token balance before performing operations.\n- Implement balance-dependent logic in your contract.\n- Provide balance information to users or other contracts.\n- Verify sufficient funds for token transfers or burns.\n\n## Best Practices\n\n- Use `ft-get-balance` before attempting transfers to ensure sufficient balance.\n- Consider caching balance results if queried frequently to optimize gas usage.\n- Be aware that balances can change between checks and actual token operations.\n- Use in combination with other ft-* functions for comprehensive token management.\n\n## Practical Example: Balance Check Before Transfer\n\nLet's implement a function that checks balance before transferring tokens:\n\n```clarity\n(define-fungible-token cBtc)\n\n(define-public (transfer (amount uint) (recipient principal))\n (let\n (\n (senderBalance (ft-get-balance cBtc tx-sender))\n )\n (if (>= senderBalance amount)\n (ft-transfer? cBtc amount tx-sender recipient)\n (err u1)\n )\n )\n)\n\n;; Usage\n(ft-mint? cBtc u100 tx-sender)\n(transfer u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true)\n(ft-get-balance cBtc tx-sender) ;; Returns u50\n```\n\nThis example demonstrates:\n1. Using `ft-get-balance` to check the sender's balance before attempting a transfer.\n2. Implementing a conditional transfer based on the balance check.\n3. Combining `ft-get-balance` with other ft-* functions for token management.\n\n## Common Pitfalls\n\n1. Assuming balances remain constant between checking and performing operations.\n2. Not handling the case where a principal might not have any balance (returns 0).\n3. Overusing `ft-get-balance` in loops, which can be inefficient for gas consumption.\n\n## Related Functions\n\n- `ft-transfer?`: Used to transfer tokens between principals.\n- `ft-mint?`: Used to create new tokens, increasing the balance of a principal.\n- `ft-burn?`: Used to destroy tokens, decreasing the balance of a principal.\n- `ft-get-supply`: Used to get the current total supply of tokens.\n\n## Conclusion\n\nThe `ft-get-balance` function is a fundamental tool for managing fungible tokens in Clarity smart contracts. It provides a straightforward way to query token balances, enabling you to implement robust token-based systems with proper balance checks and validations. When used effectively in combination with other token functions, this function ensures the integrity and accuracy of token operations within your smart contracts.\n","url":"/docs/stacks/clarity/functions/ft-get-balance"},"191":{"id":"/docs/stacks/clarity/functions/greater-than-or-equal","title":"greater than or equal","description":"Use the greater than or equal function for comparisons in Clarity smart contracts.","content":"\nThe greater than or equal function (`>=`) in Clarity compares two values and returns true if the first value is greater than or equal to the second. It's a fundamental comparison operation used in many smart contract conditions and logic flows.\n\n## Function Signature\n\n```clarity\n(>= v1 v2)\n```\n\n- Input: Two values of the same type (int, uint, string-ascii, string-utf8, or buff)\n- Output: A boolean (true or false)\n\n## Why it matters\n\nThe greater than or equal function is crucial for:\n\n1. Implementing conditional logic in smart contracts.\n2. Comparing numerical values for financial operations.\n3. Ordering and sorting data.\n4. Implementing minimum thresholds or limits in contract logic.\n5. Checking for equality alongside greater than comparisons.\n\n## When to use it\n\nUse the greater than or equal function when you need to:\n\n- Compare two numerical values to determine if one is larger or equal.\n- Implement minimum thresholds for certain operations, including the threshold value itself.\n- Create conditional logic based on numerical comparisons, including equality.\n- Sort or order data based on numerical or lexicographical order, including equal values.\n\n## Best Practices\n\n- Ensure that both inputs are of the same type to avoid runtime errors.\n- Be aware of the differences in comparison between signed (int) and unsigned (uint) integers.\n- When comparing strings or buffers, understand that the comparison is lexicographical.\n- Consider edge cases, especially when dealing with the limits of integer ranges.\n- Use `>=` instead of `>` when you want to include equality in your comparison.\n\n## Practical Example: Token Unlock Schedule\n\nLet's implement a simple token unlock schedule that uses the greater than or equal function to manage token releases:\n\n```clarity\n;; Define constants\n(define-constant UNLOCK_AMOUNT u1000000) ;; 1 million tokens per unlock\n(define-constant UNLOCK_INTERVAL u17280) ;; Approximately 30 days in blocks\n(define-constant TOTAL_UNLOCKS u10) ;; 10 total unlocks\n\n;; Define data variables\n(define-data-var startBlock uint u0)\n(define-data-var unlocksClaimed uint u0)\n\n;; Function to start the unlock schedule\n(define-public (start-unlock-schedule)\n (begin\n (asserts! (is-eq (var-get startBlock) u0) (err u1))\n (var-set startBlock block-height)\n (ok true)\n )\n)\n\n;; Function to calculate claimable tokens\n(define-read-only (get-claimable-tokens)\n (let\n (\n (elapsedBlocks (- block-height (var-get startBlock)))\n (unlocksDue (/ elapsedBlocks UNLOCK_INTERVAL))\n )\n (if (>= unlocksDue TOTAL_UNLOCKS)\n (* UNLOCK_AMOUNT (- TOTAL_UNLOCKS (var-get unlocksClaimed)))\n (* UNLOCK_AMOUNT (- unlocksDue (var-get unlocksClaimed)))\n )\n )\n)\n\n;; Function to claim tokens\n(define-public (claim-tokens)\n (let\n (\n (claimableAmount (get-claimable-tokens))\n )\n (asserts! (> claimableAmount u0) (err u2))\n (var-set unlocksClaimed (+ (var-get unlocksClaimed) (/ claimableAmount UNLOCK_AMOUNT)))\n ;; Here you would typically transfer tokens\n ;; For simplicity, we're just returning the claimed amount\n (ok claimableAmount)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `>=` to check if the number of unlocks due is greater than or equal to the total number of unlocks.\n2. Combining the greater than or equal check with other contract logic for a token unlock system.\n3. Implementing a minimum threshold (the unlock interval) that includes the exact unlock time.\n\n## Common Pitfalls\n\n1. Comparing values of different types, which will result in a runtime error.\n2. Confusing `>=` with `>` when setting thresholds, potentially excluding valid values.\n3. Overlooking the inclusive nature of `>=` in boundary conditions.\n\n## Related Functions\n\n- `>`: Used for strict greater than comparisons.\n- `<`: Used for less than comparisons.\n- `<=`: Used for less than or equal to comparisons.\n\n## Conclusion\n\nThe greater than or equal function is a fundamental tool for implementing comparison logic in Clarity smart contracts. By understanding its behavior with different types and potential edge cases, you can create robust conditional logic and enforce important thresholds in your contracts, including scenarios where equality is a valid condition.\n","url":"/docs/stacks/clarity/functions/greater-than-or-equal"},"192":{"id":"/docs/stacks/clarity/functions/as-contract","title":"as-contract","description":"Use the as-contract function to execute expressions as the contract principal in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(as-contract expr)\n```\n\n- Input: An expression `expr`\n- Output: The result of `expr`\n\n## Why it matters\n\nThe `as-contract` function is crucial for:\n\n1. Executing operations with the contract's authority.\n2. Allowing the contract to send assets or perform privileged actions.\n3. Implementing contract-owned resources or funds.\n4. Enabling more complex contract interactions and architectures.\n\n## When to use it\n\nUse the `as-contract` function when you need to:\n\n- Perform actions that require the contract's principal.\n- Send assets (like STX or tokens) from the contract's balance.\n- Execute privileged operations that should only be done by the contract itself.\n- Implement contract-owned resources or escrow-like functionality.\n\n## Best Practices\n\n- Use `as-contract` sparingly and only when necessary to minimize potential security risks.\n- Ensure that the logic leading to `as-contract` calls is properly secured and access-controlled.\n- Be aware that `as-contract` changes the `tx-sender` context for the duration of the expression.\n- Combine `as-contract` with other security measures like `contract-caller` checks for robust security.\n\n## Practical Example: Contract-Managed Treasury\n\nLet's implement a simple treasury system where the contract can distribute funds:\n\n```clarity\n(define-constant CONTRACT_OWNER tx-sender)\n(define-data-var treasuryBalance uint u0)\n\n(define-public (deposit (amount uint))\n (begin\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n (var-set treasuryBalance (+ (var-get treasuryBalance) amount))\n (ok true)\n )\n)\n\n(define-public (withdraw (recipient principal) (amount uint))\n (begin\n (asserts! (is-eq tx-sender CONTRACT_OWNER) (err u403))\n (asserts! (<= amount (var-get treasuryBalance)) (err u401))\n (try! (as-contract (stx-transfer? amount tx-sender recipient)))\n (var-set treasuryBalance (- (var-get treasuryBalance) amount))\n (ok true)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `as-contract` in the `deposit` function to receive funds as the contract.\n2. Using `as-contract` in the `withdraw` function to send funds from the contract's balance.\n3. Combining `as-contract` with access control (`is-eq tx-sender CONTRACT_OWNER`) for security.\n\n## Common Pitfalls\n\n1. Using `as-contract` unnecessarily, which can lead to unexpected behavior.\n2. Forgetting that `as-contract` changes the `tx-sender` context, potentially affecting other parts of the code.\n3. Not implementing proper access controls around `as-contract` calls, which could lead to unauthorized actions.\n\n## Related Functions\n\n- `contract-caller`: Used to get the original caller of a contract function.\n- `tx-sender`: Represents the current sender (changes within `as-contract`).\n- `stx-transfer?`: Often used with `as-contract` for token transfers.\n\n## Conclusion\n\nThe `as-contract` function is a powerful tool in Clarity that allows contracts to perform actions with their own authority. While it enables complex contract architectures and functionalities, it should be used judiciously and with proper security measures to prevent potential vulnerabilities or unintended behaviors in smart contracts.\n","url":"/docs/stacks/clarity/functions/as-contract"},"193":{"id":"/docs/stacks/clarity/functions/asserts","title":"asserts!","description":"Use the asserts! function for conditional assertions in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(asserts! bool-expr thrown-value)\n```\n\n- Input: \n - `bool-expr`: A boolean expression\n - `thrown-value`: The value to be returned if the assertion fails\n- Output: `bool` or `thrown-value`\n\n## Why it matters\n\nThe `asserts!` function is crucial for:\n\n1. Implementing conditional checks in smart contracts.\n2. Enforcing preconditions before executing critical operations.\n3. Providing meaningful error responses when conditions are not met.\n4. Improving contract security by validating inputs and state.\n\n## When to use it\n\nUse the `asserts!` function when you need to:\n\n- Validate conditions before proceeding with contract execution.\n- Ensure certain requirements are met before performing sensitive operations.\n- Provide clear error messages or codes when conditions are not satisfied.\n- Implement guard clauses to protect against invalid inputs or states.\n\n## Best Practices\n\n- Use `asserts!` early in functions to validate preconditions.\n- Provide meaningful error values that can be easily interpreted by users or other contracts.\n- Combine multiple conditions using `and` or `or` for complex assertions.\n- Consider using `asserts!` in combination with `unwrap!` for handling optional values.\n\n## Practical Example: Token Transfer with Balance Check\n\nLet's implement a simple token transfer function that uses `asserts!` to check the sender's balance:\n\n```clarity\n(define-map Balances principal uint)\n\n(define-public (transfer (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? Balances tx-sender)))\n )\n (asserts! (>= senderBalance amount) (err u1)) ;; Insufficient balance\n (asserts! (not (is-eq tx-sender recipient)) (err u2)) ;; Can't send to self\n \n (map-set Balances tx-sender (- senderBalance amount))\n (map-set Balances recipient (+ (default-to u0 (map-get? Balances recipient)) amount))\n (ok true)\n )\n)\n\n(map-set Balances tx-sender u1000) ;; Set the sender's balance to 1000\n\n;; Usage\n(transfer u100 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5) ;; Returns (ok true)\n(transfer u100 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM) ;; Returns (err u2) Can't send to self\n(transfer u1000 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5) ;; Returns (err u1) Insufficient balance\n```\n\nThis example demonstrates:\n1. Using `asserts!` to check if the sender has sufficient balance before transferring.\n2. Using `asserts!` to prevent sending tokens to oneself.\n3. Providing different error codes for different types of failures.\n\n## Common Pitfalls\n\n1. Forgetting to handle the error case when calling functions that use `asserts!`.\n2. Using `asserts!` excessively, which can make code harder to read and maintain.\n3. Providing vague or unhelpful error values when assertions fail.\n\n## Related Functions\n\n- `unwrap!`: Used to extract values from optionals with a fallback error.\n- `unwrap-panic`: Similar to `unwrap!` but causes a panic instead of returning an error.\n- `try!`: Used for propagating errors in a chain of operations.\n\n## Conclusion\n\nThe `asserts!` function is a powerful tool for implementing conditional checks and enforcing invariants in Clarity smart contracts. By using it effectively, you can create more robust and secure contracts that gracefully handle edge cases and provide meaningful feedback when conditions are not met.\n","url":"/docs/stacks/clarity/functions/asserts"},"194":{"id":"/docs/stacks/clarity/functions/slice","title":"slice?","description":"Extract a sub-sequence from a sequence in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(slice? sequence left-position right-position)\n```\n\n- Input: `sequence_A, uint, uint`\n- Output: `(optional sequence_A)`\n\n## Why it matters\n\nThe `slice?` function is crucial for:\n\n1. Extracting sub-sequences from sequences.\n2. Implementing logic that requires partial data extraction.\n3. Ensuring data integrity by validating indices for slicing.\n4. Simplifying the process of handling sub-sequence extraction in smart contracts.\n\n## When to use it\n\nUse `slice?` when you need to:\n\n- Extract a sub-sequence from a sequence.\n- Implement logic that requires partial data extraction.\n- Validate indices for slicing to ensure data integrity.\n- Handle sub-sequence extraction operations.\n\n## Best Practices\n\n- Ensure the `left-position` and `right-position` are within the bounds of the sequence.\n- Use meaningful variable names for better readability.\n- Combine with other sequence functions for comprehensive sequence management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Extracting a Sub-sequence from a String\n\nLet's implement a function that extracts a sub-sequence from a string:\n\n```clarity\n(define-read-only (extract-substring (input (string-ascii 20)) (start uint) (end uint))\n (slice? input start end)\n)\n\n;; Usage\n(extract-substring \"blockstack\" u5 u10) ;; Returns (some \"stack\")\n(extract-substring \"blockstack\" u0 u5) ;; Returns (some \"block\")\n(extract-substring \"blockstack\" u5 u15) ;; Returns none (out of bounds)\n```\n\nThis example demonstrates:\n1. Using `slice?` to extract a sub-sequence from a string.\n2. Implementing a public function to handle the sub-sequence extraction.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `slice?` with indices that are out of bounds, causing the operation to fail.\n2. Assuming the sub-sequence will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete sequence management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `len`: Returns the length of a sequence.\n- `concat`: Concatenates two sequences.\n- `index-of?`: Returns the first index at which an item can be found in a sequence.\n\n## Conclusion\n\nThe `slice?` function is a fundamental tool for extracting sub-sequences in Clarity smart contracts. It allows you to implement logic that requires partial data extraction, ensuring data integrity and simplifying sequence handling. When used effectively, `slice?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle sub-sequence extraction operations.\n","url":"/docs/stacks/clarity/functions/slice"},"195":{"id":"/docs/stacks/clarity/functions/nft-get-owner","title":"nft-get-owner?","description":"Retrieve the owner of a non-fungible token (NFT) in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(nft-get-owner? asset-class asset-identifier)\n```\n\n- Input: `AssetName, A`\n- Output: `(optional principal)`\n\n## Why it matters\n\nThe `nft-get-owner?` function is crucial for:\n\n1. Retrieving the owner of a non-fungible token (NFT).\n2. Implementing logic that depends on the ownership of NFTs.\n3. Ensuring data integrity by verifying ownership records.\n4. Simplifying the process of accessing ownership information in smart contracts.\n\n## When to use it\n\nUse `nft-get-owner?` when you need to:\n\n- Retrieve the owner of an NFT.\n- Implement logic that depends on the ownership of NFTs.\n- Verify ownership records in your smart contract.\n- Access ownership information for NFTs.\n\n## Best Practices\n\n- Ensure the `asset-identifier` is correctly formatted and exists.\n- Use meaningful variable names for better readability.\n- Combine with other NFT functions for comprehensive NFT management.\n- Handle the `none` case to avoid runtime errors.\n\n## Practical Example: Retrieving NFT Owner\n\nLet's implement a function that retrieves the owner of an NFT:\n\n```clarity\n(define-non-fungible-token Stackaroo (string-ascii 40))\n\n(define-read-only (get-nft-owner (id (string-ascii 40)))\n (nft-get-owner? Stackaroo id)\n)\n\n;; Usage\n(nft-mint? Stackaroo \"Roo\" tx-sender) ;; Returns (ok true)\n(get-nft-owner \"Roo\") ;; Returns (some tx-sender)\n(get-nft-owner \"NonExistent\") ;; Returns none\n```\n\nThis example demonstrates:\n1. Using `nft-get-owner?` to retrieve the owner of an NFT.\n2. Implementing a read-only function to return the owner's principal.\n3. Handling both the case where the NFT exists and where it does not.\n\n## Common Pitfalls\n\n1. Using `nft-get-owner?` with an incorrect or non-existent `asset-identifier`, causing the function to return `none`.\n2. Assuming the NFT will always exist, leading to unhandled `none` cases.\n3. Not handling all possible conditions, resulting in incomplete ownership checks.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `nft-mint?`: Mints a new non-fungible token.\n- `nft-transfer?`: Transfers ownership of a non-fungible token.\n- `nft-burn?`: Burns a non-fungible token.\n\n## Conclusion\n\nThe `nft-get-owner?` function is a fundamental tool for retrieving the owner of non-fungible tokens in Clarity smart contracts. It allows you to access ownership information, verify ownership records, and implement logic based on NFT ownership. When used effectively, `nft-get-owner?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage NFT ownership.\n","url":"/docs/stacks/clarity/functions/nft-get-owner"},"196":{"id":"/docs/stacks/clarity/functions/if","title":"if","description":"Conditional evaluation in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(if bool expr1 expr2)\n```\n\n- Input: \n - `bool`: A boolean expression\n - `expr1`: An expression to evaluate if `bool` is true\n - `expr2`: An expression to evaluate if `bool` is false\n- Output: The result of `expr1` if `bool` is true, otherwise the result of `expr2`\n\n## Why it matters\n\nThe `if` function is crucial for:\n\n1. Implementing conditional logic in smart contracts.\n2. Making decisions based on dynamic conditions.\n3. Controlling the flow of contract execution.\n4. Simplifying complex logic by branching based on conditions.\n\n## When to use it\n\nUse `if` when you need to:\n\n- Execute different code paths based on a condition.\n- Implement logic that depends on the state or input values.\n- Control the flow of your contract based on dynamic conditions.\n- Simplify complex decision-making processes.\n\n## Best Practices\n\n- Ensure that both `expr1` and `expr2` return the same type.\n- Use clear and meaningful boolean expressions for readability.\n- Avoid deeply nested `if` statements for better maintainability.\n- Combine with other control flow functions like `match` for more complex logic.\n\n## Practical Example: Conditional Token Transfer\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? UserBalances { userId: tx-sender })))\n )\n (if (>= senderBalance amount)\n (begin\n (map-set UserBalances { userId: tx-sender } { balance: (- senderBalance amount) })\n (map-set UserBalances { userId: recipient } { balance: (+ (default-to u0 (map-get? UserBalances { userId: recipient })) amount) })\n (ok true)\n )\n (err u1)\n )\n )\n)\n```\n\nThis example demonstrates:\n1. Using `if` to check if the sender has sufficient balance before transferring tokens.\n2. Executing different code paths based on the result of the balance check.\n3. Handling both the success and failure cases appropriately.\n\n## Common Pitfalls\n\n1. Forgetting that both `expr1` and `expr2` must return the same type.\n2. Using overly complex boolean expressions, making the code hard to read.\n3. Not handling all possible conditions, leading to unexpected behavior.\n4. Overusing `if` for logic that could be simplified with other control flow functions.\n\n## Related Functions\n\n- `match`: Used for pattern matching and handling multiple conditions.\n- `and`: Logical AND operator for combining boolean expressions.\n- `or`: Logical OR operator for combining boolean expressions.\n\n## Conclusion\n\nThe `if` function is a fundamental tool for implementing conditional logic in Clarity smart contracts. It allows you to control the flow of contract execution based on dynamic conditions, enabling more complex and responsive contract behavior. When used effectively, `if` simplifies decision-making processes and enhances the readability and maintainability of your smart contract code.\n","url":"/docs/stacks/clarity/functions/if"},"197":{"id":"/docs/stacks/clarity/functions/mod","title":"mod","description":"Calculate the remainder of integer division in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(mod i1 i2)\n```\n\n- Input: `int, int | uint, uint | string-ascii, string-ascii | string-utf8, string-utf8 | buff, buff`\n- Output: `int | uint`\n\n## Why it matters\n\nThe `mod` function is crucial for:\n\n1. Calculating the remainder of integer division.\n2. Implementing logic that depends on modular arithmetic.\n3. Simplifying the process of performing operations that require remainders.\n4. Enhancing code readability and maintainability by abstracting modular operations.\n\n## When to use it\n\nUse `mod` when you need to:\n\n- Calculate the remainder of integer division.\n- Implement logic that depends on modular arithmetic.\n- Perform operations that require remainders.\n- Simplify and abstract modular operations.\n\n## Best Practices\n\n- Ensure the divisor is not zero to avoid runtime errors.\n- Use meaningful variable names for better readability.\n- Combine with other mathematical functions for comprehensive calculations.\n- Be aware of the performance implications of frequent modular operations.\n\n## Practical Example: Calculating Remainders\n\nLet's implement a function that calculates the remainder of dividing two numbers:\n\n```clarity\n(define-read-only (calculate-remainder (a int) (b int))\n (mod a b)\n)\n\n;; Usage\n(calculate-remainder 5 2) ;; Returns 1\n(calculate-remainder 7 3) ;; Returns 1\n(calculate-remainder 10 4) ;; Returns 2\n```\n\nThis example demonstrates:\n1. Using `mod` to calculate the remainder of dividing two numbers.\n2. Implementing a read-only function to return the remainder.\n3. Handling both small and large input values.\n\n## Common Pitfalls\n\n1. Using `mod` with a divisor of zero, causing a runtime error.\n2. Assuming the result will always be positive, leading to incorrect expectations.\n3. Not handling all possible conditions, resulting in incomplete calculations.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `+`: Adds two numbers.\n- `-`: Subtracts one number from another.\n- `*`: Multiplies two numbers.\n- `/`: Divides one number by another.\n\n## Conclusion\n\nThe `mod` function is a fundamental tool for calculating the remainder of integer division in Clarity smart contracts. It allows you to perform modular arithmetic, enabling robust and comprehensive mathematical operations. When used effectively, `mod` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage modular calculations.\n","url":"/docs/stacks/clarity/functions/mod"},"198":{"id":"/docs/stacks/clarity/functions/stx-get-balance","title":"stx-get-balance","description":"Query the STX balance of a principal in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(stx-get-balance owner)\n```\n\n- Input: `principal`\n- Output: `uint`\n\n## Why it matters\n\nThe `stx-get-balance` function is crucial for:\n\n1. Querying the STX balance of a principal.\n2. Implementing logic that requires checking account balances.\n3. Ensuring data integrity by providing accurate balance information.\n4. Simplifying the process of handling balance-related operations in smart contracts.\n\n## When to use it\n\nUse `stx-get-balance` when you need to:\n\n- Query the STX balance of a principal.\n- Implement logic that requires checking account balances.\n- Ensure accurate balance information for data integrity.\n- Handle balance-related operations in your smart contract.\n\n## Best Practices\n\n- Ensure the `principal` is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other account functions for comprehensive account management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Querying STX Balance\n\nLet's implement a function that queries the STX balance of a given principal:\n\n```clarity\n(define-read-only (get-stx-balance (account principal))\n (stx-get-balance account)\n)\n\n;; Usage\n(get-stx-balance 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns u0 if the account has no balance\n(get-stx-balance (as-contract tx-sender)) \n;; Returns the balance of the contract's principal\n```\n\nThis example demonstrates:\n1. Using `stx-get-balance` to query the STX balance of a principal.\n2. Implementing a public function to handle the balance query.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `stx-get-balance` with an incorrectly formatted or invalid `principal`, causing the operation to fail.\n2. Assuming the balance query will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete account management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `stx-transfer?`: Transfers STX from one principal to another.\n- `stx-burn?`: Burns STX from a principal's account.\n- `stx-account`: Queries detailed STX account information.\n\n## Conclusion\n\nThe `stx-get-balance` function is a fundamental tool for querying the STX balance of a principal in Clarity smart contracts. It allows you to implement logic that requires checking account balances, ensuring data integrity and simplifying balance-related operations. When used effectively, `stx-get-balance` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle balance queries.\n","url":"/docs/stacks/clarity/functions/stx-get-balance"},"199":{"id":"/docs/stacks/clarity/functions/print","title":"print","description":"Evaluate and printing expressions in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(print expr)\n```\n\n- Input: `A`\n- Output: `A`\n\n## Why it matters\n\nThe `print` function is crucial for:\n\n1. Debugging and logging expressions during contract development.\n2. Evaluating and returning the input expression.\n3. Enhancing code readability and maintainability by providing a way to output intermediate values.\n\n## When to use it\n\nUse `print` when you need to:\n\n- Debug and log expressions during contract development.\n- Evaluate and return an input expression.\n- Output intermediate values for better understanding of contract behavior.\n\n## Best Practices\n\n- Use `print` primarily for debugging and development purposes.\n- Ensure that the expression passed to `print` is meaningful and necessary for debugging.\n- Remove or comment out `print` statements in production code to avoid unnecessary output.\n\n## Practical Example: Printing an Expression\n\nLet's implement a function that prints the result of an addition operation:\n\n```clarity\n(define-read-only (add-and-print (a int) (b int))\n (print (+ a b))\n)\n\n;; Usage\n(add-and-print 3 4) ;; Prints 7 and returns 7\n(add-and-print 10 20) ;; Prints 30 and returns 30\n```\n\nThis example demonstrates:\n1. Using `print` to output the result of an addition operation.\n2. Implementing a public function to handle the addition and printing.\n3. Handling both small and large input values.\n\n## Common Pitfalls\n\n1. Using `print` excessively, leading to cluttered output and reduced readability.\n2. Assuming `print` is necessary for all expressions, leading to overuse.\n3. Not removing or commenting out `print` statements in production code, resulting in unnecessary output.\n\n## Related Functions\n\n- `+`: Adds two or more numbers.\n- `-`: Subtracts one number from another.\n- `*`: Multiplies two or more numbers.\n- `/`: Divides one number by another.\n\n## Conclusion\n\nThe `print` function is a fundamental tool for debugging and logging expressions in Clarity smart contracts. It allows you to evaluate and return input expressions, providing a way to output intermediate values for better understanding of contract behavior. When used effectively, `print` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to debug and log expressions.\n","url":"/docs/stacks/clarity/functions/print"},"200":{"id":"/docs/stacks/clarity/functions/principal-construct","title":"principal-construct?","description":"Construct a principal in Clarity smart contracts.","content":"\n## Function Signature\n\n```clarity\n(principal-construct? version-byte hash-bytes [contract-name])\n```\n\n- Input: `(buff 1), (buff 20), [(string-ascii 40)]`\n- Output: `(response principal { error_code: uint, principal: (optional principal) })`\n\n## Why it matters\n\nThe `principal-construct?` function is crucial for:\n\n1. Creating standard or contract principals.\n2. Managing identities and permissions in smart contracts.\n3. Ensuring data integrity by validating principal construction.\n4. Simplifying the process of creating principals in smart contracts.\n\n## When to use it\n\nUse `principal-construct?` when you need to:\n\n- Create a standard or contract principal.\n- Manage identities and permissions in your smart contract.\n- Validate the construction of principals.\n- Handle principal creation operations.\n\n## Best Practices\n\n- Ensure the `version-byte` and `hash-bytes` are correctly formatted.\n- Use meaningful variable names for better readability.\n- Combine with other principal functions for comprehensive identity management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Constructing a Principal\n\nLet's implement a function that constructs a standard principal:\n\n```clarity\n(define-public (create-standard-principal (versionByte (buff 1)) (hashBytes (buff 20)))\n (principal-construct? versionByte hashBytes)\n)\n\n;; Usage\n(create-standard-principal 0x1a 0xfa6bf38ed557fe417333710d6033e9419391a320) ;; Returns (ok 'ST3X6QWWETNBZWGBK6DRGTR1KX50S74D3425Q1TPK)\n```\n\nThis example demonstrates:\n1. Using `principal-construct?` to create a standard principal.\n2. Implementing a public function to handle the principal construction.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `principal-construct?` with incorrectly formatted `versionByte` or `hashBytes`, causing the operation to fail.\n2. Assuming the principal will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete principal management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `principal-of?`: Returns the principal derived from a public key.\n- `contract-caller`: Returns the caller of the current contract context.\n- `tx-sender`: Returns the sender of the current transaction.\n\n## Conclusion\n\nThe `principal-construct?` function is a fundamental tool for creating principals in Clarity smart contracts. It allows you to manage identities and permissions, ensuring data integrity and simplifying principal creation. When used effectively, `principal-construct?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle principal construction operations.\n","url":"/docs/stacks/clarity/functions/principal-construct"},"201":{"id":"/docs/stacks/clarity/handling-optionals-and-errors","title":"Optional values and error handling","description":"Safely handling optional values and error cases in Clarity smart contracts.","content":"\nClarity provides robust mechanisms for dealing with optional values and error cases. These features are crucial for writing secure and predictable smart contracts that can gracefully handle unexpected situations.\n\n## Why these functions matter\n\nClarity's optional value and error handling functions are designed with several important considerations in mind:\n\n1. Safety: They prevent unexpected null or undefined errors that could crash a contract.\n2. Explicitness: They force developers to consider and handle all possible outcomes.\n3. Readability: They make the code's intent clear, improving maintainability.\n4. Composability: They allow for clean function composition and chaining of operations.\n\n## Core optional and error handling functions\n\n### 1. is-some and is-none\n\n**What**: Check if an optional value contains a value (some) or is empty (none).\n\n**Why**: Essential for safely working with optional values before attempting to use them.\n\n**When**: Use when you need to check if an optional value is present before proceeding.\n\n**How**: \n```clarity\n(is-some value)\n(is-none value)\n```\n\n**Best practices**: \n- Always check optional values before unwrapping them.\n- Use in combination with unwrap functions for safe value extraction.\n\n**Example use case**: Checking if a user exists in a map before performing an operation.\n\n```clarity\n(define-map Users principal { balance: uint })\n\n(define-public (check-balance (user principal))\n (if (is-some (map-get? Users user))\n (ok \"User exists\")\n (err \"User not found\")\n )\n)\n```\n\n### 2. unwrap! and unwrap-panic\n\n**What**: Extract the value from an optional or response type.\n\n**Why**: Allows safe extraction of values, with controlled behavior on failure.\n\n**When**: Use when you're certain a value exists or when you want to halt execution if it doesn't.\n\n**How**: \n```clarity\n(unwrap! value error-expr)\n(unwrap-panic value)\n```\n\n**Best practices**: \n- Use `unwrap!` when you want to provide a custom error message or value.\n- Use `unwrap-panic` sparingly, typically only in situations where failure is truly unexpected.\n\n**Example use case**: Retrieving a user's balance, with a custom error if the user doesn't exist.\n\n```clarity\n(define-map Users principal { balance: uint })\n\n(define-public (get-balance (user principal))\n (ok (unwrap! (get balance (map-get? Users user)) (err \"User not found\")))\n)\n```\n\n### 3. try!\n\n**What**: Attempts to unwrap a response, returning early with an error if it fails.\n\n**Why**: Simplifies error handling in functions that return responses.\n\n**When**: Use when you want to propagate errors up the call stack.\n\n**How**: \n```clarity\n(try! expression)\n```\n\n**Best practices**: \n- Use to chain multiple operations that might fail.\n- Helps keep code clean by avoiding nested if-else statements.\n\n**Example use case**: Transferring tokens between users, with multiple checks.\n\n```clarity\n(define-public (transfer (from principal) (to principal) (amount uint))\n (let\n (\n (senderBalance (try! (get-balance from)))\n (recipientBalance (try! (get-balance to)))\n )\n (try! (check-sufficient-balance senderBalance amount))\n (try! (update-balance from (- senderBalance amount)))\n (try! (update-balance to (+ recipientBalance amount)))\n (ok true)\n )\n)\n```\n\n## Practical example: safe token transfer system\n\nLet's implement a simple token system that demonstrates the use of optional values and error handling:\n\n```clarity\n(define-map Balances principal uint)\n\n(define-read-only (get-balance (user principal))\n (default-to u0 (map-get? Balances user))\n)\n\n(define-public (transfer (to principal) (amount uint))\n (let\n (\n (senderBalance (get-balance tx-sender))\n (recipientBalance (get-balance to))\n )\n (if (>= senderBalance amount)\n (begin\n (try! (as-contract (stx-transfer? amount tx-sender to)))\n (map-set Balances tx-sender (- senderBalance amount))\n (map-set Balances to (+ recipientBalance amount))\n (ok true)\n )\n (err u1)\n )\n )\n)\n\n(define-public (deposit (amount uint))\n (let\n (\n (currentBalance (get-balance tx-sender))\n )\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n (ok (map-set Balances tx-sender (+ currentBalance amount)))\n )\n)\n```\n\nThis example demonstrates:\n1. Using `try!` to handle potential errors in the STX transfer operations.\n2. Proper error handling and propagation throughout the contract functions.\n\n## Conclusion\n\nProper handling of optional values and error cases is crucial for writing secure and reliable Clarity smart contracts. By leveraging Clarity's built-in functions like `is-some`, `unwrap!`, and `try!`, you can create robust contracts that gracefully handle unexpected situations and provide clear feedback when errors occur. Always consider all possible outcomes and use these tools to make your contracts more predictable and maintainable.\n","url":"/docs/stacks/clarity/handling-optionals-and-errors"},"202":{"id":"/docs/stacks/clarity/time-and-blocks","title":"Time-based logic","description":"Implementing time-based logic with block info functions in Clarity.","content":"\nBlock info functions in Clarity provide crucial tools for implementing time-based logic in smart contracts. These functions allow developers to create contracts that can respond to the passage of time and changing blockchain states.\n\n## Why these functions matter\n\nClarity's block info functions are designed with blockchain-specific considerations in mind:\n\n1. Determinism: These functions provide a consistent view of time across all nodes, ensuring contract behavior is predictable.\n2. Security: By relying on block information rather than system time, contracts are protected against time-based manipulations.\n3. Flexibility: Developers can create time-locked features, scheduled events, and other time-dependent logic.\n4. Blockchain Awareness: Contracts can make decisions based on the current state of the blockchain.\n\n## Core Block Info Functions\n\n### 1. block-height\n\n**What**: Returns the current block height of the Stacks blockchain.\n**Why**: Essential for creating logic based on blockchain progression.\n**When**: Use when you need to trigger actions or changes based on block height milestones.\n**How**: \n```clarity\n(block-height)\n```\n\n**Best Practices**: \n- Use for long-term time measurements (hours/days) rather than short intervals.\n- Consider potential variations in block time when planning time-sensitive operations.\n\n**Example Use Case**: Implementing a phased token release schedule.\n\n```clarity\n(define-public (claim-tokens)\n (let ((release-height u100000))\n (if (>= block-height release-height)\n (ok (release-tokens))\n (err u1))))\n```\n\n### 2. burn-block-height\n\n**What**: Returns the current block height of the underlying burn chain (Bitcoin).\n**Why**: Provides a more stable time reference, as Bitcoin has more consistent block times.\n**When**: Use for more precise time-based logic or when synchronizing with Bitcoin network events.\n**How**: \n```clarity\n(burn-block-height)\n```\n\n**Best Practices**: \n- Prefer this over `block-height` for more accurate time estimations.\n- Remember that Bitcoin block times can still vary, so allow for some flexibility.\n\n**Example Use Case**: Creating a time-locked vault that opens after a specific Bitcoin block height.\n\n```clarity\n(define-constant unlock-height u700000)\n\n(define-public (withdraw-from-vault (amount uint))\n (if (>= burn-block-height unlock-height)\n (ok (transfer-tokens amount))\n (err u2)))\n```\n\n### 3. get-block-info?\n\n**What**: Retrieves information about a specific block.\n**Why**: Allows contracts to access historical block data for complex time-based logic.\n**When**: Use when you need to verify or act on information from past blocks.\n**How**: \n```clarity\n(get-block-info? property-name block-height-int)\n```\n\n**Best Practices**: \n- Cache retrieved information when possible to save processing costs.\n- Be aware of the limit on how far back you can query block information.\n\n**Example Use Case**: Implementing a reward system based on user activity in specific time periods.\n\n```clarity\n(define-public (claim-period-reward (period uint))\n (let ((period-end-height (get-period-end-height period))\n (current-winner (get-block-info? winner-id period-end-height)))\n (if (is-eq current-winner tx-sender)\n (ok (distribute-reward tx-sender))\n (err u3))))\n```\n\n### Practical Example: Token Balance Snapshot for Voting\n\nLet's implement a simple voting system where voting power is determined by a user's token balance at a specific \"snapshot\" block height. This example combines the use of `at-block` and `get-block-info?` functions to create a time-based voting mechanism.\n\n```clarity\n;; Define a simple token balance map\n(define-map token-balances principal uint)\n\n;; Define a map to store votes\n(define-map votes principal uint)\n\n;; Set a snapshot block height\n(define-data-var snapshot-height uint u100000)\n\n;; Function to get a user's balance at the snapshot height\n(define-read-only (get-snapshot-balance (user principal))\n (match (get-block-info? id-header-hash (var-get snapshot-height))\n snapshot-block (at-block snapshot-block\n (default-to u0 (map-get? token-balances user)))\n u0))\n\n;; Function to cast a vote\n(define-public (cast-vote (amount uint))\n (let \n ((snapshot-balance (get-snapshot-balance tx-sender))\n (current-votes (default-to u0 (map-get? votes tx-sender))))\n (asserts! (<= amount snapshot-balance) (err u1)) ;; Can't vote more than snapshot balance\n (asserts! (< (+ amount current-votes) (+ snapshot-balance u1)) (err u2)) ;; Prevent overflow\n (map-set votes tx-sender (+ amount current-votes))\n (ok true)))\n\n;; Function to check total votes\n(define-read-only (get-total-votes)\n (fold + (map-values votes) u0))\n```\n\n## Conclusion\n\nBlock info functions in Clarity provide powerful tools for implementing time-based logic in smart contracts. By understanding when and how to use these functions, developers can create contracts that respond dynamically to the progression of the blockchain, enabling features like time-locks, scheduled events, and historical data analysis. Always consider the specific requirements of your application and the potential for block time variations when implementing time-based logic using these block info functions.","url":"/docs/stacks/clarity/time-and-blocks"},"203":{"id":"/docs/stacks/web-app-development","title":"Web app development","description":"Build your web apps on Stacks.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>","url":"/docs/stacks/web-app-development"},"204":{"id":"/docs/stacks/token-development","title":"Token development","description":"Build your tokens on Stacks.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>","url":"/docs/stacks/token-development"},"205":{"id":"/docs/stacks/signer-metrics-api/blocks","title":"Blocks","description":"Get aggregated signer information for blocks.","content":"","url":"/docs/stacks/signer-metrics-api/blocks"},"206":{"id":"/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block","title":"Aggregated signer information for a block","description":"Get aggregated signer information for a specific block.","content":"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/blocks/{height_or_hash}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block"},"207":{"id":"/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks","title":"Aggregated signer information for most recent blocks","description":"Get aggregated signer information for most recent blocks.","content":"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/blocks', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks"},"208":{"id":"/docs/stacks/signer-metrics-api","title":"Overview","description":"Monitor and analyze signer behavior on the Stacks network.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nThe Signer Metrics API enables you to monitor signers on the Stacks network. With a familiar REST interface, you can easily fetch information about the signer network, such as lists of active signers in a particular PoX cycle and signer information for a particular block. \n\nThis API also lets you analyze and evaluate the behavior of individual signers, such as their block acceptance rate, their average block push time, and more.\n\n## Popular endpoints\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/signer-metrics-api/signers/pox-cycle-signers\"\n title=\"Get a list of signers\"\n description=\"Fetches a list of signers in a given PoX cycle.\"\n />\n <SecondaryCard\n href=\"/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block\"\n title=\"Get signer information for a block\"\n description=\"Fetches aggregated signer information for a specific block.\"\n />\n <SecondaryCard\n href=\"/stacks/signer-metrics-api/prometheus/metrics\"\n title=\"Query for Prometheus metrics\"\n description=\"Fetch behavioral data around individual signers and block proposals\"\n />\n</Cards>\n\n## Related tools\n\n- **[Stacks Blockchain API](/stacks/api)**: Fetch richer data from Hiro's Stacks Blockchain API.\n- **[Stacks Node RPC API](/stacks/rpc-api)**: Query the Stacks Node RPC API, interact with smart contracts, and broadcast transactions all via a familiar REST interface.\n- **[Token Metadata API](/stacks/token-metadata-api)**: Fetch fungible and non-fungible token data on the Stacks blockchain.\n\n<br />\n\n<Callout title=\"Need help building with the Stacks Node RPC API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#api</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n","url":"/docs/stacks/signer-metrics-api"},"209":{"id":"/docs/stacks/signer-metrics-api/info","title":"Info","description":"Service status endpoints","content":"","url":"/docs/stacks/signer-metrics-api/info"},"210":{"id":"/docs/stacks/signer-metrics-api/info/status","title":"API Status","description":"Displays the status of the API and its current workload.","content":"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/signer-metrics-api/info/status"},"211":{"id":"/docs/stacks/signer-metrics-api/prometheus","title":"Prometheus Metrics","description":"Get Prometheus metrics for the Signer Metrics API.","content":"","url":"/docs/stacks/signer-metrics-api/prometheus"},"212":{"id":"/docs/stacks/signer-metrics-api/prometheus/metrics","title":"Prometheus Metrics","description":"Get Prometheus metrics for the Signer Metrics API.","content":"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/metrics', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/signer-metrics-api/prometheus/metrics"},"213":{"id":"/docs/stacks/signer-metrics-api/signers","title":"Signers","description":"Get information about signers on the Stacks blockchain.","content":"","url":"/docs/stacks/signer-metrics-api/signers"},"214":{"id":"/docs/stacks/signer-metrics-api/signers/pox-cycle-signer","title":"PoX Cycle Signer","description":"Get stats for a specific signer in a given PoX cycle.","content":"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/cycles/{cycle_number}/signers/{signer_id}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/signer-metrics-api/signers/pox-cycle-signer"},"215":{"id":"/docs/stacks/signer-metrics-api/signers/pox-cycle-signers","title":"PoX Cycle Signers","description":"Get a list of signers in a given PoX cycle.","content":"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/cycles/{cycle_number}/signers', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/signer-metrics-api/signers/pox-cycle-signers"},"216":{"id":"/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-a-block","title":"Signer information for a block","description":"Get signer information for a specific block.","content":"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/block_proposals/{block_hash}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-a-block"},"217":{"id":"/docs/stacks/signer-metrics-api/block-proposals","title":"Block proposals","description":"Get information about block proposals.","content":"","url":"/docs/stacks/signer-metrics-api/block-proposals"},"218":{"id":"/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals","title":"Signer information for most recent block proposals","description":"Get signer information for most recent block proposals.","content":"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/block_proposals', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals"},"219":{"id":"/docs/stacks/nakamoto","title":"Overview","description":"Discover updates to Hiro tools related to the Nakamoto upgrade.","content":"\nNakamoto is an upcoming upgrade to Stacks that brings faster blocks and paves the way for sBTC. [Start here](https://docs.stacks.co/nakamoto-upgrade/nakamoto-upgrade-start-here) if you need an overview of how Nakamoto impacts the network. This document is about how Nakamoto impacts your applications and Hiro tooling specifically.\n\nThe good news for you is that the Nakamoto upgrade does not bring breaking changes to applications on Stacks. Your app will continue to work as expected post-upgrade, apart from you and your users experiencing the better UX of faster block times.\n\nIn terms of what you need to do to prepare for Nakamoto, just make sure you are running the latest versions of our tooling. We are shipping updates across all Hiro tools to make sure they support Nakamoto and that you can stay focused on building.\n\nBelow find a list of how Hiro tools have been updated to support Nakamoto:\n\n## Stacks Explorer: What's new\n\n### Introducing a fresh view for blocks\n\nThe Stacks Explorer now features a new way to display blocks, aligning with the Nakamoto upgrade's approach of multiple STX blocks settling into one BTC block.\n\n![Block View](./images/nakamoto-explorer.png)\n\n### Tailored viewing experience\n\nThis new view is now live on both [testnet](https://explorer.hiro.so/?chain=testnet) and [mainnet](https://explorer.hiro.so/?chain=mainnet), accessible via the network dropdown.\n\n#### Two distinctive display modes\n\n1. **Independent Display:** Focuses on STX blocks progress.\n2. **COMING SOON—Grouped by Bitcoin Block:** Shows BTC blocks flow alongside STX blocks.\n\n![Block View](./images/group-by-block.png)\n\n### Stay in the loop with live view\n\nKeep up-to-date with blocks in real-time with our new live view option.\n\n---\n\n## Stacks.js: What’s new\n\n### StackingClient\n\nInstall the latest nakamoto version with `npm install @stacks/stacking@6.13.0`.\n\nThe StackingClient in `@stacks/stacking` was updated to match the latest pox-4 contract.\n\n- Added `StackingClient.signPoxSignature()`\n- Added `Pox4SignatureTopic` enum\n- New stacking arguments for `StackingClient.stack`, `StackingClient.stackExtend`, `StackingClient.stackIncrease`, `StackingClient.stackAggregationCommit`, and `StackingClient.stackAggregationCommitIndexed`\n\n[Learn more](/stacks/nakamoto/guides/stacks-js) about the new Stacks.js updates.\n\n---\n\n## Clarinet: What’s new\n\nMake sure to install [Clarinet 2.8.0](https://github.com/hirosystems/clarinet/releases/tag/v2.8.0) or above.\n\n- Clarinet's devnet can now be used to test Nakamoto functionality.\n- The devnet now starts 2 signer nodes in Nakamoto mode.\n- Running `clarinet check --enable-clarity-wasm` now runs the current interpreter and clarity wasm side-by-side to allow comparing outputs.\n- `clarinet console --enable-clarity-wasm` now automatically runs the current interpreter and clarity wasm side-by-side and logs any difference in outputs.\n\nBy default, the Devnet won't start in epoch 3.0, [see this guide](/stacks/nakamoto/guides/clarinet) to configure it.\n\n---\n\n## Stacks Blockchain API: What’s new\n\n> **_NOTE:_**\n>\n> The `/extended/v2/*` endpoints represent the modern API that is being continually expanded to support the Nakamoto upgrade. We encourage developers to use v2 endpoints for new developments. Be aware that `/extended/v1/*` are the older set of endpoints. Though they continue to function alongside v2, they will be deprecated in the coming months.\n\n### Nakamoto endpoints\n\nThe Stacks Blockchain API has a series of new endpoints to support the upcoming Nakamoto upgrade:\n\n- Get Proof-of-Transfer details per Cycle, including Signers and Stackers, with information about stacked STX amounts, payout addresses and signer weights\n- Get a list of Stacks blocks per Bitcoin block to support the new Nakamoto mining mechanism\n- Get all transactions relevant to a STX address or contract ID, including filters for FT and NFT transfers\n- Support for the new Nakamoto `tenure_change` transaction type across all our transaction endpoints\n- Get a summary of current network mempool transaction fees, including statistics for expected confirmation priorities\n- Get the deployment status of multiple smart contracts in one call\n\nAll of these endpoints are backwards compatible with Stacks nodes running version 2.4 or earlier\n\n### Event replay optimizations\n\n- Optimize replay speed by creating a new parquet-based ingestion that optimizes for canonical chain information\n- Optimize classic TSV event replay by improving block ingestion times\n\n### New transaction type `tenure_change`\n\nAffects endpoints:\n\n- `/extended/v1/address/{principal}/transactions`\n- `/extended/v1/tx`\n- `/extended/v1/tx/{tx_id}`\n- `/extended/v1/tx/{tx_id}/raw`\n- `/extended/v1/tx/mempool`\n- `/extended/v1/tx/multiple`\n\n### New endpoints: `/extended/v2/*`\n\n- `/extended/v2/mempool/fees`\n- `/extended/v2/burn-blocks`\n- `/extended/v2/burn-blocks/{height_or_hash}`\n- `/extended/v2/burn-blocks/{height_or_hash}/blocks`\n- `/extended/v2/blocks`\n- `/extended/v2/blocks/{height_or_hash}`\n- `/extended/v2/blocks/{height_or_hash}/transactions`\n- `/extended/v2/addresses/{address}/transactions:`\n- `/extended/v2/addresses/{address}/transactions/{tx_id}/events:`\n- `/extended/v2/smart-contracts/status`\n- `/extended/v2/pox/cycles`\n- `/extended/v2/pox/cycles/{cycle_number}`\n- `/extended/v2/pox/cycles/{cycle_number}/signers`\n- `/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}`\n- `/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}/stackers`\n\n### Deprecated endpoints\n\n- `/extended/v1/block`\n- `/extended/v1/block/{hash}`\n- `/extended/v1/block/by_height/{height}`\n- `/extended/v1/block/by_burn_block_hash/{burn_block_hash}`\n- `/extended/v1/block/by_burn_block_height/{burn_block_height}`\n- `/extended/v1/address/{principal}/transactions`\n- `/extended/v1/address/{principal}/{tx_id}/with_transfers`\n- `/extended/v1/address/{principal}/transactions_with_transfers`\n- `/extended/v1/fee_rate`\n- `/extended/v1/tx/block/{block_hash}`\n- `/extended/v1/tx/block_height/{height}`\n\nView the [API reference](/stacks/api/info).\n","url":"/docs/stacks/nakamoto"},"220":{"id":"/docs/stacks/nakamoto/guides/explorer","title":"Updates for Stacks Explorer","description":"Discover Stacks Explorer updates related to the Nakamoto upgrade.","content":"\n## What's new\n\n### Introducing a fresh view for blocks\n\nThe Stacks Explorer now features a new way to display blocks, aligning with the Nakamoto upgrade's approach of multiple STX blocks settling into one BTC block.\n\n![Block View](../images/nakamoto-explorer.png)\n\n### Tailored viewing experience\n\nThis new view is now live on both [testnet](https://explorer.hiro.so/?chain=testnet) and [mainnet](https://explorer.hiro.so/?chain=mainnet), accessible via the network dropdown.\n\n#### Two distinctive display modes\n\n1. **Independent Display:** Focuses on STX blocks progress.\n2. **COMING SOON—Grouped by Bitcoin Block:** Shows BTC blocks flow alongside STX blocks.\n\n![Block View](../images/group-by-block.png)\n\n### Stay in the loop with live view\n\nKeep up-to-date with blocks in real-time with our new live view option.\n","url":"/docs/stacks/nakamoto/guides/explorer"},"221":{"id":"/docs/stacks/nakamoto/guides/clarinet","title":"Updates for Clarinet","description":"Discover Clarinet upgrades related to the Nakamoto release.","content":"\n## Setting up a project for Nakamoto\n\nAs of [version 2.11.0](https://github.com/hirosystems/clarinet/releases/tag/v2.11.0), Clarinet runs\nin epoch 3.0 (Nakamoto) by default.\n\n- Contracts are set to be deployed in epoch 3.0 and support Clarity 3.\n- The Devnet runs the latest Stacks blockchain version by default, enabling Nakamoto and support\n Clarity 3 contracts.\n\nOnce the Devnet reaches the right block height, (Bitcoin block #108 by default), it will deploy the\n_`pox-4.clar`_ contract and run in Epoch 2.5. From there, Clarinet will send _`stack-stx`_ and\n_`stack-extend`_ requests to the new PoX contract. Eventually, you can observe the\n_`vote-for-aggregate-public-key`_ transactions that they send.\n\n**At Bitcoin block #142, the Devnet will switch the epoch 3.0.**\n\nAt the end of the _`Devnet.toml`_ file, you must make sure that the _`pox_stacking_orders`_ are properly\nset. You should have 3 stacking orders from 3 different accounts. All should start at **cycle 1**\nand take at least **2 slots**. You also need to enable the _`auto-extend`_ property. Because Nakamoto\nrelies on the Stackers to sign blocks, these settings ensure that there are engouh stacked STX for\neach cycles. Here is what it looks like by default in new projects:\n\n```toml\n# settings/Devnet.toml\n[[devnet.pox_stacking_orders]]\nstart_at_cycle = 1\nduration = 10\nauto_extend = true\nwallet = \"wallet_1\"\nslots = 2\nbtc_address = \"mr1iPkD9N3RJZZxXRk7xF9d36gffa6exNC\"\n\n[[devnet.pox_stacking_orders]]\nstart_at_cycle = 1\nduration = 10\nauto_extend = true\nwallet = \"wallet_2\"\nslots = 2\nbtc_address = \"muYdXKmX9bByAueDe6KFfHd5Ff1gdN9ErG\"\n\n[[devnet.pox_stacking_orders]]\nstart_at_cycle = 1\nduration = 10\nauto_extend = true\nwallet = \"wallet_3\"\nslots = 2\nbtc_address = \"mvZtbibDAAA3WLpY7zXXFqRa3T4XSknBX7\"\n```\n\nSet a contract to be deployed in epoch 3.0 with Clarity 3. You can create a new one with\n`$ clarinet contract new <contract-name>`). It needs to be manually update in the project manifest\n(Clarinet.toml)\n\n```toml\n# Clarinet.toml\n[contracts.nakademo]\npath = 'contracts/nakademo.clar'\nclarity_version = 3\nepoch = 3.0\n```\n\nStart Devnet with `clarinet devnet start`, you should see epoch 3.0 and fast blocks at Bitcoin\nblock 142.\n\n<Callout title=\"New Clarity keywords\">\nClarity 3 introduces two new keywords after the Nakamoto hard fork:\n\n- `tenure-height`: Returns the number of tenures passed.\n- `stacks-block-height`: Returns the current Stacks block height.\n\nNote: `block-height` is removed.\n\nFor more details on these and other Clarity keywords, see the [Clarity Keywords Reference](https://docs.stacks.co/reference/keywords).\n</Callout>","url":"/docs/stacks/nakamoto/guides/clarinet"},"222":{"id":"/docs/stacks/nakamoto/guides/stacks-api","title":"Updates for Stacks API","description":"Discover Stacks Blockchain API updates related to the Nakamoto upgrade.","content":"\n## What's new\n\n<Callout title=\"Note\" type=\"info\">\n The `/extended/v2/*` endpoints represent the modern API that is being\n continually expanded to support the Nakamoto upgrade. We encourage developers\n to use v2 endpoints for new developments. Be aware that `/extended/v1/*` are\n the older set of endpoints. Though they continue to function alongside v2, they will be deprecated in the coming months.\n</Callout>\n\n### Nakamoto endpoints\n\nThe Stacks Blockchain API has a series of new endpoints to support the upcoming Nakamoto upgrade:\n\n- Get Proof-of-Transfer details per Cycle, including Signers and Stackers, with information about stacked STX amounts, payout addresses and signer weights\n- Get a list of Stacks blocks per Bitcoin block to support the new Nakamoto mining mechanism\n- Get all transactions relevant to a STX address or contract ID, including filters for FT and NFT transfers\n- Support for the new Nakamoto `tenure_change` transaction type across all our transaction endpoints\n- Get a summary of current network mempool transaction fees, including statistics for expected confirmation priorities\n- Get the deployment status of multiple smart contracts in one call\n\nAll of these endpoints are backwards compatible with Stacks nodes running version 2.4 or earlier\n\n### Event replay optimizations\n\n- Optimize replay speed by creating a new parquet-based ingestion that optimizes for canonical chain information\n- Optimize classic TSV event replay by improving block ingestion times\n\n### New transaction type `tenure_change`\n\nThis new type affects the following endpoints:\n\n- `/extended/v1/address/{principal}/transactions`\n- `/extended/v1/tx`\n- `/extended/v1/tx/{tx_id}`\n- `/extended/v1/tx/{tx_id}/raw`\n- `/extended/v1/tx/mempool`\n- `/extended/v1/tx/multiple`\n\n### New endpoints: `/extended/v2/*`\n\nOne important difference to note between the `/extended/v1` vs the `/extended/v2` endpoints is that the /extended/v2/_ endpoints represent the current API that is being continually expanded to support the Nakamoto upgrade. We encourage developers to use v2 endpoints for new developments. Be aware that /extended/v1/_ are the older set of endpoints. Though they continue to function alongside v2, they will be deprecated in the coming months.\n\n- `/extended/v2/mempool/fees`\n- `/extended/v2/burn-blocks`\n- `/extended/v2/burn-blocks/{height_or_hash}`\n- `/extended/v2/burn-blocks/{height_or_hash}/blocks`\n- `/extended/v2/blocks`\n- `/extended/v2/blocks/{height_or_hash}`\n- `/extended/v2/blocks/{height_or_hash}/transactions`\n- `/extended/v2/addresses/{address}/transactions:`\n- `/extended/v2/addresses/{address}/transactions/{tx_id}/events:`\n- `/extended/v2/smart-contracts/status`\n- `/extended/v2/pox/cycles`\n- `/extended/v2/pox/cycles/{cycle_number}`\n- `/extended/v2/pox/cycles/{cycle_number}/signers`\n- `/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}`\n- `/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}/stackers`\n\n### Deprecated endpoints\n\n- `/extended/v1/block`\n- `/extended/v1/block/{hash}`\n- `/extended/v1/block/by_height/{height}`\n- `/extended/v1/block/by_burn_block_hash/{burn_block_hash}`\n- `/extended/v1/block/by_burn_block_height/{burn_block_height}`\n- `/extended/v1/address/{principal}/transactions`\n- `/extended/v1/address/{principal}/{tx_id}/with_transfers`\n- `/extended/v1/address/{principal}/transactions_with_transfers`\n- `/extended/v1/fee_rate`\n- `/extended/v1/tx/block/{block_hash}`\n- `/extended/v1/tx/block_height/{height}`\n\nView the [API reference](/stacks/api/info).\n","url":"/docs/stacks/nakamoto/guides/stacks-api"},"223":{"id":"/docs/stacks/nakamoto/guides/stacks-js","title":"Updates for Stacks.js","description":"Discover Stacks.js changes related to the Nakamoto upgrade.","content":"\n## What's new\n\n### StackingClient\n\nInstall the latest nakamoto version with `npm install @stacks/stacking@latest`.\n\nThe StackingClient in `@stacks/stacking` was updated to match the latest `pox-4` contract.\n\n- Added `StackingClient.signPoxSignature()`\n- Added `Pox4SignatureTopic` enum\n- New stacking arguments for `StackingClient.stack`, `StackingClient.stackExtend`, `StackingClient.stackIncrease`, `StackingClient.stackAggregationCommit`, `StackingClient.stackAggregationCommitIndexed`, and `StackingClient.stackAggregationIncrease`\n\n### Nakamoto network\n\nTo test using the Nakamoto testnet, you can use the `StacksTestnet` network with a custom URL. The Nakamoto testnet is being hosted at https://api.testnet.hiro.so. Use this URL like this:\n\n```tsx\nimport { StacksTestnet } from \"@stacks/network\"\n\nconst network = new StacksTestnet({\n url: \"https://api.testnet.hiro.so\"\n})\n```\n\n#### Example snippets\n\n**`StackingClient.signPoxSignature`**\n\n```ts\nconst client = StackingClient(MY_ADDRESS, new StacksTestnet())\n```\n\n```ts\nconst signature = client.signPoxSignature({\n topic: \"stack-stx\",\n rewardCycle: await client.getPoxInfo().reward_cycle_id,\n poxAddress: MY_BTC_ADDRESS,\n period: 2,\n maxAmount: 10_000_000_000_000,\n authId: 123n,\n\n signerPrivateKey: MY_SIGNER_PRIVATE_KEY\n})\n```\n\n**New arguments for e.g. `StackingClient.stack`**\n\n```ts\nconst { txid } = await client.stack({\n amountMicroStx: 10_000_000_000_000, // this can be at most the signature `maxAmount`\n poxAddress: MY_BTC_ADDRESS,\n cycles: 2, // this needs to match signature `period`\n burnBlockHeight: CURRENT_BURN_BLOCK_HEIGHT,\n\n // NEW ARGS\n signerKey: MY_SIGNER_PUBLIC_KEY,\n signerSignature: signature,\n maxAmount: 10_000_000_000_000,\n authId: 123n,\n\n privateKey: MY_STX_PRIVATE_KEY\n})\n```\n","url":"/docs/stacks/nakamoto/guides/stacks-js"},"224":{"id":"/docs/stacks/unit-testing","title":"Unit testing","description":"Learn how to write and run unit tests for your Clarity smart contracts using the Clarinet JS SDK and Vitest.","content":"\nimport { Accordions, Accordion } from 'fumadocs-ui/components/accordion';\n\nUnit testing is the process of testing individual components or functions of smart contracts to ensure they work as expected. The Clarinet JS SDK provides a testing framework that allows you to write these tests using the Vitest testing framework, helping you catch bugs and errors early in the development process.\n\nIn this guide, you will:\n\n1. [Set up a new Clarinet project with a `defi` contract](#set-up-a-new-clarinet-project).\n2. [Write a unit test covering the `deposit` function](#test-the-deposit-function).\n3. [Run tests and generate coverage reports](#run-tests-and-generate-coverage-reports).\n\n---\n\n## Set up a new Clarinet project\n\nStart by creating a new project with the Clarinet CLI. The command below will create a project structure inside of `defi` with the necessary files and folders, including the Clarinet JS SDK already set up for testing.\n\n```terminal\n$ clarinet new stx-defi\n$ cd stx-defi\n```\n\nAfter changing into your project directory, run `npm install` to install the package dependencies for testing.\n\n```terminal\n$ npm install\n```\n\nSince the smart contract code is out of scope for this guide, we are going to use a pre-existing contract. First, generate a new file using the `clarinet contract new` command in order to set up your project with the necessary configuration and test files.\n\n```terminal\n$ clarinet contract new defi\n```\n\nNow, inside your `defi.clar` file, copy and paste the following contract code:\n\n```clarity\n;; Holds the total amount of deposits in the contract, initialized to 0.\n(define-data-var total-deposits uint u0)\n\n;; Maps a user's principal address to their deposited amount.\n(define-map deposits { owner: principal } { amount: uint })\n\n;; Public function for users to deposit STX into the contract.\n;; Updates their balance and the total deposits in the contract.\n(define-public (deposit (amount uint))\n (let\n (\n ;; Fetch the current balance or default to 0 if none exists.\n (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n )\n ;; Transfer the STX from sender = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\" to recipient = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)\".\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n ;; Update the user's deposit amount in the map.\n (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })\n ;; Update the total deposits variable.\n (var-set total-deposits (+ (var-get total-deposits) amount))\n ;; Return success.\n (ok true)\n )\n)\n\n;; Read-only function to get the total balance by tx-sender\n(define-read-only (get-balance-by-sender)\n (ok (map-get? deposits { owner: tx-sender }))\n)\n```\n\nRun `clarinet check` to ensure that your smart contract is valid and ready for testing.\n\n<Callout>\nYou can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi).\n</Callout>\n\n## Test the deposit function\n\nThis `deposit` function allows users to deposit STX into the contract, updating their balance inside a `deposits` map and adding to the total deposits stored in a `total-deposits` variable. The key tests we want to cover are that the deposit is successful and that the user's balance, as well as the contract's total deposits, are updated correctly.\n\nInside of your `defi.test.ts` file, replace the boilerplate code and add the following:\n\n```typescript\nimport { describe, it, expect } from 'vitest';\nimport { Cl } from '@stacks/transactions';\n\nconst accounts = simnet.getAccounts();\nconst wallet1 = accounts.get('wallet_1')!;\n```\n\nThese imports provide the testing framework and utilities we need. We also get the `wallet_1` account, which will act as our test user.\n\nNext, define the test suite and the specific test case:\n\n```typescript\ndescribe('stx-defi', () => {\n it('allows users to deposit STX', () => {\n // Test code will go here\n });\n});\n```\n\nThis structure comes from our Vitest integration, and it organizes our tests and describes what we're testing. The `describe` block groups multiple test cases together, while the `it` block represents a single test case.\n\nNow, let's simulate a deposit. Inside of the `it` block, define the amount to deposit and call the `deposit` function:\n\n```typescript\nconst amount = 1000;\nconst deposit = simnet.callPublicFn('defi', 'deposit', [Cl.uint(amount)], wallet1);\n```\n\nThis code simulates a deposit by calling the `deposit` function, using the `callPublicFn` method from the Clarinet JS SDK, in our contract with a specified amount, just as a user would in the real world.\n\nAfter making the deposit, create an assertion to verify that the call itself was successful and returns an `ok` response type with the value `true`:\n\n```typescript\nexpect(deposit.result).toBeOk(Cl.bool(true));\n```\n\nRun `npm run test` to confirm that this test passes.\n\nLet's go over some of the code in this assertion:\n\n- `expect` is a function from Vitest that makes an assertion about the value we expect to get back from the `deposit` function.\n\nBut how do we test against Clarity types and values? This is where the `Cl` and `toBeOk` helpers come in.\n\n- `toBeOk` is a custom matcher function built into Vitest that checks if the result of the deposit call is an `Ok` response, which is a Clarity type. This is important because it confirms that the deposit transaction was processed successfully.\n- `Cl` helper is from the `@stacks/transactions` package and is used to create Clarity values in JavaScript. In this case, it's used to create a Clarity boolean with the value of `true`.\n\n<Callout>\nTo see more custom matcher examples, check out the [reference page](/stacks/clarinet-js-sdk/references/custom-matchers).\n</Callout>\n\nOnce we can confirm that the deposit was successful, write a test to verify that the contract's total deposits have been updated correctly.\n\n```typescript\nconst totalDeposits = simnet.getDataVar('defi', 'total-deposits');\nexpect(totalDeposits).toBeUint(amount);\n```\n\nRun `npm run test` again to confirm that this test also passes.\n\nThis check ensures that the contract accepted our deposit without any issues.\n\nLastly, verify that the user's balance has been updated correctly:\n\n```typescript\nconst balance = simnet.callReadOnlyFn('defi', 'get-balance-by-sender', [], wallet1);\nexpect(balance.result).toBeOk(\n Cl.some(\n Cl.tuple({\n amount: Cl.uint(amount),\n })\n )\n);\n```\n\nWe call the `get-balance-by-sender` function and check if it matches the amount we just deposited.\n\nBy following these steps, our test comprehensively verifies that the `deposit` function works as intended, updating individual balances and total deposits accurately.\n\n<Accordions>\n <Accordion title=\"Full code snippet\">\n```typescript\n import { describe, it, expect } from 'vitest';\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet1 = accounts.get('wallet_1')!;\n\n describe('stx-defi', () => {\n it('allows users to deposit STX', () => {\n const amount = 1000;\n const deposit = simnet.callPublicFn('defi', 'deposit', [Cl.uint(amount)], wallet1);\n expect(deposit.result).toBeOk(Cl.bool(true));\n\n const totalDeposits = simnet.getDataVar('defi', 'total-deposits');\n expect(totalDeposits).toBeUint(amount);\n\n const balance = simnet.callReadOnlyFn('defi', 'get-balance-by-sender', [], wallet1);\n expect(balance.result).toBeOk(\n Cl.some(\n Cl.tuple({\n amount: Cl.uint(amount),\n })\n )\n );\n });\n });\n```\n </Accordion>\n</Accordions>\n\n## Run tests and generate coverage reports\n\nTo run your tests, use:\n\n```terminal\n$ npm run test\n```\n\nTo generate a coverage report, use:\n\n```terminal\n$ npm run coverage\n```\n\nThis will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/methods\"\n title=\"SDK methods\"\n description=\"Learn about the methods available in the Clarinet JS SDK.\"\n />\n</Cards>","url":"/docs/stacks/unit-testing"},"225":{"id":"/docs/stacks/smart-contract-development","title":"Smart contract development","description":"Build your smart contracts on Stacks.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>","url":"/docs/stacks/smart-contract-development"},"226":{"id":"/docs/stacks/stacks.js/v6/transactions","title":"@stacks/transactions","description":"Construct, decode transactions and work with Clarity smart contracts on the Stacks blockchain.","content":"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\nThe Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a UserSession to manage user data.\n\n## Installation\n\n```package-install\n@stacks/transactions\n```\n\n{/* <Root>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`AppConfig`</h2>\n\nConfiguration data for the current app.\n\nOn browser platforms, creating an instance of this class without any arguments will use `window.location.origin` as the app domain. On non-browser platforms, you need to specify an app domain as the second argument.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"scopes\"} type={\"string[]\"}>\n\nAn array of strings representing permissions requested by the app.\n\n<span>Default: `['store_write']`</span>\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"appDomain\"} type={\"string\"}>\n\nStacks apps are uniquely identified by their app domain.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"redirectPath\"} type={\"string\"}>\n\nPath on app domain to redirect users to after authentication. The authentication response token will be postpended in a query.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"manifestPath\"} type={\"string\"}>\n\nPath relative to app domain of app's manifest file.\n\n<span>Default: `\"/manifest.json\"`</span>\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"coreNode\"} type={\"string\"}>\n\nThe URL of Stacks core node to use for this app. If this is not specified, the default core node will be used.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"authenticatorURL\"} type={\"string\"}>\n\nThe URL of a web-based authenticator to use in the event the user doesn't have Stacks installed on their machine. If this is not specified, the current default in this library will be used.\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"config\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"config\" className='tab group'>\n <Badge className='badge transition-colors'>Setting basic app permissions</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>With advanced scopes</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"config\">\n ```tsx twoslash\n // @noErrors\n // [!code word:AppConfig]\n import { AppConfig } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n const appConfig = new AppConfig(\n ['store_write'],\n appDomain\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n \n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```tsx twoslash\n // @noErrors\n // [!code word:publish_data]\n // [!code word:email]\n import { AppConfig } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n const appConfig = new AppConfig(\n ['store_write', 'publish_data', 'email'],\n appDomain\n );\n ```\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n \n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`UserSession`</h2>\n\nRepresents an instance of a signed in user for a particular app.\n\n## Functions\n\n<Property required={false} deprecated={false} name={\"isSignInPending\"} type={\"function\"}>\n\nDetermines if there is an incoming authentication response.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"handlePendingSignIn\"} type={\"function\"}>\n\nProcesses the response and provides a `userData` object containing the user's identity, BNS username and profile information.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"isUserSignedIn\"} type={\"function\"}>\n\nChecks if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"loadUserData\"} type={\"function\"}>\n\nRetrieves the user's profile data if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"encryptContent\"} type={\"function\"}>\n\nEncrypts user data for secure storage.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"decryptContent\"} type={\"function\"}>\n\nDecrypts user data for secure storage.\n\n</Property>\n\n</div>\n\n<APIExample>\n<Tabs defaultValue=\"pending\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"pending\" className='tab group'>\n <Badge className='badge transition-colors'>Handling pending auth</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"status\" className='tab group'>\n <Badge className='badge transition-colors'>Checking if user is signed in</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"user-data\" className='tab group'>\n <Badge className='badge transition-colors'>Loading data for signed in user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"sign-out\" className='tab group'>\n <Badge className='badge transition-colors'>Signing out a user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"encrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Encrypting user data</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"decrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Decrypting user data</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"pending\">\n ```tsx twoslash\n // @noErrors\n // [!code word:isSignInPending]\n // [!code word:handlePendingSignIn]\n const isPending = userSession.isSignInPending();\n\n if (isPending) {\n userSession.handlePendingSignIn().then(userData => {\n // Do something with userData\n });\n }\n ```\n </TabsContent>\n <TabsContent value='status'>\n ```tsx twoslash\n // @noErrors\n // [!code word:isUserSignedIn]\n const isSignedIn = userSession.isUserSignedIn();\n ```\n </TabsContent>\n <TabsContent value='user-data'>\n ```tsx twoslash\n // @noErrors\n // [!code word:loadUserData]\n const isSignedIn = userSession.isUserSignedIn();\n\n if (isSignedIn) {\n // Do something with the signed in user\n const userData = userSession.loadUserData();\n }\n ```\n </TabsContent>\n <TabsContent value='sign-out'>\n ```tsx twoslash\n // @noErrors\n // [!code word:signUserOut]\n userSession.signUserOut();\n ```\n </TabsContent>\n <TabsContent value='encrypt'>\n ```tsx twoslash\n // @noErrors\n // [!code word:encryptContent]\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n ```\n </TabsContent>\n <TabsContent value='decrypt'>\n ```tsx twoslash\n // @noErrors\n // [!code word:decryptContent]\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n const plainText = await userSession.decryptContent(cipherText);\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n\n<Accordion title={\"Notes\"}>\n Note that encryption here uses the user's private key associated with your app only. If you need to share this data with another app or other users, you should use the equivalent methods from `@stacks/encryption` and provide a custom private key.\n</Accordion>\n\n</Accordions>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`makeAuthRequest`</h2>\n\nThe Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a UserSession to manage user data.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"transitKey\"} type={\"string\"}>\n\nThe authentication payloads are encrypted during transit, the encryption key generated below provides this\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"redirectURI\"} type={\"string\"}>\n\nA URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"manifestUri\"} type={\"string\"}>\n\nSet the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"scopes\"} type={\"string[]\"}>\n\nAdditional permissions the app is requesting\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"auth-request\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"auth-request\" className='tab group'>\n <Badge className='badge transition-colors'>Generate an authentication request</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"auth-request\">\n ```tsx twoslash\n // @noErrors\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // ---cut---\n const authRequest = userSession.makeAuthRequest(\n // ^^^^^^^^^^^^^^^\n transitKey,\n redirectUri,\n manifestUri\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n \n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`lookupProfile`</h2>\n\nLook up a user's profile information by their BNS username.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"username\"} type={\"string\"}>\n\nThe BNS username of the user.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"network\"} type={\"'mainnet' | 'testnet' | 'devnet' | 'mocknet' | StacksNetwork\"}>\n\nDefines the network to connect to. Default is 'mainnet'.\n\n</Property>\n\n\n<Property required={false} deprecated={false} name={\"zoneFileLookupURL\"} type={\"string\"}>\n\nURL to fetch the zone file for the username. This is only needed if the zone file does not reside at the default location on the BNS network.\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"lookup\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"lookup\" className='tab group'>\n <Badge className='badge transition-colors'>Generate an authentication request</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"lookup\">\n ```tsx twoslash\n // @noErrors\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // ---cut---\n const authRequest = userSession.makeAuthRequest(\n // ^^^^^^^^^^^^^^^\n transitKey,\n redirectUri,\n manifestUri\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n \n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n</Root> */}\n\nThis library supports the creation of the following Stacks transaction types:\n\n1. STX token transfer\n2. Smart contract deploy\n3. Smart contract function call\n\n## Key Generation\n\n```typescript\nimport { createStacksPrivateKey, makeRandomPrivKey, getPublicKey } from '@stacks/transactions';\n\n// Random key\nconst privateKey = makeRandomPrivKey();\n// Get public key from private\nconst publicKey = getPublicKey(privateKey);\n\n// Private key from hex string\nconst key = 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01';\nconst privateKey = createStacksPrivateKey(key);\n```\n\n## STX Token Transfer Transaction\n\n```typescript\nimport { makeSTXTokenTransfer, broadcastTransaction, AnchorMode } from '@stacks/transactions';\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n memo: 'test memo',\n nonce: 0n, // set a nonce manually if you don't want builder to fetch from a Stacks node\n fee: 200n, // set a tx fee if you don't want the builder to estimate\n anchorMode: AnchorMode.Any,\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n\n// to see the raw serialized tx\nconst serializedTx = transaction.serialize(); // Uint8Array\nconst serializedTxHex = bytesToHex(serializedTx); // hex string\n\n// broadcasting transaction to the specified network\nconst broadcastResponse = await broadcastTransaction(transaction);\nconst txId = broadcastResponse.txid;\n```\n\n## Smart Contract Deploy Transaction\n\n```typescript\nimport { makeContractDeploy, broadcastTransaction, AnchorMode } from '@stacks/transactions';\nimport { StacksTestnet, StacksMainnet } from '@stacks/network';\nimport { readFileSync } from 'fs';\n\n// for mainnet, use `StacksMainnet()`\nconst network = new StacksTestnet();\n\nconst txOptions = {\n contractName: 'contract_name',\n codeBody: readFileSync('/path/to/contract.clar').toString(),\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network,\n anchorMode: AnchorMode.Any,\n};\n\nconst transaction = await makeContractDeploy(txOptions);\n\nconst broadcastResponse = await broadcastTransaction(transaction, network);\nconst txId = broadcastResponse.txid;\n```\n\n## Smart Contract Function Call\n\n```typescript\nimport {\n makeContractCall,\n broadcastTransaction,\n AnchorMode,\n FungibleConditionCode,\n makeStandardSTXPostCondition,\n bufferCVFromString,\n} from '@stacks/transactions';\nimport { StacksTestnet, StacksMainnet } from '@stacks/network';\n\n// for mainnet, use `StacksMainnet()`\nconst network = new StacksTestnet();\n\n// Add an optional post condition\n// See below for details on constructing post conditions\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 1000000n;\nconst postConditions = [\n makeStandardSTXPostCondition(postConditionAddress, postConditionCode, postConditionAmount),\n];\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [bufferCVFromString('foo')],\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n validateWithAbi: true,\n network,\n postConditions,\n anchorMode: AnchorMode.Any,\n};\n\nconst transaction = await makeContractCall(txOptions);\n\nconst broadcastResponse = await broadcastTransaction(transaction, network);\nconst txId = broadcastResponse.txid;\n```\n\nIn this example we construct a `contract-call` transaction with a post condition. We have set the `validateWithAbi` option to `true`, so the `makeContractCall` builder will attempt to fetch this contracts ABI from the specified Stacks network, and validate that the provided functionArgs match what is described in the ABI. This should help you avoid constructing invalid contract-call transactions. If you would prefer to provide your own ABI instead of fetching it from the network, the `validateWithABI` option also accepts [ClarityABI](https://github.com/blockstack/stacks-transactions-js/blob/master/src/contract-abi.ts#L231) objects, which can be constructed from ABI files like so:\n\n```typescript\nimport { ClarityAbi } from '@stacks/transactions';\nimport { readFileSync } from 'fs';\n\nconst abi: ClarityAbi = JSON.parse(readFileSync('abi.json').toString());\n// For sample abi json see: stacks.js/packages/transactions/tests/abi/test-abi.json\n```\n\n## Sponsoring Transactions\n\nTo generate a sponsored transaction, first create and sign the transaction as the origin. The `sponsored` property in the options object must be set to true.\n\n```typescript\nimport { bytesToHex } from '@stacks/common';\nimport { makeContractCall, BufferCV, AnchorMode, bufferCVFromString } from '@stacks/transactions';\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [bufferCVFromString('foo')],\n fee: 0,\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n validateWithAbi: true,\n sponsored: true,\n anchorMode: AnchorMode.Any,\n};\n\nconst transaction = await makeContractCall(txOptions);\nconst serializedTx = bytesToHex(transaction.serialize());\n```\n\nThe serialized transaction can now be passed to the sponsoring party which will sign the sponsor portion of the transaction and set the fee.\n\n```typescript\nimport {\n sponsorTransaction,\n BytesReader,\n deserializeTransaction,\n broadcastTransaction,\n} from '@stacks/transactions';\nimport { StacksTestnet, StacksMainnet } from '@stacks/network';\n\nconst bytesReader = new BytesReader(Buffer.from(serializedTx, 'hex'));\nconst deserializedTx = deserializeTransaction(bytesReader);\nconst sponsorKey = '770287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01';\nconst fee = 1000n;\n\nconst sponsorOptions = {\n transaction: deserializedTx,\n sponsorPrivateKey: sponsorKey,\n fee,\n sponsorNonce: 0,\n};\n\nconst sponsoredTx = await sponsorTransaction(sponsorOptions);\n\n// for mainnet, use `StacksMainnet()`\nconst network = new StacksTestnet();\n\nconst broadcastResponse = await broadcastTransaction(sponsoredTx, network);\nconst txId = broadcastResponse.txid;\n```\n\n## Supporting multi-signature transactions\n\nTo generate a multi-sig transaction, first create an unsigned transaction.\nThe `numSignatures` and `publicKeys` properties in the options object must be set:\n\n```typescript\nimport {\n makeUnsignedSTXTokenTransfer,\n createStacksPrivateKey,\n deserializeTransaction,\n pubKeyfromPrivKey,\n publicKeyToString,\n TransactionSigner,\n standardPrincipalCV,\n BytesReader,\n AnchorMode,\n} from '@stacks/transactions';\n\nconst recipient = standardPrincipalCV('SP3FGQ8...');\nconst amount = 2500000n;\nconst fee = 0n;\nconst memo = 'test memo';\n\n// private keys of the participants in the transaction\nconst privKeyStrings = ['6d430bb9...', '2a584d89...', 'd5200dee...'];\n\n// create private key objects from string array\nconst privKeys = privKeyStrings.map(createStacksPrivateKey);\n\n// corresponding public keys\nconst pubKeys = privKeyStrings.map(pubKeyfromPrivKey);\n\n// create public key string array from objects\nconst pubKeyStrings = pubKeys.map(publicKeyToString);\n\nconst transaction = await makeUnsignedSTXTokenTransfer({\n recipient,\n amount,\n fee,\n memo,\n numSignatures: 2, // number of signature required\n publicKeys: pubKeyStrings, // public key string array with >= numSignatures elements\n anchorMode: AnchorMode.Any,\n});\n\nconst serializedTx = transaction.serialize();\n```\n\nThis transaction payload can be passed along to other participants to sign. In addition to\nmeeting the numSignatures requirement, the public keys of the parties who did not sign the\ntransaction must be appended to the signature.\n\n```typescript\n// deserialize and sign transaction\nconst bytesReader = new BytesReader(serializedTx);\n// Partially signed or unsigned multi-sig tx can be deserialized to add the required signatures\nconst deserializedTx = deserializeTransaction(bytesReader);\n\nconst signer = new TransactionSigner(deserializedTx);\n\n// first signature\nsigner.signOrigin(privKeys[0]);\n\n// second signature\nsigner.signOrigin(privKeys[1]);\n\n// after meeting the numSignatures requirement, the public\n// keys of the participants who did not sign must be appended\nsigner.appendOrigin(pubKeys[2]);\n\n// the serialized multi-sig tx\nconst serializedSignedTx = deserializedTx.serialize();\n```\n\n## Calling Read-only Contract Functions\n\nRead-only contract functions can be called without generating or broadcasting a transaction. Instead it works via a direct API call to a Stacks node.\n\n```typescript\nimport { bufferCVFromString, callReadOnlyFunction } from '@stacks/transactions';\nimport { StacksTestnet } from '@stacks/network';\n\nconst contractAddress = 'ST3KC0MTNW34S1ZXD36JYKFD3JJMWA01M55DSJ4JE';\nconst contractName = 'kv-store';\nconst functionName = 'get-value';\nconst buffer = bufferCVFromString('foo');\nconst network = new StacksTestnet();\nconst senderAddress = 'ST2F4BK4GZH6YFBNHYDDGN4T1RKBA7DA1BJZPJEJJ';\n\nconst options = {\n contractAddress,\n contractName,\n functionName,\n functionArgs: [buffer],\n network,\n senderAddress,\n};\n\nconst result = await callReadOnlyFunction(options);\n```\n\n## Constructing Clarity Values\n\nBuilding transactions that call functions in deployed clarity contracts requires you to construct valid Clarity Values to pass to the function as arguments. The [Clarity type system](https://github.com/stacksgov/sips/blob/master/sip/sip-002-smart-contract-language.md#clarity-type-system) contains the following types:\n\n- `(tuple (key-name-0 key-type-0) (key-name-1 key-type-1) ...)` : a typed tuple with named fields.\n- `(list max-len entry-type)` : a list of maximum length max-len, with entries of type entry-type\n- `(response ok-type err-type)` : object used by public functions to commit their changes or abort. May be returned or used by other functions as well, however, only public functions have the commit/abort behavior.\n- `(optional some-type)` : an option type for objects that can either be (some value) or none\n- `(buff max-len)` : byte buffer or maximum length max-len.\n- `principal` : object representing a principal (whether a contract principal or standard principal).\n- `bool` : boolean value (`true` or `false`)\n- `int` : signed 128-bit integer\n- `uint`: unsigned 128-bit integer\n\nThis library contains Typescript types and classes that map to the Clarity types, in order to make it easy to construct well-typed Clarity values in Javascript. These types all extend the abstract class `ClarityValue`.\n\n```typescript\nimport {\n trueCV,\n falseCV,\n noneCV,\n someCV,\n intCV,\n uintCV,\n standardPrincipalCV,\n contractPrincipalCV,\n responseErrorCV,\n responseOkCV,\n listCV,\n tupleCV,\n bufferCV,\n} from '@stacks/transactions';\nimport { utf8ToBytes } from '@stacks/common';\n\n// construct boolean clarity values\nconst t = trueCV();\nconst f = falseCV();\n\n// construct optional clarity values\nconst nothing = noneCV();\nconst something = someCV(t);\n\n// construct a buffer clarity value from an existing byte array\nconst bytes = utf8ToBytes('foo'); // Uint8Array(3) [ 102, 111, 111 ]\nconst bufCV = bufferCV(bytes);\n\n// construct signed and unsigned integer clarity values\nconst i = intCV(-10);\nconst u = uintCV(10);\n\n// construct principal clarity values\nconst address = 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B';\nconst contractName = 'contract-name';\nconst spCV = standardPrincipalCV(address);\nconst cpCV = contractPrincipalCV(address, contractName);\n\n// construct response clarity values\nconst errCV = responseErrorCV(trueCV());\nconst okCV = responseOkCV(falseCV());\n\n// construct tuple clarity values\nconst tupCV = tupleCV({\n a: intCV(1),\n b: trueCV(),\n c: falseCV(),\n});\n\n// construct list clarity values\nconst l = listCV([trueCV(), falseCV()]);\n```\n\nIf you develop in Typescript, the type checker can help prevent you from creating wrongly-typed Clarity values. For example, the following code won't compile since in Clarity lists are homogeneous, meaning they can only contain values of a single type. It is important to include the type variable `BooleanCV` in this example, otherwise the typescript type checker won't know which type the list is of and won't enforce homogeneity.\n\n```typescript\nconst l = listCV<BooleanCV>([trueCV(), intCV(1)]);\n```\n\n## Post Conditions\n\nThree types of post conditions can be added to transactions:\n\n1. STX post condition\n2. Fungible token post condition\n3. Non-Fungible token post condition\n\nFor details see: https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-post-conditions\n\n## STX post condition\n\n```typescript\nimport {\n FungibleConditionCode,\n makeStandardSTXPostCondition,\n makeContractSTXPostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\n\nconst standardSTXPostCondition = makeStandardSTXPostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractSTXPostCondition = makeContractSTXPostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount\n);\n```\n\n## Fungible token post condition\n\n```typescript\nimport {\n FungibleConditionCode,\n createAssetInfo,\n makeStandardFungiblePostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardFungiblePostCondition = makeStandardFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst contractFungiblePostCondition = makeContractFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n```\n\n## Non-fungible token post condition\n\n> **Warning**\n> The Stacks blockchain's post-condition processor can NOT check ownership.\n> It checks whether or not a principal **will send** or **will not send** an NFT.\n> Post-conditions can NOT verify anything about the recipient of an asset.\n> If you want to verify conditions about asset recipients, you will need to use [Clarity](https://docs.stacks.co/docs/write-smart-contracts/).\n\n```typescript\nimport {\n NonFungibleConditionCode,\n createAssetInfo,\n makeStandardNonFungiblePostCondition,\n makeContractNonFungiblePostCondition,\n bufferCVFromString,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = NonFungibleConditionCode.DoesNotSend;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-asset';\nconst assetId = bufferCVFromString('test-token-asset-id');\nconst nonFungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardNonFungiblePostCondition = makeStandardNonFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractNonFungiblePostCondition = makeContractNonFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n```\n\n## Conversion of Clarity Values to JSON\n\nClarity Values represent values of Clarity contracts. If a JSON format is required the helper function `cvToJSON` can be used.\n\n```typescript\nimport { cvToJSON, hexToCV } from '@stacks/transactions';\n\ncvToJSON(hexToCV(tx.tx_result.hex));\n```","url":"/docs/stacks/stacks.js/v6/transactions"},"227":{"id":"/docs/stacks/stacks.js/v6/network","title":"@stacks/network","description":"Network and API library for working with Stacks blockchain nodes.","content":"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\nThe Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a UserSession to manage user data.\n\n## Installation\n\n```package-install\n@stacks/network\n```\n\n{/* <Root>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`AppConfig`</h2>\n\nConfiguration data for the current app.\n\nOn browser platforms, creating an instance of this class without any arguments will use `window.location.origin` as the app domain. On non-browser platforms, you need to specify an app domain as the second argument.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"scopes\"} type={\"string[]\"}>\n\nAn array of strings representing permissions requested by the app.\n\n<span>Default: `['store_write']`</span>\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"appDomain\"} type={\"string\"}>\n\nStacks apps are uniquely identified by their app domain.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"redirectPath\"} type={\"string\"}>\n\nPath on app domain to redirect users to after authentication. The authentication response token will be postpended in a query.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"manifestPath\"} type={\"string\"}>\n\nPath relative to app domain of app's manifest file.\n\n<span>Default: `\"/manifest.json\"`</span>\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"coreNode\"} type={\"string\"}>\n\nThe URL of Stacks core node to use for this app. If this is not specified, the default core node will be used.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"authenticatorURL\"} type={\"string\"}>\n\nThe URL of a web-based authenticator to use in the event the user doesn't have Stacks installed on their machine. If this is not specified, the current default in this library will be used.\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"config\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"config\" className='tab group'>\n <Badge className='badge transition-colors'>Setting basic app permissions</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>With advanced scopes</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"config\">\n ```tsx twoslash\n // @noErrors\n // [!code word:AppConfig]\n import { AppConfig } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n const appConfig = new AppConfig(\n ['store_write'],\n appDomain\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n\n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```tsx twoslash\n // @noErrors\n // [!code word:publish_data]\n // [!code word:email]\n import { AppConfig } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n const appConfig = new AppConfig(\n ['store_write', 'publish_data', 'email'],\n appDomain\n );\n ```\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n\n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`UserSession`</h2>\n\nRepresents an instance of a signed in user for a particular app.\n\n## Functions\n\n<Property required={false} deprecated={false} name={\"isSignInPending\"} type={\"function\"}>\n\nDetermines if there is an incoming authentication response.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"handlePendingSignIn\"} type={\"function\"}>\n\nProcesses the response and provides a `userData` object containing the user's identity, BNS username and profile information.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"isUserSignedIn\"} type={\"function\"}>\n\nChecks if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"loadUserData\"} type={\"function\"}>\n\nRetrieves the user's profile data if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"encryptContent\"} type={\"function\"}>\n\nEncrypts user data for secure storage.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"decryptContent\"} type={\"function\"}>\n\nDecrypts user data for secure storage.\n\n</Property>\n\n</div>\n\n<APIExample>\n<Tabs defaultValue=\"pending\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"pending\" className='tab group'>\n <Badge className='badge transition-colors'>Handling pending auth</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"status\" className='tab group'>\n <Badge className='badge transition-colors'>Checking if user is signed in</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"user-data\" className='tab group'>\n <Badge className='badge transition-colors'>Loading data for signed in user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"sign-out\" className='tab group'>\n <Badge className='badge transition-colors'>Signing out a user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"encrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Encrypting user data</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"decrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Decrypting user data</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"pending\">\n ```tsx twoslash\n // @noErrors\n // [!code word:isSignInPending]\n // [!code word:handlePendingSignIn]\n const isPending = userSession.isSignInPending();\n\n if (isPending) {\n userSession.handlePendingSignIn().then(userData => {\n // Do something with userData\n });\n }\n ```\n </TabsContent>\n <TabsContent value='status'>\n ```tsx twoslash\n // @noErrors\n // [!code word:isUserSignedIn]\n const isSignedIn = userSession.isUserSignedIn();\n ```\n </TabsContent>\n <TabsContent value='user-data'>\n ```tsx twoslash\n // @noErrors\n // [!code word:loadUserData]\n const isSignedIn = userSession.isUserSignedIn();\n\n if (isSignedIn) {\n // Do something with the signed in user\n const userData = userSession.loadUserData();\n }\n ```\n </TabsContent>\n <TabsContent value='sign-out'>\n ```tsx twoslash\n // @noErrors\n // [!code word:signUserOut]\n userSession.signUserOut();\n ```\n </TabsContent>\n <TabsContent value='encrypt'>\n ```tsx twoslash\n // @noErrors\n // [!code word:encryptContent]\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n ```\n </TabsContent>\n <TabsContent value='decrypt'>\n ```tsx twoslash\n // @noErrors\n // [!code word:decryptContent]\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n const plainText = await userSession.decryptContent(cipherText);\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n\n<Accordion title={\"Notes\"}>\n Note that encryption here uses the user's private key associated with your app only. If you need to share this data with another app or other users, you should use the equivalent methods from `@stacks/encryption` and provide a custom private key.\n</Accordion>\n\n</Accordions>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`makeAuthRequest`</h2>\n\nThe Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a UserSession to manage user data.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"transitKey\"} type={\"string\"}>\n\nThe authentication payloads are encrypted during transit, the encryption key generated below provides this.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"redirectURI\"} type={\"string\"}>\n\nA URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"manifestUri\"} type={\"string\"}>\n\nSet the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"scopes\"} type={\"string[]\"}>\n\nAdditional permissions the app is requesting.\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"auth-request\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"auth-request\" className='tab group'>\n <Badge className='badge transition-colors'>Generate an authentication request</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"auth-request\">\n ```tsx twoslash\n // @noErrors\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // ---cut---\n const authRequest = userSession.makeAuthRequest(\n // ^^^^^^^^^^^^^^^\n transitKey,\n redirectUri,\n manifestUri\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n\n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`lookupProfile`</h2>\n\nLook up a user's profile information by their BNS username.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"username\"} type={\"string\"}>\n\nThe BNS username of the user.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"network\"} type={\"'mainnet' | 'testnet' | 'devnet' | 'mocknet' | StacksNetwork\"}>\n\nDefines the network to connect to. Default is 'mainnet'.\n\n</Property>\n\n\n<Property required={false} deprecated={false} name={\"zoneFileLookupURL\"} type={\"string\"}>\n\nURL to fetch the zone file for the username. This is only needed if the zone file does not reside at the default location on the BNS network.\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"lookup\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"lookup\" className='tab group'>\n <Badge className='badge transition-colors'>Generate an authentication request</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"lookup\">\n ```tsx twoslash\n // @noErrors\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // ---cut---\n const authRequest = userSession.makeAuthRequest(\n // ^^^^^^^^^^^^^^^\n transitKey,\n redirectUri,\n manifestUri\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n\n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n</Root> */}\n\n\n## Usage\n\n## Create a Stacks mainnet, testnet or mocknet network\n\n```typescript\nimport { StacksMainnet, StacksTestnet, StacksMocknet } from '@stacks/network';\n\nconst network = new StacksMainnet();\n\nconst testnet = new StacksTestnet();\n\nconst mocknet = new StacksMocknet();\n```\n\n## Set a custom node URL\n\n```typescript\nconst network = new StacksMainnet({ url: 'https://www.mystacksnode.com/' });\n```\n\n## Check if network is mainnet\n\n```typescript\nconst isMainnet = network.isMainnet();\n```\n\n## Network usage in transaction building\n\n```typescript\nimport { makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst txOptions = {\n network,\n recipient: 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26',\n amount: new BigNum(12345),\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n```\n\n## Use the built-in API key middleware\n\nSome Stacks APIs make use API keys to provide less rate-limited plans.\n\n```typescript\nimport { createApiKeyMiddleware, createFetchFn, StacksMainnet } from '@stacks/network';\nimport { broadcastTransaction, getNonce, makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst myApiMiddleware = createApiKeyMiddleware('example_e8e044a3_41d8b0fe_3dd3988ef302');\nconst myFetchFn = createFetchFn(myApiMiddleware); // middlewares can be used to create a new fetch function\nconst myMainnet = new StacksMainnet({ fetchFn: myFetchFn }); // the fetchFn options can be passed to a StacksNetwork to override the default fetch function\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n memo: 'some memo',\n anchorMode: AnchorMode.Any,\n network: myMainnet, // make sure to pass in the custom network object\n};\nconst transaction = await makeSTXTokenTransfer(txOptions); // fee-estimation will use the custom fetchFn\n\nconst response = await broadcastTransaction(transaction, myMainnet); // make sure to broadcast via the custom network object\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', myMainnet);\n```\n\n## Use custom middleware\n\nMiddleware can be used to hook into network calls before sending a request or after receiving a response.\n\n```typescript\nimport { createFetchFn, RequestContext, ResponseContext, StacksTestnet } from '@stacks/network';\nimport { broadcastTransaction, getNonce, makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst preMiddleware = (ctx: RequestContext) => {\n ctx.init.headers = new Headers();\n ctx.init.headers.set('x-foo', 'bar'); // override headers and set new `x-foo` header\n};\nconst postMiddleware = (ctx: ResponseContext) => {\n console.log(await ctx.response.json()); // log response body as json\n};\n\nconst fetchFn = createFetchFn({ pre: preMiddleware, post: preMiddleware }); // a middleware can contain `pre`, `post`, or both\nconst network = new StacksTestnet({ fetchFn });\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', network);\n```\n\n## Get various API URLs\n\n```typescript\nconst txBroadcastUrl = network.getBroadcastApiUrl();\n\nconst feeEstimateUrl = network.getTransferFeeEstimateApiUrl();\n\nconst address = 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26';\nconst accountInfoUrl = network.getAccountApiUrl(address);\n\nconst contractName = 'hello_world';\nconst abiUrl = network.getAbiApiUrl(address, contractName);\n\nconst functionName = 'hello';\nconst readOnlyFunctionCallUrl = network.getReadOnlyFunctionCallApiUrl(\n address,\n contractName,\n functionName\n);\n\nconst nodeInfoUrl = network.getInfoUrl();\n\nconst blockTimeUrl = network.getBlockTimeInfoUrl();\n\nconst poxInfoUrl = network.getPoxInfoUrl();\n```\n","url":"/docs/stacks/stacks.js/v6/network"},"228":{"id":"/docs/stacks/stacks.js","title":"Overview","description":"A collection of JavaScript libraries to build web applications on Stacks.","content":"\nimport { Globe } from 'lucide-react';\nimport { Card, SecondaryCard } from '@/components/card';\n\nStacks.js is a JavaScript/TypeScript SDK for building on the Stacks blockchain. It's a collection of various JavaScript libraries that allow you to broadcast a transaction with the Stacks blockchain, construct post-conditions, and more. Some of the most important building blocks, all in one place.\n\nStacks.js is separated into many smaller packages, which can be installed individually. Most packages are published to npm under the `@stacks` scope.\n\nFor more details, check out out our [installation guide](./stacks.js/installation).\n\n<SecondaryCard\n icon={<Globe/>}\n href=\"/stacks/connect\"\n title=\"Build a Stacks web app\"\n description=\"Integrate Stacks.js into your web apps with Stacks Connect.\"\n tag=\"Stacks Connect\"\n/>\n\n## Guides\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/stacks.js/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Create and broadcast transactions using Stacks.js builder and helper functions.\"\n />\n <SecondaryCard\n href=\"/stacks/stacks.js/guides/post-conditions\"\n title=\"Constructing post-conditions\"\n description=\"Build post-conditions into your smart contracts and safe-guard your users.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks Connect](/stacks/connect)**: Interact with the Stacks blockchain with your wallet extension.\n- **[Hiro Platform](/stacks/platform)**: A developer platform for building, deploying and scaling Bitcoin apps.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Stacks.js?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#stacks-js</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n","url":"/docs/stacks/stacks.js"},"229":{"id":"/docs/stacks/stacks.js/roadmap","title":"Announcing Stacks.js v7","description":"Discover the future of Stacks.js.","content":"\nRead about what's new in the latest version of Stacks.js.\nThis version comes with a lot of improvements and new features, but it also adds some breaking changes.\n\nWant to use these latest features? Install packages using the `latest` tag:\n\n```package-install\n@stacks/{common,network,transactions}@latest\n```\n\n### Strings\n_aka, reducing wrapper types and magic numbers_\n\n<img src=\"/string-meme.png\" className=\"max-w-[300px] mx-auto\" alt=\"String Meme\" />\n\n#### Problem\n\nMany Stacks.js representations we're not debuggable for developers.\nLogging Clarity values resulted in unintelligible `type` and `value` numbers, confusing even experienced Stacks developers.\nPrivate keys were also included unnecessary `type` properties with raw byte arrays.\n\"Magic\" numbers are all accross the codebase (as they are needed for serialization), but these shouldn't be part of the \"public\" interfaces.\n\n#### Solution\n\nWe switched to a system where most values will be represented as strings.\nThis makes them easier to inspect and diff.\n\nClarity example, [Read more](#clarity-representation)\n```ts\n// !diff -\n{ type: 1, value: 12n }\n// !diff +\n{ type: \"uint\", value: \"12\" }\n```\n\nPrivate key example, [Read more](/stacks/stacks.js/concepts/private-keys)\n```ts\nsignMessageHashRsv({\n // !diff -\n privateKey: createStacksPrivateKey(\"f5a3...2801\"), // { compressed: true, data: [245,163,...] }\n // !diff +\n privateKey: \"f5a3...2801\"\n})\n```\n\nThis breaks the signatures of many functions:\n\n- `signMessageHashRsv`, `signWithKey` now return the message signature as a `string` directly.\n- `nextSignature`, `nextVerification`, `publicKeyFromSignatureVrs`, `publicKeyFromSignatureRsv` now take in the message signature as a `string`.\n\n### Stacks Network\n\nFor a long time, Stacks.js \"network\" instances were used for \"networking\" and \"network\" definitions.\nThis caused confusion, as most users use `mainnet` or `testnet` for most of their interactions.\nThe \"networking\" (aka fetching) logic is now more clearly customizable.\n\nFrom now on \"network\" objects are static (aka constants) and don't require instantiation.\n\nThese changes should make it more obvious when functions are using network object properties vs when they are doing actual networking.\n\nIn most cases, developers shouldn't need the `@stacks/network` package anymore.\nThe `network` parameter can be used with string literals: `'mainnet'`, `'testnet'`, `'devnet'`, `'mocknet'`.\n\n```ts\nimport { StacksTestnet } from '@stacks/network';\n\nmakeSTXTokenTransfer({\n // !diff -\n network: new StacksTestnet(),\n // !diff +\n network: 'testnet'\n // ...\n});\n```\n\n\n#### Stacks Network `client`\n\nIn case a function also takes a `client` parameter, it will be doing actual networking.\nThis way you can use string literal networks with a custom node.\nYou can also still use network objects with the `client` parameter as part of the network object.\nThe `client` parameter can be any object-like structure containing a `baseUrl` and `fetch` property.\n\n- The `baseUrl` property should be a string containing the base URL of the Stacks node you want to use.\n- The `fetch` property can be any (fetch)[https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API] compatible function.\n\nThe following diffs show examples of how to migrate to the new pattern.\n\n```ts\nconst transaction = await makeSTXTokenTransfer({\n// !diff - \nnetwork: new StacksTestnet({ url: \"mynode-optional.com\", fetchFn: myFetch }),\n// !diff +\nnetwork: 'testnet', // optional, defaults to 'mainnet'\n// !diff +\nclient: { baseUrl: \"mynode-optional.com\", fetch: myFetchOptional } // optional, defaults inferred from network\n});\n```\n\nThe `client` property is also part of the network object.\nYou can still keep ONE single network object for your whole application.\n\n```ts\n// !diff -\nimport { StacksTestnet } from '@stacks/network';\n// !diff +\nimport { STACKS_TESTNET } from '@stacks/network';\n\n// !diff -\nconst network = new StacksTestnet({ url: \"https://mynode.com\", fetchFn: myFetch });\n// !diff +\nconst network = {\n // !diff +\n ...STACKS_TESTNET, // extending a static object\n // !diff +\n client: { baseUrl: \"https://mynode.com\", fetch: myFetch }\n // !diff +\n};\n```\n\n### A To B Helpers\n\nWhere possible, Stacks.js now offers function to translate between different representations and concepts.\nThe naming is consistent across the board and uses `A To B` naming.\nFor example, if we have a private key and want to get the address, we can use the `privateKeyToAddress` function.\n\n```ts\nimport { privateKeyToAddress } from \"@stacks/transactions\";\n\nconst privateKey = \"f5a3...2801\";\nconst address = privateKeyToAddress(privateKey); // SP1MXSZF4NFC8JQ1TTYGEC2WADMC7Y3GHVZYRX6RF\n```\n\n### Fetch Methods\n\nTo make it easier to discover all fetching functions, they now all start with `fetch`.\n\nThe following methods were renamed:\n\n- `estimateFee` → `fetchFeeEstimate`\n- `estimateTransfer` → `fetchFeeEstimateTransfer`\n- `estimateTransaction` → `fetchFeeEstimateTransaction`\n- `getAbi` → `fetchAbi`\n- `getNonce` → `fetchNonce`\n- `getContractMapEntry` → `fetchContractMapEntry`\n- `callReadOnlyFunction` → `fetchCallReadOnlyFunction`\n\n`broadcastTransaction` wasn't renamed to highlight the uniqueness of the method.\nNamely, the node/API it is sent to will \"broadcast\" the transaction to the mempool and is more of an irreversible action.\n\n### Clarity Representation\n\nThe `ClarityType` enum was replaced by a more readable version.\nThe previous (wire format compatible) enum is still available as `ClarityWireType`.\nThese types are considered somewhat internal and shouldn't cause breaking changes for most use-cases.\n\nThe property holding the value of the data type is now called `value` in all cases.\nPreviously, there was a mix of `value`, `list`, `buffer` etc.\nFor `bigint` values, the type of the `value` property is a now `string`, for better serialization compatibility.\n\n```ts\n{\n // !diff -\n type: 1,\n // !diff +\n type: \"uint\",\n // !diff -\n value: 12n,\n // !diff +\n value: \"12\",\n}\n```\n\n```ts\n{\n // !diff -\n type: 11,\n // !diff +\n type: \"list\",\n // !diff -\n list: [ ... ],\n // !diff +\n value: [ ... ],\n}\n```\n\n### Post-conditions\n\nThe old `PostCondition` type was renamed to `PostConditionWire`.\nA new human-readable `PostCondition` type was introduced in its place.\n\nBelow is an example of the new `PostCondition` types.\n\n```ts\n// STX post-condition\nconst stxPostCondition: StxPostCondition = {\n type: 'stx-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'gte',\n amount: '100',\n};\n\n// Fungible token post-condition\nconst ftPostCondition: FungiblePostCondition = {\n type: 'ft-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'eq',\n amount: '100',\n asset: 'SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-ft-token::my-token',\n};\n\n// Non-fungible token post-condition\nconst nftPostCondition: NonFungiblePostCondition = {\n type: 'nft-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'sent',\n asset: 'SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-nft::my-asset',\n assetId: Cl.uint(602),\n};\n```\n\n### Advanced\n\n#### serialize methods\n\nExisting methods now take or return **hex-encoded strings** _instead_ of `Uint8Array`s.\n\n> If you were already converting returned bytes to hex-strings in your code, you can now skip the conversion step — hex-strings are the new default.\n\nFor easier migrating, renaming the following methods is possible to keep the previous behavior:\n\n- `StacksTransaction.serialize` → `StacksTransaction.serializeBytes`\n- `serializeCV` → `serializeCVBytes`\n- `serializeAddress` → `serializeAddressBytes`\n- `deserializeAddress` → `deserializeAddressBytes`\n- `serializeLPList` → `serializeLPListBytes`\n- `deserializeLPList` → `deserializeLPListBytes`\n- `serializeLPString` → `serializeLPStringBytes`\n- `deserializeLPString` → `deserializeLPStringBytes`\n- `serializePayload` → `serializePayloadBytes`\n- `deserializePayload` → `deserializePayloadBytes`\n- `serializePublicKey` → `serializePublicKeyBytes`\n- `deserializePublicKey` → `deserializePublicKeyBytes`\n- `serializeStacksMessage` → `serializeStacksMessageBytes`\n- `deserializeStacksMessage` → `deserializeStacksMessageBytes`\n- `serializeMemoString` → `serializeMemoStringBytes`\n- `deserializeMemoString` → `deserializeMemoStringBytes`\n- `serializeTransactionAuthField` → `serializeTransactionAuthFieldBytes`\n- `deserializeTransactionAuthField` → `deserializeTransactionAuthFieldBytes`\n- `serializeMessageSignature` → `serializeMessageSignatureBytes`\n- `deserializeMessageSignature` → `deserializeMessageSignatureBytes`\n- `serializePostCondition` → `serializePostConditionBytes`\n- `deserializePostCondition` → `deserializePostConditionBytes`\n- `serializeStacksMessage` → `serializeStacksWireBytes`\n- `deserializeStacksMessage` → `deserializeStacksWireBytes`\n\n#### Asset Helper Methods\n\nThe following interfaces and methods were renamed:\n\n- `AssetInfo` → `Asset`\n- `StacksWireType.AssetInfo` → `StacksWireType.Asset`\n- `createAssetInfo` → `createAsset`\n- `parseAssetInfoString` → `parseAssetString`\n\n#### CLI\n\n- Removed the `authenticator` method for legacy Blockstack authentication.\n\n#### Triplesec\n\nSupport for encrypting/decrypting mnemonics with `triplesec` was removed.\nThis impacts the methods: `decrypt`, `decryptMnemonic`, and `decryptLegacy`.\nMake sure to update your code to if mnemonics are stored somewhere encrypted using the legacy method.\n\n#### WireType\n\nRenamed internals to avoid confusion between \"message\" and wire-format for serialization.\nThis is only used for advanced serialization use-cases internally and should not be needed for most users.\n\n- `StacksMessage` → `StacksWire`\n- `StacksMessageType` → `StacksWireType`\n- `serializeStacksMessage` → `serializeStacksWireBytes`\n- `deserializeStacksMessage` → `deserializeStacksWireBytes`\n\nMore types were renamed to indicate use for serialization to _wire-format_:\n\n- `MessageSignature` → `MessageSignatureWire`\n- `StacksPublicKey` → `PublicKeyWire`\n- `TransactionAuthField` → `TransactionAuthFieldWire`\n- `Asset` → `AssetWire`\n- `Address` → `AddressWire`\n- `PostCondition` → `PostConditionWire`\n- `PostConditionPrincipal` → `PostConditionPrincipalWire`\n- `STXPostCondition` → `STXPostConditionWire`\n- `FungiblePostCondition` → `FungiblePostConditionWire`\n- `NonFungiblePostCondition` → `NonFungiblePostConditionWire`\n- `LengthPrefixedString` → `LengthPrefixedStringWire`\n- `CoinbasePayload` → `CoinbasePayloadWire`\n- `PoisonPayload` → `PoisonPayloadWire`\n- `SmartContractPayload` → `SmartContractPayloadWire`\n- `TokenTransferPayload` → `TokenTransferPayloadWire`\n- `VersionedSmartContractPayload` → `VersionedSmartContractPayloadWire`\n- `NakamotoCoinbasePayload` → `NakamotoCoinbasePayloadWire`\n- `TenureChangePayload` → `TenureChangePayloadWire`\n- `StandardPrincipal` → `StandardPrincipalWire`\n- `ContractPrincipal` → `ContractPrincipalWire`\n\n#### Signed BigInt\n\nThe `intToBigInt` method no longer supports two's complement signed integers and removed the `signed` boolean parameter.\nThis likely was a misunderstood and unused feature.\n\n#### Refactorings\n\n- `AddressHashMode`: The `Serialize` prefixes were removed for brevity.\n- `makeRandomPrivKey` was renamed to `randomPrivateKey` and now returns a compressed private key.\n- `generateSecretKey` was renamed to `randomSeedPhrase`.\n\n<Callout>\n**Have an idea?** Please let us know on [Discord #stacks-js](https://stacks.chat) or open an issue on [Github](https://github.com/hirosystems/stacks.js/issues/new/choose).\n</Callout>\n","url":"/docs/stacks/stacks.js/roadmap"},"230":{"id":"/docs/stacks/stacks.js/examples/broadcast-transactions","title":"Broadcast transactions","description":"Create and broadcast transactions to the Stacks blockchain network using Stacks.js.","content":"\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nThe process of broadcasting transactions is fundamental for interacting with blockchains, whether you're transferring tokens, deploying contracts, or executing contract functions.\n\nIn this guide, you will learn how to:\n\n1. [Install the necessary packages for building and broadcasting transactions](#setup-and-installation)\n2. [Build different types of transactions](#create-a-transaction)\n3. [Sign and broadcast those transactions to the Stacks blockchain](#broadcasting-the-transaction)\n4. [Process and handle the results](#handle-the-results)\n\n{/* <Callout title=\"Example Repo\">To see this guide in action, check out a full example [here](https://github.com/hiro-so/stacks-connect-example).</Callout> */}\n\n---\n\n## Setup and installation\n\nInstall the required packages to start building and broadcasting transactions.\n\n```package-install\n@stacks/network @stacks/transactions @stacks/connect\n```\n\n- **`@stacks/network`**: Used to interact with the Stacks blockchain network.\n- **`@stacks/transactions`**: Used to build the transactions.\n- **`@stacks/connect`**: Used to authenticate users and broadcast the transactions.\n\n## Create a transaction\n\nThere are three types of transactions:\n\n- STX transfer\n- Contract deployment\n- Contract execution\n\n<Tabs defaultValue=\"transfer\">\n <TabsList className='flex flex-wrap md:w-max'>\n <TabsTrigger value=\"transfer\" className='tab group'>\n <Badge variant='outline' className='badge transition-colors hover:text-neutral-90 dark:group-hover:text-white'>STX transfer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"deploy\" className='tab group'>\n <Badge variant='outline' className='badge transition-colors hover:text-neutral-90 dark:group-hover:text-white'>Contract deployment</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"execute\" className='tab group'>\n <Badge variant='outline' className='badge transition-colors hover:text-neutral-90 dark:group-hover:text-white'>Contract execution</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"transfer\">\n To transfer STX, use the `makeSTXTokenTransfer` function provided by the `@stacks/transactions` package:\n\n ```ts stx-transfer.ts -cn\n import { broadcastTransaction, makeSTXTokenTransfer } from \"@stacks/transactions\";\n\n const transaction = await makeSTXTokenTransfer({\n recipient: \"SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159\",\n amount: 12345n,\n senderKey:\n \"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601\",\n network: \"devnet\",\n });\n ```\n\n This builds a STX token transfer transaction. The `makeSTXTokenTransfer` function takes parameters like the `recipient` address, `amount` to transfer, and the sender's private key, ie `senderKey`.\n\n Several parameters are available for calling `makeSTXTokenTransfer`. To learn more, check out our [transactions reference page](/stacks/stacks.js/packages/transactions).\n\n </TabsContent>\n <TabsContent value=\"deploy\">\n To deploy a contract, use the `makeContractDeploy` function provided by the `@stacks/transactions` package:\n\n ```ts contract-deploy.ts -cn\n import { broadcastTransaction, makeContractDeploy } from '@stacks/transactions';\n\n const transaction = await makeContractDeploy({\n contractName: 'hello-world',\n codeBody: `(define-public (hello)\n (ok \"Hello, world!\"))`,\n senderKey: '753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601',\n network: \"testnet\",\n });\n ```\n\n This builds a contract deployment transaction. The `makeContractDeploy` function takes parameters like the `contractName`, `codeBody`, and the sender's private key, ie `senderKey`.\n\n Several parameters are available for calling `makeContractDeploy`. To learn more, check out our [transactions reference page](/stacks/stacks.js/packages/transactions).\n\n </TabsContent>\n <TabsContent value=\"execute\">\n To execute a contract function, use the `makeContractCall` function provided by the `@stacks/transactions` package:\n\n ```ts function-call.ts -cn\n import {\n broadcastTransaction,\n bufferCVFromString,\n Cl,\n makeContractCall,\n Pc,\n } from \"@stacks/transactions\";\n\n const postCondition = Pc.principal(\"SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE\")\n .willSendEq(1000000n)\n .ustx();\n\n const transaction = await makeContractCall({\n contractAddress: \"SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X\",\n contractName: \"contract_name\",\n functionName: \"contract_function\",\n functionArgs: [Cl.bufferFromAscii(\"foo\")],\n senderKey:\n \"b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01\",\n validateWithAbi: true,\n network: \"testnet\",\n postConditions: [postCondition],\n });\n ```\n\n This builds a contract function call transaction. The `makeContractCall` function takes parameters like the `contractAddress`, `contractName`, `functionName`, `functionArgs`, `senderKey`, `validateWithAbi`, `network`, `postConditions`, and `anchorMode`.\n\n Several parameters are available for calling `makeContractCall`. To learn more, check out our [transactions reference page](/stacks/stacks.js/packages/transactions).\n\n </TabsContent>\n</Tabs>\n\n## Broadcasting the transaction\n\nAfter building the transaction, broadcast it to the Stacks blockchain network using the `broadcastTransaction` function from the `@stacks/transactions` package.\n\n1. Pass in the transaction object you created in the previous step to the `broadcastTransaction` function.\n2. Handle the response by logging the response object.\n\n```ts -cn\nimport { broadcastTransaction } from '@stacks/transactions';\n\nconst broadcastResponse = await broadcastTransaction({ transaction });\n```\n\nThis code sends the signed transaction to the Stacks blockchain. The `broadcastTransaction` function returns a response containing the transaction ID, which can be used to track the transaction on the blockchain.\n\n## Handle the results\n\nHandle the transaction results by checking the transaction status and responding accordingly.\n\n```ts -cn\nif (broadcastResponse.success) {\n console.log('Transaction successful with ID:', broadcastResponse.txid);\n} else {\n console.error('Transaction failed with error:', broadcastResponse.error);\n}\n```\n\nThis checks if the transaction was successful and logs the `txid`.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/stacks.js/guides/post-conditions\"\n title=\"Deep dive into post-conditions\"\n description=\"Learn how to use post-conditions to secure your smart contracts.\"\n />\n <Card\n href=\"/stacks/stacks.js/packages/transactions\"\n title=\"API References\"\n description=\"Dive into the API references for Stacks.js.\"\n />\n</Cards>","url":"/docs/stacks/stacks.js/examples/broadcast-transactions"},"231":{"id":"/docs/stacks/stacks.js/examples/post-conditions","title":"Deep dive into post-conditions","description":"This guide explains how to use post-conditions to secure your smart contracts.","content":"\nimport { Badge } from '@/components/ui/badge';\n\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nPost-conditions in Stacks transactions provide an additional layer of security. They ensure that transactions execute as expected without requiring the user to know the underlying smart contract code.\n\nIn this guide, you will learn how to:\n\n1. [Construct post-conditions](#constructing-post-conditions).\n2. [Use post-conditions](#using-post-conditions).\n3. [Set the post-condition mode](#setting-the-post-condition-mode).\n4. [Usage examples](#usage-examples).\n\n---\n\n## Constructing post-conditions\n\nIn Stacks.js, post-conditions can be constructed using the Pc helpers. These are inspired by Behavior Driven Development (BDD).\n\nStart with the `Pc.principal` initializer to specify the address of the principal that will be verified in the post-condition. Then auto-complete the rest of the post-condition.\n\n## Using post-conditions\n\nPost-conditions can be added to contract calls and FT/NFT transfers to ensure assets are transferred as specified.\n\nFor instance, the following post-condition ensures that the principal initiating the transaction must send exactly 1000 uSTX, or else the transaction will abort.\n\n```ts -cn\nimport { Pc } from '@stacks/transactions';\n\nconst postCondition = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')\n .willSendEq(1000)\n .ustx();\n```\n\n<Accordions>\n <Accordion title=\"All transfer methods\">\n STX/FT\n\n `.willSendEq(amount: number)` ensures that the amount to be sent is **exactly** the specified value.\n \n `.willSendGte(amount: number)` ensures that the amount to be sent is **greater than or equal** to the specified value.\n \n `.willSendGt(amount: number)` ensures that the amount to be sent is **greater than** the specified value.\n \n `.willSendLte(amount: number)` ensures that the amount to be sent is **less than or equal** to the specified value.\n \n `.willSendLt(amount: number)` ensures that the amount to be sent is **less than** the specified value.\n\n `.ustx()` to specify uSTX as the FT asset _(ends the builder)_\n\n `.ft(contract: string, tokenName: string)` to specify a specific FT asset _(ends the builder)_\n\n ---\n \n NFT\n\n `.willSendAsset()` ensures that an asset should **be sent**.\n \n `.willNotSendAsset()` to specify an asset should **not be sent**\n </Accordion>\n</Accordions>\n\n## Setting the post-condition mode\n\nWhen creating a transaction, the mode of the transaction can be set to `Allow` or `Deny` to specify whether unspecified asset transfers are permitted.\n\n```ts -n\nimport { PostConditionMode } from '@stacks/transactions';\n\nconst tx = await makeContractCall({\n // ...\n postConditionMode: PostConditionMode.Allow,\n // OR\n postConditionMode: PostConditionMode.Deny,\n // ...\n});\n```\n\nEssentially, the `postConditionMode` is what tells the Stacks node whether to require (`Deny`) or ignore (`Allow`) the post-conditions when evaluating the transaction.\n\n## Usage examples\n\n### Amount uSTX sent\n\nConstruct a post-condition for a certain amount of uSTX to be sent.\n\n```ts -cn\nimport { Pc } from '@stacks/transactions';\n\nconst postCondition = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')\n .willSendEq(1000)\n .ustx();\n```\n\n### Amount FT sent\n\nConstruct a post-condition for a certain amount of a specific FT to be sent.\n\n```ts -cn\nimport { Pc } from '@stacks/transactions';\n\nconst postCondition = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6.token-ft')\n .willSendGte(500)\n .ft('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6.token-ft', 'token');\n```\n\n### Amount NFT sent / not sent\n\nConstruct a post-condition for sending / not-sending a specific NFT.\n\n```ts -cn\nimport { Pc } from '@stacks/transactions';\n\nconst postCondition = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')\n .willNotSendAsset()\n .nft('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6.token-nft::token', Cl.uint(12));\n```\n\n### Amount SFT sent / not sent\n\nConstruct a post-condition for sending / not-sending a specific SFT (Semi-fungible token).\n\n```ts -cn\nimport { Cl, Pc } from '@stacks/transactions';\n\nconst postConditionForNFT = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')\n.willSendAsset()\n.nft(\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.semi-fungible-token::semi-fungible-token-id\",\n Cl.tuple({ \"token-id\": Cl.uint(1), owner: Cl.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6') })\n);\n\nconst postConditionForFT = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')\n.willSendEq(500)\n.ft(\"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.semi-fungible-token\", \"semi-fungible-token\");\n```\n\n<Callout title=\"Note\">\nThe previous builders (`makeStandardSTXPostCondition`, `makeStandardFungiblePostCondition`, etc) were removed in `v7.0.0`.\n</Callout>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/stacks.js/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to broadcast transactions with Stacks.js.\"\n />\n <Card\n href=\"/stacks/stacks.js/packages/transactions\"\n title=\"API References\"\n description=\"Dive deeper into the API references for the Stacks.js transactions package.\"\n />\n</Cards>","url":"/docs/stacks/stacks.js/examples/post-conditions"},"232":{"id":"/docs/stacks/stacks.js/examples/use-with-react-native","title":"Using Stacks.js with React Native","description":"Learn how to use Stacks.js with React Native.","content":"\nimport { Badge } from '@/components/ui/badge';\n\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nUsing Stacks.js with React Native allows you to integrate Stacks blockchain functionalities into mobile applications.\n\nIn this guide, you will learn how to:\n\n1. [Set up the Expo project](#set-up-the-expo-project).\n2. [Install necessary dependencies](#install-necessary-dependencies).\n3. [Add NodeJS polyfills](#add-nodejs-polyfills).\n4. [Add global polyfills](#add-global-polyfills).\n5. [Use Stacks.js in the project](#use-stacksjs-in-the-project).\n\n{/* <Callout>To see this guide in action, check out a full example [here](https://github.com/hirosystems/stacks.js-react-native-expo-51).</Callout> */}\n\n---\n\n## Set up the Expo project\n\nStart by creating a new Expo project using `create-expo-app`.\n\n```terminal\n$ npx create-expo-app@latest\n```\n\nThis will generate a boilerplate Expo project. You can run the project with `npm start` and connect a mobile device for previewing via the shown QR code.\n\n## Install necessary dependencies\n\nInstall Stacks.js libraries along with other dependencies needed for polyfilling browser-specific and NodeJS-specific APIs.\n\n```terminal\n$ npm install @stacks/transactions @stacks/wallet-sdk\n$ npm install --save-dev buffer process react-native-get-random-values text-encoding readable-stream crypto-browserify @peculiar/webcrypto\n```\n\n## Add NodeJS polyfills\n\nModify the project's Metro configuration to include polyfills for missing NodeJS modules.\n\n```terminal\n$ npx expo customize metro.config.js\n```\n\n```js metro.config.js -cn\nconst { getDefaultConfig } = require(\"expo/metro-config\");\n\nconst config = getDefaultConfig(__dirname);\n\nconfig.resolver.extraNodeModules = {\n stream: require.resolve(\"readable-stream\"),\n crypto: require.resolve(\"crypto-browserify\"),\n};\n\nmodule.exports = config;\n```\n\n## Add global polyfills\n\nUpdate the Expo entry point to include polyfills.\n\n1. Create `polyfill.js` file\n2. Create `index.js` file\n3. Update the `package.json`\n\n```js polyfill.js -cn\nimport { Buffer } from \"buffer/\";\nimport process from \"process\";\nimport \"react-native-get-random-values\";\nimport { TextDecoder, TextEncoder } from \"text-encoding\";\n\nglobal.process = process;\nglobal.Buffer = Buffer;\nglobal.TextEncoder = TextEncoder;\nglobal.TextDecoder = TextDecoder;\n```\n\n```js index.js -cn\nimport \"./polyfill\";\nimport { Crypto } from \"@peculiar/webcrypto\";\n\nObject.assign(global.crypto, new Crypto());\n\nimport \"expo-router/entry\";\n```\n\n```json package.json\n\"main\": \"index.js\",\n```\n\n<Callout>\nEnsure that the polyfills live in their own file as specified to avoid any runtime issues.\n</Callout>\n\n## Use Stacks.js in the project\n\nEdit the `app/(tabs)/index.tsx` file to integrate Stacks.js functionalities, starting with the imports.\n\n```tsx app/(tabs)/index.tsx -cn\nimport {\n TransactionVersion,\n getAddressFromPrivateKey,\n makeSTXTokenTransfer,\n} from \"@stacks/transactions\";\nimport { Wallet, generateSecretKey, generateWallet } from \"@stacks/wallet-sdk\";\nimport { useState } from \"react\";\n```\n\nNow you can start to manage the state as follows:\n\n```tsx app/(tabs)/index.tsx -cn\nexport default function HomeScreen() {\n const [mnemonic, setMnemonic] = useState(\"...\");\n const [wallet, setWallet] = useState<Wallet | null>(null);\n const [log, setLog] = useState(\"\");\n}\n```\n\nNext, to generate a wallet and sign a transaction:\n\n```tsx app/(tabs)/index.tsx -cn\nconst generate = async () => {\n const mnemonic = generateSecretKey();\n setMnemonic(mnemonic);\n\n const wallet = await generateWallet({\n secretKey: mnemonic,\n password: \"\",\n });\n setWallet(wallet);\n\n await makeSTXTokenTransfer({\n amount: 1000,\n anchorMode: \"any\",\n recipient: \"SP3W993D3BRDYB284CY3SBFDEGTC5XEDJPDEA21CN\",\n senderKey: wallet.accounts[0].stxPrivateKey,\n fee: 10,\n network: \"mainnet\",\n nonce: 0,\n });\n setLog(\"Transaction signed successfully ☑\");\n};\n```\n\nAnd lastly, to integrate the UI:\n\n```tsx app/(tabs)/index.tsx -cn\n<ThemedView>\n <ThemedText type=\"subtitle\">Seed Phrase</ThemedText>\n <ThemedText>{mnemonic}</ThemedText>\n <Button title=\"Generate Seed Phrase\" onPress={generate} />\n {wallet && (\n <>\n <ThemedText type=\"subtitle\">Address</ThemedText>\n <ThemedText>\n {getAddressFromPrivateKey(\n wallet.accounts[0].stxPrivateKey,\n TransactionVersion.Mainnet\n )}\n </ThemedText>\n </>\n )}\n {log && <ThemedText>{log}</ThemedText>}\n</ThemedView>\n```\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/stacks.js/packages/transactions\"\n title=\"API References\"\n description=\"Dive into the API references for Stacks.js.\"\n />\n</Cards>","url":"/docs/stacks/stacks.js/examples/use-with-react-native"},"233":{"id":"/docs/stacks/stacks.js/packages/sbtc","title":"sbtc","description":"A JS/TS helper package for interacting with sBTC.","content":"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n\n## Installation\n\n```package-install\nsbtc\n```\n\n## Architecture\n\nThe sBTC protocol operates across multiple layers:\n\n- **Bitcoin**: The original funds are sourced from Bitcoin. A depositor sends these funds to a group of signers, which manage a (rotating) multisignature address formatted for sBTC transactions.\n\n- **sBTC API (Emily)**: This API is responsible for tracking deposits and notifying the signers about pending deposits.\n\n- **Stacks**: The network where sBTC is minted. Once the deposit is confirmed, the signers mint the corresponding amount of sBTC to the depositor's specified address on the Stacks network.\n\n## Deposit Flow\n\n- **Create Deposit (Bitcoin) Transaction**:\n - Structure a Bitcoin transaction to send funds to the group of signers.\n - Use a specialized format that includes:\n - Deposit Script: Identifies which Stacks address the sBTC will be minted to and what the maximum fee (in satoshis) the signers may take in exchange for minting.\n - Reclaim Script: Allows the sender to reclaim their funds if the transaction is not processed by the signers.\n\n- **Sign and Broadcast the Transaction**:\n - Sign the transaction with the sender's private key.\n - Broadcast the transaction to the Bitcoin network (Bitcoin Regtest for Stacks Testnet).\n\n- **Notify the sBTC API (Emily)**:\n - Inform the API about the transaction by submitting its details. This step ensures that the signers are aware of the deposit and can track it.\n\n- **Processing by Signers**: (no action required)\n - The signers retrieve and verify the deposit transaction from the Bitcoin blockchain.\n - Once verified, the signers mint the equivalent amount of sBTC on the Stacks network.\n\n- **Receive sBTC (Stacks)**: (no action required)\n - The minted sBTC is sent to the depositor's designated Stacks address, completing the deposit process.\n - sBTC is SIP-010 compatible and will show up in Stacks wallets and explorers.\n\n## Withdrawal Flow\n_Coming soon_\n\n## sBTC Package Functions\n\nThe sBTC package exports high-level functions for building addresses and transactions for deposits.\n\n### Examples\n\n \n#### buildSbtcDepositAddress\nBuild a deposit address and metadata using `buildSbtcDepositAddress` with a wallet provider using `sendTransfer`.\n\n```ts\nimport { buildSbtcDepositAddress, SbtcApiClientTestnet } from 'sbtc';\n\nconst client = new SbtcApiClientTestnet();\n\n// 1. BUILD THE DEPOSIT ADDRESS AND METADATA\nconst deposit = buildSbtcDepositAddress({\n stacksAddress: TARGET_STX_ADDRESS,\n signersPublicKey: await client.fetchSignersPublicKey(),\n\n // OPTIONAL DEFAULTS\n // maxSignerFee: 80_000, // optional: fee to pay for the deposit transaction (taken from the signers from the sats)\n // reclaimLockTime: 6_000, // optional: lock time for the reclaim script\n // network: REGTEST, // optional: which bitcoin network to use\n});\n\n// `deposit.address` is the deposit address (send funds here, aka the deposit address as an output)\n\n// 2. DEPOSIT USING YOUR FAVORITE WALLET (TYPICALLY ALSO BROADCASTED BY THE WALLET)\nconst txid = await WalletProvider.sendTransfer({\n recipient: deposit.address,\n amount: 100_000, // the amount to deposit; <=maxSignerFee is taken from this amount\n});\n\n// 3. NOTIFY THE SIGNERS\nawait client.notifySbtc({ txid, ...deposit });\n```\n\n#### buildSbtcDepositTx\nThe `buildSbtcDepositTx` function is similar to `buildSbtcDepositAddress`, but instead of returning just a deposit address, it constructs a complete Bitcoin transaction for depositing sBTC.\n\n```ts\nimport { buildSbtcDepositTx } from 'sbtc';\n\n// 1. BUILD THE DEPOSIT TRANSACTION AND METADATA\nconst deposit = buildSbtcDepositTx({\n amountSats: DEPOSIT_AMOUNT, // the amount in sats/sBTC to deposit; <=maxSignerFee is taken from this amount\n\n // same options as `buildSbtcDepositAddress`\n network,\n stacksAddress,\n signersPublicKey,\n maxSignerFee,\n reclaimLockTime,\n});\n\n// `deposit.transaction` has one output, which is the combined taproot of the deposit and reclaim scripts\n\n// 2. SIGN THE TRANSACTION\ndeposit.transaction.sign(YOUR_BTC_PRIVATE_KEY);\ndeposit.transaction.finalize();\n\n// 2. OR SIGN VIA EXTERNAL WALLET\nconst psbtBytes = deposit.transaction.toPSBT();\n\n// 3. BROADCAST THE TRANSACTION\nconst txid = await client.broadcastTx(deposit.transaction);\n\n// 4. NOTIFY THE SIGNERS\nawait client.notifySbtc(deposit);\n```\n\n\n#### sbtcDepositHelper\nCreate a fully-formed deposit transaction (assuming an address with spendable bitcoin UTXOs)\n\n<Callout>Use this helper function if you are not using a wallet provider</Callout>\n\n```ts\nimport { sbtcDepositHelper, SbtcApiClientTestnet } from 'sbtc';\n\nconst client = new SbtcApiClientTestnet();\n\n// 1. BUILD THE DEPOSIT TRANSACTION AND METADATA (GIVEN UTXOS FOR AN ADDRESS)\nconst deposit = await sbtcDepositHelper({\n stacksAddress: TARGET_STX_ADDRESS, // where to send/mint the sBTC\n amountSats: 5_000_000, // (maximum) amount of sBTC to deposit\n\n signersPublicKey: pub, // the aggregated public key of the signers\n\n feeRate: await client.fetchFeeRate('medium'),\n utxos: await client.fetchUtxos(YOUR_BTC_ADDRESS),\n\n bitcoinChangeAddress: YOUR_BTC_ADDRESS,\n});\n\n// 2. SIGN THE TRANSACTION\ndeposit.transaction.sign(YOUR_BTC_PRIVATE_KEY);\ndeposit.transaction.finalize();\n\n// 2. OR SIGN VIA EXTERNAL WALLET\nconst psbtBytes = deposit.transaction.toPSBT();\n\n// 3. BROADCAST TRANSACTION\nconst txid = await client.broadcastTx(deposit.transaction);\nconsole.log('txid', txid);\n\n// 4. NOTIFY THE SIGNERS\nconst res = await client.notifySbtc(deposit);\nconsole.log('res', res.status, res.statusMessage);\n```\n\n\n## HTTP Clients\n\nAdditionally, there are two API helpers, which make it easier to get all the data needed to create the above transactions:\n\n- **SbtcApiClientMainnet** — a client for communicating with the different pieces of the sBTC deployment\n- **SbtcApiClientTestnet** — a client for communicating with the different pieces of the sBTC deployment on Testnet\n- **SbtcApiClientDevenv** — a client for developing against a local deployment of sBTC\n\nWhile the final adjustments are still being made in the pre-release phase, this package may change default URLs and contract addresses on every minor release.\n\n| Version | Purpose | Functionality |\n| --- | --- | --- |\n| 0.1.x | Developer release (hackathon) | |\n| 0.2.x | Regtest/Testnet release | Deposit only |\n| 0.3.x | Mainnet pre-release | Deposit only |\n\n### Examples\n\n```ts\nimport { SbtcApiClientMainnet, SbtcApiClientTestnet, SbtcApiClientDevenv } from 'sbtc';\n\nconst client = new SbtcApiClientMainnet();\n// const client = new SbtcApiClientTestnet();\n// const client = new SbtcApiClientDevenv();\n\nconst pub = await client.fetchSignersPublicKey(); // fetches the aggregated public key of the signers\nconst address = await client.fetchSignersAddress(); // fetches the p2tr address of the aggregated public key of the signers\n\nconst feeRate = await client.fetchFeeRate('low'); // or 'medium', 'high'\nconst unspents = await client.fetchUtxos(BTC_ADDRESS);\nconst hex = await client.fetchTxHex(TXID);\n\nawait client.broadcastTx(DEPOSIT_BTC_TX); // broadcast a deposit BTC transaction\nawait client.notifySbtc(DEPOSIT_BTC_TX); // notify the sBTC API about the deposit (otherwise it won't be processed)\n\nconst sbtcBalance = await client.fetchSbtcBalance(STX_ADDRESS); // fetch the sBTC balance of an Stacks address\n```\n\n## API Reference\n\n### sbtcDepositHelper\n\n| Parameter | Description | Type | Default |\n| --- | --- | --- | --- |\n| signersPublicKey | Signers public key (aggregated schnorr) | string 32 byte hex | — |\n| amountSats | Bitcoin amount denominated in sats (* 10^8) | number, bigint | — |\n| stacksAddress | The deposit recipient Stacks address | string | — |\n| bitcoinChangeAddress | Bitcoin change address | string | — |\n| feeRate | Fee rate in sat/vbyte | number | — |\n| utxos | UTXOs to \"fund\" the transaction | UtxoWithTx[] | — |\n| reclaimPublicKey | Public key (schnorr, x-only) for reclaiming failed deposits | string | — |\n| reclaimLockTime | Optional reclaim lock time | number | 144 |\n| maxSignerFee | Optional maximum fee to pay to signers for the sBTC mint | number | 80_000 |\n| network | Optional Bitcoin network | BitcoinNetwork | MAINNET |\n| utxoToSpendable | Optional function to convert p2wpk and p2sh utxos to spendable inputs | Function | Best effort default implementation to make utxos spendable |\n| paymentPublicKey | Optional payment public key (currently only used for default utxoToSpendable.sh implementation) | string hex | — |\n\n### SbtcApiClient Configuration\n\n| Parameter | Description | Type |\n| --- | --- | --- |\n| sbtcContract | The multisig address of the initial sBTC contract | string |\n| sbtcApiUrl | The base URL of the sBTC API (Emily) | string |\n| btcApiUrl | The base URL of the Bitcoin mempool/electrs API | string |\n| stxApiUrl | The base URL of the Stacks API | string |\n","url":"/docs/stacks/stacks.js/packages/sbtc"},"234":{"id":"/docs/stacks/stacks.js/packages/transactions","title":"@stacks/transactions","description":"Construct, decode transactions and work with Clarity smart contracts on the Stacks blockchain.","content":"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\n## Installation\n\n```package-install\n@stacks/transactions\n```\n\nThis library supports the creation of the following Stacks transaction types:\n\n1. STX token transfer\n2. Smart contract deploy\n3. Smart contract function call\n\n## Key Generation\n\n```typescript -n\nimport { randomPrivateKey, privateKeyToPublicKey } from '@stacks/transactions';\n\n// Random key\nconst privateKey = randomPrivateKey();\nconst publicKey = privateKeyToPublicKey(privateKey);\n\n// Private key from hex string\nconst privateKey = 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01';\n```\n\n## STX Token Transfer Transaction\n\nUse the [`makeSTXTokenTransfer`](https://stacks.js.org/functions/_stacks_transactions.makeSTXTokenTransfer) (with a sender private key), or the \"unsigned\" version [`makeUnsignedSTXTokenTransfer`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedSTXTokenTransfer) (with a sender public key, without yet signing) to create a STX token transfer transaction.\n\n```ts -n\nimport { makeSTXTokenTransfer, broadcastTransaction } from '@stacks/transactions';\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n memo: 'test memo',\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n\n// to see the raw serialized tx\nconst serializedTx = transaction.serialize(); // hex string\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Smart Contract Deploy Transaction\n\nUse the [`makeContractDeploy`](https://stacks.js.org/functions/_stacks_transactions.makeContractDeploy), or the \"unsigned\" version [`makeUnsignedContractDeploy`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedContractDeploy) to create a smart contract deploy transaction.\n\n```ts -n\nimport { makeContractDeploy, broadcastTransaction } from '@stacks/transactions';\nimport { readFileSync } from 'fs';\n\nconst clarityCode = readFileSync('/path/to/contract.clar').toString();\n\nconst txOptions = {\n contractName: 'contract_name',\n codeBody: clarityCode,\n clarityVersion: 3, // optional, defaults to latest deployed version\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeContractDeploy(txOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Smart Contract Function Call (On-chain)\n\nIf you want to call a readonly function, use [`fetchCallReadOnlyFunction`](https://stacks.js.org/functions/_stacks_transactions.fetchCallReadOnlyFunction) instead.\n\nUse the [`makeContractCall`](https://stacks.js.org/functions/_stacks_transactions.makeContractCall) or the \"unsigned\" version [`makeUnsignedContractCall`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedContractCall) to create a smart contract function call transaction.\n\n```ts -n\nimport { makeContractCall, broadcastTransaction, Cl, Pc } from '@stacks/transactions';\n\n// Add an optional post condition\nconst condition01 = Pc.principal('SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE')\n .willSendGte(1000000n)\n .ustx();\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [Cl.bufferFromUtf8('foo string')],\n postConditions: [condition01],\n\n validateWithAbi: true, // check if the arguments given are compatible with the function\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeContractCall(txOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\nIn this example we construct a `contract-call` transaction with a post condition. We have set the `validateWithAbi` option to `true`, so the `makeContractCall` builder will attempt to fetch this contracts ABI from the specified Stacks network, and validate that the provided functionArgs match what is described in the ABI. This should help you avoid constructing invalid contract-call transactions. If you would prefer to provide your own ABI instead of fetching it from the network, the `validateWithAbi` option also accepts [ClarityABI](https://stacks.js.org/interfaces/_stacks_transactions.ClarityAbi) objects.\n\n## Sponsoring Transactions\n\nTo generate a sponsored transaction, first create and sign the transaction as the origin. The `sponsored` property in the options object must be set to true.\n\n```ts -n\nimport { makeContractCall, Cl } from '@stacks/transactions';\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [Cl.bufferFromUtf8('foo string')],\n validateWithAbi: true,\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n sponsored: true,\n};\n\nconst transaction = await makeContractCall(txOptions);\nconst serializedTx = transaction.serialize();\n\n// can't broadcast sponsored transactions before they are sponsored\n```\n\nThe serialized transaction can now be passed to the sponsoring party which will sign the sponsor portion of the transaction and set the fee.\n\n```ts -n\nimport { sponsorTransaction, broadcastTransaction } from '@stacks/transactions';\n\nconst deserializedTx = deserializeTransaction(serializedTx);\nconst sponsorKey = '770287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01';\nconst fee = 1000n;\n\nconst sponsorOptions = {\n transaction: deserializedTx,\n sponsorPrivateKey: sponsorKey,\n sponsorNonce: 0,\n fee,\n};\n\nconst sponsoredTx = await sponsorTransaction(sponsorOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction: sponsoredTx, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Supporting multi-signature transactions\n\nTo generate a multi-sig transaction, first create an unsigned transaction.\nThe `numSignatures` and `publicKeys` properties in the options object must be set:\n\n```ts -n\nimport {\n makeUnsignedSTXTokenTransfer,\n createStacksPrivateKey,\n deserializeTransaction,\n pubKeyfromPrivKey,\n publicKeyToString,\n TransactionSigner,\n standardPrincipalCV,\n BytesReader,\n AnchorMode,\n} from '@stacks/transactions';\n\nconst recipient = standardPrincipalCV('SP3FGQ8...');\nconst amount = 2500000n;\nconst fee = 0n;\nconst memo = 'test memo';\n\n// private keys of the participants in the transaction\nconst privKeyStrings = ['6d430bb9...', '2a584d89...', 'd5200dee...'];\n\n// create private key objects from string array\nconst privKeys = privKeyStrings.map(createStacksPrivateKey);\n\n// corresponding public keys\nconst pubKeys = privKeyStrings.map(pubKeyfromPrivKey);\n\n// create public key string array from objects\nconst pubKeyStrings = pubKeys.map(publicKeyToString);\n\nconst transaction = await makeUnsignedSTXTokenTransfer({\n recipient,\n amount,\n fee,\n memo,\n numSignatures: 2, // number of signature required\n publicKeys: pubKeyStrings, // public key string array with >= numSignatures elements\n anchorMode: AnchorMode.Any,\n});\n\nconst serializedTx = transaction.serialize();\n```\n\nThis transaction payload can be passed along to other participants to sign. In addition to\nmeeting the numSignatures requirement, the public keys of the parties who did not sign the\ntransaction must be appended to the signature.\n\n```ts -n\n// deserialize and sign transaction\nconst bytesReader = new BytesReader(serializedTx);\n// Partially signed or unsigned multi-sig tx can be deserialized to add the required signatures\nconst deserializedTx = deserializeTransaction(bytesReader);\n\nconst signer = new TransactionSigner(deserializedTx);\n\n// first signature\nsigner.signOrigin(privKeys[0]);\n\n// second signature\nsigner.signOrigin(privKeys[1]);\n\n// after meeting the numSignatures requirement, the public\n// keys of the participants who did not sign must be appended\nsigner.appendOrigin(pubKeys[2]);\n\n// the serialized multi-sig tx\nconst serializedSignedTx = deserializedTx.serialize();\n```\n\n## Calling Read-only Contract Functions\n\nRead-only contract functions can be called without generating or broadcasting a transaction. Instead it works via a direct API call to a Stacks node.\n\n```ts -n\nimport { bufferCVFromString, callReadOnlyFunction } from '@stacks/transactions';\nimport { StacksTestnet } from '@stacks/network';\n\nconst contractAddress = 'ST3KC0MTNW34S1ZXD36JYKFD3JJMWA01M55DSJ4JE';\nconst contractName = 'kv-store';\nconst functionName = 'get-value';\nconst buffer = bufferCVFromString('foo');\nconst network = new StacksTestnet();\nconst senderAddress = 'ST2F4BK4GZH6YFBNHYDDGN4T1RKBA7DA1BJZPJEJJ';\n\nconst options = {\n contractAddress,\n contractName,\n functionName,\n functionArgs: [buffer],\n network,\n senderAddress,\n};\n\nconst result = await callReadOnlyFunction(options);\n```\n\n## Constructing Clarity Values\n\nBuilding transactions that call functions in deployed clarity contracts requires you to construct valid Clarity Values to pass to the function as arguments. The [Clarity type system](https://github.com/stacksgov/sips/blob/master/sip/sip-002-smart-contract-language.md#clarity-type-system) contains the following types:\n\n- `(tuple (key-name-0 key-type-0) (key-name-1 key-type-1) ...)` : a typed tuple with named fields.\n- `(list max-len entry-type)` : a list of maximum length max-len, with entries of type entry-type\n- `(response ok-type err-type)` : object used by public functions to commit their changes or abort. May be returned or used by other functions as well, however, only public functions have the commit/abort behavior.\n- `(optional some-type)` : an option type for objects that can either be (some value) or none\n- `(buff max-len)` : byte buffer or maximum length max-len.\n- `principal` : object representing a principal (whether a contract principal or standard principal).\n- `bool` : boolean value (`true` or `false`)\n- `int` : signed 128-bit integer\n- `uint`: unsigned 128-bit integer\n\nThis library contains Typescript types and classes that map to the Clarity types, in order to make it easy to construct well-typed Clarity values in Javascript. These types all extend the abstract class `ClarityValue`.\n\n```ts -n\nimport {\n trueCV,\n falseCV,\n noneCV,\n someCV,\n intCV,\n uintCV,\n standardPrincipalCV,\n contractPrincipalCV,\n responseErrorCV,\n responseOkCV,\n listCV,\n tupleCV,\n bufferCV,\n} from '@stacks/transactions';\nimport { utf8ToBytes } from '@stacks/common';\n\n// construct boolean clarity values\nconst t = trueCV();\nconst f = falseCV();\n\n// construct optional clarity values\nconst nothing = noneCV();\nconst something = someCV(t);\n\n// construct a buffer clarity value from an existing byte array\nconst bytes = utf8ToBytes('foo'); // Uint8Array(3) [ 102, 111, 111 ]\nconst bufCV = bufferCV(bytes);\n\n// construct signed and unsigned integer clarity values\nconst i = intCV(-10);\nconst u = uintCV(10);\n\n// construct principal clarity values\nconst address = 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B';\nconst contractName = 'contract-name';\nconst spCV = standardPrincipalCV(address);\nconst cpCV = contractPrincipalCV(address, contractName);\n\n// construct response clarity values\nconst errCV = responseErrorCV(trueCV());\nconst okCV = responseOkCV(falseCV());\n\n// construct tuple clarity values\nconst tupCV = tupleCV({\n a: intCV(1),\n b: trueCV(),\n c: falseCV(),\n});\n\n// construct list clarity values\nconst l = listCV([trueCV(), falseCV()]);\n```\n\nIf you develop in Typescript, the type checker can help prevent you from creating wrongly-typed Clarity values. For example, the following code won't compile since in Clarity lists are homogeneous, meaning they can only contain values of a single type. It is important to include the type variable `BooleanCV` in this example, otherwise the typescript type checker won't know which type the list is of and won't enforce homogeneity.\n\n```ts -n\nconst l = listCV<BooleanCV>([trueCV(), intCV(1)]);\n```\n\n## Post Conditions\n\nThree types of post conditions can be added to transactions:\n\n1. STX post condition\n2. Fungible token post condition\n3. Non-Fungible token post condition\n\nFor details see: https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-post-conditions\n\n## STX post condition\n\n```ts -n\nimport {\n FungibleConditionCode,\n makeStandardSTXPostCondition,\n makeContractSTXPostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\n\nconst standardSTXPostCondition = makeStandardSTXPostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractSTXPostCondition = makeContractSTXPostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount\n);\n```\n\n## Fungible token post condition\n\n```ts -n\nimport {\n FungibleConditionCode,\n createAssetInfo,\n makeStandardFungiblePostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardFungiblePostCondition = makeStandardFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst contractFungiblePostCondition = makeContractFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n```\n\n## Non-fungible token post condition\n\n> **Warning**\n> The Stacks blockchain's post-condition processor can NOT check ownership.\n> It checks whether or not a principal **will send** or **will not send** an NFT.\n> Post-conditions can NOT verify anything about the recipient of an asset.\n> If you want to verify conditions about asset recipients, you will need to use [Clarity](https://docs.stacks.co/docs/write-smart-contracts/).\n\n```ts -n\nimport {\n NonFungibleConditionCode,\n createAssetInfo,\n makeStandardNonFungiblePostCondition,\n makeContractNonFungiblePostCondition,\n bufferCVFromString,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = NonFungibleConditionCode.DoesNotSend;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-asset';\nconst assetId = bufferCVFromString('test-token-asset-id');\nconst nonFungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardNonFungiblePostCondition = makeStandardNonFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractNonFungiblePostCondition = makeContractNonFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n```\n\n## Conversion of Clarity Values to JSON\n\nClarity Values represent values of Clarity contracts. If a JSON format is required the helper function `cvToJSON` can be used.\n\n```ts -n\nimport { cvToJSON, hexToCV } from '@stacks/transactions';\n\ncvToJSON(hexToCV(tx.tx_result.hex));\n```\n","url":"/docs/stacks/stacks.js/packages/transactions"},"235":{"id":"/docs/stacks/stacks.js/packages/network","title":"@stacks/network","description":"Network and API library for working with Stacks blockchain nodes.","content":"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\nThe `@stacks/network` package contains default network configurations for Stacks.\n\n## Installation\n\n<Callout type=\"tip\">\nBefore you install: most of the time you don't need to use or even install this library directly.\nFor example, instead of `STACKS_MAINNET`, simply use the string `\"mainnet\"` as the network parameter.\n</Callout>\n\n```package-install\n@stacks/network@latest\n```\n\n## Usage\n\n## The network object\n\nA network in Stacks.js is an object defining several properties.\n\n```ts\nimport { STACKS_MAINNET, STACKS_TESTNET, STACKS_DEVNET } from '@stacks/network';\n\nconsole.log(STACKS_MAINNET);\n// {\n// chainId: 1,\n// transactionVersion: 0,\n// peerNetworkId: 385875968,\n// magicBytes: 'X2',\n// bootAddress: 'SP000000000000000000002Q6VF78',\n// addressVersion: { singleSig: 22, multiSig: 20 }\n// }\n```\n\n## Network usage in transaction building\n\n```ts\nimport { STACKS_MAINNET } from '@stacks/network';\nimport { makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst txOptions = {\n recipient: 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26',\n amount: 100,\n // ...\n network: 'mainnet', // 'mainnet', 'testnet', or 'devnet', (defaults to mainnet)\n // OR\n network: STACKS_MAINNET, // any compatible network object\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n```\n","url":"/docs/stacks/stacks.js/packages/network"},"236":{"id":"/docs/stacks/stacks.js/packages/common","title":"@stacks/common","description":"Common utilities for working with Stacks.","content":"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\nThe `@stacks/common` package contains common utilities for working with Stacks.\nThis includes fetch helpers, middleware, and various other functions.\n\n## Installation\n\n```package-install\n@stacks/common@latest\n```\n\n\n## Use the built-in API key middleware\n\nSome Stacks APIs make use API keys to provide less rate-limited plans.\n\n```typescript\nimport { createApiKeyMiddleware, createFetchFn, StacksMainnet } from '@stacks/network';\nimport { broadcastTransaction, getNonce, makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst myApiMiddleware = createApiKeyMiddleware('example_e8e044a3_41d8b0fe_3dd3988ef302');\nconst myFetchFn = createFetchFn(myApiMiddleware); // middlewares can be used to create a new fetch function\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n memo: 'some memo',\n anchorMode: AnchorMode.Any,\n client: {\n fetch: myFetchFn,\n }\n};\nconst transaction = await makeSTXTokenTransfer(txOptions); // fee-estimation will use the custom fetchFn\n\nconst response = await broadcastTransaction(transaction, myMainnet); // make sure to broadcast via the custom network object\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', myMainnet);\n```\n\n## Use custom middleware\n\nMiddleware can be used to hook into network calls before sending a request or after receiving a response.\n\n```typescript\nimport { createFetchFn, RequestContext, ResponseContext } from '@stacks/common';\n\nconst preMiddleware = (ctx: RequestContext) => {\n ctx.init.headers = new Headers();\n ctx.init.headers.set('x-foo', 'bar'); // override headers and set new `x-foo` header\n};\nconst postMiddleware = (ctx: ResponseContext) => {\n console.log(await ctx.response.json()); // log response body as json\n};\n\nconst fetchFn = createFetchFn({ pre: preMiddleware, post: preMiddleware }); // a middleware can contain `pre`, `post`, or both\nconst network = new StacksTestnet({ fetchFn });\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', network);\n```\n\n## Get various API URLs\n\n```typescript\nconst txBroadcastUrl = network.getBroadcastApiUrl();\n\nconst feeEstimateUrl = network.getTransferFeeEstimateApiUrl();\n\nconst address = 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26';\nconst accountInfoUrl = network.getAccountApiUrl(address);\n\nconst contractName = 'hello_world';\nconst abiUrl = network.getAbiApiUrl(address, contractName);\n\nconst functionName = 'hello';\nconst readOnlyFunctionCallUrl = network.getReadOnlyFunctionCallApiUrl(\n address,\n contractName,\n functionName\n);\n\nconst nodeInfoUrl = network.getInfoUrl();\n\nconst blockTimeUrl = network.getBlockTimeInfoUrl();\n\nconst poxInfoUrl = network.getPoxInfoUrl();\n```\n","url":"/docs/stacks/stacks.js/packages/common"},"237":{"id":"/docs/stacks/stacks.js/concepts/transactions","title":"Transactions","description":"Learn how to create and broadcast transactions with Stacks.js.","content":"\nThe following shows how to create a simple transaction (STX transfer) using Stacks.js in different environments.\n\n## Creating a transaction\n\n### Using Stacks Connect\n\n```ts -n\nimport { openSTXTransfer } from '@stacks/connect';\n\nopenSTXTransfer({\n network: 'testnet',\n\n recipient: 'ST39MJ145BR6S8C315AG2BD61SJ16E208P1FDK3AK', // which address you are sending to\n amount: 10000, // tokens, denominated in micro-STX\n\n onFinish: response => console.log(response.txid),\n onCancel: () => console.log('User canceled'),\n});\n```\n\n### Using a private key\n\nFor full manual transaction signing, you need to provide the sender's private key.\nTreat the private key as a secret and *never* expose it to the public.\n\n```ts -n\nimport { makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst privateKey = randomPrivateKey(); // see \"Private Keys & Wallets\" page\n\nconst tx = await makeSTXTokenTransfer({\n recipient: 'ST39MJ145BR6S8C315AG2BD61SJ16E208P1FDK3AK', // which address you are sending to\n amount: 10000, // tokens, denominated in micro-STX\n senderKey: privateKey,\n network: \"testnet\",\n});\n```\n\n## Different transaction types\n\nIn Stacks.js, we can create transactions for different purposes:\n- STX token transfers\n- Smart contract calls\n- Smart contract deployments\n","url":"/docs/stacks/stacks.js/concepts/transactions"},"238":{"id":"/docs/stacks/stacks.js/concepts/post-conditions","title":"Post-Conditions","description":"","content":"\nIn Stacks, transactions can have *post-conditions*.\n\nThese offer additional security to ensure a transaction was executed as expected.\n\nMore precisely, adding post-conditions to a transaction can ensure that:\n\n- STX tokens were transferred from an address\n- FTs/NFTs were transferred from an address\n\n<Callout title=\"Info\">\nPost-conditions aren't perfect. They can't say anything about the end-state after a transaction. In other words, they can't guarantee the receipt of FTs/NFTs, since they only check for sending.\n</Callout>\n\nHere's an example of a post-condition using the `Pc` helper, where the `principal` must send 1000 uSTX, or else the transaction will abort:\n\n```ts -n\nimport { Pc } from '@stacks/transactions';\n\nconst tx = await makeContractCall({\n // ...\n postConditions: [\n Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6').willSendEq(1000).ustx(),\n ],\n});\n```\n\nIf you prefer to write the post-condition manually, you can do so using the following approach:\n\n```ts -n\nimport { StxPostCondition, FungiblePostCondition, NonFungiblePostCondition } from '@stacks/transactions';\n// STX post-condition\nconst stxPostCondition: StxPostCondition = {\n type: 'stx-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'gte', // 'eq' | 'gt' | 'gte' | 'lt' | 'lte'\n amount: '100',\n};\n\n// Fungible token post-condition\nconst ftPostCondition: FungiblePostCondition = {\n type: 'ft-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'eq', // 'eq' | 'gt' | 'gte' | 'lt' | 'lte'\n amount: '100',\n asset: 'SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-ft-token::my-token',\n};\n\n// Non-fungible token post-condition\nconst nftPostCondition: NonFungiblePostCondition = {\n type: 'nft-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'sent', // 'sent' | 'not-sent'\n asset: 'SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-nft::my-asset',\n assetId: Cl.uint(602),\n};\n```\n\n## Post-condition mode\n\nIn addition to the post-condition itself, we can also specify a `mode` for the transaction to verify asset transfers.\nThe mode can be either `Allow` or `Deny`.\n\n- `Allow` means that the transaction can transfer any asset (assuming no conflicting post-conditions).\n- `Deny` means the transaction will fail if any asset transfers (not specified in the post-conditions) are attempted.\n\n<Callout>\nIn either case, all post-conditions will still be checked.\nBy default, transactions are set to `Deny` mode for additional security.\n</Callout>","url":"/docs/stacks/stacks.js/concepts/post-conditions"},"239":{"id":"/docs/stacks/stacks.js/concepts/private-keys","title":"Private Keys & Wallets","description":"Learn how to manage secrets with Stacks.js.","content":"\nimport { Card, SmallCard } from '@/components/card';\nimport { Play, FileSignature } from 'lucide-react';\n\n## WITHOUT direct private key access\n\nMost users interact with apps via their favorite Stacks wallet.\nDevelopers can build web apps that prompt the user for an action (e.g. sign a transaction), and then the wallet will handle the rest.\n\n<SmallCard\n icon={<Play className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/stacks/connect\"\n title=\"Build Web Apps\"\n description=\"You can build Stacks enabled web apps without direct private key access using Stacks Connect.\"\n/>\n\n## WITH private key access\n\nDevelopers can build scripts, backends, and tools intended for full control over private keys.\n\n- Using the Stacks.js CLI directly to send transactions, or perform common tasks\n- Building custom tools using Stacks.js libraries that manage private keys directly\n\n### Generating random private keys\n\nLet's start by generating a random private key.\nNote that this will return a different value each time you run the code.\n\n```ts -n\nimport { randomPrivateKey } from '@stacks/transactions';\n\nconst privateKey = randomPrivateKey();\n// 'f5a31c1268a1e37d4edaa05c7d11183c5fbfdcdc48aae36ea4d8cd5cb709932801'\n```\n\nPrivate keys are typically represented as hex strings in Stacks.js.\nFor more control you can use the `PrivateKey` type, which also accepts raw bytes as `Uint8Array` in JavaScript.\n\n### Using a wallet / seed phrase\n\nTypically, we don't want to generate random private keys, but instead use a deterministic wallet based on a seed phrase.\n\n#### Generate a random seed phrase (24 words):\n\n```ts -n\nimport { randomSeedPhrase } from '@stacks/wallet-sdk';\n\nconst phrase = randomSeedPhrase();\n// \"warrior volume sport ... figure cake since\"\n```\n\n#### Generate a wallet from a seed phrase:\n\n```ts -n\nimport { generateWallet, randomSeedPhrase } from '@stacks/wallet-sdk';\n\nconst seedPhrase = randomSeedPhrase();\n\nlet wallet = await generateWallet({\n secretKey: seedPhrase,\n password: \"secret\",\n});\n\nconsole.log(wallet.accounts[0]); // one account is generated by default\n// { \n// stxPrivateKey: '893fc4936c5350394bbe0053d2c31a4b5a44680f6dceb4be2aacaaa3c12e45ff01',\n// dataPrivateKey: '676dc36d89ba04cf1789552fc35f3a6279b4b5f13f3d49fb469b0afecea9698f',\n// appsKey: 'xprvA19evFHUzrZF3wULUSv1UVcQNRP7xJ2vn2MyAKaUHbT8SvjrrkkhANRG2bewMxHAeDSoUVUBRPiztDc8WwGtz9Ero2GXW5rk3vHHXmutb4V',\n// salt: 'cf8a5c7142d842bb38f30c5ab626f7996dd7494236edf21ba00349bb09b9558d',\n// index: 0\n// } \n```\n\n#### Generate more accounts:\n\n```ts -n\nimport { generateNewAccount, generateWallet, randomSeedPhrase } from '@stacks/wallet-sdk';\n\nconst seedPhrase = randomSeedPhrase();\n\nlet wallet = await generateWallet({\n secretKey: seedPhrase,\n password: \"secret\",\n});\n\nwallet = generateNewAccount(wallet);\nconsole.log(wallet.accounts.length); // 2\n```","url":"/docs/stacks/stacks.js/concepts/private-keys"},"240":{"id":"/docs/stacks/stacks.js/concepts/accounts-and-addresses","title":"Accounts & Addresses","description":"Learn how to get an address from an account.","content":"\nStacks uses the concept of an \"account\" to represent a user's identity on the blockchain. An account is identified by a unique address. The address is derived from the account's public key, which is derived from the account's private key.\n\nA normal mainnet address starts with `SP`, and a testnet address starts with `ST`. For example:\n\nMainnet: `SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159`\n\nTestnet: `ST2F4BK4GZH6YFBNHYDDGN4T1RKBA7DA1BJZPJEJJ`\n\n## Getting an address\n\n### Using Stacks Connect\n\n```tsx -n\nimport { showConnect } from '@stacks/connect';\n\nshowConnect({\n appDetails,\n userSession,\n onFinish: () => {\n const user = userSession.loadUserData();\n const address = user.profile.stxAddress.mainnet;\n // 'SP1MXSZF4NFC8JQ1TTYGEC2WADMC7Y3GHVZYRX6RF'\n },\n});\n```\n\n### Using a seed phrase / mnemonic / private key\n\n```ts -n\nimport { randomSeedPhrase, generateWallet } from \"@stacks/wallet-sdk\";\nimport { privateKeyToAddress } from \"@stacks/transactions\";\n\nconst seed = randomSeedPhrase();\n\nconst wallet = await generateWallet({\n secretKey: seed,\n password: 'secret',\n});\n\nconst address = privateKeyToAddress(wallet.accounts[0].stxPrivateKey, 'mainnet');\n// 'SP1MXSZF4NFC8JQ1TTYGEC2WADMC7Y3GHVZYRX6RF'\n```\n\n### Using a public key\n\n```ts -n\nimport { publicKeyToAddress } from '@stacks/transactions';\n\nconst address = publicKeyToAddress(publicKey, 'mainnet');\n// 'SP1MXSZF4NFC8JQ1TTYGEC2WADMC7Y3GHVZYRX6RF'\n```\n\n{/* todo: add accounts code sections, once we have better abstractions */}\n\n{/* todo: multisig */}\n","url":"/docs/stacks/stacks.js/concepts/accounts-and-addresses"},"241":{"id":"/docs/stacks/stacks.js/concepts/networks","title":"Networks","description":"Learn how to use different networks.","content":"\nimport { Star } from 'lucide-react';\n\nTypically, we speak of `mainnet` and `testnet` as the networks of Stacks.\nMost wallets are configured to `mainnet` by default—this is the production environment, the actual blockchain that holds real STX tokens.\n\nAs the name suggests, `testnet` is a public network for testing.\nIt's a separate blockchain state that holds test tokens, which have no value.\n\nFor completeness we also mention `devnet`.\nThis isn't \"one\" network, but how developers refer to ephemeral local networks used for testing.\nIt is the same as `testnet`, but for local development.\n[Learn more](/stacks/clarinet/guides/run-a-local-devnet).\n\n## Setting the network\n\nMost Stacks.js functions accept a `network` parameter or an optional last argument.\n\nThe `network` type is a string, and can be one of:\n- `'mainnet'` (default)\n- `'testnet'`\n- `'devnet'`\n- `'mocknet'` (alias of `devnet`)\n\n### Examples\n\nNetwork in transaction signing:\n```ts\nconst tx = makeSTXTokenTransfer({\n // ...\n network: 'testnet',\n});\n```\n\nNetwork in address derivation:\n```ts\nconst address = privateKeyToAddress(privateKey, 'devnet');\n// ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP\n```\n\n<Callout type=\"tip\">\n For more advanced uses, you can pass an object of a network configuration.\n Read more about the network object in the [`@stacks/network`](/stacks/stacks.js/packages/network) package.\n</Callout>\n","url":"/docs/stacks/stacks.js/concepts/networks"},"242":{"id":"/docs/stacks/stacks.js/concepts/broadcasting","title":"Broadcasting","description":"Learn how to broadcast transactions to the Stacks network.","content":"\n## Broadcasting Transactions\n\nA finalized transaction can be broadcasted to the network or serialized (to a byte representation) using Stacks.js.\n\n```ts -n\nimport { broadcastTransaction, makeSTXTokenTransfer } from \"@stacks/transactions\";\n\nconst transaction = await makeSTXTokenTransfer({\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n amount: 42000000,\n senderKey:\n \"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601\",\n network: \"devnet\",\n});\n\nconst tx = await broadcastTransaction({ transaction });\n\n```\n\n<Callout title=\"Info\">For web applications, user wallets can broadcast transactions via [@stacks/connect](/stacks/connect).</Callout>\n","url":"/docs/stacks/stacks.js/concepts/broadcasting"},"243":{"id":"/docs/stacks/stacks.js/quickstart","title":"Quickstart","description":"Learn how to transfer STX tokens using Stacks.js.","content":"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\"\nimport { ChevronRight, Code, Terminal, Folder as FolderIcon } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\nimport { SmallCard } from '@/components/card';\n\nIn this quickstart guide, you will learn how to build a transaction to transfer STX tokens using Stacks.js.\n\nCheck out the [reference page](/stacks/stacks.js/packages/transactions) for `@stacks/transactions` to learn more about building different types of transactions.\n\n{/* <Callout>\n To view the full code for this quickstart, [click here](https://github.com/hiro-so/stacks.js/tree/main/examples/hello-world).\n</Callout> */}\n\n---\n\n<Steps>\n <Step>\n ## Install packages\n \n Add the `@stacks/transactions` and `@stacks/network` packages to your project using your preferred package manager.\n\n ```package-install title=\"Terminal\"\n @stacks/transactions @stacks/network\n ```\n </Step>\n <Step>\n ## Build the transaction for a STX transfer\n \n To set up a STX token transfer transaction, use the `makeSTXTokenTransfer` function.\n\n This function requires a private key (`senderKey`), a specified `network`, and the details of the transfer.\n\n ```ts stx-transfer.ts -cn\n import { makeSTXTokenTransfer } from \"@stacks/transactions\";\n import { STACKS_TESTNET } from \"@stacks/network\";\n\n const transaction = await makeSTXTokenTransfer({\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n amount: 42000000,\n senderKey:\n \"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601\",\n network: STACKS_TESTNET,\n });\n ```\n\n There are a few optional fields for a STX transfer transaction, including `memo`, `nonce`, and `fee`.\n\n <Accordions>\n <Accordion title=\"Optional fields example\">\n ```ts\n const transaction = await makeSTXTokenTransfer({\n // ...other fields ommitted\n memo: \"test memo\",\n nonce: 0n,\n fee: 200n,\n });\n ```\n </Accordion>\n </Accordions>\n\n <Callout>\n Use `memo` to add a message as part of the transaction. If you don't want the builder to fetch the `nonce` and `fee` from a Stacks node, you can manually set these fields.\n </Callout>\n </Step>\n <Step>\n ## Broadcast the transaction\n \n Once you've constructed a valid transaction, you can broadcast it to the network using the `broadcastTransaction` function.\n\n ```ts stx-transfer.ts -cn\n // !mark[/broadcastTransaction/mg]\n import { broadcastTransaction,makeSTXTokenTransfer } from \"@stacks/transactions\";\n import { STACKS_TESTNET } from \"@stacks/network\";\n\n const transaction = await makeSTXTokenTransfer({\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n amount: 42000000,\n senderKey:\n \"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601\",\n network: STACKS_TESTNET,\n });\n\n const broadcastResponse = await broadcastTransaction({ transaction });\n const txId = broadcastResponse.txid;\n ```\n\n Upon success, this will return a `StacksTransaction` object that contains information about the transaction, including the `txid`.\n </Step>\n</Steps>\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/authenticate-users\"\n title=\"Authenticate users\"\n description=\"Learn how to authenticate users using the Connect package in Stacks.js.\"\n />\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n <Card\n href=\"/stacks/connect/guides/sign-messages\"\n title=\"Sign messages\"\n description=\"Learn how to sign messages using Stacks.js.\"\n />\n</Cards>\n","url":"/docs/stacks/stacks.js/quickstart"},"244":{"id":"/docs/stacks/stacks.js/installation","title":"Installation","description":"Installing Stacks.js packages.","content":"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\nStacks.js is separated into many smaller packages, which can be installed individually and are published under the `@stacks` scope.\n\nThe most commonly used packages are:\n\n<Tabs defaultValue=\"connect\">\n <TabsList className='flex flex-wrap md:w-max'>\n <TabsTrigger value=\"connect\" className='tab group'>\n <Badge className='badge transition-colors group-data-[state=active]:bg-contrast group-data-[state=active]:text-background group-hover:bg-accent group-hover:text-muted-foreground'>@stacks/connect</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"common\" className='tab group'>\n <Badge className='badge transition-colors group-data-[state=active]:bg-contrast group-data-[state=active]:text-background group-hover:bg-accent group-hover:text-muted-foreground'>@stacks/common</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"network\" className='tab group'>\n <Badge className='badge transition-colors group-data-[state=active]:bg-contrast group-data-[state=active]:text-background group-hover:bg-accent group-hover:text-muted-foreground'>@stacks/network</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"transactions\" className='tab group'>\n <Badge className='badge transition-colors group-data-[state=active]:bg-contrast group-data-[state=active]:text-background group-hover:bg-accent group-hover:text-muted-foreground'>@stacks/transactions</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"client\" className='tab group'>\n <Badge className='badge transition-colors group-data-[state=active]:bg-contrast group-data-[state=active]:text-background group-hover:bg-accent group-hover:text-muted-foreground'>@stacks/blockchain-api-client</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"connect\">\n Build Stacks-ready web apps and connect to user wallets.\n\n ```package-install\n @stacks/connect\n ```\n </TabsContent>\n <TabsContent value=\"common\">\n Common utilities used by Stacks.js packages.\n\n ```package-install\n @stacks/common\n ```\n </TabsContent>\n <TabsContent value=\"network\">\n Network library for working with Stacks network objects.\n\n ```package-install\n @stacks/network\n ```\n </TabsContent>\n <TabsContent value=\"transactions\">\n Construct and decode transactions, and work with Clarity smart contracts on the Stacks blockchain.\n\n ```package-install\n @stacks/transactions\n ```\n </TabsContent>\n <TabsContent value=\"client\">\n API client library for all Stacks Blockchain API endpoints.\n\n ```package-install\n @stacks/blockchain-api-client\n ```\n </TabsContent>\n</Tabs>\n\n---\n\n<Accordions>\n <Accordion title=\"All available packages\">\n [`@stacks/connect`](/stacks/connect/packages/connect) — Build Stacks-ready web applications and connect to user wallets.\n\n `@stacks/auth` — Construct and decode authentication requests for Stacks apps.\n\n [`@stacks/transactions`](/stacks/stacks.js/packages/transactions) — Construct and decode transactions, and work with Clarity smart contracts on the Stacks blockchain.\n\n `@stacks/wallet-sdk` — A library for building wallets, managing accounts, and handling keys for the Stacks blockchain.\n\n `@stacks/storage` — Store and fetch files with Gaia, the decentralized storage system.\n\n `@stacks/profile` — Functions for manipulating user profiles.\n\n `@stacks/encryption` — Encryption functions used by Stacks.js packages.\n\n [`@stacks/network`](/stacks/stacks.js/packages/network) — A network and API library for working with Stacks blockchain nodes.\n\n `@stacks/common` — Common utilities used by Stacks.js packages.\n\n `@stacks/bns` — A library for interacting with the BNS contract.\n\n `@stacks/stacking` — A library for PoX stacking.\n\n `@stacks/cli` — A command line interface to interact with auth, storage, and Stacks transactions.\n\n `@stacks/blockchain-api-client` — API client library for all Stacks Blockchain API endpoints.\n </Accordion>\n</Accordions>\n","url":"/docs/stacks/stacks.js/installation"},"245":{"id":"/docs/stacks/integration-testing","title":"Integration testing","description":"Learn how to write and run integration tests for your Clarity smart contracts using the Clarinet JS SDK and Vitest.","content":"\nIntegration testing is a crucial step in smart contract development that involves testing how different components of your system work together. The Clarinet JS SDK provides powerful tools for writing and running integration tests, allowing you to simulate complex scenarios and interactions between multiple contracts.\n\nBy using integration tests, you can ensure that your smart contracts function correctly as part of a larger system and catch potential issues that might not be apparent in unit tests alone.\n\nIn this guide, you will:\n\n1. [Set up a Clarinet project with a `defi` contract.](#set-up-a-clarinet-project)\n2. [Write an integration test for the smart contract.](#test-the-deposit-and-borrow-functionality)\n3. [Run tests and generate coverage reports.](#run-tests-and-generate-coverage-reports)\n\n---\n\n## Set up a Clarinet project\n\nStart by creating a new Clarinet project. This command will create a new directory named `defi` and set up a basic Clarinet project inside it.\n\n```terminal\n$ clarinet new stx-defi\n$ cd stx-defi\n```\n\nAfter changing into your project directory, run `npm install` to install the package dependencies for testing.\n\n```terminal\n$ npm install\n```\n\nWe are going to use the same `defi` contract that we used in the [unit testing guide](/stacks/clarinet-js-sdk/guides/unit-testing), but with some additional functionality - the ability to `borrow` STX from the contract. If you don't have this project set up already, follow the steps below:\n\n```terminal\n$ clarinet contract new defi\n```\n\nThen, inside your `defi.clar` file, copy and paste the following contract code:\n\n```clarity\n;; Error constants for various failure scenarios.\n(define-constant err-overborrow (err u300))\n\n;; The interest rate for loans, represented as 10% (out of a base of 100).\n(define-data-var loan-interest-rate uint u10) ;; Representing 10% interest rate\n\n\n;; Holds the total amount of deposits in the contract, initialized to 0.\n(define-data-var total-deposits uint u0)\n\n;; Maps a user's principal address to their deposited amount.\n(define-map deposits { owner: principal } { amount: uint })\n\n;; Maps a borrower's principal address to their loan details: amount and the last interaction block.\n(define-map loans principal { amount: uint, last-interaction-block: uint })\n\n;; Public function for users to deposit STX into the contract.\n;; Updates their balance and the total deposits in the contract.\n(define-public (deposit (amount uint))\n (let\n (\n ;; Fetch the current balance or default to 0 if none exists.\n (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n )\n ;; Transfer the STX from sender = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\" to recipient = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)\".\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n ;; Update the user's deposit amount in the map.\n (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })\n ;; Update the total deposits variable.\n (var-set total-deposits (+ (var-get total-deposits) amount))\n ;; Return success.\n (ok true)\n )\n)\n\n;; Public function for users to borrow STX based on their deposits.\n(define-public (borrow (amount uint))\n (let\n (\n ;; Fetch user's deposit or default to 0.\n (user-deposit (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n ;; Calculate the maximum amount the user is allowed to borrow. (which will be upto HALF of what they deposited)\n (allowed-borrow (/ user-deposit u2))\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n ;; Calculate the new loan total after borrowing additional amount.\n (new-loan (+ amount))\n )\n ;; Ensure the requested borrow amount does not exceed the allowed amount.\n (asserts! (<= new-loan allowed-borrow) err-overborrow)\n ;; Transfer the borrowed STX to the user.\n (let\n (\n (recipient tx-sender)\n )\n (try! (as-contract (stx-transfer? amount tx-sender recipient)))\n )\n ;; Update the user's loan details in the map.\n (map-set loans tx-sender { amount: new-loan, last-interaction-block: block-height })\n ;; Return success.\n (ok true)\n )\n)\n\n;; Read-only function to get the total balance by tx-sender\n(define-read-only (get-balance-by-sender)\n (ok (map-get? deposits { owner: tx-sender }))\n)\n\n;; Read-only function to get the total amount owed by the user.\n(define-read-only (get-amount-owed)\n (let\n (\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n )\n ;; Return the total amount due.\n (ok total-due)\n )\n)\n\n;; Private function to calculate the accrued interest on a loan.\n(define-private (calculate-accrued-interest (principal uint) (start-block uint))\n (let\n (\n ;; Calculate the number of blocks elapsed since the last interaction.\n (elapsed-blocks (- block-height start-block))\n ;; Calculate the interest based on the principal, rate, and elapsed time.\n (interest (/ (* principal (var-get loan-interest-rate) elapsed-blocks) u10000))\n )\n ;; Ensure the loan started in the past (not at block 0).\n (asserts! (not (is-eq start-block u0)) (ok u0))\n ;; Return the calculated interest.\n (ok interest)\n )\n)\n```\n\nRun `clarinet check` to ensure that your smart contract is valid and ready for testing.\n\n<Callout>\nYou can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi).\n</Callout>\n\n## Test the deposit and borrow functionality\n\nIn order to `borrow` STX from the contract, users must first `deposit` STX into it. Therefore, we need to write an integration test that simulates the interaction between these two functions.\n\nInside of your `defi.test.ts` file, replace the boilerplate code and add the following:\n\n```typescript\nimport { describe, it, expect } from 'vitest';\nimport { Cl } from '@stacks/transactions';\n\nconst accounts = simnet.getAccounts();\nconst wallet1 = accounts.get('wallet_1')!;\n\ndescribe('stx-defi', () => {\n it('borrows 10 and verifies the amount owed to be 10', () => {\n simnet.callPublicFn('defi', 'deposit', [Cl.uint(1000)], wallet1);\n const totalDeposits = simnet.getDataVar('defi', 'total-deposits');\n expect(totalDeposits).toBeUint(1000);\n\n simnet.callPublicFn('defi', 'borrow', [Cl.uint(10)], wallet1);\n const { result } = simnet.callReadOnlyFn('defi', 'get-amount-owed', [], wallet1);\n expect(result).toBeOk(Cl.uint(10));\n });\n});\n```\n\nIn this integration test, we're simulating a scenario where a user deposits STX into the DeFi contract and then borrows against that deposit. Let's walk through the process step by step.\n\nWe start by simulating a deposit of 1000 STX from `wallet1`. To do this, we use the `callPublicFn` method from the Clarinet JS SDK `simnet` object, which allows us to call public functions in our smart contract just as we would on the actual blockchain.\n\nAfter making the deposit, we want to verify that it was successful. We do this by checking the total deposits in the contract using `getDataVar`.\n\nThis handy method lets us peek at the value of data variables defined in your contract.\n\n<Callout>\nTo learn more about available methods for integration testing, check out the [reference page](/stacks/clarinet-js-sdk/references/methods).\n</Callout>\n\nTo ensure the deposit was recorded correctly, we use a custom matcher, `toBeUint`. This matcher is specifically designed to check if a value is a Clarity unsigned integer with the exact value we expect.\n\nWith the deposit confirmed, we simulate `wallet1` borrowing 10 STX. We do this with another call to `callPublicFn`, this time invoking the `borrow` function of our contract.\n\nAfter the borrowing operation, we want to check how much `wallet1` owes. We use `callReadOnlyFn` to call a read-only function named `get-amount-owed` in our contract.\n\nFinally, we verify the amount owed using another custom matcher, `toBeOk(Cl.uint(10))`. This matcher is particularly useful because it checks two things at once:\n\n1. That our contract returned a successful Clarity response type.\n2. That the value returned is a Clarity unsigned integer with the exact value we expect (`10`).\n\nThese custom matchers and simnet methods are powerful tools and allow you to simulate complex interactions with your smart contracts and make detailed assertions about the results.\n\n## Run tests and generate coverage reports\n\nTo run your tests, use:\n\n```terminal\n$ npm run test\n```\n\nTo generate a coverage report, use:\n\n```terminal\n$ npm run coverage\n```\n\nThis will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/methods\"\n title=\"SDK methods\"\n description=\"Learn about the methods available in the Clarinet JS SDK.\"\n />\n</Cards>\n","url":"/docs/stacks/integration-testing"},"246":{"id":"/docs/stacks/migration-guide","title":"Migration guide","description":"Learn how to migrate your existing Clarinet projects to the Clarinet SDK.","content":"\nIn this guide, you will learn how to:\n\n1. Migrate your existing Clarinet projects to the Clarinet SDK.\n2. Run your existing tests using the Clarinet SDK.\n\n<Callout title=\"Note\">\nThis guide is for projects that have been created with Clarinet v1 and do not have the v2 boilerplate code auto-generated in their projects.\n</Callout>\n\n---\n\n## Executing the migration script\n\nInside your Clarinet v1 project, run the following command to initialise NPM and Vitest. It will also create a sample test file.\n\n```terminal\n$ npx @hirosystems/clarinet-sdk@latest\n```\n\nFollow the prompts to initialise NPM and Vitest, this can take a few seconds.\n\n<Callout title=\"Info\">\nThe file `tests/counter_test.ts` that was created by `clarinet contract new counter` can be deleted.\n\nYou can also have a look at `tests/contract.test.ts`. It's a sample file showing how to use the SDK with Vitest.\nIt can safely be deleted.\n</Callout>\n\n## Unit test for <code className='text-lg'>counter</code> example\n\n```ts tests/counter.test.ts\nimport { Cl } from '@stacks/transactions';\nimport { describe, expect, it } from 'vitest';\n\nconst accounts = simnet.getAccounts();\nconst address1 = accounts.get('wallet_1')!;\n\ndescribe('test `increment` public function', () => {\n it('increments the count by the given value', () => {\n const incrementResponse = simnet.callPublicFn('counter', 'increment', [Cl.uint(1)], address1);\n console.log(Cl.prettyPrint(incrementResponse.result)); // (ok u2)\n expect(incrementResponse.result).toBeOk(Cl.uint(2));\n\n const count1 = simnet.getDataVar('counter', 'count');\n expect(count1).toBeUint(2);\n\n simnet.callPublicFn('counter', 'increment', [Cl.uint(40)], address1);\n const count2 = simnet.getDataVar('counter', 'count');\n expect(count2).toBeUint(42);\n });\n\n it('sends a print event', () => {\n const incrementResponse = simnet.callPublicFn('counter', 'increment', [Cl.uint(1)], address1);\n\n expect(incrementResponse.events).toHaveLength(1);\n const printEvent = incrementResponse.events[0];\n expect(printEvent.event).toBe('print_event');\n expect(printEvent.data.value).toBeTuple({\n object: Cl.stringAscii('count'),\n action: Cl.stringAscii('incremented'),\n value: Cl.uint(2),\n });\n });\n});\n```\n\nTo run the test, go back to your console and run the `test` command using your preferred package manager. It should display a report telling you that tests succeeded.\n\n```terminal\n$ npm test\n```\n\n<Callout title=\"Note\">\nThe `simnet` object is available globally in the tests, and is automatically initialized before each test. You can have a look at the `vitest.config.js` file at the root of you project for more details.\n</Callout>\n\nGetting back to the tests - the first test checks that the `increment` function returns the new value and saves it to the `count` variable.\nThe second test checks that an `print_event` is emitted when the `increment` function is called.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API Reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/guides/migrate-to-the-clarinet-sdk\"\n title=\"Migrating your tests to Clarinet SDK\"\n description=\"Learn how to migrate your existing Clarinet projects to the Clarinet JS SDK\"\n />\n</Cards>","url":"/docs/stacks/migration-guide"},"247":{"id":"/docs/stacks/api-keys","title":"API keys","description":"For developers who need API requests beyond the standard rate limits.","content":"\nimport ApiKeysContent from '@/content/_shared/api-keys.mdx';\n\n<ApiKeysContent components={props.components} />\n","url":"/docs/stacks/api-keys"},"248":{"id":"/docs/stacks/api/token-metadata/info","title":"Info","description":"Retrieves information about the Token Metadata API, including the server version.","content":"","url":"/docs/stacks/api/token-metadata/info"},"249":{"id":"/docs/stacks/api/token-metadata/info/status","title":"Get status","description":"Retrieves information about the Token Metadata API, including the server version.","content":"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/token-metadata/info/status"},"250":{"id":"/docs/stacks/api/token-metadata/tokens","title":"Tokens","description":"Retrieves information about tokens on the Stacks blockchain.","content":"\n","url":"/docs/stacks/api/token-metadata/tokens"},"251":{"id":"/docs/stacks/api/token-metadata/tokens/fungible-token-metadata","title":"Get fungible token metadata","description":"Retrieves metadata for a SIP-010 fungible token.","content":"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/ft/{principal}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/token-metadata/tokens/fungible-token-metadata"},"252":{"id":"/docs/stacks/api/token-metadata/tokens/semi-fungible-token-metadata","title":"Get semi-fungible token metadata","description":"Retrieves information about semi-fungible tokens.","content":"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/sft/{principal}/{token_id}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/token-metadata/tokens/semi-fungible-token-metadata"},"253":{"id":"/docs/stacks/api/token-metadata/tokens/fungible-tokens","title":"Get fungible tokens","description":"Retrieves information about fungible tokens.","content":"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/ft', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/token-metadata/tokens/fungible-tokens"},"254":{"id":"/docs/stacks/api/token-metadata/tokens/non-fungible-token-metadata","title":"Get non-fungible token metadata","description":"Retrieves metadata for a SIP-009 non-fungible token.","content":"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/nft/{principal}/{token_id}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/token-metadata/tokens/non-fungible-token-metadata"},"255":{"id":"/docs/stacks/api/pagination","title":"Pagination","description":"Learn how to paginate through lists.","content":"\nTo make API responses more compact, lists returned by the API are paginated. For lists, the response body includes:\n\n- `limit`: The number of list items return per response\n- `offset`: The number of elements to skip (starting from 0)\n- `total`: The number of all available list items\n- `results`: The array of list items (length of array equals the set limit)\n\nHere is a sample response:\n\n```json\n{\n \"limit\": 10,\n \"offset\": 0,\n \"total\": 101922,\n \"results\": [\n {\n \"tx_id\": \"0x924e0a688664851f5f96b437fabaec19b7542cfcaaf92a97eae43384cacd83d0\",\n \"nonce\": 308,\n \"fee_rate\": \"0\",\n \"sender_address\": \"ST39F7SA0AKH7RB363W3NE2DTHD3P32ZHNX2KE7J9\",\n \"sponsored\": false,\n \"post_condition_mode\": \"deny\",\n \"post_conditions\": [],\n \"anchor_mode\": \"on_chain_only\",\n \"block_hash\": \"0x17ceb3da5f36aab351d6b14f5aa77f85bb6b800b954b2f24c564579f80116d99\",\n \"parent_block_hash\": \"0xe0d1e8d216a77526ae2ce40294fc77038798a179a6532bb8980d3c2183f58de6\",\n \"block_height\": 14461,\n \"burn_block_time\": 1622875042,\n \"burn_block_time_iso\": \"2021-06-05T06:37:22.000Z\",\n \"canonical\": true,\n \"tx_index\": 0,\n \"tx_status\": \"success\",\n \"tx_result\": {},\n \"microblock_hash\": \"\",\n \"microblock_sequence\": 2147483647,\n \"microblock_canonical\": true,\n \"event_count\": 0,\n \"events\": [],\n \"tx_type\": \"coinbase\",\n \"coinbase_payload\": {}\n },\n {}\n ]\n}\n```\n\nUsing the `limit` and `offset` properties, you can paginate through the entire list by increasing the offset by the limit until you reach the total.\n","url":"/docs/stacks/api/pagination"},"256":{"id":"/docs/stacks/api","title":"APIs","description":"The following guides cover ways to use Hiro tools to build apps on Stacks.","content":"\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n","url":"/docs/stacks/api"},"257":{"id":"/docs/stacks/api/authentication","title":"Authentication","description":"Authenticate with the Stacks Blockchain API.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nThe Stacks Blockchain API expands the intentionally minimal RPC endpoints available in Stacks nodes and indexes, cleans, and enriches on-chain data to put everything you need at your fingertips. Who knew getting reliable blockchain data could be this easy?\n\n## Popular endpoints\n\n<Callout title=\"RPC endpoints\" type=\"info\">\nIf you're looking for direct access to the Stacks node, including the ability to broadcast transactions and interact with smart contracts, check out our [Stacks Node RPC](/stacks/rpc-api) documentation.\n</Callout>\n\n<Callout title=\"Need help building with the Stacks Blockchain API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#api</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n","url":"/docs/stacks/api/authentication"},"258":{"id":"/docs/stacks/api/nonce-handling","title":"Nonce handling","description":"Learn how to handle nonces on Stacks.","content":"\nIn order to prevent \"stuck\" transactions, you must track the next available nonce for principals issuing transactions. The\nStacks Blockchain API provides an endpoint to make nonce handling simpler when using the following command:\n\n```terminal\n$ curl 'https://api.testnet.hiro.so/extended/v1/address/<principal>/nonces'\n```\n\n```json\n{\n \"last_executed_tx_nonce\": 5893,\n \"last_mempool_tx_nonce\": null,\n \"possible_next_nonce\": 5894,\n \"detected_missing_nonces\": []\n}\n```\n\nThe `possible_next_nonce` property is the nonce suggested for a given principal's next transaction. It is derived as the next integer to the largest nonce found in blocks and mempool. It does not take into account missing nonces.\n\nThe `detected_missing_nonces` property finds any non-contiguous nonces after inspecting transactions from blocks and the mempool. For example, for a given principal, if the latest transaction included in a block has a nonce of 5, and the's only one transaction in the mempool with nonce 7, then it indicates that something likely went wrong with transaction with nonce 6 (either it was not created or broadcasted correctly by a client, or it was dropped for whatever reason). This is a strong indication that the mempool transaction with nonce 7 will never be mined since the previous nonce is missing.\n\nClients that continue to broadcast transactions with the `possible_next_nonce` property of 8, then 9, then 10, will likely result in all of their pending/mempool transactions never going through. For all transactions go through, clients should first use any missing nonces before using the suggested `possible_next_nonce`.\n","url":"/docs/stacks/api/nonce-handling"},"259":{"id":"/docs/stacks/api/architecture","title":"Architecture","description":"Understand the architecture of the Stacks Blockchain API.","content":"\nimport { ImageZoom } from 'fumadocs-ui/components/image-zoom';\n\n<ImageZoom\n width=\"750\"\n height=\"450\"\n alt=\"stacks-api-architecture\"\n src='/images/api/architecture.svg'\n className=\"mt-0 mb-6 first-line:rounded-xl bg-background\"\n priority\n/>\n\n## RPC Endpoints\n\nThe `stacks-node` has its own minimal set of http endpoints referred to as `RPC endpoints`.\n\n- The `stacks-blockchain-api` allows clients to access RPC endpoints by proxying requests to a load-balanced pool of `stacks-nodes`.\n- For more details on RPC endpoints, see: [RPC Endpoints Documentation](https://github.com/blockstack/stacks-blockchain/blob/master/docs/rpc-endpoints.md)\n- Common RPC endpoints include:\n - `POST /v2/transactions` - Broadcast a transaction\n - `GET /v2/pox` - Retrieve current Proof of Transfer (PoX) relevant information\n - `POST /v2/contracts/call-read/<contract>/<function>` - Evaluate and return the result of calling a Clarity function\n - `POST /v2/fees/transaction` - Evaluate a given transaction and provide transaction fee estimation data\n - `GET /v2/accounts/<address>` - Fetch the current nonce required for creating transactions\n\n## Additional Endpoints\n\nThe Stacks Blockchain API implements additional endpoints that provide data unavailable directly from Stacks nodes due to various constraints.\n\n- The `stacks-node` may not persist certain data or may not serve it efficiently to many clients. For instance, while it can return the current STX balance of an account, it cannot provide a history of account transactions.\n- The API implements the Rosetta specification by Coinbase, an open standard designed to simplify blockchain deployment and interaction. More information can be found at [Rosetta API](https://www.rosetta-api.org/).\n- The API includes support for the Blockchain Naming System (BNS) endpoints. Details are available at [BNS Documentation](https://docs.stacks.co/clarity/example-contracts/bns).\n- For Express.js routes, see the directory `/src/api/routes`.\n\nThe API creates an \"event observer\" http server which listens for events from a stacks-node \"event emitter\".\n\nEvents are HTTP POST requests containing:\n - Blocks\n - Transactions\n\nByproducts of executed transactions such as:\n - Asset transfers\n - Smart-contract log data\n - Execution cost data\n\nThe API processes and stores these events as relational data in PostgreSQL. For the \"event observer\" code, see `/src/event-stream`.\n\n## OpenAPI and JSON Schema\n\nAll http endpoints and responses are defined in OpenAPI and JSON Schema.\n\n- See `/docs/openapi.yaml`\n- These are used to auto-generate the docs at https://hirosystems.github.io/stacks-blockchain-api/\n- JSON Schemas are converted into TypeScript interfaces, which are used internally by the db controller module to transform SQL query results into the correct object shapes.\n- OpenAPI and JSON Schemas are also used to generate a standalone `@stacks/blockchain-api-client`.\n\n## Development Setup\n\nThe easiest/quickest way to develop in this repo is using the VS Code debugger. It uses docker-compose to set up a stacks-node and Postgres instance.\n\nAlternatively, you can run `npm run dev:integrated` which does the same thing but without a debugger.\n","url":"/docs/stacks/api/architecture"},"260":{"id":"/docs/stacks/api/stacks-blockchain/blocks/get-block","title":"Get block","description":"Retrieves a single block.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/blocks/{height_or_hash}', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/blocks/get-block"},"261":{"id":"/docs/stacks/api/stacks-blockchain/blocks/recent-blocks","title":"Get recent blocks","description":"Retrieves a list of recently mined blocks.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/block/', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/blocks/recent-blocks"},"262":{"id":"/docs/stacks/api/stacks-blockchain/blocks/block-by-hash","title":"Get block by hash","description":"Retrieves block details of a specific block for a given chain height.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/block/{hash}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/stacks-blockchain/blocks/block-by-hash"},"263":{"id":"/docs/stacks/api/stacks-blockchain/blocks","title":"Blocks","description":"Handle the retrieval and management of block data using various identifiers.","content":"","url":"/docs/stacks/api/stacks-blockchain/blocks"},"264":{"id":"/docs/stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block","title":"Get blocks by burn block","description":"Retrieves a list of blocks confirmed by a specific burn block.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/burn-blocks/{height_or_hash}/blocks', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block"},"265":{"id":"/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-height","title":"Get block by burnchain block height","description":"Retrieves block details of a specific block for a given burnchain block height.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/block/by_burn_block_height/{burn_block_height}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-height"},"266":{"id":"/docs/stacks/api/stacks-blockchain/blocks/average-times","title":"Get average block times","description":"Retrieves average block times.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/blocks/average-times', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/stacks-blockchain/blocks/average-times"},"267":{"id":"/docs/stacks/api/stacks-blockchain/blocks/get-blocks","title":"Get blocks","description":"Retrieves a list of recently mined blocks.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/blocks/', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/blocks/get-blocks"},"268":{"id":"/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash","title":"Get block by burnchain block hash","description":"Retrieves block details of a specific block for a given burnchain block hash.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/block/by_burn_block_hash/{burn_block_hash}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash"},"269":{"id":"/docs/stacks/api/stacks-blockchain/blocks/block-by-height","title":"Get block by height","description":"Retrieves block details of a specific block for a given chain height.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/block/by_height/{height}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/stacks-blockchain/blocks/block-by-height"},"270":{"id":"/docs/stacks/api/stacks-blockchain/names/names","title":"Get all names","description":"Retrieves a list of all names known to the node.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/names/', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/names/names"},"271":{"id":"/docs/stacks/api/stacks-blockchain/names/name-subdomains","title":"Get name subdomains","description":"Retrieves the list of subdomains for a specific name.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/names/{name}/subdomains', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/names/name-subdomains"},"272":{"id":"/docs/stacks/api/stacks-blockchain/names/name-zonefile","title":"Get name zone file","description":"Retrieves the zone file for a specific name.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/names/{name}/zonefile', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/names/name-zonefile"},"273":{"id":"/docs/stacks/api/stacks-blockchain/names","title":"Names","description":"Manages and retrieve information on blockchain namespaces, names, and related details.","content":"","url":"/docs/stacks/api/stacks-blockchain/names"},"274":{"id":"/docs/stacks/api/stacks-blockchain/names/owned-by-address","title":"Get names owned by address","description":"Retrieves the list of names owned by a specific address.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/addresses/{blockchain}/{address}', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/names/owned-by-address"},"275":{"id":"/docs/stacks/api/stacks-blockchain/names/namespace-names","title":"Get namespace names","description":"Retrieves a list of names within a given namespace.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/namespaces/{tld}/names', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/names/namespace-names"},"276":{"id":"/docs/stacks/api/stacks-blockchain/names/namespaces","title":"Get all namespaces","description":"Retrieves a list of all namespaces known to the node.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/namespaces/', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/names/namespaces"},"277":{"id":"/docs/stacks/api/stacks-blockchain/names/name-details","title":"Get name details","description":"Retrieves details of a given name including the address, status and last transaction ID.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/names/{name}', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/names/name-details"},"278":{"id":"/docs/stacks/api/stacks-blockchain/names/historical-zonefile","title":"Get historical zone file","description":"Retrieves the historical zone file for a specific name.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/names/{name}/zonefile/{zoneFileHash}', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/names/historical-zonefile"},"279":{"id":"/docs/stacks/api/stacks-blockchain/fees/fee-rate","title":"Get fee rate","description":"Retrieves an estimated fee rate for transactions.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/fee_rate/', method: 'post' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/stacks-blockchain/fees/fee-rate"},"280":{"id":"/docs/stacks/api/stacks-blockchain/fees","title":"Fees","description":"Provide estimates, rates, and approximate calculations for transaction costs.","content":"","url":"/docs/stacks/api/stacks-blockchain/fees"},"281":{"id":"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients","title":"Get recent burnchain reward recipients","description":"Retrieves a list of recent burnchain (e.g. Bitcoin) reward recipients with the associated amounts and block info.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/burnchain/rewards', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients"},"282":{"id":"/docs/stacks/api/stacks-blockchain/stacking-rewards","title":"Stacking rewards","description":"Provides information on recent rewards, recipients, and total earned amounts.","content":"","url":"/docs/stacks/api/stacks-blockchain/stacking-rewards"},"283":{"id":"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient","title":"Get recent burnchain reward for the given recipient","description":"Retrieves a list of recent burnchain (e.g. Bitcoin) rewards for the given recipient with the associated amounts and block info.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/burnchain/rewards/{address}', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient"},"284":{"id":"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders","title":"Get recent reward slot holders","description":"Retrieves a list of the Bitcoin addresses that would validly receive Proof-of-Transfer commitments.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/burnchain/reward_slot_holders', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders"},"285":{"id":"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries","title":"Get recent reward slot holder entries","description":"Retrieves a list of the Bitcoin addresses that would validly receive Proof-of-Transfer commitments for a given reward slot holder recipient address.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/burnchain/reward_slot_holders/{address}', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries"},"286":{"id":"/docs/stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient","title":"Get total burnchain rewards for the given recipient","description":"Retrieves the total burnchain (e.g. Bitcoin) rewards for a given recipient address.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/burnchain/rewards/{address}/total', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient"},"287":{"id":"/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycles","title":"Get PoX cycles","description":"Retrieves a list of PoX cycles.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/pox/cycles', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycles"},"288":{"id":"/docs/stacks/api/stacks-blockchain/proof-of-transfer","title":"Proof of Transfer","description":"Retrieve information on PoX cycles, signers, and stackers.","content":"\n","url":"/docs/stacks/api/stacks-blockchain/proof-of-transfer"},"289":{"id":"/docs/stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle","title":"Get signer in PoX cycle","description":"Retrieves details for a signer in a PoX cycle.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle"},"290":{"id":"/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycle","title":"Get PoX cycle","description":"Retrieves details for a PoX cycle.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/pox/cycles/{cycle_number}', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycle"},"291":{"id":"/docs/stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle","title":"Get signers in PoX cycle","description":"Retrieves a list of signers in a PoX cycle.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/pox/cycles/{cycle_number}/signers', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle"},"292":{"id":"/docs/stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle","title":"Get stackers for signer in PoX cycle","description":"Retrieves a list of stackers for a signer in a PoX cycle.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}/stackers', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle"},"293":{"id":"/docs/stacks/api/stacks-blockchain/search/search-by-id","title":"Search by ID","description":"Search blocks, transactions, contracts, or accounts by hash/ID.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/search/{id}', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/search/search-by-id"},"294":{"id":"/docs/stacks/api/stacks-blockchain/search","title":"Search","description":"Search for a principal by ID.","content":"\n","url":"/docs/stacks/api/stacks-blockchain/search"},"295":{"id":"/docs/stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply","title":"Get total and unlocked STX supply","description":"Retrieves the total and unlocked STX supply.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/stx_supply/', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply"},"296":{"id":"/docs/stacks/api/stacks-blockchain/info/network-given-block-time","title":"Get a given network's target block time","description":"Retrieves the target block time for a given network.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/info/network_block_time/{network}', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/info/network-given-block-time"},"297":{"id":"/docs/stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text","title":"Get circulating STX supply in plain text format","description":"Retrieves the circulating STX supply as plain text.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/stx_supply/circulating/plain', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text"},"298":{"id":"/docs/stacks/api/stacks-blockchain/info/network-block-time","title":"Get the network target block time","description":"Retrieves the target block times for mainnet and testnet.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/info/network_block_times', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/info/network-block-time"},"299":{"id":"/docs/stacks/api/stacks-blockchain/info","title":"Info","description":"Retrieves information about the Core API and the Stacks network.","content":"","url":"/docs/stacks/api/stacks-blockchain/info"},"300":{"id":"/docs/stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text","title":"Get total STX supply in plain text format","description":"Retrieves the total STX supply as plain text.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/stx_supply/total/plain', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text"},"301":{"id":"/docs/stacks/api/stacks-blockchain/info/status","title":"Get API status","description":"Retrieves the running status of the Stacks Blockchain API.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/info/status"},"302":{"id":"/docs/stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply","title":"Get total and unlocked STX supply (legacy)","description":"Retrieves the total and unlocked STX supply in legacy format 1.0 API.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/stx_supply/legacy_format', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply"},"303":{"id":"/docs/stacks/api/stacks-blockchain/transactions/address-transactions","title":"Get address transactions","description":"Retrieves transactions sent or received by a STX address or smart contract ID.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/addresses/{address}/transactions', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/transactions/address-transactions"},"304":{"id":"/docs/stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction","title":"Get events for an address transaction","description":"Retrieves events for a specific transaction.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/addresses/{address}/transactions/{tx_id}/events', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction"},"305":{"id":"/docs/stacks/api/stacks-blockchain/transactions/transaction-events","title":"Get transaction events","description":"Retrieves events for a specific transaction.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/events', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/transactions/transaction-events"},"306":{"id":"/docs/stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions","title":"Get statistics for mempool transactions","description":"Retrieves statistics for transactions in the mempool, such as counts, ages, and fees.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/mempool/stats', method: 'get' }]}\n hasHead={false}\n/>\n\n","url":"/docs/stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions"},"307":{"id":"/docs/stacks/api/stacks-blockchain/transactions","title":"Transactions","description":"Manage, retrieve, and broadcast transaction data on the blockchain.","content":"","url":"/docs/stacks/api/stacks-blockchain/transactions"},"308":{"id":"/docs/stacks/api/stacks-blockchain/transactions/transactions-for-address","title":"Get transactions for address","description":"Retrieves transactions for a specific address.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{address}/mempool', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/stacks-blockchain/transactions/transactions-for-address"},"309":{"id":"/docs/stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions","title":"Get dropped mempool transactions","description":"Retrieves all recently-broadcast transactions that have been dropped from the mempool.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/mempool/dropped', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions"},"310":{"id":"/docs/stacks/api/stacks-blockchain/transactions/get-transaction","title":"Get transaction","description":"Retrieves details for a specific transaction.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/{tx_id}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/stacks-blockchain/transactions/get-transaction"},"311":{"id":"/docs/stacks/api/stacks-blockchain/transactions/details-for-transactions","title":"Get details for transactions","description":"Retrieves details for a list of transactions.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/multiple', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/stacks-blockchain/transactions/details-for-transactions"},"312":{"id":"/docs/stacks/api/stacks-blockchain/transactions/recent-transactions","title":"Get recent transactions","description":"Retrieves all recently mined transactions.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/stacks-blockchain/transactions/recent-transactions"},"313":{"id":"/docs/stacks/api/stacks-blockchain/transactions/mempool-transactions","title":"Get mempool transactions","description":"Retrieves all transactions that have been recently broadcast to the mempool. These are pending transactions awaiting confirmation.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/mempool', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/transactions/mempool-transactions"},"314":{"id":"/docs/stacks/api/stacks-blockchain/transactions/transactions-by-block","title":"Get transactions by block","description":"Retrieves transactions confirmed in a single block.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/blocks/{height_or_hash}/transactions', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/stacks-blockchain/transactions/transactions-by-block"},"315":{"id":"/docs/stacks/api/stacks-blockchain/transactions/get-raw-transaction","title":"Get raw transaction","description":"Retrieves a hex encoded serialized transaction for a given ID.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/{tx_id}/raw', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/transactions/get-raw-transaction"},"316":{"id":"/docs/stacks/api/stacks-blockchain/stacking-pool/members","title":"Get stacking pool members","description":"Retrieves the list of stacking pool members for a given delegator principal.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/pox4/{pool_principal}/delegations/', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/stacking-pool/members"},"317":{"id":"/docs/stacks/api/stacks-blockchain/stacking-pool","title":"Stacking pool","description":"Retrieve the list of stacking pool members for a given delegator principal.","content":"","url":"/docs/stacks/api/stacks-blockchain/stacking-pool"},"318":{"id":"/docs/stacks/api/stacks-blockchain/faucets","title":"Faucets","description":"Distribute testnet tokens to specified addresses.","content":"","url":"/docs/stacks/api/stacks-blockchain/faucets"},"319":{"id":"/docs/stacks/api/stacks-blockchain/faucets/stx","title":"STX Testnet tokens","description":"Delivers testnet STX tokens to a specified address.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/faucets/stx', method: 'post' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/faucets/stx"},"320":{"id":"/docs/stacks/api/stacks-blockchain/accounts/transactions-with-transfers","title":"Get account transactions with transfers","description":"Retrieves transactions for a specific account including STX transfers for each transaction.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/transactions_with_transfers', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/accounts/transactions-with-transfers"},"321":{"id":"/docs/stacks/api/stacks-blockchain/accounts/balances","title":"Get user balances","description":"Retrieves account balance information, including STX, fungible, and non-fungible tokens.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/balances', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/accounts/balances"},"322":{"id":"/docs/stacks/api/stacks-blockchain/accounts/transactions","title":"Get account transactions","description":"Retrieves transactions for a specific account.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/transactions', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/accounts/transactions"},"323":{"id":"/docs/stacks/api/stacks-blockchain/accounts/nft-events","title":"Get nft events","description":"Retrieves a list of all nft events associated with an account or a contract identifier.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/nft_events', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/accounts/nft-events"},"324":{"id":"/docs/stacks/api/stacks-blockchain/accounts/assets","title":"Get account assets","description":"Retrieves a list of all asset events associated with an account or a contract identifier.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/assets', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/stacks-blockchain/accounts/assets"},"325":{"id":"/docs/stacks/api/stacks-blockchain/accounts/transaction-with-transfers","title":"Get account transaction with transfers","description":"Retrieves transaction details for a specific transaction including STX transfers for each transaction.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/{tx_id}/with_transfers', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/accounts/transaction-with-transfers"},"326":{"id":"/docs/stacks/api/stacks-blockchain/accounts/latest-nonce","title":"Get the latest nonce","description":"Retrieves the latest nonce values used by an account by inspecting the mempool and anchored transactions.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/nonces', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/accounts/latest-nonce"},"327":{"id":"/docs/stacks/api/stacks-blockchain/accounts/stx-balances","title":"Get account STX balance","description":"Retrieves the STX token balance for a specified address or contract identifier.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/stx', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/accounts/stx-balances"},"328":{"id":"/docs/stacks/api/stacks-blockchain/accounts/inbound-stx-transfers","title":"Get inbound STX transfers","description":"Retrieves a list of STX transfers with memos to the given principal.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/stx_inbound', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/accounts/inbound-stx-transfers"},"329":{"id":"/docs/stacks/api/stacks-blockchain/smart-contracts/events","title":"Get contract events","description":"Retrieves a list of events that have been triggered by a given smart contract.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/contract/{contract_id}/events', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/smart-contracts/events"},"330":{"id":"/docs/stacks/api/stacks-blockchain/smart-contracts/by-trait","title":"Get contracts by trait","description":"Retrieves a list of contracts based on the following traits listed in JSON format - functions, variables, maps, fungible tokens and non-fungible tokens.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/contract/by_trait', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/smart-contracts/by-trait"},"331":{"id":"/docs/stacks/api/stacks-blockchain/smart-contracts","title":"Smart contracts","description":"Provide information and facilitate interactions with smart contracts.","content":"","url":"/docs/stacks/api/stacks-blockchain/smart-contracts"},"332":{"id":"/docs/stacks/api/stacks-blockchain/smart-contracts/info","title":"Get contract info","description":"Retrieves details for a specific smart contract.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/contract/{contract_id}', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/smart-contracts/info"},"333":{"id":"/docs/stacks/api/stacks-blockchain/smart-contracts/status","title":"Get contracts status","description":"Retrieves the deployment status of multiple smart contracts.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/smart-contracts/status', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/smart-contracts/status"},"334":{"id":"/docs/stacks/api/stacks-blockchain/mempool","title":"Mempool","description":"Retrieve information around transaction fees and priorities in the mempool.","content":"","url":"/docs/stacks/api/stacks-blockchain/mempool"},"335":{"id":"/docs/stacks/api/stacks-blockchain/mempool/transaction-fee-priorities","title":"Get transaction fee priorities","description":"Retrieves estimated fee priorities (in micro-STX) for all transactions that are currently in the mempool. Also returns priorities separated by transaction type.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/mempool/fees', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/api/stacks-blockchain/mempool/transaction-fee-priorities"},"336":{"id":"/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-block","title":"Get burn block","description":"Retrieves a single burn block.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/burn-blocks/{height_or_hash}', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-block"},"337":{"id":"/docs/stacks/api/stacks-blockchain/burn-blocks","title":"Burn blocks","description":"Retrieve information about specific burned blocks.","content":"","url":"/docs/stacks/api/stacks-blockchain/burn-blocks"},"338":{"id":"/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks","title":"Get burn blocks","description":"Retrieves a list of recent burn blocks.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/burn-blocks/', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks"},"339":{"id":"/docs/stacks/api/stacks-blockchain/tokens","title":"Tokens","description":"Read-only endpoints to obtain token details.","content":"","url":"/docs/stacks/api/stacks-blockchain/tokens"},"340":{"id":"/docs/stacks/api/stacks-blockchain/tokens/holders","title":"Get fungible token holders","description":"Retrieves the list of fungible token holders for a given token ID.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tokens/ft/{token}/holders', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/tokens/holders"},"341":{"id":"/docs/stacks/api/stacks-blockchain/non-fungible-tokens","title":"Non-fungible tokens","description":"Read-only endpoints to obtain non-fungible token details.","content":"","url":"/docs/stacks/api/stacks-blockchain/non-fungible-tokens"},"342":{"id":"/docs/stacks/api/stacks-blockchain/non-fungible-tokens/holdings","title":"Get non-fungible token holdings","description":"Retrieves a list of non-fungible tokens owned by the given principal (STX address or smart contract ID).","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tokens/nft/holdings', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/non-fungible-tokens/holdings"},"343":{"id":"/docs/stacks/api/stacks-blockchain/non-fungible-tokens/mints","title":"Get non-fungible token mints","description":"Retrieves a list of non-fungible token mints for a given asset identifier.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tokens/nft/mints', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/non-fungible-tokens/mints"},"344":{"id":"/docs/stacks/api/stacks-blockchain/non-fungible-tokens/history","title":"Get non-fungible token history","description":"Retrieves the history of a non-fungible token.","content":"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tokens/nft/history', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/stacks/api/stacks-blockchain/non-fungible-tokens/history"},"345":{"id":"/docs/stacks/api/getting-started","title":"Getting started","description":"Get started with Hiro APIs.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nThe Stacks Blockchain API expands the intentionally minimal RPC endpoints available in Stacks nodes and indexes, cleans, and enriches on-chain data to put everything you need at your fingertips. Who knew getting reliable blockchain data could be this easy?\n\n## Popular endpoints\n\n<Callout title=\"RPC endpoints\" type=\"info\">\nIf you're looking for direct access to the Stacks node, including the ability to broadcast transactions and interact with smart contracts, check out our [Stacks Node RPC](/stacks/rpc-api) documentation.\n</Callout>\n\n<Callout title=\"Need help building with the Stacks Blockchain API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#api</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n","url":"/docs/stacks/api/getting-started"},"346":{"id":"/docs/stacks/api/requesting-proofs","title":"Requesting proofs","description":"Understand proof requests from API endpoints.","content":"\nSeveral endpoints will request the [MARF Merkel Proof](https://github.com/stacksgov/sips/blob/main/sips/sip-004/sip-004-materialized-view.md#marf-merkle-proofs) by default.\n\nProvided with the proof, a client can verify the value, cumulative energy spent, and the number of confirmation for the response value provided by the API.\n\nRequesting the proof requires more resources (computation time, response time, and response body size). To avoid the additional resources, in case verification is not required, API endpoints allow setting the request parameter: `proof=0`. The returned response object will not have any proof fields.\n","url":"/docs/stacks/api/requesting-proofs"},"347":{"id":"/docs/stacks/setup","title":"Developer environment setup","description":"Set up your development environment for Stacks.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>","url":"/docs/stacks/setup"},"348":{"id":"/docs/stacks/testing-environments","title":"Testing environments","description":"Setup and configure testing environments for your Clarity smart contracts.","content":"\nIntegration testing is a crucial step in smart contract development that involves testing how different components of your system work together. The Clarinet JS SDK provides powerful tools for writing and running integration tests, allowing you to simulate complex scenarios and interactions between multiple contracts.\n\nBy using integration tests, you can ensure that your smart contracts function correctly as part of a larger system and catch potential issues that might not be apparent in unit tests alone.\n\nIn this guide, you will:\n\n1. [Set up a Clarinet project with a `defi` contract.](#set-up-a-clarinet-project)\n2. [Write an integration test for the smart contract.](#test-the-deposit-and-borrow-functionality)\n3. [Run tests and generate coverage reports.](#run-tests-and-generate-coverage-reports)\n\n---\n\n## Set up a Clarinet project\n\nStart by creating a new Clarinet project. This command will create a new directory named `defi` and set up a basic Clarinet project inside it.\n\n```terminal\n$ clarinet new stx-defi\n$ cd stx-defi\n```\n\nAfter changing into your project directory, run `npm install` to install the package dependencies for testing.\n\n```terminal\n$ npm install\n```\n\nWe are going to use the same `defi` contract that we used in the [unit testing guide](/stacks/clarinet-js-sdk/guides/unit-testing), but with some additional functionality - the ability to `borrow` STX from the contract. If you don't have this project set up already, follow the steps below:\n\n```terminal\n$ clarinet contract new defi\n```\n\nThen, inside your `defi.clar` file, copy and paste the following contract code:\n\n```clarity\n;; Error constants for various failure scenarios.\n(define-constant err-overborrow (err u300))\n\n;; The interest rate for loans, represented as 10% (out of a base of 100).\n(define-data-var loan-interest-rate uint u10) ;; Representing 10% interest rate\n\n\n;; Holds the total amount of deposits in the contract, initialized to 0.\n(define-data-var total-deposits uint u0)\n\n;; Maps a user's principal address to their deposited amount.\n(define-map deposits { owner: principal } { amount: uint })\n\n;; Maps a borrower's principal address to their loan details: amount and the last interaction block.\n(define-map loans principal { amount: uint, last-interaction-block: uint })\n\n;; Public function for users to deposit STX into the contract.\n;; Updates their balance and the total deposits in the contract.\n(define-public (deposit (amount uint))\n (let\n (\n ;; Fetch the current balance or default to 0 if none exists.\n (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n )\n ;; Transfer the STX from sender = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\" to recipient = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)\".\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n ;; Update the user's deposit amount in the map.\n (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })\n ;; Update the total deposits variable.\n (var-set total-deposits (+ (var-get total-deposits) amount))\n ;; Return success.\n (ok true)\n )\n)\n\n;; Public function for users to borrow STX based on their deposits.\n(define-public (borrow (amount uint))\n (let\n (\n ;; Fetch user's deposit or default to 0.\n (user-deposit (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n ;; Calculate the maximum amount the user is allowed to borrow. (which will be upto HALF of what they deposited)\n (allowed-borrow (/ user-deposit u2))\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n ;; Calculate the new loan total after borrowing additional amount.\n (new-loan (+ amount))\n )\n ;; Ensure the requested borrow amount does not exceed the allowed amount.\n (asserts! (<= new-loan allowed-borrow) err-overborrow)\n ;; Transfer the borrowed STX to the user.\n (let\n (\n (recipient tx-sender)\n )\n (try! (as-contract (stx-transfer? amount tx-sender recipient)))\n )\n ;; Update the user's loan details in the map.\n (map-set loans tx-sender { amount: new-loan, last-interaction-block: block-height })\n ;; Return success.\n (ok true)\n )\n)\n\n;; Read-only function to get the total balance by tx-sender\n(define-read-only (get-balance-by-sender)\n (ok (map-get? deposits { owner: tx-sender }))\n)\n\n;; Read-only function to get the total amount owed by the user.\n(define-read-only (get-amount-owed)\n (let\n (\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n )\n ;; Return the total amount due.\n (ok total-due)\n )\n)\n\n;; Private function to calculate the accrued interest on a loan.\n(define-private (calculate-accrued-interest (principal uint) (start-block uint))\n (let\n (\n ;; Calculate the number of blocks elapsed since the last interaction.\n (elapsed-blocks (- block-height start-block))\n ;; Calculate the interest based on the principal, rate, and elapsed time.\n (interest (/ (* principal (var-get loan-interest-rate) elapsed-blocks) u10000))\n )\n ;; Ensure the loan started in the past (not at block 0).\n (asserts! (not (is-eq start-block u0)) (ok u0))\n ;; Return the calculated interest.\n (ok interest)\n )\n)\n```\n\nRun `clarinet check` to ensure that your smart contract is valid and ready for testing.\n\n<Callout>\nYou can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi).\n</Callout>\n\n## Test the deposit and borrow functionality\n\nIn order to `borrow` STX from the contract, users must first `deposit` STX into it. Therefore, we need to write an integration test that simulates the interaction between these two functions.\n\nInside of your `defi.test.ts` file, replace the boilerplate code and add the following:\n\n```typescript\nimport { describe, it, expect } from 'vitest';\nimport { Cl } from '@stacks/transactions';\n\nconst accounts = simnet.getAccounts();\nconst wallet1 = accounts.get('wallet_1')!;\n\ndescribe('stx-defi', () => {\n it('borrows 10 and verifies the amount owed to be 10', () => {\n simnet.callPublicFn('defi', 'deposit', [Cl.uint(1000)], wallet1);\n const totalDeposits = simnet.getDataVar('defi', 'total-deposits');\n expect(totalDeposits).toBeUint(1000);\n\n simnet.callPublicFn('defi', 'borrow', [Cl.uint(10)], wallet1);\n const { result } = simnet.callReadOnlyFn('defi', 'get-amount-owed', [], wallet1);\n expect(result).toBeOk(Cl.uint(10));\n });\n});\n```\n\nIn this integration test, we're simulating a scenario where a user deposits STX into the DeFi contract and then borrows against that deposit. Let's walk through the process step by step.\n\nWe start by simulating a deposit of 1000 STX from `wallet1`. To do this, we use the `callPublicFn` method from the Clarinet JS SDK `simnet` object, which allows us to call public functions in our smart contract just as we would on the actual blockchain.\n\nAfter making the deposit, we want to verify that it was successful. We do this by checking the total deposits in the contract using `getDataVar`.\n\nThis handy method lets us peek at the value of data variables defined in your contract.\n\n<Callout>\nTo learn more about available methods for integration testing, check out the [reference page](/stacks/clarinet-js-sdk/references/methods).\n</Callout>\n\nTo ensure the deposit was recorded correctly, we use a custom matcher, `toBeUint`. This matcher is specifically designed to check if a value is a Clarity unsigned integer with the exact value we expect.\n\nWith the deposit confirmed, we simulate `wallet1` borrowing 10 STX. We do this with another call to `callPublicFn`, this time invoking the `borrow` function of our contract.\n\nAfter the borrowing operation, we want to check how much `wallet1` owes. We use `callReadOnlyFn` to call a read-only function named `get-amount-owed` in our contract.\n\nFinally, we verify the amount owed using another custom matcher, `toBeOk(Cl.uint(10))`. This matcher is particularly useful because it checks two things at once:\n\n1. That our contract returned a successful Clarity response type.\n2. That the value returned is a Clarity unsigned integer with the exact value we expect (`10`).\n\nThese custom matchers and simnet methods are powerful tools and allow you to simulate complex interactions with your smart contracts and make detailed assertions about the results.\n\n## Run tests and generate coverage reports\n\nTo run your tests, use:\n\n```terminal\n$ npm run test\n```\n\nTo generate a coverage report, use:\n\n```terminal\n$ npm run coverage\n```\n\nThis will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/methods\"\n title=\"SDK methods\"\n description=\"Learn about the methods available in the Clarinet JS SDK.\"\n />\n</Cards>\n","url":"/docs/stacks/testing-environments"},"349":{"id":"/docs/stacks/blockchain-development","title":"Blockchain development","description":"Build your blockchain on Stacks.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>","url":"/docs/stacks/blockchain-development"},"350":{"id":"/docs/stacks/connect","title":"Overview","description":"A JavaScript library for authenticating users as well as signing transactions and messages.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nStacks Connect is a JavaScript library that can authenticate the identity of your users and prompt them to sign transactions and messages. In other words, Stacks Connect handles some of the most basic functions you need in a web app, including enabling users to log in to your app as well as broadcasting in-app transactions to the Stacks network.\n\n## Installation\n\n```package-install\n@stacks/connect\n```\n\n## Guides\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/connect/guides/authenticate-users\"\n title=\"Authenticate users\"\n description=\"Connect to user wallets and authenticate their on-chain identity.\"\n />\n <SecondaryCard\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Enable users to interact with smart contracts through your app.\"\n />\n <SecondaryCard\n href=\"/stacks/connect/guides/sign-messages\"\n title=\"Sign messages\"\n description=\"Prompt users to sign and verify messages.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in the go-to development environment on Stacks.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n- **[Stacks.js](/stacks/stacks.js)**: A collection of JavaScript libraries to build web applications on Stacks.\n\n<br />\n\n<Callout title=\"Need help building with Stacks Connect?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#stacks-js</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>","url":"/docs/stacks/connect"},"351":{"id":"/docs/stacks/connect/support","title":"Wallet Support","description":"Compatibility information for different wallet providers","content":"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow\n} from \"@/components/ui/table\";\n\nThis page provides detailed information about which methods and events are supported by different wallet providers in the Stacks ecosystem.\n\n## Method Compatibility\n\n<Table>\n <TableHeader>\n <TableRow>\n <TableHead>Method</TableHead>\n <TableHead>Leather</TableHead>\n <TableHead>Xverse-like</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow>\n <TableCell><code>getAddresses</code></TableCell>\n <TableCell>🟡 No support for experimental purposes</TableCell>\n <TableCell>🟡 Use <code>wallet_connect</code> instead</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>sendTransfer</code></TableCell>\n <TableCell>🟡 Expects <code>amount</code> as string</TableCell>\n <TableCell>🟡 Expects <code>amount</code> as number</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>signPsbt</code></TableCell>\n <TableCell>🟡 Uses signing index array only</TableCell>\n <TableCell>🟡 Uses <code>signInputs</code> record instead of array</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_getAddresses</code></TableCell>\n <TableCell>🟢</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_getAccounts</code></TableCell>\n <TableCell>🔴</TableCell>\n <TableCell>🟢</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_getNetworks</code></TableCell>\n <TableCell>🔴</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_transferStx</code></TableCell>\n <TableCell>🟢</TableCell>\n <TableCell>🟢</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_transferSip10Ft</code></TableCell>\n <TableCell>🟢</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_transferSip9Nft</code></TableCell>\n <TableCell>🟢</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_callContract</code></TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only, no support for <code>postConditions</code></TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_deployContract</code></TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only, no support for <code>postConditions</code></TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_signTransaction</code></TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_signMessage</code></TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_signStructuredMessage</code></TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_updateProfile</code></TableCell>\n <TableCell>🔴</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n </TableBody>\n</Table>\n\n## Event Compatibility\n\n<Table>\n <TableHeader>\n <TableRow>\n <TableHead>Event</TableHead>\n <TableHead>Leather</TableHead>\n <TableHead>Xverse</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow>\n <TableCell><code>stx_accountChange</code></TableCell>\n <TableCell>🔴</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_networkChange</code></TableCell>\n <TableCell>🔴</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n </TableBody>\n</Table>\n\n**Legend**\n\n- 🔴 No support (yet)\n- 🟡 Partial support\n- 🟢 Supported\n\n## Compatibility Layer\n\nThe `request` method in `@stacks/connect` adds a layer of auto-compatibility for different wallet providers. This helps unify the interface where wallet providers may implement methods and results differently.\n\n| Method | Status | Notes |\n| --------------------------- | ------ | ---------------------------------------------------------------------------------------------------- |\n| `getAddresses` | 🔵 | Maps to `wallet_connect` for Xverse-like wallets |\n| `sendTransfer` | 🔵 | Converts `amount` to number for Xverse, string for Leather |\n| `signPsbt` | 🟡 | Transforms PSBT format for Leather (base64 to hex) with lossy restructure of `signInputs` |\n| `stx_getAddresses` | 🔵 | Maps to `wallet_connect` for Xverse-like wallets |\n| `stx_callContract` | 🔵 | Transforms Clarity values to hex-encoded format for compatibility |\n| `stx_deployContract` | 🔵 | Transforms Clarity values to hex-encoded format for compatibility |\n| `stx_signTransaction` | 🔵 | Transforms Clarity values to hex-encoded format for compatibility |\n| `stx_signMessage` | 🔵 | Transforms Clarity values to hex-encoded format for compatibility |\n| `stx_signStructuredMessage` | 🔵 | Transforms Clarity values to hex-encoded format for compatibility |\n\n- 🟢 No overrides needed for any wallet\n- 🔵 Has compatibility overrides that maintain functionality\n- 🟡 Has breaking overrides that may lose some information\n","url":"/docs/stacks/connect/support"},"352":{"id":"/docs/stacks/connect/examples/authenticate-users","title":"Authenticate users","description":"Connect to user wallets and authenticate your users using @stacks/connect.","content":"\nimport { ConnectWalletButton } from '@/components/code/connect-wallet-button';\nimport { ContentBackground } from '@/components/ui/icon';\n\nAuthentication is a fundamental part of many web applications, ensuring that users are who they claim to be and that their data is secure. With the Stacks blockchain, user authentication involves connecting to users' wallets and managing their sessions securely.\n\nThe `@stacks/connect` package provides the tools needed to integrate this functionality seamlessly into your web app.\n\nIn this guide, you will learn how to:\n\n1. [Install the `@stacks/connect` package](#install-the-stacksconnect-package).\n2. [Connect to a user's wallet](#connect-to-a-users-wallet).\n3. [Manage authentication state](#manage-authentication-state).\n4. [Access user data](#access-user-data).\n\n{/* <Callout>To see this guide in action, check out a full example [here](https://github.com/hiro-so/stacks-connect-example).</Callout> */}\n\n---\n\n## Install the @stacks/connect package\n\n```package-install\n@stacks/connect\n```\n\n## Connect to a user's wallet\n\nAfter installing the `@stacks/connect` package, you can use the `connect` function to initiate a wallet connection. This will trigger a popup that allows users to select and connect their wallet.\n\n```ts\nimport { connect } from '@stacks/connect';\n\nasync function authenticate() {\n const response = await connect();\n // response contains the user's addresses\n}\n```\n\n<div className=\"not-prose relative overflow-hidden\">\n <div className=\"relative bg-card rounded-lg border border-border/50 overflow-auto p-8 h-auto\">\n <div className=\"absolute inset-x-0 bottom-0\">\n <ContentBackground />\n </div>\n <div className=\"grid place-items-center h-full\">\n <ConnectWalletButton />\n </div>\n </div>\n</div>\n\nThe `connect` function stores the user's addresses in local storage by default, making it easy to persist the user's session across page reloads and browser sessions.\n\n<Callout>You can customize the connection behavior by passing options to the `connect` function, such as forcing wallet selection or specifying default providers. See the [advanced usage](/stacks/connect/packages/connect#advanced-usage) section for more details.</Callout>\n\n## Manage authentication state\n\nYou can manage the user's authentication state using the following functions:\n\n```ts\nimport { connect, disconnect, isConnected } from '@stacks/connect';\n\n// Check if user is connected\nconst authenticated = isConnected();\n\n// Connect to wallet\nawait connect();\n\n// Disconnect user\ndisconnect(); // clears local storage and selected wallet\n```\n\n## Access user data\n\nOnce connected, you can access the user's data using the `getLocalStorage` function or make specific requests using the `request` method:\n\n```ts\nimport { getLocalStorage, request } from '@stacks/connect';\n\n// Get stored user data\nconst userData = getLocalStorage();\n// {\n// \"addresses\": {\n// \"stx\": [\n// { \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\" },\n// ],\n// \"btc\": [\n// { \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\" },\n// ]\n// }\n// }\n\n// Get detailed account information\nconst accounts = await request('stx_getAccounts');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cd...\",\n// \"gaiaHubUrl\": \"https://hub.hiro.so\",\n// \"gaiaAppKey\": \"0488ade4040658015580000000dc81e3a5...\"\n// }\n// ]\n// }\n```\n\n<Callout title=\"Note\">For a list of all available methods, see the [reference](/stacks/connect/packages/connect) page.</Callout>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n <Card\n href=\"/stacks/stacks.js/guides/post-conditions\"\n title=\"Deep dive into post-conditions\"\n description=\"Learn how to build post-conditions to secure your smart contracts.\"\n />\n</Cards>","url":"/docs/stacks/connect/examples/authenticate-users"},"353":{"id":"/docs/stacks/connect/examples/broadcast-transactions","title":"Broadcast transactions","description":"Prompt users to sign transactions and broadcast them to the Stacks blockchain.","content":"\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nThe process of broadcasting transactions is fundamental for interacting with blockchains, whether you're transferring tokens, deploying contracts, or executing contract functions.\n\nIn this guide, you will learn how to:\n\n1. [Install the necessary packages](#setup-and-installation)\n2. [Connect to a user's wallet](#connect-to-a-users-wallet)\n3. [Sign and broadcast transactions](#sign-and-broadcast-transactions)\n4. [Handle transaction results](#handle-transaction-results)\n\n---\n\n## Setup and installation\n\nInstall the required packages to start building and broadcasting transactions:\n\n```package-install\n@stacks/connect @stacks/transactions\n```\n\n## Connect to a user's wallet\n\nBefore signing transactions, users need to connect their wallet to your application. Use the `connect` function to initiate a wallet connection:\n\n```ts\nimport { connect, isConnected } from '@stacks/connect';\n\nasync function connectWallet() {\n if (!isConnected()) {\n const response = await connect();\n console.log('Connected with addresses:', response);\n }\n}\n```\n\n<Callout>\n For more details on wallet connection, see the [authentication guide](/stacks/connect/guides/authenticate-users).\n</Callout>\n\n## Sign and broadcast transactions\n\nThere are three types of transactions you can create: STX transfers, contract deployments, and contract calls.\n\n<Tabs defaultValue=\"transfer\">\n <TabsList className='flex flex-wrap md:w-max'>\n <TabsTrigger value=\"transfer\" className='tab group'>\n <Badge className='badge transition-colors'>STX transfer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"deploy\" className='tab group'>\n <Badge className='badge transition-colors'>Contract deployment</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"execute\" className='tab group'>\n <Badge className='badge transition-colors'>Contract execution</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"transfer\">\n To transfer STX tokens, use the `request` method with `stx_transferStx`:\n\n ```ts\n import { request } from '@stacks/connect';\n\n async function transferStx() {\n const response = await request('stx_transferStx', {\n recipient: 'ST2EB9WEQNR9P0K28D2DC352TM75YG3K0GT7V13CV',\n amount: '100', // in micro-STX (1 STX = 1,000,000 micro-STX)\n memo: 'Reimbursement', // optional\n });\n \n console.log('Transaction ID:', response.txId);\n }\n ```\n </TabsContent>\n <TabsContent value=\"deploy\">\n To deploy a smart contract, use the `request` method with `stx_deployContract`:\n\n ```ts\n import { request } from '@stacks/connect';\n\n async function deployContract() {\n const codeBody = '(define-public (say-hi) (ok \"hello world\"))';\n \n const response = await request('stx_deployContract', {\n name: 'my-contract',\n code: codeBody,\n clarityVersion: 3, // optional, defaults to latest version\n });\n \n console.log('Transaction ID:', response.txId);\n }\n ```\n\n <Callout>Contracts will deploy to the Stacks address of the connected wallet.</Callout>\n </TabsContent>\n <TabsContent value=\"execute\">\n To call a contract function, use the `request` method with 'stx_callContract'. Here's an example using a simple contract:\n\n ```clarity\n (define-public (say-hi)\n (print \"hi\")\n (ok u0)\n )\n ```\n\n Here's how to call this function:\n\n ```ts\n import { request } from '@stacks/connect';\n import { Cl } from '@stacks/transactions';\n\n async function callContract() {\n const response = await request('stx_callContract', {\n contractAddress: 'ST22T6ZS7HVWEMZHHFK77H4GTNDTWNPQAX8WZAKHJ',\n contractName: 'my-contract',\n functionName: 'say-hi',\n functionArgs: [], // array of Clarity values\n });\n \n console.log('Transaction ID:', response.txId);\n }\n ```\n\n For functions that take arguments, you can use the `Cl` namespace to construct Clarity values:\n\n ```ts\n const functionArgs = [\n Cl.uint(123),\n Cl.stringAscii(\"hello\"),\n Cl.standardPrincipalCV(\"ST1X..\"),\n ];\n ```\n </TabsContent>\n</Tabs>\n\n## Handle transaction results\n\nWhen a transaction is signed and broadcast, the `request` method returns a response object containing information about the transaction:\n\n```ts\ninterface TransactionResponse {\n txId: string; // The transaction ID\n txRaw: string; // The raw transaction hex\n}\n```\n\nYou can use the transaction ID to create a link to view the transaction in the explorer:\n\n```ts\nasync function handleTransaction() {\n const response = await request('stx_transferStx', {\n recipient: 'ST2EB9WEQNR9P0K28D2DC352TM75YG3K0GT7V13CV',\n amount: '100',\n });\n \n const explorerUrl = `https://explorer.stacks.co/txid/${response.txId}`;\n console.log('View transaction in explorer:', explorerUrl);\n}\n```\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/sign-messages\"\n title=\"Sign messages\"\n description=\"Learn how to sign messages using Stacks.js.\"\n />\n <Card\n href=\"/stacks/stacks.js/guides/post-conditions\"\n title=\"Deep dive into post-conditions\"\n description=\"Learn how to use post-conditions to secure your smart contracts.\"\n />\n</Cards>\n","url":"/docs/stacks/connect/examples/broadcast-transactions"},"354":{"id":"/docs/stacks/connect/examples/sign-messages","title":"Sign messages","description":"Prompt users to sign a message to prove they control an address or authorize an in-app action.","content":"\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nWith Stacks Connect, users can sign a cryptographic message to prove ownership of a particular address. This is helpful for a wide range of use cases. For example, you can use message signing to create token-gated features (a user signs a message to prove they control an address holding the corresponding token requirements) or to prove the user agreed to your terms of service.\n\nIn this guide, you will learn how to:\n\n1. [Set up and install necessary packages](#setup-and-installation).\n2. [Connect to a user's wallet](#connect-to-a-users-wallet).\n3. [Sign messages](#sign-messages).\n4. [Verify signatures](#verify-signatures).\n\n---\n\n## Setup and installation\n\nUsing your preferred package manager, install the following packages:\n\n```package-install\n@stacks/connect @stacks/encryption\n```\n\n## Connect to a user's wallet\n\nBefore signing messages, users need to connect their wallet to your application. Use the `connect` function to initiate a wallet connection:\n\n```ts\nimport { connect, isConnected } from '@stacks/connect';\n\nasync function connectWallet() {\n if (!isConnected()) {\n const response = await connect();\n console.log('Connected with addresses:', response);\n }\n}\n```\n\n<Callout>\n For more details on wallet connection, see the [authentication guide](/stacks/connect/guides/authenticate-users).\n</Callout>\n\n## Sign messages\n\nTo request a message signature, use the `request` method with `stx_signMessage`:\n\n```ts\nimport { request } from '@stacks/connect';\n\nasync function signMessage() {\n const message = 'Hello World';\n \n const response = await request('stx_signMessage', {\n message,\n });\n \n console.log('Signature:', response.signature);\n console.log('Public key:', response.publicKey);\n}\n```\n\nFor structured messages, you can use `stx_signStructuredMessage`:\n\n```ts\nimport { request } from '@stacks/connect';\nimport { Cl } from '@stacks/transactions';\n\nasync function signStructuredMessage() {\n const message = Cl.tuple({\n structured: Cl.stringAscii('message'),\n num: Cl.uint(3)\n });\n \n const domain = Cl.tuple({\n name: Cl.stringAscii('My App'),\n version: Cl.stringAscii('1.0.0'),\n 'chain-id': Cl.uint(1)\n });\n\n const response = await request('stx_signStructuredMessage', {\n message,\n domain\n });\n \n console.log('Signature:', response.signature);\n console.log('Public key:', response.publicKey);\n}\n```\n\n## Verify signatures\n\nTo verify a signature, use the `verifyMessageSignatureRsv` function from the `@stacks/encryption` package:\n\n```ts\nimport { verifyMessageSignatureRsv } from '@stacks/encryption';\n\nasync function verifySignature() {\n const message = 'Hello World';\n \n const response = await request('stx_signMessage', {\n message\n });\n \n const { signature, publicKey } = response;\n \n const verified = verifyMessageSignatureRsv({\n message,\n signature,\n publicKey\n });\n \n if (verified) {\n console.log('Signature verified!');\n }\n}\n```\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n <Card\n href=\"/stacks/stacks.js/guides/post-conditions\"\n title=\"Deep dive into post-conditions\"\n description=\"Learn how to use post-conditions to secure your smart contracts.\"\n />\n</Cards>\n","url":"/docs/stacks/connect/examples/sign-messages"},"355":{"id":"/docs/stacks/connect/examples/migration","title":"Migration Guide","description":"How to migrate from v7.x.x to v8.x.x of @stacks/connect","content":"\nimport { Steps, Step } from 'fumadocs-ui/components/steps'\n\n\nFor a while now, the Stacks community has been working on a new standard for wallet-to-dapp communication.\nStacks Connect and related projects now use standards like [WBIPs](https://wbips.netlify.app/) and [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) to allow wallets to communicate with dapps in a more simplified and flexible way.\n\n<Callout title=\"Migration Status\">\nPlease be patient during this latest migration.\nThere has been a long-running effort together with wallets to modernize and move forward the Stacks web ecosystem.\nIt is now culminating in [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) and the new `request` method in Stacks Connect `8.x.x`.\nBear with us during this migration.\nWallets are still working through some bugs, details, and improvements.\n\n_Feel free to continue using Stacks Connect `7.x.x` while things stabilize._\nThe `7.x.x` version may still be more well supported by some wallets.\n\nFor the legacy version of `@stacks/connect` using JWT tokens, you can use:\n\n```sh\nnpm install @stacks/connect@7.10.1\n```\n\n</Callout>\n\n## Deprecations\n\nThe following classes, methods, and types are deprecated in favor of the new `request` RPC methods:\n\n- `show...` and `open...` methods\n- `authenticate` method\n- `UserSession` class and related functionality\n- `AppConfig` class\n- `SessionOptions` interface\n- `SessionData` interface\n- `UserData` interface\n- `SessionDataStore` class\n- `InstanceDataStore` class\n- `LocalStorageStore` class\n\n<Callout title=\"Backwards Compatibility\">\nTo make migrating easier, the familiar `UserSession` & `AppConfig` class still exists and is semi-backwards compatible for the `8.x.x` release.\nIt will \"cache\" the user's address in local storage and allow access to it via the `loadUserData` method (as previously done).\n</Callout>\n\n## Migration Steps\n\nTo update from `<=7.x.x` to latest/`8.x.x`, follow these steps:\n\n<Steps>\n <Step title=\"Update your @stacks/connect version\">\n ```sh\n npm install @stacks/connect@latest\n ```\n </Step>\n\n <Step title=\"Replace Legacy Methods with request\">\n Switch from `showXyz`, `openXyz`, `doXyz` methods to the `request` method:\n\n - `request` follows the pattern `request(method: string, params: object)`, see [Usage](#usage) for more details\n - `request` is an async function, so replace the `onFinish` and `onCancel` callbacks with `.then().catch()` or `try & await`\n\n Examples:\n - `showConnect()`, `authenticate()` → `connect()`\n - `useConnect().doContractCall({})` → `request(\"stx_callContract\", {})`\n - `openContractDeploy()` → `request(\"stx_deployContract\", {})`\n </Step>\n\n <Step title=\"Use Connect Instead of ShowConnect/Authenticate\">\n Switch from `showConnect` or `authenticate` to `connect()` methods:\n\n - `connect()` is an alias for `request({forceWalletSelect: true}, 'getAddresses')`\n - `connect()` by default caches the user's address in local storage\n </Step>\n\n <Step title=\"Update Authentication State Management\">\n - Switch from `UserSession.isSignedIn()` to `isConnected()`\n - Switch from `UserSession.signUserOut()` to `disconnect()`\n </Step>\n\n <Step title=\"Remove Legacy Code\">\n - Remove code referencing deprecated methods (`AppConfig`, `UserSession`, etc.)\n - Remove the `@stacks/connect-react` package\n - You may need to manually reload a component to see local storage updates\n - No custom hooks are needed to use Stacks Connect anymore\n - We are working on a new `@stacks/react` package that will make usage even easier in the future (e.g., tracking transaction status, reloading components when a connection is established, updating the page when the network changes, and more)\n </Step>\n</Steps>\n\n## Address Access\n\nPreviously, the `UserSession` class was used to access the user's addresses and data, which abstracted away the underlying implementation details.\nNow, the `request` method is used to directly interact with the wallet, giving developers more explicit control and clarity over what's happening under the hood.\nThis manual approach makes the wallet interaction more transparent and customizable.\nDevelopers can manually manage the currently connected user's address in e.g. local storage, jotai, etc. or use the `connect()`/`request()` method to cache the address in local storage.\n\n<Callout title=\"Security Note\">\nFor security reasons, the `8.x.x` release only returns the current network's address (where previously both mainnet and testnet addresses were returned).\n</Callout>\n","url":"/docs/stacks/connect/examples/migration"},"356":{"id":"/docs/stacks/connect/packages/connect","title":"@stacks/connect","description":"Connect is a JavaScript library for building web applications connected to Stacks.","content":"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\nStacks Connect enables you to authenticate your users and connect your app to their wallet. This reference contains more detailed information on how you can authenticate users, sign and broadcast transactions on their behalf, and enable users to sign messages.\n\n<Callout title=\"Migration Note\">\nPlease be patient during the migration to version 8.x.x. There has been a long-running effort together with wallets to modernize the Stacks web ecosystem, culminating in [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) and the new `request` method in Stacks Connect 8.x.x. For the legacy version of `@stacks/connect` using JWT tokens, please use version 7.10.1. See the [Migration Guide](/docs/stacks/connect/guides/migration) for more details.\n</Callout>\n\n### Installation\n\n```package-install\n@stacks/connect\n```\n\n### Connect to a wallet\n\nInitiate a wallet connection and request addresses:\n\n```typescript\nimport { connect } from '@stacks/connect';\n\nconst response = await connect(); // stores users address in local storage by default\n```\n\nGet the local storage data (stored by a connect call):\n\n```typescript\nimport { getLocalStorage } from '@stacks/connect';\n\nconst data = getLocalStorage();\n// {\n// \"addresses\": {\n// \"stx\": [\n// { \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\" },\n// ],\n// \"btc\": [\n// { \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\" },\n// ]\n// }\n```\n\nManaging the connection state:\n\n```typescript\nimport { connect, disconnect, isConnected } from '@stacks/connect';\n\nisConnected(); // false\nawait connect(); // similar to the `getAddresses` method\nisConnected(); // true\ndisconnect(); // clears local storage and selected wallet\nisConnected(); // false\n```\n\n### Use request to trigger wallet interactions\n\n```typescript\nimport { request } from '@stacks/connect';\n\n// CONNECT\nconst response = await request({ forceWalletSelect: true }, 'getAddresses');\n```\n\n### Available methods\n\n- [getAddresses](#getaddresses)\n- [sendTransfer](#sendtransfer)\n- [signPsbt](#signpsbt)\n- [stx_getAddresses](#stx_getaddresses)\n- [stx_getAccounts](#stx_getaccounts)\n- [stx_transferStx](#stx_transferstx)\n- [stx_callContract](#stx_callcontract)\n- [stx_deployContract](#stx_deploycontract)\n- [stx_signMessage](#stx_signmessage)\n- [stx_signStructuredMessage](#stx_signstructuredmessage)\n\n#### getAddresses\n\n```typescript\nconst response = await request('getAddresses');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\",\n// \"publicKey\": \"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69\",\n// },\n// {\n// \"address\": \"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr\",\n// \"publicKey\": \"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114\",\n// },\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\",\n// }\n// ]\n// }\n```\n\n#### sendTransfer\n\n```typescript\nconst response = await request('sendTransfer', {\n recipients: [\n {\n address: 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4', // recipient address\n amount: '1000', // amount in sats\n },\n // You can specify multiple recipients\n {\n address: 'bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh',\n amount: '2000',\n },\n ],\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### signPsbt\n\n```typescript\nconst response = await request('signPsbt', {\n psbt: 'cHNidP...', // base64 encoded PSBT string\n signInputs: [{ index: 0, address }], // indices of inputs to sign (optional)\n broadcast: false, // whether to broadcast the transaction after signing (optional)\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID (if broadcast is true)\n// \"psbt\": \"cHNidP...\" // The signed PSBT in base64 format\n// }\n```\n\n#### stx_getAddresses\n\n```typescript\nconst response = await request('stx_getAddresses');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\",\n// \"publicKey\": \"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69\",\n// },\n// {\n// \"address\": \"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr\",\n// \"publicKey\": \"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114\",\n// },\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\",\n// }\n// ]\n// }\n```\n\n#### stx_getAccounts\n\n```typescript\nconst response = await request('stx_getAccounts');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cd...\",\n// \"gaiaHubUrl\": \"https://hub.hiro.so\",\n// \"gaiaAppKey\": \"0488ade4040658015580000000dc81e3a5...\"\n// }\n// ]\n// }\n```\n\n#### stx_transferStx\n\n```typescript\nconst response = await request('stx_transferStx', {\n amount: '1000', // amount in micro-STX (1 STX = 1,000,000 micro-STX)\n recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN', // recipient address\n network: 'mainnet', // optional, defaults to mainnet\n memo: 'Optional memo', // optional memo field\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_callContract\n\n```typescript\nconst response = await request('stx_callContract', {\n contract: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN.counters', // contract in format: address.contract-name\n functionName: 'count', // name of the function to call\n functionArgs: [Cl.int(3)], // array of Clarity values as arguments\n network: 'mainnet', // optional, defaults to mainnet\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_deployContract\n\n```typescript\nconst response = await request('stx_deployContract', {\n name: 'counters', // name of the contract\n clarityCode: `(define-map counters principal int)\n\n(define-public (count (change int))\n (ok (map-set counters tx-sender (+ (get-count tx-sender) change)))\n)\n\n(define-read-only (get-count (who principal))\n (default-to 0 (map-get? counters who))\n)`, // Clarity code as string\n clarityVersion: '2', // optional, defaults to latest version\n network: 'mainnet', // optional, defaults to mainnet\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_signMessage\n\n```typescript\nconst response = await request('stx_signMessage', {\n message: 'Hello, World!', // message to sign\n});\n// {\n// \"signature\": \"0x1234...\", // The signature of the message\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\" // The public key that signed the message\n// }\n```\n\n#### stx_signStructuredMessage\n\n```typescript\nconst clarityMessage = Cl.parse('{ structured: \"message\", num: u3 }');\nconst clarityDomain = Cl.tuple({\n domain: Cl.stringAscii('example.com'),\n version: Cl.stringAscii('1.0.0'),\n 'chain-id': Cl.uint(1),\n});\n\nconst response = await request('stx_signStructuredMessage', {\n message: clarityMessage, // Clarity value representing the structured message\n domain: clarityDomain, // domain object for SIP-018 style signing\n});\n// {\n// \"signature\": \"0x1234...\", // The signature of the structured message\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\" // The public key that signed the message\n// }\n```\n\n### Error Handling\n\nThe `request` method returns a Promise, allowing you to handle errors using standard Promise-based error handling patterns. You can use either `try/catch` with `async/await` or the `.catch()` method with Promise chains.\n\n#### Using try/catch with async/await\n\n```typescript\nimport { request } from '@stacks/connect';\n\ntry {\n const response = await request('stx_transferStx', {\n amount: '1000',\n recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN',\n });\n // SUCCESS\n console.log('Transaction successful:', response.txid);\n} catch (error) {\n // ERROR\n console.error('Wallet returned an error:', error);\n}\n```\n\n### Compatibility\n\nThe `request` method by default adds a layer of auto-compatibility for different wallet providers. This is meant to unify the interface where wallet providers may not implement methods and results the same way.\n\n<Callout title=\"Wallet Support\">\nFor a complete list of wallet compatibility and support status, see the [Wallet Support](/docs/stacks/connect/support) page.\n</Callout>\n\n### Advanced Usage\n\n#### request\n\nThe `request` method is called with an optional options object as the first parameter:\n\n```typescript\nimport { request } from '@stacks/connect';\n\n// WITH options\nconst response = await request(\n {\n provider?: StacksProvider; // Custom provider to use for the request\n\n forceWalletSelect?: boolean; // Force user to select a wallet (default: false)\n persistWalletSelect?: boolean; // Persist selected wallet (default: true)\n enableOverrides?: boolean; // Enable provider compatibility (default: true)\n enableLocalStorage?: boolean; // Store address in local storage (default: true)\n\n defaultProviders?: WbipProvider[]; // Default wallets to display in modal\n approvedProviderIds?: string[]; // List of approved provider IDs to show in modal\n },\n 'method',\n params\n);\n\n// WITHOUT options\nconst response = await request('method', params);\n```\n\n<Callout title=\"Provider Compatibility\">\nThe `enableOverrides` option enables automatic compatibility fixes for different wallet providers. For example, it handles converting numeric types between string and number formats as needed by different wallets, and remaps certain method names to match wallet-specific implementations. This ensures consistent behavior across different wallet providers without requiring manual adjustments.\n</Callout>\n\n<Callout title=\"Approved Providers\">\nThe `approvedProviderIds` option allows you to filter which wallet providers are shown in the connect modal. This is useful when you want to limit the available wallet options to specific providers. For example, you might only want to support Leather wallet:\n\n```typescript\nconnect({ approvedProviderIds: ['LeatherProvider'] });\n```\n\nOr multiple specific wallets:\n\n```typescript\nconnect({ approvedProviderIds: ['LeatherProvider', 'xverse'] });\n```\n</Callout>\n\n#### requestRaw\n\nThe `requestRaw` method provides direct access to wallet providers without the additional features of `request`:\n\n```typescript\nimport { requestRaw } from '@stacks/connect';\n\nconst response = await requestRaw(provider, 'method', params);\n```\n\n<Callout title=\"Raw Request\">\n`requestRaw` bypasses the UI wallet selector, automatic provider compatibility fixes, and other features that come with `request`. Use this when you need more manual control over the wallet interaction process.\n</Callout>\n","url":"/docs/stacks/connect/packages/connect"},"357":{"id":"/docs/stacks/connect/quickstart","title":"Quickstart","description":"Learn how to transfer STX tokens via a web wallet using Stacks Connect.","content":"\nimport { ChevronRight, Code, Terminal, Folder as FolderIcon } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\n\nIn this quickstart guide, you will learn how to set up your project, authenticate users with a web wallet, and initiate a STX token transfer.\n\nFor a deeper dive into the authentication process, check out the [authenticate users](/stacks/connect/guides/authenticate-users) guide.\n\n---\n\n<Steps>\n <Step>\n ## Install package dependencies\n \n Add the necessary packages to your project using your preferred package manager.\n\n ```package-install\n @stacks/connect\n ```\n </Step>\n <Step>\n ## Connect to a wallet\n \n The `connect` function stores the user's address in local storage by default, making it easy to persist the user's session across page reloads and browser sessions.\n\n ```ts connect.ts\n import { connect } from '@stacks/connect';\n\n const response = await connect();\n ```\n\n To access the user's addresses, you can use the `getLocalStorage` function.\n\n ```ts storage.ts\n import { getLocalStorage } from '@stacks/connect';\n\n const data = getLocalStorage();\n ```\n\n You can manage the connection's state using the following:\n\n ```ts connect.ts\n import { connect, disconnect, isConnected } from '@stacks/connect';\n\n isConnected(); // false\n await connect(); // similar to the `getAddresses` method\n isConnected(); // true\n disconnect(); // clears local storage and selected wallet\n isConnected(); // false\n ```\n </Step>\n <Step>\n ## Use `request` to trigger a transfer\n \n The process of connecting to a wallet gives the web app information about the wallet account, which enables interactions with the Stacks blockchain, like calling smart contracts.\n\n Using the `request` function, you can trigger wallet interactions using the `stx_transferStx` method.\n\n ```tsx connect.tsx\n const response = await request('stx_transferStx', {\n amount: '1000', // amount in micro-STX (1 STX = 1,000,000 micro-STX)\n recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN', // recipient address\n network: 'mainnet', // optional, defaults to mainnet\n memo: 'Optional memo', // optional memo field\n });\n ```\n </Step>\n</Steps>\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/authenticate-users\"\n title=\"Authenticate users\"\n description=\"Learn how to authenticate users using the Connect package in Stacks.js.\"\n />\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n <Card\n href=\"/stacks/connect/guides/sign-messages\"\n title=\"Sign messages\"\n description=\"Learn how to sign messages using Stacks.js.\"\n />\n</Cards>\n","url":"/docs/stacks/connect/quickstart"},"358":{"id":"/docs/stacks/reference/clarinet-js-sdk/simnet","title":"Simnet","description":"The Simnet class is the main entry point for the Clarinet JS SDK. It provides properties and methods for interacting with the Clarinet network.","content":"\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/components/ui/accordion\"\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n# `initSimnet`\n\nThe `initSimnet` function initializes a simulated network. It will often be the first function you call when using the SDK.\n\n## Parameters\n\nThe `manifestPath` is the path to the `Clarinet.toml` manifest file.\n\n <Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='transition-colors'>Creating a new instance of simnet</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"custom\" className='tab group'>\n <Badge className='badge transition-colors'>With a custom config path</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet();\n ```\n </TabsContent>\n <TabsContent value=\"custom\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet('./config/Clarinet.toml');\n ```\n </TabsContent>\n </Tabs>\n\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"schema\">\n <AccordionTrigger>Schema</AccordionTrigger>\n <AccordionContent>\n ```ts\n initSimnet(manifestPath?: string): Promise<Simnet>\n ```\n </AccordionContent>\n </AccordionItem>\n </Accordion>","url":"/docs/stacks/reference/clarinet-js-sdk/simnet"},"359":{"id":"/docs/stacks/reference/clarinet-js-sdk/properties","title":"Properties","description":"The Clarinet JS SDK provides properties that can be used to interact with simnet.","content":"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `blockHeight`\n\nReturns the current block height of simnet.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the current block height</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentBlockHeight = simnet.blockHeight;\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n <Accordion title=\"Response\">\n ```ts\n 1\n ```\n </Accordion>\n</Accordions>\n\n\n# `deployer`\n\nReturns the default deployer address as defined in the project file.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the deployer address</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"set-deployer\" className='tab group'>\n <Badge className='badge transition-colors'>Setting the deployer to a new address</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentDeployerAddress = simnet.deployer;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"set-deployer\">\n ```ts\n simnet.deployer = 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5';\n const newDeployer = simnet.deployer\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `currentEpoch`\n\nReturns the current epoch of simnet.\n\nThis represents the Stacks blockchain's progress through discrete time periods, cycles, or upgrades.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the current epoch of simnet</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const epoch = simnet.currentEpoch;\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2.5\n ```\n </Accordion>\n</Accordions>\n\n","url":"/docs/stacks/reference/clarinet-js-sdk/properties"},"360":{"id":"/docs/stacks/reference/clarinet-js-sdk/custom-matchers","title":"Custom Matchers","description":"A set of Vitest matchers that can be used to make assertions on Clarity values with the Clarinet JS SDK.","content":"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `toHaveClarityType`\n\nCheck that a value has the right Clarity type, without checking its value.\n\n## Parameters\n\n\nThe Clarity type that the expected value should have.\n\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ok response</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toHaveClarityType(ClarityType.ResponseOk);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toHaveClarityType(expectedType: ClarityType)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeOk`\n\nCheck that a response is `(ok <ok-type>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ok response with a specific value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeOk(Cl.uint(1));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeOk(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeErr`\n\nCheck that a response is `(err <error-type>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an err response with a specific value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'add',\n [Cl.uint(19)],\n simnet.deployer\n );\n\n expect(result).toBeErr(Cl.uint(500));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-constant TOO_BIG u10)\n (define-data-var count uint u0)\n\n (define-public (add (amount uint))\n (begin\n (let ((new-count (+ (var-get count) amount)))\n (if (<= new-count TOO_BIG)\n (begin\n (var-set count new-count)\n (ok (var-get count))\n )\n (err u500)\n )\n )\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeErr(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n# `toBeSome`\n\nCheck that a response is `(some <value>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an optional value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant',\n [Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5')],\n simnet.deployer\n );\n\n expect(result).toBeSome(Cl.bool(true));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n (map-set ParticipantStatus 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeSome(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeNone`\n\nCheck that a response is `(none)`.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a none value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant',\n [Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5')],\n simnet.deployer\n );\n\n expect(result).toBeNone();\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeNone()\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeBool`\n\nAsserts the value of Clarity boolean (`true` or `false`).\n\n## Parameters\n\n\nThe `boolean` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a boolean value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'has-contributed',\n [Cl.standardPrincipal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM')],\n simnet.deployer\n );\n\n expect(result).toBeBool(true);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (has-contributed (who principal))\n (is-some (get contributionAmount (map-get? ParticipantStatus who)))\n )\n\n (map-set ParticipantStatus tx-sender { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBool(expected: boolean)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeInt`\n\nAsserts the value of a Clarity integer.\n\n## Parameters\n\n\nThe `integer` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an integer value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeInt(1); // or `1n`\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count int 0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) 1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeInt(expected: number | bigint)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeUint`\n\nAsserts the value of a Clarity unsigned integer.\n\n## Parameters\n\n\nThe `unsigned integer` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an unsigned integer value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeUint(1); // or `1n`\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeUint(expected: number | bigint)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeAscii`\n\nAsserts the value of a Clarity string-ascii.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a string-ascii value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'hello-world',\n 'say-hi',\n [],\n simnet.deployer\n );\n\n expect(result).toBeAscii('Hello World');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity hello-world.clar\n (define-read-only (say-hi)\n \"Hello World\"\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeAscii(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeUtf8`\n\nAsserts the value of a Clarity string-utf8.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a string-utf8 value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'hello-world',\n 'say-hi',\n [],\n simnet.deployer\n );\n\n expect(result).toBeUtf8('Hello World');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity hello-world.clar\n (define-read-only (say-hi)\n u\"Hello World\"\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeUtf8(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBePrincipal`\n\nAsserts the value of a Clarity principal.\n\nThe principal can be a standard or a contract principal.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a standard principal</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a contract principal</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const deployer = simnet.deployer;\n\n expect(Cl.standardPrincipal(deployer)).toBePrincipal(deployer);\n ```\n\n <Accordions>\n <Accordion title=\"Schema\">\n ```ts\n toBePrincipal(expected: string) \n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n const contract = `${simnet.deployer}.hello-world`;\n\n expect(Cl.contractPrincipal(contract)).toBePrincipal(contract);\n ```\n\n <Accordions>\n <Accordion title=\"Schema\">\n ```ts\n toBePrincipal(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeBuff`\n\nAsserts the value of a Clarity buffer. It takes an ArrayBuffer as an input.\n\nFor building a buffer, `@stacks/transactions` provides some helper functions:\n\n- `bufferFromAscii`\n- `bufferFromUtf8`\n- `bufferFromHex`\n\n## Parameters\n\n\nThe `Uint8Array` buffer that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a Uint8Array buffer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"ascii\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ASCII string buffer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"hex\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a hex string buffer</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-byte-array',\n [],\n simnet.deployer\n );\n\n const buffer = Uint8Array.from([1, 2, 3, 4]);\n expect(result).toBeBuff(buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant BUFFER 0x01020304)\n\n (define-read-only (get-byte-array)\n BUFFER\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"ascii\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-btc-buffer',\n [],\n simnet.deployer\n );\n\n const btc = Cl.bufferFromAscii('btc'); // or Cl.bufferFromUtf8('btc')\n\n expect(result).toBeBuff(btc.buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant ASCII_BTC 0x627463)\n\n (define-read-only (get-btc-buffer)\n ASCII_BTC\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"hex\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n \"helpers\",\n \"get-tx-hash\",\n [],\n simnet.deployer\n );\n\n const tx = Cl.bufferFromHex(\n \"73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e\"\n );\n\n expect(result).toBeBuff(tx.buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant TX_HASH 0x73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e)\n\n (define-read-only (get-tx-hash)\n TX_HASH\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeList`\n\nAsserts the value of a Clarity list containing an array of Clarity values.\n\n## Parameters\n\n\nThe `Uint8Array` buffer that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a list of Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-addresses',\n [],\n simnet.deployer\n );\n\n expect(result).toBeList(\n [\n Cl.standardPrincipal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM'),\n Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'),\n Cl.standardPrincipal('ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG')\n ]\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-read-only (get-addresses)\n (list\n 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeList(expected: ClarityValue[])\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeTuple`\n\nAsserts the value of a Clarity tuple.\n\n## Parameters\n\n\nThe `object` of Clarity values that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a tuple</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n \n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant-data',\n [Cl.standardPrincipal(simnet.deployer)],\n simnet.deployer\n );\n\n expect(result).toBeTuple({\n enrollmentBlock: Cl.some(Cl.uint(1)),\n contributionAmount: Cl.some(Cl.uint(19000000)),\n });\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-participant-data (who principal))\n {\n enrollmentBlock: (get enrollmentBlock (map-get? ParticipantStatus who)),\n contributionAmount: (get contributionAmount (map-get? ParticipantStatus who))\n }\n )\n\n (map-set ParticipantStatus tx-sender { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeTuple(expected: Record<string, ClarityValue>)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n","url":"/docs/stacks/reference/clarinet-js-sdk/custom-matchers"},"361":{"id":"/docs/stacks/reference/clarinet-js-sdk/methods","title":"Methods","description":"The Clarinet JS SDK provides several methods that can be used to interact with simnet.","content":"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `getAccounts`\n\nRetrieve a list of all Stacks addresses configured within the project, including wallets, deployers, and faucets.\n\n\n\n\n<Tabs defaultValue=\"get-accounts\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"get-accounts\" className='tab group'>\n <Badge className='badge transition-colors'>Getting your accounts</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-account\" className='tab group'>\n <Badge className='badge transition-colors'>Selecting a specific account</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"get-accounts\">\n ```ts\n const accounts = simnet.getAccounts();\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(10) {\n \"wallet_7\": \"ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ\",\n \"wallet_1\": \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n \"wallet_3\": \"ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC\",\n \"wallet_5\": \"ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB\",\n \"wallet_8\": \"ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP\",\n \"wallet_4\": \"ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND\",\n \"deployer\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n \"wallet_6\": \"ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0\",\n \"wallet_2\": \"ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\",\n \"faucet\": \"STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6\",\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAccounts(): Map<string, string>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"get-account\">\n ```ts\n const accounts = simnet.getAccounts();\n\n const wallet = accounts.get('wallet_1')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAccounts(): Map<string, string>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getAssetsMap`\n\nRetrieve a list of asset balances associated with Stacks addresses, including fungible and non-fungible tokens.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting STX account balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-ft-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Getting ft balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-nft-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Getting nft balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-deployer-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for an account</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const assets = simnet.getAssetsMap();\n\n const stxBalances = assets.get('STX')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(10) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 100000000000000n,\n \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\": 100000000000000n,\n \"ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\": 100000000000000n,\n \"ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC\": 100000000000000n,\n \"ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND\": 100000000000000n,\n \"ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB\": 100000000000000n,\n \"ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0\": 100000000000000n,\n \"ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP\": 100000000000000n,\n \"ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ\": 100000000000000n,\n \"STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6\": 100000000000000n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-ft-balance\">\n ```ts\n const contractName = 'token';\n const sourceCode = `\n (define-fungible-token sbtc)\n (ft-mint? sbtc u19 tx-sender)\n `;\n\n simnet.deployContract(\n contractName,\n sourceCode,\n null,\n simnet.deployer\n );\n\n const assets = simnet.getAssetsMap();\n\n const tokenBalance = assets.get('.token.sbtc')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(1) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 19n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-nft-balance\">\n ```ts\n const contractName = 'nft';\n const sourceCode = `\n (define-non-fungible-token ticket uint)\n (nft-mint? ticket u42 tx-sender)\n `;\n\n simnet.deployContract(\n contractName,\n sourceCode,\n null,\n simnet.deployer\n );\n\n const assets = simnet.getAssetsMap();\n\n const nftBalance = assets.get('.nft.ticket')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(1) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 1n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-deployer-balance\">\n ```ts\n const assets = simnet.getAssetsMap();\n const stxBalances = assets.get('STX')!;\n\n const deployerBalance = stxBalances.get('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 100000000000000n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `getDataVar`\n\nGet the value of a `data-var` defined in a contract.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `counter`</span>\n\nThe name of the `data-var` for the contract.\n\n<span>Example: `count`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the value of a data variable</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentCount = simnet.getDataVar('counter', 'count');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n (define-data-var contractOwner principal tx-sender)\n \n (var-set count (+ (var-get count) u1))\n (var-set contractOwner 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 1,\n value: 1n\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getDataVar(contract: string, dataVar: string): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const contractOwner = simnet.getDataVar(\"counter\", \"contractOwner\");\n\n const response = cvToValue(contractOwner);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n (define-data-var contractOwner principal tx-sender)\n \n (var-set count (+ (var-get count) u1))\n (var-set contractOwner 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getDataVar(contract: string, dataVar: string): ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getMapEntry`\n\nGet the value of a map entry by its key. Note that this method will always return an optional value `some` or `none`, just like Clarity `map-get?`.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the map within the contract.\n\n<span>Example: `Participants`</span>\n\nThe key to access the value in the map.\n\n<span>Example: `Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the value of an entry</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const hasParticipated = simnet.getMapEntry(\n \"pool\",\n \"Participants\",\n Cl.standardPrincipal(wallet)\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 10,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getMapEntry(\n contract: string,\n mapName: string,\n mapKey: ClarityValue\n ): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const hasParticipated = simnet.getMapEntry(\n \"pool\",\n \"Participants\",\n Cl.standardPrincipal(wallet)\n );\n\n const response = cvToValue(hasParticipated);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getMapEntry(\n contract: string,\n mapName: string,\n mapKey: ClarityValue\n ): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n# `callReadOnlyFn`\n\nCall read-only functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue`. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the read-only function within the contract.\n\n<span>Example: `get-participant`</span>\n\nThe arguments to pass to the read-only function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Making a function call</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"with-no-arguments\" className='tab group'>\n <Badge className='badge transition-colors'>With no arguments</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"deployer\" className='tab group'>\n <Badge className='badge transition-colors'>With an explicit contract address</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const getContributionAmount = simnet.callReadOnlyFn(\n 'pool',\n 'get-contribution-amount',\n [Cl.standardPrincipal(wallet)],\n wallet\n ); \n \n const response = getContributionAmount.result\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 1,\n value: 420000000n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"with-no-arguments\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const isActive = simnet.callReadOnlyFn(\n 'pool',\n 'is-active',\n [],\n wallet\n );\n \n const response = isActive.result\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 10,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"deployer\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const contractAddress = `${wallet}.pool`;\n\n const getParticipant = simnet.callReadOnlyFn(\n contractAddress,\n 'get-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = getParticipant.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 9,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const getContributionAmount = simnet.callReadOnlyFn(\n 'pool',\n 'get-contribution-amount',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = cvToValue(getContributionAmount.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n 42000000n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n \n </TabsContent>\n</Tabs>\n\n\n# `callPublicFn`\n\nCall public functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue` and the events fired during the function execution. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the public function within the contract.\n\n<span>Example: `register-participant`</span>\n\nThe arguments to pass to the public function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Broadcasting your transaction</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"events\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract events</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = registerParticipant.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 7,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n \n const response = cvToValue(registerParticipant.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"events\">\n ```ts\n import { Cl, cvToValue, type ClarityValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n \n const eventValues = registerParticipant.events.map((event) =>\n cvToValue(event.data.value as ClarityValue)\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n at: {\n type: \"uint\",\n value: \"2\",\n },\n message: {\n type: \"(string-ascii 10)\",\n value: \"Registered\",\n },\n who: {\n type: \"principal\",\n value: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `callPrivateFn`\n\nCall private functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue` and the events, if any, fired during the function execution. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the private function within the contract.\n\n<span>Example: `reward-participant-points`</span>\n\nThe arguments to pass to the private function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Broadcasting your transaction</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const address1 = accounts.get(\"wallet_1\")!\n\n const rewardParticipantPoints = simnet.callPrivateFn(\n \"pool\",\n \"reward-participant-points\",\n [Cl.standardPrincipal(address1)],\n wallet\n );\n\n const response = rewardParticipantPoints.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n (define-map ParticipantPoints principal int)\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (reward-participant-points who)\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (define-private (reward-participant-points (who principal))\n (map-insert ParticipantPoints who 100)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n (map-set ParticipantPoints tx-sender 1000)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 3,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n\n callPrivateFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const address1 = accounts.get(\"wallet_1\")!\n\n const rewardParticipantPoints = simnet.callPrivateFn(\n \"pool\",\n \"reward-participant-points\",\n [Cl.standardPrincipal(address1)],\n wallet\n );\n\n const response = cvToValue(registerParticipant.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n (define-map ParticipantPoints principal int)\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (reward-participant-points who)\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (define-private (reward-participant-points (who principal))\n (map-insert ParticipantPoints who 100)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n (map-set ParticipantPoints tx-sender 1000)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n\n callPrivateFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n \n</Tabs>\n\n\n\n# `transferSTX`\n\nTransfer STX from one address to another. The amount transferred is in `uSTX`.\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe amount of `uSTX` to transfer.\n\n<span>Example: `1000000` equals 1 STX</span>\n\nThe Stacks address of the recipient.\n\n<span>Example: `ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Transferring STX</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"events\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract events</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n result: {\n type: 7,\n value: {\n type: 3,\n },\n },\n events: [\n {\n event: \"stx_transfer_event\",\n data: [\n {\n amount: \"42000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n ],\n }\n ],\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n \n const response = cvToValue(transfer.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"events\">\n ```ts\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n\n const events = transfer.events.map((event) => event);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n event: \"stx_transfer_event\",\n data: {\n amount: \"42000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `deployContract`\n\nDeploy a contract to simnet.\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe name of the contract to be deployed.\n\n<span>Example: `hello-world`</span>\n\nThe Clarity source code (or content) of the contract.\n\n<span>Example: `(define-read-only (say-hi) (ok \"Hello World\"))`</span>\n\nAn object to specify options, such as the Clarity version.\n\n<span>Example: `{ clarityVersion: 2 }` | `null`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Deploying your contract</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Specifying a Clarity version</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"interact\" className='tab group'>\n <Badge className='badge transition-colors'>Interacting with your contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n const contract = simnet.deployContract(\n 'hello-world',\n sourceCode,\n null,\n simnet.deployer\n );\n\n const response = cvToValue(contract.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n true\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n const contract = simnet.deployContract(\n 'hello-world',\n sourceCode,\n { clarityVersion: 2 },\n simnet.deployer\n );\n\n const response = cvToValue(contract.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n true\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"interact\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n simnet.deployContract(\n 'hello-world',\n sourceCode,\n null,\n simnet.deployer\n );\n\n const sayHi = simnet.callReadOnlyFn(\"hello-world\", \"say-hi\", [], simnet.deployer);\n\n const response = sayHi.result\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"(string-ascii 11)\",\n value: \"Hello World\",\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineBlock`\n\nThe `callPublicFn`, `transferSTX`, and `deployContract` methods all mine one block with only one transaction. It can also be useful to mine a block with multiple transactions.\n\nThis is what `mineBlock` is for.\n\nThis method takes an array of transaction objects. The transactions can be built with the `tx` helper exported by the SDK.\n\nThe `tx` helper has three methods:\n- `callPublicFn`\n- `transferSTX`\n- `deployContract`\n\nThese methods have the same interface as simnet methods but instead of performing a transaction, they will build a transaction object that can be passed to the `mineBlock` function.\n\nIn epochs from 3.0 on, the stacks chaintip is advanced separately from the burn chaintip. This means `mineBlock` will only affect the stacks chaintip. If you'd like to also mine burn blocks, use the `mineEmptyBurnBlock` function.\n\n## Parameters\n\nAn array of transactions to be included in the block.\n\n<span>Example: `[tx.transferSTX(100, recipient, sender), ...]`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining multiple transactions in a single block</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { tx } from '@hirosystems/clarinet-sdk';\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get(\"wallet_1\")!;\n\n const block = simnet.mineBlock([\n tx.callPublicFn(\"counter\", \"increment\", [], simnet.deployer),\n tx.callPublicFn(\"counter\", \"add\", [Cl.uint(10)], simnet.deployer),\n tx.transferSTX(19000000, wallet, simnet.deployer),\n ]);\n\n block.forEach((transaction) => {\n console.log(cvToValue(transaction.result));\n if (transaction.events.length > 0) console.log(transaction.events);\n });\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n\n (define-public (add (amount uint))\n (begin\n (var-set count (+ (var-get count) amount))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"uint\",\n value: \"1\",\n }\n {\n type: \"uint\",\n value: \"11\",\n }\n {\n type: \"bool\",\n value: true,\n }\n [\n {\n event: \"stx_transfer_event\",\n data: {\n amount: \"19000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n mineBlock(txs: Tx[]): ParsedTransactionResult[]\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineEmptyBlock`\n\nMine one empty block and increase the block height by one.\n\nReturns the new block height.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining an empty block</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n simnet.mineEmptyBlock();\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlock(): number\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineEmptyBlocks`\n\nMine multiple empty blocks to reach a certain block height.\n\nReturns the new block height.\n\n## Parameters\n\nThe number of empty blocks to mine. This parameter is optional.\n\n<span>Example: `5`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining multiple empty blocks</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Mining an empty block without a count</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n simnet.mineEmptyBlocks(5);\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 6\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlocks(count?: number): number\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n simnet.mineEmptyBlocks();\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlocks(count?: number): number\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `runSnippet`\n\nExecute arbitrary Clarity code directly, which allows you to test and interact with smart contract functions without deploying them.\n\n## Parameters\n\nThe Clarity code snippet to be executed.\n\n<span>Example: `(define-read-only (get-balance) (ok stx-balance))`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Executing arbitrary Clarity code</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"transfer\" className='tab group'>\n <Badge className='badge transition-colors'>Running a snippet for a STX transfer</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const codeSnippet = simnet.runSnippet(\n '(stx-account tx-sender)'\n );\n\n const response = Cl.prettyPrint(codeSnippet, 2);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n locked: u0,\n unlock-height: u0,\n unlocked: u100000000000000\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n runSnippet(snippet: string): string | ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"transfer\">\n ```ts\n import { cvToValue } from \"@stacks/transactions\";\n\n const accounts = simnet.getAccounts();\n const recipient = accounts.get(\"wallet_1\")!;\n\n const codeSnippet = simnet.runSnippet(\n `(stx-transfer? u19000000 tx-sender '${recipient})`\n );\n\n const response = cvToValue(codeSnippet);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n runSnippet(snippet: string): string | ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `getContractsInterfaces`\n\nReturns the interfaces of the project contracts as a Map of Contracts, with the keys being the contract addresses.\n\nThese interfaces contain information such as the available `functions`, `data-vars`, `maps`, `NFTs`, and `FTs` defined in the contract.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting a specific contract interface</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"filter\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract functions</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractInterfaces = simnet.getContractsInterfaces();\n\n const response = contractInterfaces.get(`${simnet.deployer}.pool`);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n functions: [\n {\n name: \"get-participant\",\n access: \"read_only\",\n args: [\n [Object ...]\n ],\n outputs: [Object ...],\n }, {\n name: \"is-active\",\n access: \"read_only\",\n args: [],\n outputs: [Object ...],\n }\n ],\n variables: [],\n maps: [\n {\n name: \"ParticipantStatus\",\n key: \"principal\",\n value: [Object ...],\n }, {\n name: \"Participants\",\n key: \"principal\",\n value: \"bool\",\n }\n ],\n fungible_tokens: [],\n non_fungible_tokens: [],\n epoch: \"Epoch25\",\n clarity_version: \"Clarity2\",\n }\n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractsInterfaces(): Map<string, ContractInterface>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"filter\">\n ```ts\n const poolContract = contractInterfaces.get(`${simnet.deployer}.pool`);\n\n const response = poolContract?.functions;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n name: \"get-participant\",\n access: \"read_only\",\n args: [\n [Object ...]\n ],\n outputs: [Object ...],\n }, {\n name: \"is-active\",\n access: \"read_only\",\n args: [],\n outputs: [Object ...],\n }\n ]\n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractsInterfaces(): Map<string, ContractInterface>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getContractSource`\n\nGet the source code of a contract as a string.\n\n## Parameters\n\nThe identifier of the contract for which the source code is requested.\n\n<span>Example: `pool`</span>\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the source code of a contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractSource = simnet.getContractSource('pool');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```clarity\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractSource(contract: string): string | undefined\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `getContractAST`\n\nGet the full AST (Abstract Syntax Tree) of a Clarity contract.\n\nThis method throws an error if it fails to get the AST or to encode it.\n\n## Parameters\n\nThe identifier of the contract for which the AST (Abstract Syntax Tree) is requested.\n\n<span>Example: `pool`</span>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the source code of a contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractAST = simnet.getContractAST('pool');\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n contract_identifier: {\n issuer: [ 26, [\n 109, 120, 222, 123, 6, 37, 223, 191, 193, 108, 58, 138, 87, 53, 246, 220,\n 61, 195, 242, 206\n ] ],\n name: \"pool\",\n },\n pre_expressions: [],\n expressions: [\n {\n expr: [Object ...],\n id: 1,\n span: [Object ...],\n pre_comments: [],\n end_line_comment: undefined,\n post_comments: [],\n },\n ...\n ],\n top_level_expression_sorting: [ 0, 1, 2, 3 ],\n referenced_traits: Map {},\n implemented_traits: [],\n wasm_module: undefined,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractAST(contractId: string): ContractAST\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n","url":"/docs/stacks/reference/clarinet-js-sdk/methods"},"362":{"id":"/docs/stacks/reference/clarinet-js-sdk/clarinet-sdk","title":"@hirosystems/clarinet-sdk","description":"The main entry point for the Clarinet JS SDK. It provides properties and methods for interacting with the Clarinet network.","content":"\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/components/ui/accordion\"\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n# `initSimnet`\n\nThe `initSimnet` function initializes a simulated network. It will often be the first function you call when using the SDK.\n\n## Parameters\n\nThe `manifestPath` is the path to the `Clarinet.toml` manifest file.\n\n <Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='transition-colors'>Creating a new instance of simnet</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"custom\" className='tab group'>\n <Badge className='badge transition-colors'>With a custom config path</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet();\n ```\n </TabsContent>\n <TabsContent value=\"custom\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet('./config/Clarinet.toml');\n ```\n </TabsContent>\n </Tabs>\n\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"schema\">\n <AccordionTrigger>Schema</AccordionTrigger>\n <AccordionContent>\n ```ts\n initSimnet(manifestPath?: string): Promise<Simnet>\n ```\n </AccordionContent>\n </AccordionItem>\n </Accordion>","url":"/docs/stacks/reference/clarinet-js-sdk/clarinet-sdk"},"363":{"id":"/docs/stacks/reference/cli/clarinet","title":"Clarinet CLI","description":"The Clarinet CLI is a command-line tool for interacting with the Clarinet network.","content":"","url":"/docs/stacks/reference/cli/clarinet"},"364":{"id":"/docs/stacks/reference/cli/stacks-js","title":"Stacks.js CLI","description":"The Stacks.js CLI is a command-line tool for creating new Stacks.js projects.","content":"\n\n```package-install\ncreate stacks\n```","url":"/docs/stacks/reference/cli/stacks-js"},"365":{"id":"/docs/stacks/reference/stacks-blockchain-api/client","title":"@stacks/blockchain-api-client","description":"Interact with the Stacks blockchain using a JavaScript client library.","content":"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```\n\n### Using WebSockets\n\n```ts\nimport { connectWebSocketClient } from '@stacks/blockchain-api-client';\nconst client = await connectWebSocketClient('ws://api.hiro.so/');\nconst sub = await client.subscribeAddressTransactions(contractCall.txId, event => {\n console.log(event);\n});\n\nawait sub.unsubscribe();\n```\n","url":"/docs/stacks/reference/stacks-blockchain-api/client"},"366":{"id":"/docs/stacks/reference/stacks.js/connect","title":"@stacks/connect","description":"Connect is a JavaScript library for building web applications connected to Stacks.","content":"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\nStacks Connect enables you to authenticate your users and connect your app to their wallet. This reference contains more detailed information on how you can authenticate users, sign and broadcast transactions on their behalf, and enable users to sign messages.\n\n<Callout title=\"Migration Note\">\nPlease be patient during the migration to version 8.x.x. There has been a long-running effort together with wallets to modernize the Stacks web ecosystem, culminating in [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) and the new `request` method in Stacks Connect 8.x.x. For the legacy version of `@stacks/connect` using JWT tokens, please use version 7.10.1. See the [Migration Guide](/docs/stacks/connect/guides/migration) for more details.\n</Callout>\n\n### Installation\n\n```package-install\n@stacks/connect\n```\n\n### Connect to a wallet\n\nInitiate a wallet connection and request addresses:\n\n```typescript\nimport { connect } from '@stacks/connect';\n\nconst response = await connect(); // stores users address in local storage by default\n```\n\nGet the local storage data (stored by a connect call):\n\n```typescript\nimport { getLocalStorage } from '@stacks/connect';\n\nconst data = getLocalStorage();\n// {\n// \"addresses\": {\n// \"stx\": [\n// { \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\" },\n// ],\n// \"btc\": [\n// { \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\" },\n// ]\n// }\n```\n\nManaging the connection state:\n\n```typescript\nimport { connect, disconnect, isConnected } from '@stacks/connect';\n\nisConnected(); // false\nawait connect(); // similar to the `getAddresses` method\nisConnected(); // true\ndisconnect(); // clears local storage and selected wallet\nisConnected(); // false\n```\n\n### Use request to trigger wallet interactions\n\n```typescript\nimport { request } from '@stacks/connect';\n\n// CONNECT\nconst response = await request({ forceWalletSelect: true }, 'getAddresses');\n```\n\n### Available methods\n\n- [getAddresses](#getaddresses)\n- [sendTransfer](#sendtransfer)\n- [signPsbt](#signpsbt)\n- [stx_getAddresses](#stx_getaddresses)\n- [stx_getAccounts](#stx_getaccounts)\n- [stx_transferStx](#stx_transferstx)\n- [stx_callContract](#stx_callcontract)\n- [stx_deployContract](#stx_deploycontract)\n- [stx_signMessage](#stx_signmessage)\n- [stx_signStructuredMessage](#stx_signstructuredmessage)\n\n#### getAddresses\n\n```typescript\nconst response = await request('getAddresses');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\",\n// \"publicKey\": \"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69\",\n// },\n// {\n// \"address\": \"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr\",\n// \"publicKey\": \"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114\",\n// },\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\",\n// }\n// ]\n// }\n```\n\n#### sendTransfer\n\n```typescript\nconst response = await request('sendTransfer', {\n recipients: [\n {\n address: 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4', // recipient address\n amount: '1000', // amount in sats\n },\n // You can specify multiple recipients\n {\n address: 'bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh',\n amount: '2000',\n },\n ],\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### signPsbt\n\n```typescript\nconst response = await request('signPsbt', {\n psbt: 'cHNidP...', // base64 encoded PSBT string\n signInputs: [{ index: 0, address }], // indices of inputs to sign (optional)\n broadcast: false, // whether to broadcast the transaction after signing (optional)\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID (if broadcast is true)\n// \"psbt\": \"cHNidP...\" // The signed PSBT in base64 format\n// }\n```\n\n#### stx_getAddresses\n\n```typescript\nconst response = await request('stx_getAddresses');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\",\n// \"publicKey\": \"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69\",\n// },\n// {\n// \"address\": \"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr\",\n// \"publicKey\": \"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114\",\n// },\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\",\n// }\n// ]\n// }\n```\n\n#### stx_getAccounts\n\n```typescript\nconst response = await request('stx_getAccounts');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cd...\",\n// \"gaiaHubUrl\": \"https://hub.hiro.so\",\n// \"gaiaAppKey\": \"0488ade4040658015580000000dc81e3a5...\"\n// }\n// ]\n// }\n```\n\n#### stx_transferStx\n\n```typescript\nconst response = await request('stx_transferStx', {\n amount: '1000', // amount in micro-STX (1 STX = 1,000,000 micro-STX)\n recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN', // recipient address\n network: 'mainnet', // optional, defaults to mainnet\n memo: 'Optional memo', // optional memo field\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_callContract\n\n```typescript\nconst response = await request('stx_callContract', {\n contract: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN.counters', // contract in format: address.contract-name\n functionName: 'count', // name of the function to call\n functionArgs: [Cl.int(3)], // array of Clarity values as arguments\n network: 'mainnet', // optional, defaults to mainnet\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_deployContract\n\n```typescript\nconst response = await request('stx_deployContract', {\n name: 'counters', // name of the contract\n clarityCode: `(define-map counters principal int)\n\n(define-public (count (change int))\n (ok (map-set counters tx-sender (+ (get-count tx-sender) change)))\n)\n\n(define-read-only (get-count (who principal))\n (default-to 0 (map-get? counters who))\n)`, // Clarity code as string\n clarityVersion: '2', // optional, defaults to latest version\n network: 'mainnet', // optional, defaults to mainnet\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_signMessage\n\n```typescript\nconst response = await request('stx_signMessage', {\n message: 'Hello, World!', // message to sign\n});\n// {\n// \"signature\": \"0x1234...\", // The signature of the message\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\" // The public key that signed the message\n// }\n```\n\n#### stx_signStructuredMessage\n\n```typescript\nconst clarityMessage = Cl.parse('{ structured: \"message\", num: u3 }');\nconst clarityDomain = Cl.tuple({\n domain: Cl.stringAscii('example.com'),\n version: Cl.stringAscii('1.0.0'),\n 'chain-id': Cl.uint(1),\n});\n\nconst response = await request('stx_signStructuredMessage', {\n message: clarityMessage, // Clarity value representing the structured message\n domain: clarityDomain, // domain object for SIP-018 style signing\n});\n// {\n// \"signature\": \"0x1234...\", // The signature of the structured message\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\" // The public key that signed the message\n// }\n```\n\n### Error Handling\n\nThe `request` method returns a Promise, allowing you to handle errors using standard Promise-based error handling patterns. You can use either `try/catch` with `async/await` or the `.catch()` method with Promise chains.\n\n#### Using try/catch with async/await\n\n```typescript\nimport { request } from '@stacks/connect';\n\ntry {\n const response = await request('stx_transferStx', {\n amount: '1000',\n recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN',\n });\n // SUCCESS\n console.log('Transaction successful:', response.txid);\n} catch (error) {\n // ERROR\n console.error('Wallet returned an error:', error);\n}\n```\n\n### Compatibility\n\nThe `request` method by default adds a layer of auto-compatibility for different wallet providers. This is meant to unify the interface where wallet providers may not implement methods and results the same way.\n\n<Callout title=\"Wallet Support\">\nFor a complete list of wallet compatibility and support status, see the [Wallet Support](/docs/stacks/connect/support) page.\n</Callout>\n\n### Advanced Usage\n\n#### request\n\nThe `request` method is called with an optional options object as the first parameter:\n\n```typescript\nimport { request } from '@stacks/connect';\n\n// WITH options\nconst response = await request(\n {\n provider?: StacksProvider; // Custom provider to use for the request\n\n forceWalletSelect?: boolean; // Force user to select a wallet (default: false)\n persistWalletSelect?: boolean; // Persist selected wallet (default: true)\n enableOverrides?: boolean; // Enable provider compatibility (default: true)\n enableLocalStorage?: boolean; // Store address in local storage (default: true)\n\n defaultProviders?: WbipProvider[]; // Default wallets to display in modal\n approvedProviderIds?: string[]; // List of approved provider IDs to show in modal\n },\n 'method',\n params\n);\n\n// WITHOUT options\nconst response = await request('method', params);\n```\n\n<Callout title=\"Provider Compatibility\">\nThe `enableOverrides` option enables automatic compatibility fixes for different wallet providers. For example, it handles converting numeric types between string and number formats as needed by different wallets, and remaps certain method names to match wallet-specific implementations. This ensures consistent behavior across different wallet providers without requiring manual adjustments.\n</Callout>\n\n<Callout title=\"Approved Providers\">\nThe `approvedProviderIds` option allows you to filter which wallet providers are shown in the connect modal. This is useful when you want to limit the available wallet options to specific providers. For example, you might only want to support Leather wallet:\n\n```typescript\nconnect({ approvedProviderIds: ['LeatherProvider'] });\n```\n\nOr multiple specific wallets:\n\n```typescript\nconnect({ approvedProviderIds: ['LeatherProvider', 'xverse'] });\n```\n</Callout>\n\n#### requestRaw\n\nThe `requestRaw` method provides direct access to wallet providers without the additional features of `request`:\n\n```typescript\nimport { requestRaw } from '@stacks/connect';\n\nconst response = await requestRaw(provider, 'method', params);\n```\n\n<Callout title=\"Raw Request\">\n`requestRaw` bypasses the UI wallet selector, automatic provider compatibility fixes, and other features that come with `request`. Use this when you need more manual control over the wallet interaction process.\n</Callout>\n","url":"/docs/stacks/reference/stacks.js/connect"},"367":{"id":"/docs/stacks/reference/stacks.js/sbtc","title":"sbtc","description":"A JS/TS helper package for interacting with sBTC.","content":"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n\n## Installation\n\n```package-install\nsbtc\n```\n\n## Architecture\n\nThe sBTC protocol operates across multiple layers:\n\n- **Bitcoin**: The original funds are sourced from Bitcoin. A depositor sends these funds to a group of signers, which manage a (rotating) multisignature address formatted for sBTC transactions.\n\n- **sBTC API (Emily)**: This API is responsible for tracking deposits and notifying the signers about pending deposits.\n\n- **Stacks**: The network where sBTC is minted. Once the deposit is confirmed, the signers mint the corresponding amount of sBTC to the depositor's specified address on the Stacks network.\n\n## Deposit Flow\n\n- **Create Deposit (Bitcoin) Transaction**:\n - Structure a Bitcoin transaction to send funds to the group of signers.\n - Use a specialized format that includes:\n - Deposit Script: Identifies which Stacks address the sBTC will be minted to and what the maximum fee (in satoshis) the signers may take in exchange for minting.\n - Reclaim Script: Allows the sender to reclaim their funds if the transaction is not processed by the signers.\n\n- **Sign and Broadcast the Transaction**:\n - Sign the transaction with the sender's private key.\n - Broadcast the transaction to the Bitcoin network (Bitcoin Regtest for Stacks Testnet).\n\n- **Notify the sBTC API (Emily)**:\n - Inform the API about the transaction by submitting its details. This step ensures that the signers are aware of the deposit and can track it.\n\n- **Processing by Signers**: (no action required)\n - The signers retrieve and verify the deposit transaction from the Bitcoin blockchain.\n - Once verified, the signers mint the equivalent amount of sBTC on the Stacks network.\n\n- **Receive sBTC (Stacks)**: (no action required)\n - The minted sBTC is sent to the depositor's designated Stacks address, completing the deposit process.\n - sBTC is SIP-010 compatible and will show up in Stacks wallets and explorers.\n\n## Withdrawal Flow\n_Coming soon_\n\n## sBTC Package Functions\n\nThe sBTC package exports high-level functions for building addresses and transactions for deposits.\n\n### Examples\n\n \n#### buildSbtcDepositAddress\nBuild a deposit address and metadata using `buildSbtcDepositAddress` with a wallet provider using `sendTransfer`.\n\n```ts\nimport { buildSbtcDepositAddress, SbtcApiClientTestnet } from 'sbtc';\n\nconst client = new SbtcApiClientTestnet();\n\n// 1. BUILD THE DEPOSIT ADDRESS AND METADATA\nconst deposit = buildSbtcDepositAddress({\n stacksAddress: TARGET_STX_ADDRESS,\n signersPublicKey: await client.fetchSignersPublicKey(),\n\n // OPTIONAL DEFAULTS\n // maxSignerFee: 80_000, // optional: fee to pay for the deposit transaction (taken from the signers from the sats)\n // reclaimLockTime: 6_000, // optional: lock time for the reclaim script\n // network: REGTEST, // optional: which bitcoin network to use\n});\n\n// `deposit.address` is the deposit address (send funds here, aka the deposit address as an output)\n\n// 2. DEPOSIT USING YOUR FAVORITE WALLET (TYPICALLY ALSO BROADCASTED BY THE WALLET)\nconst txid = await WalletProvider.sendTransfer({\n recipient: deposit.address,\n amount: 100_000, // the amount to deposit; <=maxSignerFee is taken from this amount\n});\n\n// 3. NOTIFY THE SIGNERS\nawait client.notifySbtc({ txid, ...deposit });\n```\n\n#### buildSbtcDepositTx\nThe `buildSbtcDepositTx` function is similar to `buildSbtcDepositAddress`, but instead of returning just a deposit address, it constructs a complete Bitcoin transaction for depositing sBTC.\n\n```ts\nimport { buildSbtcDepositTx } from 'sbtc';\n\n// 1. BUILD THE DEPOSIT TRANSACTION AND METADATA\nconst deposit = buildSbtcDepositTx({\n amountSats: DEPOSIT_AMOUNT, // the amount in sats/sBTC to deposit; <=maxSignerFee is taken from this amount\n\n // same options as `buildSbtcDepositAddress`\n network,\n stacksAddress,\n signersPublicKey,\n maxSignerFee,\n reclaimLockTime,\n});\n\n// `deposit.transaction` has one output, which is the combined taproot of the deposit and reclaim scripts\n\n// 2. SIGN THE TRANSACTION\ndeposit.transaction.sign(YOUR_BTC_PRIVATE_KEY);\ndeposit.transaction.finalize();\n\n// 2. OR SIGN VIA EXTERNAL WALLET\nconst psbtBytes = deposit.transaction.toPSBT();\n\n// 3. BROADCAST THE TRANSACTION\nconst txid = await client.broadcastTx(deposit.transaction);\n\n// 4. NOTIFY THE SIGNERS\nawait client.notifySbtc(deposit);\n```\n\n\n#### sbtcDepositHelper\nCreate a fully-formed deposit transaction (assuming an address with spendable bitcoin UTXOs)\n\n<Callout>Use this helper function if you are not using a wallet provider</Callout>\n\n```ts\nimport { sbtcDepositHelper, SbtcApiClientTestnet } from 'sbtc';\n\nconst client = new SbtcApiClientTestnet();\n\n// 1. BUILD THE DEPOSIT TRANSACTION AND METADATA (GIVEN UTXOS FOR AN ADDRESS)\nconst deposit = await sbtcDepositHelper({\n stacksAddress: TARGET_STX_ADDRESS, // where to send/mint the sBTC\n amountSats: 5_000_000, // (maximum) amount of sBTC to deposit\n\n signersPublicKey: pub, // the aggregated public key of the signers\n\n feeRate: await client.fetchFeeRate('medium'),\n utxos: await client.fetchUtxos(YOUR_BTC_ADDRESS),\n\n bitcoinChangeAddress: YOUR_BTC_ADDRESS,\n});\n\n// 2. SIGN THE TRANSACTION\ndeposit.transaction.sign(YOUR_BTC_PRIVATE_KEY);\ndeposit.transaction.finalize();\n\n// 2. OR SIGN VIA EXTERNAL WALLET\nconst psbtBytes = deposit.transaction.toPSBT();\n\n// 3. BROADCAST TRANSACTION\nconst txid = await client.broadcastTx(deposit.transaction);\nconsole.log('txid', txid);\n\n// 4. NOTIFY THE SIGNERS\nconst res = await client.notifySbtc(deposit);\nconsole.log('res', res.status, res.statusMessage);\n```\n\n\n## HTTP Clients\n\nAdditionally, there are two API helpers, which make it easier to get all the data needed to create the above transactions:\n\n- **SbtcApiClientMainnet** — a client for communicating with the different pieces of the sBTC deployment\n- **SbtcApiClientTestnet** — a client for communicating with the different pieces of the sBTC deployment on Testnet\n- **SbtcApiClientDevenv** — a client for developing against a local deployment of sBTC\n\nWhile the final adjustments are still being made in the pre-release phase, this package may change default URLs and contract addresses on every minor release.\n\n| Version | Purpose | Functionality |\n| --- | --- | --- |\n| 0.1.x | Developer release (hackathon) | |\n| 0.2.x | Regtest/Testnet release | Deposit only |\n| 0.3.x | Mainnet pre-release | Deposit only |\n\n### Examples\n\n```ts\nimport { SbtcApiClientMainnet, SbtcApiClientTestnet, SbtcApiClientDevenv } from 'sbtc';\n\nconst client = new SbtcApiClientMainnet();\n// const client = new SbtcApiClientTestnet();\n// const client = new SbtcApiClientDevenv();\n\nconst pub = await client.fetchSignersPublicKey(); // fetches the aggregated public key of the signers\nconst address = await client.fetchSignersAddress(); // fetches the p2tr address of the aggregated public key of the signers\n\nconst feeRate = await client.fetchFeeRate('low'); // or 'medium', 'high'\nconst unspents = await client.fetchUtxos(BTC_ADDRESS);\nconst hex = await client.fetchTxHex(TXID);\n\nawait client.broadcastTx(DEPOSIT_BTC_TX); // broadcast a deposit BTC transaction\nawait client.notifySbtc(DEPOSIT_BTC_TX); // notify the sBTC API about the deposit (otherwise it won't be processed)\n\nconst sbtcBalance = await client.fetchSbtcBalance(STX_ADDRESS); // fetch the sBTC balance of an Stacks address\n```\n\n## API Reference\n\n### sbtcDepositHelper\n\n| Parameter | Description | Type | Default |\n| --- | --- | --- | --- |\n| signersPublicKey | Signers public key (aggregated schnorr) | string 32 byte hex | — |\n| amountSats | Bitcoin amount denominated in sats (* 10^8) | number, bigint | — |\n| stacksAddress | The deposit recipient Stacks address | string | — |\n| bitcoinChangeAddress | Bitcoin change address | string | — |\n| feeRate | Fee rate in sat/vbyte | number | — |\n| utxos | UTXOs to \"fund\" the transaction | UtxoWithTx[] | — |\n| reclaimPublicKey | Public key (schnorr, x-only) for reclaiming failed deposits | string | — |\n| reclaimLockTime | Optional reclaim lock time | number | 144 |\n| maxSignerFee | Optional maximum fee to pay to signers for the sBTC mint | number | 80_000 |\n| network | Optional Bitcoin network | BitcoinNetwork | MAINNET |\n| utxoToSpendable | Optional function to convert p2wpk and p2sh utxos to spendable inputs | Function | Best effort default implementation to make utxos spendable |\n| paymentPublicKey | Optional payment public key (currently only used for default utxoToSpendable.sh implementation) | string hex | — |\n\n### SbtcApiClient Configuration\n\n| Parameter | Description | Type |\n| --- | --- | --- |\n| sbtcContract | The multisig address of the initial sBTC contract | string |\n| sbtcApiUrl | The base URL of the sBTC API (Emily) | string |\n| btcApiUrl | The base URL of the Bitcoin mempool/electrs API | string |\n| stxApiUrl | The base URL of the Stacks API | string |\n","url":"/docs/stacks/reference/stacks.js/sbtc"},"368":{"id":"/docs/stacks/reference/stacks.js/transactions","title":"@stacks/transactions","description":"Construct, decode transactions and work with Clarity smart contracts on the Stacks blockchain.","content":"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\n## Installation\n\n```package-install\n@stacks/transactions\n```\n\nThis library supports the creation of the following Stacks transaction types:\n\n1. STX token transfer\n2. Smart contract deploy\n3. Smart contract function call\n\n## Key Generation\n\n```typescript -n\nimport { randomPrivateKey, privateKeyToPublicKey } from '@stacks/transactions';\n\n// Random key\nconst privateKey = randomPrivateKey();\nconst publicKey = privateKeyToPublicKey(privateKey);\n\n// Private key from hex string\nconst privateKey = 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01';\n```\n\n## STX Token Transfer Transaction\n\nUse the [`makeSTXTokenTransfer`](https://stacks.js.org/functions/_stacks_transactions.makeSTXTokenTransfer) (with a sender private key), or the \"unsigned\" version [`makeUnsignedSTXTokenTransfer`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedSTXTokenTransfer) (with a sender public key, without yet signing) to create a STX token transfer transaction.\n\n```ts -n\nimport { makeSTXTokenTransfer, broadcastTransaction } from '@stacks/transactions';\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n memo: 'test memo',\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n\n// to see the raw serialized tx\nconst serializedTx = transaction.serialize(); // hex string\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Smart Contract Deploy Transaction\n\nUse the [`makeContractDeploy`](https://stacks.js.org/functions/_stacks_transactions.makeContractDeploy), or the \"unsigned\" version [`makeUnsignedContractDeploy`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedContractDeploy) to create a smart contract deploy transaction.\n\n```ts -n\nimport { makeContractDeploy, broadcastTransaction } from '@stacks/transactions';\nimport { readFileSync } from 'fs';\n\nconst clarityCode = readFileSync('/path/to/contract.clar').toString();\n\nconst txOptions = {\n contractName: 'contract_name',\n codeBody: clarityCode,\n clarityVersion: 3, // optional, defaults to latest deployed version\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeContractDeploy(txOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Smart Contract Function Call (On-chain)\n\nIf you want to call a readonly function, use [`fetchCallReadOnlyFunction`](https://stacks.js.org/functions/_stacks_transactions.fetchCallReadOnlyFunction) instead.\n\nUse the [`makeContractCall`](https://stacks.js.org/functions/_stacks_transactions.makeContractCall) or the \"unsigned\" version [`makeUnsignedContractCall`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedContractCall) to create a smart contract function call transaction.\n\n```ts -n\nimport { makeContractCall, broadcastTransaction, Cl, Pc } from '@stacks/transactions';\n\n// Add an optional post condition\nconst condition01 = Pc.principal('SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE')\n .willSendGte(1000000n)\n .ustx();\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [Cl.bufferFromUtf8('foo string')],\n postConditions: [condition01],\n\n validateWithAbi: true, // check if the arguments given are compatible with the function\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeContractCall(txOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\nIn this example we construct a `contract-call` transaction with a post condition. We have set the `validateWithAbi` option to `true`, so the `makeContractCall` builder will attempt to fetch this contracts ABI from the specified Stacks network, and validate that the provided functionArgs match what is described in the ABI. This should help you avoid constructing invalid contract-call transactions. If you would prefer to provide your own ABI instead of fetching it from the network, the `validateWithAbi` option also accepts [ClarityABI](https://stacks.js.org/interfaces/_stacks_transactions.ClarityAbi) objects.\n\n## Sponsoring Transactions\n\nTo generate a sponsored transaction, first create and sign the transaction as the origin. The `sponsored` property in the options object must be set to true.\n\n```ts -n\nimport { makeContractCall, Cl } from '@stacks/transactions';\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [Cl.bufferFromUtf8('foo string')],\n validateWithAbi: true,\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n sponsored: true,\n};\n\nconst transaction = await makeContractCall(txOptions);\nconst serializedTx = transaction.serialize();\n\n// can't broadcast sponsored transactions before they are sponsored\n```\n\nThe serialized transaction can now be passed to the sponsoring party which will sign the sponsor portion of the transaction and set the fee.\n\n```ts -n\nimport { sponsorTransaction, broadcastTransaction } from '@stacks/transactions';\n\nconst deserializedTx = deserializeTransaction(serializedTx);\nconst sponsorKey = '770287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01';\nconst fee = 1000n;\n\nconst sponsorOptions = {\n transaction: deserializedTx,\n sponsorPrivateKey: sponsorKey,\n sponsorNonce: 0,\n fee,\n};\n\nconst sponsoredTx = await sponsorTransaction(sponsorOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction: sponsoredTx, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Supporting multi-signature transactions\n\nTo generate a multi-sig transaction, first create an unsigned transaction.\nThe `numSignatures` and `publicKeys` properties in the options object must be set:\n\n```ts -n\nimport {\n makeUnsignedSTXTokenTransfer,\n createStacksPrivateKey,\n deserializeTransaction,\n pubKeyfromPrivKey,\n publicKeyToString,\n TransactionSigner,\n standardPrincipalCV,\n BytesReader,\n AnchorMode,\n} from '@stacks/transactions';\n\nconst recipient = standardPrincipalCV('SP3FGQ8...');\nconst amount = 2500000n;\nconst fee = 0n;\nconst memo = 'test memo';\n\n// private keys of the participants in the transaction\nconst privKeyStrings = ['6d430bb9...', '2a584d89...', 'd5200dee...'];\n\n// create private key objects from string array\nconst privKeys = privKeyStrings.map(createStacksPrivateKey);\n\n// corresponding public keys\nconst pubKeys = privKeyStrings.map(pubKeyfromPrivKey);\n\n// create public key string array from objects\nconst pubKeyStrings = pubKeys.map(publicKeyToString);\n\nconst transaction = await makeUnsignedSTXTokenTransfer({\n recipient,\n amount,\n fee,\n memo,\n numSignatures: 2, // number of signature required\n publicKeys: pubKeyStrings, // public key string array with >= numSignatures elements\n anchorMode: AnchorMode.Any,\n});\n\nconst serializedTx = transaction.serialize();\n```\n\nThis transaction payload can be passed along to other participants to sign. In addition to\nmeeting the numSignatures requirement, the public keys of the parties who did not sign the\ntransaction must be appended to the signature.\n\n```ts -n\n// deserialize and sign transaction\nconst bytesReader = new BytesReader(serializedTx);\n// Partially signed or unsigned multi-sig tx can be deserialized to add the required signatures\nconst deserializedTx = deserializeTransaction(bytesReader);\n\nconst signer = new TransactionSigner(deserializedTx);\n\n// first signature\nsigner.signOrigin(privKeys[0]);\n\n// second signature\nsigner.signOrigin(privKeys[1]);\n\n// after meeting the numSignatures requirement, the public\n// keys of the participants who did not sign must be appended\nsigner.appendOrigin(pubKeys[2]);\n\n// the serialized multi-sig tx\nconst serializedSignedTx = deserializedTx.serialize();\n```\n\n## Calling Read-only Contract Functions\n\nRead-only contract functions can be called without generating or broadcasting a transaction. Instead it works via a direct API call to a Stacks node.\n\n```ts -n\nimport { bufferCVFromString, callReadOnlyFunction } from '@stacks/transactions';\nimport { StacksTestnet } from '@stacks/network';\n\nconst contractAddress = 'ST3KC0MTNW34S1ZXD36JYKFD3JJMWA01M55DSJ4JE';\nconst contractName = 'kv-store';\nconst functionName = 'get-value';\nconst buffer = bufferCVFromString('foo');\nconst network = new StacksTestnet();\nconst senderAddress = 'ST2F4BK4GZH6YFBNHYDDGN4T1RKBA7DA1BJZPJEJJ';\n\nconst options = {\n contractAddress,\n contractName,\n functionName,\n functionArgs: [buffer],\n network,\n senderAddress,\n};\n\nconst result = await callReadOnlyFunction(options);\n```\n\n## Constructing Clarity Values\n\nBuilding transactions that call functions in deployed clarity contracts requires you to construct valid Clarity Values to pass to the function as arguments. The [Clarity type system](https://github.com/stacksgov/sips/blob/master/sip/sip-002-smart-contract-language.md#clarity-type-system) contains the following types:\n\n- `(tuple (key-name-0 key-type-0) (key-name-1 key-type-1) ...)` : a typed tuple with named fields.\n- `(list max-len entry-type)` : a list of maximum length max-len, with entries of type entry-type\n- `(response ok-type err-type)` : object used by public functions to commit their changes or abort. May be returned or used by other functions as well, however, only public functions have the commit/abort behavior.\n- `(optional some-type)` : an option type for objects that can either be (some value) or none\n- `(buff max-len)` : byte buffer or maximum length max-len.\n- `principal` : object representing a principal (whether a contract principal or standard principal).\n- `bool` : boolean value (`true` or `false`)\n- `int` : signed 128-bit integer\n- `uint`: unsigned 128-bit integer\n\nThis library contains Typescript types and classes that map to the Clarity types, in order to make it easy to construct well-typed Clarity values in Javascript. These types all extend the abstract class `ClarityValue`.\n\n```ts -n\nimport {\n trueCV,\n falseCV,\n noneCV,\n someCV,\n intCV,\n uintCV,\n standardPrincipalCV,\n contractPrincipalCV,\n responseErrorCV,\n responseOkCV,\n listCV,\n tupleCV,\n bufferCV,\n} from '@stacks/transactions';\nimport { utf8ToBytes } from '@stacks/common';\n\n// construct boolean clarity values\nconst t = trueCV();\nconst f = falseCV();\n\n// construct optional clarity values\nconst nothing = noneCV();\nconst something = someCV(t);\n\n// construct a buffer clarity value from an existing byte array\nconst bytes = utf8ToBytes('foo'); // Uint8Array(3) [ 102, 111, 111 ]\nconst bufCV = bufferCV(bytes);\n\n// construct signed and unsigned integer clarity values\nconst i = intCV(-10);\nconst u = uintCV(10);\n\n// construct principal clarity values\nconst address = 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B';\nconst contractName = 'contract-name';\nconst spCV = standardPrincipalCV(address);\nconst cpCV = contractPrincipalCV(address, contractName);\n\n// construct response clarity values\nconst errCV = responseErrorCV(trueCV());\nconst okCV = responseOkCV(falseCV());\n\n// construct tuple clarity values\nconst tupCV = tupleCV({\n a: intCV(1),\n b: trueCV(),\n c: falseCV(),\n});\n\n// construct list clarity values\nconst l = listCV([trueCV(), falseCV()]);\n```\n\nIf you develop in Typescript, the type checker can help prevent you from creating wrongly-typed Clarity values. For example, the following code won't compile since in Clarity lists are homogeneous, meaning they can only contain values of a single type. It is important to include the type variable `BooleanCV` in this example, otherwise the typescript type checker won't know which type the list is of and won't enforce homogeneity.\n\n```ts -n\nconst l = listCV<BooleanCV>([trueCV(), intCV(1)]);\n```\n\n## Post Conditions\n\nThree types of post conditions can be added to transactions:\n\n1. STX post condition\n2. Fungible token post condition\n3. Non-Fungible token post condition\n\nFor details see: https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-post-conditions\n\n## STX post condition\n\n```ts -n\nimport {\n FungibleConditionCode,\n makeStandardSTXPostCondition,\n makeContractSTXPostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\n\nconst standardSTXPostCondition = makeStandardSTXPostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractSTXPostCondition = makeContractSTXPostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount\n);\n```\n\n## Fungible token post condition\n\n```ts -n\nimport {\n FungibleConditionCode,\n createAssetInfo,\n makeStandardFungiblePostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardFungiblePostCondition = makeStandardFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst contractFungiblePostCondition = makeContractFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n```\n\n## Non-fungible token post condition\n\n> **Warning**\n> The Stacks blockchain's post-condition processor can NOT check ownership.\n> It checks whether or not a principal **will send** or **will not send** an NFT.\n> Post-conditions can NOT verify anything about the recipient of an asset.\n> If you want to verify conditions about asset recipients, you will need to use [Clarity](https://docs.stacks.co/docs/write-smart-contracts/).\n\n```ts -n\nimport {\n NonFungibleConditionCode,\n createAssetInfo,\n makeStandardNonFungiblePostCondition,\n makeContractNonFungiblePostCondition,\n bufferCVFromString,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = NonFungibleConditionCode.DoesNotSend;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-asset';\nconst assetId = bufferCVFromString('test-token-asset-id');\nconst nonFungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardNonFungiblePostCondition = makeStandardNonFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractNonFungiblePostCondition = makeContractNonFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n```\n\n## Conversion of Clarity Values to JSON\n\nClarity Values represent values of Clarity contracts. If a JSON format is required the helper function `cvToJSON` can be used.\n\n```ts -n\nimport { cvToJSON, hexToCV } from '@stacks/transactions';\n\ncvToJSON(hexToCV(tx.tx_result.hex));\n```\n","url":"/docs/stacks/reference/stacks.js/transactions"},"369":{"id":"/docs/stacks/reference/stacks.js/network","title":"@stacks/network","description":"Network and API library for working with Stacks blockchain nodes.","content":"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\nThe `@stacks/network` package contains default network configurations for Stacks.\n\n## Installation\n\n<Callout type=\"tip\">\nBefore you install: most of the time you don't need to use or even install this library directly.\nFor example, instead of `STACKS_MAINNET`, simply use the string `\"mainnet\"` as the network parameter.\n</Callout>\n\n```package-install\n@stacks/network@latest\n```\n\n## Usage\n\n## The network object\n\nA network in Stacks.js is an object defining several properties.\n\n```ts\nimport { STACKS_MAINNET, STACKS_TESTNET, STACKS_DEVNET } from '@stacks/network';\n\nconsole.log(STACKS_MAINNET);\n// {\n// chainId: 1,\n// transactionVersion: 0,\n// peerNetworkId: 385875968,\n// magicBytes: 'X2',\n// bootAddress: 'SP000000000000000000002Q6VF78',\n// addressVersion: { singleSig: 22, multiSig: 20 }\n// }\n```\n\n## Network usage in transaction building\n\n```ts\nimport { STACKS_MAINNET } from '@stacks/network';\nimport { makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst txOptions = {\n recipient: 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26',\n amount: 100,\n // ...\n network: 'mainnet', // 'mainnet', 'testnet', or 'devnet', (defaults to mainnet)\n // OR\n network: STACKS_MAINNET, // any compatible network object\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n```\n","url":"/docs/stacks/reference/stacks.js/network"},"370":{"id":"/docs/stacks/reference/stacks.js/common","title":"@stacks/common","description":"Common utilities for working with Stacks.","content":"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\nThe `@stacks/common` package contains common utilities for working with Stacks.\nThis includes fetch helpers, middleware, and various other functions.\n\n## Installation\n\n```package-install\n@stacks/common@latest\n```\n\n\n## Use the built-in API key middleware\n\nSome Stacks APIs make use API keys to provide less rate-limited plans.\n\n```typescript\nimport { createApiKeyMiddleware, createFetchFn, StacksMainnet } from '@stacks/network';\nimport { broadcastTransaction, getNonce, makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst myApiMiddleware = createApiKeyMiddleware('example_e8e044a3_41d8b0fe_3dd3988ef302');\nconst myFetchFn = createFetchFn(myApiMiddleware); // middlewares can be used to create a new fetch function\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n memo: 'some memo',\n anchorMode: AnchorMode.Any,\n client: {\n fetch: myFetchFn,\n }\n};\nconst transaction = await makeSTXTokenTransfer(txOptions); // fee-estimation will use the custom fetchFn\n\nconst response = await broadcastTransaction(transaction, myMainnet); // make sure to broadcast via the custom network object\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', myMainnet);\n```\n\n## Use custom middleware\n\nMiddleware can be used to hook into network calls before sending a request or after receiving a response.\n\n```typescript\nimport { createFetchFn, RequestContext, ResponseContext } from '@stacks/common';\n\nconst preMiddleware = (ctx: RequestContext) => {\n ctx.init.headers = new Headers();\n ctx.init.headers.set('x-foo', 'bar'); // override headers and set new `x-foo` header\n};\nconst postMiddleware = (ctx: ResponseContext) => {\n console.log(await ctx.response.json()); // log response body as json\n};\n\nconst fetchFn = createFetchFn({ pre: preMiddleware, post: preMiddleware }); // a middleware can contain `pre`, `post`, or both\nconst network = new StacksTestnet({ fetchFn });\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', network);\n```\n\n## Get various API URLs\n\n```typescript\nconst txBroadcastUrl = network.getBroadcastApiUrl();\n\nconst feeEstimateUrl = network.getTransferFeeEstimateApiUrl();\n\nconst address = 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26';\nconst accountInfoUrl = network.getAccountApiUrl(address);\n\nconst contractName = 'hello_world';\nconst abiUrl = network.getAbiApiUrl(address, contractName);\n\nconst functionName = 'hello';\nconst readOnlyFunctionCallUrl = network.getReadOnlyFunctionCallApiUrl(\n address,\n contractName,\n functionName\n);\n\nconst nodeInfoUrl = network.getInfoUrl();\n\nconst blockTimeUrl = network.getBlockTimeInfoUrl();\n\nconst poxInfoUrl = network.getPoxInfoUrl();\n```\n","url":"/docs/stacks/reference/stacks.js/common"},"371":{"id":"/docs/stacks/chainhook/references/scopes/bitcoin","title":"Bitcoin Scopes","description":"Reference guide for available scopes for Bitcoin.","content":"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\nimport { InlineCode } from '@/components/inline-code';\n\nBitcoin scopes are parameters you use to define the `if this` specification logic of your Chainhook on the Bitcoin blockchain. In other words, scopes specify what on-chain events you are looking to monitor and track. For more information on Chainhook design, please view [predicate design](/stacks/chainhook/concepts/predicate-design).\n\n<Root>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`txid`</h2>\n\nThe `txid` scope allows you to query transactions based on their transaction ID. This is particularly useful for tracking specific transactions or auditing transaction histories.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"equals\"} type={\"string\"}>\n\nThe `equals` property is a 32 byte hex encoded type used to specify the exact transaction ID to match.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By transaction ID</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"txid\",\n \"equals\": \"0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`outputs`</h2>\n\nThe `outputs` scope allows you to query blocks based on the payload returned by the specified operation.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"operation\"} type={\"object\"}>\n \nThe `operation` property is used to identify the Bitcoin operation that will trigger Chainhook as it observes Bitcoin transactions. The available operations are `op_return`, `p2pkh`, `p2sh`,`p2wpkh` and `p2wsh`.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"op_return\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"op_return\" className='tab group'>\n <Badge className='badge transition-colors'>Using op_return</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"p2kph\" className='tab group'>\n <Badge className='badge transition-colors'>Using p2pkh</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"p2sh\" className='tab group'>\n <Badge className='badge transition-colors'>Using p2sh</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"p2wpkh\" className='tab group'>\n <Badge className='badge transition-colors'>Using p2wpkh</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"p2wsh\" className='tab group'>\n <Badge className='badge transition-colors'>Using p2wsh</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"descriptor\" className='tab group'>\n <Badge className='badge transition-colors'>Using descriptor</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"op_return\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"op_return\": {\n \"equals\": \"0xbtc21000042stx016\"\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"equals\" type=\"string/32-byte encoded hex\">\n The `equals` property specifies the exact characters of the string or 32 byte encoded hex to match.\n </Property>\n <Property required={true} deprecated={false} name=\"starts_with\" type=\"string/32-byte encoded hex\">\n The `starts_with` property specifies the starting characters of the string or 32 byte encoded hex to match.\n </Property>\n <Property required={true} deprecated={false} name=\"ends_with\" type=\"string/32-byte encoded hex\">\n The `ends_with` property specifies the ending characters of the string or 32 byte encoded hex to match.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n The `op_return` operation allows for `equals`, `starts_with` and `ends_with` for matching against the desired input. \n </Callout>\n </TabsContent>\n <TabsContent value=\"p2kph\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2kph\": {\n \"equals\": \"0xbtc21000042stx016\"\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"equals\" type=\"string/32-byte encoded hex\">\n The `equals` property specifies the exact characters of the string or 32 byte encoded hex to match.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n `p2pkh`(Pay-to-Public-Key-Hash) is a Bitcoin transaction output script type that allows users to send funds to a recipient's hashed public key, providing security and privacy by concealing the actual public key.\n </Callout>\n </TabsContent>\n <TabsContent value=\"p2sh\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2sh\": {\n \"equals\": \"0xbtc21000042stx016\"\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"equals\" type=\"string/32-byte encoded hex\">\n The `equals` property specifies the exact characters of the string or 32 byte encoded hex to match.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n `p2sh`(Pay-to-Script-Hash) is a Bitcoin transaction output script type that enables users to send funds to a script instead of a public key, allowing for more complex transaction conditions and multi-signature addresses.\n </Callout>\n </TabsContent>\n <TabsContent value=\"p2wpkh\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2wpkh\": {\n \"equals\": \"0xbtc21000042stx016\"\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"equals\" type=\"string\">\n The `equals` property specifies the exact characters of the string to match.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n `p2wpkh`(Pay-to-Witness-Public-Key-Hash) is a Bitcoin transaction output script type used in Segregated Witness (SegWit) that allows for more efficient and secure transactions by separating the witness data from the transaction data and storing it in a separate block. \n </Callout>\n </TabsContent>\n <TabsContent value=\"p2wsh\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2wsh\": {\n \"equals\": \"0xbtc21000042stx016\"\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"equals\" type=\"string\">\n The `equals` property specifies the exact characters of the string to match.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n `p2wsh` (Pay-to-Witness-Script-Hash) is a Bitcoin transaction output script type used in Segregated Witness (SegWit) that enables users to send funds to a hashed script, allowing for more complex transaction conditions and greater scalability by separating the script from the transaction data.\n </Callout>\n </TabsContent>\n <TabsContent value=\"descriptor\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"descriptor\": {\n \"expression\": \"wpkh(tprv8ZgxMBicQKsPePxn6j3TjvB2MBzQkuhGgc6oRh2WZancZQgxktcnjZJ44XdsRiw3jNkbVTK9JW6KFHvnRKgAMtSyuBevMJprSkZ4PTfmTgV/84'/1'/0'/0/*)\",\n \"range\": [0, 3]\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"expression\" type=\"string\">\n The `expression` property specifies the exact characters of the string to match.\n </Property>\n <Property required={true} deprecated={false} name=\"range\" type=\"integer[]\">\n The `range` property specifies and array of integers representing the desired indexes.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n <Accordions>\n <Accordion title=\"Wallet descriptors\">\n Wallet descriptors provide a compact and semi-standardized method for describing how scripts and addresses within a wallet are generated. Chainhook users that want to track addresses derived from an extended pubkey or a multisig-wallet can now rely on this feature instead of defining one predicate per address.\n For example, let's say we wanted to track the first 3 addresses generated by the following descriptor:\n\n ```\n wpkh(tprv8ZgxMBicQKsPePxn6j3TjvB2MBzQkuhGgc6oRh2WZancZQgxktcnjZJ44XdsRiw3jNkbVTK9JW6KFHvnRKgAMtSyuBevMJprSkZ4PTfmTgV/84'/1'/0'/0/*)\n ```\n\n This descriptor reads: describe a P2WPKH output with the specified extended public key, and it produces these BIP84 addresses:\n\n ```\n bcrt1qzy2rdyvu8c57qd8exyyp0mw7dk5drsu9ewzdsu\n bcrt1qsfsjnagr29m8h3a3vdand2s85cg4cefkcwk2fy\n bcrt1qauewfytqe5mtr0xwp786r6fl39kmum2lr65kmj\n ```\n </Accordion>\n </Accordions>\n </Callout>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`stacks_protocol`</h2>\n\nThe `stacks_protocol` scope allows you query Bitcoin transactions related to the Stacks Proof of Transfer (PoT) [concensus mechanism](https://www.hiro.so/blog/securing-web3-apps-through-bitcoin-an-overview-of-stacks-consensus-mechanism).\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"operation\"} type={\"string\"}>\n\nThe `operation` property is used to identify the Stacks operation that will trigger Chainhook as it observes Bitcoin transactions. The available operations are `block_committed`, `leader_registered`, `inscription_feed`, `stx_transferred` and `stx_locked`.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"block_committed\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"block_committed\" className='tab group'>\n <Badge className='badge transition-colors'>Using block_committed</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"leader_registered\" className='tab group'>\n <Badge className='badge transition-colors'>Using leader_registered</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"inscription_feed\" className='tab group'>\n <Badge className='badge transition-colors'>Using inscription_feed</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"stx_transferred\" className='tab group'>\n <Badge className='badge transition-colors'>Using stx_transferred</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"stx_locked\" className='tab group'>\n <Badge className='badge transition-colors'>Using stx_locked</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"block_committed\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"stacks_protocol\",\n \"operation\": \"block_committed\"\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"leader_registered\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"stacks_protocol\",\n \"operation\": \"leader_registered\"\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"inscription_feed\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"stacks_protocol\",\n \"operation\": \"inscription_feed\"\n }\n }\n ```\n\n <Callout type=\"info\" title=\"Note\">\n `inscription_feed` observes the reveal and transfer of an Ordinal inscription.\n </Callout>\n </TabsContent>\n <TabsContent value=\"stx_transferred\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"stacks_protocol\",\n \"operation\": \"stx_transferred\"\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"stx_locked\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"stacks_protocol\",\n \"operation\": \"stx_locked\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n</Root>","url":"/docs/stacks/chainhook/references/scopes/bitcoin"},"372":{"id":"/docs/stacks/chainhook/references/scopes/stacks","title":"Stacks Scopes","description":"Reference guide for available scopes for Stacks.","content":"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\nStacks scopes are parameters you use to define the `if this` specification logic of your Chainhook on the Stacks blockchain. In other words, scopes specify what on-chain events you are looking to monitor and track. For more information on Chainhook design, please view [predicate design](/stacks/chainhook/concepts/predicate-design).\n\n<Root>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`txid`</h2>\n\nThe `txid` scope allows you to query transactions based on their transaction ID. This is particularly useful for tracking specific transactions or auditing transaction histories.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"equals\"} type={\"string\"}>\n\nThe `equals` property is a 32 bytes hex encoded type used to specify the exact transaction ID to match.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By transaction ID</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"txid\",\n \"equals\": \"0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`block_height`</h2>\n\nThe `block_height` scope allows you to query blocks based on their height. This is useful for identifying specific blocks or ranges of blocks in the blockchain.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"equals\"} type={\"integer\"}>\n\nThe `equals` property specifies the exact height of the block to match.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"higher_than\"} type={\"integer\"}>\n\nThe `higher_than` property specifies that the block height should be greater than the provided value.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"lower_than\"} type={\"integer\"}>\n\nThe `lower_than` property specifies that the block height should be less than the provided value.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"between\"} type={\"array of integers\"}>\n\nThe `between` property specifies a range of block heights to match, inclusive of the provided start and end values.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By block height</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"higher_than\" className='tab group'>\n <Badge className='badge transition-colors'>Using higher_than</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"lower_than\" className='tab group'>\n <Badge className='badge transition-colors'>Using lower_than</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"between\" className='tab group'>\n <Badge className='badge transition-colors'>Between two block heights</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"block_height\",\n \"equals\": 141200\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"higher_than\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"block_height\",\n \"higher_than\": 10000\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"lower_than\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"block_height\",\n \"lower_than\": 10000\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"between\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"block_height\",\n \"between\": [0, 10000]\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`ft_transfer`</h2>\n\nThe `ft_transfer` scope allows you to query transactions based on fungible token transfers. This is useful for tracking specific token movements or auditing token transfer histories.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"asset_identifier\"} type={\"string\"}>\n\nThe `asset_identifier` property specifies the fully qualified asset identifier to observe.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"actions\"} type={\"string[]\"}>\n\nThe `actions` property specifies the types of token actions to observe, such as `mint`, `transfer`, or `burn`.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By a single action</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"all\" className='tab group'>\n <Badge className='badge transition-colors0'>Passing all ft actions</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"ft_transfer\",\n \"asset_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.cbtc-token::cbtc\",\n \"actions\": [\"transfer\"]\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"all\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"ft_transfer\",\n \"asset_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.cbtc-token::cbtc\",\n \"actions\": [\"mint\", \"transfer\", \"burn\"]\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`nft_transfer`</h2>\n\nThe `nft_transfer` scope allows you to query transactions based on non-fungible token transfers. This is useful for tracking specific NFT movements or auditing NFT transfer histories.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"asset_identifier\"} type={\"string\"}>\n\nThe `asset_identifier` property specifies the fully qualified asset identifier to observe.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"actions\"} type={\"array of strings\"}>\n\nThe `actions` property specifies the types of NFT actions to observe, such as `mint`, `transfer`, or `burn`.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By non-fungible token mint</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"all\" className='tab group'>\n <Badge className='badge transition-colors'>Passing all nft actions</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"nft_transfer\",\n \"asset_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09::monkeys\",\n \"actions\": [\"mint\"]\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"all\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"nft_transfer\",\n \"asset_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09::monkeys\",\n \"actions\": [\"mint\", \"transfer\", \"burn\"]\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`stx_transfer`</h2>\n\nThe `stx_transfer` scope allows you to query transactions involving STX token movements. This is crucial for monitoring STX transfers, including minting, burning, and locking actions.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"actions\"} type={\"array of strings\"}>\n\nThe `actions` property specifies the types of STX token actions to observe, such as `mint`, `transfer`, `burn`, and `lock`.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By STX token transfer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"all\" className='tab group'>\n <Badge className='badge transition-colors'>Passing all actions</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"stx_transfer\",\n \"actions\": [\"transfer\"]\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"all\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"stx_transfer\",\n \"actions\": [\"mint\", \"transfer\", \"burn\", \"lock\"]\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`print_event`</h2>\n\nThe `print_event` scope allows you to query transactions based on specific print events emitted during contract execution. This is useful for monitoring specific events for auditing or tracking purposes.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"contract_identifier\"} type={\"string\"}>\n\nThe `contract_identifier` property specifies the fully qualified contract identifier to observe.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"contains\"} type={\"string\"}>\n\nThe `contains` property is used for matching an event containing the specified string.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"matches_regex\"} type={\"string\"}>\n\nThe `matches_regex` property is used for matching an event that regex matches with the specified string.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Using contains</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"matches_regex\" className='tab group'>\n <Badge className='badge transition-colors'>Using matches_regex</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09\",\n \"contains\": \"monkey\"\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"matches_regex\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09\",\n \"matches_regex\": \"(?:^|\\\\W)monkey(?:$|\\\\W)\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`contract_call`</h2>\n\nThe `contract_call` scope allows you to query transactions that involve direct calls to specific methods within a smart contract. This is particularly useful for tracking interactions with critical contract functions.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"contract_identifier\"} type={\"string\"}>\n\nThe `contract_identifier` property specifies the fully qualified contract identifier to observe.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"method\"} type={\"string\"}>\n\nThe `method` property specifies the specific method within the contract to observe.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Scoping by contract method call</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"SP000000000000000000002Q6VF78.pox\",\n \"method\": \"stack-stx\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`contract_deployment`</h2>\n\nThe `contract_deployment` scope allows you to query transactions involving the deployment of smart contracts. This is crucial for monitoring new contract deployments and ensuring compliance with expected deployments.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"deployer\"} type={\"string\"}>\n\nThe `deployer` property specifies the STX address of the deployer to observe.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"implement_trait\"} type={\"string\"}>\n\nThe `implement_trait` property specifies the contract trait to observe.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By deployer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"trait\" className='tab group'>\n <Badge className='badge transition-colors'>By contract trait</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"contract_deployment\",\n \"deployer\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"trait\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"contract_deployment\",\n \"implement_trait\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sip09-protocol\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n</Root>\n","url":"/docs/stacks/chainhook/references/scopes/stacks"},"373":{"id":"/docs/stacks/chainhook","title":"Overview","description":"Chainhook enables you to target events on the Bitcoin and Stacks blockchain important to your use case in order to trigger actions based on those events.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nChainhook is a reorg-aware indexer that serves reliable blockchain data—you don’t have to waste time reindexing your database every time there's a fork. Chainhook also lets you index only the data you need, which means you can build lighter databases, get faster query results, and deliver a better experience to your users.\n\nTo get started, check out our [installation guide](/stacks/chainhook/installation).\n\n## Create event streams\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/chainhook/guides/chainhook-as-a-service\"\n title=\"Create a Bitcoin chainhook\"\n description=\"Build a chainhook that indexes events on the Bitcoin blockchain.\"\n />\n <SecondaryCard\n href=\"/stacks/chainhook/guides/chainhook-as-a-service-with-stacks-node\"\n title=\"Create a Stacks chainhook\"\n description=\"Build a chainhook that indexes events on the Stacks blockchain.\"\n />\n <SecondaryCard\n href=\"/stacks/chainhook/guides/register-chainhooks-on-devnet\"\n title=\"Test your chainhooks\"\n description=\"Test and debug your chainhooks in a local environment.\"\n />\n</Cards>\n\n## Setting up Chainhook predicates\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/chainhook/concepts/bitcoin-predicates\"\n title=\"Bitcoin predicates\"\n description=\"A list of "if this, then that" logic for Bitcoin chainhooks.\"\n />\n <SecondaryCard\n href=\"/stacks/chainhook/concepts/stacks-predicates\"\n title=\"Stacks predicates\"\n description=\"A list of "if this, then that" logic for Bitcoin chainhooks.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Bitcoin Indexer](/bitcoin/indexer)**: Simplify your testing with the Clarinet JS SDK.\n- **[Hiro Platform](/stacks/platform)**: A developer platform for building, deploying and scaling Bitcoin apps.\n\n<br />\n\n<Callout title=\"Need help building with Chainhook?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#chainhook</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>","url":"/docs/stacks/chainhook"},"374":{"id":"/docs/stacks/chainhook/examples/chainhook-as-a-service-with-stacks-node","title":"Run Chainhook as a service with a Stacks node","description":"Learn how to run Chainhook as a service with a Stacks node to evaluate Stacks blocks against your predicates.","content":"\nYou can run Chainhook as a service to evaluate Stacks blocks against your predicates. You can also dynamically register new predicates by enabling the predicates registration API.\n\nIn this guide, you will learn how to:\n\n1. [Configure your Stacks node to work with Chainhook](#configure-your-stacks-node).\n2. [Configure Chainhook](#configure-chainhook).\n3. [Create a predicate to evaluate your events](#create-a-predicate).\n4. [Initiate a Chainhook service to watch for matching transactions](#initiate-chainhook-as-a-service).\n5. [Dynamically register your predicates with Chainhook](#dynamically-register-predicates).\n\n{/* <Callout>Check out a full example [here](https://github.com/hiro-so/stacks-connect-example).</Callout> */}\n\n---\n\n## Configure Your Stacks Node\n\nIf you followed along with the previous guide on syncing a Stacks node, you should generate a `Stacks.toml` file within your Stacks node repository. Below is a sample `Stacks.toml` file:\n\n```toml title=\"Stacks.toml\"\n[node]\nworking_dir = \"/stacks-blockchain\"\nrpc_bind = \"0.0.0.0:20443\" # Make a note of this port to use in the `Chainhook.toml`\np2p_bind = \"0.0.0.0:20444\"\nbootstrap_node = \"02da7a464ac770ae8337a343670778b93410f2f3fef6bea98dd1c3e9224459d36b@seed-0.mainnet.stacks.co:20444,02afeae522aab5f8c99a00ddf75fbcb4a641e052dd48836408d9cf437344b63516@seed-1.mainnet.stacks.co:20444,03652212ea76be0ed4cd83a25c06e57819993029a7b9999f7d63c36340b34a4e62@seed-2.mainnet.stacks.co:20444\"\n\n[burnchain]\nchain = \"bitcoin\"\nmode = \"mainnet\"\npeer_host = \"localhost\"\nusername = \"bitcoind_username\" # Must match the rpcuser in the bitcoin.conf\npassword = \"bitcoind_password\" # Must match the rpcpassword in the bitcoin.conf\nrpc_port = 8332 # Must match the rpcport in the bitcoin.conf\npeer_port = 8333\n\n[[events_observer]]\nendpoint = \"localhost:20455\"\nretry_count = 255\nevents_keys = [\"*\"]\n```\n<Callout title=\"Note\">\nEnsure that the `username`, `password`, and `rpc_port` values in the `Stacks.toml` file match the values in the `bitcoin.conf` file. Also, note the `rpc_bind` port to use in the `Chainhook.toml` configuration in the next section.\n</Callout>\n\n## Configure Chainhook\n\nIn this section, you will configure Chainhook to communicate with the network. Run the following command in your terminal to generate the `Chainhook.toml` file:\n\n```terminal\n$ chainhook config generate --mainnet\n```\n\nSeveral network parameters in the generated Chainhook.toml configuration file need to match those in the bitcoin.conf file created earlier in the Setting up a Bitcoin Node section. Update the following parameters accordingly:\n\n1. Update `bitcoind_rpc_username` with the username set for `rpcuser` in `bitcoin.conf`.\n2. Update `bitcoind_rpc_password` with the password set for `rpcpassword` in `bitcoin.conf`.\n3. Update `bitcoind_rpc_url` with the same host and port used for `rpcport` in `bitcoin.conf`.\n4. Ensure `stacks_node_rpc_url` matches the `rpc_bind` in the `Stacks.toml` file.\n\nThe generated `Chainhook.toml` file should look like this:\n\n```toml title=\"Chainhook.toml\"\n[storage]\nworking_dir = \"cache\"\n\n# The http API allows you to register / deregister predicates dynamically.\n# This is disabled by default.\n\n# [http_api]\n# http_port = 20456\n# database_uri = \"redis://localhost:6379/\"\n\n[network]\nmode = \"mainnet\"\nbitcoind_rpc_url = \"http://localhost:8332\"\nbitcoind_rpc_username = \"devnet\"\nbitcoind_rpc_password = \"devnet\"\n# Bitcoin block events can be received by Chainhook\n# either through a Bitcoin node's ZeroMQ interface,\n# or through the Stacks node. The Stacks node is\n# used by default:\nstacks_node_rpc_url = \"http://localhost:20443\"\nstacks_events_ingestion_port = 20455\n# but zmq can be used instead:\n# bitcoind_zmq_url = \"tcp://0.0.0.0:18543\"\n\n[limits]\nmax_number_of_bitcoin_predicates = 100\nmax_number_of_concurrent_bitcoin_scans = 100\nmax_number_of_stacks_predicates = 10\nmax_number_of_concurrent_stacks_scans = 10\nmax_number_of_processing_threads = 16\nmax_number_of_networking_threads = 16\nmax_caching_memory_size_mb = 32000\n\n[[event_source]]\ntsv_file_url = \"https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest\"\n```\n\nEnsure the following configurations are matched to allow Chainhook to communicate with both Stacks and Bitcoin:\n\n| bitcoin.conf | Stacks.toml | Chainhook.toml |\n|--------------------|-------------|-----------------------------|\n| rpcuser | username | bitcoind_rpc_username |\n| rpcpassword | password | bitcoind_rpc_password |\n| rpcport | rpc_port | bitcoind_rpc_url |\n| zmqpubhashblock | | bitcoind_zmq_url |\n| | rpc_bind | stacks_node_rpc_url |\n| | endpoint | stacks_events_ingestion_port |\n\n<Callout title=\"Note\">\nThe `bitcoind_zmq_url` is optional when running Chainhook as a service using Stacks because Stacks will pull the blocks from Stacks and the Bitcoin chain.\n</Callout>\n\n## Create a predicate\n\nNow that the Stacks and Chainhook configurations are done, you can scan your blocks by defining your predicates.\n\n### Appending events to a file\n\nThe following command will generate a sample JSON file `print-event.json`.\n\n```terminal\n$ chainhook predicates new print-event.json --stacks\n```\n\nOnce the boilerplate predicate code has been generated, update the `print-event.json` file with the following content:\n\n```json title=\"print-event.json\"\n{\n \"chain\": \"stacks\",\n \"uuid\": \"6ad27176-2b83-4381-b51c-50baede11e3f\",\n \"name\": \"Hello world\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"start_block\": 34239,\n \"end_block\": 50000,\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"ST1SVA0SST0EDT4MFYGWGP6GNSXMMQJDVP1G8QTTC.arkadiko-freddie-v1-1\",\n \"contains\": \"vault\"\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"arkadiko.txt\"\n }\n }\n },\n \"mainnet\": {\n \"start_block\": 34239,\n \"end_block\": 50000,\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1\",\n \"contains\": \"vault\"\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"arkadiko.txt\"\n }\n }\n }\n }\n}\n```\n\nNow, use the following command to scan the blocks based on the predicates defined in the `print-event.json` file:\n\n```terminal\n$ chainhook predicates scan print-event.json --mainnet\n```\n\nThe output of the above command will be a file `arkadiko.txt` generated based on the predicate definition.\n\n### Sending events to an API endpoint\n\n```terminal\n$ chainhook predicates new print-event-post.json --stacks\n```\n\nThis will generate a sample JSON file `print-event-post.json`. Update the generated `print-event-post.json` file with the following content:\n\n```json title=\"print-event-post.json\"\n{\n \"chain\": \"stacks\",\n \"uuid\": \"e5fa09b2-ec3e-4b6a-9a4a-0ebb454f6e19\",\n \"name\": \"Hello world\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"ST1SVA0SST0EDT4MFYGWGP6GNSXMMQJDVP1G8QTTC.arkadiko-freddie-v1-1\",\n \"contains\": \"vault\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://localhost:3000/events\",\n \"authorization_header\": \"Bearer cn389ncoiwuencr\"\n }\n },\n \"start_block\": 10200,\n \"expire_after_occurrence\": 5\n },\n \"mainnet\": {\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1\",\n \"contains\": \"vault\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://localhost:3000/events\",\n \"authorization_header\": \"Bearer cn389ncoiwuencr\"\n }\n },\n \"start_block\": 10200,\n \"expire_after_occurrence\": 5\n }\n }\n}\n```\n\n<Callout>\nThe `start_block` is a required field to use the `http_post` then_that predicate.\n</Callout>\n\nNow, use the following command to scan the blocks based on the predicates defined in the `print-event-post.json` file:\n\n```terminal\n$ chainhook predicates scan print-event-post.json --mainnet\n```\n\nThe above command posts events to the URL `http://localhost:3000/events` mentioned in the `Chainhook.toml` file.\n\n## Initiate Chainhook as a service\n\n```terminal\n$ chainhook service start --predicate-path=print-event.json --config-path=Chainhook.toml\n```\n\nThis command registers the predicate and starts the Chainhook service.\n\n## Dynamically register predicates\n\nYou can also dynamically register new predicates with your Chainhook service.\n\n<Callout title=\"Requirements\" type=\"warn\"> This section requires that you have Redis running locally. To install, refer to the [Redis documentation](https://redis.io/docs/getting-started/).</Callout>\n\nFirst, ensure that the following lines in the `Chainhook.toml` file are uncommented to enable the predicate registration server:\n\n```toml title=\"Chainhook.toml\"\n[http_api]\nhttp_port = 20456\ndatabase_uri = \"redis://localhost:6379/\"\n```\n\n```terminal\n$ chainhook service start --predicate-path=print-event.json --config-path=Chainhook.toml\n```\n\nStart the Chainhook service with the following command:\n\n```terminal\n$ chainhook service start --config-path=Chainhook.toml\n```\n\nTo dynamically register a new predicate, send a POST request to the running predicate registration server at `localhost:20456/v1/chainhooks`.\n\nUse the following `curl` command template as an example:\n\n```terminal\n$ curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -d @predicate.json \\\n http://localhost:20456/v1/chainhooks\n\n{\"result\":\"<uuid>\",\"status\":200}\n```\n\n<Callout title=\"Note\">You can also run the Chainhook service by passing multiple predicates: `chainhook service start --predicate-path=predicate_1.json --predicate-path=predicate_2.json --config-path=Chainhook.toml` </Callout>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/register-chainhooks-on-devnet\"\n title=\"Register Chainhooks on devnet\"\n description=\"Learn how to register Chainhooks on devnet.\"\n />\n <Card\n href=\"/stacks/chainhook/references/scopes/stacks\"\n title=\"Stacks scopes\"\n description=\"Learn how to use scopes to scan for specific Stacks blockchain events.\"\n />\n</Cards>","url":"/docs/stacks/chainhook/examples/chainhook-as-a-service-with-stacks-node"},"375":{"id":"/docs/stacks/chainhook/examples/register-chainhooks-on-devnet","title":"Register Chainhooks on devnet","description":"Learn how to register chainhooks on devnet.","content":"\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nFollow these steps to register your Chainhooks on devnet using Clarinet:\n\n<Callout title=\"Requirements\" type=\"warn\">\n This feature requires Clarinet version 2.1.0 or higher. To upgrade or install, refer to our [installation](/stacks/clarinet/installation) page for Clarinet.\n</Callout>\n\n## Create your Chainhook predicates\n\nFirst, within your Clarinet project, you'll need to create your Chainhook predicate files.\n\nThese should be situated in the root of your project directory. The files can either be separate or stored within a specific folder, e.g., `/chainhooks` in your project root directory:\n\n<Files className='pointer-events-none'>\n <Folder name=\"contracts\" defaultOpen>\n <File name=\"counter.clar\" />\n </Folder>\n <Folder name=\"chainhooks\" defaultOpen className='bg-[hsl(var(--highlight))]'>\n <File name=\"increment.json\" />\n <File name=\"decrement.json\" />\n </Folder>\n <Folder name=\"settings\" />\n <Folder name=\"tests\" defaultOpen>\n <File name=\"counter.test.ts\" />\n </Folder>\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n</Files>\n\nFor examples on how to define your predicates, refer to the [scopes](/stacks/chainhook/references/scopes/stacks) reference page.\n\n## Start devnet\n\nTo start devnet, run the _`clarinet devnet start`_ command from the root of your project directory. Running this command will begin a local Chainhook service in the background that automatically registers your Chainhook files within the project directory against the network.\n\n## Confirm registration\n\nOnce your devnet starts, the Chainhook service initiates the registration process. You'll know that the registration of your Chainhooks was successful by checking the confirmation message in your terminal:\n\n```terminal\n$ clarinet devnet start\n# ...\nINFO Feb 5 15:20:07.233382 2 chainhooks registered\n```\n\nIf you do not see this message at the top of your _`clarinet devnet start`_ logs, verify that you are using `clarinet` version 2.1.0 or higher.\n\n## Working with chainhooks\n\nWith these steps completed, your chainhooks are ready to trigger whenever local contract actions occur. You can monitor your network activity locally, through the _`clarinet devnet start` terminal, to confirm chainhooks execution as you further develop and test your smart contracts. When an action occurs, you should see something like this:\n\n```terminal\n$ clarinet devnet start\n# ...\nINFO Feb 5 15:21:07.233382 1 hooks triggered\n```\n\nAt this point, you can verify the payload for that action depending on whether you are expecting an _json`http_post`_ or _json`file_append`_ result from your _json`then_that`_ configuration.\n","url":"/docs/stacks/chainhook/examples/register-chainhooks-on-devnet"},"376":{"id":"/docs/stacks/chainhook/examples/chainhook-as-a-service","title":"Run Chainhook as a service","description":"Learn how to run Chainhook as a service to evaluate your \"if this, then that\" predicates against the Bitcoin and Stacks blockchains.","content":"\nIn order to build out a more robust and secure web app, you can run Chainhook as a service to stream your events continously to a server you designate.\n\nIn this guide, you will learn how to:\n\n1. [Configure an existing Bitcoin node to work with Chainhook](#configure-an-existing-bitcoin-node-to-work-with-chainhook).\n2. [Generate a Chainhook predicate to target specific transactions](#generate-a-chainhook-predicate-to-target-specific-transactions).\n3. [Scan the Bitcoin blockchain for transactions that match your predicate](#scan-the-bitcoin-blockchain-for-transactions-that-match-your-predicate).\n4. [Initiate a Chainhook service to watch for matching transactions](#initiate-a-chainhook-service-to-watch-for-matching-transactions).\n5. [Dynamically register your predicate with Chainhook](#dynamically-register-your-predicate-with-chainhook).\n\n---\n\n## Configure Chainhook\n\nIn this section, you will configure Chainhook to match the network configurations with the bitcoin config file. First, [install the latest version of Chainhook](/stacks/chainhook/installation).\n\nNext, you will generate a `Chainhook.toml` file to connect Chainhook with your bitcoind node. Navigate to the directory where you want to generate the `Chainhook.toml` file and use the following command in your terminal:\n\n```terminal\n$ chainhook config generate --mainnet\n```\n\nSeveral network parameters in the generated `Chainhook.toml` configuration file need to match those in the `bitcoin.conf` file created earlier in the [setting up a Bitcoin node](/guides/sync-a-bitcoin-node) section. Update the following parameters accordingly:\n\n1. Update `bitcoind_rpc_username` with the username set for `rpcuser` in `bitcoin.conf`.\n2. Update `bitcoind_rpc_password` with the password set for `rpcpassword` in `bitcoin.conf`.\n3. Update `bitcoind_rpc_url` with the same host and port used for `rpcport` in `bitcoin.conf`.\n\nAdditionally, if you want to receive events from the configured Bitcoin node, substitute `stacks_node_rpc_url` with `bitcoind_zmq_url`, as follows:\n\n```toml\n[storage]\nworking_dir = \"cache\"\n\n# The http API allows you to register / deregister predicates dynamically.\n# This is disabled by default.\n\n# [http_api]\n# http_port = 20456\n# database_uri = \"redis://localhost:6379/\"\n\n[network]\nmode = \"mainnet\"\nbitcoind_rpc_url = \"http://localhost:8332\"\nbitcoind_rpc_username = \"devnet\"\nbitcoind_rpc_password = \"devnet\"\n# Bitcoin block events can be received by Chainhook\n# either through a Bitcoin node's ZeroMQ interface,\n# or through the Stacks node. The Stacks node is\n# used by default:\n# stacks_node_rpc_url = \"http://localhost:20443\"\n# but zmq can be used instead:\nbitcoind_zmq_url = \"tcp://0.0.0.0:18543\"\n\n[limits]\nmax_number_of_bitcoin_predicates = 100\nmax_number_of_concurrent_bitcoin_scans = 100\nmax_number_of_stacks_predicates = 10\nmax_number_of_concurrent_stacks_scans = 10\nmax_number_of_processing_threads = 16\nmax_number_of_networking_threads = 16\nmax_caching_memory_size_mb = 32000\n\n[[event_source]]\ntsv_file_url = \"https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest\"\n```\n\nHere is a table of the relevant parameters this guide changes in our configuration files.\n\n| bitcoin.conf | Chainhook.toml |\n| :--------------- | :--------------------- |\n| rpcuser | bitcoind_rpc_username |\n| rpcpassword | bitcoind_rpc_password |\n| rpcport | bitcoind_rpc_url |\n| zmqpubhashblock | bitcoind_zmq_url |\n\n## Scan the blockchain based on predicates\n\nNow that your `bitcoind` and Chainhook configurations are complete, you can define the Chainhook [Bitcoin predicate scope](/stacks/chainhook/references/scopes/bitcoin) you would like to scan for.\n\nThese predicates are where you specify the `if_this / then_that` pattern to trigger Chainhook to deliver a result (either a file appendation or an HTTP POST request).\n\n## Appending events to a file\n\nTo generate a sample JSON file with predicates, execute the following command in your terminal:\n\n```terminal\n$ chainhook predicates new stacking-pool.json --bitcoin\n```\n\nReplace the contents of the `stacking-pool.json` file with the following:\n\n```json\n{\n \"chain\": \"bitcoin\",\n \"uuid\": \"1\",\n \"name\": \"Stacking Pool\",\n \"version\": 1,\n \"networks\": {\n \"mainnet\": {\n \"start_block\": 801500,\n \"end_block\": 802000,\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2wpkh\": {\n \"equals\": \"bc1qs0kkdpsrzh3ngqgth7mkavlwlzr7lms2zv3wxe\"\n }\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"bitcoin-transactions.txt\"\n }\n }\n }\n }\n}\n```\n\nThis example demonstrates scanning a portion of the Bitcoin blockchain to capture specific outputs from a Bitcoin address associated with a Stacking pool, in this case [Friedgar Pool](https://pool.friedger.de/). Notice the `then_that` predicate specifying a `file_append`.\n\n<Callout title=\"Note\">\nYou can get blockchain height and current block by referring to the [Stacks Explorer](https://explorer.hiro.so/blocks?chain=mainnet).\n</Callout>\n\nNow, use the following command to scan the blocks based on the predicates defined in the `stacking-pool.json` file.\n\n```terminal\n$ chainhook predicates scan stacking-pool.json --config-path=./Chainhook.toml\n```\n\nThe output of the above command will be a text file `bitcoin-transactions.txt` generated based on the predicate definition.\n\n## Sending events to an API endpoint\n\nNow you will generate another sample predicate, but this time you will send the payload to an API endpoint:\n\n```terminal\n$ chainhook predicates new stacking-pool-api.json --bitcoin\n```\n\nReplace the contents of the `stacking-pool-api.json` file with the following:\n\n```json\n{\n \"chain\": \"bitcoin\",\n \"uuid\": \"2\",\n \"name\": \"Stacking Pool (API)\",\n \"version\": 1,\n \"networks\": {\n \"mainnet\": {\n \"start_block\": 801500,\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2wpkh\": {\n \"equals\": \"bc1qs0kkdpsrzh3ngqgth7mkavlwlzr7lms2zv3wxe\"\n }\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://localhost:3000/events\",\n \"authorization_header\": \"12345\"\n }\n }\n }\n }\n}\n```\n\n<Callout title=\"Note\">\nThe `start_block` is a required field when using the `http_post` `then_that` predicate.\n</Callout>\n\nOnce you are finished setting up your endpoint, use the following command to scan the blocks based on the predicates defined in the `stacking-pool-api.json` file.\n\n```terminal\n$ chainhook predicates scan stacking-pool-api.json --config-path=./Chainhook.toml\n```\n\nThe above command posts events to the URL `http://localhost:3000/events`, mentioned in the JSON file.\n\n## Initiate Chainhook service\n\nIn the examples above, your Chainhook scanned historical blockchain data against predicates and delivered results. In this next section, you will learn how to set up a Chainhook that acts as an ongoing observer and event-streaming service.\n\nYou can start a Chainhook service with an existing predicate. You can also dynamically register new predicates by making an API call to your chainhook. In both of these instances, your predicates will be delivering their results to a server set up to receive results.\n\nInitiate the chainhook service by passing the predicate path to the command as shown below:\n\n```terminal\n$ chainhook service start --predicate-path=stacking-pool-api.json --config-path=Chainhook.toml\n```\n\nThe above command registers the predicate based on the predicate definition in the `stacking-pool-api.json` file.\n\n## Dynamically register predicates\n\nYou can also dynamically register new predicates with your Chainhook service. This means you can start a long-running process that exposes HTTP endpoints to register, deregister, and report on new predicates.\n\n<Callout title=\"Requirements\" type=\"warn\">\nThis section requires that you have Redis running locally. To install, refer to the [Redis documentation](https://redis.io/docs/getting-started/).\n</Callout>\n\nFirst, ensure that the following lines of code are uncommented in the `Chainhook.toml` file to enable the predicate registration server:\n\n```toml\n[http_api]\nhttp_port = 20456\ndatabase_uri = \"redis://localhost:6379/\"\n```\n\nIf you have an instance of Redis running locally, you can now start the Chainhook service by running the following command:\n\n```terminal\n$ chainhook service start --config-path=Chainhook.toml\n```\n\nTo dynamically register a new predicate, send a POST request to the running predicate registration server at `localhost:20456/v1/chainhooks`.\n\nUse the following `curl` command template as an example:\n\n```terminal\n$ curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -d @predicate.json \\\n http://localhost:20456/v1/chainhooks\n\n{\"result\":\"<uuid>\",\"status\":200}\n```\n\n<Callout title=\"Note\">\nYou can also run chainhook service by passing multiple predicates, ie `chainhook service start --predicate-path=predicate_1.json --predicate-path=predicate_2.json --config-path=Chainhook.toml`\n</Callout>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/register-chainhooks-on-devnet\"\n title=\"Register Chainhooks on devnet\"\n description=\"Learn how to register Chainhooks on devnet.\"\n />\n <Card\n href=\"/stacks/chainhook/references/scopes/bitcoin\"\n title=\"Bitcoin scopes\"\n description=\"Learn how to use scopes to scan for specific Bitcoin blockchain events.\"\n />\n</Cards>","url":"/docs/stacks/chainhook/examples/chainhook-as-a-service"},"377":{"id":"/docs/stacks/chainhook/examples/observing-contract-calls","title":"Observing contract calls with Chainhook","description":"Learn how to use Chainhook to observe a function call for a voting contract.","content":"\nimport { Step, Steps } from \"fumadocs-ui/components/steps\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\nThe _json`contract_call`_ predicate scope is designed to target direct function calls within a smart contract. When triggered, Chainhook will return a payload with transaction data detailing the on-chain events contained in these functions.\n\nIn this guide, you will learn how to:\n\n1. [Build a predicate to target the `cast-vote` function](#creating-the-predicate).\n2. [Scan the Stacks blockchain using your predicate](#running-the-predicate).\n3. [Use a Clarity function to return specific contract data](#return-contract-data-with-the-clarity-function).\n4. [Find data related to the contract call within the Chainhook payload](#chainhook-payload).\n\n<Callout type=\"warn\" title=\"Requirements\">\n To follow this guide, make sure you have installed Chainhook [directly](/stacks/chainhook/installation).\n</Callout>\n\n<Steps>\n<Step>\n\n## Create the predicate\n\nThe `predicate` is your main interface for querying the Chainhook data indexer. Chainhook uses this predicate to select the appropriate blockchain, network, and scope for monitoring transactions.\n\nFor the Stacks blockchain, run the following command to generate a `predicate` template:\n\n```terminal\n$ chainhook predicates new contract-call-chainhook.json --stacks\n```\n\n<Callout title=\"Note\">\n Alternatively, [Hiro Platform](https://platform.hiro.so/) has an excellent UI to help you to create a `predicate` using a form builder or upload a json file containing your `predicate`.\n</Callout>\n\nThere are 3 main components to your `predicate` that you need to address:\n\n1. Targeting the appropriate blockchain and network\n2. Defining the scope and targeting the function you want to observe\n3. Defining the payload destination\n\nTo begin, you need to configure the `predicate` to target the voting contract:\n\n- Specify `testnet` in the network object.\n- Set the `start_block` property to <TooltipProvider inline><Tooltip><TooltipTrigger asChild><span className='cursor-default border-dotted border-b border-primary'>21443</span></TooltipTrigger><TooltipContent>This value represents the block height that our voting contract was deployed at.</TooltipContent></Tooltip></TooltipProvider>.\n\n```json contract-call-chainhook.json\n{\n \"chain\": \"stacks\",\n \"uuid\": \"1\",\n \"name\": \"Contract-Call-Chainhook\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"start_block\": 21443,\n \"decode_clarity_values\": true,\n \"expire_after_occurrence\": 1,\n // ...\n }\n }\n}\n```\n\nNext, define the scope of the `predicate` within the `if_this` specification.\n\nThe `contract_call` scope allows Chainhook to observe blockchain data when the specified function is directly called from its contract.\n\n```json contract-call-chainhook.json\n{\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n }\n}\n```\n\n<Callout type=\"warn\" title=\"Warning\">\n The function defined in the `method` property of your `predicate` must be directly called in order for Chainhook to observe events. Calling the function from another contract or from within a different function on the same contract will not generate a `payload`. Below is an example of a `cast-vote` function that would not trigger an event.\n ```clarity\n (define-public (call-cast-vote)\n (cast-vote)\n )\n ```\n</Callout>\n\nFinally, define how Chainhook delivers the payload when it is triggered by your `predicate` using the `then_that` specification. \n\nUsing `file_append`, specify the path where Chainhook will post the payload data.\n\n```json contract-call-chainhook.json\n{\n \"then_that\": {\n \"file_append\": {\n \"path\": \"/tmp/events.json\"\n }\n }\n}\n```\n\n<Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"full-predicate\">\n <AccordionTrigger>Full predicate file</AccordionTrigger>\n <AccordionContent>\n ```json\n {\n \"chain\": \"stacks\",\n \"uuid\": \"1\",\n \"name\": \"Contract-Call-Chainhook\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"start_block\": 21443,\n \"decode_clarity_values\": true,\n \"expire_after_occurrence\": 1,\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"/tmp/events.json\"\n }\n }\n }\n }\n }\n ```\n </AccordionContent>\n </AccordionItem>\n</Accordion>\n\n<Callout title=\"Note\">\n\n For more details on optional configurations, other predicate elements and scopes, check out the [Predicate Design](/stacks/chainhook/concepts/predicate-design) and [Stacks scopes](/stacks/chainhook/references/scopes/stacks) pages.\n\n</Callout>\n\n</Step>\n<Step>\n\n## Scan the predicate\n\nWith your `predicate` set up, you can now scan for blocks that match the `contract_call` scope and analyze the returned payload.\n\nChainhook will track events where this function is directly invoked and deliver detailed transaction data at the block level, based on your configuration.\n\nTo scan the Stacks blockchain using your predicate, run the following command, replacing `/path/to/contract-call-chainhook.json` with the actual path to your `contract-call-chainhook.json` file:\n\n```terminal\n$ chainhook predicates scan /path/to/contract-call-chainhook.json --testnet\n```\n\n<Callout title=\"Note\">\n If you are using Platform, creating your Chainhook will automatically begin the scan for you.\n</Callout>\n\n</Step>\n<Step>\n\n## Return contract data with the Clarity function\n\nThe _clarity`cast-vote`_ function records a vote by storing the address that calls it. It also logs relevant data using the _clarity`print`_ function, which can be useful for when you want to track additional on-chain events that are not part of the built-in Clarity functions.\n\nWhen you examine the `payload`, this is the data you will look for.\n\n```clarity simple-vote-v0.clar\n(define-public (cast-vote)\n (begin\n ;; Check if the voter has already voted.\n (asserts! (is-none (map-get? UserVotes tx-sender)) (err ERR_ALREADY_VOTED))\n\n ;; Update the map that the vote has been cast. Print vote related data.\n (map-set UserVotes tx-sender { hasVoted: true })\n (var-set VoteCount (+ (var-get VoteCount) u1))\n (print\n {\n notification: \"cast-vote\",\n payload: {\n status: \"Has voted set to true\",\n voter: tx-sender,\n totalVotes: (get-total-votes)\n }\n }\n )\n (ok \"Vote cast successfully\")\n )\n)\n```\n\n<Callout title=\"Note\">\n This contract has been deployed to the Stacks [testnet network](https://explorer.hiro.so/txid/0x312a3c559af0f75381a9eb4540912c310d74682ed3036207ec890ad8cd1aebe6?chain=testnet) under the name `STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0`.\n</Callout>\n\n</Step>\n<Step>\n\n## Dive deeper into the Chainhook payload\n\nWhen triggered by your predicate, the `payload` returned by Chainhook is a standarized, block level observation in json format.\n\nWithin the `apply` arrays element, the `block_identifer` object gives us the `index` for the observed block height.\n\n```json contract-call-payload.json\n\"block_identifier\": {\n \"hash\": \"0x4d88015a6df9ec4f6df875941d87337ce64f8d51608563f80b6e27adeb327e4d\",\n \"index\": 21544\n}\n```\n\n<Callout type=\"warn\" title=\"Warning\">\n The hash returned in the `block_identifer` object is not that block hash you\n would see in [Stacks Explorer](https://explorer.hiro.so/?chain=testnet), but\n `index_block_hash` returned from the Stacks API's [get\n block](/stacks/api/blocks/get-block) endpoint. You can use the `apply` array's\n metadata object to get the `stacks_block_hash`.\n</Callout>\n\nWe can retrieve the `stacks_block_hash` by navigating to the `apply` arrays object `metadata` element. This hash will match the block hash display in the Stacks Explorer.\n\n```json contract-call-payload.json\n\"apply\": [\n {\n \"metadata\": {\n \"stacks_block_hash\": \"0x4ad36f77ff76042f3b7355006556375970b0f99d1232b14a3b4a2eadda4a806a\"\n }\n }\n]\n```\n\nThere is also a `timestamp` value returned in the `apply` array. This UNIX time stamp represents the initiation of the Stacks block.\n\n```json contract-call-payload.json\n\"timestamp\": 1722208524\n```\n\n<Callout type=\"warn\" title=\"Warning\">\n The timestamp returned in this object is not the finalized block time you\n would see in the [Stacks Explorer](https://explorer.hiro.so/?chain=testnet), but\n `block_time` returned from the Stacks API's [get\n block](/stacks/api/blocks/get-block) endpoint.\n</Callout>\n\n### Transaction object\n\nBecause Chainhook is triggered on the block level, we will receive a single response that contains data specific to each `transaction` that matches your predicate's `contract_call` scope.\n\nTo find this data, we start with the `apply` array element of the `payload` object. The single object that makes up the `apply` array contains a child element, the `transactions` array. Every `transaction` will be represents by a single object within this array. This `transaction` object contains its own children elements which can be seen in the example below.\n\n```json\n{\n \"apply\": [\n {\n \"transactions\": [\n {\n \"transaction_identifier\": { ... },\n \"metdata\": { ... },\n \"operations\": [],\n }\n ],\n }\n ],\n \"rollback\": [ ... ],\n \"chainhook\": { ... }\n}\n```\n\nOnce the `transaction` object is returned, we can begin examining the important data elements this object contains. The first element, `transaction_identifier`, includes a hash value that uniquely identifies your transaction.\n\n```json contract-call-payload.json\n\"transaction_identifier\": {\n \"hash\": \"0x98195af8f888d2f9ca3462c41c1691e7798ea6d9e5e3afe42955c0921f981f2c\"\n}\n```\n\nNext, focus on the `metadata` object within your `contract_call` data. It's crucial to determine the success state of your transaction. Chainhook captures and reports on transactions regardless of their outcome.\n\nUtilize the `success` object to assess transaction success and extract the `sender` of the transaction and the `result` returned by the contract.\n\n```json contract-call-payload.json\n\"metadata\": {\n \"success\": true,\n \"sender\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV\",\n \"result\": \"(ok \\\"Vote cast successfully\\\")\"\n}\n```\n\nMoving forward, examine the `kind` object and its components within your `contract_call`. The data object contains crucial information:\n\n- `contract_identifier` specifies the contract your function resides in\n- `method` identifies the function called\n- `args` lists the arguments passed when invoking this function\n\nIn this case, the `cast-vote` function accepts no arguments, resulting in an empty `args` array.\n\n```json contract-call-payload.json\n{\n \"metadata\":\n \"kind\": {\n \"data\": {\n \"args\": [],\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n }\n }\n}\n```\n\nIn the `metadata` object's `receipt`, the `events` array holds the key data for your `contract_call`.\n\nSince the `cast-vote` function uses a `print` statement, the events array will contain `topic` and `value` keys representing the data output.\n\n```json contract-call-payload.json\n{\n \"metadata\":\n \"receipt\": {\n \"contract_calls_stack\": [],\n \"events\": [\n {\n \"data\": {\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"topic\": \"print\",\n \"value\": {\n \"notification\": \"cast-vote\",\n \"payload\": {\n \"status\": \"Has voted set to true\",\n \"totalVotes\": 1,\n \"voter\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV\"\n }\n }\n },\n \"position\": {\n \"index\": 0\n },\n \"type\": \"SmartContractEvent\"\n }\n ],\n \"mutated_assets_radius\": [],\n \"mutated_contracts_radius\": [\n \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\"\n ]\n }\n}\n```\n\n<Callout type=\"info\">\n You can view the full [contract-call-payload.json](/contract-call-payload.json) here.\n</Callout>\n\n</Step>\n</Steps>\n\n---\n\nNow that you've located the relevant data in the payload, you can start to extract the relevant information into your API.\n\nThe following is an example of how you might store your information in a database table:\n\n| Block Height | Timestamp | Transaction Identifier | Success | Sender | Result | Args | Contract Identifier | Function | Value |\n| ------------ | ---------- | ------------------------------------------------------------------ | ------- | ---------------------------------------- | ----------------------------- | ---- | ------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 21544 | 1722208524 | 0x98195af8f888d2f9ca3462c41c1691e7798ea6d9e5e3afe42955c0921f981f2c | True | STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV | (ok \"Vote cast successfully\") | [] | STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0 | cast-vote | \\{\"notification\": \"cast-vote\", \"payload\": \\{\"status\": \"Has voted set to true\", \"totalVotes\": 1, \"voter\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV\"\\}\\} |\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/platform/guides/create-chainhooks\"\n title=\"Create a Chainhook\"\n description=\"Learn how to create a Chainhook using the Hiro Platform.\"\n />\n <Card\n href=\"/stacks/chainhook/references/scopes/stacks\"\n title=\"Stacks scopes\"\n description=\"Learn how to use additional scopes to scan for specific Stacks blockchain events.\"\n />\n</Cards>\n","url":"/docs/stacks/chainhook/examples/observing-contract-calls"},"378":{"id":"/docs/stacks/chainhook/quickstart","title":"Quickstart","description":"Learn how to scan the Stacks blockchain for STX transactions.","content":"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\"\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\n\nIn this quickstart guide, you will set up `Chainhook` to generate and scan predicates on the Stacks blockchain. You will learn how to generate predicates and run basic commands using the CLI to scan and inspect blockchain events.\n\nCheck out the [run Chainhook as a service](/stacks/chainhook/guides/chainhook-as-a-service) for a more advanced use case.\n\n<Steps>\n <Step>\n ## Generate a predicate file\n \n To generate a predicate file, use the `predicates new` command. This command generates a template that you can use to help set up your own predicate.\n\n ```terminal\n $ chainhook predicates new stx-transfer.json --stacks \n ```\n\n <Callout title=\"Note\">\n The `--stacks` flag is required and allows you to specify the network to scan. Other options include `--bitcoin`.\n </Callout>\n </Step>\n <Step>\n ## Track the latest stx_event for a given address\n \n The generated file contains helpful boilerplate configuration, but you still need to make some edits to tell it to track specific Stacks-related transactions.\n\n To do this, update your `if_this` construct in your `stx-transfer.json` file.\n\n ```json title=\"stx-transfer.json\"\n {\n \"if_this\": {\n \"scope\": \"stx_event\",\n \"actions\": [\"transfer\"]\n }\n }\n ```\n\n <Accordions>\n <Accordion title=\"Full code example\">\n ```json\n {\n \"chain\": \"stacks\",\n \"uuid\": \"87ac9bff-1052-4d02-9c79-3768a6f08a09\",\n \"name\": \"STX Transfer\",\n \"version\": 1,\n \"networks\": {\n \"mainnet\": {\n \"start_block\": 154670,\n \"if_this\": {\n \"scope\": \"stx_event\",\n \"contract_identifier\": \"SPM113AY78VCMJJ0SDFJ4XJXFHHQ6R9KB3710X7D\",\n \"actions\": [\"transfer\"]\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"stx-transfers.txt\"\n }\n }\n }\n }\n }\n ```\n </Accordion>\n </Accordions>\n \n <Callout title=\"Note\">\n Other available `actions` include `mint`, `burn`, and `lock`. For more information on these actions, check out the [predicates](/stacks/chainhook/concepts/stacks-predicates) section.\n </Callout>\n </Step>\n <Step>\n ## Scanning for events\n \n With your updated predicate file, you can now use the `predicate scan` command to scan for `stx_event` transactions.\n\n ```terminal\n $ chainhook predicates scan /path/to/stx-transfer.json --mainnet\n ```\n\n <Callout title=\"Note\">\n When running `scan` for the first time, a chainstate archive will be downloaded. The subsequent scans will use the cached chainstate if already present, speeding up iterations and the overall feedback loop. For more information on the Hiro Archive, click [here](/stacks/archive).\n </Callout>\n </Step>\n</Steps>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/chainhook-as-a-service\"\n title=\"Run Chainhook as a service\"\n description=\"Learn how to run Chainhook as a service.\"\n />\n <Card\n href=\"/bitcoin/indexer\"\n title=\"Run the Bitcoin Indexer\"\n description=\"Learn how to run the Bitcoin Indexer.\"\n />\n <Card\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Learn how to sync a Stacks node for running a local devnet.\"\n />\n</Cards>","url":"/docs/stacks/chainhook/quickstart"},"379":{"id":"/docs/stacks/chainhook/predicate-design","title":"Predicate design","description":"Predicates are the building blocks of Chainhook.","content":"\nThe core design of Chainhook revolves around the concept of predicates. Each individual chainhook has a customizable predicate that specifies what Bitcoin or Stacks blockchain data you are scanning for.\n\n<Callout type=\"warn\" title=\"Requirements\">\n Commands outlined here will require that you have [installed Chainhook directly](/stacks/chainhook/installation) first.\n</Callout>\n\n## Predicate design\nBelow is the general strucure of the `predicate` JSON with its primary elements. These elements and their values are required. \n\n- Chainhook will evaluate the predicate against the specfied blockchain specified in `chain`.\n- The `uuid` will be returned in the Chainhook payload, providing a record of the predicate that triggers it.\n- Identify your predicate for your app using `name` and `version`.\n\n```json\n {\n \"chain\": \"stacks\",\n \"uuid\": \"1\",\n \"name\": \"STX_Transfer_Predicate\",\n \"version\": 1,\n \"networks\": {\n // Other configurations\n }\n }\n ```\n\n<Callout type=\"info\" title=\"Note\">\n You can use the following command to verify your predicate:\n ```\n chainhook predicate check your-predicate-file.json --mainnet\n ```\n</Callout>\n\n## Networks\n\nThe `networks` element contains an object who's key determines the blockchain network you want Chainhook to scan. \n- This object's value will contain the `if_this` and then `then_that` specifications.\n- Multple networks can be specified in the `networks` element.\n\n```json\n \"networks\": {\n \"mainnet\": {\n // if_this and then_that specifications\n // Other configurations\n },\n \"testnet\": {\n // if_this and then_that specifications\n // Other configurations\n },\n }\n```\n\n<Callout type=\"info\" title=\"Note\">\n For additional information, check out the [Bitcoin scopes](/stacks/chainhook/references/scopes/bitcoin) and [Stacks scopes](/stacks/chainhook/references/scopes/stacks) references pages.\n</Callout>\n\n## if_this specification\n\nThe `predicate` identifies what data you want Chainhook to scan for using the `scope` define within the `if_this` specification. Additional arguments specific to the `scope` will also be passed here.\n\n```json\n {\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n }\n }\n```\n\n## then_that specification\n\nChainhook delivers the payload when it is triggered by your `predicate` using the `then_that` specification. There are 2 options available:\n\n1. `file_append`\n2. `http_post`\n\nWhen choosing to use file_append, specify the path where Chainhook will post the payload data.\n\n```json \n{\n \"then_that\": {\n \"file_append\": { \n \"path\": \"/tmp/events.json\"\n }\n }\n}\n```\n\nWhen using `http_post`, specify the endpoint's `url` and `authorization_header`.\n\n```json\n{\n \"then_that\": {\n \"http_post\": {\n \"url\": \"https://webhook.site/abc123456-789e-0fgh-1ijk-23lmno456789\",\n \"authorization_header\": \"12345\"\n }\n }\n}\n```\n\n<Callout title=\"Note\">\n Chainhook requires `https` to post to your endpoint. You can use a service like [LocalTunnel](https://github.com/localtunnel/localtunnel) to test locally or a site like [WebhookSite](https://webhook.site).\n</Callout>\n\n## Blockchain specific configurations\n\n<Tabs defaultValue=\"bitcoin\">\n <TabsList>\n <TabsTrigger value=\"bitcoin\">Bitcoin predicate</TabsTrigger>\n <TabsTrigger value=\"stacks\">Stacks predicate</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"bitcoin\">\n ```json\n {\n \"chain\": \"bitcoin\",\n \"uuid\": \"1\",\n \"name\": \"Wrap BTC\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"if_this\": {\n \"scope\": \"ordinals_protocol\",\n \"operation\": \"inscription_feed\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://localhost:3000/api/v1/ordinals\",\n \"authorization_header\": \"Bearer cn389ncoiwuencr\"\n }\n },\n \"start_block\": 10200\n // Additional configurations\n },\n \"mainnet\": {\n \"if_this\": {\n \"scope\": \"ordinals_protocol\",\n \"operation\": \"inscription_feed\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://my-protocol.xyz/api/v1/ordinals\",\n \"authorization_header\": \"Bearer cn389ncoiwuencr\"\n }\n },\n \"start_block\": 90232\n // Additional configurations\n }\n }\n }\n ```\n\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"start-block\">\n <AccordionTrigger>Ignore blocks before start block</AccordionTrigger>\n <AccordionContent>\n ```json\n \"start_block\": 101\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"end-block\">\n <AccordionTrigger>Ignore blocks after end block</AccordionTrigger>\n <AccordionContent>\n ```json\n \"end_block\": 201\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"expire\">\n <AccordionTrigger>Stop after number of occurrences</AccordionTrigger>\n <AccordionContent>\n ```json\n \"expire_after_occurrence\": 1\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"proofs\">\n <AccordionTrigger>Exclude proofs from payload</AccordionTrigger>\n <AccordionContent>\n ```json\n \"include_proof\": false\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"inputs\">\n <AccordionTrigger>Exclude transaction inputs from payload</AccordionTrigger>\n <AccordionContent>\n ```json\n \"include_inputs\": false\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"outputs\">\n <AccordionTrigger>Exclude transaction outputs from payload</AccordionTrigger>\n <AccordionContent>\n ```json\n \"include_outputs\": false\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"witness\">\n <AccordionTrigger>Exclude transaction witnesses from payload</AccordionTrigger>\n <AccordionContent>\n ```json\n \"include_witness\": false\n ```\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n <Callout type=\"info\" title=\"Note\">\n The following command allows you to generate a predicate template for the Bitcoin blockchain.\n ```\n chainhook predicates new your-bitcoin-predicate.json --bitcoin\n ```\n </Callout>\n\n </TabsContent>\n\n <TabsContent value=\"stacks\">\n ```json\n {\n \"chain\": \"stacks\",\n \"uuid\": \"1\",\n \"name\": \"Contract-Call-Chainhook\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"/tmp/events.json\"\n }\n },\n \"start_block\": 21443\n // Additional configurations\n },\n \"mainnet\": {\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://my-protocol.xyz/api/v1/ordinals\",\n \"authorization_header\": \"Bearer cn389ncoiwuencr\"\n }\n },\n \"start_block\": 142221\n // Additional configurations\n }\n }\n }\n ```\n\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"item-1\">\n <AccordionTrigger>Additional Stacks predicate configurations</AccordionTrigger>\n <AccordionContent>\n <p>These additional configurations can be used to improve the performance of Chainhook by preventing a full scan of the blockchain:</p>\n\n <p>Ignore any block before the given block:</p>\n\n ```json\n \"start_block\": 101\n ```\n\n <p>Ignore any block after the given block:</p>\n \n ```json\n \"end_block\": 201\n ```\n\n <p>Stop evaluating chainhook after a given number of occurrences found:</p>\n\n ```json\n \"expire_after_occurrence\": 1\n ```\n\n <p>Include decoded Clarity values in the payload:</p>\n\n ```json\n \"decode_clarity_values\": true\n ```\n\n <p>Include the contract ABI for transactions that deploy contracts:</p>\n\n ```json\n \"include_contract_abi\": true\n ```\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n <Callout type=\"info\" title=\"Note\">\n The following command allows you to generate a predicate template for the Stacks blockchain.\n ```\n chainhook predicates new your-stacks-predicate.json --stacks\n ```\n </Callout>\n\n </TabsContent>\n</Tabs>\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/observing-contract-calls\"\n title=\"Observing contract calls\"\n description=\"Learn use a predicate to observe Stacks contracts calls with Chainhook.\"\n />\n <Card\n href=\"/stacks/platform/guides/create-chainhooks\"\n title=\"Create a chainhook\"\n description=\"Learn how to create a chainhook using the Hiro Platform.\"\n />\n <Card\n href=\"/stacks/chainhook/references/scopes/stacks\"\n title=\"Stacks scopes\"\n description=\"Learn how to use additional scopes to scan for specific Stacks blockchain events.\"\n />\n <Card\n href=\"/stacks/chainhook/references/scopes/bitcoin\"\n title=\"Bitcoin scopes\"\n description=\"Learn how to use additional scopes to scan for specific Bitcoin blockchain events.\"\n />\n</Cards>\n\n","url":"/docs/stacks/chainhook/predicate-design"},"380":{"id":"/docs/stacks/chainhook/installation","title":"Installation","description":"Chainhook is a CLI tool that allows you to create event streams for your Stacks and Bitcoin nodes.","content":"\n<Tabs defaultValue=\"macos\">\n <TabsList>\n <TabsTrigger value=\"macos\">macOS</TabsTrigger>\n <TabsTrigger value=\"linux\">Linux</TabsTrigger>\n <TabsTrigger value=\"windows\">Windows</TabsTrigger>\n <TabsTrigger value=\"cargo\">Using Cargo</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"macos\">\n ```terminal\n $ brew install chainhook\n ```\n </TabsContent>\n\n <TabsContent value=\"linux\">\n ```terminal\n $ sudo snap install chainhook\n ```\n </TabsContent>\n\n <TabsContent value=\"windows\">\n ```terminal\n $ winget install HiroSystems.Chainhook\n ```\n </TabsContent>\n\n <TabsContent value=\"cargo\">\n Clone the [Chainhook Repo](https://github.com/hirosystems/chainhook):\n\n ```terminal\n $ git clone https://github.com/hirosystems/chainhook.git\n ```\n\n Navigate to the root directory and run `cargo chainhook-install`:\n\n ```terminal\n $ cd chainhook && cargo chainhook-install\n ```\n </TabsContent>\n</Tabs>","url":"/docs/stacks/chainhook/installation"},"381":{"id":"/docs/stacks/quickstarts","title":"Quickstarts","description":"The following guides cover ways to use Hiro tools to build apps on Stacks.","content":"\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/quickstart\"\n title=\"Create your first smart contract\"\n description=\"Build a simple counter contract using Clarinet.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Blockchain />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write unit tests for your smart contracts\"\n description=\"Learn how run unit tests with Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/stacks.js/quickstart\"\n title=\"Make a contract call with Stacks.js\"\n description=\"Learn how to integrate smart contracts into your app.\"\n tag='Stacks.js'\n />\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n","url":"/docs/stacks/quickstarts"},"382":{"id":"/docs/stacks/quickstarts/event-streaming","title":"Event streaming","description":"Stream events.","content":"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```","url":"/docs/stacks/quickstarts/event-streaming"},"383":{"id":"/docs/stacks/quickstarts/wallet-integration","title":"Wallet integration","description":"Integrate with a wallet.","content":"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```","url":"/docs/stacks/quickstarts/wallet-integration"},"384":{"id":"/docs/stacks/quickstarts/app-templates","title":"App templates","description":"Build your app with a template.","content":"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```","url":"/docs/stacks/quickstarts/app-templates"},"385":{"id":"/docs/stacks/quickstarts/nft-minting","title":"NFT minting","description":"Mint an NFT.","content":"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```","url":"/docs/stacks/quickstarts/nft-minting"},"386":{"id":"/docs/stacks/quickstarts/contract-templates","title":"Contract templates","description":"Build your contract with a template.","content":"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```","url":"/docs/stacks/quickstarts/contract-templates"},"387":{"id":"/docs/stacks/quickstarts/token-transfers","title":"Token transfers","description":"Transfer tokens.","content":"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```","url":"/docs/stacks/quickstarts/token-transfers"},"388":{"id":"/docs/stacks/rpc-api/blocks","title":"Blocks","description":"Get block proposal information.","content":"","url":"/docs/stacks/rpc-api/blocks"},"389":{"id":"/docs/stacks/rpc-api/blocks/block-proposal","title":"Validate proposed block","description":"Validate a proposed Stacks block.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/block_proposal', method: 'post' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/blocks/block-proposal"},"390":{"id":"/docs/stacks/rpc-api/pox","title":"Proof of Transfer","description":"Retrieves Proof-of-Transfer (PoX) information.","content":"","url":"/docs/stacks/rpc-api/pox"},"391":{"id":"/docs/stacks/rpc-api/pox/stacker-set","title":"Get stacker and signer set information","description":"Retrieves stacker and signer set information for a given cycle.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/stacker_set/{cycle_number}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/pox/stacker-set"},"392":{"id":"/docs/stacks/rpc-api/pox/pox-details","title":"Get Proof-of-Transfer details","description":"Retrieves Proof-of-Transfer (PoX) information.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/pox', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/pox/pox-details"},"393":{"id":"/docs/stacks/rpc-api/names/namespace-price","title":"Get namespace price","description":"Retrieves the price of a namespace.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/prices/namespaces/{tld}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/names/namespace-price"},"394":{"id":"/docs/stacks/rpc-api/names","title":"Names","description":"Manages and retrieve information on blockchain namespaces, names, and related details.","content":"","url":"/docs/stacks/rpc-api/names"},"395":{"id":"/docs/stacks/rpc-api/names/name-price","title":"Get name price","description":"Retrieves the price of a name.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/prices/names/{name}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/names/name-price"},"396":{"id":"/docs/stacks/rpc-api/fees/estimate","title":"Get approximate fees for the given transaction","description":"Get an estimated fee for the supplied transaction.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/fees/transaction', method: 'post' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/fees/estimate"},"397":{"id":"/docs/stacks/rpc-api/fees","title":"Fees","description":"Provide estimates, rates, and approximate calculations for transaction costs.","content":"","url":"/docs/stacks/rpc-api/fees"},"398":{"id":"/docs/stacks/rpc-api/fees/transfer-estimate","title":"Get transfer fee estimate","description":"Retrieves an estimated fee rate for STX transfer transactions.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/fees/transfer', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/fees/transfer-estimate"},"399":{"id":"/docs/stacks/rpc-api","title":"Overview","description":"Query the Stacks Node RPC API, interact with smart contracts, and broadcast transactions all via a familiar REST interface.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nThe Stacks Node RPC API allows you to query the Stacks blockchain and interact with smart contracts. Note: this is not a Hiro-maintained service. This RPC API is generated by every Stacks node and allows you to self-host your own node and API. This is a minimalist configuration. For a richer data set and an API that is easier to use, try [Hiro's Stacks Blockchain API](/stacks/api).\n\n## Popular endpoints\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/rpc-api/transactions/broadcast-transaction\"\n title=\"Broadcast transaction\"\n description=\"Broadcast a transaction to the Stacks network.\"\n />\n <SecondaryCard\n href=\"/stacks/rpc-api/smart-contracts/read-only\"\n title=\"Call smart contracts\"\n description=\"Call a read-only public function on a smart contract.\"\n />\n <SecondaryCard\n href=\"/stacks/rpc-api/pox/pox-details\"\n title=\"Retrieve PoX protocol details\"\n description=\"Get Proof of Transfer (PoX) details, including cycles and stacking thresholds.\"\n />\n \n</Cards>\n\n## Related tools\n\n- **[Stacks Blockchain API](/stacks/api)**: Fetch richer data from Hiro's Stacks Blockchain API.\n- **[Token Metadata API](/stacks/token-metadata-api)**: Fetch fungible and non-fungible token data on the Stacks blockchain.\n- **[Stacks Explorer](https://explorer.hiro.so)**: Verify activity on the Stacks blockchain with an easy-to-use front end.\n\n<br />\n\n<Callout title=\"Need help building with the Stacks Node RPC API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#api</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n","url":"/docs/stacks/rpc-api"},"400":{"id":"/docs/stacks/rpc-api/info","title":"Info","description":"Retrieves information about the Core API and the Stacks network.","content":"","url":"/docs/stacks/rpc-api/info"},"401":{"id":"/docs/stacks/rpc-api/info/core-api","title":"Get core API info","description":"Retrieves information about the Core API, including the server version.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/info', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/info/core-api"},"402":{"id":"/docs/stacks/rpc-api/transactions/broadcast-transaction","title":"Broadcast transaction","description":"Broadcasts raw transactions on the network.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/transactions', method: 'post' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/transactions/broadcast-transaction"},"403":{"id":"/docs/stacks/rpc-api/transactions","title":"Transactions","description":"Manage, retrieve, and broadcast transaction data on the blockchain.","content":"","url":"/docs/stacks/rpc-api/transactions"},"404":{"id":"/docs/stacks/rpc-api/accounts","title":"Accounts","description":"Get account information.","content":"","url":"/docs/stacks/rpc-api/accounts"},"405":{"id":"/docs/stacks/rpc-api/accounts/info","title":"Get account info","description":"Retrieves the account data for a given account or contract identifier.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/accounts/{principal}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/accounts/info"},"406":{"id":"/docs/stacks/rpc-api/v3","title":"v3","description":"Version 3 of the RPC API.","content":"","url":"/docs/stacks/rpc-api/v3"},"407":{"id":"/docs/stacks/rpc-api/v3/tenure-metadata","title":"Get Nakamoto tenure metadata","description":"Fetch metadata about the ongoing Nakamoto tenure.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v3/tenures/info', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/v3/tenure-metadata"},"408":{"id":"/docs/stacks/rpc-api/v3/nakamoto-block","title":"Get Nakamoto block","description":"Fetch a Nakamoto block by its index block hash.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v3/blocks/{block_id}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/v3/nakamoto-block"},"409":{"id":"/docs/stacks/rpc-api/v3/tenure-blocks","title":"Get Nakamoto tenure blocks","description":"Fetch a sequence of Nakamoto blocks in a tenure.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v3/tenures/{block_id}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/v3/tenure-blocks"},"410":{"id":"/docs/stacks/rpc-api/smart-contracts/interface","title":"Get contract interface","description":"Retrieves a list of functions, variables, maps, fungible tokens and non-fungible tokens for a given smart contract.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/contracts/interface/{contract_address}/{contract_name}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/smart-contracts/interface"},"411":{"id":"/docs/stacks/rpc-api/smart-contracts/traits","title":"Get trait implementation details","description":"Determine whether or not a specified trait is implemented (either explicitly or implicitly) within a given contract.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/traits/{contract_address}/{contract_name}/{trait_contract_address}/{trait_contract_name}/{trait_name}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/smart-contracts/traits"},"412":{"id":"/docs/stacks/rpc-api/smart-contracts","title":"Smart contracts","description":"Provide information and facilitate interactions with smart contracts.","content":"","url":"/docs/stacks/rpc-api/smart-contracts"},"413":{"id":"/docs/stacks/rpc-api/smart-contracts/map-entry","title":"Get contract map entry","description":"Retrieves a specific entry from a contract data map.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/map_entry/{contract_address}/{contract_name}/{map_name}', method: 'post' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/smart-contracts/map-entry"},"414":{"id":"/docs/stacks/rpc-api/smart-contracts/read-only","title":"Call read-only function","description":"Calls a read-only public function on a given smart contract.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/contracts/call-read/{contract_address}/{contract_name}/{function_name}', method: 'post' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/smart-contracts/read-only"},"415":{"id":"/docs/stacks/rpc-api/smart-contracts/source","title":"Get contract source","description":"Retrieves the Clarity source code of a given contract, along with the block height it was published in, and the MARF proof for the data.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/contracts/source/{contract_address}/{contract_name}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/smart-contracts/source"},"416":{"id":"/docs/stacks/rpc-api/smart-contracts/constants","title":"Get constant value","description":"Get the value of a constant inside a contract.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/constant_val/{contract_address}/{contract_name}/{constant_name}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/smart-contracts/constants"},"417":{"id":"/docs/stacks/rpc-api/burn-ops","title":"Burn operations","description":"Get burn operations of type `op_type` successfully read at `burn_height`.","content":"","url":"/docs/stacks/rpc-api/burn-ops"},"418":{"id":"/docs/stacks/rpc-api/burn-ops/get-burn-operations","title":"Get burn operations","description":"Get all burn operations of type `op_type` successfully read at `burn_height`.","content":"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/burn_ops/{burn_height}/{op_type}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/stacks/rpc-api/burn-ops/get-burn-operations"},"419":{"id":"/docs/bitcoin/contributors-guide","title":"Contributors guide","description":"Learn how to contribute to Hiro's documentation and content.","content":"\nimport ContributorsGuideContent from '@/content/_shared/contributors-guide.mdx';\n\n<ContributorsGuideContent components={props.components} />\n","url":"/docs/bitcoin/contributors-guide"},"420":{"id":"/docs/bitcoin/get-started","title":"Get started","description":"The following guides cover ways to use Hiro tools to build with Ordinals, BRC-20, and Runes.","content":"\nimport { SecondaryCard, SmallCard } from '@/components/card';\nimport { API, Container, Chainhook, BitcoinIcon } from '@/components/ui/icon';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n className=\"group\"\n icon={<API className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/bitcoin/ordinals/api\"\n title=\"Integrate ordinals data into your app\"\n description=\"Use the Ordinals API to get reliable data for Ordinals and BRC-20 tokens.\"\n tag='Ordinals API'\n />\n <SecondaryCard\n className=\"group\"\n icon={<Chainhook className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/bitcoin/indexer\"\n title=\"Stream custom blockchain events\"\n description=\"Use the Bitcoin Indexer to filter and stream for contract deployments.\"\n tag='Bitcoin Indexer'\n />\n <SecondaryCard\n className=\"group\"\n icon={<API className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/bitcoin/runes/api\"\n title=\"Get Runes data\"\n description=\"Use Runes API to get reliable data for Runes.\"\n tag='Runes API'\n />\n</Cards>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n","url":"/docs/bitcoin/get-started"},"421":{"id":"/docs/bitcoin/rate-limiting","title":"Rate limiting","description":"Understand the rate limits for Hiro APIs and the STX Faucet.","content":"\nimport RateLimitingContent from '@/content/_shared/rate-limiting.mdx';\n\n<RateLimitingContent components={props.components} />\n","url":"/docs/bitcoin/rate-limiting"},"422":{"id":"/docs/bitcoin/runes/runehook","title":"Overview","description":"Runehook enables you to build Rune event streams, so you can create accurate, lightweight databases that gracefully handle Bitcoin forks and reorgs.","content":"\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\n\nRunehook is a reorg-aware indexer that automatically handles chain forks, so you don’t need to waste time or resources reindexing your database yourself.\n\nWith a familiar event-driven framework, you can customize what Rune data you index in order to create lightweight databases for faster query responses and a better user experience.\n\n### Create event streams\n\n\n### Related tools\n\n- **[Runes API](/bitcoin/runes/api)**: Skip the infrastructure setup and get the runes data you need from our Runes API, which is powered by Runehook.\n- **[Ordinals Explorer](/ordinals/explorer)**: Explore Ordinals inscriptions and BRC-20 tokens rapidly in our Ordinals Explorer.\n\n---\n\n_Need help building with Runehook?_ Reach out to us on the `#chainhook` channel on Discord under **Hiro Developer Tools** section. We also host a weekly office hours on Discord every Monday at 11am ET.\n","url":"/docs/bitcoin/runes/runehook"},"423":{"id":"/docs/bitcoin/runes/runehook/quickstart","title":"Quickstart","description":"Learn how to scan the Bitcoin blockchain for Runes activity.","content":"\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\nimport { Step } from 'fumadocs-ui/components/steps';\nimport { SmallCard } from '@/components/card';\n\nIn this quickstart guide, you will set up `runehook` to explore and index Rune activity on the Bitcoin blockchain. You will learn how to install, configure, and run basic commands to scan and stream Rune inscriptions and transfers.\n\n{/* Check out the [Runehook as a service](/bitcoin/runehook/guides/runehook-as-a-service) for a more advanced use case. */}\n\n---\n\n### Prerequisites\n\nBefore starting, ensure you have `runehook` installed. If you haven't already, check out the [installation](/bitcoin/runehook/installation) guide.\n\n---\n\n### Next steps\n\n<Cards className='sm:grid-cols-1'>\n <SmallCard\n icon={<Code />}\n href=\"/bitcoin/runes/api\"\n title=\"Integrate runes data into your app\"\n description=\"Use the Runes API to get reliable data for Runes and BRC-20 tokens.\"\n tag='Runes API'\n />\n</Cards>\n","url":"/docs/bitcoin/runes/runehook/quickstart"},"424":{"id":"/docs/bitcoin/runes/runehook/installation","title":"Installation","description":"Runehook was developed to be environment-agnostic. Below are the different ways to install and build the Bitcoin Indexer on your machine.","content":"Clone the [Runehook repository](https://github.com/hirosystems/runehook) to your local machine and install via `cargo`.\n\n```terminal\n$ git clone https://github.com/hirosystems/runehook.git\n$ cd runehook\n$ cargo runehook-install\n```","url":"/docs/bitcoin/runes/runehook/installation"},"425":{"id":"/docs/bitcoin/runes/explorer","title":"Overview","description":"Explore and verify ordinals and BRC-20 data on Bitcoin.","content":"\nimport Link from \"next/link\";\nimport { Button } from \"@/components/ui/button\"\n\nThe Ordinals Explorer lets you explore and verify Bitcoin Ordinals and BRC-20 token data. You can also use a variety of filters to discover inscriptions. We maintain and support the [Ordinals Explorer](https://ordinals.hiro.so) as a service for the community, but you can also run your own instance of the explorer if you so choose.\n\n<div className=\"flex gap-4\">\n <Button className=\"bg-orange-500 hover:bg-orange-600\">\n <a href=\"https://ordinals.hiro.so\" target=\"_blank\" className=\"no-underline\">\n View Ordinals Explorer\n </a>\n </Button>\n <Button variant=\"outline\">\n <Link\n href=\"/bitcoin/explorer/guides/build-explorer\"\n className=\"no-underline\"\n >\n Set up your own explorer\n </Link>\n </Button>\n</div>\n\n### Related tools\n\n- **[Ordinals API](/bitcoin/ordinals/api)**: Looking for on-chain data without the front end? Leverage the Ordinals API.\n- **[Stacks Explorer](https://explorer.hiro.so)**: Looking for a front end to verify activity on the Stacks blockchain? Try the Stacks Explorer.\n\n---\n\nNeed help building with the Ordinals Explorer? Reach out to us on the `#ordinals` channel on Discord under the [Hiro Developer Tools section](https://stacks.chat/). There’s also a [weekly office hours](https://events.stacks.co/event/HD16484710) on Discord every Thursday at 11am ET.\n","url":"/docs/bitcoin/runes/explorer"},"426":{"id":"/docs/bitcoin/runes/explorer/guides/build-explorer","title":"Build Ordinals Explorer","description":"","content":"\nAfter installing and configuring your environment, you can run the Ordinals Explorer locally if you wish by running the followning `npm` command:\n\n`npm run dev`\n\n## Building for production\n\nYou may also build a production version of the Ordinals Explorer. To do that, simply run the following command:\n\n`npm run build`\n\n<Callout>\n Running `npm run build` also run the default next.js build task.\n</Callout>\n","url":"/docs/bitcoin/runes/explorer/guides/build-explorer"},"427":{"id":"/docs/bitcoin/runes/api","title":"Overview","description":"The Runes API provides you with fast, reliable data for Bitcoin Runes via an easy-to-use REST interface.","content":"\nThe Runes API is a service that helps you with the complete ingestion of Bitcoin Runes data. Using our endpoints, you can retrieve metadata for a particular rune, trading activity, all runes held by a particular address, and more.\n\nThe Runes API uses REST endpoints and cached responses in order to optimize performance and reduce unnecessary requests. Reliable, consistent runes data, one request away.\n\n## Popular endpoints\n\n<Cards>\n <Card\n href=\"/bitcoin/runes/api/etchings/get-etchings\"\n title=\"Fetch Runes\"\n description=\"Retrieves a list of etchings.\"\n />\n <Card\n href=\"/bitcoin/runes/api/balances/holders\"\n title=\"Showcase user portfolios\"\n description=\"Retrieves a list of Rune holders.\"\n />\n <Card\n href=\"/bitcoin/runes/api/activities/activity\"\n title=\"Track your favorite Runes\"\n description=\"Retrieves all activity for a Rune.\"\n />\n</Cards>\n\n### Related tools\n\n{/* - **[Runehook](/bitcoin/runes/runeshook)**: Want to run your own infra? [Set up your own Runehook](/bitcoin/runes/runeshook/guides/runehook-as-a-service), the indexer that powers the Rune API. */}\n- **[Ordinals API](/bitcoin/ordinals/api)**: Looking for on-chain ordinals data without the front end? Leverage the Ordinals API.\n- **[Ordinals Explorer](https://ordinals.hiro.so/)**: The Ordinals API powers Hiro’s Ordinals Explorer, which lets you rapidly discover inscriptions and verify on-chain activity.\n\n---\n\nNeed help building with Runes API? Reach out to us on the `#ordinals` channel on Discord. Or join us at our weekly office hours on Discord every Monday at 11am ET.\n","url":"/docs/bitcoin/runes/api"},"428":{"id":"/docs/bitcoin/runes/api/info","title":"Status","description":"Retrieves information about the Rune API status.","content":"","url":"/docs/bitcoin/runes/api/info"},"429":{"id":"/docs/bitcoin/runes/api/info/status","title":"Get API Status","description":"Retrieves the status of the API.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/runes/api/info/status"},"430":{"id":"/docs/bitcoin/runes/api/balances/address","title":"Get address balances","description":"Retrieves a paginated list of address balances.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/addresses/{address}/balances', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/runes/api/balances/address"},"431":{"id":"/docs/bitcoin/runes/api/balances","title":"Balances","description":"Retrieves information about Rune balances.","content":"","url":"/docs/bitcoin/runes/api/balances"},"432":{"id":"/docs/bitcoin/runes/api/balances/holder-balance","title":"Get holder balance","description":"Retrieves holder balance for a specific Rune.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/holders/{address}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/runes/api/balances/holder-balance"},"433":{"id":"/docs/bitcoin/runes/api/balances/holders","title":"Get rune holders","description":"Retrieves a paginated list of holders for a Rune.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/holders', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/runes/api/balances/holders"},"434":{"id":"/docs/bitcoin/runes/api/activities","title":"Activities","description":"Retrieves information about Rune activities.","content":"","url":"/docs/bitcoin/runes/api/activities"},"435":{"id":"/docs/bitcoin/runes/api/activities/for-transaction","title":"Get activity for a transaction","description":"Retrieves a paginated list of rune activity for a transaction.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/transactions/{tx_id}/activity', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/runes/api/activities/for-transaction"},"436":{"id":"/docs/bitcoin/runes/api/activities/for-address","title":"Get activity for an address","description":"Retrieves all Rune activity for a Bitcoin address.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/activity/{address}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/runes/api/activities/for-address"},"437":{"id":"/docs/bitcoin/runes/api/activities/for-block","title":"Get activity for a block","description":"Retrieves a paginated list of rune activity for a block.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/blocks/{block}/activity', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/runes/api/activities/for-block"},"438":{"id":"/docs/bitcoin/runes/api/activities/activity","title":"Get all activity","description":"Retrieves all activity for a Rune.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/activity', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/runes/api/activities/activity"},"439":{"id":"/docs/bitcoin/runes/api/usage","title":"Usage","description":"Create your first project in less than 2 minutes","content":"\nThe Usage section should focus on practical, hands-on instructions for getting started with the API. This includes:\nAuthentication: How to authenticate with the API (e.g., API keys, OAuth tokens).\nMaking Requests: Basic examples of making requests to the API, including request format, essential headers, and parameters.\nHandling Responses: Information on response structure, understanding status codes, and error handling.\nRate Limits: If applicable, explain any rate limits and best practices for avoiding them.\nThe goal of the \"Usage\" section is to equip developers with the knowledge to make successful API calls and handle responses effectively.\n","url":"/docs/bitcoin/runes/api/usage"},"440":{"id":"/docs/bitcoin/runes/api/etchings","title":"Etchings","description":"Retrieves information about Rune etchings.","content":"","url":"/docs/bitcoin/runes/api/etchings"},"441":{"id":"/docs/bitcoin/runes/api/etchings/get-etchings","title":"Get etchings","description":"Retrieves a paginated list of rune etchings.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/runes/api/etchings/get-etchings"},"442":{"id":"/docs/bitcoin/runes/api/etchings/get-etching","title":"Get etching","description":"Retrieves information for a Rune etching.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/runes/api/etchings/get-etching"},"443":{"id":"/docs/bitcoin/ordinals/explorer","title":"Overview","description":"Explore and verify ordinals and BRC-20 data on Bitcoin.","content":"\nimport Link from \"next/link\";\nimport { Button } from \"@/components/ui/button\"\n\nThe Ordinals Explorer lets you explore and verify Bitcoin Ordinals and BRC-20 token data. You can also use a variety of filters to discover inscriptions. We maintain and support the [Ordinals Explorer](https://ordinals.hiro.so) as a service for the community, but you can also run your own instance of the explorer if you so choose.\n\n<div className=\"flex gap-4\">\n <Button className=\"bg-orange-500 hover:bg-orange-600\">\n <a href=\"https://ordinals.hiro.so\" target=\"_blank\" className=\"no-underline\">\n View Ordinals Explorer\n </a>\n </Button>\n <Button variant=\"outline\">\n <Link\n href=\"/bitcoin/explorer/guides/build-explorer\"\n className=\"no-underline\"\n >\n Set up your own explorer\n </Link>\n </Button>\n</div>\n\n## Related tools\n\n- **[Ordinals API](/bitcoin/ordinals/api)**: Looking for on-chain data without the front end? Leverage the Ordinals API.\n- **[Stacks Explorer](https://explorer.hiro.so)**: Looking for a front end to verify activity on the Stacks blockchain? Try the Stacks Explorer.\n\n---\n\nNeed help building with the Ordinals Explorer? Reach out to us on the `#ordinals` channel on Discord under the [Hiro Developer Tools section](https://stacks.chat/). There’s also a [weekly office hours](https://events.stacks.co/event/HD16484710) on Discord every Thursday at 11am ET.\n","url":"/docs/bitcoin/ordinals/explorer"},"444":{"id":"/docs/bitcoin/ordinals/explorer/guides/build-explorer","title":"Build Ordinals Explorer","description":"","content":"\nAfter installing and configuring your environment, you can run the Ordinals Explorer locally if you wish by running the followning `npm` command:\n\n`npm run dev`\n\n## Building for production\n\nYou may also build a production version of the Ordinals Explorer. To do that, simply run the following command:\n\n`npm run build`\n\n<Callout title=\"Note\" type=\"info\">\n Running `npm run build` also run the default next.js build task.\n</Callout>\n","url":"/docs/bitcoin/ordinals/explorer/guides/build-explorer"},"445":{"id":"/docs/bitcoin/ordinals/api/statistics","title":"Statistics","description":"Retrieves stats on the number of inscriptions per block.","content":"","url":"/docs/bitcoin/ordinals/api/statistics"},"446":{"id":"/docs/bitcoin/ordinals/api/statistics/get-stats-inscription-count","title":"Get inscription count per block","description":"Retrieves statistics on the number of inscriptions revealed per block.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/stats/inscriptions', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/ordinals/api/statistics/get-stats-inscription-count"},"447":{"id":"/docs/bitcoin/ordinals/api/brc20/get-brc20-token-holders","title":"Get BRC-20 token holders","description":"Retrieves a list of holders and their balances for a particular BRC-20 token.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens/{ticker}/holders', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/ordinals/api/brc20/get-brc20-token-holders"},"448":{"id":"/docs/bitcoin/ordinals/api/brc20","title":"BRC-20","description":"Retrieves information about BRC-20 tokens.","content":"","url":"/docs/bitcoin/ordinals/api/brc20"},"449":{"id":"/docs/bitcoin/ordinals/api/brc20/get-brc20-balances","title":"Get BRC-20 balances","description":"Retrieves BRC-20 token balances for a Bitcoin address.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/balances/{address}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/ordinals/api/brc20/get-brc20-balances"},"450":{"id":"/docs/bitcoin/ordinals/api/brc20/get-brc20-token-details","title":"Get BRC-20 token details","description":"Retrieves information for a BRC-20 token, including supply and holders.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens/{ticker}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/ordinals/api/brc20/get-brc20-token-details"},"451":{"id":"/docs/bitcoin/ordinals/api/brc20/get-brc20-tokens","title":"Get BRC-20 tokens","description":"Retrieves information for BRC-20 tokens.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/ordinals/api/brc20/get-brc20-tokens"},"452":{"id":"/docs/bitcoin/ordinals/api/brc20/get-brc20-activity","title":"Get BRC-20 activity","description":"Retrieves BRC-20 activity filtered by ticker, address, operation, or block height.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/activity', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/bitcoin/ordinals/api/brc20/get-brc20-activity"},"453":{"id":"/docs/bitcoin/ordinals/api/inscriptions","title":"Inscriptions","description":"Retrieves information about Ordinals inscriptions.","content":"","url":"/docs/bitcoin/ordinals/api/inscriptions"},"454":{"id":"/docs/bitcoin/ordinals/api/inscriptions/get-inscription-transfers","title":"Get inscription transfers","description":"Retrieves all transfers for a single inscription.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}/transfers', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/ordinals/api/inscriptions/get-inscription-transfers"},"455":{"id":"/docs/bitcoin/ordinals/api/inscriptions/get-inscriptions","title":"Get inscriptions","description":"Retrieves a list of inscriptions with options to filter and sort results.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/ordinals/api/inscriptions/get-inscriptions"},"456":{"id":"/docs/bitcoin/ordinals/api/inscriptions/get-inscription-content","title":"Get inscription content","description":"Retrieves the content of a single inscription.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}/content', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/ordinals/api/inscriptions/get-inscription-content"},"457":{"id":"/docs/bitcoin/ordinals/api/inscriptions/get-transfers-per-block","title":"Get transfers per block","description":"Retrieves a list of inscription transfers that ocurred at a specific Bitcoin block.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/transfers', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/ordinals/api/inscriptions/get-transfers-per-block"},"458":{"id":"/docs/bitcoin/ordinals/api/inscriptions/get-inscription","title":"Get inscription","description":"Retrieves a single inscription.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/ordinals/api/inscriptions/get-inscription"},"459":{"id":"/docs/bitcoin/ordinals/api","title":"Overview","description":"The Ordinals API provides you with fast, reliable data for Bitcoin ordinals and BRC-20 tokens via an easy-to-use REST interface.","content":"\nimport { SecondaryCard } from '@/components/card';\n\nThe Ordinals API is a service that helps you with the complete ingestion of ordinals inscription data. Using our endpoints, you can retrieve metadata for a particular inscription, trading activity, all inscriptions held by a particular address, and more.\n\nThe Ordinals API uses REST endpoints and cached responses in order to optimize performance and reduce unnecessary requests. Start integrating ordinals and BRC-20 tokens into your app with one of the most reliable APIs on the market today.\n\n## Popular endpoints\n\n<Cards>\n <SecondaryCard\n href=\"/bitcoin/ordinals/api/inscriptions/get-inscription-content\"\n title=\"Fetch Ordinals content\"\n description=\"Retrieve all metadata related to individual inscriptions.\"\n />\n <SecondaryCard\n href=\"/bitcoin/ordinals/api/brc20/get-brc20-tokens\"\n title=\"Integrate BRC-20 tokens\"\n description=\"Retrieve all metadata related to BRC-20 tokens.\"\n />\n <SecondaryCard\n href=\"/bitcoin/ordinals/api/inscriptions/get-inscriptions\"\n title=\"Showcase user portfolios\"\n description=\"Get all inscriptions held by particular addresses.\"\n />\n <SecondaryCard\n href=\"/bitcoin/ordinals/api/satoshis/get-satoshi\"\n title=\"Retrieve data for a specific satoshi\"\n description=\"Get all inscription data related to a particular satoshi.\"\n />\n <SecondaryCard\n href=\"/bitcoin/ordinals/api/inscriptions/get-transfers-per-block\"\n title=\"Graph marketplace activity\"\n description=\"Pull all transfers from a specific block.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Bitcoin Indexer](/bitcoin/indexer)**: Want to run your own infra? [Set up your own Bitcoin Indexer](/bitcoin/indexer), the indexer that powers the Ordinals API.\n- **[Ordinals Explorer](https://ordinals.hiro.so/)**: The Ordinals API powers Hiro’s Ordinals Explorer, which lets you rapidly discover inscriptions and verify on-chain activity.\n\n<br />\n\n<Callout title=\"Need help building with the Ordinals API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#ordinals</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n","url":"/docs/bitcoin/ordinals/api"},"460":{"id":"/docs/bitcoin/ordinals/api/info","title":"Status","description":"Retrieves information about the Ordinals API status, including the server version.","content":"","url":"/docs/bitcoin/ordinals/api/info"},"461":{"id":"/docs/bitcoin/ordinals/api/info/status","title":"Get API status","description":"Retrieves the running status of the Ordinals API.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/ordinals/api/info/status"},"462":{"id":"/docs/bitcoin/ordinals/api/usage","title":"Usage","description":"Create your first project in less than 2 minutes","content":"\nThe Usage section should focus on practical, hands-on instructions for getting started with the API. This includes:\nAuthentication: How to authenticate with the API (e.g., API keys, OAuth tokens).\nMaking Requests: Basic examples of making requests to the API, including request format, essential headers, and parameters.\nHandling Responses: Information on response structure, understanding status codes, and error handling.\nRate Limits: If applicable, explain any rate limits and best practices for avoiding them.\nThe goal of the \"Usage\" section is to equip developers with the knowledge to make successful API calls and handle responses effectively.\n","url":"/docs/bitcoin/ordinals/api/usage"},"463":{"id":"/docs/bitcoin/ordinals/api/satoshis","title":"Satoshis","description":"Retrieves ordinal information for satoshis.","content":"","url":"/docs/bitcoin/ordinals/api/satoshis"},"464":{"id":"/docs/bitcoin/ordinals/api/satoshis/get-satoshi","title":"Get satoshi ordinal","description":"Retrieves ordinal information for a single satoshi.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/sats/{ordinal}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/ordinals/api/satoshis/get-satoshi"},"465":{"id":"/docs/bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions","title":"Get satoshi inscriptions","description":"Retrieves all inscriptions associated with a single satoshi.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/sats/{ordinal}/inscriptions', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions"},"466":{"id":"/docs/bitcoin","title":"Home","description":"","content":"\nimport { Card, SmallCard } from '@/components/card';\nimport { ImageZoom } from 'fumadocs-ui/components/image-zoom';\nimport { PageFooter } from '@/components/footer';\nimport { Database, Play } from 'lucide-react';\nimport { API, Backend, Chainhook, Newspaper, Ordinals, QuestionIcon, BugIcon, Pulse } from '@/components/ui/icon';\nimport heroImage from '@/public/bitcoin-hero.svg';\n\n<div className='flex flex-col space-y-10'>\n\n<div className='flex space-x-6 items-end'>\n <ImageZoom\n alt=\"banner\"\n src={heroImage}\n className=\"mt-0 mb-6 first-line:rounded-xl bg-background\"\n priority\n />\n\n <div className='flex flex-col [&_h2]:mt-0 [&_h2]:mb-2 [&_p]:mb-6'>\n\n ## Build with Bitcoin\n\n Find all the guides and resources you need to build on Ordinals and Runes.\n\n </div>\n</div>\n\n<Cards>\n <Card\n className='group space-y-1'\n icon={<Play className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/bitcoin/get-started\"\n title=\"Get Started\"\n description=\"Get started with our end-to-end tutorials and quickstart guides across all Hiro's ordinals tools.\"\n />\n <Card\n className='group space-y-1'\n icon={<API className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/bitcoin/ordinals/api\"\n title=\"Ordinals API Reference\"\n description=\"Explore API endpoints for interacting with Ordinals and meta-protocols.\"\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"explore-bitcoin\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#explore-bitcoin\" className=\"not-prose group text-sm uppercase\">Explore Bitcoin</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Ordinals />}\n href=\"/bitcoin/indexer\"\n title=\"Bitcoin Indexer\"\n description=\"Use the Bitcoin Indexer to index and query Bitcoin blockchain data.\"\n />\n <SmallCard\n icon={<API />}\n href=\"/bitcoin/ordinals/api\"\n title=\"Ordinals API\"\n description=\"Fetch on-chain data for Ordinals and meta-protocols with our hosted API.\"\n />\n <SmallCard\n icon={<Play />}\n href=\"https://ordinals.hiro.so/\"\n title=\"Ordinals Explorer\"\n description=\"View on-chain data for Ordinals and meta-protocols with our explorer.\"\n />\n <SmallCard\n icon={<API />}\n href=\"/bitcoin/runes/api\"\n title=\"Runes API\"\n description=\"Interact with the Runes protocol from your backend via our hosted API.\"\n />\n</Cards>\n\n</div>\n\n</div>\n\n<PageFooter />","url":"/docs/bitcoin"},"467":{"id":"/docs/bitcoin/api-keys","title":"API keys","description":"For developers who need API requests beyond the standard rate limits.","content":"\nimport ApiKeysContent from '@/content/_shared/api-keys.mdx';\n\n<ApiKeysContent components={props.components} />\n","url":"/docs/bitcoin/api-keys"},"468":{"id":"/docs/bitcoin/api/runes/info","title":"Status","description":"Retrieves information about the Rune API status.","content":"","url":"/docs/bitcoin/api/runes/info"},"469":{"id":"/docs/bitcoin/api/runes/info/status","title":"Get API Status","description":"Retrieves the status of the API.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/runes/info/status"},"470":{"id":"/docs/bitcoin/api/runes/balances/address","title":"Get address balances","description":"Retrieves a paginated list of address balances.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/addresses/{address}/balances', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/runes/balances/address"},"471":{"id":"/docs/bitcoin/api/runes/balances","title":"Balances","description":"Retrieves information about Rune balances.","content":"","url":"/docs/bitcoin/api/runes/balances"},"472":{"id":"/docs/bitcoin/api/runes/balances/holder-balance","title":"Get holder balance","description":"Retrieves holder balance for a specific Rune.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/holders/{address}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/runes/balances/holder-balance"},"473":{"id":"/docs/bitcoin/api/runes/balances/holders","title":"Get rune holders","description":"Retrieves a paginated list of holders for a Rune.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/holders', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/runes/balances/holders"},"474":{"id":"/docs/bitcoin/api/runes/activities","title":"Activities","description":"Retrieves information about Rune activities.","content":"","url":"/docs/bitcoin/api/runes/activities"},"475":{"id":"/docs/bitcoin/api/runes/activities/for-transaction","title":"Get activity for a transaction","description":"Retrieves a paginated list of rune activity for a transaction.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/transactions/{tx_id}/activity', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/runes/activities/for-transaction"},"476":{"id":"/docs/bitcoin/api/runes/activities/for-address","title":"Get activity for an address","description":"Retrieves all Rune activity for a Bitcoin address.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/activity/{address}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/runes/activities/for-address"},"477":{"id":"/docs/bitcoin/api/runes/activities/for-block","title":"Get activity for a block","description":"Retrieves a paginated list of rune activity for a block.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/blocks/{block}/activity', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/runes/activities/for-block"},"478":{"id":"/docs/bitcoin/api/runes/activities/activity","title":"Get all activity","description":"Retrieves all activity for a Rune.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/activity', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/runes/activities/activity"},"479":{"id":"/docs/bitcoin/api/runes/etchings","title":"Etchings","description":"Retrieves information about Rune etchings.","content":"","url":"/docs/bitcoin/api/runes/etchings"},"480":{"id":"/docs/bitcoin/api/runes/etchings/get-etchings","title":"Get etchings","description":"Retrieves a paginated list of rune etchings.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/runes/etchings/get-etchings"},"481":{"id":"/docs/bitcoin/api/runes/etchings/get-etching","title":"Get etching","description":"Retrieves information for a Rune etching.","content":"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/runes/etchings/get-etching"},"482":{"id":"/docs/bitcoin/api/ordinals/statistics","title":"Statistics","description":"Retrieves stats on the number of inscriptions per block.","content":"","url":"/docs/bitcoin/api/ordinals/statistics"},"483":{"id":"/docs/bitcoin/api/ordinals/statistics/get-stats-inscription-count","title":"Get inscription count per block","description":"Retrieves statistics on the number of inscriptions revealed per block.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/stats/inscriptions', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/ordinals/statistics/get-stats-inscription-count"},"484":{"id":"/docs/bitcoin/api/ordinals/brc20/get-brc20-token-holders","title":"Get BRC-20 token holders","description":"Retrieves a list of holders and their balances for a particular BRC-20 token.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens/{ticker}/holders', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/ordinals/brc20/get-brc20-token-holders"},"485":{"id":"/docs/bitcoin/api/ordinals/brc20","title":"BRC-20","description":"Retrieves information about BRC-20 tokens.","content":"","url":"/docs/bitcoin/api/ordinals/brc20"},"486":{"id":"/docs/bitcoin/api/ordinals/brc20/get-brc20-balances","title":"Get BRC-20 balances","description":"Retrieves BRC-20 token balances for a Bitcoin address.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/balances/{address}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/ordinals/brc20/get-brc20-balances"},"487":{"id":"/docs/bitcoin/api/ordinals/brc20/get-brc20-token-details","title":"Get BRC-20 token details","description":"Retrieves information for a BRC-20 token, including supply and holders.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens/{ticker}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/ordinals/brc20/get-brc20-token-details"},"488":{"id":"/docs/bitcoin/api/ordinals/brc20/get-brc20-tokens","title":"Get BRC-20 tokens","description":"Retrieves information for BRC-20 tokens.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/ordinals/brc20/get-brc20-tokens"},"489":{"id":"/docs/bitcoin/api/ordinals/brc20/get-brc20-activity","title":"Get BRC-20 activity","description":"Retrieves BRC-20 activity filtered by ticker, address, operation, or block height.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/activity', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/bitcoin/api/ordinals/brc20/get-brc20-activity"},"490":{"id":"/docs/bitcoin/api/ordinals/inscriptions","title":"Inscriptions","description":"Retrieves information about Ordinals inscriptions.","content":"","url":"/docs/bitcoin/api/ordinals/inscriptions"},"491":{"id":"/docs/bitcoin/api/ordinals/inscriptions/get-inscription-transfers","title":"Get inscription transfers","description":"Retrieves all transfers for a single inscription.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}/transfers', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/ordinals/inscriptions/get-inscription-transfers"},"492":{"id":"/docs/bitcoin/api/ordinals/inscriptions/get-inscriptions","title":"Get inscriptions","description":"Retrieves a list of inscriptions with options to filter and sort results.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/ordinals/inscriptions/get-inscriptions"},"493":{"id":"/docs/bitcoin/api/ordinals/inscriptions/get-inscription-content","title":"Get inscription content","description":"Retrieves the content of a single inscription.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}/content', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/ordinals/inscriptions/get-inscription-content"},"494":{"id":"/docs/bitcoin/api/ordinals/inscriptions/get-transfers-per-block","title":"Get transfers per block","description":"Retrieves a list of inscription transfers that ocurred at a specific Bitcoin block.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/transfers', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/ordinals/inscriptions/get-transfers-per-block"},"495":{"id":"/docs/bitcoin/api/ordinals/inscriptions/get-inscription","title":"Get inscription","description":"Retrieves a single inscription.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/ordinals/inscriptions/get-inscription"},"496":{"id":"/docs/bitcoin/api/ordinals/info","title":"Status","description":"Retrieves information about the Ordinals API status, including the server version.","content":"","url":"/docs/bitcoin/api/ordinals/info"},"497":{"id":"/docs/bitcoin/api/ordinals/info/status","title":"Get API status","description":"Retrieves the running status of the Ordinals API.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/ordinals/info/status"},"498":{"id":"/docs/bitcoin/api/ordinals/satoshis","title":"Satoshis","description":"Retrieves ordinal information for satoshis.","content":"","url":"/docs/bitcoin/api/ordinals/satoshis"},"499":{"id":"/docs/bitcoin/api/ordinals/satoshis/get-satoshi","title":"Get satoshi ordinal","description":"Retrieves ordinal information for a single satoshi.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/sats/{ordinal}', method: 'get' }]}\n hasHead={false}\n/>","url":"/docs/bitcoin/api/ordinals/satoshis/get-satoshi"},"500":{"id":"/docs/bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions","title":"Get satoshi inscriptions","description":"Retrieves all inscriptions associated with a single satoshi.","content":"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/sats/{ordinal}/inscriptions', method: 'get' }]}\n hasHead={false}\n/>\n","url":"/docs/bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions"},"501":{"id":"/docs/bitcoin/api","title":"APIs","description":"The following guides cover ways to use Hiro tools to build apps on Stacks.","content":"\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n","url":"/docs/bitcoin/api"},"502":{"id":"/docs/bitcoin/indexer","title":"Overview","description":"The Bitcoin Indexer enables you to build ordinals event streams, so you can create accurate, lightweight databases that gracefully handle Bitcoin forks and reorgs.","content":"\nimport { SecondaryCard } from '@/components/card';\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\n\nThe Bitcoin Indexer is a reorg-aware indexer that automatically handles chain forks, so you don't need to waste time or resources reindexing your database yourself.\n\nYou can customize what ordinals data you index in order to create lightweight databases for faster query responses and a better user experience.\n\n## Installation\n\n```terminal\n$ git clone https://github.com/hirosystems/bitcoin-indexer.git\n$ cd bitcoin-indexer\n$ cargo bitcoin-indexer-install\n```\n\nAlternatively, you can use Docker images from [Docker Hub](https://hub.docker.com/r/hirosystems/bitcoin-indexer).\n\n## Get started\n\n<Cards>\n <SecondaryCard\n href=\"/bitcoin/indexer/quickstart\"\n title=\"Quickstart\"\n description=\"Learn how to scan for Bitcoin activity using the Bitcoin Indexer.\"\n />\n</Cards>\n\n## System Requirements\n\nBefore running the indexer, ensure your system meets these requirements:\n\n- **CPU**: Multi-core support for parallel processing\n- **Memory**: Minimum 16GB RAM\n- **Storage**: SSD or NVMe recommended\n- **OS**: Support for 4096+ open file descriptors\n- **Postgres**: Version 17+ recommended\n\n## Related tools\n\n- **[Ordinals API](/bitcoin/ordinals/api)**: Skip the infrastructure setup and get the ordinals data you need from our Ordinals API, which is powered by the Bitcoin Indexer.\n- **[Ordinals Explorer](https://ordinals.hiro.so/)**: Explore ordinals inscriptions and BRC-20 tokens rapidly in our Ordinals Explorer.\n\n<br />\n\n<Callout title=\"Need help building with the Bitcoin Indexer?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#indexer</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n","url":"/docs/bitcoin/indexer"},"503":{"id":"/docs/bitcoin/indexer/guides/run-indexer","title":"TBD","description":"TBD","content":"\n","url":"/docs/bitcoin/indexer/guides/run-indexer"},"504":{"id":"/docs/bitcoin/indexer/quickstart","title":"Quickstart","description":"Learn how to scan the Bitcoin blockchain for Ordinals activity.","content":"\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\n\nIn this quickstart guide, you will set up the Bitcoin Indexer to index Ordinals or Runes activity on the Bitcoin blockchain.\n\n<Steps>\n <Step title=\"Install Bitcoin Indexer\">\n Clone the repository and install the indexer:\n ```terminal\n $ git clone https://github.com/hirosystems/bitcoin-indexer.git\n $ cd bitcoin-indexer\n $ cargo bitcoin-indexer-install\n ```\n </Step>\n\n <Step title=\"Configure the Indexer\">\n Generate a new configuration file:\n ```terminal\n $ bitcoin-indexer config new\n ```\n \n Configure your Postgres database in the generated TOML file:\n ```toml\n [ordinals.db]\n database = \"metaprotocols\"\n host = \"localhost\"\n port = 5432\n username = \"postgres\"\n password = \"postgres\"\n ```\n </Step>\n\n <Step title=\"Start the Indexer\">\n Run the following command to start indexing Ordinals activity:\n ```terminal\n $ bitcoin-indexer ordinals service start --config-path <path>\n ```\n \n For Runes indexing, use:\n ```terminal\n $ bitcoin-indexer runes service start --config-path <path>\n ```\n </Step>\n</Steps>\n\n<Callout type=\"info\">\n A fully synced Bitcoin node is required for indexing to start.\n</Callout>\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/ordinals/explorer\"\n title=\"Ordinals Explorer\"\n description=\"Explore the Ordinals Explorer to view inscriptions and transfers.\"\n />\n <Card\n href=\"/bitcoin/ordinals/api\"\n title=\"Ordinals API\"\n description=\"Learn how to interact with Ordinals data using our API.\"\n />\n <Card\n href=\"/bitcoin/runes/api\" \n title=\"Runes API\"\n description=\"Explore our Runes blockchain API documentation.\"\n />\n</Cards>","url":"/docs/bitcoin/indexer/quickstart"},"505":{"id":"/docs/bitcoin/quickstarts","title":"Quickstarts","description":"The following guides cover ways to use Hiro tools to build apps on Stacks.","content":"\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/quickstart\"\n title=\"Create your first smart contract\"\n description=\"Build a simple counter contract using Clarinet.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Blockchain />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write unit tests for your smart contracts\"\n description=\"Learn how run unit tests with Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/stacks.js/quickstart\"\n title=\"Make a contract call with Stacks.js\"\n description=\"Learn how to integrate smart contracts into your app.\"\n tag='Stacks.js'\n />\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n","url":"/docs/bitcoin/quickstarts"},"506":{"id":"/docs/guides/contributors-guide","title":"Contributors guide","description":"Learn how to contribute to Hiro's documentation and content.","content":"\nimport ContributorsGuideContent from '@/content/_shared/contributors-guide.mdx';\n\n<ContributorsGuideContent components={props.components} />\n","url":"/docs/guides/contributors-guide"},"507":{"id":"/docs/guides/rate-limiting","title":"Rate limiting","description":"Understand the rate limits for Hiro APIs and the STX Faucet.","content":"\nimport RateLimitingContent from '@/content/_shared/rate-limiting.mdx';\n\n<RateLimitingContent components={props.components} />\n","url":"/docs/guides/rate-limiting"},"508":{"id":"/docs/guides","title":"Home","description":"","content":"\nimport Link from \"fumadocs-core/link\";\nimport { ImageZoom } from 'fumadocs-ui/components/image-zoom';\nimport { SecondaryCard } from \"@/components/card\"\nimport guidesImage from '@/public/guides.svg';\nimport data from '@/lib/all-guides.json';\n\n<div className='flex flex-col space-y-10'>\n <div className='flex space-x-6 items-end'>\n <ImageZoom\n alt=\"banner\"\n src={guidesImage}\n className=\"mt-0 mb-6 first-line:rounded-xl bg-background\"\n priority\n />\n </div>\n\n <Cards>\n {data.guides.map(guide => {\n return (\n <SecondaryCard\n key={guide.title}\n href={guide.href}\n title={guide.title}\n description={guide.description}\n />\n )\n })}\n </Cards>\n</div>","url":"/docs/guides"},"509":{"id":"/docs/guides/sync-a-stacks-node","title":"How to sync a Stacks node","description":"Learn how to sync a Stacks node for running a local devnet or mainnet.","content":"\nimport { Code, Terminal } from 'lucide-react';\nimport { SmallCard } from '@/components/card';\nimport { InlineCode } from '@/components/inline-code';\n\nRunning a Stacks node is crucial for developers aiming to interact directly with the Stacks blockchain. It allows for the verification of transactions, ensures decentralized operations, and enhances blockchain security.\n\nIn this guide, you will learn how to:\n\n1. [Clone the Stacks blockchain Docker repository](#clone-the-stacks-blockchain-docker-repository).\n2. [Start the service](#start-the-service).\n3. [Monitor the node's synchronization process](#monitor-the-nodes-synchronization-process).\n\n---\n\n## Clone the Stacks blockchain Docker repository\n\nClone the Stacks blockchain Docker repository from GitHub:\n\n```terminal\n$ git clone https://github.com/blockstack/stacks-blockchain-docker.git\n$ cd stacks-blockchain-docker\n```\n\n## Start the service\n\nInside of the `stacks-blockchain-docker` directory, run the following command to start the Stacks node:\n\n```terminal\n$ ./manage.sh -n <network> -a start\n```\n\nThe `<network>` placeholder used below can be replaced with one of:\n\n- `mainnet`\n- `testnet`\n- `mocknet`\n\n## Monitor the node's synchronization process\n\nTo follow the logs for the Stacks node, run the following command:\n\n```terminal\n$ ./manage.sh -n <network> -a logs\n```\n\nFor networks other than `mocknet`, downloading the initial headers can take several minutes. Until the headers are downloaded, the `/v2/info` endpoints won't return any data.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/chainhook-as-a-service\"\n title=\"Run Chainhook as a service\"\n description=\"Learn how to use Chainhook to build your own custom API.\"\n />\n <Card\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Learn how to sync a Bitcoin node for running Chainhook as a service.\"\n />\n</Cards>\n","url":"/docs/guides/sync-a-stacks-node"},"510":{"id":"/docs/guides/installing-docker","title":"How to install Docker","description":"Install Docker to run a local devnet.","content":"\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\n<Tabs id=\"docker\" items={['macOS', 'Windows']}>\n <Tab value=\"macOS\">\n 1. Go to the [Docker Desktop for Mac](https://www.docker.com/products/docker-desktop/) page.\n 2. Download the .dmg file.\n 3. Open the downloaded .dmg file.\n 4. Drag the Docker icon to the Applications folder.\n 5. Open Docker from the Applications folder.\n 6. Grant the necessary permissions if prompted.\n 7. Docker Desktop icon will appear in the menu bar indicating that Docker is running.\n \n To verify installation, run `docker --version` in your terminal. You should see the Docker version information.\n </Tab>\n \n <Tab value=\"Windows\">\n 1. Go to the [Docker Desktop for Windows](https://www.docker.com/products/docker-desktop/) page.\n 2. Download the executable.\n 3. Run the downloaded executable.\n 4. Follow the installation wizard steps (you may need to restart your computer).\n 5. Ensure the WSL 2 (Windows Subsystem for Linux) backend is checked during installation, if applicable.\n 6. Open Docker Desktop from the Start menu.\n 7. Grant the necessary permissions if prompted.\n 8. Docker icon will appear in the system tray indicating Docker is running.\n\n To verify installation, run `docker --version` in your terminal. You should see the Docker version information.\n \n <Callout title=\"Windows installation\">\n You might need to install additional Windows components like Hyper-V or WSL 2.\n </Callout>\n </Tab>\n</Tabs>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Learn how to sync a Bitcoin node for running Chainhook as a service.\"\n />\n <Card\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Learn how to sync a Stacks node for running a local devnet.\"\n />\n</Cards>","url":"/docs/guides/installing-docker"},"511":{"id":"/docs/guides/build-a-decentralized-kickstarter","title":"Build a decentralized Kickstarter","description":"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.","content":"\nimport { Code, Terminal } from 'lucide-react';\nimport { SmallCard } from '@/components/card';\n\nIn this guide, you will learn how to create an NFT marketplace that allows users to list NFTs for sale. Users can specify the following details for their listings:\n- The NFT token to sell.\n- Listing expiry in block height.\n- The payment asset, either STX or a SIP010 fungible token.\n- The NFT price in the chosen payment asset.\n- An optional intended taker. If set, only that principal will be able to fulfil the listing.\n\nThis marketplace leverages the following Clarity traits:\n- `nft-trait` for handling NFTs.\n- `ft-trait` for handling fungible tokens.\n\nOver the course of this guide, you will learn how to:\n1. Define and handle errors.\n2. Create and manage NFT listings.\n3. Whitelist asset contracts.\n4. Fulfil NFT purchases.\n\n---\n\n## Define and handle errors\n\nFirst, define constants for various errors that may occur during listing, cancelling, or fulfilling NFT transactions. This helps in maintaining clean and readable code.\n\n```clarity\n;; Define listing errors\n(define-constant ERR_EXPIRY_IN_PAST (err u1000))\n(define-constant ERR_PRICE_ZERO (err u1001))\n\n;; Define cancelling and fulfilling errors\n(define-constant ERR_UNKNOWN_LISTING (err u2000))\n(define-constant ERR_UNAUTHORISED (err u2001))\n(define-constant ERR_LISTING_EXPIRED (err u2002))\n(define-constant ERR_NFT_ASSET_MISMATCH (err u2003))\n(define-constant ERR_PAYMENT_ASSET_MISMATCH (err u2004))\n(define-constant ERR_MAKER_TAKER_EQUAL (err u2005))\n(define-constant ERR_UNINTENDED_TAKER (err u2006))\n(define-constant ERR_ASSET_CONTRACT_NOT_WHITELISTED (err u2007))\n(define-constant ERR_PAYMENT_CONTRACT_NOT_WHITELISTED (err u2008))\n```\n\n## Create and manage NFT listings\n\n### Define data structures\n\nCreate a map data structure for the asset listings and a data variable for unique IDs.\n\n```clarity\n;; Define a map data structure for the asset listings\n(define-map listings\n uint\n {\n maker: principal,\n taker: (optional principal),\n token-id: uint,\n nft-asset-contract: principal,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n }\n)\n\n;; Used for unique IDs for each listing\n(define-data-var listing-nonce uint u0)\n```\n\n### List an asset\n\nCreate a public function to list an asset along with its contract. This function verifies the contract, checks expiry and price, and transfers the NFT ownership to the marketplace.\n\n```clarity\n(define-public (list-asset\n (nft-asset-contract <nft-trait>)\n (nft-asset {\n taker: (optional principal),\n token-id: uint,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n })\n)\n (let ((listing-id (var-get listing-nonce)))\n ;; Verify that the contract of this asset is whitelisted\n (asserts! (is-whitelisted (contract-of nft-asset-contract)) ERR_ASSET_CONTRACT_NOT_WHITELISTED)\n ;; Verify that the asset is not expired\n (asserts! (> (get expiry nft-asset) block-height) ERR_EXPIRY_IN_PAST)\n ;; Verify that the asset price is greater than zero\n (asserts! (> (get price nft-asset) u0) ERR_PRICE_ZERO)\n ;; Verify that the contract of the payment is whitelisted\n (asserts! (match (get payment-asset-contract nft-asset)\n payment-asset\n (is-whitelisted payment-asset)\n true\n ) ERR_PAYMENT_CONTRACT_NOT_WHITELISTED)\n ;; Transfer the NFT ownership to this contract's principal\n (try! (transfer-nft\n nft-asset-contract\n (get token-id nft-asset)\n tx-sender\n (as-contract tx-sender)\n ))\n ;; List the NFT in the listings map\n (map-set listings listing-id (merge\n { maker: tx-sender, nft-asset-contract: (contract-of nft-asset-contract) }\n nft-asset\n ))\n ;; Increment the nonce to use for the next unique listing ID\n (var-set listing-nonce (+ listing-id u1))\n ;; Return the created listing ID\n (ok listing-id)\n )\n)\n```\n\n### Retrieve an asset\n\nCreate a read-only function to retrieve an asset, or listing, by its ID.\n\n```clarity\n(define-read-only (get-listing (listing-id uint))\n (map-get? listings listing-id)\n)\n```\n\n### Cancel a listing\n\nCreate a public function to cancel a listing. Only the NFT's creator can cancel the listing, and it must use the same asset contract that the NFT uses.\n\n```clarity\n(define-public (cancel-listing (listing-id uint) (nft-asset-contract <nft-trait>))\n (let (\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n (maker (get maker listing))\n )\n ;; Verify that the caller of the function is the creator of the NFT to be cancelled\n (asserts! (is-eq maker tx-sender) ERR_UNAUTHORISED)\n ;; Verify that the asset contract to use is the same one that the NFT uses\n (asserts! (is-eq\n (get nft-asset-contract listing)\n (contract-of nft-asset-contract)\n ) ERR_NFT_ASSET_MISMATCH)\n ;; Delete the listing\n (map-delete listings listing-id)\n ;; Transfer the NFT from this contract's principal back to the creator's principal\n (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender maker))\n )\n)\n```\n\n## Whitelist asset contracts\n\n### Whitelist contracts\n\nThe marketplace requires any contracts used for assets or payments to be whitelisted by the contract owner. Create a map to store whitelisted asset contracts and a function to check if a contract is whitelisted.\n\n```clarity\n(define-map whitelisted-asset-contracts principal bool)\n\n(define-read-only (is-whitelisted (asset-contract principal))\n (default-to false (map-get? whitelisted-asset-contracts asset-contract))\n)\n```\n\n### Set whitelisted contracts\n\nOnly the contract owner can whitelist an asset contract. Create a public function to set whitelisted asset contracts.\n\n```clarity\n(define-public (set-whitelisted (asset-contract principal) (whitelisted bool))\n (begin\n (asserts! (is-eq contract-owner tx-sender) ERR_UNAUTHORISED)\n (ok (map-set whitelisted-asset-contracts asset-contract whitelisted))\n )\n)\n```\n\n## Fulfill NFT purchases\n\n### Fulfill listing with STX\n\nCreate a public function to purchase a listing using STX as payment.\n\n```clarity\n(define-public (fulfil-listing-stx (listing-id uint) (nft-asset-contract <nft-trait>))\n (let (\n ;; Verify the given listing ID exists\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n ;; Set the NFT's taker to the purchaser (caller of the function)\n (taker tx-sender)\n )\n ;; Validate that the purchase can be fulfilled\n (try! (assert-can-fulfil (contract-of nft-asset-contract) none listing))\n ;; Transfer the NFT to the purchaser (caller of the function)\n (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))\n ;; Transfer the STX payment from the purchaser to the creator of the NFT\n (try! (stx-transfer? (get price listing) taker (get maker listing)))\n ;; Remove the NFT from the marketplace listings\n (map-delete listings listing-id)\n ;; Return the listing ID that was just purchased\n (ok listing-id)\n )\n)\n```\n\n### Fulfill listing with SIP-010\n\nCreate a public function to purchase a listing using another fungible token that follows the SIP-010 standard as payment.\n\n```clarity\n(define-public (fulfil-listing-ft\n (listing-id uint)\n (nft-asset-contract <nft-trait>)\n (payment-asset-contract <ft-trait>)\n)\n (let (\n ;; Verify the given listing ID exists\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n ;; Set the NFT's taker to the purchaser (caller of the function)\n (taker tx-sender)\n )\n ;; Validate that the purchase can be fulfilled\n (try! (assert-can-fulfil\n (contract-of nft-asset-contract)\n (some (contract-of payment-asset-contract))\n listing\n ))\n ;; Transfer the NFT to the purchaser (caller of the function)\n (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))\n ;; Transfer the tokens as payment from the purchaser to the creator of the NFT\n (try! (transfer-ft payment-asset-contract (get price listing) taker (get maker listing)))\n ;; Remove the NFT from the marketplace listings\n (map-delete listings listing-id)\n ;; Return the listing ID that was just purchased\n (ok listing-id)\n )\n)\n```\n\n### Validate purchase can be fulfilled\n\nCreate a private function to validate that a purchase can be fulfilled. This function checks the listing's expiry, the NFT's contract, and the payment's contract.\n\n```clarity\n(define-private (assert-can-fulfil\n (nft-asset-contract principal)\n (payment-asset-contract (optional principal))\n (listing {\n maker: principal,\n taker: (optional principal),\n token-id: uint,\n nft-asset-contract: principal,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n })\n)\n (begin\n ;; Verify that the buyer is not the same as the NFT creator\n (asserts! (not (is-eq (get maker listing) tx-sender)) ERR_MAKER_TAKER_EQUAL)\n ;; Verify the buyer has been set in the listing metadata as its `taker`\n (asserts!\n (match (get taker listing) intended-taker (is-eq intended-taker tx-sender) true)\n ERR_UNINTENDED_TAKER\n )\n ;; Verify the listing for purchase is not expired\n (asserts! (< block-height (get expiry listing)) ERR_LISTING_EXPIRED)\n ;; Verify the asset contract used to purchase the NFT is the same as the one set on the NFT\n (asserts! (is-eq (get nft-asset-contract listing) nft-asset-contract) ERR_NFT_ASSET_MISMATCH)\n ;; Verify the payment contract used to purchase the NFT is the same as the one set on the NFT\n (asserts!\n (is-eq (get payment-asset-contract listing) payment-asset-contract)\n ERR_PAYMENT_ASSET_MISMATCH\n )\n (ok true)\n )\n)\n```\n\nBy following this guide, you have created a basic NFT marketplace that allows users to list, buy, and sell NFTs using either STX or fungible tokens. This implementation includes essential functionalities such as whitelisting contracts, validating transactions, and handling errors.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/authenticate-users\"\n title=\"Authenticate users\"\n description=\"Learn how to authenticate users using the Connect package in Stacks.js.\"\n />\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n</Cards>","url":"/docs/guides/build-a-decentralized-kickstarter"},"512":{"id":"/docs/guides/api-keys","title":"API keys","description":"For developers who need API requests beyond the standard rate limits.","content":"\nimport ApiKeysContent from '@/content/_shared/api-keys.mdx';\n\n<ApiKeysContent components={props.components} />\n","url":"/docs/guides/api-keys"},"513":{"id":"/docs/guides/build-an-nft-marketplace","title":"Build an NFT marketplace","description":"Learn how to create an NFT marketplace that allows users to list NFTs for sale and purchase them using Clarity.","content":"\nimport { Code, Terminal } from 'lucide-react';\nimport { SmallCard } from '@/components/card';\n\nIn this guide, you will learn how to create an NFT marketplace that allows users to list NFTs for sale. Users can specify the following details for their listings:\n- The NFT token to sell.\n- Listing expiry in block height.\n- The payment asset, either STX or a SIP010 fungible token.\n- The NFT price in the chosen payment asset.\n- An optional intended taker. If set, only that principal will be able to fulfil the listing.\n\nThis marketplace leverages the following Clarity traits:\n- `nft-trait` for handling NFTs.\n- `ft-trait` for handling fungible tokens.\n\nOver the course of this guide, you will learn how to:\n1. Define and handle errors.\n2. Create and manage NFT listings.\n3. Whitelist asset contracts.\n4. Fulfil NFT purchases.\n\n---\n\n## Define and handle errors\n\nFirst, define constants for various errors that may occur during listing, cancelling, or fulfilling NFT transactions. This helps in maintaining clean and readable code.\n\n```clarity\n;; Define listing errors\n(define-constant ERR_EXPIRY_IN_PAST (err u1000))\n(define-constant ERR_PRICE_ZERO (err u1001))\n\n;; Define cancelling and fulfilling errors\n(define-constant ERR_UNKNOWN_LISTING (err u2000))\n(define-constant ERR_UNAUTHORISED (err u2001))\n(define-constant ERR_LISTING_EXPIRED (err u2002))\n(define-constant ERR_NFT_ASSET_MISMATCH (err u2003))\n(define-constant ERR_PAYMENT_ASSET_MISMATCH (err u2004))\n(define-constant ERR_MAKER_TAKER_EQUAL (err u2005))\n(define-constant ERR_UNINTENDED_TAKER (err u2006))\n(define-constant ERR_ASSET_CONTRACT_NOT_WHITELISTED (err u2007))\n(define-constant ERR_PAYMENT_CONTRACT_NOT_WHITELISTED (err u2008))\n```\n\n## Create and manage NFT listings\n\n### Define data structures\n\nCreate a map data structure for the asset listings and a data variable for unique IDs.\n\n```clarity\n;; Define a map data structure for the asset listings\n(define-map listings\n uint\n {\n maker: principal,\n taker: (optional principal),\n token-id: uint,\n nft-asset-contract: principal,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n }\n)\n\n;; Used for unique IDs for each listing\n(define-data-var listing-nonce uint u0)\n```\n\n### List an asset\n\nCreate a public function to list an asset along with its contract. This function verifies the contract, checks expiry and price, and transfers the NFT ownership to the marketplace.\n\n```clarity\n(define-public (list-asset\n (nft-asset-contract <nft-trait>)\n (nft-asset {\n taker: (optional principal),\n token-id: uint,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n })\n)\n (let ((listing-id (var-get listing-nonce)))\n ;; Verify that the contract of this asset is whitelisted\n (asserts! (is-whitelisted (contract-of nft-asset-contract)) ERR_ASSET_CONTRACT_NOT_WHITELISTED)\n ;; Verify that the asset is not expired\n (asserts! (> (get expiry nft-asset) block-height) ERR_EXPIRY_IN_PAST)\n ;; Verify that the asset price is greater than zero\n (asserts! (> (get price nft-asset) u0) ERR_PRICE_ZERO)\n ;; Verify that the contract of the payment is whitelisted\n (asserts! (match (get payment-asset-contract nft-asset)\n payment-asset\n (is-whitelisted payment-asset)\n true\n ) ERR_PAYMENT_CONTRACT_NOT_WHITELISTED)\n ;; Transfer the NFT ownership to this contract's principal\n (try! (transfer-nft\n nft-asset-contract\n (get token-id nft-asset)\n tx-sender\n (as-contract tx-sender)\n ))\n ;; List the NFT in the listings map\n (map-set listings listing-id (merge\n { maker: tx-sender, nft-asset-contract: (contract-of nft-asset-contract) }\n nft-asset\n ))\n ;; Increment the nonce to use for the next unique listing ID\n (var-set listing-nonce (+ listing-id u1))\n ;; Return the created listing ID\n (ok listing-id)\n )\n)\n```\n\n### Retrieve an asset\n\nCreate a read-only function to retrieve an asset, or listing, by its ID.\n\n```clarity\n(define-read-only (get-listing (listing-id uint))\n (map-get? listings listing-id)\n)\n```\n\n### Cancel a listing\n\nCreate a public function to cancel a listing. Only the NFT's creator can cancel the listing, and it must use the same asset contract that the NFT uses.\n\n```clarity\n(define-public (cancel-listing (listing-id uint) (nft-asset-contract <nft-trait>))\n (let (\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n (maker (get maker listing))\n )\n ;; Verify that the caller of the function is the creator of the NFT to be cancelled\n (asserts! (is-eq maker tx-sender) ERR_UNAUTHORISED)\n ;; Verify that the asset contract to use is the same one that the NFT uses\n (asserts! (is-eq\n (get nft-asset-contract listing)\n (contract-of nft-asset-contract)\n ) ERR_NFT_ASSET_MISMATCH)\n ;; Delete the listing\n (map-delete listings listing-id)\n ;; Transfer the NFT from this contract's principal back to the creator's principal\n (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender maker))\n )\n)\n```\n\n## Whitelist asset contracts\n\n### Whitelist contracts\n\nThe marketplace requires any contracts used for assets or payments to be whitelisted by the contract owner. Create a map to store whitelisted asset contracts and a function to check if a contract is whitelisted.\n\n```clarity\n(define-map whitelisted-asset-contracts principal bool)\n\n(define-read-only (is-whitelisted (asset-contract principal))\n (default-to false (map-get? whitelisted-asset-contracts asset-contract))\n)\n```\n\n### Set whitelisted contracts\n\nOnly the contract owner can whitelist an asset contract. Create a public function to set whitelisted asset contracts.\n\n```clarity\n(define-public (set-whitelisted (asset-contract principal) (whitelisted bool))\n (begin\n (asserts! (is-eq contract-owner tx-sender) ERR_UNAUTHORISED)\n (ok (map-set whitelisted-asset-contracts asset-contract whitelisted))\n )\n)\n```\n\n## Fulfill NFT purchases\n\n### Fulfill listing with STX\n\nCreate a public function to purchase a listing using STX as payment.\n\n```clarity\n(define-public (fulfil-listing-stx (listing-id uint) (nft-asset-contract <nft-trait>))\n (let (\n ;; Verify the given listing ID exists\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n ;; Set the NFT's taker to the purchaser (caller of the function)\n (taker tx-sender)\n )\n ;; Validate that the purchase can be fulfilled\n (try! (assert-can-fulfil (contract-of nft-asset-contract) none listing))\n ;; Transfer the NFT to the purchaser (caller of the function)\n (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))\n ;; Transfer the STX payment from the purchaser to the creator of the NFT\n (try! (stx-transfer? (get price listing) taker (get maker listing)))\n ;; Remove the NFT from the marketplace listings\n (map-delete listings listing-id)\n ;; Return the listing ID that was just purchased\n (ok listing-id)\n )\n)\n```\n\n### Fulfill listing with SIP-010\n\nCreate a public function to purchase a listing using another fungible token that follows the SIP-010 standard as payment.\n\n```clarity\n(define-public (fulfil-listing-ft\n (listing-id uint)\n (nft-asset-contract <nft-trait>)\n (payment-asset-contract <ft-trait>)\n)\n (let (\n ;; Verify the given listing ID exists\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n ;; Set the NFT's taker to the purchaser (caller of the function)\n (taker tx-sender)\n )\n ;; Validate that the purchase can be fulfilled\n (try! (assert-can-fulfil\n (contract-of nft-asset-contract)\n (some (contract-of payment-asset-contract))\n listing\n ))\n ;; Transfer the NFT to the purchaser (caller of the function)\n (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))\n ;; Transfer the tokens as payment from the purchaser to the creator of the NFT\n (try! (transfer-ft payment-asset-contract (get price listing) taker (get maker listing)))\n ;; Remove the NFT from the marketplace listings\n (map-delete listings listing-id)\n ;; Return the listing ID that was just purchased\n (ok listing-id)\n )\n)\n```\n\n### Validate purchase can be fulfilled\n\nCreate a private function to validate that a purchase can be fulfilled. This function checks the listing's expiry, the NFT's contract, and the payment's contract.\n\n```clarity\n(define-private (assert-can-fulfil\n (nft-asset-contract principal)\n (payment-asset-contract (optional principal))\n (listing {\n maker: principal,\n taker: (optional principal),\n token-id: uint,\n nft-asset-contract: principal,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n })\n)\n (begin\n ;; Verify that the buyer is not the same as the NFT creator\n (asserts! (not (is-eq (get maker listing) tx-sender)) ERR_MAKER_TAKER_EQUAL)\n ;; Verify the buyer has been set in the listing metadata as its `taker`\n (asserts!\n (match (get taker listing) intended-taker (is-eq intended-taker tx-sender) true)\n ERR_UNINTENDED_TAKER\n )\n ;; Verify the listing for purchase is not expired\n (asserts! (< block-height (get expiry listing)) ERR_LISTING_EXPIRED)\n ;; Verify the asset contract used to purchase the NFT is the same as the one set on the NFT\n (asserts! (is-eq (get nft-asset-contract listing) nft-asset-contract) ERR_NFT_ASSET_MISMATCH)\n ;; Verify the payment contract used to purchase the NFT is the same as the one set on the NFT\n (asserts!\n (is-eq (get payment-asset-contract listing) payment-asset-contract)\n ERR_PAYMENT_ASSET_MISMATCH\n )\n (ok true)\n )\n)\n```\n\nBy following this guide, you have created a basic NFT marketplace that allows users to list, buy, and sell NFTs using either STX or fungible tokens. This implementation includes essential functionalities such as whitelisting contracts, validating transactions, and handling errors.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/authenticate-users\"\n title=\"Authenticate users\"\n description=\"Learn how to authenticate users using the Connect package in Stacks.js.\"\n />\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n</Cards>","url":"/docs/guides/build-an-nft-marketplace"},"514":{"id":"/docs/guides/using-clarity-values","title":"Using Clarity values","description":"Learn how to use Clarity values in your Clarity smart contracts.","content":"\nSome endpoints, like the [read-only function contract call](https://docs.hiro.so/api#operation/call_read_only_function), require input to a serialized [Clarity value](https://docs.stacks.co/docs/clarity/). Other endpoints return serialized values that need to be deserialized.\n\nThe example shown below illustrates Clarity value usage in combination with the API.\n\nThe `@stacks/transactions` library supports typed contract calls and makes [response value utilization much simpler](https://docs.stacks.co/docs/clarity/).\n\n```ts\nimport {\n Configuration,\n SmartContractsApiInterface,\n SmartContractsApi,\n ReadOnlyFunctionSuccessResponse,\n} from '@stacks/blockchain-api-client';\nimport { uintCV, UIntCV, cvToHex, hexToCV, ClarityType } from '@stacks/transactions';\n\n(async () => {\n const apiConfig: Configuration = new Configuration({\n fetchApi: fetch,\n // for mainnet, replace `testnet` with `mainnet`\n basePath: 'https://api.testnet.hiro.so', // defaults to http://localhost:3999\n });\n\n const contractsApi: SmartContractsApiInterface = new SmartContractsApi(apiConfig);\n\n const principal: string = 'ST000000000000000000002AMW42H';\n\n // use most recent from: https://api.<mainnet/testnet>.hiro.so/v2/pox\n const rewardCycle: UIntCV = uintCV(22);\n\n // call a read-only function\n const fnCall: ReadOnlyFunctionSuccessResponse = await contractsApi.callReadOnlyFunction({\n contractAddress: principal,\n contractName: 'pox',\n functionName: 'is-pox-active',\n readOnlyFunctionArgs: {\n sender: principal,\n arguments: [cvToHex(rewardCycle)],\n },\n });\n\n console.log({\n status: fnCall.okay,\n result: fnCall.result,\n representation: hexToCV(fnCall.result).type === ClarityType.BoolTrue,\n });\n})().catch(console.error);\n```","url":"/docs/guides/using-clarity-values"},"515":{"id":"/docs/guides/sync-a-bitcoin-node","title":"How to sync a Bitcoin node","description":"Learn how to sync a Bitcoin node for building Bitcoin applications.","content":"\nimport { InlineCode } from '@/components/inline-code';\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nSyncing a Bitcoin node is often one of the first steps a developer takes when building a Bitcoin application. It's a great introduction to the Bitcoin developer ecosystem, and if you're relying on on-chain data, there's no safer way to get that data than doing it yourself.\n\nIn this guide, you will learn how to:\n\n1. Download Bitcoin Core daemon on your machine\n2. Configure `bitcoind`\n3. Start syncing your node\n4. Properly shutdown and restart your node\n\n<Callout title=\"Requirements\" type=\"warn\">\nTo get started, we first need to download `bitcoind`. In our example, we'll be using version 25.0. You can select a software version compatible with your device [from this list](https://bitcoincore.org/bin/bitcoin-core-25.0). \n</Callout>\n\n---\n\n## Configure <InlineCode>bitcoind</InlineCode>\n\nOnce your download is complete, make note of your path to the `bitcoind` executable.\n\n<Callout title=\"Note\">\nWhen you sync your node, we'll be running the program at `/bitcoin-25.0/bin/bitcoin`, which is where the `bitcoind` executable is located.\n</Callout>\n\nNext up is a couple configuration steps.\n\n1. Select or create a directory to store your Bitcoin data.\n2. Update the `bitcoin.conf` file to include the path to your Bitcoin data directory.\n\nThe Bitcoin chainstate is pretty large, and you need a place to store it. In this example, we are going to set up a directory called `bitcoin-data` on an external hard drive that we have mounted at `/Volumes/SSD`.\n\n<Callout title=\"Note\">\n This folder, `bitcoin-data`, can be named whatever you like, and can exist locally or in an external hard drive.\n \n The most important thing is that it should exist in a place that has enough storage to hold all the Bitcoin data we will be receiving once it starts to sync.\n</Callout>\n\nNow navigate to your `bitcoin.conf` file, which is located in your `/path/to/bitcoin` directory and update the `datadir` field with your directory. \n\nIn this example, it would look like this:\n\n```bash bitcoin.conf\ndatadir=/Volumes/SSD/bitcoin-data/\n```\n\n<Accordions>\n<Accordion title=\"Example bitcoin.conf\">\nYou can override the default configuration with the following, including the path to where you will be storing all of the Bitcoin data once it starts syncing:\n\n```bash\ndatadir=/your-path-to/bitcoin-data/\nserver=1\nrpcuser=devnet\nrpcpassword=devnet\nrpcport=8332\nrpcallowip=0.0.0.0/0\nrpcallowip=::/0\ntxindex=1\nlisten=1\ndiscover=0\ndns=0\ndnsseed=0\nlistenonion=0\nrpcserialversion=1\ndisablewallet=0\nfallbackfee=0.00001\nrpcthreads=8\nblocksonly=1\ndbcache=4096\n\n# Start zeromq\nzmqpubhashblock=tcp://0.0.0.0:18543\n```\n</Accordion>\n</Accordions>\n\nIf you plan to use your node to receive transactions, you will need to make note of the `username` and `password` fields for your node.\n\n<Callout title=\"Note\">\nIn the example `bitcoin.conf` above, `devnet` is listed as the default `username` and `password`.\n</Callout>\n\n## Run the node\n\nWith a finished `bitcoin.conf` file, it's time to start up your node.\n\nThis takes the form of `path/to/bitcoind -conf=path/to/bitcoin.conf`, which in this example looks like:\n\n```terminal\n$ /Volumes/SSD/bitcoin-25.0/bin/bitcoind -conf=/Volumes/SSD/bitcoin-25.0/bitcoin.conf\n```\n\nAfter running this command, you will see `zmq_url` entries in your console's stdout, displaying ZeroMQ logs from your Bitcoin node. Congrats! You're now syncing!\n\n<Callout title=\"Note\">\nIt might take anywhere from a few hours to a few days to run and fully sync, depending on if it's your first time syncing a node.\n</Callout>\n\n## Proper shutdown and restart procedure\n\n1. Shutting down your node\n2. Restarting your node\n\nTo shut down your node safely, use the `bitcoin-cli` executable, located inside of the `bin` directory, and run the `stop` command:\n\n```terminal\n$ /path/to/bitcoin-cli \\\n --conf=/path/to/bitcoin.conf \\\n --rpcuser={{your-rpc-username}} \\\n --rpcpassword={{your-rpc-password}} stop\n```\n\nTo start your node back up, all you need to do is refer to the previous steps from above by running `path/to/bitcoind -conf=path/to/bitcoin.conf`.\n\n<Callout title=\"How to eject an external hard drive\">\n <Tabs items={[\"macOS\",\"Windows\"]}>\n <Tab value={\"macOS\"}>\n 1. Go to the Finder, then the sidebar, and select the disk you want to eject under “Devices”. Click on the eject icon next to the name.\n 2. Wait for a confirmation message saying it's safe to eject the device before you unplug the drive.\n </Tab>\n\n <Tab value={\"Windows\"}>\n 1. Open File Explorer, select the drive from the list under “This PC” (PC > Devices and Drives), and click the “Eject” button.\n 2. Wait for a confirmation message saying it's safe to eject the device before you unplug the drive.\n </Tab>\n </Tabs>\n</Callout>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/chainhook-as-a-service\"\n title=\"Run Chainhook as a service\"\n description=\"Learn how to use Chainhook to build your own custom API.\"\n />\n <Card\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Learn how to sync a Stacks node for running a local devnet.\"\n />\n</Cards>\n","url":"/docs/guides/sync-a-bitcoin-node"},"516":{"id":"/docs/guides/no-loss-lottery","title":"Build a no-loss lottery pool","description":"Learn how to create a no-loss lottery pool that leverages stacking yield.","content":"\nimport { Code, Terminal } from 'lucide-react';\n\nA no-loss lottery contract offers a unique way for participants to stack their assets and potentially earn a larger reward without the risk of losing their initial deposit.\n\nThis contract ensures that participants can stack their assets in a yield-generating pool, receive an NFT ticket, and have a chance to win additional rewards while retaining their original investment.\n\nIn this guide, you will learn how to:\n\n1. Define constants and data variables\n2. Create and manage participants and tickets\n3. Implement the lottery functionality\n4. Handle the selection of winners\n5. Claim and distribute rewards\n\n<Callout title=\"Note\">\nThis example uses the CityCoins protocol for the stacking yield mechanism, but leveraging a Stacking pool using Proof of Transfer (PoX4) can also be used.\n</Callout>\n\n---\n\n## Define constants and data variables\n\nFirst, define some constants and data variables to manage the state of your contract. Constants are used for fixed values, and data variables store the state that can change during the contract execution.\n\n```clarity\n(define-constant OWNER tx-sender)\n(define-constant ERR_UNAUTHORIZED (err u101000))\n\n(define-data-var lotteryPool uint u0)\n(define-data-var totalYield uint u0)\n(define-data-var ticketCounter uint u0)\n```\n\nThe `OWNER` constant defines the contract owner with administrative privileges, while `ERR_UNAUTHORIZED` handles unauthorized access attempts.\n\nKey data variables include `lotteryPool` for tracking stacked assets, `totalYield` for accumulated earnings, and `ticketCounter` for managing issued tickets.\n\n## Create and manage participants and tickets\n\nNext, define an NFT to represent a ticket and a map to store participant information.\n\n```clarity\n(define-map Participants\n { participant: principal }\n { ticketId: uint, amount: uint, cycle: uint, ticketExpirationAtCycle: uint, isWinner: bool }\n)\n\n(define-map Tickets\n { ticketId: uint }\n { owner: principal }\n)\n\n(define-non-fungible-token LotteryTicket uint)\n```\n\nThe `Participants` map links participants to their ticket details, while the `Tickets` map associates tickets with their owners.\n\nThe `LotteryTicket` defines an NFT for the lottery tickets, crucial for managing entries.\n\n## Implement the lottery functionality\n\nNow, it's time to implement the core function of the contract, where participants can enter the lottery by depositing their assets.\n\n```clarity\n(define-public (roll-the-dice (cityName (string-ascii 10)) (amount uint) (lockPeriod (optional uint)))\n (let\n (\n (ticketId (+ (var-get ticketCounter) u1))\n (actualLockPeriod (default-to u1 lockPeriod))\n (rewardCycle (+ (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd007-citycoin-stacking get-current-reward-cycle) u1))\n )\n\n (begin\n (try! (contract-call? 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2 transfer amount tx-sender (as-contract tx-sender) none))\n (try! (nft-mint? LotteryTicket ticketId tx-sender))\n (map-insert Participants { participant: tx-sender } { ticketId: ticketId, amount: amount, cycle: rewardCycle, ticketExpirationAtCycle: (+ rewardCycle actualLockPeriod), isWinner: false })\n (map-set Tickets { ticketId: ticketId } { owner: tx-sender })\n (var-set lotteryPool (+ (var-get lotteryPool) amount))\n (var-set ticketCounter (+ (var-get ticketCounter) u1))\n (ok ticketId)\n )\n )\n)\n```\n\nThe `roll-the-dice` function enables participants to join the lottery by depositing assets, specifying the city (`cityName`), the deposit amount (`amount`), and the lock period (`lockPeriod`).\n\nThis function is crucial for managing lottery entries and ensuring assets are properly locked for the specified duration.\n\nWhen a participant calls this function, the following steps occur:\n\n1. **Generate ticket and determine lock period**: A new ticket ID is generated, and the lock period is set (defaulting to 1 if not specified).\n2. **Transfer assets and mint NFT ticket**: The specified amount of assets is transferred from the participant to the contract, and an NFT representing the lottery ticket is minted and assigned to the participant.\n3. **Update participant and ticket data**: The participant's information, including ticket ID, amount, cycle, and expiration, is stored, and the ticket's ownership information is updated.\n4. **Update lottery pool and return ticket ID**: The total amount in the lottery pool is updated, the ticket counter is incremented, and the function returns the newly generated ticket ID to the participant.\n\nThis streamlined process ensures that each participant's entry is properly recorded and their assets are securely managed within the lottery system.\n\n## Handling the selection of winners\n\nNow, implement the function to select a winner randomly from the participants.\n\n```clarity\n(define-private (select-winner)\n (match (contract-call? 'SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.citycoin-vrf-v2 get-save-rnd (- block-height u1)) randomTicketNumber\n (let\n (\n (ticketCount (var-get ticketCounter))\n (winningTicketId (mod randomTicketNumber ticketCount))\n (winner (unwrap! (get-ticket winningTicketId) (err u404)))\n (owner (get owner winner))\n (participant (unwrap! (get-participant owner) (err u404)))\n )\n (map-set Participants { participant: owner }\n { ticketId: winningTicketId, amount: (get amount participant), cycle: (get cycle participant), ticketExpirationAtCycle: (get ticketExpirationAtCycle participant), isWinner: true })\n (ok owner)\n )\n selectionError (err selectionError)\n )\n)\n```\nThe `select-winner` function randomly selects a winner using a number from the VRF contract (`get-save-rnd`) and updates their status with `unwrap!`. This ensures a fair and transparent winner selection process.\n\nWhen this function is called, the following steps occur:\n\n1. **Fetch random number**: A random number is obtained from the VRF contract by calling `get-save-rnd` with the previous block height.\n2. **Determine winning ticket**: The winning ticket ID is calculated by taking the modulus of the random number with the total number of tickets (`ticketCounter`).\n3. **Retrieve winner information**: The winner's ticket and participant information are retrieved using the calculated ticket ID.\n4. **Update winner status**: The participant's status is updated to indicate they are a winner by setting `isWinner` to `true` in the `Participants` map.\n\nThis process ensures that the winner is selected fairly and their status is accurately updated in the system.\n\n## Claim and distribute rewards\n\nLastly, implement the function to claim and distribute rewards to the winners.\n\n```clarity\n(define-public (claim-rewards (cityName (string-ascii 10)) (cycle uint))\n (let\n (\n (cityId (unwrap-panic (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd004-city-registry get-city-id cityName)))\n (cycleAmount (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stacking get-balance-stx))\n )\n (if (is-eq cityName \"mia\")\n (try! (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd011-stacking-payouts send-stacking-reward-mia cycle cycleAmount))\n (try! (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd011-stacking-payouts send-stacking-reward-nyc cycle cycleAmount))\n )\n (as-contract (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd007-citycoin-stacking claim-stacking-reward cityName cycle))\n )\n)\n\n(define-public (distribute-rewards)\n (select-winner)\n)\n```\n\nThe `claim-rewards` function enables participants to claim their staking rewards, while the `distribute-rewards` function calls `select-winner` to randomly select and reward winners, ensuring a fair distribution process.\n\nWhen the `claim-rewards` function is called, the following steps occur:\n\n1. **Retrieve city ID and balance**: The city ID is retrieved using the `get-city-id` function, and the balance for the specified cycle is obtained from the treasury contract.\n2. **Send stacking rewards**: Depending on the city (`mia` or `nyc`), the appropriate stacking reward function is called to send the rewards for the specified cycle.\n3. **Claim stacking reward**: The contract claims the stacking reward for the specified city and cycle.\n\nWhen the `distribute-rewards` function is called, it performs the following step:\n\n1. **Select winner**: The `select-winner` function is called to randomly select a winner from the participants and update their status.\n\nThis process ensures that participants can claim their rewards and that winners are selected and rewarded fairly.\n\n## Testing the contract\n\nTo test the contracts, use the following steps inside of `clarinet console`:\n\n```terminal\n$ ::advance_chain_tip 700000\n$ ::set_tx_sender\n$ (contract-call? 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.no-loss-lottery-pool roll-the-dice \"mia\" u500 none)\n$ ::advance_chain_tip 2000\n$ (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stacking deposit-stx u5000000000)\n$ (contract-call? 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.no-loss-lottery-pool claim \"mia\" u17)\n```\n\nTo bootstrap the CityCoins contracts, follow these steps:\n\n```clarity\n(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd004-city-registry get-or-create-city-id \"mia\")\n(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd004-city-registry get-or-create-city-id \"nyc\")\n(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stacking set-allowed 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2 true)\n(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-nyc-stacking set-allowed 'SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.newyorkcitycoin-token-v2 true)\n```\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet/guides/create-a-new-project\"\n title=\"Create a new project\"\n description=\"Learn how to create a new Clarinet project.\"\n />\n <Card\n href=\"/stacks/clarinet/guides/deploy-a-contract\"\n title=\"Deploy a contract\"\n description=\"Learn how to deploy a contract to a Clarinet network.\"\n />\n</Cards>\n","url":"/docs/guides/no-loss-lottery"},"517":{"id":"/docs/guides/docskit","title":"DocsKit","description":"DocsKit usage","content":"\n## Features\n\nDocsKit features:\n\n- adds [flags](#flags) and [annotations](#annotations) to codeblocks\n- includes a special syntax for [inline code](#inline-code)\n- adds three components that can be used in MDX: [_`<CodeTabs />`_](#codetabs), [_`<WithNotes />`_](#withnotes), and [_`<TerminalPicker />`_](#terminal-picker)\n- adds a [language switcher](#language-switcher) (which is another usage of _`<CodeTabs />`_)\n- codeblocks with language [`terminal`](#terminal) or [`package-install`](#package-install) are rendered with a different component\n\n## Flags\n\n````txt flags-example.md\n# !mark[/-wn/]\n```js index.js -wn\n```\n````\n\n- `-n` add line numbers\n- `-c` add copy button\n- `-w` word wrap\n- `-a` animate (for tabs)\n\n## Annotations\n\n````txt annotations-example.md\n```js\nconst x = 1;\n# !mark[/!mark/]\n// !mark(1:2)\nconst y = 2;\nconst z = 3;\n```\n````\n\n- `!mark` - highlight a line, a range of lines, or a regex\n- `!diff` - highlight added or removed lines\n- `!collapse` - collapse a range of lines\n- `!fold` - fold a regex pattern inline\n- `!link` - add a link\n- `!tooltip` - add a tooltip\n- `!callout` - add a callout\n\nLearn more about using annotations from Code Hike docs:\n\n- [Annotation comments](https://codehike.org/docs/concepts/annotations#annotation-comments)\n- [Using regular expressions](https://codehike.org/docs/concepts/annotations#using-regular-expressions-instead-of-ranges)\n\n## Mark\n\nYou can use it for one line (`!mark`), a range of lines (`!mark(1:3)`), a range of columns (`!mark[5:10]`), or a regex pattern (`!mark[/pattern/]`).\n\nYou can provide any valid CSS color, for example: `!mark(1:3) red` or `!mark(1:3) hsl(var(--hiro))`.\n\n```clarity\n;; !mark[/Counters/mg]\n(define-map Counters principal uint)\n\n;; !mark(1:3)\n(define-public (count-up)\n (ok (map-set Counters tx-sender (+ (get-count tx-sender) u1)))\n)\n\n;; !mark hsl(var(--hiro))\n(define-read-only (get-count (who principal))\n (default-to u0 (map-get? Counters who))\n)\n```\n\n## Diff\n\n```js\nfunction lorem(ipsum, dolor = 1) {\n const sit = 10;\n // !diff -\n dolor = ipsum - sit;\n // !diff +\n dolor = sit - amet(dolor);\n return sit ? consectetur(ipsum) : [];\n}\n```\n\n## Collapse\n\n```jsonc sample-alert-payload.json -cwn\n{\n \"nonce\": 5,\n \"fee_rate\": \"250\",\n \"sponsored\": false,\n \"post_condition_mode\": \"deny\",\n // !collapse(1:9) collapsed\n \"post_conditions\": [\n {\n \"type\": \"stx\",\n \"condition_code\": \"sent_equal_to\",\n \"amount\": \"3000000\",\n \"principal\": {\n \"type_id\": \"principal_standard\",\n },\n },\n ],\n \"anchor_mode\": \"any\",\n \"tx_status\": \"pending\",\n \"receipt_time\": 1726104636,\n \"tx_type\": \"contract_call\",\n // !collapse(1:11) collapsed\n \"contract_call\": {\n \"function_name\": \"donate\",\n \"function_signature\": \"(define-public (donate (amount uint)))\",\n \"function_args\": [\n {\n \"hex\": \"0x01000000000000000000000000002dc6c0\",\n \"repr\": \"u3000000\",\n \"name\": \"amount\",\n \"type\": \"uint\",\n },\n ],\n },\n}\n```\n\n## Fold\n\n```jsx\n// !fold[/className=\"(.*?)\"/gm]\nfunction Foo() {\n return (\n <div className=\"bg-red-200 opacity-50\">\n <span className=\"block\">hey</span>\n </div>\n );\n}\n```\n\n## Link\n\n```js\n// !link[/foo/mg] https://example.com\n// !link[/bar/mg] https://example.com\nimport { foo, bar } from \"baz\";\n\nconst x = foo(10);\nconst y = bar(x);\n```\n\n## CodeTabs\n\n````txt tabs-example.md\n# !mark[/!!/mg]\n<CodeTabs flags=\"ac\">\n\n```ts !! index.ts\n\n```\n\n```css !! styles.css\n\n```\n</CodeTabs>\n````\n\nNote: the codeblocks inside the _`<CodeTabs />`_ component should have the `!!` decoration and a title.\n\nYou can pass flags to the _`<CodeTabs />`_ component to apply them to all codeblocks inside it. The `a` flag will animate the transition between tabs.\n\nExample:\n\n<CodeTabs flags=\"ac\">\n\n```clarity !! one.clar\n;; !mark[/increment/mg]\n(define-data-var count uint u0)\n\n(define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count)) ;; !mark\n )\n)\n```\n\n```solidity !! two.sol\n// !mark[/add/mg]\nuint256 constant TOO_BIG = 10;\nuint256 count = 0;\n\nfunction add(uint256 amount) public returns (uint256) {\n uint256 newCount = count + amount;\n if (newCount <= TOO_BIG) {\n count = newCount;\n return count;\n }\n revert(\"Amount too large\"); // !mark\n}\n```\n\n</CodeTabs>\n\n### Language switcher\n\nTo switch between languages, use the _`<CodeTabs />`_ component with the `storage` prop. The `storage` prop is used to store the selected language in the local storage and sync all the _`<CodeTabs storage=\"some-id\" />`_ using the same `storage` key.\n\n<CodeTabs flags=\"ac\" storage=\"ts\">\n\n```ts !! TypeScript\n(async () => {\n const apiConfig: Configuration = new Configuration({\n fetchApi: fetch,\n // for mainnet, replace `testnet` with `mainnet`\n basePath: \"https://api.testnet.hiro.so\",\n });\n})().catch(console.error);\n```\n\n```js !! JavaScript\n(async () => {\n const apiConfig = new Configuration({\n fetchApi: fetch,\n // for mainnet, replace `testnet` with `mainnet`\n basePath: \"https://api.testnet.hiro.so\",\n });\n})().catch(console.error);\n```\n\n</CodeTabs>\n\n## WithNotes\n\nFor `!callout` and `!tooltip` annotations, you can use the _`<WithNotes />`_ to define the content you want to show.\n\n### Callouts\n\n<WithNotes>\n\n```js index.js\n// !callout[/ipsum/] description\nimport lorem from \"ipsum\";\n\n// !callout[/sit/] inspect\nconst sit = lorem({ a: 1, b: 2 });\n```\n\n```js !inspect\nsit = [\n { name: \"a\", value: 1 },\n { name: \"b\", value: 2 },\n];\n```\n\n## !description\n\nThe default export of the `ipsum` package is a function that **returns an array**.\n\nKind of like _`Object.entries(x)`_ but different.\n\n</WithNotes>\n\n### Tooltips\n\n<WithNotes>\n\n```js demo.js\n// !tooltip[/lorem/] install\nimport { read, write } from \"lorem\";\n\n// !tooltip[/data.json/] data\nvar data = read(\"data.json\");\n\n// !tooltip[/test-123/] apikey\nwrite({ x: 1 }, { apiKey: \"test-123\" });\n```\n\nWe can also use tooltips [here](tooltip \"install\") in [prose](tooltip \"data\") text.\n\n```json !data data.json\n{\n \"lorem\": \"ipsum dolor sit amet\",\n \"foo\": [4, 8, 15, 16]\n}\n```\n\n## !install\n\nThis is a **fake library**. You can install it with:\n\n```terminal\n$ npm install lorem\n```\n\nIt lets you read and write data.\n\n## !apikey\n\nThis is a public sample test mode [API key](https://example.com). Don’t submit any personally information using this key.\n\nReplace this with your secret key found on the [API Keys page](https://example.com) in the dashboard.\n\n</WithNotes>\n\n## Inline code\n\nTo use inline codeyou need to use a special syntax: ``_`code`_``.\n\nThis syntax also allows you to specify the language for inline code ``_clarity`(contract-call? .counter count-up)`_`` renders: _clarity`(contract-call? .counter count-up)`_\n\n## Terminal\n\nTo use the terminal component, set the language of a codeblock to `terminal`, and start each command with `$`.\n\n```terminal\n$ tar -xf clarinet-linux-x64.tar.gz\n$ chmod +x ./clarinet\n$ mv ./clarinet /usr/local/bin\n```\n\nThe lines that don't start with `$` are rendered as collapsed output. The output can use ANSI colors and styles.\n\n```terminal\n$ npx create-next-app@latest\ncreate-next-app@14.2.13\n\u001b[32m✔\u001b[0m \u001b[1mWhat is your project?\u001b[0m \u001b[90m…\u001b[0m my-app\n$ npm run dev\n```\n\n### Terminal Picker\n\n<TerminalPicker>\n\n```terminal !! macOS\n$ brew install clarinet\n```\n\n```terminal !! Windows\n$ winget install clarinet\n```\n\n```terminal !! Cargo\n$ sudo apt install build-essential pkg-config libssl-dev\n```\n\n</TerminalPicker>\n\n### Package Install\n\nYou can use `package-install` as a language to get a picker for JS package managers.\n\n```package-install\n@stacks/connect\n```\n\n### Opting out of the terminal component\n\nTo use features from the normal codeblock component, you can still use languages like `sh` or `bash` or even `txt`.\n\n```sh Terminal -w\n# !tooltip[/v0.27.0/] You can change the v0.27.0 version that is available on the releases page.\n$ wget -nv download/v0.27.0/clarinet-linux-x64-glibc.tar.gz -O clarinet-linux-x64.tar.gz\n```\n","url":"/docs/guides/docskit"}},"count":517},"sorting":{"language":"english","sortableProperties":["id","title","description","content","url"],"sortablePropertiesWithTypes":{"id":"string","title":"string","description":"string","content":"string","url":"string"},"sorts":{"id":{"docs":{"1":371,"2":374,"3":417,"4":223,"5":222,"6":220,"7":221,"8":217,"9":219,"10":218,"11":418,"12":498,"13":200,"14":201,"15":203,"16":204,"17":202,"18":216,"19":224,"20":225,"21":233,"22":230,"23":232,"24":231,"25":229,"26":228,"27":227,"28":234,"29":226,"30":235,"31":389,"32":398,"33":397,"34":401,"35":400,"36":399,"37":394,"38":391,"39":393,"40":390,"41":396,"42":392,"43":395,"44":99,"45":388,"46":406,"47":405,"48":402,"49":408,"50":407,"51":403,"52":404,"53":409,"54":501,"55":502,"56":507,"57":508,"58":514,"59":509,"60":510,"61":513,"62":511,"63":512,"64":503,"65":504,"66":505,"67":506,"68":377,"69":378,"70":376,"71":379,"72":380,"73":375,"74":372,"75":373,"76":239,"77":238,"78":236,"79":361,"80":240,"81":237,"82":307,"83":351,"84":333,"85":352,"86":260,"87":255,"88":294,"89":310,"90":261,"91":302,"92":263,"93":359,"94":328,"95":285,"96":276,"97":266,"98":341,"99":269,"100":264,"101":321,"102":317,"103":262,"104":286,"105":309,"106":338,"107":308,"108":242,"109":330,"110":303,"111":335,"112":272,"113":249,"114":304,"115":278,"116":283,"117":356,"118":349,"119":271,"120":295,"121":323,"122":267,"123":282,"124":297,"125":280,"126":245,"127":287,"128":254,"129":268,"130":251,"131":357,"132":313,"133":257,"134":270,"135":318,"136":299,"137":241,"138":339,"139":298,"140":346,"141":327,"142":347,"143":342,"144":277,"145":253,"146":300,"147":301,"148":354,"149":243,"150":344,"151":355,"152":292,"153":348,"154":288,"155":322,"156":284,"157":340,"158":258,"159":353,"160":265,"161":247,"162":331,"163":248,"164":274,"165":324,"166":350,"167":312,"168":337,"169":332,"170":314,"171":306,"172":311,"173":296,"174":252,"175":358,"176":305,"177":275,"178":281,"179":256,"180":273,"181":334,"182":259,"183":293,"184":345,"185":325,"186":320,"187":250,"188":290,"189":315,"190":279,"191":289,"192":244,"193":246,"194":336,"195":319,"196":291,"197":316,"198":343,"199":329,"200":326,"201":360,"202":362,"203":516,"204":500,"205":468,"206":469,"207":470,"208":464,"209":471,"210":472,"211":473,"212":474,"213":475,"214":476,"215":477,"216":466,"217":465,"218":467,"219":383,"220":385,"221":384,"222":386,"223":387,"224":515,"225":478,"226":497,"227":496,"228":479,"229":495,"230":486,"231":487,"232":488,"233":492,"234":493,"235":491,"236":490,"237":485,"238":483,"239":484,"240":480,"241":482,"242":481,"243":494,"244":489,"245":381,"246":382,"247":101,"248":193,"249":194,"250":195,"251":196,"252":199,"253":197,"254":198,"255":106,"256":100,"257":103,"258":105,"259":102,"260":123,"261":126,"262":121,"263":117,"264":125,"265":120,"266":118,"267":124,"268":119,"269":122,"270":149,"271":147,"272":148,"273":144,"274":152,"275":150,"276":151,"277":146,"278":145,"279":133,"280":132,"281":174,"282":172,"283":173,"284":176,"285":175,"286":177,"287":159,"288":157,"289":160,"290":158,"291":161,"292":162,"293":164,"294":163,"295":140,"296":138,"297":135,"298":137,"299":134,"300":141,"301":139,"302":136,"303":181,"304":184,"305":190,"306":189,"307":180,"308":192,"309":183,"310":186,"311":182,"312":188,"313":187,"314":191,"315":185,"316":171,"317":170,"318":130,"319":131,"320":116,"321":109,"322":115,"323":112,"324":108,"325":114,"326":111,"327":113,"328":110,"329":167,"330":166,"331":165,"332":168,"333":169,"334":142,"335":143,"336":128,"337":127,"338":129,"339":178,"340":179,"341":153,"342":155,"343":156,"344":154,"345":104,"346":107,"347":463,"348":499,"349":205,"350":363,"351":370,"352":364,"353":365,"354":367,"355":366,"356":368,"357":369,"358":423,"359":422,"360":420,"361":421,"362":419,"363":424,"364":425,"365":426,"366":428,"367":430,"368":431,"369":429,"370":427,"371":214,"372":215,"373":206,"374":208,"375":210,"376":207,"377":209,"378":213,"379":212,"380":211,"381":410,"382":413,"383":416,"384":411,"385":414,"386":412,"387":415,"388":435,"389":436,"390":447,"391":449,"392":448,"393":446,"394":444,"395":445,"396":440,"397":439,"398":441,"399":432,"400":442,"401":443,"402":458,"403":457,"404":433,"405":434,"406":459,"407":462,"408":460,"409":461,"410":452,"411":456,"412":450,"413":453,"414":454,"415":455,"416":451,"417":437,"418":438,"419":36,"420":37,"421":65,"422":84,"423":86,"424":85,"425":82,"426":83,"427":66,"428":79,"429":80,"430":73,"431":72,"432":74,"433":75,"434":67,"435":71,"436":69,"437":70,"438":68,"439":81,"440":76,"441":78,"442":77,"443":62,"444":63,"445":59,"446":60,"447":46,"448":42,"449":44,"450":45,"451":47,"452":43,"453":50,"454":53,"455":54,"456":52,"457":55,"458":51,"459":41,"460":48,"461":49,"462":61,"463":56,"464":57,"465":58,"466":0,"467":2,"468":34,"469":35,"470":28,"471":27,"472":29,"473":30,"474":22,"475":26,"476":24,"477":25,"478":23,"479":31,"480":33,"481":32,"482":20,"483":21,"484":7,"485":3,"486":5,"487":6,"488":8,"489":4,"490":11,"491":14,"492":15,"493":13,"494":16,"495":12,"496":9,"497":10,"498":17,"499":18,"500":19,"501":1,"502":38,"503":39,"504":40,"505":64,"506":91,"507":95,"508":87,"509":97,"510":93,"511":89,"512":88,"513":90,"514":98,"515":96,"516":94,"517":92},"orderedDocs":[[466,"/docs/bitcoin"],[501,"/docs/bitcoin/api"],[467,"/docs/bitcoin/api-keys"],[485,"/docs/bitcoin/api/ordinals/brc20"],[489,"/docs/bitcoin/api/ordinals/brc20/get-brc20-activity"],[486,"/docs/bitcoin/api/ordinals/brc20/get-brc20-balances"],[487,"/docs/bitcoin/api/ordinals/brc20/get-brc20-token-details"],[484,"/docs/bitcoin/api/ordinals/brc20/get-brc20-token-holders"],[488,"/docs/bitcoin/api/ordinals/brc20/get-brc20-tokens"],[496,"/docs/bitcoin/api/ordinals/info"],[497,"/docs/bitcoin/api/ordinals/info/status"],[490,"/docs/bitcoin/api/ordinals/inscriptions"],[495,"/docs/bitcoin/api/ordinals/inscriptions/get-inscription"],[493,"/docs/bitcoin/api/ordinals/inscriptions/get-inscription-content"],[491,"/docs/bitcoin/api/ordinals/inscriptions/get-inscription-transfers"],[492,"/docs/bitcoin/api/ordinals/inscriptions/get-inscriptions"],[494,"/docs/bitcoin/api/ordinals/inscriptions/get-transfers-per-block"],[498,"/docs/bitcoin/api/ordinals/satoshis"],[499,"/docs/bitcoin/api/ordinals/satoshis/get-satoshi"],[500,"/docs/bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions"],[482,"/docs/bitcoin/api/ordinals/statistics"],[483,"/docs/bitcoin/api/ordinals/statistics/get-stats-inscription-count"],[474,"/docs/bitcoin/api/runes/activities"],[478,"/docs/bitcoin/api/runes/activities/activity"],[476,"/docs/bitcoin/api/runes/activities/for-address"],[477,"/docs/bitcoin/api/runes/activities/for-block"],[475,"/docs/bitcoin/api/runes/activities/for-transaction"],[471,"/docs/bitcoin/api/runes/balances"],[470,"/docs/bitcoin/api/runes/balances/address"],[472,"/docs/bitcoin/api/runes/balances/holder-balance"],[473,"/docs/bitcoin/api/runes/balances/holders"],[479,"/docs/bitcoin/api/runes/etchings"],[481,"/docs/bitcoin/api/runes/etchings/get-etching"],[480,"/docs/bitcoin/api/runes/etchings/get-etchings"],[468,"/docs/bitcoin/api/runes/info"],[469,"/docs/bitcoin/api/runes/info/status"],[419,"/docs/bitcoin/contributors-guide"],[420,"/docs/bitcoin/get-started"],[502,"/docs/bitcoin/indexer"],[503,"/docs/bitcoin/indexer/guides/run-indexer"],[504,"/docs/bitcoin/indexer/quickstart"],[459,"/docs/bitcoin/ordinals/api"],[448,"/docs/bitcoin/ordinals/api/brc20"],[452,"/docs/bitcoin/ordinals/api/brc20/get-brc20-activity"],[449,"/docs/bitcoin/ordinals/api/brc20/get-brc20-balances"],[450,"/docs/bitcoin/ordinals/api/brc20/get-brc20-token-details"],[447,"/docs/bitcoin/ordinals/api/brc20/get-brc20-token-holders"],[451,"/docs/bitcoin/ordinals/api/brc20/get-brc20-tokens"],[460,"/docs/bitcoin/ordinals/api/info"],[461,"/docs/bitcoin/ordinals/api/info/status"],[453,"/docs/bitcoin/ordinals/api/inscriptions"],[458,"/docs/bitcoin/ordinals/api/inscriptions/get-inscription"],[456,"/docs/bitcoin/ordinals/api/inscriptions/get-inscription-content"],[454,"/docs/bitcoin/ordinals/api/inscriptions/get-inscription-transfers"],[455,"/docs/bitcoin/ordinals/api/inscriptions/get-inscriptions"],[457,"/docs/bitcoin/ordinals/api/inscriptions/get-transfers-per-block"],[463,"/docs/bitcoin/ordinals/api/satoshis"],[464,"/docs/bitcoin/ordinals/api/satoshis/get-satoshi"],[465,"/docs/bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions"],[445,"/docs/bitcoin/ordinals/api/statistics"],[446,"/docs/bitcoin/ordinals/api/statistics/get-stats-inscription-count"],[462,"/docs/bitcoin/ordinals/api/usage"],[443,"/docs/bitcoin/ordinals/explorer"],[444,"/docs/bitcoin/ordinals/explorer/guides/build-explorer"],[505,"/docs/bitcoin/quickstarts"],[421,"/docs/bitcoin/rate-limiting"],[427,"/docs/bitcoin/runes/api"],[434,"/docs/bitcoin/runes/api/activities"],[438,"/docs/bitcoin/runes/api/activities/activity"],[436,"/docs/bitcoin/runes/api/activities/for-address"],[437,"/docs/bitcoin/runes/api/activities/for-block"],[435,"/docs/bitcoin/runes/api/activities/for-transaction"],[431,"/docs/bitcoin/runes/api/balances"],[430,"/docs/bitcoin/runes/api/balances/address"],[432,"/docs/bitcoin/runes/api/balances/holder-balance"],[433,"/docs/bitcoin/runes/api/balances/holders"],[440,"/docs/bitcoin/runes/api/etchings"],[442,"/docs/bitcoin/runes/api/etchings/get-etching"],[441,"/docs/bitcoin/runes/api/etchings/get-etchings"],[428,"/docs/bitcoin/runes/api/info"],[429,"/docs/bitcoin/runes/api/info/status"],[439,"/docs/bitcoin/runes/api/usage"],[425,"/docs/bitcoin/runes/explorer"],[426,"/docs/bitcoin/runes/explorer/guides/build-explorer"],[422,"/docs/bitcoin/runes/runehook"],[424,"/docs/bitcoin/runes/runehook/installation"],[423,"/docs/bitcoin/runes/runehook/quickstart"],[508,"/docs/guides"],[512,"/docs/guides/api-keys"],[511,"/docs/guides/build-a-decentralized-kickstarter"],[513,"/docs/guides/build-an-nft-marketplace"],[506,"/docs/guides/contributors-guide"],[517,"/docs/guides/docskit"],[510,"/docs/guides/installing-docker"],[516,"/docs/guides/no-loss-lottery"],[507,"/docs/guides/rate-limiting"],[515,"/docs/guides/sync-a-bitcoin-node"],[509,"/docs/guides/sync-a-stacks-node"],[514,"/docs/guides/using-clarity-values"],[44,"/docs/stacks"],[256,"/docs/stacks/api"],[247,"/docs/stacks/api-keys"],[259,"/docs/stacks/api/architecture"],[257,"/docs/stacks/api/authentication"],[345,"/docs/stacks/api/getting-started"],[258,"/docs/stacks/api/nonce-handling"],[255,"/docs/stacks/api/pagination"],[346,"/docs/stacks/api/requesting-proofs"],[324,"/docs/stacks/api/stacks-blockchain/accounts/assets"],[321,"/docs/stacks/api/stacks-blockchain/accounts/balances"],[328,"/docs/stacks/api/stacks-blockchain/accounts/inbound-stx-transfers"],[326,"/docs/stacks/api/stacks-blockchain/accounts/latest-nonce"],[323,"/docs/stacks/api/stacks-blockchain/accounts/nft-events"],[327,"/docs/stacks/api/stacks-blockchain/accounts/stx-balances"],[325,"/docs/stacks/api/stacks-blockchain/accounts/transaction-with-transfers"],[322,"/docs/stacks/api/stacks-blockchain/accounts/transactions"],[320,"/docs/stacks/api/stacks-blockchain/accounts/transactions-with-transfers"],[263,"/docs/stacks/api/stacks-blockchain/blocks"],[266,"/docs/stacks/api/stacks-blockchain/blocks/average-times"],[268,"/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash"],[265,"/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-height"],[262,"/docs/stacks/api/stacks-blockchain/blocks/block-by-hash"],[269,"/docs/stacks/api/stacks-blockchain/blocks/block-by-height"],[260,"/docs/stacks/api/stacks-blockchain/blocks/get-block"],[267,"/docs/stacks/api/stacks-blockchain/blocks/get-blocks"],[264,"/docs/stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block"],[261,"/docs/stacks/api/stacks-blockchain/blocks/recent-blocks"],[337,"/docs/stacks/api/stacks-blockchain/burn-blocks"],[336,"/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-block"],[338,"/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks"],[318,"/docs/stacks/api/stacks-blockchain/faucets"],[319,"/docs/stacks/api/stacks-blockchain/faucets/stx"],[280,"/docs/stacks/api/stacks-blockchain/fees"],[279,"/docs/stacks/api/stacks-blockchain/fees/fee-rate"],[299,"/docs/stacks/api/stacks-blockchain/info"],[297,"/docs/stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text"],[302,"/docs/stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply"],[298,"/docs/stacks/api/stacks-blockchain/info/network-block-time"],[296,"/docs/stacks/api/stacks-blockchain/info/network-given-block-time"],[301,"/docs/stacks/api/stacks-blockchain/info/status"],[295,"/docs/stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply"],[300,"/docs/stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text"],[334,"/docs/stacks/api/stacks-blockchain/mempool"],[335,"/docs/stacks/api/stacks-blockchain/mempool/transaction-fee-priorities"],[273,"/docs/stacks/api/stacks-blockchain/names"],[278,"/docs/stacks/api/stacks-blockchain/names/historical-zonefile"],[277,"/docs/stacks/api/stacks-blockchain/names/name-details"],[271,"/docs/stacks/api/stacks-blockchain/names/name-subdomains"],[272,"/docs/stacks/api/stacks-blockchain/names/name-zonefile"],[270,"/docs/stacks/api/stacks-blockchain/names/names"],[275,"/docs/stacks/api/stacks-blockchain/names/namespace-names"],[276,"/docs/stacks/api/stacks-blockchain/names/namespaces"],[274,"/docs/stacks/api/stacks-blockchain/names/owned-by-address"],[341,"/docs/stacks/api/stacks-blockchain/non-fungible-tokens"],[344,"/docs/stacks/api/stacks-blockchain/non-fungible-tokens/history"],[342,"/docs/stacks/api/stacks-blockchain/non-fungible-tokens/holdings"],[343,"/docs/stacks/api/stacks-blockchain/non-fungible-tokens/mints"],[288,"/docs/stacks/api/stacks-blockchain/proof-of-transfer"],[290,"/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycle"],[287,"/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycles"],[289,"/docs/stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle"],[291,"/docs/stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle"],[292,"/docs/stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle"],[294,"/docs/stacks/api/stacks-blockchain/search"],[293,"/docs/stacks/api/stacks-blockchain/search/search-by-id"],[331,"/docs/stacks/api/stacks-blockchain/smart-contracts"],[330,"/docs/stacks/api/stacks-blockchain/smart-contracts/by-trait"],[329,"/docs/stacks/api/stacks-blockchain/smart-contracts/events"],[332,"/docs/stacks/api/stacks-blockchain/smart-contracts/info"],[333,"/docs/stacks/api/stacks-blockchain/smart-contracts/status"],[317,"/docs/stacks/api/stacks-blockchain/stacking-pool"],[316,"/docs/stacks/api/stacks-blockchain/stacking-pool/members"],[282,"/docs/stacks/api/stacks-blockchain/stacking-rewards"],[283,"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient"],[281,"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients"],[285,"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries"],[284,"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders"],[286,"/docs/stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient"],[339,"/docs/stacks/api/stacks-blockchain/tokens"],[340,"/docs/stacks/api/stacks-blockchain/tokens/holders"],[307,"/docs/stacks/api/stacks-blockchain/transactions"],[303,"/docs/stacks/api/stacks-blockchain/transactions/address-transactions"],[311,"/docs/stacks/api/stacks-blockchain/transactions/details-for-transactions"],[309,"/docs/stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions"],[304,"/docs/stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction"],[315,"/docs/stacks/api/stacks-blockchain/transactions/get-raw-transaction"],[310,"/docs/stacks/api/stacks-blockchain/transactions/get-transaction"],[313,"/docs/stacks/api/stacks-blockchain/transactions/mempool-transactions"],[312,"/docs/stacks/api/stacks-blockchain/transactions/recent-transactions"],[306,"/docs/stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions"],[305,"/docs/stacks/api/stacks-blockchain/transactions/transaction-events"],[314,"/docs/stacks/api/stacks-blockchain/transactions/transactions-by-block"],[308,"/docs/stacks/api/stacks-blockchain/transactions/transactions-for-address"],[248,"/docs/stacks/api/token-metadata/info"],[249,"/docs/stacks/api/token-metadata/info/status"],[250,"/docs/stacks/api/token-metadata/tokens"],[251,"/docs/stacks/api/token-metadata/tokens/fungible-token-metadata"],[253,"/docs/stacks/api/token-metadata/tokens/fungible-tokens"],[254,"/docs/stacks/api/token-metadata/tokens/non-fungible-token-metadata"],[252,"/docs/stacks/api/token-metadata/tokens/semi-fungible-token-metadata"],[13,"/docs/stacks/archive"],[14,"/docs/stacks/archive/guides/stacks-api"],[17,"/docs/stacks/archive/guides/stacks-blockchain"],[15,"/docs/stacks/archive/guides/token-metadata-api"],[16,"/docs/stacks/archive/guides/verify-archive-data"],[349,"/docs/stacks/blockchain-development"],[373,"/docs/stacks/chainhook"],[376,"/docs/stacks/chainhook/examples/chainhook-as-a-service"],[374,"/docs/stacks/chainhook/examples/chainhook-as-a-service-with-stacks-node"],[377,"/docs/stacks/chainhook/examples/observing-contract-calls"],[375,"/docs/stacks/chainhook/examples/register-chainhooks-on-devnet"],[380,"/docs/stacks/chainhook/installation"],[379,"/docs/stacks/chainhook/predicate-design"],[378,"/docs/stacks/chainhook/quickstart"],[371,"/docs/stacks/chainhook/references/scopes/bitcoin"],[372,"/docs/stacks/chainhook/references/scopes/stacks"],[18,"/docs/stacks/clarinet"],[8,"/docs/stacks/clarinet-js-sdk"],[10,"/docs/stacks/clarinet-js-sdk/installation"],[9,"/docs/stacks/clarinet-js-sdk/quickstart"],[6,"/docs/stacks/clarinet-js-sdk/references/custom-matchers"],[7,"/docs/stacks/clarinet-js-sdk/references/methods"],[5,"/docs/stacks/clarinet-js-sdk/references/properties"],[4,"/docs/stacks/clarinet-js-sdk/references/simnet"],[19,"/docs/stacks/clarinet/concepts"],[20,"/docs/stacks/clarinet/examples/add-a-contract"],[29,"/docs/stacks/clarinet/examples/create-a-new-project"],[27,"/docs/stacks/clarinet/examples/create-deployment-plans"],[26,"/docs/stacks/clarinet/examples/debug-a-contract"],[25,"/docs/stacks/clarinet/examples/deploy-a-contract"],[22,"/docs/stacks/clarinet/examples/estimate-costs"],[24,"/docs/stacks/clarinet/examples/run-a-local-devnet"],[23,"/docs/stacks/clarinet/examples/start-a-development-console"],[21,"/docs/stacks/clarinet/examples/validate-a-contract"],[28,"/docs/stacks/clarinet/examples/working-with-sbtc"],[30,"/docs/stacks/clarinet/quickstart"],[78,"/docs/stacks/clarity"],[81,"/docs/stacks/clarity/access-control"],[77,"/docs/stacks/clarity/basic-arithmetic"],[76,"/docs/stacks/clarity/bit-manipulation"],[80,"/docs/stacks/clarity/cryptographic-functions"],[137,"/docs/stacks/clarity/functions/add"],[108,"/docs/stacks/clarity/functions/and"],[149,"/docs/stacks/clarity/functions/append"],[192,"/docs/stacks/clarity/functions/as-contract"],[126,"/docs/stacks/clarity/functions/as-max-len"],[193,"/docs/stacks/clarity/functions/asserts"],[161,"/docs/stacks/clarity/functions/at-block"],[163,"/docs/stacks/clarity/functions/begin"],[113,"/docs/stacks/clarity/functions/bit-and"],[187,"/docs/stacks/clarity/functions/bit-not"],[130,"/docs/stacks/clarity/functions/bit-or"],[174,"/docs/stacks/clarity/functions/bit-shift-left"],[145,"/docs/stacks/clarity/functions/bit-shift-right"],[128,"/docs/stacks/clarity/functions/bit-xor"],[87,"/docs/stacks/clarity/functions/buff-to-int-be"],[179,"/docs/stacks/clarity/functions/buff-to-int-le"],[133,"/docs/stacks/clarity/functions/buff-to-uint-be"],[158,"/docs/stacks/clarity/functions/buff-to-uint-le"],[182,"/docs/stacks/clarity/functions/concat"],[86,"/docs/stacks/clarity/functions/contract-call"],[90,"/docs/stacks/clarity/functions/contract-of"],[103,"/docs/stacks/clarity/functions/default-to"],[92,"/docs/stacks/clarity/functions/define-constant"],[100,"/docs/stacks/clarity/functions/define-data-var"],[160,"/docs/stacks/clarity/functions/define-fungible-token"],[97,"/docs/stacks/clarity/functions/define-map"],[122,"/docs/stacks/clarity/functions/define-non-fungible-token"],[129,"/docs/stacks/clarity/functions/define-private"],[99,"/docs/stacks/clarity/functions/define-public"],[134,"/docs/stacks/clarity/functions/define-read-only"],[119,"/docs/stacks/clarity/functions/define-trait"],[112,"/docs/stacks/clarity/functions/divide"],[180,"/docs/stacks/clarity/functions/element-at"],[164,"/docs/stacks/clarity/functions/err"],[177,"/docs/stacks/clarity/functions/filter"],[96,"/docs/stacks/clarity/functions/fold"],[144,"/docs/stacks/clarity/functions/from-consensus-buff"],[115,"/docs/stacks/clarity/functions/ft-burn"],[190,"/docs/stacks/clarity/functions/ft-get-balance"],[125,"/docs/stacks/clarity/functions/ft-get-supply"],[178,"/docs/stacks/clarity/functions/ft-mint"],[123,"/docs/stacks/clarity/functions/ft-transfer"],[116,"/docs/stacks/clarity/functions/get"],[156,"/docs/stacks/clarity/functions/get-block-info"],[95,"/docs/stacks/clarity/functions/get-burn-block-info"],[104,"/docs/stacks/clarity/functions/get-stacks-block-info"],[127,"/docs/stacks/clarity/functions/get-tenure-info"],[154,"/docs/stacks/clarity/functions/greater-than"],[191,"/docs/stacks/clarity/functions/greater-than-or-equal"],[188,"/docs/stacks/clarity/functions/hash160"],[196,"/docs/stacks/clarity/functions/if"],[152,"/docs/stacks/clarity/functions/impl-trait"],[183,"/docs/stacks/clarity/functions/index-of"],[88,"/docs/stacks/clarity/functions/int-to-ascii"],[120,"/docs/stacks/clarity/functions/int-to-utf8"],[173,"/docs/stacks/clarity/functions/is-eq"],[124,"/docs/stacks/clarity/functions/is-err"],[139,"/docs/stacks/clarity/functions/is-none"],[136,"/docs/stacks/clarity/functions/is-ok"],[146,"/docs/stacks/clarity/functions/is-some"],[147,"/docs/stacks/clarity/functions/is-standard"],[91,"/docs/stacks/clarity/functions/keccak256"],[110,"/docs/stacks/clarity/functions/len"],[114,"/docs/stacks/clarity/functions/less-than"],[176,"/docs/stacks/clarity/functions/less-than-or-equal"],[171,"/docs/stacks/clarity/functions/let"],[82,"/docs/stacks/clarity/functions/list"],[107,"/docs/stacks/clarity/functions/log2"],[105,"/docs/stacks/clarity/functions/map"],[89,"/docs/stacks/clarity/functions/map-delete"],[172,"/docs/stacks/clarity/functions/map-get"],[167,"/docs/stacks/clarity/functions/map-insert"],[132,"/docs/stacks/clarity/functions/map-set"],[170,"/docs/stacks/clarity/functions/match"],[189,"/docs/stacks/clarity/functions/merge"],[197,"/docs/stacks/clarity/functions/mod"],[102,"/docs/stacks/clarity/functions/multiply"],[135,"/docs/stacks/clarity/functions/nft-burn"],[195,"/docs/stacks/clarity/functions/nft-get-owner"],[186,"/docs/stacks/clarity/functions/nft-mint"],[101,"/docs/stacks/clarity/functions/nft-transfer"],[155,"/docs/stacks/clarity/functions/not"],[121,"/docs/stacks/clarity/functions/ok"],[165,"/docs/stacks/clarity/functions/or"],[185,"/docs/stacks/clarity/functions/pow"],[200,"/docs/stacks/clarity/functions/principal-construct"],[141,"/docs/stacks/clarity/functions/principal-destruct"],[94,"/docs/stacks/clarity/functions/principal-of"],[199,"/docs/stacks/clarity/functions/print"],[109,"/docs/stacks/clarity/functions/replace-at"],[162,"/docs/stacks/clarity/functions/secp256k1-recover"],[169,"/docs/stacks/clarity/functions/secp256k1-verify"],[84,"/docs/stacks/clarity/functions/sha256"],[181,"/docs/stacks/clarity/functions/sha512"],[111,"/docs/stacks/clarity/functions/sha512-256"],[194,"/docs/stacks/clarity/functions/slice"],[168,"/docs/stacks/clarity/functions/some"],[106,"/docs/stacks/clarity/functions/sqrti"],[138,"/docs/stacks/clarity/functions/string-to-int"],[157,"/docs/stacks/clarity/functions/string-to-uint"],[98,"/docs/stacks/clarity/functions/stx-account"],[143,"/docs/stacks/clarity/functions/stx-burn"],[198,"/docs/stacks/clarity/functions/stx-get-balance"],[150,"/docs/stacks/clarity/functions/stx-transfer"],[184,"/docs/stacks/clarity/functions/stx-transfer-memo"],[140,"/docs/stacks/clarity/functions/subtract"],[142,"/docs/stacks/clarity/functions/to-consensus-buff"],[153,"/docs/stacks/clarity/functions/to-int"],[118,"/docs/stacks/clarity/functions/to-uint"],[166,"/docs/stacks/clarity/functions/try"],[83,"/docs/stacks/clarity/functions/tuple"],[85,"/docs/stacks/clarity/functions/unwrap"],[159,"/docs/stacks/clarity/functions/unwrap-err"],[148,"/docs/stacks/clarity/functions/unwrap-err-panic"],[151,"/docs/stacks/clarity/functions/unwrap-panic"],[117,"/docs/stacks/clarity/functions/use-trait"],[131,"/docs/stacks/clarity/functions/var-get"],[175,"/docs/stacks/clarity/functions/var-set"],[93,"/docs/stacks/clarity/functions/xor"],[201,"/docs/stacks/clarity/handling-optionals-and-errors"],[79,"/docs/stacks/clarity/optimizations"],[202,"/docs/stacks/clarity/time-and-blocks"],[350,"/docs/stacks/connect"],[352,"/docs/stacks/connect/examples/authenticate-users"],[353,"/docs/stacks/connect/examples/broadcast-transactions"],[355,"/docs/stacks/connect/examples/migration"],[354,"/docs/stacks/connect/examples/sign-messages"],[356,"/docs/stacks/connect/packages/connect"],[357,"/docs/stacks/connect/quickstart"],[351,"/docs/stacks/connect/support"],[1,"/docs/stacks/contributors-guide"],[74,"/docs/stacks/explorer"],[75,"/docs/stacks/explorer/guides/build-explorer"],[2,"/docs/stacks/get-started"],[73,"/docs/stacks/hacks"],[70,"/docs/stacks/hacks/archive/ai"],[68,"/docs/stacks/hacks/archive/build-a-custom-api"],[69,"/docs/stacks/hacks/archive/build-a-decentralized-grants-program"],[71,"/docs/stacks/hacks/archive/build-a-friend-tech-clone"],[72,"/docs/stacks/hacks/recipes"],[245,"/docs/stacks/integration-testing"],[246,"/docs/stacks/migration-guide"],[219,"/docs/stacks/nakamoto"],[221,"/docs/stacks/nakamoto/guides/clarinet"],[220,"/docs/stacks/nakamoto/guides/explorer"],[222,"/docs/stacks/nakamoto/guides/stacks-api"],[223,"/docs/stacks/nakamoto/guides/stacks-js"],[45,"/docs/stacks/platform"],[31,"/docs/stacks/platform-api"],[40,"/docs/stacks/platform-api/chainhooks"],[38,"/docs/stacks/platform-api/chainhooks/create"],[42,"/docs/stacks/platform-api/chainhooks/delete"],[39,"/docs/stacks/platform-api/chainhooks/get"],[37,"/docs/stacks/platform-api/chainhooks/list"],[43,"/docs/stacks/platform-api/chainhooks/status"],[41,"/docs/stacks/platform-api/chainhooks/update"],[33,"/docs/stacks/platform-api/devnet"],[32,"/docs/stacks/platform-api/devnet/bitcoin-node"],[36,"/docs/stacks/platform-api/devnet/stacks-blockchain-api"],[35,"/docs/stacks/platform-api/devnet/start"],[34,"/docs/stacks/platform-api/devnet/stop"],[48,"/docs/stacks/platform/examples/archive-project"],[51,"/docs/stacks/platform/examples/contract-monitoring"],[52,"/docs/stacks/platform/examples/create-chainhooks"],[47,"/docs/stacks/platform/examples/create-project"],[46,"/docs/stacks/platform/examples/deploy-contracts"],[50,"/docs/stacks/platform/examples/devnet"],[49,"/docs/stacks/platform/examples/faucet"],[53,"/docs/stacks/platform/quickstart"],[381,"/docs/stacks/quickstarts"],[384,"/docs/stacks/quickstarts/app-templates"],[386,"/docs/stacks/quickstarts/contract-templates"],[382,"/docs/stacks/quickstarts/event-streaming"],[385,"/docs/stacks/quickstarts/nft-minting"],[387,"/docs/stacks/quickstarts/token-transfers"],[383,"/docs/stacks/quickstarts/wallet-integration"],[3,"/docs/stacks/rate-limiting"],[11,"/docs/stacks/reference"],[362,"/docs/stacks/reference/clarinet-js-sdk/clarinet-sdk"],[360,"/docs/stacks/reference/clarinet-js-sdk/custom-matchers"],[361,"/docs/stacks/reference/clarinet-js-sdk/methods"],[359,"/docs/stacks/reference/clarinet-js-sdk/properties"],[358,"/docs/stacks/reference/clarinet-js-sdk/simnet"],[363,"/docs/stacks/reference/cli/clarinet"],[364,"/docs/stacks/reference/cli/stacks-js"],[365,"/docs/stacks/reference/stacks-blockchain-api/client"],[370,"/docs/stacks/reference/stacks.js/common"],[366,"/docs/stacks/reference/stacks.js/connect"],[369,"/docs/stacks/reference/stacks.js/network"],[367,"/docs/stacks/reference/stacks.js/sbtc"],[368,"/docs/stacks/reference/stacks.js/transactions"],[399,"/docs/stacks/rpc-api"],[404,"/docs/stacks/rpc-api/accounts"],[405,"/docs/stacks/rpc-api/accounts/info"],[388,"/docs/stacks/rpc-api/blocks"],[389,"/docs/stacks/rpc-api/blocks/block-proposal"],[417,"/docs/stacks/rpc-api/burn-ops"],[418,"/docs/stacks/rpc-api/burn-ops/get-burn-operations"],[397,"/docs/stacks/rpc-api/fees"],[396,"/docs/stacks/rpc-api/fees/estimate"],[398,"/docs/stacks/rpc-api/fees/transfer-estimate"],[400,"/docs/stacks/rpc-api/info"],[401,"/docs/stacks/rpc-api/info/core-api"],[394,"/docs/stacks/rpc-api/names"],[395,"/docs/stacks/rpc-api/names/name-price"],[393,"/docs/stacks/rpc-api/names/namespace-price"],[390,"/docs/stacks/rpc-api/pox"],[392,"/docs/stacks/rpc-api/pox/pox-details"],[391,"/docs/stacks/rpc-api/pox/stacker-set"],[412,"/docs/stacks/rpc-api/smart-contracts"],[416,"/docs/stacks/rpc-api/smart-contracts/constants"],[410,"/docs/stacks/rpc-api/smart-contracts/interface"],[413,"/docs/stacks/rpc-api/smart-contracts/map-entry"],[414,"/docs/stacks/rpc-api/smart-contracts/read-only"],[415,"/docs/stacks/rpc-api/smart-contracts/source"],[411,"/docs/stacks/rpc-api/smart-contracts/traits"],[403,"/docs/stacks/rpc-api/transactions"],[402,"/docs/stacks/rpc-api/transactions/broadcast-transaction"],[406,"/docs/stacks/rpc-api/v3"],[408,"/docs/stacks/rpc-api/v3/nakamoto-block"],[409,"/docs/stacks/rpc-api/v3/tenure-blocks"],[407,"/docs/stacks/rpc-api/v3/tenure-metadata"],[347,"/docs/stacks/setup"],[208,"/docs/stacks/signer-metrics-api"],[217,"/docs/stacks/signer-metrics-api/block-proposals"],[216,"/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-a-block"],[218,"/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals"],[205,"/docs/stacks/signer-metrics-api/blocks"],[206,"/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block"],[207,"/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks"],[209,"/docs/stacks/signer-metrics-api/info"],[210,"/docs/stacks/signer-metrics-api/info/status"],[211,"/docs/stacks/signer-metrics-api/prometheus"],[212,"/docs/stacks/signer-metrics-api/prometheus/metrics"],[213,"/docs/stacks/signer-metrics-api/signers"],[214,"/docs/stacks/signer-metrics-api/signers/pox-cycle-signer"],[215,"/docs/stacks/signer-metrics-api/signers/pox-cycle-signers"],[225,"/docs/stacks/smart-contract-development"],[228,"/docs/stacks/stacks.js"],[240,"/docs/stacks/stacks.js/concepts/accounts-and-addresses"],[242,"/docs/stacks/stacks.js/concepts/broadcasting"],[241,"/docs/stacks/stacks.js/concepts/networks"],[238,"/docs/stacks/stacks.js/concepts/post-conditions"],[239,"/docs/stacks/stacks.js/concepts/private-keys"],[237,"/docs/stacks/stacks.js/concepts/transactions"],[230,"/docs/stacks/stacks.js/examples/broadcast-transactions"],[231,"/docs/stacks/stacks.js/examples/post-conditions"],[232,"/docs/stacks/stacks.js/examples/use-with-react-native"],[244,"/docs/stacks/stacks.js/installation"],[236,"/docs/stacks/stacks.js/packages/common"],[235,"/docs/stacks/stacks.js/packages/network"],[233,"/docs/stacks/stacks.js/packages/sbtc"],[234,"/docs/stacks/stacks.js/packages/transactions"],[243,"/docs/stacks/stacks.js/quickstart"],[229,"/docs/stacks/stacks.js/roadmap"],[227,"/docs/stacks/stacks.js/v6/network"],[226,"/docs/stacks/stacks.js/v6/transactions"],[12,"/docs/stacks/testing-best-practices"],[348,"/docs/stacks/testing-environments"],[204,"/docs/stacks/token-development"],[54,"/docs/stacks/token-metadata-api"],[55,"/docs/stacks/token-metadata-api/architecture"],[64,"/docs/stacks/token-metadata-api/client"],[65,"/docs/stacks/token-metadata-api/client/quickstart"],[66,"/docs/stacks/token-metadata-api/client/tokens"],[67,"/docs/stacks/token-metadata-api/client/tokens/get-ft-metadata"],[56,"/docs/stacks/token-metadata-api/info"],[57,"/docs/stacks/token-metadata-api/info/status"],[59,"/docs/stacks/token-metadata-api/tokens"],[60,"/docs/stacks/token-metadata-api/tokens/fungible-token-metadata"],[62,"/docs/stacks/token-metadata-api/tokens/fungible-tokens"],[63,"/docs/stacks/token-metadata-api/tokens/non-fungible-token-metadata"],[61,"/docs/stacks/token-metadata-api/tokens/semi-fungible-token-metadata"],[58,"/docs/stacks/token-metadata-api/usage"],[224,"/docs/stacks/unit-testing"],[203,"/docs/stacks/web-app-development"]],"type":"string"},"title":{"docs":{"1":89,"2":317,"3":412,"4":438,"5":399,"6":99,"7":341,"8":363,"9":401,"10":310,"11":426,"12":45,"13":364,"14":499,"15":501,"16":511,"17":500,"18":365,"19":85,"20":18,"21":507,"22":122,"23":451,"24":419,"25":114,"26":101,"27":97,"28":515,"29":94,"30":402,"31":366,"32":53,"33":117,"34":459,"35":452,"36":448,"37":158,"38":92,"39":140,"40":82,"41":491,"42":113,"43":138,"44":294,"45":367,"46":115,"47":95,"48":34,"49":417,"50":504,"51":346,"52":93,"53":403,"54":368,"55":32,"56":303,"57":268,"58":496,"59":477,"60":207,"61":259,"62":210,"63":240,"64":369,"65":404,"66":478,"67":209,"68":70,"69":71,"70":21,"71":73,"72":96,"73":370,"74":371,"75":75,"76":46,"77":43,"78":318,"79":333,"80":98,"81":12,"82":330,"83":485,"84":431,"85":490,"86":87,"87":66,"88":314,"89":334,"90":88,"91":325,"92":104,"93":516,"94":392,"95":287,"96":130,"97":107,"98":463,"99":110,"100":105,"101":355,"102":347,"103":103,"104":288,"105":332,"106":445,"107":331,"108":22,"109":416,"110":326,"111":433,"112":118,"113":47,"114":327,"115":132,"116":137,"117":502,"118":474,"119":112,"120":315,"121":360,"122":108,"123":136,"124":320,"125":134,"126":36,"127":289,"128":52,"129":109,"130":49,"131":509,"132":337,"133":68,"134":111,"135":352,"136":322,"137":17,"138":460,"139":321,"140":468,"141":391,"142":472,"143":464,"144":131,"145":51,"146":323,"147":324,"148":487,"149":31,"150":467,"151":489,"152":301,"153":473,"154":291,"155":358,"156":286,"157":461,"158":69,"159":488,"160":106,"161":38,"162":429,"163":44,"164":121,"165":362,"166":484,"167":336,"168":444,"169":430,"170":338,"171":329,"172":335,"173":319,"174":50,"175":510,"176":328,"177":129,"178":135,"179":67,"180":120,"181":432,"182":84,"183":302,"184":466,"185":386,"186":354,"187":48,"188":293,"189":340,"190":133,"191":292,"192":35,"193":37,"194":440,"195":353,"196":300,"197":345,"198":465,"199":393,"200":390,"201":361,"202":471,"203":514,"204":475,"205":57,"206":19,"207":20,"208":372,"209":304,"210":27,"211":395,"212":396,"213":437,"214":387,"215":388,"216":435,"217":55,"218":436,"219":373,"220":494,"221":492,"222":493,"223":495,"224":486,"225":441,"226":9,"227":6,"228":374,"229":23,"230":63,"231":102,"232":505,"233":424,"234":10,"235":7,"236":2,"237":481,"238":385,"239":394,"240":14,"241":350,"242":65,"243":405,"244":311,"245":316,"246":343,"247":24,"248":305,"249":269,"250":479,"251":208,"252":260,"253":211,"254":241,"255":384,"256":28,"257":40,"258":357,"259":33,"260":168,"261":247,"262":171,"263":58,"264":174,"265":170,"266":167,"267":173,"268":169,"269":172,"270":159,"271":232,"272":233,"273":348,"274":234,"275":235,"276":160,"277":230,"278":212,"279":205,"280":127,"281":249,"282":447,"283":248,"284":251,"285":250,"286":274,"287":244,"288":397,"289":261,"290":243,"291":262,"292":264,"293":428,"294":427,"295":272,"296":139,"297":188,"298":271,"299":306,"300":275,"301":161,"302":273,"303":155,"304":204,"305":278,"306":267,"307":482,"308":281,"309":199,"310":277,"311":198,"312":252,"313":226,"314":280,"315":246,"316":265,"317":446,"318":126,"319":462,"320":146,"321":285,"322":145,"323":237,"324":141,"325":144,"326":270,"327":143,"328":215,"329":190,"330":195,"331":442,"332":191,"333":196,"334":339,"335":279,"336":185,"337":79,"338":186,"339":480,"340":206,"341":356,"342":239,"343":242,"344":238,"345":290,"346":418,"347":116,"348":470,"349":56,"350":375,"351":513,"352":39,"353":64,"354":434,"355":344,"356":4,"357":406,"358":439,"359":400,"360":100,"361":342,"362":0,"363":83,"364":450,"365":1,"366":5,"367":425,"368":11,"369":8,"370":3,"371":54,"372":449,"373":376,"374":421,"375":415,"376":420,"377":359,"378":407,"379":389,"380":312,"381":410,"382":125,"383":512,"384":30,"385":351,"386":86,"387":476,"388":59,"389":508,"390":398,"391":263,"392":245,"393":236,"394":349,"395":231,"396":166,"397":128,"398":282,"399":377,"400":307,"401":197,"402":62,"403":483,"404":13,"405":142,"406":506,"407":229,"408":227,"409":228,"410":192,"411":276,"412":443,"413":193,"414":81,"415":194,"416":189,"417":80,"418":187,"419":90,"420":266,"421":413,"422":378,"423":408,"424":313,"425":379,"426":77,"427":380,"428":455,"429":164,"430":153,"431":41,"432":213,"433":253,"434":15,"435":149,"436":151,"437":147,"438":156,"439":497,"440":123,"441":202,"442":200,"443":381,"444":78,"445":453,"446":220,"447":181,"448":60,"449":177,"450":179,"451":183,"452":175,"453":308,"454":222,"455":224,"456":218,"457":283,"458":216,"459":382,"460":456,"461":162,"462":498,"463":422,"464":257,"465":255,"466":295,"467":25,"468":457,"469":165,"470":154,"471":42,"472":214,"473":254,"474":16,"475":150,"476":152,"477":148,"478":157,"479":124,"480":203,"481":201,"482":454,"483":221,"484":182,"485":61,"486":178,"487":180,"488":184,"489":176,"490":309,"491":223,"492":225,"493":219,"494":284,"495":217,"496":458,"497":163,"498":423,"499":258,"500":256,"501":29,"502":383,"503":469,"504":409,"505":411,"506":91,"507":414,"508":296,"509":299,"510":297,"511":72,"512":26,"513":76,"514":503,"515":298,"516":74,"517":119},"orderedDocs":[[362,"@hirosystems/clarinet-sdk"],[365,"@stacks/blockchain-api-client"],[236,"@stacks/common"],[370,"@stacks/common"],[356,"@stacks/connect"],[366,"@stacks/connect"],[227,"@stacks/network"],[235,"@stacks/network"],[369,"@stacks/network"],[226,"@stacks/transactions"],[234,"@stacks/transactions"],[368,"@stacks/transactions"],[81,"Access control"],[404,"Accounts"],[240,"Accounts & Addresses"],[434,"Activities"],[474,"Activities"],[137,"add"],[20,"Add a contract"],[206,"Aggregated signer information for a block"],[207,"Aggregated signer information for most recent blocks"],[70,"AI x Stacks"],[108,"and"],[229,"Announcing Stacks.js v7"],[247,"API keys"],[467,"API keys"],[512,"API keys"],[210,"API Status"],[256,"APIs"],[501,"APIs"],[384,"App templates"],[149,"append"],[55,"Architecture"],[259,"Architecture"],[48,"Archive a project"],[192,"as-contract"],[126,"as-max-len?"],[193,"asserts!"],[161,"at-block"],[352,"Authenticate users"],[257,"Authentication"],[431,"Balances"],[471,"Balances"],[77,"Basic arithmetic"],[163,"begin"],[12,"Best practices"],[76,"Bit manipulation"],[113,"bit-and"],[187,"bit-not"],[130,"bit-or"],[174,"bit-shift-left"],[145,"bit-shift-right"],[128,"bit-xor"],[32,"Bitcoin node"],[371,"Bitcoin Scopes"],[217,"Block proposals"],[349,"Blockchain development"],[205,"Blocks"],[263,"Blocks"],[388,"Blocks"],[448,"BRC-20"],[485,"BRC-20"],[402,"Broadcast transaction"],[230,"Broadcast transactions"],[353,"Broadcast transactions"],[242,"Broadcasting"],[87,"buff-to-int-be"],[179,"buff-to-int-le"],[133,"buff-to-uint-be"],[158,"buff-to-uint-le"],[68,"Build a custom blockchain API"],[69,"Build a decentralized grants program"],[511,"Build a decentralized Kickstarter"],[71,"Build a Friend.tech clone"],[516,"Build a no-loss lottery pool"],[75,"Build a Stacks Explorer"],[513,"Build an NFT marketplace"],[426,"Build Ordinals Explorer"],[444,"Build Ordinals Explorer"],[337,"Burn blocks"],[417,"Burn operations"],[414,"Call read-only function"],[40,"Chainhooks"],[363,"Clarinet CLI"],[182,"concat"],[19,"Concepts"],[386,"Contract templates"],[86,"contract-call?"],[90,"contract-of"],[1,"Contributors guide"],[419,"Contributors guide"],[506,"Contributors guide"],[38,"Create a chainhook"],[52,"Create a chainhook"],[29,"Create a new project"],[47,"Create a project"],[72,"Create a recipe for the Hiro Cookbook"],[27,"Create deployment plans"],[80,"Cryptographic functions"],[6,"Custom Matchers"],[360,"Custom Matchers"],[26,"Debug a contract"],[231,"Deep dive into post-conditions"],[103,"default-to"],[92,"define-constant"],[100,"define-data-var"],[160,"define-fungible-token"],[97,"define-map"],[122,"define-non-fungible-token"],[129,"define-private"],[99,"define-public"],[134,"define-read-only"],[119,"define-trait"],[42,"Delete a chainhook"],[25,"Deploy a contract"],[46,"Deploy contracts"],[347,"Developer environment setup"],[33,"Devnet"],[112,"divide"],[517,"DocsKit"],[180,"element-at?"],[164,"err"],[22,"Estimating contract costs"],[440,"Etchings"],[479,"Etchings"],[382,"Event streaming"],[318,"Faucets"],[280,"Fees"],[397,"Fees"],[177,"filter"],[96,"fold"],[144,"from-consensus-buff?"],[115,"ft-burn?"],[190,"ft-get-balance"],[125,"ft-get-supply"],[178,"ft-mint?"],[123,"ft-transfer?"],[116,"get"],[43,"Get a chainhook status"],[296,"Get a given network's target block time"],[39,"Get a specific chainhook"],[324,"Get account assets"],[405,"Get account info"],[327,"Get account STX balance"],[325,"Get account transaction with transfers"],[322,"Get account transactions"],[320,"Get account transactions with transfers"],[437,"Get activity for a block"],[477,"Get activity for a block"],[435,"Get activity for a transaction"],[475,"Get activity for a transaction"],[436,"Get activity for an address"],[476,"Get activity for an address"],[430,"Get address balances"],[470,"Get address balances"],[303,"Get address transactions"],[438,"Get all activity"],[478,"Get all activity"],[37,"Get all chainhooks"],[270,"Get all names"],[276,"Get all namespaces"],[301,"Get API status"],[461,"Get API status"],[497,"Get API status"],[429,"Get API Status"],[469,"Get API Status"],[396,"Get approximate fees for the given transaction"],[266,"Get average block times"],[260,"Get block"],[268,"Get block by burnchain block hash"],[265,"Get block by burnchain block height"],[262,"Get block by hash"],[269,"Get block by height"],[267,"Get blocks"],[264,"Get blocks by burn block"],[452,"Get BRC-20 activity"],[489,"Get BRC-20 activity"],[449,"Get BRC-20 balances"],[486,"Get BRC-20 balances"],[450,"Get BRC-20 token details"],[487,"Get BRC-20 token details"],[447,"Get BRC-20 token holders"],[484,"Get BRC-20 token holders"],[451,"Get BRC-20 tokens"],[488,"Get BRC-20 tokens"],[336,"Get burn block"],[338,"Get burn blocks"],[418,"Get burn operations"],[297,"Get circulating STX supply in plain text format"],[416,"Get constant value"],[329,"Get contract events"],[332,"Get contract info"],[410,"Get contract interface"],[413,"Get contract map entry"],[415,"Get contract source"],[330,"Get contracts by trait"],[333,"Get contracts status"],[401,"Get core API info"],[311,"Get details for transactions"],[309,"Get dropped mempool transactions"],[442,"Get etching"],[481,"Get etching"],[441,"Get etchings"],[480,"Get etchings"],[304,"Get events for an address transaction"],[279,"Get fee rate"],[340,"Get fungible token holders"],[60,"Get fungible token metadata"],[251,"Get fungible token metadata"],[67,"Get Fungible Token Metadata"],[62,"Get fungible tokens"],[253,"Get fungible tokens"],[278,"Get historical zone file"],[432,"Get holder balance"],[472,"Get holder balance"],[328,"Get inbound STX transfers"],[458,"Get inscription"],[495,"Get inscription"],[456,"Get inscription content"],[493,"Get inscription content"],[446,"Get inscription count per block"],[483,"Get inscription count per block"],[454,"Get inscription transfers"],[491,"Get inscription transfers"],[455,"Get inscriptions"],[492,"Get inscriptions"],[313,"Get mempool transactions"],[408,"Get Nakamoto block"],[409,"Get Nakamoto tenure blocks"],[407,"Get Nakamoto tenure metadata"],[277,"Get name details"],[395,"Get name price"],[271,"Get name subdomains"],[272,"Get name zone file"],[274,"Get names owned by address"],[275,"Get namespace names"],[393,"Get namespace price"],[323,"Get nft events"],[344,"Get non-fungible token history"],[342,"Get non-fungible token holdings"],[63,"Get non-fungible token metadata"],[254,"Get non-fungible token metadata"],[343,"Get non-fungible token mints"],[290,"Get PoX cycle"],[287,"Get PoX cycles"],[392,"Get Proof-of-Transfer details"],[315,"Get raw transaction"],[261,"Get recent blocks"],[283,"Get recent burnchain reward for the given recipient"],[281,"Get recent burnchain reward recipients"],[285,"Get recent reward slot holder entries"],[284,"Get recent reward slot holders"],[312,"Get recent transactions"],[433,"Get rune holders"],[473,"Get rune holders"],[465,"Get satoshi inscriptions"],[500,"Get satoshi inscriptions"],[464,"Get satoshi ordinal"],[499,"Get satoshi ordinal"],[61,"Get semi-fungible token metadata"],[252,"Get semi-fungible token metadata"],[289,"Get signer in PoX cycle"],[291,"Get signers in PoX cycle"],[391,"Get stacker and signer set information"],[292,"Get stackers for signer in PoX cycle"],[316,"Get stacking pool members"],[420,"Get started"],[306,"Get statistics for mempool transactions"],[57,"Get status"],[249,"Get status"],[326,"Get the latest nonce"],[298,"Get the network target block time"],[295,"Get total and unlocked STX supply"],[302,"Get total and unlocked STX supply (legacy)"],[286,"Get total burnchain rewards for the given recipient"],[300,"Get total STX supply in plain text format"],[411,"Get trait implementation details"],[310,"Get transaction"],[305,"Get transaction events"],[335,"Get transaction fee priorities"],[314,"Get transactions by block"],[308,"Get transactions for address"],[398,"Get transfer fee estimate"],[457,"Get transfers per block"],[494,"Get transfers per block"],[321,"Get user balances"],[156,"get-block-info?"],[95,"get-burn-block-info?"],[104,"get-stacks-block-info?"],[127,"get-tenure-info?"],[345,"Getting started"],[154,"greater than"],[191,"greater than or equal"],[188,"hash160"],[44,"Home"],[466,"Home"],[508,"Home"],[510,"How to install Docker"],[515,"How to sync a Bitcoin node"],[509,"How to sync a Stacks node"],[196,"if"],[152,"impl-trait"],[183,"index-of"],[56,"Info"],[209,"Info"],[248,"Info"],[299,"Info"],[400,"Info"],[453,"Inscriptions"],[490,"Inscriptions"],[10,"Installation"],[244,"Installation"],[380,"Installation"],[424,"Installation"],[88,"int-to-ascii"],[120,"int-to-utf8"],[245,"Integration testing"],[2,"Introduction"],[78,"Introduction"],[173,"is-eq"],[124,"is-err"],[139,"is-none"],[136,"is-ok"],[146,"is-some"],[147,"is-standard"],[91,"keccak256"],[110,"len"],[114,"less than"],[176,"less than or equal"],[171,"let"],[82,"list"],[107,"log2"],[105,"map"],[79,"Map functions"],[89,"map-delete"],[172,"map-get?"],[167,"map-insert"],[132,"map-set"],[170,"match"],[334,"Mempool"],[189,"merge"],[7,"Methods"],[361,"Methods"],[246,"Migration guide"],[355,"Migration Guide"],[197,"mod"],[51,"Monitor contracts"],[102,"multiply"],[273,"Names"],[394,"Names"],[241,"Networks"],[385,"NFT minting"],[135,"nft-burn?"],[195,"nft-get-owner?"],[186,"nft-mint?"],[101,"nft-transfer?"],[341,"Non-fungible tokens"],[258,"Nonce handling"],[155,"not"],[377,"Observing contract calls with Chainhook"],[121,"ok"],[201,"Optional values and error handling"],[165,"or"],[8,"Overview"],[13,"Overview"],[18,"Overview"],[31,"Overview"],[45,"Overview"],[54,"Overview"],[64,"Overview"],[73,"Overview"],[74,"Overview"],[208,"Overview"],[219,"Overview"],[228,"Overview"],[350,"Overview"],[373,"Overview"],[399,"Overview"],[422,"Overview"],[425,"Overview"],[427,"Overview"],[443,"Overview"],[459,"Overview"],[502,"Overview"],[255,"Pagination"],[238,"Post-Conditions"],[185,"pow"],[214,"PoX Cycle Signer"],[215,"PoX Cycle Signers"],[379,"Predicate design"],[200,"principal-construct?"],[141,"principal-destruct?"],[94,"principal-of?"],[199,"print"],[239,"Private Keys & Wallets"],[211,"Prometheus Metrics"],[212,"Prometheus Metrics"],[288,"Proof of Transfer"],[390,"Proof of Transfer"],[5,"Properties"],[359,"Properties"],[9,"Quickstart"],[30,"Quickstart"],[53,"Quickstart"],[65,"Quickstart"],[243,"Quickstart"],[357,"Quickstart"],[378,"Quickstart"],[423,"Quickstart"],[504,"Quickstart"],[381,"Quickstarts"],[505,"Quickstarts"],[3,"Rate limiting"],[421,"Rate limiting"],[507,"Rate limiting"],[375,"Register Chainhooks on devnet"],[109,"replace-at?"],[49,"Request testnet STX"],[346,"Requesting proofs"],[24,"Run a local devnet"],[376,"Run Chainhook as a service"],[374,"Run Chainhook as a service with a Stacks node"],[463,"Satoshis"],[498,"Satoshis"],[233,"sbtc"],[367,"sbtc"],[11,"SDKs & Libraries"],[294,"Search"],[293,"Search by ID"],[162,"secp256k1-recover?"],[169,"secp256k1-verify"],[84,"sha256"],[181,"sha512"],[111,"sha512/256"],[354,"Sign messages"],[216,"Signer information for a block"],[218,"Signer information for most recent block proposals"],[213,"Signers"],[4,"Simnet"],[358,"Simnet"],[194,"slice?"],[225,"Smart contract development"],[331,"Smart contracts"],[412,"Smart contracts"],[168,"some"],[106,"sqrti"],[317,"Stacking pool"],[282,"Stacking rewards"],[36,"Stacks Blockchain API"],[372,"Stacks Scopes"],[364,"Stacks.js CLI"],[23,"Start development console"],[35,"Start devnet"],[445,"Statistics"],[482,"Statistics"],[428,"Status"],[460,"Status"],[468,"Status"],[496,"Status"],[34,"Stop devnet"],[138,"string-to-int?"],[157,"string-to-uint?"],[319,"STX Testnet tokens"],[98,"stx-account"],[143,"stx-burn?"],[198,"stx-get-balance"],[184,"stx-transfer-memo?"],[150,"stx-transfer?"],[140,"subtract"],[503,"TBD"],[348,"Testing environments"],[202,"Time-based logic"],[142,"to-consensus-buff?"],[153,"to-int"],[118,"to-uint"],[204,"Token development"],[387,"Token transfers"],[59,"Tokens"],[66,"Tokens"],[250,"Tokens"],[339,"Tokens"],[237,"Transactions"],[307,"Transactions"],[403,"Transactions"],[166,"try!"],[83,"tuple"],[224,"Unit testing"],[148,"unwrap-err-panic"],[159,"unwrap-err!"],[151,"unwrap-panic"],[85,"unwrap!"],[41,"Update a chainhook"],[221,"Updates for Clarinet"],[222,"Updates for Stacks API"],[220,"Updates for Stacks Explorer"],[223,"Updates for Stacks.js"],[58,"Usage"],[439,"Usage"],[462,"Usage"],[14,"Use the Stacks Blockchain API archive"],[17,"Use the Stacks blockchain archive"],[15,"Use the Token Metadata API archive"],[117,"use-trait"],[514,"Using Clarity values"],[50,"Using devnet"],[232,"Using Stacks.js with React Native"],[406,"v3"],[21,"Validate a contract"],[389,"Validate proposed block"],[131,"var-get"],[175,"var-set"],[16,"Verify archive data"],[383,"Wallet integration"],[351,"Wallet Support"],[203,"Web app development"],[28,"Working with sBTC"],[93,"xor"]],"type":"string"},"description":{"docs":{"1":181,"2":155,"3":481,"4":469,"5":455,"6":12,"7":457,"8":454,"9":206,"10":46,"11":459,"12":176,"13":465,"14":105,"15":107,"16":515,"17":106,"18":45,"19":175,"20":43,"21":47,"22":14,"23":174,"24":171,"25":489,"26":447,"27":189,"28":44,"29":232,"30":186,"31":215,"32":244,"33":369,"34":448,"35":446,"36":245,"37":144,"38":80,"39":138,"40":368,"41":488,"42":98,"43":267,"44":0,"45":7,"46":191,"47":190,"48":104,"49":116,"50":451,"51":196,"52":81,"53":83,"54":126,"55":480,"56":372,"57":373,"58":159,"59":376,"60":386,"61":361,"62":351,"63":384,"64":172,"65":84,"66":219,"67":272,"68":178,"69":179,"70":21,"71":180,"72":87,"73":11,"74":120,"75":434,"76":512,"77":18,"78":119,"79":233,"80":19,"81":218,"82":66,"83":511,"84":54,"85":487,"86":118,"87":70,"88":78,"89":255,"90":266,"91":52,"92":92,"93":234,"94":100,"95":127,"96":252,"97":89,"98":246,"99":95,"100":93,"101":474,"102":509,"103":238,"104":128,"105":15,"106":32,"107":31,"108":491,"109":256,"110":157,"111":56,"112":504,"113":498,"114":507,"115":29,"116":257,"117":166,"118":74,"119":97,"120":79,"121":63,"122":91,"123":473,"124":38,"125":268,"126":494,"127":130,"128":503,"129":94,"130":500,"131":269,"132":442,"133":72,"134":96,"135":28,"136":39,"137":490,"138":75,"139":41,"140":510,"141":88,"142":440,"143":30,"144":101,"145":502,"146":42,"147":40,"148":484,"149":492,"150":475,"151":486,"152":164,"153":77,"154":505,"155":217,"156":129,"157":76,"158":73,"159":485,"160":90,"161":496,"162":251,"163":497,"164":65,"165":216,"166":161,"167":167,"168":64,"169":514,"170":160,"171":17,"172":259,"173":50,"174":501,"175":443,"176":508,"177":132,"178":227,"179":71,"180":258,"181":55,"182":57,"183":133,"184":476,"185":33,"186":225,"187":499,"188":53,"189":224,"190":263,"191":506,"192":493,"193":495,"194":123,"195":265,"196":58,"197":34,"198":248,"199":117,"200":62,"201":437,"202":165,"203":27,"204":26,"205":141,"206":140,"207":142,"208":228,"209":441,"210":113,"211":150,"212":151,"213":149,"214":156,"215":137,"216":152,"217":148,"218":153,"219":112,"220":109,"221":103,"222":108,"223":110,"224":214,"225":25,"226":67,"227":229,"228":6,"229":111,"230":82,"231":472,"232":212,"233":9,"234":68,"235":230,"236":48,"237":188,"238":1,"239":194,"240":192,"241":211,"242":177,"243":207,"244":169,"245":213,"246":195,"247":134,"248":374,"249":375,"250":377,"251":387,"252":362,"253":352,"254":385,"255":197,"256":460,"257":16,"258":193,"259":479,"260":310,"261":293,"262":332,"263":162,"264":276,"265":331,"266":329,"267":294,"268":330,"269":333,"270":273,"271":412,"272":427,"273":222,"274":410,"275":286,"276":274,"277":343,"278":406,"279":328,"280":239,"281":291,"282":243,"283":292,"284":299,"285":298,"286":425,"287":289,"288":262,"289":340,"290":339,"291":295,"292":296,"293":438,"294":439,"295":424,"296":421,"297":401,"298":422,"299":363,"300":426,"301":417,"302":423,"303":433,"304":345,"305":346,"306":395,"307":220,"308":432,"309":321,"310":342,"311":338,"312":320,"313":324,"314":429,"315":270,"316":411,"317":264,"318":114,"319":99,"320":430,"321":315,"322":431,"323":275,"324":271,"325":428,"326":408,"327":420,"328":297,"329":278,"330":277,"331":241,"332":341,"333":405,"334":261,"335":344,"336":311,"337":260,"338":290,"339":250,"340":409,"341":249,"342":288,"343":287,"344":407,"345":154,"346":478,"347":444,"348":445,"349":23,"350":8,"351":51,"352":61,"353":237,"354":236,"355":163,"356":59,"357":208,"358":470,"359":456,"360":13,"361":458,"362":466,"363":453,"364":471,"365":173,"366":60,"367":10,"368":69,"369":231,"370":49,"371":253,"372":254,"373":36,"374":200,"375":198,"376":199,"377":209,"378":203,"379":235,"380":37,"381":461,"382":449,"383":170,"384":22,"385":226,"386":24,"387":477,"388":146,"389":513,"390":392,"391":394,"392":393,"393":414,"394":223,"395":413,"396":145,"397":240,"398":327,"399":247,"400":364,"401":365,"402":20,"403":221,"404":139,"405":400,"406":516,"407":131,"408":124,"409":125,"410":279,"411":102,"412":242,"413":314,"414":35,"415":402,"416":158,"417":147,"418":143,"419":182,"420":464,"421":482,"422":435,"423":202,"424":436,"425":121,"426":2,"427":468,"428":370,"429":418,"430":300,"431":357,"432":347,"433":302,"434":355,"435":306,"436":322,"437":304,"438":316,"439":85,"440":359,"441":308,"442":380,"443":122,"444":3,"445":398,"446":396,"447":280,"448":349,"449":336,"450":378,"451":382,"452":334,"453":353,"454":325,"455":284,"456":403,"457":282,"458":312,"459":467,"460":366,"461":415,"462":86,"463":390,"464":388,"465":318,"466":4,"467":135,"468":371,"469":419,"470":301,"471":358,"472":348,"473":303,"474":356,"475":307,"476":323,"477":305,"478":317,"479":360,"480":309,"481":381,"482":399,"483":397,"484":281,"485":350,"486":337,"487":379,"488":383,"489":335,"490":354,"491":326,"492":285,"493":404,"494":283,"495":313,"496":367,"497":416,"498":391,"499":389,"500":319,"501":462,"502":452,"503":450,"504":201,"505":463,"506":183,"507":483,"508":5,"509":205,"510":168,"511":184,"512":136,"513":187,"514":210,"515":204,"516":185,"517":115},"orderedDocs":[[44,""],[238,""],[426,""],[444,""],[466,""],[508,""],[228,"A collection of JavaScript libraries to build web applications on Stacks."],[45,"A developer platform for building, deploying, and scaling Bitcoin apps."],[350,"A JavaScript library for authenticating users as well as signing transactions and messages."],[233,"A JS/TS helper package for interacting with sBTC."],[367,"A JS/TS helper package for interacting with sBTC."],[73,"A series of coding challenges to sharpen your skills."],[6,"A set of Vitest matchers that can be used to make assertions on Clarity values with the Clarinet JS SDK."],[360,"A set of Vitest matchers that can be used to make assertions on Clarity values with the Clarinet JS SDK."],[22,"Analyze execution costs pertaining to your contract."],[105,"Apply a function to each element of a list in Clarity smart contracts."],[257,"Authenticate with the Stacks Blockchain API."],[171,"Bind variables to expressions in Clarity smart contracts."],[77,"Brief overview of arithmetic operations in Clarity and their importance in smart contract development."],[80,"Brief overview of cryptographic functions in Clarity and their importance in smart contract development."],[402,"Broadcasts raw transactions on the network."],[70,"Build something that combines AI capabilities with Stacks."],[384,"Build your app with a template."],[349,"Build your blockchain on Stacks."],[386,"Build your contract with a template."],[225,"Build your smart contracts on Stacks."],[204,"Build your tokens on Stacks."],[203,"Build your web apps on Stacks."],[135,"Burn a non-fungible token (NFT) in Clarity smart contracts."],[115,"Burn fungible tokens in Clarity smart contracts."],[143,"Burn STX from a principal's account in Clarity smart contracts."],[107,"Calculate the base-2 logarithm of a number in Clarity smart contracts."],[106,"Calculate the integer square root of a number in Clarity smart contracts."],[185,"Calculate the power of a number in Clarity smart contracts."],[197,"Calculate the remainder of integer division in Clarity smart contracts."],[414,"Calls a read-only public function on a given smart contract."],[373,"Chainhook enables you to target events on the Bitcoin and Stacks blockchain important to your use case in order to trigger actions based on those events."],[380,"Chainhook is a CLI tool that allows you to create event streams for your Stacks and Bitcoin nodes."],[124,"Check if a response is an error in Clarity smart contracts."],[136,"Check if a response is ok in Clarity smart contracts."],[147,"Check if a value is a standard principal in Clarity smart contracts."],[139,"Check if an optional value is none in Clarity smart contracts."],[146,"Check if an optional value is some in Clarity smart contracts."],[20,"Clarinet can handle adding and configuring a new contract to your project."],[28,"Clarinet helps with building, testing, and deploying contracts that use sBTC."],[18,"Clarinet is a local development environment that offers everything you need to create, test, and deploy smart contracts on Stacks."],[10,"Clarinet JS SDK can be installed using your preferred package manager."],[21,"Clarinet provides syntax and semantics checkers for the smart contract language Clarity."],[236,"Common utilities for working with Stacks."],[370,"Common utilities for working with Stacks."],[173,"Compare values for equality in Clarity smart contracts."],[351,"Compatibility information for different wallet providers"],[91,"Compute the Keccak-256 hash of a buffer in Clarity smart contracts."],[188,"Compute the RIPEMD160(SHA256(x)) hash in Clarity smart contracts."],[84,"Compute the SHA-256 hash of a value in Clarity smart contracts."],[181,"Compute the SHA-512 hash of a value in Clarity smart contracts."],[111,"Compute the SHA-512/256 hash of a value in Clarity smart contracts."],[182,"Concatenate sequences in Clarity smart contracts."],[196,"Conditional evaluation in Clarity smart contracts."],[356,"Connect is a JavaScript library for building web applications connected to Stacks."],[366,"Connect is a JavaScript library for building web applications connected to Stacks."],[352,"Connect to user wallets and authenticate your users using @stacks/connect."],[200,"Construct a principal in Clarity smart contracts."],[121,"Construct a successful response type in Clarity smart contracts."],[168,"Construct an optional type from a value in Clarity smart contracts."],[164,"Construct error responses in Clarity smart contracts."],[82,"Construct lists in Clarity smart contracts."],[226,"Construct, decode transactions and work with Clarity smart contracts on the Stacks blockchain."],[234,"Construct, decode transactions and work with Clarity smart contracts on the Stacks blockchain."],[368,"Construct, decode transactions and work with Clarity smart contracts on the Stacks blockchain."],[87,"Convert a byte buffer to a signed integer using big-endian encoding in Clarity smart contracts."],[179,"Convert a byte buffer to a signed integer using little-endian encoding in Clarity smart contracts."],[133,"Convert a byte buffer to an unsigned integer using big-endian encoding in Clarity smart contracts."],[158,"Convert a byte buffer to an unsigned integer using little-endian encoding in Clarity smart contracts."],[118,"Convert a signed integer to an unsigned integer in Clarity smart contracts."],[138,"Convert a string to an optional integer in Clarity smart contracts."],[157,"Convert a string to an optional unsigned integer in Clarity smart contracts."],[153,"Convert an unsigned integer to a signed integer in Clarity smart contracts."],[88,"Convert integers to ASCII string representations in Clarity smart contracts."],[120,"Convert integers to UTF-8 string representations in Clarity smart contracts."],[38,"Create a chainhook through the Hiro Platform."],[52,"Create a chainhook using the Hiro Platform."],[230,"Create and broadcast transactions to the Stacks blockchain network using Stacks.js."],[53,"Create and deploy your first app in the Hiro Platform."],[65,"Create your first project in less than 2 minutes"],[439,"Create your first project in less than 2 minutes"],[462,"Create your first project in less than 2 minutes"],[72,"Create your own recipe for the Hiro Cookbook and share it with the community."],[141,"Decompose a principal into its components in Clarity smart contracts."],[97,"Define a data map in Clarity smart contracts."],[160,"Define a new fungible token in Clarity smart contracts."],[122,"Define a new non-fungible token class in Clarity smart contracts."],[92,"Define immutable constants in Clarity smart contracts."],[100,"Define mutable variables in Clarity smart contracts."],[129,"Define private functions in Clarity smart contracts."],[99,"Define public functions in Clarity smart contracts."],[134,"Define public read-only functions in Clarity smart contracts."],[119,"Define traits for interface-like behavior in Clarity smart contracts."],[42,"Delete a chainhook through the Hiro Platform."],[319,"Delivers testnet STX tokens to a specified address."],[94,"Derive a principal from a public key in Clarity smart contracts."],[144,"Deserialize a buffer into a Clarity value in Clarity smart contracts."],[411,"Determine whether or not a specified trait is implemented (either explicitly or implicitly) within a given contract."],[221,"Discover Clarinet upgrades related to the Nakamoto release."],[48,"Discover how to archive your projects in the Hiro Platform."],[14,"Discover how to use the Hiro Archive to spin up a Stacks Blockchain API."],[17,"Discover how to use the Hiro Archive to spin up a Stacks node."],[15,"Discover how to use the Hiro Archive to spin up a Token Metadata API."],[222,"Discover Stacks Blockchain API updates related to the Nakamoto upgrade."],[220,"Discover Stacks Explorer updates related to the Nakamoto upgrade."],[223,"Discover Stacks.js changes related to the Nakamoto upgrade."],[229,"Discover the future of Stacks.js."],[219,"Discover updates to Hiro tools related to the Nakamoto upgrade."],[210,"Displays the status of the API and its current workload."],[318,"Distribute testnet tokens to specified addresses."],[517,"DocsKit usage"],[49,"Easily request testnet STX, so you can deploy and interact with Stacks testnet."],[199,"Evaluate and printing expressions in Clarity smart contracts."],[86,"Execute public functions in other smart contracts from within a Clarity smart contract."],[78,"Explore and master Clarity's built-in functions for smart contract development."],[74,"Explore and verify data on the Stacks blockchain."],[425,"Explore and verify ordinals and BRC-20 data on Bitcoin."],[443,"Explore and verify ordinals and BRC-20 data on Bitcoin."],[194,"Extract a sub-sequence from a sequence in Clarity smart contracts."],[408,"Fetch a Nakamoto block by its index block hash."],[409,"Fetch a sequence of Nakamoto blocks in a tenure."],[54,"Fetch data for any fungible, non-fungible, and semi-fungible token on Stacks."],[95,"Fetch information about burnchain blocks in Clarity smart contracts."],[104,"Fetch information about Stacks blocks in Clarity smart contracts."],[156,"Fetch information about Stacks blocks in Clarity smart contracts."],[127,"Fetch information about Stacks tenures in Clarity smart contracts."],[407,"Fetch metadata about the ongoing Nakamoto tenure."],[177,"Filter elements from a list based on a predicate function in Clarity smart contracts."],[183,"Find the index of an element in a list in Clarity smart contracts."],[247,"For developers who need API requests beyond the standard rate limits."],[467,"For developers who need API requests beyond the standard rate limits."],[512,"For developers who need API requests beyond the standard rate limits."],[215,"Get a list of signers in a given PoX cycle."],[39,"Get a specific chainhook through the Hiro Platform."],[404,"Get account information."],[206,"Get aggregated signer information for a specific block."],[205,"Get aggregated signer information for blocks."],[207,"Get aggregated signer information for most recent blocks."],[418,"Get all burn operations of type `op_type` successfully read at `burn_height`."],[37,"Get all of your chainhooks through the Hiro Platform."],[396,"Get an estimated fee for the supplied transaction."],[388,"Get block proposal information."],[417,"Get burn operations of type `op_type` successfully read at `burn_height`."],[217,"Get information about block proposals."],[213,"Get information about signers on the Stacks blockchain."],[211,"Get Prometheus metrics for the Signer Metrics API."],[212,"Get Prometheus metrics for the Signer Metrics API."],[216,"Get signer information for a specific block."],[218,"Get signer information for most recent block proposals."],[345,"Get started with Hiro APIs."],[2,"Get started with the Stacks ecosystem."],[214,"Get stats for a specific signer in a given PoX cycle."],[110,"Get the length of a sequence in Clarity smart contracts."],[416,"Get the value of a constant inside a contract."],[58,"Go over the multiple ways to make requests to the Token Metadata API."],[170,"Handle different branches or cases in Clarity smart contracts."],[166,"Handle errors in Clarity smart contracts using the `try!` function."],[263,"Handle the retrieval and management of block data using various identifiers."],[355,"How to migrate from v7.x.x to v8.x.x of @stacks/connect"],[152,"Implement traits in Clarity smart contracts."],[202,"Implementing time-based logic with block info functions in Clarity."],[117,"Import and use traits from other contracts in Clarity smart contracts."],[167,"Insert an entry into a map in Clarity smart contracts."],[510,"Install Docker to run a local devnet."],[244,"Installing Stacks.js packages."],[383,"Integrate with a wallet."],[24,"Integrate your contracts with a local development environment."],[64,"Interact with the Stacks blockchain using a Javascript client library."],[365,"Interact with the Stacks blockchain using a JavaScript client library."],[23,"Launch the Clarinet console for interactive development."],[19,"Learn about the concepts behind Clarinet."],[12,"Learn best practices for writing and running tests for your Clarity smart contracts using the Clarinet JS SDK and Vitest."],[242,"Learn how to broadcast transactions to the Stacks network."],[68,"Learn how to build a custom API with Chainhook."],[69,"Learn how to build a decentralized grants program with governance, submissions, and voting."],[71,"Learn how to build a decentralized social network."],[1,"Learn how to contribute to Hiro's documentation and content."],[419,"Learn how to contribute to Hiro's documentation and content."],[506,"Learn how to contribute to Hiro's documentation and content."],[511,"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party."],[516,"Learn how to create a no-loss lottery pool that leverages stacking yield."],[30,"Learn how to create a simple counter contract using Clarinet."],[513,"Learn how to create an NFT marketplace that allows users to list NFTs for sale and purchase them using Clarity."],[237,"Learn how to create and broadcast transactions with Stacks.js."],[27,"Learn how to create deployment plans."],[47,"Learn how to create or import a project in the Hiro Platform."],[46,"Learn how to deploy contracts in the Hiro Platform."],[240,"Learn how to get an address from an account."],[258,"Learn how to handle nonces on Stacks."],[239,"Learn how to manage secrets with Stacks.js."],[246,"Learn how to migrate your existing Clarinet projects to the Clarinet SDK."],[51,"Learn how to monitor your contract with custom alerts after you deploy to mainnet."],[255,"Learn how to paginate through lists."],[375,"Learn how to register chainhooks on devnet."],[376,"Learn how to run Chainhook as a service to evaluate your \"if this, then that\" predicates against the Bitcoin and Stacks blockchains."],[374,"Learn how to run Chainhook as a service with a Stacks node to evaluate Stacks blocks against your predicates."],[504,"Learn how to scan the Bitcoin blockchain for Ordinals activity."],[423,"Learn how to scan the Bitcoin blockchain for Runes activity."],[378,"Learn how to scan the Stacks blockchain for STX transactions."],[515,"Learn how to sync a Bitcoin node for building Bitcoin applications."],[509,"Learn how to sync a Stacks node for running a local devnet or mainnet."],[9,"Learn how to test a simple counter contract using the Clarinet JS SDK."],[243,"Learn how to transfer STX tokens using Stacks.js."],[357,"Learn how to transfer STX tokens via a web wallet using Stacks Connect."],[377,"Learn how to use Chainhook to observe a function call for a voting contract."],[514,"Learn how to use Clarity values in your Clarity smart contracts."],[241,"Learn how to use different networks."],[232,"Learn how to use Stacks.js with React Native."],[245,"Learn how to write and run integration tests for your Clarity smart contracts using the Clarinet JS SDK and Vitest."],[224,"Learn how to write and run unit tests for your Clarity smart contracts using the Clarinet JS SDK and Vitest."],[31,"Leverage programmatic API access in order to seamlessly interact with devnet and manage chainhooks."],[165,"Logical disjunction in Clarity smart contracts."],[155,"Logical negation in Clarity smart contracts."],[81,"Manage permissions and access control with principal functions."],[66,"Manage token metadata, including token IDs, token URIs, and token traits."],[307,"Manage, retrieve, and broadcast transaction data on the blockchain."],[403,"Manage, retrieve, and broadcast transaction data on the blockchain."],[273,"Manages and retrieve information on blockchain namespaces, names, and related details."],[394,"Manages and retrieve information on blockchain namespaces, names, and related details."],[189,"Merge tuples in Clarity smart contracts."],[186,"Mint a non-fungible token (NFT) in Clarity smart contracts."],[385,"Mint an NFT."],[178,"Mint new fungible tokens in Clarity smart contracts."],[208,"Monitor and analyze signer behavior on the Stacks network."],[227,"Network and API library for working with Stacks blockchain nodes."],[235,"Network and API library for working with Stacks blockchain nodes."],[369,"Network and API library for working with Stacks blockchain nodes."],[29,"Once you install Clarinet, you can use Clarinet to create a new project."],[79,"Optimizing storage and retrieval with map functions in Clarity."],[93,"Perform a bitwise exclusive OR operation in Clarity smart contracts."],[379,"Predicates are the building blocks of Chainhook."],[354,"Prompt users to sign a message to prove they control an address or authorize an in-app action."],[353,"Prompt users to sign transactions and broadcast them to the Stacks blockchain."],[103,"Provide a default value for optional types in Clarity smart contracts."],[280,"Provide estimates, rates, and approximate calculations for transaction costs."],[397,"Provide estimates, rates, and approximate calculations for transaction costs."],[331,"Provide information and facilitate interactions with smart contracts."],[412,"Provide information and facilitate interactions with smart contracts."],[282,"Provides information on recent rewards, recipients, and total earned amounts."],[32,"Proxy for the Bitcoin node on a development network (devnet)."],[36,"Proxy for the Stacks Blockchain API on a development network (devnet)."],[98,"Query STX account information in Clarity smart contracts."],[399,"Query the Stacks Node RPC API, interact with smart contracts, and broadcast transactions all via a familiar REST interface."],[198,"Query the STX balance of a principal in Clarity smart contracts."],[341,"Read-only endpoints to obtain non-fungible token details."],[339,"Read-only endpoints to obtain token details."],[162,"Recover the public key from a message hash and signature in Clarity smart contracts."],[96,"Reduce a sequence to a single value in Clarity smart contracts."],[371,"Reference guide for available scopes for Bitcoin."],[372,"Reference guide for available scopes for Stacks."],[89,"Remove an entry from a map in Clarity smart contracts."],[109,"Replace an element at a specific index in a sequence in Clarity smart contracts."],[116,"Retrieve a value from a tuple in Clarity smart contracts."],[180,"Retrieve an element from a list at a specific index in Clarity smart contracts."],[172,"Retrieve an entry from a map in Clarity smart contracts."],[337,"Retrieve information about specific burned blocks."],[334,"Retrieve information around transaction fees and priorities in the mempool."],[288,"Retrieve information on PoX cycles, signers, and stackers."],[190,"Retrieve the balance of a fungible token for a principal in Clarity smart contracts."],[317,"Retrieve the list of stacking pool members for a given delegator principal."],[195,"Retrieve the owner of a non-fungible token (NFT) in Clarity smart contracts."],[90,"Retrieve the principal of a contract implementing a trait in Clarity smart contracts."],[43,"Retrieve the status of a specific chainhook through the Hiro Platform."],[125,"Retrieve the total supply of a fungible token in Clarity smart contracts."],[131,"Retrieve the value of a data variable in Clarity smart contracts."],[315,"Retrieves a hex encoded serialized transaction for a given ID."],[324,"Retrieves a list of all asset events associated with an account or a contract identifier."],[67,"Retrieves a list of all assets events associated with an account or a Contract Identifier."],[270,"Retrieves a list of all names known to the node."],[276,"Retrieves a list of all namespaces known to the node."],[323,"Retrieves a list of all nft events associated with an account or a contract identifier."],[264,"Retrieves a list of blocks confirmed by a specific burn block."],[330,"Retrieves a list of contracts based on the following traits listed in JSON format - functions, variables, maps, fungible tokens and non-fungible tokens."],[329,"Retrieves a list of events that have been triggered by a given smart contract."],[410,"Retrieves a list of functions, variables, maps, fungible tokens and non-fungible tokens for a given smart contract."],[447,"Retrieves a list of holders and their balances for a particular BRC-20 token."],[484,"Retrieves a list of holders and their balances for a particular BRC-20 token."],[457,"Retrieves a list of inscription transfers that ocurred at a specific Bitcoin block."],[494,"Retrieves a list of inscription transfers that ocurred at a specific Bitcoin block."],[455,"Retrieves a list of inscriptions with options to filter and sort results."],[492,"Retrieves a list of inscriptions with options to filter and sort results."],[275,"Retrieves a list of names within a given namespace."],[343,"Retrieves a list of non-fungible token mints for a given asset identifier."],[342,"Retrieves a list of non-fungible tokens owned by the given principal (STX address or smart contract ID)."],[287,"Retrieves a list of PoX cycles."],[338,"Retrieves a list of recent burn blocks."],[281,"Retrieves a list of recent burnchain (e.g. Bitcoin) reward recipients with the associated amounts and block info."],[283,"Retrieves a list of recent burnchain (e.g. Bitcoin) rewards for the given recipient with the associated amounts and block info."],[261,"Retrieves a list of recently mined blocks."],[267,"Retrieves a list of recently mined blocks."],[291,"Retrieves a list of signers in a PoX cycle."],[292,"Retrieves a list of stackers for a signer in a PoX cycle."],[328,"Retrieves a list of STX transfers with memos to the given principal."],[285,"Retrieves a list of the Bitcoin addresses that would validly receive Proof-of-Transfer commitments for a given reward slot holder recipient address."],[284,"Retrieves a list of the Bitcoin addresses that would validly receive Proof-of-Transfer commitments."],[430,"Retrieves a paginated list of address balances."],[470,"Retrieves a paginated list of address balances."],[433,"Retrieves a paginated list of holders for a Rune."],[473,"Retrieves a paginated list of holders for a Rune."],[437,"Retrieves a paginated list of rune activity for a block."],[477,"Retrieves a paginated list of rune activity for a block."],[435,"Retrieves a paginated list of rune activity for a transaction."],[475,"Retrieves a paginated list of rune activity for a transaction."],[441,"Retrieves a paginated list of rune etchings."],[480,"Retrieves a paginated list of rune etchings."],[260,"Retrieves a single block."],[336,"Retrieves a single burn block."],[458,"Retrieves a single inscription."],[495,"Retrieves a single inscription."],[413,"Retrieves a specific entry from a contract data map."],[321,"Retrieves account balance information, including STX, fungible, and non-fungible tokens."],[438,"Retrieves all activity for a Rune."],[478,"Retrieves all activity for a Rune."],[465,"Retrieves all inscriptions associated with a single satoshi."],[500,"Retrieves all inscriptions associated with a single satoshi."],[312,"Retrieves all recently mined transactions."],[309,"Retrieves all recently-broadcast transactions that have been dropped from the mempool."],[436,"Retrieves all Rune activity for a Bitcoin address."],[476,"Retrieves all Rune activity for a Bitcoin address."],[313,"Retrieves all transactions that have been recently broadcast to the mempool. These are pending transactions awaiting confirmation."],[454,"Retrieves all transfers for a single inscription."],[491,"Retrieves all transfers for a single inscription."],[398,"Retrieves an estimated fee rate for STX transfer transactions."],[279,"Retrieves an estimated fee rate for transactions."],[266,"Retrieves average block times."],[268,"Retrieves block details of a specific block for a given burnchain block hash."],[265,"Retrieves block details of a specific block for a given burnchain block height."],[262,"Retrieves block details of a specific block for a given chain height."],[269,"Retrieves block details of a specific block for a given chain height."],[452,"Retrieves BRC-20 activity filtered by ticker, address, operation, or block height."],[489,"Retrieves BRC-20 activity filtered by ticker, address, operation, or block height."],[449,"Retrieves BRC-20 token balances for a Bitcoin address."],[486,"Retrieves BRC-20 token balances for a Bitcoin address."],[311,"Retrieves details for a list of transactions."],[290,"Retrieves details for a PoX cycle."],[289,"Retrieves details for a signer in a PoX cycle."],[332,"Retrieves details for a specific smart contract."],[310,"Retrieves details for a specific transaction."],[277,"Retrieves details of a given name including the address, status and last transaction ID."],[335,"Retrieves estimated fee priorities (in micro-STX) for all transactions that are currently in the mempool. Also returns priorities separated by transaction type."],[304,"Retrieves events for a specific transaction."],[305,"Retrieves events for a specific transaction."],[432,"Retrieves holder balance for a specific Rune."],[472,"Retrieves holder balance for a specific Rune."],[448,"Retrieves information about BRC-20 tokens."],[485,"Retrieves information about BRC-20 tokens."],[62,"Retrieves information about fungible tokens."],[253,"Retrieves information about fungible tokens."],[453,"Retrieves information about Ordinals inscriptions."],[490,"Retrieves information about Ordinals inscriptions."],[434,"Retrieves information about Rune activities."],[474,"Retrieves information about Rune activities."],[431,"Retrieves information about Rune balances."],[471,"Retrieves information about Rune balances."],[440,"Retrieves information about Rune etchings."],[479,"Retrieves information about Rune etchings."],[61,"Retrieves information about semi-fungible tokens."],[252,"Retrieves information about semi-fungible tokens."],[299,"Retrieves information about the Core API and the Stacks network."],[400,"Retrieves information about the Core API and the Stacks network."],[401,"Retrieves information about the Core API, including the server version."],[460,"Retrieves information about the Ordinals API status, including the server version."],[496,"Retrieves information about the Ordinals API status, including the server version."],[40,"Retrieves information about the Platform Chainhooks API."],[33,"Retrieves information about the Platform Devnet services such as Stacks Blockchain API, Bitcoin node, and more."],[428,"Retrieves information about the Rune API status."],[468,"Retrieves information about the Rune API status."],[56,"Retrieves information about the Token Metadata API, including the server version."],[57,"Retrieves information about the Token Metadata API, including the server version."],[248,"Retrieves information about the Token Metadata API, including the server version."],[249,"Retrieves information about the Token Metadata API, including the server version."],[59,"Retrieves information about tokens on the Stacks blockchain."],[250,"Retrieves information about tokens on the Stacks blockchain."],[450,"Retrieves information for a BRC-20 token, including supply and holders."],[487,"Retrieves information for a BRC-20 token, including supply and holders."],[442,"Retrieves information for a Rune etching."],[481,"Retrieves information for a Rune etching."],[451,"Retrieves information for BRC-20 tokens."],[488,"Retrieves information for BRC-20 tokens."],[63,"Retrieves metadata for a SIP-009 non-fungible token."],[254,"Retrieves metadata for a SIP-009 non-fungible token."],[60,"Retrieves metadata for a SIP-010 fungible token."],[251,"Retrieves metadata for a SIP-010 fungible token."],[464,"Retrieves ordinal information for a single satoshi."],[499,"Retrieves ordinal information for a single satoshi."],[463,"Retrieves ordinal information for satoshis."],[498,"Retrieves ordinal information for satoshis."],[390,"Retrieves Proof-of-Transfer (PoX) information."],[392,"Retrieves Proof-of-Transfer (PoX) information."],[391,"Retrieves stacker and signer set information for a given cycle."],[306,"Retrieves statistics for transactions in the mempool, such as counts, ages, and fees."],[446,"Retrieves statistics on the number of inscriptions revealed per block."],[483,"Retrieves statistics on the number of inscriptions revealed per block."],[445,"Retrieves stats on the number of inscriptions per block."],[482,"Retrieves stats on the number of inscriptions per block."],[405,"Retrieves the account data for a given account or contract identifier."],[297,"Retrieves the circulating STX supply as plain text."],[415,"Retrieves the Clarity source code of a given contract, along with the block height it was published in, and the MARF proof for the data."],[456,"Retrieves the content of a single inscription."],[493,"Retrieves the content of a single inscription."],[333,"Retrieves the deployment status of multiple smart contracts."],[278,"Retrieves the historical zone file for a specific name."],[344,"Retrieves the history of a non-fungible token."],[326,"Retrieves the latest nonce values used by an account by inspecting the mempool and anchored transactions."],[340,"Retrieves the list of fungible token holders for a given token ID."],[274,"Retrieves the list of names owned by a specific address."],[316,"Retrieves the list of stacking pool members for a given delegator principal."],[271,"Retrieves the list of subdomains for a specific name."],[395,"Retrieves the price of a name."],[393,"Retrieves the price of a namespace."],[461,"Retrieves the running status of the Ordinals API."],[497,"Retrieves the running status of the Ordinals API."],[301,"Retrieves the running status of the Stacks Blockchain API."],[429,"Retrieves the status of the API."],[469,"Retrieves the status of the API."],[327,"Retrieves the STX token balance for a specified address or contract identifier."],[296,"Retrieves the target block time for a given network."],[298,"Retrieves the target block times for mainnet and testnet."],[302,"Retrieves the total and unlocked STX supply in legacy format 1.0 API."],[295,"Retrieves the total and unlocked STX supply."],[286,"Retrieves the total burnchain (e.g. Bitcoin) rewards for a given recipient address."],[300,"Retrieves the total STX supply as plain text."],[272,"Retrieves the zone file for a specific name."],[325,"Retrieves transaction details for a specific transaction including STX transfers for each transaction."],[314,"Retrieves transactions confirmed in a single block."],[320,"Retrieves transactions for a specific account including STX transfers for each transaction."],[322,"Retrieves transactions for a specific account."],[308,"Retrieves transactions for a specific address."],[303,"Retrieves transactions sent or received by a STX address or smart contract ID."],[75,"Run a local instance of the Stacks Explorer."],[422,"Runehook enables you to build Rune event streams, so you can create accurate, lightweight databases that gracefully handle Bitcoin forks and reorgs."],[424,"Runehook was developed to be environment-agnostic. Below are the different ways to install and build the Bitcoin Indexer on your machine."],[201,"Safely handling optional values and error cases in Clarity smart contracts."],[293,"Search blocks, transactions, contracts, or accounts by hash/ID."],[294,"Search for a principal by ID."],[142,"Serialize a Clarity value into a buffer for consensus in Clarity smart contracts."],[209,"Service status endpoints"],[132,"Set an entry in a map in Clarity smart contracts."],[175,"Set the value of a data variable in Clarity smart contracts."],[347,"Set up your development environment for Stacks."],[348,"Setup and configure testing environments for your Clarity smart contracts."],[35,"Start a development network (devnet)."],[26,"Step through and debug your contracts inside the command line."],[34,"Stop a development network (devnet)."],[382,"Stream events."],[503,"TBD"],[50,"Test and validate your code using devnet's private blockchain environment."],[502,"The Bitcoin Indexer enables you to build ordinals event streams, so you can create accurate, lightweight databases that gracefully handle Bitcoin forks and reorgs."],[363,"The Clarinet CLI is a command-line tool for interacting with the Clarinet network."],[8,"The Clarinet JS SDK is a JavaScript library used to write unit tests for Clarity smart contracts."],[5,"The Clarinet JS SDK provides properties that can be used to interact with simnet."],[359,"The Clarinet JS SDK provides properties that can be used to interact with simnet."],[7,"The Clarinet JS SDK provides several methods that can be used to interact with simnet."],[361,"The Clarinet JS SDK provides several methods that can be used to interact with simnet."],[11,"The following guides cover ways to use Hiro tools to build apps on Stacks."],[256,"The following guides cover ways to use Hiro tools to build apps on Stacks."],[381,"The following guides cover ways to use Hiro tools to build apps on Stacks."],[501,"The following guides cover ways to use Hiro tools to build apps on Stacks."],[505,"The following guides cover ways to use Hiro tools to build apps on Stacks."],[420,"The following guides cover ways to use Hiro tools to build with Ordinals, BRC-20, and Runes."],[13,"The Hiro Archive is a series of data snapshots for services in the Stacks ecosystem."],[362,"The main entry point for the Clarinet JS SDK. It provides properties and methods for interacting with the Clarinet network."],[459,"The Ordinals API provides you with fast, reliable data for Bitcoin ordinals and BRC-20 tokens via an easy-to-use REST interface."],[427,"The Runes API provides you with fast, reliable data for Bitcoin Runes via an easy-to-use REST interface."],[4,"The Simnet class is the main entry point for the Clarinet JS SDK. It provides properties and methods for interacting with the Clarinet network."],[358,"The Simnet class is the main entry point for the Clarinet JS SDK. It provides properties and methods for interacting with the Clarinet network."],[364,"The Stacks.js CLI is a command-line tool for creating new Stacks.js projects."],[231,"This guide explains how to use post-conditions to secure your smart contracts."],[123,"Transfer fungible tokens between principals in Clarity smart contracts."],[101,"Transfer ownership of a non-fungible token (NFT) in Clarity smart contracts."],[150,"Transfer STX between principals in Clarity smart contracts."],[184,"Transfer STX with a memo field in Clarity smart contracts."],[387,"Transfer tokens."],[346,"Understand proof requests from API endpoints."],[259,"Understand the architecture of the Stacks Blockchain API."],[55,"Understand the architecture of the Token Metadata API."],[3,"Understand the rate limits for Hiro APIs and the STX Faucet."],[421,"Understand the rate limits for Hiro APIs and the STX Faucet."],[507,"Understand the rate limits for Hiro APIs and the STX Faucet."],[148,"Unpack error responses and throwing runtime errors in Clarity smart contracts."],[159,"Unpack error responses in Clarity smart contracts."],[151,"Unpack optional and response types and throwing runtime errors in Clarity smart contracts."],[85,"Unpack optional and response types in Clarity smart contracts."],[41,"Update a chainhook through the Hiro Platform."],[25,"Use Clarinet to publish your contracts to the devnet, testnet, or mainnet networks."],[137,"Use the addition function for arithmetic operations in Clarity smart contracts."],[108,"Use the and function for logical operations in Clarity smart contracts."],[149,"Use the append function to add elements to lists in Clarity smart contracts, with considerations for maximum list length."],[192,"Use the as-contract function to execute expressions as the contract principal in Clarity smart contracts."],[126,"Use the as-max-len? function to check and limit sequence lengths in Clarity smart contracts."],[193,"Use the asserts! function for conditional assertions in Clarity smart contracts."],[161,"Use the at-block function to evaluate expressions at a specific block in Clarity smart contracts."],[163,"Use the begin function to evaluate multiple expressions in sequence in Clarity smart contracts."],[113,"Use the bit-and function for bitwise operations in Clarity smart contracts."],[187,"Use the bit-not function for bitwise complement operations in Clarity smart contracts."],[130,"Use the bit-or function for bitwise OR operations in Clarity smart contracts."],[174,"Use the bit-shift-left function for bitwise left shift operations in Clarity smart contracts."],[145,"Use the bit-shift-right function for bitwise right shift operations in Clarity smart contracts."],[128,"Use the bit-xor function for bitwise exclusive OR operations in Clarity smart contracts."],[112,"Use the division function for arithmetic operations in Clarity smart contracts."],[154,"Use the greater than function for comparisons in Clarity smart contracts."],[191,"Use the greater than or equal function for comparisons in Clarity smart contracts."],[114,"Use the less than function for comparisons in Clarity smart contracts."],[176,"Use the less than or equal function for comparisons in Clarity smart contracts."],[102,"Use the multiplication function for arithmetic operations in Clarity smart contracts."],[140,"Use the subtraction function for arithmetic operations in Clarity smart contracts."],[83,"Use tuples to group data values with named fields in Clarity smart contracts."],[76,"Using bit manipulation for compact data storage and flags in Clarity smart contracts."],[389,"Validate a proposed Stacks block."],[169,"Verify a signature against a message hash and public key in Clarity smart contracts."],[16,"Verify the integrity of the data in a particular snapshot."],[406,"Version 3 of the RPC API."]],"type":"string"},"content":{"docs":{"1":468,"2":441,"3":476,"4":360,"5":367,"6":371,"7":369,"8":448,"9":397,"10":347,"11":411,"12":483,"13":392,"14":172,"15":173,"16":353,"17":180,"18":386,"19":170,"20":419,"21":420,"22":385,"23":418,"24":486,"25":359,"26":400,"27":399,"28":513,"29":416,"30":401,"31":450,"32":209,"33":0,"34":216,"35":217,"36":218,"37":210,"38":211,"39":213,"40":1,"41":214,"42":212,"43":215,"44":393,"45":472,"46":171,"47":408,"48":58,"49":364,"50":358,"51":464,"52":514,"53":409,"54":455,"55":174,"56":2,"57":337,"58":169,"59":52,"60":341,"61":345,"62":339,"63":343,"64":376,"65":511,"66":3,"67":428,"68":422,"69":423,"70":168,"71":424,"72":61,"73":403,"74":475,"75":507,"76":354,"77":492,"78":402,"79":487,"80":357,"81":489,"82":118,"83":176,"84":143,"85":163,"86":79,"87":74,"88":107,"89":121,"90":80,"91":115,"92":82,"93":167,"94":138,"95":102,"96":94,"97":85,"98":151,"99":88,"100":83,"101":131,"102":505,"103":81,"104":349,"105":120,"106":148,"107":119,"108":495,"109":140,"110":116,"111":145,"112":499,"113":496,"114":503,"115":96,"116":101,"117":164,"118":158,"119":90,"120":108,"121":133,"122":86,"123":100,"124":110,"125":98,"126":65,"127":62,"128":73,"129":87,"130":70,"131":165,"132":124,"133":76,"134":89,"135":128,"136":112,"137":497,"138":149,"139":111,"140":508,"141":137,"142":156,"143":152,"144":95,"145":72,"146":113,"147":114,"148":160,"149":63,"150":155,"151":162,"152":105,"153":157,"154":501,"155":132,"156":348,"157":150,"158":77,"159":161,"160":84,"161":67,"162":141,"163":68,"164":92,"165":134,"166":159,"167":123,"168":147,"169":142,"170":125,"171":117,"172":122,"173":109,"174":71,"175":166,"176":504,"177":93,"178":99,"179":75,"180":91,"181":144,"182":78,"183":106,"184":154,"185":135,"186":130,"187":69,"188":103,"189":126,"190":97,"191":502,"192":64,"193":66,"194":146,"195":129,"196":104,"197":127,"198":153,"199":139,"200":136,"201":356,"202":355,"203":442,"204":443,"205":4,"206":244,"207":243,"208":451,"209":5,"210":239,"211":6,"212":240,"213":7,"214":246,"215":245,"216":242,"217":8,"218":241,"219":488,"220":177,"221":175,"222":179,"223":178,"224":384,"225":444,"226":434,"227":433,"228":421,"229":490,"230":389,"231":387,"232":388,"233":365,"234":429,"235":437,"236":435,"237":500,"238":481,"239":395,"240":494,"241":458,"242":59,"243":374,"244":373,"245":484,"246":482,"247":465,"248":9,"249":338,"250":53,"251":342,"252":346,"253":340,"254":344,"255":512,"256":414,"257":452,"258":480,"259":425,"260":296,"261":258,"262":259,"263":10,"264":301,"265":261,"266":298,"267":295,"268":260,"269":262,"270":310,"271":312,"272":313,"273":11,"274":309,"275":316,"276":315,"277":311,"278":314,"279":272,"280":12,"281":265,"282":13,"283":266,"284":263,"285":264,"286":267,"287":303,"288":54,"289":306,"290":304,"291":305,"292":307,"293":276,"294":55,"295":277,"296":273,"297":278,"298":274,"299":14,"300":280,"301":247,"302":279,"303":293,"304":294,"305":288,"306":291,"307":15,"308":248,"309":290,"310":286,"311":292,"312":285,"313":289,"314":297,"315":287,"316":275,"317":16,"318":17,"319":271,"320":256,"321":251,"322":257,"323":252,"324":250,"325":249,"326":253,"327":255,"328":254,"329":269,"330":270,"331":18,"332":268,"333":308,"334":19,"335":302,"336":300,"337":20,"338":299,"339":21,"340":281,"341":22,"342":283,"343":284,"344":282,"345":453,"346":491,"347":445,"348":485,"349":446,"350":447,"351":363,"352":410,"353":390,"354":391,"355":461,"356":431,"357":398,"358":361,"359":368,"360":372,"361":370,"362":362,"363":23,"364":57,"365":383,"366":432,"367":366,"368":430,"369":438,"370":436,"371":439,"372":427,"373":440,"374":515,"375":417,"376":479,"377":460,"378":375,"379":498,"380":350,"381":412,"382":377,"383":378,"384":379,"385":380,"386":381,"387":382,"388":24,"389":318,"390":25,"391":331,"392":328,"393":330,"394":26,"395":329,"396":324,"397":27,"398":325,"399":454,"400":28,"401":326,"402":333,"403":29,"404":30,"405":317,"406":31,"407":336,"408":334,"409":335,"410":322,"411":332,"412":32,"413":327,"414":321,"415":323,"416":320,"417":33,"418":319,"419":469,"420":457,"421":477,"422":459,"423":396,"424":516,"425":474,"426":352,"427":506,"428":34,"429":219,"430":221,"431":35,"432":235,"433":233,"434":36,"435":237,"436":231,"437":223,"438":229,"439":509,"440":37,"441":225,"442":227,"443":473,"444":351,"445":38,"446":207,"447":191,"448":39,"449":185,"450":189,"451":187,"452":183,"453":40,"454":199,"455":193,"456":197,"457":201,"458":195,"459":449,"460":41,"461":181,"462":510,"463":42,"464":203,"465":205,"466":394,"467":466,"468":43,"469":220,"470":222,"471":44,"472":236,"473":234,"474":45,"475":238,"476":232,"477":224,"478":230,"479":46,"480":226,"481":228,"482":47,"483":208,"484":192,"485":48,"486":186,"487":190,"488":188,"489":184,"490":49,"491":200,"492":194,"493":198,"494":202,"495":196,"496":50,"497":182,"498":51,"499":204,"500":206,"501":415,"502":456,"503":56,"504":462,"505":413,"506":470,"507":478,"508":471,"509":407,"510":463,"511":405,"512":467,"513":406,"514":493,"515":426,"516":404,"517":60},"orderedDocs":[[33,""],[40,""],[56,""],[66,""],[205,""],[209,""],[211,""],[213,""],[217,""],[248,""],[263,""],[273,""],[280,""],[282,""],[299,""],[307,""],[317,""],[318,""],[331,""],[334,""],[337,""],[339,""],[341,""],[363,""],[388,""],[390,""],[394,""],[397,""],[400,""],[403,""],[404,""],[406,""],[412,""],[417,""],[428,""],[431,""],[434,""],[440,""],[445,""],[448,""],[453,""],[460,""],[463,""],[468,""],[471,""],[474,""],[479,""],[482,""],[485,""],[490,""],[496,""],[498,""],[59,"\n"],[250,"\n"],[288,"\n"],[294,"\n"],[503,"\n"],[364,"\n\n```package-install\ncreate stacks\n```"],[48,"\n## Archive a project\n\nSometimes, you may find it necessary to archive a project from your project list. It is important to understand that archiving a project is not the same as deleting a project. Archiving a project means you wish to move the project status from an active project to one that is not active and visible in your project list.\n\nFollow the steps below to archive a project:\n\n1. Sign in to the [Hiro Platform](https://platform.hiro.so/).\n2. Once you are authenticated, you will be redirected to the project page.\n3. From your list of projects, find the project you wish to archive.\n4. Click on the far-right three dots and select \"Archive.\" This will remove the project from the project list and place it into an archive folder.\n\n![Archive project](../images/archive-project/archive.png)\n\n## Unarchive a project\n\nFollow the steps below to unarchive a project:\n\n1. From the projects page in the Hiro Platform, select the \"Archive\" button at the top right. and select the far-right three dots and select \"Unarchive.\"\n2. You will now see a list of archived projects. Select three-dots on the far right and click \"Unarchive\" for any project you want to unarchive.\n3. You will now see any unarchived projects back in your project list.\n\n![Unarchive project](../images/archive-project/unarchive.png)\n\n<Callout title=\"Note\" type=\"info\">\n Deleting a project is not yet available in the BETA version.\n</Callout>\n"],[242,"\n## Broadcasting Transactions\n\nA finalized transaction can be broadcasted to the network or serialized (to a byte representation) using Stacks.js.\n\n```ts -n\nimport { broadcastTransaction, makeSTXTokenTransfer } from \"@stacks/transactions\";\n\nconst transaction = await makeSTXTokenTransfer({\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n amount: 42000000,\n senderKey:\n \"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601\",\n network: \"devnet\",\n});\n\nconst tx = await broadcastTransaction({ transaction });\n\n```\n\n<Callout title=\"Info\">For web applications, user wallets can broadcast transactions via [@stacks/connect](/stacks/connect).</Callout>\n"],[517,"\n## Features\n\nDocsKit features:\n\n- adds [flags](#flags) and [annotations](#annotations) to codeblocks\n- includes a special syntax for [inline code](#inline-code)\n- adds three components that can be used in MDX: [_`<CodeTabs />`_](#codetabs), [_`<WithNotes />`_](#withnotes), and [_`<TerminalPicker />`_](#terminal-picker)\n- adds a [language switcher](#language-switcher) (which is another usage of _`<CodeTabs />`_)\n- codeblocks with language [`terminal`](#terminal) or [`package-install`](#package-install) are rendered with a different component\n\n## Flags\n\n````txt flags-example.md\n# !mark[/-wn/]\n```js index.js -wn\n```\n````\n\n- `-n` add line numbers\n- `-c` add copy button\n- `-w` word wrap\n- `-a` animate (for tabs)\n\n## Annotations\n\n````txt annotations-example.md\n```js\nconst x = 1;\n# !mark[/!mark/]\n// !mark(1:2)\nconst y = 2;\nconst z = 3;\n```\n````\n\n- `!mark` - highlight a line, a range of lines, or a regex\n- `!diff` - highlight added or removed lines\n- `!collapse` - collapse a range of lines\n- `!fold` - fold a regex pattern inline\n- `!link` - add a link\n- `!tooltip` - add a tooltip\n- `!callout` - add a callout\n\nLearn more about using annotations from Code Hike docs:\n\n- [Annotation comments](https://codehike.org/docs/concepts/annotations#annotation-comments)\n- [Using regular expressions](https://codehike.org/docs/concepts/annotations#using-regular-expressions-instead-of-ranges)\n\n## Mark\n\nYou can use it for one line (`!mark`), a range of lines (`!mark(1:3)`), a range of columns (`!mark[5:10]`), or a regex pattern (`!mark[/pattern/]`).\n\nYou can provide any valid CSS color, for example: `!mark(1:3) red` or `!mark(1:3) hsl(var(--hiro))`.\n\n```clarity\n;; !mark[/Counters/mg]\n(define-map Counters principal uint)\n\n;; !mark(1:3)\n(define-public (count-up)\n (ok (map-set Counters tx-sender (+ (get-count tx-sender) u1)))\n)\n\n;; !mark hsl(var(--hiro))\n(define-read-only (get-count (who principal))\n (default-to u0 (map-get? Counters who))\n)\n```\n\n## Diff\n\n```js\nfunction lorem(ipsum, dolor = 1) {\n const sit = 10;\n // !diff -\n dolor = ipsum - sit;\n // !diff +\n dolor = sit - amet(dolor);\n return sit ? consectetur(ipsum) : [];\n}\n```\n\n## Collapse\n\n```jsonc sample-alert-payload.json -cwn\n{\n \"nonce\": 5,\n \"fee_rate\": \"250\",\n \"sponsored\": false,\n \"post_condition_mode\": \"deny\",\n // !collapse(1:9) collapsed\n \"post_conditions\": [\n {\n \"type\": \"stx\",\n \"condition_code\": \"sent_equal_to\",\n \"amount\": \"3000000\",\n \"principal\": {\n \"type_id\": \"principal_standard\",\n },\n },\n ],\n \"anchor_mode\": \"any\",\n \"tx_status\": \"pending\",\n \"receipt_time\": 1726104636,\n \"tx_type\": \"contract_call\",\n // !collapse(1:11) collapsed\n \"contract_call\": {\n \"function_name\": \"donate\",\n \"function_signature\": \"(define-public (donate (amount uint)))\",\n \"function_args\": [\n {\n \"hex\": \"0x01000000000000000000000000002dc6c0\",\n \"repr\": \"u3000000\",\n \"name\": \"amount\",\n \"type\": \"uint\",\n },\n ],\n },\n}\n```\n\n## Fold\n\n```jsx\n// !fold[/className=\"(.*?)\"/gm]\nfunction Foo() {\n return (\n <div className=\"bg-red-200 opacity-50\">\n <span className=\"block\">hey</span>\n </div>\n );\n}\n```\n\n## Link\n\n```js\n// !link[/foo/mg] https://example.com\n// !link[/bar/mg] https://example.com\nimport { foo, bar } from \"baz\";\n\nconst x = foo(10);\nconst y = bar(x);\n```\n\n## CodeTabs\n\n````txt tabs-example.md\n# !mark[/!!/mg]\n<CodeTabs flags=\"ac\">\n\n```ts !! index.ts\n\n```\n\n```css !! styles.css\n\n```\n</CodeTabs>\n````\n\nNote: the codeblocks inside the _`<CodeTabs />`_ component should have the `!!` decoration and a title.\n\nYou can pass flags to the _`<CodeTabs />`_ component to apply them to all codeblocks inside it. The `a` flag will animate the transition between tabs.\n\nExample:\n\n<CodeTabs flags=\"ac\">\n\n```clarity !! one.clar\n;; !mark[/increment/mg]\n(define-data-var count uint u0)\n\n(define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count)) ;; !mark\n )\n)\n```\n\n```solidity !! two.sol\n// !mark[/add/mg]\nuint256 constant TOO_BIG = 10;\nuint256 count = 0;\n\nfunction add(uint256 amount) public returns (uint256) {\n uint256 newCount = count + amount;\n if (newCount <= TOO_BIG) {\n count = newCount;\n return count;\n }\n revert(\"Amount too large\"); // !mark\n}\n```\n\n</CodeTabs>\n\n### Language switcher\n\nTo switch between languages, use the _`<CodeTabs />`_ component with the `storage` prop. The `storage` prop is used to store the selected language in the local storage and sync all the _`<CodeTabs storage=\"some-id\" />`_ using the same `storage` key.\n\n<CodeTabs flags=\"ac\" storage=\"ts\">\n\n```ts !! TypeScript\n(async () => {\n const apiConfig: Configuration = new Configuration({\n fetchApi: fetch,\n // for mainnet, replace `testnet` with `mainnet`\n basePath: \"https://api.testnet.hiro.so\",\n });\n})().catch(console.error);\n```\n\n```js !! JavaScript\n(async () => {\n const apiConfig = new Configuration({\n fetchApi: fetch,\n // for mainnet, replace `testnet` with `mainnet`\n basePath: \"https://api.testnet.hiro.so\",\n });\n})().catch(console.error);\n```\n\n</CodeTabs>\n\n## WithNotes\n\nFor `!callout` and `!tooltip` annotations, you can use the _`<WithNotes />`_ to define the content you want to show.\n\n### Callouts\n\n<WithNotes>\n\n```js index.js\n// !callout[/ipsum/] description\nimport lorem from \"ipsum\";\n\n// !callout[/sit/] inspect\nconst sit = lorem({ a: 1, b: 2 });\n```\n\n```js !inspect\nsit = [\n { name: \"a\", value: 1 },\n { name: \"b\", value: 2 },\n];\n```\n\n## !description\n\nThe default export of the `ipsum` package is a function that **returns an array**.\n\nKind of like _`Object.entries(x)`_ but different.\n\n</WithNotes>\n\n### Tooltips\n\n<WithNotes>\n\n```js demo.js\n// !tooltip[/lorem/] install\nimport { read, write } from \"lorem\";\n\n// !tooltip[/data.json/] data\nvar data = read(\"data.json\");\n\n// !tooltip[/test-123/] apikey\nwrite({ x: 1 }, { apiKey: \"test-123\" });\n```\n\nWe can also use tooltips [here](tooltip \"install\") in [prose](tooltip \"data\") text.\n\n```json !data data.json\n{\n \"lorem\": \"ipsum dolor sit amet\",\n \"foo\": [4, 8, 15, 16]\n}\n```\n\n## !install\n\nThis is a **fake library**. You can install it with:\n\n```terminal\n$ npm install lorem\n```\n\nIt lets you read and write data.\n\n## !apikey\n\nThis is a public sample test mode [API key](https://example.com). Don’t submit any personally information using this key.\n\nReplace this with your secret key found on the [API Keys page](https://example.com) in the dashboard.\n\n</WithNotes>\n\n## Inline code\n\nTo use inline codeyou need to use a special syntax: ``_`code`_``.\n\nThis syntax also allows you to specify the language for inline code ``_clarity`(contract-call? .counter count-up)`_`` renders: _clarity`(contract-call? .counter count-up)`_\n\n## Terminal\n\nTo use the terminal component, set the language of a codeblock to `terminal`, and start each command with `$`.\n\n```terminal\n$ tar -xf clarinet-linux-x64.tar.gz\n$ chmod +x ./clarinet\n$ mv ./clarinet /usr/local/bin\n```\n\nThe lines that don't start with `$` are rendered as collapsed output. The output can use ANSI colors and styles.\n\n```terminal\n$ npx create-next-app@latest\ncreate-next-app@14.2.13\n\u001b[32m✔\u001b[0m \u001b[1mWhat is your project?\u001b[0m \u001b[90m…\u001b[0m my-app\n$ npm run dev\n```\n\n### Terminal Picker\n\n<TerminalPicker>\n\n```terminal !! macOS\n$ brew install clarinet\n```\n\n```terminal !! Windows\n$ winget install clarinet\n```\n\n```terminal !! Cargo\n$ sudo apt install build-essential pkg-config libssl-dev\n```\n\n</TerminalPicker>\n\n### Package Install\n\nYou can use `package-install` as a language to get a picker for JS package managers.\n\n```package-install\n@stacks/connect\n```\n\n### Opting out of the terminal component\n\nTo use features from the normal codeblock component, you can still use languages like `sh` or `bash` or even `txt`.\n\n```sh Terminal -w\n# !tooltip[/v0.27.0/] You can change the v0.27.0 version that is available on the releases page.\n$ wget -nv download/v0.27.0/clarinet-linux-x64-glibc.tar.gz -O clarinet-linux-x64.tar.gz\n```\n"],[72,"\n## February: Create your own recipe for the Hiro Cookbook\n\n*Create your own recipe that you think will help other developers build on Stacks*\n\n**Timeline**: February 19-25, 2025\n\nThis month's challenge invites you to create your own recipe for the [Hiro Cookbook](/cookbook) and share it with the community. Each recipe is a reusable code snippet that handles some specific function, and each recipe has written annotations, so readers know exactly how the code in a given recipe works and what parameters you can customize. Your submission should be a recipe that you think will help other developers build on Stacks.\n\nSubmit your project [here](https://hirohacks25.paperform.co/).\n\n<iframe width=\"770\" height=\"315\" src=\"https://www.youtube.com/embed/z9ULVhygKCE\" title=\"Hiro Hacks: Cookbook\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerPolicy=\"strict-origin-when-cross-origin\" allowFullScreen></iframe>\n\n## Some example recipe ideas to explore\n\n- Using the `Cl` parse helper function to convert string values into Clarity Values\n- Creating and signing a message for smart contract verification\n- How to construct a non-sequential multisig transaction\n- Create a helper function to determine if a transaction has been signed\n\n_For this month's submission, provide a link to your recipe in a PR to the [Recipes](https://github.com/hirosystems/recipes) repo. To review the general submission guidelines, see the [Hiro Hacks](/stacks/hacks) page._\n\n---\n\n## Resources\n\n- [Hiro Cookbook](/cookbook)\n- [Recipes repo](https://github.com/hirosystems/recipes)\n- [Submission form](https://hirohacks25.paperform.co/)\n- [Stacks Discord](https://stacks.chat)\n"],[127,"\n## Function Signature\n\n\n```clarity\n(get-tenure-info? prop-name block-height)\n```\n\n- Input: \n - `prop-name`: A TenureInfoPropertyName\n - `block-height`: A uint representing the Stacks block height\n- Output: `(optional buff) | (optional uint) | (optional principal)` depending on the property\n\n## Why it matters\n\nThe `get-tenure-info?` function is essential for:\n\n1. Accessing historical tenure data within smart contracts\n2. Retrieving information about block miners and rewards\n3. Accessing VRF seeds for randomness-based applications\n4. Analyzing miner participation and spending patterns\n\n## When to use it\n\nUse `get-tenure-info?` when you need to:\n\n- Access tenure-specific data like VRF seeds or miner addresses\n- Verify tenure timestamps or burnchain information\n- Analyze block rewards and miner spending patterns\n- Implement logic that depends on historical tenure data\n\n## Best Practices\n\n- Always handle the `none` case, as it will be returned for non-existent or future blocks\n- Be aware that block rewards are only available after maturity (101 blocks on mainnet)\n- Consider the two-hour accuracy window when working with tenure timestamps\n- Cache frequently accessed tenure information to optimize execution costs\n\n## Practical Example: Checking Miner Spending\n\n```clarity\n(define-read-only (get-miner-spend-ratio (blockHeight uint)))\n(let\n (\n (winnerSpend (get-tenure-info? miner-spend-winner blockHeight))\n (totalSpend (get-tenure-info? miner-spend-total blockHeight))\n )\n (match (tuple (winner winnerSpend) (total totalSpend))\n success (some (/ (get success \"winner\") (get success \"total\")))\n error none\n )\n)\n```\n\n## Available Properties\n\n- `burnchain-header-hash`: Returns the burnchain block header hash (buff 32)\n- `miner-address`: Returns the tenure miner's principal\n- `time`: Returns the tenure time as Unix epoch timestamp (uint)\n- `vrf-seed`: Returns the VRF seed for the tenure (buff 32)\n- `block-reward`: Returns the total block reward (uint)\n- `miner-spend-total`: Returns total spent by all miners for this tenure (uint)\n- `miner-spend-winner`: Returns amount spent by winning miner (uint)\n\n## Common Pitfalls\n\n1. Not accounting for block reward maturity period (101 blocks)\n2. Relying on exact tenure times (accuracy window of two hours)\n3. Not handling the `none` case for invalid or future block heights\n\n## Related Functions\n\n- `get-block-info?`: Used to get information about Stacks blocks\n- `block-height`: Returns the current block height\n- `burn-block-height`: Returns the current burn chain block height\n\n## Conclusion\n\nThe `get-tenure-info?` function provides crucial access to historical tenure data in Clarity smart contracts. Introduced in Clarity 3, this function enables developers to access detailed information about past tenures, including miner participation, block rewards, and VRF seeds. When used properly, `get-tenure-info?` is a powerful tool for implementing sophisticated contract logic that depends on historical blockchain state.\n"],[149,"\n## Function Signature\n\n```clarity\n(append (list A) A)\n```\n\n- Input: A list of type A, and a single element of type A\n- Output: A new list of type A with the element appended\n\n## Why it matters\n\nThe `append` function is crucial for:\n\n1. Dynamically growing lists within smart contracts.\n2. Adding new elements to existing data structures.\n3. Implementing queue-like behaviors in contract logic.\n4. Constructing lists incrementally during contract execution.\n\n## When to use it\n\nUse the `append` function when you need to:\n\n- Add a new element to the end of an existing list.\n- Construct a list by adding elements one at a time.\n- Implement data structures that require adding elements in order.\n- Combine existing lists with single elements.\n\n## Best Practices\n\n- Always use `as-max-len?` before appending to ensure the list doesn't exceed its maximum length.\n- Be mindful of the maximum list length specified when defining the list.\n- Consider using `concat` for joining two lists instead of repeatedly using `append`.\n- Remember that `append` creates a new list; it doesn't modify the original list in-place.\n- Use type-appropriate elements that match the list's declared type.\n\n## Practical Example: Event Log with Max Length Check\n\nLet's implement a simple event log system using `append` with a maximum length check:\n\n```clarity\n(define-data-var eventLog (list 50 (string-ascii 50)) (list))\n\n(define-public (log-event (event (string-ascii 50)))\n (let\n (\n (current-log (var-get eventLog))\n )\n (match (as-max-len? (append current-log event) u2) success\n (ok (var-set eventLog success))\n (err u1)\n )\n )\n)\n\n(define-read-only (get-eventLog)\n (ok (var-get eventLog))\n)\n\n;; Usage\n(log-event \"Contract initialized\")\n(log-event \"User registered\")\n(get-eventLog) ;; Returns (ok (\"Contract initialized\" \"User registered\"))\n```\n\nThis example demonstrates:\n1. Using `append` to add new events to an existing log.\n2. Using `as-max-len?` to check if appending would exceed the maximum list length.\n3. Handling the case where the list would exceed its maximum length.\n4. Combining `append` with other Clarity functions like `var-set` and `var-get`.\n\n## Common Pitfalls\n\n1. Forgetting to use `as-max-len?` when appending to a list with a maximum length.\n2. Attempting to append an element of the wrong type to a typed list.\n3. Assuming `append` will always succeed without checking the list's current length.\n4. Inefficiently using `append` in a loop when `concat` might be more appropriate.\n\n## Related Functions\n\n- `as-max-len?`: Used to check if a sequence exceeds a maximum length.\n- `concat`: Used for joining two lists together.\n- `list`: Used for creating new lists.\n- `len`: Used for getting the current length of a list.\n\n## Conclusion\n\nThe `append` function is a powerful tool for manipulating lists in Clarity smart contracts. By understanding its behavior, limitations, and the necessity of using `as-max-len?` with lists that have a maximum length, you can effectively manage dynamic data structures within your contracts. This enables more flexible and responsive smart contract designs while maintaining safeguards against exceeding predefined list size limits.\n"],[192,"\n## Function Signature\n\n```clarity\n(as-contract expr)\n```\n\n- Input: An expression `expr`\n- Output: The result of `expr`\n\n## Why it matters\n\nThe `as-contract` function is crucial for:\n\n1. Executing operations with the contract's authority.\n2. Allowing the contract to send assets or perform privileged actions.\n3. Implementing contract-owned resources or funds.\n4. Enabling more complex contract interactions and architectures.\n\n## When to use it\n\nUse the `as-contract` function when you need to:\n\n- Perform actions that require the contract's principal.\n- Send assets (like STX or tokens) from the contract's balance.\n- Execute privileged operations that should only be done by the contract itself.\n- Implement contract-owned resources or escrow-like functionality.\n\n## Best Practices\n\n- Use `as-contract` sparingly and only when necessary to minimize potential security risks.\n- Ensure that the logic leading to `as-contract` calls is properly secured and access-controlled.\n- Be aware that `as-contract` changes the `tx-sender` context for the duration of the expression.\n- Combine `as-contract` with other security measures like `contract-caller` checks for robust security.\n\n## Practical Example: Contract-Managed Treasury\n\nLet's implement a simple treasury system where the contract can distribute funds:\n\n```clarity\n(define-constant CONTRACT_OWNER tx-sender)\n(define-data-var treasuryBalance uint u0)\n\n(define-public (deposit (amount uint))\n (begin\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n (var-set treasuryBalance (+ (var-get treasuryBalance) amount))\n (ok true)\n )\n)\n\n(define-public (withdraw (recipient principal) (amount uint))\n (begin\n (asserts! (is-eq tx-sender CONTRACT_OWNER) (err u403))\n (asserts! (<= amount (var-get treasuryBalance)) (err u401))\n (try! (as-contract (stx-transfer? amount tx-sender recipient)))\n (var-set treasuryBalance (- (var-get treasuryBalance) amount))\n (ok true)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `as-contract` in the `deposit` function to receive funds as the contract.\n2. Using `as-contract` in the `withdraw` function to send funds from the contract's balance.\n3. Combining `as-contract` with access control (`is-eq tx-sender CONTRACT_OWNER`) for security.\n\n## Common Pitfalls\n\n1. Using `as-contract` unnecessarily, which can lead to unexpected behavior.\n2. Forgetting that `as-contract` changes the `tx-sender` context, potentially affecting other parts of the code.\n3. Not implementing proper access controls around `as-contract` calls, which could lead to unauthorized actions.\n\n## Related Functions\n\n- `contract-caller`: Used to get the original caller of a contract function.\n- `tx-sender`: Represents the current sender (changes within `as-contract`).\n- `stx-transfer?`: Often used with `as-contract` for token transfers.\n\n## Conclusion\n\nThe `as-contract` function is a powerful tool in Clarity that allows contracts to perform actions with their own authority. While it enables complex contract architectures and functionalities, it should be used judiciously and with proper security measures to prevent potential vulnerabilities or unintended behaviors in smart contracts.\n"],[126,"\n## Function Signature\n\n```clarity\n(as-max-len? sequence max_length)\n```\n\n- Input: \n - `sequence`: A sequence of type A (list, buff, string-ascii, or string-utf8)\n - `max_length`: A uint literal representing the maximum allowed length\n- Output: `(optional sequence_A)`\n\n## Why it matters\n\nThe `as-max-len?` function is crucial for:\n\n1. Enforcing length limits on sequences in smart contracts.\n2. Safely appending to lists or other sequences with maximum lengths.\n3. Validating input data before processing.\n4. Preventing potential overflow or excessive resource consumption.\n\n## When to use it\n\nUse the `as-max-len?` function when you need to:\n\n- Check if a sequence is within a specified maximum length.\n- Safely append to a list or other sequence with a known maximum length.\n- Validate user input or data from external sources.\n- Implement logic that depends on sequence length constraints.\n\n## Best Practices\n\n- Always use `as-max-len?` before appending to lists or other sequences with maximum lengths.\n- Combine with `unwrap!` or `unwrap-panic` when you're certain the length should be within limits.\n- Use meaningful error handling when the length check fails.\n- Consider the performance impact of frequent length checks in your contract logic.\n\n## Practical Example: Safe List Append\n\nLet's implement a function that safely appends to a list with a maximum length:\n\n```clarity\n(define-data-var myList (list 5 uint) (list))\n\n(define-public (safe-append (item uint))\n (let\n (\n (newList (unwrap! (as-max-len? (append (var-get myList) item) u5) (err u1)))\n )\n (ok (var-set myList newList))\n )\n)\n\n(define-read-only (get-list)\n (var-get myList)\n)\n\n;; Usage\n(safe-append u1) ;; Returns (ok true)\n(safe-append u2) ;; Returns (ok true)\n(safe-append u3) ;; Returns (ok true)\n(safe-append u4) ;; Returns (ok true)\n(safe-append u5) ;; Returns (ok true)\n(safe-append u6) ;; Returns (err u1)\n\n(get-list) ;; Returns (list u1 u2 u3 u4 u5)\n```\n\nThis example demonstrates:\n1. Using `as-max-len?` to check if appending to the list would exceed the maximum length.\n2. Combining `as-max-len?` with `unwrap!` for concise error handling.\n3. Safely updating a list variable only if the length check passes.\n\n## Common Pitfalls\n\n1. Forgetting to use `as-max-len?` when appending to sequences with maximum lengths.\n2. Using a variable for the `max_length` parameter, which is not allowed (it must be a uint literal).\n3. Not handling the `none` case when `as-max-len?` returns an optional.\n\n## Related Functions\n\n- `append`: Used to add elements to lists.\n- `concat`: Used to join two sequences together.\n- `len`: Used to get the current length of a sequence.\n\n## Conclusion\n\nThe `as-max-len?` function is a critical tool for managing sequence lengths in Clarity smart contracts. By using it consistently, you can create more robust and secure contracts that properly handle length constraints, preventing potential vulnerabilities related to unbounded data growth or unexpected input sizes.\n"],[193,"\n## Function Signature\n\n```clarity\n(asserts! bool-expr thrown-value)\n```\n\n- Input: \n - `bool-expr`: A boolean expression\n - `thrown-value`: The value to be returned if the assertion fails\n- Output: `bool` or `thrown-value`\n\n## Why it matters\n\nThe `asserts!` function is crucial for:\n\n1. Implementing conditional checks in smart contracts.\n2. Enforcing preconditions before executing critical operations.\n3. Providing meaningful error responses when conditions are not met.\n4. Improving contract security by validating inputs and state.\n\n## When to use it\n\nUse the `asserts!` function when you need to:\n\n- Validate conditions before proceeding with contract execution.\n- Ensure certain requirements are met before performing sensitive operations.\n- Provide clear error messages or codes when conditions are not satisfied.\n- Implement guard clauses to protect against invalid inputs or states.\n\n## Best Practices\n\n- Use `asserts!` early in functions to validate preconditions.\n- Provide meaningful error values that can be easily interpreted by users or other contracts.\n- Combine multiple conditions using `and` or `or` for complex assertions.\n- Consider using `asserts!` in combination with `unwrap!` for handling optional values.\n\n## Practical Example: Token Transfer with Balance Check\n\nLet's implement a simple token transfer function that uses `asserts!` to check the sender's balance:\n\n```clarity\n(define-map Balances principal uint)\n\n(define-public (transfer (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? Balances tx-sender)))\n )\n (asserts! (>= senderBalance amount) (err u1)) ;; Insufficient balance\n (asserts! (not (is-eq tx-sender recipient)) (err u2)) ;; Can't send to self\n \n (map-set Balances tx-sender (- senderBalance amount))\n (map-set Balances recipient (+ (default-to u0 (map-get? Balances recipient)) amount))\n (ok true)\n )\n)\n\n(map-set Balances tx-sender u1000) ;; Set the sender's balance to 1000\n\n;; Usage\n(transfer u100 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5) ;; Returns (ok true)\n(transfer u100 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM) ;; Returns (err u2) Can't send to self\n(transfer u1000 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5) ;; Returns (err u1) Insufficient balance\n```\n\nThis example demonstrates:\n1. Using `asserts!` to check if the sender has sufficient balance before transferring.\n2. Using `asserts!` to prevent sending tokens to oneself.\n3. Providing different error codes for different types of failures.\n\n## Common Pitfalls\n\n1. Forgetting to handle the error case when calling functions that use `asserts!`.\n2. Using `asserts!` excessively, which can make code harder to read and maintain.\n3. Providing vague or unhelpful error values when assertions fail.\n\n## Related Functions\n\n- `unwrap!`: Used to extract values from optionals with a fallback error.\n- `unwrap-panic`: Similar to `unwrap!` but causes a panic instead of returning an error.\n- `try!`: Used for propagating errors in a chain of operations.\n\n## Conclusion\n\nThe `asserts!` function is a powerful tool for implementing conditional checks and enforcing invariants in Clarity smart contracts. By using it effectively, you can create more robust and secure contracts that gracefully handle edge cases and provide meaningful feedback when conditions are not met.\n"],[161,"\n## Function Signature\n\n```clarity\n(at-block id-block-hash expr)\n```\n\n\n- Input: \n - `id-block-hash`: A 32-byte buffer representing a block hash\n - `expr`: An expression to be evaluated\n- Output: The result of evaluating `expr`\n\n## Why it matters\n\nThe `at-block` function is crucial for:\n\n1. Accessing historical contract state at a specific block.\n2. Implementing time-dependent logic based on blockchain state.\n3. Verifying past conditions or values in the contract.\n4. Creating mechanisms that depend on specific blockchain checkpoints.\n\n## When to use it\n\nUse the `at-block` function when you need to:\n\n- Evaluate contract state or expressions as they were at a specific past block.\n- Implement logic that depends on historical blockchain data.\n- Verify past conditions without relying on stored state.\n- Create time-locked or checkpoint-based features in your contract.\n\n## Best Practices\n\n- Only use `at-block` when historical data is necessary, as it can be computationally expensive.\n- Ensure the block hash used is from the `id-header-hash` property, not `header-hash`.\n- Use read-only expressions within `at-block` to maintain determinism.\n- Be aware of the potential for chain reorganizations when using recent block hashes.\n\n## Practical Example: Historical Price Check\n\nLet's implement a simple function that checks if a price was above a certain threshold at a specific block:\n\n```clarity\n(define-map AssetPrices uint uint)\n\n(define-public (set-price (price uint))\n (ok (map-set AssetPrices block-height price))\n)\n\n(define-read-only (was-price-above-at-block (threshold uint) (blockHash (buff 32)))\n (at-block blockHash\n (let\n (\n (pastPrice (default-to u0 (map-get? AssetPrices block-height)))\n )\n (> pastPrice threshold)\n )\n )\n)\n\n;; Usage\n(set-price u100)\n;; ... several blocks later\n(was-price-above-at-block u50 0x123456...) ;; Returns true if the price was above 50 at the specified block\n```\n\n\nThis example demonstrates:\n1. Using `at-block` to evaluate a condition based on historical data.\n2. Combining `at-block` with map lookups to access past state.\n3. Implementing a read-only function that depends on blockchain history.\n\n## Common Pitfalls\n\n1. Using `header-hash` instead of `id-header-hash`, which can lead to inconsistencies across forks.\n2. Attempting to modify state within an `at-block` expression, which is not allowed.\n3. Overusing `at-block`, which can lead to performance issues due to the cost of historical lookups.\n\n## Related Functions\n\n- `get-block-info?`: Used to retrieve information about specific blocks.\n- `block-height`: Often used in conjunction with `at-block` for time-based logic.\n- `id-header-hash`: Provides the correct hash to use with `at-block`.\n\n## Conclusion\n\nThe `at-block` function is a powerful tool for implementing history-dependent logic in Clarity smart contracts. By allowing contracts to evaluate expressions as they would have at a specific past block, it enables sophisticated time-based mechanisms and historical verifications. However, this function should be used judiciously due to its potential performance impact and the complexities of working with blockchain history.\n"],[163,"\n## Function Signature\n\n```clarity\n(begin expr1 expr2 expr3 ... expr-last)\n```\n\n\n- Input: Two or more expressions of any type\n- Output: The value of the last expression\n\n## Why it matters\n\nThe `begin` function is crucial for:\n\n1. Grouping multiple expressions into a single expression.\n2. Executing a series of operations in a specific order.\n3. Creating complex logic flows within functions or conditions.\n4. Allowing side effects while returning a specific value.\n\n## When to use it\n\nUse the `begin` function when you need to:\n\n- Perform multiple operations in sequence within a single expression.\n- Execute side effects before returning a final value.\n- Group multiple expressions where only one is allowed (e.g., in function bodies or condition branches).\n- Create more complex, multi-step logic within your smart contract functions.\n\n## Best Practices\n\n- Use `begin` to keep related operations together for better readability.\n- Ensure that any expressions that return a response type (ok or err) are properly checked.\n- Be mindful of the order of expressions, as they are evaluated sequentially.\n- Use `begin` to make your code more expressive and easier to understand.\n\n## Practical Example: User Registration with Logging\n\nLet's implement a simple user registration function that performs multiple actions:\n\n```clarity\n(define-map Users principal bool)\n(define-data-var userCount uint u0)\n\n(define-public (register-user)\n (begin\n (asserts! (is-none (map-get? Users tx-sender)) (err u1))\n (map-set Users tx-sender true)\n (var-set userCount (+ (var-get userCount) u1))\n (print { registered: true, user: tx-sender })\n (ok true)\n )\n)\n\n;; Usage\n(register-user) ;; Returns (ok true) and logs the new user\n```\n\n\nThis example demonstrates:\n1. Using `begin` to group multiple operations in a single function.\n2. Performing checks, updates, and logging in a specific order.\n3. Executing side effects (printing) before returning the final value.\n\n## Common Pitfalls\n\n1. Forgetting to return a value in the last expression of a `begin` block.\n2. Not properly handling responses from functions that return (ok) or (err) within the `begin` block.\n3. Relying on side effects of earlier expressions without considering their order of execution.\n\n## Related Functions\n\n- `let`: Used for creating local bindings within a limited scope.\n- `asserts!`: Often used within `begin` blocks for condition checking.\n- `print`: Useful for logging within `begin` blocks during development.\n\n## Conclusion\n\nThe `begin` function is a fundamental tool in Clarity for grouping multiple expressions and creating more complex logic flows. By allowing you to execute a series of operations in a specific order while returning a single value, `begin` enhances the expressiveness and capability of Clarity smart contracts. When used judiciously, this function can significantly improve code readability and organization.\n"],[187,"\n## Function Signature\n\n```clarity\n(bit-not i1)\n```\n\n- Input: An integer (`int` or `uint`)\n- Output: An integer of the same type as the input (`int` or `uint`)\n\n## Why it matters\n\nThe `bit-not` function is crucial for:\n\n1. Performing bitwise complement operations in smart contracts.\n2. Implementing certain logical operations and algorithms.\n3. Manipulating binary data at the bit level.\n4. Creating bitmasks for various purposes.\n\n## When to use it\n\nUse the `bit-not` function when you need to:\n\n- Invert all bits in an integer value.\n- Create a bitmask for bitwise operations.\n- Implement certain cryptographic or hashing algorithms.\n- Perform low-level data manipulations.\n\n## Best Practices\n\n- Be aware of the differences between signed (`int`) and unsigned (`uint`) integers when using `bit-not`.\n- Remember that `bit-not` on a `uint` will result in a large positive number due to two's complement representation.\n- Use `bit-not` in combination with other bitwise operations (`bit-and`, `bit-or`, `bit-xor`) for complex bit manipulations.\n- Consider the readability of your code when using bitwise operations extensively.\n\n## Practical Example: Simple Flag System\n\nLet's implement a simple flag system using `bit-not` and other bitwise operations:\n\n```clarity\n(define-constant FLAG_A u1) ;; 0001\n(define-constant FLAG_B u2) ;; 0010\n(define-constant FLAG_C u4) ;; 0100\n(define-constant FLAG_D u8) ;; 1000\n\n(define-data-var userFlags uint u0)\n\n(define-public (toggle-flag (flag uint))\n (ok (var-set userFlags (bit-xor (var-get userFlags) flag)))\n)\n\n(define-public (clear-all-flags-except (flag uint))\n (ok (var-set userFlags (bit-and (var-get userFlags) flag)))\n)\n\n(define-public (set-all-flags-except (flag uint))\n (ok (var-set userFlags (bit-and (bit-not (var-get userFlags)) flag)))\n)\n\n(define-read-only (has-flag (flag uint))\n (is-eq flag (bit-and (var-get userFlags) flag))\n)\n```\n\nThis example demonstrates:\n1. Using `bit-not` in combination with `bit-and` to set all flags except a specific one.\n2. Implementing a flag system using bitwise operations for efficient storage and manipulation.\n3. Combining `bit-not` with other bitwise operations for complex flag manipulations.\n\n## Common Pitfalls\n\n1. Forgetting that `bit-not` on a `uint` results in a large positive number, not a negative number.\n2. Overlooking the sign bit when using `bit-not` with signed integers.\n3. Not considering the full range of bits when applying `bit-not` to smaller integer values.\n\n## Related Functions\n\n- `bit-and`: Used for bitwise AND operations.\n- `bit-or`: Used for bitwise OR operations.\n- `bit-xor`: Used for bitwise XOR operations.\n- `bit-shift-left`: Used for left-shifting bits.\n- `bit-shift-right`: Used for right-shifting bits.\n\n## Conclusion\n\nThe `bit-not` function is a powerful tool for bitwise operations in Clarity smart contracts. When used in combination with other bitwise functions, this function enables efficient implementation of flags, bitmasks, and low-level data manipulations. However, you should be mindful of the differences between signed and unsigned integers and the potential for unexpected results when not used carefully.\n"],[130,"\n## Function Signature\n\n```clarity\n(bit-or i1 i2...)\n```\n\n- Input: Two or more integers (`int` or `uint`)\n- Output: An integer of the same type as the inputs (`int` or `uint`)\n\n## Why it matters\n\nThe `bit-or` function is crucial for:\n\n1. Performing bitwise OR operations in smart contracts.\n2. Combining flags or bitmasks efficiently.\n3. Implementing certain logical operations and algorithms.\n4. Manipulating binary data at the bit level.\n\n## When to use it\n\nUse the `bit-or` function when you need to:\n\n- Combine multiple flags or bitmasks into a single value.\n- Set specific bits in an integer without affecting others.\n- Implement certain bitwise algorithms or data structures.\n- Perform low-level data manipulations involving binary operations.\n\n## Best Practices\n\n- Ensure all input values are of the same type (either all `int` or all `uint`).\n- Remember that `bit-or` with `0` has no effect, which can be useful for conditional operations.\n- Use `bit-or` in combination with other bitwise operations for complex bit manipulations.\n- Consider readability when using bitwise operations extensively; add comments to explain the purpose.\n\n## Practical Example: Permission System\n\nLet's implement a simple permission system using `bit-or` and other bitwise operations:\n\n```clarity\n(define-constant PERMISSION_READ u1) ;; 0001\n(define-constant PERMISSION_WRITE u2) ;; 0010\n(define-constant PERMISSION_EXECUTE u4) ;; 0100\n(define-constant PERMISSION_ADMIN u8) ;; 1000\n\n(define-map UserPermissions principal uint)\n\n(define-public (grant-permission (user principal) (permission uint))\n (let\n (\n (currentPermissions (default-to u0 (map-get? UserPermissions user)))\n )\n (ok (map-set UserPermissions user (bit-or currentPermissions permission)))\n )\n)\n\n(define-public (revoke-permission (user principal) (permission uint))\n (let\n (\n (currentPermissions (default-to u0 (map-get? UserPermissions user)))\n )\n (ok (map-set UserPermissions user (bit-and currentPermissions (bit-not permission))))\n )\n)\n\n(define-read-only (has-permission (user principal) (permission uint))\n (let\n (\n (userPermission (default-to u0 (map-get? UserPermissions user)))\n )\n (is-eq permission (bit-and userPermission permission))\n )\n)\n\n;; Usage\n(grant-permission tx-sender (bit-or PERMISSION_READ PERMISSION_WRITE))\n(has-permission tx-sender PERMISSION_READ) ;; Returns true\n(has-permission tx-sender PERMISSION_EXECUTE) ;; Returns false\n```\n\n\n\nThis example demonstrates:\n1. Using `bit-or` to combine multiple permissions into a single value.\n2. Implementing a permission system using bitwise operations for efficient storage and checks.\n3. Combining `bit-or` with other bitwise operations like `bit-and` and `bit-not` for complex permission management.\n\n## Common Pitfalls\n\n1. Mixing signed (`int`) and unsigned (`uint`) integers in a single `bit-or` operation.\n2. Forgetting that `bit-or` with all bits set (`-1` for `int`, maximum value for `uint`) always results in all bits set.\n3. Not considering the full range of bits when using `bit-or` with smaller integer values.\n\n## Related Functions\n\n- `bit-and`: Used for bitwise AND operations.\n- `bit-xor`: Used for bitwise XOR operations.\n- `bit-not`: Used for bitwise NOT operations.\n- `bit-shift-left`: Used for left-shifting bits.\n- `bit-shift-right`: Used for right-shifting bits.\n\n## Conclusion\n\nThe `bit-or` function is a powerful tool for bitwise operations in Clarity smart contracts. When used in combination with other bitwise functions, this function enables efficient implementation of flags, permissions, and other bit-level data manipulations. However, be mindful of the types of integers used and the effects of the operation on the full range of bits to avoid unexpected results.\n"],[174,"\n## Function Signature\n\n```clarity\n(bit-shift-left i1 shamt)\n```\n\n- Input: \n - `i1`: An integer (`int` or `uint`)\n - `shamt`: A `uint` representing the number of places to shift\n- Output: An integer of the same type as `i1` (`int` or `uint`)\n\n## Why it matters\n\nThe `bit-shift-left` function is crucial for:\n\n1. Implementing certain bitwise algorithms and data structures.\n2. Manipulating binary data at the bit level.\n3. Creating bitmasks for various purposes.\n4. Low-level optimizations in specific scenarios.\n\n## When to use it\n\nUse the `bit-shift-left` function when you need to:\n\n- Implement certain cryptographic or hashing algorithms.\n- Perform low-level data manipulations involving binary operations.\n- Create specific bit patterns or masks.\n- Optimize certain bitwise operations.\n\n## Best Practices\n\n- Remember that shifting beyond the bit width of the integer (128 bits in Clarity) will result in zero.\n- Use `uint` for `shamt` to avoid potential issues with negative shift amounts.\n- Be aware of the potential for overflow when shifting left, especially with large numbers or shift amounts.\n- For multiplication by powers of 2, use the `pow` function instead, as it provides built-in overflow protection.\n\n## Practical Example: Flag Management\n\nLet's implement a simple flag management system using `bit-shift-left`:\n\n```clarity\n(define-constant FLAG_READ u1)\n(define-constant FLAG_WRITE u2)\n(define-constant FLAG_EXECUTE u4)\n\n(define-read-only (create-flag (flagPosition uint))\n (bit-shift-left u1 flagPosition)\n)\n\n(define-read-only (set-flag (currentFlags uint) (flag uint))\n (bit-or currentFlags flag)\n)\n\n(define-read-only (check-flag (flags uint) (flag uint))\n (is-eq (bit-and flags flag) flag)\n)\n\n;; Usage\n(set-flag (bit-or FLAG_READ FLAG_WRITE) FLAG_EXECUTE) ;; Returns u7 (READ | WRITE | EXECUTE)\n(check-flag u7 FLAG_WRITE) ;; Returns true\n(check-flag u7 (create-flag u3)) ;; Returns false\n```\n\nThis example demonstrates:\n1. Using `bit-shift-left` to create individual flags.\n2. Combining `bit-shift-left` with `bit-or` to set flags.\n3. Using `bit-and` to check if a specific flag is set.\n\n## Common Pitfalls\n\n1. Using `bit-shift-left` for multiplication without considering overflow risks.\n2. Not considering the modulo behavior when shifting by amounts greater than or equal to 128.\n3. Using a negative or non-uint value for the shift amount, which is not allowed.\n\n## Related Functions\n\n- `bit-shift-right`: Used for right-shifting bits.\n- `bit-and`: Often used in combination with `bit-shift-left` for masking operations.\n- `bit-or`: Used for combining flags or masks created with `bit-shift-left`.\n- `pow`: Preferred for safe multiplication by powers of 2.\n\n## Conclusion\n\nThe `bit-shift-left` function is a powerful tool for bitwise operations in Clarity smart contracts. This function is essential for creating bitmasks, implementing various bitwise algorithms, and performing low-level optimizations. However, you should be cautious about potential overflows and avoid using it for general multiplication tasks, where the `pow` function is more appropriate due to its built-in overflow protection.\n"],[145,"\n## Function Signature\n\n```clarity\n(bit-shift-right i1 shamt)\n```\n\n- Input: \n - `i1`: An integer (`int` or `uint`)\n - `shamt`: A `uint` representing the number of places to shift\n- Output: An integer of the same type as `i1` (`int` or `uint`)\n\n## Why it matters\n\nThe `bit-shift-right` function is crucial for:\n\n1. Performing efficient division by powers of 2.\n2. Implementing certain bitwise algorithms and data structures.\n3. Manipulating binary data at the bit level.\n4. Extracting specific bit patterns from integers.\n\n## When to use it\n\nUse the `bit-shift-right` function when you need to:\n\n- Divide a number by a power of 2 efficiently.\n- Implement certain cryptographic or hashing algorithms.\n- Perform low-level data manipulations involving binary operations.\n- Extract specific bits or bit patterns from integers.\n\n## Best Practices\n\n- Be aware that shifting right by `n` bits is equivalent to integer division by 2^n.\n- Remember that for signed integers (`int`), the sign bit is preserved during right shifts.\n- Use `uint` for `shamt` to avoid potential issues with negative shift amounts.\n- Consider the differences in behavior between signed and unsigned integers when right-shifting.\n\n## Practical Example: Efficient Power of 2 Division\n\nLet's implement a function that efficiently divides by powers of 2 using `bit-shift-right`:\n\n```clarity\n(define-read-only (divide-by-power-of-2 (value int) (power uint))\n (bit-shift-right value power)\n)\n\n(define-read-only (extract-lowest-bits (value uint) (numBits uint))\n (bit-and value (- (bit-shift-left u1 numBits) u1))\n)\n\n;; Usage\n(divide-by-power-of-2 128 u3) ;; Returns 16 (128 / 2^3)\n(divide-by-power-of-2 -128 u3) ;; Returns -16 (-128 / 2^3)\n(extract-lowest-bits u171 u4) ;; Returns u11 (binary: 1011)\n```\n\nThis example demonstrates:\n1. Using `bit-shift-right` for efficient division by powers of 2.\n2. Handling both positive and negative numbers in division.\n3. Combining `bit-shift-right` with other bitwise operations to extract specific bit patterns.\n\n## Common Pitfalls\n\n1. Forgetting that right-shifting signed integers preserves the sign bit.\n2. Not considering the modulo behavior when shifting by amounts greater than or equal to 128.\n3. Using a negative or non-uint value for the shift amount, which is not allowed.\n\n## Related Functions\n\n- `bit-shift-left`: Used for left-shifting bits.\n- `bit-and`: Often used in combination with `bit-shift-right` for masking operations.\n- `/`: Used for general division, but less efficient for powers of 2 compared to bit shifting.\n\n## Conclusion\n\nThe `bit-shift-right` function is a powerful tool for bitwise operations in Clarity smart contracts. This function enables efficient division by powers of 2 and is essential for extracting specific bit patterns and implementing various bitwise algorithms. However, be mindful of the differences between signed and unsigned integers when using this function, as well as its behavior with large shift amounts.\n"],[128,"\n## Function Signature\n\n```clarity\n(bit-xor i1 i2...)\n```\n\n- Input: Two or more integers (`int` or `uint`)\n- Output: An integer of the same type as the inputs (`int` or `uint`)\n\n## Why it matters\n\nThe `bit-xor` function is crucial for:\n\n1. Performing bitwise exclusive OR operations in smart contracts.\n2. Implementing certain cryptographic algorithms and hash functions.\n3. Creating toggle mechanisms for binary flags.\n4. Detecting changes between two bit patterns.\n\n## When to use it\n\nUse the `bit-xor` function when you need to:\n\n- Implement exclusive OR logic on binary data.\n- Toggle specific bits in a value without affecting others.\n- Compare two bit patterns to find differences.\n- Create simple encryption or hashing mechanisms.\n\n## Best Practices\n\n- Ensure all input values are of the same type (either all `int` or all `uint`).\n- Remember that `bit-xor` with 0 returns the original value, which can be useful for conditional operations.\n- Use `bit-xor` in combination with other bitwise operations for complex bit manipulations.\n- Consider the readability of your code when using bitwise operations extensively; add comments to explain the purpose.\n\n## Practical Example: Simple Toggle Mechanism\n\nLet's implement a simple toggle mechanism using `bit-xor`:\n\n```clarity\n(define-data-var flags uint u0)\n\n(define-read-only (get-flag (flagPosition uint))\n (is-eq (bit-and (var-get flags) (bit-shift-left u1 flagPosition)) u0)\n)\n\n(define-public (toggle-flag (flagPosition uint))\n (begin\n (asserts! (< flagPosition u8) (err u1)) ;; Ensure flag position is valid\n (ok (var-set flags (bit-xor (var-get flags) (bit-shift-left u1 flagPosition))))\n )\n)\n\n;; Usage\n(toggle-flag u2) ;; Toggles the 3rd bit (position 2)\n(get-flag u2) ;; Returns false\n(toggle-flag u2) ;; Toggles the 3rd bit again (position 2)\n(get-flag u2) ;; Returns true\n```\n\nThis example demonstrates:\n1. Using `bit-xor` to toggle individual bits in a flags variable.\n2. Combining `bit-xor` with other bitwise operations like `bit-and` and `bit-shift-left`.\n3. Implementing a simple flag system using bitwise operations for efficient storage and manipulation.\n\n## Common Pitfalls\n\n1. Mixing signed (`int`) and unsigned (`uint`) integers in a single `bit-xor` operation.\n2. Forgetting that `bit-xor` of a value with itself always results in 0.\n3. Not considering the full range of bits when using `bit-xor` with smaller integer values.\n\n## Related Functions\n\n- `bit-and`: Used for bitwise AND operations.\n- `bit-or`: Used for bitwise OR operations.\n- `bit-not`: Used for bitwise NOT operations.\n- `bit-shift-left`: Often used in combination with `bit-xor` for flag operations.\n- `bit-shift-right`: Used for right-shifting bits.\n\n## Conclusion\n\nThe `bit-xor` function is a powerful tool for bitwise operations in Clarity smart contracts. When used in combination with other bitwise functions, it enables efficient implementation of toggles, flags, and other bit-level data manipulations. To avoid unexpected results, be mindful of the types of integers used and the effects of the operation on the full range of bits.\n"],[87,"\n## Function Signature\n\n```clarity\n(buff-to-int-be (buff 16))\n```\n\n- Input: A byte buffer of up to 16 bytes\n- Output: A signed integer (`int`)\n\n## Why it matters\n\nThe `buff-to-int-be` function is crucial for:\n\n1. Converting byte data to signed integers in smart contracts.\n2. Handling data from external sources or other contracts that use big-endian encoding.\n3. Implementing protocols or algorithms that require big-endian integer representation.\n4. Interoperating with systems that use big-endian byte order.\n\n## When to use it\n\nUse the `buff-to-int-be` function when you need to:\n\n- Convert a big-endian encoded byte buffer to a signed integer.\n- Process input data that represents signed integers in big-endian format.\n- Implement cryptographic or mathematical operations that expect big-endian integer inputs.\n- Ensure compatibility with external systems using big-endian encoding.\n\n## Best Practices\n\n- Ensure the input buffer is no larger than 16 bytes to avoid errors.\n- Be aware that smaller buffers are zero-padded on the left, affecting the resulting integer value.\n- Consider using `buff-to-uint-be` for unsigned integers if the sign is not needed.\n- Handle potential errors when the input buffer might be invalid or empty.\n\n## Practical Example: Decoding a Signed Integer from External Data\n\nLet's implement a function that processes external data containing a big-endian encoded signed integer:\n\n```clarity\n(define-read-only (process-external-data (data (buff 16)))\n (let\n (\n (value (buff-to-int-be data))\n )\n (if (< value 0)\n (err \"Negative value not allowed\")\n (ok value)\n )\n )\n)\n\n;; Usage\n(process-external-data 0x0000000000000001) ;; Returns (ok 1)\n(process-external-data 0xffffffffffffffff) ;; Returns (err \"Negative value not allowed\")\n(process-external-data 0x7fffffffffffffff) ;; Returns (ok 9223372036854775807)\n```\n\nThis example demonstrates:\n1. Using `buff-to-int-be` to convert external data to a signed integer.\n2. Handling both positive and negative values resulting from the conversion.\n3. Implementing input validation based on the converted integer value.\n\n## Common Pitfalls\n\n1. Forgetting that the function interprets the input as big-endian, which might lead to unexpected values if the data is actually little-endian.\n2. Not handling potential negative values when working with signed integers.\n3. Assuming a specific buffer length, which could lead to unexpected results with shorter inputs due to left-padding.\n\n## Related Functions\n\n- `buff-to-int-le`: Converts a byte buffer to a signed integer using little-endian encoding.\n- `buff-to-uint-be`: Converts a byte buffer to an unsigned integer using big-endian encoding.\n- `int-to-ascii`: Converts an integer to its ASCII string representation.\n\n## Conclusion\n\nThe `buff-to-int-be` function is a powerful tool for working with big-endian encoded signed integers in Clarity smart contracts. By understanding its behavior with different input sizes and potential sign issues, you can effectively process and validate external data, implement complex algorithms, and ensure compatibility with big-endian systems in your smart contract applications.\n"],[179,"\n## Function Signature\n\n```clarity\n(buff-to-int-le (buff 16))\n```\n\n- Input: A byte buffer of up to 16 bytes\n- Output: A signed integer (`int`)\n\n## Why it matters\n\nThe `buff-to-int-le` function is crucial for:\n\n1. Converting byte data to signed integers using little-endian encoding.\n2. Handling data from external sources or other contracts that use little-endian encoding.\n3. Implementing protocols or algorithms that require little-endian integer representation.\n4. Interoperating with systems that use little-endian byte order.\n\n## When to use it\n\nUse the `buff-to-int-le` function when you need to:\n\n- Convert a little-endian encoded byte buffer to a signed integer.\n- Process input data that represents signed integers in little-endian format.\n- Implement cryptographic or mathematical operations that expect little-endian integer inputs.\n- Ensure compatibility with external systems using little-endian encoding.\n\n## Best Practices\n\n- Ensure the input buffer is no larger than 16 bytes to avoid errors.\n- Be aware that smaller buffers are zero-padded on the right, affecting the resulting integer value.\n- Consider using `buff-to-uint-le` for unsigned integers if the sign is not needed.\n- Handle potential errors when the input buffer might be invalid or empty.\n\n## Practical Example: Decoding a Signed Integer from External Data\n\nLet's implement a function that processes external data containing a little-endian encoded signed integer:\n\n```clarity\n(define-read-only (process-external-data-le (data (buff 16)))\n (let\n (\n (value (buff-to-int-le data))\n )\n (if (< value 0)\n (err \"Negative value not allowed\")\n (ok value)\n )\n )\n)\n\n;; Usage\n(process-external-data-le 0x01000000000000000000000000000000) ;; Returns (ok 1)\n(process-external-data-le 0xffffffffffffffffffffffffffffffff) ;; Returns (err \"Negative value not allowed\")\n(process-external-data-le 0xffffffffffffffffffffffffffffff7f) ;; Returns (ok 9223372036854775807)\n```\n\nThis example demonstrates:\n1. Using `buff-to-int-le` to convert external data to a signed integer.\n2. Handling both positive and negative values resulting from the conversion.\n3. Implementing input validation based on the converted integer value.\n\n## Common Pitfalls\n\n1. Confusing little-endian with big-endian encoding, leading to incorrect integer values.\n2. Not handling potential negative values when working with signed integers.\n3. Assuming a specific buffer length, which could lead to unexpected results with shorter inputs due to right-padding.\n\n## Related Functions\n\n- `buff-to-int-be`: Converts a byte buffer to a signed integer using big-endian encoding.\n- `buff-to-uint-le`: Converts a byte buffer to an unsigned integer using little-endian encoding.\n- `int-to-ascii`: Converts an integer to its ASCII string representation.\n\n## Conclusion\n\nThe `buff-to-int-le` function is a powerful tool for working with little-endian encoded signed integers in Clarity smart contracts. By understanding its behavior with different input sizes and potential sign issues, you can effectively process and validate external data, implement complex algorithms, and ensure compatibility with little-endian systems in your smart contract applications.\n"],[133,"\n## Function Signature\n\n```clarity\n(buff-to-uint-be (buff 16))\n```\n\n- Input: A byte buffer of up to 16 bytes\n- Output: An unsigned integer (`uint`)\n\n## Why it matters\n\nThe `buff-to-uint-be` function is crucial for:\n\n1. Converting byte data to unsigned integers using big-endian encoding.\n2. Handling data from external sources or other contracts that use big-endian encoding.\n3. Implementing protocols or algorithms that require big-endian integer representation.\n4. Interoperating with systems that use big-endian byte order.\n\n## When to use it\n\nUse the `buff-to-uint-be` function when you need to:\n\n- Convert a big-endian encoded byte buffer to an unsigned integer.\n- Process input data that represents unsigned integers in big-endian format.\n- Implement cryptographic or mathematical operations that expect big-endian integer inputs.\n- Ensure compatibility with external systems using big-endian encoding.\n\n## Best Practices\n\n- Ensure the input buffer is no larger than 16 bytes to avoid errors.\n- Be aware that smaller buffers are zero-padded on the left, affecting the resulting integer value.\n- Use `buff-to-int-be` if you need to handle signed integers instead.\n- Handle potential errors when the input buffer might be invalid or empty.\n\n## Practical Example: Decoding an Unsigned Integer from External Data\n\nLet's implement a function that processes external data containing a big-endian encoded unsigned integer:\n\n```clarity\n(define-read-only (process-external-data (data (buff 16)))\n (let\n (\n (value (buff-to-uint-be data))\n )\n (if (> value u1000000)\n (err \"Value too large\")\n (ok value)\n )\n )\n)\n\n;; Usage\n(process-external-data 0x00000001) ;; Returns (ok u1)\n(process-external-data 0x000f4240) ;; Returns (ok u1000000)\n(process-external-data 0x00989680) ;; Returns (err \"Value too large\")\n```\n\nThis example demonstrates:\n1. Using `buff-to-uint-be` to convert external data to an unsigned integer.\n2. Implementing input validation based on the converted integer value.\n3. Handling different input sizes and values.\n\n## Common Pitfalls\n\n1. Forgetting that the function interprets the input as big-endian, which might lead to unexpected values if the data is actually little-endian.\n2. Not considering the full range of possible uint values when processing the result.\n3. Assuming a specific buffer length, which could lead to unexpected results with shorter inputs due to left-padding.\n\n## Related Functions\n\n- `buff-to-uint-le`: Converts a byte buffer to an unsigned integer using little-endian encoding.\n- `buff-to-int-be`: Converts a byte buffer to a signed integer using big-endian encoding.\n- `uint-to-buff`: Converts an unsigned integer to a byte buffer.\n\n## Conclusion\n\nThe `buff-to-uint-be` function is a powerful tool for working with big-endian encoded unsigned integers in Clarity smart contracts. By understanding its behavior with different input sizes and potential edge cases, you can effectively process and validate external data, implement complex algorithms, and ensure compatibility with big-endian systems in your smart contract applications.\n"],[158,"\n## Function Signature\n\n```clarity\n(buff-to-uint-le (buff 16))\n```\n\n- Input: A byte buffer of up to 16 bytes\n- Output: An unsigned integer (`uint`)\n\n## Why it matters\n\nThe `buff-to-uint-le` function is crucial for:\n\n1. Converting byte data to unsigned integers using little-endian encoding.\n2. Handling data from external sources or other contracts that use little-endian encoding.\n3. Implementing protocols or algorithms that require little-endian integer representation.\n4. Interoperating with systems that use little-endian byte order.\n\n## When to use it\n\nUse the `buff-to-uint-le` function when you need to:\n\n- Convert a little-endian encoded byte buffer to an unsigned integer.\n- Process input data that represents unsigned integers in little-endian format.\n- Implement cryptographic or mathematical operations that expect little-endian integer inputs.\n- Ensure compatibility with external systems using little-endian encoding.\n\n## Best Practices\n\n- Ensure the input buffer is no larger than 16 bytes to avoid errors.\n- Be aware that smaller buffers are zero-padded on the right, affecting the resulting integer value.\n- Use `buff-to-int-le` if you need to handle signed integers instead.\n- Handle potential errors when the input buffer might be invalid or empty.\n\n## Practical Example: Decoding an Unsigned Integer from External Data\n\nLet's implement a function that processes external data containing a little-endian encoded unsigned integer:\n\n```clarity\n(define-read-only (process-external-data-le (data (buff 16)))\n (let\n (\n (value (buff-to-uint-le data))\n )\n (if (> value u1000000)\n (err \"Value too large\")\n (ok value)\n )\n )\n)\n\n;; Usage\n(process-external-data-le 0x01000000) ;; Returns (ok u1)\n(process-external-data-le 0x40420f00) ;; Returns (ok u1000000)\n(process-external-data-le 0x80969800) ;; Returns (err \"Value too large\")\n```\n\nThis example demonstrates:\n1. Using `buff-to-uint-le` to convert external data to an unsigned integer.\n2. Implementing input validation based on the converted integer value.\n3. Handling different input sizes and values.\n\n## Common Pitfalls\n\n1. Confusing little-endian with big-endian encoding, leading to incorrect integer values.\n2. Not considering the full range of possible uint values when processing the result.\n3. Assuming a specific buffer length, which could lead to unexpected results with shorter inputs due to right-padding.\n\n## Related Functions\n\n- `buff-to-uint-be`: Converts a byte buffer to an unsigned integer using big-endian encoding.\n- `buff-to-int-le`: Converts a byte buffer to a signed integer using little-endian encoding.\n- `uint-to-buff`: Converts an unsigned integer to a byte buffer.\n\n## Conclusion\n\nThe `buff-to-uint-le` function is a powerful tool for working with little-endian encoded unsigned integers in Clarity smart contracts. By understanding its behavior with different input sizes and potential edge cases, you can effectively process and validate external data, implement complex algorithms, and ensure compatibility with little-endian systems in your smart contract applications.\n"],[182,"\n## Function Signature\n\n```clarity\n(concat sequence1 sequence2)\n```\n\n- Input: Two sequences of the same type (`sequence_A`, `sequence_A`)\n- Output: A concatenated sequence of the same type (`sequence_A`)\n\n## Why it matters\n\nThe `concat` function is crucial for:\n\n1. Combining two sequences of the same type into a single sequence.\n2. Building longer strings, buffers, or lists from smaller components.\n3. Dynamically constructing data structures in smart contracts.\n4. Implementing string or data manipulation operations.\n\n## When to use it\n\nUse the `concat` function when you need to:\n\n- Join two strings together.\n- Combine two byte buffers into a single buffer.\n- Merge two lists into a single list.\n- Build complex data structures from simpler components.\n\n## Best Practices\n\n- Ensure that both input sequences are of the same type (e.g., both strings, both buffers, or both lists).\n- Be aware of the maximum length limitations for the resulting sequence type.\n- Consider using `concat` in combination with other sequence manipulation functions for more complex operations.\n- When working with strings, remember that Clarity distinguishes between ASCII and UTF-8 strings.\n\n## Practical Example: Dynamic Message Construction\n\nLet's implement a function that constructs a personalized message:\n\n```clarity\n(define-public (create-greeting (name (string-ascii 20)))\n (ok (concat (concat \"Hello, \" name) \"! Welcome to our dApp.\"))\n)\n\n;; Usage\n(create-greeting \"Alice\") ;; Returns (ok \"Hello, Alice! Welcome to our dApp.\")\n```\n\nThis example demonstrates:\n1. Using `concat` to join multiple string components.\n2. Nesting `concat` calls to build a more complex string.\n3. Combining static and dynamic parts of a message.\n\n## Common Pitfalls\n\n1. Attempting to concatenate sequences of different types, which will result in an error.\n2. Not considering the maximum length of the resulting sequence, potentially leading to truncation.\n3. Forgetting that `concat` only works with two sequences at a time, requiring nested calls for multiple concatenations.\n\n## Related Functions\n\n- `len`: Used to get the length of a sequence.\n- `slice?`: Can be used to extract parts of a sequence before concatenation.\n- `append`: Used to add elements to the end of a list (similar to `concat` for lists).\n\n## Conclusion\n\nThe `concat` function is a versatile tool for combining sequences in Clarity smart contracts. Whether you're working with strings, byte buffers, or lists, `concat` provides a straightforward way to join sequences together. By understanding its behavior and limitations, you can effectively use `concat` to build dynamic data structures and implement various string and data manipulation operations in your smart contracts.\n"],[86,"\n## Function Signature\n\n```clarity\n(contract-call? .contract-name function-name arg0 arg1 ...)\n```\n\n- Input: \n - `.contract-name`: The name of the contract to call\n - `function-name`: The name of the public function to execute\n - `arg0, arg1, ...`: Arguments to pass to the function\n- Output: `(response A B)` where A and B are the types returned by the called function\n\n## Why it matters\n\nThe `contract-call?` function is crucial for:\n\n1. Enabling inter-contract communication and composability.\n2. Allowing contracts to leverage functionality from other contracts.\n3. Building complex systems of interacting smart contracts.\n4. Implementing upgradeable contract patterns.\n\n## When to use it\n\nUse the `contract-call?` function when you need to:\n\n- Call a public function in another contract.\n- Interact with standardized contracts (e.g., token contracts).\n- Split complex logic across multiple contracts for better organization.\n- Implement upgradeable systems by calling into newer contract versions.\n\n## Best Practices\n\n- Always check the return value of `contract-call?` as it returns a response type.\n- Be aware that `contract-call?` cannot be used to call functions within the same contract.\n- Consider the gas costs of external contract calls in your overall transaction budget.\n- Use `as-contract` when appropriate to make calls with the contract's own principal.\n\n## Practical Example: Interacting with a Token Contract\n\nLet's implement a function that transfers tokens using a standard token contract:\n\n```clarity\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (contract-call? .token-contract transfer amount tx-sender recipient)\n)\n\n;; Usage\n(transfer-tokens u100 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM)\n```\n\nThis example demonstrates:\n1. Using `contract-call?` to interact with another contract (`.token-contract`).\n2. Passing arguments to the called function, including the current `tx-sender`.\n3. Returning the response from the called function directly.\n\n## Common Pitfalls\n\n1. Forgetting to handle the response from `contract-call?`, which can lead to unexpected behavior.\n2. Attempting to use `contract-call?` to call functions within the same contract, which is not allowed.\n3. Not considering the possibility of the called contract changing or being upgraded.\n\n## Related Functions\n\n- `as-contract`: Often used in combination with `contract-call?` to make calls as the contract principal.\n- `try!`: Useful for handling the response from `contract-call?` and propagating errors.\n- `unwrap!`: Can be used to extract the success value from a `contract-call?` response or return an error.\n\n## Conclusion\n\nThe `contract-call?` function is a fundamental building block for creating complex, interacting systems of smart contracts on the Stacks blockchain. By enabling contracts to call functions in other contracts, this function promotes code reuse, modularity, and upgradability. However, you must be careful to handle responses correctly and consider the implications of external calls on your contract's behavior and gas usage.\n"],[90,"\n## Function Signature\n\n```clarity\n(contract-of <trait-reference>)\n```\n\n- Input: A trait reference\n- Output: The principal of the contract implementing the trait\n\n## Why it matters\n\nThe `contract-of` function is crucial for:\n\n1. Retrieving the principal (address) of a contract implementing a specific trait.\n2. Enabling dynamic interactions with contracts based on traits.\n3. Implementing contract-agnostic functions that work with any contract adhering to a specific interface.\n4. Enhancing interoperability between contracts in a composable ecosystem.\n\n## When to use it\n\nUse the `contract-of` function when you need to:\n\n- Get the actual contract address from a trait reference.\n- Perform operations that require the contract's principal, such as authorization checks.\n- Implement functions that can work with multiple contracts implementing the same trait.\n- Debug or log information about which contract is being interacted with.\n- Manage routing logic between different versions of contracts for upgradeable smart contracts.\n- Implement access control mechanisms to restrict function calls to designated contracts.\n\n## Best Practices\n\n- Use `contract-of` in combination with traits to create more flexible and composable smart contracts.\n- Remember that `contract-of` returns a principal, which can be used in other Clarity functions expecting a contract address.\n- Consider using `contract-of` when implementing proxy or router contracts that work with multiple similar contracts.\n- Be aware that `contract-of` can only be used with trait references, not with direct contract references.\n\n## Practical Example: Modular Approach to Extension Contracts\n\nLet's implement a system where specific functions can only be called by designated extension contracts:\n\n### Define the Extension Trait\n\nFirst, define a trait for the extension contract:\n\n```clarity\n(define-trait extension-trait\n\t(\n\t\t(callback (principal (buff 34)) (response bool uint))\n\t)\n)\n```\n\n### Implement the Main Contract\n\nNext, implement the main contract with the `request-extension-callback` function:\n\n```clarity\n(use-trait extensionTrait .extension-trait.extension-trait)\n(define-map Extensions principal bool)\n\n(define-public (set-extension (extension principal) (enabled bool))\n (ok (map-set Extensions extension enabled))\n)\n\n(define-public (request-extension-callback (extension <extensionTrait>) (memo (buff 34)))\n (let\n (\n (sender tx-sender)\n )\n (asserts! (and (is-extension contract-caller) (is-eq contract-caller (contract-of extension))) (err u1))\n (as-contract (contract-call? extension callback sender memo))\n )\n)\n\n(define-read-only (is-extension (extension principal))\n (default-to false (map-get? Extensions extension))\n)\n```\n\n### Explanation\n\n1. **Define the Extension Trait**: The `extensionTrait` defines a `callback` function that the extension contract must implement.\n2. **Data Map for Valid Extensions**: `Extensions` is a map that stores the status (enabled/disabled) of extension contracts.\n3. **Public Function `set-extension`**: This function allows adding or removing an extension contract from the `Extensions` map.\n4. **Public Function `request-extension-callback`**: This function:\n - Retrieves the principal of the extension contract using `contract-of`.\n - Asserts that the caller is a valid extension and matches the extension principal.\n - Calls the `callback` function on the extension contract using `contract-call?`.\n5. **Read-Only Function `is-extension`**: This function checks if a given contract principal is in the `Extensions` map and is enabled.\n\n### Usage\n\n1. **Set an Extension**:\n ```clarity\n (set-extension 'SP2J4ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6 true)\n ```\n\n2. **Request Extension Callback**:\n ```clarity\n (request-extension-callback .extension-contract (buff 34 \"example memo\"))\n ```\n\nThis example demonstrates:\n1. Using `contract-of` to get the principal of the extension contract implementing the extension trait.\n2. Implementing a read-only function to check if the caller is a valid extension.\n3. Restricting access to certain functions based on the authorized extension contracts.\n4. Allowing the authorized extension contracts to call specific functions.\n\n## Common Pitfalls\n\n1. Attempting to use `contract-of` with a direct contract reference instead of a trait reference.\n2. Forgetting that `contract-of` returns a principal, not a contract reference itself.\n3. Not handling potential errors when working with trait references that might not be properly initialized.\n\n## Related Functions\n\n- `use-trait`: Used to define trait references that can be used with `contract-of`.\n- `contract-call?`: Often used in combination with `contract-of` to call functions on the retrieved contract.\n- `is-eq`: Can be used to compare the returned principal with known contract addresses.\n\n## Conclusion\n\nThe `contract-of` function is a powerful tool for creating flexible and interoperable smart contracts in Clarity. By allowing contracts to dynamically retrieve the principal of trait-implementing contracts, this function enables the creation of more generic and reusable code. When used effectively, `contract-of` can significantly enhance the composability and modularity of your smart contract ecosystem, especially in scenarios like access control management where restricting function calls to designated contracts is essential.\n"],[103,"\n## Function Signature\n\n```clarity\n(default-to default-value option-value)\n```\n\n- Input: \n - `default-value`: A value of type A\n - `option-value`: An optional value of type (optional A)\n- Output: A value of type A\n\n## Why it matters\n\nThe `default-to` function is crucial for:\n\n1. Safely handling optional values in smart contracts.\n2. Providing fallback values when dealing with potentially missing data.\n3. Simplifying code that works with map lookups or other operations that may return `none`.\n4. Improving readability by reducing nested conditionals for optional handling.\n\n## When to use it\n\nUse the `default-to` function when you need to:\n\n- Provide a default value for a map lookup that might return `none`.\n- Handle optional function parameters or return values.\n- Set a fallback value for potentially missing data in your contract logic.\n- Simplify error handling for operations that might not return a value.\n\n## Best Practices\n\n- Choose meaningful default values that make sense in the context of your contract logic.\n- Use `default-to` to make your code more concise and readable when dealing with optionals.\n- Consider the implications of using the default value in your contract's logic.\n- Combine `default-to` with other Clarity functions like `map-get?` for efficient data handling.\n\n## Practical Example: User Profile Lookup\n\nLet's implement a function that retrieves a user's profile information with default values:\n\n```clarity\n(define-map UserProfiles principal { name: (string-ascii 50), age: uint })\n\n(define-read-only (get-user-profile (user principal))\n (let\n (\n (profile (map-get? UserProfiles user))\n )\n {\n name: (default-to \"Anonymous\" (get name profile)),\n age: (default-to u0 (get age profile))\n }\n )\n)\n\n;; Usage\n(map-set UserProfiles tx-sender { name: \"Alice\", age: u30 })\n(get-user-profile tx-sender) ;; Returns { name: \"Alice\", age: u30 }\n(get-user-profile 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5) ;; Returns { name: \"Anonymous\", age: u0 }\n```\n\nThis example demonstrates:\n1. Using `default-to` with `map-get?` to handle potentially missing user profiles.\n2. Providing default values for individual fields within the profile.\n3. Creating a safe way to retrieve user information without explicit null checks.\n\n## Common Pitfalls\n\n1. Forgetting that `default-to` only works with optional types, not with general error handling.\n2. Using default values that might be indistinguishable from valid data, leading to confusion.\n3. Overusing `default-to` where explicit error handling might be more appropriate.\n\n## Related Functions\n\n- `map-get?`: Often used in combination with `default-to` for safe map lookups.\n- `get`: Can return optional values that are then handled by `default-to`.\n- `some`: Used to create optional values that can be handled by `default-to`.\n\n## Conclusion\n\nThe `default-to` function is a powerful tool for handling optional values in Clarity smart contracts. By providing a clean way to specify fallback values, this function enhances code readability and safety when dealing with potentially missing data. When used judiciously, `default-to` can significantly simplify your contract logic and make it more robust against unexpected inputs or states.\n"],[92,"\n## Function Signature\n\n```clarity\n(define-constant name expression)\n```\n\n- Input: \n - `name`: The name of the constant\n - `expression`: The value to be assigned to the constant\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-constant` function is crucial for:\n\n1. Declaring immutable values that can be reused throughout the contract.\n2. Improving code readability by giving meaningful names to fixed values.\n3. Optimizing gas costs by avoiding repeated computations of fixed values.\n4. Ensuring certain values remain unchanged throughout the contract's lifecycle.\n\n## When to use it\n\nUse `define-constant` when you need to:\n\n- Define fixed values that won't change during contract execution.\n- Create named constants for magic numbers or frequently used values.\n- Declare contract-wide configuration parameters.\n- Optimize gas usage for values that are computed but never change.\n\n## Best Practices\n\n- Use uppercase names for constants to distinguish them from variables.\n- Place constant definitions at the top of your contract for better visibility.\n- Use constants for values that are used multiple times in your contract.\n- Consider using constants for contract configuration that might need to change between deployments.\n\n## Practical Example: Token Configuration\n\nLet's implement a simple token contract using constants for configuration:\n\n```clarity\n(define-constant TOKEN_NAME \"DOG-GO-TO-THE-MOON\")\n(define-constant TOKEN_SYMBOL \"DOG\")\n(define-constant TOKEN_DECIMALS u6)\n(define-constant TOKEN_SUPPLY u1000000000000) ;; 1 million tokens with 6 decimals\n\n(define-fungible-token DOG-GO-TO-THE-MOON TOKEN_SUPPLY)\n\n(define-read-only (get-name)\n TOKEN_NAME\n)\n\n(define-read-only (get-symbol)\n TOKEN_SYMBOL\n)\n\n(define-read-only (get-decimals)\n TOKEN_DECIMALS\n)\n\n(define-read-only (get-balance (who principal))\n (ok (ft-get-balance DOG-GO-TO-THE-MOON who))\n)\n```\n\nThis example demonstrates:\n1. Using `define-constant` to set up token configuration parameters.\n2. Referencing these constants in various parts of the contract.\n3. Improving readability and maintainability of the contract.\n\n## Common Pitfalls\n\n1. Attempting to modify a constant after it's defined, which is not allowed.\n2. Using `define-constant` for values that need to change during contract execution (use `define-data-var` instead).\n3. Overusing constants for values used only once, which can decrease readability.\n\n## Related Functions\n\n- `define-data-var`: Used for defining mutable variables.\n- `define-map`: Used for defining data maps.\n- `var-get`: Used to retrieve the value of a data variable (not needed for constants).\n\n## Conclusion\n\nThe `define-constant` function is a powerful tool for creating immutable, named values in Clarity smart contracts. By using constants effectively, you can improve code readability, optimize gas usage, and ensure certain values remain fixed throughout your contract's lifecycle. When designing your contract, consider which values should be constants and which might need to be mutable variables.\n"],[100,"\n## Function Signature\n\n```clarity\n(define-data-var name type value)\n```\n\n- Input: \n - `name`: The name of the variable\n - `type`: The type of the variable\n - `value`: The initial value of the variable\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-data-var` function is crucial for:\n\n1. Creating mutable state variables that can be updated throughout the contract's lifecycle.\n2. Storing and managing changeable data within the smart contract.\n3. Implementing counters, flags, or other dynamic values that need to be modified.\n4. Maintaining contract-wide state that can be accessed and modified by multiple functions.\n\n## When to use it\n\nUse `define-data-var` when you need to:\n\n- Create a variable that will change its value during contract execution.\n- Implement a counter or accumulator that needs to be updated.\n- Store temporary or intermediate state that may be modified by contract functions.\n- Maintain configurable parameters that can be updated by authorized parties.\n\n## Best Practices\n\n- Use `define-data-var` for values that need to change; for immutable values, use `define-constant` instead.\n- Initialize variables with meaningful default values.\n- Consider access control for functions that modify important data variables.\n- Use clear and descriptive names for your variables to enhance readability.\n\n## Practical Example: Simple Counter\n\nLet's implement a basic counter using `define-data-var`:\n\n```clarity\n(define-data-var counter uint u0)\n\n(define-public (increment)\n (begin\n (var-set counter (+ (var-get counter) u1))\n (ok (var-get counter))\n )\n)\n\n(define-public (decrement)\n (begin\n (asserts! (> (var-get counter) u0) (err u\"Counter cannot be negative\"))\n (var-set counter (- (var-get counter) u1))\n (ok (var-get counter))\n )\n)\n\n(define-read-only (get-counter)\n (ok (var-get counter))\n)\n```\n\nThis example demonstrates:\n1. Using `define-data-var` to create a mutable counter.\n2. Implementing functions to increment and decrement the counter.\n3. Using `var-get` and `var-set` to read and modify the variable's value.\n4. Adding a safety check to prevent the counter from becoming negative.\n\n## Common Pitfalls\n\n1. Forgetting that `define-data-var` creates mutable state, which can lead to unexpected behavior if not managed carefully.\n2. Not considering the initial value's impact on contract logic, especially if the contract relies on the variable's state.\n3. Overusing mutable variables when constants or maps might be more appropriate for the use case.\n\n## Related Functions\n\n- `var-get`: Used to retrieve the current value of a data variable.\n- `var-set`: Used to update the value of a data variable.\n- `define-constant`: Used for defining immutable values.\n- `define-map`: Used for defining key-value stores when more complex data structures are needed.\n\n## Conclusion\n\nThe `define-data-var` function is essential for creating mutable state in Clarity smart contracts. It allows you to implement dynamic behavior and maintain changeable data throughout your contract's lifecycle. When used judiciously, data variables can greatly enhance the functionality and flexibility of smart contracts. However, you should be mindful of the implications of mutable state and ensure proper access control and error handling when modifying these variables.\n"],[160,"\n## Function Signature\n\n```clarity\n(define-fungible-token token-name <total-supply>)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n - `<total-supply>`: (Optional) An unsigned integer representing the total supply of tokens\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-fungible-token` function is crucial for:\n\n1. Creating new fungible tokens within a smart contract.\n2. Establishing a token economy or system within your dApp.\n3. Implementing custom tokens with specific supply constraints.\n4. Enabling token-related operations like minting, transferring, and burning.\n\n## When to use it\n\nUse `define-fungible-token` when you need to:\n\n- Create a new fungible token for your smart contract or dApp.\n- Implement a token with a fixed total supply.\n- Establish a foundation for token-based features in your contract.\n- Create utility tokens, governance tokens, or other custom fungible assets.\n\n## Best Practices\n\n- Place `define-fungible-token` at the top level of your contract, as it's a definition statement.\n- Consider carefully whether to specify a total supply or leave it unlimited.\n- Use meaningful and descriptive names for your tokens.\n- Implement proper access controls for minting and burning operations if required.\n\n## Practical Example: Simple Token Creation\n\nLet's implement a basic fungible token with a fixed supply:\n\n```clarity\n(define-fungible-token DOG-GO-TO-THE-MOON u1000000)\n\n(define-data-var tokenAdmin principal tx-sender)\n\n(define-public (transfer (amount uint) (sender principal) (recipient principal))\n (begin\n (asserts! (is-eq tx-sender sender) (err u1))\n (ft-transfer? DOG-GO-TO-THE-MOON amount sender recipient)\n )\n)\n\n(define-read-only (get-balance (account principal))\n (ok (ft-get-balance DOG-GO-TO-THE-MOON account))\n)\n\n(define-public (mint (amount uint) (recipient principal))\n (begin\n (asserts! (is-eq tx-sender (var-get tokenAdmin)) (err u3))\n (ft-mint? DOG-GO-TO-THE-MOON amount recipient)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `define-fungible-token` to create a new token with a fixed supply of 1,000,000.\n2. Implementing basic token operations like transfer and balance checking.\n3. Adding a mint function with admin-only access control.\n\n## Common Pitfalls\n\n1. Forgetting that omitting the total supply parameter allows unlimited minting, if not handled manually.\n2. Not implementing proper access controls for sensitive operations like minting.\n3. Overlooking the need for additional functionality like burning or pausing.\n\n## Related Functions\n\n- `ft-transfer?`: Used to transfer tokens between principals.\n- `ft-mint?`: Used to create new tokens (if allowed by the token definition).\n- `ft-burn?`: Used to destroy tokens, reducing the circulating supply.\n- `ft-get-balance`: Used to check the token balance of a principal.\n- `ft-get-supply`: Used to get the current total supply of tokens.\n\n## Conclusion\n\nThe `define-fungible-token` function is a fundamental building block for creating token-based systems in Clarity smart contracts. It allows you to define custom fungible tokens with or without supply constraints. When combined with other token-related functions, it enables the implementation of sophisticated token economies and financial instruments on the Stacks blockchain.\n"],[97,"\n## Function Signature\n\n```clarity\n(define-map map-name key-type value-type)\n```\n\n- Input: \n - `map-name`: The name of the map\n - `key-type`: The type of the map's keys\n - `value-type`: The type of the map's values\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-map` function is crucial for:\n\n1. Creating key-value stores within smart contracts.\n2. Efficiently organizing and accessing structured data.\n3. Implementing complex data structures like mappings or dictionaries.\n4. Storing and retrieving contract-specific data associated with unique keys.\n\n## When to use it\n\nUse `define-map` when you need to:\n\n- Store and retrieve data associated with unique keys.\n- Implement lookup tables or dictionaries in your contract.\n- Organize data that needs to be accessed by a specific identifier.\n- Create data structures that can be efficiently updated and queried.\n\n## Best Practices\n\n- Choose appropriate types for keys and values to ensure efficient storage and retrieval.\n- Use meaningful names for your maps that reflect their purpose in the contract.\n- Consider using composite keys (tuples) for more complex data relationships.\n- Be mindful of the gas costs associated with map operations, especially for large datasets.\n\n## Practical Example: Simple User Profile System\n\nLet's implement a basic user profile system using `define-map`:\n\n```clarity\n(define-map UserProfiles principal { name: (string-ascii 50), age: uint, isActive: bool })\n\n(define-public (set-profile (name (string-ascii 50)) (age uint))\n (ok (map-set UserProfiles tx-sender { name: name, age: age, isActive: true }))\n)\n\n(define-read-only (get-profile (user principal))\n (default-to { name: \"\", age: u0, isActive: false } (map-get? UserProfiles user))\n)\n\n(define-public (deactivate-profile)\n (match (map-get? UserProfiles tx-sender) profile\n (ok (map-set UserProfiles tx-sender (merge profile { isActive: false })))\n (err u404)\n )\n)\n\n;; Usage\n(set-profile \"Ryan\" u38)\n(get-profile tx-sender)\n(deactivate-profile)\n```\n\nThis example demonstrates:\n1. Using `define-map` to create a user profile storage system.\n2. Implementing functions to set, get, and update profile data.\n3. Using map operations like `map-set`, `map-get?`, and `merge` to manipulate map data.\n4. Handling cases where a profile might not exist using `default-to`.\n\n## Common Pitfalls\n\n1. Forgetting that maps are not iterable in Clarity; you can't loop through all entries.\n2. Not handling cases where a key might not exist in the map.\n3. Overusing maps for data that might be better suited for other data structures.\n4. Not considering the gas costs of map operations in complex contracts.\n\n## Related Functions\n\n- `map-get?`: Used to retrieve a value from a map, returns an optional.\n- `map-set`: Used to set or update a value in a map.\n- `map-delete`: Used to remove a key-value pair from a map.\n- `map-insert`: Used to insert a new key-value pair only if the key doesn't already exist.\n- `merge`: Used to merge two maps, combining their key-value pairs.\n\n## Conclusion\n\nThe `define-map` function is a powerful tool for creating structured data storage in Clarity smart contracts. It allows you to implement efficient key-value stores, enabling complex data relationships and lookups. When used effectively, maps can significantly enhance the functionality and organization of data within your smart contracts.\n"],[122,"\n## Function Signature\n\n```clarity\n(define-non-fungible-token asset-name asset-identifier-type)\n```\n\n- Input: \n - `asset-name`: The name of the non-fungible token class\n - `asset-identifier-type`: The type of the unique identifier for each token\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-non-fungible-token` function is crucial for:\n\n1. Creating new non-fungible token (NFT) classes within a smart contract.\n2. Establishing unique digital assets with individual identifiers.\n3. Implementing collectibles, digital art, or other unique token-based systems.\n4. Enabling NFT-related operations like minting, transferring, and ownership checks.\n\n## When to use it\n\nUse `define-non-fungible-token` when you need to:\n\n- Create a new NFT class for your smart contract or dApp.\n- Implement unique digital assets with distinct identifiers.\n- Establish a foundation for NFT-based features in your contract.\n- Create collectibles, digital art tokens, or other unique digital assets.\n\n## Best Practices\n\n- Place `define-non-fungible-token` at the top level of your contract, as it's a definition statement.\n- Choose an appropriate asset identifier type that ensures uniqueness for each token.\n- Use meaningful and descriptive names for your NFT classes.\n- Consider the scalability and gas costs associated with your chosen identifier type.\n\n## Practical Example: Simple Digital Art NFT\n\nLet's implement a basic digital art NFT system:\n\n```clarity\n(define-non-fungible-token SharkoBarko uint)\n\n(define-data-var index uint u0)\n\n(define-public (mint (who principal) (artwork-uri (string-utf8 256)))\n (let\n (\n (tokenId (var-get index))\n )\n (try! (nft-mint? SharkoBarko tokenId who))\n (var-set index (+ tokenId u1))\n (ok tokenId)\n )\n)\n\n(define-read-only (get-owner (tokenId uint))\n (ok (nft-get-owner? SharkoBarko tokenId))\n)\n\n(define-public (transfer (tokenId uint) (sender principal) (recipient principal))\n (begin\n (asserts! (is-eq tx-sender sender) (err u403))\n (nft-transfer? SharkoBarko tokenId sender recipient)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `define-non-fungible-token` to create a new NFT class for digital artwork.\n2. Implementing basic NFT operations like minting, checking ownership, and transferring.\n3. Using a simple incrementing integer as the token identifier.\n\n## Common Pitfalls\n\n1. Forgetting that each token in an NFT class must have a unique identifier.\n2. Not implementing proper access controls for minting and transferring operations.\n3. Choosing an identifier type that may lead to collisions or scalability issues.\n\n## Related Functions\n\n- `nft-mint?`: Used to create new tokens within the NFT class.\n- `nft-transfer?`: Used to transfer ownership of an NFT.\n- `nft-get-owner?`: Used to check the current owner of an NFT.\n- `nft-burn?`: Used to destroy an existing NFT.\n\n## Conclusion\n\nThe `define-non-fungible-token` function is a fundamental building block for creating NFT-based systems in Clarity smart contracts. It allows you to define custom non-fungible token classes with unique identifiers. When combined with other NFT-related functions, it enables the implementation of sophisticated systems for digital collectibles, art, and other unique digital assets on the Stacks blockchain.\n"],[129,"\n## Function Signature\n\n```clarity\n(define-private (function-name (arg-name-0 arg-type-0) ...) function-body)\n```\n\n- Input: \n - `function-name`: The name of the private function\n - `arg-name-N`: The name of each argument\n - `arg-type-N`: The type of each argument\n - `function-body`: The code to be executed when the function is called\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-private` function is crucial for:\n\n1. Creating internal helper functions that are only accessible within the contract.\n2. Encapsulating logic that shouldn't be directly callable from outside the contract.\n3. Improving code organization and reusability within a contract.\n4. Implementing complex operations that are used by multiple public functions.\n\n## When to use it\n\nUse `define-private` when you need to:\n\n- Create utility functions that are used by multiple public functions.\n- Implement complex logic that needs to be hidden from external callers.\n- Break down large functions into smaller, more manageable pieces.\n- Improve the readability and maintainability of your contract.\n\n## Best Practices\n\n- Use descriptive names for private functions to clearly indicate their purpose.\n- Keep private functions focused on a single task or operation.\n- Use private functions to avoid code duplication within your contract.\n- Remember that private functions can return any type, not just response types.\n\n## Practical Example: Helper Function for Validation\n\nLet's implement a private function for input validation:\n\n```clarity\n(define-private (validate-amount (amount uint))\n (and (> amount u0) (<= amount u1000000))\n)\n\n(define-public (transfer (recipient principal) (amount uint))\n (if (validate-amount amount)\n (begin\n ;; Perform transfer logic here\n (ok true)\n )\n (err u1)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `define-private` to create a helper function for input validation.\n2. Calling the private function from within a public function.\n3. Improving code readability by separating validation logic.\n\n## Common Pitfalls\n\n1. Attempting to call private functions from outside the contract, which is not allowed.\n2. Overusing private functions, leading to overly complex contract structure.\n3. Forgetting that private functions can modify contract state, which may lead to unexpected behavior if not carefully managed.\n\n## Related Functions\n\n- `define-public`: Used to define public functions that can be called from outside the contract.\n- `define-read-only`: Used to define public read-only functions that don't modify contract state.\n\n## Conclusion\n\nThe `define-private` function is a powerful tool for creating internal helper functions and encapsulating logic within Clarity smart contracts. By using private functions effectively, you can improve code organization, reduce duplication, and create more maintainable and secure smart contracts.\n"],[99,"\n## Function Signature\n\n```clarity\n(define-public (function-name (arg-name-0 arg-type-0) ...) function-body)\n```\n\n- Input: \n - `function-name`: The name of the public function\n - `arg-name-N`: The name of each argument\n - `arg-type-N`: The type of each argument\n - `function-body`: The code to be executed when the function is called\n- Output: A ResponseType (using `ok` or `err`)\n\n## Why it matters\n\nThe `define-public` function is crucial for:\n\n1. Creating functions that can be called from outside the contract.\n2. Enabling interaction with the contract through transactions.\n3. Implementing the main entry points for contract functionality.\n4. Allowing other contracts to call this contract's functions.\n\n## When to use it\n\nUse `define-public` when you need to:\n\n- Create functions that users can directly interact with.\n- Implement core contract functionality that should be accessible externally.\n- Define functions that other contracts can call via `contract-call?`.\n- Create functions that modify contract state and need to be invoked through transactions.\n\n## Best Practices\n\n- Always return a response type (`(response T E)`) from public functions.\n- Use descriptive names for public functions to clearly indicate their purpose.\n- Implement proper access control for sensitive operations.\n- Handle potential errors and edge cases within the function.\n- Consider gas costs when designing public functions.\n\n## Practical Examples\n\n### Example 1: Simple Counter\n\nLet's implement a simple counter that can be incremented by users:\n\n```clarity\n(define-data-var counter int 0)\n\n(define-public (increment-counter)\n (begin\n (var-set counter (+ (var-get counter) 1))\n (ok (var-get counter))\n )\n)\n```\n\nThis example demonstrates:\n1. Using `define-public` to create a function that can be called externally.\n2. Incrementing a counter and returning the new value.\n3. Returning a response type to indicate success.\n\n### Example 2: Setting a Value\n\nLet's implement a function that sets a value if it meets certain conditions:\n\n```clarity\n(define-data-var storedValue uint u0)\n\n(define-public (set-value (value uint))\n (if (> value u0)\n (begin\n (var-set storedValue value)\n (ok value)\n )\n (err u1)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `define-public` to create a function that can be called externally.\n2. Setting a value only if it meets a condition.\n3. Returning a response type to indicate success or failure.\n\n## Common Pitfalls\n\n1. Forgetting to return a response type, which will cause a contract to be invalid.\n2. Not implementing proper access controls, potentially allowing unauthorized actions.\n3. Overlooking potential error conditions or edge cases.\n4. Creating functions that are too complex or gas-intensive for practical use.\n\n## Related Functions\n\n- `define-private`: Used to define private functions that can only be called within the contract.\n- `define-read-only`: Used to define public read-only functions that don't modify contract state.\n- `contract-call?`: Used by other contracts to call public functions defined with `define-public`.\n\n## Conclusion\n\nThe `define-public` function is a fundamental building block for creating interactive and composable smart contracts in Clarity. By defining public functions, you can create contracts that users and other contracts can interact with, enabling complex decentralized applications. However, it's crucial to design these functions with security, efficiency, and usability in mind.\n"],[134,"\n## Function Signature\n\n```clarity\n(define-read-only (function-name (arg-name-0 arg-type-0) ...) function-body)\n```\n\n- Input: \n - `function-name`: The name of the read-only function\n - `arg-name-N`: The name of each argument\n - `arg-type-N`: The type of each argument\n - `function-body`: The code to be executed when the function is called\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-read-only` function is crucial for:\n\n1. Creating public functions that can query contract state without modifying it.\n2. Enabling efficient and gas-optimized read operations on the contract.\n3. Implementing view functions that other contracts or off-chain applications can call.\n4. Providing a safe way to expose contract data without risking state changes.\n\n## When to use it\n\nUse `define-read-only` when you need to:\n\n- Create functions that return contract state or computed values.\n- Implement getter functions for contract variables or complex data structures.\n- Provide public interfaces for querying contract data without modifying state.\n- Create helper functions that other contracts can call without incurring state change costs.\n\n## Best Practices\n\n- Use descriptive names for read-only functions to clearly indicate their purpose.\n- Ensure that read-only functions do not attempt to modify contract state.\n- Utilize read-only functions for complex calculations that don't require state changes.\n- Consider using read-only functions in combination with public functions to separate read and write operations.\n\n## Practical Example: Token Balance Checker\n\nLet's implement a read-only function for checking token balances:\n\n```clarity\n(define-map Balances principal uint)\n\n(define-read-only (get-balance (account principal))\n (default-to u0 (map-get? Balances account))\n)\n```\n\nThis example demonstrates:\n1. Using `define-read-only` to create functions for querying token balances.\n2. Implementing a getter function for individual account balances.\n\n## Common Pitfalls\n\n1. Attempting to modify contract state within a read-only function, which will cause an error.\n2. Overusing read-only functions for complex calculations that might be better suited for off-chain computation.\n3. Forgetting that read-only functions can still consume gas when called, even though they don't modify state.\n\n## Related Functions\n\n- `define-public`: Used to define public functions that can modify contract state.\n- `define-private`: Used to define private functions that can only be called within the contract.\n- `map-get?`: Often used within read-only functions to retrieve data from maps.\n\n## Conclusion\n\nThe `define-read-only` function is an essential tool for creating efficient and safe query interfaces in Clarity smart contracts. By providing a way to expose contract data and perform calculations without modifying state, read-only functions enable you to create more transparent and gas-efficient contracts. When used effectively, this function can significantly enhance the usability and accessibility of smart contract data for both on-chain and off-chain applications.\n"],[119,"\n## Function Signature\n\n```clarity\n(define-trait trait-name ((func1-name (arg1-type arg2-type ...) (return-type)) ...))\n```\n\n- Input: \n - `trait-name`: The name of the trait being defined\n - `func1-name`: The name of a function in the trait\n - `arg1-type, arg2-type, ...`: The types of the function's arguments\n - `return-type`: The return type of the function\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-trait` function is crucial for:\n\n1. Creating standardized interfaces for contracts to implement.\n2. Enabling polymorphic behavior in smart contract interactions.\n3. Facilitating contract composability and interoperability.\n4. Allowing for dynamic dispatch of contract calls based on traits.\n\n## When to use it\n\nUse `define-trait` when you need to:\n\n- Define a common interface that multiple contracts should adhere to.\n- Create a contract that can interact with any other contract implementing a specific trait.\n- Establish standards for token contracts or other common smart contract patterns.\n- Enable more flexible and modular smart contract architectures.\n\n## Best Practices\n\n- Use clear and descriptive names for traits and their functions.\n- Keep traits focused on a single responsibility or concept.\n- Consider creating traits for common patterns like token standards.\n- Use traits in combination with `use-trait` and `contract-call?` for dynamic contract interactions.\n\n## Practical Example: Token Trait\n\nLet's define a simple trait for a token contract:\n\n```clarity\n(define-trait token-trait\n (\n (transfer? (principal principal uint) (response bool uint))\n (get-balance (principal) (response uint uint))\n (get-token-uri () (response (optional (string-utf8 256)) uint))\n )\n)\n```\n\nThis example demonstrates:\n1. Defining a trait with multiple functions.\n2. Specifying function signatures with argument types and return types.\n3. Using response types to handle success and failure cases.\n\n## Common Pitfalls\n\n1. Defining overly complex traits that are difficult for other contracts to implement.\n2. Forgetting that traits are not implementations, just interface definitions.\n3. Not considering backwards compatibility when updating traits in newer contract versions.\n\n## Related Functions\n\n- `use-trait`: Used to import trait definitions from other contracts.\n- `impl-trait`: Used to declare that a contract implements a specific trait.\n- `contract-call?`: Often used in combination with traits for dynamic contract calls.\n- `contract-of`: Used to get the principal of a contract implementing a trait.\n\n## Conclusion\n\nThe `define-trait` function is a powerful tool for creating standardized interfaces in Clarity smart contracts. By defining traits, you can create more modular, interoperable, and flexible smart contract ecosystems. Traits enable contracts to interact with each other in a predictable way, fostering the development of complex decentralized applications and standards within the Stacks ecosystem.\n"],[180,"\n## Function Signature\n\n```clarity\n(element-at? list-expr uint)\n```\n\n- Input: \n - `list-expr`: A list expression\n - `uint`: An unsigned integer representing the index\n- Output: `(optional A)` where A is the type of elements in the list\n\n## Why it matters\n\nThe `element-at?` function is crucial for:\n\n1. Safely accessing elements in a list at a specific index.\n2. Handling potential out-of-bounds access without causing errors.\n3. Implementing logic that depends on retrieving specific elements from lists.\n4. Providing a way to work with lists in a more flexible manner.\n\n## When to use it\n\nUse `element-at?` when you need to:\n\n- Retrieve a specific element from a list by its position.\n- Implement algorithms that require access to list elements by index.\n- Safely handle potential out-of-bounds access in list operations.\n- Work with lists in a way that may involve accessing elements at varying positions.\n\n## Best Practices\n\n- Always check the returned optional value to handle cases where the index is out of bounds.\n- Use in combination with `len` to ensure you're not attempting to access beyond the list's length.\n- Consider using `map` or `fold` for operations that need to process all elements instead of accessing by index.\n- Be mindful of the zero-based indexing when using `element-at?`.\n\n## Practical Example: Retrieving a Specific Item\n\nLet's implement a function that retrieves an item from a todo list:\n\n```clarity\n(define-data-var todoList (list 10 (string-ascii 50)) (list))\n\n(define-public (add-todo (item (string-ascii 50)))\n (let\n (\n (currentList (var-get todoList))\n (newList (as-max-len? (append currentList item) u10))\n )\n (match newList\n newListValue (ok (var-set todoList newListValue))\n (err u1)\n )\n )\n)\n\n(define-read-only (get-todo (index uint))\n (match (element-at? (var-get todoList) index) item\n (ok item)\n (err u404)\n )\n)\n\n;; Usage\n(add-todo \"Buy milk\")\n(add-todo \"Walk the dog\")\n(get-todo u1) ;; Returns (ok \"Walk the dog\")\n(get-todo u5) ;; Returns (err u404)\n```\n\nThis example demonstrates:\n1. Using `element-at?` to retrieve an item from a list stored in a data variable.\n2. Handling the optional return value with `match` to provide meaningful responses.\n3. Safely accessing list elements without risking out-of-bounds errors.\n\n## Common Pitfalls\n\n1. Forgetting that list indices are zero-based in Clarity.\n2. Not handling the case where `element-at?` returns `none` for out-of-bounds access.\n3. Using `element-at?` in a loop to process all elements, which is less efficient than using `map` or `fold`.\n\n## Related Functions\n\n- `list`: Used to create lists that can be accessed with `element-at?`.\n- `len`: Often used in conjunction with `element-at?` to check list bounds.\n- `map`: An alternative for processing all elements in a list.\n- `fold`: Another alternative for reducing a list to a single value.\n\n## Clarity 1 Version: element-at\n\nIn Clarity 1, this function was named `element-at` (without the question mark) and had a slightly different behavior:\n\n```clarity\n(element-at list-expr uint)\n```\n\nThe key differences are:\n1. It returns the element directly, not wrapped in an optional.\n2. It throws a runtime error if the index is out of bounds.\n\nWhen migrating from Clarity 1 to newer versions, replace `element-at` with `element-at?` and add appropriate error handling for out-of-bounds cases.\n\n## Conclusion\n\nThe `element-at?` function is a safer and more flexible way to access list elements in Clarity smart contracts compared to its predecessor. By returning an optional value, this function allows you to handle out-of-bounds access gracefully, leading to more robust and error-resistant code. When working with lists in Clarity, `element-at?` is an essential tool for accessing specific elements while maintaining the integrity and safety of your contract operations.\n"],[164,"\n## Function Signature\n\n```clarity\n(err value)\n```\n\n- Input: `value` - Any type A\n- Output: `(response A B)` where A is the type of the input value\n\n## Why it matters\n\nThe `err` function is crucial for:\n\n1. Creating standardized error responses in public functions.\n2. Indicating that a function execution has failed.\n3. Providing meaningful error information to callers.\n4. Triggering automatic rollback of any database changes during function execution.\n\n## When to use it\n\nUse `err` when you need to:\n\n- Return an error state from a public function.\n- Indicate that a condition or operation has failed.\n- Provide specific error information or codes to the caller.\n- Ensure that any state changes are reverted due to a failure condition.\n\n## Best Practices\n\n- Use descriptive error values that help diagnose the issue.\n- Consider using standardized error codes across your contract.\n- Pair `err` with `ok` to create comprehensive response handling.\n- Remember that returning an `err` will cause all state changes in the current function to be rolled back.\n\n## Practical Example: Token Transfer with Error Handling\n\nLet's implement a simple token transfer function with error handling:\n\n```clarity\n(define-map Balances principal uint)\n\n(define-public (transfer (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? Balances tx-sender)))\n )\n (if (>= senderBalance amount)\n (begin\n (map-set Balances tx-sender (- senderBalance amount))\n (map-set Balances recipient (+ (default-to u0 (map-get? Balances recipient)) amount))\n (ok true)\n )\n (err u1)\n )\n )\n)\n\n;; Usage\n(transfer u100 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM) ;; Returns (err u1) if balance is insufficient\n```\n\nThis example demonstrates:\n1. Using `err` to return an error when the sender has insufficient balance.\n2. Pairing `err` with `ok` to handle both success and failure cases.\n3. Using a simple error code (u1) to indicate the type of error.\n\n## Common Pitfalls\n\n1. Forgetting that returning an `err` will revert all state changes in the current function.\n2. Using non-descriptive error values that make debugging difficult.\n3. Inconsistent error handling across different functions in the contract.\n\n## Related Functions\n\n- `ok`: Used to construct successful responses in public functions.\n- `asserts!`: Often used with `err` for condition checking and error reporting.\n- `try!`: Used to propagate errors up the call stack.\n\n## Conclusion\n\nThe `err` function is a fundamental tool for error handling and response construction in Clarity smart contracts. By providing a standardized way to indicate and communicate errors, this function enables robust and predictable contract behavior. When used effectively in combination with `ok` and other error-handling mechanisms, `err` contributes to creating more reliable and maintainable smart contracts.\n"],[177,"\n## Function Signature\n\n```clarity\n(filter <function> <sequence>)\n```\n\n- Input: \n - `<function>`: A function that takes one argument and returns a boolean\n - `<sequence>`: A list, buffer, or string to iterate over\n- Output: A new list containing only the elements for which the function returned true\n\n## Why it matters\n\nThe `filter` function is crucial for:\n\n1. Selectively processing elements from a list based on specific criteria.\n2. Removing unwanted elements from a list without modifying the original.\n3. Implementing complex data filtering logic within smart contracts.\n4. Enhancing data manipulation capabilities in list processing.\n\n## When to use it\n\nUse `filter` when you need to:\n\n- Create a subset of a list based on certain conditions.\n- Remove elements from a list that don't meet specific criteria.\n- Implement data validation or selection logic on lists.\n- Prepare data for further processing by removing irrelevant elements.\n\n## Best Practices\n\n- Ensure the predicate function is efficient, especially for large lists.\n- Use `filter` in combination with other list functions like `map` or `fold` for complex list operations.\n- Be mindful of gas costs when filtering large lists.\n- Consider using `filter` with `define-private` functions for reusable filtering logic.\n\n## Practical Example: Filtering Even Numbers\n\nLet's implement a function that filters even numbers from a list:\n\n```clarity\n(define-private (is-even (num int))\n (is-eq (mod num 2) 0)\n)\n\n(define-read-only (get-even-numbers (numbers (list 10 int)))\n (filter is-even numbers)\n)\n\n;; Usage\n(get-even-numbers (list 1 2 3 4 5 6 7 8 9 10)) ;; Returns (2 4 6 8 10)\n```\n\nThis example demonstrates:\n1. Defining a private helper function `is-even` to check if a number is even.\n2. Using `filter` with the `is-even` function to create a new list of even numbers.\n3. Applying the filter operation to a list of integers.\n\n## Common Pitfalls\n\n1. Forgetting that `filter` creates a new list and does not modify the original.\n2. Using a computationally expensive predicate function, which could lead to high gas costs.\n3. Not considering the potential for an empty result list if no elements match the predicate.\n\n## Related Functions\n\n- `map`: Applies a function to each element in a list, transforming the elements.\n- `fold`: Reduces a list to a single value by applying a function to each element.\n- `len`: Can be used to check the length of the resulting filtered list.\n\n## Conclusion\n\nThe `filter` function is a powerful tool for list manipulation in Clarity smart contracts. It allows you to create refined subsets of data based on specific criteria, enhancing the contract's ability to process and analyze list-based information. When used effectively, `filter` can significantly improve the efficiency and clarity of list operations in smart contracts.\n"],[96,"\n## Function Signature\n\n```clarity\n(fold <function> <sequence> <initial-value>)\n```\n\n- Input: \n - `<function>`: A function that takes two arguments and returns a single value\n - `<sequence>`: A list, buffer, or string to iterate over\n - `<initial-value>`: The starting value for the accumulation\n- Output: The final accumulated value\n\n## Why it matters\n\nThe `fold` function is crucial for:\n\n1. Aggregating values from a sequence into a single result.\n2. Performing complex computations on list elements.\n3. Transforming data structures efficiently.\n4. Implementing recursive-like operations without explicit recursion.\n\n## When to use it\n\nUse `fold` when you need to:\n\n- Calculate a sum, product, or other aggregate value from a list.\n- Transform a list into a single value or different data structure.\n- Apply a function to each element of a sequence while maintaining state.\n- Implement algorithms that would typically require recursion.\n\n## Best Practices\n\n- Ensure the function passed to `fold` is commutative if the order of operations doesn't matter.\n- Use meaningful initial values that make sense for your aggregation.\n- Consider using `fold` instead of explicit loops for cleaner, more functional code.\n- Be mindful of the performance implications when folding over large sequences.\n\n## Practical Example: Summing a List of Numbers\n\nLet's implement a function that sums all numbers in a list:\n\n```clarity\n(define-read-only (sum-list (numbers (list 10 uint)))\n (fold + numbers u0)\n)\n\n;; Usage\n(sum-list (list u1 u2 u3 u4 u5)) ;; Returns u15\n```\n\nThis example demonstrates:\n1. Using `fold` with the built-in `+` function to sum numbers.\n2. Starting with an initial value of `u0`.\n3. Applying the operation to each element in the list.\n\n## Common Pitfalls\n\n1. Using an initial value of the wrong type or that doesn't make sense for the operation.\n2. Forgetting that `fold` processes elements from left to right, which matters for non-commutative operations.\n3. Overusing `fold` for operations that might be more clearly expressed with other functions like `map` or `filter`.\n\n## Related Functions\n\n- `map`: Applies a function to each element in a sequence, returning a new sequence.\n- `filter`: Selects elements from a sequence based on a predicate function.\n- `reduce`: Similar to `fold` in other languages, but Clarity uses `fold` for this operation.\n\n## Conclusion\n\nThe `fold` function is a powerful tool for aggregating and transforming data in Clarity smart contracts. It allows you to express complex computations on sequences in a concise and functional manner. When used effectively, `fold` can simplify code, improve readability, and provide an efficient way to process collections of data within smart contracts.\n"],[144,"\n## Function Signature\n\n```clarity\n(from-consensus-buff? type-signature buffer)\n```\n\n- Input: \n - `type-signature`: The type to deserialize into\n - `buffer`: A buffer containing the serialized data\n- Output: `(optional t)` where t is the type specified in the type signature\n\n## Why it matters\n\nThe `from-consensus-buff?` function is crucial for:\n\n1. Deserializing data that has been serialized using the SIP-005 standard.\n2. Enabling interoperability between different contracts or systems.\n3. Handling complex data structures that have been serialized for storage or transmission.\n4. Safely converting buffers back into Clarity values with type checking.\n\n## When to use it\n\nUse `from-consensus-buff?` when you need to:\n\n- Convert serialized data back into Clarity values.\n- Interact with data that has been serialized by other contracts or off-chain systems.\n- Implement cross-contract communication protocols involving serialized data.\n- Deserialize stored data that was previously serialized for efficiency.\n\n## Best Practices\n\n- Always specify the correct type signature to ensure proper deserialization.\n- Handle the `none` case when the deserialization fails.\n- Use in conjunction with `to-consensus-buff?` for serialization-deserialization workflows.\n- Be aware of the gas costs associated with deserializing large or complex data structures.\n\n## Practical Example: Deserializing a Tuple\n\nLet's implement a function that deserializes a buffer into a tuple:\n\n```clarity\n(define-read-only (deserialize-user-data (serializedData (buff 128)))\n (match (from-consensus-buff? { name: (string-ascii 50), age: uint } serializedData)\n success success\n (err u1)\n )\n)\n\n;; Usage\n(deserialize-user-data 0x0c00000002036167650100000000000000000000000000000005046e616d650d0000000a48617270657220446f67)\n;; Returns (ok (tuple (name \"Harper Dog\") (age u5)))\n```\n\nThis example demonstrates:\n1. Using `from-consensus-buff?` to deserialize a buffer into a tuple.\n2. Specifying the expected type structure for the deserialization.\n3. Handling both successful and failed deserialization attempts.\n\n## Common Pitfalls\n\n1. Specifying an incorrect type signature, leading to deserialization failures.\n2. Not handling the `none` case when deserialization fails.\n3. Attempting to deserialize data that wasn't properly serialized using the SIP-005 standard.\n4. Overlooking potential out-of-memory errors when deserializing very large structures.\n\n## Related Functions\n\n- `to-consensus-buff?`: Used to serialize Clarity values into buffers.\n- `unwrap-panic`: Often used to forcibly unwrap the optional result (use with caution).\n- `match`: Commonly used to handle both success and failure cases of deserialization.\n\n## Conclusion\n\nThe `from-consensus-buff?` function is a powerful tool for working with serialized data in Clarity smart contracts. It enables contracts to safely deserialize complex data structures, facilitating interoperability and efficient data handling. When used correctly, this function provides a robust way to convert buffers back into typed Clarity values, enhancing the contract's ability to process and validate external data.\n"],[115,"\n## Function Signature\n\n```clarity\n(ft-burn? token-name amount sender)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n - `amount`: The amount of tokens to burn (uint)\n - `sender`: The principal from whose balance the tokens will be burned\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `ft-burn?` function is crucial for:\n\n1. Decreasing the total supply of a fungible token.\n2. Implementing token burning mechanisms in tokenomics models.\n3. Allowing users to destroy their own tokens.\n4. Managing token supply in deflationary token systems.\n\n## When to use it\n\nUse `ft-burn?` when you need to:\n\n- Implement a token burning feature in your contract.\n- Reduce the circulating supply of a token.\n- Allow users to voluntarily destroy their tokens.\n- Execute deflationary mechanisms in your token economy.\n\n## Best Practices\n\n- Ensure that the `sender` has sufficient balance before attempting to burn.\n- Use `ft-burn?` in conjunction with proper access controls.\n- Consider emitting events or logging burns for transparency.\n- Be cautious when burning tokens from a different principal than `tx-sender`.\n\n## Practical Example: Token Burning Mechanism\n\nLet's implement a simple token burning function:\n\n```clarity\n(define-fungible-token cBtc)\n\n(define-data-var tokenAdmin principal tx-sender)\n\n(define-public (burn-tokens (amount uint))\n (ft-burn? cBtc amount tx-sender)\n)\n\n(define-public (burn-tokens-from (amount uint) (owner principal))\n (begin\n (asserts! (is-eq tx-sender (var-get tokenAdmin)) (err u3))\n (ft-burn? cBtc amount owner)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `ft-burn?` to burn tokens from the transaction sender.\n2. Implementing an admin function to burn tokens from any account.\n3. Using assertions to ensure only the admin can burn tokens from other accounts.\n\n## Common Pitfalls\n\n1. Attempting to burn more tokens than the `sender` has in their balance.\n2. Not checking the return value of `ft-burn?` to handle potential errors.\n3. Allowing unauthorized burning of tokens from other accounts.\n4. Forgetting that burned tokens are permanently destroyed and cannot be recovered.\n\n## Related Functions\n\n- `ft-mint?`: Used to create new tokens, increasing the total supply.\n- `ft-transfer?`: Used to transfer tokens between principals.\n- `ft-get-balance`: Used to check the token balance of a principal.\n- `ft-get-supply`: Used to get the current total supply of tokens.\n\n## Conclusion\n\nThe `ft-burn?` function is a powerful tool for managing the supply of fungible tokens in Clarity smart contracts. It allows for the implementation of deflationary mechanisms and gives users the ability to destroy their own tokens. When used correctly, this function can be a key component in sophisticated tokenomics models. However, it should be used with caution and with proper checks to ensure the integrity of your token system.\n"],[190,"\n## Function Signature\n\n```clarity\n(ft-get-balance token-name principal)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n - `principal`: The principal whose balance to check\n- Output: `uint`\n\n## Why it matters\n\nThe `ft-get-balance` function is crucial for:\n\n1. Querying the current balance of a fungible token for any principal.\n2. Implementing balance checks before transfers or other token operations.\n3. Providing transparency and visibility into token holdings.\n4. Enabling other contracts or off-chain applications to verify token balances.\n\n## When to use it\n\nUse `ft-get-balance` when you need to:\n\n- Check a user's token balance before performing operations.\n- Implement balance-dependent logic in your contract.\n- Provide balance information to users or other contracts.\n- Verify sufficient funds for token transfers or burns.\n\n## Best Practices\n\n- Use `ft-get-balance` before attempting transfers to ensure sufficient balance.\n- Consider caching balance results if queried frequently to optimize gas usage.\n- Be aware that balances can change between checks and actual token operations.\n- Use in combination with other ft-* functions for comprehensive token management.\n\n## Practical Example: Balance Check Before Transfer\n\nLet's implement a function that checks balance before transferring tokens:\n\n```clarity\n(define-fungible-token cBtc)\n\n(define-public (transfer (amount uint) (recipient principal))\n (let\n (\n (senderBalance (ft-get-balance cBtc tx-sender))\n )\n (if (>= senderBalance amount)\n (ft-transfer? cBtc amount tx-sender recipient)\n (err u1)\n )\n )\n)\n\n;; Usage\n(ft-mint? cBtc u100 tx-sender)\n(transfer u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true)\n(ft-get-balance cBtc tx-sender) ;; Returns u50\n```\n\nThis example demonstrates:\n1. Using `ft-get-balance` to check the sender's balance before attempting a transfer.\n2. Implementing a conditional transfer based on the balance check.\n3. Combining `ft-get-balance` with other ft-* functions for token management.\n\n## Common Pitfalls\n\n1. Assuming balances remain constant between checking and performing operations.\n2. Not handling the case where a principal might not have any balance (returns 0).\n3. Overusing `ft-get-balance` in loops, which can be inefficient for gas consumption.\n\n## Related Functions\n\n- `ft-transfer?`: Used to transfer tokens between principals.\n- `ft-mint?`: Used to create new tokens, increasing the balance of a principal.\n- `ft-burn?`: Used to destroy tokens, decreasing the balance of a principal.\n- `ft-get-supply`: Used to get the current total supply of tokens.\n\n## Conclusion\n\nThe `ft-get-balance` function is a fundamental tool for managing fungible tokens in Clarity smart contracts. It provides a straightforward way to query token balances, enabling you to implement robust token-based systems with proper balance checks and validations. When used effectively in combination with other token functions, this function ensures the integrity and accuracy of token operations within your smart contracts.\n"],[125,"\n## Function Signature\n\n```clarity\n(ft-get-supply token-name)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n- Output: `uint`\n\n## Why it matters\n\nThe `ft-get-supply` function is crucial for:\n\n1. Querying the current total supply of a fungible token.\n2. Implementing supply-dependent logic in token contracts.\n3. Providing transparency about the token's circulating supply.\n4. Enabling other contracts or off-chain applications to verify token supply.\n\n## When to use it\n\nUse `ft-get-supply` when you need to:\n\n- Check the current total supply of a token.\n- Implement logic that depends on the token's supply (e.g., minting limits).\n- Provide supply information to users or other contracts.\n- Verify the integrity of token operations by checking supply changes.\n\n## Best Practices\n\n- Use `ft-get-supply` in combination with `ft-mint?` and `ft-burn?` to manage token supply.\n- Consider caching the supply result if queried frequently to optimize gas usage.\n- Be aware that the supply can change between checks due to minting or burning operations.\n- Use in conjunction with `ft-get-balance` for comprehensive token management.\n\n## Practical Example: Supply-Limited Minting\n\nLet's implement a function that mints tokens only if it doesn't exceed a certain supply cap:\n\n```clarity\n(define-fungible-token cBtc)\n(define-constant MAX_SUPPLY u1000000)\n\n(define-public (mint (amount uint) (recipient principal))\n (let\n (\n (currentSupply (ft-get-supply cBtc))\n )\n (if (<= (+ currentSupply amount) MAX_SUPPLY)\n (ft-mint? cBtc amount recipient)\n (err u1)\n )\n )\n)\n\n;; Usage\n(mint u500000 tx-sender) ;; Returns (ok true)\n(ft-get-supply cBtc) ;; Returns u500000\n(mint u600000 tx-sender) ;; Returns (err u1)\n```\n\nThis example demonstrates:\n1. Using `ft-get-supply` to check the current token supply before minting.\n2. Implementing a supply cap check to limit token minting.\n3. Combining `ft-get-supply` with `ft-mint?` for supply management.\n\n## Common Pitfalls\n\n1. Assuming the supply remains constant between checks and operations.\n2. Not considering the potential for overflow when adding to the supply.\n3. Overusing `ft-get-supply` in loops, which can be inefficient for gas consumption.\n\n## Related Functions\n\n- `ft-mint?`: Used to create new tokens, increasing the total supply.\n- `ft-burn?`: Used to destroy tokens, decreasing the total supply.\n- `ft-get-balance`: Used to get the token balance of a specific principal.\n- `define-fungible-token`: Used to define the fungible token initially.\n\n## Conclusion\n\nThe `ft-get-supply` function is an essential tool for managing and querying the total supply of fungible tokens in Clarity smart contracts. It provides a straightforward way to access the current circulating supply, enabling you to implement supply-dependent logic and maintain transparency in token operations. When used effectively in combination with other token functions, this function ensures the integrity and accuracy of token supply management within your smart contracts.\n"],[178,"\n## Function Signature\n\n```clarity\n(ft-mint? token-name amount recipient)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n - `amount`: The amount of tokens to mint (uint)\n - `recipient`: The principal to receive the newly minted tokens\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `ft-mint?` function is crucial for:\n\n1. Creating new tokens and increasing the total supply of a fungible token.\n2. Implementing token issuance mechanisms in smart contracts.\n3. Rewarding users or other contracts with newly created tokens.\n4. Managing the token economy within a decentralized application.\n\n## When to use it\n\nUse `ft-mint?` when you need to:\n\n- Create new tokens as part of your contract's logic.\n- Implement token distribution mechanisms (e.g., airdrops, rewards).\n- Increase the balance of a specific principal with new tokens.\n- Execute token minting operations based on certain conditions or events.\n\n## Best Practices\n\n- Implement proper access controls to restrict who can mint new tokens.\n- Consider using a maximum supply cap to prevent unlimited minting.\n- Emit events or use a logging mechanism to track minting operations for transparency.\n- Be cautious of potential overflow when minting large amounts of tokens.\n\n## Practical Example: Reward Minting\n\nLet's implement a simple reward system that mints tokens:\n\n```clarity\n(define-fungible-token RewardToken)\n\n(define-constant CONTRACT_OWNER tx-sender)\n\n(define-public (mint-reward (amount uint) (recipient principal))\n (begin\n (asserts! (is-eq tx-sender CONTRACT_OWNER) (err u403))\n (ft-mint? RewardToken amount recipient)\n )\n)\n\n;; Usage\n(mint-reward u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true) if called by CONTRACT_OWNER\n```\n\nThis example demonstrates:\n1. Using `ft-mint?` to create new tokens and assign them to a recipient.\n2. Implementing a basic access control check before minting.\n3. Returning the result of the minting operation.\n\n## Common Pitfalls\n\n1. Minting tokens without proper access controls, allowing unauthorized token creation.\n2. Not considering the total supply limit, potentially leading to economic imbalances.\n3. Forgetting to handle the error case when minting fails (e.g., due to supply cap).\n4. Overlooking the gas costs associated with minting, especially for large amounts.\n\n## Related Functions\n\n- `ft-burn?`: Used to destroy tokens, decreasing the total supply.\n- `ft-transfer?`: Used to transfer tokens between principals.\n- `ft-get-balance`: Used to check the token balance of a principal.\n- `ft-get-supply`: Used to get the current total supply of tokens.\n\n## Conclusion\n\nThe `ft-mint?` function is a fundamental tool for managing fungible token creation in Clarity smart contracts. It allows for controlled increase of token supply and distribution to specified recipients. When used responsibly with proper access controls and supply management, this function enables the implementation of sophisticated token economies within decentralized applications on the Stacks blockchain.\n"],[123,"\n## Function Signature\n\n```clarity\n(ft-transfer? token-name amount sender recipient)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n - `amount`: The amount of tokens to transfer (uint)\n - `sender`: The principal sending the tokens\n - `recipient`: The principal receiving the tokens\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `ft-transfer?` function is crucial for:\n\n1. Moving fungible tokens between different principals within a smart contract.\n2. Implementing token transfer functionality in decentralized applications.\n3. Enabling token-based transactions and interactions between users or contracts.\n4. Facilitating token economy mechanisms within smart contracts.\n\n## When to use it\n\nUse `ft-transfer?` when you need to:\n\n- Transfer tokens from one account to another.\n- Implement payment or reward systems using custom tokens.\n- Allow users to send tokens to each other within your dApp.\n- Move tokens as part of more complex contract operations.\n\n## Best Practices\n\n- Always check the return value to ensure the transfer was successful.\n- Implement proper access controls to prevent unauthorized transfers.\n- Consider using `asserts!` or `try!` to handle transfer failures gracefully.\n- Be aware that any principal can call this function, so add necessary guards.\n- Verify sender has sufficient balance before attempting a transfer.\n\n## Practical Example: Token Transfer Function\n\nLet's implement a public function for transferring tokens with some basic checks:\n\n```clarity\n(define-fungible-token cBtc)\n\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (let\n (\n (sender tx-sender)\n )\n (asserts! (not (is-eq sender recipient)) (err u2))\n (asserts! (> amount u0) (err u3))\n (match (ft-transfer? cBtc amount sender recipient)\n success (ok success)\n error (err error)\n )\n )\n)\n\n;; Usage\n(ft-mint? cBtc u100 tx-sender)\n(transfer-tokens u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true)\n```\n\nThis example demonstrates:\n1. Using `ft-transfer?` within a public function to transfer tokens.\n2. Implementing basic checks for valid transfer conditions.\n3. Handling the response from `ft-transfer?` and propagating it to the caller.\n\n## Common Pitfalls\n\n1. Forgetting that `ft-transfer?` can be called by any principal, potentially leading to unauthorized transfers.\n2. Not handling all possible error cases returned by `ft-transfer?`.\n3. Attempting to transfer more tokens than the sender's balance.\n4. Using `ft-transfer?` with a token name that hasn't been defined in the contract.\n\n## Related Functions\n\n- `ft-mint?`: Used to create new tokens and assign them to a principal.\n- `ft-burn?`: Used to destroy tokens, reducing the balance of a principal.\n- `ft-get-balance`: Used to check the token balance of a principal.\n- `ft-get-supply`: Used to get the current total supply of tokens.\n\n## Conclusion\n\nThe `ft-transfer?` function is a fundamental component for implementing token transfers in Clarity smart contracts. It provides a straightforward way to move tokens between principals, enabling a wide range of token-based functionalities. When used with proper checks and balances, this function allows for the creation of secure and efficient token economies within decentralized applications on the Stacks blockchain.\n"],[116,"\n## Function Signature\n\n```clarity\n(get key-name tuple)\n```\n\n- Input: \n - `key-name`: The name of the key in the tuple\n - `tuple`: The tuple to retrieve the value from\n- Output: The value associated with the key in the tuple\n\n## Why it matters\n\nThe `get` function is crucial for:\n\n1. Accessing specific values within tuple data structures.\n2. Extracting information from complex data types in contracts.\n3. Enabling efficient data retrieval in contract logic.\n4. Working with structured data returned by other functions or stored in variables.\n\n## When to use it\n\nUse `get` when you need to:\n\n- Access a specific field in a tuple.\n- Extract values from structured data returned by other functions.\n- Work with complex data types in your contract logic.\n- Implement data processing that involves tuple manipulation.\n\n## Best Practices\n\n- Ensure the key exists in the tuple to avoid runtime errors.\n- Use meaningful key names for better code readability.\n- Consider using `get` in combination with `optional` for safer data access.\n- Be aware of the performance implications when working with large tuples.\n\n## Practical Example: User Profile Management\n\nLet's implement a simple user profile system using tuples and the `get` function:\n\n```clarity\n(define-map UserProfiles { userId: principal } { name: (string-ascii 50), age: uint })\n\n(define-public (set-profile (name (string-ascii 50)) (age uint))\n (ok (map-set UserProfiles { userId: tx-sender } { name: name, age: age }))\n)\n\n(define-read-only (get-profile-name (user principal))\n (match (map-get? UserProfiles { userId: user }) profile\n (ok (get name profile))\n (err u404)\n )\n)\n\n(define-read-only (get-profile-age (user principal))\n (match (map-get? UserProfiles { userId: user }) profile\n (ok (get age profile))\n (err u404)\n )\n)\n\n;; Usage\n(set-profile \"Alice\" u30)\n(get-profile-name tx-sender) ;; Returns (ok \"Alice\")\n(get-profile-age tx-sender) ;; Returns (ok u30)\n```\n\nThis example demonstrates:\n1. Using `get` to retrieve specific fields from a tuple stored in a map.\n2. Implementing getter functions that use `get` to access tuple data.\n3. Handling cases where the profile might not exist.\n\n## Common Pitfalls\n\n1. Attempting to `get` a key that doesn't exist in the tuple, causing a runtime error.\n2. Forgetting that `get` is case-sensitive for key names.\n3. Not considering the performance impact of frequently accessing large tuples.\n\n## Related Functions\n\n- `merge`: Used to combine tuples, potentially creating new fields to `get`.\n- `tuple`: Used to create tuples that can be accessed with `get`.\n- `map-get?`: Often used in combination with `get` to retrieve data from maps.\n\n## Conclusion\n\nThe `get` function is a fundamental tool for working with tuples in Clarity smart contracts. It provides a straightforward way to access structured data, enabling developers to work with complex data types efficiently. When used effectively, `get` enhances the contract's ability to manage and process structured information, leading to more organized and maintainable smart contract code.\n"],[95,"\n## Function Signature\n\n```clarity\n(get-burn-block-info? prop-name block-height)\n```\n\n- Input: \n - `prop-name`: A BurnBlockInfoPropertyName\n - `block-height`: A uint representing the burnchain block height\n- Output: `(optional buff) | (optional (tuple (addrs (list 2 (tuple (hashbytes (buff 32)) (version (buff 1))))) (payout uint)))`\n\n## Why it matters\n\nThe `get-burn-block-info?` function is crucial for:\n\n1. Accessing historical data from the underlying burnchain (Bitcoin).\n2. Implementing cross-chain verification or logic based on Bitcoin block information.\n3. Retrieving PoX (Proof of Transfer) related data for advanced stacking operations.\n4. Enabling contracts to react to or validate burnchain events.\n\n## When to use it\n\nUse `get-burn-block-info?` when you need to:\n\n- Verify Bitcoin block hashes within your Stacks contract.\n- Access information about PoX payouts and addresses.\n- Implement logic that depends on burnchain block data.\n- Build cross-chain applications that reference Bitcoin state.\n\n## Best Practices\n\n- Always check if the returned value is `none`, as it will be for non-existent or future blocks.\n- Be aware of the potential for chain reorganizations when using recent block data.\n- Use the appropriate property name for the data you need to retrieve.\n- Consider caching results for frequently accessed block information to save on execution costs.\n\n## Practical Example: Verifying a Bitcoin Block Hash\n\nLet's implement a function that verifies if a given Bitcoin block hash matches a specific height:\n\n```clarity\n(define-read-only (verify-btc-block-hash (height uint) (expectedHash (buff 32)))\n (match (get-burn-block-info? header-hash height) hash\n (is-eq hash expectedHash)\n false\n )\n)\n\n;; Usage\n(verify-btc-block-hash u700000 0x00000000000000000009a11b3972c8e532e964e262c196556bd958b7fd0c55c3)\n```\n\nThis example demonstrates:\n1. Using `get-burn-block-info?` to retrieve the `header-hash` of a burnchain block.\n2. Handling the optional return value with `match`.\n3. Comparing the retrieved hash with an expected value.\n\n## Available Properties\n\n- `header-hash`: Returns a 32-byte buffer representing the header hash of the burnchain block.\n- `pox-addrs`: Returns a tuple containing PoX payout information:\n - `addrs`: A list of up to two PoX addresses that received payouts.\n - `payout`: The amount of burnchain tokens paid to each address.\n\n## Common Pitfalls\n\n1. Assuming all properties are available for all blocks.\n2. Not handling the `none` case when the block height is invalid or in the future.\n3. Misinterpreting the `pox-addrs` data, especially during different PoX phases.\n4. Overlooking the fact that burn addresses may be included in the `pox-addrs` list.\n\n## Related Functions\n\n- `get-block-info?`: Used to get information about Stacks blocks.\n- `burn-block-height`: Keyword that returns the current burn chain block height.\n\n## Conclusion\n\nThe `get-burn-block-info?` function is a powerful tool for accessing burnchain data in Clarity smart contracts. It allows you to incorporate Bitcoin blockchain information into your contract logic, enabling cross-chain verification and advanced PoX-related functionalities. When used correctly, this function provides valuable insights into the underlying Bitcoin blockchain's state and can be used to implement sophisticated, cross-chain aware contract behavior.\n"],[188,"\n## Function Signature\n\n```clarity\n(hash160 value)\n```\n\n- Input: `buff|uint|int`\n- Output: `(buff 20)`\n\n## Why it matters\n\nThe `hash160` function is crucial for:\n\n1. Creating compact, unique identifiers for data or addresses.\n2. Implementing cryptographic operations commonly used in blockchain systems.\n3. Generating Bitcoin-style addresses from public keys.\n4. Providing a way to create short, collision-resistant hashes.\n\n## When to use it\n\nUse `hash160` when you need to:\n\n- Generate a compact hash of data, especially for address creation.\n- Implement Bitcoin-style address generation within Clarity contracts.\n- Create short, unique identifiers for data structures.\n- Perform cryptographic operations that require RIPEMD160(SHA256(x)).\n\n## Best Practices\n\n- Use `hash160` when you need a shorter hash than SHA256 but still want strong collision resistance.\n- Be aware that `hash160` is not reversible; it's a one-way function.\n- When hashing sensitive data, consider using additional security measures like salting.\n- Remember that for integers, the hash is computed over their little-endian representation.\n\n## Practical Example: Simple Address Generation\n\nLet's implement a function that generates a simple hash-based identifier:\n\n```clarity\n(define-read-only (generate-identifier (input (buff 32)))\n (hash160 input)\n)\n\n;; Usage\n(generate-identifier 0x000000000000000000000000000000000000000000000000000000000000000a)\n;; Returns 0x3bf3d2e8f7a4d7c5f9e6d0d5c6b0f5c7d8e9f0a1\n```\n\nThis example demonstrates:\n1. Using `hash160` to create a compact identifier from input data.\n2. The function takes a 32-byte buffer and returns a 20-byte hash.\n\n## Common Pitfalls\n\n1. Assuming `hash160` output is the same length as `sha256` output (it's shorter at 20 bytes).\n2. Using `hash160` where a longer hash might be more appropriate for security reasons.\n3. Forgetting that integer inputs are hashed in their little-endian representation.\n4. Not considering that `hash160` is computationally more expensive than a single `sha256`.\n\n## Related Functions\n\n- `sha256`: Computes the SHA256 hash of the input.\n- `ripemd160`: Computes the RIPEMD160 hash of the input (not directly available in Clarity, but `hash160` combines SHA256 and RIPEMD160).\n- `keccak256`: Another cryptographic hash function available in Clarity.\n\n## Conclusion\n\nThe `hash160` function is a powerful tool for creating compact, unique identifiers in Clarity smart contracts. It combines the security of SHA256 with the compactness of RIPEMD160, making it particularly useful for address generation and creating short but collision-resistant hashes. When used appropriately, `hash160` can enhance the efficiency and security of your smart contract operations, especially in scenarios where space efficiency is a concern.\n"],[196,"\n## Function Signature\n\n```clarity\n(if bool expr1 expr2)\n```\n\n- Input: \n - `bool`: A boolean expression\n - `expr1`: An expression to evaluate if `bool` is true\n - `expr2`: An expression to evaluate if `bool` is false\n- Output: The result of `expr1` if `bool` is true, otherwise the result of `expr2`\n\n## Why it matters\n\nThe `if` function is crucial for:\n\n1. Implementing conditional logic in smart contracts.\n2. Making decisions based on dynamic conditions.\n3. Controlling the flow of contract execution.\n4. Simplifying complex logic by branching based on conditions.\n\n## When to use it\n\nUse `if` when you need to:\n\n- Execute different code paths based on a condition.\n- Implement logic that depends on the state or input values.\n- Control the flow of your contract based on dynamic conditions.\n- Simplify complex decision-making processes.\n\n## Best Practices\n\n- Ensure that both `expr1` and `expr2` return the same type.\n- Use clear and meaningful boolean expressions for readability.\n- Avoid deeply nested `if` statements for better maintainability.\n- Combine with other control flow functions like `match` for more complex logic.\n\n## Practical Example: Conditional Token Transfer\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? UserBalances { userId: tx-sender })))\n )\n (if (>= senderBalance amount)\n (begin\n (map-set UserBalances { userId: tx-sender } { balance: (- senderBalance amount) })\n (map-set UserBalances { userId: recipient } { balance: (+ (default-to u0 (map-get? UserBalances { userId: recipient })) amount) })\n (ok true)\n )\n (err u1)\n )\n )\n)\n```\n\nThis example demonstrates:\n1. Using `if` to check if the sender has sufficient balance before transferring tokens.\n2. Executing different code paths based on the result of the balance check.\n3. Handling both the success and failure cases appropriately.\n\n## Common Pitfalls\n\n1. Forgetting that both `expr1` and `expr2` must return the same type.\n2. Using overly complex boolean expressions, making the code hard to read.\n3. Not handling all possible conditions, leading to unexpected behavior.\n4. Overusing `if` for logic that could be simplified with other control flow functions.\n\n## Related Functions\n\n- `match`: Used for pattern matching and handling multiple conditions.\n- `and`: Logical AND operator for combining boolean expressions.\n- `or`: Logical OR operator for combining boolean expressions.\n\n## Conclusion\n\nThe `if` function is a fundamental tool for implementing conditional logic in Clarity smart contracts. It allows you to control the flow of contract execution based on dynamic conditions, enabling more complex and responsive contract behavior. When used effectively, `if` simplifies decision-making processes and enhances the readability and maintainability of your smart contract code.\n"],[152,"\n## Function Signature\n\n```clarity\n(impl-trait trait-name)\n```\n\n- Input: \n - `trait-name`: The name of the trait to implement\n- Output: Not applicable\n\n## Why it matters\n\nThe `impl-trait` function is crucial for:\n\n1. Enabling contracts to conform to specific interfaces.\n2. Allowing dynamic function calls between contracts.\n3. Promoting code reuse and modularity in smart contract development.\n4. Ensuring contracts adhere to predefined behaviors and standards.\n\n## When to use it\n\nUse `impl-trait` when you need to:\n\n- Implement a predefined interface in your contract.\n- Allow other contracts to interact with your contract through a common interface.\n- Ensure your contract adheres to specific standards or behaviors.\n- Enable dynamic function calls using `contract-call?`.\n\n## Best Practices\n\n- Define traits at the top level of your contract for clarity and organization.\n- Ensure all required functions in the trait are implemented in your contract.\n- Use meaningful and descriptive names for traits and their functions.\n- Document the purpose and usage of each trait in your contract.\n\n## Practical Example: Implementing a Token Trait\n\nLet's define a simple token trait and implement it in a contract:\n\n```clarity\n(define-trait token-trait\n (\n (transfer (principal principal uint) (response bool uint))\n (get-balance (principal) (response uint uint))\n )\n)\n\n(impl-trait token-trait)\n\n(define-map Balances { user: principal } { balance: uint })\n\n(define-public (transfer (sender principal) (recipient principal) (amount uint))\n (let\n (\n (senderBalance (default-to u0 (map-get? Balances { user: sender })))\n (recipientBalance (default-to u0 (map-get? Balances { user: recipient })))\n )\n (if (>= senderBalance amount)\n (begin\n (map-set Balances { user: sender } { balance: (- senderBalance amount) })\n (map-set Balances { user: recipient } { balance: (+ recipientBalance amount) })\n (ok true)\n )\n (err u1)\n )\n )\n)\n\n(define-read-only (get-balance (user principal))\n (ok (default-to u0 (map-get? Balances { user: user })))\n)\n```\n\nThis example demonstrates:\n1. Defining a `token-trait` with `transfer` and `get-balance` functions.\n2. Implementing the `token-trait` in a contract using `impl-trait`.\n3. Providing implementations for the `transfer` and `get-balance` functions.\n\n## Common Pitfalls\n\n1. Forgetting to implement all required functions in the trait, leading to deployment errors.\n2. Using inconsistent function signatures between the trait and the implementation.\n3. Not documenting the purpose and usage of traits, making the contract harder to understand.\n4. Overlooking the need for proper error handling in trait functions.\n\n## Related Functions\n\n- `define-trait`: Used to define a new trait.\n- `contract-call?`: Used to call functions dynamically on contracts that implement a trait.\n- `define-public`: Used to define public functions that can be called from outside the contract.\n\n## Conclusion\n\nThe `impl-trait` function is a powerful tool for promoting modularity and code reuse in Clarity smart contracts. By implementing predefined interfaces, contracts can interact dynamically and adhere to specific standards and behaviors. When used effectively, `impl-trait` enhances the flexibility and maintainability of your smart contract code, enabling more robust and interoperable decentralized applications.\n"],[183,"\n## Function Signature\n\n```clarity\n(index-of list element)\n```\n\n- Input: \n - `list`: A list of elements\n - `element`: The element to find in the list\n- Output: `(optional uint)`\n\n## Why it matters\n\nThe `index-of` function is crucial for:\n\n1. Locating the position of an element within a list.\n2. Implementing search functionality in smart contracts.\n3. Enabling conditional logic based on the presence and position of elements.\n4. Simplifying list operations by providing a built-in search mechanism.\n\n## When to use it\n\nUse `index-of` when you need to:\n\n- Determine the position of an element in a list.\n- Check if an element exists in a list and retrieve its index.\n- Implement logic that depends on the order or position of elements.\n- Simplify list search operations without writing custom loops.\n\n## Best Practices\n\n- Ensure the list and element types are compatible.\n- Handle the `none` case when the element is not found in the list.\n- Use meaningful variable names for better readability.\n- Consider the performance implications when searching large lists.\n\n## Practical Example: Finding an Element in a List\n\nLet's implement a function that finds the index of a given element in a list of integers:\n\n```clarity\n(define-read-only (find-index (element int) (numbers (list 10 int)))\n (index-of numbers element)\n)\n\n;; Usage\n(find-index 3 (list 1 2 3 4 5)) ;; Returns (some u2)\n(find-index 6 (list 1 2 3 4 5)) ;; Returns none\n```\n\nThis example demonstrates:\n1. Using `index-of` to find the position of an element in a list.\n2. Handling both the case where the element is found and where it is not found.\n\n## Common Pitfalls\n\n1. Assuming the element will always be found, leading to unhandled `none` cases.\n2. Using `index-of` on lists with incompatible element types.\n3. Overlooking the performance impact of searching very large lists.\n4. Not considering that `index-of` returns a 0-based index.\n\n## Related Functions\n\n- `filter`: Used to create a new list containing only elements that match a condition.\n- `map`: Applies a function to each element in a list, transforming the elements.\n- `len`: Returns the length of a list.\n\n## Conclusion\n\nThe `index-of` function is a powerful tool for locating elements within lists in Clarity smart contracts. It provides a straightforward way to search for elements and retrieve their positions, enabling more complex list operations and conditional logic. When used effectively, `index-of` simplifies list search operations and enhances the readability and maintainability of your smart contract code.\n"],[88,"\n## Function Signature\n\n```clarity\n(int-to-ascii value)\n```\n\n- Input: `int | uint`\n- Output: `(string-ascii 40)`\n\n## Why it matters\n\nThe `int-to-ascii` function is crucial for:\n\n1. Converting integer values to their string representations.\n2. Facilitating the display and logging of numeric data.\n3. Enabling the use of numeric values in contexts that require strings.\n4. Simplifying the process of creating human-readable outputs from numeric data.\n\n## When to use it\n\nUse `int-to-ascii` when you need to:\n\n- Convert an integer or unsigned integer to a string.\n- Display numeric values in a human-readable format.\n- Log or store numeric data as strings.\n- Prepare numeric data for concatenation with other strings.\n\n## Best Practices\n\n- Ensure the integer value is within the range that can be represented as a string.\n- Use meaningful variable names for better readability.\n- Combine with other string functions for more complex string manipulations.\n- Be aware of the maximum length of the resulting string (40 characters).\n\n## Practical Example: Logging a User's Balance\n\nLet's implement a function that logs a user's balance as a string:\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (log-balance (user principal))\n (let\n (\n (balance (default-to u0 (map-get? UserBalances { userId: user })))\n (balanceStr (int-to-ascii balance))\n )\n (print balanceStr)\n )\n)\n\n;; Usage\n(map-set UserBalances { userId: tx-sender } { balance: u100 })\n(log-balance tx-sender) ;; Logs \"100\"\n```\n\nThis example demonstrates:\n1. Using `int-to-ascii` to convert a user's balance to a string.\n2. Logging the string representation of the balance using `print`.\n3. Handling the case where the user has no balance set.\n\n## Common Pitfalls\n\n1. Assuming the resulting string will always fit within 40 characters.\n2. Forgetting to handle cases where the integer value is not set or is zero.\n3. Using `int-to-ascii` in performance-critical sections without considering the overhead.\n4. Not combining with other string functions for more complex manipulations.\n\n## Related Functions\n\n- `print`: Used to log or display string values.\n- `concat`: Used to concatenate multiple strings.\n- `default-to`: Used to provide default values for optional types.\n\n## Conclusion\n\nThe `int-to-ascii` function is a powerful tool for converting integer values to their string representations in Clarity smart contracts. This function enables you to create human-readable outputs from numeric data, facilitating logging, display, and storage of numeric values as strings. When used effectively, `int-to-ascii` enhances the readability and usability of numeric data within your smart contract code.\n"],[120,"\n## Function Signature\n\n```clarity\n(int-to-utf8 value)\n```\n\n\n\n\n- Input: `int | uint`\n- Output: `(string-utf8 40)`\n\n## Why it matters\n\nThe `int-to-utf8` function is crucial for:\n\n1. Converting integer values to their UTF-8 string representations.\n2. Facilitating the display and logging of numeric data in a more versatile encoding.\n3. Enabling the use of numeric values in contexts that require UTF-8 strings.\n4. Simplifying the process of creating human-readable outputs from numeric data.\n\n## When to use it\n\nUse `int-to-utf8` when you need to:\n\n- Convert an integer or unsigned integer to a UTF-8 string.\n- Display numeric values in a human-readable format.\n- Log or store numeric data as UTF-8 strings.\n- Prepare numeric data for concatenation with other UTF-8 strings.\n\n## Best Practices\n\n- Ensure the integer value is within the range that can be represented as a string.\n- Use meaningful variable names for better readability.\n- Combine with other string functions for more complex string manipulations.\n- Be aware of the maximum length of the resulting string (40 characters).\n\n## Practical Example: Logging a User's Balance\n\nLet's implement a function that logs a user's balance as a UTF-8 string:\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (log-balance (user principal))\n (let\n (\n (balance (default-to u0 (map-get? UserBalances { userId: user })))\n (balanceStr (int-to-utf8 balance))\n )\n (print balanceStr)\n )\n)\n\n;; Usage\n(map-set UserBalances { userId: tx-sender } { balance: u100 })\n(log-balance tx-sender) ;; Logs \"100\"\n```\n\n\n\n\nThis example demonstrates:\n1. Using `int-to-utf8` to convert a user's balance to a UTF-8 string.\n2. Logging the string representation of the balance using `print`.\n3. Handling the case where the user has no balance set.\n\n## Common Pitfalls\n\n1. Assuming the resulting string will always fit within 40 characters.\n2. Forgetting to handle cases where the integer value is not set or is zero.\n3. Using `int-to-utf8` in performance-critical sections without considering the overhead.\n4. Not combining with other string functions for more complex manipulations.\n\n## Related Functions\n\n- `print`: Used to log or display string values.\n- `concat`: Used to concatenate multiple strings.\n- `default-to`: Used to provide default values for optional types.\n\n## Conclusion\n\nThe `int-to-utf8` function is a powerful tool for converting integer values to their UTF-8 string representations in Clarity smart contracts. It enables you to create human-readable outputs from numeric data, facilitating logging, display, and storage of numeric values as strings. When used effectively, `int-to-utf8` enhances the readability and usability of numeric data within your smart contract code.\n"],[173,"\n## Function Signature\n\n```clarity\n(is-eq v1 v2 ...)\n```\n\n\n\n\n- Input: `A, A, ...`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-eq` function is crucial for:\n\n1. Comparing values to check for equality.\n2. Implementing conditional logic based on value comparisons.\n3. Ensuring data integrity by verifying that values match expected results.\n4. Simplifying equality checks in smart contract code.\n\n## When to use it\n\nUse `is-eq` when you need to:\n\n- Compare multiple values for equality.\n- Implement logic that depends on whether values are equal.\n- Verify that input values match expected constants or variables.\n- Simplify equality checks in your contract.\n\n## Best Practices\n\n- Ensure all values being compared are of the same type to avoid type errors.\n- Use `is-eq` for simple equality checks and combine with other logical functions for complex conditions.\n- Be aware that `is-eq` does not short-circuit; all values are evaluated.\n- Use meaningful variable names for better readability.\n\n## Practical Example: Checking User Role\n\nLet's implement a function that checks if a user has a specific role:\n\n```clarity\n(define-constant ADMIN_ROLE \"admin\")\n(define-map UserRoles { userId: principal } { role: (string-ascii 10) })\n\n(define-read-only (is-admin (user principal))\n (let\n (\n (userRole (default-to \"none\" (map-get? UserRoles { userId: user })))\n )\n (is-eq userRole ADMIN_ROLE)\n )\n)\n\n;; Usage\n(map-set UserRoles { userId: tx-sender } { role: \"admin\" })\n(is-admin tx-sender) ;; Returns true\n```\n\n\n\n\nThis example demonstrates:\n1. Using `is-eq` to compare a user's role with the constant `ADMIN_ROLE`.\n2. Handling the case where the user role is not set by providing a default value.\n3. Implementing a read-only function to check if a user is an admin.\n\n## Common Pitfalls\n\n1. Comparing values of different types, leading to type errors.\n2. Assuming `is-eq` short-circuits like `and` or `or` (it does not).\n3. Using `is-eq` for complex conditions where other logical functions might be more appropriate.\n4. Not handling cases where values might be `none` or unset.\n\n## Related Functions\n\n- `is-some`: Checks if an optional value is `some`.\n- `is-none`: Checks if an optional value is `none`.\n- `asserts!`: Asserts a condition and throws an error if it is false.\n\n## Conclusion\n\nThe `is-eq` function is a fundamental tool for comparing values in Clarity smart contracts. It provides a straightforward way to check for equality, enabling you to implement conditional logic and verify data integrity. When used effectively, `is-eq` simplifies equality checks and enhances the readability and maintainability of your smart contract code.\n"],[124,"\n## Function Signature\n\n```clarity\n(is-err value)\n```\n\n- Input: `(response A B)`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-err` function is crucial for:\n\n1. Determining if a response value represents an error.\n2. Implementing error handling and validation logic.\n3. Ensuring robust contract behavior by checking for errors.\n4. Simplifying conditional checks based on response types.\n\n## When to use it\n\nUse `is-err` when you need to:\n\n- Check if a response value is an error.\n- Implement conditional logic based on the success or failure of operations.\n- Validate the results of function calls that return response types.\n- Handle errors gracefully in your contract logic.\n\n## Best Practices\n\n- Use `is-err` in combination with `match` or `if` for comprehensive error handling.\n- Ensure that the response value being checked is of the correct type.\n- Use meaningful variable names for better readability.\n- Combine with other response handling functions like `is-ok` for complete validation.\n\n## Practical Example: Validating a Token Transfer\n\nLet's implement a function that validates a token transfer and checks for errors:\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? UserBalances { userId: tx-sender })))\n (recipientBalance (default-to u0 (map-get? UserBalances { userId: recipient })))\n (transferResult (if (>= senderBalance amount)\n (begin\n (map-set UserBalances { userId: tx-sender } { balance: (- senderBalance amount) })\n (map-set UserBalances { userId: recipient } { balance: (+ recipientBalance amount) })\n (ok true)\n )\n (err u1)\n ))\n )\n (if (is-err transferResult)\n (err u2)\n (ok true)\n )\n )\n)\n\n;; Usage\n(map-set UserBalances { userId: tx-sender } { balance: u100 })\n(transfer-tokens u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true)\n(transfer-tokens u200 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (err u2)\n```\n\nThis example demonstrates:\n1. Using `is-err` to check if the token transfer operation resulted in an error.\n2. Implementing conditional logic based on the success or failure of the transfer.\n3. Handling both the success and error cases appropriately.\n\n## Common Pitfalls\n\n1. Assuming the response value is always of the correct type, leading to type errors.\n2. Not handling all possible error cases, resulting in incomplete error handling.\n3. Overlooking the need for comprehensive validation and error checking.\n4. Using `is-err` without meaningful error codes or messages, making debugging harder.\n\n## Related Functions\n\n- `is-ok`: Checks if a response value is `ok`.\n- `err`: Constructs an error response.\n- `ok`: Constructs a success response.\n\n## Conclusion\n\nThe `is-err` function is a fundamental tool for error handling in Clarity smart contracts. It allows you to check if a response value represents an error, enabling robust and comprehensive error handling and validation logic. When used effectively, `is-err` enhances the reliability and maintainability of your smart contract code by ensuring that errors are detected and handled appropriately.\n"],[139,"\n## Function Signature\n\n```clarity\n(is-none value)\n```\n\n- Input: `(optional A)`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-none` function is crucial for:\n\n1. Determining if an optional value is `none`.\n2. Implementing conditional logic based on the presence or absence of values.\n3. Ensuring robust contract behavior by checking for missing values.\n4. Simplifying checks for optional values in smart contract code.\n\n## When to use it\n\nUse `is-none` when you need to:\n\n- Check if an optional value is `none`.\n- Implement logic that depends on whether a value is present or absent.\n- Validate the results of function calls that return optional types.\n- Handle cases where values might be missing or not set.\n\n## Best Practices\n\n- Use `is-none` in combination with `match` or `if` for comprehensive value handling.\n- Ensure that the value being checked is of the correct optional type.\n- Use meaningful variable names for better readability.\n- Combine with other optional handling functions like `is-some` for complete validation.\n\n## Practical Example: Checking for Missing User Data\n\nLet's implement a function that checks if a user's profile data is missing:\n\n```clarity\n(define-map UserProfiles { userId: principal } { name: (string-ascii 50), age: uint })\n\n(define-read-only (is-profile-missing (user principal))\n (is-none (map-get? UserProfiles { userId: user }))\n)\n\n;; Usage\n(map-set UserProfiles { userId: tx-sender } { name: \"Alice\", age: u30 })\n(is-profile-missing tx-sender) ;; Returns false\n(is-profile-missing 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns true\n```\n\nThis example demonstrates:\n1. Using `is-none` to check if a user's profile data is missing.\n2. Implementing a read-only function to determine the presence of user data.\n3. Handling both the case where the profile data is present and where it is missing.\n\n## Common Pitfalls\n\n1. Assuming the value will always be `some`, leading to unhandled `none` cases.\n2. Using `is-none` on non-optional types, causing type errors.\n3. Not handling all possible conditions, resulting in incomplete value checks.\n4. Overlooking the need for comprehensive validation and error checking.\n\n## Related Functions\n\n- `is-some`: Checks if an optional value is `some`.\n- `match`: Used for pattern matching and handling multiple conditions.\n- `default-to`: Provides default values for optional types.\n\n## Conclusion\n\nThe `is-none` function is a fundamental tool for checking optional values in Clarity smart contracts. It allows you to determine if a value is `none`, enabling robust and comprehensive value handling and validation logic. When used effectively, `is-none` enhances the reliability and maintainability of your smart contract code by ensuring that missing values are detected and handled appropriately.\n"],[136,"\n## Function Signature\n\n```clarity\n(is-ok value)\n```\n\n- Input: `(response A B)`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-ok` function is crucial for:\n\n1. Determining if a response value represents a successful operation.\n2. Implementing conditional logic based on the success or failure of operations.\n3. Ensuring robust contract behavior by checking for successful responses.\n4. Simplifying checks for response types in smart contract code.\n\n## When to use it\n\nUse `is-ok` when you need to:\n\n- Check if a response value is `ok`.\n- Implement logic that depends on the success of operations.\n- Validate the results of function calls that return response types.\n- Handle success cases gracefully in your contract logic.\n\n## Best Practices\n\n- Use `is-ok` in combination with `match` or `if` for comprehensive response handling.\n- Ensure that the response value being checked is of the correct type.\n- Use meaningful variable names for better readability.\n- Combine with other response handling functions like `is-err` for complete validation.\n\n## Practical Example: Validating a Token Transfer\n\nLet's implement a function that validates a token transfer and checks for success:\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? UserBalances { userId: tx-sender })))\n (recipientBalance (default-to u0 (map-get? UserBalances { userId: recipient })))\n (transferResult (if (>= senderBalance amount)\n (begin\n (map-set UserBalances { userId: tx-sender } { balance: (- senderBalance amount) })\n (map-set UserBalances { userId: recipient } { balance: (+ recipientBalance amount) })\n (ok true)\n )\n (err u1)\n ))\n )\n (if (is-ok transferResult)\n (ok true)\n (err u2)\n )\n )\n)\n\n;; Usage\n(map-set UserBalances { userId: tx-sender } { balance: u100 })\n(transfer-tokens u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true)\n(transfer-tokens u200 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (err u2)\n```\n\nThis example demonstrates:\n1. Using `is-ok` to check if the token transfer operation was successful.\n2. Implementing conditional logic based on the success of the transfer.\n3. Handling both the success and error cases appropriately.\n\n## Common Pitfalls\n\n1. Assuming the response value is always of the correct type, leading to type errors.\n2. Not handling all possible success and error cases, resulting in incomplete response handling.\n3. Overlooking the need for comprehensive validation and error checking.\n4. Using `is-ok` without meaningful success codes or messages, making debugging harder.\n\n## Related Functions\n\n- `is-err`: Checks if a response value is `err`.\n- `err`: Constructs an error response.\n- `ok`: Constructs a success response.\n\n## Conclusion\n\nThe `is-ok` function is a fundamental tool for checking response values in Clarity smart contracts. It allows you to determine if a response value represents a successful operation, enabling robust and comprehensive response handling and validation logic. When used effectively, `is-ok` enhances the reliability and maintainability of your smart contract code by ensuring that successful operations are detected and handled appropriately.\n"],[146,"\n## Function Signature\n\n```clarity\n(is-some value)\n```\n\n- Input: `(optional A)`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-some` function is crucial for:\n\n1. Determining if an optional value is `some`.\n2. Implementing conditional logic based on the presence of values.\n3. Ensuring robust contract behavior by checking for existing values.\n4. Simplifying checks for optional values in smart contract code.\n\n## When to use it\n\nUse `is-some` when you need to:\n\n- Check if an optional value is `some`.\n- Implement logic that depends on whether a value is present.\n- Validate the results of function calls that return optional types.\n- Handle cases where values might be present or absent.\n\n## Best Practices\n\n- Use `is-some` in combination with `match` or `if` for comprehensive value handling.\n- Ensure that the value being checked is of the correct optional type.\n- Use meaningful variable names for better readability.\n- Combine with other optional handling functions like `is-none` for complete validation.\n\n## Practical Example: Checking for Existing User Data\n\nLet's implement a function that checks if a user's profile data exists:\n\n```clarity\n(define-map UserProfiles { userId: principal } { name: (string-ascii 50), age: uint })\n\n(define-read-only (is-profile-existing (user principal))\n (is-some (map-get? UserProfiles { userId: user }))\n)\n\n;; Usage\n(map-set UserProfiles { userId: tx-sender } { name: \"Alice\", age: u30 })\n(is-profile-existing tx-sender) ;; Returns true\n(is-profile-existing 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns false\n```\n\nThis example demonstrates:\n1. Using `is-some` to check if a user's profile data exists.\n2. Implementing a read-only function to determine the presence of user data.\n3. Handling both the case where the profile data is present and where it is absent.\n\n## Common Pitfalls\n\n1. Assuming the value will always be `some`, leading to unhandled `none` cases.\n2. Using `is-some` on non-optional types, causing type errors.\n3. Not handling all possible conditions, resulting in incomplete value checks.\n4. Overlooking the need for comprehensive validation and error checking.\n\n## Related Functions\n\n- `is-none`: Checks if an optional value is `none`.\n- `match`: Used for pattern matching and handling multiple conditions.\n- `default-to`: Provides default values for optional types.\n\n## Conclusion\n\nThe `is-some` function is a fundamental tool for checking optional values in Clarity smart contracts. It allows you to determine if a value is `some`, enabling robust and comprehensive value handling and validation logic. When used effectively, `is-some` enhances the reliability and maintainability of your smart contract code by ensuring that existing values are detected and handled appropriately.\n"],[147,"\n## Function Signature\n\n```clarity\n(is-standard value)\n```\n\n- Input: `principal`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-standard` function is crucial for:\n\n1. Determining if a principal is a standard principal (i.e., a user address).\n2. Implementing conditional logic based on the type of principal.\n3. Ensuring that certain operations are only performed by standard principals.\n4. Simplifying checks for principal types in smart contract code.\n\n## When to use it\n\nUse `is-standard` when you need to:\n\n- Check if a principal is a standard user address.\n- Implement logic that depends on the type of principal.\n- Validate the type of principal before performing certain operations.\n- Handle cases where only standard principals are allowed.\n\n## Best Practices\n\n- Use `is-standard` in combination with `if` or `match` for comprehensive principal type handling.\n- Ensure that the value being checked is of the correct principal type.\n- Use meaningful variable names for better readability.\n- Note that you can pass in a valid contract principal as well, not just a standard principal (e.g., `'SP12` or `'SP12.contract`).\n\n## Practical Example: Restricting Access to Standard Principals\n\nLet's implement a function that restricts access to standard principals:\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (if (is-standard tx-sender)\n (let\n (\n (senderBalance (default-to u0 (map-get? UserBalances { userId: tx-sender })))\n (recipientBalance (default-to u0 (map-get? UserBalances { userId: recipient })))\n )\n (if (>= senderBalance amount)\n (begin\n (map-set UserBalances { userId: tx-sender } { balance: (- senderBalance amount) })\n (map-set UserBalances { userId: recipient } { balance: (+ recipientBalance amount) })\n (ok true)\n )\n (err u1)\n )\n )\n (err u2)\n )\n)\n\n;; Usage\n(map-set UserBalances { userId: tx-sender } { balance: u100 })\n(transfer-tokens u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true) if tx-sender is a standard principal\n```\n\nThis example demonstrates:\n1. Using `is-standard` to check if the transaction sender is a standard principal.\n2. Implementing conditional logic based on the type of principal.\n3. Handling both the case where the principal is standard and where it is not.\n\n## Common Pitfalls\n\n1. Assuming the principal will always be standard, leading to unhandled cases.\n2. Using `is-standard` on non-principal types, causing type errors.\n3. Not handling all possible conditions, resulting in incomplete principal type checks.\n4. Overlooking the need for comprehensive validation and error checking.\n\n## Related Functions\n\n- `tx-sender`: Returns the principal that initiated the transaction.\n- `contract-caller`: Returns the caller of the current contract context.\n\n## Conclusion\n\nThe `is-standard` function is a fundamental tool for checking principal types in Clarity smart contracts. It allows you to determine if a principal is a standard user address, enabling robust and comprehensive principal type handling and validation logic. When used effectively, `is-standard` enhances the reliability and maintainability of your smart contract code by ensuring that operations are performed by the correct type of principal.\n"],[91,"\n## Function Signature\n\n```clarity\n(keccak256 value)\n```\n\n- Input: `buff`\n- Output: `(buff 32)`\n\n## Why it matters\n\nThe `keccak256` function is crucial for:\n\n1. Computing cryptographic hashes of data.\n2. Ensuring data integrity and authenticity.\n3. Implementing cryptographic operations in smart contracts.\n4. Creating unique identifiers for data.\n\n## When to use it\n\nUse `keccak256` when you need to:\n\n- Compute a cryptographic hash of a buffer.\n- Verify data integrity and authenticity.\n- Generate unique identifiers for data.\n- Implement cryptographic operations in your contract.\n\n## Best Practices\n\n- Ensure the input buffer is of the correct length and format.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for more complex operations.\n- Be aware of the security implications of using cryptographic hashes.\n\n## Practical Example: Hashing a User's Data\n\nLet's implement a function that computes the Keccak-256 hash of a user's data:\n\n```clarity\n(define-map UserData { userId: principal } { data: (buff 32) })\n\n(define-public (hash-user-data (user principal))\n (let\n (\n (data (default-to (buff 0) (map-get? UserData { userId: user })))\n (hash (keccak256 data))\n )\n (ok hash)\n )\n)\n\n;; Usage\n(map-set UserData { userId: tx-sender } { data: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef })\n(hash-user-data tx-sender) ;; Returns the Keccak-256 hash of the data\n```\n\nThis example demonstrates:\n1. Using `keccak256` to compute the hash of a user's data.\n2. Implementing a public function to return the hash.\n3. Handling the case where the user's data is not set by providing a default value.\n\n## Common Pitfalls\n\n1. Using `keccak256` on non-buffer types, causing type errors.\n2. Not handling cases where the input buffer is empty or invalid.\n3. Overlooking the need for proper error handling and validation.\n4. Assuming the hash function is collision-resistant without understanding its limitations.\n\n## Related Functions\n\n- `sha256`: Computes the SHA-256 hash of a buffer.\n- `hash160`: Computes the RIPEMD-160 hash of the SHA-256 hash of a buffer.\n- `concat`: Concatenates multiple buffers.\n\n## Conclusion\n\nThe `keccak256` function is a powerful tool for computing cryptographic hashes in Clarity smart contracts. It allows you to ensure data integrity and authenticity, generate unique identifiers, and implement cryptographic operations. When used effectively, `keccak256` enhances the security and reliability of your smart contract code by providing a robust mechanism for hashing data.\n"],[110,"\n## Function Signature\n\n```clarity\n(len sequence)\n```\n\n- Input: `sequence_A`\n- Output: `uint`\n\n## Why it matters\n\nThe `len` function is crucial for:\n\n1. Determining the length of various sequence types.\n2. Implementing logic that depends on the size of sequences.\n3. Ensuring data integrity by validating sequence lengths.\n4. Simplifying length checks in smart contract code.\n\n## When to use it\n\nUse `len` when you need to:\n\n- Get the length of a list, buffer, or string.\n- Implement logic that depends on the size of sequences.\n- Validate the length of input data.\n- Handle cases where the size of a sequence is important.\n\n## Best Practices\n\n- Ensure the sequence type is compatible with the `len` function.\n- Use meaningful variable names for better readability.\n- Combine with other functions for comprehensive sequence handling.\n- Be aware of the maximum length of sequences in Clarity.\n\n## Practical Example: Validating a List Length\n\nLet's implement a function that validates the length of a list of integers:\n\n```clarity\n(define-read-only (validate-list-length (numbers (list 10 int)))\n (let\n (\n (length (len numbers))\n )\n (if (<= length u10)\n (ok length)\n (err u1)\n )\n )\n)\n\n;; Usage\n(validate-list-length (list 1 2 3 4 5)) ;; Returns (ok u5)\n(validate-list-length (list 1 2 3 4 5 6 7 8 9 10 11)) ;; Returns (err u1)\n```\n\nThis example demonstrates:\n1. Using `len` to get the length of a list of integers.\n2. Implementing conditional logic based on the length of the list.\n3. Handling both the case where the list length is valid and where it is not.\n\n## Common Pitfalls\n\n1. Using `len` on incompatible types, causing type errors.\n2. Assuming the length will always be within a certain range, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete length checks.\n4. Overlooking the need for comprehensive validation and error checking.\n\n## Related Functions\n\n- `as-max-len?`: Ensures a sequence does not exceed a maximum length.\n- `concat`: Concatenates multiple sequences.\n- `default-to`: Provides default values for optional types.\n\n## Conclusion\n\nThe `len` function is a fundamental tool for getting the length of sequences in Clarity smart contracts. It allows you to determine the size of lists, buffers, and strings, enabling robust and comprehensive sequence handling and validation logic. When used effectively, `len` enhances the reliability and maintainability of your smart contract code by ensuring that sequence lengths are detected and handled appropriately.\n"],[171,"\n## Function Signature\n\n```clarity\n(let ((name1 expr1) (name2 expr2) ...) expr-body1 expr-body2 ... expr-body-last)\n```\n\n- Input: `((name1 AnyType) (name2 AnyType) ...), AnyType, ... A`\n- Output: `A`\n\n## Why it matters\n\nThe `let` function is crucial for:\n\n1. Binding variables to expressions within a local scope.\n2. Simplifying complex expressions by breaking them into smaller parts.\n3. Improving code readability and maintainability.\n4. Enabling sequential evaluation of expressions.\n\n## When to use it\n\nUse `let` when you need to:\n\n- Bind variables to expressions within a local scope.\n- Simplify complex expressions by breaking them into smaller parts.\n- Improve the readability and maintainability of your code.\n- Ensure sequential evaluation of expressions.\n\n## Best Practices\n\n- Use meaningful variable names for better readability.\n- Ensure that the expressions are evaluated in the correct order.\n- Combine with other control flow functions for more complex logic.\n- Be aware that `let` bindings are sequential and can refer to prior bindings.\n\n## Practical Example: Calculating a Sum\n\nLet's implement a function that calculates the sum of two numbers using `let`:\n\n```clarity\n(define-public (calculate-sum (a int) (b int))\n (let\n (\n (sum (+ a b))\n )\n (ok sum)\n )\n)\n\n;; Usage\n(calculate-sum 3 5) ;; Returns (ok 8)\n```\n\nThis example demonstrates:\n1. Using `let` to bind the variable `sum` to the result of adding `a` and `b`.\n2. Returning the sum as the result of the function.\n3. Simplifying the function body by breaking it into smaller parts.\n\n## Common Pitfalls\n\n1. Using `let` bindings out of order, leading to incorrect evaluations.\n2. Not handling all possible conditions, resulting in incomplete logic.\n3. Overlooking the need for proper error handling and validation.\n4. Using `let` for simple expressions where it is not necessary.\n\n## Related Functions\n\n- `begin`: Evaluates multiple expressions sequentially, returning the last expression's value.\n- `if`: Implements conditional logic based on boolean expressions.\n- `match`: Used for pattern matching and handling multiple conditions.\n\n## Conclusion\n\nThe `let` function is a fundamental tool for binding variables to expressions in Clarity smart contracts. It allows you to simplify complex expressions, improve code readability, and ensure sequential evaluation of expressions. When used effectively, `let` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage local variables and expressions.\n"],[82,"\n## Function Signature\n\n```clarity\n(list expr1 expr2 expr3 ...)\n```\n\n- Input: `A, ...`\n- Output: `(list A)`\n\n## Why it matters\n\nThe `list` function is crucial for:\n\n1. Constructing lists of elements in Clarity.\n2. Enabling the use of lists for data storage and manipulation.\n3. Simplifying the creation of sequences of values.\n4. Facilitating operations on collections of data.\n\n## When to use it\n\nUse `list` when you need to:\n\n- Construct a list of elements.\n- Store and manipulate sequences of values.\n- Pass lists as arguments to functions.\n- Perform operations on collections of data.\n\n## Best Practices\n\n- Ensure all elements in the list are of the same type.\n- Use meaningful variable names for better readability.\n- Combine with other list functions for comprehensive list handling.\n- Be aware of the maximum length of lists in Clarity.\n\n## Practical Example: Creating a List of Integers\n\nLet's implement a function that creates a list of integers and returns its length:\n\n```clarity\n(define-read-only (create-list)\n (let\n (\n (numbers (list 1 2 3 4 5))\n )\n (len numbers)\n )\n)\n\n;; Usage\n(create-list) ;; Returns u5\n```\n\nThis example demonstrates:\n1. Using `list` to create a list of integers.\n2. Binding the list to a variable using `let`.\n3. Returning the length of the list using `len`.\n\n## Common Pitfalls\n\n1. Using `list` with elements of different types, causing type errors.\n2. Assuming the list will always be within a certain length, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete list checks.\n4. Overlooking the need for comprehensive validation and error checking.\n\n## Related Functions\n\n- `len`: Returns the length of a list.\n- `append`: Adds an element to the end of a list.\n- `concat`: Concatenates multiple lists.\n\n## Conclusion\n\nThe `list` function is a fundamental tool for constructing lists in Clarity smart contracts. It allows you to create sequences of values, enabling robust and comprehensive list handling and manipulation. When used effectively, `list` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage collections of data.\n"],[107,"\n## Function Signature\n\n```clarity\n(log2 n)\n```\n\n- Input: `int | uint`\n- Output: `int | uint`\n\n## Why it matters\n\nThe `log2` function is crucial for:\n\n1. Calculating the base-2 logarithm of a number.\n2. Implementing mathematical operations that require logarithmic calculations.\n3. Simplifying the process of determining the power of 2 needed to obtain a given value.\n4. Facilitating operations that depend on logarithmic scaling.\n\n## When to use it\n\nUse `log2` when you need to:\n\n- Calculate the base-2 logarithm of an integer or unsigned integer.\n- Implement logic that depends on logarithmic calculations.\n- Determine the power of 2 needed to obtain a given value.\n- Simplify mathematical operations involving logarithms.\n\n## Best Practices\n\n- Ensure the input value is non-negative, as `log2` fails on negative numbers.\n- Use meaningful variable names for better readability.\n- Combine with other mathematical functions for comprehensive calculations.\n- Be aware of the integer rounding behavior of `log2`.\n\n## Practical Example: Calculating Logarithm of a Number\n\nLet's implement a function that calculates the base-2 logarithm of a given number:\n\n```clarity\n(define-read-only (calculate-log2 (n uint))\n (log2 n)\n)\n\n;; Usage\n(calculate-log2 u8) ;; Returns u3\n(calculate-log2 u16) ;; Returns u4\n```\n\nThis example demonstrates:\n1. Using `log2` to calculate the base-2 logarithm of a given number.\n2. Implementing a read-only function to return the logarithm.\n3. Handling both small and large input values.\n\n## Common Pitfalls\n\n1. Using `log2` on negative numbers, causing the function to fail.\n2. Assuming the result will always be an integer, leading to incorrect expectations.\n3. Not handling all possible conditions, resulting in incomplete calculations.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `sqrti`: Returns the largest integer that is less than or equal to the square root of a number.\n- `pow`: Raises a number to the power of another number.\n- `sqrt`: Returns the square root of a number.\n\n## Conclusion\n\nThe `log2` function is a fundamental tool for calculating the base-2 logarithm of numbers in Clarity smart contracts. It allows you to perform logarithmic calculations, enabling robust and comprehensive mathematical operations. When used effectively, `log2` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage logarithmic calculations.\n"],[105,"\n## Function Signature\n\n```clarity\n(map function list)\n```\n\n- Input: `(function (A) => B)`, `(list A)`\n- Output: `(list B)`\n\n## Why it matters\n\nThe `map` function is crucial for:\n\n1. Applying a function to each element of a list.\n2. Transforming lists by applying operations to their elements.\n3. Simplifying the process of performing bulk operations on lists.\n4. Enhancing code readability and maintainability by abstracting repetitive operations.\n\n## When to use it\n\nUse `map` when you need to:\n\n- Apply a function to each element of a list.\n- Transform a list by applying operations to its elements.\n- Perform bulk operations on lists.\n- Simplify and abstract repetitive operations on list elements.\n\n## Best Practices\n\n- Ensure the function being applied is compatible with the elements of the list.\n- Use meaningful variable names for better readability.\n- Combine with other list functions for comprehensive list handling.\n- Be aware of the performance implications of applying functions to large lists.\n\n## Practical Example: Doubling Each Element in a List\n\nLet's implement a function that doubles each element in a list of integers:\n\n```clarity\n(define-private (double (n int))\n (* n 2)\n)\n\n(define-read-only (double-elements (numbers (list 10 int)))\n (map double numbers)\n)\n\n;; Usage\n(double-elements (list 1 2 3 4 5)) ;; Returns (list 2 4 6 8 10)\n```\n\nThis example demonstrates:\n1. Defining a private function `double` to double an integer.\n2. Using `map` to apply the `double` function to each element in a list.\n3. Implementing a read-only function to return the transformed list.\n4. Handling both small and large input lists.\n\n## Common Pitfalls\n\n1. Using `map` with incompatible function and list element types, causing type errors.\n2. Assuming the list will always be within a certain length, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete list transformations.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `filter`: Filters elements of a list based on a predicate function.\n- `fold`: Reduces a list to a single value by applying a function.\n- `len`: Returns the length of a list.\n\n## Conclusion\n\nThe `map` function is a fundamental tool for applying functions to each element of a list in Clarity smart contracts. It allows you to transform lists, perform bulk operations, and simplify repetitive tasks. When used effectively, `map` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage list transformations.\n"],[89,"\n## Function Signature\n\n```clarity\n(map-delete map-name key-tuple)\n```\n\n- Input: `MapName, tuple`\n- Output: `bool`\n\n## Why it matters\n\nThe `map-delete` function is crucial for:\n\n1. Removing entries from a map.\n2. Managing and updating the state of data stored in maps.\n3. Ensuring data integrity by allowing the deletion of obsolete or incorrect entries.\n4. Simplifying the process of maintaining clean and accurate data in smart contracts.\n\n## When to use it\n\nUse `map-delete` when you need to:\n\n- Remove an entry from a map.\n- Manage and update the state of data stored in maps.\n- Ensure data integrity by deleting obsolete or incorrect entries.\n- Maintain clean and accurate data in your smart contract.\n\n## Best Practices\n\n- Ensure the key-tuple accurately identifies the entry to be deleted.\n- Use meaningful variable names for better readability.\n- Combine with other map functions for comprehensive map management.\n- Be aware of the performance implications of frequent deletions in large maps.\n\n## Practical Example: Deleting a User's Data\n\nLet's implement a function that deletes a user's data from a map:\n\n```clarity\n(define-map UserData { userId: principal } { data: (buff 32) })\n\n(define-public (delete-user-data (user principal))\n (ok (map-delete UserData { userId: user }))\n)\n\n;; Usage\n(map-set UserData { userId: tx-sender } { data: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef }) ;; Returns true\n(delete-user-data tx-sender) ;; Returns (ok true)\n```\n\nThis example demonstrates:\n1. Using `map-delete` to remove a user's data from the `UserData` map.\n2. Implementing a public function to delete the data.\n3. Handling the case where the user's data is present and needs to be removed.\n\n## Common Pitfalls\n\n1. Using `map-delete` with an incorrect key-tuple, causing the deletion to fail.\n2. Assuming the entry will always exist, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-set`: Sets the value associated with a key in a map.\n- `map-get?`: Retrieves an entry from a map.\n- `map-insert`: Inserts a value into a map if the key does not already exist.\n\n## Conclusion\n\nThe `map-delete` function is a fundamental tool for managing data in Clarity smart contracts. It allows you to remove entries from maps, ensuring data integrity and maintaining clean and accurate data. When used effectively, `map-delete` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage map entries.\n"],[172,"\n## Function Signature\n\n```clarity\n(map-get? map-name key-tuple)\n```\n\n- Input: `MapName, tuple`\n- Output: `(optional (tuple))`\n\n## Why it matters\n\nThe `map-get?` function is crucial for:\n\n1. Retrieving entries from a map.\n2. Implementing logic that depends on the presence of map entries.\n3. Ensuring data integrity by checking for the existence of values.\n4. Simplifying the process of accessing stored data in smart contracts.\n\n## When to use it\n\nUse `map-get?` when you need to:\n\n- Retrieve an entry from a map.\n- Implement logic that depends on the presence of map entries.\n- Check for the existence of values in a map.\n- Access stored data in your smart contract.\n\n## Best Practices\n\n- Ensure the key-tuple accurately identifies the entry to be retrieved.\n- Use meaningful variable names for better readability.\n- Combine with other map functions for comprehensive map management.\n- Handle the `none` case to avoid runtime errors.\n\n## Practical Example: Retrieving User Data\n\nLet's implement a function that retrieves a user's data from a map:\n\n```clarity\n(define-map UserData { userId: principal } { data: (buff 32) })\n\n(define-read-only (get-user-data (user principal))\n (map-get? UserData { userId: user })\n)\n\n;; Usage\n(map-set UserData { userId: tx-sender } { data: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef })\n(get-user-data tx-sender) ;; Returns (some (tuple (data 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef)))\n(get-user-data 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns none\n```\n\nThis example demonstrates:\n1. Using `map-get?` to retrieve a user's data from the `UserData` map.\n2. Implementing a read-only function to return the retrieved data.\n3. Handling both the case where the user's data is present and where it is not.\n\n## Common Pitfalls\n\n1. Using `map-get?` with an incorrect key-tuple, causing the retrieval to fail.\n2. Assuming the entry will always exist, leading to unhandled `none` cases.\n3. Not handling all possible conditions, resulting in incomplete data retrieval.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-set`: Sets the value associated with a key in a map.\n- `map-delete`: Removes an entry from a map.\n- `map-insert`: Inserts a value into a map if the key does not already exist.\n\n## Conclusion\n\nThe `map-get?` function is a fundamental tool for retrieving entries from maps in Clarity smart contracts. It allows you to access stored data, implement logic based on map entries, and ensure data integrity. When used effectively, `map-get?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to retrieve map entries.\n"],[167,"\n## Function Signature\n\n```clarity\n(map-insert map-name key-tuple value-tuple)\n```\n\n- Input: `MapName, tuple_A, tuple_B`\n- Output: `bool`\n\n## Why it matters\n\nThe `map-insert` function is crucial for:\n\n1. Adding new entries to a map.\n2. Ensuring data integrity by preventing overwrites of existing entries.\n3. Simplifying the process of managing data in smart contracts.\n4. Enabling the creation of unique key-value pairs in maps.\n\n## When to use it\n\nUse `map-insert` when you need to:\n\n- Add a new entry to a map.\n- Ensure that existing entries are not overwritten.\n- Manage data in your smart contract.\n- Create unique key-value pairs in maps.\n\n## Best Practices\n\n- Ensure the key-tuple and value-tuple are correctly formatted.\n- Use meaningful variable names for better readability.\n- Combine with other map functions for comprehensive map management.\n- Handle the case where the key already exists to avoid unexpected behavior.\n\n## Practical Example: Inserting User Data\n\nLet's implement a function that inserts a user's data into a map:\n\n```clarity\n(define-map UserData { userId: principal } { data: (buff 32) })\n\n(define-public (insert-user-data (user principal) (data (buff 32)))\n (ok (map-insert UserData { userId: user } { data: data }))\n)\n\n;; Usage\n(insert-user-data tx-sender 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef) ;; Returns (ok true) if the entry is inserted\n(insert-user-data tx-sender 0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef) ;; Returns (ok false) if the entry already exists\n```\n\nThis example demonstrates:\n1. Using `map-insert` to add a user's data to the `UserData` map.\n2. Implementing a public function to insert the data.\n3. Handling both the case where the entry is successfully inserted and where it already exists.\n\n## Common Pitfalls\n\n1. Using `map-insert` with incorrectly formatted tuples, causing the insertion to fail.\n2. Assuming the entry will always be inserted, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-set`: Sets the value associated with a key in a map, overwriting any existing value.\n- `map-delete`: Removes an entry from a map.\n- `map-get?`: Retrieves an entry from a map.\n\n## Conclusion\n\nThe `map-insert` function is a fundamental tool for adding entries to maps in Clarity smart contracts. It allows you to manage data, ensure data integrity, and create unique key-value pairs. When used effectively, `map-insert` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage data insertion.\n"],[132,"\n## Function Signature\n\n```clarity\n(map-set map-name key-tuple value-tuple)\n```\n\n- Input: `MapName, tuple_A, tuple_B`\n- Output: `bool`\n\n## Why it matters\n\nThe `map-set` function is crucial for:\n\n1. Setting or updating entries in a map.\n2. Managing and updating the state of data stored in maps.\n3. Ensuring data integrity by allowing updates to existing entries.\n4. Simplifying the process of maintaining accurate data in smart contracts.\n\n## When to use it\n\nUse `map-set` when you need to:\n\n- Set or update an entry in a map.\n- Manage and update the state of data stored in maps.\n- Ensure data integrity by updating existing entries.\n- Maintain accurate data in your smart contract.\n\n## Best Practices\n\n- Ensure the key-tuple and value-tuple are correctly formatted.\n- Use meaningful variable names for better readability.\n- Combine with other map functions for comprehensive map management.\n- Be aware of the performance implications of frequent updates in large maps.\n\n## Practical Example: Setting User Data\n\nLet's implement a function that sets a user's data in a map:\n\n```clarity\n(define-map UserData { userId: principal } { data: (buff 32) })\n\n(define-public (set-user-data (user principal) (data (buff 32)))\n (ok (map-set UserData { userId: user } { data: data }))\n)\n\n;; Usage\n(set-user-data tx-sender 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef) ;; Returns (ok true)\n(set-user-data tx-sender 0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef) ;; Returns (ok true)\n```\n\nThis example demonstrates:\n1. Using `map-set` to set a user's data in the `UserData` map.\n2. Implementing a public function to set the data.\n3. Handling both the case where the entry is newly created and where it is updated.\n\n## Common Pitfalls\n\n1. Using `map-set` with incorrectly formatted tuples, causing the operation to fail.\n2. Assuming the entry will always be updated, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-insert`: Inserts a value into a map if the key does not already exist.\n- `map-delete`: Removes an entry from a map.\n- `map-get?`: Retrieves an entry from a map.\n\n## Conclusion\n\nThe `map-set` function is a fundamental tool for setting or updating entries in maps in Clarity smart contracts. It allows you to manage data, ensure data integrity, and maintain accurate data. When used effectively, `map-set` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage map entries.\n"],[170,"\n## Function Signature\n\n```clarity\n(match opt-input some-binding-name some-branch none-branch)\n(match-resp input ok-binding-name ok-branch err-binding-name err-branch)\n```\n\n- Input: `(optional A) name expression expression | (response A B) name expression name expression`\n- Output: `C`\n\n## Why it matters\n\nThe `match` function is crucial for:\n\n1. Handling different branches or cases for optional and response types.\n2. Simplifying complex conditional logic.\n3. Enhancing code readability and maintainability.\n4. Ensuring comprehensive handling of all possible cases.\n\n## When to use it\n\nUse `match` when you need to:\n\n- Handle different branches or cases for optional and response types.\n- Simplify complex conditional logic.\n- Enhance the readability and maintainability of your code.\n- Ensure comprehensive handling of all possible cases.\n\n## Best Practices\n\n- Ensure all possible branches are covered to avoid unhandled cases.\n- Use meaningful variable names for better readability.\n- Combine with other control flow functions for more complex logic.\n- Be aware of the performance implications of extensive branching.\n\n## Practical Example: Handling Optional and Response Values\n\nLet's implement functions that handle optional and response values using `match`:\n\n```clarity\n(define-private (add-10 (x (optional int))) \n (match x \n value (+ 10 value)\n 10\n )\n)\n(add-10 (some 5)) ;; Returns 15\n(add-10 none) ;; Returns 10\n\n(define-private (add-or-pass-err (x (response int (string-ascii 10))) (to-add int)) \n (match x\n value (ok (+ to-add value))\n err-value (err err-value)\n )\n)\n(add-or-pass-err (ok 5) 20) ;; Returns (ok 25)\n(add-or-pass-err (err \"ERROR\") 20) ;; Returns (err \"ERROR\")\n```\n\nThis example demonstrates:\n1. Using `match` to handle the result of an optional value.\n2. Using `match` to handle the result of a response value.\n3. Implementing functions to return the appropriate result based on the input type.\n\n## Common Pitfalls\n\n1. Using `match` without covering all possible branches, leading to unhandled cases.\n2. Assuming the value will always match a certain branch, causing runtime errors.\n3. Not handling all possible conditions, resulting in incomplete logic.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `if`: Implements conditional logic based on boolean expressions.\n- `let`: Binds variables to expressions within a local scope.\n- `default-to`: Provides default values for optional types.\n\n## Conclusion\n\nThe `match` function is a fundamental tool for handling different branches or cases in Clarity smart contracts. It allows you to manage optional and response types, simplify complex conditional logic, and ensure comprehensive handling of all possible cases. When used effectively, `match` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage branching logic.\n"],[189,"\n## Function Signature\n\n```clarity\n(merge tuple1 tuple2)\n```\n\n- Input: `tuple, tuple`\n- Output: `tuple`\n\n## Why it matters\n\nThe `merge` function is crucial for:\n\n1. Combining fields from two tuples into a single tuple.\n2. Simplifying the process of updating and managing data structures.\n3. Ensuring data integrity by creating new tuples without mutating the original ones.\n4. Enhancing code readability and maintainability by abstracting tuple merging operations.\n\n## When to use it\n\nUse `merge` when you need to:\n\n- Combine fields from two tuples into a single tuple.\n- Update and manage data structures in a clean and efficient manner.\n- Ensure data integrity by creating new tuples without mutating the original ones.\n- Simplify and abstract tuple merging operations.\n\n## Best Practices\n\n- Ensure the tuples being merged have compatible fields.\n- Use meaningful variable names for better readability.\n- Combine with other tuple and map functions for comprehensive data management.\n- Be aware of the performance implications of frequent tuple merging in large data structures.\n\n## Practical Example: Merging User Data\n\nLet's implement a function that merges additional data into a user's existing data:\n\n```clarity\n(define-map Users { id: int } { name: (string-ascii 12), address: (optional principal) })\n\n(define-public (update-user-address (user-id int) (new-address principal))\n (let\n (\n (user (unwrap-panic (map-get? Users { id: user-id })))\n (updated-user (merge user { address: (some new-address) }))\n )\n (map-set Users { id: user-id } updated-user)\n )\n)\n\n;; Usage\n(map-insert Users { id: 1337 } { name: \"john\", address: none }) ;; Returns true\n(update-user-address 1337 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns true\n(map-get? Users { id: 1337 }) ;; Returns (some (tuple (name \"john\") (address (some SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF))))\n```\n\nThis example demonstrates:\n1. Using `merge` to combine a user's existing data with new address data.\n2. Implementing a public function to update the user's address.\n3. Handling both the retrieval and updating of user data in a clean and efficient manner.\n\n## Common Pitfalls\n\n1. Using `merge` with tuples that have incompatible fields, causing runtime errors.\n2. Assuming the tuples will always have the expected fields, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-set`: Sets the value associated with a key in a map.\n- `map-get?`: Retrieves an entry from a map.\n- `map-insert`: Inserts a value into a map if the key does not already exist.\n\n## Conclusion\n\nThe `merge` function is a fundamental tool for combining tuples in Clarity smart contracts. It allows you to manage and update data structures efficiently, ensuring data integrity and enhancing code readability. When used effectively, `merge` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage tuple merging operations.\n"],[197,"\n## Function Signature\n\n```clarity\n(mod i1 i2)\n```\n\n- Input: `int, int | uint, uint | string-ascii, string-ascii | string-utf8, string-utf8 | buff, buff`\n- Output: `int | uint`\n\n## Why it matters\n\nThe `mod` function is crucial for:\n\n1. Calculating the remainder of integer division.\n2. Implementing logic that depends on modular arithmetic.\n3. Simplifying the process of performing operations that require remainders.\n4. Enhancing code readability and maintainability by abstracting modular operations.\n\n## When to use it\n\nUse `mod` when you need to:\n\n- Calculate the remainder of integer division.\n- Implement logic that depends on modular arithmetic.\n- Perform operations that require remainders.\n- Simplify and abstract modular operations.\n\n## Best Practices\n\n- Ensure the divisor is not zero to avoid runtime errors.\n- Use meaningful variable names for better readability.\n- Combine with other mathematical functions for comprehensive calculations.\n- Be aware of the performance implications of frequent modular operations.\n\n## Practical Example: Calculating Remainders\n\nLet's implement a function that calculates the remainder of dividing two numbers:\n\n```clarity\n(define-read-only (calculate-remainder (a int) (b int))\n (mod a b)\n)\n\n;; Usage\n(calculate-remainder 5 2) ;; Returns 1\n(calculate-remainder 7 3) ;; Returns 1\n(calculate-remainder 10 4) ;; Returns 2\n```\n\nThis example demonstrates:\n1. Using `mod` to calculate the remainder of dividing two numbers.\n2. Implementing a read-only function to return the remainder.\n3. Handling both small and large input values.\n\n## Common Pitfalls\n\n1. Using `mod` with a divisor of zero, causing a runtime error.\n2. Assuming the result will always be positive, leading to incorrect expectations.\n3. Not handling all possible conditions, resulting in incomplete calculations.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `+`: Adds two numbers.\n- `-`: Subtracts one number from another.\n- `*`: Multiplies two numbers.\n- `/`: Divides one number by another.\n\n## Conclusion\n\nThe `mod` function is a fundamental tool for calculating the remainder of integer division in Clarity smart contracts. It allows you to perform modular arithmetic, enabling robust and comprehensive mathematical operations. When used effectively, `mod` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage modular calculations.\n"],[135,"\n## Function Signature\n\n```clarity\n(nft-burn? asset-class asset-identifier sender)\n```\n\n- Input: `AssetName, A, principal`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `nft-burn?` function is crucial for:\n\n1. Reducing the circulating supply of a non-fungible token (NFT).\n2. Managing the lifecycle of NFTs by allowing their destruction.\n3. Ensuring data integrity by removing ownership records of burned NFTs.\n4. Simplifying the process of handling NFT burn operations in smart contracts.\n\n## When to use it\n\nUse `nft-burn?` when you need to:\n\n- Reduce the circulating supply of an NFT.\n- Manage the lifecycle of NFTs by allowing their destruction.\n- Remove ownership records of burned NFTs.\n- Handle NFT burn operations in your smart contract.\n\n## Best Practices\n\n- Ensure the `sender` principal owns the NFT before attempting to burn it.\n- Use meaningful variable names for better readability.\n- Combine with other NFT functions for comprehensive NFT management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Burning an NFT\n\nLet's implement a function that burns an NFT owned by the sender:\n\n```clarity\n(define-non-fungible-token Stackaroo (string-ascii 40))\n\n(define-public (burn-nft (id (string-ascii 40)))\n (nft-burn? Stackaroo id tx-sender)\n)\n\n;; Usage\n(nft-mint? Stackaroo \"Roo\" tx-sender) ;; Returns (ok true)\n(burn-nft \"Roo\") ;; Returns (ok true)\n(nft-burn? Stackaroo \"Roo\" tx-sender) ;; Returns (err u3) because the asset no longer exists\n```\n\nThis example demonstrates:\n1. Using `nft-burn?` to burn an NFT owned by the sender.\n2. Implementing a public function to handle the burn operation.\n3. Handling both the successful burn and the case where the asset no longer exists.\n\n## Common Pitfalls\n\n1. Using `nft-burn?` without ensuring the `sender` owns the NFT, causing the operation to fail.\n2. Assuming the NFT will always exist, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete NFT management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `nft-mint?`: Mints a new non-fungible token.\n- `nft-transfer?`: Transfers ownership of a non-fungible token.\n- `nft-get-owner?`: Retrieves the owner of a non-fungible token.\n\n## Conclusion\n\nThe `nft-burn?` function is a fundamental tool for managing the lifecycle of non-fungible tokens in Clarity smart contracts. It allows you to reduce the circulating supply of NFTs, manage their destruction, and ensure data integrity. When used effectively, `nft-burn?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle NFT burn operations.\n"],[195,"\n## Function Signature\n\n```clarity\n(nft-get-owner? asset-class asset-identifier)\n```\n\n- Input: `AssetName, A`\n- Output: `(optional principal)`\n\n## Why it matters\n\nThe `nft-get-owner?` function is crucial for:\n\n1. Retrieving the owner of a non-fungible token (NFT).\n2. Implementing logic that depends on the ownership of NFTs.\n3. Ensuring data integrity by verifying ownership records.\n4. Simplifying the process of accessing ownership information in smart contracts.\n\n## When to use it\n\nUse `nft-get-owner?` when you need to:\n\n- Retrieve the owner of an NFT.\n- Implement logic that depends on the ownership of NFTs.\n- Verify ownership records in your smart contract.\n- Access ownership information for NFTs.\n\n## Best Practices\n\n- Ensure the `asset-identifier` is correctly formatted and exists.\n- Use meaningful variable names for better readability.\n- Combine with other NFT functions for comprehensive NFT management.\n- Handle the `none` case to avoid runtime errors.\n\n## Practical Example: Retrieving NFT Owner\n\nLet's implement a function that retrieves the owner of an NFT:\n\n```clarity\n(define-non-fungible-token Stackaroo (string-ascii 40))\n\n(define-read-only (get-nft-owner (id (string-ascii 40)))\n (nft-get-owner? Stackaroo id)\n)\n\n;; Usage\n(nft-mint? Stackaroo \"Roo\" tx-sender) ;; Returns (ok true)\n(get-nft-owner \"Roo\") ;; Returns (some tx-sender)\n(get-nft-owner \"NonExistent\") ;; Returns none\n```\n\nThis example demonstrates:\n1. Using `nft-get-owner?` to retrieve the owner of an NFT.\n2. Implementing a read-only function to return the owner's principal.\n3. Handling both the case where the NFT exists and where it does not.\n\n## Common Pitfalls\n\n1. Using `nft-get-owner?` with an incorrect or non-existent `asset-identifier`, causing the function to return `none`.\n2. Assuming the NFT will always exist, leading to unhandled `none` cases.\n3. Not handling all possible conditions, resulting in incomplete ownership checks.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `nft-mint?`: Mints a new non-fungible token.\n- `nft-transfer?`: Transfers ownership of a non-fungible token.\n- `nft-burn?`: Burns a non-fungible token.\n\n## Conclusion\n\nThe `nft-get-owner?` function is a fundamental tool for retrieving the owner of non-fungible tokens in Clarity smart contracts. It allows you to access ownership information, verify ownership records, and implement logic based on NFT ownership. When used effectively, `nft-get-owner?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage NFT ownership.\n"],[186,"\n## Function Signature\n\n```clarity\n(nft-mint? asset-class asset-identifier recipient)\n```\n\n- Input: `AssetName, A, principal`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `nft-mint?` function is crucial for:\n\n1. Creating new non-fungible tokens (NFTs).\n2. Assigning ownership of newly created NFTs.\n3. Ensuring data integrity by preventing duplicate NFT creation.\n4. Simplifying the process of minting NFTs in smart contracts.\n\n## When to use it\n\nUse `nft-mint?` when you need to:\n\n- Create a new NFT.\n- Assign ownership of a newly created NFT.\n- Prevent duplicate NFT creation.\n- Handle NFT minting operations in your smart contract.\n\n## Best Practices\n\n- Ensure the `asset-identifier` is unique and correctly formatted.\n- Use meaningful variable names for better readability.\n- Combine with other NFT functions for comprehensive NFT management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Minting an NFT\n\nLet's implement a function that mints a new NFT and assigns it to the recipient:\n\n```clarity\n(define-non-fungible-token Stackaroo (string-ascii 40))\n\n(define-public (mint-nft (id (string-ascii 40)) (recipient principal))\n (nft-mint? Stackaroo id recipient)\n)\n\n;; Usage\n(mint-nft \"Roo\" tx-sender) ;; Returns (ok true)\n(mint-nft \"Roo\" tx-sender) ;; Returns (err u1) because the asset already exists\n```\n\nThis example demonstrates:\n1. Using `nft-mint?` to create a new NFT and assign it to the recipient.\n2. Implementing a public function to handle the minting operation.\n3. Handling both the successful mint and the case where the asset already exists.\n\n## Common Pitfalls\n\n1. Using `nft-mint?` with a non-unique `asset-identifier`, causing the operation to fail.\n2. Assuming the NFT will always be minted, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete NFT management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `nft-get-owner?`: Retrieves the owner of a non-fungible token.\n- `nft-transfer?`: Transfers ownership of a non-fungible token.\n- `nft-burn?`: Burns a non-fungible token.\n\n## Conclusion\n\nThe `nft-mint?` function is a fundamental tool for creating non-fungible tokens in Clarity smart contracts. It allows you to mint new NFTs, assign ownership, and ensure data integrity by preventing duplicate NFT creation. When used effectively, `nft-mint?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage NFT minting operations.\n"],[101,"\n## Function Signature\n\n```clarity\n(nft-transfer? asset-class asset-identifier sender recipient)\n```\n\n- Input: `AssetName, A, principal, principal`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `nft-transfer?` function is crucial for:\n\n1. Changing the ownership of a non-fungible token (NFT).\n2. Implementing logic that depends on the transfer of NFTs.\n3. Ensuring data integrity by updating ownership records.\n4. Simplifying the process of transferring NFTs in smart contracts.\n\n## When to use it\n\nUse `nft-transfer?` when you need to:\n\n- Change the ownership of an NFT.\n- Implement logic that depends on the transfer of NFTs.\n- Update ownership records in your smart contract.\n- Handle NFT transfer operations.\n\n## Best Practices\n\n- Ensure the `sender` principal owns the NFT before attempting to transfer it.\n- Ensure the `sender` and `recipient` are different principals.\n- Use meaningful variable names for better readability.\n- Combine with other NFT functions for comprehensive NFT management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Transferring an NFT\n\nLet's implement a function that transfers an NFT from the sender to the recipient:\n\n```clarity\n(define-non-fungible-token Stackaroo (string-ascii 40))\n\n(define-public (transfer-nft (id (string-ascii 40)) (recipient principal))\n (nft-transfer? Stackaroo id tx-sender recipient)\n)\n\n;; Usage\n(nft-mint? Stackaroo \"Roo\" tx-sender) ;; Returns (ok true)\n(transfer-nft \"Roo\" 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true)\n(nft-transfer? Stackaroo \"Roo\" tx-sender 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (err u1) because the sender no longer owns the asset\n(nft-transfer? Stackaroo \"NonExistent\" tx-sender 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (err u2) because the asset does not exist\n```\n\nThis example demonstrates:\n1. Using `nft-transfer?` to transfer an NFT from the sender to the recipient.\n2. Implementing a public function to handle the transfer operation.\n3. Handling both the successful transfer and the case where the sender no longer owns the asset.\n4. Handling the case where the asset does not exist.\n\n## Common Pitfalls\n\n1. Using `nft-transfer?` without ensuring the `sender` owns the NFT, causing the operation to fail.\n2. Assuming the `sender` and `recipient` are the same principal, leading to an invalid transfer.\n3. Not handling all possible conditions, resulting in incomplete NFT management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `nft-mint?`: Mints a new non-fungible token.\n- `nft-get-owner?`: Retrieves the owner of a non-fungible token.\n- `nft-burn?`: Burns a non-fungible token.\n\n## Conclusion\n\nThe `nft-transfer?` function is a fundamental tool for transferring ownership of non-fungible tokens in Clarity smart contracts. It allows you to change NFT ownership, implement transfer logic, and ensure data integrity. When used effectively, `nft-transfer?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle NFT transfer operations.\n"],[155,"\n## Function Signature\n\n```clarity\n(not boolean-expression)\n```\n\n- Input: `bool`\n- Output: `bool`\n\n## Why it matters\n\nThe `not` function is crucial for:\n\n1. Implementing logical negation in conditional statements.\n2. Simplifying the process of inverting boolean expressions.\n3. Enhancing code readability and maintainability by abstracting logical negation.\n\n## When to use it\n\nUse `not` when you need to:\n\n- Invert a boolean expression.\n- Implement logical negation in conditional statements.\n- Simplify and abstract the process of inverting boolean values.\n\n## Best Practices\n\n- Ensure the input is a boolean expression.\n- Use meaningful variable names for better readability.\n- Combine with other logical functions for comprehensive boolean logic.\n- Be aware of the performance implications of complex logical operations.\n\n## Practical Example: Inverting a Boolean Expression\n\nLet's implement a function that checks if a number is not zero:\n\n```clarity\n(define-read-only (is-not-zero (n int))\n (not (is-eq n 0))\n)\n\n;; Usage\n(is-not-zero 5) ;; Returns true\n(is-not-zero 0) ;; Returns false\n```\n\nThis example demonstrates:\n1. Using `not` to invert the result of a boolean expression.\n2. Implementing a read-only function to check if a number is not zero.\n3. Handling both true and false cases.\n\n## Common Pitfalls\n\n1. Using `not` with non-boolean expressions, causing type errors.\n2. Assuming the result will always be true or false, leading to incorrect logic.\n3. Not handling all possible conditions, resulting in incomplete boolean logic.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `and`: Logical conjunction of multiple boolean expressions.\n- `or`: Logical disjunction of multiple boolean expressions.\n- `is-eq`: Checks if two values are equal.\n\n## Conclusion\n\nThe `not` function is a fundamental tool for implementing logical negation in Clarity smart contracts. It allows you to invert boolean expressions, enabling robust and comprehensive boolean logic. When used effectively, `not` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage logical negation.\n"],[121,"\n## Function Signature\n\n```clarity\n(ok value)\n```\n\n- Input: `A`\n- Output: `(response A B)`\n\n## Why it matters\n\nThe `ok` function is crucial for:\n\n1. Constructing a successful response type.\n2. Indicating that a function executed successfully.\n3. Ensuring data integrity by clearly distinguishing between success and error states.\n4. Simplifying the process of handling function return values in smart contracts.\n\n## When to use it\n\nUse `ok` when you need to:\n\n- Construct a successful response type.\n- Indicate that a function executed successfully.\n- Clearly distinguish between success and error states.\n- Handle function return values in your smart contract.\n\n## Best Practices\n\n- Ensure the value passed to `ok` is the intended successful result.\n- Use meaningful variable names for better readability.\n- Combine with `err` for comprehensive response handling.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Returning a Successful Response\n\nLet's implement a function that returns a successful response with a value:\n\n```clarity\n(define-read-only (get-successful-response (value int))\n (ok value)\n)\n\n;; Usage\n(get-successful-response 5) ;; Returns (ok 5)\n```\n\nThis example demonstrates:\n1. Using `ok` to construct a successful response type.\n2. Implementing a read-only function to return a successful response.\n3. Handling the successful response case.\n\n## Common Pitfalls\n\n1. Using `ok` with an incorrect or invalid value, causing unexpected behavior.\n2. Assuming the response will always be successful, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete response handling.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `err`: Constructs an error response type.\n- `match`: Handles different branches or cases for optional and response types.\n\n## Conclusion\n\nThe `ok` function is a fundamental tool for constructing successful response types in Clarity smart contracts. It allows you to indicate successful function execution, ensure data integrity, and simplify response handling. When used effectively, `ok` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle successful responses.\n"],[165,"\n## Function Signature\n\n```clarity\n(or b1 b2 ...)\n```\n\n- Input: `bool, ...`\n- Output: `bool`\n\n## Why it matters\n\nThe `or` function is crucial for:\n\n1. Implementing logical disjunction in conditional statements.\n2. Simplifying the process of evaluating multiple boolean expressions.\n3. Enhancing code readability and maintainability by abstracting logical disjunction.\n\n## When to use it\n\nUse `or` when you need to:\n\n- Evaluate multiple boolean expressions and return `true` if any are `true`.\n- Implement logical disjunction in conditional statements.\n- Simplify and abstract the process of evaluating multiple boolean values.\n\n## Best Practices\n\n- Ensure all inputs are boolean expressions.\n- Use meaningful variable names for better readability.\n- Combine with other logical functions for comprehensive boolean logic.\n- Be aware of the performance implications of complex logical operations.\n\n## Practical Example: Evaluating Multiple Conditions\n\nLet's implement a function that checks if a number is either zero or negative:\n\n```clarity\n(define-read-only (is-zero-or-negative (n int))\n (or (is-eq n 0) (< n 0))\n)\n\n;; Usage\n(is-zero-or-negative 5) ;; Returns false\n(is-zero-or-negative 0) ;; Returns true\n(is-zero-or-negative -3) ;; Returns true\n```\n\nThis example demonstrates:\n1. Using `or` to evaluate multiple boolean expressions.\n2. Implementing a read-only function to check if a number is either zero or negative.\n3. Handling both true and false cases.\n\n## Common Pitfalls\n\n1. Using `or` with non-boolean expressions, causing type errors.\n2. Assuming the result will always be true or false, leading to incorrect logic.\n3. Not handling all possible conditions, resulting in incomplete boolean logic.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `and`: Logical conjunction of multiple boolean expressions.\n- `not`: Logical negation of a boolean expression.\n- `is-eq`: Checks if two values are equal.\n\n## Conclusion\n\nThe `or` function is a fundamental tool for implementing logical disjunction in Clarity smart contracts. It allows you to evaluate multiple boolean expressions, enabling robust and comprehensive boolean logic. When used effectively, `or` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage logical disjunction.\n"],[185,"\n## Function Signature\n\n```clarity\n(pow base exponent)\n```\n\n- Input: `int, int | uint, uint`\n- Output: `int | uint`\n\n## Why it matters\n\nThe `pow` function is crucial for:\n\n1. Performing exponentiation operations.\n2. Implementing logic that depends on power calculations.\n3. Simplifying the process of raising numbers to a power.\n4. Enhancing code readability and maintainability by abstracting exponentiation.\n\n## When to use it\n\nUse `pow` when you need to:\n\n- Perform exponentiation operations.\n- Implement logic that depends on power calculations.\n- Raise numbers to a power.\n- Simplify and abstract exponentiation operations.\n\n## Best Practices\n\n- Ensure the base and exponent are correctly formatted and within acceptable ranges.\n- Use meaningful variable names for better readability.\n- Combine with other mathematical functions for comprehensive calculations.\n- Be aware of the performance implications of large exponentiation operations.\n\n## Practical Example: Calculating Token Balances in Decimal Format\n\nLet's implement a function that calculates the power of a number, specifically for converting integer representations of tokens or uStx:\n\n```clarity\n(define-constant MICRO_TOKENS (pow u10 u6)) ;; 6 decimal places\n(define-data-var userBalance uint u100) ;; Amount reprented in a clear and readable format\n\n(define-read-only (get-total-micro-balance (userAddress principal))\n (* (var-get userBalance) MICRO_TOKENS)\n)\n\n;; Usage\n(get-total-micro-balance tx-sender)\n```\n\nThis example demonstrates:\n1. Using `pow` to define a constant for micro tokens with 6 decimal places.\n2. Implementing a read-only function to calculate the total balance in decimal format.\n3. Handling balances from different versions of a token contract.\n\n## Common Pitfalls\n\n1. Using `pow` with negative exponents, which is not supported and will cause a runtime error.\n2. Assuming the result will always be within acceptable ranges, leading to overflow errors.\n3. Not handling all possible conditions, resulting in incomplete calculations.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `*`: Multiplies two or more numbers.\n- `+`: Adds two or more numbers.\n- `-`: Subtracts one number from another.\n- `/`: Divides one number by another.\n\n## Conclusion\n\nThe `pow` function is a fundamental tool for performing exponentiation in Clarity smart contracts. It allows you to raise numbers to a power, enabling robust and comprehensive mathematical operations. When used effectively, `pow` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage power calculations.\n"],[200,"\n## Function Signature\n\n```clarity\n(principal-construct? version-byte hash-bytes [contract-name])\n```\n\n- Input: `(buff 1), (buff 20), [(string-ascii 40)]`\n- Output: `(response principal { error_code: uint, principal: (optional principal) })`\n\n## Why it matters\n\nThe `principal-construct?` function is crucial for:\n\n1. Creating standard or contract principals.\n2. Managing identities and permissions in smart contracts.\n3. Ensuring data integrity by validating principal construction.\n4. Simplifying the process of creating principals in smart contracts.\n\n## When to use it\n\nUse `principal-construct?` when you need to:\n\n- Create a standard or contract principal.\n- Manage identities and permissions in your smart contract.\n- Validate the construction of principals.\n- Handle principal creation operations.\n\n## Best Practices\n\n- Ensure the `version-byte` and `hash-bytes` are correctly formatted.\n- Use meaningful variable names for better readability.\n- Combine with other principal functions for comprehensive identity management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Constructing a Principal\n\nLet's implement a function that constructs a standard principal:\n\n```clarity\n(define-public (create-standard-principal (versionByte (buff 1)) (hashBytes (buff 20)))\n (principal-construct? versionByte hashBytes)\n)\n\n;; Usage\n(create-standard-principal 0x1a 0xfa6bf38ed557fe417333710d6033e9419391a320) ;; Returns (ok 'ST3X6QWWETNBZWGBK6DRGTR1KX50S74D3425Q1TPK)\n```\n\nThis example demonstrates:\n1. Using `principal-construct?` to create a standard principal.\n2. Implementing a public function to handle the principal construction.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `principal-construct?` with incorrectly formatted `versionByte` or `hashBytes`, causing the operation to fail.\n2. Assuming the principal will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete principal management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `principal-of?`: Returns the principal derived from a public key.\n- `contract-caller`: Returns the caller of the current contract context.\n- `tx-sender`: Returns the sender of the current transaction.\n\n## Conclusion\n\nThe `principal-construct?` function is a fundamental tool for creating principals in Clarity smart contracts. It allows you to manage identities and permissions, ensuring data integrity and simplifying principal creation. When used effectively, `principal-construct?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle principal construction operations.\n"],[141,"\n## Function Signature\n\n```clarity\n(principal-destruct? principal-address)\n```\n\n- Input: `principal`\n- Output: `(response (tuple (hash-bytes (buff 20)) (name (optional (string-ascii 40))) (version (buff 1))) (tuple (hash-bytes (buff 20)) (name (optional (string-ascii 40))) (version (buff 1)))`\n\n## Why it matters\n\nThe `principal-destruct?` function is crucial for:\n\n1. Decomposing a principal into its component parts.\n2. Managing identities and permissions in smart contracts.\n3. Ensuring data integrity by validating principal components.\n4. Simplifying the process of handling principals in smart contracts.\n\n## When to use it\n\nUse `principal-destruct?` when you need to:\n\n- Decompose a principal into its component parts.\n- Manage identities and permissions in your smart contract.\n- Validate the components of a principal.\n- Handle principal decomposition operations.\n\n## Best Practices\n\n- Ensure the `principal` is correctly formatted.\n- Use meaningful variable names for better readability.\n- Combine with other principal functions for comprehensive identity management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Decomposing a Principal\n\nLet's implement a function that destructs a principal back into its components:\n\n```clarity\n(define-public (destruct-principal (principal principal))\n (principal-destruct? principal)\n)\n\n;; Usage\n(destruct-principal 'ST3X6QWWETNBZWGBK6DRGTR1KX50S74D3425Q1TPK) \n;; Returns (ok (tuple (hash-bytes 0xfa6bf38ed557fe417333710d6033e9419391a320) (name none) (version 0x1a)))\n(destruct-principal 'ST3X6QWWETNBZWGBK6DRGTR1KX50S74D3425Q1TPK.foo) \n;; Returns (ok (tuple (hash-bytes 0xfa6bf38ed557fe417333710d6033e9419391a320) (name (some \"foo\")) (version 0x1a)))\n```\n\nThis example demonstrates:\n1. Using `principal-destruct?` to decompose a principal into its components.\n2. Implementing a public function to handle the principal decomposition.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `principal-destruct?` with incorrectly formatted principals, causing the operation to fail.\n2. Assuming the principal will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete principal management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `principal-construct?`: Constructs a principal from its components.\n- `principal-of?`: Returns the principal derived from a public key.\n- `contract-caller`: Returns the caller of the current contract context.\n\n## Conclusion\n\nThe `principal-destruct?` function is a fundamental tool for decomposing principals into their component parts in Clarity smart contracts. It allows you to manage identities and permissions, ensuring data integrity and simplifying principal handling. When used effectively, `principal-destruct?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle principal decomposition operations.\n"],[94,"\n## Function Signature\n\n```clarity\n(principal-of? public-key)\n```\n\n- Input: `(buff 33)`\n- Output: `(response principal uint)`\n\n## Why it matters\n\nThe `principal-of?` function is crucial for:\n\n1. Deriving a principal from a public key.\n2. Managing identities and permissions in smart contracts.\n3. Ensuring data integrity by validating public key to principal conversion.\n4. Simplifying the process of handling principals derived from public keys.\n\n## When to use it\n\nUse `principal-of?` when you need to:\n\n- Derive a principal from a public key.\n- Manage identities and permissions in your smart contract.\n- Validate the conversion of a public key to a principal.\n- Handle principal derivation operations.\n\n## Best Practices\n\n- Ensure the `public-key` is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other principal functions for comprehensive identity management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Deriving a Principal\n\nLet's implement a function that derives a principal from a public key:\n\n```clarity\n(define-public (derive-principal (public-key (buff 33)))\n (principal-of? public-key)\n)\n\n;; Usage\n(derive-principal 0x0390a5cac7c33fda49f70bc1b0866fa0ba7a9440d9de647fecb8132ceb76a94dfa) ;; Returns (ok 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM)\n```\n\nThis example demonstrates:\n1. Using `principal-of?` to derive a principal from a public key.\n2. Implementing a public function to handle the principal derivation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `principal-of?` with an incorrectly formatted or invalid `public-key`, causing the operation to fail.\n2. Assuming the principal will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete principal management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `principal-construct?`: Constructs a principal from its components.\n- `principal-destruct?`: Decomposes a principal into its components.\n- `contract-caller`: Returns the caller of the current contract context.\n\n## Conclusion\n\nThe `principal-of?` function is a fundamental tool for deriving principals from public keys in Clarity smart contracts. It allows you to manage identities and permissions, ensuring data integrity and simplifying principal handling. When used effectively, `principal-of?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle principal derivation operations.\n"],[199,"\n## Function Signature\n\n```clarity\n(print expr)\n```\n\n- Input: `A`\n- Output: `A`\n\n## Why it matters\n\nThe `print` function is crucial for:\n\n1. Debugging and logging expressions during contract development.\n2. Evaluating and returning the input expression.\n3. Enhancing code readability and maintainability by providing a way to output intermediate values.\n\n## When to use it\n\nUse `print` when you need to:\n\n- Debug and log expressions during contract development.\n- Evaluate and return an input expression.\n- Output intermediate values for better understanding of contract behavior.\n\n## Best Practices\n\n- Use `print` primarily for debugging and development purposes.\n- Ensure that the expression passed to `print` is meaningful and necessary for debugging.\n- Remove or comment out `print` statements in production code to avoid unnecessary output.\n\n## Practical Example: Printing an Expression\n\nLet's implement a function that prints the result of an addition operation:\n\n```clarity\n(define-read-only (add-and-print (a int) (b int))\n (print (+ a b))\n)\n\n;; Usage\n(add-and-print 3 4) ;; Prints 7 and returns 7\n(add-and-print 10 20) ;; Prints 30 and returns 30\n```\n\nThis example demonstrates:\n1. Using `print` to output the result of an addition operation.\n2. Implementing a public function to handle the addition and printing.\n3. Handling both small and large input values.\n\n## Common Pitfalls\n\n1. Using `print` excessively, leading to cluttered output and reduced readability.\n2. Assuming `print` is necessary for all expressions, leading to overuse.\n3. Not removing or commenting out `print` statements in production code, resulting in unnecessary output.\n\n## Related Functions\n\n- `+`: Adds two or more numbers.\n- `-`: Subtracts one number from another.\n- `*`: Multiplies two or more numbers.\n- `/`: Divides one number by another.\n\n## Conclusion\n\nThe `print` function is a fundamental tool for debugging and logging expressions in Clarity smart contracts. It allows you to evaluate and return input expressions, providing a way to output intermediate values for better understanding of contract behavior. When used effectively, `print` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to debug and log expressions.\n"],[109,"\n## Function Signature\n\n```clarity\n(replace-at? sequence index new-element)\n```\n\n- Input: `sequence_A, uint, A`\n- Output: `(response sequence_A uint)`\n\n## Why it matters\n\nThe `replace-at?` function is crucial for:\n\n1. Modifying elements in a sequence at a specific index.\n2. Implementing logic that requires updating sequences.\n3. Ensuring data integrity by validating index and element replacement.\n4. Simplifying the process of handling sequence modifications in smart contracts.\n\n## When to use it\n\nUse `replace-at?` when you need to:\n\n- Modify an element in a sequence at a specific index.\n- Implement logic that requires updating sequences.\n- Validate the index and element replacement in your smart contract.\n- Handle sequence modification operations.\n\n## Best Practices\n\n- Ensure the `index` is within the bounds of the sequence.\n- Use meaningful variable names for better readability.\n- Combine with other sequence functions for comprehensive sequence management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Replacing an Element in a List\n\nLet's implement a function that replaces an element in a list at a specific index:\n\n```clarity\n(define-read-only (replace-element (items (list 5 int)) (index uint) (newElement int))\n (replace-at? items index newElement)\n)\n\n;; Usage\n(replace-element (list 1 2 3 4 5) u2 10) ;; Returns (some (list (1 2 10 4 5)))\n(replace-element (list 1 2 3 4 5) u5 10) ;; Returns (none) because the index is out of bounds\n```\n\nThis example demonstrates:\n1. Using `replace-at?` to modify an element in a list at a specific index.\n2. Implementing a public function to handle the element replacement.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `replace-at?` with an index that is out of bounds, causing the operation to fail.\n2. Assuming the sequence will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete sequence management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `append`: Adds an element to the end of a list.\n- `index-of?`: Returns the first index at which an item can be found in a sequence.\n- `get`: Retrieves an element from a sequence at a specific index.\n\n## Conclusion\n\nThe `replace-at?` function is a fundamental tool for modifying elements in sequences in Clarity smart contracts. It allows you to update sequences, ensuring data integrity and simplifying sequence handling. When used effectively, `replace-at?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle sequence modification operations.\n"],[162,"\n## Function Signature\n\n```clarity\n(secp256k1-recover? message-hash signature)\n```\n\n- Input: `(buff 32), (buff 65)`\n- Output: `(response (buff 33) uint)`\n\n## Why it matters\n\nThe `secp256k1-recover?` function is crucial for:\n\n1. Verifying the authenticity of a message by recovering the public key from a signature.\n2. Implementing cryptographic verification in smart contracts.\n3. Ensuring data integrity by validating signatures.\n4. Simplifying the process of handling cryptographic operations in smart contracts.\n\n## When to use it\n\nUse `secp256k1-recover?` when you need to:\n\n- Verify the authenticity of a message by recovering the public key from a signature.\n- Implement cryptographic verification in your smart contract.\n- Validate signatures to ensure data integrity.\n- Handle cryptographic operations.\n\n## Best Practices\n\n- Ensure the `message-hash` and `signature` are correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for comprehensive security management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Recovering a Public Key\n\nLet's implement a function that recovers the public key from a message hash and signature:\n\n```clarity\n(define-read-only (recover-public-key (messageHash (buff 32)) (signature (buff 65)))\n (secp256k1-recover? messageHash signature)\n)\n\n;; Usage\n(recover-public-key 0xde5b9eb9e7c5592930eb2e30a01369c36586d872082ed8181ee83d2a0ec20f04 0x8738487ebe69b93d8e51583be8eee50bb4213fc49c767d329632730cc193b873554428fc936ca3569afc15f1c9365f6591d6251a89fee9c9ac661116824d3a1301) \n;; Returns (ok 0x03adb8de4bfb65db2cfd6120d55c6526ae9c52e675db7e47308636534ba7786110)\n```\n\nThis example demonstrates:\n1. Using `secp256k1-recover?` to recover a public key from a message hash and signature.\n2. Implementing a public function to handle the public key recovery.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `secp256k1-recover?` with incorrectly formatted or invalid `message-hash` or `signature`, causing the operation to fail.\n2. Assuming the public key will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete cryptographic verification.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `principal-of?`: Returns the principal derived from a public key.\n- `hash160`: Computes the RIPEMD-160 hash of the SHA-256 hash of the input.\n- `sha256`: Computes the SHA-256 hash of the input.\n\n## Conclusion\n\nThe `secp256k1-recover?` function is a fundamental tool for recovering public keys from message hashes and signatures in Clarity smart contracts. It allows you to verify the authenticity of messages, ensuring data integrity and simplifying cryptographic operations. When used effectively, `secp256k1-recover?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle cryptographic verification.\n"],[169,"\n## Function Signature\n\n```clarity\n(secp256k1-verify message-hash signature public-key)\n```\n\n- Input: `(buff 32), (buff 64) | (buff 65), (buff 33)`\n- Output: `bool`\n\n## Why it matters\n\nThe `secp256k1-verify` function is crucial for:\n\n1. Verifying the authenticity of a message by checking the signature against the public key.\n2. Implementing cryptographic verification in smart contracts.\n3. Ensuring data integrity by validating signatures.\n4. Simplifying the process of handling cryptographic operations in smart contracts.\n\n## When to use it\n\nUse `secp256k1-verify` when you need to:\n\n- Verify the authenticity of a message by checking the signature against the public key.\n- Implement cryptographic verification in your smart contract.\n- Validate signatures to ensure data integrity.\n- Handle cryptographic operations.\n\n## Best Practices\n\n- Ensure the `message-hash`, `signature`, and `public-key` are correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for comprehensive security management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Verifying a Signature\n\nLet's implement a function that verifies a signature against a message hash and public key:\n\n```clarity\n(define-read-only (verify-signature (messageHash (buff 32)) (signature (buff 65)) (publicKey (buff 33)))\n (secp256k1-verify messageHash signature publicKey)\n)\n\n;; Usage\n(verify-signature 0xde5b9eb9e7c5592930eb2e30a01369c36586d872082ed8181ee83d2a0ec20f04 0x8738487ebe69b93d8e51583be8eee50bb4213fc49c767d329632730cc193b873554428fc936ca3569afc15f1c9365f6591d6251a89fee9c9ac661116824d3a1301 0x03adb8de4bfb65db2cfd6120d55c6526ae9c52e675db7e47308636534ba7786110) \n;; Returns true\n```\n\nThis example demonstrates:\n1. Using `secp256k1-verify` to verify a signature against a message hash and public key.\n2. Implementing a public function to handle the signature verification.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `secp256k1-verify` with incorrectly formatted or invalid `message-hash`, `signature`, or `public-key`, causing the operation to fail.\n2. Assuming the verification will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete cryptographic verification.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `secp256k1-recover?`: Recovers the public key from a message hash and signature.\n- `sha256`: Computes the SHA-256 hash of the input.\n- `hash160`: Computes the RIPEMD-160 hash of the SHA-256 hash of the input.\n\n## Conclusion\n\nThe `secp256k1-verify` function is a fundamental tool for verifying signatures against message hashes and public keys in Clarity smart contracts. It allows you to ensure data integrity and simplify cryptographic operations. When used effectively, `secp256k1-verify` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle cryptographic verification.\n"],[84,"\n## Function Signature\n\n```clarity\n(sha256 value)\n```\n\n- Input: `buff | uint | int`\n- Output: `(buff 32)`\n\n## Why it matters\n\nThe `sha256` function is crucial for:\n\n1. Computing the SHA-256 hash of a given value.\n2. Implementing cryptographic operations in smart contracts.\n3. Ensuring data integrity by generating unique hashes.\n4. Simplifying the process of handling cryptographic hashing in smart contracts.\n\n## When to use it\n\nUse `sha256` when you need to:\n\n- Compute the SHA-256 hash of a given value.\n- Implement cryptographic operations in your smart contract.\n- Generate unique hashes to ensure data integrity.\n- Handle cryptographic hashing operations.\n\n## Best Practices\n\n- Ensure the input value is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for comprehensive security management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Computing a SHA-256 Hash\n\nLet's implement a function that computes the SHA-256 hash of a given buffer:\n\n```clarity\n(define-read-only (compute-sha256 (input (buff 32)))\n (sha256 input)\n)\n\n;; Usage\n(compute-sha256 0x68656c6c6f20776f726c64000000000000000000000000000000000000000000)\n;; Returns 0x28effae679c457da1e5158c063b3dfa78d0ade721b9aa9f1fc3f46dba4c0ea15\n```\n\nThis example demonstrates:\n1. Using `sha256` to compute the hash of a given buffer.\n2. Implementing a public function to handle the hash computation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `sha256` with incorrectly formatted or invalid input values, causing the operation to fail.\n2. Assuming the hash will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete cryptographic hashing.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `sha512`: Computes the SHA-512 hash of the input.\n- `sha512/256`: Computes the SHA-512/256 hash of the input.\n- `keccak256`: Computes the KECCAK-256 hash of the input.\n\n## Conclusion\n\nThe `sha256` function is a fundamental tool for computing SHA-256 hashes in Clarity smart contracts. It allows you to implement cryptographic operations, ensuring data integrity and simplifying cryptographic hashing. When used effectively, `sha256` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle cryptographic hashing operations.\n"],[181,"\n## Function Signature\n\n```clarity\n(sha512 value)\n```\n\n- Input: `buff | uint | int`\n- Output: `(buff 64)`\n\n## Why it matters\n\nThe `sha512` function is crucial for:\n\n1. Computing the SHA-512 hash of a given value.\n2. Implementing cryptographic operations in smart contracts.\n3. Ensuring data integrity by generating unique hashes.\n4. Simplifying the process of handling cryptographic hashing in smart contracts.\n\n## When to use it\n\nUse `sha512` when you need to:\n\n- Compute the SHA-512 hash of a given value.\n- Implement cryptographic operations in your smart contract.\n- Generate unique hashes to ensure data integrity.\n- Handle cryptographic hashing operations.\n\n## Best Practices\n\n- Ensure the input value is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for comprehensive security management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Computing a SHA-512 Hash\n\nLet's implement a function that computes the SHA-512 hash of a given buffer:\n\n```clarity\n(define-read-only (compute-sha512 (input (buff 32)))\n (sha512 input)\n)\n\n;; Usage\n(compute-sha512 0x68656c6c6f20776f726c64000000000000000000000000000000000000000000)\n;; Returns 0x638f0da7489fae1f981a47199a2854d0fa117cea82bd86049930aa86e565c6cdccd52fc0e6bba5a135961ed5b7360d5e2b0ff65889acbac01361f5e291a6da45\n```\n\nThis example demonstrates:\n1. Using `sha512` to compute the hash of a given buffer.\n2. Implementing a public function to handle the hash computation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `sha512` with incorrectly formatted or invalid input values, causing the operation to fail.\n2. Assuming the hash will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete cryptographic hashing.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `sha256`: Computes the SHA-256 hash of the input.\n- `sha512/256`: Computes the SHA-512/256 hash of the input.\n- `keccak256`: Computes the KECCAK-256 hash of the input.\n\n## Conclusion\n\nThe `sha512` function is a fundamental tool for computing SHA-512 hashes in Clarity smart contracts. It allows you to implement cryptographic operations, ensuring data integrity and simplifying cryptographic hashing. When used effectively, `sha512` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle cryptographic hashing operations.\n"],[111,"\n## Function Signature\n\n```clarity\n(sha512/256 value)\n```\n\n- Input: `buff | uint | int`\n- Output: `(buff 32)`\n\n## Why it matters\n\nThe `sha512/256` function is crucial for:\n\n1. Computing the SHA-512/256 hash of a given value.\n2. Implementing cryptographic operations in smart contracts.\n3. Ensuring data integrity by generating unique hashes.\n4. Simplifying the process of handling cryptographic hashing in smart contracts.\n\n## When to use it\n\nUse `sha512/256` when you need to:\n\n- Compute the SHA-512/256 hash of a given value.\n- Implement cryptographic operations in your smart contract.\n- Generate unique hashes to ensure data integrity.\n- Handle cryptographic hashing operations.\n\n## Best Practices\n\n- Ensure the input value is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for comprehensive security management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Computing a SHA-512/256 Hash\n\nLet's implement a function that computes the SHA-512/256 hash of a given buffer:\n\n```clarity\n(define-read-only (compute-sha512-256 (input (buff 32)))\n (sha512/256 input)\n)\n\n;; Usage\n(compute-sha512-256 0x68656c6c6f20776f726c64000000000000000000000000000000000000000000)\n;; Returns 0xcf0edb437886eae39b21ebad0caeea342d2bd61c98e9d09d0e89109a546d01fc\n```\n\nThis example demonstrates:\n1. Using `sha512/256` to compute the hash of a given buffer.\n2. Implementing a public function to handle the hash computation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `sha512/256` with incorrectly formatted or invalid input values, causing the operation to fail.\n2. Assuming the hash will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete cryptographic hashing.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `sha256`: Computes the SHA-256 hash of the input.\n- `sha512`: Computes the SHA-512 hash of the input.\n- `keccak256`: Computes the KECCAK-256 hash of the input.\n\n## Conclusion\n\nThe `sha512/256` function is a fundamental tool for computing SHA-512/256 hashes in Clarity smart contracts. It allows you to implement cryptographic operations, ensuring data integrity and simplifying cryptographic hashing. When used effectively, `sha512/256` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle cryptographic hashing operations.\n"],[194,"\n## Function Signature\n\n```clarity\n(slice? sequence left-position right-position)\n```\n\n- Input: `sequence_A, uint, uint`\n- Output: `(optional sequence_A)`\n\n## Why it matters\n\nThe `slice?` function is crucial for:\n\n1. Extracting sub-sequences from sequences.\n2. Implementing logic that requires partial data extraction.\n3. Ensuring data integrity by validating indices for slicing.\n4. Simplifying the process of handling sub-sequence extraction in smart contracts.\n\n## When to use it\n\nUse `slice?` when you need to:\n\n- Extract a sub-sequence from a sequence.\n- Implement logic that requires partial data extraction.\n- Validate indices for slicing to ensure data integrity.\n- Handle sub-sequence extraction operations.\n\n## Best Practices\n\n- Ensure the `left-position` and `right-position` are within the bounds of the sequence.\n- Use meaningful variable names for better readability.\n- Combine with other sequence functions for comprehensive sequence management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Extracting a Sub-sequence from a String\n\nLet's implement a function that extracts a sub-sequence from a string:\n\n```clarity\n(define-read-only (extract-substring (input (string-ascii 20)) (start uint) (end uint))\n (slice? input start end)\n)\n\n;; Usage\n(extract-substring \"blockstack\" u5 u10) ;; Returns (some \"stack\")\n(extract-substring \"blockstack\" u0 u5) ;; Returns (some \"block\")\n(extract-substring \"blockstack\" u5 u15) ;; Returns none (out of bounds)\n```\n\nThis example demonstrates:\n1. Using `slice?` to extract a sub-sequence from a string.\n2. Implementing a public function to handle the sub-sequence extraction.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `slice?` with indices that are out of bounds, causing the operation to fail.\n2. Assuming the sub-sequence will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete sequence management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `len`: Returns the length of a sequence.\n- `concat`: Concatenates two sequences.\n- `index-of?`: Returns the first index at which an item can be found in a sequence.\n\n## Conclusion\n\nThe `slice?` function is a fundamental tool for extracting sub-sequences in Clarity smart contracts. It allows you to implement logic that requires partial data extraction, ensuring data integrity and simplifying sequence handling. When used effectively, `slice?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle sub-sequence extraction operations.\n"],[168,"\n## Function Signature\n\n```clarity\n(some value)\n```\n\n- Input: `A`\n- Output: `(optional A)`\n\n## Why it matters\n\nThe `some` function is crucial for:\n\n1. Constructing an optional type from a given value.\n2. Implementing logic that requires optional types.\n3. Ensuring data integrity by explicitly handling optional values.\n4. Simplifying the process of working with optional types in smart contracts.\n\n## When to use it\n\nUse `some` when you need to:\n\n- Construct an optional type from a given value.\n- Implement logic that requires optional types.\n- Explicitly handle optional values to ensure data integrity.\n- Work with optional types in your smart contract.\n\n## Best Practices\n\n- Ensure the value passed to `some` is the intended value to be wrapped in an optional type.\n- Use meaningful variable names for better readability.\n- Combine with other optional functions for comprehensive optional type management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Constructing an Optional Type\n\nLet's implement a function that constructs an optional type from a given integer:\n\n```clarity\n(define-read-only (wrap-in-optional (input int))\n (some input)\n)\n\n;; Usage\n(wrap-in-optional 42) ;; Returns (some 42)\n(wrap-in-optional -1) ;; Returns (some -1)\n```\n\nThis example demonstrates:\n1. Using `some` to construct an optional type from a given integer.\n2. Implementing a public function to handle the optional type construction.\n3. Handling both positive and negative input values.\n\n## Common Pitfalls\n\n1. Using `some` without ensuring the value is the intended value to be wrapped, causing unexpected behavior.\n2. Assuming the optional type will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete optional type management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `is-some`: Checks if an optional type contains a value.\n- `is-none`: Checks if an optional type is empty.\n- `unwrap!`: Unwraps an optional type, returning the contained value or throwing an error if empty.\n\n## Conclusion\n\nThe `some` function is a fundamental tool for constructing optional types in Clarity smart contracts. It allows you to implement logic that requires optional types, ensuring data integrity and simplifying optional type handling. When used effectively, `some` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle optional type construction.\n"],[106,"\n## Function Signature\n\n```clarity\n(sqrti n)\n```\n\n- Input: `int | uint`\n- Output: `int | uint`\n\n## Why it matters\n\nThe `sqrti` function is crucial for:\n\n1. Calculating the largest integer less than or equal to the square root of a number.\n2. Implementing mathematical operations in smart contracts.\n3. Ensuring data integrity by providing precise integer square root calculations.\n4. Simplifying the process of handling square root operations in smart contracts.\n\n## When to use it\n\nUse `sqrti` when you need to:\n\n- Calculate the integer square root of a number.\n- Implement mathematical operations in your smart contract.\n- Ensure precise integer square root calculations.\n- Handle square root operations.\n\n## Best Practices\n\n- Ensure the input value is non-negative to avoid runtime errors.\n- Use meaningful variable names for better readability.\n- Combine with other mathematical functions for comprehensive calculations.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Calculating Integer Square Roots\n\nLet's implement a function that calculates the integer square root of a given number:\n\n```clarity\n(define-read-only (calculate-sqrti (input uint))\n (sqrti input)\n)\n\n;; Usage\n(calculate-sqrti u11) ;; Returns u3\n(calculate-sqrti u1000000) ;; Returns u1000\n(calculate-sqrti u1) ;; Returns u1\n(calculate-sqrti u0) ;; Returns u0\n```\n\nThis example demonstrates:\n1. Using `sqrti` to calculate the integer square root of a given number.\n2. Implementing a public function to handle the square root calculation.\n3. Handling both small and large input values.\n\n## Common Pitfalls\n\n1. Using `sqrti` with negative numbers, causing the operation to fail.\n2. Assuming the result will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete mathematical operations.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `*`: Multiplies two or more numbers.\n- `+`: Adds two or more numbers.\n- `-`: Subtracts one number from another.\n- `/`: Divides one number by another.\n\n## Conclusion\n\nThe `sqrti` function is a fundamental tool for calculating integer square roots in Clarity smart contracts. It allows you to implement precise mathematical operations, ensuring data integrity and simplifying square root calculations. When used effectively, `sqrti` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle integer square root operations.\n"],[138,"\n## Function Signature\n\n```clarity\n(string-to-int? string)\n```\n\n- Input: `(string-ascii 1048576) | (string-utf8 262144)`\n- Output: `(optional int)`\n\n## Why it matters\n\nThe `string-to-int?` function is crucial for:\n\n1. Converting string representations of numbers to integers.\n2. Implementing logic that requires numeric values from string inputs.\n3. Ensuring data integrity by validating string-to-integer conversions.\n4. Simplifying the process of handling numeric conversions in smart contracts.\n\n## When to use it\n\nUse `string-to-int?` when you need to:\n\n- Convert a string representation of a number to an integer.\n- Implement logic that requires numeric values from string inputs.\n- Validate string-to-integer conversions to ensure data integrity.\n- Handle numeric conversions in your smart contract.\n\n## Best Practices\n\n- Ensure the input string is correctly formatted and represents a valid integer.\n- Use meaningful variable names for better readability.\n- Combine with other string and numeric functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Converting a String to an Integer\n\nLet's implement a function that converts a string to an optional integer:\n\n```clarity\n(define-read-only (convert-string-to-int (input (string-ascii 20)))\n (string-to-int? input)\n)\n\n;; Usage\n(convert-string-to-int \"123\") ;; Returns (some 123)\n(convert-string-to-int \"-456\") ;; Returns (some -456)\n(convert-string-to-int \"abc\") ;; Returns none\n```\n\nThis example demonstrates:\n1. Using `string-to-int?` to convert a string to an optional integer.\n2. Implementing a public function to handle the string-to-integer conversion.\n3. Handling both valid and invalid string inputs.\n\n## Common Pitfalls\n\n1. Using `string-to-int?` with incorrectly formatted or invalid string inputs, causing the operation to return `none`.\n2. Assuming the conversion will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `string-to-uint?`: Converts a string to an optional unsigned integer.\n- `int-to-ascii`: Converts an integer to a string-ascii representation.\n- `int-to-utf8`: Converts an integer to a string-utf8 representation.\n\n## Conclusion\n\nThe `string-to-int?` function is a fundamental tool for converting string representations of numbers to integers in Clarity smart contracts. It allows you to implement logic that requires numeric values from string inputs, ensuring data integrity and simplifying numeric conversions. When used effectively, `string-to-int?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle string-to-integer conversions.\n"],[157,"\n## Function Signature\n\n```clarity\n(string-to-uint? string)\n```\n\n- Input: `(string-ascii 1048576) | (string-utf8 262144)`\n- Output: `(optional uint)`\n\n## Why it matters\n\nThe `string-to-uint?` function is crucial for:\n\n1. Converting string representations of numbers to unsigned integers.\n2. Implementing logic that requires numeric values from string inputs.\n3. Ensuring data integrity by validating string-to-unsigned-integer conversions.\n4. Simplifying the process of handling numeric conversions in smart contracts.\n\n## When to use it\n\nUse `string-to-uint?` when you need to:\n\n- Convert a string representation of a number to an unsigned integer.\n- Implement logic that requires numeric values from string inputs.\n- Validate string-to-unsigned-integer conversions to ensure data integrity.\n- Handle numeric conversions in your smart contract.\n\n## Best Practices\n\n- Ensure the input string is correctly formatted and represents a valid unsigned integer.\n- Use meaningful variable names for better readability.\n- Combine with other string and numeric functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Converting a String to an Unsigned Integer\n\nLet's implement a function that converts a string to an optional unsigned integer:\n\n```clarity\n(define-read-only (convert-string-to-uint (input (string-ascii 20)))\n (string-to-uint? input)\n)\n\n;; Usage\n(convert-string-to-uint \"123\") ;; Returns (some u123)\n(convert-string-to-uint \"456\") ;; Returns (some u456)\n(convert-string-to-uint \"abc\") ;; Returns none\n```\n\nThis example demonstrates:\n1. Using `string-to-uint?` to convert a string to an optional unsigned integer.\n2. Implementing a public function to handle the string-to-unsigned-integer conversion.\n3. Handling both valid and invalid string inputs.\n\n## Common Pitfalls\n\n1. Using `string-to-uint?` with incorrectly formatted or invalid string inputs, causing the operation to return `none`.\n2. Assuming the conversion will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `string-to-int?`: Converts a string to an optional signed integer.\n- `int-to-ascii`: Converts an integer to a string-ascii representation.\n- `int-to-utf8`: Converts an integer to a string-utf8 representation.\n\n## Conclusion\n\nThe `string-to-uint?` function is a fundamental tool for converting string representations of numbers to unsigned integers in Clarity smart contracts. It allows you to implement logic that requires numeric values from string inputs, ensuring data integrity and simplifying numeric conversions. When used effectively, `string-to-uint?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle string-to-unsigned-integer conversions.\n"],[98,"\n## Function Signature\n\n```clarity\n(stx-account principal)\n```\n\n- Input: `principal`\n- Output: `(tuple (balance uint) (nonce uint) (stx-locked uint))`\n\n## Why it matters\n\nThe `stx-account` function is crucial for:\n\n1. Querying detailed information about a STX account.\n2. Implementing logic that requires account balance, nonce, and locked STX information.\n3. Ensuring data integrity by providing accurate account details.\n4. Simplifying the process of handling account-related operations in smart contracts.\n\n## When to use it\n\nUse `stx-account` when you need to:\n\n- Query detailed information about a STX account.\n- Implement logic that requires account balance, nonce, and locked STX information.\n- Ensure accurate account details for data integrity.\n- Handle account-related operations in your smart contract.\n\n## Best Practices\n\n- Ensure the `principal` is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other account functions for comprehensive account management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Querying STX Account Information\n\nLet's implement a function that queries the STX account information for a given principal:\n\n```clarity\n(define-read-only (get-stx-account-info (account principal))\n (stx-account account)\n)\n\n;; Usage\n(get-stx-account-info 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns (tuple (balance u0) (nonce u0) (stx-locked u0))\n```\n\nThis example demonstrates:\n1. Using `stx-account` to query detailed information about a STX account.\n2. Implementing a public function to handle the account information query.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `stx-account` with an incorrectly formatted or invalid `principal`, causing the operation to fail.\n2. Assuming the account information will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete account management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `stx-get-balance`: Queries the STX balance of a principal.\n- `stx-transfer?`: Transfers STX from one principal to another.\n- `stx-burn?`: Burns STX from a principal's account.\n\n## Conclusion\n\nThe `stx-account` function is a fundamental tool for querying detailed STX account information in Clarity smart contracts. It allows you to implement logic that requires account balance, nonce, and locked STX information, ensuring data integrity and simplifying account-related operations. When used effectively, `stx-account` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle account information queries.\n"],[143,"\n## Function Signature\n\n```clarity\n(stx-burn? amount sender)\n```\n\n- Input: `uint, principal`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `stx-burn?` function is crucial for:\n\n1. Decreasing the STX holdings of a principal by burning the specified amount.\n2. Implementing logic that requires reducing the circulating supply of STX.\n3. Ensuring data integrity by validating the burn operation.\n4. Simplifying the process of handling STX burning in smart contracts.\n\n## When to use it\n\nUse `stx-burn?` when you need to:\n\n- Decrease the STX holdings of a principal by burning the specified amount.\n- Implement logic that requires reducing the circulating supply of STX.\n- Validate the burn operation to ensure data integrity.\n- Handle STX burning operations in your smart contract.\n\n## Best Practices\n\n- Ensure the `amount` is positive and the `sender` has sufficient balance.\n- Use meaningful variable names for better readability.\n- Combine with other STX functions for comprehensive account management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Burning STX from an Account\n\nLet's implement a function that burns a specified amount of STX from the `tx-sender`:\n\n```clarity\n(define-public (burn-stx (amount uint))\n (stx-burn? amount tx-sender)\n)\n\n;; Usage\n(burn-stx u50) ;; Returns (ok true)\n```\n\nThis example demonstrates:\n1. Using `stx-burn?` to burn a specified amount of STX from the `tx-sender`.\n2. Implementing a public function to handle the STX burning operation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `stx-burn?` with a non-positive amount, causing the operation to fail.\n2. Assuming the burn operation will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete account management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `stx-get-balance`: Queries the STX balance of a principal.\n- `stx-transfer?`: Transfers STX from one principal to another.\n- `stx-account`: Queries detailed STX account information.\n\n## Conclusion\n\nThe `stx-burn?` function is a fundamental tool for burning STX from a principal's account in Clarity smart contracts. It allows you to implement logic that requires reducing the circulating supply of STX, ensuring data integrity and simplifying STX burning operations. When used effectively, `stx-burn?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle STX burning operations.\n"],[198,"\n## Function Signature\n\n```clarity\n(stx-get-balance owner)\n```\n\n- Input: `principal`\n- Output: `uint`\n\n## Why it matters\n\nThe `stx-get-balance` function is crucial for:\n\n1. Querying the STX balance of a principal.\n2. Implementing logic that requires checking account balances.\n3. Ensuring data integrity by providing accurate balance information.\n4. Simplifying the process of handling balance-related operations in smart contracts.\n\n## When to use it\n\nUse `stx-get-balance` when you need to:\n\n- Query the STX balance of a principal.\n- Implement logic that requires checking account balances.\n- Ensure accurate balance information for data integrity.\n- Handle balance-related operations in your smart contract.\n\n## Best Practices\n\n- Ensure the `principal` is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other account functions for comprehensive account management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Querying STX Balance\n\nLet's implement a function that queries the STX balance of a given principal:\n\n```clarity\n(define-read-only (get-stx-balance (account principal))\n (stx-get-balance account)\n)\n\n;; Usage\n(get-stx-balance 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns u0 if the account has no balance\n(get-stx-balance (as-contract tx-sender)) \n;; Returns the balance of the contract's principal\n```\n\nThis example demonstrates:\n1. Using `stx-get-balance` to query the STX balance of a principal.\n2. Implementing a public function to handle the balance query.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `stx-get-balance` with an incorrectly formatted or invalid `principal`, causing the operation to fail.\n2. Assuming the balance query will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete account management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `stx-transfer?`: Transfers STX from one principal to another.\n- `stx-burn?`: Burns STX from a principal's account.\n- `stx-account`: Queries detailed STX account information.\n\n## Conclusion\n\nThe `stx-get-balance` function is a fundamental tool for querying the STX balance of a principal in Clarity smart contracts. It allows you to implement logic that requires checking account balances, ensuring data integrity and simplifying balance-related operations. When used effectively, `stx-get-balance` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle balance queries.\n"],[184,"\n## Function Signature\n\n```clarity\n(stx-transfer-memo? amount sender recipient memo)\n```\n\n- Input: `uint, principal, principal, buff`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `stx-transfer-memo?` function is crucial for:\n\n1. Transferring STX between principals with an additional memo field.\n2. Implementing logic that requires recording a memo with each transfer.\n3. Ensuring data integrity by validating the transfer operation.\n4. Simplifying the process of handling STX transfers with memos in smart contracts.\n\n## When to use it\n\nUse `stx-transfer-memo?` when you need to:\n\n- Transfer STX between principals with an additional memo field.\n- Implement logic that requires recording a memo with each transfer.\n- Validate the transfer operation to ensure data integrity.\n- Handle STX transfers with memos in your smart contract.\n\n## Best Practices\n\n- Ensure the `amount` is positive and the `sender` has sufficient balance.\n- Use meaningful variable names for better readability.\n- Combine with other STX functions for comprehensive account management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Transferring STX with a Memo\n\nLet's implement a function that transfers STX with a memo from the `tx-sender` to a recipient:\n\n```clarity\n(define-public (transfer-stx-with-memo (amount uint) (recipient principal) (memo (buff 34)))\n (stx-transfer-memo? amount tx-sender recipient memo)\n)\n\n;; Usage\n(transfer-stx-with-memo u60 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x010203) \n;; Returns (ok true) if successful\n(transfer-stx-with-memo u50 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x040506) \n;; Returns (err u1) if the sender does not have enough balance\n```\n\nThis example demonstrates:\n1. Using `stx-transfer-memo?` to transfer STX with a memo.\n2. Implementing a public function to handle the STX transfer with a memo.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `stx-transfer-memo?` with a non-positive amount, causing the operation to fail.\n2. Assuming the transfer operation will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete account management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `stx-get-balance`: Queries the STX balance of a principal.\n- `stx-transfer?`: Transfers STX from one principal to another without a memo.\n- `stx-burn?`: Burns STX from a principal's account.\n\n## Conclusion\n\nThe `stx-transfer-memo?` function is a fundamental tool for transferring STX with a memo in Clarity smart contracts. It allows you to implement logic that requires recording a memo with each transfer, ensuring data integrity and simplifying STX transfer operations. When used effectively, `stx-transfer-memo?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle STX transfers with memos.\n"],[150,"\n## Function Signature\n\n```clarity\n(stx-transfer? amount sender recipient)\n```\n\n- Input: `uint, principal, principal`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `stx-transfer?` function is crucial for:\n\n1. Transferring STX between principals.\n2. Implementing logic that requires moving STX from one account to another.\n3. Ensuring data integrity by validating the transfer operation.\n4. Simplifying the process of handling STX transfers in smart contracts.\n\n## When to use it\n\nUse `stx-transfer?` when you need to:\n\n- Transfer STX between principals.\n- Implement logic that requires moving STX from one account to another.\n- Validate the transfer operation to ensure data integrity.\n- Handle STX transfers in your smart contract.\n\n## Best Practices\n\n- Ensure the `amount` is positive and the `sender` has sufficient balance.\n- Use meaningful variable names for better readability.\n- Combine with other STX functions for comprehensive account management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Transferring STX\n\nLet's implement a function that transfers STX from the `tx-sender` to a recipient:\n\n```clarity\n(define-public (transfer-stx (amount uint) (recipient principal))\n (stx-transfer? amount tx-sender recipient)\n)\n\n;; Usage\n(transfer-stx u60 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns (ok true) if successful\n(transfer-stx u50 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns (err u1) if the sender does not have enough balance\n```\n\nThis example demonstrates:\n1. Using `stx-transfer?` to transfer STX from the `tx-sender` to a recipient.\n2. Implementing a public function to handle the STX transfer.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `stx-transfer?` with a non-positive amount, causing the operation to fail.\n2. Assuming the transfer operation will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete account management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `stx-get-balance`: Queries the STX balance of a principal.\n- `stx-transfer-memo?`: Transfers STX from one principal to another with a memo.\n- `stx-burn?`: Burns STX from a principal's account.\n\n## Conclusion\n\nThe `stx-transfer?` function is a fundamental tool for transferring STX between principals in Clarity smart contracts. It allows you to implement logic that requires moving STX from one account to another, ensuring data integrity and simplifying STX transfer operations. When used effectively, `stx-transfer?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle STX transfers.\n"],[142,"\n## Function Signature\n\n```clarity\n(to-consensus-buff? value)\n```\n\n- Input: `any`\n- Output: `(optional (buff 32))`\n\n## Why it matters\n\nThe `to-consensus-buff?` function is crucial for:\n\n1. Serializing Clarity values into buffers for consensus.\n2. Implementing logic that requires converting Clarity values to a standardized buffer format.\n3. Ensuring data integrity by validating the serialization process.\n4. Simplifying the process of handling value serialization in smart contracts.\n\n## When to use it\n\nUse `to-consensus-buff?` when you need to:\n\n- Serialize Clarity values into buffers for consensus.\n- Implement logic that requires converting Clarity values to a standardized buffer format.\n- Validate the serialization process to ensure data integrity.\n- Handle value serialization in your smart contract.\n\n## Best Practices\n\n- Ensure the input value is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other serialization functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Serializing a Clarity Value\n\nLet's implement a function that serializes an integer value into a buffer:\n\n```clarity\n(define-read-only (serialize-int (input int))\n (to-consensus-buff? input)\n)\n\n(define-read-only (serialize-tuple (input (tuple (name (string-ascii 50)) (age uint))))\n (to-consensus-buff? input)\n)\n\n;; Usage\n(serialize-int 42) ;; Returns (some 0x000000000000000000000000000000000000000000000000000000000000002a)\n(serialize-int -1) ;; Returns none (since negative integers cannot be serialized)\n(serialize-tuple (tuple (name \"Harper Dog\") (age u5))) ;; Returns (some 0x0c00000002036167650100000000000000000000000000000005046e616d650d0000000a48617270657220446f67)\n```\n\nThis example demonstrates:\n1. Using `to-consensus-buff?` to serialize an integer value into a buffer.\n2. Implementing a public function to handle the serialization process.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `to-consensus-buff?` with incorrectly formatted or invalid input values, causing the operation to fail.\n2. Assuming the serialization will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `from-consensus-buff?`: Deserializes a buffer into a Clarity value.\n- `buff-to-int-be`: Converts a big-endian buffer to an integer.\n- `buff-to-uint-le`: Converts a little-endian buffer to an unsigned integer.\n\n## Conclusion\n\nThe `to-consensus-buff?` function is a fundamental tool for serializing Clarity values into buffers for consensus in Clarity smart contracts. It allows you to implement logic that requires converting Clarity values to a standardized buffer format, ensuring data integrity and simplifying value serialization. When used effectively, `to-consensus-buff?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle value serialization.\n"],[153,"\n## Function Signature\n\n```clarity\n(to-int value)\n```\n\n- Input: `uint`\n- Output: `int`\n\n## Why it matters\n\nThe `to-int` function is crucial for:\n\n1. Converting unsigned integers to signed integers.\n2. Implementing logic that requires signed integer operations.\n3. Ensuring data integrity by validating the conversion process.\n4. Simplifying the process of handling integer conversions in smart contracts.\n\n## When to use it\n\nUse `to-int` when you need to:\n\n- Convert an unsigned integer to a signed integer.\n- Implement logic that requires signed integer operations.\n- Validate the conversion process to ensure data integrity.\n- Handle integer conversions in your smart contract.\n\n## Best Practices\n\n- Ensure the input value is within the range that can be represented as a signed integer.\n- Use meaningful variable names for better readability.\n- Combine with other integer functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Converting Unsigned Integer to Signed Integer\n\nLet's implement a function that converts an unsigned integer to a signed integer:\n\n```clarity\n(define-read-only (convert-to-int (input uint))\n (to-int input)\n)\n\n;; Usage\n(convert-to-int u42) ;; Returns 42\n(convert-to-int u0) ;; Returns 0\n(convert-to-int u1000000) ;; Returns 1000000\n```\n\nThis example demonstrates:\n1. Using `to-int` to convert an unsigned integer to a signed integer.\n2. Implementing a public function to handle the conversion process.\n3. Handling both small and large input values.\n\n## Common Pitfalls\n\n1. Using `to-int` with values that exceed the range of signed integers, causing unexpected behavior.\n2. Assuming the conversion will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `to-uint`: Converts a signed integer to an unsigned integer.\n- `int-to-ascii`: Converts an integer to a string-ascii representation.\n- `int-to-utf8`: Converts an integer to a string-utf8 representation.\n\n## Conclusion\n\nThe `to-int` function is a fundamental tool for converting unsigned integers to signed integers in Clarity smart contracts. It allows you to implement logic that requires signed integer operations, ensuring data integrity and simplifying integer conversions. When used effectively, `to-int` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle integer conversions.\n"],[118,"\n## Function Signature\n\n```clarity\n(to-uint value)\n```\n\n- Input: `int`\n- Output: `uint`\n\n## Why it matters\n\nThe `to-uint` function is crucial for:\n\n1. Converting signed integers to unsigned integers.\n2. Implementing logic that requires unsigned integer operations.\n3. Ensuring data integrity by validating the conversion process.\n4. Simplifying the process of handling integer conversions in smart contracts.\n\n## When to use it\n\nUse `to-uint` when you need to:\n\n- Convert a signed integer to an unsigned integer.\n- Implement logic that requires unsigned integer operations.\n- Validate the conversion process to ensure data integrity.\n- Handle integer conversions in your smart contract.\n\n## Best Practices\n\n- Ensure the input value is non-negative to avoid runtime errors.\n- Use meaningful variable names for better readability.\n- Combine with other integer functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Converting Signed Integer to Unsigned Integer\n\nLet's implement a function that converts a signed integer to an unsigned integer:\n\n```clarity\n(define-read-only (convert-to-uint (input int))\n (to-uint input)\n)\n\n;; Usage\n(convert-to-uint 42) ;; Returns u42\n(convert-to-uint 0) ;; Returns u0\n(convert-to-uint -1) ;; Causes a runtime error\n```\n\nThis example demonstrates:\n1. Using `to-uint` to convert a signed integer to an unsigned integer.\n2. Implementing a public function to handle the conversion process.\n3. Handling both positive and zero input values.\n\n## Common Pitfalls\n\n1. Using `to-uint` with negative values, causing a runtime error.\n2. Assuming the conversion will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `to-int`: Converts an unsigned integer to a signed integer.\n- `int-to-ascii`: Converts an integer to a string-ascii representation.\n- `int-to-utf8`: Converts an integer to a string-utf8 representation.\n\n## Conclusion\n\nThe `to-uint` function is a fundamental tool for converting signed integers to unsigned integers in Clarity smart contracts. It allows you to implement logic that requires unsigned integer operations, ensuring data integrity and simplifying integer conversions. When used effectively, `to-uint` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle integer conversions.\n"],[166,"\n## Function Signature\n\n```clarity\n(try! expression)\n```\n\n- Input: `expression` (of type `(response T E)`)\n- Output: `T` (if the response is `ok`) or causes a runtime error (if the response is `err`)\n\n## Why it matters\n\nThe `try!` function is crucial for:\n\n1. Simplifying error handling in Clarity smart contracts.\n2. Implementing logic that requires automatic error propagation.\n3. Ensuring data integrity by validating operations and handling errors gracefully.\n4. Simplifying the process of handling responses in smart contracts.\n\n## When to use it\n\nUse `try!` when you need to:\n\n- Simplify error handling in your smart contract.\n- Implement logic that requires automatic error propagation.\n- Validate operations and handle errors gracefully.\n- Handle responses in your smart contract.\n\n## Best Practices\n\n- Ensure the expression returns a response type `(response T E)`.\n- Use meaningful variable names for better readability.\n- Combine with other error handling functions for comprehensive error management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Handling Errors in a Transfer Function\n\nLet's implement a function that transfers STX and handles errors using `try!`:\n\n```clarity\n(define-public (transfer-stx (amount uint) (recipient principal))\n (begin\n (try! (stx-transfer? amount tx-sender recipient))\n (ok true)\n )\n)\n\n;; Usage\n(transfer-stx u60 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns (ok true) if successful\n(transfer-stx u50 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns (err u1) if the sender does not have enough balance\n```\n\nThis example demonstrates:\n1. Using `try!` to handle errors in a STX transfer operation.\n2. Implementing a public function to handle the transfer and error propagation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `try!` with expressions that do not return a response type, causing runtime errors.\n2. Assuming the operation will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete error management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `unwrap!`: Unwraps an optional value, causing a runtime error if the value is `none`.\n- `asserts!`: Asserts a condition, causing a runtime error if the condition is false.\n- `is-err`: Checks if a response is an error.\n\n## Conclusion\n\nThe `try!` function is a fundamental tool for handling errors in Clarity smart contracts. It allows you to simplify error handling, ensuring data integrity and automatic error propagation. When used effectively, `try!` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle responses and errors.\n"],[148,"\n## Function Signature\n\n```clarity\n(unwrap-err-panic response-input)\n```\n\n- Input: `(response A B)`\n- Output: `B`\n\n## Why it matters\n\nThe `unwrap-err-panic` function is crucial for:\n\n1. Unpacking error responses to access their inner values.\n2. Implementing logic that requires handling error responses.\n3. Ensuring data integrity by validating the error unpacking process.\n4. Simplifying the process of handling error responses in smart contracts by throwing runtime errors when necessary.\n\n## When to use it\n\nUse `unwrap-err-panic` when you need to:\n\n- Unpack error responses to access their inner values.\n- Implement logic that requires handling error responses.\n- Validate the error unpacking process to ensure data integrity.\n- Handle error responses in your smart contract and throw runtime errors when necessary.\n\n## Best Practices\n\n- Ensure the input value is a response type.\n- Use meaningful variable names for better readability.\n- Combine with other error handling functions for comprehensive error management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Unpacking an Error Response and Throwing a Runtime Error\n\nLet's implement a function that processes an error response using `unwrap-err-panic`:\n\n```clarity\n(define-public (process-error-response (input (response int int)))\n (let\n (\n (errorValue (unwrap-err-panic input))\n )\n (ok errorValue)\n )\n)\n\n;; Usage\n(process-error-response (err 42)) ;; Returns (ok 42)\n(process-error-response (ok 1)) ;; Throws a runtime exception\n```\n\nThis example demonstrates:\n1. Using `unwrap-err-panic` to unpack an error response.\n2. Implementing a public function to handle the error unpacking process.\n3. Handling both successful and error cases, with runtime errors thrown for `ok` values.\n\n## Common Pitfalls\n\n1. Using `unwrap-err-panic` with values that are not response types, causing runtime errors.\n2. Assuming the error unpacking will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete error management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `unwrap!`: Unpacks optional and response types, returning a thrown value if unpacking fails.\n- `unwrap-err!`: Unpacks error responses, returning a thrown value if the response is `ok`.\n- `try!`: Unpacks optional and response types, returning `none` or the `err` value if unpacking fails.\n\n## Conclusion\n\nThe `unwrap-err-panic` function is a fundamental tool for unpacking error responses and throwing runtime errors in Clarity smart contracts. It allows you to implement logic that requires handling error responses, ensuring data integrity and simplifying the error unpacking process. When used effectively, `unwrap-err-panic` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle error responses and throw runtime errors when necessary.\n"],[159,"\n## Function Signature\n\n```clarity\n(unwrap-err! response-input thrown-value)\n```\n\n- Input: `(response A B), C`\n- Output: `B`\n\n## Why it matters\n\nThe `unwrap-err!` function is crucial for:\n\n1. Unpacking error responses to access their inner values.\n2. Implementing logic that requires handling error responses.\n3. Ensuring data integrity by validating the error unpacking process.\n4. Simplifying the process of handling error responses in smart contracts.\n\n## When to use it\n\nUse `unwrap-err!` when you need to:\n\n- Unpack error responses to access their inner values.\n- Implement logic that requires handling error responses.\n- Validate the error unpacking process to ensure data integrity.\n- Handle error responses in your smart contract.\n\n## Best Practices\n\n- Ensure the input value is a response type.\n- Use meaningful variable names for better readability.\n- Combine with other error handling functions for comprehensive error management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Unpacking an Error Response\n\nLet's implement a function that processes an error response using `unwrap-err!`:\n\n```clarity\n(define-public (process-error-response (input (response int int)))\n (let\n (\n (errorValue (unwrap-err! input (err \"No error found\")))\n )\n (ok errorValue)\n )\n)\n\n;; Usage\n(process-error-response (err 42)) ;; Returns (ok 42)\n(process-error-response (ok 1)) ;; Returns (err \"No error found\")\n```\n\nThis example demonstrates:\n1. Using `unwrap-err!` to unpack an error response.\n2. Implementing a public function to handle the error unpacking process.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `unwrap-err!` with values that are not response types, causing runtime errors.\n2. Assuming the error unpacking will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete error management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `unwrap!`: Unpacks optional and response types, returning a thrown value if unpacking fails.\n- `unwrap-panic`: Unpacks optional and response types, throwing a runtime error if unpacking fails.\n- `try!`: Unpacks optional and response types, returning `none` or the `err` value if unpacking fails.\n\n## Conclusion\n\nThe `unwrap-err!` function is a fundamental tool for unpacking error responses in Clarity smart contracts. It allows you to implement logic that requires handling error responses, ensuring data integrity and simplifying the error unpacking process. When used effectively, `unwrap-err!` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle error responses.\n"],[151,"\n## Function Signature\n\n```clarity\n(unwrap-panic option-input)\n```\n\n- Input: `(optional A) | (response A B)`\n- Output: `A`\n\n## Why it matters\n\nThe `unwrap-panic` function is crucial for:\n\n1. Unpacking optional and response types to access their inner values.\n2. Implementing logic that requires handling optional and response types.\n3. Ensuring data integrity by validating the unpacking process.\n4. Simplifying the process of handling optional and response types in smart contracts by throwing runtime errors when necessary.\n\n## When to use it\n\nUse `unwrap-panic` when you need to:\n\n- Unpack optional and response types to access their inner values.\n- Implement logic that requires handling optional and response types.\n- Validate the unpacking process to ensure data integrity.\n- Handle optional and response types in your smart contract and throw runtime errors when necessary.\n\n## Best Practices\n\n- Ensure the input value is an optional or response type.\n- Use meaningful variable names for better readability.\n- Combine with other error handling functions for comprehensive error management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Unpacking an Optional Value and Throwing a Runtime Error\n\nLet's implement a function that retrieves a value from a map and unpacks it using `unwrap-panic`:\n\n```clarity\n(define-map UserInfo { userId: principal } { name: (string-ascii 20), age: uint })\n\n(define-public (get-user-age (user principal))\n (let\n (\n (userData (unwrap-panic (map-get? UserInfo { userId: user })))\n )\n (ok (get age userData))\n )\n)\n\n;; Usage\n(map-set UserInfo { userId: tx-sender } { name: \"Alice\", age: u30 })\n(get-user-age tx-sender) ;; Returns (ok u30)\n(get-user-age 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) ;; Throws a runtime exception\n```\n\n## Common Pitfalls\n\n1. Using `unwrap-panic` with values that are not optional or response types, causing runtime errors.\n2. Assuming the unpacking will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete error management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `unwrap!`: Unpacks optional and response types, returning a thrown value if unpacking fails.\n- `unwrap-err!`: Unpacks error responses, returning a thrown value if the response is `ok`.\n- `try!`: Unpacks optional and response types, returning `none` or the `err` value if unpacking fails.\n\n## Conclusion\n\nThe `unwrap-panic` function is a fundamental tool for unpacking optional and response types and throwing runtime errors in Clarity smart contracts. It allows you to implement logic that requires handling optional and response types, ensuring data integrity and simplifying the unpacking process. When used effectively, `unwrap-panic` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle optional and response types and throw runtime errors when necessary.\n"],[85,"\n## Function Signature\n\n```clarity\n(unwrap! option-input thrown-value)\n```\n\n- Input: `(optional A) | (response A B), C`\n- Output: `A`\n\n## Why it matters\n\nThe `unwrap!` function is crucial for:\n\n1. Unpacking optional and response types to access their inner values.\n2. Implementing logic that requires handling optional and response types.\n3. Ensuring data integrity by validating the unpacking process.\n4. Simplifying the process of handling optional and response types in smart contracts.\n\n## When to use it\n\nUse `unwrap!` when you need to:\n\n- Unpack optional and response types to access their inner values.\n- Implement logic that requires handling optional and response types.\n- Validate the unpacking process to ensure data integrity.\n- Handle optional and response types in your smart contract.\n\n## Best Practices\n\n- Ensure the input value is an optional or response type.\n- Use meaningful variable names for better readability.\n- Combine with other error handling functions for comprehensive error management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Unpacking an Optional Value\n\nLet's implement a function that retrieves a value from a map and unpacks it using `unwrap!`:\n\n```clarity\n(define-map UserInfo { userId: principal } { name: (string-ascii 20), age: uint })\n\n(define-public (get-user-age (user principal))\n (let\n (\n (userData (unwrap! (map-get? UserInfo { userId: user }) (err \"User not found\")))\n )\n (ok (get age userData))\n )\n)\n\n;; Usage\n(map-set UserInfo { userId: tx-sender } { name: \"Alice\", age: u30 })\n(get-user-age tx-sender) ;; Returns (ok u30)\n(get-user-age 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) ;; Returns (err \"User not found\")\n```\n\nThis example demonstrates:\n1. Using `unwrap!` to unpack an optional value from a map.\n2. Implementing a public function to handle the unpacking process.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `unwrap!` with values that are not optional or response types, causing runtime errors.\n2. Assuming the unpacking will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete error management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `try!`: Unpacks optional and response types, returning `none` or the `err` value if unpacking fails.\n- `unwrap-panic`: Unpacks optional and response types, throwing a runtime error if unpacking fails.\n- `default-to`: Provides a default value if an optional is `none`.\n\n## Conclusion\n\nThe `unwrap!` function is a fundamental tool for unpacking optional and response types in Clarity smart contracts. It allows you to implement logic that requires handling optional and response types, ensuring data integrity and simplifying the unpacking process. When used effectively, `unwrap!` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle optional and response types.\n"],[117,"\n## Function Signature\n\n```clarity\n(use-trait trait-alias trait-identifier)\n```\n\n- Input: `VarName, TraitIdentifier`\n- Output: `Not Applicable`\n\n## Why it matters\n\nThe `use-trait` function is crucial for:\n\n1. Importing traits defined in other contracts.\n2. Implementing logic that requires conformance to specific interfaces.\n3. Ensuring code reusability and modularity by leveraging traits.\n4. Simplifying the process of using external traits in smart contracts.\n\n## When to use it\n\nUse `use-trait` when you need to:\n\n- Import traits defined in other contracts.\n- Implement logic that requires conformance to specific interfaces.\n- Ensure code reusability and modularity by leveraging traits.\n- Handle trait imports in your smart contract.\n\n## Best Practices\n\n- Use descriptive names for trait aliases for better readability.\n- Ensure the trait identifier is correctly formatted and valid.\n- Combine with other contract functions for comprehensive contract management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Importing and Using a Trait\n\nLet's implement a function that imports a trait and uses it in a contract:\n\n```clarity\n(use-trait token-trait 'SP2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR.token-trait)\n\n(define-public (forward-get-balance (user principal) (contract <token-trait>))\n (ok (contract-of contract))\n)\n\n;; Usage\n(forward-get-balance tx-sender 'SP2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR.token-trait)\n;; Returns the principal of the contract implementing the token-trait\n```\n\nThis example demonstrates:\n1. Using `use-trait` to import a trait from another contract.\n2. Implementing a public function to use the imported trait.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `use-trait` with incorrectly formatted or invalid trait identifiers, causing runtime errors.\n2. Assuming the trait import will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete contract management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `contract-of`: Returns the principal of the contract implementing the trait.\n- `define-trait`: Defines a new trait in the current contract.\n- `impl-trait`: Implements a trait in the current contract.\n\n## Conclusion\n\nThe `use-trait` function is a fundamental tool for importing and using traits from other contracts in Clarity smart contracts. It allows you to implement logic that requires conformance to specific interfaces, ensuring code reusability and modularity. When used effectively, `use-trait` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle trait imports.\n"],[131,"\n## Function Signature\n\n```clarity\n(var-get var-name)\n```\n\n- Input: `VarName`\n- Output: `A`\n\n## Why it matters\n\nThe `var-get` function is crucial for:\n\n1. Retrieving the value of a data variable.\n2. Implementing logic that requires accessing stored data.\n3. Ensuring data integrity by validating the retrieval process.\n4. Simplifying the process of handling data variables in smart contracts.\n\n## When to use it\n\nUse `var-get` when you need to:\n\n- Retrieve the value of a data variable.\n- Implement logic that requires accessing stored data.\n- Validate the retrieval process to ensure data integrity.\n- Handle data variables in your smart contract.\n\n## Best Practices\n\n- Ensure the variable name is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other data functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Retrieving a Data Variable\n\n```clarity\n(define-data-var cursor int 6)\n\n(define-public (get-cursor)\n (ok (var-get cursor))\n)\n\n;; Usage\n(get-cursor) ;; Returns (ok 6)\n```\n\nThis example demonstrates:\n1. Using `var-get` to retrieve the value of a data variable.\n2. Implementing a public function to handle the retrieval process.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `var-get` with incorrectly formatted or invalid variable names, causing runtime errors.\n2. Assuming the retrieval will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `var-set`: Sets the value of a data variable.\n- `map-get?`: Retrieves a value from a map.\n- `default-to`: Provides a default value if an optional is `none`.\n\n## Conclusion\n\nThe `var-get` function is a fundamental tool for retrieving the value of a data variable in Clarity smart contracts. It allows you to implement logic that requires accessing stored data, ensuring data integrity and simplifying the retrieval process. When used effectively, `var-get` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle data variables.\n"],[175,"\n## Function Signature\n\n```clarity\n(var-set var-name expr1)\n```\n\n- Input: `VarName, AnyType`\n- Output: `bool`\n\n## Why it matters\n\nThe `var-set` function is crucial for:\n\n1. Setting the value of a data variable.\n2. Implementing logic that requires updating stored data.\n3. Ensuring data integrity by validating the update process.\n4. Simplifying the process of handling data variables in smart contracts.\n\n## When to use it\n\nUse `var-set` when you need to:\n\n- Set the value of a data variable.\n- Implement logic that requires updating stored data.\n- Validate the update process to ensure data integrity.\n- Handle data variables in your smart contract.\n\n## Best Practices\n\n- Ensure the variable name is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other data functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Setting a Data Variable\n\nLet's implement a function that sets the value of a data variable:\n\n```clarity\n(define-data-var cursor int 6)\n\n(define-public (increment-cursor)\n (ok (var-set cursor (+ (var-get cursor) 1)))\n)\n\n;; Usage\n(increment-cursor) ;; Sets cursor to 7\n(var-get cursor) ;; Returns 7\n```\n\nThis example demonstrates:\n1. Using `var-set` to set the value of a data variable.\n2. Implementing a public function to handle the update process.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `var-set` with incorrectly formatted or invalid variable names, causing runtime errors.\n2. Assuming the update will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `var-get`: Retrieves the value of a data variable.\n- `map-set`: Sets a value in a map.\n- `default-to`: Provides a default value if an optional is `none`.\n\n## Conclusion\n\nThe `var-set` function is a fundamental tool for setting the value of a data variable in Clarity smart contracts. It allows you to implement logic that requires updating stored data, ensuring data integrity and simplifying the update process. When used effectively, `var-set` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle data variables.\n"],[93,"\n## Function Signature\n\n```clarity\n(xor int1 int2)\n```\n\n- Input: `int, int`\n- Output: `int`\n\n## Why it matters\n\nThe `xor` function is crucial for:\n\n1. Performing bitwise operations essential for cryptographic functions.\n2. Implementing conditional logic that requires toggling between states.\n3. Enhancing data security through simple encryption mechanisms.\n4. Simplifying the process of handling bitwise operations in smart contracts.\n\n## When to use it\n\nUse `xor` when you need to:\n\n- Perform bitwise exclusive OR operations.\n- Implement simple encryption or decryption mechanisms.\n- Toggle between two states based on certain conditions.\n- Enhance the security of your smart contract through cryptographic operations.\n\n## Best Practices\n\n- Ensure the integers used with `xor` are within the valid range for your application.\n- Use meaningful variable names to enhance code readability.\n- Combine `xor` with other logical operations to implement complex conditions.\n- Handle possible edge cases to ensure robust contract behavior.\n\n## Practical Example: Simple Encryption\n\nLet's implement a simple encryption and decryption mechanism using the `xor` function:\n\n```clarity\n(define-public (encrypt (data int) (key int))\n (ok (xor data key))\n)\n\n(define-public (decrypt (encryptedData int) (key int))\n (ok (xor encryptedData key))\n)\n\n;; Usage\n(encrypt 42 123) ;; Encrypts 42 with key 123, returns (ok 81)\n(decrypt 165 123) ;; Decrypts 165 with key 123, returns (ok 222)\n```\n\nThis example demonstrates:\n1. Using `xor` to perform a bitwise exclusive OR operation.\n2. Implementing public functions to handle encryption and decryption.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `xor` with non-integer types, causing runtime errors.\n2. Misunderstanding the behavior of `xor`, leading to incorrect logic implementation.\n3. Not considering edge cases, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `and`: Performs a bitwise AND operation.\n- `or`: Performs a bitwise OR operation.\n- `not`: Performs a bitwise NOT operation.\n\n## Conclusion\n\nThe `xor` function is a powerful tool for performing bitwise exclusive OR operations in Clarity smart contracts. It allows you to implement cryptographic functions, conditional logic, and simple encryption mechanisms, enhancing the security and functionality of your smart contracts. When used effectively, `xor` simplifies the process of handling bitwise operations and ensures robust contract behavior.\n"],[70,"\n## January: AI x Stacks\n\n*Build something that combines AI capabilities with Stacks blockchain technology*\n\n**Timeline**: January 22-28, 2025\n\nThis month's challenge invites you to explore the intersection of artificial intelligence and blockchain technology. Create innovative solutions that leverage both AI capabilities and the Stacks blockchain.\n\nSubmit your project [here](https://hirohacks25.paperform.co/).\n\n<iframe width=\"770\" height=\"315\" src=\"https://www.youtube.com/embed/GiKRSAMQNqo?si=EQ74OTyTsOzcPIK-\" title=\"YouTube video player\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerPolicy=\"strict-origin-when-cross-origin\" allowFullScreen></iframe>\n\n## Example project ideas\n\n### 1. AI Contract Analyzer\n- Build a tool that uses LLMs to audit and explain [Clarity contracts](/stacks/clarity)\n- Help developers understand and improve their smart contracts through AI-powered analysis\n- Provide suggestions for security improvements and optimizations\n\n### 2. Smart Wallet Assistant \n- Create an AI-powered [wallet](/stacks/stacks.js) that helps users make informed decisions\n- Analyze transaction history and provide personalized insights\n- Offer predictive analytics and spending recommendations\n\n### 3. Chain Detective\n- Develop an AI tool that analyzes on-chain data to discover interesting patterns\n- Use [Chainhook](/stacks/chainhook) to stream and analyze blockchain events in real-time\n- Generate visualizations and reports of blockchain activity\n\n_Review the [submission guidelines](/stacks/hacks/#rules) for project requirements and join the [Stacks Discord](https://stacks.chat) to connect with other builders._\n\n---\n\n## Resources\n\n- [Clarity Codex](https://github.com/leahjlou/clarity-codex/)\n- [Stacks Discord](https://stacks.chat)"],[58,"\n## Making requests\n\nTo make a request to the Stacks API, you can paste the `curl` command below in your terminal.\n\n```terminal\n$ curl -L 'https://api.hiro.so/metadata/v1/' -H 'Accept: application/json'\n```\n\nIf you are using an `api-key`, you will need to replace `$HIRO_API_KEY` with your secret API key.\n\n```terminal\n$ curl -L 'https://api.hiro.so/metadata/v1/' \\\n -H 'Accept: application/json' \\\n -H 'X-API-Key: $HIRO_API_KEY'\n```\n\nYou should get a response back that resembles the following:\n\n```json\n{\n \"server_version\": \"token-metadata-api v0.7.0 (master:1aa1603)\",\n \"status\": \"ready\",\n \"tokens\": {\n \"ft\": 1309,\n \"nft\": 545094,\n \"sft\": 121\n },\n \"token_contracts\": {\n \"sip-009\": 4791,\n \"sip-010\": 1309,\n \"sip-013\": 21\n },\n \"job_queue\": {\n \"done\": 443257,\n \"failed\": 108606\n }\n}\n```\n\n## Making requests using API Client\n\nWe also maintain a standalone API client that you can use to make requests to the Stacks API. This client is available as a package and can be installed with the following command:\n\n```package-install title=\"Terminal\"\n@hirosystems/token-metadata-api-client\n```\n\nExample usage:\n\n```ts\nimport { Configuration, TokensApi } from \"@hirosystems/token-metadata-api-client\";\n\nconst config: Configuration = {}\nconst api = new TokensApi(config);\nconst result = await api.getFtMetadata(\n 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2'\n);\n```\n\n{/* For more information on the API client, you can check out the [API Client documentation](/stacks/token-metadata-api/client). */}"],[19,"\n## Network types\n\nClarinet supports different network types to cater to various development and testing needs:\n\n| Network | Description | Use case\n| -------------- | ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |\n| `simnet` | Optimized for fast feedback loops, introspection, and portability. | Ideal for initial development and unit-testing. |\n| `devnet` | Local Stacks and Bitcoin nodes running on Docker for faster feedback loops. | Use for integration tests or local frontend development. |\n| `testnet` | A pre-production network that offers a realistic environment for testing. | Ideal for final testing before deploying to Mainnet. |\n| `mainnet` | The production network where real transactions occur. | Use when you're ready to deploy your smart contract to production. |\n\n## Deployment plans\n\nThe default deployment plan of every Clarinet project is contained within specifications set inside certain files. In addition to this default deployment plan, the user can manually configure each plan, adding additional transactions or contract calls across multiple Stacks or Bitcoin blocks.\n\nYou can commit, audit, and test contracts without including any secrets in the deployment plan, and you can share these contracts without exposing any sensitive information.\n\n### Primitives\n\n| Transaction primitive | Typical usage |\n| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Publish contracts | Deploy contracts to an in-memory simulated Stacks chain, public networks like testnet and mainnet, or deploy external contracts to your local network for testing purposes. |\n| Call contract functions | Call a contract deployed to any of your local devnets or public networks. |\n| Send BTC | Perform a simple bitcoin transfer from a p2pkh address to a p2pkh address. |\n| Wait for block | Test or automate contract deployment across multiple Stacks or Bitcoin blocks. |\n| Send STX | Send stacks to an address or contract. |"],[46,"\n## Prerequisites\n\n- Follow the [create project](/stacks/platform/guides/create-project) guide to create or import a project.\n- Make sure you have installed and connected a Stacks wallet to deploy your contracts.\n\n## Use the deploy button\n\nOnce your project is setup, you can deploy the contracts to testnet or mainnet using the \"Deploy\" button on the Hiro Platform.\n\n![deploy contracts](../images/deploy-contracts/d1.png)\n\nThe following are the steps to deploy your contracts using the deploy button.\n\n1. On the projects page, select the project you want to deploy contracts from.\n2. Use the \"Deploy Contracts\" button available at the top right of the page.\n3. Choose the network you want to deploy to. Note: for devnet, [reference this guide](/stacks/platform/guides/devnet). The steps below are specific to testnet and mainnet.\n4. Once you choose a network, you will see a button to generate a deployment plan.\n5. Once the deployment plan is generated, you will see the list of contracts to be deployed - you can now connect your wallet and click \"Deploy\" to deploy your contracts.\n\n![deploy contracts](../images/deploy-contracts/d2.png)\n\nIf you find issues with your deployment process, you can reach out to us on the [#hiro-platform channel](https://stacks.chat) on Discord under the Hiro Developer Tools section or file an issue [here](https://hiro-pbc.canny.io/hiro-platform).\n"],[14,"\n## Prerequisites\n\nSince the Stacks Blockchain API depends on a Stacks blockchain node being at the same block height, you will need to first [restore a Stacks blockchain node using the Hiro Archive](/stacks/archive/guides/stacks-blockchain) before restoring the Stacks Blockchain API. Otherwise, you may encounter errors when running the API.\n\nIn order for the Stacks blockchain and Stacks Blockchain API archives to be compatible, they must meet the following criteria:\n\n- Both archives correspond to the same Stacks network (mainnet/testnet).\n- The API archive version must be compatible with the Stacks blockchain archive version (See [API release notes](https://github.com/hirosystems/stacks-blockchain-api/releases) for guidance).\n- Both archives were created on the same date.\n\n## Restoration methods\n\nThere are two ways to restore a Stacks Blockchain API using the Hiro Archive. The archive file you'll need to download will depend on your method of restoration. There is no scenario where you would need both restoration methods.\n\n**Restore via Postgres database dump (Recommended)**\n\nThis is the quickest and most direct method, and it is suitable for most scenarios. It consists of a backup of the API's Postgres database taken using `pg_dump`. We generally recommend starting with this method before attempting the method below if this one does not work for any reason.\n\n**Restore via tab-separated-values (TSV) file**\n\nThis method is several times slower than restoring from a Postgres dump. The API TSV file contains the raw unprocessed events from a Stacks blockchain node. The API can ingest this file to process events into a Postgres database.\nRestoring from a TSV file can be useful when a Postgres database archive for a particular API version is not available or when it cannot be used for any reason.\n\n## Where to download archives\n\nDepending on the restoration method used above, the Stacks Blockchain API archives for each network can be found at the following locations:\n\n- Postgres database dump\n - mainnet: https://archive.hiro.so/mainnet/stacks-blockchain-api-pg/\n - testnet: https://archive.hiro.so/testnet/stacks-blockchain-api-pg/\n- TSV file\n - mainnet: https://archive.hiro.so/mainnet/stacks-blockchain-api/\n - testnet: https://archive.hiro.so/testnet/stacks-blockchain-api/\n\nThe file name patterns are as follows:\n\n- Postgres database dump\n - archive: `stacks-blockchain-api-pg-<DATABASE VERSION>-<API VERSION>-<DATE(YYYYMMDD)>.dump`\n - shasum: `stacks-blockchain-api-pg-<DATABASE VERSION>-<API VERSION>-<DATE(YYYYMMDD)>.sha256`\n- TSV file\n - archive: `<network>-stacks-blockchain-api-<API VERSION>-<DATE(YYYYMMDD)>.gz`\n - shasum: `<network>-stacks-blockchain-api-<API VERSION>-<DATE(YYYYMMDD)>.sha256`\n\nThere is a continually updated archive and shasum which always points to the most recent upload:\n\n- Postgres database dump\n - archive: `stacks-blockchain-api-pg-<DATABASE VERSION>-latest.dump`\n - shasum: `stacks-blockchain-api-pg-<DATABASE VERSION>-latest.sha256`\n- TSV file\n - archive: `<network>-stacks-blockchain-api-latest.gz`\n - shasum: `<network>-stacks-blockchain-api-latest.sha256`\n\nor the most recent upload for a particular version:\n\n- Postgres database dump\n - archive: `stacks-blockchain-api-pg-<DATABASE VERSION>-<API VERSION>-latest.dump`\n - shasum: `stacks-blockchain-api-pg-<DATABASE VERSION>-<API VERSION>-latest.sha256`\n- TSV file\n - archive: `<network>-stacks-blockchain-api-<API VERSION>-latest.gz`\n - shasum: `<network>-stacks-blockchain-api-<API VERSION>-latest.sha256`\n\n## Restoring the Stacks Blockchain API using the Hiro Archive\n\n**If restoring via Postgres dump**\n\n1. Download the archive and shasum for the appropriate network and restoration method.\n1. [Verify the archive](/stacks/archive/guides/verify-archive-data) with the shasum.\n1. Import the archive file into a running Postgres database (may take up to an hour depending on database specs and tuning):\n ```terminal\n $ export PGPASSWORD=<YOUR POSTGRES PASSWORD>\n $ pg_restore --username postgres --verbose --jobs 4 --dbname stacks_blockchain_api /path/to/archive/file\n ```\n1. Launch the Stacks Blockchain API service.\n1. Verify the dataset is being used by comparing your nodes [local block height](http://localhost:3999/extended/v1/status) with [Hiro's](https://api.hiro.so/extended/v1/status). If the block height matches or is close to Hiro's block height, the restoration was successful.\n 1. It may take a few minutes for the local node to respond on this endpoint.\n 1. Your block height may be up to a few hundred blocks away from Hiro's depending on the age of the archive. It should catch up relatively quickly.\n\n**If restoring via TSV file**\n\n1. Download the archive and shasum for the appropriate network and restoration method.\n1. [Verify the archive](/stacks/archive/guides/verify-archive-data) with the shasum.\n1. Extract the archive into the desired directory:\n ```terminal\n $ gzip -d <ARCHIVE FILE> --stdout > /path/to/extracted/file\n ```\n1. [Follow these directions](https://github.com/hirosystems/stacks-blockchain-api#export-and-import) to process and import the events in the TSV file into your Postgres database.\n1. Launch the Stacks Blockchain API service.\n1. Verify the dataset is being used by comparing your nodes [local block height](http://localhost:3999/extended/v1/status) with [Hiro's](https://api.hiro.so/extended/v1/status). If the block height matches or is close to Hiro's block height, the restoration was successful.\n 1. It may take a few minutes for the local node to respond on this endpoint.\n 1. Your block height may be up to a few hundred blocks away from Hiro's depending on the age of the archive. It should catch up relatively quickly.\n"],[15,"\n## Prerequisites\n\nSince the Token Metadata API depends on a Stacks Blockchain API, you will need to first launch a Stacks Blockchain API configured for the same Stacks network.\n\nIf you don't already have one, you can follow [these instructions](/stacks/archive/guides/stacks-blockchain) to launch one with an archive.\n\n## Where to download archives\n\nToken Metadata API archives for each network can be found at the following locations:\n\n- mainnet: https://archive.hiro.so/mainnet/token-metadata-api-pg/\n- testnet: https://archive.hiro.so/testnet/token-metadata-api-pg/\n\nThe file name patterns are as follows:\n\n- archive: `token-metadata-api-pg-<DATABASE VERSION>-<API VERSION>-<DATE(YYYYMMDD)>.dump`\n- shasum: `token-metadata-api-pg-<DATABASE VERSION>-<API VERSION>-<DATE(YYYYMMDD)>.sha256`\n\nThere is a continually updated archive and shasum which always points to the most recent upload:\n\n- archive: `token-metadata-api-pg-<DATABASE VERSION>-latest.dump`\n- shasum: `token-metadata-api-pg-<DATABASE VERSION>-latest.sha256`\n\nor the most recent upload for a particular version:\n\n- archive: `token-metadata-api-pg-<DATABASE VERSION>-<API VERSION>-latest.dump`\n- shasum: `token-metadata-api-pg-<DATABASE VERSION>-<API VERSION>-latest.sha256`\n\n## Restoring the Token Metadata API using the Hiro Archive\n\n1. Download the archive and shasum for the appropriate network.\n1. [Verify the archive](/stacks/archive/guides/verify-archive-data) with the shasum.\n1. Import the archive file into a running Postgres database (may take up to an hour depending on database specs and tuning):\n ```terminal\n $ export PGPASSWORD=<YOUR POSTGRES PASSWORD>\n $ pg_restore --username postgres --verbose --jobs 4 --dbname token_metadata_api /path/to/archive/file\n ```\n1. Launch the Token Metadata API service.\n1. Verify the restoration was successful by viewing the [total number of tokens and contracts tracked in the service.](http://localhost:3000/metadata) If the total number of each property is greater than zero, the restoration was successful.\n 1. It may take a few minutes for the local node to respond on this endpoint.\n"],[55,"\n## Service architecture\n\nThis section gives you an overview of external and internal architectural diagrams.\n\n## External architecture\n\nThe external architectural diagram shows how the Token metadata API is connected to three systems: a Stacks node, a Stacks Blockchain API database, and a Postgres database.\n\n![Architecture](../../../../public/images/token-metadata-api/architecture.svg)\n\n1. The Token Metadata API interacts with the Stacks Blockchain API database (referred to as a \"Local Metadata DB\" in the diagram above) to import all historical smart contracts when booting up and to listen for new contracts that may be deployed afterwards. Read-only access is recommended as this service will never need to write anything to this database.\n2. A Stacks node responds to all read-only contract calls required when fetching token metadata (calls to get token count, token metadata URIs, etc.).\n3. A local Postgres DB stores all processed metadata info.\n\nThe service needs to fetch external metadata files (JSONs, images) from the internet, so it must have access to external networks.\n\n## Internal architecture\n\nThe following is the internal architectural diagram of the Token Metadata API.\n\n![Flowchart](../../../../public/images/token-metadata-api/flowchart.svg)\n"],[221,"\n## Setting up a project for Nakamoto\n\nAs of [version 2.11.0](https://github.com/hirosystems/clarinet/releases/tag/v2.11.0), Clarinet runs\nin epoch 3.0 (Nakamoto) by default.\n\n- Contracts are set to be deployed in epoch 3.0 and support Clarity 3.\n- The Devnet runs the latest Stacks blockchain version by default, enabling Nakamoto and support\n Clarity 3 contracts.\n\nOnce the Devnet reaches the right block height, (Bitcoin block #108 by default), it will deploy the\n_`pox-4.clar`_ contract and run in Epoch 2.5. From there, Clarinet will send _`stack-stx`_ and\n_`stack-extend`_ requests to the new PoX contract. Eventually, you can observe the\n_`vote-for-aggregate-public-key`_ transactions that they send.\n\n**At Bitcoin block #142, the Devnet will switch the epoch 3.0.**\n\nAt the end of the _`Devnet.toml`_ file, you must make sure that the _`pox_stacking_orders`_ are properly\nset. You should have 3 stacking orders from 3 different accounts. All should start at **cycle 1**\nand take at least **2 slots**. You also need to enable the _`auto-extend`_ property. Because Nakamoto\nrelies on the Stackers to sign blocks, these settings ensure that there are engouh stacked STX for\neach cycles. Here is what it looks like by default in new projects:\n\n```toml\n# settings/Devnet.toml\n[[devnet.pox_stacking_orders]]\nstart_at_cycle = 1\nduration = 10\nauto_extend = true\nwallet = \"wallet_1\"\nslots = 2\nbtc_address = \"mr1iPkD9N3RJZZxXRk7xF9d36gffa6exNC\"\n\n[[devnet.pox_stacking_orders]]\nstart_at_cycle = 1\nduration = 10\nauto_extend = true\nwallet = \"wallet_2\"\nslots = 2\nbtc_address = \"muYdXKmX9bByAueDe6KFfHd5Ff1gdN9ErG\"\n\n[[devnet.pox_stacking_orders]]\nstart_at_cycle = 1\nduration = 10\nauto_extend = true\nwallet = \"wallet_3\"\nslots = 2\nbtc_address = \"mvZtbibDAAA3WLpY7zXXFqRa3T4XSknBX7\"\n```\n\nSet a contract to be deployed in epoch 3.0 with Clarity 3. You can create a new one with\n`$ clarinet contract new <contract-name>`). It needs to be manually update in the project manifest\n(Clarinet.toml)\n\n```toml\n# Clarinet.toml\n[contracts.nakademo]\npath = 'contracts/nakademo.clar'\nclarity_version = 3\nepoch = 3.0\n```\n\nStart Devnet with `clarinet devnet start`, you should see epoch 3.0 and fast blocks at Bitcoin\nblock 142.\n\n<Callout title=\"New Clarity keywords\">\nClarity 3 introduces two new keywords after the Nakamoto hard fork:\n\n- `tenure-height`: Returns the number of tenures passed.\n- `stacks-block-height`: Returns the current Stacks block height.\n\nNote: `block-height` is removed.\n\nFor more details on these and other Clarity keywords, see the [Clarity Keywords Reference](https://docs.stacks.co/reference/keywords).\n</Callout>"],[83,"\n## Type Definition\n\n```clarity\n{label-0: value-type-0, label-1: value-type-1, ...}\n```\n\n- Input: `various types`\n- Output: `tuple`\n\n## Why it matters\n\nThe `tuple` type is crucial for:\n\n1. Grouping related data values with named fields.\n2. Implementing complex data structures in smart contracts.\n3. Ensuring data integrity by providing a clear structure for related values.\n4. Simplifying the process of handling grouped data in smart contracts.\n\n## When to use it\n\nUse `tuple` when you need to:\n\n- Group related data values with named fields.\n- Implement complex data structures in your smart contract.\n- Ensure data integrity by providing a clear structure for related values.\n- Handle grouped data in your smart contract.\n\n## Best Practices\n\n- Use descriptive names for tuple fields for better readability.\n- Ensure the types of the tuple fields are appropriate for the data they represent.\n- Combine with other data types and functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Using Tuples to Store User Information\n\nLet's implement a function that stores and retrieves user information using tuples:\n\n```clarity\n(define-map UserInfo { userId: principal } { name: (string-ascii 20), age: uint })\n\n(define-public (set-user-info (user principal) (name (string-ascii 20)) (age uint))\n (begin\n (map-set UserInfo { userId: user } { name: name, age: age })\n (ok true)\n )\n)\n\n(define-read-only (get-user-info (user principal))\n (map-get? UserInfo { userId: user })\n)\n\n;; Usage\n(set-user-info tx-sender \"Alice\" u30) ;; Sets the user info\n(get-user-info tx-sender) ;; Returns (some { name: \"Alice\", age: u30 })\n```\n\nThis example demonstrates:\n1. Using tuples to store user information with named fields.\n2. Implementing functions to set and get user information using tuples.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using non-descriptive names for tuple fields, causing confusion.\n2. Assuming the tuple structure will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-set`: Sets a value in a map.\n- `map-get?`: Retrieves a value from a map.\n- `default-to`: Provides a default value if an optional is `none`.\n\n## Conclusion\n\nThe `tuple` type is a fundamental tool for grouping related data values with named fields in Clarity smart contracts. It allows you to implement complex data structures, ensuring data integrity and simplifying data management. When used effectively, `tuple` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle grouped data.\n"],[220,"\n## What's new\n\n### Introducing a fresh view for blocks\n\nThe Stacks Explorer now features a new way to display blocks, aligning with the Nakamoto upgrade's approach of multiple STX blocks settling into one BTC block.\n\n![Block View](../images/nakamoto-explorer.png)\n\n### Tailored viewing experience\n\nThis new view is now live on both [testnet](https://explorer.hiro.so/?chain=testnet) and [mainnet](https://explorer.hiro.so/?chain=mainnet), accessible via the network dropdown.\n\n#### Two distinctive display modes\n\n1. **Independent Display:** Focuses on STX blocks progress.\n2. **COMING SOON—Grouped by Bitcoin Block:** Shows BTC blocks flow alongside STX blocks.\n\n![Block View](../images/group-by-block.png)\n\n### Stay in the loop with live view\n\nKeep up-to-date with blocks in real-time with our new live view option.\n"],[223,"\n## What's new\n\n### StackingClient\n\nInstall the latest nakamoto version with `npm install @stacks/stacking@latest`.\n\nThe StackingClient in `@stacks/stacking` was updated to match the latest `pox-4` contract.\n\n- Added `StackingClient.signPoxSignature()`\n- Added `Pox4SignatureTopic` enum\n- New stacking arguments for `StackingClient.stack`, `StackingClient.stackExtend`, `StackingClient.stackIncrease`, `StackingClient.stackAggregationCommit`, `StackingClient.stackAggregationCommitIndexed`, and `StackingClient.stackAggregationIncrease`\n\n### Nakamoto network\n\nTo test using the Nakamoto testnet, you can use the `StacksTestnet` network with a custom URL. The Nakamoto testnet is being hosted at https://api.testnet.hiro.so. Use this URL like this:\n\n```tsx\nimport { StacksTestnet } from \"@stacks/network\"\n\nconst network = new StacksTestnet({\n url: \"https://api.testnet.hiro.so\"\n})\n```\n\n#### Example snippets\n\n**`StackingClient.signPoxSignature`**\n\n```ts\nconst client = StackingClient(MY_ADDRESS, new StacksTestnet())\n```\n\n```ts\nconst signature = client.signPoxSignature({\n topic: \"stack-stx\",\n rewardCycle: await client.getPoxInfo().reward_cycle_id,\n poxAddress: MY_BTC_ADDRESS,\n period: 2,\n maxAmount: 10_000_000_000_000,\n authId: 123n,\n\n signerPrivateKey: MY_SIGNER_PRIVATE_KEY\n})\n```\n\n**New arguments for e.g. `StackingClient.stack`**\n\n```ts\nconst { txid } = await client.stack({\n amountMicroStx: 10_000_000_000_000, // this can be at most the signature `maxAmount`\n poxAddress: MY_BTC_ADDRESS,\n cycles: 2, // this needs to match signature `period`\n burnBlockHeight: CURRENT_BURN_BLOCK_HEIGHT,\n\n // NEW ARGS\n signerKey: MY_SIGNER_PUBLIC_KEY,\n signerSignature: signature,\n maxAmount: 10_000_000_000_000,\n authId: 123n,\n\n privateKey: MY_STX_PRIVATE_KEY\n})\n```\n"],[222,"\n## What's new\n\n<Callout title=\"Note\" type=\"info\">\n The `/extended/v2/*` endpoints represent the modern API that is being\n continually expanded to support the Nakamoto upgrade. We encourage developers\n to use v2 endpoints for new developments. Be aware that `/extended/v1/*` are\n the older set of endpoints. Though they continue to function alongside v2, they will be deprecated in the coming months.\n</Callout>\n\n### Nakamoto endpoints\n\nThe Stacks Blockchain API has a series of new endpoints to support the upcoming Nakamoto upgrade:\n\n- Get Proof-of-Transfer details per Cycle, including Signers and Stackers, with information about stacked STX amounts, payout addresses and signer weights\n- Get a list of Stacks blocks per Bitcoin block to support the new Nakamoto mining mechanism\n- Get all transactions relevant to a STX address or contract ID, including filters for FT and NFT transfers\n- Support for the new Nakamoto `tenure_change` transaction type across all our transaction endpoints\n- Get a summary of current network mempool transaction fees, including statistics for expected confirmation priorities\n- Get the deployment status of multiple smart contracts in one call\n\nAll of these endpoints are backwards compatible with Stacks nodes running version 2.4 or earlier\n\n### Event replay optimizations\n\n- Optimize replay speed by creating a new parquet-based ingestion that optimizes for canonical chain information\n- Optimize classic TSV event replay by improving block ingestion times\n\n### New transaction type `tenure_change`\n\nThis new type affects the following endpoints:\n\n- `/extended/v1/address/{principal}/transactions`\n- `/extended/v1/tx`\n- `/extended/v1/tx/{tx_id}`\n- `/extended/v1/tx/{tx_id}/raw`\n- `/extended/v1/tx/mempool`\n- `/extended/v1/tx/multiple`\n\n### New endpoints: `/extended/v2/*`\n\nOne important difference to note between the `/extended/v1` vs the `/extended/v2` endpoints is that the /extended/v2/_ endpoints represent the current API that is being continually expanded to support the Nakamoto upgrade. We encourage developers to use v2 endpoints for new developments. Be aware that /extended/v1/_ are the older set of endpoints. Though they continue to function alongside v2, they will be deprecated in the coming months.\n\n- `/extended/v2/mempool/fees`\n- `/extended/v2/burn-blocks`\n- `/extended/v2/burn-blocks/{height_or_hash}`\n- `/extended/v2/burn-blocks/{height_or_hash}/blocks`\n- `/extended/v2/blocks`\n- `/extended/v2/blocks/{height_or_hash}`\n- `/extended/v2/blocks/{height_or_hash}/transactions`\n- `/extended/v2/addresses/{address}/transactions:`\n- `/extended/v2/addresses/{address}/transactions/{tx_id}/events:`\n- `/extended/v2/smart-contracts/status`\n- `/extended/v2/pox/cycles`\n- `/extended/v2/pox/cycles/{cycle_number}`\n- `/extended/v2/pox/cycles/{cycle_number}/signers`\n- `/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}`\n- `/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}/stackers`\n\n### Deprecated endpoints\n\n- `/extended/v1/block`\n- `/extended/v1/block/{hash}`\n- `/extended/v1/block/by_height/{height}`\n- `/extended/v1/block/by_burn_block_hash/{burn_block_hash}`\n- `/extended/v1/block/by_burn_block_height/{burn_block_height}`\n- `/extended/v1/address/{principal}/transactions`\n- `/extended/v1/address/{principal}/{tx_id}/with_transfers`\n- `/extended/v1/address/{principal}/transactions_with_transfers`\n- `/extended/v1/fee_rate`\n- `/extended/v1/tx/block/{block_hash}`\n- `/extended/v1/tx/block_height/{height}`\n\nView the [API reference](/stacks/api/info).\n"],[17,"\n## Where to download archives\n\nStacks blockchain archives for each network can be found at the following locations:\n\n- mainnet: https://archive.hiro.so/mainnet/stacks-blockchain/\n- testnet: https://archive.hiro.so/testnet/stacks-blockchain/\n\nThe file name patterns are as follows:\n\n- archive: `<NETWORK>-stacks-blockchain-<VERSION>-<DATE(YYYYMMDD)>.tar.gz`\n- shasum: `<NETWORK>-stacks-blockchain-<VERSION>-<DATE(YYYYMMDD)>.sha256`\n\nThere is a continually updated archive and shasum which always points to the most recent upload:\n\n- archive: `<NETWORK>-stacks-blockchain-latest.tar.gz`\n- shasum: `<NETWORK>-stacks-blockchain-latest.sha256`\n\nor the most recent upload for a particular version:\n\n- archive: `<NETWORK>-stacks-blockchain-2.3.0.0.2-latest.tar.gz`\n- shasum: `<NETWORK>-stacks-blockchain-2.3.0.0.2-latest.sha256`\n\n## Restoring a Stacks blockchain node using the Hiro Archive\n\n1. Download the archive and shasum for the appropriate network.\n1. [Verify the archive](/stacks/archive/guides/verify-archive-data) with the shasum.\n1. Extract the archive into the desired directory:\n ```terminal\n $ tar -zxvf <ARCHIVE FILE> -C /target/directory\n ```\n1. [Configure the `working_dir` property](https://docs.stacks.co/docs/nodes-and-miners/stacks-node-configuration#node) in your Stacks blockchain node Config.toml file to match the directory you extracted the archive to.\n1. Launch your Stacks blockchain node. You can use [one of these example configuration files](https://github.com/stacks-network/stacks-blockchain/tree/master/testnet/stacks-node/conf) as a reference.\n1. Verify the dataset is being used by comparing your nodes [local block height](http://localhost:20443/v2/info) with [Hiro's](https://api.hiro.so/v2/info). If the block height matches or is close to Hiro's block height, the restoration was successful.\n 1. It may take a few minutes for the local node to respond on this endpoint.\n 1. Your block height may be up to a few hundred blocks away from Hiro's depending on the age of the archive. It should catch up relatively quickly.\n"],[461,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/', method: 'get' }]}\n hasHead={false}\n/>"],[497,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/', method: 'get' }]}\n hasHead={false}\n/>"],[452,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/activity', method: 'get' }]}\n hasHead={false}\n/>\n"],[489,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/activity', method: 'get' }]}\n hasHead={false}\n/>\n"],[449,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/balances/{address}', method: 'get' }]}\n hasHead={false}\n/>"],[486,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/balances/{address}', method: 'get' }]}\n hasHead={false}\n/>"],[451,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens', method: 'get' }]}\n hasHead={false}\n/>"],[488,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens', method: 'get' }]}\n hasHead={false}\n/>"],[450,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens/{ticker}', method: 'get' }]}\n hasHead={false}\n/>"],[487,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens/{ticker}', method: 'get' }]}\n hasHead={false}\n/>"],[447,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens/{ticker}/holders', method: 'get' }]}\n hasHead={false}\n/>"],[484,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens/{ticker}/holders', method: 'get' }]}\n hasHead={false}\n/>"],[455,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions', method: 'get' }]}\n hasHead={false}\n/>"],[492,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions', method: 'get' }]}\n hasHead={false}\n/>"],[458,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}', method: 'get' }]}\n hasHead={false}\n/>"],[495,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}', method: 'get' }]}\n hasHead={false}\n/>"],[456,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}/content', method: 'get' }]}\n hasHead={false}\n/>"],[493,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}/content', method: 'get' }]}\n hasHead={false}\n/>"],[454,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}/transfers', method: 'get' }]}\n hasHead={false}\n/>"],[491,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}/transfers', method: 'get' }]}\n hasHead={false}\n/>"],[457,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/transfers', method: 'get' }]}\n hasHead={false}\n/>"],[494,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/transfers', method: 'get' }]}\n hasHead={false}\n/>"],[464,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/sats/{ordinal}', method: 'get' }]}\n hasHead={false}\n/>"],[499,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/sats/{ordinal}', method: 'get' }]}\n hasHead={false}\n/>"],[465,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/sats/{ordinal}/inscriptions', method: 'get' }]}\n hasHead={false}\n/>\n"],[500,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/sats/{ordinal}/inscriptions', method: 'get' }]}\n hasHead={false}\n/>\n"],[446,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/stats/inscriptions', method: 'get' }]}\n hasHead={false}\n/>"],[483,"\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/stats/inscriptions', method: 'get' }]}\n hasHead={false}\n/>"],[32,"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/bitcoin-node/{*}', method: 'get' }]}\n hasHead={false}\n/>"],[37,"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks', method: 'get' }]}\n hasHead={false}\n/>"],[38,"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks', method: 'post' }]}\n hasHead={false}\n/>"],[42,"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks/{chainhookUuid}', method: 'delete' }]}\n hasHead={false}\n/>"],[39,"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks/{chainhookUuid}', method: 'get' }]}\n hasHead={false}\n/>"],[41,"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks/{chainhookUuid}', method: 'put' }]}\n hasHead={false}\n/>"],[43,"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks/{chainhookUuid}/status', method: 'get' }]}\n hasHead={false}\n/>"],[34,"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/devnet', method: 'delete' }]}\n hasHead={false}\n/>"],[35,"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/devnet/{projectName}', method: 'put' }]}\n hasHead={false}\n/>"],[36,"\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/stacks-blockchain-api/{*}', method: 'get' }]}\n hasHead={false}\n/>"],[429,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/', method: 'get' }]}\n hasHead={false}\n/>"],[469,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/', method: 'get' }]}\n hasHead={false}\n/>"],[430,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/addresses/{address}/balances', method: 'get' }]}\n hasHead={false}\n/>"],[470,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/addresses/{address}/balances', method: 'get' }]}\n hasHead={false}\n/>"],[437,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/blocks/{block}/activity', method: 'get' }]}\n hasHead={false}\n/>"],[477,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/blocks/{block}/activity', method: 'get' }]}\n hasHead={false}\n/>"],[441,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings', method: 'get' }]}\n hasHead={false}\n/>"],[480,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings', method: 'get' }]}\n hasHead={false}\n/>"],[442,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}', method: 'get' }]}\n hasHead={false}\n/>"],[481,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}', method: 'get' }]}\n hasHead={false}\n/>"],[438,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/activity', method: 'get' }]}\n hasHead={false}\n/>"],[478,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/activity', method: 'get' }]}\n hasHead={false}\n/>"],[436,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/activity/{address}', method: 'get' }]}\n hasHead={false}\n/>"],[476,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/activity/{address}', method: 'get' }]}\n hasHead={false}\n/>"],[433,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/holders', method: 'get' }]}\n hasHead={false}\n/>"],[473,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/holders', method: 'get' }]}\n hasHead={false}\n/>"],[432,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/holders/{address}', method: 'get' }]}\n hasHead={false}\n/>"],[472,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/holders/{address}', method: 'get' }]}\n hasHead={false}\n/>"],[435,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/transactions/{tx_id}/activity', method: 'get' }]}\n hasHead={false}\n/>"],[475,"\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/transactions/{tx_id}/activity', method: 'get' }]}\n hasHead={false}\n/>"],[210,"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/', method: 'get' }]}\n hasHead={false}\n/>"],[212,"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/metrics', method: 'get' }]}\n hasHead={false}\n/>"],[218,"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/block_proposals', method: 'get' }]}\n hasHead={false}\n/>"],[216,"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/block_proposals/{block_hash}', method: 'get' }]}\n hasHead={false}\n/>"],[207,"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/blocks', method: 'get' }]}\n hasHead={false}\n/>"],[206,"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/blocks/{height_or_hash}', method: 'get' }]}\n hasHead={false}\n/>"],[215,"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/cycles/{cycle_number}/signers', method: 'get' }]}\n hasHead={false}\n/>"],[214,"\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/cycles/{cycle_number}/signers/{signer_id}', method: 'get' }]}\n hasHead={false}\n/>"],[301,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended', method: 'get' }]}\n hasHead={false}\n/>\n"],[308,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{address}/mempool', method: 'get' }]}\n hasHead={false}\n/>"],[325,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/{tx_id}/with_transfers', method: 'get' }]}\n hasHead={false}\n/>\n"],[324,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/assets', method: 'get' }]}\n hasHead={false}\n/>"],[321,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/balances', method: 'get' }]}\n hasHead={false}\n/>\n"],[323,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/nft_events', method: 'get' }]}\n hasHead={false}\n/>\n"],[326,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/nonces', method: 'get' }]}\n hasHead={false}\n/>\n"],[328,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/stx_inbound', method: 'get' }]}\n hasHead={false}\n/>\n"],[327,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/stx', method: 'get' }]}\n hasHead={false}\n/>\n"],[320,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/transactions_with_transfers', method: 'get' }]}\n hasHead={false}\n/>\n"],[322,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/transactions', method: 'get' }]}\n hasHead={false}\n/>\n"],[261,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/block/', method: 'get' }]}\n hasHead={false}\n/>\n"],[262,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/block/{hash}', method: 'get' }]}\n hasHead={false}\n/>"],[268,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/block/by_burn_block_hash/{burn_block_hash}', method: 'get' }]}\n hasHead={false}\n/>"],[265,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/block/by_burn_block_height/{burn_block_height}', method: 'get' }]}\n hasHead={false}\n/>"],[269,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/block/by_height/{height}', method: 'get' }]}\n hasHead={false}\n/>"],[284,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/burnchain/reward_slot_holders', method: 'get' }]}\n hasHead={false}\n/>\n"],[285,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/burnchain/reward_slot_holders/{address}', method: 'get' }]}\n hasHead={false}\n/>\n"],[281,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/burnchain/rewards', method: 'get' }]}\n hasHead={false}\n/>\n"],[283,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/burnchain/rewards/{address}', method: 'get' }]}\n hasHead={false}\n/>\n"],[286,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/burnchain/rewards/{address}/total', method: 'get' }]}\n hasHead={false}\n/>\n"],[332,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/contract/{contract_id}', method: 'get' }]}\n hasHead={false}\n/>\n"],[329,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/contract/{contract_id}/events', method: 'get' }]}\n hasHead={false}\n/>\n"],[330,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/contract/by_trait', method: 'get' }]}\n hasHead={false}\n/>\n"],[319,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/faucets/stx', method: 'post' }]}\n hasHead={false}\n/>\n"],[279,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/fee_rate/', method: 'post' }]}\n hasHead={false}\n/>"],[296,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/info/network_block_time/{network}', method: 'get' }]}\n hasHead={false}\n/>\n"],[298,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/info/network_block_times', method: 'get' }]}\n hasHead={false}\n/>\n"],[316,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/pox4/{pool_principal}/delegations/', method: 'get' }]}\n hasHead={false}\n/>\n"],[293,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/search/{id}', method: 'get' }]}\n hasHead={false}\n/>\n"],[295,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/stx_supply/', method: 'get' }]}\n hasHead={false}\n/>\n"],[297,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/stx_supply/circulating/plain', method: 'get' }]}\n hasHead={false}\n/>\n"],[302,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/stx_supply/legacy_format', method: 'get' }]}\n hasHead={false}\n/>\n"],[300,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/stx_supply/total/plain', method: 'get' }]}\n hasHead={false}\n/>\n"],[340,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tokens/ft/{token}/holders', method: 'get' }]}\n hasHead={false}\n/>\n"],[344,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tokens/nft/history', method: 'get' }]}\n hasHead={false}\n/>\n"],[342,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tokens/nft/holdings', method: 'get' }]}\n hasHead={false}\n/>\n"],[343,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tokens/nft/mints', method: 'get' }]}\n hasHead={false}\n/>\n"],[312,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/', method: 'get' }]}\n hasHead={false}\n/>"],[310,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/{tx_id}', method: 'get' }]}\n hasHead={false}\n/>"],[315,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/{tx_id}/raw', method: 'get' }]}\n hasHead={false}\n/>\n"],[305,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/events', method: 'get' }]}\n hasHead={false}\n/>\n"],[313,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/mempool', method: 'get' }]}\n hasHead={false}\n/>\n"],[309,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/mempool/dropped', method: 'get' }]}\n hasHead={false}\n/>\n"],[306,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/mempool/stats', method: 'get' }]}\n hasHead={false}\n/>\n\n"],[311,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/multiple', method: 'get' }]}\n hasHead={false}\n/>"],[303,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/addresses/{address}/transactions', method: 'get' }]}\n hasHead={false}\n/>\n"],[304,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/addresses/{address}/transactions/{tx_id}/events', method: 'get' }]}\n hasHead={false}\n/>\n"],[267,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/blocks/', method: 'get' }]}\n hasHead={false}\n/>\n"],[260,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/blocks/{height_or_hash}', method: 'get' }]}\n hasHead={false}\n/>\n"],[314,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/blocks/{height_or_hash}/transactions', method: 'get' }]}\n hasHead={false}\n/>"],[266,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/blocks/average-times', method: 'get' }]}\n hasHead={false}\n/>"],[338,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/burn-blocks/', method: 'get' }]}\n hasHead={false}\n/>\n"],[336,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/burn-blocks/{height_or_hash}', method: 'get' }]}\n hasHead={false}\n/>\n"],[264,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/burn-blocks/{height_or_hash}/blocks', method: 'get' }]}\n hasHead={false}\n/>\n"],[335,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/mempool/fees', method: 'get' }]}\n hasHead={false}\n/>"],[287,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/pox/cycles', method: 'get' }]}\n hasHead={false}\n/>\n"],[290,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/pox/cycles/{cycle_number}', method: 'get' }]}\n hasHead={false}\n/>\n"],[291,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/pox/cycles/{cycle_number}/signers', method: 'get' }]}\n hasHead={false}\n/>\n"],[289,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}', method: 'get' }]}\n hasHead={false}\n/>\n"],[292,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}/stackers', method: 'get' }]}\n hasHead={false}\n/>\n"],[333,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/smart-contracts/status', method: 'get' }]}\n hasHead={false}\n/>\n"],[274,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/addresses/{blockchain}/{address}', method: 'get' }]}\n hasHead={false}\n/>\n"],[270,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/names/', method: 'get' }]}\n hasHead={false}\n/>\n"],[277,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/names/{name}', method: 'get' }]}\n hasHead={false}\n/>\n"],[271,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/names/{name}/subdomains', method: 'get' }]}\n hasHead={false}\n/>\n"],[272,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/names/{name}/zonefile', method: 'get' }]}\n hasHead={false}\n/>\n"],[278,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/names/{name}/zonefile/{zoneFileHash}', method: 'get' }]}\n hasHead={false}\n/>\n"],[276,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/namespaces/', method: 'get' }]}\n hasHead={false}\n/>\n"],[275,"\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/namespaces/{tld}/names', method: 'get' }]}\n hasHead={false}\n/>\n"],[405,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/accounts/{principal}', method: 'get' }]}\n hasHead={false}\n/>"],[389,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/block_proposal', method: 'post' }]}\n hasHead={false}\n/>"],[418,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/burn_ops/{burn_height}/{op_type}', method: 'get' }]}\n hasHead={false}\n/>"],[416,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/constant_val/{contract_address}/{contract_name}/{constant_name}', method: 'get' }]}\n hasHead={false}\n/>"],[414,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/contracts/call-read/{contract_address}/{contract_name}/{function_name}', method: 'post' }]}\n hasHead={false}\n/>"],[410,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/contracts/interface/{contract_address}/{contract_name}', method: 'get' }]}\n hasHead={false}\n/>"],[415,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/contracts/source/{contract_address}/{contract_name}', method: 'get' }]}\n hasHead={false}\n/>"],[396,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/fees/transaction', method: 'post' }]}\n hasHead={false}\n/>"],[398,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/fees/transfer', method: 'get' }]}\n hasHead={false}\n/>"],[401,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/info', method: 'get' }]}\n hasHead={false}\n/>"],[413,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/map_entry/{contract_address}/{contract_name}/{map_name}', method: 'post' }]}\n hasHead={false}\n/>"],[392,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/pox', method: 'get' }]}\n hasHead={false}\n/>"],[395,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/prices/names/{name}', method: 'get' }]}\n hasHead={false}\n/>"],[393,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/prices/namespaces/{tld}', method: 'get' }]}\n hasHead={false}\n/>"],[391,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/stacker_set/{cycle_number}', method: 'get' }]}\n hasHead={false}\n/>"],[411,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/traits/{contract_address}/{contract_name}/{trait_contract_address}/{trait_contract_name}/{trait_name}', method: 'get' }]}\n hasHead={false}\n/>"],[402,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/transactions', method: 'post' }]}\n hasHead={false}\n/>"],[408,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v3/blocks/{block_id}', method: 'get' }]}\n hasHead={false}\n/>"],[409,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v3/tenures/{block_id}', method: 'get' }]}\n hasHead={false}\n/>"],[407,"\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v3/tenures/info', method: 'get' }]}\n hasHead={false}\n/>"],[57,"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/', method: 'get' }]}\n hasHead={false}\n/>"],[249,"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/', method: 'get' }]}\n hasHead={false}\n/>"],[62,"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/ft', method: 'get' }]}\n hasHead={false}\n/>"],[253,"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/ft', method: 'get' }]}\n hasHead={false}\n/>"],[60,"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/ft/{principal}', method: 'get' }]}\n hasHead={false}\n/>"],[251,"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/ft/{principal}', method: 'get' }]}\n hasHead={false}\n/>"],[63,"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/nft/{principal}/{token_id}', method: 'get' }]}\n hasHead={false}\n/>"],[254,"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/nft/{principal}/{token_id}', method: 'get' }]}\n hasHead={false}\n/>"],[61,"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/sft/{principal}/{token_id}', method: 'get' }]}\n hasHead={false}\n/>"],[252,"\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/sft/{principal}/{token_id}', method: 'get' }]}\n hasHead={false}\n/>"],[10,"\n<Callout type=\"warn\">\n The SDK requires Node.js >= 18.0 and NPM to be installed.\n</Callout>\n\n```package-install\n@hirosystems/clarinet-sdk\n```\n"],[156,"\n<Callout>\nIn Clarity 3, this function is being deprecated for [`get-stacks-block-info?`](/stacks/clarity/functions/get-stacks-block-info).\n</Callout>\n\n## Function Signature\n\n```clarity\n(get-block-info? prop-name block-height)\n```\n\n- Input: \n - `prop-name`: A BlockInfoPropertyName\n - `block-height`: A uint representing the Stacks block height\n- Output: `(optional buff) | (optional uint) | (optional principal)` depending on the property\n\n## Why it matters\n\nThe `get-block-info?` function is crucial for:\n\n1. Accessing historical block data within smart contracts.\n2. Implementing time-based logic using block information.\n3. Verifying block-related properties for security or validation purposes.\n4. Building applications that need to reference specific blockchain states.\n\n## When to use it\n\nUse `get-block-info?` when you need to:\n\n- Retrieve information about past Stacks blocks.\n- Implement logic that depends on block times or miner information.\n- Verify block hashes or other block-specific data.\n- Access block rewards or miner spending data (in Stacks 2.1+).\n\n## Best Practices\n\n- Always check if the returned value is `none`, as it will be for non-existent or future blocks.\n- Be aware of the potential for chain reorganizations when using recent block data.\n- Use the appropriate property name for the data you need to retrieve.\n- Consider caching results for frequently accessed block information to save on execution costs.\n\n## Practical Example: Block Time Verification\n\nLet's implement a function that checks if a given block was mined after a certain time:\n\n```clarity\n(define-read-only (block-after-time? (blockHeight uint) (targetTime uint))\n (match (get-block-info? time blockHeight) time\n (> time targetTime)\n false\n )\n)\n\n;; Usage\n(block-after-time? u100 u1600000000) ;; Returns true if block 100 was mined after Unix timestamp 1600000000\n```\n\nThis example demonstrates:\n1. Using `get-block-info?` to retrieve the `time` property of a block.\n2. Handling the optional return value with `match`.\n3. Comparing the block time to a target time.\n\n## Available Properties\n\n- `burnchain-header-hash`: Returns the burnchain block header hash (buff 32).\n- `id-header-hash`: Returns the Stacks block's index block hash (buff 32).\n- `header-hash`: Returns the Stacks block's header hash (buff 32).\n- `miner-address`: Returns the block miner's principal.\n- `time`: Returns the block time as a Unix epoch timestamp (uint).\n\nNew in Stacks 2.1:\n- `block-reward`: Returns the total block reward (uint).\n- `miner-spend-total`: Returns the total spent by miners for this block (uint).\n\n## Common Pitfalls\n\n1. Assuming all properties are available for all blocks (e.g., `block-reward` is only available for mature blocks).\n2. Not handling the `none` case when the block height is invalid or in the future.\n3. Relying on exact block times, which can be inaccurate up to two hours.\n4. Using `header-hash` when global uniqueness is required (use `id-header-hash` instead).\n\n## Related Functions\n\n- `get-burn-block-info?`: Used to get information about the underlying burn chain blocks.\n- `block-height`: Keyword that returns the current block height.\n- `burn-block-height`: Keyword that returns the current burn chain block height.\n\n## Conclusion\n\nThe `get-block-info?` function is a powerful tool for accessing historical block data in Clarity smart contracts. It allows you to incorporate block-specific information into your contract logic, enabling a wide range of applications that can reference and utilize blockchain state. When used correctly, it provides valuable insights into the Stacks blockchain's history and can be used to implement sophisticated, time-aware contract behaviors.\n"],[104,"\n<Callout>\nIn Clarity 3, this function replaces the deprecated `get-block-info?` function.\n</Callout>\n\n## Function Signature\n\n```clarity\n(get-stacks-block-info? prop-name block-height)\n```\n\n- Input: \n - `prop-name`: A StacksBlockInfoPropertyName\n - `block-height`: A uint representing the Stacks block height\n- Output: `(optional buff) | (optional uint)` depending on the property\n\n## Why it matters\n\nThe `get-stacks-block-info?` function is crucial for:\n\n1. Accessing historical Stacks block data within smart contracts\n2. Retrieving globally unique block identifiers\n3. Implementing time-based logic using block information\n4. Verifying block-related properties for security or validation purposes\n\n## When to use it\n\nUse `get-stacks-block-info?` when you need to:\n\n- Retrieve unique identifiers for Stacks blocks\n- Access block timestamps for time-based logic\n- Verify block hashes for validation purposes\n- Implement logic that depends on block information\n\n## Best Practices\n\n- Always use `id-header-hash` when global uniqueness is required\n- Handle the `none` case for non-existent or future blocks\n- Be aware of the different timestamp sources before and after epoch 3.0\n- Consider caching frequently accessed block information\n\n## Practical Example: Block Hash Verification\n\n```clarity\n(define-read-only (verify-block-hash (blockHeight uint) (expectedHash (buff 32)))\n (match (get-stacks-block-info? id-header-hash blockHeight)\n hash (is-eq hash expectedHash)\n false\n )\n)\n\n;; Usage\n(verify-block-hash u100 0x374708fff7719dd5979ec875d56cd2286f6d3cf7ec317a3b25632aab28ec37bb)\n```\n\nThis example demonstrates:\n1. Retrieving a block's unique identifier\n2. Handling the optional return value\n3. Comparing block hashes for verification\n\n## Available Properties\n\n- `id-header-hash`: Returns the globally unique index block hash (buff 32)\n- `header-hash`: Returns the Stacks block's header hash (buff 32)\n- `time`: Returns the block time as Unix epoch timestamp (uint)\n\n## Common Pitfalls\n\n1. Using `header-hash` when global uniqueness is required (use `id-header-hash` instead)\n2. Not handling the `none` case for invalid or future block heights\n3. Assuming block times are exact (accuracy varies by epoch):\n - Pre-epoch 3.0: Accurate within two hours\n - Post-epoch 3.0: Must be greater than previous block and at most 15 seconds in the future\n4. Not considering the different timestamp sources across epochs\n\n## Related Functions\n\n- `get-tenure-info?`: Used to get information about block tenures\n- `block-height`: Returns the current block height\n- `at-block`: Used with `id-header-hash` for historical state access\n\n## Conclusion\n\nThe `get-stacks-block-info?` function, introduced in Clarity 3, provides essential access to Stacks block data in smart contracts. This function offers reliable ways to access block identifiers and timestamps, with important considerations for global uniqueness and time accuracy across different epochs. Understanding its properties and limitations is crucial for building robust smart contracts that interact with historical blockchain state.\n\n"],[380,"\n<Tabs defaultValue=\"macos\">\n <TabsList>\n <TabsTrigger value=\"macos\">macOS</TabsTrigger>\n <TabsTrigger value=\"linux\">Linux</TabsTrigger>\n <TabsTrigger value=\"windows\">Windows</TabsTrigger>\n <TabsTrigger value=\"cargo\">Using Cargo</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"macos\">\n ```terminal\n $ brew install chainhook\n ```\n </TabsContent>\n\n <TabsContent value=\"linux\">\n ```terminal\n $ sudo snap install chainhook\n ```\n </TabsContent>\n\n <TabsContent value=\"windows\">\n ```terminal\n $ winget install HiroSystems.Chainhook\n ```\n </TabsContent>\n\n <TabsContent value=\"cargo\">\n Clone the [Chainhook Repo](https://github.com/hirosystems/chainhook):\n\n ```terminal\n $ git clone https://github.com/hirosystems/chainhook.git\n ```\n\n Navigate to the root directory and run `cargo chainhook-install`:\n\n ```terminal\n $ cd chainhook && cargo chainhook-install\n ```\n </TabsContent>\n</Tabs>"],[444,"\nAfter installing and configuring your environment, you can run the Ordinals Explorer locally if you wish by running the followning `npm` command:\n\n`npm run dev`\n\n## Building for production\n\nYou may also build a production version of the Ordinals Explorer. To do that, simply run the following command:\n\n`npm run build`\n\n<Callout title=\"Note\" type=\"info\">\n Running `npm run build` also run the default next.js build task.\n</Callout>\n"],[426,"\nAfter installing and configuring your environment, you can run the Ordinals Explorer locally if you wish by running the followning `npm` command:\n\n`npm run dev`\n\n## Building for production\n\nYou may also build a production version of the Ordinals Explorer. To do that, simply run the following command:\n\n`npm run build`\n\n<Callout>\n Running `npm run build` also run the default next.js build task.\n</Callout>\n"],[16,"\nAll datasets have an associated SHA256 hash file which can be used to verify the integrity of the downloaded dataset.\nAs some of the archives are quite large, this is useful to ensure the file you've downloaded matches the file maintained in the Hiro Archive.\n\nAfter downloading an archive file and its associated shasum file, you can verify the integrity of the archive file like so:\n\n```terminal\n$ echo \"$(cat <SHASUM FILE> | awk '{print $1}') <ARCHIVE FILE>\" | shasum --check\n<ARCHIVE FILE>: OK\n\n$ echo \"$(cat mainnet-stacks-blockchain-api-latest.sha256 | awk '{print $1}') mainnet-stacks-blockchain-api-latest.gz\" | shasum --check\n\nmainnet-stacks-blockchain-api-latest.gz: OK\n\n# Otherwise a log will be printed indicating failure\nmainnet-stacks-blockchain-api-latest.gz: FAILED\nshasum: WARNING: 1 computed checksum did NOT match\n```\n\n<Callout title=\"Note\" type=\"warn\">\nIf the integrity check fails for any reason, you may need to delete the local archive and re-attempt the download. If issues persist, switch to a different network and try again.\n</Callout>"],[76,"\nBit manipulation functions in Clarity provide powerful tools for efficient data storage and flag management in smart contracts. These functions allow developers to pack multiple pieces of information into a single integer, saving storage space and potentially reducing gas costs.\n\n## Why these functions matter\n\nClarity's bit manipulation functions are designed with several important considerations in mind:\n\n1. Efficiency: They allow for compact data storage, potentially reducing contract storage costs.\n2. Versatility: These functions enable the implementation of bitfields, flags, and other low-level data structures.\n3. Performance: Bit operations are generally faster than higher-level data manipulations.\n4. Interoperability: They facilitate working with data from other systems that use bitwise representations.\n\n## Core Bit Manipulation Functions\n\n### 1. bit-and\n\n**What**: Performs a bitwise AND operation on two or more integers.\n**Why**: Useful for checking if specific bits are set or for clearing certain bits.\n**When**: Use when you need to isolate specific bits or apply a bitmask.\n**How**: \n```clarity\n(bit-and i1 i2...)\n```\n\n**Best Practices**: \n- Use to check if a specific flag is set in a bitfield.\n- Combine with bit-or for more complex flag manipulations.\n\n**Example Use Case**: Checking if a user has a specific permission in a compact permission system.\n\n```clarity\n(define-constant PERMISSION_READ u1) ;; 0001\n(define-constant PERMISSION_WRITE u2) ;; 0010\n(define-constant PERMISSION_EXEC u4) ;; 0100\n\n(define-public (has-permission? (user-permissions uint) (required-permission uint))\n (is-eq (bit-and user-permissions required-permission) required-permission))\n\n;; Usage\n(has-permission? u3 PERMISSION_READ) ;; Returns true (3 & 1 == 1)\n(has-permission? u3 PERMISSION_EXEC) ;; Returns false (3 & 4 == 0)\n```\n\n### 2. bit-or\n\n**What**: Performs a bitwise OR operation on two or more integers.\n**Why**: Useful for setting specific bits or combining flags.\n**When**: Use when you need to add flags or set specific bits.\n**How**: \n```clarity\n(bit-or i1 i2...)\n```\n\n**Best Practices**: \n- Use to add new permissions or flags to an existing set.\n- Combine with bit-and for more complex flag manipulations.\n\n**Example Use Case**: Adding a new permission to a user's existing permissions.\n\n```clarity\n(define-public (add-permission (current-permissions uint) (new-permission uint))\n (ok (bit-or current-permissions new-permission)))\n\n;; Usage\n(add-permission u3 PERMISSION_EXEC) ;; Returns (ok u7)\n```\n\n### 3. bit-not\n\n**What**: Performs a bitwise NOT operation on an integer.\n**Why**: Useful for inverting all bits in a value.\n**When**: Use when you need to flip all bits or create a bitmask.\n**How**: \n```clarity\n(bit-not i1)\n```\n\n**Best Practices**: \n- Use carefully with signed integers, as it affects the sign bit.\n- Combine with bit-and to clear specific bits.\n\n**Example Use Case**: Creating a bitmask to clear specific permissions.\n\n```clarity\n(define-public (remove-permission (current-permissions uint) (permission-to-remove uint))\n (ok (bit-and current-permissions (bit-not permission-to-remove))))\n\n;; Usage\n(remove-permission u7 PERMISSION_WRITE) ;; Returns (ok u5)\n```\n\n## Practical Example: Compact User Profile Flags\n\nLet's implement a system that stores multiple user profile settings in a single integer using bit flags:\n\n```clarity\n(define-constant SETTING_NEWSLETTER u1) ;; 0001\n(define-constant SETTING_2FA u2) ;; 0010\n(define-constant SETTING_PRIVATE_PROFILE u4) ;; 0100\n(define-constant SETTING_DARK_MODE u8) ;; 1000\n\n(define-map user-settings principal uint)\n\n(define-public (update-setting (setting uint) (enabled bool))\n (let ((current-settings (default-to u0 (map-get? user-settings tx-sender))))\n (if enabled\n (map-set user-settings tx-sender (bit-or current-settings setting))\n (map-set user-settings tx-sender (bit-and current-settings (bit-not setting))))\n (ok true)))\n\n(define-read-only (has-setting? (user principal) (setting uint))\n (let ((user-settings (default-to u0 (map-get? user-settings user))))\n (is-eq (bit-and user-settings setting) setting)))\n\n(define-read-only (get-all-settings (user principal))\n (default-to u0 (map-get? user-settings user)))\n```\n\nThis example demonstrates:\n1. Using bit constants to define individual settings.\n2. Updating settings using bit-or to set flags and bit-and with bit-not to clear flags.\n3. Checking individual settings with bit-and.\n4. Storing all user settings compactly in a single uint.\n\n## Conclusion\n\nBit manipulation functions in Clarity provide powerful tools for efficient data storage and flag management in smart contracts. By understanding when and how to use these functions, developers can create more storage-efficient contracts and implement complex flag systems with ease. Always consider the trade-off between storage efficiency and code readability when using these techniques.\n"],[202,"\nBlock info functions in Clarity provide crucial tools for implementing time-based logic in smart contracts. These functions allow developers to create contracts that can respond to the passage of time and changing blockchain states.\n\n## Why these functions matter\n\nClarity's block info functions are designed with blockchain-specific considerations in mind:\n\n1. Determinism: These functions provide a consistent view of time across all nodes, ensuring contract behavior is predictable.\n2. Security: By relying on block information rather than system time, contracts are protected against time-based manipulations.\n3. Flexibility: Developers can create time-locked features, scheduled events, and other time-dependent logic.\n4. Blockchain Awareness: Contracts can make decisions based on the current state of the blockchain.\n\n## Core Block Info Functions\n\n### 1. block-height\n\n**What**: Returns the current block height of the Stacks blockchain.\n**Why**: Essential for creating logic based on blockchain progression.\n**When**: Use when you need to trigger actions or changes based on block height milestones.\n**How**: \n```clarity\n(block-height)\n```\n\n**Best Practices**: \n- Use for long-term time measurements (hours/days) rather than short intervals.\n- Consider potential variations in block time when planning time-sensitive operations.\n\n**Example Use Case**: Implementing a phased token release schedule.\n\n```clarity\n(define-public (claim-tokens)\n (let ((release-height u100000))\n (if (>= block-height release-height)\n (ok (release-tokens))\n (err u1))))\n```\n\n### 2. burn-block-height\n\n**What**: Returns the current block height of the underlying burn chain (Bitcoin).\n**Why**: Provides a more stable time reference, as Bitcoin has more consistent block times.\n**When**: Use for more precise time-based logic or when synchronizing with Bitcoin network events.\n**How**: \n```clarity\n(burn-block-height)\n```\n\n**Best Practices**: \n- Prefer this over `block-height` for more accurate time estimations.\n- Remember that Bitcoin block times can still vary, so allow for some flexibility.\n\n**Example Use Case**: Creating a time-locked vault that opens after a specific Bitcoin block height.\n\n```clarity\n(define-constant unlock-height u700000)\n\n(define-public (withdraw-from-vault (amount uint))\n (if (>= burn-block-height unlock-height)\n (ok (transfer-tokens amount))\n (err u2)))\n```\n\n### 3. get-block-info?\n\n**What**: Retrieves information about a specific block.\n**Why**: Allows contracts to access historical block data for complex time-based logic.\n**When**: Use when you need to verify or act on information from past blocks.\n**How**: \n```clarity\n(get-block-info? property-name block-height-int)\n```\n\n**Best Practices**: \n- Cache retrieved information when possible to save processing costs.\n- Be aware of the limit on how far back you can query block information.\n\n**Example Use Case**: Implementing a reward system based on user activity in specific time periods.\n\n```clarity\n(define-public (claim-period-reward (period uint))\n (let ((period-end-height (get-period-end-height period))\n (current-winner (get-block-info? winner-id period-end-height)))\n (if (is-eq current-winner tx-sender)\n (ok (distribute-reward tx-sender))\n (err u3))))\n```\n\n### Practical Example: Token Balance Snapshot for Voting\n\nLet's implement a simple voting system where voting power is determined by a user's token balance at a specific \"snapshot\" block height. This example combines the use of `at-block` and `get-block-info?` functions to create a time-based voting mechanism.\n\n```clarity\n;; Define a simple token balance map\n(define-map token-balances principal uint)\n\n;; Define a map to store votes\n(define-map votes principal uint)\n\n;; Set a snapshot block height\n(define-data-var snapshot-height uint u100000)\n\n;; Function to get a user's balance at the snapshot height\n(define-read-only (get-snapshot-balance (user principal))\n (match (get-block-info? id-header-hash (var-get snapshot-height))\n snapshot-block (at-block snapshot-block\n (default-to u0 (map-get? token-balances user)))\n u0))\n\n;; Function to cast a vote\n(define-public (cast-vote (amount uint))\n (let \n ((snapshot-balance (get-snapshot-balance tx-sender))\n (current-votes (default-to u0 (map-get? votes tx-sender))))\n (asserts! (<= amount snapshot-balance) (err u1)) ;; Can't vote more than snapshot balance\n (asserts! (< (+ amount current-votes) (+ snapshot-balance u1)) (err u2)) ;; Prevent overflow\n (map-set votes tx-sender (+ amount current-votes))\n (ok true)))\n\n;; Function to check total votes\n(define-read-only (get-total-votes)\n (fold + (map-values votes) u0))\n```\n\n## Conclusion\n\nBlock info functions in Clarity provide powerful tools for implementing time-based logic in smart contracts. By understanding when and how to use these functions, developers can create contracts that respond dynamically to the progression of the blockchain, enabling features like time-locks, scheduled events, and historical data analysis. Always consider the specific requirements of your application and the potential for block time variations when implementing time-based logic using these block info functions."],[201,"\nClarity provides robust mechanisms for dealing with optional values and error cases. These features are crucial for writing secure and predictable smart contracts that can gracefully handle unexpected situations.\n\n## Why these functions matter\n\nClarity's optional value and error handling functions are designed with several important considerations in mind:\n\n1. Safety: They prevent unexpected null or undefined errors that could crash a contract.\n2. Explicitness: They force developers to consider and handle all possible outcomes.\n3. Readability: They make the code's intent clear, improving maintainability.\n4. Composability: They allow for clean function composition and chaining of operations.\n\n## Core optional and error handling functions\n\n### 1. is-some and is-none\n\n**What**: Check if an optional value contains a value (some) or is empty (none).\n\n**Why**: Essential for safely working with optional values before attempting to use them.\n\n**When**: Use when you need to check if an optional value is present before proceeding.\n\n**How**: \n```clarity\n(is-some value)\n(is-none value)\n```\n\n**Best practices**: \n- Always check optional values before unwrapping them.\n- Use in combination with unwrap functions for safe value extraction.\n\n**Example use case**: Checking if a user exists in a map before performing an operation.\n\n```clarity\n(define-map Users principal { balance: uint })\n\n(define-public (check-balance (user principal))\n (if (is-some (map-get? Users user))\n (ok \"User exists\")\n (err \"User not found\")\n )\n)\n```\n\n### 2. unwrap! and unwrap-panic\n\n**What**: Extract the value from an optional or response type.\n\n**Why**: Allows safe extraction of values, with controlled behavior on failure.\n\n**When**: Use when you're certain a value exists or when you want to halt execution if it doesn't.\n\n**How**: \n```clarity\n(unwrap! value error-expr)\n(unwrap-panic value)\n```\n\n**Best practices**: \n- Use `unwrap!` when you want to provide a custom error message or value.\n- Use `unwrap-panic` sparingly, typically only in situations where failure is truly unexpected.\n\n**Example use case**: Retrieving a user's balance, with a custom error if the user doesn't exist.\n\n```clarity\n(define-map Users principal { balance: uint })\n\n(define-public (get-balance (user principal))\n (ok (unwrap! (get balance (map-get? Users user)) (err \"User not found\")))\n)\n```\n\n### 3. try!\n\n**What**: Attempts to unwrap a response, returning early with an error if it fails.\n\n**Why**: Simplifies error handling in functions that return responses.\n\n**When**: Use when you want to propagate errors up the call stack.\n\n**How**: \n```clarity\n(try! expression)\n```\n\n**Best practices**: \n- Use to chain multiple operations that might fail.\n- Helps keep code clean by avoiding nested if-else statements.\n\n**Example use case**: Transferring tokens between users, with multiple checks.\n\n```clarity\n(define-public (transfer (from principal) (to principal) (amount uint))\n (let\n (\n (senderBalance (try! (get-balance from)))\n (recipientBalance (try! (get-balance to)))\n )\n (try! (check-sufficient-balance senderBalance amount))\n (try! (update-balance from (- senderBalance amount)))\n (try! (update-balance to (+ recipientBalance amount)))\n (ok true)\n )\n)\n```\n\n## Practical example: safe token transfer system\n\nLet's implement a simple token system that demonstrates the use of optional values and error handling:\n\n```clarity\n(define-map Balances principal uint)\n\n(define-read-only (get-balance (user principal))\n (default-to u0 (map-get? Balances user))\n)\n\n(define-public (transfer (to principal) (amount uint))\n (let\n (\n (senderBalance (get-balance tx-sender))\n (recipientBalance (get-balance to))\n )\n (if (>= senderBalance amount)\n (begin\n (try! (as-contract (stx-transfer? amount tx-sender to)))\n (map-set Balances tx-sender (- senderBalance amount))\n (map-set Balances to (+ recipientBalance amount))\n (ok true)\n )\n (err u1)\n )\n )\n)\n\n(define-public (deposit (amount uint))\n (let\n (\n (currentBalance (get-balance tx-sender))\n )\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n (ok (map-set Balances tx-sender (+ currentBalance amount)))\n )\n)\n```\n\nThis example demonstrates:\n1. Using `try!` to handle potential errors in the STX transfer operations.\n2. Proper error handling and propagation throughout the contract functions.\n\n## Conclusion\n\nProper handling of optional values and error cases is crucial for writing secure and reliable Clarity smart contracts. By leveraging Clarity's built-in functions like `is-some`, `unwrap!`, and `try!`, you can create robust contracts that gracefully handle unexpected situations and provide clear feedback when errors occur. Always consider all possible outcomes and use these tools to make your contracts more predictable and maintainable.\n"],[80,"\nCryptographic functions are essential in blockchain smart contracts for ensuring data integrity, creating secure hashes, and verifying signatures. Clarity provides several built-in cryptographic functions that are crucial for these purposes.\n\n## Why these functions matter\n\nClarity's cryptographic functions are designed with blockchain-specific considerations in mind:\n\n1. Security: These functions provide cryptographic primitives essential for building secure smart contracts.\n2. Data Integrity: They allow for the creation and verification of unique identifiers for data, ensuring data hasn't been tampered with.\n3. Authentication: Cryptographic functions enable signature verification, crucial for authenticating transactions and messages.\n4. Determinism: The behavior of these functions is consistent across all nodes, ensuring blockchain consensus.\n5. Interoperability: Some functions (like keccak256) provide compatibility with other blockchain systems.\n\n## Core Cryptographic Functions\n\n### 1. sha256\n\n**What**: Computes the SHA256 hash of the input.\n**Why**: SHA256 is widely used for creating unique, fixed-size representations of data, crucial for data integrity checks.\n**When**: Use when you need to create a unique identifier for data or verify data integrity.\n**How**: \n```clarity\n(sha256 value)\n```\n**Best Practices**: \n- Use for creating unique identifiers for data\n- Combine with other data before hashing to prevent rainbow table attacks\n\n**Example Use Case**: Creating a unique identifier for a document or transaction.\n\n```clarity\n(define-public (submit-document-hash (document-hash (buff 32)))\n (let ((user-submission-id (sha256 (concat document-hash tx-sender))))\n (map-set document-submissions user-submission-id true)\n (ok user-submission-id)))\n```\n\n### 2. keccak256\n\n**What**: Computes the Keccak256 hash of the input.\n**Why**: Keccak256 is another cryptographic hash function, often used in Ethereum-compatible systems.\n**When**: Use when interoperability with Ethereum systems is needed or when an alternative to SHA256 is required.\n**How**: \n```clarity\n(keccak256 value)\n```\n**Best Practices**: \n- Use when SHA256 is not suitable for your specific use case\n- Be aware of the differences in output compared to SHA256\n\n**Example Use Case**: Creating a hash for Ethereum address compatibility.\n\n```clarity\n(define-read-only (get-eth-address (public-key (buff 33)))\n (let ((hashed-key (keccak256 (unwrap-panic (secp256k1-recover? message-hash signature public-key)))))\n (buff-to-hex-string (unwrap-panic (slice? hashed-key u12 u32)))))\n```\n\n### 3. secp256k1-recover?\n\n**What**: Recovers the public key from a signed message and signature.\n**Why**: Essential for verifying signatures without needing the public key in advance.\n**When**: Use when implementing signature verification schemes, especially for transactions or messages.\n**How**: \n```clarity\n(secp256k1-recover? message-hash signature)\n```\n**Best Practices**: \n- Always check the return value as it's an optional type\n- Use in combination with `secp256k1-verify` for complete signature verification\n\n**Example Use Case**: Verifying a signed message in a decentralized voting system.\n\n```clarity\n(define-public (submit-vote (vote uint) (signature (buff 65)) (message-hash (buff 32)))\n (let ((signer (unwrap! (secp256k1-recover? message-hash signature) (err u1))))\n (asserts! (is-eq (principal-of? signer) (some tx-sender)) (err u2))\n (map-set votes tx-sender vote)\n (ok true)))\n\n## Practical Example: Document Verification System\n\nLet's implement a basic document verification system that demonstrates the use of Clarity's cryptographic functions. This system will allow users to submit document hashes, sign them, and later verify the authenticity of the document and the signer.\n\n```clarity\n;; Define a map to store document hashes and their signers\n(define-map documents\n { doc-hash: (buff 32) }\n { signer: principal, eth-compatible-hash: (buff 32) })\n\n;; Function to submit a document hash\n(define-public (submit-document (doc-hash (buff 32)))\n (let\n (\n (submission-id (sha256 (concat doc-hash tx-sender)))\n (eth-hash (keccak256 doc-hash))\n )\n (map-set documents { doc-hash: submission-id }\n { signer: tx-sender, eth-compatible-hash: eth-hash })\n (ok submission-id)))\n\n;; Function to sign a document hash\n(define-public (sign-document (doc-hash (buff 32)) (signature (buff 65)))\n (let\n ((submission-id (sha256 (concat doc-hash tx-sender))))\n (match (map-get? documents { doc-hash: submission-id })\n doc-info\n (let\n ((signer (unwrap! (secp256k1-recover? doc-hash signature) (err u1))))\n (asserts! (is-eq (principal-of? signer) (some tx-sender)) (err u2))\n (ok true))\n (err u3))))\n\n;; Function to verify a document and its signer\n(define-read-only (verify-document (doc-hash (buff 32)) (signature (buff 65)))\n (let\n ((submission-id (sha256 (concat doc-hash tx-sender))))\n (match (map-get? documents { doc-hash: submission-id })\n doc-info\n (let\n ((signer (unwrap! (secp256k1-recover? doc-hash signature) (err u1))))\n (if (is-eq (some (get signer doc-info)) (principal-of? signer))\n (ok true)\n (err u2)))\n (err u3))))\n\n;; Function to get Ethereum-compatible hash\n(define-read-only (get-eth-hash (doc-hash (buff 32)))\n (match (map-get? documents { doc-hash: doc-hash })\n doc-info (ok (get eth-compatible-hash doc-info))\n (err u1)))\n```\n\n## Conclusion\n\nCryptographic functions in Clarity provide powerful tools for ensuring data integrity and implementing secure signature schemes. By understanding when and how to use these functions, developers can create robust smart contracts that maintain the security and trustlessness essential to blockchain applications. Always consider the specific security requirements of your application when choosing and implementing these cryptographic functions."],[50,"\nDevnet is a personal blockchain environment that lets you test and validate your contract code before deploying on a public network like testnet or mainnet. In this guide, you'll learn how to interact with devnet in the Hiro Platform to expedite your development.\n\n## What is devnet?\n\nDevnet is a private blockchain environment that lets you test and validate smart contracts quickly. Think of it as your personal sandbox: no one else can see your devnet instance, you don't have to worry about breaking it, and you can stop and restart it as many times as you need.\n\nWhile developers can run devnet locally using Clarinet, the Hiro Platform provides a hosted version that eliminates the need to manage blockchain nodes and miners on your machine. The Platform-hosted devnet still produces blocks and processes transactions, but offloads the computational overhead to our infrastructure while providing a more intuitive interface for development.\n\nDevnet provides a risk-free testing ground with the convenience of rapid prototyping, cost savings, and privacy.\n\n## Benefits of devnet on the Hiro Platform\n\nThe Platform-hosted devnet offers several advantages:\n\n- **Zero local setup**: No need to configure or maintain blockchain nodes locally\n- **Resource-efficient**: Offloads computational demands to our infrastructure\n- **Rapid prototyping**: Quick iterations with immediate feedback\n- **Cost-efficiency**: No real cryptocurrency expenses for testing\n- **Seamless local integration**: Connect your local development environment to the hosted devnet\n- **Isolated development**: A personal sandbox for confidential and secure testing\n\n## Using devnet in the Hiro Platform\n\nFirst, log into the [Hiro Platform](https://platform.hiro.so/). After [setting up your project](/stacks/platform/guides/create-project), navigate to the project page where you can select the \"Devnet\" tab to manage your devnet instance.\n\n## Starting and managing devnet\n\nIn your project page, you'll click on the \"Devnet\" tab to start and manage your devnet instance. Initially, it should read \"Inactive.\" Click on the \"Start Devnet\" button to start your private devnet instance.\n\n![Dashboard](../images/devnet/dev1.png)\n\n<Callout title=\"Programmatic API\">\n You can also start and stop devnet programmatically via the [Platform API](/stacks/platform-api/devnet).\n</Callout>\n\nIf you want to configure your devnet (like you can locally using `clarinet devnet start` in the terminal), open your project's `devnet.toml` file in the platform VS Code editor before you start devnet. From there, you can configure the settings to match your development needs.\n\nOnce you start devnet, it will take a few moments to spin up. The status indicator on the project dashboard will keep you updated on the progress.\n\n## Active session management\n\nWhen devnet is ready, the status will change to 'Active'.\n\nIf needed, you can restart devnet to refresh the timer. Keep in mind that only one devnet instance can run at a time per user account. If you need to work on a different project, simply start devnet within that project to seamlessly transition your session. There is also a monthly limit of 100 devnet sessions per account, so plan your development schedule accordingly.\n\n## Exploring the devnet dashboard\n\nThe Platform's devnet dashboard provides a comprehensive interface for monitoring and interacting with your private blockchain. You can:\n\n- Track real-time block production through the visual \"assembly line\"\n- Inspect block contents and transaction details\n- Search through blocks efficiently\n- Monitor contract deployments and function calls\n- Mint new blocks on demand\n\n![Devnet Dashboard](../images/devnet/dev2.png)\n\n## Additional devnet features\n\nOn the dashboard, you can also click the \"Interact with devnet\" button to call contract functions, make API requests, view devnet wallets, and more.\n\nFor more information on devnet features, [start here](https://www.hiro.so/blog/5-ways-to-interact-with-devnet-in-the-hiro-platform).\n"],[25,"\nGenerate a deployment plan:\n\n```terminal\n$ clarinet deployments generate --<network>\n```\nSupported networks: console`devnet`_, console`testnet`_, console`mainnet`_\n\nDeploy contracts:\n\n```terminal\n$ clarinet deployments apply --<network>\n```\n\n## Add Contract Requirements\nAdd external contract dependencies:\n\n```terminal\n$ clarinet requirements add <contract-principal>\n```\n\nExample:\n```terminal\n$ clarinet requirements add SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait\n```\n\n## Deployment Plan Transactions\n\nYour deployment plans can include various transaction types:\n\n### Contract Operations\n```yaml\n- contract-publish:\n contract-name: my-contract\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n cost: 5960\n path: contracts/my-contract.clar\n clarity-version: 2\n\n- contract-call:\n contract-id: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n method: my-function\n parameters: []\n cost: 5960\n```\n\n### Asset Transfers\n```yaml\n- stx-transfer:\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n recipient: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract\n mstx-amount: 1000\n memo: '0x01'\n cost: 10000\n\n- btc-transfer:\n expected-sender: mjSrB3wS4xab3kYqFktwBzfTdPg367ZJ2d\n recipient: bcrt1qnxknq3wqtphv7sfwy07m7e4sr6ut9yt6ed99jg\n sats-amount: 100000000\n sats-per-byte: 10\n```\n\n### Simnet Operations\n```yaml\n- emulated-contract-publish:\n contract-name: my-contract\n emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n path: contracts/my-contract.clar\n clarity-version: 2\n\n- emulated-contract-call:\n contract-id: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract\n emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n method: my-function\n parameters: []\n```\n\n<Callout title=\"Note\">\nFor functions that take no arguments or read-only functions, use an empty parameters list: `parameters: []`\n</Callout>"],[4,"\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/components/ui/accordion\"\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n# `initSimnet`\n\nThe `initSimnet` function initializes a simulated network. It will often be the first function you call when using the SDK.\n\n## Parameters\n\nThe `manifestPath` is the path to the `Clarinet.toml` manifest file.\n\n <Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='transition-colors'>Creating a new instance of simnet</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"custom\" className='tab group'>\n <Badge className='badge transition-colors'>With a custom config path</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet();\n ```\n </TabsContent>\n <TabsContent value=\"custom\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet('./config/Clarinet.toml');\n ```\n </TabsContent>\n </Tabs>\n\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"schema\">\n <AccordionTrigger>Schema</AccordionTrigger>\n <AccordionContent>\n ```ts\n initSimnet(manifestPath?: string): Promise<Simnet>\n ```\n </AccordionContent>\n </AccordionItem>\n </Accordion>"],[358,"\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/components/ui/accordion\"\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n# `initSimnet`\n\nThe `initSimnet` function initializes a simulated network. It will often be the first function you call when using the SDK.\n\n## Parameters\n\nThe `manifestPath` is the path to the `Clarinet.toml` manifest file.\n\n <Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='transition-colors'>Creating a new instance of simnet</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"custom\" className='tab group'>\n <Badge className='badge transition-colors'>With a custom config path</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet();\n ```\n </TabsContent>\n <TabsContent value=\"custom\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet('./config/Clarinet.toml');\n ```\n </TabsContent>\n </Tabs>\n\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"schema\">\n <AccordionTrigger>Schema</AccordionTrigger>\n <AccordionContent>\n ```ts\n initSimnet(manifestPath?: string): Promise<Simnet>\n ```\n </AccordionContent>\n </AccordionItem>\n </Accordion>"],[362,"\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/components/ui/accordion\"\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n# `initSimnet`\n\nThe `initSimnet` function initializes a simulated network. It will often be the first function you call when using the SDK.\n\n## Parameters\n\nThe `manifestPath` is the path to the `Clarinet.toml` manifest file.\n\n <Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='transition-colors'>Creating a new instance of simnet</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"custom\" className='tab group'>\n <Badge className='badge transition-colors'>With a custom config path</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet();\n ```\n </TabsContent>\n <TabsContent value=\"custom\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet('./config/Clarinet.toml');\n ```\n </TabsContent>\n </Tabs>\n\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"schema\">\n <AccordionTrigger>Schema</AccordionTrigger>\n <AccordionContent>\n ```ts\n initSimnet(manifestPath?: string): Promise<Simnet>\n ```\n </AccordionContent>\n </AccordionItem>\n </Accordion>"],[351,"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow\n} from \"@/components/ui/table\";\n\nThis page provides detailed information about which methods and events are supported by different wallet providers in the Stacks ecosystem.\n\n## Method Compatibility\n\n<Table>\n <TableHeader>\n <TableRow>\n <TableHead>Method</TableHead>\n <TableHead>Leather</TableHead>\n <TableHead>Xverse-like</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow>\n <TableCell><code>getAddresses</code></TableCell>\n <TableCell>🟡 No support for experimental purposes</TableCell>\n <TableCell>🟡 Use <code>wallet_connect</code> instead</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>sendTransfer</code></TableCell>\n <TableCell>🟡 Expects <code>amount</code> as string</TableCell>\n <TableCell>🟡 Expects <code>amount</code> as number</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>signPsbt</code></TableCell>\n <TableCell>🟡 Uses signing index array only</TableCell>\n <TableCell>🟡 Uses <code>signInputs</code> record instead of array</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_getAddresses</code></TableCell>\n <TableCell>🟢</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_getAccounts</code></TableCell>\n <TableCell>🔴</TableCell>\n <TableCell>🟢</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_getNetworks</code></TableCell>\n <TableCell>🔴</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_transferStx</code></TableCell>\n <TableCell>🟢</TableCell>\n <TableCell>🟢</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_transferSip10Ft</code></TableCell>\n <TableCell>🟢</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_transferSip9Nft</code></TableCell>\n <TableCell>🟢</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_callContract</code></TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only, no support for <code>postConditions</code></TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_deployContract</code></TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only, no support for <code>postConditions</code></TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_signTransaction</code></TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_signMessage</code></TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_signStructuredMessage</code></TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_updateProfile</code></TableCell>\n <TableCell>🔴</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n </TableBody>\n</Table>\n\n## Event Compatibility\n\n<Table>\n <TableHeader>\n <TableRow>\n <TableHead>Event</TableHead>\n <TableHead>Leather</TableHead>\n <TableHead>Xverse</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow>\n <TableCell><code>stx_accountChange</code></TableCell>\n <TableCell>🔴</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_networkChange</code></TableCell>\n <TableCell>🔴</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n </TableBody>\n</Table>\n\n**Legend**\n\n- 🔴 No support (yet)\n- 🟡 Partial support\n- 🟢 Supported\n\n## Compatibility Layer\n\nThe `request` method in `@stacks/connect` adds a layer of auto-compatibility for different wallet providers. This helps unify the interface where wallet providers may implement methods and results differently.\n\n| Method | Status | Notes |\n| --------------------------- | ------ | ---------------------------------------------------------------------------------------------------- |\n| `getAddresses` | 🔵 | Maps to `wallet_connect` for Xverse-like wallets |\n| `sendTransfer` | 🔵 | Converts `amount` to number for Xverse, string for Leather |\n| `signPsbt` | 🟡 | Transforms PSBT format for Leather (base64 to hex) with lossy restructure of `signInputs` |\n| `stx_getAddresses` | 🔵 | Maps to `wallet_connect` for Xverse-like wallets |\n| `stx_callContract` | 🔵 | Transforms Clarity values to hex-encoded format for compatibility |\n| `stx_deployContract` | 🔵 | Transforms Clarity values to hex-encoded format for compatibility |\n| `stx_signTransaction` | 🔵 | Transforms Clarity values to hex-encoded format for compatibility |\n| `stx_signMessage` | 🔵 | Transforms Clarity values to hex-encoded format for compatibility |\n| `stx_signStructuredMessage` | 🔵 | Transforms Clarity values to hex-encoded format for compatibility |\n\n- 🟢 No overrides needed for any wallet\n- 🔵 Has compatibility overrides that maintain functionality\n- 🟡 Has breaking overrides that may lose some information\n"],[49,"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nThe Stacks Testnet Faucet is a dedicated utility for developers building on the Stacks blockchain. To aid you in deploying and running smart contracts on Stacks testnet, we've provided this faucet that offers easy access to testnet STX tokens.\n\n![Create Chainhook Window](../images/faucet/request.png)\n\n## Why use the Stacks Testnet Faucet?\n\nBuilding and testing on a blockchain requires a certain amount of native tokens to facilitate various operations, from contract deployments to transaction executions. However, sourcing these tokens can often be cumbersome. The Stacks Testnet Faucet simplifies this by offering a hassle-free way to acquire STX tokens for testing purposes.\n\n## How to request testnet STX\n\n1. **Visit the faucet page**: Navigate to [platform.hiro.so/faucet](https://platform.hiro.so/faucet).\n2. **Select the token**: Select which token you want, either STX or sBTC.\n3. **Request tokens**: You'll find a straightforward interface with a button to request tokens. Simply click on the button \"Receive x STX/sBTC.\"\n4. **Receive 500 STX tokens or 1 sBTC**: By clicking the button, you'll receive 500 STX tokens or 1 sBTC to your testnet account.\n\n## Frequently Asked Questions\n\n\n<Accordions>\n<Accordion title=\"What is a faucet?\">\nA faucet is an application that dispenses free tokens on a Testnet (a blockchain network used for development and testing). The Stacks faucet provides developers with free test tokens for deploying, testing, and optimizing smart contracts that leverage STX and sBTC.\n\n**It's important to remember that Testnet tokens have no real-world value and cannot be sold or used on the main Stacks network.**\n</Accordion>\n<Accordion title=\"How does the faucet work?\">\nSelect the type of test token you wish to receive and enter the wallet address where you want to receive them. The faucet will create a transaction on the Stacks Testnet that sends a small amount of test tokens to the provided address.\n\nIf you're curious, you can track the transaction's status using [Stacks Explorer](https://explorer.stacks.so/).\n</Accordion>\n<Accordion title=\"Is it secure?\">\nWe securely handle the wallet address you provide while processing your request. This data is not used or shared with any other Hiro services.\n</Accordion>\n<Accordion title=\"Is there a limit for the number of tokens I can request?\">\nYou can make up to 5 requests every 5 minutes. For more details, see our [rate limiting policies](/stacks/rate-limiting).\n</Accordion>\n<Accordion title=\"How long does it take for the Testnet tokens to arrive in my account?\">\nThe time for tokens to arrive to your wallet depends on how busy the network is. On average, it should take x amount of time. If the transaction seems stuck, feel free to reach out to us on our [support channel](https://stacks.chat/).\n</Accordion>\n</Accordions>\n\n<Callout type=\"info\">\n **Daily Limit**: To ensure fair distribution and availability for all\n developers, there's a limit of one request per day. Plan your testing\n accordingly!\n</Callout>{\" \"}\n"],[233,"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n\n## Installation\n\n```package-install\nsbtc\n```\n\n## Architecture\n\nThe sBTC protocol operates across multiple layers:\n\n- **Bitcoin**: The original funds are sourced from Bitcoin. A depositor sends these funds to a group of signers, which manage a (rotating) multisignature address formatted for sBTC transactions.\n\n- **sBTC API (Emily)**: This API is responsible for tracking deposits and notifying the signers about pending deposits.\n\n- **Stacks**: The network where sBTC is minted. Once the deposit is confirmed, the signers mint the corresponding amount of sBTC to the depositor's specified address on the Stacks network.\n\n## Deposit Flow\n\n- **Create Deposit (Bitcoin) Transaction**:\n - Structure a Bitcoin transaction to send funds to the group of signers.\n - Use a specialized format that includes:\n - Deposit Script: Identifies which Stacks address the sBTC will be minted to and what the maximum fee (in satoshis) the signers may take in exchange for minting.\n - Reclaim Script: Allows the sender to reclaim their funds if the transaction is not processed by the signers.\n\n- **Sign and Broadcast the Transaction**:\n - Sign the transaction with the sender's private key.\n - Broadcast the transaction to the Bitcoin network (Bitcoin Regtest for Stacks Testnet).\n\n- **Notify the sBTC API (Emily)**:\n - Inform the API about the transaction by submitting its details. This step ensures that the signers are aware of the deposit and can track it.\n\n- **Processing by Signers**: (no action required)\n - The signers retrieve and verify the deposit transaction from the Bitcoin blockchain.\n - Once verified, the signers mint the equivalent amount of sBTC on the Stacks network.\n\n- **Receive sBTC (Stacks)**: (no action required)\n - The minted sBTC is sent to the depositor's designated Stacks address, completing the deposit process.\n - sBTC is SIP-010 compatible and will show up in Stacks wallets and explorers.\n\n## Withdrawal Flow\n_Coming soon_\n\n## sBTC Package Functions\n\nThe sBTC package exports high-level functions for building addresses and transactions for deposits.\n\n### Examples\n\n \n#### buildSbtcDepositAddress\nBuild a deposit address and metadata using `buildSbtcDepositAddress` with a wallet provider using `sendTransfer`.\n\n```ts\nimport { buildSbtcDepositAddress, SbtcApiClientTestnet } from 'sbtc';\n\nconst client = new SbtcApiClientTestnet();\n\n// 1. BUILD THE DEPOSIT ADDRESS AND METADATA\nconst deposit = buildSbtcDepositAddress({\n stacksAddress: TARGET_STX_ADDRESS,\n signersPublicKey: await client.fetchSignersPublicKey(),\n\n // OPTIONAL DEFAULTS\n // maxSignerFee: 80_000, // optional: fee to pay for the deposit transaction (taken from the signers from the sats)\n // reclaimLockTime: 6_000, // optional: lock time for the reclaim script\n // network: REGTEST, // optional: which bitcoin network to use\n});\n\n// `deposit.address` is the deposit address (send funds here, aka the deposit address as an output)\n\n// 2. DEPOSIT USING YOUR FAVORITE WALLET (TYPICALLY ALSO BROADCASTED BY THE WALLET)\nconst txid = await WalletProvider.sendTransfer({\n recipient: deposit.address,\n amount: 100_000, // the amount to deposit; <=maxSignerFee is taken from this amount\n});\n\n// 3. NOTIFY THE SIGNERS\nawait client.notifySbtc({ txid, ...deposit });\n```\n\n#### buildSbtcDepositTx\nThe `buildSbtcDepositTx` function is similar to `buildSbtcDepositAddress`, but instead of returning just a deposit address, it constructs a complete Bitcoin transaction for depositing sBTC.\n\n```ts\nimport { buildSbtcDepositTx } from 'sbtc';\n\n// 1. BUILD THE DEPOSIT TRANSACTION AND METADATA\nconst deposit = buildSbtcDepositTx({\n amountSats: DEPOSIT_AMOUNT, // the amount in sats/sBTC to deposit; <=maxSignerFee is taken from this amount\n\n // same options as `buildSbtcDepositAddress`\n network,\n stacksAddress,\n signersPublicKey,\n maxSignerFee,\n reclaimLockTime,\n});\n\n// `deposit.transaction` has one output, which is the combined taproot of the deposit and reclaim scripts\n\n// 2. SIGN THE TRANSACTION\ndeposit.transaction.sign(YOUR_BTC_PRIVATE_KEY);\ndeposit.transaction.finalize();\n\n// 2. OR SIGN VIA EXTERNAL WALLET\nconst psbtBytes = deposit.transaction.toPSBT();\n\n// 3. BROADCAST THE TRANSACTION\nconst txid = await client.broadcastTx(deposit.transaction);\n\n// 4. NOTIFY THE SIGNERS\nawait client.notifySbtc(deposit);\n```\n\n\n#### sbtcDepositHelper\nCreate a fully-formed deposit transaction (assuming an address with spendable bitcoin UTXOs)\n\n<Callout>Use this helper function if you are not using a wallet provider</Callout>\n\n```ts\nimport { sbtcDepositHelper, SbtcApiClientTestnet } from 'sbtc';\n\nconst client = new SbtcApiClientTestnet();\n\n// 1. BUILD THE DEPOSIT TRANSACTION AND METADATA (GIVEN UTXOS FOR AN ADDRESS)\nconst deposit = await sbtcDepositHelper({\n stacksAddress: TARGET_STX_ADDRESS, // where to send/mint the sBTC\n amountSats: 5_000_000, // (maximum) amount of sBTC to deposit\n\n signersPublicKey: pub, // the aggregated public key of the signers\n\n feeRate: await client.fetchFeeRate('medium'),\n utxos: await client.fetchUtxos(YOUR_BTC_ADDRESS),\n\n bitcoinChangeAddress: YOUR_BTC_ADDRESS,\n});\n\n// 2. SIGN THE TRANSACTION\ndeposit.transaction.sign(YOUR_BTC_PRIVATE_KEY);\ndeposit.transaction.finalize();\n\n// 2. OR SIGN VIA EXTERNAL WALLET\nconst psbtBytes = deposit.transaction.toPSBT();\n\n// 3. BROADCAST TRANSACTION\nconst txid = await client.broadcastTx(deposit.transaction);\nconsole.log('txid', txid);\n\n// 4. NOTIFY THE SIGNERS\nconst res = await client.notifySbtc(deposit);\nconsole.log('res', res.status, res.statusMessage);\n```\n\n\n## HTTP Clients\n\nAdditionally, there are two API helpers, which make it easier to get all the data needed to create the above transactions:\n\n- **SbtcApiClientMainnet** — a client for communicating with the different pieces of the sBTC deployment\n- **SbtcApiClientTestnet** — a client for communicating with the different pieces of the sBTC deployment on Testnet\n- **SbtcApiClientDevenv** — a client for developing against a local deployment of sBTC\n\nWhile the final adjustments are still being made in the pre-release phase, this package may change default URLs and contract addresses on every minor release.\n\n| Version | Purpose | Functionality |\n| --- | --- | --- |\n| 0.1.x | Developer release (hackathon) | |\n| 0.2.x | Regtest/Testnet release | Deposit only |\n| 0.3.x | Mainnet pre-release | Deposit only |\n\n### Examples\n\n```ts\nimport { SbtcApiClientMainnet, SbtcApiClientTestnet, SbtcApiClientDevenv } from 'sbtc';\n\nconst client = new SbtcApiClientMainnet();\n// const client = new SbtcApiClientTestnet();\n// const client = new SbtcApiClientDevenv();\n\nconst pub = await client.fetchSignersPublicKey(); // fetches the aggregated public key of the signers\nconst address = await client.fetchSignersAddress(); // fetches the p2tr address of the aggregated public key of the signers\n\nconst feeRate = await client.fetchFeeRate('low'); // or 'medium', 'high'\nconst unspents = await client.fetchUtxos(BTC_ADDRESS);\nconst hex = await client.fetchTxHex(TXID);\n\nawait client.broadcastTx(DEPOSIT_BTC_TX); // broadcast a deposit BTC transaction\nawait client.notifySbtc(DEPOSIT_BTC_TX); // notify the sBTC API about the deposit (otherwise it won't be processed)\n\nconst sbtcBalance = await client.fetchSbtcBalance(STX_ADDRESS); // fetch the sBTC balance of an Stacks address\n```\n\n## API Reference\n\n### sbtcDepositHelper\n\n| Parameter | Description | Type | Default |\n| --- | --- | --- | --- |\n| signersPublicKey | Signers public key (aggregated schnorr) | string 32 byte hex | — |\n| amountSats | Bitcoin amount denominated in sats (* 10^8) | number, bigint | — |\n| stacksAddress | The deposit recipient Stacks address | string | — |\n| bitcoinChangeAddress | Bitcoin change address | string | — |\n| feeRate | Fee rate in sat/vbyte | number | — |\n| utxos | UTXOs to \"fund\" the transaction | UtxoWithTx[] | — |\n| reclaimPublicKey | Public key (schnorr, x-only) for reclaiming failed deposits | string | — |\n| reclaimLockTime | Optional reclaim lock time | number | 144 |\n| maxSignerFee | Optional maximum fee to pay to signers for the sBTC mint | number | 80_000 |\n| network | Optional Bitcoin network | BitcoinNetwork | MAINNET |\n| utxoToSpendable | Optional function to convert p2wpk and p2sh utxos to spendable inputs | Function | Best effort default implementation to make utxos spendable |\n| paymentPublicKey | Optional payment public key (currently only used for default utxoToSpendable.sh implementation) | string hex | — |\n\n### SbtcApiClient Configuration\n\n| Parameter | Description | Type |\n| --- | --- | --- |\n| sbtcContract | The multisig address of the initial sBTC contract | string |\n| sbtcApiUrl | The base URL of the sBTC API (Emily) | string |\n| btcApiUrl | The base URL of the Bitcoin mempool/electrs API | string |\n| stxApiUrl | The base URL of the Stacks API | string |\n"],[367,"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n\n## Installation\n\n```package-install\nsbtc\n```\n\n## Architecture\n\nThe sBTC protocol operates across multiple layers:\n\n- **Bitcoin**: The original funds are sourced from Bitcoin. A depositor sends these funds to a group of signers, which manage a (rotating) multisignature address formatted for sBTC transactions.\n\n- **sBTC API (Emily)**: This API is responsible for tracking deposits and notifying the signers about pending deposits.\n\n- **Stacks**: The network where sBTC is minted. Once the deposit is confirmed, the signers mint the corresponding amount of sBTC to the depositor's specified address on the Stacks network.\n\n## Deposit Flow\n\n- **Create Deposit (Bitcoin) Transaction**:\n - Structure a Bitcoin transaction to send funds to the group of signers.\n - Use a specialized format that includes:\n - Deposit Script: Identifies which Stacks address the sBTC will be minted to and what the maximum fee (in satoshis) the signers may take in exchange for minting.\n - Reclaim Script: Allows the sender to reclaim their funds if the transaction is not processed by the signers.\n\n- **Sign and Broadcast the Transaction**:\n - Sign the transaction with the sender's private key.\n - Broadcast the transaction to the Bitcoin network (Bitcoin Regtest for Stacks Testnet).\n\n- **Notify the sBTC API (Emily)**:\n - Inform the API about the transaction by submitting its details. This step ensures that the signers are aware of the deposit and can track it.\n\n- **Processing by Signers**: (no action required)\n - The signers retrieve and verify the deposit transaction from the Bitcoin blockchain.\n - Once verified, the signers mint the equivalent amount of sBTC on the Stacks network.\n\n- **Receive sBTC (Stacks)**: (no action required)\n - The minted sBTC is sent to the depositor's designated Stacks address, completing the deposit process.\n - sBTC is SIP-010 compatible and will show up in Stacks wallets and explorers.\n\n## Withdrawal Flow\n_Coming soon_\n\n## sBTC Package Functions\n\nThe sBTC package exports high-level functions for building addresses and transactions for deposits.\n\n### Examples\n\n \n#### buildSbtcDepositAddress\nBuild a deposit address and metadata using `buildSbtcDepositAddress` with a wallet provider using `sendTransfer`.\n\n```ts\nimport { buildSbtcDepositAddress, SbtcApiClientTestnet } from 'sbtc';\n\nconst client = new SbtcApiClientTestnet();\n\n// 1. BUILD THE DEPOSIT ADDRESS AND METADATA\nconst deposit = buildSbtcDepositAddress({\n stacksAddress: TARGET_STX_ADDRESS,\n signersPublicKey: await client.fetchSignersPublicKey(),\n\n // OPTIONAL DEFAULTS\n // maxSignerFee: 80_000, // optional: fee to pay for the deposit transaction (taken from the signers from the sats)\n // reclaimLockTime: 6_000, // optional: lock time for the reclaim script\n // network: REGTEST, // optional: which bitcoin network to use\n});\n\n// `deposit.address` is the deposit address (send funds here, aka the deposit address as an output)\n\n// 2. DEPOSIT USING YOUR FAVORITE WALLET (TYPICALLY ALSO BROADCASTED BY THE WALLET)\nconst txid = await WalletProvider.sendTransfer({\n recipient: deposit.address,\n amount: 100_000, // the amount to deposit; <=maxSignerFee is taken from this amount\n});\n\n// 3. NOTIFY THE SIGNERS\nawait client.notifySbtc({ txid, ...deposit });\n```\n\n#### buildSbtcDepositTx\nThe `buildSbtcDepositTx` function is similar to `buildSbtcDepositAddress`, but instead of returning just a deposit address, it constructs a complete Bitcoin transaction for depositing sBTC.\n\n```ts\nimport { buildSbtcDepositTx } from 'sbtc';\n\n// 1. BUILD THE DEPOSIT TRANSACTION AND METADATA\nconst deposit = buildSbtcDepositTx({\n amountSats: DEPOSIT_AMOUNT, // the amount in sats/sBTC to deposit; <=maxSignerFee is taken from this amount\n\n // same options as `buildSbtcDepositAddress`\n network,\n stacksAddress,\n signersPublicKey,\n maxSignerFee,\n reclaimLockTime,\n});\n\n// `deposit.transaction` has one output, which is the combined taproot of the deposit and reclaim scripts\n\n// 2. SIGN THE TRANSACTION\ndeposit.transaction.sign(YOUR_BTC_PRIVATE_KEY);\ndeposit.transaction.finalize();\n\n// 2. OR SIGN VIA EXTERNAL WALLET\nconst psbtBytes = deposit.transaction.toPSBT();\n\n// 3. BROADCAST THE TRANSACTION\nconst txid = await client.broadcastTx(deposit.transaction);\n\n// 4. NOTIFY THE SIGNERS\nawait client.notifySbtc(deposit);\n```\n\n\n#### sbtcDepositHelper\nCreate a fully-formed deposit transaction (assuming an address with spendable bitcoin UTXOs)\n\n<Callout>Use this helper function if you are not using a wallet provider</Callout>\n\n```ts\nimport { sbtcDepositHelper, SbtcApiClientTestnet } from 'sbtc';\n\nconst client = new SbtcApiClientTestnet();\n\n// 1. BUILD THE DEPOSIT TRANSACTION AND METADATA (GIVEN UTXOS FOR AN ADDRESS)\nconst deposit = await sbtcDepositHelper({\n stacksAddress: TARGET_STX_ADDRESS, // where to send/mint the sBTC\n amountSats: 5_000_000, // (maximum) amount of sBTC to deposit\n\n signersPublicKey: pub, // the aggregated public key of the signers\n\n feeRate: await client.fetchFeeRate('medium'),\n utxos: await client.fetchUtxos(YOUR_BTC_ADDRESS),\n\n bitcoinChangeAddress: YOUR_BTC_ADDRESS,\n});\n\n// 2. SIGN THE TRANSACTION\ndeposit.transaction.sign(YOUR_BTC_PRIVATE_KEY);\ndeposit.transaction.finalize();\n\n// 2. OR SIGN VIA EXTERNAL WALLET\nconst psbtBytes = deposit.transaction.toPSBT();\n\n// 3. BROADCAST TRANSACTION\nconst txid = await client.broadcastTx(deposit.transaction);\nconsole.log('txid', txid);\n\n// 4. NOTIFY THE SIGNERS\nconst res = await client.notifySbtc(deposit);\nconsole.log('res', res.status, res.statusMessage);\n```\n\n\n## HTTP Clients\n\nAdditionally, there are two API helpers, which make it easier to get all the data needed to create the above transactions:\n\n- **SbtcApiClientMainnet** — a client for communicating with the different pieces of the sBTC deployment\n- **SbtcApiClientTestnet** — a client for communicating with the different pieces of the sBTC deployment on Testnet\n- **SbtcApiClientDevenv** — a client for developing against a local deployment of sBTC\n\nWhile the final adjustments are still being made in the pre-release phase, this package may change default URLs and contract addresses on every minor release.\n\n| Version | Purpose | Functionality |\n| --- | --- | --- |\n| 0.1.x | Developer release (hackathon) | |\n| 0.2.x | Regtest/Testnet release | Deposit only |\n| 0.3.x | Mainnet pre-release | Deposit only |\n\n### Examples\n\n```ts\nimport { SbtcApiClientMainnet, SbtcApiClientTestnet, SbtcApiClientDevenv } from 'sbtc';\n\nconst client = new SbtcApiClientMainnet();\n// const client = new SbtcApiClientTestnet();\n// const client = new SbtcApiClientDevenv();\n\nconst pub = await client.fetchSignersPublicKey(); // fetches the aggregated public key of the signers\nconst address = await client.fetchSignersAddress(); // fetches the p2tr address of the aggregated public key of the signers\n\nconst feeRate = await client.fetchFeeRate('low'); // or 'medium', 'high'\nconst unspents = await client.fetchUtxos(BTC_ADDRESS);\nconst hex = await client.fetchTxHex(TXID);\n\nawait client.broadcastTx(DEPOSIT_BTC_TX); // broadcast a deposit BTC transaction\nawait client.notifySbtc(DEPOSIT_BTC_TX); // notify the sBTC API about the deposit (otherwise it won't be processed)\n\nconst sbtcBalance = await client.fetchSbtcBalance(STX_ADDRESS); // fetch the sBTC balance of an Stacks address\n```\n\n## API Reference\n\n### sbtcDepositHelper\n\n| Parameter | Description | Type | Default |\n| --- | --- | --- | --- |\n| signersPublicKey | Signers public key (aggregated schnorr) | string 32 byte hex | — |\n| amountSats | Bitcoin amount denominated in sats (* 10^8) | number, bigint | — |\n| stacksAddress | The deposit recipient Stacks address | string | — |\n| bitcoinChangeAddress | Bitcoin change address | string | — |\n| feeRate | Fee rate in sat/vbyte | number | — |\n| utxos | UTXOs to \"fund\" the transaction | UtxoWithTx[] | — |\n| reclaimPublicKey | Public key (schnorr, x-only) for reclaiming failed deposits | string | — |\n| reclaimLockTime | Optional reclaim lock time | number | 144 |\n| maxSignerFee | Optional maximum fee to pay to signers for the sBTC mint | number | 80_000 |\n| network | Optional Bitcoin network | BitcoinNetwork | MAINNET |\n| utxoToSpendable | Optional function to convert p2wpk and p2sh utxos to spendable inputs | Function | Best effort default implementation to make utxos spendable |\n| paymentPublicKey | Optional payment public key (currently only used for default utxoToSpendable.sh implementation) | string hex | — |\n\n### SbtcApiClient Configuration\n\n| Parameter | Description | Type |\n| --- | --- | --- |\n| sbtcContract | The multisig address of the initial sBTC contract | string |\n| sbtcApiUrl | The base URL of the sBTC API (Emily) | string |\n| btcApiUrl | The base URL of the Bitcoin mempool/electrs API | string |\n| stxApiUrl | The base URL of the Stacks API | string |\n"],[5,"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `blockHeight`\n\nReturns the current block height of simnet.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the current block height</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentBlockHeight = simnet.blockHeight;\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n <Accordion title=\"Response\">\n ```ts\n 1\n ```\n </Accordion>\n</Accordions>\n\n\n# `deployer`\n\nReturns the default deployer address as defined in the project file.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the deployer address</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"set-deployer\" className='tab group'>\n <Badge className='badge transition-colors'>Setting the deployer to a new address</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentDeployerAddress = simnet.deployer;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"set-deployer\">\n ```ts\n simnet.deployer = 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5';\n const newDeployer = simnet.deployer\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `currentEpoch`\n\nReturns the current epoch of simnet.\n\nThis represents the Stacks blockchain's progress through discrete time periods, cycles, or upgrades.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the current epoch of simnet</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const epoch = simnet.currentEpoch;\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2.5\n ```\n </Accordion>\n</Accordions>\n\n"],[359,"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `blockHeight`\n\nReturns the current block height of simnet.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the current block height</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentBlockHeight = simnet.blockHeight;\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n <Accordion title=\"Response\">\n ```ts\n 1\n ```\n </Accordion>\n</Accordions>\n\n\n# `deployer`\n\nReturns the default deployer address as defined in the project file.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the deployer address</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"set-deployer\" className='tab group'>\n <Badge className='badge transition-colors'>Setting the deployer to a new address</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentDeployerAddress = simnet.deployer;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"set-deployer\">\n ```ts\n simnet.deployer = 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5';\n const newDeployer = simnet.deployer\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `currentEpoch`\n\nReturns the current epoch of simnet.\n\nThis represents the Stacks blockchain's progress through discrete time periods, cycles, or upgrades.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the current epoch of simnet</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const epoch = simnet.currentEpoch;\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2.5\n ```\n </Accordion>\n</Accordions>\n\n"],[7,"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `getAccounts`\n\nRetrieve a list of all Stacks addresses configured within the project, including wallets, deployers, and faucets.\n\n\n\n\n<Tabs defaultValue=\"get-accounts\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"get-accounts\" className='tab group'>\n <Badge className='badge transition-colors'>Getting your accounts</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-account\" className='tab group'>\n <Badge className='badge transition-colors'>Selecting a specific account</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"get-accounts\">\n ```ts\n const accounts = simnet.getAccounts();\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(10) {\n \"wallet_7\": \"ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ\",\n \"wallet_1\": \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n \"wallet_3\": \"ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC\",\n \"wallet_5\": \"ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB\",\n \"wallet_8\": \"ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP\",\n \"wallet_4\": \"ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND\",\n \"deployer\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n \"wallet_6\": \"ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0\",\n \"wallet_2\": \"ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\",\n \"faucet\": \"STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6\",\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAccounts(): Map<string, string>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"get-account\">\n ```ts\n const accounts = simnet.getAccounts();\n\n const wallet = accounts.get('wallet_1')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAccounts(): Map<string, string>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getAssetsMap`\n\nRetrieve a list of asset balances associated with Stacks addresses, including fungible and non-fungible tokens.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting STX account balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-ft-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Getting ft balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-nft-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Getting nft balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-deployer-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for an account</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const assets = simnet.getAssetsMap();\n\n const stxBalances = assets.get('STX')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(10) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 100000000000000n,\n \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\": 100000000000000n,\n \"ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\": 100000000000000n,\n \"ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC\": 100000000000000n,\n \"ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND\": 100000000000000n,\n \"ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB\": 100000000000000n,\n \"ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0\": 100000000000000n,\n \"ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP\": 100000000000000n,\n \"ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ\": 100000000000000n,\n \"STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6\": 100000000000000n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-ft-balance\">\n ```ts\n const contractName = 'token';\n const sourceCode = `\n (define-fungible-token sbtc)\n (ft-mint? sbtc u19 tx-sender)\n `;\n\n simnet.deployContract(\n contractName,\n sourceCode,\n null,\n simnet.deployer\n );\n\n const assets = simnet.getAssetsMap();\n\n const tokenBalance = assets.get('.token.sbtc')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(1) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 19n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-nft-balance\">\n ```ts\n const contractName = 'nft';\n const sourceCode = `\n (define-non-fungible-token ticket uint)\n (nft-mint? ticket u42 tx-sender)\n `;\n\n simnet.deployContract(\n contractName,\n sourceCode,\n null,\n simnet.deployer\n );\n\n const assets = simnet.getAssetsMap();\n\n const nftBalance = assets.get('.nft.ticket')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(1) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 1n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-deployer-balance\">\n ```ts\n const assets = simnet.getAssetsMap();\n const stxBalances = assets.get('STX')!;\n\n const deployerBalance = stxBalances.get('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 100000000000000n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `getDataVar`\n\nGet the value of a `data-var` defined in a contract.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `counter`</span>\n\nThe name of the `data-var` for the contract.\n\n<span>Example: `count`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the value of a data variable</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentCount = simnet.getDataVar('counter', 'count');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n (define-data-var contractOwner principal tx-sender)\n \n (var-set count (+ (var-get count) u1))\n (var-set contractOwner 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 1,\n value: 1n\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getDataVar(contract: string, dataVar: string): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const contractOwner = simnet.getDataVar(\"counter\", \"contractOwner\");\n\n const response = cvToValue(contractOwner);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n (define-data-var contractOwner principal tx-sender)\n \n (var-set count (+ (var-get count) u1))\n (var-set contractOwner 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getDataVar(contract: string, dataVar: string): ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getMapEntry`\n\nGet the value of a map entry by its key. Note that this method will always return an optional value `some` or `none`, just like Clarity `map-get?`.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the map within the contract.\n\n<span>Example: `Participants`</span>\n\nThe key to access the value in the map.\n\n<span>Example: `Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the value of an entry</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const hasParticipated = simnet.getMapEntry(\n \"pool\",\n \"Participants\",\n Cl.standardPrincipal(wallet)\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 10,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getMapEntry(\n contract: string,\n mapName: string,\n mapKey: ClarityValue\n ): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const hasParticipated = simnet.getMapEntry(\n \"pool\",\n \"Participants\",\n Cl.standardPrincipal(wallet)\n );\n\n const response = cvToValue(hasParticipated);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getMapEntry(\n contract: string,\n mapName: string,\n mapKey: ClarityValue\n ): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n# `callReadOnlyFn`\n\nCall read-only functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue`. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the read-only function within the contract.\n\n<span>Example: `get-participant`</span>\n\nThe arguments to pass to the read-only function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Making a function call</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"with-no-arguments\" className='tab group'>\n <Badge className='badge transition-colors'>With no arguments</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"deployer\" className='tab group'>\n <Badge className='badge transition-colors'>With an explicit contract address</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const getContributionAmount = simnet.callReadOnlyFn(\n 'pool',\n 'get-contribution-amount',\n [Cl.standardPrincipal(wallet)],\n wallet\n ); \n \n const response = getContributionAmount.result\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 1,\n value: 420000000n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"with-no-arguments\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const isActive = simnet.callReadOnlyFn(\n 'pool',\n 'is-active',\n [],\n wallet\n );\n \n const response = isActive.result\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 10,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"deployer\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const contractAddress = `${wallet}.pool`;\n\n const getParticipant = simnet.callReadOnlyFn(\n contractAddress,\n 'get-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = getParticipant.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 9,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const getContributionAmount = simnet.callReadOnlyFn(\n 'pool',\n 'get-contribution-amount',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = cvToValue(getContributionAmount.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n 42000000n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n \n </TabsContent>\n</Tabs>\n\n\n# `callPublicFn`\n\nCall public functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue` and the events fired during the function execution. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the public function within the contract.\n\n<span>Example: `register-participant`</span>\n\nThe arguments to pass to the public function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Broadcasting your transaction</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"events\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract events</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = registerParticipant.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 7,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n \n const response = cvToValue(registerParticipant.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"events\">\n ```ts\n import { Cl, cvToValue, type ClarityValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n \n const eventValues = registerParticipant.events.map((event) =>\n cvToValue(event.data.value as ClarityValue)\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n at: {\n type: \"uint\",\n value: \"2\",\n },\n message: {\n type: \"(string-ascii 10)\",\n value: \"Registered\",\n },\n who: {\n type: \"principal\",\n value: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `callPrivateFn`\n\nCall private functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue` and the events, if any, fired during the function execution. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the private function within the contract.\n\n<span>Example: `reward-participant-points`</span>\n\nThe arguments to pass to the private function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Broadcasting your transaction</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const address1 = accounts.get(\"wallet_1\")!\n\n const rewardParticipantPoints = simnet.callPrivateFn(\n \"pool\",\n \"reward-participant-points\",\n [Cl.standardPrincipal(address1)],\n wallet\n );\n\n const response = rewardParticipantPoints.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n (define-map ParticipantPoints principal int)\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (reward-participant-points who)\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (define-private (reward-participant-points (who principal))\n (map-insert ParticipantPoints who 100)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n (map-set ParticipantPoints tx-sender 1000)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 3,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n\n callPrivateFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const address1 = accounts.get(\"wallet_1\")!\n\n const rewardParticipantPoints = simnet.callPrivateFn(\n \"pool\",\n \"reward-participant-points\",\n [Cl.standardPrincipal(address1)],\n wallet\n );\n\n const response = cvToValue(registerParticipant.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n (define-map ParticipantPoints principal int)\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (reward-participant-points who)\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (define-private (reward-participant-points (who principal))\n (map-insert ParticipantPoints who 100)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n (map-set ParticipantPoints tx-sender 1000)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n\n callPrivateFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n \n</Tabs>\n\n\n\n# `transferSTX`\n\nTransfer STX from one address to another. The amount transferred is in `uSTX`.\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe amount of `uSTX` to transfer.\n\n<span>Example: `1000000` equals 1 STX</span>\n\nThe Stacks address of the recipient.\n\n<span>Example: `ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Transferring STX</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"events\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract events</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n result: {\n type: 7,\n value: {\n type: 3,\n },\n },\n events: [\n {\n event: \"stx_transfer_event\",\n data: [\n {\n amount: \"42000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n ],\n }\n ],\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n \n const response = cvToValue(transfer.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"events\">\n ```ts\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n\n const events = transfer.events.map((event) => event);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n event: \"stx_transfer_event\",\n data: {\n amount: \"42000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `deployContract`\n\nDeploy a contract to simnet.\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe name of the contract to be deployed.\n\n<span>Example: `hello-world`</span>\n\nThe Clarity source code (or content) of the contract.\n\n<span>Example: `(define-read-only (say-hi) (ok \"Hello World\"))`</span>\n\nAn object to specify options, such as the Clarity version.\n\n<span>Example: `{ clarityVersion: 2 }` | `null`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Deploying your contract</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Specifying a Clarity version</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"interact\" className='tab group'>\n <Badge className='badge transition-colors'>Interacting with your contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n const contract = simnet.deployContract(\n 'hello-world',\n sourceCode,\n null,\n simnet.deployer\n );\n\n const response = cvToValue(contract.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n true\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n const contract = simnet.deployContract(\n 'hello-world',\n sourceCode,\n { clarityVersion: 2 },\n simnet.deployer\n );\n\n const response = cvToValue(contract.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n true\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"interact\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n simnet.deployContract(\n 'hello-world',\n sourceCode,\n null,\n simnet.deployer\n );\n\n const sayHi = simnet.callReadOnlyFn(\"hello-world\", \"say-hi\", [], simnet.deployer);\n\n const response = sayHi.result\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"(string-ascii 11)\",\n value: \"Hello World\",\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineBlock`\n\nThe `callPublicFn`, `transferSTX`, and `deployContract` methods all mine one block with only one transaction. It can also be useful to mine a block with multiple transactions.\n\nThis is what `mineBlock` is for.\n\nThis method takes an array of transaction objects. The transactions can be built with the `tx` helper exported by the SDK.\n\nThe `tx` helper has three methods:\n- `callPublicFn`\n- `transferSTX`\n- `deployContract`\n\nThese methods have the same interface as simnet methods but instead of performing a transaction, they will build a transaction object that can be passed to the `mineBlock` function.\n\nIn epochs from 3.0 on, the stacks chaintip is advanced separately from the burn chaintip. This means `mineBlock` will only affect the stacks chaintip. If you'd like to also mine burn blocks, use the `mineEmptyBurnBlock` function.\n\n## Parameters\n\nAn array of transactions to be included in the block.\n\n<span>Example: `[tx.transferSTX(100, recipient, sender), ...]`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining multiple transactions in a single block</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { tx } from '@hirosystems/clarinet-sdk';\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get(\"wallet_1\")!;\n\n const block = simnet.mineBlock([\n tx.callPublicFn(\"counter\", \"increment\", [], simnet.deployer),\n tx.callPublicFn(\"counter\", \"add\", [Cl.uint(10)], simnet.deployer),\n tx.transferSTX(19000000, wallet, simnet.deployer),\n ]);\n\n block.forEach((transaction) => {\n console.log(cvToValue(transaction.result));\n if (transaction.events.length > 0) console.log(transaction.events);\n });\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n\n (define-public (add (amount uint))\n (begin\n (var-set count (+ (var-get count) amount))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"uint\",\n value: \"1\",\n }\n {\n type: \"uint\",\n value: \"11\",\n }\n {\n type: \"bool\",\n value: true,\n }\n [\n {\n event: \"stx_transfer_event\",\n data: {\n amount: \"19000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n mineBlock(txs: Tx[]): ParsedTransactionResult[]\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineEmptyBlock`\n\nMine one empty block and increase the block height by one.\n\nReturns the new block height.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining an empty block</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n simnet.mineEmptyBlock();\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlock(): number\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineEmptyBlocks`\n\nMine multiple empty blocks to reach a certain block height.\n\nReturns the new block height.\n\n## Parameters\n\nThe number of empty blocks to mine. This parameter is optional.\n\n<span>Example: `5`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining multiple empty blocks</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Mining an empty block without a count</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n simnet.mineEmptyBlocks(5);\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 6\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlocks(count?: number): number\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n simnet.mineEmptyBlocks();\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlocks(count?: number): number\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `runSnippet`\n\nExecute arbitrary Clarity code directly, which allows you to test and interact with smart contract functions without deploying them.\n\n## Parameters\n\nThe Clarity code snippet to be executed.\n\n<span>Example: `(define-read-only (get-balance) (ok stx-balance))`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Executing arbitrary Clarity code</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"transfer\" className='tab group'>\n <Badge className='badge transition-colors'>Running a snippet for a STX transfer</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const codeSnippet = simnet.runSnippet(\n '(stx-account tx-sender)'\n );\n\n const response = Cl.prettyPrint(codeSnippet, 2);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n locked: u0,\n unlock-height: u0,\n unlocked: u100000000000000\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n runSnippet(snippet: string): string | ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"transfer\">\n ```ts\n import { cvToValue } from \"@stacks/transactions\";\n\n const accounts = simnet.getAccounts();\n const recipient = accounts.get(\"wallet_1\")!;\n\n const codeSnippet = simnet.runSnippet(\n `(stx-transfer? u19000000 tx-sender '${recipient})`\n );\n\n const response = cvToValue(codeSnippet);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n runSnippet(snippet: string): string | ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `getContractsInterfaces`\n\nReturns the interfaces of the project contracts as a Map of Contracts, with the keys being the contract addresses.\n\nThese interfaces contain information such as the available `functions`, `data-vars`, `maps`, `NFTs`, and `FTs` defined in the contract.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting a specific contract interface</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"filter\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract functions</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractInterfaces = simnet.getContractsInterfaces();\n\n const response = contractInterfaces.get(`${simnet.deployer}.pool`);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n functions: [\n {\n name: \"get-participant\",\n access: \"read_only\",\n args: [\n [Object ...]\n ],\n outputs: [Object ...],\n }, {\n name: \"is-active\",\n access: \"read_only\",\n args: [],\n outputs: [Object ...],\n }\n ],\n variables: [],\n maps: [\n {\n name: \"ParticipantStatus\",\n key: \"principal\",\n value: [Object ...],\n }, {\n name: \"Participants\",\n key: \"principal\",\n value: \"bool\",\n }\n ],\n fungible_tokens: [],\n non_fungible_tokens: [],\n epoch: \"Epoch25\",\n clarity_version: \"Clarity2\",\n }\n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractsInterfaces(): Map<string, ContractInterface>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"filter\">\n ```ts\n const poolContract = contractInterfaces.get(`${simnet.deployer}.pool`);\n\n const response = poolContract?.functions;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n name: \"get-participant\",\n access: \"read_only\",\n args: [\n [Object ...]\n ],\n outputs: [Object ...],\n }, {\n name: \"is-active\",\n access: \"read_only\",\n args: [],\n outputs: [Object ...],\n }\n ]\n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractsInterfaces(): Map<string, ContractInterface>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getContractSource`\n\nGet the source code of a contract as a string.\n\n## Parameters\n\nThe identifier of the contract for which the source code is requested.\n\n<span>Example: `pool`</span>\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the source code of a contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractSource = simnet.getContractSource('pool');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```clarity\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractSource(contract: string): string | undefined\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `getContractAST`\n\nGet the full AST (Abstract Syntax Tree) of a Clarity contract.\n\nThis method throws an error if it fails to get the AST or to encode it.\n\n## Parameters\n\nThe identifier of the contract for which the AST (Abstract Syntax Tree) is requested.\n\n<span>Example: `pool`</span>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the source code of a contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractAST = simnet.getContractAST('pool');\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n contract_identifier: {\n issuer: [ 26, [\n 109, 120, 222, 123, 6, 37, 223, 191, 193, 108, 58, 138, 87, 53, 246, 220,\n 61, 195, 242, 206\n ] ],\n name: \"pool\",\n },\n pre_expressions: [],\n expressions: [\n {\n expr: [Object ...],\n id: 1,\n span: [Object ...],\n pre_comments: [],\n end_line_comment: undefined,\n post_comments: [],\n },\n ...\n ],\n top_level_expression_sorting: [ 0, 1, 2, 3 ],\n referenced_traits: Map {},\n implemented_traits: [],\n wasm_module: undefined,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractAST(contractId: string): ContractAST\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n"],[361,"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `getAccounts`\n\nRetrieve a list of all Stacks addresses configured within the project, including wallets, deployers, and faucets.\n\n\n\n\n<Tabs defaultValue=\"get-accounts\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"get-accounts\" className='tab group'>\n <Badge className='badge transition-colors'>Getting your accounts</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-account\" className='tab group'>\n <Badge className='badge transition-colors'>Selecting a specific account</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"get-accounts\">\n ```ts\n const accounts = simnet.getAccounts();\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(10) {\n \"wallet_7\": \"ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ\",\n \"wallet_1\": \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n \"wallet_3\": \"ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC\",\n \"wallet_5\": \"ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB\",\n \"wallet_8\": \"ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP\",\n \"wallet_4\": \"ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND\",\n \"deployer\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n \"wallet_6\": \"ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0\",\n \"wallet_2\": \"ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\",\n \"faucet\": \"STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6\",\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAccounts(): Map<string, string>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"get-account\">\n ```ts\n const accounts = simnet.getAccounts();\n\n const wallet = accounts.get('wallet_1')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAccounts(): Map<string, string>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getAssetsMap`\n\nRetrieve a list of asset balances associated with Stacks addresses, including fungible and non-fungible tokens.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting STX account balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-ft-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Getting ft balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-nft-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Getting nft balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-deployer-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for an account</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const assets = simnet.getAssetsMap();\n\n const stxBalances = assets.get('STX')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(10) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 100000000000000n,\n \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\": 100000000000000n,\n \"ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\": 100000000000000n,\n \"ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC\": 100000000000000n,\n \"ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND\": 100000000000000n,\n \"ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB\": 100000000000000n,\n \"ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0\": 100000000000000n,\n \"ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP\": 100000000000000n,\n \"ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ\": 100000000000000n,\n \"STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6\": 100000000000000n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-ft-balance\">\n ```ts\n const contractName = 'token';\n const sourceCode = `\n (define-fungible-token sbtc)\n (ft-mint? sbtc u19 tx-sender)\n `;\n\n simnet.deployContract(\n contractName,\n sourceCode,\n null,\n simnet.deployer\n );\n\n const assets = simnet.getAssetsMap();\n\n const tokenBalance = assets.get('.token.sbtc')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(1) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 19n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-nft-balance\">\n ```ts\n const contractName = 'nft';\n const sourceCode = `\n (define-non-fungible-token ticket uint)\n (nft-mint? ticket u42 tx-sender)\n `;\n\n simnet.deployContract(\n contractName,\n sourceCode,\n null,\n simnet.deployer\n );\n\n const assets = simnet.getAssetsMap();\n\n const nftBalance = assets.get('.nft.ticket')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(1) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 1n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-deployer-balance\">\n ```ts\n const assets = simnet.getAssetsMap();\n const stxBalances = assets.get('STX')!;\n\n const deployerBalance = stxBalances.get('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 100000000000000n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `getDataVar`\n\nGet the value of a `data-var` defined in a contract.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `counter`</span>\n\nThe name of the `data-var` for the contract.\n\n<span>Example: `count`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the value of a data variable</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentCount = simnet.getDataVar('counter', 'count');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n (define-data-var contractOwner principal tx-sender)\n \n (var-set count (+ (var-get count) u1))\n (var-set contractOwner 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 1,\n value: 1n\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getDataVar(contract: string, dataVar: string): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const contractOwner = simnet.getDataVar(\"counter\", \"contractOwner\");\n\n const response = cvToValue(contractOwner);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n (define-data-var contractOwner principal tx-sender)\n \n (var-set count (+ (var-get count) u1))\n (var-set contractOwner 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getDataVar(contract: string, dataVar: string): ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getMapEntry`\n\nGet the value of a map entry by its key. Note that this method will always return an optional value `some` or `none`, just like Clarity `map-get?`.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the map within the contract.\n\n<span>Example: `Participants`</span>\n\nThe key to access the value in the map.\n\n<span>Example: `Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the value of an entry</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const hasParticipated = simnet.getMapEntry(\n \"pool\",\n \"Participants\",\n Cl.standardPrincipal(wallet)\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 10,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getMapEntry(\n contract: string,\n mapName: string,\n mapKey: ClarityValue\n ): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const hasParticipated = simnet.getMapEntry(\n \"pool\",\n \"Participants\",\n Cl.standardPrincipal(wallet)\n );\n\n const response = cvToValue(hasParticipated);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getMapEntry(\n contract: string,\n mapName: string,\n mapKey: ClarityValue\n ): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n# `callReadOnlyFn`\n\nCall read-only functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue`. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the read-only function within the contract.\n\n<span>Example: `get-participant`</span>\n\nThe arguments to pass to the read-only function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Making a function call</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"with-no-arguments\" className='tab group'>\n <Badge className='badge transition-colors'>With no arguments</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"deployer\" className='tab group'>\n <Badge className='badge transition-colors'>With an explicit contract address</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const getContributionAmount = simnet.callReadOnlyFn(\n 'pool',\n 'get-contribution-amount',\n [Cl.standardPrincipal(wallet)],\n wallet\n ); \n \n const response = getContributionAmount.result\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 1,\n value: 420000000n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"with-no-arguments\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const isActive = simnet.callReadOnlyFn(\n 'pool',\n 'is-active',\n [],\n wallet\n );\n \n const response = isActive.result\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 10,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"deployer\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const contractAddress = `${wallet}.pool`;\n\n const getParticipant = simnet.callReadOnlyFn(\n contractAddress,\n 'get-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = getParticipant.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 9,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const getContributionAmount = simnet.callReadOnlyFn(\n 'pool',\n 'get-contribution-amount',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = cvToValue(getContributionAmount.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n 42000000n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n \n </TabsContent>\n</Tabs>\n\n\n# `callPublicFn`\n\nCall public functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue` and the events fired during the function execution. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the public function within the contract.\n\n<span>Example: `register-participant`</span>\n\nThe arguments to pass to the public function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Broadcasting your transaction</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"events\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract events</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = registerParticipant.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 7,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n \n const response = cvToValue(registerParticipant.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"events\">\n ```ts\n import { Cl, cvToValue, type ClarityValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n \n const eventValues = registerParticipant.events.map((event) =>\n cvToValue(event.data.value as ClarityValue)\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n at: {\n type: \"uint\",\n value: \"2\",\n },\n message: {\n type: \"(string-ascii 10)\",\n value: \"Registered\",\n },\n who: {\n type: \"principal\",\n value: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `callPrivateFn`\n\nCall private functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue` and the events, if any, fired during the function execution. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the private function within the contract.\n\n<span>Example: `reward-participant-points`</span>\n\nThe arguments to pass to the private function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Broadcasting your transaction</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const address1 = accounts.get(\"wallet_1\")!\n\n const rewardParticipantPoints = simnet.callPrivateFn(\n \"pool\",\n \"reward-participant-points\",\n [Cl.standardPrincipal(address1)],\n wallet\n );\n\n const response = rewardParticipantPoints.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n (define-map ParticipantPoints principal int)\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (reward-participant-points who)\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (define-private (reward-participant-points (who principal))\n (map-insert ParticipantPoints who 100)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n (map-set ParticipantPoints tx-sender 1000)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 3,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n\n callPrivateFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const address1 = accounts.get(\"wallet_1\")!\n\n const rewardParticipantPoints = simnet.callPrivateFn(\n \"pool\",\n \"reward-participant-points\",\n [Cl.standardPrincipal(address1)],\n wallet\n );\n\n const response = cvToValue(registerParticipant.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n (define-map ParticipantPoints principal int)\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (reward-participant-points who)\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (define-private (reward-participant-points (who principal))\n (map-insert ParticipantPoints who 100)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n (map-set ParticipantPoints tx-sender 1000)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n\n callPrivateFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n \n</Tabs>\n\n\n\n# `transferSTX`\n\nTransfer STX from one address to another. The amount transferred is in `uSTX`.\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe amount of `uSTX` to transfer.\n\n<span>Example: `1000000` equals 1 STX</span>\n\nThe Stacks address of the recipient.\n\n<span>Example: `ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Transferring STX</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"events\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract events</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n result: {\n type: 7,\n value: {\n type: 3,\n },\n },\n events: [\n {\n event: \"stx_transfer_event\",\n data: [\n {\n amount: \"42000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n ],\n }\n ],\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n \n const response = cvToValue(transfer.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"events\">\n ```ts\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n\n const events = transfer.events.map((event) => event);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n event: \"stx_transfer_event\",\n data: {\n amount: \"42000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `deployContract`\n\nDeploy a contract to simnet.\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe name of the contract to be deployed.\n\n<span>Example: `hello-world`</span>\n\nThe Clarity source code (or content) of the contract.\n\n<span>Example: `(define-read-only (say-hi) (ok \"Hello World\"))`</span>\n\nAn object to specify options, such as the Clarity version.\n\n<span>Example: `{ clarityVersion: 2 }` | `null`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Deploying your contract</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Specifying a Clarity version</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"interact\" className='tab group'>\n <Badge className='badge transition-colors'>Interacting with your contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n const contract = simnet.deployContract(\n 'hello-world',\n sourceCode,\n null,\n simnet.deployer\n );\n\n const response = cvToValue(contract.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n true\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n const contract = simnet.deployContract(\n 'hello-world',\n sourceCode,\n { clarityVersion: 2 },\n simnet.deployer\n );\n\n const response = cvToValue(contract.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n true\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"interact\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n simnet.deployContract(\n 'hello-world',\n sourceCode,\n null,\n simnet.deployer\n );\n\n const sayHi = simnet.callReadOnlyFn(\"hello-world\", \"say-hi\", [], simnet.deployer);\n\n const response = sayHi.result\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"(string-ascii 11)\",\n value: \"Hello World\",\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineBlock`\n\nThe `callPublicFn`, `transferSTX`, and `deployContract` methods all mine one block with only one transaction. It can also be useful to mine a block with multiple transactions.\n\nThis is what `mineBlock` is for.\n\nThis method takes an array of transaction objects. The transactions can be built with the `tx` helper exported by the SDK.\n\nThe `tx` helper has three methods:\n- `callPublicFn`\n- `transferSTX`\n- `deployContract`\n\nThese methods have the same interface as simnet methods but instead of performing a transaction, they will build a transaction object that can be passed to the `mineBlock` function.\n\nIn epochs from 3.0 on, the stacks chaintip is advanced separately from the burn chaintip. This means `mineBlock` will only affect the stacks chaintip. If you'd like to also mine burn blocks, use the `mineEmptyBurnBlock` function.\n\n## Parameters\n\nAn array of transactions to be included in the block.\n\n<span>Example: `[tx.transferSTX(100, recipient, sender), ...]`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining multiple transactions in a single block</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { tx } from '@hirosystems/clarinet-sdk';\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get(\"wallet_1\")!;\n\n const block = simnet.mineBlock([\n tx.callPublicFn(\"counter\", \"increment\", [], simnet.deployer),\n tx.callPublicFn(\"counter\", \"add\", [Cl.uint(10)], simnet.deployer),\n tx.transferSTX(19000000, wallet, simnet.deployer),\n ]);\n\n block.forEach((transaction) => {\n console.log(cvToValue(transaction.result));\n if (transaction.events.length > 0) console.log(transaction.events);\n });\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n\n (define-public (add (amount uint))\n (begin\n (var-set count (+ (var-get count) amount))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"uint\",\n value: \"1\",\n }\n {\n type: \"uint\",\n value: \"11\",\n }\n {\n type: \"bool\",\n value: true,\n }\n [\n {\n event: \"stx_transfer_event\",\n data: {\n amount: \"19000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n mineBlock(txs: Tx[]): ParsedTransactionResult[]\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineEmptyBlock`\n\nMine one empty block and increase the block height by one.\n\nReturns the new block height.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining an empty block</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n simnet.mineEmptyBlock();\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlock(): number\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineEmptyBlocks`\n\nMine multiple empty blocks to reach a certain block height.\n\nReturns the new block height.\n\n## Parameters\n\nThe number of empty blocks to mine. This parameter is optional.\n\n<span>Example: `5`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining multiple empty blocks</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Mining an empty block without a count</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n simnet.mineEmptyBlocks(5);\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 6\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlocks(count?: number): number\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n simnet.mineEmptyBlocks();\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlocks(count?: number): number\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `runSnippet`\n\nExecute arbitrary Clarity code directly, which allows you to test and interact with smart contract functions without deploying them.\n\n## Parameters\n\nThe Clarity code snippet to be executed.\n\n<span>Example: `(define-read-only (get-balance) (ok stx-balance))`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Executing arbitrary Clarity code</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"transfer\" className='tab group'>\n <Badge className='badge transition-colors'>Running a snippet for a STX transfer</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const codeSnippet = simnet.runSnippet(\n '(stx-account tx-sender)'\n );\n\n const response = Cl.prettyPrint(codeSnippet, 2);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n locked: u0,\n unlock-height: u0,\n unlocked: u100000000000000\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n runSnippet(snippet: string): string | ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"transfer\">\n ```ts\n import { cvToValue } from \"@stacks/transactions\";\n\n const accounts = simnet.getAccounts();\n const recipient = accounts.get(\"wallet_1\")!;\n\n const codeSnippet = simnet.runSnippet(\n `(stx-transfer? u19000000 tx-sender '${recipient})`\n );\n\n const response = cvToValue(codeSnippet);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n runSnippet(snippet: string): string | ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `getContractsInterfaces`\n\nReturns the interfaces of the project contracts as a Map of Contracts, with the keys being the contract addresses.\n\nThese interfaces contain information such as the available `functions`, `data-vars`, `maps`, `NFTs`, and `FTs` defined in the contract.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting a specific contract interface</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"filter\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract functions</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractInterfaces = simnet.getContractsInterfaces();\n\n const response = contractInterfaces.get(`${simnet.deployer}.pool`);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n functions: [\n {\n name: \"get-participant\",\n access: \"read_only\",\n args: [\n [Object ...]\n ],\n outputs: [Object ...],\n }, {\n name: \"is-active\",\n access: \"read_only\",\n args: [],\n outputs: [Object ...],\n }\n ],\n variables: [],\n maps: [\n {\n name: \"ParticipantStatus\",\n key: \"principal\",\n value: [Object ...],\n }, {\n name: \"Participants\",\n key: \"principal\",\n value: \"bool\",\n }\n ],\n fungible_tokens: [],\n non_fungible_tokens: [],\n epoch: \"Epoch25\",\n clarity_version: \"Clarity2\",\n }\n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractsInterfaces(): Map<string, ContractInterface>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"filter\">\n ```ts\n const poolContract = contractInterfaces.get(`${simnet.deployer}.pool`);\n\n const response = poolContract?.functions;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n name: \"get-participant\",\n access: \"read_only\",\n args: [\n [Object ...]\n ],\n outputs: [Object ...],\n }, {\n name: \"is-active\",\n access: \"read_only\",\n args: [],\n outputs: [Object ...],\n }\n ]\n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractsInterfaces(): Map<string, ContractInterface>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getContractSource`\n\nGet the source code of a contract as a string.\n\n## Parameters\n\nThe identifier of the contract for which the source code is requested.\n\n<span>Example: `pool`</span>\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the source code of a contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractSource = simnet.getContractSource('pool');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```clarity\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractSource(contract: string): string | undefined\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `getContractAST`\n\nGet the full AST (Abstract Syntax Tree) of a Clarity contract.\n\nThis method throws an error if it fails to get the AST or to encode it.\n\n## Parameters\n\nThe identifier of the contract for which the AST (Abstract Syntax Tree) is requested.\n\n<span>Example: `pool`</span>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the source code of a contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractAST = simnet.getContractAST('pool');\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n contract_identifier: {\n issuer: [ 26, [\n 109, 120, 222, 123, 6, 37, 223, 191, 193, 108, 58, 138, 87, 53, 246, 220,\n 61, 195, 242, 206\n ] ],\n name: \"pool\",\n },\n pre_expressions: [],\n expressions: [\n {\n expr: [Object ...],\n id: 1,\n span: [Object ...],\n pre_comments: [],\n end_line_comment: undefined,\n post_comments: [],\n },\n ...\n ],\n top_level_expression_sorting: [ 0, 1, 2, 3 ],\n referenced_traits: Map {},\n implemented_traits: [],\n wasm_module: undefined,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractAST(contractId: string): ContractAST\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n"],[6,"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `toHaveClarityType`\n\nCheck that a value has the right Clarity type, without checking its value.\n\n## Parameters\n\n\nThe Clarity type that the expected value should have.\n\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ok response</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toHaveClarityType(ClarityType.ResponseOk);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toHaveClarityType(expectedType: ClarityType)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeOk`\n\nCheck that a response is `(ok <ok-type>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ok response with a specific value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeOk(Cl.uint(1));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeOk(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeErr`\n\nCheck that a response is `(err <error-type>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an err response with a specific value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'add',\n [Cl.uint(19)],\n simnet.deployer\n );\n\n expect(result).toBeErr(Cl.uint(500));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-constant TOO_BIG u10)\n (define-data-var count uint u0)\n\n (define-public (add (amount uint))\n (begin\n (let ((new-count (+ (var-get count) amount)))\n (if (<= new-count TOO_BIG)\n (begin\n (var-set count new-count)\n (ok (var-get count))\n )\n (err u500)\n )\n )\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeErr(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n# `toBeSome`\n\nCheck that a response is `(some <value>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an optional value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant',\n [Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5')],\n simnet.deployer\n );\n\n expect(result).toBeSome(Cl.bool(true));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n (map-set ParticipantStatus 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeSome(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeNone`\n\nCheck that a response is `(none)`.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a none value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant',\n [Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5')],\n simnet.deployer\n );\n\n expect(result).toBeNone();\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeNone()\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeBool`\n\nAsserts the value of Clarity boolean (`true` or `false`).\n\n## Parameters\n\n\nThe `boolean` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a boolean value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'has-contributed',\n [Cl.standardPrincipal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM')],\n simnet.deployer\n );\n\n expect(result).toBeBool(true);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (has-contributed (who principal))\n (is-some (get contributionAmount (map-get? ParticipantStatus who)))\n )\n\n (map-set ParticipantStatus tx-sender { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBool(expected: boolean)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeInt`\n\nAsserts the value of a Clarity integer.\n\n## Parameters\n\n\nThe `integer` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an integer value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeInt(1); // or `1n`\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count int 0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) 1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeInt(expected: number | bigint)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeUint`\n\nAsserts the value of a Clarity unsigned integer.\n\n## Parameters\n\n\nThe `unsigned integer` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an unsigned integer value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeUint(1); // or `1n`\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeUint(expected: number | bigint)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeAscii`\n\nAsserts the value of a Clarity string-ascii.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a string-ascii value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'hello-world',\n 'say-hi',\n [],\n simnet.deployer\n );\n\n expect(result).toBeAscii('Hello World');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity hello-world.clar\n (define-read-only (say-hi)\n \"Hello World\"\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeAscii(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeUtf8`\n\nAsserts the value of a Clarity string-utf8.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a string-utf8 value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'hello-world',\n 'say-hi',\n [],\n simnet.deployer\n );\n\n expect(result).toBeUtf8('Hello World');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity hello-world.clar\n (define-read-only (say-hi)\n u\"Hello World\"\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeUtf8(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBePrincipal`\n\nAsserts the value of a Clarity principal.\n\nThe principal can be a standard or a contract principal.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a standard principal</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a contract principal</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const deployer = simnet.deployer;\n\n expect(Cl.standardPrincipal(deployer)).toBePrincipal(deployer);\n ```\n\n <Accordions>\n <Accordion title=\"Schema\">\n ```ts\n toBePrincipal(expected: string) \n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n const contract = `${simnet.deployer}.hello-world`;\n\n expect(Cl.contractPrincipal(contract)).toBePrincipal(contract);\n ```\n\n <Accordions>\n <Accordion title=\"Schema\">\n ```ts\n toBePrincipal(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeBuff`\n\nAsserts the value of a Clarity buffer. It takes an ArrayBuffer as an input.\n\nFor building a buffer, `@stacks/transactions` provides some helper functions:\n\n- `bufferFromAscii`\n- `bufferFromUtf8`\n- `bufferFromHex`\n\n## Parameters\n\n\nThe `Uint8Array` buffer that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a Uint8Array buffer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"ascii\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ASCII string buffer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"hex\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a hex string buffer</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-byte-array',\n [],\n simnet.deployer\n );\n\n const buffer = Uint8Array.from([1, 2, 3, 4]);\n expect(result).toBeBuff(buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant BUFFER 0x01020304)\n\n (define-read-only (get-byte-array)\n BUFFER\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"ascii\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-btc-buffer',\n [],\n simnet.deployer\n );\n\n const btc = Cl.bufferFromAscii('btc'); // or Cl.bufferFromUtf8('btc')\n\n expect(result).toBeBuff(btc.buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant ASCII_BTC 0x627463)\n\n (define-read-only (get-btc-buffer)\n ASCII_BTC\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"hex\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n \"helpers\",\n \"get-tx-hash\",\n [],\n simnet.deployer\n );\n\n const tx = Cl.bufferFromHex(\n \"73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e\"\n );\n\n expect(result).toBeBuff(tx.buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant TX_HASH 0x73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e)\n\n (define-read-only (get-tx-hash)\n TX_HASH\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeList`\n\nAsserts the value of a Clarity list containing an array of Clarity values.\n\n## Parameters\n\n\nThe `Uint8Array` buffer that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a list of Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-addresses',\n [],\n simnet.deployer\n );\n\n expect(result).toBeList(\n [\n Cl.standardPrincipal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM'),\n Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'),\n Cl.standardPrincipal('ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG')\n ]\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-read-only (get-addresses)\n (list\n 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeList(expected: ClarityValue[])\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeTuple`\n\nAsserts the value of a Clarity tuple.\n\n## Parameters\n\n\nThe `object` of Clarity values that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a tuple</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n \n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant-data',\n [Cl.standardPrincipal(simnet.deployer)],\n simnet.deployer\n );\n\n expect(result).toBeTuple({\n enrollmentBlock: Cl.some(Cl.uint(1)),\n contributionAmount: Cl.some(Cl.uint(19000000)),\n });\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-participant-data (who principal))\n {\n enrollmentBlock: (get enrollmentBlock (map-get? ParticipantStatus who)),\n contributionAmount: (get contributionAmount (map-get? ParticipantStatus who))\n }\n )\n\n (map-set ParticipantStatus tx-sender { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeTuple(expected: Record<string, ClarityValue>)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n"],[360,"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `toHaveClarityType`\n\nCheck that a value has the right Clarity type, without checking its value.\n\n## Parameters\n\n\nThe Clarity type that the expected value should have.\n\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ok response</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toHaveClarityType(ClarityType.ResponseOk);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toHaveClarityType(expectedType: ClarityType)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeOk`\n\nCheck that a response is `(ok <ok-type>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ok response with a specific value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeOk(Cl.uint(1));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeOk(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeErr`\n\nCheck that a response is `(err <error-type>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an err response with a specific value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'add',\n [Cl.uint(19)],\n simnet.deployer\n );\n\n expect(result).toBeErr(Cl.uint(500));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-constant TOO_BIG u10)\n (define-data-var count uint u0)\n\n (define-public (add (amount uint))\n (begin\n (let ((new-count (+ (var-get count) amount)))\n (if (<= new-count TOO_BIG)\n (begin\n (var-set count new-count)\n (ok (var-get count))\n )\n (err u500)\n )\n )\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeErr(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n# `toBeSome`\n\nCheck that a response is `(some <value>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an optional value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant',\n [Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5')],\n simnet.deployer\n );\n\n expect(result).toBeSome(Cl.bool(true));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n (map-set ParticipantStatus 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeSome(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeNone`\n\nCheck that a response is `(none)`.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a none value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant',\n [Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5')],\n simnet.deployer\n );\n\n expect(result).toBeNone();\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeNone()\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeBool`\n\nAsserts the value of Clarity boolean (`true` or `false`).\n\n## Parameters\n\n\nThe `boolean` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a boolean value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'has-contributed',\n [Cl.standardPrincipal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM')],\n simnet.deployer\n );\n\n expect(result).toBeBool(true);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (has-contributed (who principal))\n (is-some (get contributionAmount (map-get? ParticipantStatus who)))\n )\n\n (map-set ParticipantStatus tx-sender { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBool(expected: boolean)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeInt`\n\nAsserts the value of a Clarity integer.\n\n## Parameters\n\n\nThe `integer` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an integer value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeInt(1); // or `1n`\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count int 0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) 1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeInt(expected: number | bigint)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeUint`\n\nAsserts the value of a Clarity unsigned integer.\n\n## Parameters\n\n\nThe `unsigned integer` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an unsigned integer value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeUint(1); // or `1n`\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeUint(expected: number | bigint)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeAscii`\n\nAsserts the value of a Clarity string-ascii.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a string-ascii value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'hello-world',\n 'say-hi',\n [],\n simnet.deployer\n );\n\n expect(result).toBeAscii('Hello World');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity hello-world.clar\n (define-read-only (say-hi)\n \"Hello World\"\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeAscii(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeUtf8`\n\nAsserts the value of a Clarity string-utf8.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a string-utf8 value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'hello-world',\n 'say-hi',\n [],\n simnet.deployer\n );\n\n expect(result).toBeUtf8('Hello World');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity hello-world.clar\n (define-read-only (say-hi)\n u\"Hello World\"\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeUtf8(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBePrincipal`\n\nAsserts the value of a Clarity principal.\n\nThe principal can be a standard or a contract principal.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a standard principal</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a contract principal</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const deployer = simnet.deployer;\n\n expect(Cl.standardPrincipal(deployer)).toBePrincipal(deployer);\n ```\n\n <Accordions>\n <Accordion title=\"Schema\">\n ```ts\n toBePrincipal(expected: string) \n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n const contract = `${simnet.deployer}.hello-world`;\n\n expect(Cl.contractPrincipal(contract)).toBePrincipal(contract);\n ```\n\n <Accordions>\n <Accordion title=\"Schema\">\n ```ts\n toBePrincipal(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeBuff`\n\nAsserts the value of a Clarity buffer. It takes an ArrayBuffer as an input.\n\nFor building a buffer, `@stacks/transactions` provides some helper functions:\n\n- `bufferFromAscii`\n- `bufferFromUtf8`\n- `bufferFromHex`\n\n## Parameters\n\n\nThe `Uint8Array` buffer that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a Uint8Array buffer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"ascii\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ASCII string buffer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"hex\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a hex string buffer</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-byte-array',\n [],\n simnet.deployer\n );\n\n const buffer = Uint8Array.from([1, 2, 3, 4]);\n expect(result).toBeBuff(buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant BUFFER 0x01020304)\n\n (define-read-only (get-byte-array)\n BUFFER\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"ascii\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-btc-buffer',\n [],\n simnet.deployer\n );\n\n const btc = Cl.bufferFromAscii('btc'); // or Cl.bufferFromUtf8('btc')\n\n expect(result).toBeBuff(btc.buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant ASCII_BTC 0x627463)\n\n (define-read-only (get-btc-buffer)\n ASCII_BTC\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"hex\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n \"helpers\",\n \"get-tx-hash\",\n [],\n simnet.deployer\n );\n\n const tx = Cl.bufferFromHex(\n \"73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e\"\n );\n\n expect(result).toBeBuff(tx.buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant TX_HASH 0x73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e)\n\n (define-read-only (get-tx-hash)\n TX_HASH\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeList`\n\nAsserts the value of a Clarity list containing an array of Clarity values.\n\n## Parameters\n\n\nThe `Uint8Array` buffer that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a list of Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-addresses',\n [],\n simnet.deployer\n );\n\n expect(result).toBeList(\n [\n Cl.standardPrincipal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM'),\n Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'),\n Cl.standardPrincipal('ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG')\n ]\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-read-only (get-addresses)\n (list\n 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeList(expected: ClarityValue[])\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeTuple`\n\nAsserts the value of a Clarity tuple.\n\n## Parameters\n\n\nThe `object` of Clarity values that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a tuple</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n \n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant-data',\n [Cl.standardPrincipal(simnet.deployer)],\n simnet.deployer\n );\n\n expect(result).toBeTuple({\n enrollmentBlock: Cl.some(Cl.uint(1)),\n contributionAmount: Cl.some(Cl.uint(19000000)),\n });\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-participant-data (who principal))\n {\n enrollmentBlock: (get enrollmentBlock (map-get? ParticipantStatus who)),\n contributionAmount: (get contributionAmount (map-get? ParticipantStatus who))\n }\n )\n\n (map-set ParticipantStatus tx-sender { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeTuple(expected: Record<string, ClarityValue>)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n"],[244,"\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\nStacks.js is separated into many smaller packages, which can be installed individually and are published under the `@stacks` scope.\n\nThe most commonly used packages are:\n\n<Tabs defaultValue=\"connect\">\n <TabsList className='flex flex-wrap md:w-max'>\n <TabsTrigger value=\"connect\" className='tab group'>\n <Badge className='badge transition-colors group-data-[state=active]:bg-contrast group-data-[state=active]:text-background group-hover:bg-accent group-hover:text-muted-foreground'>@stacks/connect</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"common\" className='tab group'>\n <Badge className='badge transition-colors group-data-[state=active]:bg-contrast group-data-[state=active]:text-background group-hover:bg-accent group-hover:text-muted-foreground'>@stacks/common</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"network\" className='tab group'>\n <Badge className='badge transition-colors group-data-[state=active]:bg-contrast group-data-[state=active]:text-background group-hover:bg-accent group-hover:text-muted-foreground'>@stacks/network</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"transactions\" className='tab group'>\n <Badge className='badge transition-colors group-data-[state=active]:bg-contrast group-data-[state=active]:text-background group-hover:bg-accent group-hover:text-muted-foreground'>@stacks/transactions</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"client\" className='tab group'>\n <Badge className='badge transition-colors group-data-[state=active]:bg-contrast group-data-[state=active]:text-background group-hover:bg-accent group-hover:text-muted-foreground'>@stacks/blockchain-api-client</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"connect\">\n Build Stacks-ready web apps and connect to user wallets.\n\n ```package-install\n @stacks/connect\n ```\n </TabsContent>\n <TabsContent value=\"common\">\n Common utilities used by Stacks.js packages.\n\n ```package-install\n @stacks/common\n ```\n </TabsContent>\n <TabsContent value=\"network\">\n Network library for working with Stacks network objects.\n\n ```package-install\n @stacks/network\n ```\n </TabsContent>\n <TabsContent value=\"transactions\">\n Construct and decode transactions, and work with Clarity smart contracts on the Stacks blockchain.\n\n ```package-install\n @stacks/transactions\n ```\n </TabsContent>\n <TabsContent value=\"client\">\n API client library for all Stacks Blockchain API endpoints.\n\n ```package-install\n @stacks/blockchain-api-client\n ```\n </TabsContent>\n</Tabs>\n\n---\n\n<Accordions>\n <Accordion title=\"All available packages\">\n [`@stacks/connect`](/stacks/connect/packages/connect) — Build Stacks-ready web applications and connect to user wallets.\n\n `@stacks/auth` — Construct and decode authentication requests for Stacks apps.\n\n [`@stacks/transactions`](/stacks/stacks.js/packages/transactions) — Construct and decode transactions, and work with Clarity smart contracts on the Stacks blockchain.\n\n `@stacks/wallet-sdk` — A library for building wallets, managing accounts, and handling keys for the Stacks blockchain.\n\n `@stacks/storage` — Store and fetch files with Gaia, the decentralized storage system.\n\n `@stacks/profile` — Functions for manipulating user profiles.\n\n `@stacks/encryption` — Encryption functions used by Stacks.js packages.\n\n [`@stacks/network`](/stacks/stacks.js/packages/network) — A network and API library for working with Stacks blockchain nodes.\n\n `@stacks/common` — Common utilities used by Stacks.js packages.\n\n `@stacks/bns` — A library for interacting with the BNS contract.\n\n `@stacks/stacking` — A library for PoX stacking.\n\n `@stacks/cli` — A command line interface to interact with auth, storage, and Stacks transactions.\n\n `@stacks/blockchain-api-client` — API client library for all Stacks Blockchain API endpoints.\n </Accordion>\n</Accordions>\n"],[243,"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\"\nimport { ChevronRight, Code, Terminal, Folder as FolderIcon } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\nimport { SmallCard } from '@/components/card';\n\nIn this quickstart guide, you will learn how to build a transaction to transfer STX tokens using Stacks.js.\n\nCheck out the [reference page](/stacks/stacks.js/packages/transactions) for `@stacks/transactions` to learn more about building different types of transactions.\n\n{/* <Callout>\n To view the full code for this quickstart, [click here](https://github.com/hiro-so/stacks.js/tree/main/examples/hello-world).\n</Callout> */}\n\n---\n\n<Steps>\n <Step>\n ## Install packages\n \n Add the `@stacks/transactions` and `@stacks/network` packages to your project using your preferred package manager.\n\n ```package-install title=\"Terminal\"\n @stacks/transactions @stacks/network\n ```\n </Step>\n <Step>\n ## Build the transaction for a STX transfer\n \n To set up a STX token transfer transaction, use the `makeSTXTokenTransfer` function.\n\n This function requires a private key (`senderKey`), a specified `network`, and the details of the transfer.\n\n ```ts stx-transfer.ts -cn\n import { makeSTXTokenTransfer } from \"@stacks/transactions\";\n import { STACKS_TESTNET } from \"@stacks/network\";\n\n const transaction = await makeSTXTokenTransfer({\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n amount: 42000000,\n senderKey:\n \"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601\",\n network: STACKS_TESTNET,\n });\n ```\n\n There are a few optional fields for a STX transfer transaction, including `memo`, `nonce`, and `fee`.\n\n <Accordions>\n <Accordion title=\"Optional fields example\">\n ```ts\n const transaction = await makeSTXTokenTransfer({\n // ...other fields ommitted\n memo: \"test memo\",\n nonce: 0n,\n fee: 200n,\n });\n ```\n </Accordion>\n </Accordions>\n\n <Callout>\n Use `memo` to add a message as part of the transaction. If you don't want the builder to fetch the `nonce` and `fee` from a Stacks node, you can manually set these fields.\n </Callout>\n </Step>\n <Step>\n ## Broadcast the transaction\n \n Once you've constructed a valid transaction, you can broadcast it to the network using the `broadcastTransaction` function.\n\n ```ts stx-transfer.ts -cn\n // !mark[/broadcastTransaction/mg]\n import { broadcastTransaction,makeSTXTokenTransfer } from \"@stacks/transactions\";\n import { STACKS_TESTNET } from \"@stacks/network\";\n\n const transaction = await makeSTXTokenTransfer({\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n amount: 42000000,\n senderKey:\n \"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601\",\n network: STACKS_TESTNET,\n });\n\n const broadcastResponse = await broadcastTransaction({ transaction });\n const txId = broadcastResponse.txid;\n ```\n\n Upon success, this will return a `StacksTransaction` object that contains information about the transaction, including the `txid`.\n </Step>\n</Steps>\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/authenticate-users\"\n title=\"Authenticate users\"\n description=\"Learn how to authenticate users using the Connect package in Stacks.js.\"\n />\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n <Card\n href=\"/stacks/connect/guides/sign-messages\"\n title=\"Sign messages\"\n description=\"Learn how to sign messages using Stacks.js.\"\n />\n</Cards>\n"],[378,"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\"\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\n\nIn this quickstart guide, you will set up `Chainhook` to generate and scan predicates on the Stacks blockchain. You will learn how to generate predicates and run basic commands using the CLI to scan and inspect blockchain events.\n\nCheck out the [run Chainhook as a service](/stacks/chainhook/guides/chainhook-as-a-service) for a more advanced use case.\n\n<Steps>\n <Step>\n ## Generate a predicate file\n \n To generate a predicate file, use the `predicates new` command. This command generates a template that you can use to help set up your own predicate.\n\n ```terminal\n $ chainhook predicates new stx-transfer.json --stacks \n ```\n\n <Callout title=\"Note\">\n The `--stacks` flag is required and allows you to specify the network to scan. Other options include `--bitcoin`.\n </Callout>\n </Step>\n <Step>\n ## Track the latest stx_event for a given address\n \n The generated file contains helpful boilerplate configuration, but you still need to make some edits to tell it to track specific Stacks-related transactions.\n\n To do this, update your `if_this` construct in your `stx-transfer.json` file.\n\n ```json title=\"stx-transfer.json\"\n {\n \"if_this\": {\n \"scope\": \"stx_event\",\n \"actions\": [\"transfer\"]\n }\n }\n ```\n\n <Accordions>\n <Accordion title=\"Full code example\">\n ```json\n {\n \"chain\": \"stacks\",\n \"uuid\": \"87ac9bff-1052-4d02-9c79-3768a6f08a09\",\n \"name\": \"STX Transfer\",\n \"version\": 1,\n \"networks\": {\n \"mainnet\": {\n \"start_block\": 154670,\n \"if_this\": {\n \"scope\": \"stx_event\",\n \"contract_identifier\": \"SPM113AY78VCMJJ0SDFJ4XJXFHHQ6R9KB3710X7D\",\n \"actions\": [\"transfer\"]\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"stx-transfers.txt\"\n }\n }\n }\n }\n }\n ```\n </Accordion>\n </Accordions>\n \n <Callout title=\"Note\">\n Other available `actions` include `mint`, `burn`, and `lock`. For more information on these actions, check out the [predicates](/stacks/chainhook/concepts/stacks-predicates) section.\n </Callout>\n </Step>\n <Step>\n ## Scanning for events\n \n With your updated predicate file, you can now use the `predicate scan` command to scan for `stx_event` transactions.\n\n ```terminal\n $ chainhook predicates scan /path/to/stx-transfer.json --mainnet\n ```\n\n <Callout title=\"Note\">\n When running `scan` for the first time, a chainstate archive will be downloaded. The subsequent scans will use the cached chainstate if already present, speeding up iterations and the overall feedback loop. For more information on the Hiro Archive, click [here](/stacks/archive).\n </Callout>\n </Step>\n</Steps>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/chainhook-as-a-service\"\n title=\"Run Chainhook as a service\"\n description=\"Learn how to run Chainhook as a service.\"\n />\n <Card\n href=\"/bitcoin/indexer\"\n title=\"Run the Bitcoin Indexer\"\n description=\"Learn how to run the Bitcoin Indexer.\"\n />\n <Card\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Learn how to sync a Stacks node for running a local devnet.\"\n />\n</Cards>"],[64,"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```"],[382,"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```"],[383,"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```"],[384,"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```"],[385,"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```"],[386,"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```"],[387,"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```"],[365,"\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```\n\n### Using WebSockets\n\n```ts\nimport { connectWebSocketClient } from '@stacks/blockchain-api-client';\nconst client = await connectWebSocketClient('ws://api.hiro.so/');\nconst sub = await client.subscribeAddressTransactions(contractCall.txId, event => {\n console.log(event);\n});\n\nawait sub.unsubscribe();\n```\n"],[224,"\nimport { Accordions, Accordion } from 'fumadocs-ui/components/accordion';\n\nUnit testing is the process of testing individual components or functions of smart contracts to ensure they work as expected. The Clarinet JS SDK provides a testing framework that allows you to write these tests using the Vitest testing framework, helping you catch bugs and errors early in the development process.\n\nIn this guide, you will:\n\n1. [Set up a new Clarinet project with a `defi` contract](#set-up-a-new-clarinet-project).\n2. [Write a unit test covering the `deposit` function](#test-the-deposit-function).\n3. [Run tests and generate coverage reports](#run-tests-and-generate-coverage-reports).\n\n---\n\n## Set up a new Clarinet project\n\nStart by creating a new project with the Clarinet CLI. The command below will create a project structure inside of `defi` with the necessary files and folders, including the Clarinet JS SDK already set up for testing.\n\n```terminal\n$ clarinet new stx-defi\n$ cd stx-defi\n```\n\nAfter changing into your project directory, run `npm install` to install the package dependencies for testing.\n\n```terminal\n$ npm install\n```\n\nSince the smart contract code is out of scope for this guide, we are going to use a pre-existing contract. First, generate a new file using the `clarinet contract new` command in order to set up your project with the necessary configuration and test files.\n\n```terminal\n$ clarinet contract new defi\n```\n\nNow, inside your `defi.clar` file, copy and paste the following contract code:\n\n```clarity\n;; Holds the total amount of deposits in the contract, initialized to 0.\n(define-data-var total-deposits uint u0)\n\n;; Maps a user's principal address to their deposited amount.\n(define-map deposits { owner: principal } { amount: uint })\n\n;; Public function for users to deposit STX into the contract.\n;; Updates their balance and the total deposits in the contract.\n(define-public (deposit (amount uint))\n (let\n (\n ;; Fetch the current balance or default to 0 if none exists.\n (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n )\n ;; Transfer the STX from sender = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\" to recipient = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)\".\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n ;; Update the user's deposit amount in the map.\n (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })\n ;; Update the total deposits variable.\n (var-set total-deposits (+ (var-get total-deposits) amount))\n ;; Return success.\n (ok true)\n )\n)\n\n;; Read-only function to get the total balance by tx-sender\n(define-read-only (get-balance-by-sender)\n (ok (map-get? deposits { owner: tx-sender }))\n)\n```\n\nRun `clarinet check` to ensure that your smart contract is valid and ready for testing.\n\n<Callout>\nYou can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi).\n</Callout>\n\n## Test the deposit function\n\nThis `deposit` function allows users to deposit STX into the contract, updating their balance inside a `deposits` map and adding to the total deposits stored in a `total-deposits` variable. The key tests we want to cover are that the deposit is successful and that the user's balance, as well as the contract's total deposits, are updated correctly.\n\nInside of your `defi.test.ts` file, replace the boilerplate code and add the following:\n\n```typescript\nimport { describe, it, expect } from 'vitest';\nimport { Cl } from '@stacks/transactions';\n\nconst accounts = simnet.getAccounts();\nconst wallet1 = accounts.get('wallet_1')!;\n```\n\nThese imports provide the testing framework and utilities we need. We also get the `wallet_1` account, which will act as our test user.\n\nNext, define the test suite and the specific test case:\n\n```typescript\ndescribe('stx-defi', () => {\n it('allows users to deposit STX', () => {\n // Test code will go here\n });\n});\n```\n\nThis structure comes from our Vitest integration, and it organizes our tests and describes what we're testing. The `describe` block groups multiple test cases together, while the `it` block represents a single test case.\n\nNow, let's simulate a deposit. Inside of the `it` block, define the amount to deposit and call the `deposit` function:\n\n```typescript\nconst amount = 1000;\nconst deposit = simnet.callPublicFn('defi', 'deposit', [Cl.uint(amount)], wallet1);\n```\n\nThis code simulates a deposit by calling the `deposit` function, using the `callPublicFn` method from the Clarinet JS SDK, in our contract with a specified amount, just as a user would in the real world.\n\nAfter making the deposit, create an assertion to verify that the call itself was successful and returns an `ok` response type with the value `true`:\n\n```typescript\nexpect(deposit.result).toBeOk(Cl.bool(true));\n```\n\nRun `npm run test` to confirm that this test passes.\n\nLet's go over some of the code in this assertion:\n\n- `expect` is a function from Vitest that makes an assertion about the value we expect to get back from the `deposit` function.\n\nBut how do we test against Clarity types and values? This is where the `Cl` and `toBeOk` helpers come in.\n\n- `toBeOk` is a custom matcher function built into Vitest that checks if the result of the deposit call is an `Ok` response, which is a Clarity type. This is important because it confirms that the deposit transaction was processed successfully.\n- `Cl` helper is from the `@stacks/transactions` package and is used to create Clarity values in JavaScript. In this case, it's used to create a Clarity boolean with the value of `true`.\n\n<Callout>\nTo see more custom matcher examples, check out the [reference page](/stacks/clarinet-js-sdk/references/custom-matchers).\n</Callout>\n\nOnce we can confirm that the deposit was successful, write a test to verify that the contract's total deposits have been updated correctly.\n\n```typescript\nconst totalDeposits = simnet.getDataVar('defi', 'total-deposits');\nexpect(totalDeposits).toBeUint(amount);\n```\n\nRun `npm run test` again to confirm that this test also passes.\n\nThis check ensures that the contract accepted our deposit without any issues.\n\nLastly, verify that the user's balance has been updated correctly:\n\n```typescript\nconst balance = simnet.callReadOnlyFn('defi', 'get-balance-by-sender', [], wallet1);\nexpect(balance.result).toBeOk(\n Cl.some(\n Cl.tuple({\n amount: Cl.uint(amount),\n })\n )\n);\n```\n\nWe call the `get-balance-by-sender` function and check if it matches the amount we just deposited.\n\nBy following these steps, our test comprehensively verifies that the `deposit` function works as intended, updating individual balances and total deposits accurately.\n\n<Accordions>\n <Accordion title=\"Full code snippet\">\n```typescript\n import { describe, it, expect } from 'vitest';\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet1 = accounts.get('wallet_1')!;\n\n describe('stx-defi', () => {\n it('allows users to deposit STX', () => {\n const amount = 1000;\n const deposit = simnet.callPublicFn('defi', 'deposit', [Cl.uint(amount)], wallet1);\n expect(deposit.result).toBeOk(Cl.bool(true));\n\n const totalDeposits = simnet.getDataVar('defi', 'total-deposits');\n expect(totalDeposits).toBeUint(amount);\n\n const balance = simnet.callReadOnlyFn('defi', 'get-balance-by-sender', [], wallet1);\n expect(balance.result).toBeOk(\n Cl.some(\n Cl.tuple({\n amount: Cl.uint(amount),\n })\n )\n );\n });\n });\n```\n </Accordion>\n</Accordions>\n\n## Run tests and generate coverage reports\n\nTo run your tests, use:\n\n```terminal\n$ npm run test\n```\n\nTo generate a coverage report, use:\n\n```terminal\n$ npm run coverage\n```\n\nThis will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/methods\"\n title=\"SDK methods\"\n description=\"Learn about the methods available in the Clarinet JS SDK.\"\n />\n</Cards>"],[22,"\nimport { API, Clarinet, Js } from '@/components/ui/icon';\nimport { File, Folder, Files } from \"fumadocs-ui/components/files\"\n\nTransactions on the Stacks blockchain comes with execution costs that can dictate transaction fees for your users. To analyze the execution costs of your contract's functions, let's continue with the simple `counter` contract from the [Clarinet quickstart](/stacks/clarinet/quickstart) as an example.\n\n```clarity\n(define-map Counters principal uint)\n\n(define-read-only (get-count (who principal))\n (default-to u0 (map-get? Counters who))\n)\n\n(define-public (count-up)\n (ok (map-set Counters tx-sender (+ (get-count tx-sender) u1)))\n)\n```\n\nTo start analyzing execution costs, first run the `clarinet console` command inside your project.\n\n```terminal\n$ clarinet console\n```\n\n## Get Costs\n\nThe `::get_costs <expr>` command in the Clarinet console will display the cost analysis of the given expression as well as the return value of the given expression. The `::get_costs` command expects an expression, so make a `contract-call?` with our `count-up` function and see what happens.\n\n```terminal\n$ ::get_costs (contract-call? .counter count-up)\n+----------------------+-------------+----------------+-----------------+\n| | Consumed | Limit | Percentage |\n+----------------------+-------------+----------------+-----------------+\n| Runtime | 4752 | 5000000000 | 0.00 % |\n+----------------------+-------------+----------------+-----------------+\n| Read count | 5 | 15000 | 0.03 % |\n+----------------------+-------------+----------------+-----------------+\n| Read length (bytes) | 245 | 100000000 | 0.00 % |\n+----------------------+-------------+----------------+-----------------+\n| Write count | 1 | 15000 | 0.01 % |\n+----------------------+-------------+----------------+-----------------+\n| Write length (bytes) | 41 | 15000000 | 0.00 % |\n+----------------------+-------------+----------------+-----------------+\n\n\n(ok true)\n```\n\nAs you can see from the chart, execution costs are broken into 5 different categories, each with its own limit. The limit is pertaining to what each Stacks block is limited to.\n\n<Callout title=\"Execution Cost Categories\">\nThe below lists out each of the 5 different categories of Clarity execution costs. ([source](https://book.clarity-lang.org/ch12-00-runtime-cost-analysis.html))\n\n- **Runtime** costs limits overall complexity of the code that can be executed. For example, negating a boolean value is less complex than calculating SHA512 hash, therefore (not false) will consume less runtime costs than (sha512 \"hello world\"). This category is also affected by contract size.\n- **Read count** limits how many times we can read from memory or chain state to a extract piece of information. It is affected by reading constants, variables, intermediate variables created with let, maps, but also by some functions that needs to save intermediate results during execution.\n- **Read length (bytes)** limits how much data we can read from memory or the chain. It is also affected by contract size. Calling into a contract using contract-call? Increases the read length by an amount equal to the contract size in bytes, every time. If you call into a contract with a length of 2,000 bytes twice, the read length is increased twice.\n- **Write count** limits how many times we can write data into chain. It increments when writing to variables and maps.\n- **Write length (bytes)** limits how much data we can write to the chain.\n\n</Callout>\n\nThe percentage column shows what percentage of the execution costs your expression consumed out of the block limit given.\n\n## Toggle costs\n\nYou can toggle the cost analysis to always be displayed after every expression execution in the console by toggling this feature on with the command `::toggle_costs`.\n\n```terminal\n$ ::toggle_costs\n```\n\nTo turn it off, just run the `::toggle_costs` command again.\n\nCheck out the Clarity Book section on [runtime cost analysis](https://book.clarity-lang.org/ch12-00-runtime-cost-analysis.html) to read up on cost optimization techniques and recommendations.\n\nTo see how you can run automated cost analysis on your unit tests, check out our [quickstart](/stacks/clarinet-js-sdk/quickstart#run-your-tests-with-code-coverage-and-cost-analysis) section for the Clarinet JS SDK.\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/guides/cli-commands/validate-a-contract\"\n title=\"Validate a contract\"\n description=\"Learn how to validate a contract.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<API />}\n href=\"/stacks/rpc-api/fees/estimate\"\n title=\"Get fee estimates for a transaction\"\n description=\"Learn how to fetch transaction costs.\"\n tag='API'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write tests for your smart contracts\"\n description=\"Learn how to write unit tests using the Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n</Cards>"],[18,"\nimport { ArrowUpRight } from \"lucide-react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\"\nimport { SecondaryCard } from \"@/components/card\";\n\nUsing a simple command line interface, Clarinet enables you to build and iterate on your contracts locally before moving into production on the `mainnet` network.\n\nYou can code with <TooltipProvider inline><Tooltip><TooltipTrigger asChild><span className='cursor-default border-b border-dotted border-primary'>Clarity syntax support</span></TooltipTrigger><TooltipContent>Using the [Clarity VSCode extension](https://marketplace.visualstudio.com/items?itemName=HiroSystems.clarity-lsp#:~:text=This%20VS%20Code%20extension%20brings,safety%20checks%2C%20debugger%20and%20more)</TooltipContent></Tooltip></TooltipProvider>, run tests, debug your code line by line, and deploy your contracts to a local Stacks blockchain environment to rapidly iterate on your code.\n\n## Installation\n\n<TerminalPicker storage=\"macOs\">\n\n```terminal !! macOS\n$ brew install clarinet\n```\n\n```terminal !! Windows\n$ winget install clarinet\n```\n\n```terminal !! Cargo\n$ sudo apt install build-essential pkg-config libssl-dev\n```\n\n```terminal !! Pre-built binary\n$ wget -nv https://github.com/hirosystems/clarinet/releases/download/v0.27.0/clarinet-linux-x64-glibc.tar.gz -O clarinet-linux-x64.tar.gz\n$ tar -xf clarinet-linux-x64.tar.gz\n$ chmod +x ./clarinet\n$ mv ./clarinet /usr/local/bin\n```\n\n</TerminalPicker>\n\n## Set up shell completions\n\nClarinet already has many different commands built in. Therefore, enabling tab completion in your shell may be useful. Using the command below, you can use `clarinet` to generate the shell completion scripts for many common shells.\n\n```terminal\n$ clarinet completions (bash|elvish|fish|powershell|zsh)\n```\n\nAfter generating the file, you can refer to the documentation for your shell to determine where this file should be moved to and what other steps may be necessary to enable tab completion for `clarinet`.\n\n## Guides\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/clarinet/guides/create-a-new-project\"\n title=\"Create a new contract\"\n description=\"Add new contracts to your project and have them automatically configured in your project file.\"\n />\n <SecondaryCard\n href=\"/stacks/clarinet-js-sdk/guides/unit-testing\"\n title=\"Write unit tests\"\n description=\"Leverage the Clarinet JS SDK to write comprehensive unit tests, ensuring your contract performs as expected.\"\n />\n <SecondaryCard\n href=\"/stacks/clarinet/guides/create-deployment-plans\"\n title=\"Create deployment plans\"\n description=\"Employ customizable deployment plans to streamline your contract deployments.\"\n />\n <SecondaryCard\n href=\"/stacks/clarinet/guides/run-a-local-devnet\"\n title=\"Run a local development environment\"\n description=\"Set up a local devnet environment for developing and testing in a controlled environment before deployment.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Clarinet JS SDK](/stacks/clarinet-js-sdk)**: Simplify your testing with the Clarinet JS SDK.\n- **[Hiro Platform](/stacks/platform)**: A developer platform for building, deploying and scaling Bitcoin apps.\n- **[Stacks.js](/stacks/stacks.js)**: Leverage a JavaScript library that handles basic functions, such as user authentication and transaction signing.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n"],[231,"\nimport { Badge } from '@/components/ui/badge';\n\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nPost-conditions in Stacks transactions provide an additional layer of security. They ensure that transactions execute as expected without requiring the user to know the underlying smart contract code.\n\nIn this guide, you will learn how to:\n\n1. [Construct post-conditions](#constructing-post-conditions).\n2. [Use post-conditions](#using-post-conditions).\n3. [Set the post-condition mode](#setting-the-post-condition-mode).\n4. [Usage examples](#usage-examples).\n\n---\n\n## Constructing post-conditions\n\nIn Stacks.js, post-conditions can be constructed using the Pc helpers. These are inspired by Behavior Driven Development (BDD).\n\nStart with the `Pc.principal` initializer to specify the address of the principal that will be verified in the post-condition. Then auto-complete the rest of the post-condition.\n\n## Using post-conditions\n\nPost-conditions can be added to contract calls and FT/NFT transfers to ensure assets are transferred as specified.\n\nFor instance, the following post-condition ensures that the principal initiating the transaction must send exactly 1000 uSTX, or else the transaction will abort.\n\n```ts -cn\nimport { Pc } from '@stacks/transactions';\n\nconst postCondition = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')\n .willSendEq(1000)\n .ustx();\n```\n\n<Accordions>\n <Accordion title=\"All transfer methods\">\n STX/FT\n\n `.willSendEq(amount: number)` ensures that the amount to be sent is **exactly** the specified value.\n \n `.willSendGte(amount: number)` ensures that the amount to be sent is **greater than or equal** to the specified value.\n \n `.willSendGt(amount: number)` ensures that the amount to be sent is **greater than** the specified value.\n \n `.willSendLte(amount: number)` ensures that the amount to be sent is **less than or equal** to the specified value.\n \n `.willSendLt(amount: number)` ensures that the amount to be sent is **less than** the specified value.\n\n `.ustx()` to specify uSTX as the FT asset _(ends the builder)_\n\n `.ft(contract: string, tokenName: string)` to specify a specific FT asset _(ends the builder)_\n\n ---\n \n NFT\n\n `.willSendAsset()` ensures that an asset should **be sent**.\n \n `.willNotSendAsset()` to specify an asset should **not be sent**\n </Accordion>\n</Accordions>\n\n## Setting the post-condition mode\n\nWhen creating a transaction, the mode of the transaction can be set to `Allow` or `Deny` to specify whether unspecified asset transfers are permitted.\n\n```ts -n\nimport { PostConditionMode } from '@stacks/transactions';\n\nconst tx = await makeContractCall({\n // ...\n postConditionMode: PostConditionMode.Allow,\n // OR\n postConditionMode: PostConditionMode.Deny,\n // ...\n});\n```\n\nEssentially, the `postConditionMode` is what tells the Stacks node whether to require (`Deny`) or ignore (`Allow`) the post-conditions when evaluating the transaction.\n\n## Usage examples\n\n### Amount uSTX sent\n\nConstruct a post-condition for a certain amount of uSTX to be sent.\n\n```ts -cn\nimport { Pc } from '@stacks/transactions';\n\nconst postCondition = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')\n .willSendEq(1000)\n .ustx();\n```\n\n### Amount FT sent\n\nConstruct a post-condition for a certain amount of a specific FT to be sent.\n\n```ts -cn\nimport { Pc } from '@stacks/transactions';\n\nconst postCondition = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6.token-ft')\n .willSendGte(500)\n .ft('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6.token-ft', 'token');\n```\n\n### Amount NFT sent / not sent\n\nConstruct a post-condition for sending / not-sending a specific NFT.\n\n```ts -cn\nimport { Pc } from '@stacks/transactions';\n\nconst postCondition = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')\n .willNotSendAsset()\n .nft('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6.token-nft::token', Cl.uint(12));\n```\n\n### Amount SFT sent / not sent\n\nConstruct a post-condition for sending / not-sending a specific SFT (Semi-fungible token).\n\n```ts -cn\nimport { Cl, Pc } from '@stacks/transactions';\n\nconst postConditionForNFT = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')\n.willSendAsset()\n.nft(\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.semi-fungible-token::semi-fungible-token-id\",\n Cl.tuple({ \"token-id\": Cl.uint(1), owner: Cl.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6') })\n);\n\nconst postConditionForFT = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')\n.willSendEq(500)\n.ft(\"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.semi-fungible-token\", \"semi-fungible-token\");\n```\n\n<Callout title=\"Note\">\nThe previous builders (`makeStandardSTXPostCondition`, `makeStandardFungiblePostCondition`, etc) were removed in `v7.0.0`.\n</Callout>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/stacks.js/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to broadcast transactions with Stacks.js.\"\n />\n <Card\n href=\"/stacks/stacks.js/packages/transactions\"\n title=\"API References\"\n description=\"Dive deeper into the API references for the Stacks.js transactions package.\"\n />\n</Cards>"],[232,"\nimport { Badge } from '@/components/ui/badge';\n\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nUsing Stacks.js with React Native allows you to integrate Stacks blockchain functionalities into mobile applications.\n\nIn this guide, you will learn how to:\n\n1. [Set up the Expo project](#set-up-the-expo-project).\n2. [Install necessary dependencies](#install-necessary-dependencies).\n3. [Add NodeJS polyfills](#add-nodejs-polyfills).\n4. [Add global polyfills](#add-global-polyfills).\n5. [Use Stacks.js in the project](#use-stacksjs-in-the-project).\n\n{/* <Callout>To see this guide in action, check out a full example [here](https://github.com/hirosystems/stacks.js-react-native-expo-51).</Callout> */}\n\n---\n\n## Set up the Expo project\n\nStart by creating a new Expo project using `create-expo-app`.\n\n```terminal\n$ npx create-expo-app@latest\n```\n\nThis will generate a boilerplate Expo project. You can run the project with `npm start` and connect a mobile device for previewing via the shown QR code.\n\n## Install necessary dependencies\n\nInstall Stacks.js libraries along with other dependencies needed for polyfilling browser-specific and NodeJS-specific APIs.\n\n```terminal\n$ npm install @stacks/transactions @stacks/wallet-sdk\n$ npm install --save-dev buffer process react-native-get-random-values text-encoding readable-stream crypto-browserify @peculiar/webcrypto\n```\n\n## Add NodeJS polyfills\n\nModify the project's Metro configuration to include polyfills for missing NodeJS modules.\n\n```terminal\n$ npx expo customize metro.config.js\n```\n\n```js metro.config.js -cn\nconst { getDefaultConfig } = require(\"expo/metro-config\");\n\nconst config = getDefaultConfig(__dirname);\n\nconfig.resolver.extraNodeModules = {\n stream: require.resolve(\"readable-stream\"),\n crypto: require.resolve(\"crypto-browserify\"),\n};\n\nmodule.exports = config;\n```\n\n## Add global polyfills\n\nUpdate the Expo entry point to include polyfills.\n\n1. Create `polyfill.js` file\n2. Create `index.js` file\n3. Update the `package.json`\n\n```js polyfill.js -cn\nimport { Buffer } from \"buffer/\";\nimport process from \"process\";\nimport \"react-native-get-random-values\";\nimport { TextDecoder, TextEncoder } from \"text-encoding\";\n\nglobal.process = process;\nglobal.Buffer = Buffer;\nglobal.TextEncoder = TextEncoder;\nglobal.TextDecoder = TextDecoder;\n```\n\n```js index.js -cn\nimport \"./polyfill\";\nimport { Crypto } from \"@peculiar/webcrypto\";\n\nObject.assign(global.crypto, new Crypto());\n\nimport \"expo-router/entry\";\n```\n\n```json package.json\n\"main\": \"index.js\",\n```\n\n<Callout>\nEnsure that the polyfills live in their own file as specified to avoid any runtime issues.\n</Callout>\n\n## Use Stacks.js in the project\n\nEdit the `app/(tabs)/index.tsx` file to integrate Stacks.js functionalities, starting with the imports.\n\n```tsx app/(tabs)/index.tsx -cn\nimport {\n TransactionVersion,\n getAddressFromPrivateKey,\n makeSTXTokenTransfer,\n} from \"@stacks/transactions\";\nimport { Wallet, generateSecretKey, generateWallet } from \"@stacks/wallet-sdk\";\nimport { useState } from \"react\";\n```\n\nNow you can start to manage the state as follows:\n\n```tsx app/(tabs)/index.tsx -cn\nexport default function HomeScreen() {\n const [mnemonic, setMnemonic] = useState(\"...\");\n const [wallet, setWallet] = useState<Wallet | null>(null);\n const [log, setLog] = useState(\"\");\n}\n```\n\nNext, to generate a wallet and sign a transaction:\n\n```tsx app/(tabs)/index.tsx -cn\nconst generate = async () => {\n const mnemonic = generateSecretKey();\n setMnemonic(mnemonic);\n\n const wallet = await generateWallet({\n secretKey: mnemonic,\n password: \"\",\n });\n setWallet(wallet);\n\n await makeSTXTokenTransfer({\n amount: 1000,\n anchorMode: \"any\",\n recipient: \"SP3W993D3BRDYB284CY3SBFDEGTC5XEDJPDEA21CN\",\n senderKey: wallet.accounts[0].stxPrivateKey,\n fee: 10,\n network: \"mainnet\",\n nonce: 0,\n });\n setLog(\"Transaction signed successfully ☑\");\n};\n```\n\nAnd lastly, to integrate the UI:\n\n```tsx app/(tabs)/index.tsx -cn\n<ThemedView>\n <ThemedText type=\"subtitle\">Seed Phrase</ThemedText>\n <ThemedText>{mnemonic}</ThemedText>\n <Button title=\"Generate Seed Phrase\" onPress={generate} />\n {wallet && (\n <>\n <ThemedText type=\"subtitle\">Address</ThemedText>\n <ThemedText>\n {getAddressFromPrivateKey(\n wallet.accounts[0].stxPrivateKey,\n TransactionVersion.Mainnet\n )}\n </ThemedText>\n </>\n )}\n {log && <ThemedText>{log}</ThemedText>}\n</ThemedView>\n```\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/stacks.js/packages/transactions\"\n title=\"API References\"\n description=\"Dive into the API references for Stacks.js.\"\n />\n</Cards>"],[230,"\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nThe process of broadcasting transactions is fundamental for interacting with blockchains, whether you're transferring tokens, deploying contracts, or executing contract functions.\n\nIn this guide, you will learn how to:\n\n1. [Install the necessary packages for building and broadcasting transactions](#setup-and-installation)\n2. [Build different types of transactions](#create-a-transaction)\n3. [Sign and broadcast those transactions to the Stacks blockchain](#broadcasting-the-transaction)\n4. [Process and handle the results](#handle-the-results)\n\n{/* <Callout title=\"Example Repo\">To see this guide in action, check out a full example [here](https://github.com/hiro-so/stacks-connect-example).</Callout> */}\n\n---\n\n## Setup and installation\n\nInstall the required packages to start building and broadcasting transactions.\n\n```package-install\n@stacks/network @stacks/transactions @stacks/connect\n```\n\n- **`@stacks/network`**: Used to interact with the Stacks blockchain network.\n- **`@stacks/transactions`**: Used to build the transactions.\n- **`@stacks/connect`**: Used to authenticate users and broadcast the transactions.\n\n## Create a transaction\n\nThere are three types of transactions:\n\n- STX transfer\n- Contract deployment\n- Contract execution\n\n<Tabs defaultValue=\"transfer\">\n <TabsList className='flex flex-wrap md:w-max'>\n <TabsTrigger value=\"transfer\" className='tab group'>\n <Badge variant='outline' className='badge transition-colors hover:text-neutral-90 dark:group-hover:text-white'>STX transfer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"deploy\" className='tab group'>\n <Badge variant='outline' className='badge transition-colors hover:text-neutral-90 dark:group-hover:text-white'>Contract deployment</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"execute\" className='tab group'>\n <Badge variant='outline' className='badge transition-colors hover:text-neutral-90 dark:group-hover:text-white'>Contract execution</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"transfer\">\n To transfer STX, use the `makeSTXTokenTransfer` function provided by the `@stacks/transactions` package:\n\n ```ts stx-transfer.ts -cn\n import { broadcastTransaction, makeSTXTokenTransfer } from \"@stacks/transactions\";\n\n const transaction = await makeSTXTokenTransfer({\n recipient: \"SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159\",\n amount: 12345n,\n senderKey:\n \"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601\",\n network: \"devnet\",\n });\n ```\n\n This builds a STX token transfer transaction. The `makeSTXTokenTransfer` function takes parameters like the `recipient` address, `amount` to transfer, and the sender's private key, ie `senderKey`.\n\n Several parameters are available for calling `makeSTXTokenTransfer`. To learn more, check out our [transactions reference page](/stacks/stacks.js/packages/transactions).\n\n </TabsContent>\n <TabsContent value=\"deploy\">\n To deploy a contract, use the `makeContractDeploy` function provided by the `@stacks/transactions` package:\n\n ```ts contract-deploy.ts -cn\n import { broadcastTransaction, makeContractDeploy } from '@stacks/transactions';\n\n const transaction = await makeContractDeploy({\n contractName: 'hello-world',\n codeBody: `(define-public (hello)\n (ok \"Hello, world!\"))`,\n senderKey: '753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601',\n network: \"testnet\",\n });\n ```\n\n This builds a contract deployment transaction. The `makeContractDeploy` function takes parameters like the `contractName`, `codeBody`, and the sender's private key, ie `senderKey`.\n\n Several parameters are available for calling `makeContractDeploy`. To learn more, check out our [transactions reference page](/stacks/stacks.js/packages/transactions).\n\n </TabsContent>\n <TabsContent value=\"execute\">\n To execute a contract function, use the `makeContractCall` function provided by the `@stacks/transactions` package:\n\n ```ts function-call.ts -cn\n import {\n broadcastTransaction,\n bufferCVFromString,\n Cl,\n makeContractCall,\n Pc,\n } from \"@stacks/transactions\";\n\n const postCondition = Pc.principal(\"SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE\")\n .willSendEq(1000000n)\n .ustx();\n\n const transaction = await makeContractCall({\n contractAddress: \"SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X\",\n contractName: \"contract_name\",\n functionName: \"contract_function\",\n functionArgs: [Cl.bufferFromAscii(\"foo\")],\n senderKey:\n \"b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01\",\n validateWithAbi: true,\n network: \"testnet\",\n postConditions: [postCondition],\n });\n ```\n\n This builds a contract function call transaction. The `makeContractCall` function takes parameters like the `contractAddress`, `contractName`, `functionName`, `functionArgs`, `senderKey`, `validateWithAbi`, `network`, `postConditions`, and `anchorMode`.\n\n Several parameters are available for calling `makeContractCall`. To learn more, check out our [transactions reference page](/stacks/stacks.js/packages/transactions).\n\n </TabsContent>\n</Tabs>\n\n## Broadcasting the transaction\n\nAfter building the transaction, broadcast it to the Stacks blockchain network using the `broadcastTransaction` function from the `@stacks/transactions` package.\n\n1. Pass in the transaction object you created in the previous step to the `broadcastTransaction` function.\n2. Handle the response by logging the response object.\n\n```ts -cn\nimport { broadcastTransaction } from '@stacks/transactions';\n\nconst broadcastResponse = await broadcastTransaction({ transaction });\n```\n\nThis code sends the signed transaction to the Stacks blockchain. The `broadcastTransaction` function returns a response containing the transaction ID, which can be used to track the transaction on the blockchain.\n\n## Handle the results\n\nHandle the transaction results by checking the transaction status and responding accordingly.\n\n```ts -cn\nif (broadcastResponse.success) {\n console.log('Transaction successful with ID:', broadcastResponse.txid);\n} else {\n console.error('Transaction failed with error:', broadcastResponse.error);\n}\n```\n\nThis checks if the transaction was successful and logs the `txid`.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/stacks.js/guides/post-conditions\"\n title=\"Deep dive into post-conditions\"\n description=\"Learn how to use post-conditions to secure your smart contracts.\"\n />\n <Card\n href=\"/stacks/stacks.js/packages/transactions\"\n title=\"API References\"\n description=\"Dive into the API references for Stacks.js.\"\n />\n</Cards>"],[353,"\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nThe process of broadcasting transactions is fundamental for interacting with blockchains, whether you're transferring tokens, deploying contracts, or executing contract functions.\n\nIn this guide, you will learn how to:\n\n1. [Install the necessary packages](#setup-and-installation)\n2. [Connect to a user's wallet](#connect-to-a-users-wallet)\n3. [Sign and broadcast transactions](#sign-and-broadcast-transactions)\n4. [Handle transaction results](#handle-transaction-results)\n\n---\n\n## Setup and installation\n\nInstall the required packages to start building and broadcasting transactions:\n\n```package-install\n@stacks/connect @stacks/transactions\n```\n\n## Connect to a user's wallet\n\nBefore signing transactions, users need to connect their wallet to your application. Use the `connect` function to initiate a wallet connection:\n\n```ts\nimport { connect, isConnected } from '@stacks/connect';\n\nasync function connectWallet() {\n if (!isConnected()) {\n const response = await connect();\n console.log('Connected with addresses:', response);\n }\n}\n```\n\n<Callout>\n For more details on wallet connection, see the [authentication guide](/stacks/connect/guides/authenticate-users).\n</Callout>\n\n## Sign and broadcast transactions\n\nThere are three types of transactions you can create: STX transfers, contract deployments, and contract calls.\n\n<Tabs defaultValue=\"transfer\">\n <TabsList className='flex flex-wrap md:w-max'>\n <TabsTrigger value=\"transfer\" className='tab group'>\n <Badge className='badge transition-colors'>STX transfer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"deploy\" className='tab group'>\n <Badge className='badge transition-colors'>Contract deployment</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"execute\" className='tab group'>\n <Badge className='badge transition-colors'>Contract execution</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"transfer\">\n To transfer STX tokens, use the `request` method with `stx_transferStx`:\n\n ```ts\n import { request } from '@stacks/connect';\n\n async function transferStx() {\n const response = await request('stx_transferStx', {\n recipient: 'ST2EB9WEQNR9P0K28D2DC352TM75YG3K0GT7V13CV',\n amount: '100', // in micro-STX (1 STX = 1,000,000 micro-STX)\n memo: 'Reimbursement', // optional\n });\n \n console.log('Transaction ID:', response.txId);\n }\n ```\n </TabsContent>\n <TabsContent value=\"deploy\">\n To deploy a smart contract, use the `request` method with `stx_deployContract`:\n\n ```ts\n import { request } from '@stacks/connect';\n\n async function deployContract() {\n const codeBody = '(define-public (say-hi) (ok \"hello world\"))';\n \n const response = await request('stx_deployContract', {\n name: 'my-contract',\n code: codeBody,\n clarityVersion: 3, // optional, defaults to latest version\n });\n \n console.log('Transaction ID:', response.txId);\n }\n ```\n\n <Callout>Contracts will deploy to the Stacks address of the connected wallet.</Callout>\n </TabsContent>\n <TabsContent value=\"execute\">\n To call a contract function, use the `request` method with 'stx_callContract'. Here's an example using a simple contract:\n\n ```clarity\n (define-public (say-hi)\n (print \"hi\")\n (ok u0)\n )\n ```\n\n Here's how to call this function:\n\n ```ts\n import { request } from '@stacks/connect';\n import { Cl } from '@stacks/transactions';\n\n async function callContract() {\n const response = await request('stx_callContract', {\n contractAddress: 'ST22T6ZS7HVWEMZHHFK77H4GTNDTWNPQAX8WZAKHJ',\n contractName: 'my-contract',\n functionName: 'say-hi',\n functionArgs: [], // array of Clarity values\n });\n \n console.log('Transaction ID:', response.txId);\n }\n ```\n\n For functions that take arguments, you can use the `Cl` namespace to construct Clarity values:\n\n ```ts\n const functionArgs = [\n Cl.uint(123),\n Cl.stringAscii(\"hello\"),\n Cl.standardPrincipalCV(\"ST1X..\"),\n ];\n ```\n </TabsContent>\n</Tabs>\n\n## Handle transaction results\n\nWhen a transaction is signed and broadcast, the `request` method returns a response object containing information about the transaction:\n\n```ts\ninterface TransactionResponse {\n txId: string; // The transaction ID\n txRaw: string; // The raw transaction hex\n}\n```\n\nYou can use the transaction ID to create a link to view the transaction in the explorer:\n\n```ts\nasync function handleTransaction() {\n const response = await request('stx_transferStx', {\n recipient: 'ST2EB9WEQNR9P0K28D2DC352TM75YG3K0GT7V13CV',\n amount: '100',\n });\n \n const explorerUrl = `https://explorer.stacks.co/txid/${response.txId}`;\n console.log('View transaction in explorer:', explorerUrl);\n}\n```\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/sign-messages\"\n title=\"Sign messages\"\n description=\"Learn how to sign messages using Stacks.js.\"\n />\n <Card\n href=\"/stacks/stacks.js/guides/post-conditions\"\n title=\"Deep dive into post-conditions\"\n description=\"Learn how to use post-conditions to secure your smart contracts.\"\n />\n</Cards>\n"],[354,"\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nWith Stacks Connect, users can sign a cryptographic message to prove ownership of a particular address. This is helpful for a wide range of use cases. For example, you can use message signing to create token-gated features (a user signs a message to prove they control an address holding the corresponding token requirements) or to prove the user agreed to your terms of service.\n\nIn this guide, you will learn how to:\n\n1. [Set up and install necessary packages](#setup-and-installation).\n2. [Connect to a user's wallet](#connect-to-a-users-wallet).\n3. [Sign messages](#sign-messages).\n4. [Verify signatures](#verify-signatures).\n\n---\n\n## Setup and installation\n\nUsing your preferred package manager, install the following packages:\n\n```package-install\n@stacks/connect @stacks/encryption\n```\n\n## Connect to a user's wallet\n\nBefore signing messages, users need to connect their wallet to your application. Use the `connect` function to initiate a wallet connection:\n\n```ts\nimport { connect, isConnected } from '@stacks/connect';\n\nasync function connectWallet() {\n if (!isConnected()) {\n const response = await connect();\n console.log('Connected with addresses:', response);\n }\n}\n```\n\n<Callout>\n For more details on wallet connection, see the [authentication guide](/stacks/connect/guides/authenticate-users).\n</Callout>\n\n## Sign messages\n\nTo request a message signature, use the `request` method with `stx_signMessage`:\n\n```ts\nimport { request } from '@stacks/connect';\n\nasync function signMessage() {\n const message = 'Hello World';\n \n const response = await request('stx_signMessage', {\n message,\n });\n \n console.log('Signature:', response.signature);\n console.log('Public key:', response.publicKey);\n}\n```\n\nFor structured messages, you can use `stx_signStructuredMessage`:\n\n```ts\nimport { request } from '@stacks/connect';\nimport { Cl } from '@stacks/transactions';\n\nasync function signStructuredMessage() {\n const message = Cl.tuple({\n structured: Cl.stringAscii('message'),\n num: Cl.uint(3)\n });\n \n const domain = Cl.tuple({\n name: Cl.stringAscii('My App'),\n version: Cl.stringAscii('1.0.0'),\n 'chain-id': Cl.uint(1)\n });\n\n const response = await request('stx_signStructuredMessage', {\n message,\n domain\n });\n \n console.log('Signature:', response.signature);\n console.log('Public key:', response.publicKey);\n}\n```\n\n## Verify signatures\n\nTo verify a signature, use the `verifyMessageSignatureRsv` function from the `@stacks/encryption` package:\n\n```ts\nimport { verifyMessageSignatureRsv } from '@stacks/encryption';\n\nasync function verifySignature() {\n const message = 'Hello World';\n \n const response = await request('stx_signMessage', {\n message\n });\n \n const { signature, publicKey } = response;\n \n const verified = verifyMessageSignatureRsv({\n message,\n signature,\n publicKey\n });\n \n if (verified) {\n console.log('Signature verified!');\n }\n}\n```\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n <Card\n href=\"/stacks/stacks.js/guides/post-conditions\"\n title=\"Deep dive into post-conditions\"\n description=\"Learn how to use post-conditions to secure your smart contracts.\"\n />\n</Cards>\n"],[13,"\nimport { Button } from \"@/components/ui/button\"\nimport { SecondaryCard } from \"@/components/card\"\n\nThe Hiro Archive enables you to quickly bootstrap supported services with pre-loaded data, which otherwise could take you days or weeks to acquire when syncing from genesis. This is a public service Hiro offers as a free benefit to the Stacks community.\n\n<Button className=\"bg-orange-500 hover:bg-orange-600\">\n <a href=\"https://archive.hiro.so/\" target=\"_blank\" className=\"no-underline\">\n View the Hiro Archive\n </a>\n</Button>\n\n## Supported services\n\nWe record and archive mainnet and testnet snapshots for the following services every night:\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/archive/guides/verify-archive-data\"\n title=\"Verify archive data\"\n description=\"Verify the integrity of the data in a particular snapshot.\"\n />\n <SecondaryCard\n href=\"/stacks/archive/guides/stacks-blockchain\"\n title=\"Stacks blockchain\"\n description=\"Quickly spin up a new Stacks node.\"\n />\n <SecondaryCard\n href=\"/stacks/archive/guides/stacks-api\"\n title=\"Stacks Blockchain API\"\n description=\"Spin up a new instance of the Stacks Blockchain API.\"\n />\n <SecondaryCard\n href=\"/stacks/archive/guides/token-metadata-api\"\n title=\"Token Metadata API\"\n description=\"Spin up a new instance of the Token Metadata API.\"\n />\n</Cards>\n"],[44,"\nimport { Card as MainCard, SmallCard } from '@/components/card';\nimport { ImageZoom } from 'fumadocs-ui/components/image-zoom';\nimport { PageFooter } from '@/components/footer';\nimport { MessageCircle, Braces, ChevronRight, Code, Database, Play, Rocket, Star, Terminal, Wallet } from 'lucide-react';\nimport { API, Backend, BugIcon, Clarinet, Cloud, Chainhook, Frontend, Hiro, Js, Newspaper, Pulse, QuestionIcon } from '@/components/ui/icon';\nimport heroImage from '@/public/stacks-hero.svg';\n\n<div className='flex flex-col space-y-10 pt-0'>\n\n<div className='flex space-x-6 items-end'>\n <ImageZoom\n alt=\"banner\"\n src={heroImage}\n className=\"mt-0 mb-6 first-line:rounded-xl bg-background\"\n priority\n />\n\n <div className='flex flex-col [&_h2]:mt-0 [&_h2]:mb-2 [&_p]:mb-6'>\n\n ## Build with Stacks\n\n Find all the guides and resources you need to build on Stacks.\n\n </div>\n</div>\n\n<Cards>\n <MainCard\n className='group space-y-1'\n icon={<Play className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/stacks/get-started\"\n title=\"Get Started\"\n description=\"Get started with our end-to-end tutorials and quickstart guides across all Hiro tools.\"\n />\n <MainCard\n className='group space-y-1'\n icon={<API className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/stacks/api\"\n title=\"Stacks API Reference\"\n description=\"Explore API endpoints for interacting with the Stacks Blockchain.\"\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"explore-by-category\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#explore-by-category\" className=\"not-prose group text-sm uppercase\">Explore by category</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Cloud />}\n href=\"/stacks/platform\"\n title=\"Quickstart App Templates\"\n description=\"Full-stack starter-kits, including front-end, back-end, and smart contract components.\"\n />\n <SmallCard\n icon={<Code />}\n href=\"/stacks/clarinet\"\n title=\"Smart Contract Development\"\n description=\"Kickstart your smart contract journey with Clarinet and the Clarinet JS SDK.\"\n />\n <SmallCard\n icon={<Database />}\n href=\"/stacks/chainhook\"\n title=\"Data Streaming & Events\"\n description=\"Create custom event streams for real-time data with Chainhook.\"\n />\n <SmallCard\n icon={<Frontend />}\n href=\"/stacks/stacks.js\"\n title=\"Frontend Web Development\"\n description=\"Interact with smart contracts on the web with the Stacks.js library.\"\n />\n <SmallCard\n icon={<Backend />}\n href=\"/stacks/api\"\n title=\"Backend Development\"\n description=\"Explore our hosted APIs offering a familiar REST interface.\"\n />\n <SmallCard\n icon={<Braces />}\n href=\"/stacks/token-metadata-api\"\n title=\"Token Management\"\n description=\"Explore our hosted API for fetching token metadata on Stacks.\"\n />\n</Cards>\n\n</div>\n\n\n<div className='flex flex-col'>\n\n<h4 id=\"explore-by-tool\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#explore-by-tool\" className=\"not-prose group text-sm uppercase\">Explore by tool</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Hiro />}\n href=\"/stacks/platform\"\n title=\"Hiro Platform\"\n description=\"A developer platform for building, deploying and scaling Bitcoin apps.\"\n />\n <SmallCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet\"\n title=\"Clarinet\"\n description=\"Create, test, and deploy smart contracts on the Stacks blockchain.\"\n />\n <SmallCard\n icon={<API />}\n href=\"/stacks/api\"\n title=\"Stacks Blockchain API\"\n description=\"Interact with the Stacks blockchain from your backend via our hosted API.\"\n />\n <SmallCard\n icon={<Js />}\n href=\"/stacks/stacks.js\"\n title=\"Stacks.js\"\n description=\"A collection of JavaScript libraries to build web applications on Stacks.\"\n />\n <SmallCard\n icon={<Chainhook />}\n href=\"/stacks/chainhook\"\n title=\"Chainhook\"\n description=\"Create customizable, lightweight databases for on-chain events for Bitcoin and Stacks.\"\n />\n</Cards>\n\n</div>\n\n</div>\n\n<PageFooter />"],[466,"\nimport { Card, SmallCard } from '@/components/card';\nimport { ImageZoom } from 'fumadocs-ui/components/image-zoom';\nimport { PageFooter } from '@/components/footer';\nimport { Database, Play } from 'lucide-react';\nimport { API, Backend, Chainhook, Newspaper, Ordinals, QuestionIcon, BugIcon, Pulse } from '@/components/ui/icon';\nimport heroImage from '@/public/bitcoin-hero.svg';\n\n<div className='flex flex-col space-y-10'>\n\n<div className='flex space-x-6 items-end'>\n <ImageZoom\n alt=\"banner\"\n src={heroImage}\n className=\"mt-0 mb-6 first-line:rounded-xl bg-background\"\n priority\n />\n\n <div className='flex flex-col [&_h2]:mt-0 [&_h2]:mb-2 [&_p]:mb-6'>\n\n ## Build with Bitcoin\n\n Find all the guides and resources you need to build on Ordinals and Runes.\n\n </div>\n</div>\n\n<Cards>\n <Card\n className='group space-y-1'\n icon={<Play className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/bitcoin/get-started\"\n title=\"Get Started\"\n description=\"Get started with our end-to-end tutorials and quickstart guides across all Hiro's ordinals tools.\"\n />\n <Card\n className='group space-y-1'\n icon={<API className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/bitcoin/ordinals/api\"\n title=\"Ordinals API Reference\"\n description=\"Explore API endpoints for interacting with Ordinals and meta-protocols.\"\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"explore-bitcoin\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#explore-bitcoin\" className=\"not-prose group text-sm uppercase\">Explore Bitcoin</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Ordinals />}\n href=\"/bitcoin/indexer\"\n title=\"Bitcoin Indexer\"\n description=\"Use the Bitcoin Indexer to index and query Bitcoin blockchain data.\"\n />\n <SmallCard\n icon={<API />}\n href=\"/bitcoin/ordinals/api\"\n title=\"Ordinals API\"\n description=\"Fetch on-chain data for Ordinals and meta-protocols with our hosted API.\"\n />\n <SmallCard\n icon={<Play />}\n href=\"https://ordinals.hiro.so/\"\n title=\"Ordinals Explorer\"\n description=\"View on-chain data for Ordinals and meta-protocols with our explorer.\"\n />\n <SmallCard\n icon={<API />}\n href=\"/bitcoin/runes/api\"\n title=\"Runes API\"\n description=\"Interact with the Runes protocol from your backend via our hosted API.\"\n />\n</Cards>\n\n</div>\n\n</div>\n\n<PageFooter />"],[239,"\nimport { Card, SmallCard } from '@/components/card';\nimport { Play, FileSignature } from 'lucide-react';\n\n## WITHOUT direct private key access\n\nMost users interact with apps via their favorite Stacks wallet.\nDevelopers can build web apps that prompt the user for an action (e.g. sign a transaction), and then the wallet will handle the rest.\n\n<SmallCard\n icon={<Play className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/stacks/connect\"\n title=\"Build Web Apps\"\n description=\"You can build Stacks enabled web apps without direct private key access using Stacks Connect.\"\n/>\n\n## WITH private key access\n\nDevelopers can build scripts, backends, and tools intended for full control over private keys.\n\n- Using the Stacks.js CLI directly to send transactions, or perform common tasks\n- Building custom tools using Stacks.js libraries that manage private keys directly\n\n### Generating random private keys\n\nLet's start by generating a random private key.\nNote that this will return a different value each time you run the code.\n\n```ts -n\nimport { randomPrivateKey } from '@stacks/transactions';\n\nconst privateKey = randomPrivateKey();\n// 'f5a31c1268a1e37d4edaa05c7d11183c5fbfdcdc48aae36ea4d8cd5cb709932801'\n```\n\nPrivate keys are typically represented as hex strings in Stacks.js.\nFor more control you can use the `PrivateKey` type, which also accepts raw bytes as `Uint8Array` in JavaScript.\n\n### Using a wallet / seed phrase\n\nTypically, we don't want to generate random private keys, but instead use a deterministic wallet based on a seed phrase.\n\n#### Generate a random seed phrase (24 words):\n\n```ts -n\nimport { randomSeedPhrase } from '@stacks/wallet-sdk';\n\nconst phrase = randomSeedPhrase();\n// \"warrior volume sport ... figure cake since\"\n```\n\n#### Generate a wallet from a seed phrase:\n\n```ts -n\nimport { generateWallet, randomSeedPhrase } from '@stacks/wallet-sdk';\n\nconst seedPhrase = randomSeedPhrase();\n\nlet wallet = await generateWallet({\n secretKey: seedPhrase,\n password: \"secret\",\n});\n\nconsole.log(wallet.accounts[0]); // one account is generated by default\n// { \n// stxPrivateKey: '893fc4936c5350394bbe0053d2c31a4b5a44680f6dceb4be2aacaaa3c12e45ff01',\n// dataPrivateKey: '676dc36d89ba04cf1789552fc35f3a6279b4b5f13f3d49fb469b0afecea9698f',\n// appsKey: 'xprvA19evFHUzrZF3wULUSv1UVcQNRP7xJ2vn2MyAKaUHbT8SvjrrkkhANRG2bewMxHAeDSoUVUBRPiztDc8WwGtz9Ero2GXW5rk3vHHXmutb4V',\n// salt: 'cf8a5c7142d842bb38f30c5ab626f7996dd7494236edf21ba00349bb09b9558d',\n// index: 0\n// } \n```\n\n#### Generate more accounts:\n\n```ts -n\nimport { generateNewAccount, generateWallet, randomSeedPhrase } from '@stacks/wallet-sdk';\n\nconst seedPhrase = randomSeedPhrase();\n\nlet wallet = await generateWallet({\n secretKey: seedPhrase,\n password: \"secret\",\n});\n\nwallet = generateNewAccount(wallet);\nconsole.log(wallet.accounts.length); // 2\n```"],[423,"\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\nimport { Step } from 'fumadocs-ui/components/steps';\nimport { SmallCard } from '@/components/card';\n\nIn this quickstart guide, you will set up `runehook` to explore and index Rune activity on the Bitcoin blockchain. You will learn how to install, configure, and run basic commands to scan and stream Rune inscriptions and transfers.\n\n{/* Check out the [Runehook as a service](/bitcoin/runehook/guides/runehook-as-a-service) for a more advanced use case. */}\n\n---\n\n### Prerequisites\n\nBefore starting, ensure you have `runehook` installed. If you haven't already, check out the [installation](/bitcoin/runehook/installation) guide.\n\n---\n\n### Next steps\n\n<Cards className='sm:grid-cols-1'>\n <SmallCard\n icon={<Code />}\n href=\"/bitcoin/runes/api\"\n title=\"Integrate runes data into your app\"\n description=\"Use the Runes API to get reliable data for Runes and BRC-20 tokens.\"\n tag='Runes API'\n />\n</Cards>\n"],[9,"\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\nimport { SmallCard } from '@/components/card';\n\nIn this quickstart guide, you will initialize a simulated development network for testing a smart contract using the Clarinet JS SDK. You'll learn how to initialize your project, interact with a smart contract, call its functions, and test the results.\n\nCheck out the [methods](/stacks/clarinet-js-sdk/references/methods) page for the Clarinet JS SDK to learn about the different ways that you can interact with simnet.\n\n---\n\n<Steps>\n <Step>\n ## Importing dependencies\n \n Before we dive in, navigate to your project and import the `Cl` helper from the `@stacks/transactions` package in your test file.\n\n <Files className='pointer-events-none'>\n <Folder name=\"contracts\" defaultOpen>\n <File name=\"counter.clar\" />\n </Folder>\n <Folder name=\"settings\" />\n <Folder name=\"tests\" defaultOpen>\n <File name=\"counter.test.ts\" className='bg-[hsl(var(--highlight))]' />\n </Folder>\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n </Files>\n\n ```ts counter.test.ts\n import { describe, expect, it } from \"vitest\";\n import { Cl } from \"@stacks/transactions\";\n ```\n\n The `Cl` namespace simplifies the process of creating and handling Clarity values. This functionality is particularly useful in testing environments where developers need to simulate contract interactions accurately.\n \n </Step>\n <Step>\n ## Retrieve an account from the simnet\n \n For most test cases, you'll want to retrieve an account from the network in order to interact with your smart contracts. The following code uses the `getAccounts` method to achieve this.\n\n ```ts counter.test.ts\n import { describe, expect, it } from \"vitest\";\n import { Cl } from \"@stacks/transactions\";\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get(\"wallet_1\")!;\n ```\n\n <Callout title=\"Note\">\n The `--stacks` flag is required and allows you to specify the network to scan. Other options include `--bitcoin`.\n </Callout>\n </Step>\n <Step>\n ## Write your first test\n \n The process for writing tests for smart contracts with the Clarinet JS SDK follows a structured approach similar to testing in JavaScript. Here's a breakdown of the steps involved:\n\n 1. Define the group of tests you want to run using the `describe` block.\n 2. Define the test you want to run using the `it` block.\n 3. Call the function and assert the result using the `expect` function.\n\n Now that you understand the key components for writing tests, start by writing a test that ensures the `counter` contract has been deployed.\n\n ```ts counter.test.ts\n describe(\"counter contract\", () => {\n it(\"ensures the contract is deployed\", () => {\n const contractSource = simnet.getContractSource(\"counter\");\n expect(contractSource).toBeDefined();\n });\n });\n ```\n </Step>\n <Step>\n ## Test the count-up function\n \n Now it's time to call a public function and assert the result. The <code>count-up</code> function is expected to increment the count of the user's principal by 1. Write a test to ensure this behaves as expected.\n\n ```ts counter.test.ts\n describe(\"counter contract\", () => {\n it(\"increments the count of the user's principal by 1\", () => {\n const countUpCall = simnet.callPublicFn(\"counter\", \"count-up\", [], wallet);\n expect(countUpCall.result).toBeOk(Cl.bool(true));\n \n const getCountCall = simnet.callReadOnlyFn(\n \"counter\",\n \"get-count\",\n [Cl.principal(wallet)],\n wallet\n );\n expect(getCountCall.result).toBeUint(1);\n });\n });\n ```\n\n Above, the `count-up` function is called, and the result is asserted to return an `(ok true)`. Then, the count for the user's principal is retrieved and asserted to be `u1`.\n\n <Callout title=\"Custom matchers\">\n <p>The <code>toBeOk</code> and <code>toBeUint</code> methods are used to ensure the `count-up` function returns the proper Clarity values. For more details, check out the [custom matchers](/stacks/clarinet-js-sdk/references/custom-matchers) page.</p>\n </Callout>\n </Step>\n <Step>\n ## Run your tests\n\n Every generated project comes with a <code>package.json</code> file that contains the necessary dependencies and scripts to run your tests.\n \n ```json package.json\n \"scripts\": {\n \"test\": \"vitest run\",\n \"test:report\": \"vitest run -- --coverage --costs\",\n \"test:watch\": \"chokidar \\\"tests/**/*.ts\\\" \\\"contracts/**/*.clar\\\" -c \\\"npm run test:report\\\"\"\n }\n ```\n\n You can now run your tests, with your preferred package manager, by executing the following command:\n \n ```terminal\n $ npm run test\n ```\n </Step>\n <Step>\n ## Run your tests with code coverage and cost analysis\n\n Clarinet can automatically also produce a code coverage report and cost analysis on the test you ran.\n\n ```json package.json\n \"scripts\": {\n \"test\": \"vitest run\",\n \"test:report\": \"vitest run -- --coverage --costs\",\n \"test:watch\": \"chokidar \\\"tests/**/*.ts\\\" \\\"contracts/**/*.clar\\\" -c \\\"npm run test:report\\\"\"\n }\n ```\n\n By running the `npm run test:report` command in your terminal, an `lcov.info` and `costs-reports.json` file will appear in your root folder:\n\n <Files className='pointer-events-none'>\n <Folder name=\"contracts\" defaultOpen>\n <File name=\"counter.clar\" />\n </Folder>\n <Folder name=\"settings\" />\n <Folder name=\"tests\" defaultOpen>\n <File name=\"counter.test.ts\" />\n </Folder>\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"costs-reports.json\" className='bg-[hsl(var(--highlight))]' />\n <File name=\"lcov.info\" className='bg-[hsl(var(--highlight))]' />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n </Files>\n\n The `costs-reports.json` file will output the cost analysis for every function ran in your tests. Since the `count-up` function was used in our test, this is how the cost analysis output would look like for that function:\n\n ```json costs-reports.json\n {\n \"test_name\": \"tests/counter.test.ts__counter contract__increments the count of the user's principal by 1\",\n \"contract_id\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.counter\",\n \"method\": \"count-up\",\n \"args\": [],\n \"cost_result\": {\n \"total\": {\n \"write_length\": 41,\n \"write_count\": 1,\n \"read_length\": 245,\n \"read_count\": 5,\n \"runtime\": 4752\n },\n \"limit\": {\n \"write_length\": 15000000,\n \"write_count\": 15000,\n \"read_length\": 100000000,\n \"read_count\": 15000,\n \"runtime\": 5000000000\n },\n \"memory\": 40,\n \"memory_limit\": 100000000\n }\n }\n ```\n\n To access and read the `lcov.info` file in a human-readable format, we can first install the `lcov` [package](https://github.com/linux-test-project/lcov) that helps generate a graphical front-end for coverage testing tools.\n\n ```terminal\n $ brew install lcov\n ```\n\n Then we'll run the `genhtml` command below with the following options. This command and its options will generate the actual html file, add in additional branch coverage, and will automatically store the files in a new folder called `coverage`.\n\n ```terminal\n $ genhtml lcov.info --branch-coverage -o coverage\n ```\n\n You can then navigate into the new `coverage` folder and run the command `open index.html` to view your coverage report. In addition, a summary of the coverage report will be outputted in the terminal.\n </Step>\n</Steps>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API Reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/guides/migrate-to-the-clarinet-sdk\"\n title=\"Migrating your tests to Clarinet SDK\"\n description=\"Learn how to migrate your existing Clarinet projects to the Clarinet JS SDK\"\n />\n</Cards>"],[357,"\nimport { ChevronRight, Code, Terminal, Folder as FolderIcon } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\n\nIn this quickstart guide, you will learn how to set up your project, authenticate users with a web wallet, and initiate a STX token transfer.\n\nFor a deeper dive into the authentication process, check out the [authenticate users](/stacks/connect/guides/authenticate-users) guide.\n\n---\n\n<Steps>\n <Step>\n ## Install package dependencies\n \n Add the necessary packages to your project using your preferred package manager.\n\n ```package-install\n @stacks/connect\n ```\n </Step>\n <Step>\n ## Connect to a wallet\n \n The `connect` function stores the user's address in local storage by default, making it easy to persist the user's session across page reloads and browser sessions.\n\n ```ts connect.ts\n import { connect } from '@stacks/connect';\n\n const response = await connect();\n ```\n\n To access the user's addresses, you can use the `getLocalStorage` function.\n\n ```ts storage.ts\n import { getLocalStorage } from '@stacks/connect';\n\n const data = getLocalStorage();\n ```\n\n You can manage the connection's state using the following:\n\n ```ts connect.ts\n import { connect, disconnect, isConnected } from '@stacks/connect';\n\n isConnected(); // false\n await connect(); // similar to the `getAddresses` method\n isConnected(); // true\n disconnect(); // clears local storage and selected wallet\n isConnected(); // false\n ```\n </Step>\n <Step>\n ## Use `request` to trigger a transfer\n \n The process of connecting to a wallet gives the web app information about the wallet account, which enables interactions with the Stacks blockchain, like calling smart contracts.\n\n Using the `request` function, you can trigger wallet interactions using the `stx_transferStx` method.\n\n ```tsx connect.tsx\n const response = await request('stx_transferStx', {\n amount: '1000', // amount in micro-STX (1 STX = 1,000,000 micro-STX)\n recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN', // recipient address\n network: 'mainnet', // optional, defaults to mainnet\n memo: 'Optional memo', // optional memo field\n });\n ```\n </Step>\n</Steps>\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/authenticate-users\"\n title=\"Authenticate users\"\n description=\"Learn how to authenticate users using the Connect package in Stacks.js.\"\n />\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n <Card\n href=\"/stacks/connect/guides/sign-messages\"\n title=\"Sign messages\"\n description=\"Learn how to sign messages using Stacks.js.\"\n />\n</Cards>\n"],[27,"\nimport { Clarinet, Js } from '@/components/ui/icon';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\n\nDeployment plans minimize the inherent complexity of deployments, such as smart contract dependencies and interactions, transaction chaining limits, deployment costs, and more. Deployment plans ensure reproducible deployments, a critical workflow for testing purposes.\n\nIn this guide, you will learn how to:\n\n1. [Generate and configure a deployment plan.](#generate-a-deployment-plan)\n2. [Set deployment plan specifications.](#deployment-plan-specifications)\n3. [Add project contract requirements.](#adding-project-contract-requirements)\n4. [Customize your deployment plan.](#edit-your-deployment-plan)\n\n---\n\n## Generate a deployment plan\n\nClarinet uses a deployment plan for every deployment—whether for a basic `simnet`, `devnet` (for use with the `clarinet devnet start` command), or the public `testnet` and `mainnet`.\n\nYou can view the current deployment plan saved to disk at any time with the following command (specifying the network `simnet`, `devnet`, `testnet`, `mainnet`)\n\n```terminal\n$ clarinet deployments generate --<network>\n```\n\nUpon this command, your project's default deployment plan, a `.yaml` file (for example, `default.devnet-plan.yaml`), is generated from your project specifications and contracts. Here, for example, is the deployment plan for [the counter smart contract](/stacks/clarinet/quickstart) used in our quickstart guide:\n\n```yaml deployments/default.devnet-plan.yaml\n---\nid: 0\nname: Devnet deployment\nnetwork: devnet\nstacks-node: \"http://localhost:20443\"\nbitcoin-node: \"http://devnet:devnet@localhost:18443\"\nplan:\n batches:\n - id: 0\n transactions:\n - contract-publish:\n contract-name: counter\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n cost: 6940\n path: contracts/counter.clar\n anchor-block-only: true\n clarity-version: 2\n epoch: \"2.5\"\n```\n\n## Deployment plan specifications\n\nA project's deployment plan specifications are set on two files within a Clarinet project—the `Clarinet.toml` file as well as the network’s corresponding `.toml` file (for example, `Devnet.toml`) in the `settings/` folder.\n\nSpecifications in the `Clarinet.toml` file you can change include:\n\n- The Clarity version or blockchain epoch that Clarinet emulates for your smart contracts\n- Project requirements in the form of contract dependencies (see next section)\n\nSpecifications in the `Devnet.toml` file you can change include:\n\n- Accounts, balances, and names\n- Blockchain environment features of your devnet, such as block time or API ports\n- Stacking orders\n- Specifying derivation path of a given account:\n\n```toml settings/devnet.toml\n[accounts.deployer]\nmnemonic = \"<YOUR PRIVATE TESTNET MNEMONIC HERE>\"\nbalance = 100_000_000_000_000\nderivation = \"m/44'/5757'/0'/0/2\"\n```\n\n## Adding project contract requirements\n\nYour project can reference a smart contract that already exists on the blockchain.\n\nFor example, [Stacks Improvement Proposal 009](https://github.com/stacksgov/sips/blob/main/sips/sip-010/sip-010-fungible-token-standard.md) specifies a trait reference for all non-fungible tokens. Instead of redeploying this trait as a separate contract each time a new NFT collection is published, you can reference the contract directly within deployment plans with the following Clarinet command, including the contract principal reference:\n\n```terminal\n$ clarinet requirements add SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait\n```\n\nThis command updates a Clarinet project's deployment plan for use in development.\n\nFor instance, `clarinet devnet start` would now download a copy of the contract principal via the Stacks API node that is booted alongside each devnet deployment, and it would remap the principal that publishes this contract to one of the accounts specified in your `Devnet.toml` file.\n\nThis permits a developer to maintain the minimum set of contracts their Clarinet project will deploy to mainnet (with a single use of an `impl-trait` statement in their Clarity contract).\n\n## Edit your deployment plan\n\nRecall that a default deployment plan is used for every deployment, comprising your projects specifications as set in your `Clarinet.toml` and `<network>.toml` files.\n\nThe default plan is generated upon each `clarinet deployments generate --<network>` shell command to your `deployments/` folder.\n\nHowever, you can also manually edit this default deployment `.yaml` file directly—programmatically orchestrating your contract publication and user interaction beyond your plan's defaults.\n\n<Callout title=\"Note\">\nWhen deploying, Clarinet prompts you to overwrite any manually added or edited changes that differ from the specifications laid out in your project's .toml files. Type `no` to proceed with your manually configured deployment plan instead of the default.\n</Callout>\n\nHere are some of the relevant transactions and configurations available to developers manually configuring their deployment plans:\n\n[`emulated-contract-publish:`](#emulated-contract-publish) Deploy a contract in an in-memory simulated chain.\n\n[`emulated-contract-call:`](#emulated-contract-call) Call a contract that has been deployed in an in-memory simulated chain.\n\n[`requirement-publish:`](#requirement-publish) <TooltipProvider inline><Tooltip><TooltipTrigger asChild><span className='cursor-default border-b border-dotted border-primary'>Deploy an external contract</span></TooltipTrigger><TooltipContent>One that is not published by the same set of private keys as the user wallet currently deploying.</TooltipContent></Tooltip></TooltipProvider> on another `testnet`/`devnet` using another wallet.\n\n[`contract-publish:`](#contract-publish) Deploy a contract.\n\n[`contract-call:`](#contract-call) Call a contract.\n\n[`stx-transfer:`](#stx-transfer) Transfer STX between specified accounts.\n\n[`btc-transfer:`](#btc-transfer) Simple bitcoin transfer from a p2pkh address to a p2pkh address (experimental, `regtest`/`testnet`/`mainnet`).\n\n### emulated-contract-publish\n\nThis default transaction is included in every generated deployment for a `simnet` deployment.\n\n```yaml\n- emulated-contract-publish:\n contract-name: extension-trait\n emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n path: contracts/dao/traits/extension-trait.clar\n clarity-version: 1\n```\n\n### emulated-contract-call\n\nThis is a transaction type for a `simnet` deployment where the developer wants to emulate a contract call.\n\n```yaml\n- emulated-contract-call:\n contract-id: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.counter\n emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n method: increment\n parameters:\n - u1\n```\n\n<Callout title=\"Note\">\nRead-only functions and functions that take no arguments are passed an empty list like so: `parameters: []`\n</Callout>\n\n### requirement-publish\n\nThis cBTC smart contract application has a [devnet deployment plan](https://github.com/hirosystems/clarinet/blob/develop/components/clarinet-cli/examples/cbtc/deployments/default.devnet-plan.yaml) that publishes the contract required by its core smart contract.\n\n```yaml\n- requirement-publish:\n contract-id: SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard\n remap-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n remap-principals:\n SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n cost: 8400\n path: '.cache/requirements/SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.clar'\n```\n\n### contract-publish\n\nThis default transaction is included in every generated deployment plan for every contract your Clarinet project has. This `counter` application has a [devnet deployment plan](https://github.com/hirosystems/clarinet/blob/develop/components/clarinet-cli/examples/counter/deployments/default.devnet-plan.yaml) that publishes its core smart contract.\n\n```yaml\n- contract-publish:\n contract-name: counter\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n cost: 5960\n path: contracts/counter.clar\n anchor-block-only: true\n clarity-version: 1\n```\n\n### contract-call\n\nThe developer can call a function and pass arguments of any valid Clarity type.\n\n```yaml\n- contract-call:\n contract-id: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.bitcoin-dao\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n method: add-new-member\n parameters:\n - u1\n - \"0x01\"\n - \"{ id: u4, username: \"Satoshi\", address: 'SP1HTBVD3JG9C05J7HBJTHGR0GGW7KXW28M5JS8QE }\"\n - \"'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\n cost: 5960\n```\n\n<Callout title=\"Note\">\nRead-only functions and functions that take no arguments are passed an empty list like so: `parameters: []`\n</Callout>\n\n### stx-transfer\n\nThe developer can specify the originating account of an STX transfer, the quantity denominated in microstacks, and the recipient, as well as an optional memo field (Note: the memo field can only contain a Clarity [buffer type](https://book.clarity-lang.org/ch02-02-sequence-types.html) up to 34 bytes in size, pre-fixed with `0x` (for example, `0x68656c6c6f21`), not ASCII text or strings)\n\n```yaml\n- stx-transfer:\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n recipient: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract\n mstx-amount: 1000\n memo: '0x01'\n cost: 10000\n```\n\n### btc-transfer\n\nThis cBTC smart contract application has a [devnet deployment plan](https://github.com/hirosystems/clarinet/blob/develop/components/clarinet-cli/examples/cbtc/deployments/wrap-btc.devnet-plan.yaml) that includes broadcasting a BTC transfer transaction to the emulated bitcoin chain with these parameters.\n\n```yaml\n- btc-transfer:\n expected-sender: mjSrB3wS4xab3kYqFktwBzfTdPg367ZJ2d\n recipient: bcrt1qnxknq3wqtphv7sfwy07m7e4sr6ut9yt6ed99jg\n sats-amount: 100000000\n sats-per-byte: 10\n```\n\n---\n\n## Next steps\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/guides/cli-commands/run-a-local-devnet\"\n title=\"Run a local devnet\"\n description=\"Learn how to run a local devnet.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"Simnet reference\"\n description=\"Learn how to use simnet with the Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n</Cards>"],[26,"\nimport { Clarinet, Js } from '@/components/ui/icon';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nInside the console, you can use these debugging commands:\n\n```terminal\n$ ::trace (contract-call? .my-contract my-function)\n$ ::debug (contract-call? .my-contract my-function)\n$ break my-function\n```\n\nDebug navigation commands:\n- _console`step`_ or _console`s`_ - Step into\n- _console`finish`_ or _console`f`_ - Step out\n- _console`next`_ or _console`n`_ - Step over\n- _console`continue`_ or _console`c`_ - Continue execution\n\nLet's take the clarity_`counter`_ contract as an example:\n\n```clarity\n(define-map Counters principal uint)\n\n(define-read-only (get-count (who principal))\n (default-to u0 (map-get? Counters who))\n)\n\n(define-public (count-up)\n (ok (map-set Counters tx-sender (+ (get-count tx-sender) u1)))\n)\n```\n\n### Trace\n\nThe _console`::trace`_ command expects an expression, so make a _clarity`contract-call?`_ with our _clarity`count-up`_ function and see what happens.\n\n```terminal\n$ ::trace (contract-call? .counter count-up)\n(contract-call? .counter count-up) \u001b[30m<console>\u001b[0m\n( get-count tx-sender ) \u001b[30mcounter:4:38\u001b[0m\n \u001b[31m↳ args:\u001b[0m \u001b[1mST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\u001b[0m\n \u001b[34mu0\u001b[0m\n\u001b[34m(ok true)\u001b[0m\n```\n\n### Breakpoints\n\nYou can also set a breakpoint at a specific line to better understand what's happening in your contract.\n\nWith `::debug`, you can add breakpoints at a specific line of a contract or function to better understand what's happening in your contracts.\n\n```clarity\n(define-map Counters principal uint)\n\n(define-read-only (get-count (who principal))\n (default-to u0 (map-get? Counters who))\n)\n\n(define-public (count-up)\n (ok (map-set Counters tx-sender (+ (get-count tx-sender) u1)))\n)\n\n;; !mark(1:3)\n(define-public (count-twice)\n (double)\n)\n\n;; !mark(1:6)\n(define-private (double)\n (begin\n (unwrap-panic (count-up))\n (count-up)\n )\n)\n```\n\n```terminal\n$ ::debug (contract-call? .counter count-twice)\n$ break count-up\n```\n\n\n<Callout title=\"Breakpoint Commands\">\nTo step through these breakpoints, you can use one of the following commands:\n\n- **Step-in (`step` or `s`)**: Step into the sub-expressions.\n- **Step-out (`finish` or `f`)**: Complete execution of the current expression and return the result to the parent.\n- **Step-over (`next` or `n`)**: Continue to completion of the current expression, stepping over sub-expressions.\n- **Continue (`continue` or `c`)**: Continue execution until hitting a breakpoint or completing execution.\n</Callout>\n\nUsing the _console`continue`_ command, the breakpoint you set in the _clarity`double`_ function will trigger twice due to two _clarity`count-up`_ calls, which enables you to do variable and map analysis.\n\n## Next steps\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/guides/cli-commands/validate-a-contract\"\n title=\"Validate a contract\"\n description=\"Learn how to validate a contract.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/clarinet/guides/estimate-costs\"\n title=\"Estimate costs for a contract\"\n description=\"Learn how to estimate costs for a contract.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write tests for your smart contracts\"\n description=\"Learn how to write unit tests using the Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n</Cards>"],[30,"\nimport { Clarinet, Js } from '@/components/ui/icon';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\n\nIn this quickstart guide, you will write a simple counter contract with Clarity. Throughout this tutorial, you'll learn how to generate a new project, create a smart contract, and validate your smart contract code using the Clarinet CLI.\n\nCheck out the [create a new project](/stacks/clarinet/guides/create-a-new-project) and [validate a contract](/stacks/clarinet/guides/validate-a-contract) guides for a deeper look.\n\n---\n\n<Steps>\n <Step>\n ## Generate your counter project\n \n Start by creating a new Clarinet project. This command will create a new directory named _console`counter`_ and set up a basic Clarinet project inside it.\n\n ```terminal\n $ clarinet new counter\n \u001b[32mCreate directory\u001b[0m \u001b[1mcounter\u001b[0m\n \u001b[32mCreate directory\u001b[0m \u001b[1mcontracts\u001b[0m\n \u001b[32mCreate directory\u001b[0m \u001b[1msettings\u001b[0m\n \u001b[32mCreate directory\u001b[0m \u001b[1mtests\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1mClarinet.toml\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1msettings/Mainnet.toml\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1msettings/Testnet.toml\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1msettings/Devnet.toml\u001b[0m\n \u001b[32mCreate directory\u001b[0m \u001b[1m.vscode\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1m.vscode/settings.json\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1m.vscode/tasks.json\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1m.gitignore\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1m.gitattributes\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1mpackage.json\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1mtsconfig.json\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1mvitest.config.js\u001b[0m\n ```\n\n <Files className=\"pointer-events-none\">\n <Folder name=\"contracts\" />\n <Folder name=\"settings\" defaultOpen>\n <File name=\"Devnet.toml\" />\n <File name=\"Mainnet.toml\" />\n <File name=\"Testnet.toml\" />\n </Folder>\n <Folder name=\"tests\" />\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n </Files>\n </Step>\n <Step>\n ## Create a counter contract\n \n Inside your project directory, run _console`clarinet contract new counter`_ to create your contract. This will generate and update the proper files for writing and testing your code.\n\n ```terminal\n $ cd counter\n $ clarinet contract new counter\n \u001b[32mCreated file\u001b[0m \u001b[1mcontracts/counter.clar\u001b[0m\n \u001b[32mCreated file\u001b[0m \u001b[1mtests/counter.test.ts\u001b[0m\n \u001b[33mUpdated Clarinet.toml\u001b[0m \u001b[1mwith contract counter\u001b[0m\n ```\n\n ```toml Clarinet.toml\n [contracts.counter]\n path = 'contracts/counter.clar'\n clarity_version = 2\n epoch = 2.5\n ```\n </Step>\n <Step>\n ## Variables and functions\n \n Inside your _txt`contracts/counter.clar`_ file:\n\n 1. Define a map called _clarity`Counters`_ to store the count associated with each user.\n 2. Define a public function called _clarity`count-up`_ that increments the count of the user who calls it.\n 3. Add a read-only function called _clarity`get-count`_ that returns the count of the user who calls it.\n\n ```clarity counter.clar -c\n (define-map Counters principal uint)\n\n (define-public (count-up)\n (ok (map-set Counters tx-sender (+ (get-count tx-sender) u1)))\n )\n\n (define-read-only (get-count (who principal))\n (default-to u0 (map-get? Counters who))\n )\n ```\n </Step>\n <Step>\n ## Validate your contract\n \n Now it's time to validate your contract. This command will check your contract for errors and typos.\n\n ```terminal\n $ clarinet check\n \u001b[32m✔\u001b[0m \u001b[1m1 contract checked\u001b[0m\n ```\n\n Once your contract is validated, you can interact with it locally with the _console`clarinet console`_ inside your project directory.\n\n ```terminal\n $ clarinet console\n ```\n\n Here are some example interactions you can perform with your contract:\n\n 1. Call the _clarity`count-up`_ function on your contract to increment the count.\n 2. Verify the count of the user has been incremented by calling the _clarity`get-count`_ function with the _clarity`tx-sender`_ as the argument.\n \n ```terminal\n $ (contract-call? .counter count-up)\n \u001b[32m(ok true)\u001b[0m\n $ (contract-call? .counter get-count tx-sender)\n \u001b[32mu1\u001b[0m\n ```\n </Step>\n</Steps>\n\n## Next steps\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/guides/add-a-contract\"\n title=\"Add a contract to your project\"\n description=\"Learn how to add a contract to your project.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/guides/run-a-local-devnet\"\n title=\"Run a local devnet\"\n description=\"Learn how to set up and run a local development network for your project.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write tests for your smart contracts\"\n description=\"Learn how to write unit tests using the Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n</Cards>"],[78,"\nimport { Code } from 'lucide-react';\nimport { SecondaryCard } from '@/components/card';\n\n<Callout title=\"New series\" type=\"info\">\nWe're introducing a new series of guides that explore Clarity functions in depth, focusing on their practical applications in blockchain development.\n</Callout>\n\nEach page in this section covers one or more related Clarity functions, explaining their purpose, demonstrating implementation with code samples, and discussing best practices. Ready to enhance your Clarity smart contract development skills?\n\n## Explore guides\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/clarity/basic-arithmetic\"\n title=\"Arithmetic operations\"\n description=\"Master basic and advanced arithmetic functions for precise calculations in smart contracts.\"\n />\n <SecondaryCard\n href=\"/stacks/clarity/access-control\"\n title=\"Access control\"\n description=\"Manage permissions and control access for smart contracts.\"\n />\n <SecondaryCard\n href=\"/stacks/clarity/handling-optionals-and-errors\"\n title=\"Handling optionals and errors\"\n description=\"Safely handling optional values and error cases in Clarity smart contracts.\"\n />\n</Cards>\n\nNeed help or have questions? Join the discussion in the [#clarity channel](https://stacks.chat) on Discord and connect with other Clarity developers.\n"],[73,"\nimport { Code } from 'lucide-react';\nimport { SecondaryCard } from '@/components/card';\n\nHiro Hacks are monthly hackathons designed to bring together the most innovative builders in the Stacks ecosystem. Each month features a unique theme, challenging you to stretch your creativity, show off your skills, and learn from other devs in the process.\n\nHave fun. Build something new. Compete against other devs for Hiro swag and your seat in a [hacker house](#prizes) coming later this year.\n\nTo submit your projects each month, [complete this form](https://hirohacks25.paperform.co/) before midnight ET on the last day of that month's hack.\n\n## Schedule\n\n| Week | Theme | Description |\n| --- | --- | --- |\n| Jan 22-28 | [AI x Stacks](/stacks/hacks/archive/ai) | Build something that combines AI capabilities with Stacks. |\n| Feb 19-25 | [Create your own recipe](/stacks/hacks/recipes) | Create your own recipe for the Hiro Cookbook and share it with the community. |\n| Mar 19-25 | TBA | Coming soon |\n| Apr 23-29 | TBA | Coming soon |\n| May 21-27 | TBA | Coming soon |\n| Jun 18-24 | TBA | Coming soon |\n| ??? | ??? | ??? |\n\n## Prizes\n\nAt the end of each monthly hack, Hiro will host a livestream on X going over submissions and announcing that month's winning developer. The prize? Fame, glory and Hiro swag.\n\nTop developers from these monthly hacks will be invited to participate in a Hiro hacker house tied to one of the year's biggest conferences, key expenses covered. We'll share more details on that house soon, so stay tuned.\n\n## Resources\n\nNeed help hacking on your project? [Join the Stacks Discord](https://stacks.chat) and get help from other devs in the #builder-general channel. If you're having problems using Hiro tools, you can also reach out to our team in the relevant tool channel in the Hiro Developer Tools section.\n\nAnd don't forget to take advantage of all of the resources in our docs as well as [Stacks docs](https://docs.stacks.co/).\n\n## Rules\n\nTo be eligible for swag and the hacker house, you must submit your project through [this paperform](https://hirohacks25.paperform.co/) before midnight ET on the last day of that month's hack.\n\nIn that submission, we expect to see:\n\n- A link to your project (if applicable)\n- A link to your code with a clear README (or link to a PR if submitting a recipe)\n- A description that covers the problem being solved, the technical approach, and future improvements for the project\n\nIn terms of selecting winners, submissions will be evaluated on their technical implementation, their innovation/creativity, and their documentation/presentation. To learn more about the rules, read [Hiro Hacks Terms & Conditions](https://www.hiro.so/hiro-hacks-rules).\n"],[516,"\nimport { Code, Terminal } from 'lucide-react';\n\nA no-loss lottery contract offers a unique way for participants to stack their assets and potentially earn a larger reward without the risk of losing their initial deposit.\n\nThis contract ensures that participants can stack their assets in a yield-generating pool, receive an NFT ticket, and have a chance to win additional rewards while retaining their original investment.\n\nIn this guide, you will learn how to:\n\n1. Define constants and data variables\n2. Create and manage participants and tickets\n3. Implement the lottery functionality\n4. Handle the selection of winners\n5. Claim and distribute rewards\n\n<Callout title=\"Note\">\nThis example uses the CityCoins protocol for the stacking yield mechanism, but leveraging a Stacking pool using Proof of Transfer (PoX4) can also be used.\n</Callout>\n\n---\n\n## Define constants and data variables\n\nFirst, define some constants and data variables to manage the state of your contract. Constants are used for fixed values, and data variables store the state that can change during the contract execution.\n\n```clarity\n(define-constant OWNER tx-sender)\n(define-constant ERR_UNAUTHORIZED (err u101000))\n\n(define-data-var lotteryPool uint u0)\n(define-data-var totalYield uint u0)\n(define-data-var ticketCounter uint u0)\n```\n\nThe `OWNER` constant defines the contract owner with administrative privileges, while `ERR_UNAUTHORIZED` handles unauthorized access attempts.\n\nKey data variables include `lotteryPool` for tracking stacked assets, `totalYield` for accumulated earnings, and `ticketCounter` for managing issued tickets.\n\n## Create and manage participants and tickets\n\nNext, define an NFT to represent a ticket and a map to store participant information.\n\n```clarity\n(define-map Participants\n { participant: principal }\n { ticketId: uint, amount: uint, cycle: uint, ticketExpirationAtCycle: uint, isWinner: bool }\n)\n\n(define-map Tickets\n { ticketId: uint }\n { owner: principal }\n)\n\n(define-non-fungible-token LotteryTicket uint)\n```\n\nThe `Participants` map links participants to their ticket details, while the `Tickets` map associates tickets with their owners.\n\nThe `LotteryTicket` defines an NFT for the lottery tickets, crucial for managing entries.\n\n## Implement the lottery functionality\n\nNow, it's time to implement the core function of the contract, where participants can enter the lottery by depositing their assets.\n\n```clarity\n(define-public (roll-the-dice (cityName (string-ascii 10)) (amount uint) (lockPeriod (optional uint)))\n (let\n (\n (ticketId (+ (var-get ticketCounter) u1))\n (actualLockPeriod (default-to u1 lockPeriod))\n (rewardCycle (+ (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd007-citycoin-stacking get-current-reward-cycle) u1))\n )\n\n (begin\n (try! (contract-call? 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2 transfer amount tx-sender (as-contract tx-sender) none))\n (try! (nft-mint? LotteryTicket ticketId tx-sender))\n (map-insert Participants { participant: tx-sender } { ticketId: ticketId, amount: amount, cycle: rewardCycle, ticketExpirationAtCycle: (+ rewardCycle actualLockPeriod), isWinner: false })\n (map-set Tickets { ticketId: ticketId } { owner: tx-sender })\n (var-set lotteryPool (+ (var-get lotteryPool) amount))\n (var-set ticketCounter (+ (var-get ticketCounter) u1))\n (ok ticketId)\n )\n )\n)\n```\n\nThe `roll-the-dice` function enables participants to join the lottery by depositing assets, specifying the city (`cityName`), the deposit amount (`amount`), and the lock period (`lockPeriod`).\n\nThis function is crucial for managing lottery entries and ensuring assets are properly locked for the specified duration.\n\nWhen a participant calls this function, the following steps occur:\n\n1. **Generate ticket and determine lock period**: A new ticket ID is generated, and the lock period is set (defaulting to 1 if not specified).\n2. **Transfer assets and mint NFT ticket**: The specified amount of assets is transferred from the participant to the contract, and an NFT representing the lottery ticket is minted and assigned to the participant.\n3. **Update participant and ticket data**: The participant's information, including ticket ID, amount, cycle, and expiration, is stored, and the ticket's ownership information is updated.\n4. **Update lottery pool and return ticket ID**: The total amount in the lottery pool is updated, the ticket counter is incremented, and the function returns the newly generated ticket ID to the participant.\n\nThis streamlined process ensures that each participant's entry is properly recorded and their assets are securely managed within the lottery system.\n\n## Handling the selection of winners\n\nNow, implement the function to select a winner randomly from the participants.\n\n```clarity\n(define-private (select-winner)\n (match (contract-call? 'SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.citycoin-vrf-v2 get-save-rnd (- block-height u1)) randomTicketNumber\n (let\n (\n (ticketCount (var-get ticketCounter))\n (winningTicketId (mod randomTicketNumber ticketCount))\n (winner (unwrap! (get-ticket winningTicketId) (err u404)))\n (owner (get owner winner))\n (participant (unwrap! (get-participant owner) (err u404)))\n )\n (map-set Participants { participant: owner }\n { ticketId: winningTicketId, amount: (get amount participant), cycle: (get cycle participant), ticketExpirationAtCycle: (get ticketExpirationAtCycle participant), isWinner: true })\n (ok owner)\n )\n selectionError (err selectionError)\n )\n)\n```\nThe `select-winner` function randomly selects a winner using a number from the VRF contract (`get-save-rnd`) and updates their status with `unwrap!`. This ensures a fair and transparent winner selection process.\n\nWhen this function is called, the following steps occur:\n\n1. **Fetch random number**: A random number is obtained from the VRF contract by calling `get-save-rnd` with the previous block height.\n2. **Determine winning ticket**: The winning ticket ID is calculated by taking the modulus of the random number with the total number of tickets (`ticketCounter`).\n3. **Retrieve winner information**: The winner's ticket and participant information are retrieved using the calculated ticket ID.\n4. **Update winner status**: The participant's status is updated to indicate they are a winner by setting `isWinner` to `true` in the `Participants` map.\n\nThis process ensures that the winner is selected fairly and their status is accurately updated in the system.\n\n## Claim and distribute rewards\n\nLastly, implement the function to claim and distribute rewards to the winners.\n\n```clarity\n(define-public (claim-rewards (cityName (string-ascii 10)) (cycle uint))\n (let\n (\n (cityId (unwrap-panic (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd004-city-registry get-city-id cityName)))\n (cycleAmount (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stacking get-balance-stx))\n )\n (if (is-eq cityName \"mia\")\n (try! (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd011-stacking-payouts send-stacking-reward-mia cycle cycleAmount))\n (try! (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd011-stacking-payouts send-stacking-reward-nyc cycle cycleAmount))\n )\n (as-contract (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd007-citycoin-stacking claim-stacking-reward cityName cycle))\n )\n)\n\n(define-public (distribute-rewards)\n (select-winner)\n)\n```\n\nThe `claim-rewards` function enables participants to claim their staking rewards, while the `distribute-rewards` function calls `select-winner` to randomly select and reward winners, ensuring a fair distribution process.\n\nWhen the `claim-rewards` function is called, the following steps occur:\n\n1. **Retrieve city ID and balance**: The city ID is retrieved using the `get-city-id` function, and the balance for the specified cycle is obtained from the treasury contract.\n2. **Send stacking rewards**: Depending on the city (`mia` or `nyc`), the appropriate stacking reward function is called to send the rewards for the specified cycle.\n3. **Claim stacking reward**: The contract claims the stacking reward for the specified city and cycle.\n\nWhen the `distribute-rewards` function is called, it performs the following step:\n\n1. **Select winner**: The `select-winner` function is called to randomly select a winner from the participants and update their status.\n\nThis process ensures that participants can claim their rewards and that winners are selected and rewarded fairly.\n\n## Testing the contract\n\nTo test the contracts, use the following steps inside of `clarinet console`:\n\n```terminal\n$ ::advance_chain_tip 700000\n$ ::set_tx_sender\n$ (contract-call? 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.no-loss-lottery-pool roll-the-dice \"mia\" u500 none)\n$ ::advance_chain_tip 2000\n$ (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stacking deposit-stx u5000000000)\n$ (contract-call? 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.no-loss-lottery-pool claim \"mia\" u17)\n```\n\nTo bootstrap the CityCoins contracts, follow these steps:\n\n```clarity\n(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd004-city-registry get-or-create-city-id \"mia\")\n(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd004-city-registry get-or-create-city-id \"nyc\")\n(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stacking set-allowed 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2 true)\n(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-nyc-stacking set-allowed 'SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.newyorkcitycoin-token-v2 true)\n```\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet/guides/create-a-new-project\"\n title=\"Create a new project\"\n description=\"Learn how to create a new Clarinet project.\"\n />\n <Card\n href=\"/stacks/clarinet/guides/deploy-a-contract\"\n title=\"Deploy a contract\"\n description=\"Learn how to deploy a contract to a Clarinet network.\"\n />\n</Cards>\n"],[511,"\nimport { Code, Terminal } from 'lucide-react';\nimport { SmallCard } from '@/components/card';\n\nIn this guide, you will learn how to create an NFT marketplace that allows users to list NFTs for sale. Users can specify the following details for their listings:\n- The NFT token to sell.\n- Listing expiry in block height.\n- The payment asset, either STX or a SIP010 fungible token.\n- The NFT price in the chosen payment asset.\n- An optional intended taker. If set, only that principal will be able to fulfil the listing.\n\nThis marketplace leverages the following Clarity traits:\n- `nft-trait` for handling NFTs.\n- `ft-trait` for handling fungible tokens.\n\nOver the course of this guide, you will learn how to:\n1. Define and handle errors.\n2. Create and manage NFT listings.\n3. Whitelist asset contracts.\n4. Fulfil NFT purchases.\n\n---\n\n## Define and handle errors\n\nFirst, define constants for various errors that may occur during listing, cancelling, or fulfilling NFT transactions. This helps in maintaining clean and readable code.\n\n```clarity\n;; Define listing errors\n(define-constant ERR_EXPIRY_IN_PAST (err u1000))\n(define-constant ERR_PRICE_ZERO (err u1001))\n\n;; Define cancelling and fulfilling errors\n(define-constant ERR_UNKNOWN_LISTING (err u2000))\n(define-constant ERR_UNAUTHORISED (err u2001))\n(define-constant ERR_LISTING_EXPIRED (err u2002))\n(define-constant ERR_NFT_ASSET_MISMATCH (err u2003))\n(define-constant ERR_PAYMENT_ASSET_MISMATCH (err u2004))\n(define-constant ERR_MAKER_TAKER_EQUAL (err u2005))\n(define-constant ERR_UNINTENDED_TAKER (err u2006))\n(define-constant ERR_ASSET_CONTRACT_NOT_WHITELISTED (err u2007))\n(define-constant ERR_PAYMENT_CONTRACT_NOT_WHITELISTED (err u2008))\n```\n\n## Create and manage NFT listings\n\n### Define data structures\n\nCreate a map data structure for the asset listings and a data variable for unique IDs.\n\n```clarity\n;; Define a map data structure for the asset listings\n(define-map listings\n uint\n {\n maker: principal,\n taker: (optional principal),\n token-id: uint,\n nft-asset-contract: principal,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n }\n)\n\n;; Used for unique IDs for each listing\n(define-data-var listing-nonce uint u0)\n```\n\n### List an asset\n\nCreate a public function to list an asset along with its contract. This function verifies the contract, checks expiry and price, and transfers the NFT ownership to the marketplace.\n\n```clarity\n(define-public (list-asset\n (nft-asset-contract <nft-trait>)\n (nft-asset {\n taker: (optional principal),\n token-id: uint,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n })\n)\n (let ((listing-id (var-get listing-nonce)))\n ;; Verify that the contract of this asset is whitelisted\n (asserts! (is-whitelisted (contract-of nft-asset-contract)) ERR_ASSET_CONTRACT_NOT_WHITELISTED)\n ;; Verify that the asset is not expired\n (asserts! (> (get expiry nft-asset) block-height) ERR_EXPIRY_IN_PAST)\n ;; Verify that the asset price is greater than zero\n (asserts! (> (get price nft-asset) u0) ERR_PRICE_ZERO)\n ;; Verify that the contract of the payment is whitelisted\n (asserts! (match (get payment-asset-contract nft-asset)\n payment-asset\n (is-whitelisted payment-asset)\n true\n ) ERR_PAYMENT_CONTRACT_NOT_WHITELISTED)\n ;; Transfer the NFT ownership to this contract's principal\n (try! (transfer-nft\n nft-asset-contract\n (get token-id nft-asset)\n tx-sender\n (as-contract tx-sender)\n ))\n ;; List the NFT in the listings map\n (map-set listings listing-id (merge\n { maker: tx-sender, nft-asset-contract: (contract-of nft-asset-contract) }\n nft-asset\n ))\n ;; Increment the nonce to use for the next unique listing ID\n (var-set listing-nonce (+ listing-id u1))\n ;; Return the created listing ID\n (ok listing-id)\n )\n)\n```\n\n### Retrieve an asset\n\nCreate a read-only function to retrieve an asset, or listing, by its ID.\n\n```clarity\n(define-read-only (get-listing (listing-id uint))\n (map-get? listings listing-id)\n)\n```\n\n### Cancel a listing\n\nCreate a public function to cancel a listing. Only the NFT's creator can cancel the listing, and it must use the same asset contract that the NFT uses.\n\n```clarity\n(define-public (cancel-listing (listing-id uint) (nft-asset-contract <nft-trait>))\n (let (\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n (maker (get maker listing))\n )\n ;; Verify that the caller of the function is the creator of the NFT to be cancelled\n (asserts! (is-eq maker tx-sender) ERR_UNAUTHORISED)\n ;; Verify that the asset contract to use is the same one that the NFT uses\n (asserts! (is-eq\n (get nft-asset-contract listing)\n (contract-of nft-asset-contract)\n ) ERR_NFT_ASSET_MISMATCH)\n ;; Delete the listing\n (map-delete listings listing-id)\n ;; Transfer the NFT from this contract's principal back to the creator's principal\n (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender maker))\n )\n)\n```\n\n## Whitelist asset contracts\n\n### Whitelist contracts\n\nThe marketplace requires any contracts used for assets or payments to be whitelisted by the contract owner. Create a map to store whitelisted asset contracts and a function to check if a contract is whitelisted.\n\n```clarity\n(define-map whitelisted-asset-contracts principal bool)\n\n(define-read-only (is-whitelisted (asset-contract principal))\n (default-to false (map-get? whitelisted-asset-contracts asset-contract))\n)\n```\n\n### Set whitelisted contracts\n\nOnly the contract owner can whitelist an asset contract. Create a public function to set whitelisted asset contracts.\n\n```clarity\n(define-public (set-whitelisted (asset-contract principal) (whitelisted bool))\n (begin\n (asserts! (is-eq contract-owner tx-sender) ERR_UNAUTHORISED)\n (ok (map-set whitelisted-asset-contracts asset-contract whitelisted))\n )\n)\n```\n\n## Fulfill NFT purchases\n\n### Fulfill listing with STX\n\nCreate a public function to purchase a listing using STX as payment.\n\n```clarity\n(define-public (fulfil-listing-stx (listing-id uint) (nft-asset-contract <nft-trait>))\n (let (\n ;; Verify the given listing ID exists\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n ;; Set the NFT's taker to the purchaser (caller of the function)\n (taker tx-sender)\n )\n ;; Validate that the purchase can be fulfilled\n (try! (assert-can-fulfil (contract-of nft-asset-contract) none listing))\n ;; Transfer the NFT to the purchaser (caller of the function)\n (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))\n ;; Transfer the STX payment from the purchaser to the creator of the NFT\n (try! (stx-transfer? (get price listing) taker (get maker listing)))\n ;; Remove the NFT from the marketplace listings\n (map-delete listings listing-id)\n ;; Return the listing ID that was just purchased\n (ok listing-id)\n )\n)\n```\n\n### Fulfill listing with SIP-010\n\nCreate a public function to purchase a listing using another fungible token that follows the SIP-010 standard as payment.\n\n```clarity\n(define-public (fulfil-listing-ft\n (listing-id uint)\n (nft-asset-contract <nft-trait>)\n (payment-asset-contract <ft-trait>)\n)\n (let (\n ;; Verify the given listing ID exists\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n ;; Set the NFT's taker to the purchaser (caller of the function)\n (taker tx-sender)\n )\n ;; Validate that the purchase can be fulfilled\n (try! (assert-can-fulfil\n (contract-of nft-asset-contract)\n (some (contract-of payment-asset-contract))\n listing\n ))\n ;; Transfer the NFT to the purchaser (caller of the function)\n (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))\n ;; Transfer the tokens as payment from the purchaser to the creator of the NFT\n (try! (transfer-ft payment-asset-contract (get price listing) taker (get maker listing)))\n ;; Remove the NFT from the marketplace listings\n (map-delete listings listing-id)\n ;; Return the listing ID that was just purchased\n (ok listing-id)\n )\n)\n```\n\n### Validate purchase can be fulfilled\n\nCreate a private function to validate that a purchase can be fulfilled. This function checks the listing's expiry, the NFT's contract, and the payment's contract.\n\n```clarity\n(define-private (assert-can-fulfil\n (nft-asset-contract principal)\n (payment-asset-contract (optional principal))\n (listing {\n maker: principal,\n taker: (optional principal),\n token-id: uint,\n nft-asset-contract: principal,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n })\n)\n (begin\n ;; Verify that the buyer is not the same as the NFT creator\n (asserts! (not (is-eq (get maker listing) tx-sender)) ERR_MAKER_TAKER_EQUAL)\n ;; Verify the buyer has been set in the listing metadata as its `taker`\n (asserts!\n (match (get taker listing) intended-taker (is-eq intended-taker tx-sender) true)\n ERR_UNINTENDED_TAKER\n )\n ;; Verify the listing for purchase is not expired\n (asserts! (< block-height (get expiry listing)) ERR_LISTING_EXPIRED)\n ;; Verify the asset contract used to purchase the NFT is the same as the one set on the NFT\n (asserts! (is-eq (get nft-asset-contract listing) nft-asset-contract) ERR_NFT_ASSET_MISMATCH)\n ;; Verify the payment contract used to purchase the NFT is the same as the one set on the NFT\n (asserts!\n (is-eq (get payment-asset-contract listing) payment-asset-contract)\n ERR_PAYMENT_ASSET_MISMATCH\n )\n (ok true)\n )\n)\n```\n\nBy following this guide, you have created a basic NFT marketplace that allows users to list, buy, and sell NFTs using either STX or fungible tokens. This implementation includes essential functionalities such as whitelisting contracts, validating transactions, and handling errors.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/authenticate-users\"\n title=\"Authenticate users\"\n description=\"Learn how to authenticate users using the Connect package in Stacks.js.\"\n />\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n</Cards>"],[513,"\nimport { Code, Terminal } from 'lucide-react';\nimport { SmallCard } from '@/components/card';\n\nIn this guide, you will learn how to create an NFT marketplace that allows users to list NFTs for sale. Users can specify the following details for their listings:\n- The NFT token to sell.\n- Listing expiry in block height.\n- The payment asset, either STX or a SIP010 fungible token.\n- The NFT price in the chosen payment asset.\n- An optional intended taker. If set, only that principal will be able to fulfil the listing.\n\nThis marketplace leverages the following Clarity traits:\n- `nft-trait` for handling NFTs.\n- `ft-trait` for handling fungible tokens.\n\nOver the course of this guide, you will learn how to:\n1. Define and handle errors.\n2. Create and manage NFT listings.\n3. Whitelist asset contracts.\n4. Fulfil NFT purchases.\n\n---\n\n## Define and handle errors\n\nFirst, define constants for various errors that may occur during listing, cancelling, or fulfilling NFT transactions. This helps in maintaining clean and readable code.\n\n```clarity\n;; Define listing errors\n(define-constant ERR_EXPIRY_IN_PAST (err u1000))\n(define-constant ERR_PRICE_ZERO (err u1001))\n\n;; Define cancelling and fulfilling errors\n(define-constant ERR_UNKNOWN_LISTING (err u2000))\n(define-constant ERR_UNAUTHORISED (err u2001))\n(define-constant ERR_LISTING_EXPIRED (err u2002))\n(define-constant ERR_NFT_ASSET_MISMATCH (err u2003))\n(define-constant ERR_PAYMENT_ASSET_MISMATCH (err u2004))\n(define-constant ERR_MAKER_TAKER_EQUAL (err u2005))\n(define-constant ERR_UNINTENDED_TAKER (err u2006))\n(define-constant ERR_ASSET_CONTRACT_NOT_WHITELISTED (err u2007))\n(define-constant ERR_PAYMENT_CONTRACT_NOT_WHITELISTED (err u2008))\n```\n\n## Create and manage NFT listings\n\n### Define data structures\n\nCreate a map data structure for the asset listings and a data variable for unique IDs.\n\n```clarity\n;; Define a map data structure for the asset listings\n(define-map listings\n uint\n {\n maker: principal,\n taker: (optional principal),\n token-id: uint,\n nft-asset-contract: principal,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n }\n)\n\n;; Used for unique IDs for each listing\n(define-data-var listing-nonce uint u0)\n```\n\n### List an asset\n\nCreate a public function to list an asset along with its contract. This function verifies the contract, checks expiry and price, and transfers the NFT ownership to the marketplace.\n\n```clarity\n(define-public (list-asset\n (nft-asset-contract <nft-trait>)\n (nft-asset {\n taker: (optional principal),\n token-id: uint,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n })\n)\n (let ((listing-id (var-get listing-nonce)))\n ;; Verify that the contract of this asset is whitelisted\n (asserts! (is-whitelisted (contract-of nft-asset-contract)) ERR_ASSET_CONTRACT_NOT_WHITELISTED)\n ;; Verify that the asset is not expired\n (asserts! (> (get expiry nft-asset) block-height) ERR_EXPIRY_IN_PAST)\n ;; Verify that the asset price is greater than zero\n (asserts! (> (get price nft-asset) u0) ERR_PRICE_ZERO)\n ;; Verify that the contract of the payment is whitelisted\n (asserts! (match (get payment-asset-contract nft-asset)\n payment-asset\n (is-whitelisted payment-asset)\n true\n ) ERR_PAYMENT_CONTRACT_NOT_WHITELISTED)\n ;; Transfer the NFT ownership to this contract's principal\n (try! (transfer-nft\n nft-asset-contract\n (get token-id nft-asset)\n tx-sender\n (as-contract tx-sender)\n ))\n ;; List the NFT in the listings map\n (map-set listings listing-id (merge\n { maker: tx-sender, nft-asset-contract: (contract-of nft-asset-contract) }\n nft-asset\n ))\n ;; Increment the nonce to use for the next unique listing ID\n (var-set listing-nonce (+ listing-id u1))\n ;; Return the created listing ID\n (ok listing-id)\n )\n)\n```\n\n### Retrieve an asset\n\nCreate a read-only function to retrieve an asset, or listing, by its ID.\n\n```clarity\n(define-read-only (get-listing (listing-id uint))\n (map-get? listings listing-id)\n)\n```\n\n### Cancel a listing\n\nCreate a public function to cancel a listing. Only the NFT's creator can cancel the listing, and it must use the same asset contract that the NFT uses.\n\n```clarity\n(define-public (cancel-listing (listing-id uint) (nft-asset-contract <nft-trait>))\n (let (\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n (maker (get maker listing))\n )\n ;; Verify that the caller of the function is the creator of the NFT to be cancelled\n (asserts! (is-eq maker tx-sender) ERR_UNAUTHORISED)\n ;; Verify that the asset contract to use is the same one that the NFT uses\n (asserts! (is-eq\n (get nft-asset-contract listing)\n (contract-of nft-asset-contract)\n ) ERR_NFT_ASSET_MISMATCH)\n ;; Delete the listing\n (map-delete listings listing-id)\n ;; Transfer the NFT from this contract's principal back to the creator's principal\n (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender maker))\n )\n)\n```\n\n## Whitelist asset contracts\n\n### Whitelist contracts\n\nThe marketplace requires any contracts used for assets or payments to be whitelisted by the contract owner. Create a map to store whitelisted asset contracts and a function to check if a contract is whitelisted.\n\n```clarity\n(define-map whitelisted-asset-contracts principal bool)\n\n(define-read-only (is-whitelisted (asset-contract principal))\n (default-to false (map-get? whitelisted-asset-contracts asset-contract))\n)\n```\n\n### Set whitelisted contracts\n\nOnly the contract owner can whitelist an asset contract. Create a public function to set whitelisted asset contracts.\n\n```clarity\n(define-public (set-whitelisted (asset-contract principal) (whitelisted bool))\n (begin\n (asserts! (is-eq contract-owner tx-sender) ERR_UNAUTHORISED)\n (ok (map-set whitelisted-asset-contracts asset-contract whitelisted))\n )\n)\n```\n\n## Fulfill NFT purchases\n\n### Fulfill listing with STX\n\nCreate a public function to purchase a listing using STX as payment.\n\n```clarity\n(define-public (fulfil-listing-stx (listing-id uint) (nft-asset-contract <nft-trait>))\n (let (\n ;; Verify the given listing ID exists\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n ;; Set the NFT's taker to the purchaser (caller of the function)\n (taker tx-sender)\n )\n ;; Validate that the purchase can be fulfilled\n (try! (assert-can-fulfil (contract-of nft-asset-contract) none listing))\n ;; Transfer the NFT to the purchaser (caller of the function)\n (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))\n ;; Transfer the STX payment from the purchaser to the creator of the NFT\n (try! (stx-transfer? (get price listing) taker (get maker listing)))\n ;; Remove the NFT from the marketplace listings\n (map-delete listings listing-id)\n ;; Return the listing ID that was just purchased\n (ok listing-id)\n )\n)\n```\n\n### Fulfill listing with SIP-010\n\nCreate a public function to purchase a listing using another fungible token that follows the SIP-010 standard as payment.\n\n```clarity\n(define-public (fulfil-listing-ft\n (listing-id uint)\n (nft-asset-contract <nft-trait>)\n (payment-asset-contract <ft-trait>)\n)\n (let (\n ;; Verify the given listing ID exists\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n ;; Set the NFT's taker to the purchaser (caller of the function)\n (taker tx-sender)\n )\n ;; Validate that the purchase can be fulfilled\n (try! (assert-can-fulfil\n (contract-of nft-asset-contract)\n (some (contract-of payment-asset-contract))\n listing\n ))\n ;; Transfer the NFT to the purchaser (caller of the function)\n (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))\n ;; Transfer the tokens as payment from the purchaser to the creator of the NFT\n (try! (transfer-ft payment-asset-contract (get price listing) taker (get maker listing)))\n ;; Remove the NFT from the marketplace listings\n (map-delete listings listing-id)\n ;; Return the listing ID that was just purchased\n (ok listing-id)\n )\n)\n```\n\n### Validate purchase can be fulfilled\n\nCreate a private function to validate that a purchase can be fulfilled. This function checks the listing's expiry, the NFT's contract, and the payment's contract.\n\n```clarity\n(define-private (assert-can-fulfil\n (nft-asset-contract principal)\n (payment-asset-contract (optional principal))\n (listing {\n maker: principal,\n taker: (optional principal),\n token-id: uint,\n nft-asset-contract: principal,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n })\n)\n (begin\n ;; Verify that the buyer is not the same as the NFT creator\n (asserts! (not (is-eq (get maker listing) tx-sender)) ERR_MAKER_TAKER_EQUAL)\n ;; Verify the buyer has been set in the listing metadata as its `taker`\n (asserts!\n (match (get taker listing) intended-taker (is-eq intended-taker tx-sender) true)\n ERR_UNINTENDED_TAKER\n )\n ;; Verify the listing for purchase is not expired\n (asserts! (< block-height (get expiry listing)) ERR_LISTING_EXPIRED)\n ;; Verify the asset contract used to purchase the NFT is the same as the one set on the NFT\n (asserts! (is-eq (get nft-asset-contract listing) nft-asset-contract) ERR_NFT_ASSET_MISMATCH)\n ;; Verify the payment contract used to purchase the NFT is the same as the one set on the NFT\n (asserts!\n (is-eq (get payment-asset-contract listing) payment-asset-contract)\n ERR_PAYMENT_ASSET_MISMATCH\n )\n (ok true)\n )\n)\n```\n\nBy following this guide, you have created a basic NFT marketplace that allows users to list, buy, and sell NFTs using either STX or fungible tokens. This implementation includes essential functionalities such as whitelisting contracts, validating transactions, and handling errors.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/authenticate-users\"\n title=\"Authenticate users\"\n description=\"Learn how to authenticate users using the Connect package in Stacks.js.\"\n />\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n</Cards>"],[509,"\nimport { Code, Terminal } from 'lucide-react';\nimport { SmallCard } from '@/components/card';\nimport { InlineCode } from '@/components/inline-code';\n\nRunning a Stacks node is crucial for developers aiming to interact directly with the Stacks blockchain. It allows for the verification of transactions, ensures decentralized operations, and enhances blockchain security.\n\nIn this guide, you will learn how to:\n\n1. [Clone the Stacks blockchain Docker repository](#clone-the-stacks-blockchain-docker-repository).\n2. [Start the service](#start-the-service).\n3. [Monitor the node's synchronization process](#monitor-the-nodes-synchronization-process).\n\n---\n\n## Clone the Stacks blockchain Docker repository\n\nClone the Stacks blockchain Docker repository from GitHub:\n\n```terminal\n$ git clone https://github.com/blockstack/stacks-blockchain-docker.git\n$ cd stacks-blockchain-docker\n```\n\n## Start the service\n\nInside of the `stacks-blockchain-docker` directory, run the following command to start the Stacks node:\n\n```terminal\n$ ./manage.sh -n <network> -a start\n```\n\nThe `<network>` placeholder used below can be replaced with one of:\n\n- `mainnet`\n- `testnet`\n- `mocknet`\n\n## Monitor the node's synchronization process\n\nTo follow the logs for the Stacks node, run the following command:\n\n```terminal\n$ ./manage.sh -n <network> -a logs\n```\n\nFor networks other than `mocknet`, downloading the initial headers can take several minutes. Until the headers are downloaded, the `/v2/info` endpoints won't return any data.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/chainhook-as-a-service\"\n title=\"Run Chainhook as a service\"\n description=\"Learn how to use Chainhook to build your own custom API.\"\n />\n <Card\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Learn how to sync a Bitcoin node for running Chainhook as a service.\"\n />\n</Cards>\n"],[47,"\nimport { Code, Terminal } from \"lucide-react\"\nimport { SmallCard } from \"@/components/card\"\n\nimport { Callout } from \"@/components/callout\"\nimport { Card, Cards } from \"@/components/card\"\n\nThe Hiro Platform offers multiple ways to create projects, whether you're starting from scratch with a template or importing an existing repository. This guide will walk you through both approaches.\n\n## Using templates\n\nFrom the main projects page, click the \"Add a project\" button to begin creating a new project.\n\n![template selection](../images/create-project/c2.png)\n\nThe Platform provides 2 types of pre-built templates to help you get started quickly:\n\n1. App templates\n2. Contract-only templates\n\n**App templates** are feature rich templates pre-configured with a frontend and smart contracts.\n\n**Contract-only templates** are pre-configured with just that: a smart contract to help you start building.\n\nSimply select the template you want to get started with to open up a more detailed view of the app.\n\n![template selection](../images/create-project/c1.png)\n\nOnce you are ready, click the \"Clone\" button to copy the template to your GitHub account. From there, you will see instructions on how to clone the repository locally to start development.\n\n## Importing existing projects\n\nIf you have an existing project on GitHub, you can import it directly into the Hiro Platform:\n\n1. If you haven't already, authorize your GitHub account with the Hiro Platform\n2. You'll see a list of your repositories that can be imported\n3. Select the repository you want by clicking the \"Import\" button\n\n![import from github](../images/create-project/c3.png)\n\n<Callout type=\"info\">\nThe Platform requires specific Clarinet-generated files and a directory structure to import projects successfully. Your project should include:\n\n- `.clar` files containing your smart contracts\n- A `Clarinet.toml` configuration file\n- A specific directory structure with contracts in a `contracts` folder\n</Callout>\n\nOnce your project is ready, you will see instructions on next steps to get started.\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/platform/guides/deploy-contracts\"\n title=\"Deploy contracts\"\n description=\"Learn how to deploy your contracts to testnet and mainnet in the Hiro Platform.\"\n />\n <Card\n href=\"/stacks/platform/guides/devnet\"\n title=\"Running Devnet\"\n description=\"Learn how to use devnet to test your smart contracts in a local environment.\"\n />\n</Cards>\n"],[53,"\nimport { Code, Terminal } from \"lucide-react\"\nimport { SmallCard } from \"@/components/card\"\n\nIn this quickstart guide, you will create a simple fundraising app using one of the app templates available. This app features a single page that displays a fundraising campaign, and functionality that handles campaign contributions, refunds, and withdrawal by the fundraiser.\n\n## Create your account\n\nStart by creating an account in the Hiro Platform. You can create an account with:\n\n- Email\n- Google\n- GitHub\n- Discord\n\n![Platform Login](./images/quickstart/q1.png)\n\nOnce signed in, you will see an onboarding screen showing all the Hiro Platform has to offer:\n\n![Platform Welcome Screen](./images/quickstart/q2.png)\n\n## Create your project\n\nIf you do not have any existing projects, you will be prompted to create one on the projects page. Click the \"Add a project\" button to get started.\n\n<Callout type=\"info\">\nIf you already have projects, you can find the \"Add a project\" button at the top right of the page.\n</Callout>\n\nFrom here, you have the option to choose from a set of templates or import an existing project from your GitHub account. For this quickstart, select the \"Fundraising App\" template, which is a starter project that comes equipped with both a frontend and smart contracts.\n\n![choose template](./images/quickstart/q5.png)\n\n<Callout type=\"info\">\nTo see a list of your repositories and import an existing project, you will first need to authorize with GitHub.\n</Callout>\n\n## Clone your project\n\nOnce you have selected your project, you will be presented with the full set of details for the project. From here, you can clone the project to your GitHub account by clicking the \"Clone\" button.\n\n![template details](./images/quickstart/q3.png)\n\n<Callout type=\"info\">\nYou will need to authorize with Github before being able to clone the project.\n</Callout>\n\nOnce the project is ready and available in your GitHub account, you will see instructions on how to clone the project to your local machine or develop in the browser via Github Codespaces.\n\n![template ready](./images/quickstart/q4.png)\n\nYou are now ready to start building!\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/platform/guides/deploy-contracts\"\n title=\"Deploy contracts\"\n description=\"Learn how to deploy your contracts to testnet and mainnet using deployment plans in the Hiro Platform.\"\n />\n <Card\n href=\"/stacks/platform/guides/devnet\"\n title=\"Running Devnet\"\n description=\"Learn how to use devnet, a private blockchain environment, to test and interact with your app.\"\n />\n <Card\n href=\"/stacks/platform/guides/create-chainhooks\"\n title=\"Create and manage Chainhooks\"\n description=\"Learn how to create custom event streams for Stacks or Bitcoin with Chainhook on the Platform.\"\n />\n</Cards>\n"],[352,"\nimport { ConnectWalletButton } from '@/components/code/connect-wallet-button';\nimport { ContentBackground } from '@/components/ui/icon';\n\nAuthentication is a fundamental part of many web applications, ensuring that users are who they claim to be and that their data is secure. With the Stacks blockchain, user authentication involves connecting to users' wallets and managing their sessions securely.\n\nThe `@stacks/connect` package provides the tools needed to integrate this functionality seamlessly into your web app.\n\nIn this guide, you will learn how to:\n\n1. [Install the `@stacks/connect` package](#install-the-stacksconnect-package).\n2. [Connect to a user's wallet](#connect-to-a-users-wallet).\n3. [Manage authentication state](#manage-authentication-state).\n4. [Access user data](#access-user-data).\n\n{/* <Callout>To see this guide in action, check out a full example [here](https://github.com/hiro-so/stacks-connect-example).</Callout> */}\n\n---\n\n## Install the @stacks/connect package\n\n```package-install\n@stacks/connect\n```\n\n## Connect to a user's wallet\n\nAfter installing the `@stacks/connect` package, you can use the `connect` function to initiate a wallet connection. This will trigger a popup that allows users to select and connect their wallet.\n\n```ts\nimport { connect } from '@stacks/connect';\n\nasync function authenticate() {\n const response = await connect();\n // response contains the user's addresses\n}\n```\n\n<div className=\"not-prose relative overflow-hidden\">\n <div className=\"relative bg-card rounded-lg border border-border/50 overflow-auto p-8 h-auto\">\n <div className=\"absolute inset-x-0 bottom-0\">\n <ContentBackground />\n </div>\n <div className=\"grid place-items-center h-full\">\n <ConnectWalletButton />\n </div>\n </div>\n</div>\n\nThe `connect` function stores the user's addresses in local storage by default, making it easy to persist the user's session across page reloads and browser sessions.\n\n<Callout>You can customize the connection behavior by passing options to the `connect` function, such as forcing wallet selection or specifying default providers. See the [advanced usage](/stacks/connect/packages/connect#advanced-usage) section for more details.</Callout>\n\n## Manage authentication state\n\nYou can manage the user's authentication state using the following functions:\n\n```ts\nimport { connect, disconnect, isConnected } from '@stacks/connect';\n\n// Check if user is connected\nconst authenticated = isConnected();\n\n// Connect to wallet\nawait connect();\n\n// Disconnect user\ndisconnect(); // clears local storage and selected wallet\n```\n\n## Access user data\n\nOnce connected, you can access the user's data using the `getLocalStorage` function or make specific requests using the `request` method:\n\n```ts\nimport { getLocalStorage, request } from '@stacks/connect';\n\n// Get stored user data\nconst userData = getLocalStorage();\n// {\n// \"addresses\": {\n// \"stx\": [\n// { \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\" },\n// ],\n// \"btc\": [\n// { \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\" },\n// ]\n// }\n// }\n\n// Get detailed account information\nconst accounts = await request('stx_getAccounts');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cd...\",\n// \"gaiaHubUrl\": \"https://hub.hiro.so\",\n// \"gaiaAppKey\": \"0488ade4040658015580000000dc81e3a5...\"\n// }\n// ]\n// }\n```\n\n<Callout title=\"Note\">For a list of all available methods, see the [reference](/stacks/connect/packages/connect) page.</Callout>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n <Card\n href=\"/stacks/stacks.js/guides/post-conditions\"\n title=\"Deep dive into post-conditions\"\n description=\"Learn how to build post-conditions to secure your smart contracts.\"\n />\n</Cards>"],[11,"\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/quickstart\"\n title=\"Create your first smart contract\"\n description=\"Build a simple counter contract using Clarinet.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Blockchain />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write unit tests for your smart contracts\"\n description=\"Learn how run unit tests with Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/stacks.js/quickstart\"\n title=\"Make a contract call with Stacks.js\"\n description=\"Learn how to integrate smart contracts into your app.\"\n tag='Stacks.js'\n />\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n"],[381,"\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/quickstart\"\n title=\"Create your first smart contract\"\n description=\"Build a simple counter contract using Clarinet.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Blockchain />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write unit tests for your smart contracts\"\n description=\"Learn how run unit tests with Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/stacks.js/quickstart\"\n title=\"Make a contract call with Stacks.js\"\n description=\"Learn how to integrate smart contracts into your app.\"\n tag='Stacks.js'\n />\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n"],[505,"\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/quickstart\"\n title=\"Create your first smart contract\"\n description=\"Build a simple counter contract using Clarinet.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Blockchain />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write unit tests for your smart contracts\"\n description=\"Learn how run unit tests with Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/stacks.js/quickstart\"\n title=\"Make a contract call with Stacks.js\"\n description=\"Learn how to integrate smart contracts into your app.\"\n tag='Stacks.js'\n />\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n"],[256,"\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n"],[501,"\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n"],[29,"\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nCreate a new Clarinet project with the basic directory structure and configuration files:\n\n```terminal\n$ clarinet new my-project\n\u001b[32mCreate directory\u001b[0m \u001b[1mmy-project\u001b[0m\n\u001b[32mCreate directory\u001b[0m \u001b[1mcontracts\u001b[0m\n\u001b[32mCreate directory\u001b[0m \u001b[1msettings\u001b[0m\n\u001b[32mCreate directory\u001b[0m \u001b[1mtests\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1mClarinet.toml\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1msettings/Mainnet.toml\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1msettings/Testnet.toml\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1msettings/Devnet.toml\u001b[0m\n\u001b[32mCreate directory\u001b[0m \u001b[1m.vscode\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1m.vscode/settings.json\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1m.vscode/tasks.json\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1m.gitignore\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1m.gitattributes\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1mpackage.json\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1mtsconfig.json\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1mvitest.config.js\u001b[0m\n```\nThis will create a project directory with the following directory layout:\n\n<Files className='pointer-events-none'>\n <Folder name=\"contracts\" />\n <Folder name=\"settings\" defaultOpen>\n <File name=\"Devnet.toml\" />\n <File name=\"Mainnet.toml\" />\n <File name=\"Testnet.toml\" />\n </Folder>\n <Folder name=\"tests\" />\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n</Files>\n\nThe _txt`Clarinet.toml`_ file contains configuration for the smart contracts in your project. When you create contracts in your project, Clarinet will automatically add them to this file.\n\nThe _txt`settings/Devnet.toml`_ file contains configuration for accounts in the Clarinet console, including the seed phrases and initial balances for a set of out-of-the-box wallets that you can use for testing in the devnet environment."],[375,"\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nFollow these steps to register your Chainhooks on devnet using Clarinet:\n\n<Callout title=\"Requirements\" type=\"warn\">\n This feature requires Clarinet version 2.1.0 or higher. To upgrade or install, refer to our [installation](/stacks/clarinet/installation) page for Clarinet.\n</Callout>\n\n## Create your Chainhook predicates\n\nFirst, within your Clarinet project, you'll need to create your Chainhook predicate files.\n\nThese should be situated in the root of your project directory. The files can either be separate or stored within a specific folder, e.g., `/chainhooks` in your project root directory:\n\n<Files className='pointer-events-none'>\n <Folder name=\"contracts\" defaultOpen>\n <File name=\"counter.clar\" />\n </Folder>\n <Folder name=\"chainhooks\" defaultOpen className='bg-[hsl(var(--highlight))]'>\n <File name=\"increment.json\" />\n <File name=\"decrement.json\" />\n </Folder>\n <Folder name=\"settings\" />\n <Folder name=\"tests\" defaultOpen>\n <File name=\"counter.test.ts\" />\n </Folder>\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n</Files>\n\nFor examples on how to define your predicates, refer to the [scopes](/stacks/chainhook/references/scopes/stacks) reference page.\n\n## Start devnet\n\nTo start devnet, run the _`clarinet devnet start`_ command from the root of your project directory. Running this command will begin a local Chainhook service in the background that automatically registers your Chainhook files within the project directory against the network.\n\n## Confirm registration\n\nOnce your devnet starts, the Chainhook service initiates the registration process. You'll know that the registration of your Chainhooks was successful by checking the confirmation message in your terminal:\n\n```terminal\n$ clarinet devnet start\n# ...\nINFO Feb 5 15:20:07.233382 2 chainhooks registered\n```\n\nIf you do not see this message at the top of your _`clarinet devnet start`_ logs, verify that you are using `clarinet` version 2.1.0 or higher.\n\n## Working with chainhooks\n\nWith these steps completed, your chainhooks are ready to trigger whenever local contract actions occur. You can monitor your network activity locally, through the _`clarinet devnet start` terminal, to confirm chainhooks execution as you further develop and test your smart contracts. When an action occurs, you should see something like this:\n\n```terminal\n$ clarinet devnet start\n# ...\nINFO Feb 5 15:21:07.233382 1 hooks triggered\n```\n\nAt this point, you can verify the payload for that action depending on whether you are expecting an _json`http_post`_ or _json`file_append`_ result from your _json`then_that`_ configuration.\n"],[23,"\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nLaunch the Clarinet console for interactive development:\n\n```terminal\n$ clarinet console\n```\n\nThis commands starts a new interactive REPL session so you can interact with your contracts."],[20,"\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nTo add a new contract, run the `clarinet contract new` command, along with your contract name, inside your project.\n\n```terminal\n$ clarinet contract new my-contract\n```\n\n## Project structure\n\n**Clarinet** will add 2 files to your project: `my-contract.clar` and `my-contract.test.ts`.\n\n<Files className='pointer-events-none'>\n <Folder name=\"contracts\" defaultOpen>\n <File name=\"my-contract.clar\" className='bg-[hsl(var(--highlight))]' />\n </Folder>\n <Folder name=\"settings\" />\n <Folder name=\"tests\" defaultOpen>\n <File name=\"my-contract.test.ts\" className='bg-[hsl(var(--highlight))]' />\n </Folder>\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n</Files>\n\n**Clarinet** will also add the configuration to the `Clarinet.toml` file for your contract.\n\n```toml\n[contracts.my-contract]\npath = 'contracts/my-contract.clar'\nclarity_version = 2\nepoch = 2.4\n```\n\n<Callout title=\"Adding contracts manually\">\nYou can also add contracts to your project by adding the files manually. However, you must add the appropriate configuration to `Clarinet.toml` in order for **Clarinet** to recognize the contracts.\n</Callout>"],[21,"\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nValidate the syntax and semantics of your contracts:\n\n```terminal\n$ clarinet check\n\u001b[32m✔\u001b[0m \u001b[1m1 contract checked\u001b[0m\n$ clarinet check path/to/my-contract.clar\n\u001b[32m✔\u001b[0m \u001b[1m1 contract checked\u001b[0m\n```\n\nThis command uses the _txt`Clarinet.toml`_ file to locate and analyze all the contracts in the project. If the Clarity code is valid, the command will indicate success with the response below.\n\n<Callout title=\"Note\">\nThe _console`clarinet check`_ command may also report warnings indicating the code is valid.\n</Callout>"],[228,"\nimport { Globe } from 'lucide-react';\nimport { Card, SecondaryCard } from '@/components/card';\n\nStacks.js is a JavaScript/TypeScript SDK for building on the Stacks blockchain. It's a collection of various JavaScript libraries that allow you to broadcast a transaction with the Stacks blockchain, construct post-conditions, and more. Some of the most important building blocks, all in one place.\n\nStacks.js is separated into many smaller packages, which can be installed individually. Most packages are published to npm under the `@stacks` scope.\n\nFor more details, check out out our [installation guide](./stacks.js/installation).\n\n<SecondaryCard\n icon={<Globe/>}\n href=\"/stacks/connect\"\n title=\"Build a Stacks web app\"\n description=\"Integrate Stacks.js into your web apps with Stacks Connect.\"\n tag=\"Stacks Connect\"\n/>\n\n## Guides\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/stacks.js/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Create and broadcast transactions using Stacks.js builder and helper functions.\"\n />\n <SecondaryCard\n href=\"/stacks/stacks.js/guides/post-conditions\"\n title=\"Constructing post-conditions\"\n description=\"Build post-conditions into your smart contracts and safe-guard your users.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks Connect](/stacks/connect)**: Interact with the Stacks blockchain with your wallet extension.\n- **[Hiro Platform](/stacks/platform)**: A developer platform for building, deploying and scaling Bitcoin apps.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Stacks.js?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#stacks-js</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n"],[68,"\nimport { HackBadge } from \"@/components/badge\";\n\n<Callout title=\"Inactive\" type=\"warn\">\nThis hack has been archived. Feel free to continue to use the code in this guide as a reference for your own projects.\n</Callout>\n\n## Introduction\n\nIn the previous hacks, you built some pretty complex smart contracts. But building a robust UI/UX around these smart contracts and their on-chain data can be challenging due to the nature of blockchains.\n\nLet's take the [decentralized grants program](/stacks/hacks/build-a-decentralized-grants-program) hack as an example. In this project, anyone can propose a grant, and these proposals are voted on by token holders. The details of each proposal, including the title, description, and the proposal contract, are stored on the blockchain.\n\nHowever, directly querying the blockchain for this data every time you want to display it in your application's UI can be slow and inefficient. And that information might not always be formatted and organized in a way that makes sense for your use case.\n\nThis is where [Chainhook](/stacks/chainhook) comes in. Chainhook allows you to listen for specific on-chain events, such as the submission of a new grant proposal, and trigger actions in response - like inserting specific data into a database to query off-chain.\n\nIn this guide, you'll build a custom API with Chainhook using the [Hiro Platform](https://platform.hiro.so/), with a focus on integrating it with the contracts you built for the decentralized grants program hack.\n\n## Creating a server\n\nIn this section, we'll briefly discuss setting up an Express server to handle incoming event data from Chainhook. While a detailed walkthrough of setting up an Express server is beyond the scope of this guide, you can reference an example app [here](https://github.com/hirosystems/examples/tree/main/apps/chainhook).\n\nTo illustrate how to handle this event data, here is an example `server.ts` file:\n\n```typescript\nconst express = require(\"express\")\nconst app = express()\napp.use(express.json())\n\napp.post(\"/api/events\", (req, res) => {\n const events = req.body\n // Process the event data here\n res.status(200).send({ message: \"Event received\" })\n})\n\napp.listen(3000, () => {\n console.log(\"Server is running on port 3000\")\n})\n```\n\nIn this example, the server listens for POST requests at the `/api/events` route. When a request is received from your chainhook (which you will set up in the next section), you can extract the event data from the request body and process it.\n\n## Parsing the event data\n\nThe Chainhook payload comes with a lot of information, so let's break down some of the more important parts inside of the `req.body` for this guide.\n\nHere is a truncated look at the payload structure from Chainhook:\n\n```json\n{\n \"apply\": [\n {\n \"transactions\": [\n {\n \"metadata\": {\n \"receipt\": \"...\"\n },\n \"operations\": [\n {\n \"...\": \"...\"\n }\n ]\n }\n ]\n }\n ]\n}\n```\n\nEach item in the `apply` array should contain a `transactions` array. Each `transaction` object should have a `metadata` object with a `receipt` attribute and an `operations` array.\n\n- `transaction.metadata.receipt`: This attribute contains information about any events that were triggered from the function.\n- `transaction.operations`: This is an array that contains more specific information about what happened as a result of the function call. For instance if a _token transfer_ occured, each object inside this array would contain various attributes and information regarding the account, amount, type, and status of the token transfer.\n\nHere's what your POST route might look like after filtering for the relevant data in your `server.ts` file:\n\n```typescript\napp.post(\"/api/events\", async (req, res) => {\n const events = req.body\n // Loop through each item in the apply array\n events.apply.forEach((item: any) => {\n // Loop through each transaction in the item\n item.transactions.forEach((transaction: any) => {\n // If the transaction has operations, loop through them\n if (transaction.operations) {\n transaction.operations.forEach((operation: any) => {\n // Log the operation\n console.log({ operation })\n })\n }\n })\n })\n\n // Send a response back to Chainhook to acknowledge receipt of the event\n res.status(200).send({ message: \"Proposal added!\" })\n})\n```\n\nFor the next section, you will need to expose your local server via `https` so that Chainhook can deliver the `payload`. To do that, run the following command:\n\n```terminal\n$ npx localtunnel --port <your-port-number>\n```\n\n> _**Note**_\n>\n> There are several tools for exposing localhost to the world so choose the one you prefer. For more information on `localtunnel`, click [here](https://github.com/localtunnel/localtunnel).\n\n## Integrating with Chainhook\n\nIn this section, you will integrate Chainhook with your smart contracts. This involves creating a chainhook predicate that matches the specific on-chain events you want to respond to. For this process, you'll use the [Hiro Platform](https://platform.hiro.so/), which provides a user-friendly interface for creating and managing your chainhooks. By the end of this section, you'll have a chainhook set up and ready to trigger actions in response to on-chain events.\n\n## Deploying your contracts to testnet\n\nIn order to create your chainhook, you need to deploy your contracts to `testnet`. From your projects page, click on the Deploy button near the top right of your screen. You'll see your deployment options: choose \"Generate for Testnet.\"\n\n> _**Note**_\n>\n> The Platform will provide a step for requesting Testnet STX, but you can also go straight to the [Stacks Testnet Faucet](https://explorer.hiro.so/sandbox/faucet?chain=testnet). Once you have testnet STX tokens, you can deploy your contracts to testnet using the same methods you used for devnet, but with the network parameter set to testnet.\n\n## Creating a Chainhook\n\nNow it's time to create your first Chainhook. Start by creating a predicate that matches the `propose` function in your `proposal-submission` contract. This function is called when a new grant proposal is submitted.\n\nHere's an example of how you might define this `predicate.json` file for your contract:\n\n```json\n{\n \"chain\": \"stacks\",\n \"uuid\": \"1\",\n \"name\": \"New Grant Proposal\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"ST2BSV94A650WGZ2YZ5Y8HM93W01NGT4GY0MGJECG.proposal-submission\",\n \"method\": \"propose\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"<your-https-server-url>\",\n \"authorization_header\": \"Bearer 12345\"\n }\n },\n \"start_block\": 138339\n }\n }\n}\n```\n\n<Callout title=\"Note\" type=\"info\">\n Make sure to swap out the details in your `predicate.json` file to match your\n contracts ABI.\n</Callout>\n\nThe `if_this` section specifies the conditions for the events that this Chainhook will respond to. In this case, it's looking for calls to the `propose` method in the `proposal-submission` contract on the Stacks testnet.\n\nThe `then_that` section specifies what action the Chainhook should take when it detects an event that matches the `if_this` conditions. Here, it's set up to send a POST request to your specified URL with the event data.\n\nThe `start_block` field is used to specify the starting block for the Chainhook to start listening from. This is useful for ignoring blocks that were mined before the Chainhook was set up.\n\nOnce you have created a similar file for your specific contract. select the _Chainhooks_ tab inside your project and upload your predicate file using the _Upload Chainhook_ option. For more information, you can follow the [Create Chainhooks](/stacks/platform/guides/create-chainhooks) section.\n\n## Testing your chainhook\n\nOnce you've successfully uploaded your chainhook predicate, it's time to test it out. You can do this by performing an action that aligns with your `if_this` - `then_that` logic.\n\nFor instance, if your Chainhook is set up to respond to a specific contract call, you can trigger that call and then check your `/api/post` endpoint. If everything is set up correctly, you should see any information you've requested to be logged.\n\nThe next section presents several challenges that will help you put the finishing touches on your API. With the foundation you've built, you're well-equipped to take on these challenges and continue your journey in building robust, decentralized applications.\n\nCongratulations on reaching this point! You now have all the building blocks needed to create a custom API using Chainhook and integrate it with your smart contracts. This is a significant step towards enhancing the functionality and user experience of your decentralized applications.\n\n<Callout title=\"Note\" type=\"warn\">\n This is a crucial step in verifying that your Chainhook is working as\n expected. If you don't see the expected output, you may need to revisit your\n predicate and ensure it's correctly configured.\n</Callout>\n\n## Challenges\n\nThe following challenges are additional features you can implement to further explore building on Stacks. Feel free to add any other features you want.\n\n<HackBadge variant=\"starter\" />\n\n**Create more than 1 chainhook**: Don't stop at just 1! Follow the process above to create more than 1 chainhook for your dApp and parse the data accordingly.\n\n<HackBadge variant=\"intermediate\" />\n\n**Create consumer-facing API endpoints**: Up until now, we've shown you how to capture and process the initial `payload` data sent from a chainhook. However, to provide a robust user experience, you'll want to do more than just output raw data. The challenge here is to create additional API endpoints that present the filtered and extracted data from the initial `/api/events` payload in a consumer-friendly format. This could involve adding a database layer for organizing the data, adding additional context, or transforming the data to match the needs of your application's frontend. For a quick db setup, you can try using something like [Supabase](https://supabase.com/docs/guides/getting-started/quickstarts/reactjs).\n\n```typescript\n// Example using Supabase\n\nconst supabase = createClient(\n \"https://<project>.supabase.co\",\n \"<your-anon-key>\"\n)\n\napp.post(\"/api/events\", async (req, res) => {\n // ...\n\n item.transactions.forEach((transaction: any) => {\n if (transaction.operations) {\n transaction.operations.forEach((operation: any) => {\n const data = operation // Parse out the data you want\n // Insert and save it to db\n const { error } = await supabase.from(\"proposals\").insert(data)\n })\n }\n })\n\n // ...\n})\n```\n\n<HackBadge variant=\"advanced\" />\n\n**UI integration**: The final challenge is to integrate your consumer-facing API into your frontend. This involves taking the data you've processed and organized in your API and displaying it in a meaningful and user-friendly way in your application. This could involve creating dynamic components that update in response to new data, adding interactive elements that allow users to explore the data, or incorporating visualizations to help users understand the data.\n"],[69,"\nimport { HackBadge } from \"@/components/badge\";\n\n<Callout title=\"Inactive\" type=\"warn\">\nThis hack has been archived. Feel free to continue to use the code in this guide as a reference for your own projects.\n</Callout>\n\n## Introduction\n\nWelcome to a world where funding for innovative projects is fluid and controlled by a community of token holders, not just a select few. This is the value proposition of a decentralized grants program. In this guide, you will build such a program using the [ExecutorDAO](https://github.com/MarvinJanssen/executor-dao) protocol on the Stacks blockchain.\n\nKey features of this project include:\n\n**Decentralized Governance**: Anyone holding a `membership-token` can vote on grant proposals.\n\n**Open Proposal Submission**: Anyone can propose a grant, encouraging a wide range of ideas and projects.\n\n**Smart Contract Automation**: All aspects of the grants program, from proposal submission to voting and fund distribution, are automated through smart contracts, ensuring transparency and tamper-proof processes.\n\nThis Hack walks you through the basics of building a decentralized grants program. Over the course of this hack, you will deploy your own functioning grants program.\n\nThere are also optional challenges at the end to further stretch your skills.\n\nNow it's time to hack. First, we'll cover the basics of the core functionalities of our grants program and look at 4 contracts. Let's dive in.\n\n## Understanding the ExecutorDAO protocol\n\nExecutorDAO is a powerful and flexible protocol that allows for the creation of decentralized autonomous organizations (DAOs) with a high degree of modularity and customization. ExecutorDAO operates on three core tenets:\n\n**Proposals are smart contracts**:\nProposals in ExecutorDAO are expressed as smart contracts, allowing for precise, logical descriptions of the operations, duties, and members of the DAO. In our case, each grant application is a proposal expressed as a smart contract.\n\n**The core executes, the extensions give form**:\nExecutorDAO starts with a single core contract whose sole purpose is to execute proposals and keep a list of authorized `extensions`. Extensions are contracts that can be enabled or disabled by proposals and add specific features to the DAO - like _proposing grants_, _voting on grants_, _distributing funds_, and more.\n\n**Ownership control happens via sending context**:\nExecutorDAO follows a single-address ownership model. The core contract is the de facto owner of external ownable contracts. This allows any proposal or extension to act upon it, like the `membership-token` we will build out in the sections below.\n\nFor more details, you can [view the standard contracts](https://github.com/MarvinJanssen/executor-dao/tree/main/contracts) in the ExecutorDAO repository.\n\n## Clone the starter template\n\nStart by setting up your development environment. We've prepared a repository that includes an initialized Clarinet project and a React frontend with some boilerplate code and all the required packages.\n\nTo clone the repository, open your terminal and run the following command:\n\n```terminal\n$ git clone https://github.com/hirosystems/hiro-hacks-template.git\n$ cd hiro-hacks-template\n```\n\n## Establishing your core contract\n\nBefore creating your core contract, you need to create `trait` contracts that you'll be implementing for your grants program.\n\nTraits in Clarity define a set of functions that a contract must implement. In this case, any contract that wants to be a `proposal` or an `extension` must implement the functions defined in the `proposal-trait` and `extension-trait` respectively.\n\nIn your project's directory, run the following command:\n\n```terminal\n$ clarinet contract new extension-trait && clarinet contract new proposal-trait\n```\n\nNow in your contracts, respectively, add the following code:\n\n```clarity extension-trait.clar\n(define-trait extension-trait\n (\n (callback (principal (buff 34)) (response bool uint))\n )\n)\n```\n\n```clarity proposal-trait.clar\n(define-trait proposal-trait\n (\n (execute (principal) (response bool uint))\n )\n)\n```\n\nNow that you've defined how your set of functions must be implemented, you can begin to create your core contract. First run the following command:\n\n```terminal\n$ clarinet contract new core\n```\n\nThis will create a new contract in the `contracts` directory called `core.clar`.\n\nInside your `core.clar` contract, add the two trait contracts you've just created from the steps above:\n\n```clarity core.clar\n(use-trait proposal-trait .proposal-trait.proposal-trait)\n(use-trait extension-trait .extension-trait.extension-trait)\n```\n\n## Error handling and state management\n\nNext, you need to define some basic error handling and variables for managing your contracts:\n\n```clarity core.clar\n(define-constant ERR_UNAUTHORIZED (err u1000))\n(define-constant ERR_ALREADY_EXECUTED (err u1001))\n(define-constant ERR_INVALID_EXTENSION (err u1002))\n\n(define-data-var executive principal tx-sender)\n(define-map executedProposals principal uint)\n(define-map extensions principal bool)\n```\n\nThese constants represent error codes that the contract can return. The variables store the executive principal (the owner of the grants program), a map of executed proposals, and a map of authorized extensions.\n\n## Authorization check\n\nThe `is-self-or-extension` function is a private function that checks if the caller of a function is the contract itself or an authorized extension:\n\n```clarity core.clar\n(define-private (is-self-or-extension)\n (ok (asserts! (or (is-eq tx-sender (as-contract tx-sender)) (is-extension contract-caller)) ERR_UNAUTHORIZED))\n)\n\n(define-read-only (is-extension (extension principal))\n (default-to false (map-get? extensions extension))\n)\n\n(define-read-only (executed-at (proposal <proposal-trait>))\n (map-get? executedProposals (contract-of proposal))\n)\n```\n\n## Extension management\n\nHere's a function to enable or disable an extension (`set-extension`):\n\n```clarity core.clar\n(define-public (set-extension (extension principal) (enabled bool))\n (begin\n (try! (is-self-or-extension))\n (print {event: \"extension\", extension: extension, enabled: enabled})\n (ok (map-set extensions extension enabled))\n )\n)\n```\n\n## Proposal execution\n\nThe `execute` function allows for the execution of a proposal:\n\n```clarity core.clar\n(define-public (execute (proposal <proposal-trait>) (sender principal))\n (begin\n (try! (is-self-or-extension))\n (asserts! (map-insert executedProposals (contract-of proposal) block-height) ERR_ALREADY_EXECUTED)\n (print {event: \"execute\", proposal: proposal})\n (as-contract (contract-call? proposal execute sender))\n )\n)\n```\n\nThis function checks if the caller is authorized, inserts the proposal into the `executedProposals` map, and then calls the `execute` function of the proposal contract.\n\n## Bootstrap\n\nThe `construct` function is used to bootstrap the grants program:\n\n```clarity core.clar\n(define-public (construct (proposal <proposal-trait>))\n (let\n (\n (sender tx-sender)\n )\n (asserts! (is-eq sender (var-get executive)) ERR_UNAUTHORIZED)\n (var-set executive (as-contract tx-sender))\n (as-contract (execute proposal sender))\n )\n)\n```\n\nThis function checks if the caller is the executive, sets the executive to the contract itself, and then executes the provided proposal.\n\n## Extension requests\n\nThe request-extension-callback function allows an extension to request a callback:\n\n```clarity core.clar\n(define-public (request-extension-callback (extension <extension-trait>) (memo (buff 34)))\n (let\n (\n (sender tx-sender)\n )\n (asserts! (is-extension contract-caller) ERR_INVALID_EXTENSION)\n (asserts! (is-eq contract-caller (contract-of extension)) ERR_INVALID_EXTENSION)\n (as-contract (contract-call? extension callback sender memo))\n )\n)\n```\n\nThis function checks if the caller is an authorized extension and then calls the `callback` function of the extension contract.\n\nThese are the key components of the ExecutorDAO core contract. Understanding these will help you in building your own extensions and proposals.\n\n## Create your membership token\n\nIn this section, you will create your first `extension`, a non-transferable membership token, which will be used to grant voting rights on proposals. The token will be initially distributed to certain addresses during the bootstrapping process. However, new minting (distribution) and burning (removal) of tokens can be managed through proposals.\n\nTo create your membership token, navigate to your project's directory and run the following command:\n\n```terminal\n$ clarinet contract new membership-token\n```\n\nThis will create a new contract in the contracts directory called `membership-token.clar`.\n\nLet's walk through the key components of this contract.\n\n## Constants and variables\n\nThe contract defines some constants and variables:\n\n```clarity membership-token.clar\n(define-constant ERR_UNAUTHORIZED (err u2000))\n(define-constant ERR_NOT_TOKEN_OWNER (err u2001))\n(define-constant ERR_MEMBERSHIP_LIMIT_REACHED (err u2002))\n\n(define-fungible-token sGrant)\n\n(define-data-var tokenName (string-ascii 32) \"sGrant\")\n(define-data-var tokenSymbol (string-ascii 10) \"SGT\")\n(define-data-var tokenUri (optional (string-utf8 256)) none)\n(define-data-var tokenDecimals uint u6)\n```\n\nThese constants represent error codes that the contract can return. The variables store the token name, symbol, URI, and decimals. The define-fungible-token function is used to define our sGrant token.\n\n## Authorization check\n\nThe `is-dao-or-extension`, function is a private function that checks if the caller of a function is the core contract itself or an authorized extension:\n\n```clarity membership-token.clar\n(define-public (is-dao-or-extension)\n (ok (asserts! (or (is-eq tx-sender .core) (contract-call? .core is-extension contract-caller)) ERR_UNAUTHORIZED))\n)\n```\n\nThis function will allow you to distribute (or burn) tokens to new members, granting them the ability to vote on future grant proposals.\n\n## Token minting and burning\n\nThe contract provides functions to `mint` and `burn` tokens:\n\n```clarity membership-token.clar\n(define-public (mint (amount uint) (recipient principal))\n (begin\n (try! (is-dao-or-extension))\n (ft-mint? sGrant amount recipient)\n )\n)\n\n(define-public (burn (amount uint) (owner principal))\n (begin\n (try! (is-dao-or-extension))\n (ft-burn? sGrant amount owner)\n )\n)\n```\n\nThese functions check if the caller is authorized and then mint or burn the specified amount of sGrant tokens. And as you can see, these functions must be executed either through an approved grant proposal or an enabled `extension` (more on this later).\n\n## Token information\n\nThe contract provides functions to get the token's name (`get-name`), symbol (`get-symbol`), decimals (`get-decimals`), balance (`get-balance`), total supply (`get-total-supply`), and URI (`get-token-uri`):\n\n```clarity membership-token.clar\n(define-read-only (get-name)\n (ok (var-get tokenName))\n)\n\n(define-read-only (get-symbol)\n (ok (var-get tokenSymbol))\n)\n\n(define-read-only (get-decimals)\n (ok (var-get tokenDecimals))\n)\n\n(define-read-only (get-balance (who principal))\n (ok (ft-get-balance sGrant who))\n)\n\n(define-read-only (get-total-supply)\n (ok (ft-get-supply sGrant))\n)\n\n(define-read-only (get-token-uri)\n (ok (var-get tokenUri))\n)\n```\n\nThese functions return the corresponding information about the `sGrant` token.\n\nThese are the key components of the `sGrant` token contract. Understanding these will help you in managing the distribution and burning of tokens through proposals.\n\n## Proposal submission contract (extension)\n\nIn this section, you will create your second `extension`, a proposal submission contract. This contract will allow anyone to propose a grant, which will then be voted on by the token holders.\n\nTo create your proposal submission contract, navigate to your project's directory and run the following command:\n\n```terminal\n$ clarinet contract new proposal-submission\n```\n\nThis will create a new contract in the contracts directory called proposal-submission.clar.\n\nLet's walk through the key components of this contract.\n\n## Traits and constants\n\nFirst, you need to implement the `extension-trait` and use the `proposal-trait`:\n\n```clarity proposal-submission.clar\n(impl-trait .extension-trait.extension-trait)\n(use-trait proposal-trait .proposal-trait.proposal-trait)\n```\n\nNext, define some constants that represent error codes:\n\n```clarity proposal-submission.clar\n(define-constant ERR_UNAUTHORIZED (err u3000))\n(define-constant ERR_UNKNOWN_PARAMETER (err u3001))\n```\n\n## Variables\n\nFirst, define a map to store the parameters of your contract:\n\n```clarity proposal-submission.clar\n(define-map parameters (string-ascii 34) uint)\n```\n\nSet the proposal-duration parameter to a default value. This value represents the duration of a proposal in blocks. For example, if a block is mined approximately every 10 minutes, a proposal-duration of 1440 would be approximately 10 days.\n\n```clarity proposal-submission.clar\n(map-set parameters \"proposal-duration\" u1440) ;; ~10 days based on a ~10 minute block time.\n```\n\n## Authorization check\n\nThe `is-dao-or-extension` function is a private function that checks if the caller of a function is the core contract itself or an authorized extension:\n\n```clarity proposal-submission.clar\n(define-public (is-dao-or-extension)\n (ok (asserts! (or (is-eq tx-sender .core) (contract-call? .core is-extension contract-caller)) ERR_UNAUTHORIZED))\n)\n```\n\n## Parameters\n\nThe get-parameter function is a read-only function that returns the value of a parameter:\n\n```clarity proposal-submission.clar\n(define-read-only (get-parameter (parameter (string-ascii 34)))\n (ok (unwrap! (map-get? parameters parameter) ERR_UNKNOWN_PARAMETER))\n)\n```\n\n## Proposals\n\nThe propose function allows anyone to propose a grant:\n\n```clarity proposal-submission.clar\n(define-public (propose (proposal <proposal-trait>) (title (string-ascii 50)) (description (string-utf8 500)))\n (begin\n (contract-call? .proposal-voting add-proposal\n proposal\n {\n end-block-height: (+ block-height (try! (get-parameter \"proposal-duration\"))),\n proposer: tx-sender,\n title: title,\n description: description\n }\n )\n )\n)\n```\n\nThis function calls the add-proposal function of the proposal-voting contract, passing the proposal contract, the current block height as the start block height, the current block height plus the proposal-duration as the end block height, the sender as the proposer, and the title and description of the proposal.\n\n## Extension callback\n\nThe callback function allows the core contract to request a callback:\n\n```clarity proposal-submission.clar\n(define-public (callback (sender principal) (memo (buff 34)))\n (ok true)\n)\n```\n\nThese are the key components of the proposal submission contract. Understanding these will help you in managing the submission of proposals.\n\n## Proposal voting contract (extension)\n\nIn this section, you will create your third extension, a proposal voting contract. This contract will allow token holders to vote on the proposed grants.\n\nTo create your proposal voting contract, navigate to your project's directory and run the following command:\n\n```terminal\n$ clarinet contract new proposal-voting\n```\n\nThis will create a new contract in the contracts directory called proposal-voting.clar.\n\nLet's walk through the key components of this contract.\n\n## Traits and constants\n\nFirst, you need to implement the extension-trait and use the proposal-trait:\n\n```clarity proposal-voting.clar\n(impl-trait .extension-trait.extension-trait)\n(use-trait proposal-trait .proposal-trait.proposal-trait)\n```\n\nNext, define some constants that represent error codes:\n\n```clarity proposal-voting.clar\n(define-constant ERR_UNAUTHORIZED (err u3000))\n(define-constant ERR_PROPOSAL_ALREADY_EXECUTED (err u3002))\n(define-constant ERR_PROPOSAL_ALREADY_EXISTS (err u3003))\n(define-constant ERR_UNKNOWN_PROPOSAL (err u3004))\n(define-constant ERR_PROPOSAL_ALREADY_CONCLUDED (err u3005))\n(define-constant ERR_PROPOSAL_INACTIVE (err u3006))\n(define-constant ERR_PROPOSAL_NOT_CONCLUDED (err u3007))\n(define-constant ERR_NO_VOTES_TO_RETURN (err u3008))\n(define-constant ERR_END_BLOCK_HEIGHT_NOT_REACHED (err u3009))\n(define-constant ERR_DISABLED (err u3010))\n```\n\n## Variables\n\nYou need to define a map to store the proposals and another map to store the total votes of each member:\n\n```clarity proposal-voting.clar\n(define-map proposals\n principal\n {\n votes-for: uint,\n votes-against: uint,\n end-block-height: uint,\n concluded: bool,\n passed: bool,\n proposer: principal,\n title: (string-ascii 50),\n description: (string-utf8 500)\n }\n)\n\n(define-map member-total-votes {proposal: principal, voter: principal} uint)\n```\n\n## Authorization check\n\nThe `is-dao-or-extension` function is a private function that checks if the caller of a function is the core contract itself or an authorized extension:\n\n```clarity proposal-voting.clar\n(define-public (is-dao-or-extension)\n (ok (asserts! (or (is-eq tx-sender .core) (contract-call? .core is-extension contract-caller)) ERR_UNAUTHORIZED))\n)\n```\n\n## Proposals\n\nThe add-proposal function allows the core contract or an authorized extension to add a new proposal:\n\n```clarity proposal-voting.clar\n(define-public (add-proposal (proposal <proposal-trait>) (data {end-block-height: uint, proposer: principal, title: (string-ascii 50), description: (string-utf8 500)}))\n (begin\n (try! (is-dao-or-extension))\n (asserts! (is-none (contract-call? .core executed-at proposal)) ERR_PROPOSAL_ALREADY_EXECUTED)\n (print {event: \"propose\", proposal: proposal, proposer: tx-sender})\n (ok (asserts! (map-insert proposals (contract-of proposal) (merge {votes-for: u0, votes-against: u0, concluded: false, passed: false} data)) ERR_PROPOSAL_ALREADY_EXISTS))\n )\n)\n```\n\n## Votes\n\nThe vote function allows a token holder to vote on a proposal. It checks if the voter has at least 1 membership-token:\n\n```clarity proposal-voting.clar\n(define-public (vote (amount uint) (for bool) (proposal principal))\n (let\n (\n (proposal-data (unwrap! (map-get? proposals proposal) ERR_UNKNOWN_PROPOSAL))\n )\n (asserts! (>= (unwrap-panic (contract-call? .membership-token get-balance tx-sender)) u1) ERR_UNAUTHORIZED)\n (map-set member-total-votes {proposal: proposal, voter: tx-sender}\n (+ (get-current-total-votes proposal tx-sender) amount)\n )\n (map-set proposals proposal\n (if for\n (merge proposal-data {votes-for: (+ (get votes-for proposal-data) amount)})\n (merge proposal-data {votes-against: (+ (get votes-against proposal-data) amount)})\n )\n )\n (ok (print {event: \"vote\", proposal: proposal, voter: tx-sender, for: for, amount: amount}))\n )\n)\n\n(define-read-only (get-current-total-votes (proposal principal) (voter principal))\n (default-to u0 (map-get? member-total-votes {proposal: proposal, voter: voter}))\n)\n```\n\n## Conclusion\n\nThe `conclude` function allows the core contract or an authorized extension to conclude a proposal:\n\n```clarity proposal-voting.clar\n(define-public (conclude (proposal <proposal-trait>))\n (let\n (\n (proposal-data (unwrap! (map-get? proposals (contract-of proposal)) ERR_UNKNOWN_PROPOSAL))\n (passed (> (get votes-for proposal-data) (get votes-against proposal-data)))\n )\n (asserts! (not (get concluded proposal-data)) ERR_PROPOSAL_ALREADY_CONCLUDED)\n (asserts! (>= block-height (get end-block-height proposal-data)) ERR_END_BLOCK_HEIGHT_NOT_REACHED)\n (map-set proposals (contract-of proposal) (merge proposal-data {concluded: true, passed: passed}))\n (print {event: \"conclude\", proposal: proposal, passed: passed})\n (and passed (try! (contract-call? .core execute proposal tx-sender)))\n (ok passed)\n )\n)\n```\n\nThis function concludes a proposal. It first retrieves the proposal data and checks if the proposal has more votes for than against. It then asserts that the proposal has not already been concluded and that the current block height is greater than or equal to the end block height of the proposal. If these conditions are met, it sets the concluded and passed fields of the proposal data and prints an event. If the proposal passed, it also tries to execute the proposal. The function returns whether the proposal passed.\n\n## Extension callback\n\nThe callback function allows the core contract to request a callback:\n\n```clarity proposal-voting.clar\n(define-public (callback (sender principal) (memo (buff 34)))\n (ok true)\n)\n```\n\nCongratulations! You've successfully created the foundations for a decentralized grants program!\n\n## Challenges\n\nThe following challenges are additional features you can implement to continue building and sharpening your skills.\n\n<HackBadge variant=\"starter\" />\n\n**Initialize your grants program**: Now that you have your core extension contracts, you can initialize the project. The way you do this is through the `construct` function you wrote inside your `core.clar` contract. Create your first proposal enabling your extensions (`membership-token`, `proposal-submission`, `proposal-voting`) and distribute the initial token allocation to addresses responsible for voting on grants. If you need a little more guidance, check out the example [here](https://github.com/MarvinJanssen/executor-dao/blob/main/contracts/proposals/edp000-bootstrap.clar).\n\n<HackBadge variant=\"starter\" />\n\n**Create grant proposals**: After initializing your grants program, the next step is to create grant proposals. This involves using the `propose` function in the `proposal-submission` contract. This function allows anyone to propose a grant, which will then be voted on by the token holders. The proposal includes details such as the title, description, and the proposal contract. Once a proposal is submitted, it can be voted on during the voting period defined by the `proposal-duration` parameter.\n\n<HackBadge variant=\"intermediate\" />\n\n**Implement milestone-based funding**: To implement milestone-based funding, you'll need to create a new extension contract that tracks the progress of each grant proposal. This extension will manage the milestones for each grant, allowing funds to be released as each milestone is achieved. To enable this extension, you'll need to create a proposal using the propose function in the `proposal-submission` contract. Once enabled, the milestone-based funding extension will provide a more structured and accountable way to distribute funds, ensuring that the grant recipients are making progress before they receive their next round of funding.\n\n<HackBadge variant=\"advanced\" />\n\n**UI integration**: Using the provided starter template, integrate your contracts using Stacks.js. This will allow users to submit proposals, vote on them, and view the status of their proposals directly from the UI.\n\n```tsx\nimport { callReadOnlyFunction, standardPrincipalCV } from \"@stacks/transactions\"\n\nconst senderAddress = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\nconst contractAddress = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\nconst contractName = \"core\"\nconst functionName = \"is-extension\"\nconst extensionAddress =\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.membership-token\"\n\nconst functionArgs = [standardPrincipalCV(extensionAddress)]\n\nawait callReadOnlyFunction({\n network,\n contractAddress,\n contractName,\n functionName,\n functionArgs,\n senderAddress\n})\n```\n"],[71,"\nimport { HackBadge } from \"@/components/badge\";\n\n<Callout title=\"Inactive\" type=\"warn\">\nThis hack has been archived. Feel free to continue to use the code in this guide as a reference for your own projects.\n</Callout>\n\n## Introduction\n\nWhat if we could gamify—and reward—being a friend? That's the idea behind Friend.tech, the decentralized social network that took Web3 by storm. In this hack, you'll recreate Friend.tech on the Stacks blockchain.\n\nThere are a few key components to this hack: namely, **subjects** that have **keys** that anyone can buy. These keys start off low in price, but as people buy more keys, the price goes up faster and faster, rewarding friends who bought keys early. Key owners can sell their keys for a profit, or they can hold on to them to signal their friendship and build reputation. These keys can also be used to access exclusive chatrooms with their corresponding subject, receive exclusive airdrops, and more\n\nThis Hack walks you through the basics of building a Friend.tech clone. There are also challenges at the end, which are opportunities to stretch your skills and keep learning.\n\n## Clone the starter template\n\nStart by setting up your development environment. We've prepared a repository that includes an initialized Clarinet project and a React frontend with some boilerplate code and all the required packages.\n\nTo clone the repository, open your terminal and run the following command:\n\n```terminal\n$ git clone https://github.com/hirosystems/hiro-hacks-template.git\n$ cd hiro-hacks-template\n```\n\n## Create your contract\n\nBefore you begin, we're assuming that you have `clarinet` installed and a basic understanding of how to use it. If you haven't installed `clarinet` yet, you can do so by referring to our [installation guide](/stacks/clarinet/installation).\n\nTo create your contract, navigate to your project's directory and run the following command:\n\n```terminal\n$ clarinet contract new keys\n```\n\nThis will create a new contract in the `contracts` directory called `keys.clar`.\n\n<Callout type=\"info\">\n If you don't want to clone the provided starter template, you can create your\n `Clarinet` project manually by running `clarinet new friendtech && cd\n friendtech`.\n</Callout>\n\n## Defining `key` balances and supply\n\nInside your `keys.clar` contract, you need to keep track of the balance of `keys` for each user (or _holder_) and the total supply of `keys` for each subject. You can do this using Clarity's `define-map` function:\n\n```clarity keys.clar\n(define-map keysBalance { subject: principal, holder: principal } uint)\n(define-map keysSupply { subject: principal } uint)\n```\n\nThe `keysBalance` stores each holder's `key` balance for a given subject and the `keysSupply` stores the total supply for each subject. These maps will be used in your contract's functions to manage the creation, buying, and selling of `keys`.\n\n## Calculating `key` prices\n\nThe next thing you need to do is define a function that calculates the price of `keys` for a given a `supply` and `amount`. You can do this by defining a `get-price` function:\n\n```clarity keys.clar\n(define-read-only (get-price (supply uint) (amount uint))\n (let (\n (base-price u10) ;; Base price per key in micro-STX\n (price-change-factor u100) ;; Factor to control the rate of price change\n )\n ;; Average price per token over the range of supply\n (/\n (+\n (* base-price amount)\n (* amount (/ (+ (* supply supply) (* supply amount) (* amount amount)) (* u3 price-change-factor)))\n )\n amount\n )\n))\n```\n\nThe `get-price` function calculates the price of `keys` using a formula that calculates the average price per token over the range of supply affected. This can be done by integrating the price function over the range of supply and dividing by the amount.\n\n## Creating, buying, and selling `keys`\n\nThese functions form the core of the contract's operations, enabling users to manage keys through buying and selling.\n\nLet's first take a look at the `buy-keys` function:\n\n```clarity keys.clar\n(define-public (buy-keys (subject principal) (amount uint))\n (let\n (\n (supply (default-to u0 (map-get? keysSupply { subject: subject })))\n (price (get-price supply amount))\n )\n (if (or (> supply u0) (is-eq tx-sender subject))\n (begin\n (match (stx-transfer? price tx-sender (as-contract tx-sender))\n success\n (begin\n (map-set keysBalance { subject: subject, holder: tx-sender }\n (+ (default-to u0 (map-get? keysBalance { subject: subject, holder: tx-sender })) amount)\n )\n (map-set keysSupply { subject: subject } (+ supply amount))\n (ok true)\n )\n error\n (err u2)\n )\n )\n (err u1)\n )\n )\n)\n```\n\nThis function allows subjects to create their first `keys`, initiating their supply in the contract. The transaction only succeeds if the _subject_ is creating the initial `keys` or if there are already `keys` in circulation, ie `principal-a` cannot buy the initial `keys` for `principal-b`.\n\nNext up, the `sell-keys` function:\n\n```clarity keys.clar\n(define-public (sell-keys (subject principal) (amount uint))\n (let\n (\n (balance (default-to u0 (map-get? keysBalance { subject: subject, holder: tx-sender })))\n (supply (default-to u0 (map-get? keysSupply { subject: subject })))\n (price (get-price (- supply amount) amount))\n (recipient tx-sender)\n )\n (if (and (>= balance amount) (or (> supply u0) (is-eq tx-sender subject)))\n (begin\n (match (as-contract (stx-transfer? price tx-sender recipient))\n success\n (begin\n (map-set keysBalance { subject: subject, holder: tx-sender } (- balance amount))\n (map-set keysSupply { subject: subject } (- supply amount))\n (ok true)\n )\n error\n (err u2)\n )\n )\n (err u1)\n )\n )\n)\n```\n\nThis is more or less the same logic as the `buy-keys` function, but instead you deduct the `keysBalance` and `keysSupply` and check if the seller owns enough keys and if they are authorized to sell.\n\n## Verifying keyholders\n\nNow that you have the ability to buy and sell `keys`, you need a way to verify if a user is a keyholder. You can do this by defining an `is-keyholder` read-only function:\n\n```clarity keys.clar\n(define-read-only (is-keyholder (subject principal) (holder principal))\n (>= (default-to u0 (map-get? keysBalance { subject: subject, holder: holder })) u1)\n)\n```\n\nThis function checks if the `keysBalance` for a given `subject` and `holder` is greater than or equal to 1. If it is, then the user `is-keyholder`.\n\n## Testing locally\n\nMake sure your contract is valid and doesn't have any errors. To do this, run the following command:\n\n```terminal\n$ clarinet check\n```\n\nNext, check some of your contract functionality inside `clarinet console`:\n\n```clarity keys.clar\n;; Get the price of 100 keys when the supply is 0\n(contract-call? .keys get-price u0 u100) ;; u10010\n\n;; Initial purchase of keys\n(contract-call? .keys buy-keys tx-sender u100)\n\n;; Check if the sender is a keyholder\n(contract-call? .keys is-keyholder tx-sender tx-sender) ;; true\n\n(contract-call? .keys is-keyholder tx-sender 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5) ;; false\n```\n\nCongratulations! You've successfully created your contract. You've laid the groundwork for a decentralized social network, just like Friend.tech.\n\n## Challenges\n\nThe following challenges are additional features you can implement to keep learning and building on Stacks.\n\n<HackBadge variant=\"starter\" />\n\n**Balance and supply query functions**: Add two new read-only functions: `get-keys-balance` and `get-keys-supply`. These functions will provide valuable information to users about the distribution and availability of `keys`, and can be used in various parts of your application to display this information to users.\n\n```clarity keys.clar\n(define-read-only (get-keys-balance (subject principal) (holder principal))\n ;; Return the keysBalance for the given subject and holder\n)\n\n(define-read-only (get-keys-supply (subject principal))\n ;; Return the keysSupply for the given subject\n)\n```\n\n<HackBadge variant=\"starter\" />\n\n**Price query functions**: Add two new read-only functions: `get-buy-price` and `get-sell-price`. These helper functions will allow users to query the current price for buying or selling a specific amount of `keys` for a given `subject`.\n\n```clarity keys.clar\n(define-read-only (get-buy-price (subject principal) (amount uint))\n ;; Implement buy price logic\n)\n\n(define-read-only (get-sell-price (subject principal) (amount uint))\n ;; Implement sell price logic\n)\n```\n\n<HackBadge variant=\"intermediate\" />\n\n**Fee management**: When a user buys or sells `keys`, you might want to introduce a fee, either at the protocol or subject level that can be distributed accordingly. Add a `protocolFeePercent` and/or `subjectFeePercent` variable, as well as a destination Stacks principal `protocolFeeDestination` for this new revenue. Now make sure to update the `buy-keys` and `sell-keys` functions to incorporate these fees and `stx-transfer?` into the buying and selling logic.\n\n```clarity keys.clar\n;; Change the fee values as you wish\n(define-data-var protocolFeePercent uint u200) ;; or subjectFeePercent\n(define-data-var protocolFeeDestination principal tx-sender)\n```\n\n<HackBadge variant=\"intermediate\" />\n\n**Access control**: In a real-world application, you might need to adjust the `protocolFeePercent`, `subjectFeePercent`, or `protocolFeeDestination` values over time. However, you wouldn't want just anyone to be able to make these changes. This is where access control comes in. Specifically, you should add a set-fee function (or functions) that allows only a designated `contractOwner` to change the `protocolFeePercent`, `subjectFeePercent`, or `protocolFeeDestination` values.\n\n```clarity keys.clar\n(define-public (set-protocol-fee-percent (feePercent uint))\n ;; Check if the caller is the contractOwner\n ;; Update the protocolFeePercent value\n)\n```\n\nThink about how you can verify whether the caller of the function is indeed the `contractOwner`. Also, consider what kind of feedback the function should give when someone else tries to call it. Test your implementation to ensure it works as expected.\n\n<HackBadge variant=\"intermediate\" />\n\n**UI integration**: Using the provided [starter template](#clone-the-starter-template), integrate your contract using [Stacks.js](/stacks/stacks.js). For example, if you were calling the `is-keyholder` function, your code might look something like this:\n\n```tsx\nimport { callReadOnlyFunction, standardPrincipalCV } from \"@stacks/transactions\"\n\nconst senderAddress = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\nconst contractAddress = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\nconst contractName = \"keys\"\nconst functionName = \"is-keyholder\"\n\nconst functionArgs = [standardPrincipalCV(senderAddress)]\n\nawait callReadOnlyFunction({\n network,\n contractAddress,\n contractName,\n functionName,\n functionArgs,\n senderAddress\n})\n```\n\nBy using a similar pattern to the code above, you will be able to **show/hide chatrooms based on keyholdings**, **create an exchange for buying/selling keys**, or **add a search for displaying subject keyholdings**.\n\n> _**Note**_\n>\n> If you are planning to experiment with your contract on `devnet`, make sure to run `clarinet devnet start` [to deploy and test your contract locally](/stacks/clarinet/guides/run-a-local-devnet). You can then use the `devnet` network when calling your contract in the [Leather wallet](https://leather.io/install-extension).\n\n<HackBadge variant=\"advanced\" />\n\n**Message signature**: To further enhance the security and authenticity of your app, try to implemement a _login_ feature using [message signing](/stacks/connect/guides/sign-messages).\n\n```tsx\nimport { openSignatureRequestPopup } from \"@stacks/connect\"\nimport { verifyMessageSignatureRsv } from \"@stacks/encryption\"\nimport { StacksMocknet } from \"@stacks/network\"\nimport { getAddressFromPublicKey } from \"@stacks/transactions\"\n\nconst message = \"Log in to chatroom\"\nconst network = new StacksMocknet()\n\nopenSignatureRequestPopup({\n message,\n network,\n onFinish: async ({ publicKey, signature }) => {\n const verified = verifyMessageSignatureRsv({\n message,\n publicKey,\n signature\n })\n if (verified) {\n // The signature is verified, so now we can check if the user is a keyholder\n const address = getAddressFromPublicKey(publicKey, network.version)\n const isKeyHolder = await checkIsKeyHolder(address)\n if (isKeyHolder) {\n // The user is a keyholder, so they are authorized to access the chatroom\n }\n }\n }\n})\n```\n\nThe signed message will serve as a _proof of identity_ - similar to a login, verifying that the user is indeed who they claim to be. This can be particularly useful in a chatroom setting, where only `is-keyholder` users are allowed to send messages.\n"],[259,"\nimport { ImageZoom } from 'fumadocs-ui/components/image-zoom';\n\n<ImageZoom\n width=\"750\"\n height=\"450\"\n alt=\"stacks-api-architecture\"\n src='/images/api/architecture.svg'\n className=\"mt-0 mb-6 first-line:rounded-xl bg-background\"\n priority\n/>\n\n## RPC Endpoints\n\nThe `stacks-node` has its own minimal set of http endpoints referred to as `RPC endpoints`.\n\n- The `stacks-blockchain-api` allows clients to access RPC endpoints by proxying requests to a load-balanced pool of `stacks-nodes`.\n- For more details on RPC endpoints, see: [RPC Endpoints Documentation](https://github.com/blockstack/stacks-blockchain/blob/master/docs/rpc-endpoints.md)\n- Common RPC endpoints include:\n - `POST /v2/transactions` - Broadcast a transaction\n - `GET /v2/pox` - Retrieve current Proof of Transfer (PoX) relevant information\n - `POST /v2/contracts/call-read/<contract>/<function>` - Evaluate and return the result of calling a Clarity function\n - `POST /v2/fees/transaction` - Evaluate a given transaction and provide transaction fee estimation data\n - `GET /v2/accounts/<address>` - Fetch the current nonce required for creating transactions\n\n## Additional Endpoints\n\nThe Stacks Blockchain API implements additional endpoints that provide data unavailable directly from Stacks nodes due to various constraints.\n\n- The `stacks-node` may not persist certain data or may not serve it efficiently to many clients. For instance, while it can return the current STX balance of an account, it cannot provide a history of account transactions.\n- The API implements the Rosetta specification by Coinbase, an open standard designed to simplify blockchain deployment and interaction. More information can be found at [Rosetta API](https://www.rosetta-api.org/).\n- The API includes support for the Blockchain Naming System (BNS) endpoints. Details are available at [BNS Documentation](https://docs.stacks.co/clarity/example-contracts/bns).\n- For Express.js routes, see the directory `/src/api/routes`.\n\nThe API creates an \"event observer\" http server which listens for events from a stacks-node \"event emitter\".\n\nEvents are HTTP POST requests containing:\n - Blocks\n - Transactions\n\nByproducts of executed transactions such as:\n - Asset transfers\n - Smart-contract log data\n - Execution cost data\n\nThe API processes and stores these events as relational data in PostgreSQL. For the \"event observer\" code, see `/src/event-stream`.\n\n## OpenAPI and JSON Schema\n\nAll http endpoints and responses are defined in OpenAPI and JSON Schema.\n\n- See `/docs/openapi.yaml`\n- These are used to auto-generate the docs at https://hirosystems.github.io/stacks-blockchain-api/\n- JSON Schemas are converted into TypeScript interfaces, which are used internally by the db controller module to transform SQL query results into the correct object shapes.\n- OpenAPI and JSON Schemas are also used to generate a standalone `@stacks/blockchain-api-client`.\n\n## Development Setup\n\nThe easiest/quickest way to develop in this repo is using the VS Code debugger. It uses docker-compose to set up a stacks-node and Postgres instance.\n\nAlternatively, you can run `npm run dev:integrated` which does the same thing but without a debugger.\n"],[515,"\nimport { InlineCode } from '@/components/inline-code';\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nSyncing a Bitcoin node is often one of the first steps a developer takes when building a Bitcoin application. It's a great introduction to the Bitcoin developer ecosystem, and if you're relying on on-chain data, there's no safer way to get that data than doing it yourself.\n\nIn this guide, you will learn how to:\n\n1. Download Bitcoin Core daemon on your machine\n2. Configure `bitcoind`\n3. Start syncing your node\n4. Properly shutdown and restart your node\n\n<Callout title=\"Requirements\" type=\"warn\">\nTo get started, we first need to download `bitcoind`. In our example, we'll be using version 25.0. You can select a software version compatible with your device [from this list](https://bitcoincore.org/bin/bitcoin-core-25.0). \n</Callout>\n\n---\n\n## Configure <InlineCode>bitcoind</InlineCode>\n\nOnce your download is complete, make note of your path to the `bitcoind` executable.\n\n<Callout title=\"Note\">\nWhen you sync your node, we'll be running the program at `/bitcoin-25.0/bin/bitcoin`, which is where the `bitcoind` executable is located.\n</Callout>\n\nNext up is a couple configuration steps.\n\n1. Select or create a directory to store your Bitcoin data.\n2. Update the `bitcoin.conf` file to include the path to your Bitcoin data directory.\n\nThe Bitcoin chainstate is pretty large, and you need a place to store it. In this example, we are going to set up a directory called `bitcoin-data` on an external hard drive that we have mounted at `/Volumes/SSD`.\n\n<Callout title=\"Note\">\n This folder, `bitcoin-data`, can be named whatever you like, and can exist locally or in an external hard drive.\n \n The most important thing is that it should exist in a place that has enough storage to hold all the Bitcoin data we will be receiving once it starts to sync.\n</Callout>\n\nNow navigate to your `bitcoin.conf` file, which is located in your `/path/to/bitcoin` directory and update the `datadir` field with your directory. \n\nIn this example, it would look like this:\n\n```bash bitcoin.conf\ndatadir=/Volumes/SSD/bitcoin-data/\n```\n\n<Accordions>\n<Accordion title=\"Example bitcoin.conf\">\nYou can override the default configuration with the following, including the path to where you will be storing all of the Bitcoin data once it starts syncing:\n\n```bash\ndatadir=/your-path-to/bitcoin-data/\nserver=1\nrpcuser=devnet\nrpcpassword=devnet\nrpcport=8332\nrpcallowip=0.0.0.0/0\nrpcallowip=::/0\ntxindex=1\nlisten=1\ndiscover=0\ndns=0\ndnsseed=0\nlistenonion=0\nrpcserialversion=1\ndisablewallet=0\nfallbackfee=0.00001\nrpcthreads=8\nblocksonly=1\ndbcache=4096\n\n# Start zeromq\nzmqpubhashblock=tcp://0.0.0.0:18543\n```\n</Accordion>\n</Accordions>\n\nIf you plan to use your node to receive transactions, you will need to make note of the `username` and `password` fields for your node.\n\n<Callout title=\"Note\">\nIn the example `bitcoin.conf` above, `devnet` is listed as the default `username` and `password`.\n</Callout>\n\n## Run the node\n\nWith a finished `bitcoin.conf` file, it's time to start up your node.\n\nThis takes the form of `path/to/bitcoind -conf=path/to/bitcoin.conf`, which in this example looks like:\n\n```terminal\n$ /Volumes/SSD/bitcoin-25.0/bin/bitcoind -conf=/Volumes/SSD/bitcoin-25.0/bitcoin.conf\n```\n\nAfter running this command, you will see `zmq_url` entries in your console's stdout, displaying ZeroMQ logs from your Bitcoin node. Congrats! You're now syncing!\n\n<Callout title=\"Note\">\nIt might take anywhere from a few hours to a few days to run and fully sync, depending on if it's your first time syncing a node.\n</Callout>\n\n## Proper shutdown and restart procedure\n\n1. Shutting down your node\n2. Restarting your node\n\nTo shut down your node safely, use the `bitcoin-cli` executable, located inside of the `bin` directory, and run the `stop` command:\n\n```terminal\n$ /path/to/bitcoin-cli \\\n --conf=/path/to/bitcoin.conf \\\n --rpcuser={{your-rpc-username}} \\\n --rpcpassword={{your-rpc-password}} stop\n```\n\nTo start your node back up, all you need to do is refer to the previous steps from above by running `path/to/bitcoind -conf=path/to/bitcoin.conf`.\n\n<Callout title=\"How to eject an external hard drive\">\n <Tabs items={[\"macOS\",\"Windows\"]}>\n <Tab value={\"macOS\"}>\n 1. Go to the Finder, then the sidebar, and select the disk you want to eject under “Devices”. Click on the eject icon next to the name.\n 2. Wait for a confirmation message saying it's safe to eject the device before you unplug the drive.\n </Tab>\n\n <Tab value={\"Windows\"}>\n 1. Open File Explorer, select the drive from the list under “This PC” (PC > Devices and Drives), and click the “Eject” button.\n 2. Wait for a confirmation message saying it's safe to eject the device before you unplug the drive.\n </Tab>\n </Tabs>\n</Callout>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/chainhook-as-a-service\"\n title=\"Run Chainhook as a service\"\n description=\"Learn how to use Chainhook to build your own custom API.\"\n />\n <Card\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Learn how to sync a Stacks node for running a local devnet.\"\n />\n</Cards>\n"],[372,"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\nStacks scopes are parameters you use to define the `if this` specification logic of your Chainhook on the Stacks blockchain. In other words, scopes specify what on-chain events you are looking to monitor and track. For more information on Chainhook design, please view [predicate design](/stacks/chainhook/concepts/predicate-design).\n\n<Root>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`txid`</h2>\n\nThe `txid` scope allows you to query transactions based on their transaction ID. This is particularly useful for tracking specific transactions or auditing transaction histories.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"equals\"} type={\"string\"}>\n\nThe `equals` property is a 32 bytes hex encoded type used to specify the exact transaction ID to match.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By transaction ID</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"txid\",\n \"equals\": \"0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`block_height`</h2>\n\nThe `block_height` scope allows you to query blocks based on their height. This is useful for identifying specific blocks or ranges of blocks in the blockchain.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"equals\"} type={\"integer\"}>\n\nThe `equals` property specifies the exact height of the block to match.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"higher_than\"} type={\"integer\"}>\n\nThe `higher_than` property specifies that the block height should be greater than the provided value.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"lower_than\"} type={\"integer\"}>\n\nThe `lower_than` property specifies that the block height should be less than the provided value.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"between\"} type={\"array of integers\"}>\n\nThe `between` property specifies a range of block heights to match, inclusive of the provided start and end values.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By block height</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"higher_than\" className='tab group'>\n <Badge className='badge transition-colors'>Using higher_than</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"lower_than\" className='tab group'>\n <Badge className='badge transition-colors'>Using lower_than</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"between\" className='tab group'>\n <Badge className='badge transition-colors'>Between two block heights</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"block_height\",\n \"equals\": 141200\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"higher_than\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"block_height\",\n \"higher_than\": 10000\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"lower_than\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"block_height\",\n \"lower_than\": 10000\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"between\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"block_height\",\n \"between\": [0, 10000]\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`ft_transfer`</h2>\n\nThe `ft_transfer` scope allows you to query transactions based on fungible token transfers. This is useful for tracking specific token movements or auditing token transfer histories.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"asset_identifier\"} type={\"string\"}>\n\nThe `asset_identifier` property specifies the fully qualified asset identifier to observe.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"actions\"} type={\"string[]\"}>\n\nThe `actions` property specifies the types of token actions to observe, such as `mint`, `transfer`, or `burn`.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By a single action</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"all\" className='tab group'>\n <Badge className='badge transition-colors0'>Passing all ft actions</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"ft_transfer\",\n \"asset_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.cbtc-token::cbtc\",\n \"actions\": [\"transfer\"]\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"all\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"ft_transfer\",\n \"asset_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.cbtc-token::cbtc\",\n \"actions\": [\"mint\", \"transfer\", \"burn\"]\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`nft_transfer`</h2>\n\nThe `nft_transfer` scope allows you to query transactions based on non-fungible token transfers. This is useful for tracking specific NFT movements or auditing NFT transfer histories.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"asset_identifier\"} type={\"string\"}>\n\nThe `asset_identifier` property specifies the fully qualified asset identifier to observe.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"actions\"} type={\"array of strings\"}>\n\nThe `actions` property specifies the types of NFT actions to observe, such as `mint`, `transfer`, or `burn`.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By non-fungible token mint</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"all\" className='tab group'>\n <Badge className='badge transition-colors'>Passing all nft actions</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"nft_transfer\",\n \"asset_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09::monkeys\",\n \"actions\": [\"mint\"]\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"all\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"nft_transfer\",\n \"asset_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09::monkeys\",\n \"actions\": [\"mint\", \"transfer\", \"burn\"]\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`stx_transfer`</h2>\n\nThe `stx_transfer` scope allows you to query transactions involving STX token movements. This is crucial for monitoring STX transfers, including minting, burning, and locking actions.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"actions\"} type={\"array of strings\"}>\n\nThe `actions` property specifies the types of STX token actions to observe, such as `mint`, `transfer`, `burn`, and `lock`.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By STX token transfer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"all\" className='tab group'>\n <Badge className='badge transition-colors'>Passing all actions</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"stx_transfer\",\n \"actions\": [\"transfer\"]\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"all\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"stx_transfer\",\n \"actions\": [\"mint\", \"transfer\", \"burn\", \"lock\"]\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`print_event`</h2>\n\nThe `print_event` scope allows you to query transactions based on specific print events emitted during contract execution. This is useful for monitoring specific events for auditing or tracking purposes.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"contract_identifier\"} type={\"string\"}>\n\nThe `contract_identifier` property specifies the fully qualified contract identifier to observe.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"contains\"} type={\"string\"}>\n\nThe `contains` property is used for matching an event containing the specified string.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"matches_regex\"} type={\"string\"}>\n\nThe `matches_regex` property is used for matching an event that regex matches with the specified string.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Using contains</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"matches_regex\" className='tab group'>\n <Badge className='badge transition-colors'>Using matches_regex</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09\",\n \"contains\": \"monkey\"\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"matches_regex\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09\",\n \"matches_regex\": \"(?:^|\\\\W)monkey(?:$|\\\\W)\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`contract_call`</h2>\n\nThe `contract_call` scope allows you to query transactions that involve direct calls to specific methods within a smart contract. This is particularly useful for tracking interactions with critical contract functions.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"contract_identifier\"} type={\"string\"}>\n\nThe `contract_identifier` property specifies the fully qualified contract identifier to observe.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"method\"} type={\"string\"}>\n\nThe `method` property specifies the specific method within the contract to observe.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Scoping by contract method call</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"SP000000000000000000002Q6VF78.pox\",\n \"method\": \"stack-stx\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`contract_deployment`</h2>\n\nThe `contract_deployment` scope allows you to query transactions involving the deployment of smart contracts. This is crucial for monitoring new contract deployments and ensuring compliance with expected deployments.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"deployer\"} type={\"string\"}>\n\nThe `deployer` property specifies the STX address of the deployer to observe.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"implement_trait\"} type={\"string\"}>\n\nThe `implement_trait` property specifies the contract trait to observe.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By deployer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"trait\" className='tab group'>\n <Badge className='badge transition-colors'>By contract trait</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"contract_deployment\",\n \"deployer\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"trait\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"contract_deployment\",\n \"implement_trait\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sip09-protocol\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n</Root>\n"],[67,"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\n<Root>\n\n<API className='api my-3'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`getAccountAssets`</h2>\n\nThis API endpoint retrieves a comprehensive list of asset events associated with a specific account or Contract Identifier, including asset transfers and mints. It is essential for tracking asset movements and changes in ownership within the Stacks blockchain.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"principal\"} type={\"string\"}>\nThe account address or contract identifier whose asset events are to be retrieved.\n</Property>\n\n<Property required={false} deprecated={false} name={\"initOverrides\"} type={\"RequestInit\"}>\nOptional overrides for the request initialization settings.\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"get-assets\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"get-assets\" className='tab group'>\n <Badge className='badge transition-colors'>Retrieve Account Assets</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"get-assets\">\n ```tsx\n import { Configuration, AccountsApi } from '@stacks/blockchain-api-client';\n \n const apiConfig = new Configuration({\n basePath: 'https://api.testnet.hiro.so',\n });\n\n const accountsApi = new AccountsApi(apiConfig);\n const principal = 'ST000000000000000000002AMW42H';\n // Retrieve all asset events for the specified account or contract identifier\n const assets = await accountsApi.getAccountAssets({\n principal: principal,\n });\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n \n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='api my-3'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`UserSession`</h2>\n\nThe Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a UserSession to manage user data.\n\n## Functions\n\n<Property required={false} deprecated={false} name={\"isSignInPending\"} type={\"function\"}>\n\nDetermines if there is an incoming authentication response.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"handlePendingSignIn\"} type={\"function\"}>\n\nProcesses the response and provides a `userData` object containing the user's identity, BNS username and profile information.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"isUserSignedIn\"} type={\"function\"}>\n\nChecks if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"loadUserData\"} type={\"function\"}>\n\nRetrieves the user's profile data if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"encryptContent\"} type={\"function\"}>\n\nEncrypts user data for secure storage.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"decryptContent\"} type={\"function\"}>\n\nDecrypts user data for secure storage.\n\n</Property>\n\n</div>\n\n<APIExample>\n<Tabs defaultValue=\"pending\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"pending\" className='tab group'>\n <Badge className='badge transition-colors'>Handle incoming authentication response</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"status\" className='tab group'>\n <Badge className='badge transition-colors'>Check if a user is signed in</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"user-data\" className='tab group'>\n <Badge className='badge transition-colors'>Load data for signed in user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"sign-out\" className='tab group'>\n <Badge className='badge transition-colors'>Signing out a user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"encrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Encrypting user data</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"decrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Decrypting user data</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"pending\">\n ```tsx\n const isPending = userSession.isSignInPending();\n\n if (isPending) {\n userSession.handlePendingSignIn().then(userData => {\n // Do something with userData\n });\n }\n ```\n </TabsContent>\n <TabsContent value='status'>\n ```tsx\n const isSignedIn = userSession.isUserSignedIn();\n ```\n </TabsContent>\n <TabsContent value='user-data'>\n ```tsx\n const isSignedIn = userSession.isUserSignedIn();\n\n if (isSignedIn) {\n // Do something with the signed in user\n const userData = userSession.loadUserData();\n }\n ```\n </TabsContent>\n <TabsContent value='sign-out'>\n ```tsx\n function logout() {\n userSession.signUserOut();\n }\n ```\n </TabsContent>\n <TabsContent value='encrypt'>\n ```tsx\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n ```\n </TabsContent>\n <TabsContent value='decrypt'>\n ```tsx\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n const plainText = await userSession.decryptContent(cipherText);\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n\n<Accordion title={\"Notes\"}>\n Note that encryption here uses the user's private key associated with your app only. If you need to share this data with another app or other users, you should use the equivalent methods from `@stacks/encryption` and provide a custom private key.\n</Accordion>\n\n</Accordions>\n\n</APIExample>\n\n</API>\n\n</Root>"],[234,"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\n## Installation\n\n```package-install\n@stacks/transactions\n```\n\nThis library supports the creation of the following Stacks transaction types:\n\n1. STX token transfer\n2. Smart contract deploy\n3. Smart contract function call\n\n## Key Generation\n\n```typescript -n\nimport { randomPrivateKey, privateKeyToPublicKey } from '@stacks/transactions';\n\n// Random key\nconst privateKey = randomPrivateKey();\nconst publicKey = privateKeyToPublicKey(privateKey);\n\n// Private key from hex string\nconst privateKey = 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01';\n```\n\n## STX Token Transfer Transaction\n\nUse the [`makeSTXTokenTransfer`](https://stacks.js.org/functions/_stacks_transactions.makeSTXTokenTransfer) (with a sender private key), or the \"unsigned\" version [`makeUnsignedSTXTokenTransfer`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedSTXTokenTransfer) (with a sender public key, without yet signing) to create a STX token transfer transaction.\n\n```ts -n\nimport { makeSTXTokenTransfer, broadcastTransaction } from '@stacks/transactions';\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n memo: 'test memo',\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n\n// to see the raw serialized tx\nconst serializedTx = transaction.serialize(); // hex string\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Smart Contract Deploy Transaction\n\nUse the [`makeContractDeploy`](https://stacks.js.org/functions/_stacks_transactions.makeContractDeploy), or the \"unsigned\" version [`makeUnsignedContractDeploy`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedContractDeploy) to create a smart contract deploy transaction.\n\n```ts -n\nimport { makeContractDeploy, broadcastTransaction } from '@stacks/transactions';\nimport { readFileSync } from 'fs';\n\nconst clarityCode = readFileSync('/path/to/contract.clar').toString();\n\nconst txOptions = {\n contractName: 'contract_name',\n codeBody: clarityCode,\n clarityVersion: 3, // optional, defaults to latest deployed version\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeContractDeploy(txOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Smart Contract Function Call (On-chain)\n\nIf you want to call a readonly function, use [`fetchCallReadOnlyFunction`](https://stacks.js.org/functions/_stacks_transactions.fetchCallReadOnlyFunction) instead.\n\nUse the [`makeContractCall`](https://stacks.js.org/functions/_stacks_transactions.makeContractCall) or the \"unsigned\" version [`makeUnsignedContractCall`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedContractCall) to create a smart contract function call transaction.\n\n```ts -n\nimport { makeContractCall, broadcastTransaction, Cl, Pc } from '@stacks/transactions';\n\n// Add an optional post condition\nconst condition01 = Pc.principal('SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE')\n .willSendGte(1000000n)\n .ustx();\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [Cl.bufferFromUtf8('foo string')],\n postConditions: [condition01],\n\n validateWithAbi: true, // check if the arguments given are compatible with the function\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeContractCall(txOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\nIn this example we construct a `contract-call` transaction with a post condition. We have set the `validateWithAbi` option to `true`, so the `makeContractCall` builder will attempt to fetch this contracts ABI from the specified Stacks network, and validate that the provided functionArgs match what is described in the ABI. This should help you avoid constructing invalid contract-call transactions. If you would prefer to provide your own ABI instead of fetching it from the network, the `validateWithAbi` option also accepts [ClarityABI](https://stacks.js.org/interfaces/_stacks_transactions.ClarityAbi) objects.\n\n## Sponsoring Transactions\n\nTo generate a sponsored transaction, first create and sign the transaction as the origin. The `sponsored` property in the options object must be set to true.\n\n```ts -n\nimport { makeContractCall, Cl } from '@stacks/transactions';\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [Cl.bufferFromUtf8('foo string')],\n validateWithAbi: true,\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n sponsored: true,\n};\n\nconst transaction = await makeContractCall(txOptions);\nconst serializedTx = transaction.serialize();\n\n// can't broadcast sponsored transactions before they are sponsored\n```\n\nThe serialized transaction can now be passed to the sponsoring party which will sign the sponsor portion of the transaction and set the fee.\n\n```ts -n\nimport { sponsorTransaction, broadcastTransaction } from '@stacks/transactions';\n\nconst deserializedTx = deserializeTransaction(serializedTx);\nconst sponsorKey = '770287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01';\nconst fee = 1000n;\n\nconst sponsorOptions = {\n transaction: deserializedTx,\n sponsorPrivateKey: sponsorKey,\n sponsorNonce: 0,\n fee,\n};\n\nconst sponsoredTx = await sponsorTransaction(sponsorOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction: sponsoredTx, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Supporting multi-signature transactions\n\nTo generate a multi-sig transaction, first create an unsigned transaction.\nThe `numSignatures` and `publicKeys` properties in the options object must be set:\n\n```ts -n\nimport {\n makeUnsignedSTXTokenTransfer,\n createStacksPrivateKey,\n deserializeTransaction,\n pubKeyfromPrivKey,\n publicKeyToString,\n TransactionSigner,\n standardPrincipalCV,\n BytesReader,\n AnchorMode,\n} from '@stacks/transactions';\n\nconst recipient = standardPrincipalCV('SP3FGQ8...');\nconst amount = 2500000n;\nconst fee = 0n;\nconst memo = 'test memo';\n\n// private keys of the participants in the transaction\nconst privKeyStrings = ['6d430bb9...', '2a584d89...', 'd5200dee...'];\n\n// create private key objects from string array\nconst privKeys = privKeyStrings.map(createStacksPrivateKey);\n\n// corresponding public keys\nconst pubKeys = privKeyStrings.map(pubKeyfromPrivKey);\n\n// create public key string array from objects\nconst pubKeyStrings = pubKeys.map(publicKeyToString);\n\nconst transaction = await makeUnsignedSTXTokenTransfer({\n recipient,\n amount,\n fee,\n memo,\n numSignatures: 2, // number of signature required\n publicKeys: pubKeyStrings, // public key string array with >= numSignatures elements\n anchorMode: AnchorMode.Any,\n});\n\nconst serializedTx = transaction.serialize();\n```\n\nThis transaction payload can be passed along to other participants to sign. In addition to\nmeeting the numSignatures requirement, the public keys of the parties who did not sign the\ntransaction must be appended to the signature.\n\n```ts -n\n// deserialize and sign transaction\nconst bytesReader = new BytesReader(serializedTx);\n// Partially signed or unsigned multi-sig tx can be deserialized to add the required signatures\nconst deserializedTx = deserializeTransaction(bytesReader);\n\nconst signer = new TransactionSigner(deserializedTx);\n\n// first signature\nsigner.signOrigin(privKeys[0]);\n\n// second signature\nsigner.signOrigin(privKeys[1]);\n\n// after meeting the numSignatures requirement, the public\n// keys of the participants who did not sign must be appended\nsigner.appendOrigin(pubKeys[2]);\n\n// the serialized multi-sig tx\nconst serializedSignedTx = deserializedTx.serialize();\n```\n\n## Calling Read-only Contract Functions\n\nRead-only contract functions can be called without generating or broadcasting a transaction. Instead it works via a direct API call to a Stacks node.\n\n```ts -n\nimport { bufferCVFromString, callReadOnlyFunction } from '@stacks/transactions';\nimport { StacksTestnet } from '@stacks/network';\n\nconst contractAddress = 'ST3KC0MTNW34S1ZXD36JYKFD3JJMWA01M55DSJ4JE';\nconst contractName = 'kv-store';\nconst functionName = 'get-value';\nconst buffer = bufferCVFromString('foo');\nconst network = new StacksTestnet();\nconst senderAddress = 'ST2F4BK4GZH6YFBNHYDDGN4T1RKBA7DA1BJZPJEJJ';\n\nconst options = {\n contractAddress,\n contractName,\n functionName,\n functionArgs: [buffer],\n network,\n senderAddress,\n};\n\nconst result = await callReadOnlyFunction(options);\n```\n\n## Constructing Clarity Values\n\nBuilding transactions that call functions in deployed clarity contracts requires you to construct valid Clarity Values to pass to the function as arguments. The [Clarity type system](https://github.com/stacksgov/sips/blob/master/sip/sip-002-smart-contract-language.md#clarity-type-system) contains the following types:\n\n- `(tuple (key-name-0 key-type-0) (key-name-1 key-type-1) ...)` : a typed tuple with named fields.\n- `(list max-len entry-type)` : a list of maximum length max-len, with entries of type entry-type\n- `(response ok-type err-type)` : object used by public functions to commit their changes or abort. May be returned or used by other functions as well, however, only public functions have the commit/abort behavior.\n- `(optional some-type)` : an option type for objects that can either be (some value) or none\n- `(buff max-len)` : byte buffer or maximum length max-len.\n- `principal` : object representing a principal (whether a contract principal or standard principal).\n- `bool` : boolean value (`true` or `false`)\n- `int` : signed 128-bit integer\n- `uint`: unsigned 128-bit integer\n\nThis library contains Typescript types and classes that map to the Clarity types, in order to make it easy to construct well-typed Clarity values in Javascript. These types all extend the abstract class `ClarityValue`.\n\n```ts -n\nimport {\n trueCV,\n falseCV,\n noneCV,\n someCV,\n intCV,\n uintCV,\n standardPrincipalCV,\n contractPrincipalCV,\n responseErrorCV,\n responseOkCV,\n listCV,\n tupleCV,\n bufferCV,\n} from '@stacks/transactions';\nimport { utf8ToBytes } from '@stacks/common';\n\n// construct boolean clarity values\nconst t = trueCV();\nconst f = falseCV();\n\n// construct optional clarity values\nconst nothing = noneCV();\nconst something = someCV(t);\n\n// construct a buffer clarity value from an existing byte array\nconst bytes = utf8ToBytes('foo'); // Uint8Array(3) [ 102, 111, 111 ]\nconst bufCV = bufferCV(bytes);\n\n// construct signed and unsigned integer clarity values\nconst i = intCV(-10);\nconst u = uintCV(10);\n\n// construct principal clarity values\nconst address = 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B';\nconst contractName = 'contract-name';\nconst spCV = standardPrincipalCV(address);\nconst cpCV = contractPrincipalCV(address, contractName);\n\n// construct response clarity values\nconst errCV = responseErrorCV(trueCV());\nconst okCV = responseOkCV(falseCV());\n\n// construct tuple clarity values\nconst tupCV = tupleCV({\n a: intCV(1),\n b: trueCV(),\n c: falseCV(),\n});\n\n// construct list clarity values\nconst l = listCV([trueCV(), falseCV()]);\n```\n\nIf you develop in Typescript, the type checker can help prevent you from creating wrongly-typed Clarity values. For example, the following code won't compile since in Clarity lists are homogeneous, meaning they can only contain values of a single type. It is important to include the type variable `BooleanCV` in this example, otherwise the typescript type checker won't know which type the list is of and won't enforce homogeneity.\n\n```ts -n\nconst l = listCV<BooleanCV>([trueCV(), intCV(1)]);\n```\n\n## Post Conditions\n\nThree types of post conditions can be added to transactions:\n\n1. STX post condition\n2. Fungible token post condition\n3. Non-Fungible token post condition\n\nFor details see: https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-post-conditions\n\n## STX post condition\n\n```ts -n\nimport {\n FungibleConditionCode,\n makeStandardSTXPostCondition,\n makeContractSTXPostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\n\nconst standardSTXPostCondition = makeStandardSTXPostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractSTXPostCondition = makeContractSTXPostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount\n);\n```\n\n## Fungible token post condition\n\n```ts -n\nimport {\n FungibleConditionCode,\n createAssetInfo,\n makeStandardFungiblePostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardFungiblePostCondition = makeStandardFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst contractFungiblePostCondition = makeContractFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n```\n\n## Non-fungible token post condition\n\n> **Warning**\n> The Stacks blockchain's post-condition processor can NOT check ownership.\n> It checks whether or not a principal **will send** or **will not send** an NFT.\n> Post-conditions can NOT verify anything about the recipient of an asset.\n> If you want to verify conditions about asset recipients, you will need to use [Clarity](https://docs.stacks.co/docs/write-smart-contracts/).\n\n```ts -n\nimport {\n NonFungibleConditionCode,\n createAssetInfo,\n makeStandardNonFungiblePostCondition,\n makeContractNonFungiblePostCondition,\n bufferCVFromString,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = NonFungibleConditionCode.DoesNotSend;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-asset';\nconst assetId = bufferCVFromString('test-token-asset-id');\nconst nonFungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardNonFungiblePostCondition = makeStandardNonFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractNonFungiblePostCondition = makeContractNonFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n```\n\n## Conversion of Clarity Values to JSON\n\nClarity Values represent values of Clarity contracts. If a JSON format is required the helper function `cvToJSON` can be used.\n\n```ts -n\nimport { cvToJSON, hexToCV } from '@stacks/transactions';\n\ncvToJSON(hexToCV(tx.tx_result.hex));\n```\n"],[368,"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\n## Installation\n\n```package-install\n@stacks/transactions\n```\n\nThis library supports the creation of the following Stacks transaction types:\n\n1. STX token transfer\n2. Smart contract deploy\n3. Smart contract function call\n\n## Key Generation\n\n```typescript -n\nimport { randomPrivateKey, privateKeyToPublicKey } from '@stacks/transactions';\n\n// Random key\nconst privateKey = randomPrivateKey();\nconst publicKey = privateKeyToPublicKey(privateKey);\n\n// Private key from hex string\nconst privateKey = 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01';\n```\n\n## STX Token Transfer Transaction\n\nUse the [`makeSTXTokenTransfer`](https://stacks.js.org/functions/_stacks_transactions.makeSTXTokenTransfer) (with a sender private key), or the \"unsigned\" version [`makeUnsignedSTXTokenTransfer`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedSTXTokenTransfer) (with a sender public key, without yet signing) to create a STX token transfer transaction.\n\n```ts -n\nimport { makeSTXTokenTransfer, broadcastTransaction } from '@stacks/transactions';\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n memo: 'test memo',\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n\n// to see the raw serialized tx\nconst serializedTx = transaction.serialize(); // hex string\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Smart Contract Deploy Transaction\n\nUse the [`makeContractDeploy`](https://stacks.js.org/functions/_stacks_transactions.makeContractDeploy), or the \"unsigned\" version [`makeUnsignedContractDeploy`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedContractDeploy) to create a smart contract deploy transaction.\n\n```ts -n\nimport { makeContractDeploy, broadcastTransaction } from '@stacks/transactions';\nimport { readFileSync } from 'fs';\n\nconst clarityCode = readFileSync('/path/to/contract.clar').toString();\n\nconst txOptions = {\n contractName: 'contract_name',\n codeBody: clarityCode,\n clarityVersion: 3, // optional, defaults to latest deployed version\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeContractDeploy(txOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Smart Contract Function Call (On-chain)\n\nIf you want to call a readonly function, use [`fetchCallReadOnlyFunction`](https://stacks.js.org/functions/_stacks_transactions.fetchCallReadOnlyFunction) instead.\n\nUse the [`makeContractCall`](https://stacks.js.org/functions/_stacks_transactions.makeContractCall) or the \"unsigned\" version [`makeUnsignedContractCall`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedContractCall) to create a smart contract function call transaction.\n\n```ts -n\nimport { makeContractCall, broadcastTransaction, Cl, Pc } from '@stacks/transactions';\n\n// Add an optional post condition\nconst condition01 = Pc.principal('SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE')\n .willSendGte(1000000n)\n .ustx();\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [Cl.bufferFromUtf8('foo string')],\n postConditions: [condition01],\n\n validateWithAbi: true, // check if the arguments given are compatible with the function\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeContractCall(txOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\nIn this example we construct a `contract-call` transaction with a post condition. We have set the `validateWithAbi` option to `true`, so the `makeContractCall` builder will attempt to fetch this contracts ABI from the specified Stacks network, and validate that the provided functionArgs match what is described in the ABI. This should help you avoid constructing invalid contract-call transactions. If you would prefer to provide your own ABI instead of fetching it from the network, the `validateWithAbi` option also accepts [ClarityABI](https://stacks.js.org/interfaces/_stacks_transactions.ClarityAbi) objects.\n\n## Sponsoring Transactions\n\nTo generate a sponsored transaction, first create and sign the transaction as the origin. The `sponsored` property in the options object must be set to true.\n\n```ts -n\nimport { makeContractCall, Cl } from '@stacks/transactions';\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [Cl.bufferFromUtf8('foo string')],\n validateWithAbi: true,\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n sponsored: true,\n};\n\nconst transaction = await makeContractCall(txOptions);\nconst serializedTx = transaction.serialize();\n\n// can't broadcast sponsored transactions before they are sponsored\n```\n\nThe serialized transaction can now be passed to the sponsoring party which will sign the sponsor portion of the transaction and set the fee.\n\n```ts -n\nimport { sponsorTransaction, broadcastTransaction } from '@stacks/transactions';\n\nconst deserializedTx = deserializeTransaction(serializedTx);\nconst sponsorKey = '770287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01';\nconst fee = 1000n;\n\nconst sponsorOptions = {\n transaction: deserializedTx,\n sponsorPrivateKey: sponsorKey,\n sponsorNonce: 0,\n fee,\n};\n\nconst sponsoredTx = await sponsorTransaction(sponsorOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction: sponsoredTx, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Supporting multi-signature transactions\n\nTo generate a multi-sig transaction, first create an unsigned transaction.\nThe `numSignatures` and `publicKeys` properties in the options object must be set:\n\n```ts -n\nimport {\n makeUnsignedSTXTokenTransfer,\n createStacksPrivateKey,\n deserializeTransaction,\n pubKeyfromPrivKey,\n publicKeyToString,\n TransactionSigner,\n standardPrincipalCV,\n BytesReader,\n AnchorMode,\n} from '@stacks/transactions';\n\nconst recipient = standardPrincipalCV('SP3FGQ8...');\nconst amount = 2500000n;\nconst fee = 0n;\nconst memo = 'test memo';\n\n// private keys of the participants in the transaction\nconst privKeyStrings = ['6d430bb9...', '2a584d89...', 'd5200dee...'];\n\n// create private key objects from string array\nconst privKeys = privKeyStrings.map(createStacksPrivateKey);\n\n// corresponding public keys\nconst pubKeys = privKeyStrings.map(pubKeyfromPrivKey);\n\n// create public key string array from objects\nconst pubKeyStrings = pubKeys.map(publicKeyToString);\n\nconst transaction = await makeUnsignedSTXTokenTransfer({\n recipient,\n amount,\n fee,\n memo,\n numSignatures: 2, // number of signature required\n publicKeys: pubKeyStrings, // public key string array with >= numSignatures elements\n anchorMode: AnchorMode.Any,\n});\n\nconst serializedTx = transaction.serialize();\n```\n\nThis transaction payload can be passed along to other participants to sign. In addition to\nmeeting the numSignatures requirement, the public keys of the parties who did not sign the\ntransaction must be appended to the signature.\n\n```ts -n\n// deserialize and sign transaction\nconst bytesReader = new BytesReader(serializedTx);\n// Partially signed or unsigned multi-sig tx can be deserialized to add the required signatures\nconst deserializedTx = deserializeTransaction(bytesReader);\n\nconst signer = new TransactionSigner(deserializedTx);\n\n// first signature\nsigner.signOrigin(privKeys[0]);\n\n// second signature\nsigner.signOrigin(privKeys[1]);\n\n// after meeting the numSignatures requirement, the public\n// keys of the participants who did not sign must be appended\nsigner.appendOrigin(pubKeys[2]);\n\n// the serialized multi-sig tx\nconst serializedSignedTx = deserializedTx.serialize();\n```\n\n## Calling Read-only Contract Functions\n\nRead-only contract functions can be called without generating or broadcasting a transaction. Instead it works via a direct API call to a Stacks node.\n\n```ts -n\nimport { bufferCVFromString, callReadOnlyFunction } from '@stacks/transactions';\nimport { StacksTestnet } from '@stacks/network';\n\nconst contractAddress = 'ST3KC0MTNW34S1ZXD36JYKFD3JJMWA01M55DSJ4JE';\nconst contractName = 'kv-store';\nconst functionName = 'get-value';\nconst buffer = bufferCVFromString('foo');\nconst network = new StacksTestnet();\nconst senderAddress = 'ST2F4BK4GZH6YFBNHYDDGN4T1RKBA7DA1BJZPJEJJ';\n\nconst options = {\n contractAddress,\n contractName,\n functionName,\n functionArgs: [buffer],\n network,\n senderAddress,\n};\n\nconst result = await callReadOnlyFunction(options);\n```\n\n## Constructing Clarity Values\n\nBuilding transactions that call functions in deployed clarity contracts requires you to construct valid Clarity Values to pass to the function as arguments. The [Clarity type system](https://github.com/stacksgov/sips/blob/master/sip/sip-002-smart-contract-language.md#clarity-type-system) contains the following types:\n\n- `(tuple (key-name-0 key-type-0) (key-name-1 key-type-1) ...)` : a typed tuple with named fields.\n- `(list max-len entry-type)` : a list of maximum length max-len, with entries of type entry-type\n- `(response ok-type err-type)` : object used by public functions to commit their changes or abort. May be returned or used by other functions as well, however, only public functions have the commit/abort behavior.\n- `(optional some-type)` : an option type for objects that can either be (some value) or none\n- `(buff max-len)` : byte buffer or maximum length max-len.\n- `principal` : object representing a principal (whether a contract principal or standard principal).\n- `bool` : boolean value (`true` or `false`)\n- `int` : signed 128-bit integer\n- `uint`: unsigned 128-bit integer\n\nThis library contains Typescript types and classes that map to the Clarity types, in order to make it easy to construct well-typed Clarity values in Javascript. These types all extend the abstract class `ClarityValue`.\n\n```ts -n\nimport {\n trueCV,\n falseCV,\n noneCV,\n someCV,\n intCV,\n uintCV,\n standardPrincipalCV,\n contractPrincipalCV,\n responseErrorCV,\n responseOkCV,\n listCV,\n tupleCV,\n bufferCV,\n} from '@stacks/transactions';\nimport { utf8ToBytes } from '@stacks/common';\n\n// construct boolean clarity values\nconst t = trueCV();\nconst f = falseCV();\n\n// construct optional clarity values\nconst nothing = noneCV();\nconst something = someCV(t);\n\n// construct a buffer clarity value from an existing byte array\nconst bytes = utf8ToBytes('foo'); // Uint8Array(3) [ 102, 111, 111 ]\nconst bufCV = bufferCV(bytes);\n\n// construct signed and unsigned integer clarity values\nconst i = intCV(-10);\nconst u = uintCV(10);\n\n// construct principal clarity values\nconst address = 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B';\nconst contractName = 'contract-name';\nconst spCV = standardPrincipalCV(address);\nconst cpCV = contractPrincipalCV(address, contractName);\n\n// construct response clarity values\nconst errCV = responseErrorCV(trueCV());\nconst okCV = responseOkCV(falseCV());\n\n// construct tuple clarity values\nconst tupCV = tupleCV({\n a: intCV(1),\n b: trueCV(),\n c: falseCV(),\n});\n\n// construct list clarity values\nconst l = listCV([trueCV(), falseCV()]);\n```\n\nIf you develop in Typescript, the type checker can help prevent you from creating wrongly-typed Clarity values. For example, the following code won't compile since in Clarity lists are homogeneous, meaning they can only contain values of a single type. It is important to include the type variable `BooleanCV` in this example, otherwise the typescript type checker won't know which type the list is of and won't enforce homogeneity.\n\n```ts -n\nconst l = listCV<BooleanCV>([trueCV(), intCV(1)]);\n```\n\n## Post Conditions\n\nThree types of post conditions can be added to transactions:\n\n1. STX post condition\n2. Fungible token post condition\n3. Non-Fungible token post condition\n\nFor details see: https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-post-conditions\n\n## STX post condition\n\n```ts -n\nimport {\n FungibleConditionCode,\n makeStandardSTXPostCondition,\n makeContractSTXPostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\n\nconst standardSTXPostCondition = makeStandardSTXPostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractSTXPostCondition = makeContractSTXPostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount\n);\n```\n\n## Fungible token post condition\n\n```ts -n\nimport {\n FungibleConditionCode,\n createAssetInfo,\n makeStandardFungiblePostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardFungiblePostCondition = makeStandardFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst contractFungiblePostCondition = makeContractFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n```\n\n## Non-fungible token post condition\n\n> **Warning**\n> The Stacks blockchain's post-condition processor can NOT check ownership.\n> It checks whether or not a principal **will send** or **will not send** an NFT.\n> Post-conditions can NOT verify anything about the recipient of an asset.\n> If you want to verify conditions about asset recipients, you will need to use [Clarity](https://docs.stacks.co/docs/write-smart-contracts/).\n\n```ts -n\nimport {\n NonFungibleConditionCode,\n createAssetInfo,\n makeStandardNonFungiblePostCondition,\n makeContractNonFungiblePostCondition,\n bufferCVFromString,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = NonFungibleConditionCode.DoesNotSend;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-asset';\nconst assetId = bufferCVFromString('test-token-asset-id');\nconst nonFungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardNonFungiblePostCondition = makeStandardNonFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractNonFungiblePostCondition = makeContractNonFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n```\n\n## Conversion of Clarity Values to JSON\n\nClarity Values represent values of Clarity contracts. If a JSON format is required the helper function `cvToJSON` can be used.\n\n```ts -n\nimport { cvToJSON, hexToCV } from '@stacks/transactions';\n\ncvToJSON(hexToCV(tx.tx_result.hex));\n```\n"],[356,"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\nStacks Connect enables you to authenticate your users and connect your app to their wallet. This reference contains more detailed information on how you can authenticate users, sign and broadcast transactions on their behalf, and enable users to sign messages.\n\n<Callout title=\"Migration Note\">\nPlease be patient during the migration to version 8.x.x. There has been a long-running effort together with wallets to modernize the Stacks web ecosystem, culminating in [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) and the new `request` method in Stacks Connect 8.x.x. For the legacy version of `@stacks/connect` using JWT tokens, please use version 7.10.1. See the [Migration Guide](/docs/stacks/connect/guides/migration) for more details.\n</Callout>\n\n### Installation\n\n```package-install\n@stacks/connect\n```\n\n### Connect to a wallet\n\nInitiate a wallet connection and request addresses:\n\n```typescript\nimport { connect } from '@stacks/connect';\n\nconst response = await connect(); // stores users address in local storage by default\n```\n\nGet the local storage data (stored by a connect call):\n\n```typescript\nimport { getLocalStorage } from '@stacks/connect';\n\nconst data = getLocalStorage();\n// {\n// \"addresses\": {\n// \"stx\": [\n// { \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\" },\n// ],\n// \"btc\": [\n// { \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\" },\n// ]\n// }\n```\n\nManaging the connection state:\n\n```typescript\nimport { connect, disconnect, isConnected } from '@stacks/connect';\n\nisConnected(); // false\nawait connect(); // similar to the `getAddresses` method\nisConnected(); // true\ndisconnect(); // clears local storage and selected wallet\nisConnected(); // false\n```\n\n### Use request to trigger wallet interactions\n\n```typescript\nimport { request } from '@stacks/connect';\n\n// CONNECT\nconst response = await request({ forceWalletSelect: true }, 'getAddresses');\n```\n\n### Available methods\n\n- [getAddresses](#getaddresses)\n- [sendTransfer](#sendtransfer)\n- [signPsbt](#signpsbt)\n- [stx_getAddresses](#stx_getaddresses)\n- [stx_getAccounts](#stx_getaccounts)\n- [stx_transferStx](#stx_transferstx)\n- [stx_callContract](#stx_callcontract)\n- [stx_deployContract](#stx_deploycontract)\n- [stx_signMessage](#stx_signmessage)\n- [stx_signStructuredMessage](#stx_signstructuredmessage)\n\n#### getAddresses\n\n```typescript\nconst response = await request('getAddresses');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\",\n// \"publicKey\": \"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69\",\n// },\n// {\n// \"address\": \"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr\",\n// \"publicKey\": \"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114\",\n// },\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\",\n// }\n// ]\n// }\n```\n\n#### sendTransfer\n\n```typescript\nconst response = await request('sendTransfer', {\n recipients: [\n {\n address: 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4', // recipient address\n amount: '1000', // amount in sats\n },\n // You can specify multiple recipients\n {\n address: 'bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh',\n amount: '2000',\n },\n ],\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### signPsbt\n\n```typescript\nconst response = await request('signPsbt', {\n psbt: 'cHNidP...', // base64 encoded PSBT string\n signInputs: [{ index: 0, address }], // indices of inputs to sign (optional)\n broadcast: false, // whether to broadcast the transaction after signing (optional)\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID (if broadcast is true)\n// \"psbt\": \"cHNidP...\" // The signed PSBT in base64 format\n// }\n```\n\n#### stx_getAddresses\n\n```typescript\nconst response = await request('stx_getAddresses');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\",\n// \"publicKey\": \"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69\",\n// },\n// {\n// \"address\": \"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr\",\n// \"publicKey\": \"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114\",\n// },\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\",\n// }\n// ]\n// }\n```\n\n#### stx_getAccounts\n\n```typescript\nconst response = await request('stx_getAccounts');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cd...\",\n// \"gaiaHubUrl\": \"https://hub.hiro.so\",\n// \"gaiaAppKey\": \"0488ade4040658015580000000dc81e3a5...\"\n// }\n// ]\n// }\n```\n\n#### stx_transferStx\n\n```typescript\nconst response = await request('stx_transferStx', {\n amount: '1000', // amount in micro-STX (1 STX = 1,000,000 micro-STX)\n recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN', // recipient address\n network: 'mainnet', // optional, defaults to mainnet\n memo: 'Optional memo', // optional memo field\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_callContract\n\n```typescript\nconst response = await request('stx_callContract', {\n contract: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN.counters', // contract in format: address.contract-name\n functionName: 'count', // name of the function to call\n functionArgs: [Cl.int(3)], // array of Clarity values as arguments\n network: 'mainnet', // optional, defaults to mainnet\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_deployContract\n\n```typescript\nconst response = await request('stx_deployContract', {\n name: 'counters', // name of the contract\n clarityCode: `(define-map counters principal int)\n\n(define-public (count (change int))\n (ok (map-set counters tx-sender (+ (get-count tx-sender) change)))\n)\n\n(define-read-only (get-count (who principal))\n (default-to 0 (map-get? counters who))\n)`, // Clarity code as string\n clarityVersion: '2', // optional, defaults to latest version\n network: 'mainnet', // optional, defaults to mainnet\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_signMessage\n\n```typescript\nconst response = await request('stx_signMessage', {\n message: 'Hello, World!', // message to sign\n});\n// {\n// \"signature\": \"0x1234...\", // The signature of the message\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\" // The public key that signed the message\n// }\n```\n\n#### stx_signStructuredMessage\n\n```typescript\nconst clarityMessage = Cl.parse('{ structured: \"message\", num: u3 }');\nconst clarityDomain = Cl.tuple({\n domain: Cl.stringAscii('example.com'),\n version: Cl.stringAscii('1.0.0'),\n 'chain-id': Cl.uint(1),\n});\n\nconst response = await request('stx_signStructuredMessage', {\n message: clarityMessage, // Clarity value representing the structured message\n domain: clarityDomain, // domain object for SIP-018 style signing\n});\n// {\n// \"signature\": \"0x1234...\", // The signature of the structured message\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\" // The public key that signed the message\n// }\n```\n\n### Error Handling\n\nThe `request` method returns a Promise, allowing you to handle errors using standard Promise-based error handling patterns. You can use either `try/catch` with `async/await` or the `.catch()` method with Promise chains.\n\n#### Using try/catch with async/await\n\n```typescript\nimport { request } from '@stacks/connect';\n\ntry {\n const response = await request('stx_transferStx', {\n amount: '1000',\n recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN',\n });\n // SUCCESS\n console.log('Transaction successful:', response.txid);\n} catch (error) {\n // ERROR\n console.error('Wallet returned an error:', error);\n}\n```\n\n### Compatibility\n\nThe `request` method by default adds a layer of auto-compatibility for different wallet providers. This is meant to unify the interface where wallet providers may not implement methods and results the same way.\n\n<Callout title=\"Wallet Support\">\nFor a complete list of wallet compatibility and support status, see the [Wallet Support](/docs/stacks/connect/support) page.\n</Callout>\n\n### Advanced Usage\n\n#### request\n\nThe `request` method is called with an optional options object as the first parameter:\n\n```typescript\nimport { request } from '@stacks/connect';\n\n// WITH options\nconst response = await request(\n {\n provider?: StacksProvider; // Custom provider to use for the request\n\n forceWalletSelect?: boolean; // Force user to select a wallet (default: false)\n persistWalletSelect?: boolean; // Persist selected wallet (default: true)\n enableOverrides?: boolean; // Enable provider compatibility (default: true)\n enableLocalStorage?: boolean; // Store address in local storage (default: true)\n\n defaultProviders?: WbipProvider[]; // Default wallets to display in modal\n approvedProviderIds?: string[]; // List of approved provider IDs to show in modal\n },\n 'method',\n params\n);\n\n// WITHOUT options\nconst response = await request('method', params);\n```\n\n<Callout title=\"Provider Compatibility\">\nThe `enableOverrides` option enables automatic compatibility fixes for different wallet providers. For example, it handles converting numeric types between string and number formats as needed by different wallets, and remaps certain method names to match wallet-specific implementations. This ensures consistent behavior across different wallet providers without requiring manual adjustments.\n</Callout>\n\n<Callout title=\"Approved Providers\">\nThe `approvedProviderIds` option allows you to filter which wallet providers are shown in the connect modal. This is useful when you want to limit the available wallet options to specific providers. For example, you might only want to support Leather wallet:\n\n```typescript\nconnect({ approvedProviderIds: ['LeatherProvider'] });\n```\n\nOr multiple specific wallets:\n\n```typescript\nconnect({ approvedProviderIds: ['LeatherProvider', 'xverse'] });\n```\n</Callout>\n\n#### requestRaw\n\nThe `requestRaw` method provides direct access to wallet providers without the additional features of `request`:\n\n```typescript\nimport { requestRaw } from '@stacks/connect';\n\nconst response = await requestRaw(provider, 'method', params);\n```\n\n<Callout title=\"Raw Request\">\n`requestRaw` bypasses the UI wallet selector, automatic provider compatibility fixes, and other features that come with `request`. Use this when you need more manual control over the wallet interaction process.\n</Callout>\n"],[366,"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\nStacks Connect enables you to authenticate your users and connect your app to their wallet. This reference contains more detailed information on how you can authenticate users, sign and broadcast transactions on their behalf, and enable users to sign messages.\n\n<Callout title=\"Migration Note\">\nPlease be patient during the migration to version 8.x.x. There has been a long-running effort together with wallets to modernize the Stacks web ecosystem, culminating in [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) and the new `request` method in Stacks Connect 8.x.x. For the legacy version of `@stacks/connect` using JWT tokens, please use version 7.10.1. See the [Migration Guide](/docs/stacks/connect/guides/migration) for more details.\n</Callout>\n\n### Installation\n\n```package-install\n@stacks/connect\n```\n\n### Connect to a wallet\n\nInitiate a wallet connection and request addresses:\n\n```typescript\nimport { connect } from '@stacks/connect';\n\nconst response = await connect(); // stores users address in local storage by default\n```\n\nGet the local storage data (stored by a connect call):\n\n```typescript\nimport { getLocalStorage } from '@stacks/connect';\n\nconst data = getLocalStorage();\n// {\n// \"addresses\": {\n// \"stx\": [\n// { \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\" },\n// ],\n// \"btc\": [\n// { \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\" },\n// ]\n// }\n```\n\nManaging the connection state:\n\n```typescript\nimport { connect, disconnect, isConnected } from '@stacks/connect';\n\nisConnected(); // false\nawait connect(); // similar to the `getAddresses` method\nisConnected(); // true\ndisconnect(); // clears local storage and selected wallet\nisConnected(); // false\n```\n\n### Use request to trigger wallet interactions\n\n```typescript\nimport { request } from '@stacks/connect';\n\n// CONNECT\nconst response = await request({ forceWalletSelect: true }, 'getAddresses');\n```\n\n### Available methods\n\n- [getAddresses](#getaddresses)\n- [sendTransfer](#sendtransfer)\n- [signPsbt](#signpsbt)\n- [stx_getAddresses](#stx_getaddresses)\n- [stx_getAccounts](#stx_getaccounts)\n- [stx_transferStx](#stx_transferstx)\n- [stx_callContract](#stx_callcontract)\n- [stx_deployContract](#stx_deploycontract)\n- [stx_signMessage](#stx_signmessage)\n- [stx_signStructuredMessage](#stx_signstructuredmessage)\n\n#### getAddresses\n\n```typescript\nconst response = await request('getAddresses');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\",\n// \"publicKey\": \"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69\",\n// },\n// {\n// \"address\": \"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr\",\n// \"publicKey\": \"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114\",\n// },\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\",\n// }\n// ]\n// }\n```\n\n#### sendTransfer\n\n```typescript\nconst response = await request('sendTransfer', {\n recipients: [\n {\n address: 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4', // recipient address\n amount: '1000', // amount in sats\n },\n // You can specify multiple recipients\n {\n address: 'bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh',\n amount: '2000',\n },\n ],\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### signPsbt\n\n```typescript\nconst response = await request('signPsbt', {\n psbt: 'cHNidP...', // base64 encoded PSBT string\n signInputs: [{ index: 0, address }], // indices of inputs to sign (optional)\n broadcast: false, // whether to broadcast the transaction after signing (optional)\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID (if broadcast is true)\n// \"psbt\": \"cHNidP...\" // The signed PSBT in base64 format\n// }\n```\n\n#### stx_getAddresses\n\n```typescript\nconst response = await request('stx_getAddresses');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\",\n// \"publicKey\": \"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69\",\n// },\n// {\n// \"address\": \"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr\",\n// \"publicKey\": \"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114\",\n// },\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\",\n// }\n// ]\n// }\n```\n\n#### stx_getAccounts\n\n```typescript\nconst response = await request('stx_getAccounts');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cd...\",\n// \"gaiaHubUrl\": \"https://hub.hiro.so\",\n// \"gaiaAppKey\": \"0488ade4040658015580000000dc81e3a5...\"\n// }\n// ]\n// }\n```\n\n#### stx_transferStx\n\n```typescript\nconst response = await request('stx_transferStx', {\n amount: '1000', // amount in micro-STX (1 STX = 1,000,000 micro-STX)\n recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN', // recipient address\n network: 'mainnet', // optional, defaults to mainnet\n memo: 'Optional memo', // optional memo field\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_callContract\n\n```typescript\nconst response = await request('stx_callContract', {\n contract: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN.counters', // contract in format: address.contract-name\n functionName: 'count', // name of the function to call\n functionArgs: [Cl.int(3)], // array of Clarity values as arguments\n network: 'mainnet', // optional, defaults to mainnet\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_deployContract\n\n```typescript\nconst response = await request('stx_deployContract', {\n name: 'counters', // name of the contract\n clarityCode: `(define-map counters principal int)\n\n(define-public (count (change int))\n (ok (map-set counters tx-sender (+ (get-count tx-sender) change)))\n)\n\n(define-read-only (get-count (who principal))\n (default-to 0 (map-get? counters who))\n)`, // Clarity code as string\n clarityVersion: '2', // optional, defaults to latest version\n network: 'mainnet', // optional, defaults to mainnet\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_signMessage\n\n```typescript\nconst response = await request('stx_signMessage', {\n message: 'Hello, World!', // message to sign\n});\n// {\n// \"signature\": \"0x1234...\", // The signature of the message\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\" // The public key that signed the message\n// }\n```\n\n#### stx_signStructuredMessage\n\n```typescript\nconst clarityMessage = Cl.parse('{ structured: \"message\", num: u3 }');\nconst clarityDomain = Cl.tuple({\n domain: Cl.stringAscii('example.com'),\n version: Cl.stringAscii('1.0.0'),\n 'chain-id': Cl.uint(1),\n});\n\nconst response = await request('stx_signStructuredMessage', {\n message: clarityMessage, // Clarity value representing the structured message\n domain: clarityDomain, // domain object for SIP-018 style signing\n});\n// {\n// \"signature\": \"0x1234...\", // The signature of the structured message\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\" // The public key that signed the message\n// }\n```\n\n### Error Handling\n\nThe `request` method returns a Promise, allowing you to handle errors using standard Promise-based error handling patterns. You can use either `try/catch` with `async/await` or the `.catch()` method with Promise chains.\n\n#### Using try/catch with async/await\n\n```typescript\nimport { request } from '@stacks/connect';\n\ntry {\n const response = await request('stx_transferStx', {\n amount: '1000',\n recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN',\n });\n // SUCCESS\n console.log('Transaction successful:', response.txid);\n} catch (error) {\n // ERROR\n console.error('Wallet returned an error:', error);\n}\n```\n\n### Compatibility\n\nThe `request` method by default adds a layer of auto-compatibility for different wallet providers. This is meant to unify the interface where wallet providers may not implement methods and results the same way.\n\n<Callout title=\"Wallet Support\">\nFor a complete list of wallet compatibility and support status, see the [Wallet Support](/docs/stacks/connect/support) page.\n</Callout>\n\n### Advanced Usage\n\n#### request\n\nThe `request` method is called with an optional options object as the first parameter:\n\n```typescript\nimport { request } from '@stacks/connect';\n\n// WITH options\nconst response = await request(\n {\n provider?: StacksProvider; // Custom provider to use for the request\n\n forceWalletSelect?: boolean; // Force user to select a wallet (default: false)\n persistWalletSelect?: boolean; // Persist selected wallet (default: true)\n enableOverrides?: boolean; // Enable provider compatibility (default: true)\n enableLocalStorage?: boolean; // Store address in local storage (default: true)\n\n defaultProviders?: WbipProvider[]; // Default wallets to display in modal\n approvedProviderIds?: string[]; // List of approved provider IDs to show in modal\n },\n 'method',\n params\n);\n\n// WITHOUT options\nconst response = await request('method', params);\n```\n\n<Callout title=\"Provider Compatibility\">\nThe `enableOverrides` option enables automatic compatibility fixes for different wallet providers. For example, it handles converting numeric types between string and number formats as needed by different wallets, and remaps certain method names to match wallet-specific implementations. This ensures consistent behavior across different wallet providers without requiring manual adjustments.\n</Callout>\n\n<Callout title=\"Approved Providers\">\nThe `approvedProviderIds` option allows you to filter which wallet providers are shown in the connect modal. This is useful when you want to limit the available wallet options to specific providers. For example, you might only want to support Leather wallet:\n\n```typescript\nconnect({ approvedProviderIds: ['LeatherProvider'] });\n```\n\nOr multiple specific wallets:\n\n```typescript\nconnect({ approvedProviderIds: ['LeatherProvider', 'xverse'] });\n```\n</Callout>\n\n#### requestRaw\n\nThe `requestRaw` method provides direct access to wallet providers without the additional features of `request`:\n\n```typescript\nimport { requestRaw } from '@stacks/connect';\n\nconst response = await requestRaw(provider, 'method', params);\n```\n\n<Callout title=\"Raw Request\">\n`requestRaw` bypasses the UI wallet selector, automatic provider compatibility fixes, and other features that come with `request`. Use this when you need more manual control over the wallet interaction process.\n</Callout>\n"],[227,"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\nThe Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a UserSession to manage user data.\n\n## Installation\n\n```package-install\n@stacks/network\n```\n\n{/* <Root>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`AppConfig`</h2>\n\nConfiguration data for the current app.\n\nOn browser platforms, creating an instance of this class without any arguments will use `window.location.origin` as the app domain. On non-browser platforms, you need to specify an app domain as the second argument.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"scopes\"} type={\"string[]\"}>\n\nAn array of strings representing permissions requested by the app.\n\n<span>Default: `['store_write']`</span>\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"appDomain\"} type={\"string\"}>\n\nStacks apps are uniquely identified by their app domain.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"redirectPath\"} type={\"string\"}>\n\nPath on app domain to redirect users to after authentication. The authentication response token will be postpended in a query.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"manifestPath\"} type={\"string\"}>\n\nPath relative to app domain of app's manifest file.\n\n<span>Default: `\"/manifest.json\"`</span>\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"coreNode\"} type={\"string\"}>\n\nThe URL of Stacks core node to use for this app. If this is not specified, the default core node will be used.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"authenticatorURL\"} type={\"string\"}>\n\nThe URL of a web-based authenticator to use in the event the user doesn't have Stacks installed on their machine. If this is not specified, the current default in this library will be used.\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"config\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"config\" className='tab group'>\n <Badge className='badge transition-colors'>Setting basic app permissions</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>With advanced scopes</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"config\">\n ```tsx twoslash\n // @noErrors\n // [!code word:AppConfig]\n import { AppConfig } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n const appConfig = new AppConfig(\n ['store_write'],\n appDomain\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n\n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```tsx twoslash\n // @noErrors\n // [!code word:publish_data]\n // [!code word:email]\n import { AppConfig } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n const appConfig = new AppConfig(\n ['store_write', 'publish_data', 'email'],\n appDomain\n );\n ```\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n\n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`UserSession`</h2>\n\nRepresents an instance of a signed in user for a particular app.\n\n## Functions\n\n<Property required={false} deprecated={false} name={\"isSignInPending\"} type={\"function\"}>\n\nDetermines if there is an incoming authentication response.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"handlePendingSignIn\"} type={\"function\"}>\n\nProcesses the response and provides a `userData` object containing the user's identity, BNS username and profile information.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"isUserSignedIn\"} type={\"function\"}>\n\nChecks if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"loadUserData\"} type={\"function\"}>\n\nRetrieves the user's profile data if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"encryptContent\"} type={\"function\"}>\n\nEncrypts user data for secure storage.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"decryptContent\"} type={\"function\"}>\n\nDecrypts user data for secure storage.\n\n</Property>\n\n</div>\n\n<APIExample>\n<Tabs defaultValue=\"pending\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"pending\" className='tab group'>\n <Badge className='badge transition-colors'>Handling pending auth</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"status\" className='tab group'>\n <Badge className='badge transition-colors'>Checking if user is signed in</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"user-data\" className='tab group'>\n <Badge className='badge transition-colors'>Loading data for signed in user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"sign-out\" className='tab group'>\n <Badge className='badge transition-colors'>Signing out a user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"encrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Encrypting user data</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"decrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Decrypting user data</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"pending\">\n ```tsx twoslash\n // @noErrors\n // [!code word:isSignInPending]\n // [!code word:handlePendingSignIn]\n const isPending = userSession.isSignInPending();\n\n if (isPending) {\n userSession.handlePendingSignIn().then(userData => {\n // Do something with userData\n });\n }\n ```\n </TabsContent>\n <TabsContent value='status'>\n ```tsx twoslash\n // @noErrors\n // [!code word:isUserSignedIn]\n const isSignedIn = userSession.isUserSignedIn();\n ```\n </TabsContent>\n <TabsContent value='user-data'>\n ```tsx twoslash\n // @noErrors\n // [!code word:loadUserData]\n const isSignedIn = userSession.isUserSignedIn();\n\n if (isSignedIn) {\n // Do something with the signed in user\n const userData = userSession.loadUserData();\n }\n ```\n </TabsContent>\n <TabsContent value='sign-out'>\n ```tsx twoslash\n // @noErrors\n // [!code word:signUserOut]\n userSession.signUserOut();\n ```\n </TabsContent>\n <TabsContent value='encrypt'>\n ```tsx twoslash\n // @noErrors\n // [!code word:encryptContent]\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n ```\n </TabsContent>\n <TabsContent value='decrypt'>\n ```tsx twoslash\n // @noErrors\n // [!code word:decryptContent]\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n const plainText = await userSession.decryptContent(cipherText);\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n\n<Accordion title={\"Notes\"}>\n Note that encryption here uses the user's private key associated with your app only. If you need to share this data with another app or other users, you should use the equivalent methods from `@stacks/encryption` and provide a custom private key.\n</Accordion>\n\n</Accordions>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`makeAuthRequest`</h2>\n\nThe Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a UserSession to manage user data.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"transitKey\"} type={\"string\"}>\n\nThe authentication payloads are encrypted during transit, the encryption key generated below provides this.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"redirectURI\"} type={\"string\"}>\n\nA URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"manifestUri\"} type={\"string\"}>\n\nSet the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"scopes\"} type={\"string[]\"}>\n\nAdditional permissions the app is requesting.\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"auth-request\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"auth-request\" className='tab group'>\n <Badge className='badge transition-colors'>Generate an authentication request</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"auth-request\">\n ```tsx twoslash\n // @noErrors\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // ---cut---\n const authRequest = userSession.makeAuthRequest(\n // ^^^^^^^^^^^^^^^\n transitKey,\n redirectUri,\n manifestUri\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n\n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`lookupProfile`</h2>\n\nLook up a user's profile information by their BNS username.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"username\"} type={\"string\"}>\n\nThe BNS username of the user.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"network\"} type={\"'mainnet' | 'testnet' | 'devnet' | 'mocknet' | StacksNetwork\"}>\n\nDefines the network to connect to. Default is 'mainnet'.\n\n</Property>\n\n\n<Property required={false} deprecated={false} name={\"zoneFileLookupURL\"} type={\"string\"}>\n\nURL to fetch the zone file for the username. This is only needed if the zone file does not reside at the default location on the BNS network.\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"lookup\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"lookup\" className='tab group'>\n <Badge className='badge transition-colors'>Generate an authentication request</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"lookup\">\n ```tsx twoslash\n // @noErrors\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // ---cut---\n const authRequest = userSession.makeAuthRequest(\n // ^^^^^^^^^^^^^^^\n transitKey,\n redirectUri,\n manifestUri\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n\n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n</Root> */}\n\n\n## Usage\n\n## Create a Stacks mainnet, testnet or mocknet network\n\n```typescript\nimport { StacksMainnet, StacksTestnet, StacksMocknet } from '@stacks/network';\n\nconst network = new StacksMainnet();\n\nconst testnet = new StacksTestnet();\n\nconst mocknet = new StacksMocknet();\n```\n\n## Set a custom node URL\n\n```typescript\nconst network = new StacksMainnet({ url: 'https://www.mystacksnode.com/' });\n```\n\n## Check if network is mainnet\n\n```typescript\nconst isMainnet = network.isMainnet();\n```\n\n## Network usage in transaction building\n\n```typescript\nimport { makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst txOptions = {\n network,\n recipient: 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26',\n amount: new BigNum(12345),\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n```\n\n## Use the built-in API key middleware\n\nSome Stacks APIs make use API keys to provide less rate-limited plans.\n\n```typescript\nimport { createApiKeyMiddleware, createFetchFn, StacksMainnet } from '@stacks/network';\nimport { broadcastTransaction, getNonce, makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst myApiMiddleware = createApiKeyMiddleware('example_e8e044a3_41d8b0fe_3dd3988ef302');\nconst myFetchFn = createFetchFn(myApiMiddleware); // middlewares can be used to create a new fetch function\nconst myMainnet = new StacksMainnet({ fetchFn: myFetchFn }); // the fetchFn options can be passed to a StacksNetwork to override the default fetch function\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n memo: 'some memo',\n anchorMode: AnchorMode.Any,\n network: myMainnet, // make sure to pass in the custom network object\n};\nconst transaction = await makeSTXTokenTransfer(txOptions); // fee-estimation will use the custom fetchFn\n\nconst response = await broadcastTransaction(transaction, myMainnet); // make sure to broadcast via the custom network object\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', myMainnet);\n```\n\n## Use custom middleware\n\nMiddleware can be used to hook into network calls before sending a request or after receiving a response.\n\n```typescript\nimport { createFetchFn, RequestContext, ResponseContext, StacksTestnet } from '@stacks/network';\nimport { broadcastTransaction, getNonce, makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst preMiddleware = (ctx: RequestContext) => {\n ctx.init.headers = new Headers();\n ctx.init.headers.set('x-foo', 'bar'); // override headers and set new `x-foo` header\n};\nconst postMiddleware = (ctx: ResponseContext) => {\n console.log(await ctx.response.json()); // log response body as json\n};\n\nconst fetchFn = createFetchFn({ pre: preMiddleware, post: preMiddleware }); // a middleware can contain `pre`, `post`, or both\nconst network = new StacksTestnet({ fetchFn });\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', network);\n```\n\n## Get various API URLs\n\n```typescript\nconst txBroadcastUrl = network.getBroadcastApiUrl();\n\nconst feeEstimateUrl = network.getTransferFeeEstimateApiUrl();\n\nconst address = 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26';\nconst accountInfoUrl = network.getAccountApiUrl(address);\n\nconst contractName = 'hello_world';\nconst abiUrl = network.getAbiApiUrl(address, contractName);\n\nconst functionName = 'hello';\nconst readOnlyFunctionCallUrl = network.getReadOnlyFunctionCallApiUrl(\n address,\n contractName,\n functionName\n);\n\nconst nodeInfoUrl = network.getInfoUrl();\n\nconst blockTimeUrl = network.getBlockTimeInfoUrl();\n\nconst poxInfoUrl = network.getPoxInfoUrl();\n```\n"],[226,"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\nThe Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a UserSession to manage user data.\n\n## Installation\n\n```package-install\n@stacks/transactions\n```\n\n{/* <Root>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`AppConfig`</h2>\n\nConfiguration data for the current app.\n\nOn browser platforms, creating an instance of this class without any arguments will use `window.location.origin` as the app domain. On non-browser platforms, you need to specify an app domain as the second argument.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"scopes\"} type={\"string[]\"}>\n\nAn array of strings representing permissions requested by the app.\n\n<span>Default: `['store_write']`</span>\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"appDomain\"} type={\"string\"}>\n\nStacks apps are uniquely identified by their app domain.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"redirectPath\"} type={\"string\"}>\n\nPath on app domain to redirect users to after authentication. The authentication response token will be postpended in a query.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"manifestPath\"} type={\"string\"}>\n\nPath relative to app domain of app's manifest file.\n\n<span>Default: `\"/manifest.json\"`</span>\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"coreNode\"} type={\"string\"}>\n\nThe URL of Stacks core node to use for this app. If this is not specified, the default core node will be used.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"authenticatorURL\"} type={\"string\"}>\n\nThe URL of a web-based authenticator to use in the event the user doesn't have Stacks installed on their machine. If this is not specified, the current default in this library will be used.\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"config\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"config\" className='tab group'>\n <Badge className='badge transition-colors'>Setting basic app permissions</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>With advanced scopes</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"config\">\n ```tsx twoslash\n // @noErrors\n // [!code word:AppConfig]\n import { AppConfig } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n const appConfig = new AppConfig(\n ['store_write'],\n appDomain\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n \n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```tsx twoslash\n // @noErrors\n // [!code word:publish_data]\n // [!code word:email]\n import { AppConfig } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n const appConfig = new AppConfig(\n ['store_write', 'publish_data', 'email'],\n appDomain\n );\n ```\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n \n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`UserSession`</h2>\n\nRepresents an instance of a signed in user for a particular app.\n\n## Functions\n\n<Property required={false} deprecated={false} name={\"isSignInPending\"} type={\"function\"}>\n\nDetermines if there is an incoming authentication response.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"handlePendingSignIn\"} type={\"function\"}>\n\nProcesses the response and provides a `userData` object containing the user's identity, BNS username and profile information.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"isUserSignedIn\"} type={\"function\"}>\n\nChecks if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"loadUserData\"} type={\"function\"}>\n\nRetrieves the user's profile data if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"encryptContent\"} type={\"function\"}>\n\nEncrypts user data for secure storage.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"decryptContent\"} type={\"function\"}>\n\nDecrypts user data for secure storage.\n\n</Property>\n\n</div>\n\n<APIExample>\n<Tabs defaultValue=\"pending\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"pending\" className='tab group'>\n <Badge className='badge transition-colors'>Handling pending auth</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"status\" className='tab group'>\n <Badge className='badge transition-colors'>Checking if user is signed in</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"user-data\" className='tab group'>\n <Badge className='badge transition-colors'>Loading data for signed in user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"sign-out\" className='tab group'>\n <Badge className='badge transition-colors'>Signing out a user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"encrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Encrypting user data</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"decrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Decrypting user data</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"pending\">\n ```tsx twoslash\n // @noErrors\n // [!code word:isSignInPending]\n // [!code word:handlePendingSignIn]\n const isPending = userSession.isSignInPending();\n\n if (isPending) {\n userSession.handlePendingSignIn().then(userData => {\n // Do something with userData\n });\n }\n ```\n </TabsContent>\n <TabsContent value='status'>\n ```tsx twoslash\n // @noErrors\n // [!code word:isUserSignedIn]\n const isSignedIn = userSession.isUserSignedIn();\n ```\n </TabsContent>\n <TabsContent value='user-data'>\n ```tsx twoslash\n // @noErrors\n // [!code word:loadUserData]\n const isSignedIn = userSession.isUserSignedIn();\n\n if (isSignedIn) {\n // Do something with the signed in user\n const userData = userSession.loadUserData();\n }\n ```\n </TabsContent>\n <TabsContent value='sign-out'>\n ```tsx twoslash\n // @noErrors\n // [!code word:signUserOut]\n userSession.signUserOut();\n ```\n </TabsContent>\n <TabsContent value='encrypt'>\n ```tsx twoslash\n // @noErrors\n // [!code word:encryptContent]\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n ```\n </TabsContent>\n <TabsContent value='decrypt'>\n ```tsx twoslash\n // @noErrors\n // [!code word:decryptContent]\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n const plainText = await userSession.decryptContent(cipherText);\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n\n<Accordion title={\"Notes\"}>\n Note that encryption here uses the user's private key associated with your app only. If you need to share this data with another app or other users, you should use the equivalent methods from `@stacks/encryption` and provide a custom private key.\n</Accordion>\n\n</Accordions>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`makeAuthRequest`</h2>\n\nThe Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a UserSession to manage user data.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"transitKey\"} type={\"string\"}>\n\nThe authentication payloads are encrypted during transit, the encryption key generated below provides this\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"redirectURI\"} type={\"string\"}>\n\nA URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"manifestUri\"} type={\"string\"}>\n\nSet the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"scopes\"} type={\"string[]\"}>\n\nAdditional permissions the app is requesting\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"auth-request\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"auth-request\" className='tab group'>\n <Badge className='badge transition-colors'>Generate an authentication request</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"auth-request\">\n ```tsx twoslash\n // @noErrors\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // ---cut---\n const authRequest = userSession.makeAuthRequest(\n // ^^^^^^^^^^^^^^^\n transitKey,\n redirectUri,\n manifestUri\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n \n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`lookupProfile`</h2>\n\nLook up a user's profile information by their BNS username.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"username\"} type={\"string\"}>\n\nThe BNS username of the user.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"network\"} type={\"'mainnet' | 'testnet' | 'devnet' | 'mocknet' | StacksNetwork\"}>\n\nDefines the network to connect to. Default is 'mainnet'.\n\n</Property>\n\n\n<Property required={false} deprecated={false} name={\"zoneFileLookupURL\"} type={\"string\"}>\n\nURL to fetch the zone file for the username. This is only needed if the zone file does not reside at the default location on the BNS network.\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"lookup\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"lookup\" className='tab group'>\n <Badge className='badge transition-colors'>Generate an authentication request</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"lookup\">\n ```tsx twoslash\n // @noErrors\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // ---cut---\n const authRequest = userSession.makeAuthRequest(\n // ^^^^^^^^^^^^^^^\n transitKey,\n redirectUri,\n manifestUri\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n \n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n</Root> */}\n\nThis library supports the creation of the following Stacks transaction types:\n\n1. STX token transfer\n2. Smart contract deploy\n3. Smart contract function call\n\n## Key Generation\n\n```typescript\nimport { createStacksPrivateKey, makeRandomPrivKey, getPublicKey } from '@stacks/transactions';\n\n// Random key\nconst privateKey = makeRandomPrivKey();\n// Get public key from private\nconst publicKey = getPublicKey(privateKey);\n\n// Private key from hex string\nconst key = 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01';\nconst privateKey = createStacksPrivateKey(key);\n```\n\n## STX Token Transfer Transaction\n\n```typescript\nimport { makeSTXTokenTransfer, broadcastTransaction, AnchorMode } from '@stacks/transactions';\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n memo: 'test memo',\n nonce: 0n, // set a nonce manually if you don't want builder to fetch from a Stacks node\n fee: 200n, // set a tx fee if you don't want the builder to estimate\n anchorMode: AnchorMode.Any,\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n\n// to see the raw serialized tx\nconst serializedTx = transaction.serialize(); // Uint8Array\nconst serializedTxHex = bytesToHex(serializedTx); // hex string\n\n// broadcasting transaction to the specified network\nconst broadcastResponse = await broadcastTransaction(transaction);\nconst txId = broadcastResponse.txid;\n```\n\n## Smart Contract Deploy Transaction\n\n```typescript\nimport { makeContractDeploy, broadcastTransaction, AnchorMode } from '@stacks/transactions';\nimport { StacksTestnet, StacksMainnet } from '@stacks/network';\nimport { readFileSync } from 'fs';\n\n// for mainnet, use `StacksMainnet()`\nconst network = new StacksTestnet();\n\nconst txOptions = {\n contractName: 'contract_name',\n codeBody: readFileSync('/path/to/contract.clar').toString(),\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network,\n anchorMode: AnchorMode.Any,\n};\n\nconst transaction = await makeContractDeploy(txOptions);\n\nconst broadcastResponse = await broadcastTransaction(transaction, network);\nconst txId = broadcastResponse.txid;\n```\n\n## Smart Contract Function Call\n\n```typescript\nimport {\n makeContractCall,\n broadcastTransaction,\n AnchorMode,\n FungibleConditionCode,\n makeStandardSTXPostCondition,\n bufferCVFromString,\n} from '@stacks/transactions';\nimport { StacksTestnet, StacksMainnet } from '@stacks/network';\n\n// for mainnet, use `StacksMainnet()`\nconst network = new StacksTestnet();\n\n// Add an optional post condition\n// See below for details on constructing post conditions\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 1000000n;\nconst postConditions = [\n makeStandardSTXPostCondition(postConditionAddress, postConditionCode, postConditionAmount),\n];\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [bufferCVFromString('foo')],\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n validateWithAbi: true,\n network,\n postConditions,\n anchorMode: AnchorMode.Any,\n};\n\nconst transaction = await makeContractCall(txOptions);\n\nconst broadcastResponse = await broadcastTransaction(transaction, network);\nconst txId = broadcastResponse.txid;\n```\n\nIn this example we construct a `contract-call` transaction with a post condition. We have set the `validateWithAbi` option to `true`, so the `makeContractCall` builder will attempt to fetch this contracts ABI from the specified Stacks network, and validate that the provided functionArgs match what is described in the ABI. This should help you avoid constructing invalid contract-call transactions. If you would prefer to provide your own ABI instead of fetching it from the network, the `validateWithABI` option also accepts [ClarityABI](https://github.com/blockstack/stacks-transactions-js/blob/master/src/contract-abi.ts#L231) objects, which can be constructed from ABI files like so:\n\n```typescript\nimport { ClarityAbi } from '@stacks/transactions';\nimport { readFileSync } from 'fs';\n\nconst abi: ClarityAbi = JSON.parse(readFileSync('abi.json').toString());\n// For sample abi json see: stacks.js/packages/transactions/tests/abi/test-abi.json\n```\n\n## Sponsoring Transactions\n\nTo generate a sponsored transaction, first create and sign the transaction as the origin. The `sponsored` property in the options object must be set to true.\n\n```typescript\nimport { bytesToHex } from '@stacks/common';\nimport { makeContractCall, BufferCV, AnchorMode, bufferCVFromString } from '@stacks/transactions';\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [bufferCVFromString('foo')],\n fee: 0,\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n validateWithAbi: true,\n sponsored: true,\n anchorMode: AnchorMode.Any,\n};\n\nconst transaction = await makeContractCall(txOptions);\nconst serializedTx = bytesToHex(transaction.serialize());\n```\n\nThe serialized transaction can now be passed to the sponsoring party which will sign the sponsor portion of the transaction and set the fee.\n\n```typescript\nimport {\n sponsorTransaction,\n BytesReader,\n deserializeTransaction,\n broadcastTransaction,\n} from '@stacks/transactions';\nimport { StacksTestnet, StacksMainnet } from '@stacks/network';\n\nconst bytesReader = new BytesReader(Buffer.from(serializedTx, 'hex'));\nconst deserializedTx = deserializeTransaction(bytesReader);\nconst sponsorKey = '770287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01';\nconst fee = 1000n;\n\nconst sponsorOptions = {\n transaction: deserializedTx,\n sponsorPrivateKey: sponsorKey,\n fee,\n sponsorNonce: 0,\n};\n\nconst sponsoredTx = await sponsorTransaction(sponsorOptions);\n\n// for mainnet, use `StacksMainnet()`\nconst network = new StacksTestnet();\n\nconst broadcastResponse = await broadcastTransaction(sponsoredTx, network);\nconst txId = broadcastResponse.txid;\n```\n\n## Supporting multi-signature transactions\n\nTo generate a multi-sig transaction, first create an unsigned transaction.\nThe `numSignatures` and `publicKeys` properties in the options object must be set:\n\n```typescript\nimport {\n makeUnsignedSTXTokenTransfer,\n createStacksPrivateKey,\n deserializeTransaction,\n pubKeyfromPrivKey,\n publicKeyToString,\n TransactionSigner,\n standardPrincipalCV,\n BytesReader,\n AnchorMode,\n} from '@stacks/transactions';\n\nconst recipient = standardPrincipalCV('SP3FGQ8...');\nconst amount = 2500000n;\nconst fee = 0n;\nconst memo = 'test memo';\n\n// private keys of the participants in the transaction\nconst privKeyStrings = ['6d430bb9...', '2a584d89...', 'd5200dee...'];\n\n// create private key objects from string array\nconst privKeys = privKeyStrings.map(createStacksPrivateKey);\n\n// corresponding public keys\nconst pubKeys = privKeyStrings.map(pubKeyfromPrivKey);\n\n// create public key string array from objects\nconst pubKeyStrings = pubKeys.map(publicKeyToString);\n\nconst transaction = await makeUnsignedSTXTokenTransfer({\n recipient,\n amount,\n fee,\n memo,\n numSignatures: 2, // number of signature required\n publicKeys: pubKeyStrings, // public key string array with >= numSignatures elements\n anchorMode: AnchorMode.Any,\n});\n\nconst serializedTx = transaction.serialize();\n```\n\nThis transaction payload can be passed along to other participants to sign. In addition to\nmeeting the numSignatures requirement, the public keys of the parties who did not sign the\ntransaction must be appended to the signature.\n\n```typescript\n// deserialize and sign transaction\nconst bytesReader = new BytesReader(serializedTx);\n// Partially signed or unsigned multi-sig tx can be deserialized to add the required signatures\nconst deserializedTx = deserializeTransaction(bytesReader);\n\nconst signer = new TransactionSigner(deserializedTx);\n\n// first signature\nsigner.signOrigin(privKeys[0]);\n\n// second signature\nsigner.signOrigin(privKeys[1]);\n\n// after meeting the numSignatures requirement, the public\n// keys of the participants who did not sign must be appended\nsigner.appendOrigin(pubKeys[2]);\n\n// the serialized multi-sig tx\nconst serializedSignedTx = deserializedTx.serialize();\n```\n\n## Calling Read-only Contract Functions\n\nRead-only contract functions can be called without generating or broadcasting a transaction. Instead it works via a direct API call to a Stacks node.\n\n```typescript\nimport { bufferCVFromString, callReadOnlyFunction } from '@stacks/transactions';\nimport { StacksTestnet } from '@stacks/network';\n\nconst contractAddress = 'ST3KC0MTNW34S1ZXD36JYKFD3JJMWA01M55DSJ4JE';\nconst contractName = 'kv-store';\nconst functionName = 'get-value';\nconst buffer = bufferCVFromString('foo');\nconst network = new StacksTestnet();\nconst senderAddress = 'ST2F4BK4GZH6YFBNHYDDGN4T1RKBA7DA1BJZPJEJJ';\n\nconst options = {\n contractAddress,\n contractName,\n functionName,\n functionArgs: [buffer],\n network,\n senderAddress,\n};\n\nconst result = await callReadOnlyFunction(options);\n```\n\n## Constructing Clarity Values\n\nBuilding transactions that call functions in deployed clarity contracts requires you to construct valid Clarity Values to pass to the function as arguments. The [Clarity type system](https://github.com/stacksgov/sips/blob/master/sip/sip-002-smart-contract-language.md#clarity-type-system) contains the following types:\n\n- `(tuple (key-name-0 key-type-0) (key-name-1 key-type-1) ...)` : a typed tuple with named fields.\n- `(list max-len entry-type)` : a list of maximum length max-len, with entries of type entry-type\n- `(response ok-type err-type)` : object used by public functions to commit their changes or abort. May be returned or used by other functions as well, however, only public functions have the commit/abort behavior.\n- `(optional some-type)` : an option type for objects that can either be (some value) or none\n- `(buff max-len)` : byte buffer or maximum length max-len.\n- `principal` : object representing a principal (whether a contract principal or standard principal).\n- `bool` : boolean value (`true` or `false`)\n- `int` : signed 128-bit integer\n- `uint`: unsigned 128-bit integer\n\nThis library contains Typescript types and classes that map to the Clarity types, in order to make it easy to construct well-typed Clarity values in Javascript. These types all extend the abstract class `ClarityValue`.\n\n```typescript\nimport {\n trueCV,\n falseCV,\n noneCV,\n someCV,\n intCV,\n uintCV,\n standardPrincipalCV,\n contractPrincipalCV,\n responseErrorCV,\n responseOkCV,\n listCV,\n tupleCV,\n bufferCV,\n} from '@stacks/transactions';\nimport { utf8ToBytes } from '@stacks/common';\n\n// construct boolean clarity values\nconst t = trueCV();\nconst f = falseCV();\n\n// construct optional clarity values\nconst nothing = noneCV();\nconst something = someCV(t);\n\n// construct a buffer clarity value from an existing byte array\nconst bytes = utf8ToBytes('foo'); // Uint8Array(3) [ 102, 111, 111 ]\nconst bufCV = bufferCV(bytes);\n\n// construct signed and unsigned integer clarity values\nconst i = intCV(-10);\nconst u = uintCV(10);\n\n// construct principal clarity values\nconst address = 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B';\nconst contractName = 'contract-name';\nconst spCV = standardPrincipalCV(address);\nconst cpCV = contractPrincipalCV(address, contractName);\n\n// construct response clarity values\nconst errCV = responseErrorCV(trueCV());\nconst okCV = responseOkCV(falseCV());\n\n// construct tuple clarity values\nconst tupCV = tupleCV({\n a: intCV(1),\n b: trueCV(),\n c: falseCV(),\n});\n\n// construct list clarity values\nconst l = listCV([trueCV(), falseCV()]);\n```\n\nIf you develop in Typescript, the type checker can help prevent you from creating wrongly-typed Clarity values. For example, the following code won't compile since in Clarity lists are homogeneous, meaning they can only contain values of a single type. It is important to include the type variable `BooleanCV` in this example, otherwise the typescript type checker won't know which type the list is of and won't enforce homogeneity.\n\n```typescript\nconst l = listCV<BooleanCV>([trueCV(), intCV(1)]);\n```\n\n## Post Conditions\n\nThree types of post conditions can be added to transactions:\n\n1. STX post condition\n2. Fungible token post condition\n3. Non-Fungible token post condition\n\nFor details see: https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-post-conditions\n\n## STX post condition\n\n```typescript\nimport {\n FungibleConditionCode,\n makeStandardSTXPostCondition,\n makeContractSTXPostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\n\nconst standardSTXPostCondition = makeStandardSTXPostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractSTXPostCondition = makeContractSTXPostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount\n);\n```\n\n## Fungible token post condition\n\n```typescript\nimport {\n FungibleConditionCode,\n createAssetInfo,\n makeStandardFungiblePostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardFungiblePostCondition = makeStandardFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst contractFungiblePostCondition = makeContractFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n```\n\n## Non-fungible token post condition\n\n> **Warning**\n> The Stacks blockchain's post-condition processor can NOT check ownership.\n> It checks whether or not a principal **will send** or **will not send** an NFT.\n> Post-conditions can NOT verify anything about the recipient of an asset.\n> If you want to verify conditions about asset recipients, you will need to use [Clarity](https://docs.stacks.co/docs/write-smart-contracts/).\n\n```typescript\nimport {\n NonFungibleConditionCode,\n createAssetInfo,\n makeStandardNonFungiblePostCondition,\n makeContractNonFungiblePostCondition,\n bufferCVFromString,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = NonFungibleConditionCode.DoesNotSend;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-asset';\nconst assetId = bufferCVFromString('test-token-asset-id');\nconst nonFungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardNonFungiblePostCondition = makeStandardNonFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractNonFungiblePostCondition = makeContractNonFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n```\n\n## Conversion of Clarity Values to JSON\n\nClarity Values represent values of Clarity contracts. If a JSON format is required the helper function `cvToJSON` can be used.\n\n```typescript\nimport { cvToJSON, hexToCV } from '@stacks/transactions';\n\ncvToJSON(hexToCV(tx.tx_result.hex));\n```"],[236,"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\nThe `@stacks/common` package contains common utilities for working with Stacks.\nThis includes fetch helpers, middleware, and various other functions.\n\n## Installation\n\n```package-install\n@stacks/common@latest\n```\n\n\n## Use the built-in API key middleware\n\nSome Stacks APIs make use API keys to provide less rate-limited plans.\n\n```typescript\nimport { createApiKeyMiddleware, createFetchFn, StacksMainnet } from '@stacks/network';\nimport { broadcastTransaction, getNonce, makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst myApiMiddleware = createApiKeyMiddleware('example_e8e044a3_41d8b0fe_3dd3988ef302');\nconst myFetchFn = createFetchFn(myApiMiddleware); // middlewares can be used to create a new fetch function\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n memo: 'some memo',\n anchorMode: AnchorMode.Any,\n client: {\n fetch: myFetchFn,\n }\n};\nconst transaction = await makeSTXTokenTransfer(txOptions); // fee-estimation will use the custom fetchFn\n\nconst response = await broadcastTransaction(transaction, myMainnet); // make sure to broadcast via the custom network object\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', myMainnet);\n```\n\n## Use custom middleware\n\nMiddleware can be used to hook into network calls before sending a request or after receiving a response.\n\n```typescript\nimport { createFetchFn, RequestContext, ResponseContext } from '@stacks/common';\n\nconst preMiddleware = (ctx: RequestContext) => {\n ctx.init.headers = new Headers();\n ctx.init.headers.set('x-foo', 'bar'); // override headers and set new `x-foo` header\n};\nconst postMiddleware = (ctx: ResponseContext) => {\n console.log(await ctx.response.json()); // log response body as json\n};\n\nconst fetchFn = createFetchFn({ pre: preMiddleware, post: preMiddleware }); // a middleware can contain `pre`, `post`, or both\nconst network = new StacksTestnet({ fetchFn });\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', network);\n```\n\n## Get various API URLs\n\n```typescript\nconst txBroadcastUrl = network.getBroadcastApiUrl();\n\nconst feeEstimateUrl = network.getTransferFeeEstimateApiUrl();\n\nconst address = 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26';\nconst accountInfoUrl = network.getAccountApiUrl(address);\n\nconst contractName = 'hello_world';\nconst abiUrl = network.getAbiApiUrl(address, contractName);\n\nconst functionName = 'hello';\nconst readOnlyFunctionCallUrl = network.getReadOnlyFunctionCallApiUrl(\n address,\n contractName,\n functionName\n);\n\nconst nodeInfoUrl = network.getInfoUrl();\n\nconst blockTimeUrl = network.getBlockTimeInfoUrl();\n\nconst poxInfoUrl = network.getPoxInfoUrl();\n```\n"],[370,"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\nThe `@stacks/common` package contains common utilities for working with Stacks.\nThis includes fetch helpers, middleware, and various other functions.\n\n## Installation\n\n```package-install\n@stacks/common@latest\n```\n\n\n## Use the built-in API key middleware\n\nSome Stacks APIs make use API keys to provide less rate-limited plans.\n\n```typescript\nimport { createApiKeyMiddleware, createFetchFn, StacksMainnet } from '@stacks/network';\nimport { broadcastTransaction, getNonce, makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst myApiMiddleware = createApiKeyMiddleware('example_e8e044a3_41d8b0fe_3dd3988ef302');\nconst myFetchFn = createFetchFn(myApiMiddleware); // middlewares can be used to create a new fetch function\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n memo: 'some memo',\n anchorMode: AnchorMode.Any,\n client: {\n fetch: myFetchFn,\n }\n};\nconst transaction = await makeSTXTokenTransfer(txOptions); // fee-estimation will use the custom fetchFn\n\nconst response = await broadcastTransaction(transaction, myMainnet); // make sure to broadcast via the custom network object\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', myMainnet);\n```\n\n## Use custom middleware\n\nMiddleware can be used to hook into network calls before sending a request or after receiving a response.\n\n```typescript\nimport { createFetchFn, RequestContext, ResponseContext } from '@stacks/common';\n\nconst preMiddleware = (ctx: RequestContext) => {\n ctx.init.headers = new Headers();\n ctx.init.headers.set('x-foo', 'bar'); // override headers and set new `x-foo` header\n};\nconst postMiddleware = (ctx: ResponseContext) => {\n console.log(await ctx.response.json()); // log response body as json\n};\n\nconst fetchFn = createFetchFn({ pre: preMiddleware, post: preMiddleware }); // a middleware can contain `pre`, `post`, or both\nconst network = new StacksTestnet({ fetchFn });\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', network);\n```\n\n## Get various API URLs\n\n```typescript\nconst txBroadcastUrl = network.getBroadcastApiUrl();\n\nconst feeEstimateUrl = network.getTransferFeeEstimateApiUrl();\n\nconst address = 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26';\nconst accountInfoUrl = network.getAccountApiUrl(address);\n\nconst contractName = 'hello_world';\nconst abiUrl = network.getAbiApiUrl(address, contractName);\n\nconst functionName = 'hello';\nconst readOnlyFunctionCallUrl = network.getReadOnlyFunctionCallApiUrl(\n address,\n contractName,\n functionName\n);\n\nconst nodeInfoUrl = network.getInfoUrl();\n\nconst blockTimeUrl = network.getBlockTimeInfoUrl();\n\nconst poxInfoUrl = network.getPoxInfoUrl();\n```\n"],[235,"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\nThe `@stacks/network` package contains default network configurations for Stacks.\n\n## Installation\n\n<Callout type=\"tip\">\nBefore you install: most of the time you don't need to use or even install this library directly.\nFor example, instead of `STACKS_MAINNET`, simply use the string `\"mainnet\"` as the network parameter.\n</Callout>\n\n```package-install\n@stacks/network@latest\n```\n\n## Usage\n\n## The network object\n\nA network in Stacks.js is an object defining several properties.\n\n```ts\nimport { STACKS_MAINNET, STACKS_TESTNET, STACKS_DEVNET } from '@stacks/network';\n\nconsole.log(STACKS_MAINNET);\n// {\n// chainId: 1,\n// transactionVersion: 0,\n// peerNetworkId: 385875968,\n// magicBytes: 'X2',\n// bootAddress: 'SP000000000000000000002Q6VF78',\n// addressVersion: { singleSig: 22, multiSig: 20 }\n// }\n```\n\n## Network usage in transaction building\n\n```ts\nimport { STACKS_MAINNET } from '@stacks/network';\nimport { makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst txOptions = {\n recipient: 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26',\n amount: 100,\n // ...\n network: 'mainnet', // 'mainnet', 'testnet', or 'devnet', (defaults to mainnet)\n // OR\n network: STACKS_MAINNET, // any compatible network object\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n```\n"],[369,"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\nThe `@stacks/network` package contains default network configurations for Stacks.\n\n## Installation\n\n<Callout type=\"tip\">\nBefore you install: most of the time you don't need to use or even install this library directly.\nFor example, instead of `STACKS_MAINNET`, simply use the string `\"mainnet\"` as the network parameter.\n</Callout>\n\n```package-install\n@stacks/network@latest\n```\n\n## Usage\n\n## The network object\n\nA network in Stacks.js is an object defining several properties.\n\n```ts\nimport { STACKS_MAINNET, STACKS_TESTNET, STACKS_DEVNET } from '@stacks/network';\n\nconsole.log(STACKS_MAINNET);\n// {\n// chainId: 1,\n// transactionVersion: 0,\n// peerNetworkId: 385875968,\n// magicBytes: 'X2',\n// bootAddress: 'SP000000000000000000002Q6VF78',\n// addressVersion: { singleSig: 22, multiSig: 20 }\n// }\n```\n\n## Network usage in transaction building\n\n```ts\nimport { STACKS_MAINNET } from '@stacks/network';\nimport { makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst txOptions = {\n recipient: 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26',\n amount: 100,\n // ...\n network: 'mainnet', // 'mainnet', 'testnet', or 'devnet', (defaults to mainnet)\n // OR\n network: STACKS_MAINNET, // any compatible network object\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n```\n"],[371,"\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\nimport { InlineCode } from '@/components/inline-code';\n\nBitcoin scopes are parameters you use to define the `if this` specification logic of your Chainhook on the Bitcoin blockchain. In other words, scopes specify what on-chain events you are looking to monitor and track. For more information on Chainhook design, please view [predicate design](/stacks/chainhook/concepts/predicate-design).\n\n<Root>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`txid`</h2>\n\nThe `txid` scope allows you to query transactions based on their transaction ID. This is particularly useful for tracking specific transactions or auditing transaction histories.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"equals\"} type={\"string\"}>\n\nThe `equals` property is a 32 byte hex encoded type used to specify the exact transaction ID to match.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By transaction ID</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"txid\",\n \"equals\": \"0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`outputs`</h2>\n\nThe `outputs` scope allows you to query blocks based on the payload returned by the specified operation.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"operation\"} type={\"object\"}>\n \nThe `operation` property is used to identify the Bitcoin operation that will trigger Chainhook as it observes Bitcoin transactions. The available operations are `op_return`, `p2pkh`, `p2sh`,`p2wpkh` and `p2wsh`.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"op_return\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"op_return\" className='tab group'>\n <Badge className='badge transition-colors'>Using op_return</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"p2kph\" className='tab group'>\n <Badge className='badge transition-colors'>Using p2pkh</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"p2sh\" className='tab group'>\n <Badge className='badge transition-colors'>Using p2sh</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"p2wpkh\" className='tab group'>\n <Badge className='badge transition-colors'>Using p2wpkh</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"p2wsh\" className='tab group'>\n <Badge className='badge transition-colors'>Using p2wsh</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"descriptor\" className='tab group'>\n <Badge className='badge transition-colors'>Using descriptor</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"op_return\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"op_return\": {\n \"equals\": \"0xbtc21000042stx016\"\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"equals\" type=\"string/32-byte encoded hex\">\n The `equals` property specifies the exact characters of the string or 32 byte encoded hex to match.\n </Property>\n <Property required={true} deprecated={false} name=\"starts_with\" type=\"string/32-byte encoded hex\">\n The `starts_with` property specifies the starting characters of the string or 32 byte encoded hex to match.\n </Property>\n <Property required={true} deprecated={false} name=\"ends_with\" type=\"string/32-byte encoded hex\">\n The `ends_with` property specifies the ending characters of the string or 32 byte encoded hex to match.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n The `op_return` operation allows for `equals`, `starts_with` and `ends_with` for matching against the desired input. \n </Callout>\n </TabsContent>\n <TabsContent value=\"p2kph\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2kph\": {\n \"equals\": \"0xbtc21000042stx016\"\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"equals\" type=\"string/32-byte encoded hex\">\n The `equals` property specifies the exact characters of the string or 32 byte encoded hex to match.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n `p2pkh`(Pay-to-Public-Key-Hash) is a Bitcoin transaction output script type that allows users to send funds to a recipient's hashed public key, providing security and privacy by concealing the actual public key.\n </Callout>\n </TabsContent>\n <TabsContent value=\"p2sh\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2sh\": {\n \"equals\": \"0xbtc21000042stx016\"\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"equals\" type=\"string/32-byte encoded hex\">\n The `equals` property specifies the exact characters of the string or 32 byte encoded hex to match.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n `p2sh`(Pay-to-Script-Hash) is a Bitcoin transaction output script type that enables users to send funds to a script instead of a public key, allowing for more complex transaction conditions and multi-signature addresses.\n </Callout>\n </TabsContent>\n <TabsContent value=\"p2wpkh\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2wpkh\": {\n \"equals\": \"0xbtc21000042stx016\"\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"equals\" type=\"string\">\n The `equals` property specifies the exact characters of the string to match.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n `p2wpkh`(Pay-to-Witness-Public-Key-Hash) is a Bitcoin transaction output script type used in Segregated Witness (SegWit) that allows for more efficient and secure transactions by separating the witness data from the transaction data and storing it in a separate block. \n </Callout>\n </TabsContent>\n <TabsContent value=\"p2wsh\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2wsh\": {\n \"equals\": \"0xbtc21000042stx016\"\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"equals\" type=\"string\">\n The `equals` property specifies the exact characters of the string to match.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n `p2wsh` (Pay-to-Witness-Script-Hash) is a Bitcoin transaction output script type used in Segregated Witness (SegWit) that enables users to send funds to a hashed script, allowing for more complex transaction conditions and greater scalability by separating the script from the transaction data.\n </Callout>\n </TabsContent>\n <TabsContent value=\"descriptor\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"descriptor\": {\n \"expression\": \"wpkh(tprv8ZgxMBicQKsPePxn6j3TjvB2MBzQkuhGgc6oRh2WZancZQgxktcnjZJ44XdsRiw3jNkbVTK9JW6KFHvnRKgAMtSyuBevMJprSkZ4PTfmTgV/84'/1'/0'/0/*)\",\n \"range\": [0, 3]\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"expression\" type=\"string\">\n The `expression` property specifies the exact characters of the string to match.\n </Property>\n <Property required={true} deprecated={false} name=\"range\" type=\"integer[]\">\n The `range` property specifies and array of integers representing the desired indexes.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n <Accordions>\n <Accordion title=\"Wallet descriptors\">\n Wallet descriptors provide a compact and semi-standardized method for describing how scripts and addresses within a wallet are generated. Chainhook users that want to track addresses derived from an extended pubkey or a multisig-wallet can now rely on this feature instead of defining one predicate per address.\n For example, let's say we wanted to track the first 3 addresses generated by the following descriptor:\n\n ```\n wpkh(tprv8ZgxMBicQKsPePxn6j3TjvB2MBzQkuhGgc6oRh2WZancZQgxktcnjZJ44XdsRiw3jNkbVTK9JW6KFHvnRKgAMtSyuBevMJprSkZ4PTfmTgV/84'/1'/0'/0/*)\n ```\n\n This descriptor reads: describe a P2WPKH output with the specified extended public key, and it produces these BIP84 addresses:\n\n ```\n bcrt1qzy2rdyvu8c57qd8exyyp0mw7dk5drsu9ewzdsu\n bcrt1qsfsjnagr29m8h3a3vdand2s85cg4cefkcwk2fy\n bcrt1qauewfytqe5mtr0xwp786r6fl39kmum2lr65kmj\n ```\n </Accordion>\n </Accordions>\n </Callout>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`stacks_protocol`</h2>\n\nThe `stacks_protocol` scope allows you query Bitcoin transactions related to the Stacks Proof of Transfer (PoT) [concensus mechanism](https://www.hiro.so/blog/securing-web3-apps-through-bitcoin-an-overview-of-stacks-consensus-mechanism).\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"operation\"} type={\"string\"}>\n\nThe `operation` property is used to identify the Stacks operation that will trigger Chainhook as it observes Bitcoin transactions. The available operations are `block_committed`, `leader_registered`, `inscription_feed`, `stx_transferred` and `stx_locked`.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"block_committed\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"block_committed\" className='tab group'>\n <Badge className='badge transition-colors'>Using block_committed</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"leader_registered\" className='tab group'>\n <Badge className='badge transition-colors'>Using leader_registered</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"inscription_feed\" className='tab group'>\n <Badge className='badge transition-colors'>Using inscription_feed</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"stx_transferred\" className='tab group'>\n <Badge className='badge transition-colors'>Using stx_transferred</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"stx_locked\" className='tab group'>\n <Badge className='badge transition-colors'>Using stx_locked</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"block_committed\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"stacks_protocol\",\n \"operation\": \"block_committed\"\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"leader_registered\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"stacks_protocol\",\n \"operation\": \"leader_registered\"\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"inscription_feed\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"stacks_protocol\",\n \"operation\": \"inscription_feed\"\n }\n }\n ```\n\n <Callout type=\"info\" title=\"Note\">\n `inscription_feed` observes the reveal and transfer of an Ordinal inscription.\n </Callout>\n </TabsContent>\n <TabsContent value=\"stx_transferred\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"stacks_protocol\",\n \"operation\": \"stx_transferred\"\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"stx_locked\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"stacks_protocol\",\n \"operation\": \"stx_locked\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n</Root>"],[373,"\nimport { SecondaryCard } from '@/components/card';\n\nChainhook is a reorg-aware indexer that serves reliable blockchain data—you don’t have to waste time reindexing your database every time there's a fork. Chainhook also lets you index only the data you need, which means you can build lighter databases, get faster query results, and deliver a better experience to your users.\n\nTo get started, check out our [installation guide](/stacks/chainhook/installation).\n\n## Create event streams\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/chainhook/guides/chainhook-as-a-service\"\n title=\"Create a Bitcoin chainhook\"\n description=\"Build a chainhook that indexes events on the Bitcoin blockchain.\"\n />\n <SecondaryCard\n href=\"/stacks/chainhook/guides/chainhook-as-a-service-with-stacks-node\"\n title=\"Create a Stacks chainhook\"\n description=\"Build a chainhook that indexes events on the Stacks blockchain.\"\n />\n <SecondaryCard\n href=\"/stacks/chainhook/guides/register-chainhooks-on-devnet\"\n title=\"Test your chainhooks\"\n description=\"Test and debug your chainhooks in a local environment.\"\n />\n</Cards>\n\n## Setting up Chainhook predicates\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/chainhook/concepts/bitcoin-predicates\"\n title=\"Bitcoin predicates\"\n description=\"A list of "if this, then that" logic for Bitcoin chainhooks.\"\n />\n <SecondaryCard\n href=\"/stacks/chainhook/concepts/stacks-predicates\"\n title=\"Stacks predicates\"\n description=\"A list of "if this, then that" logic for Bitcoin chainhooks.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Bitcoin Indexer](/bitcoin/indexer)**: Simplify your testing with the Clarinet JS SDK.\n- **[Hiro Platform](/stacks/platform)**: A developer platform for building, deploying and scaling Bitcoin apps.\n\n<br />\n\n<Callout title=\"Need help building with Chainhook?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#chainhook</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>"],[2,"\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>"],[203,"\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>"],[204,"\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>"],[225,"\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>"],[347,"\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>"],[349,"\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>"],[350,"\nimport { SecondaryCard } from '@/components/card';\n\nStacks Connect is a JavaScript library that can authenticate the identity of your users and prompt them to sign transactions and messages. In other words, Stacks Connect handles some of the most basic functions you need in a web app, including enabling users to log in to your app as well as broadcasting in-app transactions to the Stacks network.\n\n## Installation\n\n```package-install\n@stacks/connect\n```\n\n## Guides\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/connect/guides/authenticate-users\"\n title=\"Authenticate users\"\n description=\"Connect to user wallets and authenticate their on-chain identity.\"\n />\n <SecondaryCard\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Enable users to interact with smart contracts through your app.\"\n />\n <SecondaryCard\n href=\"/stacks/connect/guides/sign-messages\"\n title=\"Sign messages\"\n description=\"Prompt users to sign and verify messages.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in the go-to development environment on Stacks.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n- **[Stacks.js](/stacks/stacks.js)**: A collection of JavaScript libraries to build web applications on Stacks.\n\n<br />\n\n<Callout title=\"Need help building with Stacks Connect?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#stacks-js</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>"],[8,"\nimport { SecondaryCard } from '@/components/card';\n\nThe Clarinet JS SDK allows you to write unit tests for your Clarity smart contracts. You can theoretically use any JavaScript test framework, but the SDK supports Vitest out of the box. This SDK leverages `simnet`, a simulated network that offers a rapid feedback loop for initial testing.\n\nHere is a non-exhaustive list of some of simnet's use-cases:\n\n- Call public and read-only functions from smart contracts\n- Get Clarity maps or data-var values\n- Get contract interfaces (available functions and data)\n- Write unit tests for Clarity smart contracts\n\n<Callout title=\"Requirements\" type=\"warn\">\n The SDK requires Node.js >= 18.0 and NPM to be installed.\n</Callout>\n\n## Guides\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Simulate a blockchain with Clarinet JS SDK\"\n description=\"Learn how to interact with a simulated network without running a node.\"\n />\n <SecondaryCard\n href=\"/stacks/clarinet-js-sdk/guides/migrate-to-the-clarinet-sdk\"\n title=\"Migrate v1 tests to Clarinet JS SDK\"\n description=\"Learn how to migrate your existing tests to the Clarinet JS SDK.\"\n />\n <SecondaryCard\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"SDK reference\"\n description=\"Dive deeper into the methods, properties, and types available in the Clarinet JS SDK.\" />\n</Cards>\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>"],[459,"\nimport { SecondaryCard } from '@/components/card';\n\nThe Ordinals API is a service that helps you with the complete ingestion of ordinals inscription data. Using our endpoints, you can retrieve metadata for a particular inscription, trading activity, all inscriptions held by a particular address, and more.\n\nThe Ordinals API uses REST endpoints and cached responses in order to optimize performance and reduce unnecessary requests. Start integrating ordinals and BRC-20 tokens into your app with one of the most reliable APIs on the market today.\n\n## Popular endpoints\n\n<Cards>\n <SecondaryCard\n href=\"/bitcoin/ordinals/api/inscriptions/get-inscription-content\"\n title=\"Fetch Ordinals content\"\n description=\"Retrieve all metadata related to individual inscriptions.\"\n />\n <SecondaryCard\n href=\"/bitcoin/ordinals/api/brc20/get-brc20-tokens\"\n title=\"Integrate BRC-20 tokens\"\n description=\"Retrieve all metadata related to BRC-20 tokens.\"\n />\n <SecondaryCard\n href=\"/bitcoin/ordinals/api/inscriptions/get-inscriptions\"\n title=\"Showcase user portfolios\"\n description=\"Get all inscriptions held by particular addresses.\"\n />\n <SecondaryCard\n href=\"/bitcoin/ordinals/api/satoshis/get-satoshi\"\n title=\"Retrieve data for a specific satoshi\"\n description=\"Get all inscription data related to a particular satoshi.\"\n />\n <SecondaryCard\n href=\"/bitcoin/ordinals/api/inscriptions/get-transfers-per-block\"\n title=\"Graph marketplace activity\"\n description=\"Pull all transfers from a specific block.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Bitcoin Indexer](/bitcoin/indexer)**: Want to run your own infra? [Set up your own Bitcoin Indexer](/bitcoin/indexer), the indexer that powers the Ordinals API.\n- **[Ordinals Explorer](https://ordinals.hiro.so/)**: The Ordinals API powers Hiro’s Ordinals Explorer, which lets you rapidly discover inscriptions and verify on-chain activity.\n\n<br />\n\n<Callout title=\"Need help building with the Ordinals API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#ordinals</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n"],[31,"\nimport { SecondaryCard } from '@/components/card';\n\nThe Platform API unlocks powerful automation opportunities in your application code, development and CI scripts, and more, via a familiar REST interface.\n\nIn particular, this API lets you programmatically create, update, query, and delete chainhooks as well as interact with a platform-hosted devnet from your local machine.\n\nWhen you create a Platform account, you'll automatically receive an API key that's required to use these endpoints. You can also create additional API keys in the [Hiro Platform](/stacks/api-keys) as needed.\n\n## Popular endpoints\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/platform-api/devnet/stacks-blockchain-api\"\n title=\"Query devnet API endpoints\"\n description=\"Query Stacks API endpoints for data related to your devnet.\"\n />\n <SecondaryCard\n href=\"/stacks/platform-api/devnet/start\"\n title=\"Start a devnet service\"\n description=\"Start a hosted devnet through the Platform API.\"\n />\n <SecondaryCard\n href=\"/stacks/platform-api/chainhooks/create\"\n title=\"Create a chainhook\"\n description=\"Create a chainhook through the Platform API.\"\n />\n</Cards>\n\n\n## Related tools\n\n- **[Hiro Platform](/stacks/platform)**: A developer platform for building, deploying and scaling Bitcoin apps.\n- **[Chainhook](/stacks/chainhook)**: You don't need the platform to create event streams. Leverage chainhook independently, so your app can react to on-chain events in real time.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch on-chain data from the Stacks blockchain.\n- **[Token Metadata API](/stacks/token-metadata-api)**: Fetch fungible and non-fungible token data on the Stacks blockchain.\n\n<br />\n\n<Callout title=\"Need help building with the Platform API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#hiro-platform</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n\n"],[208,"\nimport { SecondaryCard } from '@/components/card';\n\nThe Signer Metrics API enables you to monitor signers on the Stacks network. With a familiar REST interface, you can easily fetch information about the signer network, such as lists of active signers in a particular PoX cycle and signer information for a particular block. \n\nThis API also lets you analyze and evaluate the behavior of individual signers, such as their block acceptance rate, their average block push time, and more.\n\n## Popular endpoints\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/signer-metrics-api/signers/pox-cycle-signers\"\n title=\"Get a list of signers\"\n description=\"Fetches a list of signers in a given PoX cycle.\"\n />\n <SecondaryCard\n href=\"/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block\"\n title=\"Get signer information for a block\"\n description=\"Fetches aggregated signer information for a specific block.\"\n />\n <SecondaryCard\n href=\"/stacks/signer-metrics-api/prometheus/metrics\"\n title=\"Query for Prometheus metrics\"\n description=\"Fetch behavioral data around individual signers and block proposals\"\n />\n</Cards>\n\n## Related tools\n\n- **[Stacks Blockchain API](/stacks/api)**: Fetch richer data from Hiro's Stacks Blockchain API.\n- **[Stacks Node RPC API](/stacks/rpc-api)**: Query the Stacks Node RPC API, interact with smart contracts, and broadcast transactions all via a familiar REST interface.\n- **[Token Metadata API](/stacks/token-metadata-api)**: Fetch fungible and non-fungible token data on the Stacks blockchain.\n\n<br />\n\n<Callout title=\"Need help building with the Stacks Node RPC API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#api</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n"],[257,"\nimport { SecondaryCard } from '@/components/card';\n\nThe Stacks Blockchain API expands the intentionally minimal RPC endpoints available in Stacks nodes and indexes, cleans, and enriches on-chain data to put everything you need at your fingertips. Who knew getting reliable blockchain data could be this easy?\n\n## Popular endpoints\n\n<Callout title=\"RPC endpoints\" type=\"info\">\nIf you're looking for direct access to the Stacks node, including the ability to broadcast transactions and interact with smart contracts, check out our [Stacks Node RPC](/stacks/rpc-api) documentation.\n</Callout>\n\n<Callout title=\"Need help building with the Stacks Blockchain API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#api</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n"],[345,"\nimport { SecondaryCard } from '@/components/card';\n\nThe Stacks Blockchain API expands the intentionally minimal RPC endpoints available in Stacks nodes and indexes, cleans, and enriches on-chain data to put everything you need at your fingertips. Who knew getting reliable blockchain data could be this easy?\n\n## Popular endpoints\n\n<Callout title=\"RPC endpoints\" type=\"info\">\nIf you're looking for direct access to the Stacks node, including the ability to broadcast transactions and interact with smart contracts, check out our [Stacks Node RPC](/stacks/rpc-api) documentation.\n</Callout>\n\n<Callout title=\"Need help building with the Stacks Blockchain API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#api</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n"],[399,"\nimport { SecondaryCard } from '@/components/card';\n\nThe Stacks Node RPC API allows you to query the Stacks blockchain and interact with smart contracts. Note: this is not a Hiro-maintained service. This RPC API is generated by every Stacks node and allows you to self-host your own node and API. This is a minimalist configuration. For a richer data set and an API that is easier to use, try [Hiro's Stacks Blockchain API](/stacks/api).\n\n## Popular endpoints\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/rpc-api/transactions/broadcast-transaction\"\n title=\"Broadcast transaction\"\n description=\"Broadcast a transaction to the Stacks network.\"\n />\n <SecondaryCard\n href=\"/stacks/rpc-api/smart-contracts/read-only\"\n title=\"Call smart contracts\"\n description=\"Call a read-only public function on a smart contract.\"\n />\n <SecondaryCard\n href=\"/stacks/rpc-api/pox/pox-details\"\n title=\"Retrieve PoX protocol details\"\n description=\"Get Proof of Transfer (PoX) details, including cycles and stacking thresholds.\"\n />\n \n</Cards>\n\n## Related tools\n\n- **[Stacks Blockchain API](/stacks/api)**: Fetch richer data from Hiro's Stacks Blockchain API.\n- **[Token Metadata API](/stacks/token-metadata-api)**: Fetch fungible and non-fungible token data on the Stacks blockchain.\n- **[Stacks Explorer](https://explorer.hiro.so)**: Verify activity on the Stacks blockchain with an easy-to-use front end.\n\n<br />\n\n<Callout title=\"Need help building with the Stacks Node RPC API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#api</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n"],[54,"\nimport { SecondaryCard } from '@/components/card';\n\nThe Token Metadata API is a service that offers a REST API, so you can easily pull any data you need for any token on Stacks that follows SIP standards. Every token, one request away.\n\n## Popular endpoints\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/token-metadata-api/tokens/fungible-token-metadata\"\n title=\"Get data for fungible tokens\"\n description=\"Retrieve data related to fungible tokens.\"\n />\n <SecondaryCard\n href=\"/stacks/token-metadata-api/tokens/non-fungible-token-metadata\"\n title=\"Get data for non-fungible tokens\"\n description=\"Retrieve data related to non-fungible tokens.\"\n />\n <SecondaryCard\n href=\"/stacks/token-metadata-api/tokens/semi-fungible-token-metadata\"\n title=\"Get data for semi-fungible tokens\"\n description=\"Retrieve data related to semi-fungible tokens.\"\n />\n</Cards>\n\n\n## Related tools\n\n- **[Hiro Archive](/stacks/archive)**: Bootstrap your own instance of the Token Metadata API with the Hiro Archive and save days of setup time.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch on-chain data from the Stacks blockchain.\n- **[Stacks Explorer](https://explorer.hiro.so)**: Looking for a simpler way to verify token data on the Stacks blockchain? Try the Stacks Explorer.\n- **[Ordinals API](/bitcoin/ordinals/api)**: Get data for Bitcoin ordinals and BRC-20 tokens.\n\n<br />\n\n<Callout title=\"Need help building with the Token Metadata API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#api</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n\n"],[502,"\nimport { SecondaryCard } from '@/components/card';\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\n\nThe Bitcoin Indexer is a reorg-aware indexer that automatically handles chain forks, so you don't need to waste time or resources reindexing your database yourself.\n\nYou can customize what ordinals data you index in order to create lightweight databases for faster query responses and a better user experience.\n\n## Installation\n\n```terminal\n$ git clone https://github.com/hirosystems/bitcoin-indexer.git\n$ cd bitcoin-indexer\n$ cargo bitcoin-indexer-install\n```\n\nAlternatively, you can use Docker images from [Docker Hub](https://hub.docker.com/r/hirosystems/bitcoin-indexer).\n\n## Get started\n\n<Cards>\n <SecondaryCard\n href=\"/bitcoin/indexer/quickstart\"\n title=\"Quickstart\"\n description=\"Learn how to scan for Bitcoin activity using the Bitcoin Indexer.\"\n />\n</Cards>\n\n## System Requirements\n\nBefore running the indexer, ensure your system meets these requirements:\n\n- **CPU**: Multi-core support for parallel processing\n- **Memory**: Minimum 16GB RAM\n- **Storage**: SSD or NVMe recommended\n- **OS**: Support for 4096+ open file descriptors\n- **Postgres**: Version 17+ recommended\n\n## Related tools\n\n- **[Ordinals API](/bitcoin/ordinals/api)**: Skip the infrastructure setup and get the ordinals data you need from our Ordinals API, which is powered by the Bitcoin Indexer.\n- **[Ordinals Explorer](https://ordinals.hiro.so/)**: Explore ordinals inscriptions and BRC-20 tokens rapidly in our Ordinals Explorer.\n\n<br />\n\n<Callout title=\"Need help building with the Bitcoin Indexer?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#indexer</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n"],[420,"\nimport { SecondaryCard, SmallCard } from '@/components/card';\nimport { API, Container, Chainhook, BitcoinIcon } from '@/components/ui/icon';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n className=\"group\"\n icon={<API className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/bitcoin/ordinals/api\"\n title=\"Integrate ordinals data into your app\"\n description=\"Use the Ordinals API to get reliable data for Ordinals and BRC-20 tokens.\"\n tag='Ordinals API'\n />\n <SecondaryCard\n className=\"group\"\n icon={<Chainhook className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/bitcoin/indexer\"\n title=\"Stream custom blockchain events\"\n description=\"Use the Bitcoin Indexer to filter and stream for contract deployments.\"\n tag='Bitcoin Indexer'\n />\n <SecondaryCard\n className=\"group\"\n icon={<API className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/bitcoin/runes/api\"\n title=\"Get Runes data\"\n description=\"Use Runes API to get reliable data for Runes.\"\n tag='Runes API'\n />\n</Cards>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n"],[241,"\nimport { Star } from 'lucide-react';\n\nTypically, we speak of `mainnet` and `testnet` as the networks of Stacks.\nMost wallets are configured to `mainnet` by default—this is the production environment, the actual blockchain that holds real STX tokens.\n\nAs the name suggests, `testnet` is a public network for testing.\nIt's a separate blockchain state that holds test tokens, which have no value.\n\nFor completeness we also mention `devnet`.\nThis isn't \"one\" network, but how developers refer to ephemeral local networks used for testing.\nIt is the same as `testnet`, but for local development.\n[Learn more](/stacks/clarinet/guides/run-a-local-devnet).\n\n## Setting the network\n\nMost Stacks.js functions accept a `network` parameter or an optional last argument.\n\nThe `network` type is a string, and can be one of:\n- `'mainnet'` (default)\n- `'testnet'`\n- `'devnet'`\n- `'mocknet'` (alias of `devnet`)\n\n### Examples\n\nNetwork in transaction signing:\n```ts\nconst tx = makeSTXTokenTransfer({\n // ...\n network: 'testnet',\n});\n```\n\nNetwork in address derivation:\n```ts\nconst address = privateKeyToAddress(privateKey, 'devnet');\n// ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP\n```\n\n<Callout type=\"tip\">\n For more advanced uses, you can pass an object of a network configuration.\n Read more about the network object in the [`@stacks/network`](/stacks/stacks.js/packages/network) package.\n</Callout>\n"],[422,"\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\n\nRunehook is a reorg-aware indexer that automatically handles chain forks, so you don’t need to waste time or resources reindexing your database yourself.\n\nWith a familiar event-driven framework, you can customize what Rune data you index in order to create lightweight databases for faster query responses and a better user experience.\n\n### Create event streams\n\n\n### Related tools\n\n- **[Runes API](/bitcoin/runes/api)**: Skip the infrastructure setup and get the runes data you need from our Runes API, which is powered by Runehook.\n- **[Ordinals Explorer](/ordinals/explorer)**: Explore Ordinals inscriptions and BRC-20 tokens rapidly in our Ordinals Explorer.\n\n---\n\n_Need help building with Runehook?_ Reach out to us on the `#chainhook` channel on Discord under **Hiro Developer Tools** section. We also host a weekly office hours on Discord every Monday at 11am ET.\n"],[377,"\nimport { Step, Steps } from \"fumadocs-ui/components/steps\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\nThe _json`contract_call`_ predicate scope is designed to target direct function calls within a smart contract. When triggered, Chainhook will return a payload with transaction data detailing the on-chain events contained in these functions.\n\nIn this guide, you will learn how to:\n\n1. [Build a predicate to target the `cast-vote` function](#creating-the-predicate).\n2. [Scan the Stacks blockchain using your predicate](#running-the-predicate).\n3. [Use a Clarity function to return specific contract data](#return-contract-data-with-the-clarity-function).\n4. [Find data related to the contract call within the Chainhook payload](#chainhook-payload).\n\n<Callout type=\"warn\" title=\"Requirements\">\n To follow this guide, make sure you have installed Chainhook [directly](/stacks/chainhook/installation).\n</Callout>\n\n<Steps>\n<Step>\n\n## Create the predicate\n\nThe `predicate` is your main interface for querying the Chainhook data indexer. Chainhook uses this predicate to select the appropriate blockchain, network, and scope for monitoring transactions.\n\nFor the Stacks blockchain, run the following command to generate a `predicate` template:\n\n```terminal\n$ chainhook predicates new contract-call-chainhook.json --stacks\n```\n\n<Callout title=\"Note\">\n Alternatively, [Hiro Platform](https://platform.hiro.so/) has an excellent UI to help you to create a `predicate` using a form builder or upload a json file containing your `predicate`.\n</Callout>\n\nThere are 3 main components to your `predicate` that you need to address:\n\n1. Targeting the appropriate blockchain and network\n2. Defining the scope and targeting the function you want to observe\n3. Defining the payload destination\n\nTo begin, you need to configure the `predicate` to target the voting contract:\n\n- Specify `testnet` in the network object.\n- Set the `start_block` property to <TooltipProvider inline><Tooltip><TooltipTrigger asChild><span className='cursor-default border-dotted border-b border-primary'>21443</span></TooltipTrigger><TooltipContent>This value represents the block height that our voting contract was deployed at.</TooltipContent></Tooltip></TooltipProvider>.\n\n```json contract-call-chainhook.json\n{\n \"chain\": \"stacks\",\n \"uuid\": \"1\",\n \"name\": \"Contract-Call-Chainhook\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"start_block\": 21443,\n \"decode_clarity_values\": true,\n \"expire_after_occurrence\": 1,\n // ...\n }\n }\n}\n```\n\nNext, define the scope of the `predicate` within the `if_this` specification.\n\nThe `contract_call` scope allows Chainhook to observe blockchain data when the specified function is directly called from its contract.\n\n```json contract-call-chainhook.json\n{\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n }\n}\n```\n\n<Callout type=\"warn\" title=\"Warning\">\n The function defined in the `method` property of your `predicate` must be directly called in order for Chainhook to observe events. Calling the function from another contract or from within a different function on the same contract will not generate a `payload`. Below is an example of a `cast-vote` function that would not trigger an event.\n ```clarity\n (define-public (call-cast-vote)\n (cast-vote)\n )\n ```\n</Callout>\n\nFinally, define how Chainhook delivers the payload when it is triggered by your `predicate` using the `then_that` specification. \n\nUsing `file_append`, specify the path where Chainhook will post the payload data.\n\n```json contract-call-chainhook.json\n{\n \"then_that\": {\n \"file_append\": {\n \"path\": \"/tmp/events.json\"\n }\n }\n}\n```\n\n<Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"full-predicate\">\n <AccordionTrigger>Full predicate file</AccordionTrigger>\n <AccordionContent>\n ```json\n {\n \"chain\": \"stacks\",\n \"uuid\": \"1\",\n \"name\": \"Contract-Call-Chainhook\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"start_block\": 21443,\n \"decode_clarity_values\": true,\n \"expire_after_occurrence\": 1,\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"/tmp/events.json\"\n }\n }\n }\n }\n }\n ```\n </AccordionContent>\n </AccordionItem>\n</Accordion>\n\n<Callout title=\"Note\">\n\n For more details on optional configurations, other predicate elements and scopes, check out the [Predicate Design](/stacks/chainhook/concepts/predicate-design) and [Stacks scopes](/stacks/chainhook/references/scopes/stacks) pages.\n\n</Callout>\n\n</Step>\n<Step>\n\n## Scan the predicate\n\nWith your `predicate` set up, you can now scan for blocks that match the `contract_call` scope and analyze the returned payload.\n\nChainhook will track events where this function is directly invoked and deliver detailed transaction data at the block level, based on your configuration.\n\nTo scan the Stacks blockchain using your predicate, run the following command, replacing `/path/to/contract-call-chainhook.json` with the actual path to your `contract-call-chainhook.json` file:\n\n```terminal\n$ chainhook predicates scan /path/to/contract-call-chainhook.json --testnet\n```\n\n<Callout title=\"Note\">\n If you are using Platform, creating your Chainhook will automatically begin the scan for you.\n</Callout>\n\n</Step>\n<Step>\n\n## Return contract data with the Clarity function\n\nThe _clarity`cast-vote`_ function records a vote by storing the address that calls it. It also logs relevant data using the _clarity`print`_ function, which can be useful for when you want to track additional on-chain events that are not part of the built-in Clarity functions.\n\nWhen you examine the `payload`, this is the data you will look for.\n\n```clarity simple-vote-v0.clar\n(define-public (cast-vote)\n (begin\n ;; Check if the voter has already voted.\n (asserts! (is-none (map-get? UserVotes tx-sender)) (err ERR_ALREADY_VOTED))\n\n ;; Update the map that the vote has been cast. Print vote related data.\n (map-set UserVotes tx-sender { hasVoted: true })\n (var-set VoteCount (+ (var-get VoteCount) u1))\n (print\n {\n notification: \"cast-vote\",\n payload: {\n status: \"Has voted set to true\",\n voter: tx-sender,\n totalVotes: (get-total-votes)\n }\n }\n )\n (ok \"Vote cast successfully\")\n )\n)\n```\n\n<Callout title=\"Note\">\n This contract has been deployed to the Stacks [testnet network](https://explorer.hiro.so/txid/0x312a3c559af0f75381a9eb4540912c310d74682ed3036207ec890ad8cd1aebe6?chain=testnet) under the name `STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0`.\n</Callout>\n\n</Step>\n<Step>\n\n## Dive deeper into the Chainhook payload\n\nWhen triggered by your predicate, the `payload` returned by Chainhook is a standarized, block level observation in json format.\n\nWithin the `apply` arrays element, the `block_identifer` object gives us the `index` for the observed block height.\n\n```json contract-call-payload.json\n\"block_identifier\": {\n \"hash\": \"0x4d88015a6df9ec4f6df875941d87337ce64f8d51608563f80b6e27adeb327e4d\",\n \"index\": 21544\n}\n```\n\n<Callout type=\"warn\" title=\"Warning\">\n The hash returned in the `block_identifer` object is not that block hash you\n would see in [Stacks Explorer](https://explorer.hiro.so/?chain=testnet), but\n `index_block_hash` returned from the Stacks API's [get\n block](/stacks/api/blocks/get-block) endpoint. You can use the `apply` array's\n metadata object to get the `stacks_block_hash`.\n</Callout>\n\nWe can retrieve the `stacks_block_hash` by navigating to the `apply` arrays object `metadata` element. This hash will match the block hash display in the Stacks Explorer.\n\n```json contract-call-payload.json\n\"apply\": [\n {\n \"metadata\": {\n \"stacks_block_hash\": \"0x4ad36f77ff76042f3b7355006556375970b0f99d1232b14a3b4a2eadda4a806a\"\n }\n }\n]\n```\n\nThere is also a `timestamp` value returned in the `apply` array. This UNIX time stamp represents the initiation of the Stacks block.\n\n```json contract-call-payload.json\n\"timestamp\": 1722208524\n```\n\n<Callout type=\"warn\" title=\"Warning\">\n The timestamp returned in this object is not the finalized block time you\n would see in the [Stacks Explorer](https://explorer.hiro.so/?chain=testnet), but\n `block_time` returned from the Stacks API's [get\n block](/stacks/api/blocks/get-block) endpoint.\n</Callout>\n\n### Transaction object\n\nBecause Chainhook is triggered on the block level, we will receive a single response that contains data specific to each `transaction` that matches your predicate's `contract_call` scope.\n\nTo find this data, we start with the `apply` array element of the `payload` object. The single object that makes up the `apply` array contains a child element, the `transactions` array. Every `transaction` will be represents by a single object within this array. This `transaction` object contains its own children elements which can be seen in the example below.\n\n```json\n{\n \"apply\": [\n {\n \"transactions\": [\n {\n \"transaction_identifier\": { ... },\n \"metdata\": { ... },\n \"operations\": [],\n }\n ],\n }\n ],\n \"rollback\": [ ... ],\n \"chainhook\": { ... }\n}\n```\n\nOnce the `transaction` object is returned, we can begin examining the important data elements this object contains. The first element, `transaction_identifier`, includes a hash value that uniquely identifies your transaction.\n\n```json contract-call-payload.json\n\"transaction_identifier\": {\n \"hash\": \"0x98195af8f888d2f9ca3462c41c1691e7798ea6d9e5e3afe42955c0921f981f2c\"\n}\n```\n\nNext, focus on the `metadata` object within your `contract_call` data. It's crucial to determine the success state of your transaction. Chainhook captures and reports on transactions regardless of their outcome.\n\nUtilize the `success` object to assess transaction success and extract the `sender` of the transaction and the `result` returned by the contract.\n\n```json contract-call-payload.json\n\"metadata\": {\n \"success\": true,\n \"sender\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV\",\n \"result\": \"(ok \\\"Vote cast successfully\\\")\"\n}\n```\n\nMoving forward, examine the `kind` object and its components within your `contract_call`. The data object contains crucial information:\n\n- `contract_identifier` specifies the contract your function resides in\n- `method` identifies the function called\n- `args` lists the arguments passed when invoking this function\n\nIn this case, the `cast-vote` function accepts no arguments, resulting in an empty `args` array.\n\n```json contract-call-payload.json\n{\n \"metadata\":\n \"kind\": {\n \"data\": {\n \"args\": [],\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n }\n }\n}\n```\n\nIn the `metadata` object's `receipt`, the `events` array holds the key data for your `contract_call`.\n\nSince the `cast-vote` function uses a `print` statement, the events array will contain `topic` and `value` keys representing the data output.\n\n```json contract-call-payload.json\n{\n \"metadata\":\n \"receipt\": {\n \"contract_calls_stack\": [],\n \"events\": [\n {\n \"data\": {\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"topic\": \"print\",\n \"value\": {\n \"notification\": \"cast-vote\",\n \"payload\": {\n \"status\": \"Has voted set to true\",\n \"totalVotes\": 1,\n \"voter\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV\"\n }\n }\n },\n \"position\": {\n \"index\": 0\n },\n \"type\": \"SmartContractEvent\"\n }\n ],\n \"mutated_assets_radius\": [],\n \"mutated_contracts_radius\": [\n \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\"\n ]\n }\n}\n```\n\n<Callout type=\"info\">\n You can view the full [contract-call-payload.json](/contract-call-payload.json) here.\n</Callout>\n\n</Step>\n</Steps>\n\n---\n\nNow that you've located the relevant data in the payload, you can start to extract the relevant information into your API.\n\nThe following is an example of how you might store your information in a database table:\n\n| Block Height | Timestamp | Transaction Identifier | Success | Sender | Result | Args | Contract Identifier | Function | Value |\n| ------------ | ---------- | ------------------------------------------------------------------ | ------- | ---------------------------------------- | ----------------------------- | ---- | ------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 21544 | 1722208524 | 0x98195af8f888d2f9ca3462c41c1691e7798ea6d9e5e3afe42955c0921f981f2c | True | STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV | (ok \"Vote cast successfully\") | [] | STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0 | cast-vote | \\{\"notification\": \"cast-vote\", \"payload\": \\{\"status\": \"Has voted set to true\", \"totalVotes\": 1, \"voter\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV\"\\}\\} |\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/platform/guides/create-chainhooks\"\n title=\"Create a Chainhook\"\n description=\"Learn how to create a Chainhook using the Hiro Platform.\"\n />\n <Card\n href=\"/stacks/chainhook/references/scopes/stacks\"\n title=\"Stacks scopes\"\n description=\"Learn how to use additional scopes to scan for specific Stacks blockchain events.\"\n />\n</Cards>\n"],[355,"\nimport { Steps, Step } from 'fumadocs-ui/components/steps'\n\n\nFor a while now, the Stacks community has been working on a new standard for wallet-to-dapp communication.\nStacks Connect and related projects now use standards like [WBIPs](https://wbips.netlify.app/) and [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) to allow wallets to communicate with dapps in a more simplified and flexible way.\n\n<Callout title=\"Migration Status\">\nPlease be patient during this latest migration.\nThere has been a long-running effort together with wallets to modernize and move forward the Stacks web ecosystem.\nIt is now culminating in [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) and the new `request` method in Stacks Connect `8.x.x`.\nBear with us during this migration.\nWallets are still working through some bugs, details, and improvements.\n\n_Feel free to continue using Stacks Connect `7.x.x` while things stabilize._\nThe `7.x.x` version may still be more well supported by some wallets.\n\nFor the legacy version of `@stacks/connect` using JWT tokens, you can use:\n\n```sh\nnpm install @stacks/connect@7.10.1\n```\n\n</Callout>\n\n## Deprecations\n\nThe following classes, methods, and types are deprecated in favor of the new `request` RPC methods:\n\n- `show...` and `open...` methods\n- `authenticate` method\n- `UserSession` class and related functionality\n- `AppConfig` class\n- `SessionOptions` interface\n- `SessionData` interface\n- `UserData` interface\n- `SessionDataStore` class\n- `InstanceDataStore` class\n- `LocalStorageStore` class\n\n<Callout title=\"Backwards Compatibility\">\nTo make migrating easier, the familiar `UserSession` & `AppConfig` class still exists and is semi-backwards compatible for the `8.x.x` release.\nIt will \"cache\" the user's address in local storage and allow access to it via the `loadUserData` method (as previously done).\n</Callout>\n\n## Migration Steps\n\nTo update from `<=7.x.x` to latest/`8.x.x`, follow these steps:\n\n<Steps>\n <Step title=\"Update your @stacks/connect version\">\n ```sh\n npm install @stacks/connect@latest\n ```\n </Step>\n\n <Step title=\"Replace Legacy Methods with request\">\n Switch from `showXyz`, `openXyz`, `doXyz` methods to the `request` method:\n\n - `request` follows the pattern `request(method: string, params: object)`, see [Usage](#usage) for more details\n - `request` is an async function, so replace the `onFinish` and `onCancel` callbacks with `.then().catch()` or `try & await`\n\n Examples:\n - `showConnect()`, `authenticate()` → `connect()`\n - `useConnect().doContractCall({})` → `request(\"stx_callContract\", {})`\n - `openContractDeploy()` → `request(\"stx_deployContract\", {})`\n </Step>\n\n <Step title=\"Use Connect Instead of ShowConnect/Authenticate\">\n Switch from `showConnect` or `authenticate` to `connect()` methods:\n\n - `connect()` is an alias for `request({forceWalletSelect: true}, 'getAddresses')`\n - `connect()` by default caches the user's address in local storage\n </Step>\n\n <Step title=\"Update Authentication State Management\">\n - Switch from `UserSession.isSignedIn()` to `isConnected()`\n - Switch from `UserSession.signUserOut()` to `disconnect()`\n </Step>\n\n <Step title=\"Remove Legacy Code\">\n - Remove code referencing deprecated methods (`AppConfig`, `UserSession`, etc.)\n - Remove the `@stacks/connect-react` package\n - You may need to manually reload a component to see local storage updates\n - No custom hooks are needed to use Stacks Connect anymore\n - We are working on a new `@stacks/react` package that will make usage even easier in the future (e.g., tracking transaction status, reloading components when a connection is established, updating the page when the network changes, and more)\n </Step>\n</Steps>\n\n## Address Access\n\nPreviously, the `UserSession` class was used to access the user's addresses and data, which abstracted away the underlying implementation details.\nNow, the `request` method is used to directly interact with the wallet, giving developers more explicit control and clarity over what's happening under the hood.\nThis manual approach makes the wallet interaction more transparent and customizable.\nDevelopers can manually manage the currently connected user's address in e.g. local storage, jotai, etc. or use the `connect()`/`request()` method to cache the address in local storage.\n\n<Callout title=\"Security Note\">\nFor security reasons, the `8.x.x` release only returns the current network's address (where previously both mainnet and testnet addresses were returned).\n</Callout>\n"],[504,"\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\n\nIn this quickstart guide, you will set up the Bitcoin Indexer to index Ordinals or Runes activity on the Bitcoin blockchain.\n\n<Steps>\n <Step title=\"Install Bitcoin Indexer\">\n Clone the repository and install the indexer:\n ```terminal\n $ git clone https://github.com/hirosystems/bitcoin-indexer.git\n $ cd bitcoin-indexer\n $ cargo bitcoin-indexer-install\n ```\n </Step>\n\n <Step title=\"Configure the Indexer\">\n Generate a new configuration file:\n ```terminal\n $ bitcoin-indexer config new\n ```\n \n Configure your Postgres database in the generated TOML file:\n ```toml\n [ordinals.db]\n database = \"metaprotocols\"\n host = \"localhost\"\n port = 5432\n username = \"postgres\"\n password = \"postgres\"\n ```\n </Step>\n\n <Step title=\"Start the Indexer\">\n Run the following command to start indexing Ordinals activity:\n ```terminal\n $ bitcoin-indexer ordinals service start --config-path <path>\n ```\n \n For Runes indexing, use:\n ```terminal\n $ bitcoin-indexer runes service start --config-path <path>\n ```\n </Step>\n</Steps>\n\n<Callout type=\"info\">\n A fully synced Bitcoin node is required for indexing to start.\n</Callout>\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/ordinals/explorer\"\n title=\"Ordinals Explorer\"\n description=\"Explore the Ordinals Explorer to view inscriptions and transfers.\"\n />\n <Card\n href=\"/bitcoin/ordinals/api\"\n title=\"Ordinals API\"\n description=\"Learn how to interact with Ordinals data using our API.\"\n />\n <Card\n href=\"/bitcoin/runes/api\" \n title=\"Runes API\"\n description=\"Explore our Runes blockchain API documentation.\"\n />\n</Cards>"],[510,"\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\n<Tabs id=\"docker\" items={['macOS', 'Windows']}>\n <Tab value=\"macOS\">\n 1. Go to the [Docker Desktop for Mac](https://www.docker.com/products/docker-desktop/) page.\n 2. Download the .dmg file.\n 3. Open the downloaded .dmg file.\n 4. Drag the Docker icon to the Applications folder.\n 5. Open Docker from the Applications folder.\n 6. Grant the necessary permissions if prompted.\n 7. Docker Desktop icon will appear in the menu bar indicating that Docker is running.\n \n To verify installation, run `docker --version` in your terminal. You should see the Docker version information.\n </Tab>\n \n <Tab value=\"Windows\">\n 1. Go to the [Docker Desktop for Windows](https://www.docker.com/products/docker-desktop/) page.\n 2. Download the executable.\n 3. Run the downloaded executable.\n 4. Follow the installation wizard steps (you may need to restart your computer).\n 5. Ensure the WSL 2 (Windows Subsystem for Linux) backend is checked during installation, if applicable.\n 6. Open Docker Desktop from the Start menu.\n 7. Grant the necessary permissions if prompted.\n 8. Docker icon will appear in the system tray indicating Docker is running.\n\n To verify installation, run `docker --version` in your terminal. You should see the Docker version information.\n \n <Callout title=\"Windows installation\">\n You might need to install additional Windows components like Hyper-V or WSL 2.\n </Callout>\n </Tab>\n</Tabs>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Learn how to sync a Bitcoin node for running Chainhook as a service.\"\n />\n <Card\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Learn how to sync a Stacks node for running a local devnet.\"\n />\n</Cards>"],[51,"\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThis feature goes beyond just security—it's also a way to better understand how your contracts are being used. You can also set up alerts for various public functions in your smart contract to gain insight on which functions are receiving the most calls and how users are interacting with your contract.\n\n## Set up contract monitoring\n\n<Callout title=\"Note\">\n Make sure to have successfully deployed your contracts to the Stacks mainnet if you plan on setting up alert monitoring for your own contracts.\n</Callout>\n\nIf you have successfully deployed your contracts or want to set up alert monitoring for other contracts on mainnet, toggle to the Monitor tab after logging into the [Hiro Platform](https://platform.hiro.so).\n\n![Start monitoring](../images/contract-monitoring/start-monitoring.png)\n\n## Add contract for monitoring\n\nAfter clicking on the 'Add contract' button, a slideout modal will appear with fields for you to look up any smart contract on mainnet using the contract's principal and contract name. All contracts deployed to mainnet are public, and you can monitor and set up alerts for any of them, regardless of whether you are the deployer.\n\nAlternatively, you can also connect your wallet to view your deployment history and choose any contracts you’ve previously deployed in order to set up alerts for them.\n\n![Add contract](../images/contract-monitoring/add-contract.png)\n\nYour contract will then appear under Contract Monitoring. Once you are monitoring a particular contract, you can view its transaction history and any pending transactions in the mempool. Click on \"Create an alert\" to create a specific alert you want to monitor for. \n\n![Added contract](../images/contract-monitoring/added-contract.png)\n\n## Add custom alert\n\nYou can configure alerts for any contract calls on mainnet, whether that’s a `set-contract-owner` function, a transfer/mint/burn function, or anything else you’ve implemented that you want to monitor.\n\nOnce you identify the function calls you want to monitor, you can further hone in on the specific calls by creating filters for argument values and the address of the wallet which called the function. \n\nThe specific conditions you can choose to monitor for include:\n\n- When a particular function is called\n- When a particular function is called with a specified argument\n- When a particular function is called by a specified address\n\nYou can monitor these alerts in the Hiro Platform, and you can also choose to receive email alerts every time one of those alerts is triggered. Alternatively, you can configure webhook calls, which can be used for all kinds of customized alerting flows.\n\n![Create alert form](../images/contract-monitoring/create-alert-form.png)\n\n## Monitor your alerts\n\nWith each alert you set up, you can view the alert’s history and the response status from any webhook calls made. You also have the ability to edit existing alerts to change your alert conditions or notification preferences at any time.\n\n![View alerts page](../images/contract-monitoring/view-alerts-page.png)\n\n## What to expect from alerts\n\nIf you've specified an email as the notification type, alert notification emails will come from Hiro Platform `<platform@hiro.so>`.\n\nIf you've specified a webhook to send an alert to an API endpoint, then the alert payload will look like `sample-alert-payload.json` below.\n\n<Callout type=\"info\">\n Note that `tx_status` will always return a \"pending\" status for monitor alert notifications. This is because contract monitoring alerts will only send notifications when your custom notification alert on a particular function hits the mempool, but not when it gets confirmed in the blockchain.\n</Callout>\n\n<Tabs items={['Sample Alert Payload', 'Alert Payload Interface']}>\n <Tab value=\"Sample Alert Payload\">\n ```json sample-alert-payload.json\n {\n \"tx_id\": \"0xa7f511b3f379efef6fe71d0de57712ed13a89c5b6e24dd049eb2cc9a7c24fcb5\",\n \"nonce\": 5,\n \"fee_rate\": \"250\",\n \"sender_address\": \"SP2W9QYAHJNS7YTQY9EK2MSTQGX9E2NDMV766JP9Z\",\n \"sponsored\": false,\n \"post_condition_mode\": \"deny\",\n \"post_conditions\": [\n {\n \"type\": \"stx\",\n \"condition_code\": \"sent_equal_to\",\n \"amount\": \"3000000\",\n \"principal\": {\n \"type_id\": \"principal_standard\",\n \"address\": \"SP2W9QYAHJNS7YTQY9EK2MSTQGX9E2NDMV766JP9Z\"\n }\n }\n ],\n \"anchor_mode\": \"any\",\n \"tx_status\": \"pending\",\n \"receipt_time\": 1726104636,\n \"receipt_time_iso\": \"2024-09-12T01:30:36.000Z\",\n \"tx_type\": \"contract_call\",\n \"contract_call\": {\n \"contract_id\": \"SPHW0EJK5KPDMK03ZX792EMP0Q5J3A39ZMTVZZCY.sample-contract\",\n \"function_name\": \"donate\",\n \"function_signature\": \"(define-public (donate (amount uint)))\",\n \"function_args\": [\n {\n \"hex\": \"0x01000000000000000000000000002dc6c0\",\n \"repr\": \"u3000000\",\n \"name\": \"amount\",\n \"type\": \"uint\"\n }\n ]\n }\n }\n ```\n </Tab>\n <Tab value=\"Alert Payload Interface\">\n ```ts title=\"sample-alert-interface.ts\"\n interface Body {\n tx_id: string;\n nonce: number;\n fee_rate: string;\n sender_address: string;\n sponsored: boolean;\n post_condition_mode: string;\n post_conditions: Postcondition[];\n anchor_mode: string;\n tx_status: string;\n receipt_time: number;\n receipt_time_iso: string;\n tx_type: string;\n contract_call: Contractcall;\n }\n interface Contractcall {\n contract_id: string;\n function_name: string;\n function_signature: string;\n function_args: Functionarg[];\n }\n interface Functionarg {\n hex: string;\n repr: string;\n name: string;\n type: string;\n }\n interface Postcondition {\n type: string;\n condition_code: string;\n amount: string;\n principal: Principal;\n }\n interface Principal {\n type_id: string;\n address: string;\n }\n ```\n </Tab>\n</Tabs>"],[247,"\nimport ApiKeysContent from '@/content/_shared/api-keys.mdx';\n\n<ApiKeysContent components={props.components} />\n"],[467,"\nimport ApiKeysContent from '@/content/_shared/api-keys.mdx';\n\n<ApiKeysContent components={props.components} />\n"],[512,"\nimport ApiKeysContent from '@/content/_shared/api-keys.mdx';\n\n<ApiKeysContent components={props.components} />\n"],[1,"\nimport ContributorsGuideContent from '@/content/_shared/contributors-guide.mdx';\n\n<ContributorsGuideContent components={props.components} />\n"],[419,"\nimport ContributorsGuideContent from '@/content/_shared/contributors-guide.mdx';\n\n<ContributorsGuideContent components={props.components} />\n"],[506,"\nimport ContributorsGuideContent from '@/content/_shared/contributors-guide.mdx';\n\n<ContributorsGuideContent components={props.components} />\n"],[508,"\nimport Link from \"fumadocs-core/link\";\nimport { ImageZoom } from 'fumadocs-ui/components/image-zoom';\nimport { SecondaryCard } from \"@/components/card\"\nimport guidesImage from '@/public/guides.svg';\nimport data from '@/lib/all-guides.json';\n\n<div className='flex flex-col space-y-10'>\n <div className='flex space-x-6 items-end'>\n <ImageZoom\n alt=\"banner\"\n src={guidesImage}\n className=\"mt-0 mb-6 first-line:rounded-xl bg-background\"\n priority\n />\n </div>\n\n <Cards>\n {data.guides.map(guide => {\n return (\n <SecondaryCard\n key={guide.title}\n href={guide.href}\n title={guide.title}\n description={guide.description}\n />\n )\n })}\n </Cards>\n</div>"],[45,"\nimport Link from \"next/link\";\nimport { Button } from \"@/components/ui/button\"\n\nThe Hiro Platform is your all-in-one solution for building and scaling Bitcoin applications. It provides essential tools including API key management, customizable data streams, production-ready app templates, dedicated testing environments, and onchain monitoring and analytics - everything developers need to bring their Bitcoin apps to life.\n\n<Button className=\"bg-orange-500 hover:bg-orange-600\">\n <Link\n target=\"_blank\"\n href=\"https://platform.hiro.so/\"\n className=\"no-underline\"\n >\n Get started on the platform\n </Link>\n</Button>\n\n![Projects](./images/o1.png)\n\n## Guides\n\n<Cards>\n\n<Card\n href=\"/stacks/platform/guides/create-chainhooks\"\n title=\"Create event streams with Chainhook\"\n description=\"Create and manage webhook-like triggers that react to on-chain events in real time.\"\n/>\n\n{\" \"}\n\n<Card\n href=\"/stacks/platform/guides/deploy-contracts\"\n title=\"Deploy your contracts\"\n description=\"Deploy your project with customizable deployment plans that can handle contract dependencies.\"\n/>\n\n<Card \n href=\"/stacks/platform/guides/devnet\"\n title=\"Iterate quickly with devnet\"\n description=\"Leverage devnet, a private instance of the blockchain, for rapid feedback loops and a better debugging experience.\"\n/>\n\n<Card \n href=\"/stacks/platform/guides/contract-monitoring\"\n title=\"Monitor your contract activity\"\n description=\"Set up monitoring for your smart contracts with customizable alerts to track on-chain activity after deployment.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build and deploy smart contracts locally on your device with Clarinet.\n- **[Chainhook](/stacks/chainhook)**: You don’t need the platform to create event streams. Leverage chainhook independently, so your app can react to on-chain events in real time.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel. Build faster with a JS library that handles basic functions.\n\n<br />\n\n<Callout title=\"Need help building with the Hiro Platform?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#hiro-platform</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n"],[443,"\nimport Link from \"next/link\";\nimport { Button } from \"@/components/ui/button\"\n\nThe Ordinals Explorer lets you explore and verify Bitcoin Ordinals and BRC-20 token data. You can also use a variety of filters to discover inscriptions. We maintain and support the [Ordinals Explorer](https://ordinals.hiro.so) as a service for the community, but you can also run your own instance of the explorer if you so choose.\n\n<div className=\"flex gap-4\">\n <Button className=\"bg-orange-500 hover:bg-orange-600\">\n <a href=\"https://ordinals.hiro.so\" target=\"_blank\" className=\"no-underline\">\n View Ordinals Explorer\n </a>\n </Button>\n <Button variant=\"outline\">\n <Link\n href=\"/bitcoin/explorer/guides/build-explorer\"\n className=\"no-underline\"\n >\n Set up your own explorer\n </Link>\n </Button>\n</div>\n\n## Related tools\n\n- **[Ordinals API](/bitcoin/ordinals/api)**: Looking for on-chain data without the front end? Leverage the Ordinals API.\n- **[Stacks Explorer](https://explorer.hiro.so)**: Looking for a front end to verify activity on the Stacks blockchain? Try the Stacks Explorer.\n\n---\n\nNeed help building with the Ordinals Explorer? Reach out to us on the `#ordinals` channel on Discord under the [Hiro Developer Tools section](https://stacks.chat/). There’s also a [weekly office hours](https://events.stacks.co/event/HD16484710) on Discord every Thursday at 11am ET.\n"],[425,"\nimport Link from \"next/link\";\nimport { Button } from \"@/components/ui/button\"\n\nThe Ordinals Explorer lets you explore and verify Bitcoin Ordinals and BRC-20 token data. You can also use a variety of filters to discover inscriptions. We maintain and support the [Ordinals Explorer](https://ordinals.hiro.so) as a service for the community, but you can also run your own instance of the explorer if you so choose.\n\n<div className=\"flex gap-4\">\n <Button className=\"bg-orange-500 hover:bg-orange-600\">\n <a href=\"https://ordinals.hiro.so\" target=\"_blank\" className=\"no-underline\">\n View Ordinals Explorer\n </a>\n </Button>\n <Button variant=\"outline\">\n <Link\n href=\"/bitcoin/explorer/guides/build-explorer\"\n className=\"no-underline\"\n >\n Set up your own explorer\n </Link>\n </Button>\n</div>\n\n### Related tools\n\n- **[Ordinals API](/bitcoin/ordinals/api)**: Looking for on-chain data without the front end? Leverage the Ordinals API.\n- **[Stacks Explorer](https://explorer.hiro.so)**: Looking for a front end to verify activity on the Stacks blockchain? Try the Stacks Explorer.\n\n---\n\nNeed help building with the Ordinals Explorer? Reach out to us on the `#ordinals` channel on Discord under the [Hiro Developer Tools section](https://stacks.chat/). There’s also a [weekly office hours](https://events.stacks.co/event/HD16484710) on Discord every Thursday at 11am ET.\n"],[74,"\nimport Link from \"next/link\";\nimport { Button } from \"@/components/ui/button\"\n\nThe Stacks Explorer lets you explore on-chain data, troubleshoot pending transactions, edit and deploy contracts via the sandbox, discover new tokens, and more. We maintain and support the [Stacks Explorer](https://explorer.hiro.so) as a service for the community, but you can also run your own instance of the explorer.\n\n<div className=\"flex gap-4\">\n <Button className=\"bg-orange-500 hover:bg-orange-600\">\n <a href=\"https://explorer.hiro.so\" target=\"_blank\" className=\"no-underline\">\n View Stacks Explorer\n </a>\n </Button>\n {/* <Button variant=\"outline\">\n <Link\n href=\"/stacks/explorer/guides/build-explorer\"\n className=\"no-underline\"\n >\n Set up your own explorer\n </Link>\n </Button> */}\n</div>\n\n## Related tools\n\n- **[Stacks Blockchain API](/stacks/api)**: Looking for on-chain data without the front end? Leverage the Stacks Blockchain API.\n- **[Ordinals Explorer](/bitcoin/explorer)**: Explore Bitcoin Ordinals and BRC-20 tokens via the Ordinals Explorer.\n\n---\n\nNeed help building with Stacks Explorer? Reach out to us on the `#stacks-explorer` channel on Discord under the [Hiro Developer Tools section](https://stacks.chat/). There’s also a [weekly office hours](https://events.stacks.co/event/HD16484710) on Discord every Thursday at 11am ET.\n"],[3,"\nimport RateLimitingContent from '@/content/_shared/rate-limiting.mdx';\n\n<RateLimitingContent components={props.components} />\n"],[421,"\nimport RateLimitingContent from '@/content/_shared/rate-limiting.mdx';\n\n<RateLimitingContent components={props.components} />\n"],[507,"\nimport RateLimitingContent from '@/content/_shared/rate-limiting.mdx';\n\n<RateLimitingContent components={props.components} />\n"],[376,"\nIn order to build out a more robust and secure web app, you can run Chainhook as a service to stream your events continously to a server you designate.\n\nIn this guide, you will learn how to:\n\n1. [Configure an existing Bitcoin node to work with Chainhook](#configure-an-existing-bitcoin-node-to-work-with-chainhook).\n2. [Generate a Chainhook predicate to target specific transactions](#generate-a-chainhook-predicate-to-target-specific-transactions).\n3. [Scan the Bitcoin blockchain for transactions that match your predicate](#scan-the-bitcoin-blockchain-for-transactions-that-match-your-predicate).\n4. [Initiate a Chainhook service to watch for matching transactions](#initiate-a-chainhook-service-to-watch-for-matching-transactions).\n5. [Dynamically register your predicate with Chainhook](#dynamically-register-your-predicate-with-chainhook).\n\n---\n\n## Configure Chainhook\n\nIn this section, you will configure Chainhook to match the network configurations with the bitcoin config file. First, [install the latest version of Chainhook](/stacks/chainhook/installation).\n\nNext, you will generate a `Chainhook.toml` file to connect Chainhook with your bitcoind node. Navigate to the directory where you want to generate the `Chainhook.toml` file and use the following command in your terminal:\n\n```terminal\n$ chainhook config generate --mainnet\n```\n\nSeveral network parameters in the generated `Chainhook.toml` configuration file need to match those in the `bitcoin.conf` file created earlier in the [setting up a Bitcoin node](/guides/sync-a-bitcoin-node) section. Update the following parameters accordingly:\n\n1. Update `bitcoind_rpc_username` with the username set for `rpcuser` in `bitcoin.conf`.\n2. Update `bitcoind_rpc_password` with the password set for `rpcpassword` in `bitcoin.conf`.\n3. Update `bitcoind_rpc_url` with the same host and port used for `rpcport` in `bitcoin.conf`.\n\nAdditionally, if you want to receive events from the configured Bitcoin node, substitute `stacks_node_rpc_url` with `bitcoind_zmq_url`, as follows:\n\n```toml\n[storage]\nworking_dir = \"cache\"\n\n# The http API allows you to register / deregister predicates dynamically.\n# This is disabled by default.\n\n# [http_api]\n# http_port = 20456\n# database_uri = \"redis://localhost:6379/\"\n\n[network]\nmode = \"mainnet\"\nbitcoind_rpc_url = \"http://localhost:8332\"\nbitcoind_rpc_username = \"devnet\"\nbitcoind_rpc_password = \"devnet\"\n# Bitcoin block events can be received by Chainhook\n# either through a Bitcoin node's ZeroMQ interface,\n# or through the Stacks node. The Stacks node is\n# used by default:\n# stacks_node_rpc_url = \"http://localhost:20443\"\n# but zmq can be used instead:\nbitcoind_zmq_url = \"tcp://0.0.0.0:18543\"\n\n[limits]\nmax_number_of_bitcoin_predicates = 100\nmax_number_of_concurrent_bitcoin_scans = 100\nmax_number_of_stacks_predicates = 10\nmax_number_of_concurrent_stacks_scans = 10\nmax_number_of_processing_threads = 16\nmax_number_of_networking_threads = 16\nmax_caching_memory_size_mb = 32000\n\n[[event_source]]\ntsv_file_url = \"https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest\"\n```\n\nHere is a table of the relevant parameters this guide changes in our configuration files.\n\n| bitcoin.conf | Chainhook.toml |\n| :--------------- | :--------------------- |\n| rpcuser | bitcoind_rpc_username |\n| rpcpassword | bitcoind_rpc_password |\n| rpcport | bitcoind_rpc_url |\n| zmqpubhashblock | bitcoind_zmq_url |\n\n## Scan the blockchain based on predicates\n\nNow that your `bitcoind` and Chainhook configurations are complete, you can define the Chainhook [Bitcoin predicate scope](/stacks/chainhook/references/scopes/bitcoin) you would like to scan for.\n\nThese predicates are where you specify the `if_this / then_that` pattern to trigger Chainhook to deliver a result (either a file appendation or an HTTP POST request).\n\n## Appending events to a file\n\nTo generate a sample JSON file with predicates, execute the following command in your terminal:\n\n```terminal\n$ chainhook predicates new stacking-pool.json --bitcoin\n```\n\nReplace the contents of the `stacking-pool.json` file with the following:\n\n```json\n{\n \"chain\": \"bitcoin\",\n \"uuid\": \"1\",\n \"name\": \"Stacking Pool\",\n \"version\": 1,\n \"networks\": {\n \"mainnet\": {\n \"start_block\": 801500,\n \"end_block\": 802000,\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2wpkh\": {\n \"equals\": \"bc1qs0kkdpsrzh3ngqgth7mkavlwlzr7lms2zv3wxe\"\n }\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"bitcoin-transactions.txt\"\n }\n }\n }\n }\n}\n```\n\nThis example demonstrates scanning a portion of the Bitcoin blockchain to capture specific outputs from a Bitcoin address associated with a Stacking pool, in this case [Friedgar Pool](https://pool.friedger.de/). Notice the `then_that` predicate specifying a `file_append`.\n\n<Callout title=\"Note\">\nYou can get blockchain height and current block by referring to the [Stacks Explorer](https://explorer.hiro.so/blocks?chain=mainnet).\n</Callout>\n\nNow, use the following command to scan the blocks based on the predicates defined in the `stacking-pool.json` file.\n\n```terminal\n$ chainhook predicates scan stacking-pool.json --config-path=./Chainhook.toml\n```\n\nThe output of the above command will be a text file `bitcoin-transactions.txt` generated based on the predicate definition.\n\n## Sending events to an API endpoint\n\nNow you will generate another sample predicate, but this time you will send the payload to an API endpoint:\n\n```terminal\n$ chainhook predicates new stacking-pool-api.json --bitcoin\n```\n\nReplace the contents of the `stacking-pool-api.json` file with the following:\n\n```json\n{\n \"chain\": \"bitcoin\",\n \"uuid\": \"2\",\n \"name\": \"Stacking Pool (API)\",\n \"version\": 1,\n \"networks\": {\n \"mainnet\": {\n \"start_block\": 801500,\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2wpkh\": {\n \"equals\": \"bc1qs0kkdpsrzh3ngqgth7mkavlwlzr7lms2zv3wxe\"\n }\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://localhost:3000/events\",\n \"authorization_header\": \"12345\"\n }\n }\n }\n }\n}\n```\n\n<Callout title=\"Note\">\nThe `start_block` is a required field when using the `http_post` `then_that` predicate.\n</Callout>\n\nOnce you are finished setting up your endpoint, use the following command to scan the blocks based on the predicates defined in the `stacking-pool-api.json` file.\n\n```terminal\n$ chainhook predicates scan stacking-pool-api.json --config-path=./Chainhook.toml\n```\n\nThe above command posts events to the URL `http://localhost:3000/events`, mentioned in the JSON file.\n\n## Initiate Chainhook service\n\nIn the examples above, your Chainhook scanned historical blockchain data against predicates and delivered results. In this next section, you will learn how to set up a Chainhook that acts as an ongoing observer and event-streaming service.\n\nYou can start a Chainhook service with an existing predicate. You can also dynamically register new predicates by making an API call to your chainhook. In both of these instances, your predicates will be delivering their results to a server set up to receive results.\n\nInitiate the chainhook service by passing the predicate path to the command as shown below:\n\n```terminal\n$ chainhook service start --predicate-path=stacking-pool-api.json --config-path=Chainhook.toml\n```\n\nThe above command registers the predicate based on the predicate definition in the `stacking-pool-api.json` file.\n\n## Dynamically register predicates\n\nYou can also dynamically register new predicates with your Chainhook service. This means you can start a long-running process that exposes HTTP endpoints to register, deregister, and report on new predicates.\n\n<Callout title=\"Requirements\" type=\"warn\">\nThis section requires that you have Redis running locally. To install, refer to the [Redis documentation](https://redis.io/docs/getting-started/).\n</Callout>\n\nFirst, ensure that the following lines of code are uncommented in the `Chainhook.toml` file to enable the predicate registration server:\n\n```toml\n[http_api]\nhttp_port = 20456\ndatabase_uri = \"redis://localhost:6379/\"\n```\n\nIf you have an instance of Redis running locally, you can now start the Chainhook service by running the following command:\n\n```terminal\n$ chainhook service start --config-path=Chainhook.toml\n```\n\nTo dynamically register a new predicate, send a POST request to the running predicate registration server at `localhost:20456/v1/chainhooks`.\n\nUse the following `curl` command template as an example:\n\n```terminal\n$ curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -d @predicate.json \\\n http://localhost:20456/v1/chainhooks\n\n{\"result\":\"<uuid>\",\"status\":200}\n```\n\n<Callout title=\"Note\">\nYou can also run chainhook service by passing multiple predicates, ie `chainhook service start --predicate-path=predicate_1.json --predicate-path=predicate_2.json --config-path=Chainhook.toml`\n</Callout>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/register-chainhooks-on-devnet\"\n title=\"Register Chainhooks on devnet\"\n description=\"Learn how to register Chainhooks on devnet.\"\n />\n <Card\n href=\"/stacks/chainhook/references/scopes/bitcoin\"\n title=\"Bitcoin scopes\"\n description=\"Learn how to use scopes to scan for specific Bitcoin blockchain events.\"\n />\n</Cards>"],[258,"\nIn order to prevent \"stuck\" transactions, you must track the next available nonce for principals issuing transactions. The\nStacks Blockchain API provides an endpoint to make nonce handling simpler when using the following command:\n\n```terminal\n$ curl 'https://api.testnet.hiro.so/extended/v1/address/<principal>/nonces'\n```\n\n```json\n{\n \"last_executed_tx_nonce\": 5893,\n \"last_mempool_tx_nonce\": null,\n \"possible_next_nonce\": 5894,\n \"detected_missing_nonces\": []\n}\n```\n\nThe `possible_next_nonce` property is the nonce suggested for a given principal's next transaction. It is derived as the next integer to the largest nonce found in blocks and mempool. It does not take into account missing nonces.\n\nThe `detected_missing_nonces` property finds any non-contiguous nonces after inspecting transactions from blocks and the mempool. For example, for a given principal, if the latest transaction included in a block has a nonce of 5, and the's only one transaction in the mempool with nonce 7, then it indicates that something likely went wrong with transaction with nonce 6 (either it was not created or broadcasted correctly by a client, or it was dropped for whatever reason). This is a strong indication that the mempool transaction with nonce 7 will never be mined since the previous nonce is missing.\n\nClients that continue to broadcast transactions with the `possible_next_nonce` property of 8, then 9, then 10, will likely result in all of their pending/mempool transactions never going through. For all transactions go through, clients should first use any missing nonces before using the suggested `possible_next_nonce`.\n"],[238,"\nIn Stacks, transactions can have *post-conditions*.\n\nThese offer additional security to ensure a transaction was executed as expected.\n\nMore precisely, adding post-conditions to a transaction can ensure that:\n\n- STX tokens were transferred from an address\n- FTs/NFTs were transferred from an address\n\n<Callout title=\"Info\">\nPost-conditions aren't perfect. They can't say anything about the end-state after a transaction. In other words, they can't guarantee the receipt of FTs/NFTs, since they only check for sending.\n</Callout>\n\nHere's an example of a post-condition using the `Pc` helper, where the `principal` must send 1000 uSTX, or else the transaction will abort:\n\n```ts -n\nimport { Pc } from '@stacks/transactions';\n\nconst tx = await makeContractCall({\n // ...\n postConditions: [\n Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6').willSendEq(1000).ustx(),\n ],\n});\n```\n\nIf you prefer to write the post-condition manually, you can do so using the following approach:\n\n```ts -n\nimport { StxPostCondition, FungiblePostCondition, NonFungiblePostCondition } from '@stacks/transactions';\n// STX post-condition\nconst stxPostCondition: StxPostCondition = {\n type: 'stx-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'gte', // 'eq' | 'gt' | 'gte' | 'lt' | 'lte'\n amount: '100',\n};\n\n// Fungible token post-condition\nconst ftPostCondition: FungiblePostCondition = {\n type: 'ft-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'eq', // 'eq' | 'gt' | 'gte' | 'lt' | 'lte'\n amount: '100',\n asset: 'SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-ft-token::my-token',\n};\n\n// Non-fungible token post-condition\nconst nftPostCondition: NonFungiblePostCondition = {\n type: 'nft-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'sent', // 'sent' | 'not-sent'\n asset: 'SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-nft::my-asset',\n assetId: Cl.uint(602),\n};\n```\n\n## Post-condition mode\n\nIn addition to the post-condition itself, we can also specify a `mode` for the transaction to verify asset transfers.\nThe mode can be either `Allow` or `Deny`.\n\n- `Allow` means that the transaction can transfer any asset (assuming no conflicting post-conditions).\n- `Deny` means the transaction will fail if any asset transfers (not specified in the post-conditions) are attempted.\n\n<Callout>\nIn either case, all post-conditions will still be checked.\nBy default, transactions are set to `Deny` mode for additional security.\n</Callout>"],[246,"\nIn this guide, you will learn how to:\n\n1. Migrate your existing Clarinet projects to the Clarinet SDK.\n2. Run your existing tests using the Clarinet SDK.\n\n<Callout title=\"Note\">\nThis guide is for projects that have been created with Clarinet v1 and do not have the v2 boilerplate code auto-generated in their projects.\n</Callout>\n\n---\n\n## Executing the migration script\n\nInside your Clarinet v1 project, run the following command to initialise NPM and Vitest. It will also create a sample test file.\n\n```terminal\n$ npx @hirosystems/clarinet-sdk@latest\n```\n\nFollow the prompts to initialise NPM and Vitest, this can take a few seconds.\n\n<Callout title=\"Info\">\nThe file `tests/counter_test.ts` that was created by `clarinet contract new counter` can be deleted.\n\nYou can also have a look at `tests/contract.test.ts`. It's a sample file showing how to use the SDK with Vitest.\nIt can safely be deleted.\n</Callout>\n\n## Unit test for <code className='text-lg'>counter</code> example\n\n```ts tests/counter.test.ts\nimport { Cl } from '@stacks/transactions';\nimport { describe, expect, it } from 'vitest';\n\nconst accounts = simnet.getAccounts();\nconst address1 = accounts.get('wallet_1')!;\n\ndescribe('test `increment` public function', () => {\n it('increments the count by the given value', () => {\n const incrementResponse = simnet.callPublicFn('counter', 'increment', [Cl.uint(1)], address1);\n console.log(Cl.prettyPrint(incrementResponse.result)); // (ok u2)\n expect(incrementResponse.result).toBeOk(Cl.uint(2));\n\n const count1 = simnet.getDataVar('counter', 'count');\n expect(count1).toBeUint(2);\n\n simnet.callPublicFn('counter', 'increment', [Cl.uint(40)], address1);\n const count2 = simnet.getDataVar('counter', 'count');\n expect(count2).toBeUint(42);\n });\n\n it('sends a print event', () => {\n const incrementResponse = simnet.callPublicFn('counter', 'increment', [Cl.uint(1)], address1);\n\n expect(incrementResponse.events).toHaveLength(1);\n const printEvent = incrementResponse.events[0];\n expect(printEvent.event).toBe('print_event');\n expect(printEvent.data.value).toBeTuple({\n object: Cl.stringAscii('count'),\n action: Cl.stringAscii('incremented'),\n value: Cl.uint(2),\n });\n });\n});\n```\n\nTo run the test, go back to your console and run the `test` command using your preferred package manager. It should display a report telling you that tests succeeded.\n\n```terminal\n$ npm test\n```\n\n<Callout title=\"Note\">\nThe `simnet` object is available globally in the tests, and is automatically initialized before each test. You can have a look at the `vitest.config.js` file at the root of you project for more details.\n</Callout>\n\nGetting back to the tests - the first test checks that the `increment` function returns the new value and saves it to the `count` variable.\nThe second test checks that an `print_event` is emitted when the `increment` function is called.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API Reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/guides/migrate-to-the-clarinet-sdk\"\n title=\"Migrating your tests to Clarinet SDK\"\n description=\"Learn how to migrate your existing Clarinet projects to the Clarinet JS SDK\"\n />\n</Cards>"],[12,"\nIntegration testing is a crucial step in smart contract development that involves testing how different components of your system work together. The Clarinet JS SDK provides powerful tools for writing and running integration tests, allowing you to simulate complex scenarios and interactions between multiple contracts.\n\nBy using integration tests, you can ensure that your smart contracts function correctly as part of a larger system and catch potential issues that might not be apparent in unit tests alone.\n\nIn this guide, you will:\n\n1. [Set up a Clarinet project with a `defi` contract.](#set-up-a-clarinet-project)\n2. [Write an integration test for the smart contract.](#test-the-deposit-and-borrow-functionality)\n3. [Run tests and generate coverage reports.](#run-tests-and-generate-coverage-reports)\n\n---\n\n## Set up a Clarinet project\n\nStart by creating a new Clarinet project. This command will create a new directory named `defi` and set up a basic Clarinet project inside it.\n\n```terminal\n$ clarinet new stx-defi\n$ cd stx-defi\n```\n\nAfter changing into your project directory, run `npm install` to install the package dependencies for testing.\n\n```terminal\n$ npm install\n```\n\nWe are going to use the same `defi` contract that we used in the [unit testing guide](/stacks/clarinet-js-sdk/guides/unit-testing), but with some additional functionality - the ability to `borrow` STX from the contract. If you don't have this project set up already, follow the steps below:\n\n```terminal\n$ clarinet contract new defi\n```\n\nThen, inside your `defi.clar` file, copy and paste the following contract code:\n\n```clarity\n;; Error constants for various failure scenarios.\n(define-constant err-overborrow (err u300))\n\n;; The interest rate for loans, represented as 10% (out of a base of 100).\n(define-data-var loan-interest-rate uint u10) ;; Representing 10% interest rate\n\n\n;; Holds the total amount of deposits in the contract, initialized to 0.\n(define-data-var total-deposits uint u0)\n\n;; Maps a user's principal address to their deposited amount.\n(define-map deposits { owner: principal } { amount: uint })\n\n;; Maps a borrower's principal address to their loan details: amount and the last interaction block.\n(define-map loans principal { amount: uint, last-interaction-block: uint })\n\n;; Public function for users to deposit STX into the contract.\n;; Updates their balance and the total deposits in the contract.\n(define-public (deposit (amount uint))\n (let\n (\n ;; Fetch the current balance or default to 0 if none exists.\n (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n )\n ;; Transfer the STX from sender = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\" to recipient = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)\".\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n ;; Update the user's deposit amount in the map.\n (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })\n ;; Update the total deposits variable.\n (var-set total-deposits (+ (var-get total-deposits) amount))\n ;; Return success.\n (ok true)\n )\n)\n\n;; Public function for users to borrow STX based on their deposits.\n(define-public (borrow (amount uint))\n (let\n (\n ;; Fetch user's deposit or default to 0.\n (user-deposit (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n ;; Calculate the maximum amount the user is allowed to borrow. (which will be upto HALF of what they deposited)\n (allowed-borrow (/ user-deposit u2))\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n ;; Calculate the new loan total after borrowing additional amount.\n (new-loan (+ amount))\n )\n ;; Ensure the requested borrow amount does not exceed the allowed amount.\n (asserts! (<= new-loan allowed-borrow) err-overborrow)\n ;; Transfer the borrowed STX to the user.\n (let\n (\n (recipient tx-sender)\n )\n (try! (as-contract (stx-transfer? amount tx-sender recipient)))\n )\n ;; Update the user's loan details in the map.\n (map-set loans tx-sender { amount: new-loan, last-interaction-block: block-height })\n ;; Return success.\n (ok true)\n )\n)\n\n;; Read-only function to get the total balance by tx-sender\n(define-read-only (get-balance-by-sender)\n (ok (map-get? deposits { owner: tx-sender }))\n)\n\n;; Read-only function to get the total amount owed by the user.\n(define-read-only (get-amount-owed)\n (let\n (\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n )\n ;; Return the total amount due.\n (ok total-due)\n )\n)\n\n;; Private function to calculate the accrued interest on a loan.\n(define-private (calculate-accrued-interest (principal uint) (start-block uint))\n (let\n (\n ;; Calculate the number of blocks elapsed since the last interaction.\n (elapsed-blocks (- block-height start-block))\n ;; Calculate the interest based on the principal, rate, and elapsed time.\n (interest (/ (* principal (var-get loan-interest-rate) elapsed-blocks) u10000))\n )\n ;; Ensure the loan started in the past (not at block 0).\n (asserts! (not (is-eq start-block u0)) (ok u0))\n ;; Return the calculated interest.\n (ok interest)\n )\n)\n```\n\nRun `clarinet check` to ensure that your smart contract is valid and ready for testing.\n\n<Callout>\nYou can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi).\n</Callout>\n\n## Test the deposit and borrow functionality\n\nIn order to `borrow` STX from the contract, users must first `deposit` STX into it. Therefore, we need to write an integration test that simulates the interaction between these two functions.\n\nInside of your `defi.test.ts` file, replace the boilerplate code and add the following:\n\n```typescript\nimport { describe, it, expect } from 'vitest';\nimport { Cl } from '@stacks/transactions';\n\nconst accounts = simnet.getAccounts();\nconst wallet1 = accounts.get('wallet_1')!;\n\ndescribe('stx-defi', () => {\n it('borrows 10 and verifies the amount owed to be 10', () => {\n simnet.callPublicFn('defi', 'deposit', [Cl.uint(1000)], wallet1);\n const totalDeposits = simnet.getDataVar('defi', 'total-deposits');\n expect(totalDeposits).toBeUint(1000);\n\n simnet.callPublicFn('defi', 'borrow', [Cl.uint(10)], wallet1);\n const { result } = simnet.callReadOnlyFn('defi', 'get-amount-owed', [], wallet1);\n expect(result).toBeOk(Cl.uint(10));\n });\n});\n```\n\nIn this integration test, we're simulating a scenario where a user deposits STX into the DeFi contract and then borrows against that deposit. Let's walk through the process step by step.\n\nWe start by simulating a deposit of 1000 STX from `wallet1`. To do this, we use the `callPublicFn` method from the Clarinet JS SDK `simnet` object, which allows us to call public functions in our smart contract just as we would on the actual blockchain.\n\nAfter making the deposit, we want to verify that it was successful. We do this by checking the total deposits in the contract using `getDataVar`.\n\nThis handy method lets us peek at the value of data variables defined in your contract.\n\n<Callout>\nTo learn more about available methods for integration testing, check out the [reference page](/stacks/clarinet-js-sdk/references/methods).\n</Callout>\n\nTo ensure the deposit was recorded correctly, we use a custom matcher, `toBeUint`. This matcher is specifically designed to check if a value is a Clarity unsigned integer with the exact value we expect.\n\nWith the deposit confirmed, we simulate `wallet1` borrowing 10 STX. We do this with another call to `callPublicFn`, this time invoking the `borrow` function of our contract.\n\nAfter the borrowing operation, we want to check how much `wallet1` owes. We use `callReadOnlyFn` to call a read-only function named `get-amount-owed` in our contract.\n\nFinally, we verify the amount owed using another custom matcher, `toBeOk(Cl.uint(10))`. This matcher is particularly useful because it checks two things at once:\n\n1. That our contract returned a successful Clarity response type.\n2. That the value returned is a Clarity unsigned integer with the exact value we expect (`10`).\n\nThese custom matchers and simnet methods are powerful tools and allow you to simulate complex interactions with your smart contracts and make detailed assertions about the results.\n\n## Run tests and generate coverage reports\n\nTo run your tests, use:\n\n```terminal\n$ npm run test\n```\n\nTo generate a coverage report, use:\n\n```terminal\n$ npm run coverage\n```\n\nThis will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/methods\"\n title=\"SDK methods\"\n description=\"Learn about the methods available in the Clarinet JS SDK.\"\n />\n</Cards>\n"],[245,"\nIntegration testing is a crucial step in smart contract development that involves testing how different components of your system work together. The Clarinet JS SDK provides powerful tools for writing and running integration tests, allowing you to simulate complex scenarios and interactions between multiple contracts.\n\nBy using integration tests, you can ensure that your smart contracts function correctly as part of a larger system and catch potential issues that might not be apparent in unit tests alone.\n\nIn this guide, you will:\n\n1. [Set up a Clarinet project with a `defi` contract.](#set-up-a-clarinet-project)\n2. [Write an integration test for the smart contract.](#test-the-deposit-and-borrow-functionality)\n3. [Run tests and generate coverage reports.](#run-tests-and-generate-coverage-reports)\n\n---\n\n## Set up a Clarinet project\n\nStart by creating a new Clarinet project. This command will create a new directory named `defi` and set up a basic Clarinet project inside it.\n\n```terminal\n$ clarinet new stx-defi\n$ cd stx-defi\n```\n\nAfter changing into your project directory, run `npm install` to install the package dependencies for testing.\n\n```terminal\n$ npm install\n```\n\nWe are going to use the same `defi` contract that we used in the [unit testing guide](/stacks/clarinet-js-sdk/guides/unit-testing), but with some additional functionality - the ability to `borrow` STX from the contract. If you don't have this project set up already, follow the steps below:\n\n```terminal\n$ clarinet contract new defi\n```\n\nThen, inside your `defi.clar` file, copy and paste the following contract code:\n\n```clarity\n;; Error constants for various failure scenarios.\n(define-constant err-overborrow (err u300))\n\n;; The interest rate for loans, represented as 10% (out of a base of 100).\n(define-data-var loan-interest-rate uint u10) ;; Representing 10% interest rate\n\n\n;; Holds the total amount of deposits in the contract, initialized to 0.\n(define-data-var total-deposits uint u0)\n\n;; Maps a user's principal address to their deposited amount.\n(define-map deposits { owner: principal } { amount: uint })\n\n;; Maps a borrower's principal address to their loan details: amount and the last interaction block.\n(define-map loans principal { amount: uint, last-interaction-block: uint })\n\n;; Public function for users to deposit STX into the contract.\n;; Updates their balance and the total deposits in the contract.\n(define-public (deposit (amount uint))\n (let\n (\n ;; Fetch the current balance or default to 0 if none exists.\n (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n )\n ;; Transfer the STX from sender = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\" to recipient = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)\".\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n ;; Update the user's deposit amount in the map.\n (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })\n ;; Update the total deposits variable.\n (var-set total-deposits (+ (var-get total-deposits) amount))\n ;; Return success.\n (ok true)\n )\n)\n\n;; Public function for users to borrow STX based on their deposits.\n(define-public (borrow (amount uint))\n (let\n (\n ;; Fetch user's deposit or default to 0.\n (user-deposit (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n ;; Calculate the maximum amount the user is allowed to borrow. (which will be upto HALF of what they deposited)\n (allowed-borrow (/ user-deposit u2))\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n ;; Calculate the new loan total after borrowing additional amount.\n (new-loan (+ amount))\n )\n ;; Ensure the requested borrow amount does not exceed the allowed amount.\n (asserts! (<= new-loan allowed-borrow) err-overborrow)\n ;; Transfer the borrowed STX to the user.\n (let\n (\n (recipient tx-sender)\n )\n (try! (as-contract (stx-transfer? amount tx-sender recipient)))\n )\n ;; Update the user's loan details in the map.\n (map-set loans tx-sender { amount: new-loan, last-interaction-block: block-height })\n ;; Return success.\n (ok true)\n )\n)\n\n;; Read-only function to get the total balance by tx-sender\n(define-read-only (get-balance-by-sender)\n (ok (map-get? deposits { owner: tx-sender }))\n)\n\n;; Read-only function to get the total amount owed by the user.\n(define-read-only (get-amount-owed)\n (let\n (\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n )\n ;; Return the total amount due.\n (ok total-due)\n )\n)\n\n;; Private function to calculate the accrued interest on a loan.\n(define-private (calculate-accrued-interest (principal uint) (start-block uint))\n (let\n (\n ;; Calculate the number of blocks elapsed since the last interaction.\n (elapsed-blocks (- block-height start-block))\n ;; Calculate the interest based on the principal, rate, and elapsed time.\n (interest (/ (* principal (var-get loan-interest-rate) elapsed-blocks) u10000))\n )\n ;; Ensure the loan started in the past (not at block 0).\n (asserts! (not (is-eq start-block u0)) (ok u0))\n ;; Return the calculated interest.\n (ok interest)\n )\n)\n```\n\nRun `clarinet check` to ensure that your smart contract is valid and ready for testing.\n\n<Callout>\nYou can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi).\n</Callout>\n\n## Test the deposit and borrow functionality\n\nIn order to `borrow` STX from the contract, users must first `deposit` STX into it. Therefore, we need to write an integration test that simulates the interaction between these two functions.\n\nInside of your `defi.test.ts` file, replace the boilerplate code and add the following:\n\n```typescript\nimport { describe, it, expect } from 'vitest';\nimport { Cl } from '@stacks/transactions';\n\nconst accounts = simnet.getAccounts();\nconst wallet1 = accounts.get('wallet_1')!;\n\ndescribe('stx-defi', () => {\n it('borrows 10 and verifies the amount owed to be 10', () => {\n simnet.callPublicFn('defi', 'deposit', [Cl.uint(1000)], wallet1);\n const totalDeposits = simnet.getDataVar('defi', 'total-deposits');\n expect(totalDeposits).toBeUint(1000);\n\n simnet.callPublicFn('defi', 'borrow', [Cl.uint(10)], wallet1);\n const { result } = simnet.callReadOnlyFn('defi', 'get-amount-owed', [], wallet1);\n expect(result).toBeOk(Cl.uint(10));\n });\n});\n```\n\nIn this integration test, we're simulating a scenario where a user deposits STX into the DeFi contract and then borrows against that deposit. Let's walk through the process step by step.\n\nWe start by simulating a deposit of 1000 STX from `wallet1`. To do this, we use the `callPublicFn` method from the Clarinet JS SDK `simnet` object, which allows us to call public functions in our smart contract just as we would on the actual blockchain.\n\nAfter making the deposit, we want to verify that it was successful. We do this by checking the total deposits in the contract using `getDataVar`.\n\nThis handy method lets us peek at the value of data variables defined in your contract.\n\n<Callout>\nTo learn more about available methods for integration testing, check out the [reference page](/stacks/clarinet-js-sdk/references/methods).\n</Callout>\n\nTo ensure the deposit was recorded correctly, we use a custom matcher, `toBeUint`. This matcher is specifically designed to check if a value is a Clarity unsigned integer with the exact value we expect.\n\nWith the deposit confirmed, we simulate `wallet1` borrowing 10 STX. We do this with another call to `callPublicFn`, this time invoking the `borrow` function of our contract.\n\nAfter the borrowing operation, we want to check how much `wallet1` owes. We use `callReadOnlyFn` to call a read-only function named `get-amount-owed` in our contract.\n\nFinally, we verify the amount owed using another custom matcher, `toBeOk(Cl.uint(10))`. This matcher is particularly useful because it checks two things at once:\n\n1. That our contract returned a successful Clarity response type.\n2. That the value returned is a Clarity unsigned integer with the exact value we expect (`10`).\n\nThese custom matchers and simnet methods are powerful tools and allow you to simulate complex interactions with your smart contracts and make detailed assertions about the results.\n\n## Run tests and generate coverage reports\n\nTo run your tests, use:\n\n```terminal\n$ npm run test\n```\n\nTo generate a coverage report, use:\n\n```terminal\n$ npm run coverage\n```\n\nThis will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/methods\"\n title=\"SDK methods\"\n description=\"Learn about the methods available in the Clarinet JS SDK.\"\n />\n</Cards>\n"],[348,"\nIntegration testing is a crucial step in smart contract development that involves testing how different components of your system work together. The Clarinet JS SDK provides powerful tools for writing and running integration tests, allowing you to simulate complex scenarios and interactions between multiple contracts.\n\nBy using integration tests, you can ensure that your smart contracts function correctly as part of a larger system and catch potential issues that might not be apparent in unit tests alone.\n\nIn this guide, you will:\n\n1. [Set up a Clarinet project with a `defi` contract.](#set-up-a-clarinet-project)\n2. [Write an integration test for the smart contract.](#test-the-deposit-and-borrow-functionality)\n3. [Run tests and generate coverage reports.](#run-tests-and-generate-coverage-reports)\n\n---\n\n## Set up a Clarinet project\n\nStart by creating a new Clarinet project. This command will create a new directory named `defi` and set up a basic Clarinet project inside it.\n\n```terminal\n$ clarinet new stx-defi\n$ cd stx-defi\n```\n\nAfter changing into your project directory, run `npm install` to install the package dependencies for testing.\n\n```terminal\n$ npm install\n```\n\nWe are going to use the same `defi` contract that we used in the [unit testing guide](/stacks/clarinet-js-sdk/guides/unit-testing), but with some additional functionality - the ability to `borrow` STX from the contract. If you don't have this project set up already, follow the steps below:\n\n```terminal\n$ clarinet contract new defi\n```\n\nThen, inside your `defi.clar` file, copy and paste the following contract code:\n\n```clarity\n;; Error constants for various failure scenarios.\n(define-constant err-overborrow (err u300))\n\n;; The interest rate for loans, represented as 10% (out of a base of 100).\n(define-data-var loan-interest-rate uint u10) ;; Representing 10% interest rate\n\n\n;; Holds the total amount of deposits in the contract, initialized to 0.\n(define-data-var total-deposits uint u0)\n\n;; Maps a user's principal address to their deposited amount.\n(define-map deposits { owner: principal } { amount: uint })\n\n;; Maps a borrower's principal address to their loan details: amount and the last interaction block.\n(define-map loans principal { amount: uint, last-interaction-block: uint })\n\n;; Public function for users to deposit STX into the contract.\n;; Updates their balance and the total deposits in the contract.\n(define-public (deposit (amount uint))\n (let\n (\n ;; Fetch the current balance or default to 0 if none exists.\n (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n )\n ;; Transfer the STX from sender = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\" to recipient = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)\".\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n ;; Update the user's deposit amount in the map.\n (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })\n ;; Update the total deposits variable.\n (var-set total-deposits (+ (var-get total-deposits) amount))\n ;; Return success.\n (ok true)\n )\n)\n\n;; Public function for users to borrow STX based on their deposits.\n(define-public (borrow (amount uint))\n (let\n (\n ;; Fetch user's deposit or default to 0.\n (user-deposit (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n ;; Calculate the maximum amount the user is allowed to borrow. (which will be upto HALF of what they deposited)\n (allowed-borrow (/ user-deposit u2))\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n ;; Calculate the new loan total after borrowing additional amount.\n (new-loan (+ amount))\n )\n ;; Ensure the requested borrow amount does not exceed the allowed amount.\n (asserts! (<= new-loan allowed-borrow) err-overborrow)\n ;; Transfer the borrowed STX to the user.\n (let\n (\n (recipient tx-sender)\n )\n (try! (as-contract (stx-transfer? amount tx-sender recipient)))\n )\n ;; Update the user's loan details in the map.\n (map-set loans tx-sender { amount: new-loan, last-interaction-block: block-height })\n ;; Return success.\n (ok true)\n )\n)\n\n;; Read-only function to get the total balance by tx-sender\n(define-read-only (get-balance-by-sender)\n (ok (map-get? deposits { owner: tx-sender }))\n)\n\n;; Read-only function to get the total amount owed by the user.\n(define-read-only (get-amount-owed)\n (let\n (\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n )\n ;; Return the total amount due.\n (ok total-due)\n )\n)\n\n;; Private function to calculate the accrued interest on a loan.\n(define-private (calculate-accrued-interest (principal uint) (start-block uint))\n (let\n (\n ;; Calculate the number of blocks elapsed since the last interaction.\n (elapsed-blocks (- block-height start-block))\n ;; Calculate the interest based on the principal, rate, and elapsed time.\n (interest (/ (* principal (var-get loan-interest-rate) elapsed-blocks) u10000))\n )\n ;; Ensure the loan started in the past (not at block 0).\n (asserts! (not (is-eq start-block u0)) (ok u0))\n ;; Return the calculated interest.\n (ok interest)\n )\n)\n```\n\nRun `clarinet check` to ensure that your smart contract is valid and ready for testing.\n\n<Callout>\nYou can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi).\n</Callout>\n\n## Test the deposit and borrow functionality\n\nIn order to `borrow` STX from the contract, users must first `deposit` STX into it. Therefore, we need to write an integration test that simulates the interaction between these two functions.\n\nInside of your `defi.test.ts` file, replace the boilerplate code and add the following:\n\n```typescript\nimport { describe, it, expect } from 'vitest';\nimport { Cl } from '@stacks/transactions';\n\nconst accounts = simnet.getAccounts();\nconst wallet1 = accounts.get('wallet_1')!;\n\ndescribe('stx-defi', () => {\n it('borrows 10 and verifies the amount owed to be 10', () => {\n simnet.callPublicFn('defi', 'deposit', [Cl.uint(1000)], wallet1);\n const totalDeposits = simnet.getDataVar('defi', 'total-deposits');\n expect(totalDeposits).toBeUint(1000);\n\n simnet.callPublicFn('defi', 'borrow', [Cl.uint(10)], wallet1);\n const { result } = simnet.callReadOnlyFn('defi', 'get-amount-owed', [], wallet1);\n expect(result).toBeOk(Cl.uint(10));\n });\n});\n```\n\nIn this integration test, we're simulating a scenario where a user deposits STX into the DeFi contract and then borrows against that deposit. Let's walk through the process step by step.\n\nWe start by simulating a deposit of 1000 STX from `wallet1`. To do this, we use the `callPublicFn` method from the Clarinet JS SDK `simnet` object, which allows us to call public functions in our smart contract just as we would on the actual blockchain.\n\nAfter making the deposit, we want to verify that it was successful. We do this by checking the total deposits in the contract using `getDataVar`.\n\nThis handy method lets us peek at the value of data variables defined in your contract.\n\n<Callout>\nTo learn more about available methods for integration testing, check out the [reference page](/stacks/clarinet-js-sdk/references/methods).\n</Callout>\n\nTo ensure the deposit was recorded correctly, we use a custom matcher, `toBeUint`. This matcher is specifically designed to check if a value is a Clarity unsigned integer with the exact value we expect.\n\nWith the deposit confirmed, we simulate `wallet1` borrowing 10 STX. We do this with another call to `callPublicFn`, this time invoking the `borrow` function of our contract.\n\nAfter the borrowing operation, we want to check how much `wallet1` owes. We use `callReadOnlyFn` to call a read-only function named `get-amount-owed` in our contract.\n\nFinally, we verify the amount owed using another custom matcher, `toBeOk(Cl.uint(10))`. This matcher is particularly useful because it checks two things at once:\n\n1. That our contract returned a successful Clarity response type.\n2. That the value returned is a Clarity unsigned integer with the exact value we expect (`10`).\n\nThese custom matchers and simnet methods are powerful tools and allow you to simulate complex interactions with your smart contracts and make detailed assertions about the results.\n\n## Run tests and generate coverage reports\n\nTo run your tests, use:\n\n```terminal\n$ npm run test\n```\n\nTo generate a coverage report, use:\n\n```terminal\n$ npm run coverage\n```\n\nThis will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/methods\"\n title=\"SDK methods\"\n description=\"Learn about the methods available in the Clarinet JS SDK.\"\n />\n</Cards>\n"],[24,"\nLaunch a local development network with all required services:\n\n```terminal\n$ clarinet devnet start\n```\n\nRequires Docker to be running locally. See [installing Docker](/guides/install-docker) guide for more information.\n\n<Callout title=\"Common errors\" type=\"warn\">\n <p>If you are getting `error: clarinet was unable to create network`, make sure you have a container service running locally.</p>\n</Callout>"],[79,"\nMap functions in Clarity provide powerful tools for efficient data storage and retrieval in smart contracts. These functions allow developers to create key-value stores that can be used to maintain complex state in a gas-efficient manner.\n\n## Why these functions matter\n\nClarity's map functions are designed with blockchain-specific considerations in mind:\n\n1. Efficiency: Maps provide O(1) lookup time, making them ideal for storing and retrieving data in smart contracts.\n2. Flexibility: They allow for complex data structures to be stored and accessed easily.\n3. Gas Optimization: Using maps can significantly reduce gas costs compared to other data storage methods.\n4. State Management: Maps are crucial for maintaining contract state across multiple transactions.\n5. Scalability: They enable contracts to handle large amounts of data without significant performance degradation.\n\n## Core Map Functions\n\n### 1. define-map\n\n**What**: Defines a new map with a specified key and value type.\n**Why**: Essential for creating structured data storage in your contract.\n**When**: Use when you need to store and retrieve data associated with unique keys.\n**How**: \n```clarity\n(define-map map-name {key-type} {value-type})\n```\n\n**Best Practices**: \n- Choose appropriate key and value types to represent your data efficiently.\n- Consider using composite keys (tuples) for more complex data relationships.\n\n**Example Use Case**: Creating a user balance tracker.\n\n```clarity\n(define-map user-balances principal uint)\n```\n\n### 2. map-set\n\n**What**: Sets the value for a given key in the map.\n**Why**: Allows updating or inserting data into the map.\n**When**: Use when you need to store or update a value associated with a key.\n**How**: \n```clarity\n(map-set map-name key value)\n```\n\n**Best Practices**: \n- Always check if the key exists before updating to avoid unintended overwrites.\n- Use in conjunction with appropriate access controls.\n\n**Example Use Case**: Updating a user's balance.\n\n```clarity\n(define-public (update-balance (user principal) (new-balance uint))\n (begin\n (asserts! (is-eq tx-sender user) (err u1))\n (ok (map-set user-balances user new-balance))))\n```\n\n### 3. map-get?\n\n**What**: Retrieves the value associated with a given key in the map.\n**Why**: Allows reading data from the map efficiently.\n**When**: Use when you need to retrieve stored data based on a key.\n**How**: \n```clarity\n(map-get? map-name key)\n```\n\n**Best Practices**: \n- Always handle the case where the key might not exist (returns none).\n- Use `unwrap!` or `unwrap-panic` when you're certain the key exists.\n\n**Example Use Case**: Retrieving a user's balance.\n\n```clarity\n(define-read-only (get-balance (user principal))\n (default-to u0 (map-get? user-balances user)))\n```\n\n### 4. map-delete\n\n**What**: Removes the entry for a given key from the map.\n**Why**: Allows removing data from the map when it's no longer needed.\n**When**: Use when you need to delete stored data associated with a key.\n**How**: \n```clarity\n(map-delete map-name key)\n```\n\n**Best Practices**: \n- Be cautious when deleting data, as it can't be recovered once deleted.\n- Consider using a \"soft delete\" approach for data that might need to be referenced later.\n\n**Example Use Case**: Removing a user's account.\n\n```clarity\n(define-public (delete-account (user principal))\n (begin\n (asserts! (is-eq tx-sender user) (err u1))\n (ok (map-delete user-balances user))))\n```\n\n## Practical Example: Simple Voting System\n\nLet's implement a basic voting system using map functions to demonstrate their practical use:\n\n```clarity\n;; Define maps for votes and voter registration\n(define-map votes { proposal: uint } { yes: uint, no: uint })\n(define-map voters principal bool)\n\n;; Function to register a voter\n(define-public (register-voter)\n (ok (map-set voters tx-sender true)))\n\n;; Function to cast a vote\n(define-public (cast-vote (proposal uint) (vote bool))\n (let ((proposal-votes (default-to { yes: u0, no: u0 } (map-get? votes { proposal: proposal }))))\n (asserts! (is-some (map-get? voters tx-sender)) (err u1))\n (asserts! (is-none (map-get? votes { proposal: proposal })) (err u2))\n (if vote\n (map-set votes { proposal: proposal } \n (merge proposal-votes { yes: (+ (get yes proposal-votes) u1) }))\n (map-set votes { proposal: proposal } \n (merge proposal-votes { no: (+ (get no proposal-votes) u1) })))\n (ok true)))\n\n;; Function to get vote count\n(define-read-only (get-votes (proposal uint))\n (default-to { yes: u0, no: u0 } (map-get? votes { proposal: proposal })))\n```\n\nThis example demonstrates:\n1. Using `define-map` to create data structures for votes and voter registration.\n2. Using `map-set` to register voters and record votes.\n3. Using `map-get?` to check voter registration and retrieve vote counts.\n4. Combining map functions with other Clarity features for a complete voting system.\n\n## Conclusion\n\nMap functions in Clarity provide a powerful and efficient way to store and retrieve data in smart contracts. By understanding when and how to use these functions, developers can create more efficient, scalable, and gas-optimized contracts. Always consider the specific requirements of your application when designing your data storage strategy using map functions.\n"],[219,"\nNakamoto is an upcoming upgrade to Stacks that brings faster blocks and paves the way for sBTC. [Start here](https://docs.stacks.co/nakamoto-upgrade/nakamoto-upgrade-start-here) if you need an overview of how Nakamoto impacts the network. This document is about how Nakamoto impacts your applications and Hiro tooling specifically.\n\nThe good news for you is that the Nakamoto upgrade does not bring breaking changes to applications on Stacks. Your app will continue to work as expected post-upgrade, apart from you and your users experiencing the better UX of faster block times.\n\nIn terms of what you need to do to prepare for Nakamoto, just make sure you are running the latest versions of our tooling. We are shipping updates across all Hiro tools to make sure they support Nakamoto and that you can stay focused on building.\n\nBelow find a list of how Hiro tools have been updated to support Nakamoto:\n\n## Stacks Explorer: What's new\n\n### Introducing a fresh view for blocks\n\nThe Stacks Explorer now features a new way to display blocks, aligning with the Nakamoto upgrade's approach of multiple STX blocks settling into one BTC block.\n\n![Block View](./images/nakamoto-explorer.png)\n\n### Tailored viewing experience\n\nThis new view is now live on both [testnet](https://explorer.hiro.so/?chain=testnet) and [mainnet](https://explorer.hiro.so/?chain=mainnet), accessible via the network dropdown.\n\n#### Two distinctive display modes\n\n1. **Independent Display:** Focuses on STX blocks progress.\n2. **COMING SOON—Grouped by Bitcoin Block:** Shows BTC blocks flow alongside STX blocks.\n\n![Block View](./images/group-by-block.png)\n\n### Stay in the loop with live view\n\nKeep up-to-date with blocks in real-time with our new live view option.\n\n---\n\n## Stacks.js: What’s new\n\n### StackingClient\n\nInstall the latest nakamoto version with `npm install @stacks/stacking@6.13.0`.\n\nThe StackingClient in `@stacks/stacking` was updated to match the latest pox-4 contract.\n\n- Added `StackingClient.signPoxSignature()`\n- Added `Pox4SignatureTopic` enum\n- New stacking arguments for `StackingClient.stack`, `StackingClient.stackExtend`, `StackingClient.stackIncrease`, `StackingClient.stackAggregationCommit`, and `StackingClient.stackAggregationCommitIndexed`\n\n[Learn more](/stacks/nakamoto/guides/stacks-js) about the new Stacks.js updates.\n\n---\n\n## Clarinet: What’s new\n\nMake sure to install [Clarinet 2.8.0](https://github.com/hirosystems/clarinet/releases/tag/v2.8.0) or above.\n\n- Clarinet's devnet can now be used to test Nakamoto functionality.\n- The devnet now starts 2 signer nodes in Nakamoto mode.\n- Running `clarinet check --enable-clarity-wasm` now runs the current interpreter and clarity wasm side-by-side to allow comparing outputs.\n- `clarinet console --enable-clarity-wasm` now automatically runs the current interpreter and clarity wasm side-by-side and logs any difference in outputs.\n\nBy default, the Devnet won't start in epoch 3.0, [see this guide](/stacks/nakamoto/guides/clarinet) to configure it.\n\n---\n\n## Stacks Blockchain API: What’s new\n\n> **_NOTE:_**\n>\n> The `/extended/v2/*` endpoints represent the modern API that is being continually expanded to support the Nakamoto upgrade. We encourage developers to use v2 endpoints for new developments. Be aware that `/extended/v1/*` are the older set of endpoints. Though they continue to function alongside v2, they will be deprecated in the coming months.\n\n### Nakamoto endpoints\n\nThe Stacks Blockchain API has a series of new endpoints to support the upcoming Nakamoto upgrade:\n\n- Get Proof-of-Transfer details per Cycle, including Signers and Stackers, with information about stacked STX amounts, payout addresses and signer weights\n- Get a list of Stacks blocks per Bitcoin block to support the new Nakamoto mining mechanism\n- Get all transactions relevant to a STX address or contract ID, including filters for FT and NFT transfers\n- Support for the new Nakamoto `tenure_change` transaction type across all our transaction endpoints\n- Get a summary of current network mempool transaction fees, including statistics for expected confirmation priorities\n- Get the deployment status of multiple smart contracts in one call\n\nAll of these endpoints are backwards compatible with Stacks nodes running version 2.4 or earlier\n\n### Event replay optimizations\n\n- Optimize replay speed by creating a new parquet-based ingestion that optimizes for canonical chain information\n- Optimize classic TSV event replay by improving block ingestion times\n\n### New transaction type `tenure_change`\n\nAffects endpoints:\n\n- `/extended/v1/address/{principal}/transactions`\n- `/extended/v1/tx`\n- `/extended/v1/tx/{tx_id}`\n- `/extended/v1/tx/{tx_id}/raw`\n- `/extended/v1/tx/mempool`\n- `/extended/v1/tx/multiple`\n\n### New endpoints: `/extended/v2/*`\n\n- `/extended/v2/mempool/fees`\n- `/extended/v2/burn-blocks`\n- `/extended/v2/burn-blocks/{height_or_hash}`\n- `/extended/v2/burn-blocks/{height_or_hash}/blocks`\n- `/extended/v2/blocks`\n- `/extended/v2/blocks/{height_or_hash}`\n- `/extended/v2/blocks/{height_or_hash}/transactions`\n- `/extended/v2/addresses/{address}/transactions:`\n- `/extended/v2/addresses/{address}/transactions/{tx_id}/events:`\n- `/extended/v2/smart-contracts/status`\n- `/extended/v2/pox/cycles`\n- `/extended/v2/pox/cycles/{cycle_number}`\n- `/extended/v2/pox/cycles/{cycle_number}/signers`\n- `/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}`\n- `/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}/stackers`\n\n### Deprecated endpoints\n\n- `/extended/v1/block`\n- `/extended/v1/block/{hash}`\n- `/extended/v1/block/by_height/{height}`\n- `/extended/v1/block/by_burn_block_hash/{burn_block_hash}`\n- `/extended/v1/block/by_burn_block_height/{burn_block_height}`\n- `/extended/v1/address/{principal}/transactions`\n- `/extended/v1/address/{principal}/{tx_id}/with_transfers`\n- `/extended/v1/address/{principal}/transactions_with_transfers`\n- `/extended/v1/fee_rate`\n- `/extended/v1/tx/block/{block_hash}`\n- `/extended/v1/tx/block_height/{height}`\n\nView the [API reference](/stacks/api/info).\n"],[81,"\nPrincipal functions in Clarity are essential tools for implementing robust access control and permission management in smart contracts. These functions allow you to identify, authenticate, and authorize different entities interacting with the contract, ensuring that only the right parties can perform specific actions or access certain data.\n\n## Why these functions matter\n\nClarity's principal functions are designed with blockchain-specific considerations in mind. They can:\n\n1. Identify and authenticate users and contracts interacting with your smart contract.\n2. Implement role-based access control for different contract functions.\n3. Ensure that only authorized entities can perform certain actions or access specific data.\n4. Create multi-signature schemes for enhanced security.\n\n## Key elements for access control\n\n### 1. asserts!\n\n**What**: A function that checks a condition and throws an error if it's not met.\n\n**Why**: Essential for enforcing access control rules and validating conditions.\n\n**When**: Use when you need to ensure a condition is true before proceeding with a function.\n\n**Best practices**: \n- Use `asserts!` to enforce access control rules and validate conditions.\n- Consider using `asserts!` in combination with other principal functions for robust access control.\n\n**Example use case**: Using `asserts!` to check if a user has sufficient balance before performing a transfer.\n\n```clarity\n;; Define a map to store user balances\n(define-map Balances principal uint)\n\n;; Function to transfer tokens\n(define-public (transfer (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? Balances tx-sender)))\n )\n ;; Assert that the sender has sufficient balance\n (asserts! (>= senderBalance amount) (err u1))\n \n ;; If assertion passes, proceed with the transfer\n (map-set Balances tx-sender (- senderBalance amount))\n (map-set Balances recipient (+ (default-to u0 (map-get? Balances recipient)) amount))\n (ok true)\n )\n)\n\n;; Function to check balance\n(define-read-only (get-balance (user principal))\n (default-to u0 (map-get? Balances user))\n)\n```\n\n### 2. tx-sender\n\n**What**: A keyword that represents the current transaction sender.\n\n**Why**: Important for identifying who is calling a contract function.\n\n**When**: Use when you need to check permissions or record actions associated with the caller.\n\n**Best practices**: \n- Always validate `tx-sender` before performing sensitive operations.\n- Don't rely solely on `tx-sender` for complex authentication schemes.\n\n**Example use case**: Restricting a function to be called only by the contract owner.\n\n```clarity\n(define-data-var contractOwner principal tx-sender)\n\n(define-public (restricted-function)\n (begin\n (asserts! (is-eq tx-sender (var-get contractOwner)) (err u1))\n ;; Function logic here\n (ok true)\n )\n)\n```\n\n### 3. contract-caller\n\n**What**: A keyword that represents the immediate caller of the current contract.\n\n**Why**: Allows for more granular control in contract-to-contract interactions.\n\n**When**: Use when your contract might be called by other contracts and you need to distinguish between the original sender and the immediate caller.\n\n**Best practices**: \n- Use in conjunction with `tx-sender` for comprehensive access control.\n- Be cautious of potential confusion between `tx-sender` and `contract-caller` in complex call chains.\n\n**Example use case**: Implementing a whitelist for contracts allowed to call a function.\n\n```clarity\n(define-map AllowedCallers principal bool)\n\n(define-public (whitelisted-function)\n (begin\n (asserts! (default-to false (map-get? AllowedCallers contract-caller)) (err u2))\n ;; Function logic here\n (ok true)\n )\n)\n```\n\n### 4. is-eq\n\n**What**: Checks if two values are equal.\n\n**Why**: Crucial for comparing principals and implementing access control logic.\n\n**When**: Use when you need to verify if a caller matches a specific principal or if two principals are the same.\n\n**Best practices**: \n- Use for exact matching of principals.\n- Consider using in combination with other checks for more robust authentication.\n\n**Example use case**: Multi-signature functionality requiring approval from specific principals.\n\n```clarity\n(define-constant APPROVER_ONE 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5)\n(define-constant APPROVER_TWO 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG)\n \n(define-public (approve-transaction (transactionId uint))\n (begin\n (asserts! (or (is-eq tx-sender APPROVER_ONE) (is-eq tx-sender APPROVER_TWO)) (err u3))\n ;; Approval logic here\n (ok true)\n )\n)\n```\n\n## Practical example: simple governance contract\n\nLet's implement a basic governance contract that demonstrates role-based access control using principal functions. This contract will have an owner, administrators, and regular members, each with different permissions.\n\n```clarity\n;; Define maps to store roles\n(define-map Administrators principal bool)\n(define-map Members principal bool)\n\n;; Define data variables\n(define-data-var contractOwner principal tx-sender)\n(define-data-var proposalCounter uint u0)\n\n;; Define a map to store proposals\n(define-map Proposals\n uint\n {\n title: (string-ascii 50),\n proposer: principal,\n votesFor: uint,\n votesAgainst: uint\n }\n)\n\n;; Function to add an administrator (only owner can do this)\n(define-public (add-administrator (newAdmin principal))\n (begin\n (asserts! (is-eq tx-sender (var-get contractOwner)) (err u1))\n (ok (map-set Administrators newAdmin true))\n )\n)\n\n;; Function to add a member (only Administrators can do this)\n(define-public (add-member (newMember principal))\n (begin\n (asserts! (default-to false (map-get? Administrators contract-caller)) (err u2))\n (ok (map-set Members newMember true))\n )\n)\n\n;; Function to create a proposal (only members can do this)\n(define-public (create-proposal (title (string-ascii 50)))\n (let\n (\n (proposalId (var-get proposalCounter))\n )\n (asserts! (default-to false (map-get? Members tx-sender)) (err u3))\n (map-set Proposals proposalId\n {\n title: title,\n proposer: tx-sender,\n votesFor: u0,\n votesAgainst: u0\n })\n (var-set proposalCounter (+ proposalId u1))\n (ok proposalId)\n )\n)\n\n;; Function to vote on a proposal (only members can do this)\n(define-public (vote (proposalId uint) (voteFor bool))\n (let\n (\n (proposal (unwrap! (map-get? Proposals proposalId) (err u4)))\n )\n (asserts! (default-to false (map-get? Members tx-sender)) (err u5))\n (if voteFor\n (map-set Proposals proposalId (merge proposal { votesFor: (+ (get votesFor proposal) u1) }))\n (map-set Proposals proposalId (merge proposal { votesAgainst: (+ (get votesAgainst proposal) u1) }))\n )\n (ok true)\n )\n)\n\n;; Function to transfer ownership (only current owner can do this)\n(define-public (transfer-ownership (newOwner principal))\n (begin\n (asserts! (is-eq tx-sender (var-get contractOwner)) (err u6))\n (var-set contractOwner newOwner)\n (ok true)\n )\n)\n```\n\n## Conclusion\n\nPrincipal functions in Clarity provide powerful tools for implementing secure and flexible access control in smart contracts. By understanding when and how to use these functions, you can create robust permission systems, ensuring that only authorized entities can perform specific actions or access certain data. Always consider the specific security requirements of your application when implementing access control mechanisms using these principal functions.\n"],[229,"\nRead about what's new in the latest version of Stacks.js.\nThis version comes with a lot of improvements and new features, but it also adds some breaking changes.\n\nWant to use these latest features? Install packages using the `latest` tag:\n\n```package-install\n@stacks/{common,network,transactions}@latest\n```\n\n### Strings\n_aka, reducing wrapper types and magic numbers_\n\n<img src=\"/string-meme.png\" className=\"max-w-[300px] mx-auto\" alt=\"String Meme\" />\n\n#### Problem\n\nMany Stacks.js representations we're not debuggable for developers.\nLogging Clarity values resulted in unintelligible `type` and `value` numbers, confusing even experienced Stacks developers.\nPrivate keys were also included unnecessary `type` properties with raw byte arrays.\n\"Magic\" numbers are all accross the codebase (as they are needed for serialization), but these shouldn't be part of the \"public\" interfaces.\n\n#### Solution\n\nWe switched to a system where most values will be represented as strings.\nThis makes them easier to inspect and diff.\n\nClarity example, [Read more](#clarity-representation)\n```ts\n// !diff -\n{ type: 1, value: 12n }\n// !diff +\n{ type: \"uint\", value: \"12\" }\n```\n\nPrivate key example, [Read more](/stacks/stacks.js/concepts/private-keys)\n```ts\nsignMessageHashRsv({\n // !diff -\n privateKey: createStacksPrivateKey(\"f5a3...2801\"), // { compressed: true, data: [245,163,...] }\n // !diff +\n privateKey: \"f5a3...2801\"\n})\n```\n\nThis breaks the signatures of many functions:\n\n- `signMessageHashRsv`, `signWithKey` now return the message signature as a `string` directly.\n- `nextSignature`, `nextVerification`, `publicKeyFromSignatureVrs`, `publicKeyFromSignatureRsv` now take in the message signature as a `string`.\n\n### Stacks Network\n\nFor a long time, Stacks.js \"network\" instances were used for \"networking\" and \"network\" definitions.\nThis caused confusion, as most users use `mainnet` or `testnet` for most of their interactions.\nThe \"networking\" (aka fetching) logic is now more clearly customizable.\n\nFrom now on \"network\" objects are static (aka constants) and don't require instantiation.\n\nThese changes should make it more obvious when functions are using network object properties vs when they are doing actual networking.\n\nIn most cases, developers shouldn't need the `@stacks/network` package anymore.\nThe `network` parameter can be used with string literals: `'mainnet'`, `'testnet'`, `'devnet'`, `'mocknet'`.\n\n```ts\nimport { StacksTestnet } from '@stacks/network';\n\nmakeSTXTokenTransfer({\n // !diff -\n network: new StacksTestnet(),\n // !diff +\n network: 'testnet'\n // ...\n});\n```\n\n\n#### Stacks Network `client`\n\nIn case a function also takes a `client` parameter, it will be doing actual networking.\nThis way you can use string literal networks with a custom node.\nYou can also still use network objects with the `client` parameter as part of the network object.\nThe `client` parameter can be any object-like structure containing a `baseUrl` and `fetch` property.\n\n- The `baseUrl` property should be a string containing the base URL of the Stacks node you want to use.\n- The `fetch` property can be any (fetch)[https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API] compatible function.\n\nThe following diffs show examples of how to migrate to the new pattern.\n\n```ts\nconst transaction = await makeSTXTokenTransfer({\n// !diff - \nnetwork: new StacksTestnet({ url: \"mynode-optional.com\", fetchFn: myFetch }),\n// !diff +\nnetwork: 'testnet', // optional, defaults to 'mainnet'\n// !diff +\nclient: { baseUrl: \"mynode-optional.com\", fetch: myFetchOptional } // optional, defaults inferred from network\n});\n```\n\nThe `client` property is also part of the network object.\nYou can still keep ONE single network object for your whole application.\n\n```ts\n// !diff -\nimport { StacksTestnet } from '@stacks/network';\n// !diff +\nimport { STACKS_TESTNET } from '@stacks/network';\n\n// !diff -\nconst network = new StacksTestnet({ url: \"https://mynode.com\", fetchFn: myFetch });\n// !diff +\nconst network = {\n // !diff +\n ...STACKS_TESTNET, // extending a static object\n // !diff +\n client: { baseUrl: \"https://mynode.com\", fetch: myFetch }\n // !diff +\n};\n```\n\n### A To B Helpers\n\nWhere possible, Stacks.js now offers function to translate between different representations and concepts.\nThe naming is consistent across the board and uses `A To B` naming.\nFor example, if we have a private key and want to get the address, we can use the `privateKeyToAddress` function.\n\n```ts\nimport { privateKeyToAddress } from \"@stacks/transactions\";\n\nconst privateKey = \"f5a3...2801\";\nconst address = privateKeyToAddress(privateKey); // SP1MXSZF4NFC8JQ1TTYGEC2WADMC7Y3GHVZYRX6RF\n```\n\n### Fetch Methods\n\nTo make it easier to discover all fetching functions, they now all start with `fetch`.\n\nThe following methods were renamed:\n\n- `estimateFee` → `fetchFeeEstimate`\n- `estimateTransfer` → `fetchFeeEstimateTransfer`\n- `estimateTransaction` → `fetchFeeEstimateTransaction`\n- `getAbi` → `fetchAbi`\n- `getNonce` → `fetchNonce`\n- `getContractMapEntry` → `fetchContractMapEntry`\n- `callReadOnlyFunction` → `fetchCallReadOnlyFunction`\n\n`broadcastTransaction` wasn't renamed to highlight the uniqueness of the method.\nNamely, the node/API it is sent to will \"broadcast\" the transaction to the mempool and is more of an irreversible action.\n\n### Clarity Representation\n\nThe `ClarityType` enum was replaced by a more readable version.\nThe previous (wire format compatible) enum is still available as `ClarityWireType`.\nThese types are considered somewhat internal and shouldn't cause breaking changes for most use-cases.\n\nThe property holding the value of the data type is now called `value` in all cases.\nPreviously, there was a mix of `value`, `list`, `buffer` etc.\nFor `bigint` values, the type of the `value` property is a now `string`, for better serialization compatibility.\n\n```ts\n{\n // !diff -\n type: 1,\n // !diff +\n type: \"uint\",\n // !diff -\n value: 12n,\n // !diff +\n value: \"12\",\n}\n```\n\n```ts\n{\n // !diff -\n type: 11,\n // !diff +\n type: \"list\",\n // !diff -\n list: [ ... ],\n // !diff +\n value: [ ... ],\n}\n```\n\n### Post-conditions\n\nThe old `PostCondition` type was renamed to `PostConditionWire`.\nA new human-readable `PostCondition` type was introduced in its place.\n\nBelow is an example of the new `PostCondition` types.\n\n```ts\n// STX post-condition\nconst stxPostCondition: StxPostCondition = {\n type: 'stx-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'gte',\n amount: '100',\n};\n\n// Fungible token post-condition\nconst ftPostCondition: FungiblePostCondition = {\n type: 'ft-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'eq',\n amount: '100',\n asset: 'SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-ft-token::my-token',\n};\n\n// Non-fungible token post-condition\nconst nftPostCondition: NonFungiblePostCondition = {\n type: 'nft-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'sent',\n asset: 'SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-nft::my-asset',\n assetId: Cl.uint(602),\n};\n```\n\n### Advanced\n\n#### serialize methods\n\nExisting methods now take or return **hex-encoded strings** _instead_ of `Uint8Array`s.\n\n> If you were already converting returned bytes to hex-strings in your code, you can now skip the conversion step — hex-strings are the new default.\n\nFor easier migrating, renaming the following methods is possible to keep the previous behavior:\n\n- `StacksTransaction.serialize` → `StacksTransaction.serializeBytes`\n- `serializeCV` → `serializeCVBytes`\n- `serializeAddress` → `serializeAddressBytes`\n- `deserializeAddress` → `deserializeAddressBytes`\n- `serializeLPList` → `serializeLPListBytes`\n- `deserializeLPList` → `deserializeLPListBytes`\n- `serializeLPString` → `serializeLPStringBytes`\n- `deserializeLPString` → `deserializeLPStringBytes`\n- `serializePayload` → `serializePayloadBytes`\n- `deserializePayload` → `deserializePayloadBytes`\n- `serializePublicKey` → `serializePublicKeyBytes`\n- `deserializePublicKey` → `deserializePublicKeyBytes`\n- `serializeStacksMessage` → `serializeStacksMessageBytes`\n- `deserializeStacksMessage` → `deserializeStacksMessageBytes`\n- `serializeMemoString` → `serializeMemoStringBytes`\n- `deserializeMemoString` → `deserializeMemoStringBytes`\n- `serializeTransactionAuthField` → `serializeTransactionAuthFieldBytes`\n- `deserializeTransactionAuthField` → `deserializeTransactionAuthFieldBytes`\n- `serializeMessageSignature` → `serializeMessageSignatureBytes`\n- `deserializeMessageSignature` → `deserializeMessageSignatureBytes`\n- `serializePostCondition` → `serializePostConditionBytes`\n- `deserializePostCondition` → `deserializePostConditionBytes`\n- `serializeStacksMessage` → `serializeStacksWireBytes`\n- `deserializeStacksMessage` → `deserializeStacksWireBytes`\n\n#### Asset Helper Methods\n\nThe following interfaces and methods were renamed:\n\n- `AssetInfo` → `Asset`\n- `StacksWireType.AssetInfo` → `StacksWireType.Asset`\n- `createAssetInfo` → `createAsset`\n- `parseAssetInfoString` → `parseAssetString`\n\n#### CLI\n\n- Removed the `authenticator` method for legacy Blockstack authentication.\n\n#### Triplesec\n\nSupport for encrypting/decrypting mnemonics with `triplesec` was removed.\nThis impacts the methods: `decrypt`, `decryptMnemonic`, and `decryptLegacy`.\nMake sure to update your code to if mnemonics are stored somewhere encrypted using the legacy method.\n\n#### WireType\n\nRenamed internals to avoid confusion between \"message\" and wire-format for serialization.\nThis is only used for advanced serialization use-cases internally and should not be needed for most users.\n\n- `StacksMessage` → `StacksWire`\n- `StacksMessageType` → `StacksWireType`\n- `serializeStacksMessage` → `serializeStacksWireBytes`\n- `deserializeStacksMessage` → `deserializeStacksWireBytes`\n\nMore types were renamed to indicate use for serialization to _wire-format_:\n\n- `MessageSignature` → `MessageSignatureWire`\n- `StacksPublicKey` → `PublicKeyWire`\n- `TransactionAuthField` → `TransactionAuthFieldWire`\n- `Asset` → `AssetWire`\n- `Address` → `AddressWire`\n- `PostCondition` → `PostConditionWire`\n- `PostConditionPrincipal` → `PostConditionPrincipalWire`\n- `STXPostCondition` → `STXPostConditionWire`\n- `FungiblePostCondition` → `FungiblePostConditionWire`\n- `NonFungiblePostCondition` → `NonFungiblePostConditionWire`\n- `LengthPrefixedString` → `LengthPrefixedStringWire`\n- `CoinbasePayload` → `CoinbasePayloadWire`\n- `PoisonPayload` → `PoisonPayloadWire`\n- `SmartContractPayload` → `SmartContractPayloadWire`\n- `TokenTransferPayload` → `TokenTransferPayloadWire`\n- `VersionedSmartContractPayload` → `VersionedSmartContractPayloadWire`\n- `NakamotoCoinbasePayload` → `NakamotoCoinbasePayloadWire`\n- `TenureChangePayload` → `TenureChangePayloadWire`\n- `StandardPrincipal` → `StandardPrincipalWire`\n- `ContractPrincipal` → `ContractPrincipalWire`\n\n#### Signed BigInt\n\nThe `intToBigInt` method no longer supports two's complement signed integers and removed the `signed` boolean parameter.\nThis likely was a misunderstood and unused feature.\n\n#### Refactorings\n\n- `AddressHashMode`: The `Serialize` prefixes were removed for brevity.\n- `makeRandomPrivKey` was renamed to `randomPrivateKey` and now returns a compressed private key.\n- `generateSecretKey` was renamed to `randomSeedPhrase`.\n\n<Callout>\n**Have an idea?** Please let us know on [Discord #stacks-js](https://stacks.chat) or open an issue on [Github](https://github.com/hirosystems/stacks.js/issues/new/choose).\n</Callout>\n"],[346,"\nSeveral endpoints will request the [MARF Merkel Proof](https://github.com/stacksgov/sips/blob/main/sips/sip-004/sip-004-materialized-view.md#marf-merkle-proofs) by default.\n\nProvided with the proof, a client can verify the value, cumulative energy spent, and the number of confirmation for the response value provided by the API.\n\nRequesting the proof requires more resources (computation time, response time, and response body size). To avoid the additional resources, in case verification is not required, API endpoints allow setting the request parameter: `proof=0`. The returned response object will not have any proof fields.\n"],[77,"\nSmart contracts often need to perform calculations, whether it's for token balances, voting weights, or complex financial operations. Understanding Clarity's arithmetic functions is crucial for implementing these features efficiently and securely.\n\n## Why these functions matter\nClarity's arithmetic functions are designed with blockchain-specific considerations in mind:\n\n1. Overflow protection: Unlike some languages, Clarity prevents integer overflow by default, enhancing contract security.\n2. Precision: Clarity uses 128-bit integers, allowing for high-precision calculations crucial in financial applications.\n3. Determinism: The behavior of these functions is consistent across all nodes, ensuring blockchain consensus.\n\n## Core functions\n\n### 1. Addition (+)\n\n**What**: Adds two or more integers.\n\n**Why**: Essential for calculations involving cumulative values.\n\n**When**: Use when you need to increase values, combine quantities, or perform any additive calculation.\n\n**Best practices**: \n- Consider overflow protection\n- Use with uint for non-negative values like token amounts\n\n**Example use case**: Calculating total rewards in a stacking system.\n\n```clarity\n(define-map StackingRewards principal uint)\n\n(define-public (add-stacking-reward (stacker principal) (newReward uint))\n (let\n (\n (currentRewards (default-to u0 (map-get? StackingRewards stacker)))\n )\n (map-set StackingRewards stacker (+ currentRewards newReward))\n (ok true)\n )\n)\n```\n\n### 2. Subtraction (-)\n\n**What**: Subtracts integers from the first argument.\n\n**Why**: Crucial for calculations involving decreasing values or finding differences.\n\n**When**: Use when you need to decrease values, calculate differences, or perform any subtractive operation.\n\n**Best practices**: \n- Guard against underflow\n- Consider using uint for values that shouldn't go negative\n\n**Example use case**: Updating user points in a rewards system.\n\n```clarity\n(define-map UserPoints principal uint)\n\n(define-public (deduct-points (amount uint))\n (let\n (\n (currentPoints (default-to u0 (map-get? UserPoints tx-sender)))\n )\n (asserts! (>= currentPoints amount) (err u1))\n (map-set UserPoints tx-sender (- currentPoints amount))\n (ok true)\n )\n)\n\n(define-read-only (get-points (user principal))\n (default-to u0 (map-get? UserPoints user))\n)\n```\n\n### 3. Multiplication (*)\n\n**What**: Multiplies two or more integers.\n\n**Why**: Important for calculations involving scaling, rates, or proportions.\n\n**When**: Use when you need to scale values, calculate rates, or perform any multiplicative operation.\n\n**Best practices**: \n- Consider overflow protection\n- Use with uint for non-negative values like token amounts\n\n**Example use case**: Calculating rewards based on stacking amount and duration.\n\n```clarity\n(define-public (calculate-rewards (amount uint) (days uint))\n (let\n (\n (rewardRate u10) ;; 10 tokens per day per 1000 stacked\n (rewards (* amount days rewardRate))\n )\n (ok (/ rewards u1000))\n )\n)\n```\n\n### 4. Division (/)\n\n**What**: Performs integer division.\n\n**Why**: Crucial for calculations involving rates, proportions, or sharing.\n\n**When**: Use when you need to divide values, calculate rates, or perform any division operation.\n\n**Best practices**: \n- Guard against division by zero\n- Consider using uint for non-negative values like token amounts\n\n**Example use case**: Calculating price per item when buying in bulk.\n\n```clarity\n(define-read-only (calculate-price-per-item (totalPrice uint) (itemCount uint))\n (if (> itemCount u0)\n (ok (/ totalPrice itemCount))\n (err u0)\n )\n)\n```\n\n## Best practices and considerations\n\n1. **Order of operations**: Clarity doesn't have operator precedence. Use parentheses to explicitly define the order of operations.\n\n2. **Handling remainders**: When using division, consider how to handle remainders. You might need to use combination of division and modulo.\n\n3. **Scaling for precision**: When dealing with percentages or fractions, consider scaling up your numbers to maintain precision.\n\n4. **Guarding against division by zero**: Always check for zero before performing division to avoid runtime errors.\n\n5. **Using uint vs int**: Choose `uint` for values that can't be negative (like token amounts) and `int` when negative values are possible.\n\n## Practical example: simple interest calculator\n\nLet's combine these functions to create a simple interest calculator:\n\n```clarity\n(define-public (calculate-interest (principal uint) (rate uint) (time uint))\n (let (\n (scaled-rate (/ rate u100)) ;; Convert percentage to decimal\n (interest (/ (* principal scaled-rate time) u365)) ;; Simple interest formula\n )\n (ok interest))\n)\n\n;; Usage: calculate interest for 1000 tokens at 5% APR for 30 days\n(calculate-interest u1000 u5 u30)\n```\n\nThis example demonstrates how to combine multiple arithmetic operations while handling precision (scaling the rate) and using integer division appropriately.\n\n## Conclusion\n\nMastering Clarity's arithmetic functions is essential for building robust smart contracts. By understanding these operations and their nuances, you can implement complex financial logic, manage token economics, and create secure, efficient blockchain applications.\n"],[514,"\nSome endpoints, like the [read-only function contract call](https://docs.hiro.so/api#operation/call_read_only_function), require input to a serialized [Clarity value](https://docs.stacks.co/docs/clarity/). Other endpoints return serialized values that need to be deserialized.\n\nThe example shown below illustrates Clarity value usage in combination with the API.\n\nThe `@stacks/transactions` library supports typed contract calls and makes [response value utilization much simpler](https://docs.stacks.co/docs/clarity/).\n\n```ts\nimport {\n Configuration,\n SmartContractsApiInterface,\n SmartContractsApi,\n ReadOnlyFunctionSuccessResponse,\n} from '@stacks/blockchain-api-client';\nimport { uintCV, UIntCV, cvToHex, hexToCV, ClarityType } from '@stacks/transactions';\n\n(async () => {\n const apiConfig: Configuration = new Configuration({\n fetchApi: fetch,\n // for mainnet, replace `testnet` with `mainnet`\n basePath: 'https://api.testnet.hiro.so', // defaults to http://localhost:3999\n });\n\n const contractsApi: SmartContractsApiInterface = new SmartContractsApi(apiConfig);\n\n const principal: string = 'ST000000000000000000002AMW42H';\n\n // use most recent from: https://api.<mainnet/testnet>.hiro.so/v2/pox\n const rewardCycle: UIntCV = uintCV(22);\n\n // call a read-only function\n const fnCall: ReadOnlyFunctionSuccessResponse = await contractsApi.callReadOnlyFunction({\n contractAddress: principal,\n contractName: 'pox',\n functionName: 'is-pox-active',\n readOnlyFunctionArgs: {\n sender: principal,\n arguments: [cvToHex(rewardCycle)],\n },\n });\n\n console.log({\n status: fnCall.okay,\n result: fnCall.result,\n representation: hexToCV(fnCall.result).type === ClarityType.BoolTrue,\n });\n})().catch(console.error);\n```"],[240,"\nStacks uses the concept of an \"account\" to represent a user's identity on the blockchain. An account is identified by a unique address. The address is derived from the account's public key, which is derived from the account's private key.\n\nA normal mainnet address starts with `SP`, and a testnet address starts with `ST`. For example:\n\nMainnet: `SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159`\n\nTestnet: `ST2F4BK4GZH6YFBNHYDDGN4T1RKBA7DA1BJZPJEJJ`\n\n## Getting an address\n\n### Using Stacks Connect\n\n```tsx -n\nimport { showConnect } from '@stacks/connect';\n\nshowConnect({\n appDetails,\n userSession,\n onFinish: () => {\n const user = userSession.loadUserData();\n const address = user.profile.stxAddress.mainnet;\n // 'SP1MXSZF4NFC8JQ1TTYGEC2WADMC7Y3GHVZYRX6RF'\n },\n});\n```\n\n### Using a seed phrase / mnemonic / private key\n\n```ts -n\nimport { randomSeedPhrase, generateWallet } from \"@stacks/wallet-sdk\";\nimport { privateKeyToAddress } from \"@stacks/transactions\";\n\nconst seed = randomSeedPhrase();\n\nconst wallet = await generateWallet({\n secretKey: seed,\n password: 'secret',\n});\n\nconst address = privateKeyToAddress(wallet.accounts[0].stxPrivateKey, 'mainnet');\n// 'SP1MXSZF4NFC8JQ1TTYGEC2WADMC7Y3GHVZYRX6RF'\n```\n\n### Using a public key\n\n```ts -n\nimport { publicKeyToAddress } from '@stacks/transactions';\n\nconst address = publicKeyToAddress(publicKey, 'mainnet');\n// 'SP1MXSZF4NFC8JQ1TTYGEC2WADMC7Y3GHVZYRX6RF'\n```\n\n{/* todo: add accounts code sections, once we have better abstractions */}\n\n{/* todo: multisig */}\n"],[108,"\nThe `and` function in Clarity performs a logical AND operation on two or more boolean inputs. It's a fundamental logical operation used in many smart contract conditions and control flows.\n\n## Function Signature\n\n```clarity\n(and b1 b2 ...)\n```\n\n- Input: Two or more boolean values\n- Output: A single boolean value\n\n## Why it matters\n\nThe `and` function is crucial for:\n\n1. Implementing complex conditional logic in smart contracts.\n2. Combining multiple conditions that all need to be true.\n3. Short-circuiting evaluations for efficiency.\n4. Creating sophisticated access control mechanisms.\n\n## When to use it\n\nUse the `and` function when you need to:\n\n- Check if multiple conditions are all true.\n- Implement multi-factor authentication or permissions.\n- Optimize condition checking by short-circuiting.\n- Combine the results of multiple comparison operations.\n\n## Best Practices\n\n- Leverage the short-circuiting behavior for efficiency.\n- Order conditions from most likely to fail to least likely for better performance.\n- Use parentheses to group complex logical expressions for clarity.\n- Consider breaking very complex `and` expressions into separate functions or variables for readability.\n\n## Practical Example: Simple Access Control\n\nLet's implement a simple access control function that uses the `and` function to check multiple conditions:\n\n```clarity\n(define-constant CONTRACT_OWNER tx-sender)\n(define-data-var isAdmin bool false)\n(define-data-var isActive bool true)\n\n(define-public (set-admin (enabled bool))\n (begin\n (asserts! (is-eq tx-sender CONTRACT_OWNER) (err u1))\n (ok (var-set isAdmin enabled))\n )\n)\n\n(define-public (perform-sensitive-action)\n (begin\n (asserts! (and (var-get isAdmin) (var-get isActive)) (err u2))\n ;; Perform the sensitive action here\n (ok true)\n )\n)\n\n;; Usage\n(perform-sensitive-action) ;; Returns (err u2)\n(set-admin true) ;; Returns (ok true)\n(perform-sensitive-action) ;; Returns (ok true)\n```\n\nThis example demonstrates:\n1. Using `and` to check if the sender is an admin and if the contract is active.\n2. Combining multiple conditions in a single `and` expression.\n3. Leveraging short-circuiting to avoid unnecessary computations if the first condition fails.\n\n## Common Pitfalls\n\n1. Forgetting that `and` short-circuits, which might lead to unexpected behavior if side effects are intended in later conditions.\n2. Over-complicating logical expressions, making them hard to read and maintain.\n3. Not considering the order of conditions for optimal performance.\n\n## Related Functions\n\n- `or`: Used for logical OR operations.\n- `not`: Used to negate boolean values.\n- `asserts!`: Often used in combination with `and` for multiple condition checks.\n\n## Conclusion\n\nThe `and` function is a powerful tool for creating complex logical conditions in Clarity smart contracts. By understanding its short-circuiting behavior and using it effectively, you can create efficient and sophisticated contract logic, especially for scenarios requiring multiple conditions to be true simultaneously.\n"],[113,"\nThe `bit-and` function in Clarity performs a bitwise AND operation on two or more integer inputs. It's a powerful tool for working with compact data representations and flag systems in smart contracts.\n\n## Function Signature\n\n```clarity\n(bit-and i1 i2...)\n```\n\n- Input: Two or more integers (int or uint)\n- Output: A single integer (int or uint)\n\n## Why it matters\n\nThe `bit-and` function is crucial for:\n\n1. Efficient data storage: Allows packing multiple boolean flags into a single integer.\n2. Permission systems: Enables checking for specific permissions in a compact format.\n3. Bitmasking: Useful for isolating specific bits in a larger integer.\n4. Low-level optimizations: Can be used for certain mathematical operations.\n\n## When to use it\n\nUse `bit-and` when you need to:\n\n- Check if specific bits are set in a bitfield\n- Implement compact permission or flag systems\n- Clear specific bits while leaving others unchanged\n- Perform certain low-level optimizations\n\n## Best Practices\n\n- Always use constants for bit flags to improve readability and maintainability.\n- Be cautious when using with signed integers, as the sign bit can affect results.\n- Combine with other bitwise operations like `bit-or` and `bit-not` for more complex manipulations.\n- Document your bit flag meanings clearly in your contract.\n\n## Practical Example: Role-Based Access Control\n\nLet's implement a simple role-based access control system using `bit-and`:\n\n```clarity\n;; Define role constants\n(define-constant ROLE_ADMIN u1) ;; 0001\n(define-constant ROLE_MODERATOR u2) ;; 0010\n(define-constant ROLE_USER u4) ;; 0100\n\n;; Map to store user roles\n(define-map UserRoles principal uint)\n\n;; Function to check if a user has a specific role\n(define-read-only (has-role? (user principal) (role uint))\n (let\n ((userRole (default-to u0 (map-get? UserRoles user))))\n (is-eq (bit-and userRole role) role)\n )\n)\n\n;; Function to add a role to a user\n(define-public (add-role (user principal) (role uint))\n (let\n ((currentRole (default-to u0 (map-get? UserRoles user))))\n (ok (map-set UserRoles user (bit-or currentRole role)))\n )\n)\n\n;; Function to remove a role from a user\n(define-public (remove-role (user principal) (role uint))\n (let\n ((currentRole (default-to u0 (map-get? UserRoles user))))\n (ok (map-set UserRoles user (bit-and currentRole (bit-not role))))\n )\n)\n\n;; Example usage\n(add-role tx-sender (bit-or ROLE_MODERATOR ROLE_USER))\n(has-role? tx-sender ROLE_MODERATOR) ;; Returns true\n(has-role? tx-sender ROLE_ADMIN) ;; Returns false\n(remove-role tx-sender ROLE_USER)\n(has-role? tx-sender ROLE_USER) ;; Returns false\n```\n\nThis example demonstrates:\n1. Using `bit-and` to check for specific roles.\n2. Combining `bit-and` with `bit-or` and `bit-not` for role management.\n3. Efficient storage of multiple roles in a single integer.\n\n## Common Pitfalls\n\n1. Forgetting that `bit-and` with 0 always results in 0.\n2. Not accounting for the sign bit when using signed integers.\n3. Overcomplicating bit flag systems, making them hard to maintain.\n\n## Related Functions\n\n- `bit-or`: Used to set bits or combine flags.\n- `bit-not`: Used to invert bits, often in combination with `bit-and` for clearing specific bits.\n- `bit-xor`: Used for toggling specific bits.\n\n## Conclusion\n\nThe `bit-and` function is a powerful tool for working with compact data representations in Clarity. By mastering this function along with other bitwise operations, you can create efficient and sophisticated smart contracts that make optimal use of storage and perform complex flag-based logic.\n"],[137,"\nThe addition function (`+`) in Clarity performs addition on a variable number of integer inputs. It's a fundamental arithmetic operation used in many smart contract calculations.\n\n## Function Signature\n\n```clarity\n(+ i1 i2...)\n```\n\n- Input: Two or more integers (int or uint)\n- Output: A single integer (int or uint)\n\n## Why it matters\n\nThe addition function is crucial for:\n\n1. Performing basic arithmetic calculations within smart contracts.\n2. Incrementing counters or values.\n3. Combining multiple quantities or balances.\n4. Implementing mathematical formulas that involve addition.\n\n## When to use it\n\nUse the addition function when you need to:\n\n- Perform basic addition in your contract logic.\n- Increment values or counters.\n- Sum up multiple values.\n- Implement mathematical formulas that involve addition.\n\n## Best Practices\n\n- Always consider the possibility of overflow when adding large numbers.\n- Use appropriate types (int or uint) based on your needs and expected value ranges.\n- Be aware that adding negative numbers to positive numbers can result in subtraction.\n- Consider using checked arithmetic functions if overflow detection is critical.\n\n## Practical Example: Simple Counter\n\nLet's implement a simple counter that uses the addition function to increment its value:\n\n```clarity\n(define-data-var counter int 0)\n\n(define-public (increment-counter (amount int))\n (begin\n (var-set counter (+ (var-get counter) amount))\n (ok (var-get counter))\n )\n)\n\n;; Usage\n(increment-counter 1) ;; Increments the counter by 1\n(increment-counter 5) ;; Increments the counter by 5\n```\n\nThis example demonstrates:\n1. Using addition to increment the value of a counter.\n2. Implementing a public function to handle the increment operation.\n3. Returning the updated counter value.\n\n## Common Pitfalls\n\n1. Overlooking potential overflow when adding large numbers.\n2. Not considering the effect of adding negative numbers (for int types).\n3. Forgetting to update related variables or state when incrementing values.\n\n## Related Functions\n\n- `-`: Used for subtraction operations.\n- `*`: Used for multiplication operations.\n- `/`: Used for division operations.\n\n## Conclusion\n\nThe addition function is a fundamental tool for performing arithmetic operations in Clarity smart contracts. By understanding its behavior with different types of inputs and potential edge cases, you can use it effectively to implement various mathematical operations in your contracts, from simple increments to more complex calculations.\n"],[379,"\nThe core design of Chainhook revolves around the concept of predicates. Each individual chainhook has a customizable predicate that specifies what Bitcoin or Stacks blockchain data you are scanning for.\n\n<Callout type=\"warn\" title=\"Requirements\">\n Commands outlined here will require that you have [installed Chainhook directly](/stacks/chainhook/installation) first.\n</Callout>\n\n## Predicate design\nBelow is the general strucure of the `predicate` JSON with its primary elements. These elements and their values are required. \n\n- Chainhook will evaluate the predicate against the specfied blockchain specified in `chain`.\n- The `uuid` will be returned in the Chainhook payload, providing a record of the predicate that triggers it.\n- Identify your predicate for your app using `name` and `version`.\n\n```json\n {\n \"chain\": \"stacks\",\n \"uuid\": \"1\",\n \"name\": \"STX_Transfer_Predicate\",\n \"version\": 1,\n \"networks\": {\n // Other configurations\n }\n }\n ```\n\n<Callout type=\"info\" title=\"Note\">\n You can use the following command to verify your predicate:\n ```\n chainhook predicate check your-predicate-file.json --mainnet\n ```\n</Callout>\n\n## Networks\n\nThe `networks` element contains an object who's key determines the blockchain network you want Chainhook to scan. \n- This object's value will contain the `if_this` and then `then_that` specifications.\n- Multple networks can be specified in the `networks` element.\n\n```json\n \"networks\": {\n \"mainnet\": {\n // if_this and then_that specifications\n // Other configurations\n },\n \"testnet\": {\n // if_this and then_that specifications\n // Other configurations\n },\n }\n```\n\n<Callout type=\"info\" title=\"Note\">\n For additional information, check out the [Bitcoin scopes](/stacks/chainhook/references/scopes/bitcoin) and [Stacks scopes](/stacks/chainhook/references/scopes/stacks) references pages.\n</Callout>\n\n## if_this specification\n\nThe `predicate` identifies what data you want Chainhook to scan for using the `scope` define within the `if_this` specification. Additional arguments specific to the `scope` will also be passed here.\n\n```json\n {\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n }\n }\n```\n\n## then_that specification\n\nChainhook delivers the payload when it is triggered by your `predicate` using the `then_that` specification. There are 2 options available:\n\n1. `file_append`\n2. `http_post`\n\nWhen choosing to use file_append, specify the path where Chainhook will post the payload data.\n\n```json \n{\n \"then_that\": {\n \"file_append\": { \n \"path\": \"/tmp/events.json\"\n }\n }\n}\n```\n\nWhen using `http_post`, specify the endpoint's `url` and `authorization_header`.\n\n```json\n{\n \"then_that\": {\n \"http_post\": {\n \"url\": \"https://webhook.site/abc123456-789e-0fgh-1ijk-23lmno456789\",\n \"authorization_header\": \"12345\"\n }\n }\n}\n```\n\n<Callout title=\"Note\">\n Chainhook requires `https` to post to your endpoint. You can use a service like [LocalTunnel](https://github.com/localtunnel/localtunnel) to test locally or a site like [WebhookSite](https://webhook.site).\n</Callout>\n\n## Blockchain specific configurations\n\n<Tabs defaultValue=\"bitcoin\">\n <TabsList>\n <TabsTrigger value=\"bitcoin\">Bitcoin predicate</TabsTrigger>\n <TabsTrigger value=\"stacks\">Stacks predicate</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"bitcoin\">\n ```json\n {\n \"chain\": \"bitcoin\",\n \"uuid\": \"1\",\n \"name\": \"Wrap BTC\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"if_this\": {\n \"scope\": \"ordinals_protocol\",\n \"operation\": \"inscription_feed\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://localhost:3000/api/v1/ordinals\",\n \"authorization_header\": \"Bearer cn389ncoiwuencr\"\n }\n },\n \"start_block\": 10200\n // Additional configurations\n },\n \"mainnet\": {\n \"if_this\": {\n \"scope\": \"ordinals_protocol\",\n \"operation\": \"inscription_feed\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://my-protocol.xyz/api/v1/ordinals\",\n \"authorization_header\": \"Bearer cn389ncoiwuencr\"\n }\n },\n \"start_block\": 90232\n // Additional configurations\n }\n }\n }\n ```\n\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"start-block\">\n <AccordionTrigger>Ignore blocks before start block</AccordionTrigger>\n <AccordionContent>\n ```json\n \"start_block\": 101\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"end-block\">\n <AccordionTrigger>Ignore blocks after end block</AccordionTrigger>\n <AccordionContent>\n ```json\n \"end_block\": 201\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"expire\">\n <AccordionTrigger>Stop after number of occurrences</AccordionTrigger>\n <AccordionContent>\n ```json\n \"expire_after_occurrence\": 1\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"proofs\">\n <AccordionTrigger>Exclude proofs from payload</AccordionTrigger>\n <AccordionContent>\n ```json\n \"include_proof\": false\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"inputs\">\n <AccordionTrigger>Exclude transaction inputs from payload</AccordionTrigger>\n <AccordionContent>\n ```json\n \"include_inputs\": false\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"outputs\">\n <AccordionTrigger>Exclude transaction outputs from payload</AccordionTrigger>\n <AccordionContent>\n ```json\n \"include_outputs\": false\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"witness\">\n <AccordionTrigger>Exclude transaction witnesses from payload</AccordionTrigger>\n <AccordionContent>\n ```json\n \"include_witness\": false\n ```\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n <Callout type=\"info\" title=\"Note\">\n The following command allows you to generate a predicate template for the Bitcoin blockchain.\n ```\n chainhook predicates new your-bitcoin-predicate.json --bitcoin\n ```\n </Callout>\n\n </TabsContent>\n\n <TabsContent value=\"stacks\">\n ```json\n {\n \"chain\": \"stacks\",\n \"uuid\": \"1\",\n \"name\": \"Contract-Call-Chainhook\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"/tmp/events.json\"\n }\n },\n \"start_block\": 21443\n // Additional configurations\n },\n \"mainnet\": {\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://my-protocol.xyz/api/v1/ordinals\",\n \"authorization_header\": \"Bearer cn389ncoiwuencr\"\n }\n },\n \"start_block\": 142221\n // Additional configurations\n }\n }\n }\n ```\n\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"item-1\">\n <AccordionTrigger>Additional Stacks predicate configurations</AccordionTrigger>\n <AccordionContent>\n <p>These additional configurations can be used to improve the performance of Chainhook by preventing a full scan of the blockchain:</p>\n\n <p>Ignore any block before the given block:</p>\n\n ```json\n \"start_block\": 101\n ```\n\n <p>Ignore any block after the given block:</p>\n \n ```json\n \"end_block\": 201\n ```\n\n <p>Stop evaluating chainhook after a given number of occurrences found:</p>\n\n ```json\n \"expire_after_occurrence\": 1\n ```\n\n <p>Include decoded Clarity values in the payload:</p>\n\n ```json\n \"decode_clarity_values\": true\n ```\n\n <p>Include the contract ABI for transactions that deploy contracts:</p>\n\n ```json\n \"include_contract_abi\": true\n ```\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n <Callout type=\"info\" title=\"Note\">\n The following command allows you to generate a predicate template for the Stacks blockchain.\n ```\n chainhook predicates new your-stacks-predicate.json --stacks\n ```\n </Callout>\n\n </TabsContent>\n</Tabs>\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/observing-contract-calls\"\n title=\"Observing contract calls\"\n description=\"Learn use a predicate to observe Stacks contracts calls with Chainhook.\"\n />\n <Card\n href=\"/stacks/platform/guides/create-chainhooks\"\n title=\"Create a chainhook\"\n description=\"Learn how to create a chainhook using the Hiro Platform.\"\n />\n <Card\n href=\"/stacks/chainhook/references/scopes/stacks\"\n title=\"Stacks scopes\"\n description=\"Learn how to use additional scopes to scan for specific Stacks blockchain events.\"\n />\n <Card\n href=\"/stacks/chainhook/references/scopes/bitcoin\"\n title=\"Bitcoin scopes\"\n description=\"Learn how to use additional scopes to scan for specific Bitcoin blockchain events.\"\n />\n</Cards>\n\n"],[112,"\nThe division function (`/`) in Clarity performs integer division on a variable number of integer inputs. It's a fundamental arithmetic operation used in many smart contract calculations.\n\n## Function Signature\n\n```clarity\n(/ i1 i2...)\n```\n\n- Input: Two or more integers (int or uint)\n- Output: A single integer (int or uint)\n\n## Why it matters\n\nThe division function is crucial for:\n\n1. Performing basic arithmetic calculations within smart contracts.\n2. Calculating rates, percentages, or proportions.\n3. Distributing resources or tokens evenly.\n4. Implementing mathematical formulas that involve division.\n\n## When to use it\n\nUse the division function when you need to:\n\n- Perform basic division in your contract logic.\n- Calculate rates or percentages.\n- Distribute resources evenly among participants.\n- Implement mathematical formulas that involve division.\n\n## Best Practices\n\n- Always consider the possibility of division by zero, which throws a runtime error.\n- Be aware that Clarity uses integer division, so results are always rounded down.\n- Use appropriate types (int or uint) based on your needs and expected value ranges.\n- Consider using multiplication by fractions instead of division for more precise calculations.\n\n## Practical Example: Token Distribution Contract\n\nLet's implement a simple token distribution contract that uses division to allocate tokens evenly:\n\n```clarity\n;; Define constants\n(define-constant TOTAL_TOKENS u1000000)\n(define-constant DISTRIBUTION_ROUNDS u10)\n\n;; Define data variables\n(define-map ParticipantShares principal uint)\n(define-data-var currentRound uint u0)\n(define-data-var participantsCount uint u0)\n\n;; Function to register as a participant\n(define-public (register-participant)\n (let\n (\n (currentParticipants (var-get participantsCount))\n )\n (asserts! (< currentParticipants DISTRIBUTION_ROUNDS) (err u1))\n (map-set ParticipantShares tx-sender u0)\n (var-set participantsCount (+ currentParticipants u1))\n (ok true)\n )\n)\n\n;; Function to distribute tokens\n(define-public (distribute-tokens)\n (let\n (\n (currentParticipants (var-get participantsCount))\n (tokensPerParticipant (/ TOTAL_TOKENS currentParticipants))\n )\n (asserts! (> currentParticipants u0) (err u2))\n (asserts! (< (var-get currentRound) DISTRIBUTION_ROUNDS) (err u3))\n (map-set ParticipantShares tx-sender tokensPerParticipant)\n (var-set currentRound (+ (var-get currentRound) u1))\n (ok tokensPerParticipant)\n )\n)\n\n;; Function to check participant's share\n(define-read-only (get-participant-share (participant principal))\n (default-to u0 (map-get? ParticipantShares participant))\n)\n```\n\nThis example demonstrates:\n1. Using division to calculate the number of tokens each participant should receive.\n2. Handling potential division by zero by checking the number of participants.\n3. Using integer division to evenly distribute tokens among participants.\n\n## Common Pitfalls\n\n1. Forgetting to handle division by zero, which causes a runtime error.\n2. Not accounting for integer division rounding down, which can lead to unexpected results.\n3. Dividing before multiplying in complex calculations, potentially losing precision.\n\n## Related Functions\n\n- `*`: Used for multiplication operations.\n- `+`: Used for addition operations.\n- `-`: Used for subtraction operations.\n\n## Conclusion\n\nThe division function is a fundamental tool for performing arithmetic operations in Clarity smart contracts. By understanding its behavior with integer division and potential edge cases, you can use it effectively to implement various mathematical operations in their contracts, from simple divisions to more complex token distribution algorithms.\n"],[237,"\nThe following shows how to create a simple transaction (STX transfer) using Stacks.js in different environments.\n\n## Creating a transaction\n\n### Using Stacks Connect\n\n```ts -n\nimport { openSTXTransfer } from '@stacks/connect';\n\nopenSTXTransfer({\n network: 'testnet',\n\n recipient: 'ST39MJ145BR6S8C315AG2BD61SJ16E208P1FDK3AK', // which address you are sending to\n amount: 10000, // tokens, denominated in micro-STX\n\n onFinish: response => console.log(response.txid),\n onCancel: () => console.log('User canceled'),\n});\n```\n\n### Using a private key\n\nFor full manual transaction signing, you need to provide the sender's private key.\nTreat the private key as a secret and *never* expose it to the public.\n\n```ts -n\nimport { makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst privateKey = randomPrivateKey(); // see \"Private Keys & Wallets\" page\n\nconst tx = await makeSTXTokenTransfer({\n recipient: 'ST39MJ145BR6S8C315AG2BD61SJ16E208P1FDK3AK', // which address you are sending to\n amount: 10000, // tokens, denominated in micro-STX\n senderKey: privateKey,\n network: \"testnet\",\n});\n```\n\n## Different transaction types\n\nIn Stacks.js, we can create transactions for different purposes:\n- STX token transfers\n- Smart contract calls\n- Smart contract deployments\n"],[154,"\nThe greater than function (`>`) in Clarity compares two values and returns true if the first value is greater than the second. It's a fundamental comparison operation used in many smart contract conditions and logic flows.\n\n## Function Signature\n\n```clarity\n(> v1 v2)\n```\n\n- Input: Two values of the same type (int, uint, string-ascii, string-utf8, or buff)\n- Output: A boolean (true or false)\n\n## Why it matters\n\nThe greater than function is crucial for:\n\n1. Implementing conditional logic in smart contracts.\n2. Comparing numerical values for financial operations.\n3. Ordering and sorting data.\n4. Implementing thresholds or limits in contract logic.\n\n## When to use it\n\nUse the greater than function when you need to:\n\n- Compare two numerical values to determine if one is larger.\n- Implement minimum thresholds for certain operations.\n- Create conditional logic based on numerical comparisons.\n- Sort or order data based on numerical or lexicographical order.\n\n## Best Practices\n\n- Ensure that both inputs are of the same type to avoid runtime errors.\n- Be aware of the differences in comparison between signed (int) and unsigned (uint) integers.\n- When comparing strings or buffers, understand that the comparison is lexicographical.\n- Consider edge cases, especially when dealing with the limits of integer ranges.\n\n## Practical Example: Token Sale with Minimum Purchase\n\nLet's implement a simple token sale contract that uses the greater than function to enforce a minimum purchase amount:\n\n```clarity\n;; Define constants\n(define-constant MIN_PURCHASE u100000000) ;; 1 STX\n(define-constant TOKEN_PRICE u50000) ;; 0.0005 STX per token\n\n;; Define data variables\n(define-data-var tokensSold uint u0)\n\n;; Function to purchase tokens\n(define-public (purchase-tokens (amount uint))\n (let\n (\n (tokensToMint (/ amount TOKEN_PRICE))\n (payment amount)\n )\n ;; Check if the purchase amount is greater than the minimum\n (asserts! (> payment MIN_PURCHASE) (err u1))\n ;; Perform the token purchase\n (try! (stx-transfer? payment tx-sender (as-contract tx-sender)))\n (var-set tokensSold (+ (var-get tokensSold) tokensToMint))\n ;; Here you would typically mint or transfer tokens to the buyer\n (ok tokensToMint)\n )\n)\n\n;; Function to check total tokens sold\n(define-read-only (get-tokensSold)\n (ok (var-get tokensSold))\n)\n```\n\nThis example demonstrates:\n1. Using `>` to check if the payment amount exceeds the minimum purchase threshold.\n2. Combining the greater than check with other contract logic for a token sale.\n3. Implementing a minimum purchase amount to prevent small, potentially spam transactions.\n\n## Common Pitfalls\n\n1. Comparing values of different types, which will result in a runtime error.\n2. Not considering the inclusive nature of `>=` vs the exclusive nature of `>` when setting thresholds.\n3. Overlooking potential integer overflow when working with very large numbers.\n\n## Related Functions\n\n- `<`: Used for less than comparisons.\n- `>=`: Used for greater than or equal to comparisons.\n- `<=`: Used for less than or equal to comparisons.\n\n## Conclusion\n\nThe greater than function is a fundamental tool for implementing comparison logic in Clarity smart contracts. By understanding its behavior with different types and potential edge cases, you can create robust conditional logic and enforce important thresholds in your contracts.\n"],[191,"\nThe greater than or equal function (`>=`) in Clarity compares two values and returns true if the first value is greater than or equal to the second. It's a fundamental comparison operation used in many smart contract conditions and logic flows.\n\n## Function Signature\n\n```clarity\n(>= v1 v2)\n```\n\n- Input: Two values of the same type (int, uint, string-ascii, string-utf8, or buff)\n- Output: A boolean (true or false)\n\n## Why it matters\n\nThe greater than or equal function is crucial for:\n\n1. Implementing conditional logic in smart contracts.\n2. Comparing numerical values for financial operations.\n3. Ordering and sorting data.\n4. Implementing minimum thresholds or limits in contract logic.\n5. Checking for equality alongside greater than comparisons.\n\n## When to use it\n\nUse the greater than or equal function when you need to:\n\n- Compare two numerical values to determine if one is larger or equal.\n- Implement minimum thresholds for certain operations, including the threshold value itself.\n- Create conditional logic based on numerical comparisons, including equality.\n- Sort or order data based on numerical or lexicographical order, including equal values.\n\n## Best Practices\n\n- Ensure that both inputs are of the same type to avoid runtime errors.\n- Be aware of the differences in comparison between signed (int) and unsigned (uint) integers.\n- When comparing strings or buffers, understand that the comparison is lexicographical.\n- Consider edge cases, especially when dealing with the limits of integer ranges.\n- Use `>=` instead of `>` when you want to include equality in your comparison.\n\n## Practical Example: Token Unlock Schedule\n\nLet's implement a simple token unlock schedule that uses the greater than or equal function to manage token releases:\n\n```clarity\n;; Define constants\n(define-constant UNLOCK_AMOUNT u1000000) ;; 1 million tokens per unlock\n(define-constant UNLOCK_INTERVAL u17280) ;; Approximately 30 days in blocks\n(define-constant TOTAL_UNLOCKS u10) ;; 10 total unlocks\n\n;; Define data variables\n(define-data-var startBlock uint u0)\n(define-data-var unlocksClaimed uint u0)\n\n;; Function to start the unlock schedule\n(define-public (start-unlock-schedule)\n (begin\n (asserts! (is-eq (var-get startBlock) u0) (err u1))\n (var-set startBlock block-height)\n (ok true)\n )\n)\n\n;; Function to calculate claimable tokens\n(define-read-only (get-claimable-tokens)\n (let\n (\n (elapsedBlocks (- block-height (var-get startBlock)))\n (unlocksDue (/ elapsedBlocks UNLOCK_INTERVAL))\n )\n (if (>= unlocksDue TOTAL_UNLOCKS)\n (* UNLOCK_AMOUNT (- TOTAL_UNLOCKS (var-get unlocksClaimed)))\n (* UNLOCK_AMOUNT (- unlocksDue (var-get unlocksClaimed)))\n )\n )\n)\n\n;; Function to claim tokens\n(define-public (claim-tokens)\n (let\n (\n (claimableAmount (get-claimable-tokens))\n )\n (asserts! (> claimableAmount u0) (err u2))\n (var-set unlocksClaimed (+ (var-get unlocksClaimed) (/ claimableAmount UNLOCK_AMOUNT)))\n ;; Here you would typically transfer tokens\n ;; For simplicity, we're just returning the claimed amount\n (ok claimableAmount)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `>=` to check if the number of unlocks due is greater than or equal to the total number of unlocks.\n2. Combining the greater than or equal check with other contract logic for a token unlock system.\n3. Implementing a minimum threshold (the unlock interval) that includes the exact unlock time.\n\n## Common Pitfalls\n\n1. Comparing values of different types, which will result in a runtime error.\n2. Confusing `>=` with `>` when setting thresholds, potentially excluding valid values.\n3. Overlooking the inclusive nature of `>=` in boundary conditions.\n\n## Related Functions\n\n- `>`: Used for strict greater than comparisons.\n- `<`: Used for less than comparisons.\n- `<=`: Used for less than or equal to comparisons.\n\n## Conclusion\n\nThe greater than or equal function is a fundamental tool for implementing comparison logic in Clarity smart contracts. By understanding its behavior with different types and potential edge cases, you can create robust conditional logic and enforce important thresholds in your contracts, including scenarios where equality is a valid condition.\n"],[114,"\nThe less than function (`<`) in Clarity compares two values and returns true if the first value is less than the second. It's a fundamental comparison operation used in many smart contract conditions and logic flows.\n\n## Function Signature\n\n```clarity\n(< v1 v2)\n```\n\n- Input: Two values of the same type (int, uint, string-ascii, string-utf8, or buff)\n- Output: A boolean (true or false)\n\n## Why it matters\n\nThe less than function is crucial for:\n\n1. Implementing conditional logic in smart contracts.\n2. Comparing numerical values for financial operations.\n3. Ordering and sorting data.\n4. Implementing maximum thresholds or limits in contract logic.\n\n## When to use it\n\nUse the less than function when you need to:\n\n- Compare two numerical values to determine if one is smaller.\n- Implement maximum thresholds for certain operations.\n- Create conditional logic based on numerical comparisons.\n- Sort or order data based on numerical or lexicographical order.\n\n## Best Practices\n\n- Ensure that both inputs are of the same type to avoid runtime errors.\n- Be aware of the differences in comparison between signed (int) and unsigned (uint) integers.\n- When comparing strings or buffers, understand that the comparison is lexicographical.\n- Consider edge cases, especially when dealing with the limits of integer ranges.\n\n## Practical Example: Auction Contract with Maximum Bid\n\nLet's implement a simple auction contract that uses the less than function to enforce a maximum bid amount:\n\n```clarity\n;; Define constants\n(define-constant MAX_BID u1000000000) ;; 1000 STX\n(define-constant AUCTION_END_HEIGHT u100)\n\n;; Define data variables\n(define-data-var currentHighestBid uint u0)\n(define-data-var highestBidder (optional principal) none)\n\n;; Function to place a bid\n(define-public (place-bid (bid uint))\n (let\n (\n (current-block-height block-height)\n )\n ;; Check if the auction is still open\n (asserts! (< current-block-height AUCTION_END_HEIGHT) (err u1))\n ;; Check if the bid is less than the maximum allowed bid\n (asserts! (< bid MAX_BID) (err u2))\n ;; Check if the bid is higher than the current highest bid\n (asserts! (> bid (var-get currentHighestBid)) (err u3))\n ;; Place the bid\n (try! (stx-transfer? bid tx-sender (as-contract tx-sender)))\n (var-set currentHighestBid bid)\n (var-set highestBidder (some tx-sender))\n (ok bid)\n )\n)\n\n;; Function to check current highest bid\n(define-read-only (get-highest-bid)\n (ok (var-get currentHighestBid))\n)\n\n;; Function to check if auction has ended\n(define-read-only (auction-ended)\n (>= block-height AUCTION_END_HEIGHT)\n)\n```\n\nThis example demonstrates:\n1. Using `<` to check if the current block height is less than the auction end height.\n2. Using `<` to ensure the bid is less than the maximum allowed bid.\n3. Combining the less than check with other contract logic for an auction system.\n\n## Common Pitfalls\n\n1. Comparing values of different types, which will result in a runtime error.\n2. Not considering the inclusive nature of `<=` vs the exclusive nature of `<` when setting thresholds.\n3. Overlooking potential integer underflow when working with very small numbers.\n\n## Related Functions\n\n- `>`: Used for greater than comparisons.\n- `<=`: Used for less than or equal to comparisons.\n- `>=`: Used for greater than or equal to comparisons.\n\n## Conclusion\n\nThe less than function is a fundamental tool for implementing comparison logic in Clarity smart contracts. By understanding its behavior with different types and potential edge cases, you can create robust conditional logic and enforce important thresholds in your contracts.\n"],[176,"\nThe less than or equal function (`<=`) in Clarity compares two values and returns true if the first value is less than or equal to the second. It's a fundamental comparison operation used in many smart contract conditions and logic flows.\n\n## Function Signature\n\n```clarity\n(<= v1 v2)\n```\n\n- Input: Two values of the same type (int, uint, string-ascii, string-utf8, or buff)\n- Output: A boolean (true or false)\n\n## Why it matters\n\nThe less than or equal function is crucial for:\n\n1. Implementing conditional logic in smart contracts.\n2. Comparing numerical values for financial operations.\n3. Ordering and sorting data.\n4. Implementing maximum thresholds or limits in contract logic.\n5. Checking for equality alongside less than comparisons.\n\n## When to use it\n\nUse the less than or equal function when you need to:\n\n- Compare two numerical values to determine if one is smaller or equal.\n- Implement maximum thresholds for certain operations, including the threshold value itself.\n- Create conditional logic based on numerical comparisons, including equality.\n- Sort or order data based on numerical or lexicographical order, including equal values.\n\n## Best Practices\n\n- Ensure that both inputs are of the same type to avoid runtime errors.\n- Be aware of the differences in comparison between signed (int) and unsigned (uint) integers.\n- When comparing strings or buffers, understand that the comparison is lexicographical.\n- Consider edge cases, especially when dealing with the limits of integer ranges.\n- Use `<=` instead of `<` when you want to include equality in your comparison.\n\n## Practical Example: Token Vesting Contract\n\nLet's implement a simple token vesting contract that uses the less than or equal function to manage vesting periods:\n\n```clarity\n;; Define constants\n(define-constant VESTING_PERIOD u31536000) ;; 1 year in seconds\n(define-constant TOTAL_ALLOCATION u1000000) ;; 1 million tokens\n\n;; Define data variables\n(define-data-var vestingStartTime uint u0)\n(define-data-var tokensClaimed uint u0)\n\n;; Function to start vesting\n(define-public (start-vesting)\n (begin\n (asserts! (is-eq (var-get vestingStartTime) u0) (err u1))\n (var-set vestingStartTime block-height)\n (ok true)\n )\n)\n\n;; Function to calculate vested amount\n(define-read-only (get-vested-amount)\n (let\n (\n (elapsed-time (- block-height (var-get vestingStartTime)))\n (vesting-ratio (/ elapsed-time VESTING_PERIOD))\n )\n (if (<= elapsed-time VESTING_PERIOD)\n (* TOTAL_ALLOCATION vesting-ratio)\n TOTAL_ALLOCATION\n )\n )\n)\n\n;; Function to claim vested tokens\n(define-public (claim-tokens)\n (let\n (\n (vested-amount (get-vested-amount))\n (claimable-amount (- vested-amount (var-get tokensClaimed)))\n )\n (asserts! (> claimable-amount u0) (err u2))\n (var-set tokensClaimed vested-amount)\n ;; Here you would typically transfer tokens\n ;; For simplicity, we're just returning the claimed amount\n (ok claimable-amount)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `<=` to check if the elapsed time is within or equal to the vesting period.\n2. Combining the less than or equal check with other contract logic for a vesting system.\n3. Implementing a maximum threshold (the vesting period) that includes the exact end time.\n\n## Common Pitfalls\n\n1. Comparing values of different types, which will result in a runtime error.\n2. Confusing `<=` with `<` when setting thresholds, potentially excluding valid values.\n3. Overlooking the inclusive nature of `<=` in boundary conditions.\n\n## Related Functions\n\n- `<`: Used for strict less than comparisons.\n- `>`: Used for greater than comparisons.\n- `>=`: Used for greater than or equal to comparisons.\n\n## Conclusion\n\nThe less than or equal function is a fundamental tool for implementing comparison logic in Clarity smart contracts. By understanding its behavior with different types and potential edge cases, you can create robust conditional logic and enforce important thresholds in your contracts, including scenarios where equality is a valid condition.\n"],[102,"\nThe multiplication function (`*`) in Clarity performs multiplication on a variable number of integer inputs. It's a fundamental arithmetic operation used in many smart contract calculations.\n\n## Function Signature\n\n```clarity\n(* i1 i2...)\n```\n\n- Input: Two or more integers (int or uint)\n- Output: A single integer (int or uint)\n\n## Why it matters\n\nThe multiplication function is crucial for:\n\n1. Performing basic arithmetic calculations within smart contracts.\n2. Scaling values, such as calculating fees or interest.\n3. Implementing more complex mathematical operations.\n4. Adjusting token amounts in financial contracts.\n\n## When to use it\n\nUse the multiplication function when you need to:\n\n- Perform basic multiplication in your contract logic.\n- Scale values proportionally.\n- Calculate compound values or rates.\n- Implement mathematical formulas that involve multiplication.\n\n## Best Practices\n\n- Always consider the possibility of overflow when multiplying large numbers.\n- Use appropriate types (int or uint) based on your needs and expected value ranges.\n- Consider using `mul-overflow?` for checked multiplication if overflow detection is needed.\n- Be aware that multiplying by zero will always return zero.\n\n## Practical Example: Token Vesting Contract\n\nLet's implement a simple token vesting contract that uses multiplication to calculate vested amounts:\n\n```clarity\n;; Define constants\n(define-constant VESTING_PERIOD u365) ;; 1 year in days\n(define-constant TOTAL_ALLOCATION u1000000) ;; Total tokens to vest\n\n;; Define data variables\n(define-data-var startTime uint u0)\n(define-data-var beneficiary principal tx-sender)\n\n;; Function to initialize vesting\n(define-public (start-vesting (recipient principal))\n (begin\n (asserts! (is-eq tx-sender (var-get beneficiary)) (err u1))\n (var-set startTime block-height)\n (var-set beneficiary recipient)\n (ok true)\n )\n)\n\n;; Function to calculate vested amount\n(define-read-only (get-vested-amount)\n (let\n (\n (elapsed-time (- block-height (var-get startTime)))\n (vesting-rate (/ TOTAL_ALLOCATION VESTING_PERIOD))\n )\n (if (>= elapsed-time VESTING_PERIOD)\n TOTAL_ALLOCATION\n (* vesting-rate elapsed-time)\n )\n )\n)\n\n;; Function to claim vested tokens\n(define-public (claim-tokens)\n (let\n (\n (vested-amount (get-vested-amount))\n )\n (asserts! (> vested-amount u0) (err u2))\n ;; Here you would typically transfer tokens\n ;; For simplicity, we're just returning the amount\n (ok vested-amount)\n )\n)\n```\n\nThis example demonstrates:\n1. Using multiplication to calculate the vested amount based on elapsed time and vesting rate.\n2. Combining multiplication with division to implement a linear vesting schedule.\n3. Using multiplication as part of a larger mathematical formula in a smart contract context.\n\n## Common Pitfalls\n\n1. Overlooking potential overflow when multiplying large numbers.\n2. Not considering the effect of integer division when combined with multiplication.\n3. Assuming multiplication always increases a value (forgetting about multiplication by fractions < 1 in integer arithmetic).\n\n## Related Functions\n\n- `/`: Used for division operations.\n- `+`: Used for addition operations.\n- `-`: Used for subtraction operations.\n- `mul-overflow?`: Used for checked multiplication with overflow detection.\n\n## Conclusion\n\nThe multiplication function is a fundamental tool for performing arithmetic operations in Clarity smart contracts. By understanding its behavior with different types of inputs and potential edge cases, you can use it effectively to implement various mathematical operations in your contracts, from simple scaling to more complex financial calculations.\n"],[427,"\nThe Runes API is a service that helps you with the complete ingestion of Bitcoin Runes data. Using our endpoints, you can retrieve metadata for a particular rune, trading activity, all runes held by a particular address, and more.\n\nThe Runes API uses REST endpoints and cached responses in order to optimize performance and reduce unnecessary requests. Reliable, consistent runes data, one request away.\n\n## Popular endpoints\n\n<Cards>\n <Card\n href=\"/bitcoin/runes/api/etchings/get-etchings\"\n title=\"Fetch Runes\"\n description=\"Retrieves a list of etchings.\"\n />\n <Card\n href=\"/bitcoin/runes/api/balances/holders\"\n title=\"Showcase user portfolios\"\n description=\"Retrieves a list of Rune holders.\"\n />\n <Card\n href=\"/bitcoin/runes/api/activities/activity\"\n title=\"Track your favorite Runes\"\n description=\"Retrieves all activity for a Rune.\"\n />\n</Cards>\n\n### Related tools\n\n{/* - **[Runehook](/bitcoin/runes/runeshook)**: Want to run your own infra? [Set up your own Runehook](/bitcoin/runes/runeshook/guides/runehook-as-a-service), the indexer that powers the Rune API. */}\n- **[Ordinals API](/bitcoin/ordinals/api)**: Looking for on-chain ordinals data without the front end? Leverage the Ordinals API.\n- **[Ordinals Explorer](https://ordinals.hiro.so/)**: The Ordinals API powers Hiro’s Ordinals Explorer, which lets you rapidly discover inscriptions and verify on-chain activity.\n\n---\n\nNeed help building with Runes API? Reach out to us on the `#ordinals` channel on Discord. Or join us at our weekly office hours on Discord every Monday at 11am ET.\n"],[75,"\nThe Stacks Explorer frontend user interface is built with [React](https://reactjs.org/), [next.js](https://github.com/vercel/next.js) and [@stacks/ui](https://github.com/hirosystems/ui).\n\nBefore you can run the explorer on your machine locally, you must first clone the [Stacks Explorer](https://github.com/hirosystems/explorer) repository to obtain all of the necessary files and libraries needed.\n\n# Project dependencies\n\nOnce you have cloned the Stacks Explorer repositories, you will need to install the following project dependencies:\n\n- [NodeJS](https://nodejs.dev/en/) that includes `npm`\n- [PNPM](https://pnpm.io/installation/)\n- [Homebrew](https://brew.sh/)\n\n> **_NOTE:_**\n>\n> Although Homebrew is not required to install and operate the Stacks Explorer, it is highly recommended.\n\nOpen your terminal window, and make sure you are in the `/explorer` folder. Run the below command to install the dependencies:\n\n`pnpm i`\n\nAfter installing and configuring your environment, you can run the Stacks Explorer locally if you wish by running the following command:\n\n`pnpm dev`\n\n## Building for production\n\nYou may also build a production version of the Stacks Explorer. To do that, simply run the following command:\n\n`pnpm build`\n\n> **NOTE:**\n>\n> Running `pnpm build` also run the default next.js build task.\n"],[140,"\nThe subtraction function (`-`) in Clarity performs subtraction on a variable number of integer inputs. It's a fundamental arithmetic operation used in many smart contract calculations.\n\n## Function Signature\n\n```clarity\n(- i1 i2...)\n```\n\n- Input: Two or more integers (int or uint)\n- Output: A single integer (int or uint)\n\n## Why it matters\n\nThe subtraction function is crucial for:\n\n1. Performing basic arithmetic calculations within smart contracts.\n2. Decreasing values or counters.\n3. Calculating differences between quantities.\n4. Implementing mathematical formulas that involve subtraction.\n\n## When to use it\n\nUse the subtraction function when you need to:\n\n- Perform basic subtraction in your contract logic.\n- Decrement values or counters.\n- Calculate the difference between two or more values.\n- Implement mathematical formulas that involve subtraction.\n\n## Best Practices\n\n- Always consider the possibility of underflow when subtracting from small numbers.\n- Use appropriate types (int or uint) based on your needs and expected value ranges.\n- Be aware that subtracting a negative number results in addition.\n- Consider using checked arithmetic functions if underflow detection is critical.\n\n## Practical Example: Simple Escrow Contract\n\nLet's implement a basic escrow contract that uses subtraction to manage balances:\n\n```clarity\n;; Define constants\n(define-constant ESCROW_FEE u100) ;; 100 tokens as escrow fee\n\n;; Define data variables\n(define-map Balances principal uint)\n(define-data-var escrowBalance uint u0)\n\n;; Function to deposit funds\n(define-public (deposit (amount uint))\n (let\n (\n (currentBalance (default-to u0 (map-get? Balances tx-sender)))\n )\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n (map-set Balances tx-sender (+ currentBalance amount))\n (ok true)\n )\n)\n\n;; Function to initiate escrow\n(define-public (start-escrow (recipient principal) (amount uint))\n (let\n (\n (senderBalance (default-to u0 (map-get? Balances tx-sender)))\n )\n (asserts! (>= senderBalance (+ amount ESCROW_FEE)) (err u1))\n (map-set Balances tx-sender (- senderBalance (+ amount ESCROW_FEE)))\n (var-set escrowBalance (+ (var-get escrowBalance) amount))\n (ok true)\n )\n)\n\n;; Function to complete escrow and transfer funds\n(define-public (complete-escrow (recipient principal) (amount uint))\n (let\n (\n (escrowAmount (var-get escrowBalance))\n )\n (asserts! (>= escrowAmount amount) (err u2))\n (try! (as-contract (stx-transfer? amount tx-sender recipient)))\n (var-set escrowBalance (- escrowAmount amount))\n (ok true)\n )\n)\n```\n\nThis example demonstrates:\n1. Using subtraction to update `Balances` when initiating an escrow.\n2. Using subtraction to update the escrow balance when completing a transfer.\n3. Combining subtraction with addition to handle fees and balance updates.\n\n## Common Pitfalls\n\n1. Overlooking potential underflow when subtracting from small numbers.\n2. Not considering the effect of subtracting negative numbers (for int types).\n3. Forgetting to update related variables or state when decrementing values.\n\n## Related Functions\n\n- `+`: Used for addition operations.\n- `*`: Used for multiplication operations.\n- `/`: Used for division operations.\n\n## Conclusion\n\nThe subtraction function is a fundamental tool for performing arithmetic operations in Clarity smart contracts. By understanding its behavior with different types of inputs and potential edge cases, you can use it effectively to implement various mathematical operations in your contracts, from simple decrements to more complex financial calculations.\n"],[439,"\nThe Usage section should focus on practical, hands-on instructions for getting started with the API. This includes:\nAuthentication: How to authenticate with the API (e.g., API keys, OAuth tokens).\nMaking Requests: Basic examples of making requests to the API, including request format, essential headers, and parameters.\nHandling Responses: Information on response structure, understanding status codes, and error handling.\nRate Limits: If applicable, explain any rate limits and best practices for avoiding them.\nThe goal of the \"Usage\" section is to equip developers with the knowledge to make successful API calls and handle responses effectively.\n"],[462,"\nThe Usage section should focus on practical, hands-on instructions for getting started with the API. This includes:\nAuthentication: How to authenticate with the API (e.g., API keys, OAuth tokens).\nMaking Requests: Basic examples of making requests to the API, including request format, essential headers, and parameters.\nHandling Responses: Information on response structure, understanding status codes, and error handling.\nRate Limits: If applicable, explain any rate limits and best practices for avoiding them.\nThe goal of the \"Usage\" section is to equip developers with the knowledge to make successful API calls and handle responses effectively.\n"],[65,"\nThe Usage section should focus on practical, hands-on instructions for getting started with the API. This includes:\nAuthentication: How to authenticate with the API (e.g., API keys, OAuth tokens).\nMaking Requests: Basic examples of making requests to the API, including request format, essential headers, and parameters.\nHandling Responses: Information on response structure, understanding status codes, and error handling.\nRate Limits: If applicable, explain any rate limits and best practices for avoiding them.\nThe goal of the \"Usage\" section is to equip developers with the knowledge to make successful API calls and handle responses effectively.\n\n## Using Websockets\n\nThe WebSocket components enable you to subscribe to specific updates, providing a near real-time display of updates on transactions and accounts.\n\n```ts\nimport { connectWebSocketClient } from '@stacks/blockchain-api-client';\nconst client = await connectWebSocketClient('ws://api.hiro.so/');\nconst sub = await client.subscribeAddressTransactions(contractCall.txId, event => {\n console.log(event);\n});\n\nawait sub.unsubscribe();\n```"],[255,"\nTo make API responses more compact, lists returned by the API are paginated. For lists, the response body includes:\n\n- `limit`: The number of list items return per response\n- `offset`: The number of elements to skip (starting from 0)\n- `total`: The number of all available list items\n- `results`: The array of list items (length of array equals the set limit)\n\nHere is a sample response:\n\n```json\n{\n \"limit\": 10,\n \"offset\": 0,\n \"total\": 101922,\n \"results\": [\n {\n \"tx_id\": \"0x924e0a688664851f5f96b437fabaec19b7542cfcaaf92a97eae43384cacd83d0\",\n \"nonce\": 308,\n \"fee_rate\": \"0\",\n \"sender_address\": \"ST39F7SA0AKH7RB363W3NE2DTHD3P32ZHNX2KE7J9\",\n \"sponsored\": false,\n \"post_condition_mode\": \"deny\",\n \"post_conditions\": [],\n \"anchor_mode\": \"on_chain_only\",\n \"block_hash\": \"0x17ceb3da5f36aab351d6b14f5aa77f85bb6b800b954b2f24c564579f80116d99\",\n \"parent_block_hash\": \"0xe0d1e8d216a77526ae2ce40294fc77038798a179a6532bb8980d3c2183f58de6\",\n \"block_height\": 14461,\n \"burn_block_time\": 1622875042,\n \"burn_block_time_iso\": \"2021-06-05T06:37:22.000Z\",\n \"canonical\": true,\n \"tx_index\": 0,\n \"tx_status\": \"success\",\n \"tx_result\": {},\n \"microblock_hash\": \"\",\n \"microblock_sequence\": 2147483647,\n \"microblock_canonical\": true,\n \"event_count\": 0,\n \"events\": [],\n \"tx_type\": \"coinbase\",\n \"coinbase_payload\": {}\n },\n {}\n ]\n}\n```\n\nUsing the `limit` and `offset` properties, you can paginate through the entire list by increasing the offset by the limit until you reach the total.\n"],[28,"\nTo take advantage of these features, make sure to use Clarinet 2.15.0 or later.\n\n## About sBTC\n\nsBTC is a fungible token on the Stacks blockchain. It follows the\n[SIP-010 standard](https://github.com/stacksgov/sips/blob/main/sips/sip-010/sip-010-fungible-token-standard.md)\nfor fungible tokens.\n\nEven though it's *just* a fungible token, Clarinet has some helpers to make it easier to work with.\n\n## Using sBTC in your contract\n\nTo use sBTC in your contract, you need to add the `sbtc-deposit` smart contract to your requirements.\n\nIn a Clarinet project, run the following command:\n\n```terminal\n$ clarinet requirements add SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-deposit\n```\n\nThis will add the [`sbtc-deposit`](https://explorer.hiro.so/txid/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-deposit)\nsmart contract to your project, along with it's dependencies:\n- [`sbtc-token`](https://explorer.hiro.so/txid/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token)\n- [`sbtc-registry`](https://explorer.hiro.so/txid/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-registry)\n\nWhen Clarinet detects the `sbtc-deposit` contract, it will automatically fund your test wallets with \nsBTC that you can use to test your contract in Clarinet simnet and devnet.\n\n## Using sBTC in your contract\n\nAs a SIP-010 token, sBTC let you call the `transfer` function to transfer tokens from one address to another.\n\nLet's say we have an NFT contract that allows users to mint an NFT by spending sBTC. \n\n\n```clarity\n;; this code is for demo purposes\n;; it doesn't implement SIP-009 NFT standard\n(define-non-fungible-token nft-name uint)\n\n;; mint for 100 sats\n(define-data-var sats-sbtc-mint-price uint u100)\n(define-data-var next-id uint u0)\n\n(define-public (mint-one-with-sbtc)\n (begin\n ;; call the sbtc-token contract to transfer the sbtcs\n (try! (contract-call? 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token transfer\n (var-get sats-sbtc-mint-price)\n tx-sender\n (as-contract tx-sender)\n none\n ))\n\n (try! (nft-mint? nft-name (var-get next-id) tx-sender))\n\n (ok (var-set next-id (+ (var-get next-id) u1)))\n )\n)\n```\n\nBecause Clarinet already took care of funding the test wallets with sBTC, you can call the\n`mint-one-with-sbtc` function with one of your test wallets.\n\nIn simnet (unit tests or `clarinet console`), the deployer address of the contract will remain\n`SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4`, but in devnet, like every other requirements, the contract will\nbe deployed by the default deployer address. You don't have to worry about this—Clarinet always make\nsure that your contracts call the right address.\n\n## Deploying your contract on testnet\n\nOn testnet, the official Hiro sBTC contract is\n[ST1F7QA2MDF17S807EPA36TSS8AMEFY4KA9TVGWXT.sbtc-token](https://explorer.hiro.so/txid/ST1F7QA2MDF17S807EPA36TSS8AMEFY4KA9TVGWXT.sbtc-token?chain=testnet).\nThis is the contract that is linked to the sBTC faucet: `ST1F7QA2MDF17S807EPA36TSS8AMEFY4KA9TVGWXT.sbtc-deposit`.\n\nAgain, Clarinet will make sure that your contracts call this address when being deployed on mainnet.\nYou can see the address of the sbtc-contract being re-mapped in the testnet deployment plan.\n\n## Deploying your contract on mainnet\n\nOn mainnet, your contract will remain unchanged and call the one and only sBTC contract.\n"],[52,"\nWith Chainhook, you can automatically trigger an action in response to on-chain events on Stacks and Bitcoin, enabling you to use IFTTT (if_this, then_that) logic to power your applications. To learn more about Chainhook, refer to the [Chainhook overview](/stacks/chainhook).\n\n<Callout title=\"Programmatic API\">\n You can also create and manage chainhooks via the [Platform API](/stacks/platform-api/chainhooks).\n</Callout>\n\nTo get started in the Hiro Platform, login and toggle to the Chainhook page. There are two ways to create a chainhook. You can either create a chainhook from scratch using the platform UI, or you can upload chainhooks that you have already defined in JSON.\n\n![Create Chainhook Window](../images/chainhook/select-chainhook-tab.png)\n\nSelect the \"New Chainhook\" button.\n\n![Create Chainhook Window](../images/chainhook/create-chainhook-window.png)\n\nThis will open a panel on the right to create a chainhook. Use the following fields to create a Chainhook:\n\n**Name**: Input the name of your chainhook.\n\n**Chain**: Select which chain you want to build a chainhook for (Bitcoin or Stacks).\n\n**Network**: Choose which network the chainhook will observe.\n\n**If-this**: Based on the selected chain, you will see a list of available scopes for the `If-this` condition (also called a \"predicate\").\n\n<Callout title=\"Available Predicate Scopes\">\n -For Bitcoin, the available predicate options are `txid`,`outputs`, and\n `stacks_protocols`.\n \n -For Stacks, the available predicate options are\n `txid`, `block_height`, `fungible_token_event`, `non-fungible_token_event`,\n `stx_event`, `print_event`, and `contract_deployment`.\n\n_Refer to the [Bitcoin predicates](/stacks/chainhook/concepts/bitcoin-predicates) and [Stacks predicates](/stacks/chainhook/concepts/stacks-predicates) documents to understand the available predicates and how to use them._\n\n</Callout>\n\n**Then-that**: This action is defaulted to `http_post` to allow the chainhook to post events to the URL specified in the next field below.\n\n**URL**: Specify a URL to post chainhook events to the HTTP_post method.\n\n**Authorization Header**: This field is optional to add a Secret to the `authorization` header when posting payloads.\n\n**Start Block**: This field must specify the start block to search the chain.\n\n**End Block**: It is optional to specify the end block. However, to optimize your scan time, we recommended you specify this field.\n\n**Expire After Occurrence**: You can specify the chainhook to expire after a specific number of occurrences (a number greater than or equal to 1). You can leave this blank if you don't want to set any limit.\n\n**Decode Clarity Values**: This is enabled by default for Stacks predicates to help you decode Clarity values in your contract.\n\nYou'll also see the following options for Bitcoin chainhooks:\n\n**Include Proof**: Enable this option when you have evidence that the transaction or block has been verified and authorized by the sender using their private key. This proof is generally a cryptographic signature to a transaction or block on the Bitcoin blockchain.\n\n**Include Inputs**: Enable this option to include Bitcoin transaction inputs in the payload. In a Bitcoin transaction, inputs are references to previous transactions' outputs (also known as unspent transaction outputs or UTXOs) that are being spent in the current transaction. These inputs provide evidence that the sender has the right to spend the funds.\n\n**Include Outputs**: Enable this option to include Bitcoin transaction outputs in the payload. Including outputs in a Bitcoin transaction refers to specifying the destinations and amounts of Bitcoin being sent as part of a transaction. Outputs in a Bitcoin transaction represent the recipients' addresses and the corresponding amounts of Bitcoin they are receiving.\n\n**Include Witness**: Enable this option to include Bitcoin transaction witness in the payload. The witness data for a transaction includes the cryptographic signatures and other related information placed alongside the transaction data in the block.\n\nOnce you define all the required fields, you can select \"Create Chainhook\", and you can now see your created chainhook on the Chainhook page.\n\n![Chainhook created](../images/chainhook/created.png)\n\nThe `NAME`, `CHAIN`, `START BLOCK`, `NETWORK`, `STATUS`, and `LAST UPDATED` headers are updated based on the selected fields used to create a Chainhook.\n\nBased on the chosen network, the respective status columns in the Chainhook list page will be updated to \"Deployed.\"\n\nNote: there may be other fields in the UI to create a Chainhook based on the predicates defined above.\n\n## Upload a chainhook\n\nTo upload a chainhook, you can either select the \"Upload Chainhook\" button and choose the .json file that has the chainhook(s) you want to upload, or you can drag and drop the .json file into the file upload area.\n\n![Upload Chainhook](../images/chainhook/upload.png)\n\nThe upload file must be a .json file containing either a single json object representing a Chainhook predicate, or an array of json objects representing one or more Chainhook predicates.\n\nRefer to the [Bitcoin predicates](/stacks/chainhook/concepts/bitcoin-predicates) and [Stacks predicates](/stacks/chainhook/concepts/stacks-predicates) documents to understand the available predicates and how to prepare your Chainhook predicate JSON for upload.\n\n## Edit a chainhook\n\nOnce a chainhook is created, you can edit the chainhook by clicking the ellipse on the specific chainhook you want to edit.\n\n![Edit chainhook](../images/chainhook/edit-chainhook.png)\n\nUpdate the fields to reflect your desired changes and then select \"Update chainhook.\"\n\n## Duplicate a chainhook\n\nSelect the ellipse on the chainhook you want to duplicate and select \"Duplicate.\" This opens a right pane with all the fields populated to use to create a duplicate Chainhook.\n\nYou can update any fields or publish a direct copy by clicking \"Create Chainhook.\"\n\n## Delete a chainhook\n\nSelect the ellipse on the chainhook you wish to delete and select \"Delete.\" You will see a confirmation window to confirm if you want to delete the Chainhook.\n\n## Chainhook status\n\nThe Chainhook page has a `STATUS` column that displays whether your chainhooks are in an active, inactive, or error state. Active means the Chainhook is actively scanning blocks against its defined predicate, inactive means the Chainhook has reached a terminal state (e.g. its end block has been reached, and it is no longer scanning blocks), and error means the Chainhook ran into an error during its execution.\n\nMore status info can be found by hovering over the status element. For example, to understand why the Chainhook is in an error state, hover over the status element to find out.\n\n![Chainhook status](../images/chainhook/status-info.png)\n\n## References\n\n- [Use Chainhooks with Bitcoin](/stacks/chainhook/concepts/bitcoin-predicates)\n- [Use Chainhooks with Stacks](/stacks/chainhook/concepts/stacks-predicates)\n- [Run Chainhook as a service using Bitcoind](/stacks/chainhook/guides/chainhook-as-a-service)\n- [Run Chainhook as a service using Stacks](/stacks/chainhook/guides/chainhook-as-a-service-with-stacks-node)\n"],[374,"\nYou can run Chainhook as a service to evaluate Stacks blocks against your predicates. You can also dynamically register new predicates by enabling the predicates registration API.\n\nIn this guide, you will learn how to:\n\n1. [Configure your Stacks node to work with Chainhook](#configure-your-stacks-node).\n2. [Configure Chainhook](#configure-chainhook).\n3. [Create a predicate to evaluate your events](#create-a-predicate).\n4. [Initiate a Chainhook service to watch for matching transactions](#initiate-chainhook-as-a-service).\n5. [Dynamically register your predicates with Chainhook](#dynamically-register-predicates).\n\n{/* <Callout>Check out a full example [here](https://github.com/hiro-so/stacks-connect-example).</Callout> */}\n\n---\n\n## Configure Your Stacks Node\n\nIf you followed along with the previous guide on syncing a Stacks node, you should generate a `Stacks.toml` file within your Stacks node repository. Below is a sample `Stacks.toml` file:\n\n```toml title=\"Stacks.toml\"\n[node]\nworking_dir = \"/stacks-blockchain\"\nrpc_bind = \"0.0.0.0:20443\" # Make a note of this port to use in the `Chainhook.toml`\np2p_bind = \"0.0.0.0:20444\"\nbootstrap_node = \"02da7a464ac770ae8337a343670778b93410f2f3fef6bea98dd1c3e9224459d36b@seed-0.mainnet.stacks.co:20444,02afeae522aab5f8c99a00ddf75fbcb4a641e052dd48836408d9cf437344b63516@seed-1.mainnet.stacks.co:20444,03652212ea76be0ed4cd83a25c06e57819993029a7b9999f7d63c36340b34a4e62@seed-2.mainnet.stacks.co:20444\"\n\n[burnchain]\nchain = \"bitcoin\"\nmode = \"mainnet\"\npeer_host = \"localhost\"\nusername = \"bitcoind_username\" # Must match the rpcuser in the bitcoin.conf\npassword = \"bitcoind_password\" # Must match the rpcpassword in the bitcoin.conf\nrpc_port = 8332 # Must match the rpcport in the bitcoin.conf\npeer_port = 8333\n\n[[events_observer]]\nendpoint = \"localhost:20455\"\nretry_count = 255\nevents_keys = [\"*\"]\n```\n<Callout title=\"Note\">\nEnsure that the `username`, `password`, and `rpc_port` values in the `Stacks.toml` file match the values in the `bitcoin.conf` file. Also, note the `rpc_bind` port to use in the `Chainhook.toml` configuration in the next section.\n</Callout>\n\n## Configure Chainhook\n\nIn this section, you will configure Chainhook to communicate with the network. Run the following command in your terminal to generate the `Chainhook.toml` file:\n\n```terminal\n$ chainhook config generate --mainnet\n```\n\nSeveral network parameters in the generated Chainhook.toml configuration file need to match those in the bitcoin.conf file created earlier in the Setting up a Bitcoin Node section. Update the following parameters accordingly:\n\n1. Update `bitcoind_rpc_username` with the username set for `rpcuser` in `bitcoin.conf`.\n2. Update `bitcoind_rpc_password` with the password set for `rpcpassword` in `bitcoin.conf`.\n3. Update `bitcoind_rpc_url` with the same host and port used for `rpcport` in `bitcoin.conf`.\n4. Ensure `stacks_node_rpc_url` matches the `rpc_bind` in the `Stacks.toml` file.\n\nThe generated `Chainhook.toml` file should look like this:\n\n```toml title=\"Chainhook.toml\"\n[storage]\nworking_dir = \"cache\"\n\n# The http API allows you to register / deregister predicates dynamically.\n# This is disabled by default.\n\n# [http_api]\n# http_port = 20456\n# database_uri = \"redis://localhost:6379/\"\n\n[network]\nmode = \"mainnet\"\nbitcoind_rpc_url = \"http://localhost:8332\"\nbitcoind_rpc_username = \"devnet\"\nbitcoind_rpc_password = \"devnet\"\n# Bitcoin block events can be received by Chainhook\n# either through a Bitcoin node's ZeroMQ interface,\n# or through the Stacks node. The Stacks node is\n# used by default:\nstacks_node_rpc_url = \"http://localhost:20443\"\nstacks_events_ingestion_port = 20455\n# but zmq can be used instead:\n# bitcoind_zmq_url = \"tcp://0.0.0.0:18543\"\n\n[limits]\nmax_number_of_bitcoin_predicates = 100\nmax_number_of_concurrent_bitcoin_scans = 100\nmax_number_of_stacks_predicates = 10\nmax_number_of_concurrent_stacks_scans = 10\nmax_number_of_processing_threads = 16\nmax_number_of_networking_threads = 16\nmax_caching_memory_size_mb = 32000\n\n[[event_source]]\ntsv_file_url = \"https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest\"\n```\n\nEnsure the following configurations are matched to allow Chainhook to communicate with both Stacks and Bitcoin:\n\n| bitcoin.conf | Stacks.toml | Chainhook.toml |\n|--------------------|-------------|-----------------------------|\n| rpcuser | username | bitcoind_rpc_username |\n| rpcpassword | password | bitcoind_rpc_password |\n| rpcport | rpc_port | bitcoind_rpc_url |\n| zmqpubhashblock | | bitcoind_zmq_url |\n| | rpc_bind | stacks_node_rpc_url |\n| | endpoint | stacks_events_ingestion_port |\n\n<Callout title=\"Note\">\nThe `bitcoind_zmq_url` is optional when running Chainhook as a service using Stacks because Stacks will pull the blocks from Stacks and the Bitcoin chain.\n</Callout>\n\n## Create a predicate\n\nNow that the Stacks and Chainhook configurations are done, you can scan your blocks by defining your predicates.\n\n### Appending events to a file\n\nThe following command will generate a sample JSON file `print-event.json`.\n\n```terminal\n$ chainhook predicates new print-event.json --stacks\n```\n\nOnce the boilerplate predicate code has been generated, update the `print-event.json` file with the following content:\n\n```json title=\"print-event.json\"\n{\n \"chain\": \"stacks\",\n \"uuid\": \"6ad27176-2b83-4381-b51c-50baede11e3f\",\n \"name\": \"Hello world\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"start_block\": 34239,\n \"end_block\": 50000,\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"ST1SVA0SST0EDT4MFYGWGP6GNSXMMQJDVP1G8QTTC.arkadiko-freddie-v1-1\",\n \"contains\": \"vault\"\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"arkadiko.txt\"\n }\n }\n },\n \"mainnet\": {\n \"start_block\": 34239,\n \"end_block\": 50000,\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1\",\n \"contains\": \"vault\"\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"arkadiko.txt\"\n }\n }\n }\n }\n}\n```\n\nNow, use the following command to scan the blocks based on the predicates defined in the `print-event.json` file:\n\n```terminal\n$ chainhook predicates scan print-event.json --mainnet\n```\n\nThe output of the above command will be a file `arkadiko.txt` generated based on the predicate definition.\n\n### Sending events to an API endpoint\n\n```terminal\n$ chainhook predicates new print-event-post.json --stacks\n```\n\nThis will generate a sample JSON file `print-event-post.json`. Update the generated `print-event-post.json` file with the following content:\n\n```json title=\"print-event-post.json\"\n{\n \"chain\": \"stacks\",\n \"uuid\": \"e5fa09b2-ec3e-4b6a-9a4a-0ebb454f6e19\",\n \"name\": \"Hello world\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"ST1SVA0SST0EDT4MFYGWGP6GNSXMMQJDVP1G8QTTC.arkadiko-freddie-v1-1\",\n \"contains\": \"vault\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://localhost:3000/events\",\n \"authorization_header\": \"Bearer cn389ncoiwuencr\"\n }\n },\n \"start_block\": 10200,\n \"expire_after_occurrence\": 5\n },\n \"mainnet\": {\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1\",\n \"contains\": \"vault\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://localhost:3000/events\",\n \"authorization_header\": \"Bearer cn389ncoiwuencr\"\n }\n },\n \"start_block\": 10200,\n \"expire_after_occurrence\": 5\n }\n }\n}\n```\n\n<Callout>\nThe `start_block` is a required field to use the `http_post` then_that predicate.\n</Callout>\n\nNow, use the following command to scan the blocks based on the predicates defined in the `print-event-post.json` file:\n\n```terminal\n$ chainhook predicates scan print-event-post.json --mainnet\n```\n\nThe above command posts events to the URL `http://localhost:3000/events` mentioned in the `Chainhook.toml` file.\n\n## Initiate Chainhook as a service\n\n```terminal\n$ chainhook service start --predicate-path=print-event.json --config-path=Chainhook.toml\n```\n\nThis command registers the predicate and starts the Chainhook service.\n\n## Dynamically register predicates\n\nYou can also dynamically register new predicates with your Chainhook service.\n\n<Callout title=\"Requirements\" type=\"warn\"> This section requires that you have Redis running locally. To install, refer to the [Redis documentation](https://redis.io/docs/getting-started/).</Callout>\n\nFirst, ensure that the following lines in the `Chainhook.toml` file are uncommented to enable the predicate registration server:\n\n```toml title=\"Chainhook.toml\"\n[http_api]\nhttp_port = 20456\ndatabase_uri = \"redis://localhost:6379/\"\n```\n\n```terminal\n$ chainhook service start --predicate-path=print-event.json --config-path=Chainhook.toml\n```\n\nStart the Chainhook service with the following command:\n\n```terminal\n$ chainhook service start --config-path=Chainhook.toml\n```\n\nTo dynamically register a new predicate, send a POST request to the running predicate registration server at `localhost:20456/v1/chainhooks`.\n\nUse the following `curl` command template as an example:\n\n```terminal\n$ curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -d @predicate.json \\\n http://localhost:20456/v1/chainhooks\n\n{\"result\":\"<uuid>\",\"status\":200}\n```\n\n<Callout title=\"Note\">You can also run the Chainhook service by passing multiple predicates: `chainhook service start --predicate-path=predicate_1.json --predicate-path=predicate_2.json --config-path=Chainhook.toml` </Callout>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/register-chainhooks-on-devnet\"\n title=\"Register Chainhooks on devnet\"\n description=\"Learn how to register Chainhooks on devnet.\"\n />\n <Card\n href=\"/stacks/chainhook/references/scopes/stacks\"\n title=\"Stacks scopes\"\n description=\"Learn how to use scopes to scan for specific Stacks blockchain events.\"\n />\n</Cards>"],[424,"Clone the [Runehook repository](https://github.com/hirosystems/runehook) to your local machine and install via `cargo`.\n\n```terminal\n$ git clone https://github.com/hirosystems/runehook.git\n$ cd runehook\n$ cargo runehook-install\n```"]],"type":"string"},"url":{"docs":{"1":371,"2":374,"3":417,"4":223,"5":222,"6":220,"7":221,"8":217,"9":219,"10":218,"11":418,"12":498,"13":200,"14":201,"15":203,"16":204,"17":202,"18":216,"19":224,"20":225,"21":233,"22":230,"23":232,"24":231,"25":229,"26":228,"27":227,"28":234,"29":226,"30":235,"31":389,"32":398,"33":397,"34":401,"35":400,"36":399,"37":394,"38":391,"39":393,"40":390,"41":396,"42":392,"43":395,"44":99,"45":388,"46":406,"47":405,"48":402,"49":408,"50":407,"51":403,"52":404,"53":409,"54":501,"55":502,"56":507,"57":508,"58":514,"59":509,"60":510,"61":513,"62":511,"63":512,"64":503,"65":504,"66":505,"67":506,"68":377,"69":378,"70":376,"71":379,"72":380,"73":375,"74":372,"75":373,"76":239,"77":238,"78":236,"79":361,"80":240,"81":237,"82":307,"83":351,"84":333,"85":352,"86":260,"87":255,"88":294,"89":310,"90":261,"91":302,"92":263,"93":359,"94":328,"95":285,"96":276,"97":266,"98":341,"99":269,"100":264,"101":321,"102":317,"103":262,"104":286,"105":309,"106":338,"107":308,"108":242,"109":330,"110":303,"111":335,"112":272,"113":249,"114":304,"115":278,"116":283,"117":356,"118":349,"119":271,"120":295,"121":323,"122":267,"123":282,"124":297,"125":280,"126":245,"127":287,"128":254,"129":268,"130":251,"131":357,"132":313,"133":257,"134":270,"135":318,"136":299,"137":241,"138":339,"139":298,"140":346,"141":327,"142":347,"143":342,"144":277,"145":253,"146":300,"147":301,"148":354,"149":243,"150":344,"151":355,"152":292,"153":348,"154":288,"155":322,"156":284,"157":340,"158":258,"159":353,"160":265,"161":247,"162":331,"163":248,"164":274,"165":324,"166":350,"167":312,"168":337,"169":332,"170":314,"171":306,"172":311,"173":296,"174":252,"175":358,"176":305,"177":275,"178":281,"179":256,"180":273,"181":334,"182":259,"183":293,"184":345,"185":325,"186":320,"187":250,"188":290,"189":315,"190":279,"191":289,"192":244,"193":246,"194":336,"195":319,"196":291,"197":316,"198":343,"199":329,"200":326,"201":360,"202":362,"203":516,"204":500,"205":468,"206":469,"207":470,"208":464,"209":471,"210":472,"211":473,"212":474,"213":475,"214":476,"215":477,"216":466,"217":465,"218":467,"219":383,"220":385,"221":384,"222":386,"223":387,"224":515,"225":478,"226":497,"227":496,"228":479,"229":495,"230":486,"231":487,"232":488,"233":492,"234":493,"235":491,"236":490,"237":485,"238":483,"239":484,"240":480,"241":482,"242":481,"243":494,"244":489,"245":381,"246":382,"247":101,"248":193,"249":194,"250":195,"251":196,"252":199,"253":197,"254":198,"255":106,"256":100,"257":103,"258":105,"259":102,"260":123,"261":126,"262":121,"263":117,"264":125,"265":120,"266":118,"267":124,"268":119,"269":122,"270":149,"271":147,"272":148,"273":144,"274":152,"275":150,"276":151,"277":146,"278":145,"279":133,"280":132,"281":174,"282":172,"283":173,"284":176,"285":175,"286":177,"287":159,"288":157,"289":160,"290":158,"291":161,"292":162,"293":164,"294":163,"295":140,"296":138,"297":135,"298":137,"299":134,"300":141,"301":139,"302":136,"303":181,"304":184,"305":190,"306":189,"307":180,"308":192,"309":183,"310":186,"311":182,"312":188,"313":187,"314":191,"315":185,"316":171,"317":170,"318":130,"319":131,"320":116,"321":109,"322":115,"323":112,"324":108,"325":114,"326":111,"327":113,"328":110,"329":167,"330":166,"331":165,"332":168,"333":169,"334":142,"335":143,"336":128,"337":127,"338":129,"339":178,"340":179,"341":153,"342":155,"343":156,"344":154,"345":104,"346":107,"347":463,"348":499,"349":205,"350":363,"351":370,"352":364,"353":365,"354":367,"355":366,"356":368,"357":369,"358":423,"359":422,"360":420,"361":421,"362":419,"363":424,"364":425,"365":426,"366":428,"367":430,"368":431,"369":429,"370":427,"371":214,"372":215,"373":206,"374":208,"375":210,"376":207,"377":209,"378":213,"379":212,"380":211,"381":410,"382":413,"383":416,"384":411,"385":414,"386":412,"387":415,"388":435,"389":436,"390":447,"391":449,"392":448,"393":446,"394":444,"395":445,"396":440,"397":439,"398":441,"399":432,"400":442,"401":443,"402":458,"403":457,"404":433,"405":434,"406":459,"407":462,"408":460,"409":461,"410":452,"411":456,"412":450,"413":453,"414":454,"415":455,"416":451,"417":437,"418":438,"419":36,"420":37,"421":65,"422":84,"423":86,"424":85,"425":82,"426":83,"427":66,"428":79,"429":80,"430":73,"431":72,"432":74,"433":75,"434":67,"435":71,"436":69,"437":70,"438":68,"439":81,"440":76,"441":78,"442":77,"443":62,"444":63,"445":59,"446":60,"447":46,"448":42,"449":44,"450":45,"451":47,"452":43,"453":50,"454":53,"455":54,"456":52,"457":55,"458":51,"459":41,"460":48,"461":49,"462":61,"463":56,"464":57,"465":58,"466":0,"467":2,"468":34,"469":35,"470":28,"471":27,"472":29,"473":30,"474":22,"475":26,"476":24,"477":25,"478":23,"479":31,"480":33,"481":32,"482":20,"483":21,"484":7,"485":3,"486":5,"487":6,"488":8,"489":4,"490":11,"491":14,"492":15,"493":13,"494":16,"495":12,"496":9,"497":10,"498":17,"499":18,"500":19,"501":1,"502":38,"503":39,"504":40,"505":64,"506":91,"507":95,"508":87,"509":97,"510":93,"511":89,"512":88,"513":90,"514":98,"515":96,"516":94,"517":92},"orderedDocs":[[466,"/docs/bitcoin"],[501,"/docs/bitcoin/api"],[467,"/docs/bitcoin/api-keys"],[485,"/docs/bitcoin/api/ordinals/brc20"],[489,"/docs/bitcoin/api/ordinals/brc20/get-brc20-activity"],[486,"/docs/bitcoin/api/ordinals/brc20/get-brc20-balances"],[487,"/docs/bitcoin/api/ordinals/brc20/get-brc20-token-details"],[484,"/docs/bitcoin/api/ordinals/brc20/get-brc20-token-holders"],[488,"/docs/bitcoin/api/ordinals/brc20/get-brc20-tokens"],[496,"/docs/bitcoin/api/ordinals/info"],[497,"/docs/bitcoin/api/ordinals/info/status"],[490,"/docs/bitcoin/api/ordinals/inscriptions"],[495,"/docs/bitcoin/api/ordinals/inscriptions/get-inscription"],[493,"/docs/bitcoin/api/ordinals/inscriptions/get-inscription-content"],[491,"/docs/bitcoin/api/ordinals/inscriptions/get-inscription-transfers"],[492,"/docs/bitcoin/api/ordinals/inscriptions/get-inscriptions"],[494,"/docs/bitcoin/api/ordinals/inscriptions/get-transfers-per-block"],[498,"/docs/bitcoin/api/ordinals/satoshis"],[499,"/docs/bitcoin/api/ordinals/satoshis/get-satoshi"],[500,"/docs/bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions"],[482,"/docs/bitcoin/api/ordinals/statistics"],[483,"/docs/bitcoin/api/ordinals/statistics/get-stats-inscription-count"],[474,"/docs/bitcoin/api/runes/activities"],[478,"/docs/bitcoin/api/runes/activities/activity"],[476,"/docs/bitcoin/api/runes/activities/for-address"],[477,"/docs/bitcoin/api/runes/activities/for-block"],[475,"/docs/bitcoin/api/runes/activities/for-transaction"],[471,"/docs/bitcoin/api/runes/balances"],[470,"/docs/bitcoin/api/runes/balances/address"],[472,"/docs/bitcoin/api/runes/balances/holder-balance"],[473,"/docs/bitcoin/api/runes/balances/holders"],[479,"/docs/bitcoin/api/runes/etchings"],[481,"/docs/bitcoin/api/runes/etchings/get-etching"],[480,"/docs/bitcoin/api/runes/etchings/get-etchings"],[468,"/docs/bitcoin/api/runes/info"],[469,"/docs/bitcoin/api/runes/info/status"],[419,"/docs/bitcoin/contributors-guide"],[420,"/docs/bitcoin/get-started"],[502,"/docs/bitcoin/indexer"],[503,"/docs/bitcoin/indexer/guides/run-indexer"],[504,"/docs/bitcoin/indexer/quickstart"],[459,"/docs/bitcoin/ordinals/api"],[448,"/docs/bitcoin/ordinals/api/brc20"],[452,"/docs/bitcoin/ordinals/api/brc20/get-brc20-activity"],[449,"/docs/bitcoin/ordinals/api/brc20/get-brc20-balances"],[450,"/docs/bitcoin/ordinals/api/brc20/get-brc20-token-details"],[447,"/docs/bitcoin/ordinals/api/brc20/get-brc20-token-holders"],[451,"/docs/bitcoin/ordinals/api/brc20/get-brc20-tokens"],[460,"/docs/bitcoin/ordinals/api/info"],[461,"/docs/bitcoin/ordinals/api/info/status"],[453,"/docs/bitcoin/ordinals/api/inscriptions"],[458,"/docs/bitcoin/ordinals/api/inscriptions/get-inscription"],[456,"/docs/bitcoin/ordinals/api/inscriptions/get-inscription-content"],[454,"/docs/bitcoin/ordinals/api/inscriptions/get-inscription-transfers"],[455,"/docs/bitcoin/ordinals/api/inscriptions/get-inscriptions"],[457,"/docs/bitcoin/ordinals/api/inscriptions/get-transfers-per-block"],[463,"/docs/bitcoin/ordinals/api/satoshis"],[464,"/docs/bitcoin/ordinals/api/satoshis/get-satoshi"],[465,"/docs/bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions"],[445,"/docs/bitcoin/ordinals/api/statistics"],[446,"/docs/bitcoin/ordinals/api/statistics/get-stats-inscription-count"],[462,"/docs/bitcoin/ordinals/api/usage"],[443,"/docs/bitcoin/ordinals/explorer"],[444,"/docs/bitcoin/ordinals/explorer/guides/build-explorer"],[505,"/docs/bitcoin/quickstarts"],[421,"/docs/bitcoin/rate-limiting"],[427,"/docs/bitcoin/runes/api"],[434,"/docs/bitcoin/runes/api/activities"],[438,"/docs/bitcoin/runes/api/activities/activity"],[436,"/docs/bitcoin/runes/api/activities/for-address"],[437,"/docs/bitcoin/runes/api/activities/for-block"],[435,"/docs/bitcoin/runes/api/activities/for-transaction"],[431,"/docs/bitcoin/runes/api/balances"],[430,"/docs/bitcoin/runes/api/balances/address"],[432,"/docs/bitcoin/runes/api/balances/holder-balance"],[433,"/docs/bitcoin/runes/api/balances/holders"],[440,"/docs/bitcoin/runes/api/etchings"],[442,"/docs/bitcoin/runes/api/etchings/get-etching"],[441,"/docs/bitcoin/runes/api/etchings/get-etchings"],[428,"/docs/bitcoin/runes/api/info"],[429,"/docs/bitcoin/runes/api/info/status"],[439,"/docs/bitcoin/runes/api/usage"],[425,"/docs/bitcoin/runes/explorer"],[426,"/docs/bitcoin/runes/explorer/guides/build-explorer"],[422,"/docs/bitcoin/runes/runehook"],[424,"/docs/bitcoin/runes/runehook/installation"],[423,"/docs/bitcoin/runes/runehook/quickstart"],[508,"/docs/guides"],[512,"/docs/guides/api-keys"],[511,"/docs/guides/build-a-decentralized-kickstarter"],[513,"/docs/guides/build-an-nft-marketplace"],[506,"/docs/guides/contributors-guide"],[517,"/docs/guides/docskit"],[510,"/docs/guides/installing-docker"],[516,"/docs/guides/no-loss-lottery"],[507,"/docs/guides/rate-limiting"],[515,"/docs/guides/sync-a-bitcoin-node"],[509,"/docs/guides/sync-a-stacks-node"],[514,"/docs/guides/using-clarity-values"],[44,"/docs/stacks"],[256,"/docs/stacks/api"],[247,"/docs/stacks/api-keys"],[259,"/docs/stacks/api/architecture"],[257,"/docs/stacks/api/authentication"],[345,"/docs/stacks/api/getting-started"],[258,"/docs/stacks/api/nonce-handling"],[255,"/docs/stacks/api/pagination"],[346,"/docs/stacks/api/requesting-proofs"],[324,"/docs/stacks/api/stacks-blockchain/accounts/assets"],[321,"/docs/stacks/api/stacks-blockchain/accounts/balances"],[328,"/docs/stacks/api/stacks-blockchain/accounts/inbound-stx-transfers"],[326,"/docs/stacks/api/stacks-blockchain/accounts/latest-nonce"],[323,"/docs/stacks/api/stacks-blockchain/accounts/nft-events"],[327,"/docs/stacks/api/stacks-blockchain/accounts/stx-balances"],[325,"/docs/stacks/api/stacks-blockchain/accounts/transaction-with-transfers"],[322,"/docs/stacks/api/stacks-blockchain/accounts/transactions"],[320,"/docs/stacks/api/stacks-blockchain/accounts/transactions-with-transfers"],[263,"/docs/stacks/api/stacks-blockchain/blocks"],[266,"/docs/stacks/api/stacks-blockchain/blocks/average-times"],[268,"/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash"],[265,"/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-height"],[262,"/docs/stacks/api/stacks-blockchain/blocks/block-by-hash"],[269,"/docs/stacks/api/stacks-blockchain/blocks/block-by-height"],[260,"/docs/stacks/api/stacks-blockchain/blocks/get-block"],[267,"/docs/stacks/api/stacks-blockchain/blocks/get-blocks"],[264,"/docs/stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block"],[261,"/docs/stacks/api/stacks-blockchain/blocks/recent-blocks"],[337,"/docs/stacks/api/stacks-blockchain/burn-blocks"],[336,"/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-block"],[338,"/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks"],[318,"/docs/stacks/api/stacks-blockchain/faucets"],[319,"/docs/stacks/api/stacks-blockchain/faucets/stx"],[280,"/docs/stacks/api/stacks-blockchain/fees"],[279,"/docs/stacks/api/stacks-blockchain/fees/fee-rate"],[299,"/docs/stacks/api/stacks-blockchain/info"],[297,"/docs/stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text"],[302,"/docs/stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply"],[298,"/docs/stacks/api/stacks-blockchain/info/network-block-time"],[296,"/docs/stacks/api/stacks-blockchain/info/network-given-block-time"],[301,"/docs/stacks/api/stacks-blockchain/info/status"],[295,"/docs/stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply"],[300,"/docs/stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text"],[334,"/docs/stacks/api/stacks-blockchain/mempool"],[335,"/docs/stacks/api/stacks-blockchain/mempool/transaction-fee-priorities"],[273,"/docs/stacks/api/stacks-blockchain/names"],[278,"/docs/stacks/api/stacks-blockchain/names/historical-zonefile"],[277,"/docs/stacks/api/stacks-blockchain/names/name-details"],[271,"/docs/stacks/api/stacks-blockchain/names/name-subdomains"],[272,"/docs/stacks/api/stacks-blockchain/names/name-zonefile"],[270,"/docs/stacks/api/stacks-blockchain/names/names"],[275,"/docs/stacks/api/stacks-blockchain/names/namespace-names"],[276,"/docs/stacks/api/stacks-blockchain/names/namespaces"],[274,"/docs/stacks/api/stacks-blockchain/names/owned-by-address"],[341,"/docs/stacks/api/stacks-blockchain/non-fungible-tokens"],[344,"/docs/stacks/api/stacks-blockchain/non-fungible-tokens/history"],[342,"/docs/stacks/api/stacks-blockchain/non-fungible-tokens/holdings"],[343,"/docs/stacks/api/stacks-blockchain/non-fungible-tokens/mints"],[288,"/docs/stacks/api/stacks-blockchain/proof-of-transfer"],[290,"/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycle"],[287,"/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycles"],[289,"/docs/stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle"],[291,"/docs/stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle"],[292,"/docs/stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle"],[294,"/docs/stacks/api/stacks-blockchain/search"],[293,"/docs/stacks/api/stacks-blockchain/search/search-by-id"],[331,"/docs/stacks/api/stacks-blockchain/smart-contracts"],[330,"/docs/stacks/api/stacks-blockchain/smart-contracts/by-trait"],[329,"/docs/stacks/api/stacks-blockchain/smart-contracts/events"],[332,"/docs/stacks/api/stacks-blockchain/smart-contracts/info"],[333,"/docs/stacks/api/stacks-blockchain/smart-contracts/status"],[317,"/docs/stacks/api/stacks-blockchain/stacking-pool"],[316,"/docs/stacks/api/stacks-blockchain/stacking-pool/members"],[282,"/docs/stacks/api/stacks-blockchain/stacking-rewards"],[283,"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient"],[281,"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients"],[285,"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries"],[284,"/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders"],[286,"/docs/stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient"],[339,"/docs/stacks/api/stacks-blockchain/tokens"],[340,"/docs/stacks/api/stacks-blockchain/tokens/holders"],[307,"/docs/stacks/api/stacks-blockchain/transactions"],[303,"/docs/stacks/api/stacks-blockchain/transactions/address-transactions"],[311,"/docs/stacks/api/stacks-blockchain/transactions/details-for-transactions"],[309,"/docs/stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions"],[304,"/docs/stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction"],[315,"/docs/stacks/api/stacks-blockchain/transactions/get-raw-transaction"],[310,"/docs/stacks/api/stacks-blockchain/transactions/get-transaction"],[313,"/docs/stacks/api/stacks-blockchain/transactions/mempool-transactions"],[312,"/docs/stacks/api/stacks-blockchain/transactions/recent-transactions"],[306,"/docs/stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions"],[305,"/docs/stacks/api/stacks-blockchain/transactions/transaction-events"],[314,"/docs/stacks/api/stacks-blockchain/transactions/transactions-by-block"],[308,"/docs/stacks/api/stacks-blockchain/transactions/transactions-for-address"],[248,"/docs/stacks/api/token-metadata/info"],[249,"/docs/stacks/api/token-metadata/info/status"],[250,"/docs/stacks/api/token-metadata/tokens"],[251,"/docs/stacks/api/token-metadata/tokens/fungible-token-metadata"],[253,"/docs/stacks/api/token-metadata/tokens/fungible-tokens"],[254,"/docs/stacks/api/token-metadata/tokens/non-fungible-token-metadata"],[252,"/docs/stacks/api/token-metadata/tokens/semi-fungible-token-metadata"],[13,"/docs/stacks/archive"],[14,"/docs/stacks/archive/guides/stacks-api"],[17,"/docs/stacks/archive/guides/stacks-blockchain"],[15,"/docs/stacks/archive/guides/token-metadata-api"],[16,"/docs/stacks/archive/guides/verify-archive-data"],[349,"/docs/stacks/blockchain-development"],[373,"/docs/stacks/chainhook"],[376,"/docs/stacks/chainhook/examples/chainhook-as-a-service"],[374,"/docs/stacks/chainhook/examples/chainhook-as-a-service-with-stacks-node"],[377,"/docs/stacks/chainhook/examples/observing-contract-calls"],[375,"/docs/stacks/chainhook/examples/register-chainhooks-on-devnet"],[380,"/docs/stacks/chainhook/installation"],[379,"/docs/stacks/chainhook/predicate-design"],[378,"/docs/stacks/chainhook/quickstart"],[371,"/docs/stacks/chainhook/references/scopes/bitcoin"],[372,"/docs/stacks/chainhook/references/scopes/stacks"],[18,"/docs/stacks/clarinet"],[8,"/docs/stacks/clarinet-js-sdk"],[10,"/docs/stacks/clarinet-js-sdk/installation"],[9,"/docs/stacks/clarinet-js-sdk/quickstart"],[6,"/docs/stacks/clarinet-js-sdk/references/custom-matchers"],[7,"/docs/stacks/clarinet-js-sdk/references/methods"],[5,"/docs/stacks/clarinet-js-sdk/references/properties"],[4,"/docs/stacks/clarinet-js-sdk/references/simnet"],[19,"/docs/stacks/clarinet/concepts"],[20,"/docs/stacks/clarinet/examples/add-a-contract"],[29,"/docs/stacks/clarinet/examples/create-a-new-project"],[27,"/docs/stacks/clarinet/examples/create-deployment-plans"],[26,"/docs/stacks/clarinet/examples/debug-a-contract"],[25,"/docs/stacks/clarinet/examples/deploy-a-contract"],[22,"/docs/stacks/clarinet/examples/estimate-costs"],[24,"/docs/stacks/clarinet/examples/run-a-local-devnet"],[23,"/docs/stacks/clarinet/examples/start-a-development-console"],[21,"/docs/stacks/clarinet/examples/validate-a-contract"],[28,"/docs/stacks/clarinet/examples/working-with-sbtc"],[30,"/docs/stacks/clarinet/quickstart"],[78,"/docs/stacks/clarity"],[81,"/docs/stacks/clarity/access-control"],[77,"/docs/stacks/clarity/basic-arithmetic"],[76,"/docs/stacks/clarity/bit-manipulation"],[80,"/docs/stacks/clarity/cryptographic-functions"],[137,"/docs/stacks/clarity/functions/add"],[108,"/docs/stacks/clarity/functions/and"],[149,"/docs/stacks/clarity/functions/append"],[192,"/docs/stacks/clarity/functions/as-contract"],[126,"/docs/stacks/clarity/functions/as-max-len"],[193,"/docs/stacks/clarity/functions/asserts"],[161,"/docs/stacks/clarity/functions/at-block"],[163,"/docs/stacks/clarity/functions/begin"],[113,"/docs/stacks/clarity/functions/bit-and"],[187,"/docs/stacks/clarity/functions/bit-not"],[130,"/docs/stacks/clarity/functions/bit-or"],[174,"/docs/stacks/clarity/functions/bit-shift-left"],[145,"/docs/stacks/clarity/functions/bit-shift-right"],[128,"/docs/stacks/clarity/functions/bit-xor"],[87,"/docs/stacks/clarity/functions/buff-to-int-be"],[179,"/docs/stacks/clarity/functions/buff-to-int-le"],[133,"/docs/stacks/clarity/functions/buff-to-uint-be"],[158,"/docs/stacks/clarity/functions/buff-to-uint-le"],[182,"/docs/stacks/clarity/functions/concat"],[86,"/docs/stacks/clarity/functions/contract-call"],[90,"/docs/stacks/clarity/functions/contract-of"],[103,"/docs/stacks/clarity/functions/default-to"],[92,"/docs/stacks/clarity/functions/define-constant"],[100,"/docs/stacks/clarity/functions/define-data-var"],[160,"/docs/stacks/clarity/functions/define-fungible-token"],[97,"/docs/stacks/clarity/functions/define-map"],[122,"/docs/stacks/clarity/functions/define-non-fungible-token"],[129,"/docs/stacks/clarity/functions/define-private"],[99,"/docs/stacks/clarity/functions/define-public"],[134,"/docs/stacks/clarity/functions/define-read-only"],[119,"/docs/stacks/clarity/functions/define-trait"],[112,"/docs/stacks/clarity/functions/divide"],[180,"/docs/stacks/clarity/functions/element-at"],[164,"/docs/stacks/clarity/functions/err"],[177,"/docs/stacks/clarity/functions/filter"],[96,"/docs/stacks/clarity/functions/fold"],[144,"/docs/stacks/clarity/functions/from-consensus-buff"],[115,"/docs/stacks/clarity/functions/ft-burn"],[190,"/docs/stacks/clarity/functions/ft-get-balance"],[125,"/docs/stacks/clarity/functions/ft-get-supply"],[178,"/docs/stacks/clarity/functions/ft-mint"],[123,"/docs/stacks/clarity/functions/ft-transfer"],[116,"/docs/stacks/clarity/functions/get"],[156,"/docs/stacks/clarity/functions/get-block-info"],[95,"/docs/stacks/clarity/functions/get-burn-block-info"],[104,"/docs/stacks/clarity/functions/get-stacks-block-info"],[127,"/docs/stacks/clarity/functions/get-tenure-info"],[154,"/docs/stacks/clarity/functions/greater-than"],[191,"/docs/stacks/clarity/functions/greater-than-or-equal"],[188,"/docs/stacks/clarity/functions/hash160"],[196,"/docs/stacks/clarity/functions/if"],[152,"/docs/stacks/clarity/functions/impl-trait"],[183,"/docs/stacks/clarity/functions/index-of"],[88,"/docs/stacks/clarity/functions/int-to-ascii"],[120,"/docs/stacks/clarity/functions/int-to-utf8"],[173,"/docs/stacks/clarity/functions/is-eq"],[124,"/docs/stacks/clarity/functions/is-err"],[139,"/docs/stacks/clarity/functions/is-none"],[136,"/docs/stacks/clarity/functions/is-ok"],[146,"/docs/stacks/clarity/functions/is-some"],[147,"/docs/stacks/clarity/functions/is-standard"],[91,"/docs/stacks/clarity/functions/keccak256"],[110,"/docs/stacks/clarity/functions/len"],[114,"/docs/stacks/clarity/functions/less-than"],[176,"/docs/stacks/clarity/functions/less-than-or-equal"],[171,"/docs/stacks/clarity/functions/let"],[82,"/docs/stacks/clarity/functions/list"],[107,"/docs/stacks/clarity/functions/log2"],[105,"/docs/stacks/clarity/functions/map"],[89,"/docs/stacks/clarity/functions/map-delete"],[172,"/docs/stacks/clarity/functions/map-get"],[167,"/docs/stacks/clarity/functions/map-insert"],[132,"/docs/stacks/clarity/functions/map-set"],[170,"/docs/stacks/clarity/functions/match"],[189,"/docs/stacks/clarity/functions/merge"],[197,"/docs/stacks/clarity/functions/mod"],[102,"/docs/stacks/clarity/functions/multiply"],[135,"/docs/stacks/clarity/functions/nft-burn"],[195,"/docs/stacks/clarity/functions/nft-get-owner"],[186,"/docs/stacks/clarity/functions/nft-mint"],[101,"/docs/stacks/clarity/functions/nft-transfer"],[155,"/docs/stacks/clarity/functions/not"],[121,"/docs/stacks/clarity/functions/ok"],[165,"/docs/stacks/clarity/functions/or"],[185,"/docs/stacks/clarity/functions/pow"],[200,"/docs/stacks/clarity/functions/principal-construct"],[141,"/docs/stacks/clarity/functions/principal-destruct"],[94,"/docs/stacks/clarity/functions/principal-of"],[199,"/docs/stacks/clarity/functions/print"],[109,"/docs/stacks/clarity/functions/replace-at"],[162,"/docs/stacks/clarity/functions/secp256k1-recover"],[169,"/docs/stacks/clarity/functions/secp256k1-verify"],[84,"/docs/stacks/clarity/functions/sha256"],[181,"/docs/stacks/clarity/functions/sha512"],[111,"/docs/stacks/clarity/functions/sha512-256"],[194,"/docs/stacks/clarity/functions/slice"],[168,"/docs/stacks/clarity/functions/some"],[106,"/docs/stacks/clarity/functions/sqrti"],[138,"/docs/stacks/clarity/functions/string-to-int"],[157,"/docs/stacks/clarity/functions/string-to-uint"],[98,"/docs/stacks/clarity/functions/stx-account"],[143,"/docs/stacks/clarity/functions/stx-burn"],[198,"/docs/stacks/clarity/functions/stx-get-balance"],[150,"/docs/stacks/clarity/functions/stx-transfer"],[184,"/docs/stacks/clarity/functions/stx-transfer-memo"],[140,"/docs/stacks/clarity/functions/subtract"],[142,"/docs/stacks/clarity/functions/to-consensus-buff"],[153,"/docs/stacks/clarity/functions/to-int"],[118,"/docs/stacks/clarity/functions/to-uint"],[166,"/docs/stacks/clarity/functions/try"],[83,"/docs/stacks/clarity/functions/tuple"],[85,"/docs/stacks/clarity/functions/unwrap"],[159,"/docs/stacks/clarity/functions/unwrap-err"],[148,"/docs/stacks/clarity/functions/unwrap-err-panic"],[151,"/docs/stacks/clarity/functions/unwrap-panic"],[117,"/docs/stacks/clarity/functions/use-trait"],[131,"/docs/stacks/clarity/functions/var-get"],[175,"/docs/stacks/clarity/functions/var-set"],[93,"/docs/stacks/clarity/functions/xor"],[201,"/docs/stacks/clarity/handling-optionals-and-errors"],[79,"/docs/stacks/clarity/optimizations"],[202,"/docs/stacks/clarity/time-and-blocks"],[350,"/docs/stacks/connect"],[352,"/docs/stacks/connect/examples/authenticate-users"],[353,"/docs/stacks/connect/examples/broadcast-transactions"],[355,"/docs/stacks/connect/examples/migration"],[354,"/docs/stacks/connect/examples/sign-messages"],[356,"/docs/stacks/connect/packages/connect"],[357,"/docs/stacks/connect/quickstart"],[351,"/docs/stacks/connect/support"],[1,"/docs/stacks/contributors-guide"],[74,"/docs/stacks/explorer"],[75,"/docs/stacks/explorer/guides/build-explorer"],[2,"/docs/stacks/get-started"],[73,"/docs/stacks/hacks"],[70,"/docs/stacks/hacks/archive/ai"],[68,"/docs/stacks/hacks/archive/build-a-custom-api"],[69,"/docs/stacks/hacks/archive/build-a-decentralized-grants-program"],[71,"/docs/stacks/hacks/archive/build-a-friend-tech-clone"],[72,"/docs/stacks/hacks/recipes"],[245,"/docs/stacks/integration-testing"],[246,"/docs/stacks/migration-guide"],[219,"/docs/stacks/nakamoto"],[221,"/docs/stacks/nakamoto/guides/clarinet"],[220,"/docs/stacks/nakamoto/guides/explorer"],[222,"/docs/stacks/nakamoto/guides/stacks-api"],[223,"/docs/stacks/nakamoto/guides/stacks-js"],[45,"/docs/stacks/platform"],[31,"/docs/stacks/platform-api"],[40,"/docs/stacks/platform-api/chainhooks"],[38,"/docs/stacks/platform-api/chainhooks/create"],[42,"/docs/stacks/platform-api/chainhooks/delete"],[39,"/docs/stacks/platform-api/chainhooks/get"],[37,"/docs/stacks/platform-api/chainhooks/list"],[43,"/docs/stacks/platform-api/chainhooks/status"],[41,"/docs/stacks/platform-api/chainhooks/update"],[33,"/docs/stacks/platform-api/devnet"],[32,"/docs/stacks/platform-api/devnet/bitcoin-node"],[36,"/docs/stacks/platform-api/devnet/stacks-blockchain-api"],[35,"/docs/stacks/platform-api/devnet/start"],[34,"/docs/stacks/platform-api/devnet/stop"],[48,"/docs/stacks/platform/examples/archive-project"],[51,"/docs/stacks/platform/examples/contract-monitoring"],[52,"/docs/stacks/platform/examples/create-chainhooks"],[47,"/docs/stacks/platform/examples/create-project"],[46,"/docs/stacks/platform/examples/deploy-contracts"],[50,"/docs/stacks/platform/examples/devnet"],[49,"/docs/stacks/platform/examples/faucet"],[53,"/docs/stacks/platform/quickstart"],[381,"/docs/stacks/quickstarts"],[384,"/docs/stacks/quickstarts/app-templates"],[386,"/docs/stacks/quickstarts/contract-templates"],[382,"/docs/stacks/quickstarts/event-streaming"],[385,"/docs/stacks/quickstarts/nft-minting"],[387,"/docs/stacks/quickstarts/token-transfers"],[383,"/docs/stacks/quickstarts/wallet-integration"],[3,"/docs/stacks/rate-limiting"],[11,"/docs/stacks/reference"],[362,"/docs/stacks/reference/clarinet-js-sdk/clarinet-sdk"],[360,"/docs/stacks/reference/clarinet-js-sdk/custom-matchers"],[361,"/docs/stacks/reference/clarinet-js-sdk/methods"],[359,"/docs/stacks/reference/clarinet-js-sdk/properties"],[358,"/docs/stacks/reference/clarinet-js-sdk/simnet"],[363,"/docs/stacks/reference/cli/clarinet"],[364,"/docs/stacks/reference/cli/stacks-js"],[365,"/docs/stacks/reference/stacks-blockchain-api/client"],[370,"/docs/stacks/reference/stacks.js/common"],[366,"/docs/stacks/reference/stacks.js/connect"],[369,"/docs/stacks/reference/stacks.js/network"],[367,"/docs/stacks/reference/stacks.js/sbtc"],[368,"/docs/stacks/reference/stacks.js/transactions"],[399,"/docs/stacks/rpc-api"],[404,"/docs/stacks/rpc-api/accounts"],[405,"/docs/stacks/rpc-api/accounts/info"],[388,"/docs/stacks/rpc-api/blocks"],[389,"/docs/stacks/rpc-api/blocks/block-proposal"],[417,"/docs/stacks/rpc-api/burn-ops"],[418,"/docs/stacks/rpc-api/burn-ops/get-burn-operations"],[397,"/docs/stacks/rpc-api/fees"],[396,"/docs/stacks/rpc-api/fees/estimate"],[398,"/docs/stacks/rpc-api/fees/transfer-estimate"],[400,"/docs/stacks/rpc-api/info"],[401,"/docs/stacks/rpc-api/info/core-api"],[394,"/docs/stacks/rpc-api/names"],[395,"/docs/stacks/rpc-api/names/name-price"],[393,"/docs/stacks/rpc-api/names/namespace-price"],[390,"/docs/stacks/rpc-api/pox"],[392,"/docs/stacks/rpc-api/pox/pox-details"],[391,"/docs/stacks/rpc-api/pox/stacker-set"],[412,"/docs/stacks/rpc-api/smart-contracts"],[416,"/docs/stacks/rpc-api/smart-contracts/constants"],[410,"/docs/stacks/rpc-api/smart-contracts/interface"],[413,"/docs/stacks/rpc-api/smart-contracts/map-entry"],[414,"/docs/stacks/rpc-api/smart-contracts/read-only"],[415,"/docs/stacks/rpc-api/smart-contracts/source"],[411,"/docs/stacks/rpc-api/smart-contracts/traits"],[403,"/docs/stacks/rpc-api/transactions"],[402,"/docs/stacks/rpc-api/transactions/broadcast-transaction"],[406,"/docs/stacks/rpc-api/v3"],[408,"/docs/stacks/rpc-api/v3/nakamoto-block"],[409,"/docs/stacks/rpc-api/v3/tenure-blocks"],[407,"/docs/stacks/rpc-api/v3/tenure-metadata"],[347,"/docs/stacks/setup"],[208,"/docs/stacks/signer-metrics-api"],[217,"/docs/stacks/signer-metrics-api/block-proposals"],[216,"/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-a-block"],[218,"/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals"],[205,"/docs/stacks/signer-metrics-api/blocks"],[206,"/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block"],[207,"/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks"],[209,"/docs/stacks/signer-metrics-api/info"],[210,"/docs/stacks/signer-metrics-api/info/status"],[211,"/docs/stacks/signer-metrics-api/prometheus"],[212,"/docs/stacks/signer-metrics-api/prometheus/metrics"],[213,"/docs/stacks/signer-metrics-api/signers"],[214,"/docs/stacks/signer-metrics-api/signers/pox-cycle-signer"],[215,"/docs/stacks/signer-metrics-api/signers/pox-cycle-signers"],[225,"/docs/stacks/smart-contract-development"],[228,"/docs/stacks/stacks.js"],[240,"/docs/stacks/stacks.js/concepts/accounts-and-addresses"],[242,"/docs/stacks/stacks.js/concepts/broadcasting"],[241,"/docs/stacks/stacks.js/concepts/networks"],[238,"/docs/stacks/stacks.js/concepts/post-conditions"],[239,"/docs/stacks/stacks.js/concepts/private-keys"],[237,"/docs/stacks/stacks.js/concepts/transactions"],[230,"/docs/stacks/stacks.js/examples/broadcast-transactions"],[231,"/docs/stacks/stacks.js/examples/post-conditions"],[232,"/docs/stacks/stacks.js/examples/use-with-react-native"],[244,"/docs/stacks/stacks.js/installation"],[236,"/docs/stacks/stacks.js/packages/common"],[235,"/docs/stacks/stacks.js/packages/network"],[233,"/docs/stacks/stacks.js/packages/sbtc"],[234,"/docs/stacks/stacks.js/packages/transactions"],[243,"/docs/stacks/stacks.js/quickstart"],[229,"/docs/stacks/stacks.js/roadmap"],[227,"/docs/stacks/stacks.js/v6/network"],[226,"/docs/stacks/stacks.js/v6/transactions"],[12,"/docs/stacks/testing-best-practices"],[348,"/docs/stacks/testing-environments"],[204,"/docs/stacks/token-development"],[54,"/docs/stacks/token-metadata-api"],[55,"/docs/stacks/token-metadata-api/architecture"],[64,"/docs/stacks/token-metadata-api/client"],[65,"/docs/stacks/token-metadata-api/client/quickstart"],[66,"/docs/stacks/token-metadata-api/client/tokens"],[67,"/docs/stacks/token-metadata-api/client/tokens/get-ft-metadata"],[56,"/docs/stacks/token-metadata-api/info"],[57,"/docs/stacks/token-metadata-api/info/status"],[59,"/docs/stacks/token-metadata-api/tokens"],[60,"/docs/stacks/token-metadata-api/tokens/fungible-token-metadata"],[62,"/docs/stacks/token-metadata-api/tokens/fungible-tokens"],[63,"/docs/stacks/token-metadata-api/tokens/non-fungible-token-metadata"],[61,"/docs/stacks/token-metadata-api/tokens/semi-fungible-token-metadata"],[58,"/docs/stacks/token-metadata-api/usage"],[224,"/docs/stacks/unit-testing"],[203,"/docs/stacks/web-app-development"]],"type":"string"}},"enabled":true,"isSorted":true},"language":"english"} \ No newline at end of file diff --git a/public/search-index.json b/public/search-index.json new file mode 100644 index 000000000..c04507d98 --- /dev/null +++ b/public/search-index.json @@ -0,0 +1,3110 @@ +[ + { + "title": "Contributors guide", + "description": "Learn how to contribute to Hiro's documentation and content.", + "slug": "/stacks/contributors-guide", + "content": "\nimport ContributorsGuideContent from '@/content/_shared/contributors-guide.mdx';\n\n<ContributorsGuideContent components={props.components} />\n" + }, + { + "title": "Introduction", + "description": "Get started with the Stacks ecosystem.", + "slug": "/stacks/get-started", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>" + }, + { + "title": "Rate limiting", + "description": "Understand the rate limits for Hiro APIs and the STX Faucet.", + "slug": "/stacks/rate-limiting", + "content": "\nimport RateLimitingContent from '@/content/_shared/rate-limiting.mdx';\n\n<RateLimitingContent components={props.components} />\n" + }, + { + "title": "Simnet", + "description": "The Simnet class is the main entry point for the Clarinet JS SDK. It provides properties and methods for interacting with the Clarinet network.", + "slug": "/stacks/clarinet-js-sdk/references/simnet", + "content": "\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/components/ui/accordion\"\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n# `initSimnet`\n\nThe `initSimnet` function initializes a simulated network. It will often be the first function you call when using the SDK.\n\n## Parameters\n\nThe `manifestPath` is the path to the `Clarinet.toml` manifest file.\n\n <Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='transition-colors'>Creating a new instance of simnet</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"custom\" className='tab group'>\n <Badge className='badge transition-colors'>With a custom config path</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet();\n ```\n </TabsContent>\n <TabsContent value=\"custom\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet('./config/Clarinet.toml');\n ```\n </TabsContent>\n </Tabs>\n\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"schema\">\n <AccordionTrigger>Schema</AccordionTrigger>\n <AccordionContent>\n ```ts\n initSimnet(manifestPath?: string): Promise<Simnet>\n ```\n </AccordionContent>\n </AccordionItem>\n </Accordion>" + }, + { + "title": "Properties", + "description": "The Clarinet JS SDK provides properties that can be used to interact with simnet.", + "slug": "/stacks/clarinet-js-sdk/references/properties", + "content": "\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `blockHeight`\n\nReturns the current block height of simnet.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the current block height</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentBlockHeight = simnet.blockHeight;\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n <Accordion title=\"Response\">\n ```ts\n 1\n ```\n </Accordion>\n</Accordions>\n\n\n# `deployer`\n\nReturns the default deployer address as defined in the project file.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the deployer address</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"set-deployer\" className='tab group'>\n <Badge className='badge transition-colors'>Setting the deployer to a new address</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentDeployerAddress = simnet.deployer;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"set-deployer\">\n ```ts\n simnet.deployer = 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5';\n const newDeployer = simnet.deployer\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `currentEpoch`\n\nReturns the current epoch of simnet.\n\nThis represents the Stacks blockchain's progress through discrete time periods, cycles, or upgrades.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the current epoch of simnet</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const epoch = simnet.currentEpoch;\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2.5\n ```\n </Accordion>\n</Accordions>\n\n" + }, + { + "title": "Custom Matchers", + "description": "A set of Vitest matchers that can be used to make assertions on Clarity values with the Clarinet JS SDK.", + "slug": "/stacks/clarinet-js-sdk/references/custom-matchers", + "content": "\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `toHaveClarityType`\n\nCheck that a value has the right Clarity type, without checking its value.\n\n## Parameters\n\n\nThe Clarity type that the expected value should have.\n\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ok response</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toHaveClarityType(ClarityType.ResponseOk);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toHaveClarityType(expectedType: ClarityType)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeOk`\n\nCheck that a response is `(ok <ok-type>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ok response with a specific value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeOk(Cl.uint(1));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeOk(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeErr`\n\nCheck that a response is `(err <error-type>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an err response with a specific value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'add',\n [Cl.uint(19)],\n simnet.deployer\n );\n\n expect(result).toBeErr(Cl.uint(500));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-constant TOO_BIG u10)\n (define-data-var count uint u0)\n\n (define-public (add (amount uint))\n (begin\n (let ((new-count (+ (var-get count) amount)))\n (if (<= new-count TOO_BIG)\n (begin\n (var-set count new-count)\n (ok (var-get count))\n )\n (err u500)\n )\n )\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeErr(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n# `toBeSome`\n\nCheck that a response is `(some <value>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an optional value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant',\n [Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5')],\n simnet.deployer\n );\n\n expect(result).toBeSome(Cl.bool(true));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n (map-set ParticipantStatus 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeSome(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeNone`\n\nCheck that a response is `(none)`.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a none value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant',\n [Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5')],\n simnet.deployer\n );\n\n expect(result).toBeNone();\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeNone()\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeBool`\n\nAsserts the value of Clarity boolean (`true` or `false`).\n\n## Parameters\n\n\nThe `boolean` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a boolean value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'has-contributed',\n [Cl.standardPrincipal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM')],\n simnet.deployer\n );\n\n expect(result).toBeBool(true);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (has-contributed (who principal))\n (is-some (get contributionAmount (map-get? ParticipantStatus who)))\n )\n\n (map-set ParticipantStatus tx-sender { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBool(expected: boolean)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeInt`\n\nAsserts the value of a Clarity integer.\n\n## Parameters\n\n\nThe `integer` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an integer value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeInt(1); // or `1n`\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count int 0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) 1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeInt(expected: number | bigint)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeUint`\n\nAsserts the value of a Clarity unsigned integer.\n\n## Parameters\n\n\nThe `unsigned integer` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an unsigned integer value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeUint(1); // or `1n`\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeUint(expected: number | bigint)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeAscii`\n\nAsserts the value of a Clarity string-ascii.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a string-ascii value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'hello-world',\n 'say-hi',\n [],\n simnet.deployer\n );\n\n expect(result).toBeAscii('Hello World');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity hello-world.clar\n (define-read-only (say-hi)\n \"Hello World\"\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeAscii(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeUtf8`\n\nAsserts the value of a Clarity string-utf8.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a string-utf8 value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'hello-world',\n 'say-hi',\n [],\n simnet.deployer\n );\n\n expect(result).toBeUtf8('Hello World');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity hello-world.clar\n (define-read-only (say-hi)\n u\"Hello World\"\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeUtf8(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBePrincipal`\n\nAsserts the value of a Clarity principal.\n\nThe principal can be a standard or a contract principal.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a standard principal</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a contract principal</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const deployer = simnet.deployer;\n\n expect(Cl.standardPrincipal(deployer)).toBePrincipal(deployer);\n ```\n\n <Accordions>\n <Accordion title=\"Schema\">\n ```ts\n toBePrincipal(expected: string) \n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n const contract = `${simnet.deployer}.hello-world`;\n\n expect(Cl.contractPrincipal(contract)).toBePrincipal(contract);\n ```\n\n <Accordions>\n <Accordion title=\"Schema\">\n ```ts\n toBePrincipal(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeBuff`\n\nAsserts the value of a Clarity buffer. It takes an ArrayBuffer as an input.\n\nFor building a buffer, `@stacks/transactions` provides some helper functions:\n\n- `bufferFromAscii`\n- `bufferFromUtf8`\n- `bufferFromHex`\n\n## Parameters\n\n\nThe `Uint8Array` buffer that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a Uint8Array buffer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"ascii\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ASCII string buffer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"hex\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a hex string buffer</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-byte-array',\n [],\n simnet.deployer\n );\n\n const buffer = Uint8Array.from([1, 2, 3, 4]);\n expect(result).toBeBuff(buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant BUFFER 0x01020304)\n\n (define-read-only (get-byte-array)\n BUFFER\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"ascii\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-btc-buffer',\n [],\n simnet.deployer\n );\n\n const btc = Cl.bufferFromAscii('btc'); // or Cl.bufferFromUtf8('btc')\n\n expect(result).toBeBuff(btc.buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant ASCII_BTC 0x627463)\n\n (define-read-only (get-btc-buffer)\n ASCII_BTC\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"hex\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n \"helpers\",\n \"get-tx-hash\",\n [],\n simnet.deployer\n );\n\n const tx = Cl.bufferFromHex(\n \"73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e\"\n );\n\n expect(result).toBeBuff(tx.buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant TX_HASH 0x73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e)\n\n (define-read-only (get-tx-hash)\n TX_HASH\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeList`\n\nAsserts the value of a Clarity list containing an array of Clarity values.\n\n## Parameters\n\n\nThe `Uint8Array` buffer that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a list of Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-addresses',\n [],\n simnet.deployer\n );\n\n expect(result).toBeList(\n [\n Cl.standardPrincipal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM'),\n Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'),\n Cl.standardPrincipal('ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG')\n ]\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-read-only (get-addresses)\n (list\n 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeList(expected: ClarityValue[])\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeTuple`\n\nAsserts the value of a Clarity tuple.\n\n## Parameters\n\n\nThe `object` of Clarity values that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a tuple</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n \n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant-data',\n [Cl.standardPrincipal(simnet.deployer)],\n simnet.deployer\n );\n\n expect(result).toBeTuple({\n enrollmentBlock: Cl.some(Cl.uint(1)),\n contributionAmount: Cl.some(Cl.uint(19000000)),\n });\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-participant-data (who principal))\n {\n enrollmentBlock: (get enrollmentBlock (map-get? ParticipantStatus who)),\n contributionAmount: (get contributionAmount (map-get? ParticipantStatus who))\n }\n )\n\n (map-set ParticipantStatus tx-sender { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeTuple(expected: Record<string, ClarityValue>)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n" + }, + { + "title": "Methods", + "description": "The Clarinet JS SDK provides several methods that can be used to interact with simnet.", + "slug": "/stacks/clarinet-js-sdk/references/methods", + "content": "\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `getAccounts`\n\nRetrieve a list of all Stacks addresses configured within the project, including wallets, deployers, and faucets.\n\n\n\n\n<Tabs defaultValue=\"get-accounts\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"get-accounts\" className='tab group'>\n <Badge className='badge transition-colors'>Getting your accounts</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-account\" className='tab group'>\n <Badge className='badge transition-colors'>Selecting a specific account</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"get-accounts\">\n ```ts\n const accounts = simnet.getAccounts();\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(10) {\n \"wallet_7\": \"ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ\",\n \"wallet_1\": \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n \"wallet_3\": \"ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC\",\n \"wallet_5\": \"ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB\",\n \"wallet_8\": \"ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP\",\n \"wallet_4\": \"ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND\",\n \"deployer\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n \"wallet_6\": \"ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0\",\n \"wallet_2\": \"ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\",\n \"faucet\": \"STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6\",\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAccounts(): Map<string, string>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"get-account\">\n ```ts\n const accounts = simnet.getAccounts();\n\n const wallet = accounts.get('wallet_1')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAccounts(): Map<string, string>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getAssetsMap`\n\nRetrieve a list of asset balances associated with Stacks addresses, including fungible and non-fungible tokens.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting STX account balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-ft-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Getting ft balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-nft-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Getting nft balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-deployer-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for an account</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const assets = simnet.getAssetsMap();\n\n const stxBalances = assets.get('STX')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(10) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 100000000000000n,\n \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\": 100000000000000n,\n \"ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\": 100000000000000n,\n \"ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC\": 100000000000000n,\n \"ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND\": 100000000000000n,\n \"ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB\": 100000000000000n,\n \"ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0\": 100000000000000n,\n \"ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP\": 100000000000000n,\n \"ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ\": 100000000000000n,\n \"STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6\": 100000000000000n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-ft-balance\">\n ```ts\n const contractName = 'token';\n const sourceCode = `\n (define-fungible-token sbtc)\n (ft-mint? sbtc u19 tx-sender)\n `;\n\n simnet.deployContract(\n contractName,\n sourceCode,\n null,\n simnet.deployer\n );\n\n const assets = simnet.getAssetsMap();\n\n const tokenBalance = assets.get('.token.sbtc')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(1) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 19n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-nft-balance\">\n ```ts\n const contractName = 'nft';\n const sourceCode = `\n (define-non-fungible-token ticket uint)\n (nft-mint? ticket u42 tx-sender)\n `;\n\n simnet.deployContract(\n contractName,\n sourceCode,\n null,\n simnet.deployer\n );\n\n const assets = simnet.getAssetsMap();\n\n const nftBalance = assets.get('.nft.ticket')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(1) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 1n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-deployer-balance\">\n ```ts\n const assets = simnet.getAssetsMap();\n const stxBalances = assets.get('STX')!;\n\n const deployerBalance = stxBalances.get('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 100000000000000n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `getDataVar`\n\nGet the value of a `data-var` defined in a contract.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `counter`</span>\n\nThe name of the `data-var` for the contract.\n\n<span>Example: `count`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the value of a data variable</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentCount = simnet.getDataVar('counter', 'count');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n (define-data-var contractOwner principal tx-sender)\n \n (var-set count (+ (var-get count) u1))\n (var-set contractOwner 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 1,\n value: 1n\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getDataVar(contract: string, dataVar: string): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const contractOwner = simnet.getDataVar(\"counter\", \"contractOwner\");\n\n const response = cvToValue(contractOwner);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n (define-data-var contractOwner principal tx-sender)\n \n (var-set count (+ (var-get count) u1))\n (var-set contractOwner 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getDataVar(contract: string, dataVar: string): ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getMapEntry`\n\nGet the value of a map entry by its key. Note that this method will always return an optional value `some` or `none`, just like Clarity `map-get?`.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the map within the contract.\n\n<span>Example: `Participants`</span>\n\nThe key to access the value in the map.\n\n<span>Example: `Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the value of an entry</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const hasParticipated = simnet.getMapEntry(\n \"pool\",\n \"Participants\",\n Cl.standardPrincipal(wallet)\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 10,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getMapEntry(\n contract: string,\n mapName: string,\n mapKey: ClarityValue\n ): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const hasParticipated = simnet.getMapEntry(\n \"pool\",\n \"Participants\",\n Cl.standardPrincipal(wallet)\n );\n\n const response = cvToValue(hasParticipated);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getMapEntry(\n contract: string,\n mapName: string,\n mapKey: ClarityValue\n ): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n# `callReadOnlyFn`\n\nCall read-only functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue`. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the read-only function within the contract.\n\n<span>Example: `get-participant`</span>\n\nThe arguments to pass to the read-only function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Making a function call</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"with-no-arguments\" className='tab group'>\n <Badge className='badge transition-colors'>With no arguments</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"deployer\" className='tab group'>\n <Badge className='badge transition-colors'>With an explicit contract address</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const getContributionAmount = simnet.callReadOnlyFn(\n 'pool',\n 'get-contribution-amount',\n [Cl.standardPrincipal(wallet)],\n wallet\n ); \n \n const response = getContributionAmount.result\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 1,\n value: 420000000n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"with-no-arguments\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const isActive = simnet.callReadOnlyFn(\n 'pool',\n 'is-active',\n [],\n wallet\n );\n \n const response = isActive.result\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 10,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"deployer\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const contractAddress = `${wallet}.pool`;\n\n const getParticipant = simnet.callReadOnlyFn(\n contractAddress,\n 'get-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = getParticipant.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 9,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const getContributionAmount = simnet.callReadOnlyFn(\n 'pool',\n 'get-contribution-amount',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = cvToValue(getContributionAmount.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n 42000000n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n \n </TabsContent>\n</Tabs>\n\n\n# `callPublicFn`\n\nCall public functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue` and the events fired during the function execution. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the public function within the contract.\n\n<span>Example: `register-participant`</span>\n\nThe arguments to pass to the public function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Broadcasting your transaction</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"events\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract events</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = registerParticipant.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 7,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n \n const response = cvToValue(registerParticipant.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"events\">\n ```ts\n import { Cl, cvToValue, type ClarityValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n \n const eventValues = registerParticipant.events.map((event) =>\n cvToValue(event.data.value as ClarityValue)\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n at: {\n type: \"uint\",\n value: \"2\",\n },\n message: {\n type: \"(string-ascii 10)\",\n value: \"Registered\",\n },\n who: {\n type: \"principal\",\n value: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `callPrivateFn`\n\nCall private functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue` and the events, if any, fired during the function execution. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the private function within the contract.\n\n<span>Example: `reward-participant-points`</span>\n\nThe arguments to pass to the private function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Broadcasting your transaction</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const address1 = accounts.get(\"wallet_1\")!\n\n const rewardParticipantPoints = simnet.callPrivateFn(\n \"pool\",\n \"reward-participant-points\",\n [Cl.standardPrincipal(address1)],\n wallet\n );\n\n const response = rewardParticipantPoints.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n (define-map ParticipantPoints principal int)\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (reward-participant-points who)\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (define-private (reward-participant-points (who principal))\n (map-insert ParticipantPoints who 100)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n (map-set ParticipantPoints tx-sender 1000)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 3,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n\n callPrivateFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const address1 = accounts.get(\"wallet_1\")!\n\n const rewardParticipantPoints = simnet.callPrivateFn(\n \"pool\",\n \"reward-participant-points\",\n [Cl.standardPrincipal(address1)],\n wallet\n );\n\n const response = cvToValue(registerParticipant.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n (define-map ParticipantPoints principal int)\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (reward-participant-points who)\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (define-private (reward-participant-points (who principal))\n (map-insert ParticipantPoints who 100)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n (map-set ParticipantPoints tx-sender 1000)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n\n callPrivateFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n \n</Tabs>\n\n\n\n# `transferSTX`\n\nTransfer STX from one address to another. The amount transferred is in `uSTX`.\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe amount of `uSTX` to transfer.\n\n<span>Example: `1000000` equals 1 STX</span>\n\nThe Stacks address of the recipient.\n\n<span>Example: `ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Transferring STX</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"events\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract events</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n result: {\n type: 7,\n value: {\n type: 3,\n },\n },\n events: [\n {\n event: \"stx_transfer_event\",\n data: [\n {\n amount: \"42000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n ],\n }\n ],\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n \n const response = cvToValue(transfer.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"events\">\n ```ts\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n\n const events = transfer.events.map((event) => event);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n event: \"stx_transfer_event\",\n data: {\n amount: \"42000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `deployContract`\n\nDeploy a contract to simnet.\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe name of the contract to be deployed.\n\n<span>Example: `hello-world`</span>\n\nThe Clarity source code (or content) of the contract.\n\n<span>Example: `(define-read-only (say-hi) (ok \"Hello World\"))`</span>\n\nAn object to specify options, such as the Clarity version.\n\n<span>Example: `{ clarityVersion: 2 }` | `null`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Deploying your contract</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Specifying a Clarity version</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"interact\" className='tab group'>\n <Badge className='badge transition-colors'>Interacting with your contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n const contract = simnet.deployContract(\n 'hello-world',\n sourceCode,\n null,\n simnet.deployer\n );\n\n const response = cvToValue(contract.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n true\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n const contract = simnet.deployContract(\n 'hello-world',\n sourceCode,\n { clarityVersion: 2 },\n simnet.deployer\n );\n\n const response = cvToValue(contract.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n true\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"interact\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n simnet.deployContract(\n 'hello-world',\n sourceCode,\n null,\n simnet.deployer\n );\n\n const sayHi = simnet.callReadOnlyFn(\"hello-world\", \"say-hi\", [], simnet.deployer);\n\n const response = sayHi.result\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"(string-ascii 11)\",\n value: \"Hello World\",\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineBlock`\n\nThe `callPublicFn`, `transferSTX`, and `deployContract` methods all mine one block with only one transaction. It can also be useful to mine a block with multiple transactions.\n\nThis is what `mineBlock` is for.\n\nThis method takes an array of transaction objects. The transactions can be built with the `tx` helper exported by the SDK.\n\nThe `tx` helper has three methods:\n- `callPublicFn`\n- `transferSTX`\n- `deployContract`\n\nThese methods have the same interface as simnet methods but instead of performing a transaction, they will build a transaction object that can be passed to the `mineBlock` function.\n\nIn epochs from 3.0 on, the stacks chaintip is advanced separately from the burn chaintip. This means `mineBlock` will only affect the stacks chaintip. If you'd like to also mine burn blocks, use the `mineEmptyBurnBlock` function.\n\n## Parameters\n\nAn array of transactions to be included in the block.\n\n<span>Example: `[tx.transferSTX(100, recipient, sender), ...]`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining multiple transactions in a single block</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { tx } from '@hirosystems/clarinet-sdk';\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get(\"wallet_1\")!;\n\n const block = simnet.mineBlock([\n tx.callPublicFn(\"counter\", \"increment\", [], simnet.deployer),\n tx.callPublicFn(\"counter\", \"add\", [Cl.uint(10)], simnet.deployer),\n tx.transferSTX(19000000, wallet, simnet.deployer),\n ]);\n\n block.forEach((transaction) => {\n console.log(cvToValue(transaction.result));\n if (transaction.events.length > 0) console.log(transaction.events);\n });\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n\n (define-public (add (amount uint))\n (begin\n (var-set count (+ (var-get count) amount))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"uint\",\n value: \"1\",\n }\n {\n type: \"uint\",\n value: \"11\",\n }\n {\n type: \"bool\",\n value: true,\n }\n [\n {\n event: \"stx_transfer_event\",\n data: {\n amount: \"19000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n mineBlock(txs: Tx[]): ParsedTransactionResult[]\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineEmptyBlock`\n\nMine one empty block and increase the block height by one.\n\nReturns the new block height.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining an empty block</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n simnet.mineEmptyBlock();\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlock(): number\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineEmptyBlocks`\n\nMine multiple empty blocks to reach a certain block height.\n\nReturns the new block height.\n\n## Parameters\n\nThe number of empty blocks to mine. This parameter is optional.\n\n<span>Example: `5`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining multiple empty blocks</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Mining an empty block without a count</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n simnet.mineEmptyBlocks(5);\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 6\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlocks(count?: number): number\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n simnet.mineEmptyBlocks();\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlocks(count?: number): number\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `runSnippet`\n\nExecute arbitrary Clarity code directly, which allows you to test and interact with smart contract functions without deploying them.\n\n## Parameters\n\nThe Clarity code snippet to be executed.\n\n<span>Example: `(define-read-only (get-balance) (ok stx-balance))`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Executing arbitrary Clarity code</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"transfer\" className='tab group'>\n <Badge className='badge transition-colors'>Running a snippet for a STX transfer</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const codeSnippet = simnet.runSnippet(\n '(stx-account tx-sender)'\n );\n\n const response = Cl.prettyPrint(codeSnippet, 2);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n locked: u0,\n unlock-height: u0,\n unlocked: u100000000000000\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n runSnippet(snippet: string): string | ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"transfer\">\n ```ts\n import { cvToValue } from \"@stacks/transactions\";\n\n const accounts = simnet.getAccounts();\n const recipient = accounts.get(\"wallet_1\")!;\n\n const codeSnippet = simnet.runSnippet(\n `(stx-transfer? u19000000 tx-sender '${recipient})`\n );\n\n const response = cvToValue(codeSnippet);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n runSnippet(snippet: string): string | ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `getContractsInterfaces`\n\nReturns the interfaces of the project contracts as a Map of Contracts, with the keys being the contract addresses.\n\nThese interfaces contain information such as the available `functions`, `data-vars`, `maps`, `NFTs`, and `FTs` defined in the contract.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting a specific contract interface</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"filter\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract functions</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractInterfaces = simnet.getContractsInterfaces();\n\n const response = contractInterfaces.get(`${simnet.deployer}.pool`);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n functions: [\n {\n name: \"get-participant\",\n access: \"read_only\",\n args: [\n [Object ...]\n ],\n outputs: [Object ...],\n }, {\n name: \"is-active\",\n access: \"read_only\",\n args: [],\n outputs: [Object ...],\n }\n ],\n variables: [],\n maps: [\n {\n name: \"ParticipantStatus\",\n key: \"principal\",\n value: [Object ...],\n }, {\n name: \"Participants\",\n key: \"principal\",\n value: \"bool\",\n }\n ],\n fungible_tokens: [],\n non_fungible_tokens: [],\n epoch: \"Epoch25\",\n clarity_version: \"Clarity2\",\n }\n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractsInterfaces(): Map<string, ContractInterface>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"filter\">\n ```ts\n const poolContract = contractInterfaces.get(`${simnet.deployer}.pool`);\n\n const response = poolContract?.functions;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n name: \"get-participant\",\n access: \"read_only\",\n args: [\n [Object ...]\n ],\n outputs: [Object ...],\n }, {\n name: \"is-active\",\n access: \"read_only\",\n args: [],\n outputs: [Object ...],\n }\n ]\n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractsInterfaces(): Map<string, ContractInterface>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getContractSource`\n\nGet the source code of a contract as a string.\n\n## Parameters\n\nThe identifier of the contract for which the source code is requested.\n\n<span>Example: `pool`</span>\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the source code of a contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractSource = simnet.getContractSource('pool');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```clarity\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractSource(contract: string): string | undefined\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `getContractAST`\n\nGet the full AST (Abstract Syntax Tree) of a Clarity contract.\n\nThis method throws an error if it fails to get the AST or to encode it.\n\n## Parameters\n\nThe identifier of the contract for which the AST (Abstract Syntax Tree) is requested.\n\n<span>Example: `pool`</span>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the source code of a contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractAST = simnet.getContractAST('pool');\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n contract_identifier: {\n issuer: [ 26, [\n 109, 120, 222, 123, 6, 37, 223, 191, 193, 108, 58, 138, 87, 53, 246, 220,\n 61, 195, 242, 206\n ] ],\n name: \"pool\",\n },\n pre_expressions: [],\n expressions: [\n {\n expr: [Object ...],\n id: 1,\n span: [Object ...],\n pre_comments: [],\n end_line_comment: undefined,\n post_comments: [],\n },\n ...\n ],\n top_level_expression_sorting: [ 0, 1, 2, 3 ],\n referenced_traits: Map {},\n implemented_traits: [],\n wasm_module: undefined,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractAST(contractId: string): ContractAST\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n" + }, + { + "title": "Overview", + "description": "The Clarinet JS SDK is a JavaScript library used to write unit tests for Clarity smart contracts.", + "slug": "/stacks/clarinet-js-sdk/index", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nThe Clarinet JS SDK allows you to write unit tests for your Clarity smart contracts. You can theoretically use any JavaScript test framework, but the SDK supports Vitest out of the box. This SDK leverages `simnet`, a simulated network that offers a rapid feedback loop for initial testing.\n\nHere is a non-exhaustive list of some of simnet's use-cases:\n\n- Call public and read-only functions from smart contracts\n- Get Clarity maps or data-var values\n- Get contract interfaces (available functions and data)\n- Write unit tests for Clarity smart contracts\n\n<Callout title=\"Requirements\" type=\"warn\">\n The SDK requires Node.js >= 18.0 and NPM to be installed.\n</Callout>\n\n## Guides\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Simulate a blockchain with Clarinet JS SDK\"\n description=\"Learn how to interact with a simulated network without running a node.\"\n />\n <SecondaryCard\n href=\"/stacks/clarinet-js-sdk/guides/migrate-to-the-clarinet-sdk\"\n title=\"Migrate v1 tests to Clarinet JS SDK\"\n description=\"Learn how to migrate your existing tests to the Clarinet JS SDK.\"\n />\n <SecondaryCard\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"SDK reference\"\n description=\"Dive deeper into the methods, properties, and types available in the Clarinet JS SDK.\" />\n</Cards>\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>" + }, + { + "title": "Quickstart", + "description": "Learn how to test a simple counter contract using the Clarinet JS SDK.", + "slug": "/stacks/clarinet-js-sdk/quickstart", + "content": "\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\nimport { SmallCard } from '@/components/card';\n\nIn this quickstart guide, you will initialize a simulated development network for testing a smart contract using the Clarinet JS SDK. You'll learn how to initialize your project, interact with a smart contract, call its functions, and test the results.\n\nCheck out the [methods](/stacks/clarinet-js-sdk/references/methods) page for the Clarinet JS SDK to learn about the different ways that you can interact with simnet.\n\n---\n\n<Steps>\n <Step>\n ## Importing dependencies\n \n Before we dive in, navigate to your project and import the `Cl` helper from the `@stacks/transactions` package in your test file.\n\n <Files className='pointer-events-none'>\n <Folder name=\"contracts\" defaultOpen>\n <File name=\"counter.clar\" />\n </Folder>\n <Folder name=\"settings\" />\n <Folder name=\"tests\" defaultOpen>\n <File name=\"counter.test.ts\" className='bg-[hsl(var(--highlight))]' />\n </Folder>\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n </Files>\n\n ```ts counter.test.ts\n import { describe, expect, it } from \"vitest\";\n import { Cl } from \"@stacks/transactions\";\n ```\n\n The `Cl` namespace simplifies the process of creating and handling Clarity values. This functionality is particularly useful in testing environments where developers need to simulate contract interactions accurately.\n \n </Step>\n <Step>\n ## Retrieve an account from the simnet\n \n For most test cases, you'll want to retrieve an account from the network in order to interact with your smart contracts. The following code uses the `getAccounts` method to achieve this.\n\n ```ts counter.test.ts\n import { describe, expect, it } from \"vitest\";\n import { Cl } from \"@stacks/transactions\";\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get(\"wallet_1\")!;\n ```\n\n <Callout title=\"Note\">\n The `--stacks` flag is required and allows you to specify the network to scan. Other options include `--bitcoin`.\n </Callout>\n </Step>\n <Step>\n ## Write your first test\n \n The process for writing tests for smart contracts with the Clarinet JS SDK follows a structured approach similar to testing in JavaScript. Here's a breakdown of the steps involved:\n\n 1. Define the group of tests you want to run using the `describe` block.\n 2. Define the test you want to run using the `it` block.\n 3. Call the function and assert the result using the `expect` function.\n\n Now that you understand the key components for writing tests, start by writing a test that ensures the `counter` contract has been deployed.\n\n ```ts counter.test.ts\n describe(\"counter contract\", () => {\n it(\"ensures the contract is deployed\", () => {\n const contractSource = simnet.getContractSource(\"counter\");\n expect(contractSource).toBeDefined();\n });\n });\n ```\n </Step>\n <Step>\n ## Test the count-up function\n \n Now it's time to call a public function and assert the result. The <code>count-up</code> function is expected to increment the count of the user's principal by 1. Write a test to ensure this behaves as expected.\n\n ```ts counter.test.ts\n describe(\"counter contract\", () => {\n it(\"increments the count of the user's principal by 1\", () => {\n const countUpCall = simnet.callPublicFn(\"counter\", \"count-up\", [], wallet);\n expect(countUpCall.result).toBeOk(Cl.bool(true));\n \n const getCountCall = simnet.callReadOnlyFn(\n \"counter\",\n \"get-count\",\n [Cl.principal(wallet)],\n wallet\n );\n expect(getCountCall.result).toBeUint(1);\n });\n });\n ```\n\n Above, the `count-up` function is called, and the result is asserted to return an `(ok true)`. Then, the count for the user's principal is retrieved and asserted to be `u1`.\n\n <Callout title=\"Custom matchers\">\n <p>The <code>toBeOk</code> and <code>toBeUint</code> methods are used to ensure the `count-up` function returns the proper Clarity values. For more details, check out the [custom matchers](/stacks/clarinet-js-sdk/references/custom-matchers) page.</p>\n </Callout>\n </Step>\n <Step>\n ## Run your tests\n\n Every generated project comes with a <code>package.json</code> file that contains the necessary dependencies and scripts to run your tests.\n \n ```json package.json\n \"scripts\": {\n \"test\": \"vitest run\",\n \"test:report\": \"vitest run -- --coverage --costs\",\n \"test:watch\": \"chokidar \\\"tests/**/*.ts\\\" \\\"contracts/**/*.clar\\\" -c \\\"npm run test:report\\\"\"\n }\n ```\n\n You can now run your tests, with your preferred package manager, by executing the following command:\n \n ```terminal\n $ npm run test\n ```\n </Step>\n <Step>\n ## Run your tests with code coverage and cost analysis\n\n Clarinet can automatically also produce a code coverage report and cost analysis on the test you ran.\n\n ```json package.json\n \"scripts\": {\n \"test\": \"vitest run\",\n \"test:report\": \"vitest run -- --coverage --costs\",\n \"test:watch\": \"chokidar \\\"tests/**/*.ts\\\" \\\"contracts/**/*.clar\\\" -c \\\"npm run test:report\\\"\"\n }\n ```\n\n By running the `npm run test:report` command in your terminal, an `lcov.info` and `costs-reports.json` file will appear in your root folder:\n\n <Files className='pointer-events-none'>\n <Folder name=\"contracts\" defaultOpen>\n <File name=\"counter.clar\" />\n </Folder>\n <Folder name=\"settings\" />\n <Folder name=\"tests\" defaultOpen>\n <File name=\"counter.test.ts\" />\n </Folder>\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"costs-reports.json\" className='bg-[hsl(var(--highlight))]' />\n <File name=\"lcov.info\" className='bg-[hsl(var(--highlight))]' />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n </Files>\n\n The `costs-reports.json` file will output the cost analysis for every function ran in your tests. Since the `count-up` function was used in our test, this is how the cost analysis output would look like for that function:\n\n ```json costs-reports.json\n {\n \"test_name\": \"tests/counter.test.ts__counter contract__increments the count of the user's principal by 1\",\n \"contract_id\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.counter\",\n \"method\": \"count-up\",\n \"args\": [],\n \"cost_result\": {\n \"total\": {\n \"write_length\": 41,\n \"write_count\": 1,\n \"read_length\": 245,\n \"read_count\": 5,\n \"runtime\": 4752\n },\n \"limit\": {\n \"write_length\": 15000000,\n \"write_count\": 15000,\n \"read_length\": 100000000,\n \"read_count\": 15000,\n \"runtime\": 5000000000\n },\n \"memory\": 40,\n \"memory_limit\": 100000000\n }\n }\n ```\n\n To access and read the `lcov.info` file in a human-readable format, we can first install the `lcov` [package](https://github.com/linux-test-project/lcov) that helps generate a graphical front-end for coverage testing tools.\n\n ```terminal\n $ brew install lcov\n ```\n\n Then we'll run the `genhtml` command below with the following options. This command and its options will generate the actual html file, add in additional branch coverage, and will automatically store the files in a new folder called `coverage`.\n\n ```terminal\n $ genhtml lcov.info --branch-coverage -o coverage\n ```\n\n You can then navigate into the new `coverage` folder and run the command `open index.html` to view your coverage report. In addition, a summary of the coverage report will be outputted in the terminal.\n </Step>\n</Steps>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API Reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/guides/migrate-to-the-clarinet-sdk\"\n title=\"Migrating your tests to Clarinet SDK\"\n description=\"Learn how to migrate your existing Clarinet projects to the Clarinet JS SDK\"\n />\n</Cards>" + }, + { + "title": "Installation", + "description": "Clarinet JS SDK can be installed using your preferred package manager.", + "slug": "/stacks/clarinet-js-sdk/installation", + "content": "\n<Callout type=\"warn\">\n The SDK requires Node.js >= 18.0 and NPM to be installed.\n</Callout>\n\n```package-install\n@hirosystems/clarinet-sdk\n```\n" + }, + { + "title": "SDKs & Libraries", + "description": "The following guides cover ways to use Hiro tools to build apps on Stacks.", + "slug": "/stacks/reference", + "content": "\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/quickstart\"\n title=\"Create your first smart contract\"\n description=\"Build a simple counter contract using Clarinet.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Blockchain />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write unit tests for your smart contracts\"\n description=\"Learn how run unit tests with Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/stacks.js/quickstart\"\n title=\"Make a contract call with Stacks.js\"\n description=\"Learn how to integrate smart contracts into your app.\"\n tag='Stacks.js'\n />\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n" + }, + { + "title": "Best practices", + "description": "Learn best practices for writing and running tests for your Clarity smart contracts using the Clarinet JS SDK and Vitest.", + "slug": "/stacks/testing-best-practices", + "content": "\nIntegration testing is a crucial step in smart contract development that involves testing how different components of your system work together. The Clarinet JS SDK provides powerful tools for writing and running integration tests, allowing you to simulate complex scenarios and interactions between multiple contracts.\n\nBy using integration tests, you can ensure that your smart contracts function correctly as part of a larger system and catch potential issues that might not be apparent in unit tests alone.\n\nIn this guide, you will:\n\n1. [Set up a Clarinet project with a `defi` contract.](#set-up-a-clarinet-project)\n2. [Write an integration test for the smart contract.](#test-the-deposit-and-borrow-functionality)\n3. [Run tests and generate coverage reports.](#run-tests-and-generate-coverage-reports)\n\n---\n\n## Set up a Clarinet project\n\nStart by creating a new Clarinet project. This command will create a new directory named `defi` and set up a basic Clarinet project inside it.\n\n```terminal\n$ clarinet new stx-defi\n$ cd stx-defi\n```\n\nAfter changing into your project directory, run `npm install` to install the package dependencies for testing.\n\n```terminal\n$ npm install\n```\n\nWe are going to use the same `defi` contract that we used in the [unit testing guide](/stacks/clarinet-js-sdk/guides/unit-testing), but with some additional functionality - the ability to `borrow` STX from the contract. If you don't have this project set up already, follow the steps below:\n\n```terminal\n$ clarinet contract new defi\n```\n\nThen, inside your `defi.clar` file, copy and paste the following contract code:\n\n```clarity\n;; Error constants for various failure scenarios.\n(define-constant err-overborrow (err u300))\n\n;; The interest rate for loans, represented as 10% (out of a base of 100).\n(define-data-var loan-interest-rate uint u10) ;; Representing 10% interest rate\n\n\n;; Holds the total amount of deposits in the contract, initialized to 0.\n(define-data-var total-deposits uint u0)\n\n;; Maps a user's principal address to their deposited amount.\n(define-map deposits { owner: principal } { amount: uint })\n\n;; Maps a borrower's principal address to their loan details: amount and the last interaction block.\n(define-map loans principal { amount: uint, last-interaction-block: uint })\n\n;; Public function for users to deposit STX into the contract.\n;; Updates their balance and the total deposits in the contract.\n(define-public (deposit (amount uint))\n (let\n (\n ;; Fetch the current balance or default to 0 if none exists.\n (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n )\n ;; Transfer the STX from sender = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\" to recipient = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)\".\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n ;; Update the user's deposit amount in the map.\n (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })\n ;; Update the total deposits variable.\n (var-set total-deposits (+ (var-get total-deposits) amount))\n ;; Return success.\n (ok true)\n )\n)\n\n;; Public function for users to borrow STX based on their deposits.\n(define-public (borrow (amount uint))\n (let\n (\n ;; Fetch user's deposit or default to 0.\n (user-deposit (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n ;; Calculate the maximum amount the user is allowed to borrow. (which will be upto HALF of what they deposited)\n (allowed-borrow (/ user-deposit u2))\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n ;; Calculate the new loan total after borrowing additional amount.\n (new-loan (+ amount))\n )\n ;; Ensure the requested borrow amount does not exceed the allowed amount.\n (asserts! (<= new-loan allowed-borrow) err-overborrow)\n ;; Transfer the borrowed STX to the user.\n (let\n (\n (recipient tx-sender)\n )\n (try! (as-contract (stx-transfer? amount tx-sender recipient)))\n )\n ;; Update the user's loan details in the map.\n (map-set loans tx-sender { amount: new-loan, last-interaction-block: block-height })\n ;; Return success.\n (ok true)\n )\n)\n\n;; Read-only function to get the total balance by tx-sender\n(define-read-only (get-balance-by-sender)\n (ok (map-get? deposits { owner: tx-sender }))\n)\n\n;; Read-only function to get the total amount owed by the user.\n(define-read-only (get-amount-owed)\n (let\n (\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n )\n ;; Return the total amount due.\n (ok total-due)\n )\n)\n\n;; Private function to calculate the accrued interest on a loan.\n(define-private (calculate-accrued-interest (principal uint) (start-block uint))\n (let\n (\n ;; Calculate the number of blocks elapsed since the last interaction.\n (elapsed-blocks (- block-height start-block))\n ;; Calculate the interest based on the principal, rate, and elapsed time.\n (interest (/ (* principal (var-get loan-interest-rate) elapsed-blocks) u10000))\n )\n ;; Ensure the loan started in the past (not at block 0).\n (asserts! (not (is-eq start-block u0)) (ok u0))\n ;; Return the calculated interest.\n (ok interest)\n )\n)\n```\n\nRun `clarinet check` to ensure that your smart contract is valid and ready for testing.\n\n<Callout>\nYou can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi).\n</Callout>\n\n## Test the deposit and borrow functionality\n\nIn order to `borrow` STX from the contract, users must first `deposit` STX into it. Therefore, we need to write an integration test that simulates the interaction between these two functions.\n\nInside of your `defi.test.ts` file, replace the boilerplate code and add the following:\n\n```typescript\nimport { describe, it, expect } from 'vitest';\nimport { Cl } from '@stacks/transactions';\n\nconst accounts = simnet.getAccounts();\nconst wallet1 = accounts.get('wallet_1')!;\n\ndescribe('stx-defi', () => {\n it('borrows 10 and verifies the amount owed to be 10', () => {\n simnet.callPublicFn('defi', 'deposit', [Cl.uint(1000)], wallet1);\n const totalDeposits = simnet.getDataVar('defi', 'total-deposits');\n expect(totalDeposits).toBeUint(1000);\n\n simnet.callPublicFn('defi', 'borrow', [Cl.uint(10)], wallet1);\n const { result } = simnet.callReadOnlyFn('defi', 'get-amount-owed', [], wallet1);\n expect(result).toBeOk(Cl.uint(10));\n });\n});\n```\n\nIn this integration test, we're simulating a scenario where a user deposits STX into the DeFi contract and then borrows against that deposit. Let's walk through the process step by step.\n\nWe start by simulating a deposit of 1000 STX from `wallet1`. To do this, we use the `callPublicFn` method from the Clarinet JS SDK `simnet` object, which allows us to call public functions in our smart contract just as we would on the actual blockchain.\n\nAfter making the deposit, we want to verify that it was successful. We do this by checking the total deposits in the contract using `getDataVar`.\n\nThis handy method lets us peek at the value of data variables defined in your contract.\n\n<Callout>\nTo learn more about available methods for integration testing, check out the [reference page](/stacks/clarinet-js-sdk/references/methods).\n</Callout>\n\nTo ensure the deposit was recorded correctly, we use a custom matcher, `toBeUint`. This matcher is specifically designed to check if a value is a Clarity unsigned integer with the exact value we expect.\n\nWith the deposit confirmed, we simulate `wallet1` borrowing 10 STX. We do this with another call to `callPublicFn`, this time invoking the `borrow` function of our contract.\n\nAfter the borrowing operation, we want to check how much `wallet1` owes. We use `callReadOnlyFn` to call a read-only function named `get-amount-owed` in our contract.\n\nFinally, we verify the amount owed using another custom matcher, `toBeOk(Cl.uint(10))`. This matcher is particularly useful because it checks two things at once:\n\n1. That our contract returned a successful Clarity response type.\n2. That the value returned is a Clarity unsigned integer with the exact value we expect (`10`).\n\nThese custom matchers and simnet methods are powerful tools and allow you to simulate complex interactions with your smart contracts and make detailed assertions about the results.\n\n## Run tests and generate coverage reports\n\nTo run your tests, use:\n\n```terminal\n$ npm run test\n```\n\nTo generate a coverage report, use:\n\n```terminal\n$ npm run coverage\n```\n\nThis will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/methods\"\n title=\"SDK methods\"\n description=\"Learn about the methods available in the Clarinet JS SDK.\"\n />\n</Cards>\n" + }, + { + "title": "Overview", + "description": "The Hiro Archive is a series of data snapshots for services in the Stacks ecosystem.", + "slug": "/stacks/archive/index", + "content": "\nimport { Button } from \"@/components/ui/button\"\nimport { SecondaryCard } from \"@/components/card\"\n\nThe Hiro Archive enables you to quickly bootstrap supported services with pre-loaded data, which otherwise could take you days or weeks to acquire when syncing from genesis. This is a public service Hiro offers as a free benefit to the Stacks community.\n\n<Button className=\"bg-orange-500 hover:bg-orange-600\">\n <a href=\"https://archive.hiro.so/\" target=\"_blank\" className=\"no-underline\">\n View the Hiro Archive\n </a>\n</Button>\n\n## Supported services\n\nWe record and archive mainnet and testnet snapshots for the following services every night:\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/archive/guides/verify-archive-data\"\n title=\"Verify archive data\"\n description=\"Verify the integrity of the data in a particular snapshot.\"\n />\n <SecondaryCard\n href=\"/stacks/archive/guides/stacks-blockchain\"\n title=\"Stacks blockchain\"\n description=\"Quickly spin up a new Stacks node.\"\n />\n <SecondaryCard\n href=\"/stacks/archive/guides/stacks-api\"\n title=\"Stacks Blockchain API\"\n description=\"Spin up a new instance of the Stacks Blockchain API.\"\n />\n <SecondaryCard\n href=\"/stacks/archive/guides/token-metadata-api\"\n title=\"Token Metadata API\"\n description=\"Spin up a new instance of the Token Metadata API.\"\n />\n</Cards>\n" + }, + { + "title": "Use the Stacks Blockchain API archive", + "description": "Discover how to use the Hiro Archive to spin up a Stacks Blockchain API.", + "slug": "/stacks/archive/guides/stacks-api", + "content": "\n## Prerequisites\n\nSince the Stacks Blockchain API depends on a Stacks blockchain node being at the same block height, you will need to first [restore a Stacks blockchain node using the Hiro Archive](/stacks/archive/guides/stacks-blockchain) before restoring the Stacks Blockchain API. Otherwise, you may encounter errors when running the API.\n\nIn order for the Stacks blockchain and Stacks Blockchain API archives to be compatible, they must meet the following criteria:\n\n- Both archives correspond to the same Stacks network (mainnet/testnet).\n- The API archive version must be compatible with the Stacks blockchain archive version (See [API release notes](https://github.com/hirosystems/stacks-blockchain-api/releases) for guidance).\n- Both archives were created on the same date.\n\n## Restoration methods\n\nThere are two ways to restore a Stacks Blockchain API using the Hiro Archive. The archive file you'll need to download will depend on your method of restoration. There is no scenario where you would need both restoration methods.\n\n**Restore via Postgres database dump (Recommended)**\n\nThis is the quickest and most direct method, and it is suitable for most scenarios. It consists of a backup of the API's Postgres database taken using `pg_dump`. We generally recommend starting with this method before attempting the method below if this one does not work for any reason.\n\n**Restore via tab-separated-values (TSV) file**\n\nThis method is several times slower than restoring from a Postgres dump. The API TSV file contains the raw unprocessed events from a Stacks blockchain node. The API can ingest this file to process events into a Postgres database.\nRestoring from a TSV file can be useful when a Postgres database archive for a particular API version is not available or when it cannot be used for any reason.\n\n## Where to download archives\n\nDepending on the restoration method used above, the Stacks Blockchain API archives for each network can be found at the following locations:\n\n- Postgres database dump\n - mainnet: https://archive.hiro.so/mainnet/stacks-blockchain-api-pg/\n - testnet: https://archive.hiro.so/testnet/stacks-blockchain-api-pg/\n- TSV file\n - mainnet: https://archive.hiro.so/mainnet/stacks-blockchain-api/\n - testnet: https://archive.hiro.so/testnet/stacks-blockchain-api/\n\nThe file name patterns are as follows:\n\n- Postgres database dump\n - archive: `stacks-blockchain-api-pg-<DATABASE VERSION>-<API VERSION>-<DATE(YYYYMMDD)>.dump`\n - shasum: `stacks-blockchain-api-pg-<DATABASE VERSION>-<API VERSION>-<DATE(YYYYMMDD)>.sha256`\n- TSV file\n - archive: `<network>-stacks-blockchain-api-<API VERSION>-<DATE(YYYYMMDD)>.gz`\n - shasum: `<network>-stacks-blockchain-api-<API VERSION>-<DATE(YYYYMMDD)>.sha256`\n\nThere is a continually updated archive and shasum which always points to the most recent upload:\n\n- Postgres database dump\n - archive: `stacks-blockchain-api-pg-<DATABASE VERSION>-latest.dump`\n - shasum: `stacks-blockchain-api-pg-<DATABASE VERSION>-latest.sha256`\n- TSV file\n - archive: `<network>-stacks-blockchain-api-latest.gz`\n - shasum: `<network>-stacks-blockchain-api-latest.sha256`\n\nor the most recent upload for a particular version:\n\n- Postgres database dump\n - archive: `stacks-blockchain-api-pg-<DATABASE VERSION>-<API VERSION>-latest.dump`\n - shasum: `stacks-blockchain-api-pg-<DATABASE VERSION>-<API VERSION>-latest.sha256`\n- TSV file\n - archive: `<network>-stacks-blockchain-api-<API VERSION>-latest.gz`\n - shasum: `<network>-stacks-blockchain-api-<API VERSION>-latest.sha256`\n\n## Restoring the Stacks Blockchain API using the Hiro Archive\n\n**If restoring via Postgres dump**\n\n1. Download the archive and shasum for the appropriate network and restoration method.\n1. [Verify the archive](/stacks/archive/guides/verify-archive-data) with the shasum.\n1. Import the archive file into a running Postgres database (may take up to an hour depending on database specs and tuning):\n ```terminal\n $ export PGPASSWORD=<YOUR POSTGRES PASSWORD>\n $ pg_restore --username postgres --verbose --jobs 4 --dbname stacks_blockchain_api /path/to/archive/file\n ```\n1. Launch the Stacks Blockchain API service.\n1. Verify the dataset is being used by comparing your nodes [local block height](http://localhost:3999/extended/v1/status) with [Hiro's](https://api.hiro.so/extended/v1/status). If the block height matches or is close to Hiro's block height, the restoration was successful.\n 1. It may take a few minutes for the local node to respond on this endpoint.\n 1. Your block height may be up to a few hundred blocks away from Hiro's depending on the age of the archive. It should catch up relatively quickly.\n\n**If restoring via TSV file**\n\n1. Download the archive and shasum for the appropriate network and restoration method.\n1. [Verify the archive](/stacks/archive/guides/verify-archive-data) with the shasum.\n1. Extract the archive into the desired directory:\n ```terminal\n $ gzip -d <ARCHIVE FILE> --stdout > /path/to/extracted/file\n ```\n1. [Follow these directions](https://github.com/hirosystems/stacks-blockchain-api#export-and-import) to process and import the events in the TSV file into your Postgres database.\n1. Launch the Stacks Blockchain API service.\n1. Verify the dataset is being used by comparing your nodes [local block height](http://localhost:3999/extended/v1/status) with [Hiro's](https://api.hiro.so/extended/v1/status). If the block height matches or is close to Hiro's block height, the restoration was successful.\n 1. It may take a few minutes for the local node to respond on this endpoint.\n 1. Your block height may be up to a few hundred blocks away from Hiro's depending on the age of the archive. It should catch up relatively quickly.\n" + }, + { + "title": "Use the Token Metadata API archive", + "description": "Discover how to use the Hiro Archive to spin up a Token Metadata API.", + "slug": "/stacks/archive/guides/token-metadata-api", + "content": "\n## Prerequisites\n\nSince the Token Metadata API depends on a Stacks Blockchain API, you will need to first launch a Stacks Blockchain API configured for the same Stacks network.\n\nIf you don't already have one, you can follow [these instructions](/stacks/archive/guides/stacks-blockchain) to launch one with an archive.\n\n## Where to download archives\n\nToken Metadata API archives for each network can be found at the following locations:\n\n- mainnet: https://archive.hiro.so/mainnet/token-metadata-api-pg/\n- testnet: https://archive.hiro.so/testnet/token-metadata-api-pg/\n\nThe file name patterns are as follows:\n\n- archive: `token-metadata-api-pg-<DATABASE VERSION>-<API VERSION>-<DATE(YYYYMMDD)>.dump`\n- shasum: `token-metadata-api-pg-<DATABASE VERSION>-<API VERSION>-<DATE(YYYYMMDD)>.sha256`\n\nThere is a continually updated archive and shasum which always points to the most recent upload:\n\n- archive: `token-metadata-api-pg-<DATABASE VERSION>-latest.dump`\n- shasum: `token-metadata-api-pg-<DATABASE VERSION>-latest.sha256`\n\nor the most recent upload for a particular version:\n\n- archive: `token-metadata-api-pg-<DATABASE VERSION>-<API VERSION>-latest.dump`\n- shasum: `token-metadata-api-pg-<DATABASE VERSION>-<API VERSION>-latest.sha256`\n\n## Restoring the Token Metadata API using the Hiro Archive\n\n1. Download the archive and shasum for the appropriate network.\n1. [Verify the archive](/stacks/archive/guides/verify-archive-data) with the shasum.\n1. Import the archive file into a running Postgres database (may take up to an hour depending on database specs and tuning):\n ```terminal\n $ export PGPASSWORD=<YOUR POSTGRES PASSWORD>\n $ pg_restore --username postgres --verbose --jobs 4 --dbname token_metadata_api /path/to/archive/file\n ```\n1. Launch the Token Metadata API service.\n1. Verify the restoration was successful by viewing the [total number of tokens and contracts tracked in the service.](http://localhost:3000/metadata) If the total number of each property is greater than zero, the restoration was successful.\n 1. It may take a few minutes for the local node to respond on this endpoint.\n" + }, + { + "title": "Verify archive data", + "description": "Verify the integrity of the data in a particular snapshot.", + "slug": "/stacks/archive/guides/verify-archive-data", + "content": "\nAll datasets have an associated SHA256 hash file which can be used to verify the integrity of the downloaded dataset.\nAs some of the archives are quite large, this is useful to ensure the file you've downloaded matches the file maintained in the Hiro Archive.\n\nAfter downloading an archive file and its associated shasum file, you can verify the integrity of the archive file like so:\n\n```terminal\n$ echo \"$(cat <SHASUM FILE> | awk '{print $1}') <ARCHIVE FILE>\" | shasum --check\n<ARCHIVE FILE>: OK\n\n$ echo \"$(cat mainnet-stacks-blockchain-api-latest.sha256 | awk '{print $1}') mainnet-stacks-blockchain-api-latest.gz\" | shasum --check\n\nmainnet-stacks-blockchain-api-latest.gz: OK\n\n# Otherwise a log will be printed indicating failure\nmainnet-stacks-blockchain-api-latest.gz: FAILED\nshasum: WARNING: 1 computed checksum did NOT match\n```\n\n<Callout title=\"Note\" type=\"warn\">\nIf the integrity check fails for any reason, you may need to delete the local archive and re-attempt the download. If issues persist, switch to a different network and try again.\n</Callout>" + }, + { + "title": "Use the Stacks blockchain archive", + "description": "Discover how to use the Hiro Archive to spin up a Stacks node.", + "slug": "/stacks/archive/guides/stacks-blockchain", + "content": "\n## Where to download archives\n\nStacks blockchain archives for each network can be found at the following locations:\n\n- mainnet: https://archive.hiro.so/mainnet/stacks-blockchain/\n- testnet: https://archive.hiro.so/testnet/stacks-blockchain/\n\nThe file name patterns are as follows:\n\n- archive: `<NETWORK>-stacks-blockchain-<VERSION>-<DATE(YYYYMMDD)>.tar.gz`\n- shasum: `<NETWORK>-stacks-blockchain-<VERSION>-<DATE(YYYYMMDD)>.sha256`\n\nThere is a continually updated archive and shasum which always points to the most recent upload:\n\n- archive: `<NETWORK>-stacks-blockchain-latest.tar.gz`\n- shasum: `<NETWORK>-stacks-blockchain-latest.sha256`\n\nor the most recent upload for a particular version:\n\n- archive: `<NETWORK>-stacks-blockchain-2.3.0.0.2-latest.tar.gz`\n- shasum: `<NETWORK>-stacks-blockchain-2.3.0.0.2-latest.sha256`\n\n## Restoring a Stacks blockchain node using the Hiro Archive\n\n1. Download the archive and shasum for the appropriate network.\n1. [Verify the archive](/stacks/archive/guides/verify-archive-data) with the shasum.\n1. Extract the archive into the desired directory:\n ```terminal\n $ tar -zxvf <ARCHIVE FILE> -C /target/directory\n ```\n1. [Configure the `working_dir` property](https://docs.stacks.co/docs/nodes-and-miners/stacks-node-configuration#node) in your Stacks blockchain node Config.toml file to match the directory you extracted the archive to.\n1. Launch your Stacks blockchain node. You can use [one of these example configuration files](https://github.com/stacks-network/stacks-blockchain/tree/master/testnet/stacks-node/conf) as a reference.\n1. Verify the dataset is being used by comparing your nodes [local block height](http://localhost:20443/v2/info) with [Hiro's](https://api.hiro.so/v2/info). If the block height matches or is close to Hiro's block height, the restoration was successful.\n 1. It may take a few minutes for the local node to respond on this endpoint.\n 1. Your block height may be up to a few hundred blocks away from Hiro's depending on the age of the archive. It should catch up relatively quickly.\n" + }, + { + "title": "Overview", + "description": "Clarinet is a local development environment that offers everything you need to create, test, and deploy smart contracts on Stacks.", + "slug": "/stacks/clarinet/index", + "content": "\nimport { ArrowUpRight } from \"lucide-react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\"\nimport { SecondaryCard } from \"@/components/card\";\n\nUsing a simple command line interface, Clarinet enables you to build and iterate on your contracts locally before moving into production on the `mainnet` network.\n\nYou can code with <TooltipProvider inline><Tooltip><TooltipTrigger asChild><span className='cursor-default border-b border-dotted border-primary'>Clarity syntax support</span></TooltipTrigger><TooltipContent>Using the [Clarity VSCode extension](https://marketplace.visualstudio.com/items?itemName=HiroSystems.clarity-lsp#:~:text=This%20VS%20Code%20extension%20brings,safety%20checks%2C%20debugger%20and%20more)</TooltipContent></Tooltip></TooltipProvider>, run tests, debug your code line by line, and deploy your contracts to a local Stacks blockchain environment to rapidly iterate on your code.\n\n## Installation\n\n<TerminalPicker storage=\"macOs\">\n\n```terminal !! macOS\n$ brew install clarinet\n```\n\n```terminal !! Windows\n$ winget install clarinet\n```\n\n```terminal !! Cargo\n$ sudo apt install build-essential pkg-config libssl-dev\n```\n\n```terminal !! Pre-built binary\n$ wget -nv https://github.com/hirosystems/clarinet/releases/download/v0.27.0/clarinet-linux-x64-glibc.tar.gz -O clarinet-linux-x64.tar.gz\n$ tar -xf clarinet-linux-x64.tar.gz\n$ chmod +x ./clarinet\n$ mv ./clarinet /usr/local/bin\n```\n\n</TerminalPicker>\n\n## Set up shell completions\n\nClarinet already has many different commands built in. Therefore, enabling tab completion in your shell may be useful. Using the command below, you can use `clarinet` to generate the shell completion scripts for many common shells.\n\n```terminal\n$ clarinet completions (bash|elvish|fish|powershell|zsh)\n```\n\nAfter generating the file, you can refer to the documentation for your shell to determine where this file should be moved to and what other steps may be necessary to enable tab completion for `clarinet`.\n\n## Guides\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/clarinet/guides/create-a-new-project\"\n title=\"Create a new contract\"\n description=\"Add new contracts to your project and have them automatically configured in your project file.\"\n />\n <SecondaryCard\n href=\"/stacks/clarinet-js-sdk/guides/unit-testing\"\n title=\"Write unit tests\"\n description=\"Leverage the Clarinet JS SDK to write comprehensive unit tests, ensuring your contract performs as expected.\"\n />\n <SecondaryCard\n href=\"/stacks/clarinet/guides/create-deployment-plans\"\n title=\"Create deployment plans\"\n description=\"Employ customizable deployment plans to streamline your contract deployments.\"\n />\n <SecondaryCard\n href=\"/stacks/clarinet/guides/run-a-local-devnet\"\n title=\"Run a local development environment\"\n description=\"Set up a local devnet environment for developing and testing in a controlled environment before deployment.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Clarinet JS SDK](/stacks/clarinet-js-sdk)**: Simplify your testing with the Clarinet JS SDK.\n- **[Hiro Platform](/stacks/platform)**: A developer platform for building, deploying and scaling Bitcoin apps.\n- **[Stacks.js](/stacks/stacks.js)**: Leverage a JavaScript library that handles basic functions, such as user authentication and transaction signing.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n" + }, + { + "title": "Concepts", + "description": "Learn about the concepts behind Clarinet.", + "slug": "/stacks/clarinet/concepts", + "content": "\n## Network types\n\nClarinet supports different network types to cater to various development and testing needs:\n\n| Network | Description | Use case\n| -------------- | ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |\n| `simnet` | Optimized for fast feedback loops, introspection, and portability. | Ideal for initial development and unit-testing. |\n| `devnet` | Local Stacks and Bitcoin nodes running on Docker for faster feedback loops. | Use for integration tests or local frontend development. |\n| `testnet` | A pre-production network that offers a realistic environment for testing. | Ideal for final testing before deploying to Mainnet. |\n| `mainnet` | The production network where real transactions occur. | Use when you're ready to deploy your smart contract to production. |\n\n## Deployment plans\n\nThe default deployment plan of every Clarinet project is contained within specifications set inside certain files. In addition to this default deployment plan, the user can manually configure each plan, adding additional transactions or contract calls across multiple Stacks or Bitcoin blocks.\n\nYou can commit, audit, and test contracts without including any secrets in the deployment plan, and you can share these contracts without exposing any sensitive information.\n\n### Primitives\n\n| Transaction primitive | Typical usage |\n| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Publish contracts | Deploy contracts to an in-memory simulated Stacks chain, public networks like testnet and mainnet, or deploy external contracts to your local network for testing purposes. |\n| Call contract functions | Call a contract deployed to any of your local devnets or public networks. |\n| Send BTC | Perform a simple bitcoin transfer from a p2pkh address to a p2pkh address. |\n| Wait for block | Test or automate contract deployment across multiple Stacks or Bitcoin blocks. |\n| Send STX | Send stacks to an address or contract. |" + }, + { + "title": "Add a contract", + "description": "Clarinet can handle adding and configuring a new contract to your project.", + "slug": "/stacks/clarinet/examples/add-a-contract", + "content": "\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nTo add a new contract, run the `clarinet contract new` command, along with your contract name, inside your project.\n\n```terminal\n$ clarinet contract new my-contract\n```\n\n## Project structure\n\n**Clarinet** will add 2 files to your project: `my-contract.clar` and `my-contract.test.ts`.\n\n<Files className='pointer-events-none'>\n <Folder name=\"contracts\" defaultOpen>\n <File name=\"my-contract.clar\" className='bg-[hsl(var(--highlight))]' />\n </Folder>\n <Folder name=\"settings\" />\n <Folder name=\"tests\" defaultOpen>\n <File name=\"my-contract.test.ts\" className='bg-[hsl(var(--highlight))]' />\n </Folder>\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n</Files>\n\n**Clarinet** will also add the configuration to the `Clarinet.toml` file for your contract.\n\n```toml\n[contracts.my-contract]\npath = 'contracts/my-contract.clar'\nclarity_version = 2\nepoch = 2.4\n```\n\n<Callout title=\"Adding contracts manually\">\nYou can also add contracts to your project by adding the files manually. However, you must add the appropriate configuration to `Clarinet.toml` in order for **Clarinet** to recognize the contracts.\n</Callout>" + }, + { + "title": "Validate a contract", + "description": "Clarinet provides syntax and semantics checkers for the smart contract language Clarity.", + "slug": "/stacks/clarinet/examples/validate-a-contract", + "content": "\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nValidate the syntax and semantics of your contracts:\n\n```terminal\n$ clarinet check\n\u001b[32m✔\u001b[0m \u001b[1m1 contract checked\u001b[0m\n$ clarinet check path/to/my-contract.clar\n\u001b[32m✔\u001b[0m \u001b[1m1 contract checked\u001b[0m\n```\n\nThis command uses the _txt`Clarinet.toml`_ file to locate and analyze all the contracts in the project. If the Clarity code is valid, the command will indicate success with the response below.\n\n<Callout title=\"Note\">\nThe _console`clarinet check`_ command may also report warnings indicating the code is valid.\n</Callout>" + }, + { + "title": "Estimating contract costs", + "description": "Analyze execution costs pertaining to your contract.", + "slug": "/stacks/clarinet/examples/estimate-costs", + "content": "\nimport { API, Clarinet, Js } from '@/components/ui/icon';\nimport { File, Folder, Files } from \"fumadocs-ui/components/files\"\n\nTransactions on the Stacks blockchain comes with execution costs that can dictate transaction fees for your users. To analyze the execution costs of your contract's functions, let's continue with the simple `counter` contract from the [Clarinet quickstart](/stacks/clarinet/quickstart) as an example.\n\n```clarity\n(define-map Counters principal uint)\n\n(define-read-only (get-count (who principal))\n (default-to u0 (map-get? Counters who))\n)\n\n(define-public (count-up)\n (ok (map-set Counters tx-sender (+ (get-count tx-sender) u1)))\n)\n```\n\nTo start analyzing execution costs, first run the `clarinet console` command inside your project.\n\n```terminal\n$ clarinet console\n```\n\n## Get Costs\n\nThe `::get_costs <expr>` command in the Clarinet console will display the cost analysis of the given expression as well as the return value of the given expression. The `::get_costs` command expects an expression, so make a `contract-call?` with our `count-up` function and see what happens.\n\n```terminal\n$ ::get_costs (contract-call? .counter count-up)\n+----------------------+-------------+----------------+-----------------+\n| | Consumed | Limit | Percentage |\n+----------------------+-------------+----------------+-----------------+\n| Runtime | 4752 | 5000000000 | 0.00 % |\n+----------------------+-------------+----------------+-----------------+\n| Read count | 5 | 15000 | 0.03 % |\n+----------------------+-------------+----------------+-----------------+\n| Read length (bytes) | 245 | 100000000 | 0.00 % |\n+----------------------+-------------+----------------+-----------------+\n| Write count | 1 | 15000 | 0.01 % |\n+----------------------+-------------+----------------+-----------------+\n| Write length (bytes) | 41 | 15000000 | 0.00 % |\n+----------------------+-------------+----------------+-----------------+\n\n\n(ok true)\n```\n\nAs you can see from the chart, execution costs are broken into 5 different categories, each with its own limit. The limit is pertaining to what each Stacks block is limited to.\n\n<Callout title=\"Execution Cost Categories\">\nThe below lists out each of the 5 different categories of Clarity execution costs. ([source](https://book.clarity-lang.org/ch12-00-runtime-cost-analysis.html))\n\n- **Runtime** costs limits overall complexity of the code that can be executed. For example, negating a boolean value is less complex than calculating SHA512 hash, therefore (not false) will consume less runtime costs than (sha512 \"hello world\"). This category is also affected by contract size.\n- **Read count** limits how many times we can read from memory or chain state to a extract piece of information. It is affected by reading constants, variables, intermediate variables created with let, maps, but also by some functions that needs to save intermediate results during execution.\n- **Read length (bytes)** limits how much data we can read from memory or the chain. It is also affected by contract size. Calling into a contract using contract-call? Increases the read length by an amount equal to the contract size in bytes, every time. If you call into a contract with a length of 2,000 bytes twice, the read length is increased twice.\n- **Write count** limits how many times we can write data into chain. It increments when writing to variables and maps.\n- **Write length (bytes)** limits how much data we can write to the chain.\n\n</Callout>\n\nThe percentage column shows what percentage of the execution costs your expression consumed out of the block limit given.\n\n## Toggle costs\n\nYou can toggle the cost analysis to always be displayed after every expression execution in the console by toggling this feature on with the command `::toggle_costs`.\n\n```terminal\n$ ::toggle_costs\n```\n\nTo turn it off, just run the `::toggle_costs` command again.\n\nCheck out the Clarity Book section on [runtime cost analysis](https://book.clarity-lang.org/ch12-00-runtime-cost-analysis.html) to read up on cost optimization techniques and recommendations.\n\nTo see how you can run automated cost analysis on your unit tests, check out our [quickstart](/stacks/clarinet-js-sdk/quickstart#run-your-tests-with-code-coverage-and-cost-analysis) section for the Clarinet JS SDK.\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/guides/cli-commands/validate-a-contract\"\n title=\"Validate a contract\"\n description=\"Learn how to validate a contract.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<API />}\n href=\"/stacks/rpc-api/fees/estimate\"\n title=\"Get fee estimates for a transaction\"\n description=\"Learn how to fetch transaction costs.\"\n tag='API'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write tests for your smart contracts\"\n description=\"Learn how to write unit tests using the Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n</Cards>" + }, + { + "title": "Start development console", + "description": "Launch the Clarinet console for interactive development.", + "slug": "/stacks/clarinet/examples/start-a-development-console", + "content": "\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nLaunch the Clarinet console for interactive development:\n\n```terminal\n$ clarinet console\n```\n\nThis commands starts a new interactive REPL session so you can interact with your contracts." + }, + { + "title": "Run a local devnet", + "description": "Integrate your contracts with a local development environment.", + "slug": "/stacks/clarinet/examples/run-a-local-devnet", + "content": "\nLaunch a local development network with all required services:\n\n```terminal\n$ clarinet devnet start\n```\n\nRequires Docker to be running locally. See [installing Docker](/guides/install-docker) guide for more information.\n\n<Callout title=\"Common errors\" type=\"warn\">\n <p>If you are getting `error: clarinet was unable to create network`, make sure you have a container service running locally.</p>\n</Callout>" + }, + { + "title": "Deploy a contract", + "description": "Use Clarinet to publish your contracts to the devnet, testnet, or mainnet networks.", + "slug": "/stacks/clarinet/examples/deploy-a-contract", + "content": "\nGenerate a deployment plan:\n\n```terminal\n$ clarinet deployments generate --<network>\n```\nSupported networks: console`devnet`_, console`testnet`_, console`mainnet`_\n\nDeploy contracts:\n\n```terminal\n$ clarinet deployments apply --<network>\n```\n\n## Add Contract Requirements\nAdd external contract dependencies:\n\n```terminal\n$ clarinet requirements add <contract-principal>\n```\n\nExample:\n```terminal\n$ clarinet requirements add SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait\n```\n\n## Deployment Plan Transactions\n\nYour deployment plans can include various transaction types:\n\n### Contract Operations\n```yaml\n- contract-publish:\n contract-name: my-contract\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n cost: 5960\n path: contracts/my-contract.clar\n clarity-version: 2\n\n- contract-call:\n contract-id: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n method: my-function\n parameters: []\n cost: 5960\n```\n\n### Asset Transfers\n```yaml\n- stx-transfer:\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n recipient: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract\n mstx-amount: 1000\n memo: '0x01'\n cost: 10000\n\n- btc-transfer:\n expected-sender: mjSrB3wS4xab3kYqFktwBzfTdPg367ZJ2d\n recipient: bcrt1qnxknq3wqtphv7sfwy07m7e4sr6ut9yt6ed99jg\n sats-amount: 100000000\n sats-per-byte: 10\n```\n\n### Simnet Operations\n```yaml\n- emulated-contract-publish:\n contract-name: my-contract\n emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n path: contracts/my-contract.clar\n clarity-version: 2\n\n- emulated-contract-call:\n contract-id: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract\n emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n method: my-function\n parameters: []\n```\n\n<Callout title=\"Note\">\nFor functions that take no arguments or read-only functions, use an empty parameters list: `parameters: []`\n</Callout>" + }, + { + "title": "Debug a contract", + "description": "Step through and debug your contracts inside the command line.", + "slug": "/stacks/clarinet/examples/debug-a-contract", + "content": "\nimport { Clarinet, Js } from '@/components/ui/icon';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nInside the console, you can use these debugging commands:\n\n```terminal\n$ ::trace (contract-call? .my-contract my-function)\n$ ::debug (contract-call? .my-contract my-function)\n$ break my-function\n```\n\nDebug navigation commands:\n- _console`step`_ or _console`s`_ - Step into\n- _console`finish`_ or _console`f`_ - Step out\n- _console`next`_ or _console`n`_ - Step over\n- _console`continue`_ or _console`c`_ - Continue execution\n\nLet's take the clarity_`counter`_ contract as an example:\n\n```clarity\n(define-map Counters principal uint)\n\n(define-read-only (get-count (who principal))\n (default-to u0 (map-get? Counters who))\n)\n\n(define-public (count-up)\n (ok (map-set Counters tx-sender (+ (get-count tx-sender) u1)))\n)\n```\n\n### Trace\n\nThe _console`::trace`_ command expects an expression, so make a _clarity`contract-call?`_ with our _clarity`count-up`_ function and see what happens.\n\n```terminal\n$ ::trace (contract-call? .counter count-up)\n(contract-call? .counter count-up) \u001b[30m<console>\u001b[0m\n( get-count tx-sender ) \u001b[30mcounter:4:38\u001b[0m\n \u001b[31m↳ args:\u001b[0m \u001b[1mST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\u001b[0m\n \u001b[34mu0\u001b[0m\n\u001b[34m(ok true)\u001b[0m\n```\n\n### Breakpoints\n\nYou can also set a breakpoint at a specific line to better understand what's happening in your contract.\n\nWith `::debug`, you can add breakpoints at a specific line of a contract or function to better understand what's happening in your contracts.\n\n```clarity\n(define-map Counters principal uint)\n\n(define-read-only (get-count (who principal))\n (default-to u0 (map-get? Counters who))\n)\n\n(define-public (count-up)\n (ok (map-set Counters tx-sender (+ (get-count tx-sender) u1)))\n)\n\n;; !mark(1:3)\n(define-public (count-twice)\n (double)\n)\n\n;; !mark(1:6)\n(define-private (double)\n (begin\n (unwrap-panic (count-up))\n (count-up)\n )\n)\n```\n\n```terminal\n$ ::debug (contract-call? .counter count-twice)\n$ break count-up\n```\n\n\n<Callout title=\"Breakpoint Commands\">\nTo step through these breakpoints, you can use one of the following commands:\n\n- **Step-in (`step` or `s`)**: Step into the sub-expressions.\n- **Step-out (`finish` or `f`)**: Complete execution of the current expression and return the result to the parent.\n- **Step-over (`next` or `n`)**: Continue to completion of the current expression, stepping over sub-expressions.\n- **Continue (`continue` or `c`)**: Continue execution until hitting a breakpoint or completing execution.\n</Callout>\n\nUsing the _console`continue`_ command, the breakpoint you set in the _clarity`double`_ function will trigger twice due to two _clarity`count-up`_ calls, which enables you to do variable and map analysis.\n\n## Next steps\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/guides/cli-commands/validate-a-contract\"\n title=\"Validate a contract\"\n description=\"Learn how to validate a contract.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/clarinet/guides/estimate-costs\"\n title=\"Estimate costs for a contract\"\n description=\"Learn how to estimate costs for a contract.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write tests for your smart contracts\"\n description=\"Learn how to write unit tests using the Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n</Cards>" + }, + { + "title": "Create deployment plans", + "description": "Learn how to create deployment plans.", + "slug": "/stacks/clarinet/examples/create-deployment-plans", + "content": "\nimport { Clarinet, Js } from '@/components/ui/icon';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\n\nDeployment plans minimize the inherent complexity of deployments, such as smart contract dependencies and interactions, transaction chaining limits, deployment costs, and more. Deployment plans ensure reproducible deployments, a critical workflow for testing purposes.\n\nIn this guide, you will learn how to:\n\n1. [Generate and configure a deployment plan.](#generate-a-deployment-plan)\n2. [Set deployment plan specifications.](#deployment-plan-specifications)\n3. [Add project contract requirements.](#adding-project-contract-requirements)\n4. [Customize your deployment plan.](#edit-your-deployment-plan)\n\n---\n\n## Generate a deployment plan\n\nClarinet uses a deployment plan for every deployment—whether for a basic `simnet`, `devnet` (for use with the `clarinet devnet start` command), or the public `testnet` and `mainnet`.\n\nYou can view the current deployment plan saved to disk at any time with the following command (specifying the network `simnet`, `devnet`, `testnet`, `mainnet`)\n\n```terminal\n$ clarinet deployments generate --<network>\n```\n\nUpon this command, your project's default deployment plan, a `.yaml` file (for example, `default.devnet-plan.yaml`), is generated from your project specifications and contracts. Here, for example, is the deployment plan for [the counter smart contract](/stacks/clarinet/quickstart) used in our quickstart guide:\n\n```yaml deployments/default.devnet-plan.yaml\n---\nid: 0\nname: Devnet deployment\nnetwork: devnet\nstacks-node: \"http://localhost:20443\"\nbitcoin-node: \"http://devnet:devnet@localhost:18443\"\nplan:\n batches:\n - id: 0\n transactions:\n - contract-publish:\n contract-name: counter\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n cost: 6940\n path: contracts/counter.clar\n anchor-block-only: true\n clarity-version: 2\n epoch: \"2.5\"\n```\n\n## Deployment plan specifications\n\nA project's deployment plan specifications are set on two files within a Clarinet project—the `Clarinet.toml` file as well as the network’s corresponding `.toml` file (for example, `Devnet.toml`) in the `settings/` folder.\n\nSpecifications in the `Clarinet.toml` file you can change include:\n\n- The Clarity version or blockchain epoch that Clarinet emulates for your smart contracts\n- Project requirements in the form of contract dependencies (see next section)\n\nSpecifications in the `Devnet.toml` file you can change include:\n\n- Accounts, balances, and names\n- Blockchain environment features of your devnet, such as block time or API ports\n- Stacking orders\n- Specifying derivation path of a given account:\n\n```toml settings/devnet.toml\n[accounts.deployer]\nmnemonic = \"<YOUR PRIVATE TESTNET MNEMONIC HERE>\"\nbalance = 100_000_000_000_000\nderivation = \"m/44'/5757'/0'/0/2\"\n```\n\n## Adding project contract requirements\n\nYour project can reference a smart contract that already exists on the blockchain.\n\nFor example, [Stacks Improvement Proposal 009](https://github.com/stacksgov/sips/blob/main/sips/sip-010/sip-010-fungible-token-standard.md) specifies a trait reference for all non-fungible tokens. Instead of redeploying this trait as a separate contract each time a new NFT collection is published, you can reference the contract directly within deployment plans with the following Clarinet command, including the contract principal reference:\n\n```terminal\n$ clarinet requirements add SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait\n```\n\nThis command updates a Clarinet project's deployment plan for use in development.\n\nFor instance, `clarinet devnet start` would now download a copy of the contract principal via the Stacks API node that is booted alongside each devnet deployment, and it would remap the principal that publishes this contract to one of the accounts specified in your `Devnet.toml` file.\n\nThis permits a developer to maintain the minimum set of contracts their Clarinet project will deploy to mainnet (with a single use of an `impl-trait` statement in their Clarity contract).\n\n## Edit your deployment plan\n\nRecall that a default deployment plan is used for every deployment, comprising your projects specifications as set in your `Clarinet.toml` and `<network>.toml` files.\n\nThe default plan is generated upon each `clarinet deployments generate --<network>` shell command to your `deployments/` folder.\n\nHowever, you can also manually edit this default deployment `.yaml` file directly—programmatically orchestrating your contract publication and user interaction beyond your plan's defaults.\n\n<Callout title=\"Note\">\nWhen deploying, Clarinet prompts you to overwrite any manually added or edited changes that differ from the specifications laid out in your project's .toml files. Type `no` to proceed with your manually configured deployment plan instead of the default.\n</Callout>\n\nHere are some of the relevant transactions and configurations available to developers manually configuring their deployment plans:\n\n[`emulated-contract-publish:`](#emulated-contract-publish) Deploy a contract in an in-memory simulated chain.\n\n[`emulated-contract-call:`](#emulated-contract-call) Call a contract that has been deployed in an in-memory simulated chain.\n\n[`requirement-publish:`](#requirement-publish) <TooltipProvider inline><Tooltip><TooltipTrigger asChild><span className='cursor-default border-b border-dotted border-primary'>Deploy an external contract</span></TooltipTrigger><TooltipContent>One that is not published by the same set of private keys as the user wallet currently deploying.</TooltipContent></Tooltip></TooltipProvider> on another `testnet`/`devnet` using another wallet.\n\n[`contract-publish:`](#contract-publish) Deploy a contract.\n\n[`contract-call:`](#contract-call) Call a contract.\n\n[`stx-transfer:`](#stx-transfer) Transfer STX between specified accounts.\n\n[`btc-transfer:`](#btc-transfer) Simple bitcoin transfer from a p2pkh address to a p2pkh address (experimental, `regtest`/`testnet`/`mainnet`).\n\n### emulated-contract-publish\n\nThis default transaction is included in every generated deployment for a `simnet` deployment.\n\n```yaml\n- emulated-contract-publish:\n contract-name: extension-trait\n emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n path: contracts/dao/traits/extension-trait.clar\n clarity-version: 1\n```\n\n### emulated-contract-call\n\nThis is a transaction type for a `simnet` deployment where the developer wants to emulate a contract call.\n\n```yaml\n- emulated-contract-call:\n contract-id: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.counter\n emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n method: increment\n parameters:\n - u1\n```\n\n<Callout title=\"Note\">\nRead-only functions and functions that take no arguments are passed an empty list like so: `parameters: []`\n</Callout>\n\n### requirement-publish\n\nThis cBTC smart contract application has a [devnet deployment plan](https://github.com/hirosystems/clarinet/blob/develop/components/clarinet-cli/examples/cbtc/deployments/default.devnet-plan.yaml) that publishes the contract required by its core smart contract.\n\n```yaml\n- requirement-publish:\n contract-id: SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard\n remap-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n remap-principals:\n SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n cost: 8400\n path: '.cache/requirements/SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.clar'\n```\n\n### contract-publish\n\nThis default transaction is included in every generated deployment plan for every contract your Clarinet project has. This `counter` application has a [devnet deployment plan](https://github.com/hirosystems/clarinet/blob/develop/components/clarinet-cli/examples/counter/deployments/default.devnet-plan.yaml) that publishes its core smart contract.\n\n```yaml\n- contract-publish:\n contract-name: counter\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n cost: 5960\n path: contracts/counter.clar\n anchor-block-only: true\n clarity-version: 1\n```\n\n### contract-call\n\nThe developer can call a function and pass arguments of any valid Clarity type.\n\n```yaml\n- contract-call:\n contract-id: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.bitcoin-dao\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n method: add-new-member\n parameters:\n - u1\n - \"0x01\"\n - \"{ id: u4, username: \"Satoshi\", address: 'SP1HTBVD3JG9C05J7HBJTHGR0GGW7KXW28M5JS8QE }\"\n - \"'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\n cost: 5960\n```\n\n<Callout title=\"Note\">\nRead-only functions and functions that take no arguments are passed an empty list like so: `parameters: []`\n</Callout>\n\n### stx-transfer\n\nThe developer can specify the originating account of an STX transfer, the quantity denominated in microstacks, and the recipient, as well as an optional memo field (Note: the memo field can only contain a Clarity [buffer type](https://book.clarity-lang.org/ch02-02-sequence-types.html) up to 34 bytes in size, pre-fixed with `0x` (for example, `0x68656c6c6f21`), not ASCII text or strings)\n\n```yaml\n- stx-transfer:\n expected-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n recipient: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.my-contract\n mstx-amount: 1000\n memo: '0x01'\n cost: 10000\n```\n\n### btc-transfer\n\nThis cBTC smart contract application has a [devnet deployment plan](https://github.com/hirosystems/clarinet/blob/develop/components/clarinet-cli/examples/cbtc/deployments/wrap-btc.devnet-plan.yaml) that includes broadcasting a BTC transfer transaction to the emulated bitcoin chain with these parameters.\n\n```yaml\n- btc-transfer:\n expected-sender: mjSrB3wS4xab3kYqFktwBzfTdPg367ZJ2d\n recipient: bcrt1qnxknq3wqtphv7sfwy07m7e4sr6ut9yt6ed99jg\n sats-amount: 100000000\n sats-per-byte: 10\n```\n\n---\n\n## Next steps\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/guides/cli-commands/run-a-local-devnet\"\n title=\"Run a local devnet\"\n description=\"Learn how to run a local devnet.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"Simnet reference\"\n description=\"Learn how to use simnet with the Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n</Cards>" + }, + { + "title": "Working with sBTC", + "description": "Clarinet helps with building, testing, and deploying contracts that use sBTC.", + "slug": "/stacks/clarinet/examples/working-with-sbtc", + "content": "\nTo take advantage of these features, make sure to use Clarinet 2.15.0 or later.\n\n## About sBTC\n\nsBTC is a fungible token on the Stacks blockchain. It follows the\n[SIP-010 standard](https://github.com/stacksgov/sips/blob/main/sips/sip-010/sip-010-fungible-token-standard.md)\nfor fungible tokens.\n\nEven though it's *just* a fungible token, Clarinet has some helpers to make it easier to work with.\n\n## Using sBTC in your contract\n\nTo use sBTC in your contract, you need to add the `sbtc-deposit` smart contract to your requirements.\n\nIn a Clarinet project, run the following command:\n\n```terminal\n$ clarinet requirements add SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-deposit\n```\n\nThis will add the [`sbtc-deposit`](https://explorer.hiro.so/txid/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-deposit)\nsmart contract to your project, along with it's dependencies:\n- [`sbtc-token`](https://explorer.hiro.so/txid/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token)\n- [`sbtc-registry`](https://explorer.hiro.so/txid/SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-registry)\n\nWhen Clarinet detects the `sbtc-deposit` contract, it will automatically fund your test wallets with \nsBTC that you can use to test your contract in Clarinet simnet and devnet.\n\n## Using sBTC in your contract\n\nAs a SIP-010 token, sBTC let you call the `transfer` function to transfer tokens from one address to another.\n\nLet's say we have an NFT contract that allows users to mint an NFT by spending sBTC. \n\n\n```clarity\n;; this code is for demo purposes\n;; it doesn't implement SIP-009 NFT standard\n(define-non-fungible-token nft-name uint)\n\n;; mint for 100 sats\n(define-data-var sats-sbtc-mint-price uint u100)\n(define-data-var next-id uint u0)\n\n(define-public (mint-one-with-sbtc)\n (begin\n ;; call the sbtc-token contract to transfer the sbtcs\n (try! (contract-call? 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token transfer\n (var-get sats-sbtc-mint-price)\n tx-sender\n (as-contract tx-sender)\n none\n ))\n\n (try! (nft-mint? nft-name (var-get next-id) tx-sender))\n\n (ok (var-set next-id (+ (var-get next-id) u1)))\n )\n)\n```\n\nBecause Clarinet already took care of funding the test wallets with sBTC, you can call the\n`mint-one-with-sbtc` function with one of your test wallets.\n\nIn simnet (unit tests or `clarinet console`), the deployer address of the contract will remain\n`SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4`, but in devnet, like every other requirements, the contract will\nbe deployed by the default deployer address. You don't have to worry about this—Clarinet always make\nsure that your contracts call the right address.\n\n## Deploying your contract on testnet\n\nOn testnet, the official Hiro sBTC contract is\n[ST1F7QA2MDF17S807EPA36TSS8AMEFY4KA9TVGWXT.sbtc-token](https://explorer.hiro.so/txid/ST1F7QA2MDF17S807EPA36TSS8AMEFY4KA9TVGWXT.sbtc-token?chain=testnet).\nThis is the contract that is linked to the sBTC faucet: `ST1F7QA2MDF17S807EPA36TSS8AMEFY4KA9TVGWXT.sbtc-deposit`.\n\nAgain, Clarinet will make sure that your contracts call this address when being deployed on mainnet.\nYou can see the address of the sbtc-contract being re-mapped in the testnet deployment plan.\n\n## Deploying your contract on mainnet\n\nOn mainnet, your contract will remain unchanged and call the one and only sBTC contract.\n" + }, + { + "title": "Create a new project", + "description": "Once you install Clarinet, you can use Clarinet to create a new project.", + "slug": "/stacks/clarinet/examples/create-a-new-project", + "content": "\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nCreate a new Clarinet project with the basic directory structure and configuration files:\n\n```terminal\n$ clarinet new my-project\n\u001b[32mCreate directory\u001b[0m \u001b[1mmy-project\u001b[0m\n\u001b[32mCreate directory\u001b[0m \u001b[1mcontracts\u001b[0m\n\u001b[32mCreate directory\u001b[0m \u001b[1msettings\u001b[0m\n\u001b[32mCreate directory\u001b[0m \u001b[1mtests\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1mClarinet.toml\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1msettings/Mainnet.toml\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1msettings/Testnet.toml\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1msettings/Devnet.toml\u001b[0m\n\u001b[32mCreate directory\u001b[0m \u001b[1m.vscode\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1m.vscode/settings.json\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1m.vscode/tasks.json\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1m.gitignore\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1m.gitattributes\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1mpackage.json\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1mtsconfig.json\u001b[0m\n\u001b[32mCreate file\u001b[0m \u001b[1mvitest.config.js\u001b[0m\n```\nThis will create a project directory with the following directory layout:\n\n<Files className='pointer-events-none'>\n <Folder name=\"contracts\" />\n <Folder name=\"settings\" defaultOpen>\n <File name=\"Devnet.toml\" />\n <File name=\"Mainnet.toml\" />\n <File name=\"Testnet.toml\" />\n </Folder>\n <Folder name=\"tests\" />\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n</Files>\n\nThe _txt`Clarinet.toml`_ file contains configuration for the smart contracts in your project. When you create contracts in your project, Clarinet will automatically add them to this file.\n\nThe _txt`settings/Devnet.toml`_ file contains configuration for accounts in the Clarinet console, including the seed phrases and initial balances for a set of out-of-the-box wallets that you can use for testing in the devnet environment." + }, + { + "title": "Quickstart", + "description": "Learn how to create a simple counter contract using Clarinet.", + "slug": "/stacks/clarinet/quickstart", + "content": "\nimport { Clarinet, Js } from '@/components/ui/icon';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\n\nIn this quickstart guide, you will write a simple counter contract with Clarity. Throughout this tutorial, you'll learn how to generate a new project, create a smart contract, and validate your smart contract code using the Clarinet CLI.\n\nCheck out the [create a new project](/stacks/clarinet/guides/create-a-new-project) and [validate a contract](/stacks/clarinet/guides/validate-a-contract) guides for a deeper look.\n\n---\n\n<Steps>\n <Step>\n ## Generate your counter project\n \n Start by creating a new Clarinet project. This command will create a new directory named _console`counter`_ and set up a basic Clarinet project inside it.\n\n ```terminal\n $ clarinet new counter\n \u001b[32mCreate directory\u001b[0m \u001b[1mcounter\u001b[0m\n \u001b[32mCreate directory\u001b[0m \u001b[1mcontracts\u001b[0m\n \u001b[32mCreate directory\u001b[0m \u001b[1msettings\u001b[0m\n \u001b[32mCreate directory\u001b[0m \u001b[1mtests\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1mClarinet.toml\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1msettings/Mainnet.toml\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1msettings/Testnet.toml\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1msettings/Devnet.toml\u001b[0m\n \u001b[32mCreate directory\u001b[0m \u001b[1m.vscode\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1m.vscode/settings.json\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1m.vscode/tasks.json\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1m.gitignore\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1m.gitattributes\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1mpackage.json\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1mtsconfig.json\u001b[0m\n \u001b[32mCreate file\u001b[0m \u001b[1mvitest.config.js\u001b[0m\n ```\n\n <Files className=\"pointer-events-none\">\n <Folder name=\"contracts\" />\n <Folder name=\"settings\" defaultOpen>\n <File name=\"Devnet.toml\" />\n <File name=\"Mainnet.toml\" />\n <File name=\"Testnet.toml\" />\n </Folder>\n <Folder name=\"tests\" />\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n </Files>\n </Step>\n <Step>\n ## Create a counter contract\n \n Inside your project directory, run _console`clarinet contract new counter`_ to create your contract. This will generate and update the proper files for writing and testing your code.\n\n ```terminal\n $ cd counter\n $ clarinet contract new counter\n \u001b[32mCreated file\u001b[0m \u001b[1mcontracts/counter.clar\u001b[0m\n \u001b[32mCreated file\u001b[0m \u001b[1mtests/counter.test.ts\u001b[0m\n \u001b[33mUpdated Clarinet.toml\u001b[0m \u001b[1mwith contract counter\u001b[0m\n ```\n\n ```toml Clarinet.toml\n [contracts.counter]\n path = 'contracts/counter.clar'\n clarity_version = 2\n epoch = 2.5\n ```\n </Step>\n <Step>\n ## Variables and functions\n \n Inside your _txt`contracts/counter.clar`_ file:\n\n 1. Define a map called _clarity`Counters`_ to store the count associated with each user.\n 2. Define a public function called _clarity`count-up`_ that increments the count of the user who calls it.\n 3. Add a read-only function called _clarity`get-count`_ that returns the count of the user who calls it.\n\n ```clarity counter.clar -c\n (define-map Counters principal uint)\n\n (define-public (count-up)\n (ok (map-set Counters tx-sender (+ (get-count tx-sender) u1)))\n )\n\n (define-read-only (get-count (who principal))\n (default-to u0 (map-get? Counters who))\n )\n ```\n </Step>\n <Step>\n ## Validate your contract\n \n Now it's time to validate your contract. This command will check your contract for errors and typos.\n\n ```terminal\n $ clarinet check\n \u001b[32m✔\u001b[0m \u001b[1m1 contract checked\u001b[0m\n ```\n\n Once your contract is validated, you can interact with it locally with the _console`clarinet console`_ inside your project directory.\n\n ```terminal\n $ clarinet console\n ```\n\n Here are some example interactions you can perform with your contract:\n\n 1. Call the _clarity`count-up`_ function on your contract to increment the count.\n 2. Verify the count of the user has been incremented by calling the _clarity`get-count`_ function with the _clarity`tx-sender`_ as the argument.\n \n ```terminal\n $ (contract-call? .counter count-up)\n \u001b[32m(ok true)\u001b[0m\n $ (contract-call? .counter get-count tx-sender)\n \u001b[32mu1\u001b[0m\n ```\n </Step>\n</Steps>\n\n## Next steps\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/guides/add-a-contract\"\n title=\"Add a contract to your project\"\n description=\"Learn how to add a contract to your project.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/guides/run-a-local-devnet\"\n title=\"Run a local devnet\"\n description=\"Learn how to set up and run a local development network for your project.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write tests for your smart contracts\"\n description=\"Learn how to write unit tests using the Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n</Cards>" + }, + { + "title": "Overview", + "description": "Leverage programmatic API access in order to seamlessly interact with devnet and manage chainhooks.", + "slug": "/stacks/platform-api/index", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nThe Platform API unlocks powerful automation opportunities in your application code, development and CI scripts, and more, via a familiar REST interface.\n\nIn particular, this API lets you programmatically create, update, query, and delete chainhooks as well as interact with a platform-hosted devnet from your local machine.\n\nWhen you create a Platform account, you'll automatically receive an API key that's required to use these endpoints. You can also create additional API keys in the [Hiro Platform](/stacks/api-keys) as needed.\n\n## Popular endpoints\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/platform-api/devnet/stacks-blockchain-api\"\n title=\"Query devnet API endpoints\"\n description=\"Query Stacks API endpoints for data related to your devnet.\"\n />\n <SecondaryCard\n href=\"/stacks/platform-api/devnet/start\"\n title=\"Start a devnet service\"\n description=\"Start a hosted devnet through the Platform API.\"\n />\n <SecondaryCard\n href=\"/stacks/platform-api/chainhooks/create\"\n title=\"Create a chainhook\"\n description=\"Create a chainhook through the Platform API.\"\n />\n</Cards>\n\n\n## Related tools\n\n- **[Hiro Platform](/stacks/platform)**: A developer platform for building, deploying and scaling Bitcoin apps.\n- **[Chainhook](/stacks/chainhook)**: You don't need the platform to create event streams. Leverage chainhook independently, so your app can react to on-chain events in real time.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch on-chain data from the Stacks blockchain.\n- **[Token Metadata API](/stacks/token-metadata-api)**: Fetch fungible and non-fungible token data on the Stacks blockchain.\n\n<br />\n\n<Callout title=\"Need help building with the Platform API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#hiro-platform</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n\n" + }, + { + "title": "Bitcoin node", + "description": "Proxy for the Bitcoin node on a development network (devnet).", + "slug": "/stacks/platform-api/devnet/bitcoin-node", + "content": "\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/bitcoin-node/{*}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Devnet", + "description": "Retrieves information about the Platform Devnet services such as Stacks Blockchain API, Bitcoin node, and more.", + "slug": "/stacks/platform-api/devnet/index", + "content": "" + }, + { + "title": "Stop devnet", + "description": "Stop a development network (devnet).", + "slug": "/stacks/platform-api/devnet/stop", + "content": "\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/devnet', method: 'delete' }]}\n hasHead={false}\n/>" + }, + { + "title": "Start devnet", + "description": "Start a development network (devnet).", + "slug": "/stacks/platform-api/devnet/start", + "content": "\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/devnet/{projectName}', method: 'put' }]}\n hasHead={false}\n/>" + }, + { + "title": "Stacks Blockchain API", + "description": "Proxy for the Stacks Blockchain API on a development network (devnet).", + "slug": "/stacks/platform-api/devnet/stacks-blockchain-api", + "content": "\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/stacks-blockchain-api/{*}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get all chainhooks", + "description": "Get all of your chainhooks through the Hiro Platform.", + "slug": "/stacks/platform-api/chainhooks/list", + "content": "\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Create a chainhook", + "description": "Create a chainhook through the Hiro Platform.", + "slug": "/stacks/platform-api/chainhooks/create", + "content": "\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks', method: 'post' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get a specific chainhook", + "description": "Get a specific chainhook through the Hiro Platform.", + "slug": "/stacks/platform-api/chainhooks/get", + "content": "\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks/{chainhookUuid}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Chainhooks", + "description": "Retrieves information about the Platform Chainhooks API.", + "slug": "/stacks/platform-api/chainhooks/index", + "content": "" + }, + { + "title": "Update a chainhook", + "description": "Update a chainhook through the Hiro Platform.", + "slug": "/stacks/platform-api/chainhooks/update", + "content": "\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks/{chainhookUuid}', method: 'put' }]}\n hasHead={false}\n/>" + }, + { + "title": "Delete a chainhook", + "description": "Delete a chainhook through the Hiro Platform.", + "slug": "/stacks/platform-api/chainhooks/delete", + "content": "\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks/{chainhookUuid}', method: 'delete' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get a chainhook status", + "description": "Retrieve the status of a specific chainhook through the Hiro Platform.", + "slug": "/stacks/platform-api/chainhooks/status", + "content": "\n<APIPage\n document=\"./openapi/platform-api.json\"\n operations={[{ path: '/v1/ext/{apiKey}/chainhooks/{chainhookUuid}/status', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Home", + "description": "", + "slug": "/stacks/index", + "content": "\nimport { Card as MainCard, SmallCard } from '@/components/card';\nimport { ImageZoom } from 'fumadocs-ui/components/image-zoom';\nimport { PageFooter } from '@/components/footer';\nimport { MessageCircle, Braces, ChevronRight, Code, Database, Play, Rocket, Star, Terminal, Wallet } from 'lucide-react';\nimport { API, Backend, BugIcon, Clarinet, Cloud, Chainhook, Frontend, Hiro, Js, Newspaper, Pulse, QuestionIcon } from '@/components/ui/icon';\nimport heroImage from '@/public/stacks-hero.svg';\n\n<div className='flex flex-col space-y-10 pt-0'>\n\n<div className='flex space-x-6 items-end'>\n <ImageZoom\n alt=\"banner\"\n src={heroImage}\n className=\"mt-0 mb-6 first-line:rounded-xl bg-background\"\n priority\n />\n\n <div className='flex flex-col [&_h2]:mt-0 [&_h2]:mb-2 [&_p]:mb-6'>\n\n ## Build with Stacks\n\n Find all the guides and resources you need to build on Stacks.\n\n </div>\n</div>\n\n<Cards>\n <MainCard\n className='group space-y-1'\n icon={<Play className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/stacks/get-started\"\n title=\"Get Started\"\n description=\"Get started with our end-to-end tutorials and quickstart guides across all Hiro tools.\"\n />\n <MainCard\n className='group space-y-1'\n icon={<API className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/stacks/api\"\n title=\"Stacks API Reference\"\n description=\"Explore API endpoints for interacting with the Stacks Blockchain.\"\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"explore-by-category\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#explore-by-category\" className=\"not-prose group text-sm uppercase\">Explore by category</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Cloud />}\n href=\"/stacks/platform\"\n title=\"Quickstart App Templates\"\n description=\"Full-stack starter-kits, including front-end, back-end, and smart contract components.\"\n />\n <SmallCard\n icon={<Code />}\n href=\"/stacks/clarinet\"\n title=\"Smart Contract Development\"\n description=\"Kickstart your smart contract journey with Clarinet and the Clarinet JS SDK.\"\n />\n <SmallCard\n icon={<Database />}\n href=\"/stacks/chainhook\"\n title=\"Data Streaming & Events\"\n description=\"Create custom event streams for real-time data with Chainhook.\"\n />\n <SmallCard\n icon={<Frontend />}\n href=\"/stacks/stacks.js\"\n title=\"Frontend Web Development\"\n description=\"Interact with smart contracts on the web with the Stacks.js library.\"\n />\n <SmallCard\n icon={<Backend />}\n href=\"/stacks/api\"\n title=\"Backend Development\"\n description=\"Explore our hosted APIs offering a familiar REST interface.\"\n />\n <SmallCard\n icon={<Braces />}\n href=\"/stacks/token-metadata-api\"\n title=\"Token Management\"\n description=\"Explore our hosted API for fetching token metadata on Stacks.\"\n />\n</Cards>\n\n</div>\n\n\n<div className='flex flex-col'>\n\n<h4 id=\"explore-by-tool\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#explore-by-tool\" className=\"not-prose group text-sm uppercase\">Explore by tool</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Hiro />}\n href=\"/stacks/platform\"\n title=\"Hiro Platform\"\n description=\"A developer platform for building, deploying and scaling Bitcoin apps.\"\n />\n <SmallCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet\"\n title=\"Clarinet\"\n description=\"Create, test, and deploy smart contracts on the Stacks blockchain.\"\n />\n <SmallCard\n icon={<API />}\n href=\"/stacks/api\"\n title=\"Stacks Blockchain API\"\n description=\"Interact with the Stacks blockchain from your backend via our hosted API.\"\n />\n <SmallCard\n icon={<Js />}\n href=\"/stacks/stacks.js\"\n title=\"Stacks.js\"\n description=\"A collection of JavaScript libraries to build web applications on Stacks.\"\n />\n <SmallCard\n icon={<Chainhook />}\n href=\"/stacks/chainhook\"\n title=\"Chainhook\"\n description=\"Create customizable, lightweight databases for on-chain events for Bitcoin and Stacks.\"\n />\n</Cards>\n\n</div>\n\n</div>\n\n<PageFooter />" + }, + { + "title": "Overview", + "description": "A developer platform for building, deploying, and scaling Bitcoin apps.", + "slug": "/stacks/platform/index", + "content": "\nimport Link from \"next/link\";\nimport { Button } from \"@/components/ui/button\"\n\nThe Hiro Platform is your all-in-one solution for building and scaling Bitcoin applications. It provides essential tools including API key management, customizable data streams, production-ready app templates, dedicated testing environments, and onchain monitoring and analytics - everything developers need to bring their Bitcoin apps to life.\n\n<Button className=\"bg-orange-500 hover:bg-orange-600\">\n <Link\n target=\"_blank\"\n href=\"https://platform.hiro.so/\"\n className=\"no-underline\"\n >\n Get started on the platform\n </Link>\n</Button>\n\n![Projects](./images/o1.png)\n\n## Guides\n\n<Cards>\n\n<Card\n href=\"/stacks/platform/guides/create-chainhooks\"\n title=\"Create event streams with Chainhook\"\n description=\"Create and manage webhook-like triggers that react to on-chain events in real time.\"\n/>\n\n{\" \"}\n\n<Card\n href=\"/stacks/platform/guides/deploy-contracts\"\n title=\"Deploy your contracts\"\n description=\"Deploy your project with customizable deployment plans that can handle contract dependencies.\"\n/>\n\n<Card \n href=\"/stacks/platform/guides/devnet\"\n title=\"Iterate quickly with devnet\"\n description=\"Leverage devnet, a private instance of the blockchain, for rapid feedback loops and a better debugging experience.\"\n/>\n\n<Card \n href=\"/stacks/platform/guides/contract-monitoring\"\n title=\"Monitor your contract activity\"\n description=\"Set up monitoring for your smart contracts with customizable alerts to track on-chain activity after deployment.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build and deploy smart contracts locally on your device with Clarinet.\n- **[Chainhook](/stacks/chainhook)**: You don’t need the platform to create event streams. Leverage chainhook independently, so your app can react to on-chain events in real time.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel. Build faster with a JS library that handles basic functions.\n\n<br />\n\n<Callout title=\"Need help building with the Hiro Platform?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#hiro-platform</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n" + }, + { + "title": "Deploy contracts", + "description": "Learn how to deploy contracts in the Hiro Platform.", + "slug": "/stacks/platform/examples/deploy-contracts", + "content": "\n## Prerequisites\n\n- Follow the [create project](/stacks/platform/guides/create-project) guide to create or import a project.\n- Make sure you have installed and connected a Stacks wallet to deploy your contracts.\n\n## Use the deploy button\n\nOnce your project is setup, you can deploy the contracts to testnet or mainnet using the \"Deploy\" button on the Hiro Platform.\n\n![deploy contracts](../images/deploy-contracts/d1.png)\n\nThe following are the steps to deploy your contracts using the deploy button.\n\n1. On the projects page, select the project you want to deploy contracts from.\n2. Use the \"Deploy Contracts\" button available at the top right of the page.\n3. Choose the network you want to deploy to. Note: for devnet, [reference this guide](/stacks/platform/guides/devnet). The steps below are specific to testnet and mainnet.\n4. Once you choose a network, you will see a button to generate a deployment plan.\n5. Once the deployment plan is generated, you will see the list of contracts to be deployed - you can now connect your wallet and click \"Deploy\" to deploy your contracts.\n\n![deploy contracts](../images/deploy-contracts/d2.png)\n\nIf you find issues with your deployment process, you can reach out to us on the [#hiro-platform channel](https://stacks.chat) on Discord under the Hiro Developer Tools section or file an issue [here](https://hiro-pbc.canny.io/hiro-platform).\n" + }, + { + "title": "Create a project", + "description": "Learn how to create or import a project in the Hiro Platform.", + "slug": "/stacks/platform/examples/create-project", + "content": "\nimport { Code, Terminal } from \"lucide-react\"\nimport { SmallCard } from \"@/components/card\"\n\nimport { Callout } from \"@/components/callout\"\nimport { Card, Cards } from \"@/components/card\"\n\nThe Hiro Platform offers multiple ways to create projects, whether you're starting from scratch with a template or importing an existing repository. This guide will walk you through both approaches.\n\n## Using templates\n\nFrom the main projects page, click the \"Add a project\" button to begin creating a new project.\n\n![template selection](../images/create-project/c2.png)\n\nThe Platform provides 2 types of pre-built templates to help you get started quickly:\n\n1. App templates\n2. Contract-only templates\n\n**App templates** are feature rich templates pre-configured with a frontend and smart contracts.\n\n**Contract-only templates** are pre-configured with just that: a smart contract to help you start building.\n\nSimply select the template you want to get started with to open up a more detailed view of the app.\n\n![template selection](../images/create-project/c1.png)\n\nOnce you are ready, click the \"Clone\" button to copy the template to your GitHub account. From there, you will see instructions on how to clone the repository locally to start development.\n\n## Importing existing projects\n\nIf you have an existing project on GitHub, you can import it directly into the Hiro Platform:\n\n1. If you haven't already, authorize your GitHub account with the Hiro Platform\n2. You'll see a list of your repositories that can be imported\n3. Select the repository you want by clicking the \"Import\" button\n\n![import from github](../images/create-project/c3.png)\n\n<Callout type=\"info\">\nThe Platform requires specific Clarinet-generated files and a directory structure to import projects successfully. Your project should include:\n\n- `.clar` files containing your smart contracts\n- A `Clarinet.toml` configuration file\n- A specific directory structure with contracts in a `contracts` folder\n</Callout>\n\nOnce your project is ready, you will see instructions on next steps to get started.\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/platform/guides/deploy-contracts\"\n title=\"Deploy contracts\"\n description=\"Learn how to deploy your contracts to testnet and mainnet in the Hiro Platform.\"\n />\n <Card\n href=\"/stacks/platform/guides/devnet\"\n title=\"Running Devnet\"\n description=\"Learn how to use devnet to test your smart contracts in a local environment.\"\n />\n</Cards>\n" + }, + { + "title": "Archive a project", + "description": "Discover how to archive your projects in the Hiro Platform.", + "slug": "/stacks/platform/examples/archive-project", + "content": "\n## Archive a project\n\nSometimes, you may find it necessary to archive a project from your project list. It is important to understand that archiving a project is not the same as deleting a project. Archiving a project means you wish to move the project status from an active project to one that is not active and visible in your project list.\n\nFollow the steps below to archive a project:\n\n1. Sign in to the [Hiro Platform](https://platform.hiro.so/).\n2. Once you are authenticated, you will be redirected to the project page.\n3. From your list of projects, find the project you wish to archive.\n4. Click on the far-right three dots and select \"Archive.\" This will remove the project from the project list and place it into an archive folder.\n\n![Archive project](../images/archive-project/archive.png)\n\n## Unarchive a project\n\nFollow the steps below to unarchive a project:\n\n1. From the projects page in the Hiro Platform, select the \"Archive\" button at the top right. and select the far-right three dots and select \"Unarchive.\"\n2. You will now see a list of archived projects. Select three-dots on the far right and click \"Unarchive\" for any project you want to unarchive.\n3. You will now see any unarchived projects back in your project list.\n\n![Unarchive project](../images/archive-project/unarchive.png)\n\n<Callout title=\"Note\" type=\"info\">\n Deleting a project is not yet available in the BETA version.\n</Callout>\n" + }, + { + "title": "Request testnet STX", + "description": "Easily request testnet STX, so you can deploy and interact with Stacks testnet.", + "slug": "/stacks/platform/examples/faucet", + "content": "\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nThe Stacks Testnet Faucet is a dedicated utility for developers building on the Stacks blockchain. To aid you in deploying and running smart contracts on Stacks testnet, we've provided this faucet that offers easy access to testnet STX tokens.\n\n![Create Chainhook Window](../images/faucet/request.png)\n\n## Why use the Stacks Testnet Faucet?\n\nBuilding and testing on a blockchain requires a certain amount of native tokens to facilitate various operations, from contract deployments to transaction executions. However, sourcing these tokens can often be cumbersome. The Stacks Testnet Faucet simplifies this by offering a hassle-free way to acquire STX tokens for testing purposes.\n\n## How to request testnet STX\n\n1. **Visit the faucet page**: Navigate to [platform.hiro.so/faucet](https://platform.hiro.so/faucet).\n2. **Select the token**: Select which token you want, either STX or sBTC.\n3. **Request tokens**: You'll find a straightforward interface with a button to request tokens. Simply click on the button \"Receive x STX/sBTC.\"\n4. **Receive 500 STX tokens or 1 sBTC**: By clicking the button, you'll receive 500 STX tokens or 1 sBTC to your testnet account.\n\n## Frequently Asked Questions\n\n\n<Accordions>\n<Accordion title=\"What is a faucet?\">\nA faucet is an application that dispenses free tokens on a Testnet (a blockchain network used for development and testing). The Stacks faucet provides developers with free test tokens for deploying, testing, and optimizing smart contracts that leverage STX and sBTC.\n\n**It's important to remember that Testnet tokens have no real-world value and cannot be sold or used on the main Stacks network.**\n</Accordion>\n<Accordion title=\"How does the faucet work?\">\nSelect the type of test token you wish to receive and enter the wallet address where you want to receive them. The faucet will create a transaction on the Stacks Testnet that sends a small amount of test tokens to the provided address.\n\nIf you're curious, you can track the transaction's status using [Stacks Explorer](https://explorer.stacks.so/).\n</Accordion>\n<Accordion title=\"Is it secure?\">\nWe securely handle the wallet address you provide while processing your request. This data is not used or shared with any other Hiro services.\n</Accordion>\n<Accordion title=\"Is there a limit for the number of tokens I can request?\">\nYou can make up to 5 requests every 5 minutes. For more details, see our [rate limiting policies](/stacks/rate-limiting).\n</Accordion>\n<Accordion title=\"How long does it take for the Testnet tokens to arrive in my account?\">\nThe time for tokens to arrive to your wallet depends on how busy the network is. On average, it should take x amount of time. If the transaction seems stuck, feel free to reach out to us on our [support channel](https://stacks.chat/).\n</Accordion>\n</Accordions>\n\n<Callout type=\"info\">\n **Daily Limit**: To ensure fair distribution and availability for all\n developers, there's a limit of one request per day. Plan your testing\n accordingly!\n</Callout>{\" \"}\n" + }, + { + "title": "Using devnet", + "description": "Test and validate your code using devnet's private blockchain environment.", + "slug": "/stacks/platform/examples/devnet", + "content": "\nDevnet is a personal blockchain environment that lets you test and validate your contract code before deploying on a public network like testnet or mainnet. In this guide, you'll learn how to interact with devnet in the Hiro Platform to expedite your development.\n\n## What is devnet?\n\nDevnet is a private blockchain environment that lets you test and validate smart contracts quickly. Think of it as your personal sandbox: no one else can see your devnet instance, you don't have to worry about breaking it, and you can stop and restart it as many times as you need.\n\nWhile developers can run devnet locally using Clarinet, the Hiro Platform provides a hosted version that eliminates the need to manage blockchain nodes and miners on your machine. The Platform-hosted devnet still produces blocks and processes transactions, but offloads the computational overhead to our infrastructure while providing a more intuitive interface for development.\n\nDevnet provides a risk-free testing ground with the convenience of rapid prototyping, cost savings, and privacy.\n\n## Benefits of devnet on the Hiro Platform\n\nThe Platform-hosted devnet offers several advantages:\n\n- **Zero local setup**: No need to configure or maintain blockchain nodes locally\n- **Resource-efficient**: Offloads computational demands to our infrastructure\n- **Rapid prototyping**: Quick iterations with immediate feedback\n- **Cost-efficiency**: No real cryptocurrency expenses for testing\n- **Seamless local integration**: Connect your local development environment to the hosted devnet\n- **Isolated development**: A personal sandbox for confidential and secure testing\n\n## Using devnet in the Hiro Platform\n\nFirst, log into the [Hiro Platform](https://platform.hiro.so/). After [setting up your project](/stacks/platform/guides/create-project), navigate to the project page where you can select the \"Devnet\" tab to manage your devnet instance.\n\n## Starting and managing devnet\n\nIn your project page, you'll click on the \"Devnet\" tab to start and manage your devnet instance. Initially, it should read \"Inactive.\" Click on the \"Start Devnet\" button to start your private devnet instance.\n\n![Dashboard](../images/devnet/dev1.png)\n\n<Callout title=\"Programmatic API\">\n You can also start and stop devnet programmatically via the [Platform API](/stacks/platform-api/devnet).\n</Callout>\n\nIf you want to configure your devnet (like you can locally using `clarinet devnet start` in the terminal), open your project's `devnet.toml` file in the platform VS Code editor before you start devnet. From there, you can configure the settings to match your development needs.\n\nOnce you start devnet, it will take a few moments to spin up. The status indicator on the project dashboard will keep you updated on the progress.\n\n## Active session management\n\nWhen devnet is ready, the status will change to 'Active'.\n\nIf needed, you can restart devnet to refresh the timer. Keep in mind that only one devnet instance can run at a time per user account. If you need to work on a different project, simply start devnet within that project to seamlessly transition your session. There is also a monthly limit of 100 devnet sessions per account, so plan your development schedule accordingly.\n\n## Exploring the devnet dashboard\n\nThe Platform's devnet dashboard provides a comprehensive interface for monitoring and interacting with your private blockchain. You can:\n\n- Track real-time block production through the visual \"assembly line\"\n- Inspect block contents and transaction details\n- Search through blocks efficiently\n- Monitor contract deployments and function calls\n- Mint new blocks on demand\n\n![Devnet Dashboard](../images/devnet/dev2.png)\n\n## Additional devnet features\n\nOn the dashboard, you can also click the \"Interact with devnet\" button to call contract functions, make API requests, view devnet wallets, and more.\n\nFor more information on devnet features, [start here](https://www.hiro.so/blog/5-ways-to-interact-with-devnet-in-the-hiro-platform).\n" + }, + { + "title": "Monitor contracts", + "description": "Learn how to monitor your contract with custom alerts after you deploy to mainnet.", + "slug": "/stacks/platform/examples/contract-monitoring", + "content": "\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThis feature goes beyond just security—it's also a way to better understand how your contracts are being used. You can also set up alerts for various public functions in your smart contract to gain insight on which functions are receiving the most calls and how users are interacting with your contract.\n\n## Set up contract monitoring\n\n<Callout title=\"Note\">\n Make sure to have successfully deployed your contracts to the Stacks mainnet if you plan on setting up alert monitoring for your own contracts.\n</Callout>\n\nIf you have successfully deployed your contracts or want to set up alert monitoring for other contracts on mainnet, toggle to the Monitor tab after logging into the [Hiro Platform](https://platform.hiro.so).\n\n![Start monitoring](../images/contract-monitoring/start-monitoring.png)\n\n## Add contract for monitoring\n\nAfter clicking on the 'Add contract' button, a slideout modal will appear with fields for you to look up any smart contract on mainnet using the contract's principal and contract name. All contracts deployed to mainnet are public, and you can monitor and set up alerts for any of them, regardless of whether you are the deployer.\n\nAlternatively, you can also connect your wallet to view your deployment history and choose any contracts you’ve previously deployed in order to set up alerts for them.\n\n![Add contract](../images/contract-monitoring/add-contract.png)\n\nYour contract will then appear under Contract Monitoring. Once you are monitoring a particular contract, you can view its transaction history and any pending transactions in the mempool. Click on \"Create an alert\" to create a specific alert you want to monitor for. \n\n![Added contract](../images/contract-monitoring/added-contract.png)\n\n## Add custom alert\n\nYou can configure alerts for any contract calls on mainnet, whether that’s a `set-contract-owner` function, a transfer/mint/burn function, or anything else you’ve implemented that you want to monitor.\n\nOnce you identify the function calls you want to monitor, you can further hone in on the specific calls by creating filters for argument values and the address of the wallet which called the function. \n\nThe specific conditions you can choose to monitor for include:\n\n- When a particular function is called\n- When a particular function is called with a specified argument\n- When a particular function is called by a specified address\n\nYou can monitor these alerts in the Hiro Platform, and you can also choose to receive email alerts every time one of those alerts is triggered. Alternatively, you can configure webhook calls, which can be used for all kinds of customized alerting flows.\n\n![Create alert form](../images/contract-monitoring/create-alert-form.png)\n\n## Monitor your alerts\n\nWith each alert you set up, you can view the alert’s history and the response status from any webhook calls made. You also have the ability to edit existing alerts to change your alert conditions or notification preferences at any time.\n\n![View alerts page](../images/contract-monitoring/view-alerts-page.png)\n\n## What to expect from alerts\n\nIf you've specified an email as the notification type, alert notification emails will come from Hiro Platform `<platform@hiro.so>`.\n\nIf you've specified a webhook to send an alert to an API endpoint, then the alert payload will look like `sample-alert-payload.json` below.\n\n<Callout type=\"info\">\n Note that `tx_status` will always return a \"pending\" status for monitor alert notifications. This is because contract monitoring alerts will only send notifications when your custom notification alert on a particular function hits the mempool, but not when it gets confirmed in the blockchain.\n</Callout>\n\n<Tabs items={['Sample Alert Payload', 'Alert Payload Interface']}>\n <Tab value=\"Sample Alert Payload\">\n ```json sample-alert-payload.json\n {\n \"tx_id\": \"0xa7f511b3f379efef6fe71d0de57712ed13a89c5b6e24dd049eb2cc9a7c24fcb5\",\n \"nonce\": 5,\n \"fee_rate\": \"250\",\n \"sender_address\": \"SP2W9QYAHJNS7YTQY9EK2MSTQGX9E2NDMV766JP9Z\",\n \"sponsored\": false,\n \"post_condition_mode\": \"deny\",\n \"post_conditions\": [\n {\n \"type\": \"stx\",\n \"condition_code\": \"sent_equal_to\",\n \"amount\": \"3000000\",\n \"principal\": {\n \"type_id\": \"principal_standard\",\n \"address\": \"SP2W9QYAHJNS7YTQY9EK2MSTQGX9E2NDMV766JP9Z\"\n }\n }\n ],\n \"anchor_mode\": \"any\",\n \"tx_status\": \"pending\",\n \"receipt_time\": 1726104636,\n \"receipt_time_iso\": \"2024-09-12T01:30:36.000Z\",\n \"tx_type\": \"contract_call\",\n \"contract_call\": {\n \"contract_id\": \"SPHW0EJK5KPDMK03ZX792EMP0Q5J3A39ZMTVZZCY.sample-contract\",\n \"function_name\": \"donate\",\n \"function_signature\": \"(define-public (donate (amount uint)))\",\n \"function_args\": [\n {\n \"hex\": \"0x01000000000000000000000000002dc6c0\",\n \"repr\": \"u3000000\",\n \"name\": \"amount\",\n \"type\": \"uint\"\n }\n ]\n }\n }\n ```\n </Tab>\n <Tab value=\"Alert Payload Interface\">\n ```ts title=\"sample-alert-interface.ts\"\n interface Body {\n tx_id: string;\n nonce: number;\n fee_rate: string;\n sender_address: string;\n sponsored: boolean;\n post_condition_mode: string;\n post_conditions: Postcondition[];\n anchor_mode: string;\n tx_status: string;\n receipt_time: number;\n receipt_time_iso: string;\n tx_type: string;\n contract_call: Contractcall;\n }\n interface Contractcall {\n contract_id: string;\n function_name: string;\n function_signature: string;\n function_args: Functionarg[];\n }\n interface Functionarg {\n hex: string;\n repr: string;\n name: string;\n type: string;\n }\n interface Postcondition {\n type: string;\n condition_code: string;\n amount: string;\n principal: Principal;\n }\n interface Principal {\n type_id: string;\n address: string;\n }\n ```\n </Tab>\n</Tabs>" + }, + { + "title": "Create a chainhook", + "description": "Create a chainhook using the Hiro Platform.", + "slug": "/stacks/platform/examples/create-chainhooks", + "content": "\nWith Chainhook, you can automatically trigger an action in response to on-chain events on Stacks and Bitcoin, enabling you to use IFTTT (if_this, then_that) logic to power your applications. To learn more about Chainhook, refer to the [Chainhook overview](/stacks/chainhook).\n\n<Callout title=\"Programmatic API\">\n You can also create and manage chainhooks via the [Platform API](/stacks/platform-api/chainhooks).\n</Callout>\n\nTo get started in the Hiro Platform, login and toggle to the Chainhook page. There are two ways to create a chainhook. You can either create a chainhook from scratch using the platform UI, or you can upload chainhooks that you have already defined in JSON.\n\n![Create Chainhook Window](../images/chainhook/select-chainhook-tab.png)\n\nSelect the \"New Chainhook\" button.\n\n![Create Chainhook Window](../images/chainhook/create-chainhook-window.png)\n\nThis will open a panel on the right to create a chainhook. Use the following fields to create a Chainhook:\n\n**Name**: Input the name of your chainhook.\n\n**Chain**: Select which chain you want to build a chainhook for (Bitcoin or Stacks).\n\n**Network**: Choose which network the chainhook will observe.\n\n**If-this**: Based on the selected chain, you will see a list of available scopes for the `If-this` condition (also called a \"predicate\").\n\n<Callout title=\"Available Predicate Scopes\">\n -For Bitcoin, the available predicate options are `txid`,`outputs`, and\n `stacks_protocols`.\n \n -For Stacks, the available predicate options are\n `txid`, `block_height`, `fungible_token_event`, `non-fungible_token_event`,\n `stx_event`, `print_event`, and `contract_deployment`.\n\n_Refer to the [Bitcoin predicates](/stacks/chainhook/concepts/bitcoin-predicates) and [Stacks predicates](/stacks/chainhook/concepts/stacks-predicates) documents to understand the available predicates and how to use them._\n\n</Callout>\n\n**Then-that**: This action is defaulted to `http_post` to allow the chainhook to post events to the URL specified in the next field below.\n\n**URL**: Specify a URL to post chainhook events to the HTTP_post method.\n\n**Authorization Header**: This field is optional to add a Secret to the `authorization` header when posting payloads.\n\n**Start Block**: This field must specify the start block to search the chain.\n\n**End Block**: It is optional to specify the end block. However, to optimize your scan time, we recommended you specify this field.\n\n**Expire After Occurrence**: You can specify the chainhook to expire after a specific number of occurrences (a number greater than or equal to 1). You can leave this blank if you don't want to set any limit.\n\n**Decode Clarity Values**: This is enabled by default for Stacks predicates to help you decode Clarity values in your contract.\n\nYou'll also see the following options for Bitcoin chainhooks:\n\n**Include Proof**: Enable this option when you have evidence that the transaction or block has been verified and authorized by the sender using their private key. This proof is generally a cryptographic signature to a transaction or block on the Bitcoin blockchain.\n\n**Include Inputs**: Enable this option to include Bitcoin transaction inputs in the payload. In a Bitcoin transaction, inputs are references to previous transactions' outputs (also known as unspent transaction outputs or UTXOs) that are being spent in the current transaction. These inputs provide evidence that the sender has the right to spend the funds.\n\n**Include Outputs**: Enable this option to include Bitcoin transaction outputs in the payload. Including outputs in a Bitcoin transaction refers to specifying the destinations and amounts of Bitcoin being sent as part of a transaction. Outputs in a Bitcoin transaction represent the recipients' addresses and the corresponding amounts of Bitcoin they are receiving.\n\n**Include Witness**: Enable this option to include Bitcoin transaction witness in the payload. The witness data for a transaction includes the cryptographic signatures and other related information placed alongside the transaction data in the block.\n\nOnce you define all the required fields, you can select \"Create Chainhook\", and you can now see your created chainhook on the Chainhook page.\n\n![Chainhook created](../images/chainhook/created.png)\n\nThe `NAME`, `CHAIN`, `START BLOCK`, `NETWORK`, `STATUS`, and `LAST UPDATED` headers are updated based on the selected fields used to create a Chainhook.\n\nBased on the chosen network, the respective status columns in the Chainhook list page will be updated to \"Deployed.\"\n\nNote: there may be other fields in the UI to create a Chainhook based on the predicates defined above.\n\n## Upload a chainhook\n\nTo upload a chainhook, you can either select the \"Upload Chainhook\" button and choose the .json file that has the chainhook(s) you want to upload, or you can drag and drop the .json file into the file upload area.\n\n![Upload Chainhook](../images/chainhook/upload.png)\n\nThe upload file must be a .json file containing either a single json object representing a Chainhook predicate, or an array of json objects representing one or more Chainhook predicates.\n\nRefer to the [Bitcoin predicates](/stacks/chainhook/concepts/bitcoin-predicates) and [Stacks predicates](/stacks/chainhook/concepts/stacks-predicates) documents to understand the available predicates and how to prepare your Chainhook predicate JSON for upload.\n\n## Edit a chainhook\n\nOnce a chainhook is created, you can edit the chainhook by clicking the ellipse on the specific chainhook you want to edit.\n\n![Edit chainhook](../images/chainhook/edit-chainhook.png)\n\nUpdate the fields to reflect your desired changes and then select \"Update chainhook.\"\n\n## Duplicate a chainhook\n\nSelect the ellipse on the chainhook you want to duplicate and select \"Duplicate.\" This opens a right pane with all the fields populated to use to create a duplicate Chainhook.\n\nYou can update any fields or publish a direct copy by clicking \"Create Chainhook.\"\n\n## Delete a chainhook\n\nSelect the ellipse on the chainhook you wish to delete and select \"Delete.\" You will see a confirmation window to confirm if you want to delete the Chainhook.\n\n## Chainhook status\n\nThe Chainhook page has a `STATUS` column that displays whether your chainhooks are in an active, inactive, or error state. Active means the Chainhook is actively scanning blocks against its defined predicate, inactive means the Chainhook has reached a terminal state (e.g. its end block has been reached, and it is no longer scanning blocks), and error means the Chainhook ran into an error during its execution.\n\nMore status info can be found by hovering over the status element. For example, to understand why the Chainhook is in an error state, hover over the status element to find out.\n\n![Chainhook status](../images/chainhook/status-info.png)\n\n## References\n\n- [Use Chainhooks with Bitcoin](/stacks/chainhook/concepts/bitcoin-predicates)\n- [Use Chainhooks with Stacks](/stacks/chainhook/concepts/stacks-predicates)\n- [Run Chainhook as a service using Bitcoind](/stacks/chainhook/guides/chainhook-as-a-service)\n- [Run Chainhook as a service using Stacks](/stacks/chainhook/guides/chainhook-as-a-service-with-stacks-node)\n" + }, + { + "title": "Quickstart", + "description": "Create and deploy your first app in the Hiro Platform.", + "slug": "/stacks/platform/quickstart", + "content": "\nimport { Code, Terminal } from \"lucide-react\"\nimport { SmallCard } from \"@/components/card\"\n\nIn this quickstart guide, you will create a simple fundraising app using one of the app templates available. This app features a single page that displays a fundraising campaign, and functionality that handles campaign contributions, refunds, and withdrawal by the fundraiser.\n\n## Create your account\n\nStart by creating an account in the Hiro Platform. You can create an account with:\n\n- Email\n- Google\n- GitHub\n- Discord\n\n![Platform Login](./images/quickstart/q1.png)\n\nOnce signed in, you will see an onboarding screen showing all the Hiro Platform has to offer:\n\n![Platform Welcome Screen](./images/quickstart/q2.png)\n\n## Create your project\n\nIf you do not have any existing projects, you will be prompted to create one on the projects page. Click the \"Add a project\" button to get started.\n\n<Callout type=\"info\">\nIf you already have projects, you can find the \"Add a project\" button at the top right of the page.\n</Callout>\n\nFrom here, you have the option to choose from a set of templates or import an existing project from your GitHub account. For this quickstart, select the \"Fundraising App\" template, which is a starter project that comes equipped with both a frontend and smart contracts.\n\n![choose template](./images/quickstart/q5.png)\n\n<Callout type=\"info\">\nTo see a list of your repositories and import an existing project, you will first need to authorize with GitHub.\n</Callout>\n\n## Clone your project\n\nOnce you have selected your project, you will be presented with the full set of details for the project. From here, you can clone the project to your GitHub account by clicking the \"Clone\" button.\n\n![template details](./images/quickstart/q3.png)\n\n<Callout type=\"info\">\nYou will need to authorize with Github before being able to clone the project.\n</Callout>\n\nOnce the project is ready and available in your GitHub account, you will see instructions on how to clone the project to your local machine or develop in the browser via Github Codespaces.\n\n![template ready](./images/quickstart/q4.png)\n\nYou are now ready to start building!\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/platform/guides/deploy-contracts\"\n title=\"Deploy contracts\"\n description=\"Learn how to deploy your contracts to testnet and mainnet using deployment plans in the Hiro Platform.\"\n />\n <Card\n href=\"/stacks/platform/guides/devnet\"\n title=\"Running Devnet\"\n description=\"Learn how to use devnet, a private blockchain environment, to test and interact with your app.\"\n />\n <Card\n href=\"/stacks/platform/guides/create-chainhooks\"\n title=\"Create and manage Chainhooks\"\n description=\"Learn how to create custom event streams for Stacks or Bitcoin with Chainhook on the Platform.\"\n />\n</Cards>\n" + }, + { + "title": "Overview", + "description": "Fetch data for any fungible, non-fungible, and semi-fungible token on Stacks.", + "slug": "/stacks/token-metadata-api/index", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nThe Token Metadata API is a service that offers a REST API, so you can easily pull any data you need for any token on Stacks that follows SIP standards. Every token, one request away.\n\n## Popular endpoints\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/token-metadata-api/tokens/fungible-token-metadata\"\n title=\"Get data for fungible tokens\"\n description=\"Retrieve data related to fungible tokens.\"\n />\n <SecondaryCard\n href=\"/stacks/token-metadata-api/tokens/non-fungible-token-metadata\"\n title=\"Get data for non-fungible tokens\"\n description=\"Retrieve data related to non-fungible tokens.\"\n />\n <SecondaryCard\n href=\"/stacks/token-metadata-api/tokens/semi-fungible-token-metadata\"\n title=\"Get data for semi-fungible tokens\"\n description=\"Retrieve data related to semi-fungible tokens.\"\n />\n</Cards>\n\n\n## Related tools\n\n- **[Hiro Archive](/stacks/archive)**: Bootstrap your own instance of the Token Metadata API with the Hiro Archive and save days of setup time.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch on-chain data from the Stacks blockchain.\n- **[Stacks Explorer](https://explorer.hiro.so)**: Looking for a simpler way to verify token data on the Stacks blockchain? Try the Stacks Explorer.\n- **[Ordinals API](/bitcoin/ordinals/api)**: Get data for Bitcoin ordinals and BRC-20 tokens.\n\n<br />\n\n<Callout title=\"Need help building with the Token Metadata API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#api</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n\n" + }, + { + "title": "Architecture", + "description": "Understand the architecture of the Token Metadata API.", + "slug": "/stacks/token-metadata-api/architecture", + "content": "\n## Service architecture\n\nThis section gives you an overview of external and internal architectural diagrams.\n\n## External architecture\n\nThe external architectural diagram shows how the Token metadata API is connected to three systems: a Stacks node, a Stacks Blockchain API database, and a Postgres database.\n\n![Architecture](../../../../public/images/token-metadata-api/architecture.svg)\n\n1. The Token Metadata API interacts with the Stacks Blockchain API database (referred to as a \"Local Metadata DB\" in the diagram above) to import all historical smart contracts when booting up and to listen for new contracts that may be deployed afterwards. Read-only access is recommended as this service will never need to write anything to this database.\n2. A Stacks node responds to all read-only contract calls required when fetching token metadata (calls to get token count, token metadata URIs, etc.).\n3. A local Postgres DB stores all processed metadata info.\n\nThe service needs to fetch external metadata files (JSONs, images) from the internet, so it must have access to external networks.\n\n## Internal architecture\n\nThe following is the internal architectural diagram of the Token Metadata API.\n\n![Flowchart](../../../../public/images/token-metadata-api/flowchart.svg)\n" + }, + { + "title": "Info", + "description": "Retrieves information about the Token Metadata API, including the server version.", + "slug": "/stacks/token-metadata-api/info/index", + "content": "" + }, + { + "title": "Get status", + "description": "Retrieves information about the Token Metadata API, including the server version.", + "slug": "/stacks/token-metadata-api/info/status", + "content": "\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Usage", + "description": "Go over the multiple ways to make requests to the Token Metadata API.", + "slug": "/stacks/token-metadata-api/usage", + "content": "\n## Making requests\n\nTo make a request to the Stacks API, you can paste the `curl` command below in your terminal.\n\n```terminal\n$ curl -L 'https://api.hiro.so/metadata/v1/' -H 'Accept: application/json'\n```\n\nIf you are using an `api-key`, you will need to replace `$HIRO_API_KEY` with your secret API key.\n\n```terminal\n$ curl -L 'https://api.hiro.so/metadata/v1/' \\\n -H 'Accept: application/json' \\\n -H 'X-API-Key: $HIRO_API_KEY'\n```\n\nYou should get a response back that resembles the following:\n\n```json\n{\n \"server_version\": \"token-metadata-api v0.7.0 (master:1aa1603)\",\n \"status\": \"ready\",\n \"tokens\": {\n \"ft\": 1309,\n \"nft\": 545094,\n \"sft\": 121\n },\n \"token_contracts\": {\n \"sip-009\": 4791,\n \"sip-010\": 1309,\n \"sip-013\": 21\n },\n \"job_queue\": {\n \"done\": 443257,\n \"failed\": 108606\n }\n}\n```\n\n## Making requests using API Client\n\nWe also maintain a standalone API client that you can use to make requests to the Stacks API. This client is available as a package and can be installed with the following command:\n\n```package-install title=\"Terminal\"\n@hirosystems/token-metadata-api-client\n```\n\nExample usage:\n\n```ts\nimport { Configuration, TokensApi } from \"@hirosystems/token-metadata-api-client\";\n\nconst config: Configuration = {}\nconst api = new TokensApi(config);\nconst result = await api.getFtMetadata(\n 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2'\n);\n```\n\n{/* For more information on the API client, you can check out the [API Client documentation](/stacks/token-metadata-api/client). */}" + }, + { + "title": "Tokens", + "description": "Retrieves information about tokens on the Stacks blockchain.", + "slug": "/stacks/token-metadata-api/tokens/index", + "content": "\n" + }, + { + "title": "Get fungible token metadata", + "description": "Retrieves metadata for a SIP-010 fungible token.", + "slug": "/stacks/token-metadata-api/tokens/fungible-token-metadata", + "content": "\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/ft/{principal}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get semi-fungible token metadata", + "description": "Retrieves information about semi-fungible tokens.", + "slug": "/stacks/token-metadata-api/tokens/semi-fungible-token-metadata", + "content": "\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/sft/{principal}/{token_id}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get fungible tokens", + "description": "Retrieves information about fungible tokens.", + "slug": "/stacks/token-metadata-api/tokens/fungible-tokens", + "content": "\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/ft', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get non-fungible token metadata", + "description": "Retrieves metadata for a SIP-009 non-fungible token.", + "slug": "/stacks/token-metadata-api/tokens/non-fungible-token-metadata", + "content": "\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/nft/{principal}/{token_id}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Overview", + "description": "Interact with the Stacks blockchain using a Javascript client library.", + "slug": "/stacks/token-metadata-api/client/index", + "content": "\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```" + }, + { + "title": "Quickstart", + "description": "Create your first project in less than 2 minutes", + "slug": "/stacks/token-metadata-api/client/quickstart", + "content": "\nThe Usage section should focus on practical, hands-on instructions for getting started with the API. This includes:\nAuthentication: How to authenticate with the API (e.g., API keys, OAuth tokens).\nMaking Requests: Basic examples of making requests to the API, including request format, essential headers, and parameters.\nHandling Responses: Information on response structure, understanding status codes, and error handling.\nRate Limits: If applicable, explain any rate limits and best practices for avoiding them.\nThe goal of the \"Usage\" section is to equip developers with the knowledge to make successful API calls and handle responses effectively.\n\n## Using Websockets\n\nThe WebSocket components enable you to subscribe to specific updates, providing a near real-time display of updates on transactions and accounts.\n\n```ts\nimport { connectWebSocketClient } from '@stacks/blockchain-api-client';\nconst client = await connectWebSocketClient('ws://api.hiro.so/');\nconst sub = await client.subscribeAddressTransactions(contractCall.txId, event => {\n console.log(event);\n});\n\nawait sub.unsubscribe();\n```" + }, + { + "title": "Tokens", + "description": "Manage token metadata, including token IDs, token URIs, and token traits.", + "slug": "/stacks/token-metadata-api/client/tokens/index", + "content": "" + }, + { + "title": "Get Fungible Token Metadata", + "description": "Retrieves a list of all assets events associated with an account or a Contract Identifier.", + "slug": "/stacks/token-metadata-api/client/tokens/get-ft-metadata", + "content": "\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\n<Root>\n\n<API className='api my-3'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`getAccountAssets`</h2>\n\nThis API endpoint retrieves a comprehensive list of asset events associated with a specific account or Contract Identifier, including asset transfers and mints. It is essential for tracking asset movements and changes in ownership within the Stacks blockchain.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"principal\"} type={\"string\"}>\nThe account address or contract identifier whose asset events are to be retrieved.\n</Property>\n\n<Property required={false} deprecated={false} name={\"initOverrides\"} type={\"RequestInit\"}>\nOptional overrides for the request initialization settings.\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"get-assets\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"get-assets\" className='tab group'>\n <Badge className='badge transition-colors'>Retrieve Account Assets</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"get-assets\">\n ```tsx\n import { Configuration, AccountsApi } from '@stacks/blockchain-api-client';\n \n const apiConfig = new Configuration({\n basePath: 'https://api.testnet.hiro.so',\n });\n\n const accountsApi = new AccountsApi(apiConfig);\n const principal = 'ST000000000000000000002AMW42H';\n // Retrieve all asset events for the specified account or contract identifier\n const assets = await accountsApi.getAccountAssets({\n principal: principal,\n });\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n \n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='api my-3'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`UserSession`</h2>\n\nThe Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a UserSession to manage user data.\n\n## Functions\n\n<Property required={false} deprecated={false} name={\"isSignInPending\"} type={\"function\"}>\n\nDetermines if there is an incoming authentication response.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"handlePendingSignIn\"} type={\"function\"}>\n\nProcesses the response and provides a `userData` object containing the user's identity, BNS username and profile information.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"isUserSignedIn\"} type={\"function\"}>\n\nChecks if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"loadUserData\"} type={\"function\"}>\n\nRetrieves the user's profile data if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"encryptContent\"} type={\"function\"}>\n\nEncrypts user data for secure storage.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"decryptContent\"} type={\"function\"}>\n\nDecrypts user data for secure storage.\n\n</Property>\n\n</div>\n\n<APIExample>\n<Tabs defaultValue=\"pending\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"pending\" className='tab group'>\n <Badge className='badge transition-colors'>Handle incoming authentication response</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"status\" className='tab group'>\n <Badge className='badge transition-colors'>Check if a user is signed in</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"user-data\" className='tab group'>\n <Badge className='badge transition-colors'>Load data for signed in user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"sign-out\" className='tab group'>\n <Badge className='badge transition-colors'>Signing out a user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"encrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Encrypting user data</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"decrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Decrypting user data</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"pending\">\n ```tsx\n const isPending = userSession.isSignInPending();\n\n if (isPending) {\n userSession.handlePendingSignIn().then(userData => {\n // Do something with userData\n });\n }\n ```\n </TabsContent>\n <TabsContent value='status'>\n ```tsx\n const isSignedIn = userSession.isUserSignedIn();\n ```\n </TabsContent>\n <TabsContent value='user-data'>\n ```tsx\n const isSignedIn = userSession.isUserSignedIn();\n\n if (isSignedIn) {\n // Do something with the signed in user\n const userData = userSession.loadUserData();\n }\n ```\n </TabsContent>\n <TabsContent value='sign-out'>\n ```tsx\n function logout() {\n userSession.signUserOut();\n }\n ```\n </TabsContent>\n <TabsContent value='encrypt'>\n ```tsx\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n ```\n </TabsContent>\n <TabsContent value='decrypt'>\n ```tsx\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n const plainText = await userSession.decryptContent(cipherText);\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n\n<Accordion title={\"Notes\"}>\n Note that encryption here uses the user's private key associated with your app only. If you need to share this data with another app or other users, you should use the equivalent methods from `@stacks/encryption` and provide a custom private key.\n</Accordion>\n\n</Accordions>\n\n</APIExample>\n\n</API>\n\n</Root>" + }, + { + "title": "Build a custom blockchain API", + "description": "Learn how to build a custom API with Chainhook.", + "slug": "/stacks/hacks/archive/build-a-custom-api", + "content": "\nimport { HackBadge } from \"@/components/badge\";\n\n<Callout title=\"Inactive\" type=\"warn\">\nThis hack has been archived. Feel free to continue to use the code in this guide as a reference for your own projects.\n</Callout>\n\n## Introduction\n\nIn the previous hacks, you built some pretty complex smart contracts. But building a robust UI/UX around these smart contracts and their on-chain data can be challenging due to the nature of blockchains.\n\nLet's take the [decentralized grants program](/stacks/hacks/build-a-decentralized-grants-program) hack as an example. In this project, anyone can propose a grant, and these proposals are voted on by token holders. The details of each proposal, including the title, description, and the proposal contract, are stored on the blockchain.\n\nHowever, directly querying the blockchain for this data every time you want to display it in your application's UI can be slow and inefficient. And that information might not always be formatted and organized in a way that makes sense for your use case.\n\nThis is where [Chainhook](/stacks/chainhook) comes in. Chainhook allows you to listen for specific on-chain events, such as the submission of a new grant proposal, and trigger actions in response - like inserting specific data into a database to query off-chain.\n\nIn this guide, you'll build a custom API with Chainhook using the [Hiro Platform](https://platform.hiro.so/), with a focus on integrating it with the contracts you built for the decentralized grants program hack.\n\n## Creating a server\n\nIn this section, we'll briefly discuss setting up an Express server to handle incoming event data from Chainhook. While a detailed walkthrough of setting up an Express server is beyond the scope of this guide, you can reference an example app [here](https://github.com/hirosystems/examples/tree/main/apps/chainhook).\n\nTo illustrate how to handle this event data, here is an example `server.ts` file:\n\n```typescript\nconst express = require(\"express\")\nconst app = express()\napp.use(express.json())\n\napp.post(\"/api/events\", (req, res) => {\n const events = req.body\n // Process the event data here\n res.status(200).send({ message: \"Event received\" })\n})\n\napp.listen(3000, () => {\n console.log(\"Server is running on port 3000\")\n})\n```\n\nIn this example, the server listens for POST requests at the `/api/events` route. When a request is received from your chainhook (which you will set up in the next section), you can extract the event data from the request body and process it.\n\n## Parsing the event data\n\nThe Chainhook payload comes with a lot of information, so let's break down some of the more important parts inside of the `req.body` for this guide.\n\nHere is a truncated look at the payload structure from Chainhook:\n\n```json\n{\n \"apply\": [\n {\n \"transactions\": [\n {\n \"metadata\": {\n \"receipt\": \"...\"\n },\n \"operations\": [\n {\n \"...\": \"...\"\n }\n ]\n }\n ]\n }\n ]\n}\n```\n\nEach item in the `apply` array should contain a `transactions` array. Each `transaction` object should have a `metadata` object with a `receipt` attribute and an `operations` array.\n\n- `transaction.metadata.receipt`: This attribute contains information about any events that were triggered from the function.\n- `transaction.operations`: This is an array that contains more specific information about what happened as a result of the function call. For instance if a _token transfer_ occured, each object inside this array would contain various attributes and information regarding the account, amount, type, and status of the token transfer.\n\nHere's what your POST route might look like after filtering for the relevant data in your `server.ts` file:\n\n```typescript\napp.post(\"/api/events\", async (req, res) => {\n const events = req.body\n // Loop through each item in the apply array\n events.apply.forEach((item: any) => {\n // Loop through each transaction in the item\n item.transactions.forEach((transaction: any) => {\n // If the transaction has operations, loop through them\n if (transaction.operations) {\n transaction.operations.forEach((operation: any) => {\n // Log the operation\n console.log({ operation })\n })\n }\n })\n })\n\n // Send a response back to Chainhook to acknowledge receipt of the event\n res.status(200).send({ message: \"Proposal added!\" })\n})\n```\n\nFor the next section, you will need to expose your local server via `https` so that Chainhook can deliver the `payload`. To do that, run the following command:\n\n```terminal\n$ npx localtunnel --port <your-port-number>\n```\n\n> _**Note**_\n>\n> There are several tools for exposing localhost to the world so choose the one you prefer. For more information on `localtunnel`, click [here](https://github.com/localtunnel/localtunnel).\n\n## Integrating with Chainhook\n\nIn this section, you will integrate Chainhook with your smart contracts. This involves creating a chainhook predicate that matches the specific on-chain events you want to respond to. For this process, you'll use the [Hiro Platform](https://platform.hiro.so/), which provides a user-friendly interface for creating and managing your chainhooks. By the end of this section, you'll have a chainhook set up and ready to trigger actions in response to on-chain events.\n\n## Deploying your contracts to testnet\n\nIn order to create your chainhook, you need to deploy your contracts to `testnet`. From your projects page, click on the Deploy button near the top right of your screen. You'll see your deployment options: choose \"Generate for Testnet.\"\n\n> _**Note**_\n>\n> The Platform will provide a step for requesting Testnet STX, but you can also go straight to the [Stacks Testnet Faucet](https://explorer.hiro.so/sandbox/faucet?chain=testnet). Once you have testnet STX tokens, you can deploy your contracts to testnet using the same methods you used for devnet, but with the network parameter set to testnet.\n\n## Creating a Chainhook\n\nNow it's time to create your first Chainhook. Start by creating a predicate that matches the `propose` function in your `proposal-submission` contract. This function is called when a new grant proposal is submitted.\n\nHere's an example of how you might define this `predicate.json` file for your contract:\n\n```json\n{\n \"chain\": \"stacks\",\n \"uuid\": \"1\",\n \"name\": \"New Grant Proposal\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"ST2BSV94A650WGZ2YZ5Y8HM93W01NGT4GY0MGJECG.proposal-submission\",\n \"method\": \"propose\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"<your-https-server-url>\",\n \"authorization_header\": \"Bearer 12345\"\n }\n },\n \"start_block\": 138339\n }\n }\n}\n```\n\n<Callout title=\"Note\" type=\"info\">\n Make sure to swap out the details in your `predicate.json` file to match your\n contracts ABI.\n</Callout>\n\nThe `if_this` section specifies the conditions for the events that this Chainhook will respond to. In this case, it's looking for calls to the `propose` method in the `proposal-submission` contract on the Stacks testnet.\n\nThe `then_that` section specifies what action the Chainhook should take when it detects an event that matches the `if_this` conditions. Here, it's set up to send a POST request to your specified URL with the event data.\n\nThe `start_block` field is used to specify the starting block for the Chainhook to start listening from. This is useful for ignoring blocks that were mined before the Chainhook was set up.\n\nOnce you have created a similar file for your specific contract. select the _Chainhooks_ tab inside your project and upload your predicate file using the _Upload Chainhook_ option. For more information, you can follow the [Create Chainhooks](/stacks/platform/guides/create-chainhooks) section.\n\n## Testing your chainhook\n\nOnce you've successfully uploaded your chainhook predicate, it's time to test it out. You can do this by performing an action that aligns with your `if_this` - `then_that` logic.\n\nFor instance, if your Chainhook is set up to respond to a specific contract call, you can trigger that call and then check your `/api/post` endpoint. If everything is set up correctly, you should see any information you've requested to be logged.\n\nThe next section presents several challenges that will help you put the finishing touches on your API. With the foundation you've built, you're well-equipped to take on these challenges and continue your journey in building robust, decentralized applications.\n\nCongratulations on reaching this point! You now have all the building blocks needed to create a custom API using Chainhook and integrate it with your smart contracts. This is a significant step towards enhancing the functionality and user experience of your decentralized applications.\n\n<Callout title=\"Note\" type=\"warn\">\n This is a crucial step in verifying that your Chainhook is working as\n expected. If you don't see the expected output, you may need to revisit your\n predicate and ensure it's correctly configured.\n</Callout>\n\n## Challenges\n\nThe following challenges are additional features you can implement to further explore building on Stacks. Feel free to add any other features you want.\n\n<HackBadge variant=\"starter\" />\n\n**Create more than 1 chainhook**: Don't stop at just 1! Follow the process above to create more than 1 chainhook for your dApp and parse the data accordingly.\n\n<HackBadge variant=\"intermediate\" />\n\n**Create consumer-facing API endpoints**: Up until now, we've shown you how to capture and process the initial `payload` data sent from a chainhook. However, to provide a robust user experience, you'll want to do more than just output raw data. The challenge here is to create additional API endpoints that present the filtered and extracted data from the initial `/api/events` payload in a consumer-friendly format. This could involve adding a database layer for organizing the data, adding additional context, or transforming the data to match the needs of your application's frontend. For a quick db setup, you can try using something like [Supabase](https://supabase.com/docs/guides/getting-started/quickstarts/reactjs).\n\n```typescript\n// Example using Supabase\n\nconst supabase = createClient(\n \"https://<project>.supabase.co\",\n \"<your-anon-key>\"\n)\n\napp.post(\"/api/events\", async (req, res) => {\n // ...\n\n item.transactions.forEach((transaction: any) => {\n if (transaction.operations) {\n transaction.operations.forEach((operation: any) => {\n const data = operation // Parse out the data you want\n // Insert and save it to db\n const { error } = await supabase.from(\"proposals\").insert(data)\n })\n }\n })\n\n // ...\n})\n```\n\n<HackBadge variant=\"advanced\" />\n\n**UI integration**: The final challenge is to integrate your consumer-facing API into your frontend. This involves taking the data you've processed and organized in your API and displaying it in a meaningful and user-friendly way in your application. This could involve creating dynamic components that update in response to new data, adding interactive elements that allow users to explore the data, or incorporating visualizations to help users understand the data.\n" + }, + { + "title": "Build a decentralized grants program", + "description": "Learn how to build a decentralized grants program with governance, submissions, and voting.", + "slug": "/stacks/hacks/archive/build-a-decentralized-grants-program", + "content": "\nimport { HackBadge } from \"@/components/badge\";\n\n<Callout title=\"Inactive\" type=\"warn\">\nThis hack has been archived. Feel free to continue to use the code in this guide as a reference for your own projects.\n</Callout>\n\n## Introduction\n\nWelcome to a world where funding for innovative projects is fluid and controlled by a community of token holders, not just a select few. This is the value proposition of a decentralized grants program. In this guide, you will build such a program using the [ExecutorDAO](https://github.com/MarvinJanssen/executor-dao) protocol on the Stacks blockchain.\n\nKey features of this project include:\n\n**Decentralized Governance**: Anyone holding a `membership-token` can vote on grant proposals.\n\n**Open Proposal Submission**: Anyone can propose a grant, encouraging a wide range of ideas and projects.\n\n**Smart Contract Automation**: All aspects of the grants program, from proposal submission to voting and fund distribution, are automated through smart contracts, ensuring transparency and tamper-proof processes.\n\nThis Hack walks you through the basics of building a decentralized grants program. Over the course of this hack, you will deploy your own functioning grants program.\n\nThere are also optional challenges at the end to further stretch your skills.\n\nNow it's time to hack. First, we'll cover the basics of the core functionalities of our grants program and look at 4 contracts. Let's dive in.\n\n## Understanding the ExecutorDAO protocol\n\nExecutorDAO is a powerful and flexible protocol that allows for the creation of decentralized autonomous organizations (DAOs) with a high degree of modularity and customization. ExecutorDAO operates on three core tenets:\n\n**Proposals are smart contracts**:\nProposals in ExecutorDAO are expressed as smart contracts, allowing for precise, logical descriptions of the operations, duties, and members of the DAO. In our case, each grant application is a proposal expressed as a smart contract.\n\n**The core executes, the extensions give form**:\nExecutorDAO starts with a single core contract whose sole purpose is to execute proposals and keep a list of authorized `extensions`. Extensions are contracts that can be enabled or disabled by proposals and add specific features to the DAO - like _proposing grants_, _voting on grants_, _distributing funds_, and more.\n\n**Ownership control happens via sending context**:\nExecutorDAO follows a single-address ownership model. The core contract is the de facto owner of external ownable contracts. This allows any proposal or extension to act upon it, like the `membership-token` we will build out in the sections below.\n\nFor more details, you can [view the standard contracts](https://github.com/MarvinJanssen/executor-dao/tree/main/contracts) in the ExecutorDAO repository.\n\n## Clone the starter template\n\nStart by setting up your development environment. We've prepared a repository that includes an initialized Clarinet project and a React frontend with some boilerplate code and all the required packages.\n\nTo clone the repository, open your terminal and run the following command:\n\n```terminal\n$ git clone https://github.com/hirosystems/hiro-hacks-template.git\n$ cd hiro-hacks-template\n```\n\n## Establishing your core contract\n\nBefore creating your core contract, you need to create `trait` contracts that you'll be implementing for your grants program.\n\nTraits in Clarity define a set of functions that a contract must implement. In this case, any contract that wants to be a `proposal` or an `extension` must implement the functions defined in the `proposal-trait` and `extension-trait` respectively.\n\nIn your project's directory, run the following command:\n\n```terminal\n$ clarinet contract new extension-trait && clarinet contract new proposal-trait\n```\n\nNow in your contracts, respectively, add the following code:\n\n```clarity extension-trait.clar\n(define-trait extension-trait\n (\n (callback (principal (buff 34)) (response bool uint))\n )\n)\n```\n\n```clarity proposal-trait.clar\n(define-trait proposal-trait\n (\n (execute (principal) (response bool uint))\n )\n)\n```\n\nNow that you've defined how your set of functions must be implemented, you can begin to create your core contract. First run the following command:\n\n```terminal\n$ clarinet contract new core\n```\n\nThis will create a new contract in the `contracts` directory called `core.clar`.\n\nInside your `core.clar` contract, add the two trait contracts you've just created from the steps above:\n\n```clarity core.clar\n(use-trait proposal-trait .proposal-trait.proposal-trait)\n(use-trait extension-trait .extension-trait.extension-trait)\n```\n\n## Error handling and state management\n\nNext, you need to define some basic error handling and variables for managing your contracts:\n\n```clarity core.clar\n(define-constant ERR_UNAUTHORIZED (err u1000))\n(define-constant ERR_ALREADY_EXECUTED (err u1001))\n(define-constant ERR_INVALID_EXTENSION (err u1002))\n\n(define-data-var executive principal tx-sender)\n(define-map executedProposals principal uint)\n(define-map extensions principal bool)\n```\n\nThese constants represent error codes that the contract can return. The variables store the executive principal (the owner of the grants program), a map of executed proposals, and a map of authorized extensions.\n\n## Authorization check\n\nThe `is-self-or-extension` function is a private function that checks if the caller of a function is the contract itself or an authorized extension:\n\n```clarity core.clar\n(define-private (is-self-or-extension)\n (ok (asserts! (or (is-eq tx-sender (as-contract tx-sender)) (is-extension contract-caller)) ERR_UNAUTHORIZED))\n)\n\n(define-read-only (is-extension (extension principal))\n (default-to false (map-get? extensions extension))\n)\n\n(define-read-only (executed-at (proposal <proposal-trait>))\n (map-get? executedProposals (contract-of proposal))\n)\n```\n\n## Extension management\n\nHere's a function to enable or disable an extension (`set-extension`):\n\n```clarity core.clar\n(define-public (set-extension (extension principal) (enabled bool))\n (begin\n (try! (is-self-or-extension))\n (print {event: \"extension\", extension: extension, enabled: enabled})\n (ok (map-set extensions extension enabled))\n )\n)\n```\n\n## Proposal execution\n\nThe `execute` function allows for the execution of a proposal:\n\n```clarity core.clar\n(define-public (execute (proposal <proposal-trait>) (sender principal))\n (begin\n (try! (is-self-or-extension))\n (asserts! (map-insert executedProposals (contract-of proposal) block-height) ERR_ALREADY_EXECUTED)\n (print {event: \"execute\", proposal: proposal})\n (as-contract (contract-call? proposal execute sender))\n )\n)\n```\n\nThis function checks if the caller is authorized, inserts the proposal into the `executedProposals` map, and then calls the `execute` function of the proposal contract.\n\n## Bootstrap\n\nThe `construct` function is used to bootstrap the grants program:\n\n```clarity core.clar\n(define-public (construct (proposal <proposal-trait>))\n (let\n (\n (sender tx-sender)\n )\n (asserts! (is-eq sender (var-get executive)) ERR_UNAUTHORIZED)\n (var-set executive (as-contract tx-sender))\n (as-contract (execute proposal sender))\n )\n)\n```\n\nThis function checks if the caller is the executive, sets the executive to the contract itself, and then executes the provided proposal.\n\n## Extension requests\n\nThe request-extension-callback function allows an extension to request a callback:\n\n```clarity core.clar\n(define-public (request-extension-callback (extension <extension-trait>) (memo (buff 34)))\n (let\n (\n (sender tx-sender)\n )\n (asserts! (is-extension contract-caller) ERR_INVALID_EXTENSION)\n (asserts! (is-eq contract-caller (contract-of extension)) ERR_INVALID_EXTENSION)\n (as-contract (contract-call? extension callback sender memo))\n )\n)\n```\n\nThis function checks if the caller is an authorized extension and then calls the `callback` function of the extension contract.\n\nThese are the key components of the ExecutorDAO core contract. Understanding these will help you in building your own extensions and proposals.\n\n## Create your membership token\n\nIn this section, you will create your first `extension`, a non-transferable membership token, which will be used to grant voting rights on proposals. The token will be initially distributed to certain addresses during the bootstrapping process. However, new minting (distribution) and burning (removal) of tokens can be managed through proposals.\n\nTo create your membership token, navigate to your project's directory and run the following command:\n\n```terminal\n$ clarinet contract new membership-token\n```\n\nThis will create a new contract in the contracts directory called `membership-token.clar`.\n\nLet's walk through the key components of this contract.\n\n## Constants and variables\n\nThe contract defines some constants and variables:\n\n```clarity membership-token.clar\n(define-constant ERR_UNAUTHORIZED (err u2000))\n(define-constant ERR_NOT_TOKEN_OWNER (err u2001))\n(define-constant ERR_MEMBERSHIP_LIMIT_REACHED (err u2002))\n\n(define-fungible-token sGrant)\n\n(define-data-var tokenName (string-ascii 32) \"sGrant\")\n(define-data-var tokenSymbol (string-ascii 10) \"SGT\")\n(define-data-var tokenUri (optional (string-utf8 256)) none)\n(define-data-var tokenDecimals uint u6)\n```\n\nThese constants represent error codes that the contract can return. The variables store the token name, symbol, URI, and decimals. The define-fungible-token function is used to define our sGrant token.\n\n## Authorization check\n\nThe `is-dao-or-extension`, function is a private function that checks if the caller of a function is the core contract itself or an authorized extension:\n\n```clarity membership-token.clar\n(define-public (is-dao-or-extension)\n (ok (asserts! (or (is-eq tx-sender .core) (contract-call? .core is-extension contract-caller)) ERR_UNAUTHORIZED))\n)\n```\n\nThis function will allow you to distribute (or burn) tokens to new members, granting them the ability to vote on future grant proposals.\n\n## Token minting and burning\n\nThe contract provides functions to `mint` and `burn` tokens:\n\n```clarity membership-token.clar\n(define-public (mint (amount uint) (recipient principal))\n (begin\n (try! (is-dao-or-extension))\n (ft-mint? sGrant amount recipient)\n )\n)\n\n(define-public (burn (amount uint) (owner principal))\n (begin\n (try! (is-dao-or-extension))\n (ft-burn? sGrant amount owner)\n )\n)\n```\n\nThese functions check if the caller is authorized and then mint or burn the specified amount of sGrant tokens. And as you can see, these functions must be executed either through an approved grant proposal or an enabled `extension` (more on this later).\n\n## Token information\n\nThe contract provides functions to get the token's name (`get-name`), symbol (`get-symbol`), decimals (`get-decimals`), balance (`get-balance`), total supply (`get-total-supply`), and URI (`get-token-uri`):\n\n```clarity membership-token.clar\n(define-read-only (get-name)\n (ok (var-get tokenName))\n)\n\n(define-read-only (get-symbol)\n (ok (var-get tokenSymbol))\n)\n\n(define-read-only (get-decimals)\n (ok (var-get tokenDecimals))\n)\n\n(define-read-only (get-balance (who principal))\n (ok (ft-get-balance sGrant who))\n)\n\n(define-read-only (get-total-supply)\n (ok (ft-get-supply sGrant))\n)\n\n(define-read-only (get-token-uri)\n (ok (var-get tokenUri))\n)\n```\n\nThese functions return the corresponding information about the `sGrant` token.\n\nThese are the key components of the `sGrant` token contract. Understanding these will help you in managing the distribution and burning of tokens through proposals.\n\n## Proposal submission contract (extension)\n\nIn this section, you will create your second `extension`, a proposal submission contract. This contract will allow anyone to propose a grant, which will then be voted on by the token holders.\n\nTo create your proposal submission contract, navigate to your project's directory and run the following command:\n\n```terminal\n$ clarinet contract new proposal-submission\n```\n\nThis will create a new contract in the contracts directory called proposal-submission.clar.\n\nLet's walk through the key components of this contract.\n\n## Traits and constants\n\nFirst, you need to implement the `extension-trait` and use the `proposal-trait`:\n\n```clarity proposal-submission.clar\n(impl-trait .extension-trait.extension-trait)\n(use-trait proposal-trait .proposal-trait.proposal-trait)\n```\n\nNext, define some constants that represent error codes:\n\n```clarity proposal-submission.clar\n(define-constant ERR_UNAUTHORIZED (err u3000))\n(define-constant ERR_UNKNOWN_PARAMETER (err u3001))\n```\n\n## Variables\n\nFirst, define a map to store the parameters of your contract:\n\n```clarity proposal-submission.clar\n(define-map parameters (string-ascii 34) uint)\n```\n\nSet the proposal-duration parameter to a default value. This value represents the duration of a proposal in blocks. For example, if a block is mined approximately every 10 minutes, a proposal-duration of 1440 would be approximately 10 days.\n\n```clarity proposal-submission.clar\n(map-set parameters \"proposal-duration\" u1440) ;; ~10 days based on a ~10 minute block time.\n```\n\n## Authorization check\n\nThe `is-dao-or-extension` function is a private function that checks if the caller of a function is the core contract itself or an authorized extension:\n\n```clarity proposal-submission.clar\n(define-public (is-dao-or-extension)\n (ok (asserts! (or (is-eq tx-sender .core) (contract-call? .core is-extension contract-caller)) ERR_UNAUTHORIZED))\n)\n```\n\n## Parameters\n\nThe get-parameter function is a read-only function that returns the value of a parameter:\n\n```clarity proposal-submission.clar\n(define-read-only (get-parameter (parameter (string-ascii 34)))\n (ok (unwrap! (map-get? parameters parameter) ERR_UNKNOWN_PARAMETER))\n)\n```\n\n## Proposals\n\nThe propose function allows anyone to propose a grant:\n\n```clarity proposal-submission.clar\n(define-public (propose (proposal <proposal-trait>) (title (string-ascii 50)) (description (string-utf8 500)))\n (begin\n (contract-call? .proposal-voting add-proposal\n proposal\n {\n end-block-height: (+ block-height (try! (get-parameter \"proposal-duration\"))),\n proposer: tx-sender,\n title: title,\n description: description\n }\n )\n )\n)\n```\n\nThis function calls the add-proposal function of the proposal-voting contract, passing the proposal contract, the current block height as the start block height, the current block height plus the proposal-duration as the end block height, the sender as the proposer, and the title and description of the proposal.\n\n## Extension callback\n\nThe callback function allows the core contract to request a callback:\n\n```clarity proposal-submission.clar\n(define-public (callback (sender principal) (memo (buff 34)))\n (ok true)\n)\n```\n\nThese are the key components of the proposal submission contract. Understanding these will help you in managing the submission of proposals.\n\n## Proposal voting contract (extension)\n\nIn this section, you will create your third extension, a proposal voting contract. This contract will allow token holders to vote on the proposed grants.\n\nTo create your proposal voting contract, navigate to your project's directory and run the following command:\n\n```terminal\n$ clarinet contract new proposal-voting\n```\n\nThis will create a new contract in the contracts directory called proposal-voting.clar.\n\nLet's walk through the key components of this contract.\n\n## Traits and constants\n\nFirst, you need to implement the extension-trait and use the proposal-trait:\n\n```clarity proposal-voting.clar\n(impl-trait .extension-trait.extension-trait)\n(use-trait proposal-trait .proposal-trait.proposal-trait)\n```\n\nNext, define some constants that represent error codes:\n\n```clarity proposal-voting.clar\n(define-constant ERR_UNAUTHORIZED (err u3000))\n(define-constant ERR_PROPOSAL_ALREADY_EXECUTED (err u3002))\n(define-constant ERR_PROPOSAL_ALREADY_EXISTS (err u3003))\n(define-constant ERR_UNKNOWN_PROPOSAL (err u3004))\n(define-constant ERR_PROPOSAL_ALREADY_CONCLUDED (err u3005))\n(define-constant ERR_PROPOSAL_INACTIVE (err u3006))\n(define-constant ERR_PROPOSAL_NOT_CONCLUDED (err u3007))\n(define-constant ERR_NO_VOTES_TO_RETURN (err u3008))\n(define-constant ERR_END_BLOCK_HEIGHT_NOT_REACHED (err u3009))\n(define-constant ERR_DISABLED (err u3010))\n```\n\n## Variables\n\nYou need to define a map to store the proposals and another map to store the total votes of each member:\n\n```clarity proposal-voting.clar\n(define-map proposals\n principal\n {\n votes-for: uint,\n votes-against: uint,\n end-block-height: uint,\n concluded: bool,\n passed: bool,\n proposer: principal,\n title: (string-ascii 50),\n description: (string-utf8 500)\n }\n)\n\n(define-map member-total-votes {proposal: principal, voter: principal} uint)\n```\n\n## Authorization check\n\nThe `is-dao-or-extension` function is a private function that checks if the caller of a function is the core contract itself or an authorized extension:\n\n```clarity proposal-voting.clar\n(define-public (is-dao-or-extension)\n (ok (asserts! (or (is-eq tx-sender .core) (contract-call? .core is-extension contract-caller)) ERR_UNAUTHORIZED))\n)\n```\n\n## Proposals\n\nThe add-proposal function allows the core contract or an authorized extension to add a new proposal:\n\n```clarity proposal-voting.clar\n(define-public (add-proposal (proposal <proposal-trait>) (data {end-block-height: uint, proposer: principal, title: (string-ascii 50), description: (string-utf8 500)}))\n (begin\n (try! (is-dao-or-extension))\n (asserts! (is-none (contract-call? .core executed-at proposal)) ERR_PROPOSAL_ALREADY_EXECUTED)\n (print {event: \"propose\", proposal: proposal, proposer: tx-sender})\n (ok (asserts! (map-insert proposals (contract-of proposal) (merge {votes-for: u0, votes-against: u0, concluded: false, passed: false} data)) ERR_PROPOSAL_ALREADY_EXISTS))\n )\n)\n```\n\n## Votes\n\nThe vote function allows a token holder to vote on a proposal. It checks if the voter has at least 1 membership-token:\n\n```clarity proposal-voting.clar\n(define-public (vote (amount uint) (for bool) (proposal principal))\n (let\n (\n (proposal-data (unwrap! (map-get? proposals proposal) ERR_UNKNOWN_PROPOSAL))\n )\n (asserts! (>= (unwrap-panic (contract-call? .membership-token get-balance tx-sender)) u1) ERR_UNAUTHORIZED)\n (map-set member-total-votes {proposal: proposal, voter: tx-sender}\n (+ (get-current-total-votes proposal tx-sender) amount)\n )\n (map-set proposals proposal\n (if for\n (merge proposal-data {votes-for: (+ (get votes-for proposal-data) amount)})\n (merge proposal-data {votes-against: (+ (get votes-against proposal-data) amount)})\n )\n )\n (ok (print {event: \"vote\", proposal: proposal, voter: tx-sender, for: for, amount: amount}))\n )\n)\n\n(define-read-only (get-current-total-votes (proposal principal) (voter principal))\n (default-to u0 (map-get? member-total-votes {proposal: proposal, voter: voter}))\n)\n```\n\n## Conclusion\n\nThe `conclude` function allows the core contract or an authorized extension to conclude a proposal:\n\n```clarity proposal-voting.clar\n(define-public (conclude (proposal <proposal-trait>))\n (let\n (\n (proposal-data (unwrap! (map-get? proposals (contract-of proposal)) ERR_UNKNOWN_PROPOSAL))\n (passed (> (get votes-for proposal-data) (get votes-against proposal-data)))\n )\n (asserts! (not (get concluded proposal-data)) ERR_PROPOSAL_ALREADY_CONCLUDED)\n (asserts! (>= block-height (get end-block-height proposal-data)) ERR_END_BLOCK_HEIGHT_NOT_REACHED)\n (map-set proposals (contract-of proposal) (merge proposal-data {concluded: true, passed: passed}))\n (print {event: \"conclude\", proposal: proposal, passed: passed})\n (and passed (try! (contract-call? .core execute proposal tx-sender)))\n (ok passed)\n )\n)\n```\n\nThis function concludes a proposal. It first retrieves the proposal data and checks if the proposal has more votes for than against. It then asserts that the proposal has not already been concluded and that the current block height is greater than or equal to the end block height of the proposal. If these conditions are met, it sets the concluded and passed fields of the proposal data and prints an event. If the proposal passed, it also tries to execute the proposal. The function returns whether the proposal passed.\n\n## Extension callback\n\nThe callback function allows the core contract to request a callback:\n\n```clarity proposal-voting.clar\n(define-public (callback (sender principal) (memo (buff 34)))\n (ok true)\n)\n```\n\nCongratulations! You've successfully created the foundations for a decentralized grants program!\n\n## Challenges\n\nThe following challenges are additional features you can implement to continue building and sharpening your skills.\n\n<HackBadge variant=\"starter\" />\n\n**Initialize your grants program**: Now that you have your core extension contracts, you can initialize the project. The way you do this is through the `construct` function you wrote inside your `core.clar` contract. Create your first proposal enabling your extensions (`membership-token`, `proposal-submission`, `proposal-voting`) and distribute the initial token allocation to addresses responsible for voting on grants. If you need a little more guidance, check out the example [here](https://github.com/MarvinJanssen/executor-dao/blob/main/contracts/proposals/edp000-bootstrap.clar).\n\n<HackBadge variant=\"starter\" />\n\n**Create grant proposals**: After initializing your grants program, the next step is to create grant proposals. This involves using the `propose` function in the `proposal-submission` contract. This function allows anyone to propose a grant, which will then be voted on by the token holders. The proposal includes details such as the title, description, and the proposal contract. Once a proposal is submitted, it can be voted on during the voting period defined by the `proposal-duration` parameter.\n\n<HackBadge variant=\"intermediate\" />\n\n**Implement milestone-based funding**: To implement milestone-based funding, you'll need to create a new extension contract that tracks the progress of each grant proposal. This extension will manage the milestones for each grant, allowing funds to be released as each milestone is achieved. To enable this extension, you'll need to create a proposal using the propose function in the `proposal-submission` contract. Once enabled, the milestone-based funding extension will provide a more structured and accountable way to distribute funds, ensuring that the grant recipients are making progress before they receive their next round of funding.\n\n<HackBadge variant=\"advanced\" />\n\n**UI integration**: Using the provided starter template, integrate your contracts using Stacks.js. This will allow users to submit proposals, vote on them, and view the status of their proposals directly from the UI.\n\n```tsx\nimport { callReadOnlyFunction, standardPrincipalCV } from \"@stacks/transactions\"\n\nconst senderAddress = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\nconst contractAddress = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\nconst contractName = \"core\"\nconst functionName = \"is-extension\"\nconst extensionAddress =\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.membership-token\"\n\nconst functionArgs = [standardPrincipalCV(extensionAddress)]\n\nawait callReadOnlyFunction({\n network,\n contractAddress,\n contractName,\n functionName,\n functionArgs,\n senderAddress\n})\n```\n" + }, + { + "title": "AI x Stacks", + "description": "Build something that combines AI capabilities with Stacks.", + "slug": "/stacks/hacks/archive/ai", + "content": "\n## January: AI x Stacks\n\n*Build something that combines AI capabilities with Stacks blockchain technology*\n\n**Timeline**: January 22-28, 2025\n\nThis month's challenge invites you to explore the intersection of artificial intelligence and blockchain technology. Create innovative solutions that leverage both AI capabilities and the Stacks blockchain.\n\nSubmit your project [here](https://hirohacks25.paperform.co/).\n\n<iframe width=\"770\" height=\"315\" src=\"https://www.youtube.com/embed/GiKRSAMQNqo?si=EQ74OTyTsOzcPIK-\" title=\"YouTube video player\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerPolicy=\"strict-origin-when-cross-origin\" allowFullScreen></iframe>\n\n## Example project ideas\n\n### 1. AI Contract Analyzer\n- Build a tool that uses LLMs to audit and explain [Clarity contracts](/stacks/clarity)\n- Help developers understand and improve their smart contracts through AI-powered analysis\n- Provide suggestions for security improvements and optimizations\n\n### 2. Smart Wallet Assistant \n- Create an AI-powered [wallet](/stacks/stacks.js) that helps users make informed decisions\n- Analyze transaction history and provide personalized insights\n- Offer predictive analytics and spending recommendations\n\n### 3. Chain Detective\n- Develop an AI tool that analyzes on-chain data to discover interesting patterns\n- Use [Chainhook](/stacks/chainhook) to stream and analyze blockchain events in real-time\n- Generate visualizations and reports of blockchain activity\n\n_Review the [submission guidelines](/stacks/hacks/#rules) for project requirements and join the [Stacks Discord](https://stacks.chat) to connect with other builders._\n\n---\n\n## Resources\n\n- [Clarity Codex](https://github.com/leahjlou/clarity-codex/)\n- [Stacks Discord](https://stacks.chat)" + }, + { + "title": "Build a Friend.tech clone", + "description": "Learn how to build a decentralized social network.", + "slug": "/stacks/hacks/archive/build-a-friend-tech-clone", + "content": "\nimport { HackBadge } from \"@/components/badge\";\n\n<Callout title=\"Inactive\" type=\"warn\">\nThis hack has been archived. Feel free to continue to use the code in this guide as a reference for your own projects.\n</Callout>\n\n## Introduction\n\nWhat if we could gamify—and reward—being a friend? That's the idea behind Friend.tech, the decentralized social network that took Web3 by storm. In this hack, you'll recreate Friend.tech on the Stacks blockchain.\n\nThere are a few key components to this hack: namely, **subjects** that have **keys** that anyone can buy. These keys start off low in price, but as people buy more keys, the price goes up faster and faster, rewarding friends who bought keys early. Key owners can sell their keys for a profit, or they can hold on to them to signal their friendship and build reputation. These keys can also be used to access exclusive chatrooms with their corresponding subject, receive exclusive airdrops, and more\n\nThis Hack walks you through the basics of building a Friend.tech clone. There are also challenges at the end, which are opportunities to stretch your skills and keep learning.\n\n## Clone the starter template\n\nStart by setting up your development environment. We've prepared a repository that includes an initialized Clarinet project and a React frontend with some boilerplate code and all the required packages.\n\nTo clone the repository, open your terminal and run the following command:\n\n```terminal\n$ git clone https://github.com/hirosystems/hiro-hacks-template.git\n$ cd hiro-hacks-template\n```\n\n## Create your contract\n\nBefore you begin, we're assuming that you have `clarinet` installed and a basic understanding of how to use it. If you haven't installed `clarinet` yet, you can do so by referring to our [installation guide](/stacks/clarinet/installation).\n\nTo create your contract, navigate to your project's directory and run the following command:\n\n```terminal\n$ clarinet contract new keys\n```\n\nThis will create a new contract in the `contracts` directory called `keys.clar`.\n\n<Callout type=\"info\">\n If you don't want to clone the provided starter template, you can create your\n `Clarinet` project manually by running `clarinet new friendtech && cd\n friendtech`.\n</Callout>\n\n## Defining `key` balances and supply\n\nInside your `keys.clar` contract, you need to keep track of the balance of `keys` for each user (or _holder_) and the total supply of `keys` for each subject. You can do this using Clarity's `define-map` function:\n\n```clarity keys.clar\n(define-map keysBalance { subject: principal, holder: principal } uint)\n(define-map keysSupply { subject: principal } uint)\n```\n\nThe `keysBalance` stores each holder's `key` balance for a given subject and the `keysSupply` stores the total supply for each subject. These maps will be used in your contract's functions to manage the creation, buying, and selling of `keys`.\n\n## Calculating `key` prices\n\nThe next thing you need to do is define a function that calculates the price of `keys` for a given a `supply` and `amount`. You can do this by defining a `get-price` function:\n\n```clarity keys.clar\n(define-read-only (get-price (supply uint) (amount uint))\n (let (\n (base-price u10) ;; Base price per key in micro-STX\n (price-change-factor u100) ;; Factor to control the rate of price change\n )\n ;; Average price per token over the range of supply\n (/\n (+\n (* base-price amount)\n (* amount (/ (+ (* supply supply) (* supply amount) (* amount amount)) (* u3 price-change-factor)))\n )\n amount\n )\n))\n```\n\nThe `get-price` function calculates the price of `keys` using a formula that calculates the average price per token over the range of supply affected. This can be done by integrating the price function over the range of supply and dividing by the amount.\n\n## Creating, buying, and selling `keys`\n\nThese functions form the core of the contract's operations, enabling users to manage keys through buying and selling.\n\nLet's first take a look at the `buy-keys` function:\n\n```clarity keys.clar\n(define-public (buy-keys (subject principal) (amount uint))\n (let\n (\n (supply (default-to u0 (map-get? keysSupply { subject: subject })))\n (price (get-price supply amount))\n )\n (if (or (> supply u0) (is-eq tx-sender subject))\n (begin\n (match (stx-transfer? price tx-sender (as-contract tx-sender))\n success\n (begin\n (map-set keysBalance { subject: subject, holder: tx-sender }\n (+ (default-to u0 (map-get? keysBalance { subject: subject, holder: tx-sender })) amount)\n )\n (map-set keysSupply { subject: subject } (+ supply amount))\n (ok true)\n )\n error\n (err u2)\n )\n )\n (err u1)\n )\n )\n)\n```\n\nThis function allows subjects to create their first `keys`, initiating their supply in the contract. The transaction only succeeds if the _subject_ is creating the initial `keys` or if there are already `keys` in circulation, ie `principal-a` cannot buy the initial `keys` for `principal-b`.\n\nNext up, the `sell-keys` function:\n\n```clarity keys.clar\n(define-public (sell-keys (subject principal) (amount uint))\n (let\n (\n (balance (default-to u0 (map-get? keysBalance { subject: subject, holder: tx-sender })))\n (supply (default-to u0 (map-get? keysSupply { subject: subject })))\n (price (get-price (- supply amount) amount))\n (recipient tx-sender)\n )\n (if (and (>= balance amount) (or (> supply u0) (is-eq tx-sender subject)))\n (begin\n (match (as-contract (stx-transfer? price tx-sender recipient))\n success\n (begin\n (map-set keysBalance { subject: subject, holder: tx-sender } (- balance amount))\n (map-set keysSupply { subject: subject } (- supply amount))\n (ok true)\n )\n error\n (err u2)\n )\n )\n (err u1)\n )\n )\n)\n```\n\nThis is more or less the same logic as the `buy-keys` function, but instead you deduct the `keysBalance` and `keysSupply` and check if the seller owns enough keys and if they are authorized to sell.\n\n## Verifying keyholders\n\nNow that you have the ability to buy and sell `keys`, you need a way to verify if a user is a keyholder. You can do this by defining an `is-keyholder` read-only function:\n\n```clarity keys.clar\n(define-read-only (is-keyholder (subject principal) (holder principal))\n (>= (default-to u0 (map-get? keysBalance { subject: subject, holder: holder })) u1)\n)\n```\n\nThis function checks if the `keysBalance` for a given `subject` and `holder` is greater than or equal to 1. If it is, then the user `is-keyholder`.\n\n## Testing locally\n\nMake sure your contract is valid and doesn't have any errors. To do this, run the following command:\n\n```terminal\n$ clarinet check\n```\n\nNext, check some of your contract functionality inside `clarinet console`:\n\n```clarity keys.clar\n;; Get the price of 100 keys when the supply is 0\n(contract-call? .keys get-price u0 u100) ;; u10010\n\n;; Initial purchase of keys\n(contract-call? .keys buy-keys tx-sender u100)\n\n;; Check if the sender is a keyholder\n(contract-call? .keys is-keyholder tx-sender tx-sender) ;; true\n\n(contract-call? .keys is-keyholder tx-sender 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5) ;; false\n```\n\nCongratulations! You've successfully created your contract. You've laid the groundwork for a decentralized social network, just like Friend.tech.\n\n## Challenges\n\nThe following challenges are additional features you can implement to keep learning and building on Stacks.\n\n<HackBadge variant=\"starter\" />\n\n**Balance and supply query functions**: Add two new read-only functions: `get-keys-balance` and `get-keys-supply`. These functions will provide valuable information to users about the distribution and availability of `keys`, and can be used in various parts of your application to display this information to users.\n\n```clarity keys.clar\n(define-read-only (get-keys-balance (subject principal) (holder principal))\n ;; Return the keysBalance for the given subject and holder\n)\n\n(define-read-only (get-keys-supply (subject principal))\n ;; Return the keysSupply for the given subject\n)\n```\n\n<HackBadge variant=\"starter\" />\n\n**Price query functions**: Add two new read-only functions: `get-buy-price` and `get-sell-price`. These helper functions will allow users to query the current price for buying or selling a specific amount of `keys` for a given `subject`.\n\n```clarity keys.clar\n(define-read-only (get-buy-price (subject principal) (amount uint))\n ;; Implement buy price logic\n)\n\n(define-read-only (get-sell-price (subject principal) (amount uint))\n ;; Implement sell price logic\n)\n```\n\n<HackBadge variant=\"intermediate\" />\n\n**Fee management**: When a user buys or sells `keys`, you might want to introduce a fee, either at the protocol or subject level that can be distributed accordingly. Add a `protocolFeePercent` and/or `subjectFeePercent` variable, as well as a destination Stacks principal `protocolFeeDestination` for this new revenue. Now make sure to update the `buy-keys` and `sell-keys` functions to incorporate these fees and `stx-transfer?` into the buying and selling logic.\n\n```clarity keys.clar\n;; Change the fee values as you wish\n(define-data-var protocolFeePercent uint u200) ;; or subjectFeePercent\n(define-data-var protocolFeeDestination principal tx-sender)\n```\n\n<HackBadge variant=\"intermediate\" />\n\n**Access control**: In a real-world application, you might need to adjust the `protocolFeePercent`, `subjectFeePercent`, or `protocolFeeDestination` values over time. However, you wouldn't want just anyone to be able to make these changes. This is where access control comes in. Specifically, you should add a set-fee function (or functions) that allows only a designated `contractOwner` to change the `protocolFeePercent`, `subjectFeePercent`, or `protocolFeeDestination` values.\n\n```clarity keys.clar\n(define-public (set-protocol-fee-percent (feePercent uint))\n ;; Check if the caller is the contractOwner\n ;; Update the protocolFeePercent value\n)\n```\n\nThink about how you can verify whether the caller of the function is indeed the `contractOwner`. Also, consider what kind of feedback the function should give when someone else tries to call it. Test your implementation to ensure it works as expected.\n\n<HackBadge variant=\"intermediate\" />\n\n**UI integration**: Using the provided [starter template](#clone-the-starter-template), integrate your contract using [Stacks.js](/stacks/stacks.js). For example, if you were calling the `is-keyholder` function, your code might look something like this:\n\n```tsx\nimport { callReadOnlyFunction, standardPrincipalCV } from \"@stacks/transactions\"\n\nconst senderAddress = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\nconst contractAddress = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\nconst contractName = \"keys\"\nconst functionName = \"is-keyholder\"\n\nconst functionArgs = [standardPrincipalCV(senderAddress)]\n\nawait callReadOnlyFunction({\n network,\n contractAddress,\n contractName,\n functionName,\n functionArgs,\n senderAddress\n})\n```\n\nBy using a similar pattern to the code above, you will be able to **show/hide chatrooms based on keyholdings**, **create an exchange for buying/selling keys**, or **add a search for displaying subject keyholdings**.\n\n> _**Note**_\n>\n> If you are planning to experiment with your contract on `devnet`, make sure to run `clarinet devnet start` [to deploy and test your contract locally](/stacks/clarinet/guides/run-a-local-devnet). You can then use the `devnet` network when calling your contract in the [Leather wallet](https://leather.io/install-extension).\n\n<HackBadge variant=\"advanced\" />\n\n**Message signature**: To further enhance the security and authenticity of your app, try to implemement a _login_ feature using [message signing](/stacks/connect/guides/sign-messages).\n\n```tsx\nimport { openSignatureRequestPopup } from \"@stacks/connect\"\nimport { verifyMessageSignatureRsv } from \"@stacks/encryption\"\nimport { StacksMocknet } from \"@stacks/network\"\nimport { getAddressFromPublicKey } from \"@stacks/transactions\"\n\nconst message = \"Log in to chatroom\"\nconst network = new StacksMocknet()\n\nopenSignatureRequestPopup({\n message,\n network,\n onFinish: async ({ publicKey, signature }) => {\n const verified = verifyMessageSignatureRsv({\n message,\n publicKey,\n signature\n })\n if (verified) {\n // The signature is verified, so now we can check if the user is a keyholder\n const address = getAddressFromPublicKey(publicKey, network.version)\n const isKeyHolder = await checkIsKeyHolder(address)\n if (isKeyHolder) {\n // The user is a keyholder, so they are authorized to access the chatroom\n }\n }\n }\n})\n```\n\nThe signed message will serve as a _proof of identity_ - similar to a login, verifying that the user is indeed who they claim to be. This can be particularly useful in a chatroom setting, where only `is-keyholder` users are allowed to send messages.\n" + }, + { + "title": "Create a recipe for the Hiro Cookbook", + "description": "Create your own recipe for the Hiro Cookbook and share it with the community.", + "slug": "/stacks/hacks/recipes", + "content": "\n## February: Create your own recipe for the Hiro Cookbook\n\n*Create your own recipe that you think will help other developers build on Stacks*\n\n**Timeline**: February 19-25, 2025\n\nThis month's challenge invites you to create your own recipe for the [Hiro Cookbook](/cookbook) and share it with the community. Each recipe is a reusable code snippet that handles some specific function, and each recipe has written annotations, so readers know exactly how the code in a given recipe works and what parameters you can customize. Your submission should be a recipe that you think will help other developers build on Stacks.\n\nSubmit your project [here](https://hirohacks25.paperform.co/).\n\n<iframe width=\"770\" height=\"315\" src=\"https://www.youtube.com/embed/z9ULVhygKCE\" title=\"Hiro Hacks: Cookbook\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerPolicy=\"strict-origin-when-cross-origin\" allowFullScreen></iframe>\n\n## Some example recipe ideas to explore\n\n- Using the `Cl` parse helper function to convert string values into Clarity Values\n- Creating and signing a message for smart contract verification\n- How to construct a non-sequential multisig transaction\n- Create a helper function to determine if a transaction has been signed\n\n_For this month's submission, provide a link to your recipe in a PR to the [Recipes](https://github.com/hirosystems/recipes) repo. To review the general submission guidelines, see the [Hiro Hacks](/stacks/hacks) page._\n\n---\n\n## Resources\n\n- [Hiro Cookbook](/cookbook)\n- [Recipes repo](https://github.com/hirosystems/recipes)\n- [Submission form](https://hirohacks25.paperform.co/)\n- [Stacks Discord](https://stacks.chat)\n" + }, + { + "title": "Overview", + "description": "A series of coding challenges to sharpen your skills.", + "slug": "/stacks/hacks/index", + "content": "\nimport { Code } from 'lucide-react';\nimport { SecondaryCard } from '@/components/card';\n\nHiro Hacks are monthly hackathons designed to bring together the most innovative builders in the Stacks ecosystem. Each month features a unique theme, challenging you to stretch your creativity, show off your skills, and learn from other devs in the process.\n\nHave fun. Build something new. Compete against other devs for Hiro swag and your seat in a [hacker house](#prizes) coming later this year.\n\nTo submit your projects each month, [complete this form](https://hirohacks25.paperform.co/) before midnight ET on the last day of that month's hack.\n\n## Schedule\n\n| Week | Theme | Description |\n| --- | --- | --- |\n| Jan 22-28 | [AI x Stacks](/stacks/hacks/archive/ai) | Build something that combines AI capabilities with Stacks. |\n| Feb 19-25 | [Create your own recipe](/stacks/hacks/recipes) | Create your own recipe for the Hiro Cookbook and share it with the community. |\n| Mar 19-25 | TBA | Coming soon |\n| Apr 23-29 | TBA | Coming soon |\n| May 21-27 | TBA | Coming soon |\n| Jun 18-24 | TBA | Coming soon |\n| ??? | ??? | ??? |\n\n## Prizes\n\nAt the end of each monthly hack, Hiro will host a livestream on X going over submissions and announcing that month's winning developer. The prize? Fame, glory and Hiro swag.\n\nTop developers from these monthly hacks will be invited to participate in a Hiro hacker house tied to one of the year's biggest conferences, key expenses covered. We'll share more details on that house soon, so stay tuned.\n\n## Resources\n\nNeed help hacking on your project? [Join the Stacks Discord](https://stacks.chat) and get help from other devs in the #builder-general channel. If you're having problems using Hiro tools, you can also reach out to our team in the relevant tool channel in the Hiro Developer Tools section.\n\nAnd don't forget to take advantage of all of the resources in our docs as well as [Stacks docs](https://docs.stacks.co/).\n\n## Rules\n\nTo be eligible for swag and the hacker house, you must submit your project through [this paperform](https://hirohacks25.paperform.co/) before midnight ET on the last day of that month's hack.\n\nIn that submission, we expect to see:\n\n- A link to your project (if applicable)\n- A link to your code with a clear README (or link to a PR if submitting a recipe)\n- A description that covers the problem being solved, the technical approach, and future improvements for the project\n\nIn terms of selecting winners, submissions will be evaluated on their technical implementation, their innovation/creativity, and their documentation/presentation. To learn more about the rules, read [Hiro Hacks Terms & Conditions](https://www.hiro.so/hiro-hacks-rules).\n" + }, + { + "title": "Overview", + "description": "Explore and verify data on the Stacks blockchain.", + "slug": "/stacks/explorer/index", + "content": "\nimport Link from \"next/link\";\nimport { Button } from \"@/components/ui/button\"\n\nThe Stacks Explorer lets you explore on-chain data, troubleshoot pending transactions, edit and deploy contracts via the sandbox, discover new tokens, and more. We maintain and support the [Stacks Explorer](https://explorer.hiro.so) as a service for the community, but you can also run your own instance of the explorer.\n\n<div className=\"flex gap-4\">\n <Button className=\"bg-orange-500 hover:bg-orange-600\">\n <a href=\"https://explorer.hiro.so\" target=\"_blank\" className=\"no-underline\">\n View Stacks Explorer\n </a>\n </Button>\n {/* <Button variant=\"outline\">\n <Link\n href=\"/stacks/explorer/guides/build-explorer\"\n className=\"no-underline\"\n >\n Set up your own explorer\n </Link>\n </Button> */}\n</div>\n\n## Related tools\n\n- **[Stacks Blockchain API](/stacks/api)**: Looking for on-chain data without the front end? Leverage the Stacks Blockchain API.\n- **[Ordinals Explorer](/bitcoin/explorer)**: Explore Bitcoin Ordinals and BRC-20 tokens via the Ordinals Explorer.\n\n---\n\nNeed help building with Stacks Explorer? Reach out to us on the `#stacks-explorer` channel on Discord under the [Hiro Developer Tools section](https://stacks.chat/). There’s also a [weekly office hours](https://events.stacks.co/event/HD16484710) on Discord every Thursday at 11am ET.\n" + }, + { + "title": "Build a Stacks Explorer", + "description": "Run a local instance of the Stacks Explorer.", + "slug": "/stacks/explorer/guides/build-explorer", + "content": "\nThe Stacks Explorer frontend user interface is built with [React](https://reactjs.org/), [next.js](https://github.com/vercel/next.js) and [@stacks/ui](https://github.com/hirosystems/ui).\n\nBefore you can run the explorer on your machine locally, you must first clone the [Stacks Explorer](https://github.com/hirosystems/explorer) repository to obtain all of the necessary files and libraries needed.\n\n# Project dependencies\n\nOnce you have cloned the Stacks Explorer repositories, you will need to install the following project dependencies:\n\n- [NodeJS](https://nodejs.dev/en/) that includes `npm`\n- [PNPM](https://pnpm.io/installation/)\n- [Homebrew](https://brew.sh/)\n\n> **_NOTE:_**\n>\n> Although Homebrew is not required to install and operate the Stacks Explorer, it is highly recommended.\n\nOpen your terminal window, and make sure you are in the `/explorer` folder. Run the below command to install the dependencies:\n\n`pnpm i`\n\nAfter installing and configuring your environment, you can run the Stacks Explorer locally if you wish by running the following command:\n\n`pnpm dev`\n\n## Building for production\n\nYou may also build a production version of the Stacks Explorer. To do that, simply run the following command:\n\n`pnpm build`\n\n> **NOTE:**\n>\n> Running `pnpm build` also run the default next.js build task.\n" + }, + { + "title": "Bit manipulation", + "description": "Using bit manipulation for compact data storage and flags in Clarity smart contracts.", + "slug": "/stacks/clarity/bit-manipulation", + "content": "\nBit manipulation functions in Clarity provide powerful tools for efficient data storage and flag management in smart contracts. These functions allow developers to pack multiple pieces of information into a single integer, saving storage space and potentially reducing gas costs.\n\n## Why these functions matter\n\nClarity's bit manipulation functions are designed with several important considerations in mind:\n\n1. Efficiency: They allow for compact data storage, potentially reducing contract storage costs.\n2. Versatility: These functions enable the implementation of bitfields, flags, and other low-level data structures.\n3. Performance: Bit operations are generally faster than higher-level data manipulations.\n4. Interoperability: They facilitate working with data from other systems that use bitwise representations.\n\n## Core Bit Manipulation Functions\n\n### 1. bit-and\n\n**What**: Performs a bitwise AND operation on two or more integers.\n**Why**: Useful for checking if specific bits are set or for clearing certain bits.\n**When**: Use when you need to isolate specific bits or apply a bitmask.\n**How**: \n```clarity\n(bit-and i1 i2...)\n```\n\n**Best Practices**: \n- Use to check if a specific flag is set in a bitfield.\n- Combine with bit-or for more complex flag manipulations.\n\n**Example Use Case**: Checking if a user has a specific permission in a compact permission system.\n\n```clarity\n(define-constant PERMISSION_READ u1) ;; 0001\n(define-constant PERMISSION_WRITE u2) ;; 0010\n(define-constant PERMISSION_EXEC u4) ;; 0100\n\n(define-public (has-permission? (user-permissions uint) (required-permission uint))\n (is-eq (bit-and user-permissions required-permission) required-permission))\n\n;; Usage\n(has-permission? u3 PERMISSION_READ) ;; Returns true (3 & 1 == 1)\n(has-permission? u3 PERMISSION_EXEC) ;; Returns false (3 & 4 == 0)\n```\n\n### 2. bit-or\n\n**What**: Performs a bitwise OR operation on two or more integers.\n**Why**: Useful for setting specific bits or combining flags.\n**When**: Use when you need to add flags or set specific bits.\n**How**: \n```clarity\n(bit-or i1 i2...)\n```\n\n**Best Practices**: \n- Use to add new permissions or flags to an existing set.\n- Combine with bit-and for more complex flag manipulations.\n\n**Example Use Case**: Adding a new permission to a user's existing permissions.\n\n```clarity\n(define-public (add-permission (current-permissions uint) (new-permission uint))\n (ok (bit-or current-permissions new-permission)))\n\n;; Usage\n(add-permission u3 PERMISSION_EXEC) ;; Returns (ok u7)\n```\n\n### 3. bit-not\n\n**What**: Performs a bitwise NOT operation on an integer.\n**Why**: Useful for inverting all bits in a value.\n**When**: Use when you need to flip all bits or create a bitmask.\n**How**: \n```clarity\n(bit-not i1)\n```\n\n**Best Practices**: \n- Use carefully with signed integers, as it affects the sign bit.\n- Combine with bit-and to clear specific bits.\n\n**Example Use Case**: Creating a bitmask to clear specific permissions.\n\n```clarity\n(define-public (remove-permission (current-permissions uint) (permission-to-remove uint))\n (ok (bit-and current-permissions (bit-not permission-to-remove))))\n\n;; Usage\n(remove-permission u7 PERMISSION_WRITE) ;; Returns (ok u5)\n```\n\n## Practical Example: Compact User Profile Flags\n\nLet's implement a system that stores multiple user profile settings in a single integer using bit flags:\n\n```clarity\n(define-constant SETTING_NEWSLETTER u1) ;; 0001\n(define-constant SETTING_2FA u2) ;; 0010\n(define-constant SETTING_PRIVATE_PROFILE u4) ;; 0100\n(define-constant SETTING_DARK_MODE u8) ;; 1000\n\n(define-map user-settings principal uint)\n\n(define-public (update-setting (setting uint) (enabled bool))\n (let ((current-settings (default-to u0 (map-get? user-settings tx-sender))))\n (if enabled\n (map-set user-settings tx-sender (bit-or current-settings setting))\n (map-set user-settings tx-sender (bit-and current-settings (bit-not setting))))\n (ok true)))\n\n(define-read-only (has-setting? (user principal) (setting uint))\n (let ((user-settings (default-to u0 (map-get? user-settings user))))\n (is-eq (bit-and user-settings setting) setting)))\n\n(define-read-only (get-all-settings (user principal))\n (default-to u0 (map-get? user-settings user)))\n```\n\nThis example demonstrates:\n1. Using bit constants to define individual settings.\n2. Updating settings using bit-or to set flags and bit-and with bit-not to clear flags.\n3. Checking individual settings with bit-and.\n4. Storing all user settings compactly in a single uint.\n\n## Conclusion\n\nBit manipulation functions in Clarity provide powerful tools for efficient data storage and flag management in smart contracts. By understanding when and how to use these functions, developers can create more storage-efficient contracts and implement complex flag systems with ease. Always consider the trade-off between storage efficiency and code readability when using these techniques.\n" + }, + { + "title": "Basic arithmetic", + "description": "Brief overview of arithmetic operations in Clarity and their importance in smart contract development.", + "slug": "/stacks/clarity/basic-arithmetic", + "content": "\nSmart contracts often need to perform calculations, whether it's for token balances, voting weights, or complex financial operations. Understanding Clarity's arithmetic functions is crucial for implementing these features efficiently and securely.\n\n## Why these functions matter\nClarity's arithmetic functions are designed with blockchain-specific considerations in mind:\n\n1. Overflow protection: Unlike some languages, Clarity prevents integer overflow by default, enhancing contract security.\n2. Precision: Clarity uses 128-bit integers, allowing for high-precision calculations crucial in financial applications.\n3. Determinism: The behavior of these functions is consistent across all nodes, ensuring blockchain consensus.\n\n## Core functions\n\n### 1. Addition (+)\n\n**What**: Adds two or more integers.\n\n**Why**: Essential for calculations involving cumulative values.\n\n**When**: Use when you need to increase values, combine quantities, or perform any additive calculation.\n\n**Best practices**: \n- Consider overflow protection\n- Use with uint for non-negative values like token amounts\n\n**Example use case**: Calculating total rewards in a stacking system.\n\n```clarity\n(define-map StackingRewards principal uint)\n\n(define-public (add-stacking-reward (stacker principal) (newReward uint))\n (let\n (\n (currentRewards (default-to u0 (map-get? StackingRewards stacker)))\n )\n (map-set StackingRewards stacker (+ currentRewards newReward))\n (ok true)\n )\n)\n```\n\n### 2. Subtraction (-)\n\n**What**: Subtracts integers from the first argument.\n\n**Why**: Crucial for calculations involving decreasing values or finding differences.\n\n**When**: Use when you need to decrease values, calculate differences, or perform any subtractive operation.\n\n**Best practices**: \n- Guard against underflow\n- Consider using uint for values that shouldn't go negative\n\n**Example use case**: Updating user points in a rewards system.\n\n```clarity\n(define-map UserPoints principal uint)\n\n(define-public (deduct-points (amount uint))\n (let\n (\n (currentPoints (default-to u0 (map-get? UserPoints tx-sender)))\n )\n (asserts! (>= currentPoints amount) (err u1))\n (map-set UserPoints tx-sender (- currentPoints amount))\n (ok true)\n )\n)\n\n(define-read-only (get-points (user principal))\n (default-to u0 (map-get? UserPoints user))\n)\n```\n\n### 3. Multiplication (*)\n\n**What**: Multiplies two or more integers.\n\n**Why**: Important for calculations involving scaling, rates, or proportions.\n\n**When**: Use when you need to scale values, calculate rates, or perform any multiplicative operation.\n\n**Best practices**: \n- Consider overflow protection\n- Use with uint for non-negative values like token amounts\n\n**Example use case**: Calculating rewards based on stacking amount and duration.\n\n```clarity\n(define-public (calculate-rewards (amount uint) (days uint))\n (let\n (\n (rewardRate u10) ;; 10 tokens per day per 1000 stacked\n (rewards (* amount days rewardRate))\n )\n (ok (/ rewards u1000))\n )\n)\n```\n\n### 4. Division (/)\n\n**What**: Performs integer division.\n\n**Why**: Crucial for calculations involving rates, proportions, or sharing.\n\n**When**: Use when you need to divide values, calculate rates, or perform any division operation.\n\n**Best practices**: \n- Guard against division by zero\n- Consider using uint for non-negative values like token amounts\n\n**Example use case**: Calculating price per item when buying in bulk.\n\n```clarity\n(define-read-only (calculate-price-per-item (totalPrice uint) (itemCount uint))\n (if (> itemCount u0)\n (ok (/ totalPrice itemCount))\n (err u0)\n )\n)\n```\n\n## Best practices and considerations\n\n1. **Order of operations**: Clarity doesn't have operator precedence. Use parentheses to explicitly define the order of operations.\n\n2. **Handling remainders**: When using division, consider how to handle remainders. You might need to use combination of division and modulo.\n\n3. **Scaling for precision**: When dealing with percentages or fractions, consider scaling up your numbers to maintain precision.\n\n4. **Guarding against division by zero**: Always check for zero before performing division to avoid runtime errors.\n\n5. **Using uint vs int**: Choose `uint` for values that can't be negative (like token amounts) and `int` when negative values are possible.\n\n## Practical example: simple interest calculator\n\nLet's combine these functions to create a simple interest calculator:\n\n```clarity\n(define-public (calculate-interest (principal uint) (rate uint) (time uint))\n (let (\n (scaled-rate (/ rate u100)) ;; Convert percentage to decimal\n (interest (/ (* principal scaled-rate time) u365)) ;; Simple interest formula\n )\n (ok interest))\n)\n\n;; Usage: calculate interest for 1000 tokens at 5% APR for 30 days\n(calculate-interest u1000 u5 u30)\n```\n\nThis example demonstrates how to combine multiple arithmetic operations while handling precision (scaling the rate) and using integer division appropriately.\n\n## Conclusion\n\nMastering Clarity's arithmetic functions is essential for building robust smart contracts. By understanding these operations and their nuances, you can implement complex financial logic, manage token economics, and create secure, efficient blockchain applications.\n" + }, + { + "title": "Introduction", + "description": "Explore and master Clarity's built-in functions for smart contract development.", + "slug": "/stacks/clarity/index", + "content": "\nimport { Code } from 'lucide-react';\nimport { SecondaryCard } from '@/components/card';\n\n<Callout title=\"New series\" type=\"info\">\nWe're introducing a new series of guides that explore Clarity functions in depth, focusing on their practical applications in blockchain development.\n</Callout>\n\nEach page in this section covers one or more related Clarity functions, explaining their purpose, demonstrating implementation with code samples, and discussing best practices. Ready to enhance your Clarity smart contract development skills?\n\n## Explore guides\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/clarity/basic-arithmetic\"\n title=\"Arithmetic operations\"\n description=\"Master basic and advanced arithmetic functions for precise calculations in smart contracts.\"\n />\n <SecondaryCard\n href=\"/stacks/clarity/access-control\"\n title=\"Access control\"\n description=\"Manage permissions and control access for smart contracts.\"\n />\n <SecondaryCard\n href=\"/stacks/clarity/handling-optionals-and-errors\"\n title=\"Handling optionals and errors\"\n description=\"Safely handling optional values and error cases in Clarity smart contracts.\"\n />\n</Cards>\n\nNeed help or have questions? Join the discussion in the [#clarity channel](https://stacks.chat) on Discord and connect with other Clarity developers.\n" + }, + { + "title": "Map functions", + "description": "Optimizing storage and retrieval with map functions in Clarity.", + "slug": "/stacks/clarity/optimizations", + "content": "\nMap functions in Clarity provide powerful tools for efficient data storage and retrieval in smart contracts. These functions allow developers to create key-value stores that can be used to maintain complex state in a gas-efficient manner.\n\n## Why these functions matter\n\nClarity's map functions are designed with blockchain-specific considerations in mind:\n\n1. Efficiency: Maps provide O(1) lookup time, making them ideal for storing and retrieving data in smart contracts.\n2. Flexibility: They allow for complex data structures to be stored and accessed easily.\n3. Gas Optimization: Using maps can significantly reduce gas costs compared to other data storage methods.\n4. State Management: Maps are crucial for maintaining contract state across multiple transactions.\n5. Scalability: They enable contracts to handle large amounts of data without significant performance degradation.\n\n## Core Map Functions\n\n### 1. define-map\n\n**What**: Defines a new map with a specified key and value type.\n**Why**: Essential for creating structured data storage in your contract.\n**When**: Use when you need to store and retrieve data associated with unique keys.\n**How**: \n```clarity\n(define-map map-name {key-type} {value-type})\n```\n\n**Best Practices**: \n- Choose appropriate key and value types to represent your data efficiently.\n- Consider using composite keys (tuples) for more complex data relationships.\n\n**Example Use Case**: Creating a user balance tracker.\n\n```clarity\n(define-map user-balances principal uint)\n```\n\n### 2. map-set\n\n**What**: Sets the value for a given key in the map.\n**Why**: Allows updating or inserting data into the map.\n**When**: Use when you need to store or update a value associated with a key.\n**How**: \n```clarity\n(map-set map-name key value)\n```\n\n**Best Practices**: \n- Always check if the key exists before updating to avoid unintended overwrites.\n- Use in conjunction with appropriate access controls.\n\n**Example Use Case**: Updating a user's balance.\n\n```clarity\n(define-public (update-balance (user principal) (new-balance uint))\n (begin\n (asserts! (is-eq tx-sender user) (err u1))\n (ok (map-set user-balances user new-balance))))\n```\n\n### 3. map-get?\n\n**What**: Retrieves the value associated with a given key in the map.\n**Why**: Allows reading data from the map efficiently.\n**When**: Use when you need to retrieve stored data based on a key.\n**How**: \n```clarity\n(map-get? map-name key)\n```\n\n**Best Practices**: \n- Always handle the case where the key might not exist (returns none).\n- Use `unwrap!` or `unwrap-panic` when you're certain the key exists.\n\n**Example Use Case**: Retrieving a user's balance.\n\n```clarity\n(define-read-only (get-balance (user principal))\n (default-to u0 (map-get? user-balances user)))\n```\n\n### 4. map-delete\n\n**What**: Removes the entry for a given key from the map.\n**Why**: Allows removing data from the map when it's no longer needed.\n**When**: Use when you need to delete stored data associated with a key.\n**How**: \n```clarity\n(map-delete map-name key)\n```\n\n**Best Practices**: \n- Be cautious when deleting data, as it can't be recovered once deleted.\n- Consider using a \"soft delete\" approach for data that might need to be referenced later.\n\n**Example Use Case**: Removing a user's account.\n\n```clarity\n(define-public (delete-account (user principal))\n (begin\n (asserts! (is-eq tx-sender user) (err u1))\n (ok (map-delete user-balances user))))\n```\n\n## Practical Example: Simple Voting System\n\nLet's implement a basic voting system using map functions to demonstrate their practical use:\n\n```clarity\n;; Define maps for votes and voter registration\n(define-map votes { proposal: uint } { yes: uint, no: uint })\n(define-map voters principal bool)\n\n;; Function to register a voter\n(define-public (register-voter)\n (ok (map-set voters tx-sender true)))\n\n;; Function to cast a vote\n(define-public (cast-vote (proposal uint) (vote bool))\n (let ((proposal-votes (default-to { yes: u0, no: u0 } (map-get? votes { proposal: proposal }))))\n (asserts! (is-some (map-get? voters tx-sender)) (err u1))\n (asserts! (is-none (map-get? votes { proposal: proposal })) (err u2))\n (if vote\n (map-set votes { proposal: proposal } \n (merge proposal-votes { yes: (+ (get yes proposal-votes) u1) }))\n (map-set votes { proposal: proposal } \n (merge proposal-votes { no: (+ (get no proposal-votes) u1) })))\n (ok true)))\n\n;; Function to get vote count\n(define-read-only (get-votes (proposal uint))\n (default-to { yes: u0, no: u0 } (map-get? votes { proposal: proposal })))\n```\n\nThis example demonstrates:\n1. Using `define-map` to create data structures for votes and voter registration.\n2. Using `map-set` to register voters and record votes.\n3. Using `map-get?` to check voter registration and retrieve vote counts.\n4. Combining map functions with other Clarity features for a complete voting system.\n\n## Conclusion\n\nMap functions in Clarity provide a powerful and efficient way to store and retrieve data in smart contracts. By understanding when and how to use these functions, developers can create more efficient, scalable, and gas-optimized contracts. Always consider the specific requirements of your application when designing your data storage strategy using map functions.\n" + }, + { + "title": "Cryptographic functions", + "description": "Brief overview of cryptographic functions in Clarity and their importance in smart contract development.", + "slug": "/stacks/clarity/cryptographic-functions", + "content": "\nCryptographic functions are essential in blockchain smart contracts for ensuring data integrity, creating secure hashes, and verifying signatures. Clarity provides several built-in cryptographic functions that are crucial for these purposes.\n\n## Why these functions matter\n\nClarity's cryptographic functions are designed with blockchain-specific considerations in mind:\n\n1. Security: These functions provide cryptographic primitives essential for building secure smart contracts.\n2. Data Integrity: They allow for the creation and verification of unique identifiers for data, ensuring data hasn't been tampered with.\n3. Authentication: Cryptographic functions enable signature verification, crucial for authenticating transactions and messages.\n4. Determinism: The behavior of these functions is consistent across all nodes, ensuring blockchain consensus.\n5. Interoperability: Some functions (like keccak256) provide compatibility with other blockchain systems.\n\n## Core Cryptographic Functions\n\n### 1. sha256\n\n**What**: Computes the SHA256 hash of the input.\n**Why**: SHA256 is widely used for creating unique, fixed-size representations of data, crucial for data integrity checks.\n**When**: Use when you need to create a unique identifier for data or verify data integrity.\n**How**: \n```clarity\n(sha256 value)\n```\n**Best Practices**: \n- Use for creating unique identifiers for data\n- Combine with other data before hashing to prevent rainbow table attacks\n\n**Example Use Case**: Creating a unique identifier for a document or transaction.\n\n```clarity\n(define-public (submit-document-hash (document-hash (buff 32)))\n (let ((user-submission-id (sha256 (concat document-hash tx-sender))))\n (map-set document-submissions user-submission-id true)\n (ok user-submission-id)))\n```\n\n### 2. keccak256\n\n**What**: Computes the Keccak256 hash of the input.\n**Why**: Keccak256 is another cryptographic hash function, often used in Ethereum-compatible systems.\n**When**: Use when interoperability with Ethereum systems is needed or when an alternative to SHA256 is required.\n**How**: \n```clarity\n(keccak256 value)\n```\n**Best Practices**: \n- Use when SHA256 is not suitable for your specific use case\n- Be aware of the differences in output compared to SHA256\n\n**Example Use Case**: Creating a hash for Ethereum address compatibility.\n\n```clarity\n(define-read-only (get-eth-address (public-key (buff 33)))\n (let ((hashed-key (keccak256 (unwrap-panic (secp256k1-recover? message-hash signature public-key)))))\n (buff-to-hex-string (unwrap-panic (slice? hashed-key u12 u32)))))\n```\n\n### 3. secp256k1-recover?\n\n**What**: Recovers the public key from a signed message and signature.\n**Why**: Essential for verifying signatures without needing the public key in advance.\n**When**: Use when implementing signature verification schemes, especially for transactions or messages.\n**How**: \n```clarity\n(secp256k1-recover? message-hash signature)\n```\n**Best Practices**: \n- Always check the return value as it's an optional type\n- Use in combination with `secp256k1-verify` for complete signature verification\n\n**Example Use Case**: Verifying a signed message in a decentralized voting system.\n\n```clarity\n(define-public (submit-vote (vote uint) (signature (buff 65)) (message-hash (buff 32)))\n (let ((signer (unwrap! (secp256k1-recover? message-hash signature) (err u1))))\n (asserts! (is-eq (principal-of? signer) (some tx-sender)) (err u2))\n (map-set votes tx-sender vote)\n (ok true)))\n\n## Practical Example: Document Verification System\n\nLet's implement a basic document verification system that demonstrates the use of Clarity's cryptographic functions. This system will allow users to submit document hashes, sign them, and later verify the authenticity of the document and the signer.\n\n```clarity\n;; Define a map to store document hashes and their signers\n(define-map documents\n { doc-hash: (buff 32) }\n { signer: principal, eth-compatible-hash: (buff 32) })\n\n;; Function to submit a document hash\n(define-public (submit-document (doc-hash (buff 32)))\n (let\n (\n (submission-id (sha256 (concat doc-hash tx-sender)))\n (eth-hash (keccak256 doc-hash))\n )\n (map-set documents { doc-hash: submission-id }\n { signer: tx-sender, eth-compatible-hash: eth-hash })\n (ok submission-id)))\n\n;; Function to sign a document hash\n(define-public (sign-document (doc-hash (buff 32)) (signature (buff 65)))\n (let\n ((submission-id (sha256 (concat doc-hash tx-sender))))\n (match (map-get? documents { doc-hash: submission-id })\n doc-info\n (let\n ((signer (unwrap! (secp256k1-recover? doc-hash signature) (err u1))))\n (asserts! (is-eq (principal-of? signer) (some tx-sender)) (err u2))\n (ok true))\n (err u3))))\n\n;; Function to verify a document and its signer\n(define-read-only (verify-document (doc-hash (buff 32)) (signature (buff 65)))\n (let\n ((submission-id (sha256 (concat doc-hash tx-sender))))\n (match (map-get? documents { doc-hash: submission-id })\n doc-info\n (let\n ((signer (unwrap! (secp256k1-recover? doc-hash signature) (err u1))))\n (if (is-eq (some (get signer doc-info)) (principal-of? signer))\n (ok true)\n (err u2)))\n (err u3))))\n\n;; Function to get Ethereum-compatible hash\n(define-read-only (get-eth-hash (doc-hash (buff 32)))\n (match (map-get? documents { doc-hash: doc-hash })\n doc-info (ok (get eth-compatible-hash doc-info))\n (err u1)))\n```\n\n## Conclusion\n\nCryptographic functions in Clarity provide powerful tools for ensuring data integrity and implementing secure signature schemes. By understanding when and how to use these functions, developers can create robust smart contracts that maintain the security and trustlessness essential to blockchain applications. Always consider the specific security requirements of your application when choosing and implementing these cryptographic functions." + }, + { + "title": "Access control", + "description": "Manage permissions and access control with principal functions.", + "slug": "/stacks/clarity/access-control", + "content": "\nPrincipal functions in Clarity are essential tools for implementing robust access control and permission management in smart contracts. These functions allow you to identify, authenticate, and authorize different entities interacting with the contract, ensuring that only the right parties can perform specific actions or access certain data.\n\n## Why these functions matter\n\nClarity's principal functions are designed with blockchain-specific considerations in mind. They can:\n\n1. Identify and authenticate users and contracts interacting with your smart contract.\n2. Implement role-based access control for different contract functions.\n3. Ensure that only authorized entities can perform certain actions or access specific data.\n4. Create multi-signature schemes for enhanced security.\n\n## Key elements for access control\n\n### 1. asserts!\n\n**What**: A function that checks a condition and throws an error if it's not met.\n\n**Why**: Essential for enforcing access control rules and validating conditions.\n\n**When**: Use when you need to ensure a condition is true before proceeding with a function.\n\n**Best practices**: \n- Use `asserts!` to enforce access control rules and validate conditions.\n- Consider using `asserts!` in combination with other principal functions for robust access control.\n\n**Example use case**: Using `asserts!` to check if a user has sufficient balance before performing a transfer.\n\n```clarity\n;; Define a map to store user balances\n(define-map Balances principal uint)\n\n;; Function to transfer tokens\n(define-public (transfer (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? Balances tx-sender)))\n )\n ;; Assert that the sender has sufficient balance\n (asserts! (>= senderBalance amount) (err u1))\n \n ;; If assertion passes, proceed with the transfer\n (map-set Balances tx-sender (- senderBalance amount))\n (map-set Balances recipient (+ (default-to u0 (map-get? Balances recipient)) amount))\n (ok true)\n )\n)\n\n;; Function to check balance\n(define-read-only (get-balance (user principal))\n (default-to u0 (map-get? Balances user))\n)\n```\n\n### 2. tx-sender\n\n**What**: A keyword that represents the current transaction sender.\n\n**Why**: Important for identifying who is calling a contract function.\n\n**When**: Use when you need to check permissions or record actions associated with the caller.\n\n**Best practices**: \n- Always validate `tx-sender` before performing sensitive operations.\n- Don't rely solely on `tx-sender` for complex authentication schemes.\n\n**Example use case**: Restricting a function to be called only by the contract owner.\n\n```clarity\n(define-data-var contractOwner principal tx-sender)\n\n(define-public (restricted-function)\n (begin\n (asserts! (is-eq tx-sender (var-get contractOwner)) (err u1))\n ;; Function logic here\n (ok true)\n )\n)\n```\n\n### 3. contract-caller\n\n**What**: A keyword that represents the immediate caller of the current contract.\n\n**Why**: Allows for more granular control in contract-to-contract interactions.\n\n**When**: Use when your contract might be called by other contracts and you need to distinguish between the original sender and the immediate caller.\n\n**Best practices**: \n- Use in conjunction with `tx-sender` for comprehensive access control.\n- Be cautious of potential confusion between `tx-sender` and `contract-caller` in complex call chains.\n\n**Example use case**: Implementing a whitelist for contracts allowed to call a function.\n\n```clarity\n(define-map AllowedCallers principal bool)\n\n(define-public (whitelisted-function)\n (begin\n (asserts! (default-to false (map-get? AllowedCallers contract-caller)) (err u2))\n ;; Function logic here\n (ok true)\n )\n)\n```\n\n### 4. is-eq\n\n**What**: Checks if two values are equal.\n\n**Why**: Crucial for comparing principals and implementing access control logic.\n\n**When**: Use when you need to verify if a caller matches a specific principal or if two principals are the same.\n\n**Best practices**: \n- Use for exact matching of principals.\n- Consider using in combination with other checks for more robust authentication.\n\n**Example use case**: Multi-signature functionality requiring approval from specific principals.\n\n```clarity\n(define-constant APPROVER_ONE 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5)\n(define-constant APPROVER_TWO 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG)\n \n(define-public (approve-transaction (transactionId uint))\n (begin\n (asserts! (or (is-eq tx-sender APPROVER_ONE) (is-eq tx-sender APPROVER_TWO)) (err u3))\n ;; Approval logic here\n (ok true)\n )\n)\n```\n\n## Practical example: simple governance contract\n\nLet's implement a basic governance contract that demonstrates role-based access control using principal functions. This contract will have an owner, administrators, and regular members, each with different permissions.\n\n```clarity\n;; Define maps to store roles\n(define-map Administrators principal bool)\n(define-map Members principal bool)\n\n;; Define data variables\n(define-data-var contractOwner principal tx-sender)\n(define-data-var proposalCounter uint u0)\n\n;; Define a map to store proposals\n(define-map Proposals\n uint\n {\n title: (string-ascii 50),\n proposer: principal,\n votesFor: uint,\n votesAgainst: uint\n }\n)\n\n;; Function to add an administrator (only owner can do this)\n(define-public (add-administrator (newAdmin principal))\n (begin\n (asserts! (is-eq tx-sender (var-get contractOwner)) (err u1))\n (ok (map-set Administrators newAdmin true))\n )\n)\n\n;; Function to add a member (only Administrators can do this)\n(define-public (add-member (newMember principal))\n (begin\n (asserts! (default-to false (map-get? Administrators contract-caller)) (err u2))\n (ok (map-set Members newMember true))\n )\n)\n\n;; Function to create a proposal (only members can do this)\n(define-public (create-proposal (title (string-ascii 50)))\n (let\n (\n (proposalId (var-get proposalCounter))\n )\n (asserts! (default-to false (map-get? Members tx-sender)) (err u3))\n (map-set Proposals proposalId\n {\n title: title,\n proposer: tx-sender,\n votesFor: u0,\n votesAgainst: u0\n })\n (var-set proposalCounter (+ proposalId u1))\n (ok proposalId)\n )\n)\n\n;; Function to vote on a proposal (only members can do this)\n(define-public (vote (proposalId uint) (voteFor bool))\n (let\n (\n (proposal (unwrap! (map-get? Proposals proposalId) (err u4)))\n )\n (asserts! (default-to false (map-get? Members tx-sender)) (err u5))\n (if voteFor\n (map-set Proposals proposalId (merge proposal { votesFor: (+ (get votesFor proposal) u1) }))\n (map-set Proposals proposalId (merge proposal { votesAgainst: (+ (get votesAgainst proposal) u1) }))\n )\n (ok true)\n )\n)\n\n;; Function to transfer ownership (only current owner can do this)\n(define-public (transfer-ownership (newOwner principal))\n (begin\n (asserts! (is-eq tx-sender (var-get contractOwner)) (err u6))\n (var-set contractOwner newOwner)\n (ok true)\n )\n)\n```\n\n## Conclusion\n\nPrincipal functions in Clarity provide powerful tools for implementing secure and flexible access control in smart contracts. By understanding when and how to use these functions, you can create robust permission systems, ensuring that only authorized entities can perform specific actions or access certain data. Always consider the specific security requirements of your application when implementing access control mechanisms using these principal functions.\n" + }, + { + "title": "list", + "description": "Construct lists in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/list", + "content": "\n## Function Signature\n\n```clarity\n(list expr1 expr2 expr3 ...)\n```\n\n- Input: `A, ...`\n- Output: `(list A)`\n\n## Why it matters\n\nThe `list` function is crucial for:\n\n1. Constructing lists of elements in Clarity.\n2. Enabling the use of lists for data storage and manipulation.\n3. Simplifying the creation of sequences of values.\n4. Facilitating operations on collections of data.\n\n## When to use it\n\nUse `list` when you need to:\n\n- Construct a list of elements.\n- Store and manipulate sequences of values.\n- Pass lists as arguments to functions.\n- Perform operations on collections of data.\n\n## Best Practices\n\n- Ensure all elements in the list are of the same type.\n- Use meaningful variable names for better readability.\n- Combine with other list functions for comprehensive list handling.\n- Be aware of the maximum length of lists in Clarity.\n\n## Practical Example: Creating a List of Integers\n\nLet's implement a function that creates a list of integers and returns its length:\n\n```clarity\n(define-read-only (create-list)\n (let\n (\n (numbers (list 1 2 3 4 5))\n )\n (len numbers)\n )\n)\n\n;; Usage\n(create-list) ;; Returns u5\n```\n\nThis example demonstrates:\n1. Using `list` to create a list of integers.\n2. Binding the list to a variable using `let`.\n3. Returning the length of the list using `len`.\n\n## Common Pitfalls\n\n1. Using `list` with elements of different types, causing type errors.\n2. Assuming the list will always be within a certain length, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete list checks.\n4. Overlooking the need for comprehensive validation and error checking.\n\n## Related Functions\n\n- `len`: Returns the length of a list.\n- `append`: Adds an element to the end of a list.\n- `concat`: Concatenates multiple lists.\n\n## Conclusion\n\nThe `list` function is a fundamental tool for constructing lists in Clarity smart contracts. It allows you to create sequences of values, enabling robust and comprehensive list handling and manipulation. When used effectively, `list` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage collections of data.\n" + }, + { + "title": "tuple", + "description": "Use tuples to group data values with named fields in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/tuple", + "content": "\n## Type Definition\n\n```clarity\n{label-0: value-type-0, label-1: value-type-1, ...}\n```\n\n- Input: `various types`\n- Output: `tuple`\n\n## Why it matters\n\nThe `tuple` type is crucial for:\n\n1. Grouping related data values with named fields.\n2. Implementing complex data structures in smart contracts.\n3. Ensuring data integrity by providing a clear structure for related values.\n4. Simplifying the process of handling grouped data in smart contracts.\n\n## When to use it\n\nUse `tuple` when you need to:\n\n- Group related data values with named fields.\n- Implement complex data structures in your smart contract.\n- Ensure data integrity by providing a clear structure for related values.\n- Handle grouped data in your smart contract.\n\n## Best Practices\n\n- Use descriptive names for tuple fields for better readability.\n- Ensure the types of the tuple fields are appropriate for the data they represent.\n- Combine with other data types and functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Using Tuples to Store User Information\n\nLet's implement a function that stores and retrieves user information using tuples:\n\n```clarity\n(define-map UserInfo { userId: principal } { name: (string-ascii 20), age: uint })\n\n(define-public (set-user-info (user principal) (name (string-ascii 20)) (age uint))\n (begin\n (map-set UserInfo { userId: user } { name: name, age: age })\n (ok true)\n )\n)\n\n(define-read-only (get-user-info (user principal))\n (map-get? UserInfo { userId: user })\n)\n\n;; Usage\n(set-user-info tx-sender \"Alice\" u30) ;; Sets the user info\n(get-user-info tx-sender) ;; Returns (some { name: \"Alice\", age: u30 })\n```\n\nThis example demonstrates:\n1. Using tuples to store user information with named fields.\n2. Implementing functions to set and get user information using tuples.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using non-descriptive names for tuple fields, causing confusion.\n2. Assuming the tuple structure will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-set`: Sets a value in a map.\n- `map-get?`: Retrieves a value from a map.\n- `default-to`: Provides a default value if an optional is `none`.\n\n## Conclusion\n\nThe `tuple` type is a fundamental tool for grouping related data values with named fields in Clarity smart contracts. It allows you to implement complex data structures, ensuring data integrity and simplifying data management. When used effectively, `tuple` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle grouped data.\n" + }, + { + "title": "sha256", + "description": "Compute the SHA-256 hash of a value in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/sha256", + "content": "\n## Function Signature\n\n```clarity\n(sha256 value)\n```\n\n- Input: `buff | uint | int`\n- Output: `(buff 32)`\n\n## Why it matters\n\nThe `sha256` function is crucial for:\n\n1. Computing the SHA-256 hash of a given value.\n2. Implementing cryptographic operations in smart contracts.\n3. Ensuring data integrity by generating unique hashes.\n4. Simplifying the process of handling cryptographic hashing in smart contracts.\n\n## When to use it\n\nUse `sha256` when you need to:\n\n- Compute the SHA-256 hash of a given value.\n- Implement cryptographic operations in your smart contract.\n- Generate unique hashes to ensure data integrity.\n- Handle cryptographic hashing operations.\n\n## Best Practices\n\n- Ensure the input value is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for comprehensive security management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Computing a SHA-256 Hash\n\nLet's implement a function that computes the SHA-256 hash of a given buffer:\n\n```clarity\n(define-read-only (compute-sha256 (input (buff 32)))\n (sha256 input)\n)\n\n;; Usage\n(compute-sha256 0x68656c6c6f20776f726c64000000000000000000000000000000000000000000)\n;; Returns 0x28effae679c457da1e5158c063b3dfa78d0ade721b9aa9f1fc3f46dba4c0ea15\n```\n\nThis example demonstrates:\n1. Using `sha256` to compute the hash of a given buffer.\n2. Implementing a public function to handle the hash computation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `sha256` with incorrectly formatted or invalid input values, causing the operation to fail.\n2. Assuming the hash will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete cryptographic hashing.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `sha512`: Computes the SHA-512 hash of the input.\n- `sha512/256`: Computes the SHA-512/256 hash of the input.\n- `keccak256`: Computes the KECCAK-256 hash of the input.\n\n## Conclusion\n\nThe `sha256` function is a fundamental tool for computing SHA-256 hashes in Clarity smart contracts. It allows you to implement cryptographic operations, ensuring data integrity and simplifying cryptographic hashing. When used effectively, `sha256` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle cryptographic hashing operations.\n" + }, + { + "title": "unwrap!", + "description": "Unpack optional and response types in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/unwrap", + "content": "\n## Function Signature\n\n```clarity\n(unwrap! option-input thrown-value)\n```\n\n- Input: `(optional A) | (response A B), C`\n- Output: `A`\n\n## Why it matters\n\nThe `unwrap!` function is crucial for:\n\n1. Unpacking optional and response types to access their inner values.\n2. Implementing logic that requires handling optional and response types.\n3. Ensuring data integrity by validating the unpacking process.\n4. Simplifying the process of handling optional and response types in smart contracts.\n\n## When to use it\n\nUse `unwrap!` when you need to:\n\n- Unpack optional and response types to access their inner values.\n- Implement logic that requires handling optional and response types.\n- Validate the unpacking process to ensure data integrity.\n- Handle optional and response types in your smart contract.\n\n## Best Practices\n\n- Ensure the input value is an optional or response type.\n- Use meaningful variable names for better readability.\n- Combine with other error handling functions for comprehensive error management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Unpacking an Optional Value\n\nLet's implement a function that retrieves a value from a map and unpacks it using `unwrap!`:\n\n```clarity\n(define-map UserInfo { userId: principal } { name: (string-ascii 20), age: uint })\n\n(define-public (get-user-age (user principal))\n (let\n (\n (userData (unwrap! (map-get? UserInfo { userId: user }) (err \"User not found\")))\n )\n (ok (get age userData))\n )\n)\n\n;; Usage\n(map-set UserInfo { userId: tx-sender } { name: \"Alice\", age: u30 })\n(get-user-age tx-sender) ;; Returns (ok u30)\n(get-user-age 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) ;; Returns (err \"User not found\")\n```\n\nThis example demonstrates:\n1. Using `unwrap!` to unpack an optional value from a map.\n2. Implementing a public function to handle the unpacking process.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `unwrap!` with values that are not optional or response types, causing runtime errors.\n2. Assuming the unpacking will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete error management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `try!`: Unpacks optional and response types, returning `none` or the `err` value if unpacking fails.\n- `unwrap-panic`: Unpacks optional and response types, throwing a runtime error if unpacking fails.\n- `default-to`: Provides a default value if an optional is `none`.\n\n## Conclusion\n\nThe `unwrap!` function is a fundamental tool for unpacking optional and response types in Clarity smart contracts. It allows you to implement logic that requires handling optional and response types, ensuring data integrity and simplifying the unpacking process. When used effectively, `unwrap!` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle optional and response types.\n" + }, + { + "title": "contract-call?", + "description": "Execute public functions in other smart contracts from within a Clarity smart contract.", + "slug": "/stacks/clarity/functions/contract-call", + "content": "\n## Function Signature\n\n```clarity\n(contract-call? .contract-name function-name arg0 arg1 ...)\n```\n\n- Input: \n - `.contract-name`: The name of the contract to call\n - `function-name`: The name of the public function to execute\n - `arg0, arg1, ...`: Arguments to pass to the function\n- Output: `(response A B)` where A and B are the types returned by the called function\n\n## Why it matters\n\nThe `contract-call?` function is crucial for:\n\n1. Enabling inter-contract communication and composability.\n2. Allowing contracts to leverage functionality from other contracts.\n3. Building complex systems of interacting smart contracts.\n4. Implementing upgradeable contract patterns.\n\n## When to use it\n\nUse the `contract-call?` function when you need to:\n\n- Call a public function in another contract.\n- Interact with standardized contracts (e.g., token contracts).\n- Split complex logic across multiple contracts for better organization.\n- Implement upgradeable systems by calling into newer contract versions.\n\n## Best Practices\n\n- Always check the return value of `contract-call?` as it returns a response type.\n- Be aware that `contract-call?` cannot be used to call functions within the same contract.\n- Consider the gas costs of external contract calls in your overall transaction budget.\n- Use `as-contract` when appropriate to make calls with the contract's own principal.\n\n## Practical Example: Interacting with a Token Contract\n\nLet's implement a function that transfers tokens using a standard token contract:\n\n```clarity\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (contract-call? .token-contract transfer amount tx-sender recipient)\n)\n\n;; Usage\n(transfer-tokens u100 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM)\n```\n\nThis example demonstrates:\n1. Using `contract-call?` to interact with another contract (`.token-contract`).\n2. Passing arguments to the called function, including the current `tx-sender`.\n3. Returning the response from the called function directly.\n\n## Common Pitfalls\n\n1. Forgetting to handle the response from `contract-call?`, which can lead to unexpected behavior.\n2. Attempting to use `contract-call?` to call functions within the same contract, which is not allowed.\n3. Not considering the possibility of the called contract changing or being upgraded.\n\n## Related Functions\n\n- `as-contract`: Often used in combination with `contract-call?` to make calls as the contract principal.\n- `try!`: Useful for handling the response from `contract-call?` and propagating errors.\n- `unwrap!`: Can be used to extract the success value from a `contract-call?` response or return an error.\n\n## Conclusion\n\nThe `contract-call?` function is a fundamental building block for creating complex, interacting systems of smart contracts on the Stacks blockchain. By enabling contracts to call functions in other contracts, this function promotes code reuse, modularity, and upgradability. However, you must be careful to handle responses correctly and consider the implications of external calls on your contract's behavior and gas usage.\n" + }, + { + "title": "buff-to-int-be", + "description": "Convert a byte buffer to a signed integer using big-endian encoding in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/buff-to-int-be", + "content": "\n## Function Signature\n\n```clarity\n(buff-to-int-be (buff 16))\n```\n\n- Input: A byte buffer of up to 16 bytes\n- Output: A signed integer (`int`)\n\n## Why it matters\n\nThe `buff-to-int-be` function is crucial for:\n\n1. Converting byte data to signed integers in smart contracts.\n2. Handling data from external sources or other contracts that use big-endian encoding.\n3. Implementing protocols or algorithms that require big-endian integer representation.\n4. Interoperating with systems that use big-endian byte order.\n\n## When to use it\n\nUse the `buff-to-int-be` function when you need to:\n\n- Convert a big-endian encoded byte buffer to a signed integer.\n- Process input data that represents signed integers in big-endian format.\n- Implement cryptographic or mathematical operations that expect big-endian integer inputs.\n- Ensure compatibility with external systems using big-endian encoding.\n\n## Best Practices\n\n- Ensure the input buffer is no larger than 16 bytes to avoid errors.\n- Be aware that smaller buffers are zero-padded on the left, affecting the resulting integer value.\n- Consider using `buff-to-uint-be` for unsigned integers if the sign is not needed.\n- Handle potential errors when the input buffer might be invalid or empty.\n\n## Practical Example: Decoding a Signed Integer from External Data\n\nLet's implement a function that processes external data containing a big-endian encoded signed integer:\n\n```clarity\n(define-read-only (process-external-data (data (buff 16)))\n (let\n (\n (value (buff-to-int-be data))\n )\n (if (< value 0)\n (err \"Negative value not allowed\")\n (ok value)\n )\n )\n)\n\n;; Usage\n(process-external-data 0x0000000000000001) ;; Returns (ok 1)\n(process-external-data 0xffffffffffffffff) ;; Returns (err \"Negative value not allowed\")\n(process-external-data 0x7fffffffffffffff) ;; Returns (ok 9223372036854775807)\n```\n\nThis example demonstrates:\n1. Using `buff-to-int-be` to convert external data to a signed integer.\n2. Handling both positive and negative values resulting from the conversion.\n3. Implementing input validation based on the converted integer value.\n\n## Common Pitfalls\n\n1. Forgetting that the function interprets the input as big-endian, which might lead to unexpected values if the data is actually little-endian.\n2. Not handling potential negative values when working with signed integers.\n3. Assuming a specific buffer length, which could lead to unexpected results with shorter inputs due to left-padding.\n\n## Related Functions\n\n- `buff-to-int-le`: Converts a byte buffer to a signed integer using little-endian encoding.\n- `buff-to-uint-be`: Converts a byte buffer to an unsigned integer using big-endian encoding.\n- `int-to-ascii`: Converts an integer to its ASCII string representation.\n\n## Conclusion\n\nThe `buff-to-int-be` function is a powerful tool for working with big-endian encoded signed integers in Clarity smart contracts. By understanding its behavior with different input sizes and potential sign issues, you can effectively process and validate external data, implement complex algorithms, and ensure compatibility with big-endian systems in your smart contract applications.\n" + }, + { + "title": "int-to-ascii", + "description": "Convert integers to ASCII string representations in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/int-to-ascii", + "content": "\n## Function Signature\n\n```clarity\n(int-to-ascii value)\n```\n\n- Input: `int | uint`\n- Output: `(string-ascii 40)`\n\n## Why it matters\n\nThe `int-to-ascii` function is crucial for:\n\n1. Converting integer values to their string representations.\n2. Facilitating the display and logging of numeric data.\n3. Enabling the use of numeric values in contexts that require strings.\n4. Simplifying the process of creating human-readable outputs from numeric data.\n\n## When to use it\n\nUse `int-to-ascii` when you need to:\n\n- Convert an integer or unsigned integer to a string.\n- Display numeric values in a human-readable format.\n- Log or store numeric data as strings.\n- Prepare numeric data for concatenation with other strings.\n\n## Best Practices\n\n- Ensure the integer value is within the range that can be represented as a string.\n- Use meaningful variable names for better readability.\n- Combine with other string functions for more complex string manipulations.\n- Be aware of the maximum length of the resulting string (40 characters).\n\n## Practical Example: Logging a User's Balance\n\nLet's implement a function that logs a user's balance as a string:\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (log-balance (user principal))\n (let\n (\n (balance (default-to u0 (map-get? UserBalances { userId: user })))\n (balanceStr (int-to-ascii balance))\n )\n (print balanceStr)\n )\n)\n\n;; Usage\n(map-set UserBalances { userId: tx-sender } { balance: u100 })\n(log-balance tx-sender) ;; Logs \"100\"\n```\n\nThis example demonstrates:\n1. Using `int-to-ascii` to convert a user's balance to a string.\n2. Logging the string representation of the balance using `print`.\n3. Handling the case where the user has no balance set.\n\n## Common Pitfalls\n\n1. Assuming the resulting string will always fit within 40 characters.\n2. Forgetting to handle cases where the integer value is not set or is zero.\n3. Using `int-to-ascii` in performance-critical sections without considering the overhead.\n4. Not combining with other string functions for more complex manipulations.\n\n## Related Functions\n\n- `print`: Used to log or display string values.\n- `concat`: Used to concatenate multiple strings.\n- `default-to`: Used to provide default values for optional types.\n\n## Conclusion\n\nThe `int-to-ascii` function is a powerful tool for converting integer values to their string representations in Clarity smart contracts. This function enables you to create human-readable outputs from numeric data, facilitating logging, display, and storage of numeric values as strings. When used effectively, `int-to-ascii` enhances the readability and usability of numeric data within your smart contract code.\n" + }, + { + "title": "map-delete", + "description": "Remove an entry from a map in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/map-delete", + "content": "\n## Function Signature\n\n```clarity\n(map-delete map-name key-tuple)\n```\n\n- Input: `MapName, tuple`\n- Output: `bool`\n\n## Why it matters\n\nThe `map-delete` function is crucial for:\n\n1. Removing entries from a map.\n2. Managing and updating the state of data stored in maps.\n3. Ensuring data integrity by allowing the deletion of obsolete or incorrect entries.\n4. Simplifying the process of maintaining clean and accurate data in smart contracts.\n\n## When to use it\n\nUse `map-delete` when you need to:\n\n- Remove an entry from a map.\n- Manage and update the state of data stored in maps.\n- Ensure data integrity by deleting obsolete or incorrect entries.\n- Maintain clean and accurate data in your smart contract.\n\n## Best Practices\n\n- Ensure the key-tuple accurately identifies the entry to be deleted.\n- Use meaningful variable names for better readability.\n- Combine with other map functions for comprehensive map management.\n- Be aware of the performance implications of frequent deletions in large maps.\n\n## Practical Example: Deleting a User's Data\n\nLet's implement a function that deletes a user's data from a map:\n\n```clarity\n(define-map UserData { userId: principal } { data: (buff 32) })\n\n(define-public (delete-user-data (user principal))\n (ok (map-delete UserData { userId: user }))\n)\n\n;; Usage\n(map-set UserData { userId: tx-sender } { data: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef }) ;; Returns true\n(delete-user-data tx-sender) ;; Returns (ok true)\n```\n\nThis example demonstrates:\n1. Using `map-delete` to remove a user's data from the `UserData` map.\n2. Implementing a public function to delete the data.\n3. Handling the case where the user's data is present and needs to be removed.\n\n## Common Pitfalls\n\n1. Using `map-delete` with an incorrect key-tuple, causing the deletion to fail.\n2. Assuming the entry will always exist, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-set`: Sets the value associated with a key in a map.\n- `map-get?`: Retrieves an entry from a map.\n- `map-insert`: Inserts a value into a map if the key does not already exist.\n\n## Conclusion\n\nThe `map-delete` function is a fundamental tool for managing data in Clarity smart contracts. It allows you to remove entries from maps, ensuring data integrity and maintaining clean and accurate data. When used effectively, `map-delete` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage map entries.\n" + }, + { + "title": "contract-of", + "description": "Retrieve the principal of a contract implementing a trait in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/contract-of", + "content": "\n## Function Signature\n\n```clarity\n(contract-of <trait-reference>)\n```\n\n- Input: A trait reference\n- Output: The principal of the contract implementing the trait\n\n## Why it matters\n\nThe `contract-of` function is crucial for:\n\n1. Retrieving the principal (address) of a contract implementing a specific trait.\n2. Enabling dynamic interactions with contracts based on traits.\n3. Implementing contract-agnostic functions that work with any contract adhering to a specific interface.\n4. Enhancing interoperability between contracts in a composable ecosystem.\n\n## When to use it\n\nUse the `contract-of` function when you need to:\n\n- Get the actual contract address from a trait reference.\n- Perform operations that require the contract's principal, such as authorization checks.\n- Implement functions that can work with multiple contracts implementing the same trait.\n- Debug or log information about which contract is being interacted with.\n- Manage routing logic between different versions of contracts for upgradeable smart contracts.\n- Implement access control mechanisms to restrict function calls to designated contracts.\n\n## Best Practices\n\n- Use `contract-of` in combination with traits to create more flexible and composable smart contracts.\n- Remember that `contract-of` returns a principal, which can be used in other Clarity functions expecting a contract address.\n- Consider using `contract-of` when implementing proxy or router contracts that work with multiple similar contracts.\n- Be aware that `contract-of` can only be used with trait references, not with direct contract references.\n\n## Practical Example: Modular Approach to Extension Contracts\n\nLet's implement a system where specific functions can only be called by designated extension contracts:\n\n### Define the Extension Trait\n\nFirst, define a trait for the extension contract:\n\n```clarity\n(define-trait extension-trait\n\t(\n\t\t(callback (principal (buff 34)) (response bool uint))\n\t)\n)\n```\n\n### Implement the Main Contract\n\nNext, implement the main contract with the `request-extension-callback` function:\n\n```clarity\n(use-trait extensionTrait .extension-trait.extension-trait)\n(define-map Extensions principal bool)\n\n(define-public (set-extension (extension principal) (enabled bool))\n (ok (map-set Extensions extension enabled))\n)\n\n(define-public (request-extension-callback (extension <extensionTrait>) (memo (buff 34)))\n (let\n (\n (sender tx-sender)\n )\n (asserts! (and (is-extension contract-caller) (is-eq contract-caller (contract-of extension))) (err u1))\n (as-contract (contract-call? extension callback sender memo))\n )\n)\n\n(define-read-only (is-extension (extension principal))\n (default-to false (map-get? Extensions extension))\n)\n```\n\n### Explanation\n\n1. **Define the Extension Trait**: The `extensionTrait` defines a `callback` function that the extension contract must implement.\n2. **Data Map for Valid Extensions**: `Extensions` is a map that stores the status (enabled/disabled) of extension contracts.\n3. **Public Function `set-extension`**: This function allows adding or removing an extension contract from the `Extensions` map.\n4. **Public Function `request-extension-callback`**: This function:\n - Retrieves the principal of the extension contract using `contract-of`.\n - Asserts that the caller is a valid extension and matches the extension principal.\n - Calls the `callback` function on the extension contract using `contract-call?`.\n5. **Read-Only Function `is-extension`**: This function checks if a given contract principal is in the `Extensions` map and is enabled.\n\n### Usage\n\n1. **Set an Extension**:\n ```clarity\n (set-extension 'SP2J4ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6ZQ6 true)\n ```\n\n2. **Request Extension Callback**:\n ```clarity\n (request-extension-callback .extension-contract (buff 34 \"example memo\"))\n ```\n\nThis example demonstrates:\n1. Using `contract-of` to get the principal of the extension contract implementing the extension trait.\n2. Implementing a read-only function to check if the caller is a valid extension.\n3. Restricting access to certain functions based on the authorized extension contracts.\n4. Allowing the authorized extension contracts to call specific functions.\n\n## Common Pitfalls\n\n1. Attempting to use `contract-of` with a direct contract reference instead of a trait reference.\n2. Forgetting that `contract-of` returns a principal, not a contract reference itself.\n3. Not handling potential errors when working with trait references that might not be properly initialized.\n\n## Related Functions\n\n- `use-trait`: Used to define trait references that can be used with `contract-of`.\n- `contract-call?`: Often used in combination with `contract-of` to call functions on the retrieved contract.\n- `is-eq`: Can be used to compare the returned principal with known contract addresses.\n\n## Conclusion\n\nThe `contract-of` function is a powerful tool for creating flexible and interoperable smart contracts in Clarity. By allowing contracts to dynamically retrieve the principal of trait-implementing contracts, this function enables the creation of more generic and reusable code. When used effectively, `contract-of` can significantly enhance the composability and modularity of your smart contract ecosystem, especially in scenarios like access control management where restricting function calls to designated contracts is essential.\n" + }, + { + "title": "keccak256", + "description": "Compute the Keccak-256 hash of a buffer in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/keccak256", + "content": "\n## Function Signature\n\n```clarity\n(keccak256 value)\n```\n\n- Input: `buff`\n- Output: `(buff 32)`\n\n## Why it matters\n\nThe `keccak256` function is crucial for:\n\n1. Computing cryptographic hashes of data.\n2. Ensuring data integrity and authenticity.\n3. Implementing cryptographic operations in smart contracts.\n4. Creating unique identifiers for data.\n\n## When to use it\n\nUse `keccak256` when you need to:\n\n- Compute a cryptographic hash of a buffer.\n- Verify data integrity and authenticity.\n- Generate unique identifiers for data.\n- Implement cryptographic operations in your contract.\n\n## Best Practices\n\n- Ensure the input buffer is of the correct length and format.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for more complex operations.\n- Be aware of the security implications of using cryptographic hashes.\n\n## Practical Example: Hashing a User's Data\n\nLet's implement a function that computes the Keccak-256 hash of a user's data:\n\n```clarity\n(define-map UserData { userId: principal } { data: (buff 32) })\n\n(define-public (hash-user-data (user principal))\n (let\n (\n (data (default-to (buff 0) (map-get? UserData { userId: user })))\n (hash (keccak256 data))\n )\n (ok hash)\n )\n)\n\n;; Usage\n(map-set UserData { userId: tx-sender } { data: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef })\n(hash-user-data tx-sender) ;; Returns the Keccak-256 hash of the data\n```\n\nThis example demonstrates:\n1. Using `keccak256` to compute the hash of a user's data.\n2. Implementing a public function to return the hash.\n3. Handling the case where the user's data is not set by providing a default value.\n\n## Common Pitfalls\n\n1. Using `keccak256` on non-buffer types, causing type errors.\n2. Not handling cases where the input buffer is empty or invalid.\n3. Overlooking the need for proper error handling and validation.\n4. Assuming the hash function is collision-resistant without understanding its limitations.\n\n## Related Functions\n\n- `sha256`: Computes the SHA-256 hash of a buffer.\n- `hash160`: Computes the RIPEMD-160 hash of the SHA-256 hash of a buffer.\n- `concat`: Concatenates multiple buffers.\n\n## Conclusion\n\nThe `keccak256` function is a powerful tool for computing cryptographic hashes in Clarity smart contracts. It allows you to ensure data integrity and authenticity, generate unique identifiers, and implement cryptographic operations. When used effectively, `keccak256` enhances the security and reliability of your smart contract code by providing a robust mechanism for hashing data.\n" + }, + { + "title": "define-constant", + "description": "Define immutable constants in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/define-constant", + "content": "\n## Function Signature\n\n```clarity\n(define-constant name expression)\n```\n\n- Input: \n - `name`: The name of the constant\n - `expression`: The value to be assigned to the constant\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-constant` function is crucial for:\n\n1. Declaring immutable values that can be reused throughout the contract.\n2. Improving code readability by giving meaningful names to fixed values.\n3. Optimizing gas costs by avoiding repeated computations of fixed values.\n4. Ensuring certain values remain unchanged throughout the contract's lifecycle.\n\n## When to use it\n\nUse `define-constant` when you need to:\n\n- Define fixed values that won't change during contract execution.\n- Create named constants for magic numbers or frequently used values.\n- Declare contract-wide configuration parameters.\n- Optimize gas usage for values that are computed but never change.\n\n## Best Practices\n\n- Use uppercase names for constants to distinguish them from variables.\n- Place constant definitions at the top of your contract for better visibility.\n- Use constants for values that are used multiple times in your contract.\n- Consider using constants for contract configuration that might need to change between deployments.\n\n## Practical Example: Token Configuration\n\nLet's implement a simple token contract using constants for configuration:\n\n```clarity\n(define-constant TOKEN_NAME \"DOG-GO-TO-THE-MOON\")\n(define-constant TOKEN_SYMBOL \"DOG\")\n(define-constant TOKEN_DECIMALS u6)\n(define-constant TOKEN_SUPPLY u1000000000000) ;; 1 million tokens with 6 decimals\n\n(define-fungible-token DOG-GO-TO-THE-MOON TOKEN_SUPPLY)\n\n(define-read-only (get-name)\n TOKEN_NAME\n)\n\n(define-read-only (get-symbol)\n TOKEN_SYMBOL\n)\n\n(define-read-only (get-decimals)\n TOKEN_DECIMALS\n)\n\n(define-read-only (get-balance (who principal))\n (ok (ft-get-balance DOG-GO-TO-THE-MOON who))\n)\n```\n\nThis example demonstrates:\n1. Using `define-constant` to set up token configuration parameters.\n2. Referencing these constants in various parts of the contract.\n3. Improving readability and maintainability of the contract.\n\n## Common Pitfalls\n\n1. Attempting to modify a constant after it's defined, which is not allowed.\n2. Using `define-constant` for values that need to change during contract execution (use `define-data-var` instead).\n3. Overusing constants for values used only once, which can decrease readability.\n\n## Related Functions\n\n- `define-data-var`: Used for defining mutable variables.\n- `define-map`: Used for defining data maps.\n- `var-get`: Used to retrieve the value of a data variable (not needed for constants).\n\n## Conclusion\n\nThe `define-constant` function is a powerful tool for creating immutable, named values in Clarity smart contracts. By using constants effectively, you can improve code readability, optimize gas usage, and ensure certain values remain fixed throughout your contract's lifecycle. When designing your contract, consider which values should be constants and which might need to be mutable variables.\n" + }, + { + "title": "xor", + "description": "Perform a bitwise exclusive OR operation in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/xor", + "content": "\n## Function Signature\n\n```clarity\n(xor int1 int2)\n```\n\n- Input: `int, int`\n- Output: `int`\n\n## Why it matters\n\nThe `xor` function is crucial for:\n\n1. Performing bitwise operations essential for cryptographic functions.\n2. Implementing conditional logic that requires toggling between states.\n3. Enhancing data security through simple encryption mechanisms.\n4. Simplifying the process of handling bitwise operations in smart contracts.\n\n## When to use it\n\nUse `xor` when you need to:\n\n- Perform bitwise exclusive OR operations.\n- Implement simple encryption or decryption mechanisms.\n- Toggle between two states based on certain conditions.\n- Enhance the security of your smart contract through cryptographic operations.\n\n## Best Practices\n\n- Ensure the integers used with `xor` are within the valid range for your application.\n- Use meaningful variable names to enhance code readability.\n- Combine `xor` with other logical operations to implement complex conditions.\n- Handle possible edge cases to ensure robust contract behavior.\n\n## Practical Example: Simple Encryption\n\nLet's implement a simple encryption and decryption mechanism using the `xor` function:\n\n```clarity\n(define-public (encrypt (data int) (key int))\n (ok (xor data key))\n)\n\n(define-public (decrypt (encryptedData int) (key int))\n (ok (xor encryptedData key))\n)\n\n;; Usage\n(encrypt 42 123) ;; Encrypts 42 with key 123, returns (ok 81)\n(decrypt 165 123) ;; Decrypts 165 with key 123, returns (ok 222)\n```\n\nThis example demonstrates:\n1. Using `xor` to perform a bitwise exclusive OR operation.\n2. Implementing public functions to handle encryption and decryption.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `xor` with non-integer types, causing runtime errors.\n2. Misunderstanding the behavior of `xor`, leading to incorrect logic implementation.\n3. Not considering edge cases, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `and`: Performs a bitwise AND operation.\n- `or`: Performs a bitwise OR operation.\n- `not`: Performs a bitwise NOT operation.\n\n## Conclusion\n\nThe `xor` function is a powerful tool for performing bitwise exclusive OR operations in Clarity smart contracts. It allows you to implement cryptographic functions, conditional logic, and simple encryption mechanisms, enhancing the security and functionality of your smart contracts. When used effectively, `xor` simplifies the process of handling bitwise operations and ensures robust contract behavior.\n" + }, + { + "title": "principal-of?", + "description": "Derive a principal from a public key in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/principal-of", + "content": "\n## Function Signature\n\n```clarity\n(principal-of? public-key)\n```\n\n- Input: `(buff 33)`\n- Output: `(response principal uint)`\n\n## Why it matters\n\nThe `principal-of?` function is crucial for:\n\n1. Deriving a principal from a public key.\n2. Managing identities and permissions in smart contracts.\n3. Ensuring data integrity by validating public key to principal conversion.\n4. Simplifying the process of handling principals derived from public keys.\n\n## When to use it\n\nUse `principal-of?` when you need to:\n\n- Derive a principal from a public key.\n- Manage identities and permissions in your smart contract.\n- Validate the conversion of a public key to a principal.\n- Handle principal derivation operations.\n\n## Best Practices\n\n- Ensure the `public-key` is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other principal functions for comprehensive identity management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Deriving a Principal\n\nLet's implement a function that derives a principal from a public key:\n\n```clarity\n(define-public (derive-principal (public-key (buff 33)))\n (principal-of? public-key)\n)\n\n;; Usage\n(derive-principal 0x0390a5cac7c33fda49f70bc1b0866fa0ba7a9440d9de647fecb8132ceb76a94dfa) ;; Returns (ok 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM)\n```\n\nThis example demonstrates:\n1. Using `principal-of?` to derive a principal from a public key.\n2. Implementing a public function to handle the principal derivation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `principal-of?` with an incorrectly formatted or invalid `public-key`, causing the operation to fail.\n2. Assuming the principal will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete principal management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `principal-construct?`: Constructs a principal from its components.\n- `principal-destruct?`: Decomposes a principal into its components.\n- `contract-caller`: Returns the caller of the current contract context.\n\n## Conclusion\n\nThe `principal-of?` function is a fundamental tool for deriving principals from public keys in Clarity smart contracts. It allows you to manage identities and permissions, ensuring data integrity and simplifying principal handling. When used effectively, `principal-of?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle principal derivation operations.\n" + }, + { + "title": "get-burn-block-info?", + "description": "Fetch information about burnchain blocks in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/get-burn-block-info", + "content": "\n## Function Signature\n\n```clarity\n(get-burn-block-info? prop-name block-height)\n```\n\n- Input: \n - `prop-name`: A BurnBlockInfoPropertyName\n - `block-height`: A uint representing the burnchain block height\n- Output: `(optional buff) | (optional (tuple (addrs (list 2 (tuple (hashbytes (buff 32)) (version (buff 1))))) (payout uint)))`\n\n## Why it matters\n\nThe `get-burn-block-info?` function is crucial for:\n\n1. Accessing historical data from the underlying burnchain (Bitcoin).\n2. Implementing cross-chain verification or logic based on Bitcoin block information.\n3. Retrieving PoX (Proof of Transfer) related data for advanced stacking operations.\n4. Enabling contracts to react to or validate burnchain events.\n\n## When to use it\n\nUse `get-burn-block-info?` when you need to:\n\n- Verify Bitcoin block hashes within your Stacks contract.\n- Access information about PoX payouts and addresses.\n- Implement logic that depends on burnchain block data.\n- Build cross-chain applications that reference Bitcoin state.\n\n## Best Practices\n\n- Always check if the returned value is `none`, as it will be for non-existent or future blocks.\n- Be aware of the potential for chain reorganizations when using recent block data.\n- Use the appropriate property name for the data you need to retrieve.\n- Consider caching results for frequently accessed block information to save on execution costs.\n\n## Practical Example: Verifying a Bitcoin Block Hash\n\nLet's implement a function that verifies if a given Bitcoin block hash matches a specific height:\n\n```clarity\n(define-read-only (verify-btc-block-hash (height uint) (expectedHash (buff 32)))\n (match (get-burn-block-info? header-hash height) hash\n (is-eq hash expectedHash)\n false\n )\n)\n\n;; Usage\n(verify-btc-block-hash u700000 0x00000000000000000009a11b3972c8e532e964e262c196556bd958b7fd0c55c3)\n```\n\nThis example demonstrates:\n1. Using `get-burn-block-info?` to retrieve the `header-hash` of a burnchain block.\n2. Handling the optional return value with `match`.\n3. Comparing the retrieved hash with an expected value.\n\n## Available Properties\n\n- `header-hash`: Returns a 32-byte buffer representing the header hash of the burnchain block.\n- `pox-addrs`: Returns a tuple containing PoX payout information:\n - `addrs`: A list of up to two PoX addresses that received payouts.\n - `payout`: The amount of burnchain tokens paid to each address.\n\n## Common Pitfalls\n\n1. Assuming all properties are available for all blocks.\n2. Not handling the `none` case when the block height is invalid or in the future.\n3. Misinterpreting the `pox-addrs` data, especially during different PoX phases.\n4. Overlooking the fact that burn addresses may be included in the `pox-addrs` list.\n\n## Related Functions\n\n- `get-block-info?`: Used to get information about Stacks blocks.\n- `burn-block-height`: Keyword that returns the current burn chain block height.\n\n## Conclusion\n\nThe `get-burn-block-info?` function is a powerful tool for accessing burnchain data in Clarity smart contracts. It allows you to incorporate Bitcoin blockchain information into your contract logic, enabling cross-chain verification and advanced PoX-related functionalities. When used correctly, this function provides valuable insights into the underlying Bitcoin blockchain's state and can be used to implement sophisticated, cross-chain aware contract behavior.\n" + }, + { + "title": "fold", + "description": "Reduce a sequence to a single value in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/fold", + "content": "\n## Function Signature\n\n```clarity\n(fold <function> <sequence> <initial-value>)\n```\n\n- Input: \n - `<function>`: A function that takes two arguments and returns a single value\n - `<sequence>`: A list, buffer, or string to iterate over\n - `<initial-value>`: The starting value for the accumulation\n- Output: The final accumulated value\n\n## Why it matters\n\nThe `fold` function is crucial for:\n\n1. Aggregating values from a sequence into a single result.\n2. Performing complex computations on list elements.\n3. Transforming data structures efficiently.\n4. Implementing recursive-like operations without explicit recursion.\n\n## When to use it\n\nUse `fold` when you need to:\n\n- Calculate a sum, product, or other aggregate value from a list.\n- Transform a list into a single value or different data structure.\n- Apply a function to each element of a sequence while maintaining state.\n- Implement algorithms that would typically require recursion.\n\n## Best Practices\n\n- Ensure the function passed to `fold` is commutative if the order of operations doesn't matter.\n- Use meaningful initial values that make sense for your aggregation.\n- Consider using `fold` instead of explicit loops for cleaner, more functional code.\n- Be mindful of the performance implications when folding over large sequences.\n\n## Practical Example: Summing a List of Numbers\n\nLet's implement a function that sums all numbers in a list:\n\n```clarity\n(define-read-only (sum-list (numbers (list 10 uint)))\n (fold + numbers u0)\n)\n\n;; Usage\n(sum-list (list u1 u2 u3 u4 u5)) ;; Returns u15\n```\n\nThis example demonstrates:\n1. Using `fold` with the built-in `+` function to sum numbers.\n2. Starting with an initial value of `u0`.\n3. Applying the operation to each element in the list.\n\n## Common Pitfalls\n\n1. Using an initial value of the wrong type or that doesn't make sense for the operation.\n2. Forgetting that `fold` processes elements from left to right, which matters for non-commutative operations.\n3. Overusing `fold` for operations that might be more clearly expressed with other functions like `map` or `filter`.\n\n## Related Functions\n\n- `map`: Applies a function to each element in a sequence, returning a new sequence.\n- `filter`: Selects elements from a sequence based on a predicate function.\n- `reduce`: Similar to `fold` in other languages, but Clarity uses `fold` for this operation.\n\n## Conclusion\n\nThe `fold` function is a powerful tool for aggregating and transforming data in Clarity smart contracts. It allows you to express complex computations on sequences in a concise and functional manner. When used effectively, `fold` can simplify code, improve readability, and provide an efficient way to process collections of data within smart contracts.\n" + }, + { + "title": "define-map", + "description": "Define a data map in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/define-map", + "content": "\n## Function Signature\n\n```clarity\n(define-map map-name key-type value-type)\n```\n\n- Input: \n - `map-name`: The name of the map\n - `key-type`: The type of the map's keys\n - `value-type`: The type of the map's values\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-map` function is crucial for:\n\n1. Creating key-value stores within smart contracts.\n2. Efficiently organizing and accessing structured data.\n3. Implementing complex data structures like mappings or dictionaries.\n4. Storing and retrieving contract-specific data associated with unique keys.\n\n## When to use it\n\nUse `define-map` when you need to:\n\n- Store and retrieve data associated with unique keys.\n- Implement lookup tables or dictionaries in your contract.\n- Organize data that needs to be accessed by a specific identifier.\n- Create data structures that can be efficiently updated and queried.\n\n## Best Practices\n\n- Choose appropriate types for keys and values to ensure efficient storage and retrieval.\n- Use meaningful names for your maps that reflect their purpose in the contract.\n- Consider using composite keys (tuples) for more complex data relationships.\n- Be mindful of the gas costs associated with map operations, especially for large datasets.\n\n## Practical Example: Simple User Profile System\n\nLet's implement a basic user profile system using `define-map`:\n\n```clarity\n(define-map UserProfiles principal { name: (string-ascii 50), age: uint, isActive: bool })\n\n(define-public (set-profile (name (string-ascii 50)) (age uint))\n (ok (map-set UserProfiles tx-sender { name: name, age: age, isActive: true }))\n)\n\n(define-read-only (get-profile (user principal))\n (default-to { name: \"\", age: u0, isActive: false } (map-get? UserProfiles user))\n)\n\n(define-public (deactivate-profile)\n (match (map-get? UserProfiles tx-sender) profile\n (ok (map-set UserProfiles tx-sender (merge profile { isActive: false })))\n (err u404)\n )\n)\n\n;; Usage\n(set-profile \"Ryan\" u38)\n(get-profile tx-sender)\n(deactivate-profile)\n```\n\nThis example demonstrates:\n1. Using `define-map` to create a user profile storage system.\n2. Implementing functions to set, get, and update profile data.\n3. Using map operations like `map-set`, `map-get?`, and `merge` to manipulate map data.\n4. Handling cases where a profile might not exist using `default-to`.\n\n## Common Pitfalls\n\n1. Forgetting that maps are not iterable in Clarity; you can't loop through all entries.\n2. Not handling cases where a key might not exist in the map.\n3. Overusing maps for data that might be better suited for other data structures.\n4. Not considering the gas costs of map operations in complex contracts.\n\n## Related Functions\n\n- `map-get?`: Used to retrieve a value from a map, returns an optional.\n- `map-set`: Used to set or update a value in a map.\n- `map-delete`: Used to remove a key-value pair from a map.\n- `map-insert`: Used to insert a new key-value pair only if the key doesn't already exist.\n- `merge`: Used to merge two maps, combining their key-value pairs.\n\n## Conclusion\n\nThe `define-map` function is a powerful tool for creating structured data storage in Clarity smart contracts. It allows you to implement efficient key-value stores, enabling complex data relationships and lookups. When used effectively, maps can significantly enhance the functionality and organization of data within your smart contracts.\n" + }, + { + "title": "stx-account", + "description": "Query STX account information in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/stx-account", + "content": "\n## Function Signature\n\n```clarity\n(stx-account principal)\n```\n\n- Input: `principal`\n- Output: `(tuple (balance uint) (nonce uint) (stx-locked uint))`\n\n## Why it matters\n\nThe `stx-account` function is crucial for:\n\n1. Querying detailed information about a STX account.\n2. Implementing logic that requires account balance, nonce, and locked STX information.\n3. Ensuring data integrity by providing accurate account details.\n4. Simplifying the process of handling account-related operations in smart contracts.\n\n## When to use it\n\nUse `stx-account` when you need to:\n\n- Query detailed information about a STX account.\n- Implement logic that requires account balance, nonce, and locked STX information.\n- Ensure accurate account details for data integrity.\n- Handle account-related operations in your smart contract.\n\n## Best Practices\n\n- Ensure the `principal` is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other account functions for comprehensive account management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Querying STX Account Information\n\nLet's implement a function that queries the STX account information for a given principal:\n\n```clarity\n(define-read-only (get-stx-account-info (account principal))\n (stx-account account)\n)\n\n;; Usage\n(get-stx-account-info 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns (tuple (balance u0) (nonce u0) (stx-locked u0))\n```\n\nThis example demonstrates:\n1. Using `stx-account` to query detailed information about a STX account.\n2. Implementing a public function to handle the account information query.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `stx-account` with an incorrectly formatted or invalid `principal`, causing the operation to fail.\n2. Assuming the account information will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete account management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `stx-get-balance`: Queries the STX balance of a principal.\n- `stx-transfer?`: Transfers STX from one principal to another.\n- `stx-burn?`: Burns STX from a principal's account.\n\n## Conclusion\n\nThe `stx-account` function is a fundamental tool for querying detailed STX account information in Clarity smart contracts. It allows you to implement logic that requires account balance, nonce, and locked STX information, ensuring data integrity and simplifying account-related operations. When used effectively, `stx-account` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle account information queries.\n" + }, + { + "title": "define-public", + "description": "Define public functions in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/define-public", + "content": "\n## Function Signature\n\n```clarity\n(define-public (function-name (arg-name-0 arg-type-0) ...) function-body)\n```\n\n- Input: \n - `function-name`: The name of the public function\n - `arg-name-N`: The name of each argument\n - `arg-type-N`: The type of each argument\n - `function-body`: The code to be executed when the function is called\n- Output: A ResponseType (using `ok` or `err`)\n\n## Why it matters\n\nThe `define-public` function is crucial for:\n\n1. Creating functions that can be called from outside the contract.\n2. Enabling interaction with the contract through transactions.\n3. Implementing the main entry points for contract functionality.\n4. Allowing other contracts to call this contract's functions.\n\n## When to use it\n\nUse `define-public` when you need to:\n\n- Create functions that users can directly interact with.\n- Implement core contract functionality that should be accessible externally.\n- Define functions that other contracts can call via `contract-call?`.\n- Create functions that modify contract state and need to be invoked through transactions.\n\n## Best Practices\n\n- Always return a response type (`(response T E)`) from public functions.\n- Use descriptive names for public functions to clearly indicate their purpose.\n- Implement proper access control for sensitive operations.\n- Handle potential errors and edge cases within the function.\n- Consider gas costs when designing public functions.\n\n## Practical Examples\n\n### Example 1: Simple Counter\n\nLet's implement a simple counter that can be incremented by users:\n\n```clarity\n(define-data-var counter int 0)\n\n(define-public (increment-counter)\n (begin\n (var-set counter (+ (var-get counter) 1))\n (ok (var-get counter))\n )\n)\n```\n\nThis example demonstrates:\n1. Using `define-public` to create a function that can be called externally.\n2. Incrementing a counter and returning the new value.\n3. Returning a response type to indicate success.\n\n### Example 2: Setting a Value\n\nLet's implement a function that sets a value if it meets certain conditions:\n\n```clarity\n(define-data-var storedValue uint u0)\n\n(define-public (set-value (value uint))\n (if (> value u0)\n (begin\n (var-set storedValue value)\n (ok value)\n )\n (err u1)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `define-public` to create a function that can be called externally.\n2. Setting a value only if it meets a condition.\n3. Returning a response type to indicate success or failure.\n\n## Common Pitfalls\n\n1. Forgetting to return a response type, which will cause a contract to be invalid.\n2. Not implementing proper access controls, potentially allowing unauthorized actions.\n3. Overlooking potential error conditions or edge cases.\n4. Creating functions that are too complex or gas-intensive for practical use.\n\n## Related Functions\n\n- `define-private`: Used to define private functions that can only be called within the contract.\n- `define-read-only`: Used to define public read-only functions that don't modify contract state.\n- `contract-call?`: Used by other contracts to call public functions defined with `define-public`.\n\n## Conclusion\n\nThe `define-public` function is a fundamental building block for creating interactive and composable smart contracts in Clarity. By defining public functions, you can create contracts that users and other contracts can interact with, enabling complex decentralized applications. However, it's crucial to design these functions with security, efficiency, and usability in mind.\n" + }, + { + "title": "define-data-var", + "description": "Define mutable variables in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/define-data-var", + "content": "\n## Function Signature\n\n```clarity\n(define-data-var name type value)\n```\n\n- Input: \n - `name`: The name of the variable\n - `type`: The type of the variable\n - `value`: The initial value of the variable\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-data-var` function is crucial for:\n\n1. Creating mutable state variables that can be updated throughout the contract's lifecycle.\n2. Storing and managing changeable data within the smart contract.\n3. Implementing counters, flags, or other dynamic values that need to be modified.\n4. Maintaining contract-wide state that can be accessed and modified by multiple functions.\n\n## When to use it\n\nUse `define-data-var` when you need to:\n\n- Create a variable that will change its value during contract execution.\n- Implement a counter or accumulator that needs to be updated.\n- Store temporary or intermediate state that may be modified by contract functions.\n- Maintain configurable parameters that can be updated by authorized parties.\n\n## Best Practices\n\n- Use `define-data-var` for values that need to change; for immutable values, use `define-constant` instead.\n- Initialize variables with meaningful default values.\n- Consider access control for functions that modify important data variables.\n- Use clear and descriptive names for your variables to enhance readability.\n\n## Practical Example: Simple Counter\n\nLet's implement a basic counter using `define-data-var`:\n\n```clarity\n(define-data-var counter uint u0)\n\n(define-public (increment)\n (begin\n (var-set counter (+ (var-get counter) u1))\n (ok (var-get counter))\n )\n)\n\n(define-public (decrement)\n (begin\n (asserts! (> (var-get counter) u0) (err u\"Counter cannot be negative\"))\n (var-set counter (- (var-get counter) u1))\n (ok (var-get counter))\n )\n)\n\n(define-read-only (get-counter)\n (ok (var-get counter))\n)\n```\n\nThis example demonstrates:\n1. Using `define-data-var` to create a mutable counter.\n2. Implementing functions to increment and decrement the counter.\n3. Using `var-get` and `var-set` to read and modify the variable's value.\n4. Adding a safety check to prevent the counter from becoming negative.\n\n## Common Pitfalls\n\n1. Forgetting that `define-data-var` creates mutable state, which can lead to unexpected behavior if not managed carefully.\n2. Not considering the initial value's impact on contract logic, especially if the contract relies on the variable's state.\n3. Overusing mutable variables when constants or maps might be more appropriate for the use case.\n\n## Related Functions\n\n- `var-get`: Used to retrieve the current value of a data variable.\n- `var-set`: Used to update the value of a data variable.\n- `define-constant`: Used for defining immutable values.\n- `define-map`: Used for defining key-value stores when more complex data structures are needed.\n\n## Conclusion\n\nThe `define-data-var` function is essential for creating mutable state in Clarity smart contracts. It allows you to implement dynamic behavior and maintain changeable data throughout your contract's lifecycle. When used judiciously, data variables can greatly enhance the functionality and flexibility of smart contracts. However, you should be mindful of the implications of mutable state and ensure proper access control and error handling when modifying these variables.\n" + }, + { + "title": "nft-transfer?", + "description": "Transfer ownership of a non-fungible token (NFT) in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/nft-transfer", + "content": "\n## Function Signature\n\n```clarity\n(nft-transfer? asset-class asset-identifier sender recipient)\n```\n\n- Input: `AssetName, A, principal, principal`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `nft-transfer?` function is crucial for:\n\n1. Changing the ownership of a non-fungible token (NFT).\n2. Implementing logic that depends on the transfer of NFTs.\n3. Ensuring data integrity by updating ownership records.\n4. Simplifying the process of transferring NFTs in smart contracts.\n\n## When to use it\n\nUse `nft-transfer?` when you need to:\n\n- Change the ownership of an NFT.\n- Implement logic that depends on the transfer of NFTs.\n- Update ownership records in your smart contract.\n- Handle NFT transfer operations.\n\n## Best Practices\n\n- Ensure the `sender` principal owns the NFT before attempting to transfer it.\n- Ensure the `sender` and `recipient` are different principals.\n- Use meaningful variable names for better readability.\n- Combine with other NFT functions for comprehensive NFT management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Transferring an NFT\n\nLet's implement a function that transfers an NFT from the sender to the recipient:\n\n```clarity\n(define-non-fungible-token Stackaroo (string-ascii 40))\n\n(define-public (transfer-nft (id (string-ascii 40)) (recipient principal))\n (nft-transfer? Stackaroo id tx-sender recipient)\n)\n\n;; Usage\n(nft-mint? Stackaroo \"Roo\" tx-sender) ;; Returns (ok true)\n(transfer-nft \"Roo\" 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true)\n(nft-transfer? Stackaroo \"Roo\" tx-sender 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (err u1) because the sender no longer owns the asset\n(nft-transfer? Stackaroo \"NonExistent\" tx-sender 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (err u2) because the asset does not exist\n```\n\nThis example demonstrates:\n1. Using `nft-transfer?` to transfer an NFT from the sender to the recipient.\n2. Implementing a public function to handle the transfer operation.\n3. Handling both the successful transfer and the case where the sender no longer owns the asset.\n4. Handling the case where the asset does not exist.\n\n## Common Pitfalls\n\n1. Using `nft-transfer?` without ensuring the `sender` owns the NFT, causing the operation to fail.\n2. Assuming the `sender` and `recipient` are the same principal, leading to an invalid transfer.\n3. Not handling all possible conditions, resulting in incomplete NFT management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `nft-mint?`: Mints a new non-fungible token.\n- `nft-get-owner?`: Retrieves the owner of a non-fungible token.\n- `nft-burn?`: Burns a non-fungible token.\n\n## Conclusion\n\nThe `nft-transfer?` function is a fundamental tool for transferring ownership of non-fungible tokens in Clarity smart contracts. It allows you to change NFT ownership, implement transfer logic, and ensure data integrity. When used effectively, `nft-transfer?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle NFT transfer operations.\n" + }, + { + "title": "multiply", + "description": "Use the multiplication function for arithmetic operations in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/multiply", + "content": "\nThe multiplication function (`*`) in Clarity performs multiplication on a variable number of integer inputs. It's a fundamental arithmetic operation used in many smart contract calculations.\n\n## Function Signature\n\n```clarity\n(* i1 i2...)\n```\n\n- Input: Two or more integers (int or uint)\n- Output: A single integer (int or uint)\n\n## Why it matters\n\nThe multiplication function is crucial for:\n\n1. Performing basic arithmetic calculations within smart contracts.\n2. Scaling values, such as calculating fees or interest.\n3. Implementing more complex mathematical operations.\n4. Adjusting token amounts in financial contracts.\n\n## When to use it\n\nUse the multiplication function when you need to:\n\n- Perform basic multiplication in your contract logic.\n- Scale values proportionally.\n- Calculate compound values or rates.\n- Implement mathematical formulas that involve multiplication.\n\n## Best Practices\n\n- Always consider the possibility of overflow when multiplying large numbers.\n- Use appropriate types (int or uint) based on your needs and expected value ranges.\n- Consider using `mul-overflow?` for checked multiplication if overflow detection is needed.\n- Be aware that multiplying by zero will always return zero.\n\n## Practical Example: Token Vesting Contract\n\nLet's implement a simple token vesting contract that uses multiplication to calculate vested amounts:\n\n```clarity\n;; Define constants\n(define-constant VESTING_PERIOD u365) ;; 1 year in days\n(define-constant TOTAL_ALLOCATION u1000000) ;; Total tokens to vest\n\n;; Define data variables\n(define-data-var startTime uint u0)\n(define-data-var beneficiary principal tx-sender)\n\n;; Function to initialize vesting\n(define-public (start-vesting (recipient principal))\n (begin\n (asserts! (is-eq tx-sender (var-get beneficiary)) (err u1))\n (var-set startTime block-height)\n (var-set beneficiary recipient)\n (ok true)\n )\n)\n\n;; Function to calculate vested amount\n(define-read-only (get-vested-amount)\n (let\n (\n (elapsed-time (- block-height (var-get startTime)))\n (vesting-rate (/ TOTAL_ALLOCATION VESTING_PERIOD))\n )\n (if (>= elapsed-time VESTING_PERIOD)\n TOTAL_ALLOCATION\n (* vesting-rate elapsed-time)\n )\n )\n)\n\n;; Function to claim vested tokens\n(define-public (claim-tokens)\n (let\n (\n (vested-amount (get-vested-amount))\n )\n (asserts! (> vested-amount u0) (err u2))\n ;; Here you would typically transfer tokens\n ;; For simplicity, we're just returning the amount\n (ok vested-amount)\n )\n)\n```\n\nThis example demonstrates:\n1. Using multiplication to calculate the vested amount based on elapsed time and vesting rate.\n2. Combining multiplication with division to implement a linear vesting schedule.\n3. Using multiplication as part of a larger mathematical formula in a smart contract context.\n\n## Common Pitfalls\n\n1. Overlooking potential overflow when multiplying large numbers.\n2. Not considering the effect of integer division when combined with multiplication.\n3. Assuming multiplication always increases a value (forgetting about multiplication by fractions < 1 in integer arithmetic).\n\n## Related Functions\n\n- `/`: Used for division operations.\n- `+`: Used for addition operations.\n- `-`: Used for subtraction operations.\n- `mul-overflow?`: Used for checked multiplication with overflow detection.\n\n## Conclusion\n\nThe multiplication function is a fundamental tool for performing arithmetic operations in Clarity smart contracts. By understanding its behavior with different types of inputs and potential edge cases, you can use it effectively to implement various mathematical operations in your contracts, from simple scaling to more complex financial calculations.\n" + }, + { + "title": "default-to", + "description": "Provide a default value for optional types in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/default-to", + "content": "\n## Function Signature\n\n```clarity\n(default-to default-value option-value)\n```\n\n- Input: \n - `default-value`: A value of type A\n - `option-value`: An optional value of type (optional A)\n- Output: A value of type A\n\n## Why it matters\n\nThe `default-to` function is crucial for:\n\n1. Safely handling optional values in smart contracts.\n2. Providing fallback values when dealing with potentially missing data.\n3. Simplifying code that works with map lookups or other operations that may return `none`.\n4. Improving readability by reducing nested conditionals for optional handling.\n\n## When to use it\n\nUse the `default-to` function when you need to:\n\n- Provide a default value for a map lookup that might return `none`.\n- Handle optional function parameters or return values.\n- Set a fallback value for potentially missing data in your contract logic.\n- Simplify error handling for operations that might not return a value.\n\n## Best Practices\n\n- Choose meaningful default values that make sense in the context of your contract logic.\n- Use `default-to` to make your code more concise and readable when dealing with optionals.\n- Consider the implications of using the default value in your contract's logic.\n- Combine `default-to` with other Clarity functions like `map-get?` for efficient data handling.\n\n## Practical Example: User Profile Lookup\n\nLet's implement a function that retrieves a user's profile information with default values:\n\n```clarity\n(define-map UserProfiles principal { name: (string-ascii 50), age: uint })\n\n(define-read-only (get-user-profile (user principal))\n (let\n (\n (profile (map-get? UserProfiles user))\n )\n {\n name: (default-to \"Anonymous\" (get name profile)),\n age: (default-to u0 (get age profile))\n }\n )\n)\n\n;; Usage\n(map-set UserProfiles tx-sender { name: \"Alice\", age: u30 })\n(get-user-profile tx-sender) ;; Returns { name: \"Alice\", age: u30 }\n(get-user-profile 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5) ;; Returns { name: \"Anonymous\", age: u0 }\n```\n\nThis example demonstrates:\n1. Using `default-to` with `map-get?` to handle potentially missing user profiles.\n2. Providing default values for individual fields within the profile.\n3. Creating a safe way to retrieve user information without explicit null checks.\n\n## Common Pitfalls\n\n1. Forgetting that `default-to` only works with optional types, not with general error handling.\n2. Using default values that might be indistinguishable from valid data, leading to confusion.\n3. Overusing `default-to` where explicit error handling might be more appropriate.\n\n## Related Functions\n\n- `map-get?`: Often used in combination with `default-to` for safe map lookups.\n- `get`: Can return optional values that are then handled by `default-to`.\n- `some`: Used to create optional values that can be handled by `default-to`.\n\n## Conclusion\n\nThe `default-to` function is a powerful tool for handling optional values in Clarity smart contracts. By providing a clean way to specify fallback values, this function enhances code readability and safety when dealing with potentially missing data. When used judiciously, `default-to` can significantly simplify your contract logic and make it more robust against unexpected inputs or states.\n" + }, + { + "title": "get-stacks-block-info?", + "description": "Fetch information about Stacks blocks in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/get-stacks-block-info", + "content": "\n<Callout>\nIn Clarity 3, this function replaces the deprecated `get-block-info?` function.\n</Callout>\n\n## Function Signature\n\n```clarity\n(get-stacks-block-info? prop-name block-height)\n```\n\n- Input: \n - `prop-name`: A StacksBlockInfoPropertyName\n - `block-height`: A uint representing the Stacks block height\n- Output: `(optional buff) | (optional uint)` depending on the property\n\n## Why it matters\n\nThe `get-stacks-block-info?` function is crucial for:\n\n1. Accessing historical Stacks block data within smart contracts\n2. Retrieving globally unique block identifiers\n3. Implementing time-based logic using block information\n4. Verifying block-related properties for security or validation purposes\n\n## When to use it\n\nUse `get-stacks-block-info?` when you need to:\n\n- Retrieve unique identifiers for Stacks blocks\n- Access block timestamps for time-based logic\n- Verify block hashes for validation purposes\n- Implement logic that depends on block information\n\n## Best Practices\n\n- Always use `id-header-hash` when global uniqueness is required\n- Handle the `none` case for non-existent or future blocks\n- Be aware of the different timestamp sources before and after epoch 3.0\n- Consider caching frequently accessed block information\n\n## Practical Example: Block Hash Verification\n\n```clarity\n(define-read-only (verify-block-hash (blockHeight uint) (expectedHash (buff 32)))\n (match (get-stacks-block-info? id-header-hash blockHeight)\n hash (is-eq hash expectedHash)\n false\n )\n)\n\n;; Usage\n(verify-block-hash u100 0x374708fff7719dd5979ec875d56cd2286f6d3cf7ec317a3b25632aab28ec37bb)\n```\n\nThis example demonstrates:\n1. Retrieving a block's unique identifier\n2. Handling the optional return value\n3. Comparing block hashes for verification\n\n## Available Properties\n\n- `id-header-hash`: Returns the globally unique index block hash (buff 32)\n- `header-hash`: Returns the Stacks block's header hash (buff 32)\n- `time`: Returns the block time as Unix epoch timestamp (uint)\n\n## Common Pitfalls\n\n1. Using `header-hash` when global uniqueness is required (use `id-header-hash` instead)\n2. Not handling the `none` case for invalid or future block heights\n3. Assuming block times are exact (accuracy varies by epoch):\n - Pre-epoch 3.0: Accurate within two hours\n - Post-epoch 3.0: Must be greater than previous block and at most 15 seconds in the future\n4. Not considering the different timestamp sources across epochs\n\n## Related Functions\n\n- `get-tenure-info?`: Used to get information about block tenures\n- `block-height`: Returns the current block height\n- `at-block`: Used with `id-header-hash` for historical state access\n\n## Conclusion\n\nThe `get-stacks-block-info?` function, introduced in Clarity 3, provides essential access to Stacks block data in smart contracts. This function offers reliable ways to access block identifiers and timestamps, with important considerations for global uniqueness and time accuracy across different epochs. Understanding its properties and limitations is crucial for building robust smart contracts that interact with historical blockchain state.\n\n" + }, + { + "title": "map", + "description": "Apply a function to each element of a list in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/map", + "content": "\n## Function Signature\n\n```clarity\n(map function list)\n```\n\n- Input: `(function (A) => B)`, `(list A)`\n- Output: `(list B)`\n\n## Why it matters\n\nThe `map` function is crucial for:\n\n1. Applying a function to each element of a list.\n2. Transforming lists by applying operations to their elements.\n3. Simplifying the process of performing bulk operations on lists.\n4. Enhancing code readability and maintainability by abstracting repetitive operations.\n\n## When to use it\n\nUse `map` when you need to:\n\n- Apply a function to each element of a list.\n- Transform a list by applying operations to its elements.\n- Perform bulk operations on lists.\n- Simplify and abstract repetitive operations on list elements.\n\n## Best Practices\n\n- Ensure the function being applied is compatible with the elements of the list.\n- Use meaningful variable names for better readability.\n- Combine with other list functions for comprehensive list handling.\n- Be aware of the performance implications of applying functions to large lists.\n\n## Practical Example: Doubling Each Element in a List\n\nLet's implement a function that doubles each element in a list of integers:\n\n```clarity\n(define-private (double (n int))\n (* n 2)\n)\n\n(define-read-only (double-elements (numbers (list 10 int)))\n (map double numbers)\n)\n\n;; Usage\n(double-elements (list 1 2 3 4 5)) ;; Returns (list 2 4 6 8 10)\n```\n\nThis example demonstrates:\n1. Defining a private function `double` to double an integer.\n2. Using `map` to apply the `double` function to each element in a list.\n3. Implementing a read-only function to return the transformed list.\n4. Handling both small and large input lists.\n\n## Common Pitfalls\n\n1. Using `map` with incompatible function and list element types, causing type errors.\n2. Assuming the list will always be within a certain length, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete list transformations.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `filter`: Filters elements of a list based on a predicate function.\n- `fold`: Reduces a list to a single value by applying a function.\n- `len`: Returns the length of a list.\n\n## Conclusion\n\nThe `map` function is a fundamental tool for applying functions to each element of a list in Clarity smart contracts. It allows you to transform lists, perform bulk operations, and simplify repetitive tasks. When used effectively, `map` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage list transformations.\n" + }, + { + "title": "sqrti", + "description": "Calculate the integer square root of a number in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/sqrti", + "content": "\n## Function Signature\n\n```clarity\n(sqrti n)\n```\n\n- Input: `int | uint`\n- Output: `int | uint`\n\n## Why it matters\n\nThe `sqrti` function is crucial for:\n\n1. Calculating the largest integer less than or equal to the square root of a number.\n2. Implementing mathematical operations in smart contracts.\n3. Ensuring data integrity by providing precise integer square root calculations.\n4. Simplifying the process of handling square root operations in smart contracts.\n\n## When to use it\n\nUse `sqrti` when you need to:\n\n- Calculate the integer square root of a number.\n- Implement mathematical operations in your smart contract.\n- Ensure precise integer square root calculations.\n- Handle square root operations.\n\n## Best Practices\n\n- Ensure the input value is non-negative to avoid runtime errors.\n- Use meaningful variable names for better readability.\n- Combine with other mathematical functions for comprehensive calculations.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Calculating Integer Square Roots\n\nLet's implement a function that calculates the integer square root of a given number:\n\n```clarity\n(define-read-only (calculate-sqrti (input uint))\n (sqrti input)\n)\n\n;; Usage\n(calculate-sqrti u11) ;; Returns u3\n(calculate-sqrti u1000000) ;; Returns u1000\n(calculate-sqrti u1) ;; Returns u1\n(calculate-sqrti u0) ;; Returns u0\n```\n\nThis example demonstrates:\n1. Using `sqrti` to calculate the integer square root of a given number.\n2. Implementing a public function to handle the square root calculation.\n3. Handling both small and large input values.\n\n## Common Pitfalls\n\n1. Using `sqrti` with negative numbers, causing the operation to fail.\n2. Assuming the result will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete mathematical operations.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `*`: Multiplies two or more numbers.\n- `+`: Adds two or more numbers.\n- `-`: Subtracts one number from another.\n- `/`: Divides one number by another.\n\n## Conclusion\n\nThe `sqrti` function is a fundamental tool for calculating integer square roots in Clarity smart contracts. It allows you to implement precise mathematical operations, ensuring data integrity and simplifying square root calculations. When used effectively, `sqrti` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle integer square root operations.\n" + }, + { + "title": "log2", + "description": "Calculate the base-2 logarithm of a number in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/log2", + "content": "\n## Function Signature\n\n```clarity\n(log2 n)\n```\n\n- Input: `int | uint`\n- Output: `int | uint`\n\n## Why it matters\n\nThe `log2` function is crucial for:\n\n1. Calculating the base-2 logarithm of a number.\n2. Implementing mathematical operations that require logarithmic calculations.\n3. Simplifying the process of determining the power of 2 needed to obtain a given value.\n4. Facilitating operations that depend on logarithmic scaling.\n\n## When to use it\n\nUse `log2` when you need to:\n\n- Calculate the base-2 logarithm of an integer or unsigned integer.\n- Implement logic that depends on logarithmic calculations.\n- Determine the power of 2 needed to obtain a given value.\n- Simplify mathematical operations involving logarithms.\n\n## Best Practices\n\n- Ensure the input value is non-negative, as `log2` fails on negative numbers.\n- Use meaningful variable names for better readability.\n- Combine with other mathematical functions for comprehensive calculations.\n- Be aware of the integer rounding behavior of `log2`.\n\n## Practical Example: Calculating Logarithm of a Number\n\nLet's implement a function that calculates the base-2 logarithm of a given number:\n\n```clarity\n(define-read-only (calculate-log2 (n uint))\n (log2 n)\n)\n\n;; Usage\n(calculate-log2 u8) ;; Returns u3\n(calculate-log2 u16) ;; Returns u4\n```\n\nThis example demonstrates:\n1. Using `log2` to calculate the base-2 logarithm of a given number.\n2. Implementing a read-only function to return the logarithm.\n3. Handling both small and large input values.\n\n## Common Pitfalls\n\n1. Using `log2` on negative numbers, causing the function to fail.\n2. Assuming the result will always be an integer, leading to incorrect expectations.\n3. Not handling all possible conditions, resulting in incomplete calculations.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `sqrti`: Returns the largest integer that is less than or equal to the square root of a number.\n- `pow`: Raises a number to the power of another number.\n- `sqrt`: Returns the square root of a number.\n\n## Conclusion\n\nThe `log2` function is a fundamental tool for calculating the base-2 logarithm of numbers in Clarity smart contracts. It allows you to perform logarithmic calculations, enabling robust and comprehensive mathematical operations. When used effectively, `log2` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage logarithmic calculations.\n" + }, + { + "title": "and", + "description": "Use the and function for logical operations in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/and", + "content": "\nThe `and` function in Clarity performs a logical AND operation on two or more boolean inputs. It's a fundamental logical operation used in many smart contract conditions and control flows.\n\n## Function Signature\n\n```clarity\n(and b1 b2 ...)\n```\n\n- Input: Two or more boolean values\n- Output: A single boolean value\n\n## Why it matters\n\nThe `and` function is crucial for:\n\n1. Implementing complex conditional logic in smart contracts.\n2. Combining multiple conditions that all need to be true.\n3. Short-circuiting evaluations for efficiency.\n4. Creating sophisticated access control mechanisms.\n\n## When to use it\n\nUse the `and` function when you need to:\n\n- Check if multiple conditions are all true.\n- Implement multi-factor authentication or permissions.\n- Optimize condition checking by short-circuiting.\n- Combine the results of multiple comparison operations.\n\n## Best Practices\n\n- Leverage the short-circuiting behavior for efficiency.\n- Order conditions from most likely to fail to least likely for better performance.\n- Use parentheses to group complex logical expressions for clarity.\n- Consider breaking very complex `and` expressions into separate functions or variables for readability.\n\n## Practical Example: Simple Access Control\n\nLet's implement a simple access control function that uses the `and` function to check multiple conditions:\n\n```clarity\n(define-constant CONTRACT_OWNER tx-sender)\n(define-data-var isAdmin bool false)\n(define-data-var isActive bool true)\n\n(define-public (set-admin (enabled bool))\n (begin\n (asserts! (is-eq tx-sender CONTRACT_OWNER) (err u1))\n (ok (var-set isAdmin enabled))\n )\n)\n\n(define-public (perform-sensitive-action)\n (begin\n (asserts! (and (var-get isAdmin) (var-get isActive)) (err u2))\n ;; Perform the sensitive action here\n (ok true)\n )\n)\n\n;; Usage\n(perform-sensitive-action) ;; Returns (err u2)\n(set-admin true) ;; Returns (ok true)\n(perform-sensitive-action) ;; Returns (ok true)\n```\n\nThis example demonstrates:\n1. Using `and` to check if the sender is an admin and if the contract is active.\n2. Combining multiple conditions in a single `and` expression.\n3. Leveraging short-circuiting to avoid unnecessary computations if the first condition fails.\n\n## Common Pitfalls\n\n1. Forgetting that `and` short-circuits, which might lead to unexpected behavior if side effects are intended in later conditions.\n2. Over-complicating logical expressions, making them hard to read and maintain.\n3. Not considering the order of conditions for optimal performance.\n\n## Related Functions\n\n- `or`: Used for logical OR operations.\n- `not`: Used to negate boolean values.\n- `asserts!`: Often used in combination with `and` for multiple condition checks.\n\n## Conclusion\n\nThe `and` function is a powerful tool for creating complex logical conditions in Clarity smart contracts. By understanding its short-circuiting behavior and using it effectively, you can create efficient and sophisticated contract logic, especially for scenarios requiring multiple conditions to be true simultaneously.\n" + }, + { + "title": "replace-at?", + "description": "Replace an element at a specific index in a sequence in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/replace-at", + "content": "\n## Function Signature\n\n```clarity\n(replace-at? sequence index new-element)\n```\n\n- Input: `sequence_A, uint, A`\n- Output: `(response sequence_A uint)`\n\n## Why it matters\n\nThe `replace-at?` function is crucial for:\n\n1. Modifying elements in a sequence at a specific index.\n2. Implementing logic that requires updating sequences.\n3. Ensuring data integrity by validating index and element replacement.\n4. Simplifying the process of handling sequence modifications in smart contracts.\n\n## When to use it\n\nUse `replace-at?` when you need to:\n\n- Modify an element in a sequence at a specific index.\n- Implement logic that requires updating sequences.\n- Validate the index and element replacement in your smart contract.\n- Handle sequence modification operations.\n\n## Best Practices\n\n- Ensure the `index` is within the bounds of the sequence.\n- Use meaningful variable names for better readability.\n- Combine with other sequence functions for comprehensive sequence management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Replacing an Element in a List\n\nLet's implement a function that replaces an element in a list at a specific index:\n\n```clarity\n(define-read-only (replace-element (items (list 5 int)) (index uint) (newElement int))\n (replace-at? items index newElement)\n)\n\n;; Usage\n(replace-element (list 1 2 3 4 5) u2 10) ;; Returns (some (list (1 2 10 4 5)))\n(replace-element (list 1 2 3 4 5) u5 10) ;; Returns (none) because the index is out of bounds\n```\n\nThis example demonstrates:\n1. Using `replace-at?` to modify an element in a list at a specific index.\n2. Implementing a public function to handle the element replacement.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `replace-at?` with an index that is out of bounds, causing the operation to fail.\n2. Assuming the sequence will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete sequence management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `append`: Adds an element to the end of a list.\n- `index-of?`: Returns the first index at which an item can be found in a sequence.\n- `get`: Retrieves an element from a sequence at a specific index.\n\n## Conclusion\n\nThe `replace-at?` function is a fundamental tool for modifying elements in sequences in Clarity smart contracts. It allows you to update sequences, ensuring data integrity and simplifying sequence handling. When used effectively, `replace-at?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle sequence modification operations.\n" + }, + { + "title": "len", + "description": "Get the length of a sequence in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/len", + "content": "\n## Function Signature\n\n```clarity\n(len sequence)\n```\n\n- Input: `sequence_A`\n- Output: `uint`\n\n## Why it matters\n\nThe `len` function is crucial for:\n\n1. Determining the length of various sequence types.\n2. Implementing logic that depends on the size of sequences.\n3. Ensuring data integrity by validating sequence lengths.\n4. Simplifying length checks in smart contract code.\n\n## When to use it\n\nUse `len` when you need to:\n\n- Get the length of a list, buffer, or string.\n- Implement logic that depends on the size of sequences.\n- Validate the length of input data.\n- Handle cases where the size of a sequence is important.\n\n## Best Practices\n\n- Ensure the sequence type is compatible with the `len` function.\n- Use meaningful variable names for better readability.\n- Combine with other functions for comprehensive sequence handling.\n- Be aware of the maximum length of sequences in Clarity.\n\n## Practical Example: Validating a List Length\n\nLet's implement a function that validates the length of a list of integers:\n\n```clarity\n(define-read-only (validate-list-length (numbers (list 10 int)))\n (let\n (\n (length (len numbers))\n )\n (if (<= length u10)\n (ok length)\n (err u1)\n )\n )\n)\n\n;; Usage\n(validate-list-length (list 1 2 3 4 5)) ;; Returns (ok u5)\n(validate-list-length (list 1 2 3 4 5 6 7 8 9 10 11)) ;; Returns (err u1)\n```\n\nThis example demonstrates:\n1. Using `len` to get the length of a list of integers.\n2. Implementing conditional logic based on the length of the list.\n3. Handling both the case where the list length is valid and where it is not.\n\n## Common Pitfalls\n\n1. Using `len` on incompatible types, causing type errors.\n2. Assuming the length will always be within a certain range, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete length checks.\n4. Overlooking the need for comprehensive validation and error checking.\n\n## Related Functions\n\n- `as-max-len?`: Ensures a sequence does not exceed a maximum length.\n- `concat`: Concatenates multiple sequences.\n- `default-to`: Provides default values for optional types.\n\n## Conclusion\n\nThe `len` function is a fundamental tool for getting the length of sequences in Clarity smart contracts. It allows you to determine the size of lists, buffers, and strings, enabling robust and comprehensive sequence handling and validation logic. When used effectively, `len` enhances the reliability and maintainability of your smart contract code by ensuring that sequence lengths are detected and handled appropriately.\n" + }, + { + "title": "sha512/256", + "description": "Compute the SHA-512/256 hash of a value in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/sha512-256", + "content": "\n## Function Signature\n\n```clarity\n(sha512/256 value)\n```\n\n- Input: `buff | uint | int`\n- Output: `(buff 32)`\n\n## Why it matters\n\nThe `sha512/256` function is crucial for:\n\n1. Computing the SHA-512/256 hash of a given value.\n2. Implementing cryptographic operations in smart contracts.\n3. Ensuring data integrity by generating unique hashes.\n4. Simplifying the process of handling cryptographic hashing in smart contracts.\n\n## When to use it\n\nUse `sha512/256` when you need to:\n\n- Compute the SHA-512/256 hash of a given value.\n- Implement cryptographic operations in your smart contract.\n- Generate unique hashes to ensure data integrity.\n- Handle cryptographic hashing operations.\n\n## Best Practices\n\n- Ensure the input value is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for comprehensive security management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Computing a SHA-512/256 Hash\n\nLet's implement a function that computes the SHA-512/256 hash of a given buffer:\n\n```clarity\n(define-read-only (compute-sha512-256 (input (buff 32)))\n (sha512/256 input)\n)\n\n;; Usage\n(compute-sha512-256 0x68656c6c6f20776f726c64000000000000000000000000000000000000000000)\n;; Returns 0xcf0edb437886eae39b21ebad0caeea342d2bd61c98e9d09d0e89109a546d01fc\n```\n\nThis example demonstrates:\n1. Using `sha512/256` to compute the hash of a given buffer.\n2. Implementing a public function to handle the hash computation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `sha512/256` with incorrectly formatted or invalid input values, causing the operation to fail.\n2. Assuming the hash will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete cryptographic hashing.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `sha256`: Computes the SHA-256 hash of the input.\n- `sha512`: Computes the SHA-512 hash of the input.\n- `keccak256`: Computes the KECCAK-256 hash of the input.\n\n## Conclusion\n\nThe `sha512/256` function is a fundamental tool for computing SHA-512/256 hashes in Clarity smart contracts. It allows you to implement cryptographic operations, ensuring data integrity and simplifying cryptographic hashing. When used effectively, `sha512/256` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle cryptographic hashing operations.\n" + }, + { + "title": "divide", + "description": "Use the division function for arithmetic operations in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/divide", + "content": "\nThe division function (`/`) in Clarity performs integer division on a variable number of integer inputs. It's a fundamental arithmetic operation used in many smart contract calculations.\n\n## Function Signature\n\n```clarity\n(/ i1 i2...)\n```\n\n- Input: Two or more integers (int or uint)\n- Output: A single integer (int or uint)\n\n## Why it matters\n\nThe division function is crucial for:\n\n1. Performing basic arithmetic calculations within smart contracts.\n2. Calculating rates, percentages, or proportions.\n3. Distributing resources or tokens evenly.\n4. Implementing mathematical formulas that involve division.\n\n## When to use it\n\nUse the division function when you need to:\n\n- Perform basic division in your contract logic.\n- Calculate rates or percentages.\n- Distribute resources evenly among participants.\n- Implement mathematical formulas that involve division.\n\n## Best Practices\n\n- Always consider the possibility of division by zero, which throws a runtime error.\n- Be aware that Clarity uses integer division, so results are always rounded down.\n- Use appropriate types (int or uint) based on your needs and expected value ranges.\n- Consider using multiplication by fractions instead of division for more precise calculations.\n\n## Practical Example: Token Distribution Contract\n\nLet's implement a simple token distribution contract that uses division to allocate tokens evenly:\n\n```clarity\n;; Define constants\n(define-constant TOTAL_TOKENS u1000000)\n(define-constant DISTRIBUTION_ROUNDS u10)\n\n;; Define data variables\n(define-map ParticipantShares principal uint)\n(define-data-var currentRound uint u0)\n(define-data-var participantsCount uint u0)\n\n;; Function to register as a participant\n(define-public (register-participant)\n (let\n (\n (currentParticipants (var-get participantsCount))\n )\n (asserts! (< currentParticipants DISTRIBUTION_ROUNDS) (err u1))\n (map-set ParticipantShares tx-sender u0)\n (var-set participantsCount (+ currentParticipants u1))\n (ok true)\n )\n)\n\n;; Function to distribute tokens\n(define-public (distribute-tokens)\n (let\n (\n (currentParticipants (var-get participantsCount))\n (tokensPerParticipant (/ TOTAL_TOKENS currentParticipants))\n )\n (asserts! (> currentParticipants u0) (err u2))\n (asserts! (< (var-get currentRound) DISTRIBUTION_ROUNDS) (err u3))\n (map-set ParticipantShares tx-sender tokensPerParticipant)\n (var-set currentRound (+ (var-get currentRound) u1))\n (ok tokensPerParticipant)\n )\n)\n\n;; Function to check participant's share\n(define-read-only (get-participant-share (participant principal))\n (default-to u0 (map-get? ParticipantShares participant))\n)\n```\n\nThis example demonstrates:\n1. Using division to calculate the number of tokens each participant should receive.\n2. Handling potential division by zero by checking the number of participants.\n3. Using integer division to evenly distribute tokens among participants.\n\n## Common Pitfalls\n\n1. Forgetting to handle division by zero, which causes a runtime error.\n2. Not accounting for integer division rounding down, which can lead to unexpected results.\n3. Dividing before multiplying in complex calculations, potentially losing precision.\n\n## Related Functions\n\n- `*`: Used for multiplication operations.\n- `+`: Used for addition operations.\n- `-`: Used for subtraction operations.\n\n## Conclusion\n\nThe division function is a fundamental tool for performing arithmetic operations in Clarity smart contracts. By understanding its behavior with integer division and potential edge cases, you can use it effectively to implement various mathematical operations in their contracts, from simple divisions to more complex token distribution algorithms.\n" + }, + { + "title": "bit-and", + "description": "Use the bit-and function for bitwise operations in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/bit-and", + "content": "\nThe `bit-and` function in Clarity performs a bitwise AND operation on two or more integer inputs. It's a powerful tool for working with compact data representations and flag systems in smart contracts.\n\n## Function Signature\n\n```clarity\n(bit-and i1 i2...)\n```\n\n- Input: Two or more integers (int or uint)\n- Output: A single integer (int or uint)\n\n## Why it matters\n\nThe `bit-and` function is crucial for:\n\n1. Efficient data storage: Allows packing multiple boolean flags into a single integer.\n2. Permission systems: Enables checking for specific permissions in a compact format.\n3. Bitmasking: Useful for isolating specific bits in a larger integer.\n4. Low-level optimizations: Can be used for certain mathematical operations.\n\n## When to use it\n\nUse `bit-and` when you need to:\n\n- Check if specific bits are set in a bitfield\n- Implement compact permission or flag systems\n- Clear specific bits while leaving others unchanged\n- Perform certain low-level optimizations\n\n## Best Practices\n\n- Always use constants for bit flags to improve readability and maintainability.\n- Be cautious when using with signed integers, as the sign bit can affect results.\n- Combine with other bitwise operations like `bit-or` and `bit-not` for more complex manipulations.\n- Document your bit flag meanings clearly in your contract.\n\n## Practical Example: Role-Based Access Control\n\nLet's implement a simple role-based access control system using `bit-and`:\n\n```clarity\n;; Define role constants\n(define-constant ROLE_ADMIN u1) ;; 0001\n(define-constant ROLE_MODERATOR u2) ;; 0010\n(define-constant ROLE_USER u4) ;; 0100\n\n;; Map to store user roles\n(define-map UserRoles principal uint)\n\n;; Function to check if a user has a specific role\n(define-read-only (has-role? (user principal) (role uint))\n (let\n ((userRole (default-to u0 (map-get? UserRoles user))))\n (is-eq (bit-and userRole role) role)\n )\n)\n\n;; Function to add a role to a user\n(define-public (add-role (user principal) (role uint))\n (let\n ((currentRole (default-to u0 (map-get? UserRoles user))))\n (ok (map-set UserRoles user (bit-or currentRole role)))\n )\n)\n\n;; Function to remove a role from a user\n(define-public (remove-role (user principal) (role uint))\n (let\n ((currentRole (default-to u0 (map-get? UserRoles user))))\n (ok (map-set UserRoles user (bit-and currentRole (bit-not role))))\n )\n)\n\n;; Example usage\n(add-role tx-sender (bit-or ROLE_MODERATOR ROLE_USER))\n(has-role? tx-sender ROLE_MODERATOR) ;; Returns true\n(has-role? tx-sender ROLE_ADMIN) ;; Returns false\n(remove-role tx-sender ROLE_USER)\n(has-role? tx-sender ROLE_USER) ;; Returns false\n```\n\nThis example demonstrates:\n1. Using `bit-and` to check for specific roles.\n2. Combining `bit-and` with `bit-or` and `bit-not` for role management.\n3. Efficient storage of multiple roles in a single integer.\n\n## Common Pitfalls\n\n1. Forgetting that `bit-and` with 0 always results in 0.\n2. Not accounting for the sign bit when using signed integers.\n3. Overcomplicating bit flag systems, making them hard to maintain.\n\n## Related Functions\n\n- `bit-or`: Used to set bits or combine flags.\n- `bit-not`: Used to invert bits, often in combination with `bit-and` for clearing specific bits.\n- `bit-xor`: Used for toggling specific bits.\n\n## Conclusion\n\nThe `bit-and` function is a powerful tool for working with compact data representations in Clarity. By mastering this function along with other bitwise operations, you can create efficient and sophisticated smart contracts that make optimal use of storage and perform complex flag-based logic.\n" + }, + { + "title": "less than", + "description": "Use the less than function for comparisons in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/less-than", + "content": "\nThe less than function (`<`) in Clarity compares two values and returns true if the first value is less than the second. It's a fundamental comparison operation used in many smart contract conditions and logic flows.\n\n## Function Signature\n\n```clarity\n(< v1 v2)\n```\n\n- Input: Two values of the same type (int, uint, string-ascii, string-utf8, or buff)\n- Output: A boolean (true or false)\n\n## Why it matters\n\nThe less than function is crucial for:\n\n1. Implementing conditional logic in smart contracts.\n2. Comparing numerical values for financial operations.\n3. Ordering and sorting data.\n4. Implementing maximum thresholds or limits in contract logic.\n\n## When to use it\n\nUse the less than function when you need to:\n\n- Compare two numerical values to determine if one is smaller.\n- Implement maximum thresholds for certain operations.\n- Create conditional logic based on numerical comparisons.\n- Sort or order data based on numerical or lexicographical order.\n\n## Best Practices\n\n- Ensure that both inputs are of the same type to avoid runtime errors.\n- Be aware of the differences in comparison between signed (int) and unsigned (uint) integers.\n- When comparing strings or buffers, understand that the comparison is lexicographical.\n- Consider edge cases, especially when dealing with the limits of integer ranges.\n\n## Practical Example: Auction Contract with Maximum Bid\n\nLet's implement a simple auction contract that uses the less than function to enforce a maximum bid amount:\n\n```clarity\n;; Define constants\n(define-constant MAX_BID u1000000000) ;; 1000 STX\n(define-constant AUCTION_END_HEIGHT u100)\n\n;; Define data variables\n(define-data-var currentHighestBid uint u0)\n(define-data-var highestBidder (optional principal) none)\n\n;; Function to place a bid\n(define-public (place-bid (bid uint))\n (let\n (\n (current-block-height block-height)\n )\n ;; Check if the auction is still open\n (asserts! (< current-block-height AUCTION_END_HEIGHT) (err u1))\n ;; Check if the bid is less than the maximum allowed bid\n (asserts! (< bid MAX_BID) (err u2))\n ;; Check if the bid is higher than the current highest bid\n (asserts! (> bid (var-get currentHighestBid)) (err u3))\n ;; Place the bid\n (try! (stx-transfer? bid tx-sender (as-contract tx-sender)))\n (var-set currentHighestBid bid)\n (var-set highestBidder (some tx-sender))\n (ok bid)\n )\n)\n\n;; Function to check current highest bid\n(define-read-only (get-highest-bid)\n (ok (var-get currentHighestBid))\n)\n\n;; Function to check if auction has ended\n(define-read-only (auction-ended)\n (>= block-height AUCTION_END_HEIGHT)\n)\n```\n\nThis example demonstrates:\n1. Using `<` to check if the current block height is less than the auction end height.\n2. Using `<` to ensure the bid is less than the maximum allowed bid.\n3. Combining the less than check with other contract logic for an auction system.\n\n## Common Pitfalls\n\n1. Comparing values of different types, which will result in a runtime error.\n2. Not considering the inclusive nature of `<=` vs the exclusive nature of `<` when setting thresholds.\n3. Overlooking potential integer underflow when working with very small numbers.\n\n## Related Functions\n\n- `>`: Used for greater than comparisons.\n- `<=`: Used for less than or equal to comparisons.\n- `>=`: Used for greater than or equal to comparisons.\n\n## Conclusion\n\nThe less than function is a fundamental tool for implementing comparison logic in Clarity smart contracts. By understanding its behavior with different types and potential edge cases, you can create robust conditional logic and enforce important thresholds in your contracts.\n" + }, + { + "title": "ft-burn?", + "description": "Burn fungible tokens in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/ft-burn", + "content": "\n## Function Signature\n\n```clarity\n(ft-burn? token-name amount sender)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n - `amount`: The amount of tokens to burn (uint)\n - `sender`: The principal from whose balance the tokens will be burned\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `ft-burn?` function is crucial for:\n\n1. Decreasing the total supply of a fungible token.\n2. Implementing token burning mechanisms in tokenomics models.\n3. Allowing users to destroy their own tokens.\n4. Managing token supply in deflationary token systems.\n\n## When to use it\n\nUse `ft-burn?` when you need to:\n\n- Implement a token burning feature in your contract.\n- Reduce the circulating supply of a token.\n- Allow users to voluntarily destroy their tokens.\n- Execute deflationary mechanisms in your token economy.\n\n## Best Practices\n\n- Ensure that the `sender` has sufficient balance before attempting to burn.\n- Use `ft-burn?` in conjunction with proper access controls.\n- Consider emitting events or logging burns for transparency.\n- Be cautious when burning tokens from a different principal than `tx-sender`.\n\n## Practical Example: Token Burning Mechanism\n\nLet's implement a simple token burning function:\n\n```clarity\n(define-fungible-token cBtc)\n\n(define-data-var tokenAdmin principal tx-sender)\n\n(define-public (burn-tokens (amount uint))\n (ft-burn? cBtc amount tx-sender)\n)\n\n(define-public (burn-tokens-from (amount uint) (owner principal))\n (begin\n (asserts! (is-eq tx-sender (var-get tokenAdmin)) (err u3))\n (ft-burn? cBtc amount owner)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `ft-burn?` to burn tokens from the transaction sender.\n2. Implementing an admin function to burn tokens from any account.\n3. Using assertions to ensure only the admin can burn tokens from other accounts.\n\n## Common Pitfalls\n\n1. Attempting to burn more tokens than the `sender` has in their balance.\n2. Not checking the return value of `ft-burn?` to handle potential errors.\n3. Allowing unauthorized burning of tokens from other accounts.\n4. Forgetting that burned tokens are permanently destroyed and cannot be recovered.\n\n## Related Functions\n\n- `ft-mint?`: Used to create new tokens, increasing the total supply.\n- `ft-transfer?`: Used to transfer tokens between principals.\n- `ft-get-balance`: Used to check the token balance of a principal.\n- `ft-get-supply`: Used to get the current total supply of tokens.\n\n## Conclusion\n\nThe `ft-burn?` function is a powerful tool for managing the supply of fungible tokens in Clarity smart contracts. It allows for the implementation of deflationary mechanisms and gives users the ability to destroy their own tokens. When used correctly, this function can be a key component in sophisticated tokenomics models. However, it should be used with caution and with proper checks to ensure the integrity of your token system.\n" + }, + { + "title": "get", + "description": "Retrieve a value from a tuple in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/get", + "content": "\n## Function Signature\n\n```clarity\n(get key-name tuple)\n```\n\n- Input: \n - `key-name`: The name of the key in the tuple\n - `tuple`: The tuple to retrieve the value from\n- Output: The value associated with the key in the tuple\n\n## Why it matters\n\nThe `get` function is crucial for:\n\n1. Accessing specific values within tuple data structures.\n2. Extracting information from complex data types in contracts.\n3. Enabling efficient data retrieval in contract logic.\n4. Working with structured data returned by other functions or stored in variables.\n\n## When to use it\n\nUse `get` when you need to:\n\n- Access a specific field in a tuple.\n- Extract values from structured data returned by other functions.\n- Work with complex data types in your contract logic.\n- Implement data processing that involves tuple manipulation.\n\n## Best Practices\n\n- Ensure the key exists in the tuple to avoid runtime errors.\n- Use meaningful key names for better code readability.\n- Consider using `get` in combination with `optional` for safer data access.\n- Be aware of the performance implications when working with large tuples.\n\n## Practical Example: User Profile Management\n\nLet's implement a simple user profile system using tuples and the `get` function:\n\n```clarity\n(define-map UserProfiles { userId: principal } { name: (string-ascii 50), age: uint })\n\n(define-public (set-profile (name (string-ascii 50)) (age uint))\n (ok (map-set UserProfiles { userId: tx-sender } { name: name, age: age }))\n)\n\n(define-read-only (get-profile-name (user principal))\n (match (map-get? UserProfiles { userId: user }) profile\n (ok (get name profile))\n (err u404)\n )\n)\n\n(define-read-only (get-profile-age (user principal))\n (match (map-get? UserProfiles { userId: user }) profile\n (ok (get age profile))\n (err u404)\n )\n)\n\n;; Usage\n(set-profile \"Alice\" u30)\n(get-profile-name tx-sender) ;; Returns (ok \"Alice\")\n(get-profile-age tx-sender) ;; Returns (ok u30)\n```\n\nThis example demonstrates:\n1. Using `get` to retrieve specific fields from a tuple stored in a map.\n2. Implementing getter functions that use `get` to access tuple data.\n3. Handling cases where the profile might not exist.\n\n## Common Pitfalls\n\n1. Attempting to `get` a key that doesn't exist in the tuple, causing a runtime error.\n2. Forgetting that `get` is case-sensitive for key names.\n3. Not considering the performance impact of frequently accessing large tuples.\n\n## Related Functions\n\n- `merge`: Used to combine tuples, potentially creating new fields to `get`.\n- `tuple`: Used to create tuples that can be accessed with `get`.\n- `map-get?`: Often used in combination with `get` to retrieve data from maps.\n\n## Conclusion\n\nThe `get` function is a fundamental tool for working with tuples in Clarity smart contracts. It provides a straightforward way to access structured data, enabling developers to work with complex data types efficiently. When used effectively, `get` enhances the contract's ability to manage and process structured information, leading to more organized and maintainable smart contract code.\n" + }, + { + "title": "use-trait", + "description": "Import and use traits from other contracts in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/use-trait", + "content": "\n## Function Signature\n\n```clarity\n(use-trait trait-alias trait-identifier)\n```\n\n- Input: `VarName, TraitIdentifier`\n- Output: `Not Applicable`\n\n## Why it matters\n\nThe `use-trait` function is crucial for:\n\n1. Importing traits defined in other contracts.\n2. Implementing logic that requires conformance to specific interfaces.\n3. Ensuring code reusability and modularity by leveraging traits.\n4. Simplifying the process of using external traits in smart contracts.\n\n## When to use it\n\nUse `use-trait` when you need to:\n\n- Import traits defined in other contracts.\n- Implement logic that requires conformance to specific interfaces.\n- Ensure code reusability and modularity by leveraging traits.\n- Handle trait imports in your smart contract.\n\n## Best Practices\n\n- Use descriptive names for trait aliases for better readability.\n- Ensure the trait identifier is correctly formatted and valid.\n- Combine with other contract functions for comprehensive contract management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Importing and Using a Trait\n\nLet's implement a function that imports a trait and uses it in a contract:\n\n```clarity\n(use-trait token-trait 'SP2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR.token-trait)\n\n(define-public (forward-get-balance (user principal) (contract <token-trait>))\n (ok (contract-of contract))\n)\n\n;; Usage\n(forward-get-balance tx-sender 'SP2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR.token-trait)\n;; Returns the principal of the contract implementing the token-trait\n```\n\nThis example demonstrates:\n1. Using `use-trait` to import a trait from another contract.\n2. Implementing a public function to use the imported trait.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `use-trait` with incorrectly formatted or invalid trait identifiers, causing runtime errors.\n2. Assuming the trait import will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete contract management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `contract-of`: Returns the principal of the contract implementing the trait.\n- `define-trait`: Defines a new trait in the current contract.\n- `impl-trait`: Implements a trait in the current contract.\n\n## Conclusion\n\nThe `use-trait` function is a fundamental tool for importing and using traits from other contracts in Clarity smart contracts. It allows you to implement logic that requires conformance to specific interfaces, ensuring code reusability and modularity. When used effectively, `use-trait` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle trait imports.\n" + }, + { + "title": "to-uint", + "description": "Convert a signed integer to an unsigned integer in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/to-uint", + "content": "\n## Function Signature\n\n```clarity\n(to-uint value)\n```\n\n- Input: `int`\n- Output: `uint`\n\n## Why it matters\n\nThe `to-uint` function is crucial for:\n\n1. Converting signed integers to unsigned integers.\n2. Implementing logic that requires unsigned integer operations.\n3. Ensuring data integrity by validating the conversion process.\n4. Simplifying the process of handling integer conversions in smart contracts.\n\n## When to use it\n\nUse `to-uint` when you need to:\n\n- Convert a signed integer to an unsigned integer.\n- Implement logic that requires unsigned integer operations.\n- Validate the conversion process to ensure data integrity.\n- Handle integer conversions in your smart contract.\n\n## Best Practices\n\n- Ensure the input value is non-negative to avoid runtime errors.\n- Use meaningful variable names for better readability.\n- Combine with other integer functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Converting Signed Integer to Unsigned Integer\n\nLet's implement a function that converts a signed integer to an unsigned integer:\n\n```clarity\n(define-read-only (convert-to-uint (input int))\n (to-uint input)\n)\n\n;; Usage\n(convert-to-uint 42) ;; Returns u42\n(convert-to-uint 0) ;; Returns u0\n(convert-to-uint -1) ;; Causes a runtime error\n```\n\nThis example demonstrates:\n1. Using `to-uint` to convert a signed integer to an unsigned integer.\n2. Implementing a public function to handle the conversion process.\n3. Handling both positive and zero input values.\n\n## Common Pitfalls\n\n1. Using `to-uint` with negative values, causing a runtime error.\n2. Assuming the conversion will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `to-int`: Converts an unsigned integer to a signed integer.\n- `int-to-ascii`: Converts an integer to a string-ascii representation.\n- `int-to-utf8`: Converts an integer to a string-utf8 representation.\n\n## Conclusion\n\nThe `to-uint` function is a fundamental tool for converting signed integers to unsigned integers in Clarity smart contracts. It allows you to implement logic that requires unsigned integer operations, ensuring data integrity and simplifying integer conversions. When used effectively, `to-uint` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle integer conversions.\n" + }, + { + "title": "define-trait", + "description": "Define traits for interface-like behavior in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/define-trait", + "content": "\n## Function Signature\n\n```clarity\n(define-trait trait-name ((func1-name (arg1-type arg2-type ...) (return-type)) ...))\n```\n\n- Input: \n - `trait-name`: The name of the trait being defined\n - `func1-name`: The name of a function in the trait\n - `arg1-type, arg2-type, ...`: The types of the function's arguments\n - `return-type`: The return type of the function\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-trait` function is crucial for:\n\n1. Creating standardized interfaces for contracts to implement.\n2. Enabling polymorphic behavior in smart contract interactions.\n3. Facilitating contract composability and interoperability.\n4. Allowing for dynamic dispatch of contract calls based on traits.\n\n## When to use it\n\nUse `define-trait` when you need to:\n\n- Define a common interface that multiple contracts should adhere to.\n- Create a contract that can interact with any other contract implementing a specific trait.\n- Establish standards for token contracts or other common smart contract patterns.\n- Enable more flexible and modular smart contract architectures.\n\n## Best Practices\n\n- Use clear and descriptive names for traits and their functions.\n- Keep traits focused on a single responsibility or concept.\n- Consider creating traits for common patterns like token standards.\n- Use traits in combination with `use-trait` and `contract-call?` for dynamic contract interactions.\n\n## Practical Example: Token Trait\n\nLet's define a simple trait for a token contract:\n\n```clarity\n(define-trait token-trait\n (\n (transfer? (principal principal uint) (response bool uint))\n (get-balance (principal) (response uint uint))\n (get-token-uri () (response (optional (string-utf8 256)) uint))\n )\n)\n```\n\nThis example demonstrates:\n1. Defining a trait with multiple functions.\n2. Specifying function signatures with argument types and return types.\n3. Using response types to handle success and failure cases.\n\n## Common Pitfalls\n\n1. Defining overly complex traits that are difficult for other contracts to implement.\n2. Forgetting that traits are not implementations, just interface definitions.\n3. Not considering backwards compatibility when updating traits in newer contract versions.\n\n## Related Functions\n\n- `use-trait`: Used to import trait definitions from other contracts.\n- `impl-trait`: Used to declare that a contract implements a specific trait.\n- `contract-call?`: Often used in combination with traits for dynamic contract calls.\n- `contract-of`: Used to get the principal of a contract implementing a trait.\n\n## Conclusion\n\nThe `define-trait` function is a powerful tool for creating standardized interfaces in Clarity smart contracts. By defining traits, you can create more modular, interoperable, and flexible smart contract ecosystems. Traits enable contracts to interact with each other in a predictable way, fostering the development of complex decentralized applications and standards within the Stacks ecosystem.\n" + }, + { + "title": "int-to-utf8", + "description": "Convert integers to UTF-8 string representations in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/int-to-utf8", + "content": "\n## Function Signature\n\n```clarity\n(int-to-utf8 value)\n```\n\n\n\n\n- Input: `int | uint`\n- Output: `(string-utf8 40)`\n\n## Why it matters\n\nThe `int-to-utf8` function is crucial for:\n\n1. Converting integer values to their UTF-8 string representations.\n2. Facilitating the display and logging of numeric data in a more versatile encoding.\n3. Enabling the use of numeric values in contexts that require UTF-8 strings.\n4. Simplifying the process of creating human-readable outputs from numeric data.\n\n## When to use it\n\nUse `int-to-utf8` when you need to:\n\n- Convert an integer or unsigned integer to a UTF-8 string.\n- Display numeric values in a human-readable format.\n- Log or store numeric data as UTF-8 strings.\n- Prepare numeric data for concatenation with other UTF-8 strings.\n\n## Best Practices\n\n- Ensure the integer value is within the range that can be represented as a string.\n- Use meaningful variable names for better readability.\n- Combine with other string functions for more complex string manipulations.\n- Be aware of the maximum length of the resulting string (40 characters).\n\n## Practical Example: Logging a User's Balance\n\nLet's implement a function that logs a user's balance as a UTF-8 string:\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (log-balance (user principal))\n (let\n (\n (balance (default-to u0 (map-get? UserBalances { userId: user })))\n (balanceStr (int-to-utf8 balance))\n )\n (print balanceStr)\n )\n)\n\n;; Usage\n(map-set UserBalances { userId: tx-sender } { balance: u100 })\n(log-balance tx-sender) ;; Logs \"100\"\n```\n\n\n\n\nThis example demonstrates:\n1. Using `int-to-utf8` to convert a user's balance to a UTF-8 string.\n2. Logging the string representation of the balance using `print`.\n3. Handling the case where the user has no balance set.\n\n## Common Pitfalls\n\n1. Assuming the resulting string will always fit within 40 characters.\n2. Forgetting to handle cases where the integer value is not set or is zero.\n3. Using `int-to-utf8` in performance-critical sections without considering the overhead.\n4. Not combining with other string functions for more complex manipulations.\n\n## Related Functions\n\n- `print`: Used to log or display string values.\n- `concat`: Used to concatenate multiple strings.\n- `default-to`: Used to provide default values for optional types.\n\n## Conclusion\n\nThe `int-to-utf8` function is a powerful tool for converting integer values to their UTF-8 string representations in Clarity smart contracts. It enables you to create human-readable outputs from numeric data, facilitating logging, display, and storage of numeric values as strings. When used effectively, `int-to-utf8` enhances the readability and usability of numeric data within your smart contract code.\n" + }, + { + "title": "ok", + "description": "Construct a successful response type in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/ok", + "content": "\n## Function Signature\n\n```clarity\n(ok value)\n```\n\n- Input: `A`\n- Output: `(response A B)`\n\n## Why it matters\n\nThe `ok` function is crucial for:\n\n1. Constructing a successful response type.\n2. Indicating that a function executed successfully.\n3. Ensuring data integrity by clearly distinguishing between success and error states.\n4. Simplifying the process of handling function return values in smart contracts.\n\n## When to use it\n\nUse `ok` when you need to:\n\n- Construct a successful response type.\n- Indicate that a function executed successfully.\n- Clearly distinguish between success and error states.\n- Handle function return values in your smart contract.\n\n## Best Practices\n\n- Ensure the value passed to `ok` is the intended successful result.\n- Use meaningful variable names for better readability.\n- Combine with `err` for comprehensive response handling.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Returning a Successful Response\n\nLet's implement a function that returns a successful response with a value:\n\n```clarity\n(define-read-only (get-successful-response (value int))\n (ok value)\n)\n\n;; Usage\n(get-successful-response 5) ;; Returns (ok 5)\n```\n\nThis example demonstrates:\n1. Using `ok` to construct a successful response type.\n2. Implementing a read-only function to return a successful response.\n3. Handling the successful response case.\n\n## Common Pitfalls\n\n1. Using `ok` with an incorrect or invalid value, causing unexpected behavior.\n2. Assuming the response will always be successful, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete response handling.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `err`: Constructs an error response type.\n- `match`: Handles different branches or cases for optional and response types.\n\n## Conclusion\n\nThe `ok` function is a fundamental tool for constructing successful response types in Clarity smart contracts. It allows you to indicate successful function execution, ensure data integrity, and simplify response handling. When used effectively, `ok` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle successful responses.\n" + }, + { + "title": "define-non-fungible-token", + "description": "Define a new non-fungible token class in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/define-non-fungible-token", + "content": "\n## Function Signature\n\n```clarity\n(define-non-fungible-token asset-name asset-identifier-type)\n```\n\n- Input: \n - `asset-name`: The name of the non-fungible token class\n - `asset-identifier-type`: The type of the unique identifier for each token\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-non-fungible-token` function is crucial for:\n\n1. Creating new non-fungible token (NFT) classes within a smart contract.\n2. Establishing unique digital assets with individual identifiers.\n3. Implementing collectibles, digital art, or other unique token-based systems.\n4. Enabling NFT-related operations like minting, transferring, and ownership checks.\n\n## When to use it\n\nUse `define-non-fungible-token` when you need to:\n\n- Create a new NFT class for your smart contract or dApp.\n- Implement unique digital assets with distinct identifiers.\n- Establish a foundation for NFT-based features in your contract.\n- Create collectibles, digital art tokens, or other unique digital assets.\n\n## Best Practices\n\n- Place `define-non-fungible-token` at the top level of your contract, as it's a definition statement.\n- Choose an appropriate asset identifier type that ensures uniqueness for each token.\n- Use meaningful and descriptive names for your NFT classes.\n- Consider the scalability and gas costs associated with your chosen identifier type.\n\n## Practical Example: Simple Digital Art NFT\n\nLet's implement a basic digital art NFT system:\n\n```clarity\n(define-non-fungible-token SharkoBarko uint)\n\n(define-data-var index uint u0)\n\n(define-public (mint (who principal) (artwork-uri (string-utf8 256)))\n (let\n (\n (tokenId (var-get index))\n )\n (try! (nft-mint? SharkoBarko tokenId who))\n (var-set index (+ tokenId u1))\n (ok tokenId)\n )\n)\n\n(define-read-only (get-owner (tokenId uint))\n (ok (nft-get-owner? SharkoBarko tokenId))\n)\n\n(define-public (transfer (tokenId uint) (sender principal) (recipient principal))\n (begin\n (asserts! (is-eq tx-sender sender) (err u403))\n (nft-transfer? SharkoBarko tokenId sender recipient)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `define-non-fungible-token` to create a new NFT class for digital artwork.\n2. Implementing basic NFT operations like minting, checking ownership, and transferring.\n3. Using a simple incrementing integer as the token identifier.\n\n## Common Pitfalls\n\n1. Forgetting that each token in an NFT class must have a unique identifier.\n2. Not implementing proper access controls for minting and transferring operations.\n3. Choosing an identifier type that may lead to collisions or scalability issues.\n\n## Related Functions\n\n- `nft-mint?`: Used to create new tokens within the NFT class.\n- `nft-transfer?`: Used to transfer ownership of an NFT.\n- `nft-get-owner?`: Used to check the current owner of an NFT.\n- `nft-burn?`: Used to destroy an existing NFT.\n\n## Conclusion\n\nThe `define-non-fungible-token` function is a fundamental building block for creating NFT-based systems in Clarity smart contracts. It allows you to define custom non-fungible token classes with unique identifiers. When combined with other NFT-related functions, it enables the implementation of sophisticated systems for digital collectibles, art, and other unique digital assets on the Stacks blockchain.\n" + }, + { + "title": "ft-transfer?", + "description": "Transfer fungible tokens between principals in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/ft-transfer", + "content": "\n## Function Signature\n\n```clarity\n(ft-transfer? token-name amount sender recipient)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n - `amount`: The amount of tokens to transfer (uint)\n - `sender`: The principal sending the tokens\n - `recipient`: The principal receiving the tokens\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `ft-transfer?` function is crucial for:\n\n1. Moving fungible tokens between different principals within a smart contract.\n2. Implementing token transfer functionality in decentralized applications.\n3. Enabling token-based transactions and interactions between users or contracts.\n4. Facilitating token economy mechanisms within smart contracts.\n\n## When to use it\n\nUse `ft-transfer?` when you need to:\n\n- Transfer tokens from one account to another.\n- Implement payment or reward systems using custom tokens.\n- Allow users to send tokens to each other within your dApp.\n- Move tokens as part of more complex contract operations.\n\n## Best Practices\n\n- Always check the return value to ensure the transfer was successful.\n- Implement proper access controls to prevent unauthorized transfers.\n- Consider using `asserts!` or `try!` to handle transfer failures gracefully.\n- Be aware that any principal can call this function, so add necessary guards.\n- Verify sender has sufficient balance before attempting a transfer.\n\n## Practical Example: Token Transfer Function\n\nLet's implement a public function for transferring tokens with some basic checks:\n\n```clarity\n(define-fungible-token cBtc)\n\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (let\n (\n (sender tx-sender)\n )\n (asserts! (not (is-eq sender recipient)) (err u2))\n (asserts! (> amount u0) (err u3))\n (match (ft-transfer? cBtc amount sender recipient)\n success (ok success)\n error (err error)\n )\n )\n)\n\n;; Usage\n(ft-mint? cBtc u100 tx-sender)\n(transfer-tokens u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true)\n```\n\nThis example demonstrates:\n1. Using `ft-transfer?` within a public function to transfer tokens.\n2. Implementing basic checks for valid transfer conditions.\n3. Handling the response from `ft-transfer?` and propagating it to the caller.\n\n## Common Pitfalls\n\n1. Forgetting that `ft-transfer?` can be called by any principal, potentially leading to unauthorized transfers.\n2. Not handling all possible error cases returned by `ft-transfer?`.\n3. Attempting to transfer more tokens than the sender's balance.\n4. Using `ft-transfer?` with a token name that hasn't been defined in the contract.\n\n## Related Functions\n\n- `ft-mint?`: Used to create new tokens and assign them to a principal.\n- `ft-burn?`: Used to destroy tokens, reducing the balance of a principal.\n- `ft-get-balance`: Used to check the token balance of a principal.\n- `ft-get-supply`: Used to get the current total supply of tokens.\n\n## Conclusion\n\nThe `ft-transfer?` function is a fundamental component for implementing token transfers in Clarity smart contracts. It provides a straightforward way to move tokens between principals, enabling a wide range of token-based functionalities. When used with proper checks and balances, this function allows for the creation of secure and efficient token economies within decentralized applications on the Stacks blockchain.\n" + }, + { + "title": "is-err", + "description": "Check if a response is an error in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/is-err", + "content": "\n## Function Signature\n\n```clarity\n(is-err value)\n```\n\n- Input: `(response A B)`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-err` function is crucial for:\n\n1. Determining if a response value represents an error.\n2. Implementing error handling and validation logic.\n3. Ensuring robust contract behavior by checking for errors.\n4. Simplifying conditional checks based on response types.\n\n## When to use it\n\nUse `is-err` when you need to:\n\n- Check if a response value is an error.\n- Implement conditional logic based on the success or failure of operations.\n- Validate the results of function calls that return response types.\n- Handle errors gracefully in your contract logic.\n\n## Best Practices\n\n- Use `is-err` in combination with `match` or `if` for comprehensive error handling.\n- Ensure that the response value being checked is of the correct type.\n- Use meaningful variable names for better readability.\n- Combine with other response handling functions like `is-ok` for complete validation.\n\n## Practical Example: Validating a Token Transfer\n\nLet's implement a function that validates a token transfer and checks for errors:\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? UserBalances { userId: tx-sender })))\n (recipientBalance (default-to u0 (map-get? UserBalances { userId: recipient })))\n (transferResult (if (>= senderBalance amount)\n (begin\n (map-set UserBalances { userId: tx-sender } { balance: (- senderBalance amount) })\n (map-set UserBalances { userId: recipient } { balance: (+ recipientBalance amount) })\n (ok true)\n )\n (err u1)\n ))\n )\n (if (is-err transferResult)\n (err u2)\n (ok true)\n )\n )\n)\n\n;; Usage\n(map-set UserBalances { userId: tx-sender } { balance: u100 })\n(transfer-tokens u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true)\n(transfer-tokens u200 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (err u2)\n```\n\nThis example demonstrates:\n1. Using `is-err` to check if the token transfer operation resulted in an error.\n2. Implementing conditional logic based on the success or failure of the transfer.\n3. Handling both the success and error cases appropriately.\n\n## Common Pitfalls\n\n1. Assuming the response value is always of the correct type, leading to type errors.\n2. Not handling all possible error cases, resulting in incomplete error handling.\n3. Overlooking the need for comprehensive validation and error checking.\n4. Using `is-err` without meaningful error codes or messages, making debugging harder.\n\n## Related Functions\n\n- `is-ok`: Checks if a response value is `ok`.\n- `err`: Constructs an error response.\n- `ok`: Constructs a success response.\n\n## Conclusion\n\nThe `is-err` function is a fundamental tool for error handling in Clarity smart contracts. It allows you to check if a response value represents an error, enabling robust and comprehensive error handling and validation logic. When used effectively, `is-err` enhances the reliability and maintainability of your smart contract code by ensuring that errors are detected and handled appropriately.\n" + }, + { + "title": "ft-get-supply", + "description": "Retrieve the total supply of a fungible token in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/ft-get-supply", + "content": "\n## Function Signature\n\n```clarity\n(ft-get-supply token-name)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n- Output: `uint`\n\n## Why it matters\n\nThe `ft-get-supply` function is crucial for:\n\n1. Querying the current total supply of a fungible token.\n2. Implementing supply-dependent logic in token contracts.\n3. Providing transparency about the token's circulating supply.\n4. Enabling other contracts or off-chain applications to verify token supply.\n\n## When to use it\n\nUse `ft-get-supply` when you need to:\n\n- Check the current total supply of a token.\n- Implement logic that depends on the token's supply (e.g., minting limits).\n- Provide supply information to users or other contracts.\n- Verify the integrity of token operations by checking supply changes.\n\n## Best Practices\n\n- Use `ft-get-supply` in combination with `ft-mint?` and `ft-burn?` to manage token supply.\n- Consider caching the supply result if queried frequently to optimize gas usage.\n- Be aware that the supply can change between checks due to minting or burning operations.\n- Use in conjunction with `ft-get-balance` for comprehensive token management.\n\n## Practical Example: Supply-Limited Minting\n\nLet's implement a function that mints tokens only if it doesn't exceed a certain supply cap:\n\n```clarity\n(define-fungible-token cBtc)\n(define-constant MAX_SUPPLY u1000000)\n\n(define-public (mint (amount uint) (recipient principal))\n (let\n (\n (currentSupply (ft-get-supply cBtc))\n )\n (if (<= (+ currentSupply amount) MAX_SUPPLY)\n (ft-mint? cBtc amount recipient)\n (err u1)\n )\n )\n)\n\n;; Usage\n(mint u500000 tx-sender) ;; Returns (ok true)\n(ft-get-supply cBtc) ;; Returns u500000\n(mint u600000 tx-sender) ;; Returns (err u1)\n```\n\nThis example demonstrates:\n1. Using `ft-get-supply` to check the current token supply before minting.\n2. Implementing a supply cap check to limit token minting.\n3. Combining `ft-get-supply` with `ft-mint?` for supply management.\n\n## Common Pitfalls\n\n1. Assuming the supply remains constant between checks and operations.\n2. Not considering the potential for overflow when adding to the supply.\n3. Overusing `ft-get-supply` in loops, which can be inefficient for gas consumption.\n\n## Related Functions\n\n- `ft-mint?`: Used to create new tokens, increasing the total supply.\n- `ft-burn?`: Used to destroy tokens, decreasing the total supply.\n- `ft-get-balance`: Used to get the token balance of a specific principal.\n- `define-fungible-token`: Used to define the fungible token initially.\n\n## Conclusion\n\nThe `ft-get-supply` function is an essential tool for managing and querying the total supply of fungible tokens in Clarity smart contracts. It provides a straightforward way to access the current circulating supply, enabling you to implement supply-dependent logic and maintain transparency in token operations. When used effectively in combination with other token functions, this function ensures the integrity and accuracy of token supply management within your smart contracts.\n" + }, + { + "title": "as-max-len?", + "description": "Use the as-max-len? function to check and limit sequence lengths in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/as-max-len", + "content": "\n## Function Signature\n\n```clarity\n(as-max-len? sequence max_length)\n```\n\n- Input: \n - `sequence`: A sequence of type A (list, buff, string-ascii, or string-utf8)\n - `max_length`: A uint literal representing the maximum allowed length\n- Output: `(optional sequence_A)`\n\n## Why it matters\n\nThe `as-max-len?` function is crucial for:\n\n1. Enforcing length limits on sequences in smart contracts.\n2. Safely appending to lists or other sequences with maximum lengths.\n3. Validating input data before processing.\n4. Preventing potential overflow or excessive resource consumption.\n\n## When to use it\n\nUse the `as-max-len?` function when you need to:\n\n- Check if a sequence is within a specified maximum length.\n- Safely append to a list or other sequence with a known maximum length.\n- Validate user input or data from external sources.\n- Implement logic that depends on sequence length constraints.\n\n## Best Practices\n\n- Always use `as-max-len?` before appending to lists or other sequences with maximum lengths.\n- Combine with `unwrap!` or `unwrap-panic` when you're certain the length should be within limits.\n- Use meaningful error handling when the length check fails.\n- Consider the performance impact of frequent length checks in your contract logic.\n\n## Practical Example: Safe List Append\n\nLet's implement a function that safely appends to a list with a maximum length:\n\n```clarity\n(define-data-var myList (list 5 uint) (list))\n\n(define-public (safe-append (item uint))\n (let\n (\n (newList (unwrap! (as-max-len? (append (var-get myList) item) u5) (err u1)))\n )\n (ok (var-set myList newList))\n )\n)\n\n(define-read-only (get-list)\n (var-get myList)\n)\n\n;; Usage\n(safe-append u1) ;; Returns (ok true)\n(safe-append u2) ;; Returns (ok true)\n(safe-append u3) ;; Returns (ok true)\n(safe-append u4) ;; Returns (ok true)\n(safe-append u5) ;; Returns (ok true)\n(safe-append u6) ;; Returns (err u1)\n\n(get-list) ;; Returns (list u1 u2 u3 u4 u5)\n```\n\nThis example demonstrates:\n1. Using `as-max-len?` to check if appending to the list would exceed the maximum length.\n2. Combining `as-max-len?` with `unwrap!` for concise error handling.\n3. Safely updating a list variable only if the length check passes.\n\n## Common Pitfalls\n\n1. Forgetting to use `as-max-len?` when appending to sequences with maximum lengths.\n2. Using a variable for the `max_length` parameter, which is not allowed (it must be a uint literal).\n3. Not handling the `none` case when `as-max-len?` returns an optional.\n\n## Related Functions\n\n- `append`: Used to add elements to lists.\n- `concat`: Used to join two sequences together.\n- `len`: Used to get the current length of a sequence.\n\n## Conclusion\n\nThe `as-max-len?` function is a critical tool for managing sequence lengths in Clarity smart contracts. By using it consistently, you can create more robust and secure contracts that properly handle length constraints, preventing potential vulnerabilities related to unbounded data growth or unexpected input sizes.\n" + }, + { + "title": "get-tenure-info?", + "description": "Fetch information about Stacks tenures in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/get-tenure-info", + "content": "\n## Function Signature\n\n\n```clarity\n(get-tenure-info? prop-name block-height)\n```\n\n- Input: \n - `prop-name`: A TenureInfoPropertyName\n - `block-height`: A uint representing the Stacks block height\n- Output: `(optional buff) | (optional uint) | (optional principal)` depending on the property\n\n## Why it matters\n\nThe `get-tenure-info?` function is essential for:\n\n1. Accessing historical tenure data within smart contracts\n2. Retrieving information about block miners and rewards\n3. Accessing VRF seeds for randomness-based applications\n4. Analyzing miner participation and spending patterns\n\n## When to use it\n\nUse `get-tenure-info?` when you need to:\n\n- Access tenure-specific data like VRF seeds or miner addresses\n- Verify tenure timestamps or burnchain information\n- Analyze block rewards and miner spending patterns\n- Implement logic that depends on historical tenure data\n\n## Best Practices\n\n- Always handle the `none` case, as it will be returned for non-existent or future blocks\n- Be aware that block rewards are only available after maturity (101 blocks on mainnet)\n- Consider the two-hour accuracy window when working with tenure timestamps\n- Cache frequently accessed tenure information to optimize execution costs\n\n## Practical Example: Checking Miner Spending\n\n```clarity\n(define-read-only (get-miner-spend-ratio (blockHeight uint)))\n(let\n (\n (winnerSpend (get-tenure-info? miner-spend-winner blockHeight))\n (totalSpend (get-tenure-info? miner-spend-total blockHeight))\n )\n (match (tuple (winner winnerSpend) (total totalSpend))\n success (some (/ (get success \"winner\") (get success \"total\")))\n error none\n )\n)\n```\n\n## Available Properties\n\n- `burnchain-header-hash`: Returns the burnchain block header hash (buff 32)\n- `miner-address`: Returns the tenure miner's principal\n- `time`: Returns the tenure time as Unix epoch timestamp (uint)\n- `vrf-seed`: Returns the VRF seed for the tenure (buff 32)\n- `block-reward`: Returns the total block reward (uint)\n- `miner-spend-total`: Returns total spent by all miners for this tenure (uint)\n- `miner-spend-winner`: Returns amount spent by winning miner (uint)\n\n## Common Pitfalls\n\n1. Not accounting for block reward maturity period (101 blocks)\n2. Relying on exact tenure times (accuracy window of two hours)\n3. Not handling the `none` case for invalid or future block heights\n\n## Related Functions\n\n- `get-block-info?`: Used to get information about Stacks blocks\n- `block-height`: Returns the current block height\n- `burn-block-height`: Returns the current burn chain block height\n\n## Conclusion\n\nThe `get-tenure-info?` function provides crucial access to historical tenure data in Clarity smart contracts. Introduced in Clarity 3, this function enables developers to access detailed information about past tenures, including miner participation, block rewards, and VRF seeds. When used properly, `get-tenure-info?` is a powerful tool for implementing sophisticated contract logic that depends on historical blockchain state.\n" + }, + { + "title": "bit-xor", + "description": "Use the bit-xor function for bitwise exclusive OR operations in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/bit-xor", + "content": "\n## Function Signature\n\n```clarity\n(bit-xor i1 i2...)\n```\n\n- Input: Two or more integers (`int` or `uint`)\n- Output: An integer of the same type as the inputs (`int` or `uint`)\n\n## Why it matters\n\nThe `bit-xor` function is crucial for:\n\n1. Performing bitwise exclusive OR operations in smart contracts.\n2. Implementing certain cryptographic algorithms and hash functions.\n3. Creating toggle mechanisms for binary flags.\n4. Detecting changes between two bit patterns.\n\n## When to use it\n\nUse the `bit-xor` function when you need to:\n\n- Implement exclusive OR logic on binary data.\n- Toggle specific bits in a value without affecting others.\n- Compare two bit patterns to find differences.\n- Create simple encryption or hashing mechanisms.\n\n## Best Practices\n\n- Ensure all input values are of the same type (either all `int` or all `uint`).\n- Remember that `bit-xor` with 0 returns the original value, which can be useful for conditional operations.\n- Use `bit-xor` in combination with other bitwise operations for complex bit manipulations.\n- Consider the readability of your code when using bitwise operations extensively; add comments to explain the purpose.\n\n## Practical Example: Simple Toggle Mechanism\n\nLet's implement a simple toggle mechanism using `bit-xor`:\n\n```clarity\n(define-data-var flags uint u0)\n\n(define-read-only (get-flag (flagPosition uint))\n (is-eq (bit-and (var-get flags) (bit-shift-left u1 flagPosition)) u0)\n)\n\n(define-public (toggle-flag (flagPosition uint))\n (begin\n (asserts! (< flagPosition u8) (err u1)) ;; Ensure flag position is valid\n (ok (var-set flags (bit-xor (var-get flags) (bit-shift-left u1 flagPosition))))\n )\n)\n\n;; Usage\n(toggle-flag u2) ;; Toggles the 3rd bit (position 2)\n(get-flag u2) ;; Returns false\n(toggle-flag u2) ;; Toggles the 3rd bit again (position 2)\n(get-flag u2) ;; Returns true\n```\n\nThis example demonstrates:\n1. Using `bit-xor` to toggle individual bits in a flags variable.\n2. Combining `bit-xor` with other bitwise operations like `bit-and` and `bit-shift-left`.\n3. Implementing a simple flag system using bitwise operations for efficient storage and manipulation.\n\n## Common Pitfalls\n\n1. Mixing signed (`int`) and unsigned (`uint`) integers in a single `bit-xor` operation.\n2. Forgetting that `bit-xor` of a value with itself always results in 0.\n3. Not considering the full range of bits when using `bit-xor` with smaller integer values.\n\n## Related Functions\n\n- `bit-and`: Used for bitwise AND operations.\n- `bit-or`: Used for bitwise OR operations.\n- `bit-not`: Used for bitwise NOT operations.\n- `bit-shift-left`: Often used in combination with `bit-xor` for flag operations.\n- `bit-shift-right`: Used for right-shifting bits.\n\n## Conclusion\n\nThe `bit-xor` function is a powerful tool for bitwise operations in Clarity smart contracts. When used in combination with other bitwise functions, it enables efficient implementation of toggles, flags, and other bit-level data manipulations. To avoid unexpected results, be mindful of the types of integers used and the effects of the operation on the full range of bits.\n" + }, + { + "title": "define-private", + "description": "Define private functions in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/define-private", + "content": "\n## Function Signature\n\n```clarity\n(define-private (function-name (arg-name-0 arg-type-0) ...) function-body)\n```\n\n- Input: \n - `function-name`: The name of the private function\n - `arg-name-N`: The name of each argument\n - `arg-type-N`: The type of each argument\n - `function-body`: The code to be executed when the function is called\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-private` function is crucial for:\n\n1. Creating internal helper functions that are only accessible within the contract.\n2. Encapsulating logic that shouldn't be directly callable from outside the contract.\n3. Improving code organization and reusability within a contract.\n4. Implementing complex operations that are used by multiple public functions.\n\n## When to use it\n\nUse `define-private` when you need to:\n\n- Create utility functions that are used by multiple public functions.\n- Implement complex logic that needs to be hidden from external callers.\n- Break down large functions into smaller, more manageable pieces.\n- Improve the readability and maintainability of your contract.\n\n## Best Practices\n\n- Use descriptive names for private functions to clearly indicate their purpose.\n- Keep private functions focused on a single task or operation.\n- Use private functions to avoid code duplication within your contract.\n- Remember that private functions can return any type, not just response types.\n\n## Practical Example: Helper Function for Validation\n\nLet's implement a private function for input validation:\n\n```clarity\n(define-private (validate-amount (amount uint))\n (and (> amount u0) (<= amount u1000000))\n)\n\n(define-public (transfer (recipient principal) (amount uint))\n (if (validate-amount amount)\n (begin\n ;; Perform transfer logic here\n (ok true)\n )\n (err u1)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `define-private` to create a helper function for input validation.\n2. Calling the private function from within a public function.\n3. Improving code readability by separating validation logic.\n\n## Common Pitfalls\n\n1. Attempting to call private functions from outside the contract, which is not allowed.\n2. Overusing private functions, leading to overly complex contract structure.\n3. Forgetting that private functions can modify contract state, which may lead to unexpected behavior if not carefully managed.\n\n## Related Functions\n\n- `define-public`: Used to define public functions that can be called from outside the contract.\n- `define-read-only`: Used to define public read-only functions that don't modify contract state.\n\n## Conclusion\n\nThe `define-private` function is a powerful tool for creating internal helper functions and encapsulating logic within Clarity smart contracts. By using private functions effectively, you can improve code organization, reduce duplication, and create more maintainable and secure smart contracts.\n" + }, + { + "title": "bit-or", + "description": "Use the bit-or function for bitwise OR operations in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/bit-or", + "content": "\n## Function Signature\n\n```clarity\n(bit-or i1 i2...)\n```\n\n- Input: Two or more integers (`int` or `uint`)\n- Output: An integer of the same type as the inputs (`int` or `uint`)\n\n## Why it matters\n\nThe `bit-or` function is crucial for:\n\n1. Performing bitwise OR operations in smart contracts.\n2. Combining flags or bitmasks efficiently.\n3. Implementing certain logical operations and algorithms.\n4. Manipulating binary data at the bit level.\n\n## When to use it\n\nUse the `bit-or` function when you need to:\n\n- Combine multiple flags or bitmasks into a single value.\n- Set specific bits in an integer without affecting others.\n- Implement certain bitwise algorithms or data structures.\n- Perform low-level data manipulations involving binary operations.\n\n## Best Practices\n\n- Ensure all input values are of the same type (either all `int` or all `uint`).\n- Remember that `bit-or` with `0` has no effect, which can be useful for conditional operations.\n- Use `bit-or` in combination with other bitwise operations for complex bit manipulations.\n- Consider readability when using bitwise operations extensively; add comments to explain the purpose.\n\n## Practical Example: Permission System\n\nLet's implement a simple permission system using `bit-or` and other bitwise operations:\n\n```clarity\n(define-constant PERMISSION_READ u1) ;; 0001\n(define-constant PERMISSION_WRITE u2) ;; 0010\n(define-constant PERMISSION_EXECUTE u4) ;; 0100\n(define-constant PERMISSION_ADMIN u8) ;; 1000\n\n(define-map UserPermissions principal uint)\n\n(define-public (grant-permission (user principal) (permission uint))\n (let\n (\n (currentPermissions (default-to u0 (map-get? UserPermissions user)))\n )\n (ok (map-set UserPermissions user (bit-or currentPermissions permission)))\n )\n)\n\n(define-public (revoke-permission (user principal) (permission uint))\n (let\n (\n (currentPermissions (default-to u0 (map-get? UserPermissions user)))\n )\n (ok (map-set UserPermissions user (bit-and currentPermissions (bit-not permission))))\n )\n)\n\n(define-read-only (has-permission (user principal) (permission uint))\n (let\n (\n (userPermission (default-to u0 (map-get? UserPermissions user)))\n )\n (is-eq permission (bit-and userPermission permission))\n )\n)\n\n;; Usage\n(grant-permission tx-sender (bit-or PERMISSION_READ PERMISSION_WRITE))\n(has-permission tx-sender PERMISSION_READ) ;; Returns true\n(has-permission tx-sender PERMISSION_EXECUTE) ;; Returns false\n```\n\n\n\nThis example demonstrates:\n1. Using `bit-or` to combine multiple permissions into a single value.\n2. Implementing a permission system using bitwise operations for efficient storage and checks.\n3. Combining `bit-or` with other bitwise operations like `bit-and` and `bit-not` for complex permission management.\n\n## Common Pitfalls\n\n1. Mixing signed (`int`) and unsigned (`uint`) integers in a single `bit-or` operation.\n2. Forgetting that `bit-or` with all bits set (`-1` for `int`, maximum value for `uint`) always results in all bits set.\n3. Not considering the full range of bits when using `bit-or` with smaller integer values.\n\n## Related Functions\n\n- `bit-and`: Used for bitwise AND operations.\n- `bit-xor`: Used for bitwise XOR operations.\n- `bit-not`: Used for bitwise NOT operations.\n- `bit-shift-left`: Used for left-shifting bits.\n- `bit-shift-right`: Used for right-shifting bits.\n\n## Conclusion\n\nThe `bit-or` function is a powerful tool for bitwise operations in Clarity smart contracts. When used in combination with other bitwise functions, this function enables efficient implementation of flags, permissions, and other bit-level data manipulations. However, be mindful of the types of integers used and the effects of the operation on the full range of bits to avoid unexpected results.\n" + }, + { + "title": "var-get", + "description": "Retrieve the value of a data variable in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/var-get", + "content": "\n## Function Signature\n\n```clarity\n(var-get var-name)\n```\n\n- Input: `VarName`\n- Output: `A`\n\n## Why it matters\n\nThe `var-get` function is crucial for:\n\n1. Retrieving the value of a data variable.\n2. Implementing logic that requires accessing stored data.\n3. Ensuring data integrity by validating the retrieval process.\n4. Simplifying the process of handling data variables in smart contracts.\n\n## When to use it\n\nUse `var-get` when you need to:\n\n- Retrieve the value of a data variable.\n- Implement logic that requires accessing stored data.\n- Validate the retrieval process to ensure data integrity.\n- Handle data variables in your smart contract.\n\n## Best Practices\n\n- Ensure the variable name is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other data functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Retrieving a Data Variable\n\n```clarity\n(define-data-var cursor int 6)\n\n(define-public (get-cursor)\n (ok (var-get cursor))\n)\n\n;; Usage\n(get-cursor) ;; Returns (ok 6)\n```\n\nThis example demonstrates:\n1. Using `var-get` to retrieve the value of a data variable.\n2. Implementing a public function to handle the retrieval process.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `var-get` with incorrectly formatted or invalid variable names, causing runtime errors.\n2. Assuming the retrieval will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `var-set`: Sets the value of a data variable.\n- `map-get?`: Retrieves a value from a map.\n- `default-to`: Provides a default value if an optional is `none`.\n\n## Conclusion\n\nThe `var-get` function is a fundamental tool for retrieving the value of a data variable in Clarity smart contracts. It allows you to implement logic that requires accessing stored data, ensuring data integrity and simplifying the retrieval process. When used effectively, `var-get` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle data variables.\n" + }, + { + "title": "map-set", + "description": "Set an entry in a map in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/map-set", + "content": "\n## Function Signature\n\n```clarity\n(map-set map-name key-tuple value-tuple)\n```\n\n- Input: `MapName, tuple_A, tuple_B`\n- Output: `bool`\n\n## Why it matters\n\nThe `map-set` function is crucial for:\n\n1. Setting or updating entries in a map.\n2. Managing and updating the state of data stored in maps.\n3. Ensuring data integrity by allowing updates to existing entries.\n4. Simplifying the process of maintaining accurate data in smart contracts.\n\n## When to use it\n\nUse `map-set` when you need to:\n\n- Set or update an entry in a map.\n- Manage and update the state of data stored in maps.\n- Ensure data integrity by updating existing entries.\n- Maintain accurate data in your smart contract.\n\n## Best Practices\n\n- Ensure the key-tuple and value-tuple are correctly formatted.\n- Use meaningful variable names for better readability.\n- Combine with other map functions for comprehensive map management.\n- Be aware of the performance implications of frequent updates in large maps.\n\n## Practical Example: Setting User Data\n\nLet's implement a function that sets a user's data in a map:\n\n```clarity\n(define-map UserData { userId: principal } { data: (buff 32) })\n\n(define-public (set-user-data (user principal) (data (buff 32)))\n (ok (map-set UserData { userId: user } { data: data }))\n)\n\n;; Usage\n(set-user-data tx-sender 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef) ;; Returns (ok true)\n(set-user-data tx-sender 0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef) ;; Returns (ok true)\n```\n\nThis example demonstrates:\n1. Using `map-set` to set a user's data in the `UserData` map.\n2. Implementing a public function to set the data.\n3. Handling both the case where the entry is newly created and where it is updated.\n\n## Common Pitfalls\n\n1. Using `map-set` with incorrectly formatted tuples, causing the operation to fail.\n2. Assuming the entry will always be updated, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-insert`: Inserts a value into a map if the key does not already exist.\n- `map-delete`: Removes an entry from a map.\n- `map-get?`: Retrieves an entry from a map.\n\n## Conclusion\n\nThe `map-set` function is a fundamental tool for setting or updating entries in maps in Clarity smart contracts. It allows you to manage data, ensure data integrity, and maintain accurate data. When used effectively, `map-set` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage map entries.\n" + }, + { + "title": "buff-to-uint-be", + "description": "Convert a byte buffer to an unsigned integer using big-endian encoding in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/buff-to-uint-be", + "content": "\n## Function Signature\n\n```clarity\n(buff-to-uint-be (buff 16))\n```\n\n- Input: A byte buffer of up to 16 bytes\n- Output: An unsigned integer (`uint`)\n\n## Why it matters\n\nThe `buff-to-uint-be` function is crucial for:\n\n1. Converting byte data to unsigned integers using big-endian encoding.\n2. Handling data from external sources or other contracts that use big-endian encoding.\n3. Implementing protocols or algorithms that require big-endian integer representation.\n4. Interoperating with systems that use big-endian byte order.\n\n## When to use it\n\nUse the `buff-to-uint-be` function when you need to:\n\n- Convert a big-endian encoded byte buffer to an unsigned integer.\n- Process input data that represents unsigned integers in big-endian format.\n- Implement cryptographic or mathematical operations that expect big-endian integer inputs.\n- Ensure compatibility with external systems using big-endian encoding.\n\n## Best Practices\n\n- Ensure the input buffer is no larger than 16 bytes to avoid errors.\n- Be aware that smaller buffers are zero-padded on the left, affecting the resulting integer value.\n- Use `buff-to-int-be` if you need to handle signed integers instead.\n- Handle potential errors when the input buffer might be invalid or empty.\n\n## Practical Example: Decoding an Unsigned Integer from External Data\n\nLet's implement a function that processes external data containing a big-endian encoded unsigned integer:\n\n```clarity\n(define-read-only (process-external-data (data (buff 16)))\n (let\n (\n (value (buff-to-uint-be data))\n )\n (if (> value u1000000)\n (err \"Value too large\")\n (ok value)\n )\n )\n)\n\n;; Usage\n(process-external-data 0x00000001) ;; Returns (ok u1)\n(process-external-data 0x000f4240) ;; Returns (ok u1000000)\n(process-external-data 0x00989680) ;; Returns (err \"Value too large\")\n```\n\nThis example demonstrates:\n1. Using `buff-to-uint-be` to convert external data to an unsigned integer.\n2. Implementing input validation based on the converted integer value.\n3. Handling different input sizes and values.\n\n## Common Pitfalls\n\n1. Forgetting that the function interprets the input as big-endian, which might lead to unexpected values if the data is actually little-endian.\n2. Not considering the full range of possible uint values when processing the result.\n3. Assuming a specific buffer length, which could lead to unexpected results with shorter inputs due to left-padding.\n\n## Related Functions\n\n- `buff-to-uint-le`: Converts a byte buffer to an unsigned integer using little-endian encoding.\n- `buff-to-int-be`: Converts a byte buffer to a signed integer using big-endian encoding.\n- `uint-to-buff`: Converts an unsigned integer to a byte buffer.\n\n## Conclusion\n\nThe `buff-to-uint-be` function is a powerful tool for working with big-endian encoded unsigned integers in Clarity smart contracts. By understanding its behavior with different input sizes and potential edge cases, you can effectively process and validate external data, implement complex algorithms, and ensure compatibility with big-endian systems in your smart contract applications.\n" + }, + { + "title": "define-read-only", + "description": "Define public read-only functions in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/define-read-only", + "content": "\n## Function Signature\n\n```clarity\n(define-read-only (function-name (arg-name-0 arg-type-0) ...) function-body)\n```\n\n- Input: \n - `function-name`: The name of the read-only function\n - `arg-name-N`: The name of each argument\n - `arg-type-N`: The type of each argument\n - `function-body`: The code to be executed when the function is called\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-read-only` function is crucial for:\n\n1. Creating public functions that can query contract state without modifying it.\n2. Enabling efficient and gas-optimized read operations on the contract.\n3. Implementing view functions that other contracts or off-chain applications can call.\n4. Providing a safe way to expose contract data without risking state changes.\n\n## When to use it\n\nUse `define-read-only` when you need to:\n\n- Create functions that return contract state or computed values.\n- Implement getter functions for contract variables or complex data structures.\n- Provide public interfaces for querying contract data without modifying state.\n- Create helper functions that other contracts can call without incurring state change costs.\n\n## Best Practices\n\n- Use descriptive names for read-only functions to clearly indicate their purpose.\n- Ensure that read-only functions do not attempt to modify contract state.\n- Utilize read-only functions for complex calculations that don't require state changes.\n- Consider using read-only functions in combination with public functions to separate read and write operations.\n\n## Practical Example: Token Balance Checker\n\nLet's implement a read-only function for checking token balances:\n\n```clarity\n(define-map Balances principal uint)\n\n(define-read-only (get-balance (account principal))\n (default-to u0 (map-get? Balances account))\n)\n```\n\nThis example demonstrates:\n1. Using `define-read-only` to create functions for querying token balances.\n2. Implementing a getter function for individual account balances.\n\n## Common Pitfalls\n\n1. Attempting to modify contract state within a read-only function, which will cause an error.\n2. Overusing read-only functions for complex calculations that might be better suited for off-chain computation.\n3. Forgetting that read-only functions can still consume gas when called, even though they don't modify state.\n\n## Related Functions\n\n- `define-public`: Used to define public functions that can modify contract state.\n- `define-private`: Used to define private functions that can only be called within the contract.\n- `map-get?`: Often used within read-only functions to retrieve data from maps.\n\n## Conclusion\n\nThe `define-read-only` function is an essential tool for creating efficient and safe query interfaces in Clarity smart contracts. By providing a way to expose contract data and perform calculations without modifying state, read-only functions enable you to create more transparent and gas-efficient contracts. When used effectively, this function can significantly enhance the usability and accessibility of smart contract data for both on-chain and off-chain applications.\n" + }, + { + "title": "nft-burn?", + "description": "Burn a non-fungible token (NFT) in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/nft-burn", + "content": "\n## Function Signature\n\n```clarity\n(nft-burn? asset-class asset-identifier sender)\n```\n\n- Input: `AssetName, A, principal`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `nft-burn?` function is crucial for:\n\n1. Reducing the circulating supply of a non-fungible token (NFT).\n2. Managing the lifecycle of NFTs by allowing their destruction.\n3. Ensuring data integrity by removing ownership records of burned NFTs.\n4. Simplifying the process of handling NFT burn operations in smart contracts.\n\n## When to use it\n\nUse `nft-burn?` when you need to:\n\n- Reduce the circulating supply of an NFT.\n- Manage the lifecycle of NFTs by allowing their destruction.\n- Remove ownership records of burned NFTs.\n- Handle NFT burn operations in your smart contract.\n\n## Best Practices\n\n- Ensure the `sender` principal owns the NFT before attempting to burn it.\n- Use meaningful variable names for better readability.\n- Combine with other NFT functions for comprehensive NFT management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Burning an NFT\n\nLet's implement a function that burns an NFT owned by the sender:\n\n```clarity\n(define-non-fungible-token Stackaroo (string-ascii 40))\n\n(define-public (burn-nft (id (string-ascii 40)))\n (nft-burn? Stackaroo id tx-sender)\n)\n\n;; Usage\n(nft-mint? Stackaroo \"Roo\" tx-sender) ;; Returns (ok true)\n(burn-nft \"Roo\") ;; Returns (ok true)\n(nft-burn? Stackaroo \"Roo\" tx-sender) ;; Returns (err u3) because the asset no longer exists\n```\n\nThis example demonstrates:\n1. Using `nft-burn?` to burn an NFT owned by the sender.\n2. Implementing a public function to handle the burn operation.\n3. Handling both the successful burn and the case where the asset no longer exists.\n\n## Common Pitfalls\n\n1. Using `nft-burn?` without ensuring the `sender` owns the NFT, causing the operation to fail.\n2. Assuming the NFT will always exist, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete NFT management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `nft-mint?`: Mints a new non-fungible token.\n- `nft-transfer?`: Transfers ownership of a non-fungible token.\n- `nft-get-owner?`: Retrieves the owner of a non-fungible token.\n\n## Conclusion\n\nThe `nft-burn?` function is a fundamental tool for managing the lifecycle of non-fungible tokens in Clarity smart contracts. It allows you to reduce the circulating supply of NFTs, manage their destruction, and ensure data integrity. When used effectively, `nft-burn?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle NFT burn operations.\n" + }, + { + "title": "is-ok", + "description": "Check if a response is ok in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/is-ok", + "content": "\n## Function Signature\n\n```clarity\n(is-ok value)\n```\n\n- Input: `(response A B)`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-ok` function is crucial for:\n\n1. Determining if a response value represents a successful operation.\n2. Implementing conditional logic based on the success or failure of operations.\n3. Ensuring robust contract behavior by checking for successful responses.\n4. Simplifying checks for response types in smart contract code.\n\n## When to use it\n\nUse `is-ok` when you need to:\n\n- Check if a response value is `ok`.\n- Implement logic that depends on the success of operations.\n- Validate the results of function calls that return response types.\n- Handle success cases gracefully in your contract logic.\n\n## Best Practices\n\n- Use `is-ok` in combination with `match` or `if` for comprehensive response handling.\n- Ensure that the response value being checked is of the correct type.\n- Use meaningful variable names for better readability.\n- Combine with other response handling functions like `is-err` for complete validation.\n\n## Practical Example: Validating a Token Transfer\n\nLet's implement a function that validates a token transfer and checks for success:\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? UserBalances { userId: tx-sender })))\n (recipientBalance (default-to u0 (map-get? UserBalances { userId: recipient })))\n (transferResult (if (>= senderBalance amount)\n (begin\n (map-set UserBalances { userId: tx-sender } { balance: (- senderBalance amount) })\n (map-set UserBalances { userId: recipient } { balance: (+ recipientBalance amount) })\n (ok true)\n )\n (err u1)\n ))\n )\n (if (is-ok transferResult)\n (ok true)\n (err u2)\n )\n )\n)\n\n;; Usage\n(map-set UserBalances { userId: tx-sender } { balance: u100 })\n(transfer-tokens u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true)\n(transfer-tokens u200 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (err u2)\n```\n\nThis example demonstrates:\n1. Using `is-ok` to check if the token transfer operation was successful.\n2. Implementing conditional logic based on the success of the transfer.\n3. Handling both the success and error cases appropriately.\n\n## Common Pitfalls\n\n1. Assuming the response value is always of the correct type, leading to type errors.\n2. Not handling all possible success and error cases, resulting in incomplete response handling.\n3. Overlooking the need for comprehensive validation and error checking.\n4. Using `is-ok` without meaningful success codes or messages, making debugging harder.\n\n## Related Functions\n\n- `is-err`: Checks if a response value is `err`.\n- `err`: Constructs an error response.\n- `ok`: Constructs a success response.\n\n## Conclusion\n\nThe `is-ok` function is a fundamental tool for checking response values in Clarity smart contracts. It allows you to determine if a response value represents a successful operation, enabling robust and comprehensive response handling and validation logic. When used effectively, `is-ok` enhances the reliability and maintainability of your smart contract code by ensuring that successful operations are detected and handled appropriately.\n" + }, + { + "title": "add", + "description": "Use the addition function for arithmetic operations in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/add", + "content": "\nThe addition function (`+`) in Clarity performs addition on a variable number of integer inputs. It's a fundamental arithmetic operation used in many smart contract calculations.\n\n## Function Signature\n\n```clarity\n(+ i1 i2...)\n```\n\n- Input: Two or more integers (int or uint)\n- Output: A single integer (int or uint)\n\n## Why it matters\n\nThe addition function is crucial for:\n\n1. Performing basic arithmetic calculations within smart contracts.\n2. Incrementing counters or values.\n3. Combining multiple quantities or balances.\n4. Implementing mathematical formulas that involve addition.\n\n## When to use it\n\nUse the addition function when you need to:\n\n- Perform basic addition in your contract logic.\n- Increment values or counters.\n- Sum up multiple values.\n- Implement mathematical formulas that involve addition.\n\n## Best Practices\n\n- Always consider the possibility of overflow when adding large numbers.\n- Use appropriate types (int or uint) based on your needs and expected value ranges.\n- Be aware that adding negative numbers to positive numbers can result in subtraction.\n- Consider using checked arithmetic functions if overflow detection is critical.\n\n## Practical Example: Simple Counter\n\nLet's implement a simple counter that uses the addition function to increment its value:\n\n```clarity\n(define-data-var counter int 0)\n\n(define-public (increment-counter (amount int))\n (begin\n (var-set counter (+ (var-get counter) amount))\n (ok (var-get counter))\n )\n)\n\n;; Usage\n(increment-counter 1) ;; Increments the counter by 1\n(increment-counter 5) ;; Increments the counter by 5\n```\n\nThis example demonstrates:\n1. Using addition to increment the value of a counter.\n2. Implementing a public function to handle the increment operation.\n3. Returning the updated counter value.\n\n## Common Pitfalls\n\n1. Overlooking potential overflow when adding large numbers.\n2. Not considering the effect of adding negative numbers (for int types).\n3. Forgetting to update related variables or state when incrementing values.\n\n## Related Functions\n\n- `-`: Used for subtraction operations.\n- `*`: Used for multiplication operations.\n- `/`: Used for division operations.\n\n## Conclusion\n\nThe addition function is a fundamental tool for performing arithmetic operations in Clarity smart contracts. By understanding its behavior with different types of inputs and potential edge cases, you can use it effectively to implement various mathematical operations in your contracts, from simple increments to more complex calculations.\n" + }, + { + "title": "string-to-int?", + "description": "Convert a string to an optional integer in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/string-to-int", + "content": "\n## Function Signature\n\n```clarity\n(string-to-int? string)\n```\n\n- Input: `(string-ascii 1048576) | (string-utf8 262144)`\n- Output: `(optional int)`\n\n## Why it matters\n\nThe `string-to-int?` function is crucial for:\n\n1. Converting string representations of numbers to integers.\n2. Implementing logic that requires numeric values from string inputs.\n3. Ensuring data integrity by validating string-to-integer conversions.\n4. Simplifying the process of handling numeric conversions in smart contracts.\n\n## When to use it\n\nUse `string-to-int?` when you need to:\n\n- Convert a string representation of a number to an integer.\n- Implement logic that requires numeric values from string inputs.\n- Validate string-to-integer conversions to ensure data integrity.\n- Handle numeric conversions in your smart contract.\n\n## Best Practices\n\n- Ensure the input string is correctly formatted and represents a valid integer.\n- Use meaningful variable names for better readability.\n- Combine with other string and numeric functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Converting a String to an Integer\n\nLet's implement a function that converts a string to an optional integer:\n\n```clarity\n(define-read-only (convert-string-to-int (input (string-ascii 20)))\n (string-to-int? input)\n)\n\n;; Usage\n(convert-string-to-int \"123\") ;; Returns (some 123)\n(convert-string-to-int \"-456\") ;; Returns (some -456)\n(convert-string-to-int \"abc\") ;; Returns none\n```\n\nThis example demonstrates:\n1. Using `string-to-int?` to convert a string to an optional integer.\n2. Implementing a public function to handle the string-to-integer conversion.\n3. Handling both valid and invalid string inputs.\n\n## Common Pitfalls\n\n1. Using `string-to-int?` with incorrectly formatted or invalid string inputs, causing the operation to return `none`.\n2. Assuming the conversion will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `string-to-uint?`: Converts a string to an optional unsigned integer.\n- `int-to-ascii`: Converts an integer to a string-ascii representation.\n- `int-to-utf8`: Converts an integer to a string-utf8 representation.\n\n## Conclusion\n\nThe `string-to-int?` function is a fundamental tool for converting string representations of numbers to integers in Clarity smart contracts. It allows you to implement logic that requires numeric values from string inputs, ensuring data integrity and simplifying numeric conversions. When used effectively, `string-to-int?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle string-to-integer conversions.\n" + }, + { + "title": "is-none", + "description": "Check if an optional value is none in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/is-none", + "content": "\n## Function Signature\n\n```clarity\n(is-none value)\n```\n\n- Input: `(optional A)`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-none` function is crucial for:\n\n1. Determining if an optional value is `none`.\n2. Implementing conditional logic based on the presence or absence of values.\n3. Ensuring robust contract behavior by checking for missing values.\n4. Simplifying checks for optional values in smart contract code.\n\n## When to use it\n\nUse `is-none` when you need to:\n\n- Check if an optional value is `none`.\n- Implement logic that depends on whether a value is present or absent.\n- Validate the results of function calls that return optional types.\n- Handle cases where values might be missing or not set.\n\n## Best Practices\n\n- Use `is-none` in combination with `match` or `if` for comprehensive value handling.\n- Ensure that the value being checked is of the correct optional type.\n- Use meaningful variable names for better readability.\n- Combine with other optional handling functions like `is-some` for complete validation.\n\n## Practical Example: Checking for Missing User Data\n\nLet's implement a function that checks if a user's profile data is missing:\n\n```clarity\n(define-map UserProfiles { userId: principal } { name: (string-ascii 50), age: uint })\n\n(define-read-only (is-profile-missing (user principal))\n (is-none (map-get? UserProfiles { userId: user }))\n)\n\n;; Usage\n(map-set UserProfiles { userId: tx-sender } { name: \"Alice\", age: u30 })\n(is-profile-missing tx-sender) ;; Returns false\n(is-profile-missing 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns true\n```\n\nThis example demonstrates:\n1. Using `is-none` to check if a user's profile data is missing.\n2. Implementing a read-only function to determine the presence of user data.\n3. Handling both the case where the profile data is present and where it is missing.\n\n## Common Pitfalls\n\n1. Assuming the value will always be `some`, leading to unhandled `none` cases.\n2. Using `is-none` on non-optional types, causing type errors.\n3. Not handling all possible conditions, resulting in incomplete value checks.\n4. Overlooking the need for comprehensive validation and error checking.\n\n## Related Functions\n\n- `is-some`: Checks if an optional value is `some`.\n- `match`: Used for pattern matching and handling multiple conditions.\n- `default-to`: Provides default values for optional types.\n\n## Conclusion\n\nThe `is-none` function is a fundamental tool for checking optional values in Clarity smart contracts. It allows you to determine if a value is `none`, enabling robust and comprehensive value handling and validation logic. When used effectively, `is-none` enhances the reliability and maintainability of your smart contract code by ensuring that missing values are detected and handled appropriately.\n" + }, + { + "title": "subtract", + "description": "Use the subtraction function for arithmetic operations in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/subtract", + "content": "\nThe subtraction function (`-`) in Clarity performs subtraction on a variable number of integer inputs. It's a fundamental arithmetic operation used in many smart contract calculations.\n\n## Function Signature\n\n```clarity\n(- i1 i2...)\n```\n\n- Input: Two or more integers (int or uint)\n- Output: A single integer (int or uint)\n\n## Why it matters\n\nThe subtraction function is crucial for:\n\n1. Performing basic arithmetic calculations within smart contracts.\n2. Decreasing values or counters.\n3. Calculating differences between quantities.\n4. Implementing mathematical formulas that involve subtraction.\n\n## When to use it\n\nUse the subtraction function when you need to:\n\n- Perform basic subtraction in your contract logic.\n- Decrement values or counters.\n- Calculate the difference between two or more values.\n- Implement mathematical formulas that involve subtraction.\n\n## Best Practices\n\n- Always consider the possibility of underflow when subtracting from small numbers.\n- Use appropriate types (int or uint) based on your needs and expected value ranges.\n- Be aware that subtracting a negative number results in addition.\n- Consider using checked arithmetic functions if underflow detection is critical.\n\n## Practical Example: Simple Escrow Contract\n\nLet's implement a basic escrow contract that uses subtraction to manage balances:\n\n```clarity\n;; Define constants\n(define-constant ESCROW_FEE u100) ;; 100 tokens as escrow fee\n\n;; Define data variables\n(define-map Balances principal uint)\n(define-data-var escrowBalance uint u0)\n\n;; Function to deposit funds\n(define-public (deposit (amount uint))\n (let\n (\n (currentBalance (default-to u0 (map-get? Balances tx-sender)))\n )\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n (map-set Balances tx-sender (+ currentBalance amount))\n (ok true)\n )\n)\n\n;; Function to initiate escrow\n(define-public (start-escrow (recipient principal) (amount uint))\n (let\n (\n (senderBalance (default-to u0 (map-get? Balances tx-sender)))\n )\n (asserts! (>= senderBalance (+ amount ESCROW_FEE)) (err u1))\n (map-set Balances tx-sender (- senderBalance (+ amount ESCROW_FEE)))\n (var-set escrowBalance (+ (var-get escrowBalance) amount))\n (ok true)\n )\n)\n\n;; Function to complete escrow and transfer funds\n(define-public (complete-escrow (recipient principal) (amount uint))\n (let\n (\n (escrowAmount (var-get escrowBalance))\n )\n (asserts! (>= escrowAmount amount) (err u2))\n (try! (as-contract (stx-transfer? amount tx-sender recipient)))\n (var-set escrowBalance (- escrowAmount amount))\n (ok true)\n )\n)\n```\n\nThis example demonstrates:\n1. Using subtraction to update `Balances` when initiating an escrow.\n2. Using subtraction to update the escrow balance when completing a transfer.\n3. Combining subtraction with addition to handle fees and balance updates.\n\n## Common Pitfalls\n\n1. Overlooking potential underflow when subtracting from small numbers.\n2. Not considering the effect of subtracting negative numbers (for int types).\n3. Forgetting to update related variables or state when decrementing values.\n\n## Related Functions\n\n- `+`: Used for addition operations.\n- `*`: Used for multiplication operations.\n- `/`: Used for division operations.\n\n## Conclusion\n\nThe subtraction function is a fundamental tool for performing arithmetic operations in Clarity smart contracts. By understanding its behavior with different types of inputs and potential edge cases, you can use it effectively to implement various mathematical operations in your contracts, from simple decrements to more complex financial calculations.\n" + }, + { + "title": "principal-destruct?", + "description": "Decompose a principal into its components in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/principal-destruct", + "content": "\n## Function Signature\n\n```clarity\n(principal-destruct? principal-address)\n```\n\n- Input: `principal`\n- Output: `(response (tuple (hash-bytes (buff 20)) (name (optional (string-ascii 40))) (version (buff 1))) (tuple (hash-bytes (buff 20)) (name (optional (string-ascii 40))) (version (buff 1)))`\n\n## Why it matters\n\nThe `principal-destruct?` function is crucial for:\n\n1. Decomposing a principal into its component parts.\n2. Managing identities and permissions in smart contracts.\n3. Ensuring data integrity by validating principal components.\n4. Simplifying the process of handling principals in smart contracts.\n\n## When to use it\n\nUse `principal-destruct?` when you need to:\n\n- Decompose a principal into its component parts.\n- Manage identities and permissions in your smart contract.\n- Validate the components of a principal.\n- Handle principal decomposition operations.\n\n## Best Practices\n\n- Ensure the `principal` is correctly formatted.\n- Use meaningful variable names for better readability.\n- Combine with other principal functions for comprehensive identity management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Decomposing a Principal\n\nLet's implement a function that destructs a principal back into its components:\n\n```clarity\n(define-public (destruct-principal (principal principal))\n (principal-destruct? principal)\n)\n\n;; Usage\n(destruct-principal 'ST3X6QWWETNBZWGBK6DRGTR1KX50S74D3425Q1TPK) \n;; Returns (ok (tuple (hash-bytes 0xfa6bf38ed557fe417333710d6033e9419391a320) (name none) (version 0x1a)))\n(destruct-principal 'ST3X6QWWETNBZWGBK6DRGTR1KX50S74D3425Q1TPK.foo) \n;; Returns (ok (tuple (hash-bytes 0xfa6bf38ed557fe417333710d6033e9419391a320) (name (some \"foo\")) (version 0x1a)))\n```\n\nThis example demonstrates:\n1. Using `principal-destruct?` to decompose a principal into its components.\n2. Implementing a public function to handle the principal decomposition.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `principal-destruct?` with incorrectly formatted principals, causing the operation to fail.\n2. Assuming the principal will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete principal management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `principal-construct?`: Constructs a principal from its components.\n- `principal-of?`: Returns the principal derived from a public key.\n- `contract-caller`: Returns the caller of the current contract context.\n\n## Conclusion\n\nThe `principal-destruct?` function is a fundamental tool for decomposing principals into their component parts in Clarity smart contracts. It allows you to manage identities and permissions, ensuring data integrity and simplifying principal handling. When used effectively, `principal-destruct?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle principal decomposition operations.\n" + }, + { + "title": "to-consensus-buff?", + "description": "Serialize a Clarity value into a buffer for consensus in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/to-consensus-buff", + "content": "\n## Function Signature\n\n```clarity\n(to-consensus-buff? value)\n```\n\n- Input: `any`\n- Output: `(optional (buff 32))`\n\n## Why it matters\n\nThe `to-consensus-buff?` function is crucial for:\n\n1. Serializing Clarity values into buffers for consensus.\n2. Implementing logic that requires converting Clarity values to a standardized buffer format.\n3. Ensuring data integrity by validating the serialization process.\n4. Simplifying the process of handling value serialization in smart contracts.\n\n## When to use it\n\nUse `to-consensus-buff?` when you need to:\n\n- Serialize Clarity values into buffers for consensus.\n- Implement logic that requires converting Clarity values to a standardized buffer format.\n- Validate the serialization process to ensure data integrity.\n- Handle value serialization in your smart contract.\n\n## Best Practices\n\n- Ensure the input value is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other serialization functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Serializing a Clarity Value\n\nLet's implement a function that serializes an integer value into a buffer:\n\n```clarity\n(define-read-only (serialize-int (input int))\n (to-consensus-buff? input)\n)\n\n(define-read-only (serialize-tuple (input (tuple (name (string-ascii 50)) (age uint))))\n (to-consensus-buff? input)\n)\n\n;; Usage\n(serialize-int 42) ;; Returns (some 0x000000000000000000000000000000000000000000000000000000000000002a)\n(serialize-int -1) ;; Returns none (since negative integers cannot be serialized)\n(serialize-tuple (tuple (name \"Harper Dog\") (age u5))) ;; Returns (some 0x0c00000002036167650100000000000000000000000000000005046e616d650d0000000a48617270657220446f67)\n```\n\nThis example demonstrates:\n1. Using `to-consensus-buff?` to serialize an integer value into a buffer.\n2. Implementing a public function to handle the serialization process.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `to-consensus-buff?` with incorrectly formatted or invalid input values, causing the operation to fail.\n2. Assuming the serialization will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `from-consensus-buff?`: Deserializes a buffer into a Clarity value.\n- `buff-to-int-be`: Converts a big-endian buffer to an integer.\n- `buff-to-uint-le`: Converts a little-endian buffer to an unsigned integer.\n\n## Conclusion\n\nThe `to-consensus-buff?` function is a fundamental tool for serializing Clarity values into buffers for consensus in Clarity smart contracts. It allows you to implement logic that requires converting Clarity values to a standardized buffer format, ensuring data integrity and simplifying value serialization. When used effectively, `to-consensus-buff?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle value serialization.\n" + }, + { + "title": "stx-burn?", + "description": "Burn STX from a principal's account in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/stx-burn", + "content": "\n## Function Signature\n\n```clarity\n(stx-burn? amount sender)\n```\n\n- Input: `uint, principal`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `stx-burn?` function is crucial for:\n\n1. Decreasing the STX holdings of a principal by burning the specified amount.\n2. Implementing logic that requires reducing the circulating supply of STX.\n3. Ensuring data integrity by validating the burn operation.\n4. Simplifying the process of handling STX burning in smart contracts.\n\n## When to use it\n\nUse `stx-burn?` when you need to:\n\n- Decrease the STX holdings of a principal by burning the specified amount.\n- Implement logic that requires reducing the circulating supply of STX.\n- Validate the burn operation to ensure data integrity.\n- Handle STX burning operations in your smart contract.\n\n## Best Practices\n\n- Ensure the `amount` is positive and the `sender` has sufficient balance.\n- Use meaningful variable names for better readability.\n- Combine with other STX functions for comprehensive account management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Burning STX from an Account\n\nLet's implement a function that burns a specified amount of STX from the `tx-sender`:\n\n```clarity\n(define-public (burn-stx (amount uint))\n (stx-burn? amount tx-sender)\n)\n\n;; Usage\n(burn-stx u50) ;; Returns (ok true)\n```\n\nThis example demonstrates:\n1. Using `stx-burn?` to burn a specified amount of STX from the `tx-sender`.\n2. Implementing a public function to handle the STX burning operation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `stx-burn?` with a non-positive amount, causing the operation to fail.\n2. Assuming the burn operation will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete account management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `stx-get-balance`: Queries the STX balance of a principal.\n- `stx-transfer?`: Transfers STX from one principal to another.\n- `stx-account`: Queries detailed STX account information.\n\n## Conclusion\n\nThe `stx-burn?` function is a fundamental tool for burning STX from a principal's account in Clarity smart contracts. It allows you to implement logic that requires reducing the circulating supply of STX, ensuring data integrity and simplifying STX burning operations. When used effectively, `stx-burn?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle STX burning operations.\n" + }, + { + "title": "from-consensus-buff?", + "description": "Deserialize a buffer into a Clarity value in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/from-consensus-buff", + "content": "\n## Function Signature\n\n```clarity\n(from-consensus-buff? type-signature buffer)\n```\n\n- Input: \n - `type-signature`: The type to deserialize into\n - `buffer`: A buffer containing the serialized data\n- Output: `(optional t)` where t is the type specified in the type signature\n\n## Why it matters\n\nThe `from-consensus-buff?` function is crucial for:\n\n1. Deserializing data that has been serialized using the SIP-005 standard.\n2. Enabling interoperability between different contracts or systems.\n3. Handling complex data structures that have been serialized for storage or transmission.\n4. Safely converting buffers back into Clarity values with type checking.\n\n## When to use it\n\nUse `from-consensus-buff?` when you need to:\n\n- Convert serialized data back into Clarity values.\n- Interact with data that has been serialized by other contracts or off-chain systems.\n- Implement cross-contract communication protocols involving serialized data.\n- Deserialize stored data that was previously serialized for efficiency.\n\n## Best Practices\n\n- Always specify the correct type signature to ensure proper deserialization.\n- Handle the `none` case when the deserialization fails.\n- Use in conjunction with `to-consensus-buff?` for serialization-deserialization workflows.\n- Be aware of the gas costs associated with deserializing large or complex data structures.\n\n## Practical Example: Deserializing a Tuple\n\nLet's implement a function that deserializes a buffer into a tuple:\n\n```clarity\n(define-read-only (deserialize-user-data (serializedData (buff 128)))\n (match (from-consensus-buff? { name: (string-ascii 50), age: uint } serializedData)\n success success\n (err u1)\n )\n)\n\n;; Usage\n(deserialize-user-data 0x0c00000002036167650100000000000000000000000000000005046e616d650d0000000a48617270657220446f67)\n;; Returns (ok (tuple (name \"Harper Dog\") (age u5)))\n```\n\nThis example demonstrates:\n1. Using `from-consensus-buff?` to deserialize a buffer into a tuple.\n2. Specifying the expected type structure for the deserialization.\n3. Handling both successful and failed deserialization attempts.\n\n## Common Pitfalls\n\n1. Specifying an incorrect type signature, leading to deserialization failures.\n2. Not handling the `none` case when deserialization fails.\n3. Attempting to deserialize data that wasn't properly serialized using the SIP-005 standard.\n4. Overlooking potential out-of-memory errors when deserializing very large structures.\n\n## Related Functions\n\n- `to-consensus-buff?`: Used to serialize Clarity values into buffers.\n- `unwrap-panic`: Often used to forcibly unwrap the optional result (use with caution).\n- `match`: Commonly used to handle both success and failure cases of deserialization.\n\n## Conclusion\n\nThe `from-consensus-buff?` function is a powerful tool for working with serialized data in Clarity smart contracts. It enables contracts to safely deserialize complex data structures, facilitating interoperability and efficient data handling. When used correctly, this function provides a robust way to convert buffers back into typed Clarity values, enhancing the contract's ability to process and validate external data.\n" + }, + { + "title": "bit-shift-right", + "description": "Use the bit-shift-right function for bitwise right shift operations in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/bit-shift-right", + "content": "\n## Function Signature\n\n```clarity\n(bit-shift-right i1 shamt)\n```\n\n- Input: \n - `i1`: An integer (`int` or `uint`)\n - `shamt`: A `uint` representing the number of places to shift\n- Output: An integer of the same type as `i1` (`int` or `uint`)\n\n## Why it matters\n\nThe `bit-shift-right` function is crucial for:\n\n1. Performing efficient division by powers of 2.\n2. Implementing certain bitwise algorithms and data structures.\n3. Manipulating binary data at the bit level.\n4. Extracting specific bit patterns from integers.\n\n## When to use it\n\nUse the `bit-shift-right` function when you need to:\n\n- Divide a number by a power of 2 efficiently.\n- Implement certain cryptographic or hashing algorithms.\n- Perform low-level data manipulations involving binary operations.\n- Extract specific bits or bit patterns from integers.\n\n## Best Practices\n\n- Be aware that shifting right by `n` bits is equivalent to integer division by 2^n.\n- Remember that for signed integers (`int`), the sign bit is preserved during right shifts.\n- Use `uint` for `shamt` to avoid potential issues with negative shift amounts.\n- Consider the differences in behavior between signed and unsigned integers when right-shifting.\n\n## Practical Example: Efficient Power of 2 Division\n\nLet's implement a function that efficiently divides by powers of 2 using `bit-shift-right`:\n\n```clarity\n(define-read-only (divide-by-power-of-2 (value int) (power uint))\n (bit-shift-right value power)\n)\n\n(define-read-only (extract-lowest-bits (value uint) (numBits uint))\n (bit-and value (- (bit-shift-left u1 numBits) u1))\n)\n\n;; Usage\n(divide-by-power-of-2 128 u3) ;; Returns 16 (128 / 2^3)\n(divide-by-power-of-2 -128 u3) ;; Returns -16 (-128 / 2^3)\n(extract-lowest-bits u171 u4) ;; Returns u11 (binary: 1011)\n```\n\nThis example demonstrates:\n1. Using `bit-shift-right` for efficient division by powers of 2.\n2. Handling both positive and negative numbers in division.\n3. Combining `bit-shift-right` with other bitwise operations to extract specific bit patterns.\n\n## Common Pitfalls\n\n1. Forgetting that right-shifting signed integers preserves the sign bit.\n2. Not considering the modulo behavior when shifting by amounts greater than or equal to 128.\n3. Using a negative or non-uint value for the shift amount, which is not allowed.\n\n## Related Functions\n\n- `bit-shift-left`: Used for left-shifting bits.\n- `bit-and`: Often used in combination with `bit-shift-right` for masking operations.\n- `/`: Used for general division, but less efficient for powers of 2 compared to bit shifting.\n\n## Conclusion\n\nThe `bit-shift-right` function is a powerful tool for bitwise operations in Clarity smart contracts. This function enables efficient division by powers of 2 and is essential for extracting specific bit patterns and implementing various bitwise algorithms. However, be mindful of the differences between signed and unsigned integers when using this function, as well as its behavior with large shift amounts.\n" + }, + { + "title": "is-some", + "description": "Check if an optional value is some in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/is-some", + "content": "\n## Function Signature\n\n```clarity\n(is-some value)\n```\n\n- Input: `(optional A)`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-some` function is crucial for:\n\n1. Determining if an optional value is `some`.\n2. Implementing conditional logic based on the presence of values.\n3. Ensuring robust contract behavior by checking for existing values.\n4. Simplifying checks for optional values in smart contract code.\n\n## When to use it\n\nUse `is-some` when you need to:\n\n- Check if an optional value is `some`.\n- Implement logic that depends on whether a value is present.\n- Validate the results of function calls that return optional types.\n- Handle cases where values might be present or absent.\n\n## Best Practices\n\n- Use `is-some` in combination with `match` or `if` for comprehensive value handling.\n- Ensure that the value being checked is of the correct optional type.\n- Use meaningful variable names for better readability.\n- Combine with other optional handling functions like `is-none` for complete validation.\n\n## Practical Example: Checking for Existing User Data\n\nLet's implement a function that checks if a user's profile data exists:\n\n```clarity\n(define-map UserProfiles { userId: principal } { name: (string-ascii 50), age: uint })\n\n(define-read-only (is-profile-existing (user principal))\n (is-some (map-get? UserProfiles { userId: user }))\n)\n\n;; Usage\n(map-set UserProfiles { userId: tx-sender } { name: \"Alice\", age: u30 })\n(is-profile-existing tx-sender) ;; Returns true\n(is-profile-existing 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns false\n```\n\nThis example demonstrates:\n1. Using `is-some` to check if a user's profile data exists.\n2. Implementing a read-only function to determine the presence of user data.\n3. Handling both the case where the profile data is present and where it is absent.\n\n## Common Pitfalls\n\n1. Assuming the value will always be `some`, leading to unhandled `none` cases.\n2. Using `is-some` on non-optional types, causing type errors.\n3. Not handling all possible conditions, resulting in incomplete value checks.\n4. Overlooking the need for comprehensive validation and error checking.\n\n## Related Functions\n\n- `is-none`: Checks if an optional value is `none`.\n- `match`: Used for pattern matching and handling multiple conditions.\n- `default-to`: Provides default values for optional types.\n\n## Conclusion\n\nThe `is-some` function is a fundamental tool for checking optional values in Clarity smart contracts. It allows you to determine if a value is `some`, enabling robust and comprehensive value handling and validation logic. When used effectively, `is-some` enhances the reliability and maintainability of your smart contract code by ensuring that existing values are detected and handled appropriately.\n" + }, + { + "title": "is-standard", + "description": "Check if a value is a standard principal in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/is-standard", + "content": "\n## Function Signature\n\n```clarity\n(is-standard value)\n```\n\n- Input: `principal`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-standard` function is crucial for:\n\n1. Determining if a principal is a standard principal (i.e., a user address).\n2. Implementing conditional logic based on the type of principal.\n3. Ensuring that certain operations are only performed by standard principals.\n4. Simplifying checks for principal types in smart contract code.\n\n## When to use it\n\nUse `is-standard` when you need to:\n\n- Check if a principal is a standard user address.\n- Implement logic that depends on the type of principal.\n- Validate the type of principal before performing certain operations.\n- Handle cases where only standard principals are allowed.\n\n## Best Practices\n\n- Use `is-standard` in combination with `if` or `match` for comprehensive principal type handling.\n- Ensure that the value being checked is of the correct principal type.\n- Use meaningful variable names for better readability.\n- Note that you can pass in a valid contract principal as well, not just a standard principal (e.g., `'SP12` or `'SP12.contract`).\n\n## Practical Example: Restricting Access to Standard Principals\n\nLet's implement a function that restricts access to standard principals:\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (if (is-standard tx-sender)\n (let\n (\n (senderBalance (default-to u0 (map-get? UserBalances { userId: tx-sender })))\n (recipientBalance (default-to u0 (map-get? UserBalances { userId: recipient })))\n )\n (if (>= senderBalance amount)\n (begin\n (map-set UserBalances { userId: tx-sender } { balance: (- senderBalance amount) })\n (map-set UserBalances { userId: recipient } { balance: (+ recipientBalance amount) })\n (ok true)\n )\n (err u1)\n )\n )\n (err u2)\n )\n)\n\n;; Usage\n(map-set UserBalances { userId: tx-sender } { balance: u100 })\n(transfer-tokens u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true) if tx-sender is a standard principal\n```\n\nThis example demonstrates:\n1. Using `is-standard` to check if the transaction sender is a standard principal.\n2. Implementing conditional logic based on the type of principal.\n3. Handling both the case where the principal is standard and where it is not.\n\n## Common Pitfalls\n\n1. Assuming the principal will always be standard, leading to unhandled cases.\n2. Using `is-standard` on non-principal types, causing type errors.\n3. Not handling all possible conditions, resulting in incomplete principal type checks.\n4. Overlooking the need for comprehensive validation and error checking.\n\n## Related Functions\n\n- `tx-sender`: Returns the principal that initiated the transaction.\n- `contract-caller`: Returns the caller of the current contract context.\n\n## Conclusion\n\nThe `is-standard` function is a fundamental tool for checking principal types in Clarity smart contracts. It allows you to determine if a principal is a standard user address, enabling robust and comprehensive principal type handling and validation logic. When used effectively, `is-standard` enhances the reliability and maintainability of your smart contract code by ensuring that operations are performed by the correct type of principal.\n" + }, + { + "title": "unwrap-err-panic", + "description": "Unpack error responses and throwing runtime errors in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/unwrap-err-panic", + "content": "\n## Function Signature\n\n```clarity\n(unwrap-err-panic response-input)\n```\n\n- Input: `(response A B)`\n- Output: `B`\n\n## Why it matters\n\nThe `unwrap-err-panic` function is crucial for:\n\n1. Unpacking error responses to access their inner values.\n2. Implementing logic that requires handling error responses.\n3. Ensuring data integrity by validating the error unpacking process.\n4. Simplifying the process of handling error responses in smart contracts by throwing runtime errors when necessary.\n\n## When to use it\n\nUse `unwrap-err-panic` when you need to:\n\n- Unpack error responses to access their inner values.\n- Implement logic that requires handling error responses.\n- Validate the error unpacking process to ensure data integrity.\n- Handle error responses in your smart contract and throw runtime errors when necessary.\n\n## Best Practices\n\n- Ensure the input value is a response type.\n- Use meaningful variable names for better readability.\n- Combine with other error handling functions for comprehensive error management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Unpacking an Error Response and Throwing a Runtime Error\n\nLet's implement a function that processes an error response using `unwrap-err-panic`:\n\n```clarity\n(define-public (process-error-response (input (response int int)))\n (let\n (\n (errorValue (unwrap-err-panic input))\n )\n (ok errorValue)\n )\n)\n\n;; Usage\n(process-error-response (err 42)) ;; Returns (ok 42)\n(process-error-response (ok 1)) ;; Throws a runtime exception\n```\n\nThis example demonstrates:\n1. Using `unwrap-err-panic` to unpack an error response.\n2. Implementing a public function to handle the error unpacking process.\n3. Handling both successful and error cases, with runtime errors thrown for `ok` values.\n\n## Common Pitfalls\n\n1. Using `unwrap-err-panic` with values that are not response types, causing runtime errors.\n2. Assuming the error unpacking will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete error management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `unwrap!`: Unpacks optional and response types, returning a thrown value if unpacking fails.\n- `unwrap-err!`: Unpacks error responses, returning a thrown value if the response is `ok`.\n- `try!`: Unpacks optional and response types, returning `none` or the `err` value if unpacking fails.\n\n## Conclusion\n\nThe `unwrap-err-panic` function is a fundamental tool for unpacking error responses and throwing runtime errors in Clarity smart contracts. It allows you to implement logic that requires handling error responses, ensuring data integrity and simplifying the error unpacking process. When used effectively, `unwrap-err-panic` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle error responses and throw runtime errors when necessary.\n" + }, + { + "title": "append", + "description": "Use the append function to add elements to lists in Clarity smart contracts, with considerations for maximum list length.", + "slug": "/stacks/clarity/functions/append", + "content": "\n## Function Signature\n\n```clarity\n(append (list A) A)\n```\n\n- Input: A list of type A, and a single element of type A\n- Output: A new list of type A with the element appended\n\n## Why it matters\n\nThe `append` function is crucial for:\n\n1. Dynamically growing lists within smart contracts.\n2. Adding new elements to existing data structures.\n3. Implementing queue-like behaviors in contract logic.\n4. Constructing lists incrementally during contract execution.\n\n## When to use it\n\nUse the `append` function when you need to:\n\n- Add a new element to the end of an existing list.\n- Construct a list by adding elements one at a time.\n- Implement data structures that require adding elements in order.\n- Combine existing lists with single elements.\n\n## Best Practices\n\n- Always use `as-max-len?` before appending to ensure the list doesn't exceed its maximum length.\n- Be mindful of the maximum list length specified when defining the list.\n- Consider using `concat` for joining two lists instead of repeatedly using `append`.\n- Remember that `append` creates a new list; it doesn't modify the original list in-place.\n- Use type-appropriate elements that match the list's declared type.\n\n## Practical Example: Event Log with Max Length Check\n\nLet's implement a simple event log system using `append` with a maximum length check:\n\n```clarity\n(define-data-var eventLog (list 50 (string-ascii 50)) (list))\n\n(define-public (log-event (event (string-ascii 50)))\n (let\n (\n (current-log (var-get eventLog))\n )\n (match (as-max-len? (append current-log event) u2) success\n (ok (var-set eventLog success))\n (err u1)\n )\n )\n)\n\n(define-read-only (get-eventLog)\n (ok (var-get eventLog))\n)\n\n;; Usage\n(log-event \"Contract initialized\")\n(log-event \"User registered\")\n(get-eventLog) ;; Returns (ok (\"Contract initialized\" \"User registered\"))\n```\n\nThis example demonstrates:\n1. Using `append` to add new events to an existing log.\n2. Using `as-max-len?` to check if appending would exceed the maximum list length.\n3. Handling the case where the list would exceed its maximum length.\n4. Combining `append` with other Clarity functions like `var-set` and `var-get`.\n\n## Common Pitfalls\n\n1. Forgetting to use `as-max-len?` when appending to a list with a maximum length.\n2. Attempting to append an element of the wrong type to a typed list.\n3. Assuming `append` will always succeed without checking the list's current length.\n4. Inefficiently using `append` in a loop when `concat` might be more appropriate.\n\n## Related Functions\n\n- `as-max-len?`: Used to check if a sequence exceeds a maximum length.\n- `concat`: Used for joining two lists together.\n- `list`: Used for creating new lists.\n- `len`: Used for getting the current length of a list.\n\n## Conclusion\n\nThe `append` function is a powerful tool for manipulating lists in Clarity smart contracts. By understanding its behavior, limitations, and the necessity of using `as-max-len?` with lists that have a maximum length, you can effectively manage dynamic data structures within your contracts. This enables more flexible and responsive smart contract designs while maintaining safeguards against exceeding predefined list size limits.\n" + }, + { + "title": "stx-transfer?", + "description": "Transfer STX between principals in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/stx-transfer", + "content": "\n## Function Signature\n\n```clarity\n(stx-transfer? amount sender recipient)\n```\n\n- Input: `uint, principal, principal`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `stx-transfer?` function is crucial for:\n\n1. Transferring STX between principals.\n2. Implementing logic that requires moving STX from one account to another.\n3. Ensuring data integrity by validating the transfer operation.\n4. Simplifying the process of handling STX transfers in smart contracts.\n\n## When to use it\n\nUse `stx-transfer?` when you need to:\n\n- Transfer STX between principals.\n- Implement logic that requires moving STX from one account to another.\n- Validate the transfer operation to ensure data integrity.\n- Handle STX transfers in your smart contract.\n\n## Best Practices\n\n- Ensure the `amount` is positive and the `sender` has sufficient balance.\n- Use meaningful variable names for better readability.\n- Combine with other STX functions for comprehensive account management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Transferring STX\n\nLet's implement a function that transfers STX from the `tx-sender` to a recipient:\n\n```clarity\n(define-public (transfer-stx (amount uint) (recipient principal))\n (stx-transfer? amount tx-sender recipient)\n)\n\n;; Usage\n(transfer-stx u60 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns (ok true) if successful\n(transfer-stx u50 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns (err u1) if the sender does not have enough balance\n```\n\nThis example demonstrates:\n1. Using `stx-transfer?` to transfer STX from the `tx-sender` to a recipient.\n2. Implementing a public function to handle the STX transfer.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `stx-transfer?` with a non-positive amount, causing the operation to fail.\n2. Assuming the transfer operation will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete account management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `stx-get-balance`: Queries the STX balance of a principal.\n- `stx-transfer-memo?`: Transfers STX from one principal to another with a memo.\n- `stx-burn?`: Burns STX from a principal's account.\n\n## Conclusion\n\nThe `stx-transfer?` function is a fundamental tool for transferring STX between principals in Clarity smart contracts. It allows you to implement logic that requires moving STX from one account to another, ensuring data integrity and simplifying STX transfer operations. When used effectively, `stx-transfer?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle STX transfers.\n" + }, + { + "title": "unwrap-panic", + "description": "Unpack optional and response types and throwing runtime errors in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/unwrap-panic", + "content": "\n## Function Signature\n\n```clarity\n(unwrap-panic option-input)\n```\n\n- Input: `(optional A) | (response A B)`\n- Output: `A`\n\n## Why it matters\n\nThe `unwrap-panic` function is crucial for:\n\n1. Unpacking optional and response types to access their inner values.\n2. Implementing logic that requires handling optional and response types.\n3. Ensuring data integrity by validating the unpacking process.\n4. Simplifying the process of handling optional and response types in smart contracts by throwing runtime errors when necessary.\n\n## When to use it\n\nUse `unwrap-panic` when you need to:\n\n- Unpack optional and response types to access their inner values.\n- Implement logic that requires handling optional and response types.\n- Validate the unpacking process to ensure data integrity.\n- Handle optional and response types in your smart contract and throw runtime errors when necessary.\n\n## Best Practices\n\n- Ensure the input value is an optional or response type.\n- Use meaningful variable names for better readability.\n- Combine with other error handling functions for comprehensive error management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Unpacking an Optional Value and Throwing a Runtime Error\n\nLet's implement a function that retrieves a value from a map and unpacks it using `unwrap-panic`:\n\n```clarity\n(define-map UserInfo { userId: principal } { name: (string-ascii 20), age: uint })\n\n(define-public (get-user-age (user principal))\n (let\n (\n (userData (unwrap-panic (map-get? UserInfo { userId: user })))\n )\n (ok (get age userData))\n )\n)\n\n;; Usage\n(map-set UserInfo { userId: tx-sender } { name: \"Alice\", age: u30 })\n(get-user-age tx-sender) ;; Returns (ok u30)\n(get-user-age 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) ;; Throws a runtime exception\n```\n\n## Common Pitfalls\n\n1. Using `unwrap-panic` with values that are not optional or response types, causing runtime errors.\n2. Assuming the unpacking will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete error management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `unwrap!`: Unpacks optional and response types, returning a thrown value if unpacking fails.\n- `unwrap-err!`: Unpacks error responses, returning a thrown value if the response is `ok`.\n- `try!`: Unpacks optional and response types, returning `none` or the `err` value if unpacking fails.\n\n## Conclusion\n\nThe `unwrap-panic` function is a fundamental tool for unpacking optional and response types and throwing runtime errors in Clarity smart contracts. It allows you to implement logic that requires handling optional and response types, ensuring data integrity and simplifying the unpacking process. When used effectively, `unwrap-panic` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle optional and response types and throw runtime errors when necessary.\n" + }, + { + "title": "impl-trait", + "description": "Implement traits in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/impl-trait", + "content": "\n## Function Signature\n\n```clarity\n(impl-trait trait-name)\n```\n\n- Input: \n - `trait-name`: The name of the trait to implement\n- Output: Not applicable\n\n## Why it matters\n\nThe `impl-trait` function is crucial for:\n\n1. Enabling contracts to conform to specific interfaces.\n2. Allowing dynamic function calls between contracts.\n3. Promoting code reuse and modularity in smart contract development.\n4. Ensuring contracts adhere to predefined behaviors and standards.\n\n## When to use it\n\nUse `impl-trait` when you need to:\n\n- Implement a predefined interface in your contract.\n- Allow other contracts to interact with your contract through a common interface.\n- Ensure your contract adheres to specific standards or behaviors.\n- Enable dynamic function calls using `contract-call?`.\n\n## Best Practices\n\n- Define traits at the top level of your contract for clarity and organization.\n- Ensure all required functions in the trait are implemented in your contract.\n- Use meaningful and descriptive names for traits and their functions.\n- Document the purpose and usage of each trait in your contract.\n\n## Practical Example: Implementing a Token Trait\n\nLet's define a simple token trait and implement it in a contract:\n\n```clarity\n(define-trait token-trait\n (\n (transfer (principal principal uint) (response bool uint))\n (get-balance (principal) (response uint uint))\n )\n)\n\n(impl-trait token-trait)\n\n(define-map Balances { user: principal } { balance: uint })\n\n(define-public (transfer (sender principal) (recipient principal) (amount uint))\n (let\n (\n (senderBalance (default-to u0 (map-get? Balances { user: sender })))\n (recipientBalance (default-to u0 (map-get? Balances { user: recipient })))\n )\n (if (>= senderBalance amount)\n (begin\n (map-set Balances { user: sender } { balance: (- senderBalance amount) })\n (map-set Balances { user: recipient } { balance: (+ recipientBalance amount) })\n (ok true)\n )\n (err u1)\n )\n )\n)\n\n(define-read-only (get-balance (user principal))\n (ok (default-to u0 (map-get? Balances { user: user })))\n)\n```\n\nThis example demonstrates:\n1. Defining a `token-trait` with `transfer` and `get-balance` functions.\n2. Implementing the `token-trait` in a contract using `impl-trait`.\n3. Providing implementations for the `transfer` and `get-balance` functions.\n\n## Common Pitfalls\n\n1. Forgetting to implement all required functions in the trait, leading to deployment errors.\n2. Using inconsistent function signatures between the trait and the implementation.\n3. Not documenting the purpose and usage of traits, making the contract harder to understand.\n4. Overlooking the need for proper error handling in trait functions.\n\n## Related Functions\n\n- `define-trait`: Used to define a new trait.\n- `contract-call?`: Used to call functions dynamically on contracts that implement a trait.\n- `define-public`: Used to define public functions that can be called from outside the contract.\n\n## Conclusion\n\nThe `impl-trait` function is a powerful tool for promoting modularity and code reuse in Clarity smart contracts. By implementing predefined interfaces, contracts can interact dynamically and adhere to specific standards and behaviors. When used effectively, `impl-trait` enhances the flexibility and maintainability of your smart contract code, enabling more robust and interoperable decentralized applications.\n" + }, + { + "title": "to-int", + "description": "Convert an unsigned integer to a signed integer in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/to-int", + "content": "\n## Function Signature\n\n```clarity\n(to-int value)\n```\n\n- Input: `uint`\n- Output: `int`\n\n## Why it matters\n\nThe `to-int` function is crucial for:\n\n1. Converting unsigned integers to signed integers.\n2. Implementing logic that requires signed integer operations.\n3. Ensuring data integrity by validating the conversion process.\n4. Simplifying the process of handling integer conversions in smart contracts.\n\n## When to use it\n\nUse `to-int` when you need to:\n\n- Convert an unsigned integer to a signed integer.\n- Implement logic that requires signed integer operations.\n- Validate the conversion process to ensure data integrity.\n- Handle integer conversions in your smart contract.\n\n## Best Practices\n\n- Ensure the input value is within the range that can be represented as a signed integer.\n- Use meaningful variable names for better readability.\n- Combine with other integer functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Converting Unsigned Integer to Signed Integer\n\nLet's implement a function that converts an unsigned integer to a signed integer:\n\n```clarity\n(define-read-only (convert-to-int (input uint))\n (to-int input)\n)\n\n;; Usage\n(convert-to-int u42) ;; Returns 42\n(convert-to-int u0) ;; Returns 0\n(convert-to-int u1000000) ;; Returns 1000000\n```\n\nThis example demonstrates:\n1. Using `to-int` to convert an unsigned integer to a signed integer.\n2. Implementing a public function to handle the conversion process.\n3. Handling both small and large input values.\n\n## Common Pitfalls\n\n1. Using `to-int` with values that exceed the range of signed integers, causing unexpected behavior.\n2. Assuming the conversion will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `to-uint`: Converts a signed integer to an unsigned integer.\n- `int-to-ascii`: Converts an integer to a string-ascii representation.\n- `int-to-utf8`: Converts an integer to a string-utf8 representation.\n\n## Conclusion\n\nThe `to-int` function is a fundamental tool for converting unsigned integers to signed integers in Clarity smart contracts. It allows you to implement logic that requires signed integer operations, ensuring data integrity and simplifying integer conversions. When used effectively, `to-int` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle integer conversions.\n" + }, + { + "title": "greater than", + "description": "Use the greater than function for comparisons in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/greater-than", + "content": "\nThe greater than function (`>`) in Clarity compares two values and returns true if the first value is greater than the second. It's a fundamental comparison operation used in many smart contract conditions and logic flows.\n\n## Function Signature\n\n```clarity\n(> v1 v2)\n```\n\n- Input: Two values of the same type (int, uint, string-ascii, string-utf8, or buff)\n- Output: A boolean (true or false)\n\n## Why it matters\n\nThe greater than function is crucial for:\n\n1. Implementing conditional logic in smart contracts.\n2. Comparing numerical values for financial operations.\n3. Ordering and sorting data.\n4. Implementing thresholds or limits in contract logic.\n\n## When to use it\n\nUse the greater than function when you need to:\n\n- Compare two numerical values to determine if one is larger.\n- Implement minimum thresholds for certain operations.\n- Create conditional logic based on numerical comparisons.\n- Sort or order data based on numerical or lexicographical order.\n\n## Best Practices\n\n- Ensure that both inputs are of the same type to avoid runtime errors.\n- Be aware of the differences in comparison between signed (int) and unsigned (uint) integers.\n- When comparing strings or buffers, understand that the comparison is lexicographical.\n- Consider edge cases, especially when dealing with the limits of integer ranges.\n\n## Practical Example: Token Sale with Minimum Purchase\n\nLet's implement a simple token sale contract that uses the greater than function to enforce a minimum purchase amount:\n\n```clarity\n;; Define constants\n(define-constant MIN_PURCHASE u100000000) ;; 1 STX\n(define-constant TOKEN_PRICE u50000) ;; 0.0005 STX per token\n\n;; Define data variables\n(define-data-var tokensSold uint u0)\n\n;; Function to purchase tokens\n(define-public (purchase-tokens (amount uint))\n (let\n (\n (tokensToMint (/ amount TOKEN_PRICE))\n (payment amount)\n )\n ;; Check if the purchase amount is greater than the minimum\n (asserts! (> payment MIN_PURCHASE) (err u1))\n ;; Perform the token purchase\n (try! (stx-transfer? payment tx-sender (as-contract tx-sender)))\n (var-set tokensSold (+ (var-get tokensSold) tokensToMint))\n ;; Here you would typically mint or transfer tokens to the buyer\n (ok tokensToMint)\n )\n)\n\n;; Function to check total tokens sold\n(define-read-only (get-tokensSold)\n (ok (var-get tokensSold))\n)\n```\n\nThis example demonstrates:\n1. Using `>` to check if the payment amount exceeds the minimum purchase threshold.\n2. Combining the greater than check with other contract logic for a token sale.\n3. Implementing a minimum purchase amount to prevent small, potentially spam transactions.\n\n## Common Pitfalls\n\n1. Comparing values of different types, which will result in a runtime error.\n2. Not considering the inclusive nature of `>=` vs the exclusive nature of `>` when setting thresholds.\n3. Overlooking potential integer overflow when working with very large numbers.\n\n## Related Functions\n\n- `<`: Used for less than comparisons.\n- `>=`: Used for greater than or equal to comparisons.\n- `<=`: Used for less than or equal to comparisons.\n\n## Conclusion\n\nThe greater than function is a fundamental tool for implementing comparison logic in Clarity smart contracts. By understanding its behavior with different types and potential edge cases, you can create robust conditional logic and enforce important thresholds in your contracts.\n" + }, + { + "title": "not", + "description": "Logical negation in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/not", + "content": "\n## Function Signature\n\n```clarity\n(not boolean-expression)\n```\n\n- Input: `bool`\n- Output: `bool`\n\n## Why it matters\n\nThe `not` function is crucial for:\n\n1. Implementing logical negation in conditional statements.\n2. Simplifying the process of inverting boolean expressions.\n3. Enhancing code readability and maintainability by abstracting logical negation.\n\n## When to use it\n\nUse `not` when you need to:\n\n- Invert a boolean expression.\n- Implement logical negation in conditional statements.\n- Simplify and abstract the process of inverting boolean values.\n\n## Best Practices\n\n- Ensure the input is a boolean expression.\n- Use meaningful variable names for better readability.\n- Combine with other logical functions for comprehensive boolean logic.\n- Be aware of the performance implications of complex logical operations.\n\n## Practical Example: Inverting a Boolean Expression\n\nLet's implement a function that checks if a number is not zero:\n\n```clarity\n(define-read-only (is-not-zero (n int))\n (not (is-eq n 0))\n)\n\n;; Usage\n(is-not-zero 5) ;; Returns true\n(is-not-zero 0) ;; Returns false\n```\n\nThis example demonstrates:\n1. Using `not` to invert the result of a boolean expression.\n2. Implementing a read-only function to check if a number is not zero.\n3. Handling both true and false cases.\n\n## Common Pitfalls\n\n1. Using `not` with non-boolean expressions, causing type errors.\n2. Assuming the result will always be true or false, leading to incorrect logic.\n3. Not handling all possible conditions, resulting in incomplete boolean logic.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `and`: Logical conjunction of multiple boolean expressions.\n- `or`: Logical disjunction of multiple boolean expressions.\n- `is-eq`: Checks if two values are equal.\n\n## Conclusion\n\nThe `not` function is a fundamental tool for implementing logical negation in Clarity smart contracts. It allows you to invert boolean expressions, enabling robust and comprehensive boolean logic. When used effectively, `not` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage logical negation.\n" + }, + { + "title": "get-block-info?", + "description": "Fetch information about Stacks blocks in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/get-block-info", + "content": "\n<Callout>\nIn Clarity 3, this function is being deprecated for [`get-stacks-block-info?`](/stacks/clarity/functions/get-stacks-block-info).\n</Callout>\n\n## Function Signature\n\n```clarity\n(get-block-info? prop-name block-height)\n```\n\n- Input: \n - `prop-name`: A BlockInfoPropertyName\n - `block-height`: A uint representing the Stacks block height\n- Output: `(optional buff) | (optional uint) | (optional principal)` depending on the property\n\n## Why it matters\n\nThe `get-block-info?` function is crucial for:\n\n1. Accessing historical block data within smart contracts.\n2. Implementing time-based logic using block information.\n3. Verifying block-related properties for security or validation purposes.\n4. Building applications that need to reference specific blockchain states.\n\n## When to use it\n\nUse `get-block-info?` when you need to:\n\n- Retrieve information about past Stacks blocks.\n- Implement logic that depends on block times or miner information.\n- Verify block hashes or other block-specific data.\n- Access block rewards or miner spending data (in Stacks 2.1+).\n\n## Best Practices\n\n- Always check if the returned value is `none`, as it will be for non-existent or future blocks.\n- Be aware of the potential for chain reorganizations when using recent block data.\n- Use the appropriate property name for the data you need to retrieve.\n- Consider caching results for frequently accessed block information to save on execution costs.\n\n## Practical Example: Block Time Verification\n\nLet's implement a function that checks if a given block was mined after a certain time:\n\n```clarity\n(define-read-only (block-after-time? (blockHeight uint) (targetTime uint))\n (match (get-block-info? time blockHeight) time\n (> time targetTime)\n false\n )\n)\n\n;; Usage\n(block-after-time? u100 u1600000000) ;; Returns true if block 100 was mined after Unix timestamp 1600000000\n```\n\nThis example demonstrates:\n1. Using `get-block-info?` to retrieve the `time` property of a block.\n2. Handling the optional return value with `match`.\n3. Comparing the block time to a target time.\n\n## Available Properties\n\n- `burnchain-header-hash`: Returns the burnchain block header hash (buff 32).\n- `id-header-hash`: Returns the Stacks block's index block hash (buff 32).\n- `header-hash`: Returns the Stacks block's header hash (buff 32).\n- `miner-address`: Returns the block miner's principal.\n- `time`: Returns the block time as a Unix epoch timestamp (uint).\n\nNew in Stacks 2.1:\n- `block-reward`: Returns the total block reward (uint).\n- `miner-spend-total`: Returns the total spent by miners for this block (uint).\n\n## Common Pitfalls\n\n1. Assuming all properties are available for all blocks (e.g., `block-reward` is only available for mature blocks).\n2. Not handling the `none` case when the block height is invalid or in the future.\n3. Relying on exact block times, which can be inaccurate up to two hours.\n4. Using `header-hash` when global uniqueness is required (use `id-header-hash` instead).\n\n## Related Functions\n\n- `get-burn-block-info?`: Used to get information about the underlying burn chain blocks.\n- `block-height`: Keyword that returns the current block height.\n- `burn-block-height`: Keyword that returns the current burn chain block height.\n\n## Conclusion\n\nThe `get-block-info?` function is a powerful tool for accessing historical block data in Clarity smart contracts. It allows you to incorporate block-specific information into your contract logic, enabling a wide range of applications that can reference and utilize blockchain state. When used correctly, it provides valuable insights into the Stacks blockchain's history and can be used to implement sophisticated, time-aware contract behaviors.\n" + }, + { + "title": "string-to-uint?", + "description": "Convert a string to an optional unsigned integer in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/string-to-uint", + "content": "\n## Function Signature\n\n```clarity\n(string-to-uint? string)\n```\n\n- Input: `(string-ascii 1048576) | (string-utf8 262144)`\n- Output: `(optional uint)`\n\n## Why it matters\n\nThe `string-to-uint?` function is crucial for:\n\n1. Converting string representations of numbers to unsigned integers.\n2. Implementing logic that requires numeric values from string inputs.\n3. Ensuring data integrity by validating string-to-unsigned-integer conversions.\n4. Simplifying the process of handling numeric conversions in smart contracts.\n\n## When to use it\n\nUse `string-to-uint?` when you need to:\n\n- Convert a string representation of a number to an unsigned integer.\n- Implement logic that requires numeric values from string inputs.\n- Validate string-to-unsigned-integer conversions to ensure data integrity.\n- Handle numeric conversions in your smart contract.\n\n## Best Practices\n\n- Ensure the input string is correctly formatted and represents a valid unsigned integer.\n- Use meaningful variable names for better readability.\n- Combine with other string and numeric functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Converting a String to an Unsigned Integer\n\nLet's implement a function that converts a string to an optional unsigned integer:\n\n```clarity\n(define-read-only (convert-string-to-uint (input (string-ascii 20)))\n (string-to-uint? input)\n)\n\n;; Usage\n(convert-string-to-uint \"123\") ;; Returns (some u123)\n(convert-string-to-uint \"456\") ;; Returns (some u456)\n(convert-string-to-uint \"abc\") ;; Returns none\n```\n\nThis example demonstrates:\n1. Using `string-to-uint?` to convert a string to an optional unsigned integer.\n2. Implementing a public function to handle the string-to-unsigned-integer conversion.\n3. Handling both valid and invalid string inputs.\n\n## Common Pitfalls\n\n1. Using `string-to-uint?` with incorrectly formatted or invalid string inputs, causing the operation to return `none`.\n2. Assuming the conversion will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `string-to-int?`: Converts a string to an optional signed integer.\n- `int-to-ascii`: Converts an integer to a string-ascii representation.\n- `int-to-utf8`: Converts an integer to a string-utf8 representation.\n\n## Conclusion\n\nThe `string-to-uint?` function is a fundamental tool for converting string representations of numbers to unsigned integers in Clarity smart contracts. It allows you to implement logic that requires numeric values from string inputs, ensuring data integrity and simplifying numeric conversions. When used effectively, `string-to-uint?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle string-to-unsigned-integer conversions.\n" + }, + { + "title": "buff-to-uint-le", + "description": "Convert a byte buffer to an unsigned integer using little-endian encoding in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/buff-to-uint-le", + "content": "\n## Function Signature\n\n```clarity\n(buff-to-uint-le (buff 16))\n```\n\n- Input: A byte buffer of up to 16 bytes\n- Output: An unsigned integer (`uint`)\n\n## Why it matters\n\nThe `buff-to-uint-le` function is crucial for:\n\n1. Converting byte data to unsigned integers using little-endian encoding.\n2. Handling data from external sources or other contracts that use little-endian encoding.\n3. Implementing protocols or algorithms that require little-endian integer representation.\n4. Interoperating with systems that use little-endian byte order.\n\n## When to use it\n\nUse the `buff-to-uint-le` function when you need to:\n\n- Convert a little-endian encoded byte buffer to an unsigned integer.\n- Process input data that represents unsigned integers in little-endian format.\n- Implement cryptographic or mathematical operations that expect little-endian integer inputs.\n- Ensure compatibility with external systems using little-endian encoding.\n\n## Best Practices\n\n- Ensure the input buffer is no larger than 16 bytes to avoid errors.\n- Be aware that smaller buffers are zero-padded on the right, affecting the resulting integer value.\n- Use `buff-to-int-le` if you need to handle signed integers instead.\n- Handle potential errors when the input buffer might be invalid or empty.\n\n## Practical Example: Decoding an Unsigned Integer from External Data\n\nLet's implement a function that processes external data containing a little-endian encoded unsigned integer:\n\n```clarity\n(define-read-only (process-external-data-le (data (buff 16)))\n (let\n (\n (value (buff-to-uint-le data))\n )\n (if (> value u1000000)\n (err \"Value too large\")\n (ok value)\n )\n )\n)\n\n;; Usage\n(process-external-data-le 0x01000000) ;; Returns (ok u1)\n(process-external-data-le 0x40420f00) ;; Returns (ok u1000000)\n(process-external-data-le 0x80969800) ;; Returns (err \"Value too large\")\n```\n\nThis example demonstrates:\n1. Using `buff-to-uint-le` to convert external data to an unsigned integer.\n2. Implementing input validation based on the converted integer value.\n3. Handling different input sizes and values.\n\n## Common Pitfalls\n\n1. Confusing little-endian with big-endian encoding, leading to incorrect integer values.\n2. Not considering the full range of possible uint values when processing the result.\n3. Assuming a specific buffer length, which could lead to unexpected results with shorter inputs due to right-padding.\n\n## Related Functions\n\n- `buff-to-uint-be`: Converts a byte buffer to an unsigned integer using big-endian encoding.\n- `buff-to-int-le`: Converts a byte buffer to a signed integer using little-endian encoding.\n- `uint-to-buff`: Converts an unsigned integer to a byte buffer.\n\n## Conclusion\n\nThe `buff-to-uint-le` function is a powerful tool for working with little-endian encoded unsigned integers in Clarity smart contracts. By understanding its behavior with different input sizes and potential edge cases, you can effectively process and validate external data, implement complex algorithms, and ensure compatibility with little-endian systems in your smart contract applications.\n" + }, + { + "title": "unwrap-err!", + "description": "Unpack error responses in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/unwrap-err", + "content": "\n## Function Signature\n\n```clarity\n(unwrap-err! response-input thrown-value)\n```\n\n- Input: `(response A B), C`\n- Output: `B`\n\n## Why it matters\n\nThe `unwrap-err!` function is crucial for:\n\n1. Unpacking error responses to access their inner values.\n2. Implementing logic that requires handling error responses.\n3. Ensuring data integrity by validating the error unpacking process.\n4. Simplifying the process of handling error responses in smart contracts.\n\n## When to use it\n\nUse `unwrap-err!` when you need to:\n\n- Unpack error responses to access their inner values.\n- Implement logic that requires handling error responses.\n- Validate the error unpacking process to ensure data integrity.\n- Handle error responses in your smart contract.\n\n## Best Practices\n\n- Ensure the input value is a response type.\n- Use meaningful variable names for better readability.\n- Combine with other error handling functions for comprehensive error management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Unpacking an Error Response\n\nLet's implement a function that processes an error response using `unwrap-err!`:\n\n```clarity\n(define-public (process-error-response (input (response int int)))\n (let\n (\n (errorValue (unwrap-err! input (err \"No error found\")))\n )\n (ok errorValue)\n )\n)\n\n;; Usage\n(process-error-response (err 42)) ;; Returns (ok 42)\n(process-error-response (ok 1)) ;; Returns (err \"No error found\")\n```\n\nThis example demonstrates:\n1. Using `unwrap-err!` to unpack an error response.\n2. Implementing a public function to handle the error unpacking process.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `unwrap-err!` with values that are not response types, causing runtime errors.\n2. Assuming the error unpacking will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete error management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `unwrap!`: Unpacks optional and response types, returning a thrown value if unpacking fails.\n- `unwrap-panic`: Unpacks optional and response types, throwing a runtime error if unpacking fails.\n- `try!`: Unpacks optional and response types, returning `none` or the `err` value if unpacking fails.\n\n## Conclusion\n\nThe `unwrap-err!` function is a fundamental tool for unpacking error responses in Clarity smart contracts. It allows you to implement logic that requires handling error responses, ensuring data integrity and simplifying the error unpacking process. When used effectively, `unwrap-err!` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle error responses.\n" + }, + { + "title": "define-fungible-token", + "description": "Define a new fungible token in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/define-fungible-token", + "content": "\n## Function Signature\n\n```clarity\n(define-fungible-token token-name <total-supply>)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n - `<total-supply>`: (Optional) An unsigned integer representing the total supply of tokens\n- Output: Not applicable (definition statement)\n\n## Why it matters\n\nThe `define-fungible-token` function is crucial for:\n\n1. Creating new fungible tokens within a smart contract.\n2. Establishing a token economy or system within your dApp.\n3. Implementing custom tokens with specific supply constraints.\n4. Enabling token-related operations like minting, transferring, and burning.\n\n## When to use it\n\nUse `define-fungible-token` when you need to:\n\n- Create a new fungible token for your smart contract or dApp.\n- Implement a token with a fixed total supply.\n- Establish a foundation for token-based features in your contract.\n- Create utility tokens, governance tokens, or other custom fungible assets.\n\n## Best Practices\n\n- Place `define-fungible-token` at the top level of your contract, as it's a definition statement.\n- Consider carefully whether to specify a total supply or leave it unlimited.\n- Use meaningful and descriptive names for your tokens.\n- Implement proper access controls for minting and burning operations if required.\n\n## Practical Example: Simple Token Creation\n\nLet's implement a basic fungible token with a fixed supply:\n\n```clarity\n(define-fungible-token DOG-GO-TO-THE-MOON u1000000)\n\n(define-data-var tokenAdmin principal tx-sender)\n\n(define-public (transfer (amount uint) (sender principal) (recipient principal))\n (begin\n (asserts! (is-eq tx-sender sender) (err u1))\n (ft-transfer? DOG-GO-TO-THE-MOON amount sender recipient)\n )\n)\n\n(define-read-only (get-balance (account principal))\n (ok (ft-get-balance DOG-GO-TO-THE-MOON account))\n)\n\n(define-public (mint (amount uint) (recipient principal))\n (begin\n (asserts! (is-eq tx-sender (var-get tokenAdmin)) (err u3))\n (ft-mint? DOG-GO-TO-THE-MOON amount recipient)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `define-fungible-token` to create a new token with a fixed supply of 1,000,000.\n2. Implementing basic token operations like transfer and balance checking.\n3. Adding a mint function with admin-only access control.\n\n## Common Pitfalls\n\n1. Forgetting that omitting the total supply parameter allows unlimited minting, if not handled manually.\n2. Not implementing proper access controls for sensitive operations like minting.\n3. Overlooking the need for additional functionality like burning or pausing.\n\n## Related Functions\n\n- `ft-transfer?`: Used to transfer tokens between principals.\n- `ft-mint?`: Used to create new tokens (if allowed by the token definition).\n- `ft-burn?`: Used to destroy tokens, reducing the circulating supply.\n- `ft-get-balance`: Used to check the token balance of a principal.\n- `ft-get-supply`: Used to get the current total supply of tokens.\n\n## Conclusion\n\nThe `define-fungible-token` function is a fundamental building block for creating token-based systems in Clarity smart contracts. It allows you to define custom fungible tokens with or without supply constraints. When combined with other token-related functions, it enables the implementation of sophisticated token economies and financial instruments on the Stacks blockchain.\n" + }, + { + "title": "at-block", + "description": "Use the at-block function to evaluate expressions at a specific block in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/at-block", + "content": "\n## Function Signature\n\n```clarity\n(at-block id-block-hash expr)\n```\n\n\n- Input: \n - `id-block-hash`: A 32-byte buffer representing a block hash\n - `expr`: An expression to be evaluated\n- Output: The result of evaluating `expr`\n\n## Why it matters\n\nThe `at-block` function is crucial for:\n\n1. Accessing historical contract state at a specific block.\n2. Implementing time-dependent logic based on blockchain state.\n3. Verifying past conditions or values in the contract.\n4. Creating mechanisms that depend on specific blockchain checkpoints.\n\n## When to use it\n\nUse the `at-block` function when you need to:\n\n- Evaluate contract state or expressions as they were at a specific past block.\n- Implement logic that depends on historical blockchain data.\n- Verify past conditions without relying on stored state.\n- Create time-locked or checkpoint-based features in your contract.\n\n## Best Practices\n\n- Only use `at-block` when historical data is necessary, as it can be computationally expensive.\n- Ensure the block hash used is from the `id-header-hash` property, not `header-hash`.\n- Use read-only expressions within `at-block` to maintain determinism.\n- Be aware of the potential for chain reorganizations when using recent block hashes.\n\n## Practical Example: Historical Price Check\n\nLet's implement a simple function that checks if a price was above a certain threshold at a specific block:\n\n```clarity\n(define-map AssetPrices uint uint)\n\n(define-public (set-price (price uint))\n (ok (map-set AssetPrices block-height price))\n)\n\n(define-read-only (was-price-above-at-block (threshold uint) (blockHash (buff 32)))\n (at-block blockHash\n (let\n (\n (pastPrice (default-to u0 (map-get? AssetPrices block-height)))\n )\n (> pastPrice threshold)\n )\n )\n)\n\n;; Usage\n(set-price u100)\n;; ... several blocks later\n(was-price-above-at-block u50 0x123456...) ;; Returns true if the price was above 50 at the specified block\n```\n\n\nThis example demonstrates:\n1. Using `at-block` to evaluate a condition based on historical data.\n2. Combining `at-block` with map lookups to access past state.\n3. Implementing a read-only function that depends on blockchain history.\n\n## Common Pitfalls\n\n1. Using `header-hash` instead of `id-header-hash`, which can lead to inconsistencies across forks.\n2. Attempting to modify state within an `at-block` expression, which is not allowed.\n3. Overusing `at-block`, which can lead to performance issues due to the cost of historical lookups.\n\n## Related Functions\n\n- `get-block-info?`: Used to retrieve information about specific blocks.\n- `block-height`: Often used in conjunction with `at-block` for time-based logic.\n- `id-header-hash`: Provides the correct hash to use with `at-block`.\n\n## Conclusion\n\nThe `at-block` function is a powerful tool for implementing history-dependent logic in Clarity smart contracts. By allowing contracts to evaluate expressions as they would have at a specific past block, it enables sophisticated time-based mechanisms and historical verifications. However, this function should be used judiciously due to its potential performance impact and the complexities of working with blockchain history.\n" + }, + { + "title": "secp256k1-recover?", + "description": "Recover the public key from a message hash and signature in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/secp256k1-recover", + "content": "\n## Function Signature\n\n```clarity\n(secp256k1-recover? message-hash signature)\n```\n\n- Input: `(buff 32), (buff 65)`\n- Output: `(response (buff 33) uint)`\n\n## Why it matters\n\nThe `secp256k1-recover?` function is crucial for:\n\n1. Verifying the authenticity of a message by recovering the public key from a signature.\n2. Implementing cryptographic verification in smart contracts.\n3. Ensuring data integrity by validating signatures.\n4. Simplifying the process of handling cryptographic operations in smart contracts.\n\n## When to use it\n\nUse `secp256k1-recover?` when you need to:\n\n- Verify the authenticity of a message by recovering the public key from a signature.\n- Implement cryptographic verification in your smart contract.\n- Validate signatures to ensure data integrity.\n- Handle cryptographic operations.\n\n## Best Practices\n\n- Ensure the `message-hash` and `signature` are correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for comprehensive security management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Recovering a Public Key\n\nLet's implement a function that recovers the public key from a message hash and signature:\n\n```clarity\n(define-read-only (recover-public-key (messageHash (buff 32)) (signature (buff 65)))\n (secp256k1-recover? messageHash signature)\n)\n\n;; Usage\n(recover-public-key 0xde5b9eb9e7c5592930eb2e30a01369c36586d872082ed8181ee83d2a0ec20f04 0x8738487ebe69b93d8e51583be8eee50bb4213fc49c767d329632730cc193b873554428fc936ca3569afc15f1c9365f6591d6251a89fee9c9ac661116824d3a1301) \n;; Returns (ok 0x03adb8de4bfb65db2cfd6120d55c6526ae9c52e675db7e47308636534ba7786110)\n```\n\nThis example demonstrates:\n1. Using `secp256k1-recover?` to recover a public key from a message hash and signature.\n2. Implementing a public function to handle the public key recovery.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `secp256k1-recover?` with incorrectly formatted or invalid `message-hash` or `signature`, causing the operation to fail.\n2. Assuming the public key will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete cryptographic verification.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `principal-of?`: Returns the principal derived from a public key.\n- `hash160`: Computes the RIPEMD-160 hash of the SHA-256 hash of the input.\n- `sha256`: Computes the SHA-256 hash of the input.\n\n## Conclusion\n\nThe `secp256k1-recover?` function is a fundamental tool for recovering public keys from message hashes and signatures in Clarity smart contracts. It allows you to verify the authenticity of messages, ensuring data integrity and simplifying cryptographic operations. When used effectively, `secp256k1-recover?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle cryptographic verification.\n" + }, + { + "title": "begin", + "description": "Use the begin function to evaluate multiple expressions in sequence in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/begin", + "content": "\n## Function Signature\n\n```clarity\n(begin expr1 expr2 expr3 ... expr-last)\n```\n\n\n- Input: Two or more expressions of any type\n- Output: The value of the last expression\n\n## Why it matters\n\nThe `begin` function is crucial for:\n\n1. Grouping multiple expressions into a single expression.\n2. Executing a series of operations in a specific order.\n3. Creating complex logic flows within functions or conditions.\n4. Allowing side effects while returning a specific value.\n\n## When to use it\n\nUse the `begin` function when you need to:\n\n- Perform multiple operations in sequence within a single expression.\n- Execute side effects before returning a final value.\n- Group multiple expressions where only one is allowed (e.g., in function bodies or condition branches).\n- Create more complex, multi-step logic within your smart contract functions.\n\n## Best Practices\n\n- Use `begin` to keep related operations together for better readability.\n- Ensure that any expressions that return a response type (ok or err) are properly checked.\n- Be mindful of the order of expressions, as they are evaluated sequentially.\n- Use `begin` to make your code more expressive and easier to understand.\n\n## Practical Example: User Registration with Logging\n\nLet's implement a simple user registration function that performs multiple actions:\n\n```clarity\n(define-map Users principal bool)\n(define-data-var userCount uint u0)\n\n(define-public (register-user)\n (begin\n (asserts! (is-none (map-get? Users tx-sender)) (err u1))\n (map-set Users tx-sender true)\n (var-set userCount (+ (var-get userCount) u1))\n (print { registered: true, user: tx-sender })\n (ok true)\n )\n)\n\n;; Usage\n(register-user) ;; Returns (ok true) and logs the new user\n```\n\n\nThis example demonstrates:\n1. Using `begin` to group multiple operations in a single function.\n2. Performing checks, updates, and logging in a specific order.\n3. Executing side effects (printing) before returning the final value.\n\n## Common Pitfalls\n\n1. Forgetting to return a value in the last expression of a `begin` block.\n2. Not properly handling responses from functions that return (ok) or (err) within the `begin` block.\n3. Relying on side effects of earlier expressions without considering their order of execution.\n\n## Related Functions\n\n- `let`: Used for creating local bindings within a limited scope.\n- `asserts!`: Often used within `begin` blocks for condition checking.\n- `print`: Useful for logging within `begin` blocks during development.\n\n## Conclusion\n\nThe `begin` function is a fundamental tool in Clarity for grouping multiple expressions and creating more complex logic flows. By allowing you to execute a series of operations in a specific order while returning a single value, `begin` enhances the expressiveness and capability of Clarity smart contracts. When used judiciously, this function can significantly improve code readability and organization.\n" + }, + { + "title": "err", + "description": "Construct error responses in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/err", + "content": "\n## Function Signature\n\n```clarity\n(err value)\n```\n\n- Input: `value` - Any type A\n- Output: `(response A B)` where A is the type of the input value\n\n## Why it matters\n\nThe `err` function is crucial for:\n\n1. Creating standardized error responses in public functions.\n2. Indicating that a function execution has failed.\n3. Providing meaningful error information to callers.\n4. Triggering automatic rollback of any database changes during function execution.\n\n## When to use it\n\nUse `err` when you need to:\n\n- Return an error state from a public function.\n- Indicate that a condition or operation has failed.\n- Provide specific error information or codes to the caller.\n- Ensure that any state changes are reverted due to a failure condition.\n\n## Best Practices\n\n- Use descriptive error values that help diagnose the issue.\n- Consider using standardized error codes across your contract.\n- Pair `err` with `ok` to create comprehensive response handling.\n- Remember that returning an `err` will cause all state changes in the current function to be rolled back.\n\n## Practical Example: Token Transfer with Error Handling\n\nLet's implement a simple token transfer function with error handling:\n\n```clarity\n(define-map Balances principal uint)\n\n(define-public (transfer (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? Balances tx-sender)))\n )\n (if (>= senderBalance amount)\n (begin\n (map-set Balances tx-sender (- senderBalance amount))\n (map-set Balances recipient (+ (default-to u0 (map-get? Balances recipient)) amount))\n (ok true)\n )\n (err u1)\n )\n )\n)\n\n;; Usage\n(transfer u100 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM) ;; Returns (err u1) if balance is insufficient\n```\n\nThis example demonstrates:\n1. Using `err` to return an error when the sender has insufficient balance.\n2. Pairing `err` with `ok` to handle both success and failure cases.\n3. Using a simple error code (u1) to indicate the type of error.\n\n## Common Pitfalls\n\n1. Forgetting that returning an `err` will revert all state changes in the current function.\n2. Using non-descriptive error values that make debugging difficult.\n3. Inconsistent error handling across different functions in the contract.\n\n## Related Functions\n\n- `ok`: Used to construct successful responses in public functions.\n- `asserts!`: Often used with `err` for condition checking and error reporting.\n- `try!`: Used to propagate errors up the call stack.\n\n## Conclusion\n\nThe `err` function is a fundamental tool for error handling and response construction in Clarity smart contracts. By providing a standardized way to indicate and communicate errors, this function enables robust and predictable contract behavior. When used effectively in combination with `ok` and other error-handling mechanisms, `err` contributes to creating more reliable and maintainable smart contracts.\n" + }, + { + "title": "or", + "description": "Logical disjunction in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/or", + "content": "\n## Function Signature\n\n```clarity\n(or b1 b2 ...)\n```\n\n- Input: `bool, ...`\n- Output: `bool`\n\n## Why it matters\n\nThe `or` function is crucial for:\n\n1. Implementing logical disjunction in conditional statements.\n2. Simplifying the process of evaluating multiple boolean expressions.\n3. Enhancing code readability and maintainability by abstracting logical disjunction.\n\n## When to use it\n\nUse `or` when you need to:\n\n- Evaluate multiple boolean expressions and return `true` if any are `true`.\n- Implement logical disjunction in conditional statements.\n- Simplify and abstract the process of evaluating multiple boolean values.\n\n## Best Practices\n\n- Ensure all inputs are boolean expressions.\n- Use meaningful variable names for better readability.\n- Combine with other logical functions for comprehensive boolean logic.\n- Be aware of the performance implications of complex logical operations.\n\n## Practical Example: Evaluating Multiple Conditions\n\nLet's implement a function that checks if a number is either zero or negative:\n\n```clarity\n(define-read-only (is-zero-or-negative (n int))\n (or (is-eq n 0) (< n 0))\n)\n\n;; Usage\n(is-zero-or-negative 5) ;; Returns false\n(is-zero-or-negative 0) ;; Returns true\n(is-zero-or-negative -3) ;; Returns true\n```\n\nThis example demonstrates:\n1. Using `or` to evaluate multiple boolean expressions.\n2. Implementing a read-only function to check if a number is either zero or negative.\n3. Handling both true and false cases.\n\n## Common Pitfalls\n\n1. Using `or` with non-boolean expressions, causing type errors.\n2. Assuming the result will always be true or false, leading to incorrect logic.\n3. Not handling all possible conditions, resulting in incomplete boolean logic.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `and`: Logical conjunction of multiple boolean expressions.\n- `not`: Logical negation of a boolean expression.\n- `is-eq`: Checks if two values are equal.\n\n## Conclusion\n\nThe `or` function is a fundamental tool for implementing logical disjunction in Clarity smart contracts. It allows you to evaluate multiple boolean expressions, enabling robust and comprehensive boolean logic. When used effectively, `or` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage logical disjunction.\n" + }, + { + "title": "try!", + "description": "Handle errors in Clarity smart contracts using the `try!` function.", + "slug": "/stacks/clarity/functions/try", + "content": "\n## Function Signature\n\n```clarity\n(try! expression)\n```\n\n- Input: `expression` (of type `(response T E)`)\n- Output: `T` (if the response is `ok`) or causes a runtime error (if the response is `err`)\n\n## Why it matters\n\nThe `try!` function is crucial for:\n\n1. Simplifying error handling in Clarity smart contracts.\n2. Implementing logic that requires automatic error propagation.\n3. Ensuring data integrity by validating operations and handling errors gracefully.\n4. Simplifying the process of handling responses in smart contracts.\n\n## When to use it\n\nUse `try!` when you need to:\n\n- Simplify error handling in your smart contract.\n- Implement logic that requires automatic error propagation.\n- Validate operations and handle errors gracefully.\n- Handle responses in your smart contract.\n\n## Best Practices\n\n- Ensure the expression returns a response type `(response T E)`.\n- Use meaningful variable names for better readability.\n- Combine with other error handling functions for comprehensive error management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Handling Errors in a Transfer Function\n\nLet's implement a function that transfers STX and handles errors using `try!`:\n\n```clarity\n(define-public (transfer-stx (amount uint) (recipient principal))\n (begin\n (try! (stx-transfer? amount tx-sender recipient))\n (ok true)\n )\n)\n\n;; Usage\n(transfer-stx u60 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns (ok true) if successful\n(transfer-stx u50 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns (err u1) if the sender does not have enough balance\n```\n\nThis example demonstrates:\n1. Using `try!` to handle errors in a STX transfer operation.\n2. Implementing a public function to handle the transfer and error propagation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `try!` with expressions that do not return a response type, causing runtime errors.\n2. Assuming the operation will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete error management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `unwrap!`: Unwraps an optional value, causing a runtime error if the value is `none`.\n- `asserts!`: Asserts a condition, causing a runtime error if the condition is false.\n- `is-err`: Checks if a response is an error.\n\n## Conclusion\n\nThe `try!` function is a fundamental tool for handling errors in Clarity smart contracts. It allows you to simplify error handling, ensuring data integrity and automatic error propagation. When used effectively, `try!` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle responses and errors.\n" + }, + { + "title": "map-insert", + "description": "Insert an entry into a map in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/map-insert", + "content": "\n## Function Signature\n\n```clarity\n(map-insert map-name key-tuple value-tuple)\n```\n\n- Input: `MapName, tuple_A, tuple_B`\n- Output: `bool`\n\n## Why it matters\n\nThe `map-insert` function is crucial for:\n\n1. Adding new entries to a map.\n2. Ensuring data integrity by preventing overwrites of existing entries.\n3. Simplifying the process of managing data in smart contracts.\n4. Enabling the creation of unique key-value pairs in maps.\n\n## When to use it\n\nUse `map-insert` when you need to:\n\n- Add a new entry to a map.\n- Ensure that existing entries are not overwritten.\n- Manage data in your smart contract.\n- Create unique key-value pairs in maps.\n\n## Best Practices\n\n- Ensure the key-tuple and value-tuple are correctly formatted.\n- Use meaningful variable names for better readability.\n- Combine with other map functions for comprehensive map management.\n- Handle the case where the key already exists to avoid unexpected behavior.\n\n## Practical Example: Inserting User Data\n\nLet's implement a function that inserts a user's data into a map:\n\n```clarity\n(define-map UserData { userId: principal } { data: (buff 32) })\n\n(define-public (insert-user-data (user principal) (data (buff 32)))\n (ok (map-insert UserData { userId: user } { data: data }))\n)\n\n;; Usage\n(insert-user-data tx-sender 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef) ;; Returns (ok true) if the entry is inserted\n(insert-user-data tx-sender 0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef) ;; Returns (ok false) if the entry already exists\n```\n\nThis example demonstrates:\n1. Using `map-insert` to add a user's data to the `UserData` map.\n2. Implementing a public function to insert the data.\n3. Handling both the case where the entry is successfully inserted and where it already exists.\n\n## Common Pitfalls\n\n1. Using `map-insert` with incorrectly formatted tuples, causing the insertion to fail.\n2. Assuming the entry will always be inserted, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-set`: Sets the value associated with a key in a map, overwriting any existing value.\n- `map-delete`: Removes an entry from a map.\n- `map-get?`: Retrieves an entry from a map.\n\n## Conclusion\n\nThe `map-insert` function is a fundamental tool for adding entries to maps in Clarity smart contracts. It allows you to manage data, ensure data integrity, and create unique key-value pairs. When used effectively, `map-insert` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage data insertion.\n" + }, + { + "title": "some", + "description": "Construct an optional type from a value in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/some", + "content": "\n## Function Signature\n\n```clarity\n(some value)\n```\n\n- Input: `A`\n- Output: `(optional A)`\n\n## Why it matters\n\nThe `some` function is crucial for:\n\n1. Constructing an optional type from a given value.\n2. Implementing logic that requires optional types.\n3. Ensuring data integrity by explicitly handling optional values.\n4. Simplifying the process of working with optional types in smart contracts.\n\n## When to use it\n\nUse `some` when you need to:\n\n- Construct an optional type from a given value.\n- Implement logic that requires optional types.\n- Explicitly handle optional values to ensure data integrity.\n- Work with optional types in your smart contract.\n\n## Best Practices\n\n- Ensure the value passed to `some` is the intended value to be wrapped in an optional type.\n- Use meaningful variable names for better readability.\n- Combine with other optional functions for comprehensive optional type management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Constructing an Optional Type\n\nLet's implement a function that constructs an optional type from a given integer:\n\n```clarity\n(define-read-only (wrap-in-optional (input int))\n (some input)\n)\n\n;; Usage\n(wrap-in-optional 42) ;; Returns (some 42)\n(wrap-in-optional -1) ;; Returns (some -1)\n```\n\nThis example demonstrates:\n1. Using `some` to construct an optional type from a given integer.\n2. Implementing a public function to handle the optional type construction.\n3. Handling both positive and negative input values.\n\n## Common Pitfalls\n\n1. Using `some` without ensuring the value is the intended value to be wrapped, causing unexpected behavior.\n2. Assuming the optional type will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete optional type management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `is-some`: Checks if an optional type contains a value.\n- `is-none`: Checks if an optional type is empty.\n- `unwrap!`: Unwraps an optional type, returning the contained value or throwing an error if empty.\n\n## Conclusion\n\nThe `some` function is a fundamental tool for constructing optional types in Clarity smart contracts. It allows you to implement logic that requires optional types, ensuring data integrity and simplifying optional type handling. When used effectively, `some` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle optional type construction.\n" + }, + { + "title": "secp256k1-verify", + "description": "Verify a signature against a message hash and public key in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/secp256k1-verify", + "content": "\n## Function Signature\n\n```clarity\n(secp256k1-verify message-hash signature public-key)\n```\n\n- Input: `(buff 32), (buff 64) | (buff 65), (buff 33)`\n- Output: `bool`\n\n## Why it matters\n\nThe `secp256k1-verify` function is crucial for:\n\n1. Verifying the authenticity of a message by checking the signature against the public key.\n2. Implementing cryptographic verification in smart contracts.\n3. Ensuring data integrity by validating signatures.\n4. Simplifying the process of handling cryptographic operations in smart contracts.\n\n## When to use it\n\nUse `secp256k1-verify` when you need to:\n\n- Verify the authenticity of a message by checking the signature against the public key.\n- Implement cryptographic verification in your smart contract.\n- Validate signatures to ensure data integrity.\n- Handle cryptographic operations.\n\n## Best Practices\n\n- Ensure the `message-hash`, `signature`, and `public-key` are correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for comprehensive security management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Verifying a Signature\n\nLet's implement a function that verifies a signature against a message hash and public key:\n\n```clarity\n(define-read-only (verify-signature (messageHash (buff 32)) (signature (buff 65)) (publicKey (buff 33)))\n (secp256k1-verify messageHash signature publicKey)\n)\n\n;; Usage\n(verify-signature 0xde5b9eb9e7c5592930eb2e30a01369c36586d872082ed8181ee83d2a0ec20f04 0x8738487ebe69b93d8e51583be8eee50bb4213fc49c767d329632730cc193b873554428fc936ca3569afc15f1c9365f6591d6251a89fee9c9ac661116824d3a1301 0x03adb8de4bfb65db2cfd6120d55c6526ae9c52e675db7e47308636534ba7786110) \n;; Returns true\n```\n\nThis example demonstrates:\n1. Using `secp256k1-verify` to verify a signature against a message hash and public key.\n2. Implementing a public function to handle the signature verification.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `secp256k1-verify` with incorrectly formatted or invalid `message-hash`, `signature`, or `public-key`, causing the operation to fail.\n2. Assuming the verification will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete cryptographic verification.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `secp256k1-recover?`: Recovers the public key from a message hash and signature.\n- `sha256`: Computes the SHA-256 hash of the input.\n- `hash160`: Computes the RIPEMD-160 hash of the SHA-256 hash of the input.\n\n## Conclusion\n\nThe `secp256k1-verify` function is a fundamental tool for verifying signatures against message hashes and public keys in Clarity smart contracts. It allows you to ensure data integrity and simplify cryptographic operations. When used effectively, `secp256k1-verify` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle cryptographic verification.\n" + }, + { + "title": "match", + "description": "Handle different branches or cases in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/match", + "content": "\n## Function Signature\n\n```clarity\n(match opt-input some-binding-name some-branch none-branch)\n(match-resp input ok-binding-name ok-branch err-binding-name err-branch)\n```\n\n- Input: `(optional A) name expression expression | (response A B) name expression name expression`\n- Output: `C`\n\n## Why it matters\n\nThe `match` function is crucial for:\n\n1. Handling different branches or cases for optional and response types.\n2. Simplifying complex conditional logic.\n3. Enhancing code readability and maintainability.\n4. Ensuring comprehensive handling of all possible cases.\n\n## When to use it\n\nUse `match` when you need to:\n\n- Handle different branches or cases for optional and response types.\n- Simplify complex conditional logic.\n- Enhance the readability and maintainability of your code.\n- Ensure comprehensive handling of all possible cases.\n\n## Best Practices\n\n- Ensure all possible branches are covered to avoid unhandled cases.\n- Use meaningful variable names for better readability.\n- Combine with other control flow functions for more complex logic.\n- Be aware of the performance implications of extensive branching.\n\n## Practical Example: Handling Optional and Response Values\n\nLet's implement functions that handle optional and response values using `match`:\n\n```clarity\n(define-private (add-10 (x (optional int))) \n (match x \n value (+ 10 value)\n 10\n )\n)\n(add-10 (some 5)) ;; Returns 15\n(add-10 none) ;; Returns 10\n\n(define-private (add-or-pass-err (x (response int (string-ascii 10))) (to-add int)) \n (match x\n value (ok (+ to-add value))\n err-value (err err-value)\n )\n)\n(add-or-pass-err (ok 5) 20) ;; Returns (ok 25)\n(add-or-pass-err (err \"ERROR\") 20) ;; Returns (err \"ERROR\")\n```\n\nThis example demonstrates:\n1. Using `match` to handle the result of an optional value.\n2. Using `match` to handle the result of a response value.\n3. Implementing functions to return the appropriate result based on the input type.\n\n## Common Pitfalls\n\n1. Using `match` without covering all possible branches, leading to unhandled cases.\n2. Assuming the value will always match a certain branch, causing runtime errors.\n3. Not handling all possible conditions, resulting in incomplete logic.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `if`: Implements conditional logic based on boolean expressions.\n- `let`: Binds variables to expressions within a local scope.\n- `default-to`: Provides default values for optional types.\n\n## Conclusion\n\nThe `match` function is a fundamental tool for handling different branches or cases in Clarity smart contracts. It allows you to manage optional and response types, simplify complex conditional logic, and ensure comprehensive handling of all possible cases. When used effectively, `match` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage branching logic.\n" + }, + { + "title": "let", + "description": "Bind variables to expressions in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/let", + "content": "\n## Function Signature\n\n```clarity\n(let ((name1 expr1) (name2 expr2) ...) expr-body1 expr-body2 ... expr-body-last)\n```\n\n- Input: `((name1 AnyType) (name2 AnyType) ...), AnyType, ... A`\n- Output: `A`\n\n## Why it matters\n\nThe `let` function is crucial for:\n\n1. Binding variables to expressions within a local scope.\n2. Simplifying complex expressions by breaking them into smaller parts.\n3. Improving code readability and maintainability.\n4. Enabling sequential evaluation of expressions.\n\n## When to use it\n\nUse `let` when you need to:\n\n- Bind variables to expressions within a local scope.\n- Simplify complex expressions by breaking them into smaller parts.\n- Improve the readability and maintainability of your code.\n- Ensure sequential evaluation of expressions.\n\n## Best Practices\n\n- Use meaningful variable names for better readability.\n- Ensure that the expressions are evaluated in the correct order.\n- Combine with other control flow functions for more complex logic.\n- Be aware that `let` bindings are sequential and can refer to prior bindings.\n\n## Practical Example: Calculating a Sum\n\nLet's implement a function that calculates the sum of two numbers using `let`:\n\n```clarity\n(define-public (calculate-sum (a int) (b int))\n (let\n (\n (sum (+ a b))\n )\n (ok sum)\n )\n)\n\n;; Usage\n(calculate-sum 3 5) ;; Returns (ok 8)\n```\n\nThis example demonstrates:\n1. Using `let` to bind the variable `sum` to the result of adding `a` and `b`.\n2. Returning the sum as the result of the function.\n3. Simplifying the function body by breaking it into smaller parts.\n\n## Common Pitfalls\n\n1. Using `let` bindings out of order, leading to incorrect evaluations.\n2. Not handling all possible conditions, resulting in incomplete logic.\n3. Overlooking the need for proper error handling and validation.\n4. Using `let` for simple expressions where it is not necessary.\n\n## Related Functions\n\n- `begin`: Evaluates multiple expressions sequentially, returning the last expression's value.\n- `if`: Implements conditional logic based on boolean expressions.\n- `match`: Used for pattern matching and handling multiple conditions.\n\n## Conclusion\n\nThe `let` function is a fundamental tool for binding variables to expressions in Clarity smart contracts. It allows you to simplify complex expressions, improve code readability, and ensure sequential evaluation of expressions. When used effectively, `let` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage local variables and expressions.\n" + }, + { + "title": "map-get?", + "description": "Retrieve an entry from a map in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/map-get", + "content": "\n## Function Signature\n\n```clarity\n(map-get? map-name key-tuple)\n```\n\n- Input: `MapName, tuple`\n- Output: `(optional (tuple))`\n\n## Why it matters\n\nThe `map-get?` function is crucial for:\n\n1. Retrieving entries from a map.\n2. Implementing logic that depends on the presence of map entries.\n3. Ensuring data integrity by checking for the existence of values.\n4. Simplifying the process of accessing stored data in smart contracts.\n\n## When to use it\n\nUse `map-get?` when you need to:\n\n- Retrieve an entry from a map.\n- Implement logic that depends on the presence of map entries.\n- Check for the existence of values in a map.\n- Access stored data in your smart contract.\n\n## Best Practices\n\n- Ensure the key-tuple accurately identifies the entry to be retrieved.\n- Use meaningful variable names for better readability.\n- Combine with other map functions for comprehensive map management.\n- Handle the `none` case to avoid runtime errors.\n\n## Practical Example: Retrieving User Data\n\nLet's implement a function that retrieves a user's data from a map:\n\n```clarity\n(define-map UserData { userId: principal } { data: (buff 32) })\n\n(define-read-only (get-user-data (user principal))\n (map-get? UserData { userId: user })\n)\n\n;; Usage\n(map-set UserData { userId: tx-sender } { data: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef })\n(get-user-data tx-sender) ;; Returns (some (tuple (data 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef)))\n(get-user-data 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns none\n```\n\nThis example demonstrates:\n1. Using `map-get?` to retrieve a user's data from the `UserData` map.\n2. Implementing a read-only function to return the retrieved data.\n3. Handling both the case where the user's data is present and where it is not.\n\n## Common Pitfalls\n\n1. Using `map-get?` with an incorrect key-tuple, causing the retrieval to fail.\n2. Assuming the entry will always exist, leading to unhandled `none` cases.\n3. Not handling all possible conditions, resulting in incomplete data retrieval.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-set`: Sets the value associated with a key in a map.\n- `map-delete`: Removes an entry from a map.\n- `map-insert`: Inserts a value into a map if the key does not already exist.\n\n## Conclusion\n\nThe `map-get?` function is a fundamental tool for retrieving entries from maps in Clarity smart contracts. It allows you to access stored data, implement logic based on map entries, and ensure data integrity. When used effectively, `map-get?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to retrieve map entries.\n" + }, + { + "title": "is-eq", + "description": "Compare values for equality in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/is-eq", + "content": "\n## Function Signature\n\n```clarity\n(is-eq v1 v2 ...)\n```\n\n\n\n\n- Input: `A, A, ...`\n- Output: `bool`\n\n## Why it matters\n\nThe `is-eq` function is crucial for:\n\n1. Comparing values to check for equality.\n2. Implementing conditional logic based on value comparisons.\n3. Ensuring data integrity by verifying that values match expected results.\n4. Simplifying equality checks in smart contract code.\n\n## When to use it\n\nUse `is-eq` when you need to:\n\n- Compare multiple values for equality.\n- Implement logic that depends on whether values are equal.\n- Verify that input values match expected constants or variables.\n- Simplify equality checks in your contract.\n\n## Best Practices\n\n- Ensure all values being compared are of the same type to avoid type errors.\n- Use `is-eq` for simple equality checks and combine with other logical functions for complex conditions.\n- Be aware that `is-eq` does not short-circuit; all values are evaluated.\n- Use meaningful variable names for better readability.\n\n## Practical Example: Checking User Role\n\nLet's implement a function that checks if a user has a specific role:\n\n```clarity\n(define-constant ADMIN_ROLE \"admin\")\n(define-map UserRoles { userId: principal } { role: (string-ascii 10) })\n\n(define-read-only (is-admin (user principal))\n (let\n (\n (userRole (default-to \"none\" (map-get? UserRoles { userId: user })))\n )\n (is-eq userRole ADMIN_ROLE)\n )\n)\n\n;; Usage\n(map-set UserRoles { userId: tx-sender } { role: \"admin\" })\n(is-admin tx-sender) ;; Returns true\n```\n\n\n\n\nThis example demonstrates:\n1. Using `is-eq` to compare a user's role with the constant `ADMIN_ROLE`.\n2. Handling the case where the user role is not set by providing a default value.\n3. Implementing a read-only function to check if a user is an admin.\n\n## Common Pitfalls\n\n1. Comparing values of different types, leading to type errors.\n2. Assuming `is-eq` short-circuits like `and` or `or` (it does not).\n3. Using `is-eq` for complex conditions where other logical functions might be more appropriate.\n4. Not handling cases where values might be `none` or unset.\n\n## Related Functions\n\n- `is-some`: Checks if an optional value is `some`.\n- `is-none`: Checks if an optional value is `none`.\n- `asserts!`: Asserts a condition and throws an error if it is false.\n\n## Conclusion\n\nThe `is-eq` function is a fundamental tool for comparing values in Clarity smart contracts. It provides a straightforward way to check for equality, enabling you to implement conditional logic and verify data integrity. When used effectively, `is-eq` simplifies equality checks and enhances the readability and maintainability of your smart contract code.\n" + }, + { + "title": "bit-shift-left", + "description": "Use the bit-shift-left function for bitwise left shift operations in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/bit-shift-left", + "content": "\n## Function Signature\n\n```clarity\n(bit-shift-left i1 shamt)\n```\n\n- Input: \n - `i1`: An integer (`int` or `uint`)\n - `shamt`: A `uint` representing the number of places to shift\n- Output: An integer of the same type as `i1` (`int` or `uint`)\n\n## Why it matters\n\nThe `bit-shift-left` function is crucial for:\n\n1. Implementing certain bitwise algorithms and data structures.\n2. Manipulating binary data at the bit level.\n3. Creating bitmasks for various purposes.\n4. Low-level optimizations in specific scenarios.\n\n## When to use it\n\nUse the `bit-shift-left` function when you need to:\n\n- Implement certain cryptographic or hashing algorithms.\n- Perform low-level data manipulations involving binary operations.\n- Create specific bit patterns or masks.\n- Optimize certain bitwise operations.\n\n## Best Practices\n\n- Remember that shifting beyond the bit width of the integer (128 bits in Clarity) will result in zero.\n- Use `uint` for `shamt` to avoid potential issues with negative shift amounts.\n- Be aware of the potential for overflow when shifting left, especially with large numbers or shift amounts.\n- For multiplication by powers of 2, use the `pow` function instead, as it provides built-in overflow protection.\n\n## Practical Example: Flag Management\n\nLet's implement a simple flag management system using `bit-shift-left`:\n\n```clarity\n(define-constant FLAG_READ u1)\n(define-constant FLAG_WRITE u2)\n(define-constant FLAG_EXECUTE u4)\n\n(define-read-only (create-flag (flagPosition uint))\n (bit-shift-left u1 flagPosition)\n)\n\n(define-read-only (set-flag (currentFlags uint) (flag uint))\n (bit-or currentFlags flag)\n)\n\n(define-read-only (check-flag (flags uint) (flag uint))\n (is-eq (bit-and flags flag) flag)\n)\n\n;; Usage\n(set-flag (bit-or FLAG_READ FLAG_WRITE) FLAG_EXECUTE) ;; Returns u7 (READ | WRITE | EXECUTE)\n(check-flag u7 FLAG_WRITE) ;; Returns true\n(check-flag u7 (create-flag u3)) ;; Returns false\n```\n\nThis example demonstrates:\n1. Using `bit-shift-left` to create individual flags.\n2. Combining `bit-shift-left` with `bit-or` to set flags.\n3. Using `bit-and` to check if a specific flag is set.\n\n## Common Pitfalls\n\n1. Using `bit-shift-left` for multiplication without considering overflow risks.\n2. Not considering the modulo behavior when shifting by amounts greater than or equal to 128.\n3. Using a negative or non-uint value for the shift amount, which is not allowed.\n\n## Related Functions\n\n- `bit-shift-right`: Used for right-shifting bits.\n- `bit-and`: Often used in combination with `bit-shift-left` for masking operations.\n- `bit-or`: Used for combining flags or masks created with `bit-shift-left`.\n- `pow`: Preferred for safe multiplication by powers of 2.\n\n## Conclusion\n\nThe `bit-shift-left` function is a powerful tool for bitwise operations in Clarity smart contracts. This function is essential for creating bitmasks, implementing various bitwise algorithms, and performing low-level optimizations. However, you should be cautious about potential overflows and avoid using it for general multiplication tasks, where the `pow` function is more appropriate due to its built-in overflow protection.\n" + }, + { + "title": "var-set", + "description": "Set the value of a data variable in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/var-set", + "content": "\n## Function Signature\n\n```clarity\n(var-set var-name expr1)\n```\n\n- Input: `VarName, AnyType`\n- Output: `bool`\n\n## Why it matters\n\nThe `var-set` function is crucial for:\n\n1. Setting the value of a data variable.\n2. Implementing logic that requires updating stored data.\n3. Ensuring data integrity by validating the update process.\n4. Simplifying the process of handling data variables in smart contracts.\n\n## When to use it\n\nUse `var-set` when you need to:\n\n- Set the value of a data variable.\n- Implement logic that requires updating stored data.\n- Validate the update process to ensure data integrity.\n- Handle data variables in your smart contract.\n\n## Best Practices\n\n- Ensure the variable name is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other data functions for comprehensive data management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Setting a Data Variable\n\nLet's implement a function that sets the value of a data variable:\n\n```clarity\n(define-data-var cursor int 6)\n\n(define-public (increment-cursor)\n (ok (var-set cursor (+ (var-get cursor) 1)))\n)\n\n;; Usage\n(increment-cursor) ;; Sets cursor to 7\n(var-get cursor) ;; Returns 7\n```\n\nThis example demonstrates:\n1. Using `var-set` to set the value of a data variable.\n2. Implementing a public function to handle the update process.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `var-set` with incorrectly formatted or invalid variable names, causing runtime errors.\n2. Assuming the update will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `var-get`: Retrieves the value of a data variable.\n- `map-set`: Sets a value in a map.\n- `default-to`: Provides a default value if an optional is `none`.\n\n## Conclusion\n\nThe `var-set` function is a fundamental tool for setting the value of a data variable in Clarity smart contracts. It allows you to implement logic that requires updating stored data, ensuring data integrity and simplifying the update process. When used effectively, `var-set` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle data variables.\n" + }, + { + "title": "less than or equal", + "description": "Use the less than or equal function for comparisons in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/less-than-or-equal", + "content": "\nThe less than or equal function (`<=`) in Clarity compares two values and returns true if the first value is less than or equal to the second. It's a fundamental comparison operation used in many smart contract conditions and logic flows.\n\n## Function Signature\n\n```clarity\n(<= v1 v2)\n```\n\n- Input: Two values of the same type (int, uint, string-ascii, string-utf8, or buff)\n- Output: A boolean (true or false)\n\n## Why it matters\n\nThe less than or equal function is crucial for:\n\n1. Implementing conditional logic in smart contracts.\n2. Comparing numerical values for financial operations.\n3. Ordering and sorting data.\n4. Implementing maximum thresholds or limits in contract logic.\n5. Checking for equality alongside less than comparisons.\n\n## When to use it\n\nUse the less than or equal function when you need to:\n\n- Compare two numerical values to determine if one is smaller or equal.\n- Implement maximum thresholds for certain operations, including the threshold value itself.\n- Create conditional logic based on numerical comparisons, including equality.\n- Sort or order data based on numerical or lexicographical order, including equal values.\n\n## Best Practices\n\n- Ensure that both inputs are of the same type to avoid runtime errors.\n- Be aware of the differences in comparison between signed (int) and unsigned (uint) integers.\n- When comparing strings or buffers, understand that the comparison is lexicographical.\n- Consider edge cases, especially when dealing with the limits of integer ranges.\n- Use `<=` instead of `<` when you want to include equality in your comparison.\n\n## Practical Example: Token Vesting Contract\n\nLet's implement a simple token vesting contract that uses the less than or equal function to manage vesting periods:\n\n```clarity\n;; Define constants\n(define-constant VESTING_PERIOD u31536000) ;; 1 year in seconds\n(define-constant TOTAL_ALLOCATION u1000000) ;; 1 million tokens\n\n;; Define data variables\n(define-data-var vestingStartTime uint u0)\n(define-data-var tokensClaimed uint u0)\n\n;; Function to start vesting\n(define-public (start-vesting)\n (begin\n (asserts! (is-eq (var-get vestingStartTime) u0) (err u1))\n (var-set vestingStartTime block-height)\n (ok true)\n )\n)\n\n;; Function to calculate vested amount\n(define-read-only (get-vested-amount)\n (let\n (\n (elapsed-time (- block-height (var-get vestingStartTime)))\n (vesting-ratio (/ elapsed-time VESTING_PERIOD))\n )\n (if (<= elapsed-time VESTING_PERIOD)\n (* TOTAL_ALLOCATION vesting-ratio)\n TOTAL_ALLOCATION\n )\n )\n)\n\n;; Function to claim vested tokens\n(define-public (claim-tokens)\n (let\n (\n (vested-amount (get-vested-amount))\n (claimable-amount (- vested-amount (var-get tokensClaimed)))\n )\n (asserts! (> claimable-amount u0) (err u2))\n (var-set tokensClaimed vested-amount)\n ;; Here you would typically transfer tokens\n ;; For simplicity, we're just returning the claimed amount\n (ok claimable-amount)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `<=` to check if the elapsed time is within or equal to the vesting period.\n2. Combining the less than or equal check with other contract logic for a vesting system.\n3. Implementing a maximum threshold (the vesting period) that includes the exact end time.\n\n## Common Pitfalls\n\n1. Comparing values of different types, which will result in a runtime error.\n2. Confusing `<=` with `<` when setting thresholds, potentially excluding valid values.\n3. Overlooking the inclusive nature of `<=` in boundary conditions.\n\n## Related Functions\n\n- `<`: Used for strict less than comparisons.\n- `>`: Used for greater than comparisons.\n- `>=`: Used for greater than or equal to comparisons.\n\n## Conclusion\n\nThe less than or equal function is a fundamental tool for implementing comparison logic in Clarity smart contracts. By understanding its behavior with different types and potential edge cases, you can create robust conditional logic and enforce important thresholds in your contracts, including scenarios where equality is a valid condition.\n" + }, + { + "title": "filter", + "description": "Filter elements from a list based on a predicate function in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/filter", + "content": "\n## Function Signature\n\n```clarity\n(filter <function> <sequence>)\n```\n\n- Input: \n - `<function>`: A function that takes one argument and returns a boolean\n - `<sequence>`: A list, buffer, or string to iterate over\n- Output: A new list containing only the elements for which the function returned true\n\n## Why it matters\n\nThe `filter` function is crucial for:\n\n1. Selectively processing elements from a list based on specific criteria.\n2. Removing unwanted elements from a list without modifying the original.\n3. Implementing complex data filtering logic within smart contracts.\n4. Enhancing data manipulation capabilities in list processing.\n\n## When to use it\n\nUse `filter` when you need to:\n\n- Create a subset of a list based on certain conditions.\n- Remove elements from a list that don't meet specific criteria.\n- Implement data validation or selection logic on lists.\n- Prepare data for further processing by removing irrelevant elements.\n\n## Best Practices\n\n- Ensure the predicate function is efficient, especially for large lists.\n- Use `filter` in combination with other list functions like `map` or `fold` for complex list operations.\n- Be mindful of gas costs when filtering large lists.\n- Consider using `filter` with `define-private` functions for reusable filtering logic.\n\n## Practical Example: Filtering Even Numbers\n\nLet's implement a function that filters even numbers from a list:\n\n```clarity\n(define-private (is-even (num int))\n (is-eq (mod num 2) 0)\n)\n\n(define-read-only (get-even-numbers (numbers (list 10 int)))\n (filter is-even numbers)\n)\n\n;; Usage\n(get-even-numbers (list 1 2 3 4 5 6 7 8 9 10)) ;; Returns (2 4 6 8 10)\n```\n\nThis example demonstrates:\n1. Defining a private helper function `is-even` to check if a number is even.\n2. Using `filter` with the `is-even` function to create a new list of even numbers.\n3. Applying the filter operation to a list of integers.\n\n## Common Pitfalls\n\n1. Forgetting that `filter` creates a new list and does not modify the original.\n2. Using a computationally expensive predicate function, which could lead to high gas costs.\n3. Not considering the potential for an empty result list if no elements match the predicate.\n\n## Related Functions\n\n- `map`: Applies a function to each element in a list, transforming the elements.\n- `fold`: Reduces a list to a single value by applying a function to each element.\n- `len`: Can be used to check the length of the resulting filtered list.\n\n## Conclusion\n\nThe `filter` function is a powerful tool for list manipulation in Clarity smart contracts. It allows you to create refined subsets of data based on specific criteria, enhancing the contract's ability to process and analyze list-based information. When used effectively, `filter` can significantly improve the efficiency and clarity of list operations in smart contracts.\n" + }, + { + "title": "ft-mint?", + "description": "Mint new fungible tokens in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/ft-mint", + "content": "\n## Function Signature\n\n```clarity\n(ft-mint? token-name amount recipient)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n - `amount`: The amount of tokens to mint (uint)\n - `recipient`: The principal to receive the newly minted tokens\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `ft-mint?` function is crucial for:\n\n1. Creating new tokens and increasing the total supply of a fungible token.\n2. Implementing token issuance mechanisms in smart contracts.\n3. Rewarding users or other contracts with newly created tokens.\n4. Managing the token economy within a decentralized application.\n\n## When to use it\n\nUse `ft-mint?` when you need to:\n\n- Create new tokens as part of your contract's logic.\n- Implement token distribution mechanisms (e.g., airdrops, rewards).\n- Increase the balance of a specific principal with new tokens.\n- Execute token minting operations based on certain conditions or events.\n\n## Best Practices\n\n- Implement proper access controls to restrict who can mint new tokens.\n- Consider using a maximum supply cap to prevent unlimited minting.\n- Emit events or use a logging mechanism to track minting operations for transparency.\n- Be cautious of potential overflow when minting large amounts of tokens.\n\n## Practical Example: Reward Minting\n\nLet's implement a simple reward system that mints tokens:\n\n```clarity\n(define-fungible-token RewardToken)\n\n(define-constant CONTRACT_OWNER tx-sender)\n\n(define-public (mint-reward (amount uint) (recipient principal))\n (begin\n (asserts! (is-eq tx-sender CONTRACT_OWNER) (err u403))\n (ft-mint? RewardToken amount recipient)\n )\n)\n\n;; Usage\n(mint-reward u100 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true) if called by CONTRACT_OWNER\n```\n\nThis example demonstrates:\n1. Using `ft-mint?` to create new tokens and assign them to a recipient.\n2. Implementing a basic access control check before minting.\n3. Returning the result of the minting operation.\n\n## Common Pitfalls\n\n1. Minting tokens without proper access controls, allowing unauthorized token creation.\n2. Not considering the total supply limit, potentially leading to economic imbalances.\n3. Forgetting to handle the error case when minting fails (e.g., due to supply cap).\n4. Overlooking the gas costs associated with minting, especially for large amounts.\n\n## Related Functions\n\n- `ft-burn?`: Used to destroy tokens, decreasing the total supply.\n- `ft-transfer?`: Used to transfer tokens between principals.\n- `ft-get-balance`: Used to check the token balance of a principal.\n- `ft-get-supply`: Used to get the current total supply of tokens.\n\n## Conclusion\n\nThe `ft-mint?` function is a fundamental tool for managing fungible token creation in Clarity smart contracts. It allows for controlled increase of token supply and distribution to specified recipients. When used responsibly with proper access controls and supply management, this function enables the implementation of sophisticated token economies within decentralized applications on the Stacks blockchain.\n" + }, + { + "title": "buff-to-int-le", + "description": "Convert a byte buffer to a signed integer using little-endian encoding in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/buff-to-int-le", + "content": "\n## Function Signature\n\n```clarity\n(buff-to-int-le (buff 16))\n```\n\n- Input: A byte buffer of up to 16 bytes\n- Output: A signed integer (`int`)\n\n## Why it matters\n\nThe `buff-to-int-le` function is crucial for:\n\n1. Converting byte data to signed integers using little-endian encoding.\n2. Handling data from external sources or other contracts that use little-endian encoding.\n3. Implementing protocols or algorithms that require little-endian integer representation.\n4. Interoperating with systems that use little-endian byte order.\n\n## When to use it\n\nUse the `buff-to-int-le` function when you need to:\n\n- Convert a little-endian encoded byte buffer to a signed integer.\n- Process input data that represents signed integers in little-endian format.\n- Implement cryptographic or mathematical operations that expect little-endian integer inputs.\n- Ensure compatibility with external systems using little-endian encoding.\n\n## Best Practices\n\n- Ensure the input buffer is no larger than 16 bytes to avoid errors.\n- Be aware that smaller buffers are zero-padded on the right, affecting the resulting integer value.\n- Consider using `buff-to-uint-le` for unsigned integers if the sign is not needed.\n- Handle potential errors when the input buffer might be invalid or empty.\n\n## Practical Example: Decoding a Signed Integer from External Data\n\nLet's implement a function that processes external data containing a little-endian encoded signed integer:\n\n```clarity\n(define-read-only (process-external-data-le (data (buff 16)))\n (let\n (\n (value (buff-to-int-le data))\n )\n (if (< value 0)\n (err \"Negative value not allowed\")\n (ok value)\n )\n )\n)\n\n;; Usage\n(process-external-data-le 0x01000000000000000000000000000000) ;; Returns (ok 1)\n(process-external-data-le 0xffffffffffffffffffffffffffffffff) ;; Returns (err \"Negative value not allowed\")\n(process-external-data-le 0xffffffffffffffffffffffffffffff7f) ;; Returns (ok 9223372036854775807)\n```\n\nThis example demonstrates:\n1. Using `buff-to-int-le` to convert external data to a signed integer.\n2. Handling both positive and negative values resulting from the conversion.\n3. Implementing input validation based on the converted integer value.\n\n## Common Pitfalls\n\n1. Confusing little-endian with big-endian encoding, leading to incorrect integer values.\n2. Not handling potential negative values when working with signed integers.\n3. Assuming a specific buffer length, which could lead to unexpected results with shorter inputs due to right-padding.\n\n## Related Functions\n\n- `buff-to-int-be`: Converts a byte buffer to a signed integer using big-endian encoding.\n- `buff-to-uint-le`: Converts a byte buffer to an unsigned integer using little-endian encoding.\n- `int-to-ascii`: Converts an integer to its ASCII string representation.\n\n## Conclusion\n\nThe `buff-to-int-le` function is a powerful tool for working with little-endian encoded signed integers in Clarity smart contracts. By understanding its behavior with different input sizes and potential sign issues, you can effectively process and validate external data, implement complex algorithms, and ensure compatibility with little-endian systems in your smart contract applications.\n" + }, + { + "title": "element-at?", + "description": "Retrieve an element from a list at a specific index in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/element-at", + "content": "\n## Function Signature\n\n```clarity\n(element-at? list-expr uint)\n```\n\n- Input: \n - `list-expr`: A list expression\n - `uint`: An unsigned integer representing the index\n- Output: `(optional A)` where A is the type of elements in the list\n\n## Why it matters\n\nThe `element-at?` function is crucial for:\n\n1. Safely accessing elements in a list at a specific index.\n2. Handling potential out-of-bounds access without causing errors.\n3. Implementing logic that depends on retrieving specific elements from lists.\n4. Providing a way to work with lists in a more flexible manner.\n\n## When to use it\n\nUse `element-at?` when you need to:\n\n- Retrieve a specific element from a list by its position.\n- Implement algorithms that require access to list elements by index.\n- Safely handle potential out-of-bounds access in list operations.\n- Work with lists in a way that may involve accessing elements at varying positions.\n\n## Best Practices\n\n- Always check the returned optional value to handle cases where the index is out of bounds.\n- Use in combination with `len` to ensure you're not attempting to access beyond the list's length.\n- Consider using `map` or `fold` for operations that need to process all elements instead of accessing by index.\n- Be mindful of the zero-based indexing when using `element-at?`.\n\n## Practical Example: Retrieving a Specific Item\n\nLet's implement a function that retrieves an item from a todo list:\n\n```clarity\n(define-data-var todoList (list 10 (string-ascii 50)) (list))\n\n(define-public (add-todo (item (string-ascii 50)))\n (let\n (\n (currentList (var-get todoList))\n (newList (as-max-len? (append currentList item) u10))\n )\n (match newList\n newListValue (ok (var-set todoList newListValue))\n (err u1)\n )\n )\n)\n\n(define-read-only (get-todo (index uint))\n (match (element-at? (var-get todoList) index) item\n (ok item)\n (err u404)\n )\n)\n\n;; Usage\n(add-todo \"Buy milk\")\n(add-todo \"Walk the dog\")\n(get-todo u1) ;; Returns (ok \"Walk the dog\")\n(get-todo u5) ;; Returns (err u404)\n```\n\nThis example demonstrates:\n1. Using `element-at?` to retrieve an item from a list stored in a data variable.\n2. Handling the optional return value with `match` to provide meaningful responses.\n3. Safely accessing list elements without risking out-of-bounds errors.\n\n## Common Pitfalls\n\n1. Forgetting that list indices are zero-based in Clarity.\n2. Not handling the case where `element-at?` returns `none` for out-of-bounds access.\n3. Using `element-at?` in a loop to process all elements, which is less efficient than using `map` or `fold`.\n\n## Related Functions\n\n- `list`: Used to create lists that can be accessed with `element-at?`.\n- `len`: Often used in conjunction with `element-at?` to check list bounds.\n- `map`: An alternative for processing all elements in a list.\n- `fold`: Another alternative for reducing a list to a single value.\n\n## Clarity 1 Version: element-at\n\nIn Clarity 1, this function was named `element-at` (without the question mark) and had a slightly different behavior:\n\n```clarity\n(element-at list-expr uint)\n```\n\nThe key differences are:\n1. It returns the element directly, not wrapped in an optional.\n2. It throws a runtime error if the index is out of bounds.\n\nWhen migrating from Clarity 1 to newer versions, replace `element-at` with `element-at?` and add appropriate error handling for out-of-bounds cases.\n\n## Conclusion\n\nThe `element-at?` function is a safer and more flexible way to access list elements in Clarity smart contracts compared to its predecessor. By returning an optional value, this function allows you to handle out-of-bounds access gracefully, leading to more robust and error-resistant code. When working with lists in Clarity, `element-at?` is an essential tool for accessing specific elements while maintaining the integrity and safety of your contract operations.\n" + }, + { + "title": "sha512", + "description": "Compute the SHA-512 hash of a value in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/sha512", + "content": "\n## Function Signature\n\n```clarity\n(sha512 value)\n```\n\n- Input: `buff | uint | int`\n- Output: `(buff 64)`\n\n## Why it matters\n\nThe `sha512` function is crucial for:\n\n1. Computing the SHA-512 hash of a given value.\n2. Implementing cryptographic operations in smart contracts.\n3. Ensuring data integrity by generating unique hashes.\n4. Simplifying the process of handling cryptographic hashing in smart contracts.\n\n## When to use it\n\nUse `sha512` when you need to:\n\n- Compute the SHA-512 hash of a given value.\n- Implement cryptographic operations in your smart contract.\n- Generate unique hashes to ensure data integrity.\n- Handle cryptographic hashing operations.\n\n## Best Practices\n\n- Ensure the input value is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other cryptographic functions for comprehensive security management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Computing a SHA-512 Hash\n\nLet's implement a function that computes the SHA-512 hash of a given buffer:\n\n```clarity\n(define-read-only (compute-sha512 (input (buff 32)))\n (sha512 input)\n)\n\n;; Usage\n(compute-sha512 0x68656c6c6f20776f726c64000000000000000000000000000000000000000000)\n;; Returns 0x638f0da7489fae1f981a47199a2854d0fa117cea82bd86049930aa86e565c6cdccd52fc0e6bba5a135961ed5b7360d5e2b0ff65889acbac01361f5e291a6da45\n```\n\nThis example demonstrates:\n1. Using `sha512` to compute the hash of a given buffer.\n2. Implementing a public function to handle the hash computation.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `sha512` with incorrectly formatted or invalid input values, causing the operation to fail.\n2. Assuming the hash will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete cryptographic hashing.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `sha256`: Computes the SHA-256 hash of the input.\n- `sha512/256`: Computes the SHA-512/256 hash of the input.\n- `keccak256`: Computes the KECCAK-256 hash of the input.\n\n## Conclusion\n\nThe `sha512` function is a fundamental tool for computing SHA-512 hashes in Clarity smart contracts. It allows you to implement cryptographic operations, ensuring data integrity and simplifying cryptographic hashing. When used effectively, `sha512` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle cryptographic hashing operations.\n" + }, + { + "title": "concat", + "description": "Concatenate sequences in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/concat", + "content": "\n## Function Signature\n\n```clarity\n(concat sequence1 sequence2)\n```\n\n- Input: Two sequences of the same type (`sequence_A`, `sequence_A`)\n- Output: A concatenated sequence of the same type (`sequence_A`)\n\n## Why it matters\n\nThe `concat` function is crucial for:\n\n1. Combining two sequences of the same type into a single sequence.\n2. Building longer strings, buffers, or lists from smaller components.\n3. Dynamically constructing data structures in smart contracts.\n4. Implementing string or data manipulation operations.\n\n## When to use it\n\nUse the `concat` function when you need to:\n\n- Join two strings together.\n- Combine two byte buffers into a single buffer.\n- Merge two lists into a single list.\n- Build complex data structures from simpler components.\n\n## Best Practices\n\n- Ensure that both input sequences are of the same type (e.g., both strings, both buffers, or both lists).\n- Be aware of the maximum length limitations for the resulting sequence type.\n- Consider using `concat` in combination with other sequence manipulation functions for more complex operations.\n- When working with strings, remember that Clarity distinguishes between ASCII and UTF-8 strings.\n\n## Practical Example: Dynamic Message Construction\n\nLet's implement a function that constructs a personalized message:\n\n```clarity\n(define-public (create-greeting (name (string-ascii 20)))\n (ok (concat (concat \"Hello, \" name) \"! Welcome to our dApp.\"))\n)\n\n;; Usage\n(create-greeting \"Alice\") ;; Returns (ok \"Hello, Alice! Welcome to our dApp.\")\n```\n\nThis example demonstrates:\n1. Using `concat` to join multiple string components.\n2. Nesting `concat` calls to build a more complex string.\n3. Combining static and dynamic parts of a message.\n\n## Common Pitfalls\n\n1. Attempting to concatenate sequences of different types, which will result in an error.\n2. Not considering the maximum length of the resulting sequence, potentially leading to truncation.\n3. Forgetting that `concat` only works with two sequences at a time, requiring nested calls for multiple concatenations.\n\n## Related Functions\n\n- `len`: Used to get the length of a sequence.\n- `slice?`: Can be used to extract parts of a sequence before concatenation.\n- `append`: Used to add elements to the end of a list (similar to `concat` for lists).\n\n## Conclusion\n\nThe `concat` function is a versatile tool for combining sequences in Clarity smart contracts. Whether you're working with strings, byte buffers, or lists, `concat` provides a straightforward way to join sequences together. By understanding its behavior and limitations, you can effectively use `concat` to build dynamic data structures and implement various string and data manipulation operations in your smart contracts.\n" + }, + { + "title": "index-of", + "description": "Find the index of an element in a list in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/index-of", + "content": "\n## Function Signature\n\n```clarity\n(index-of list element)\n```\n\n- Input: \n - `list`: A list of elements\n - `element`: The element to find in the list\n- Output: `(optional uint)`\n\n## Why it matters\n\nThe `index-of` function is crucial for:\n\n1. Locating the position of an element within a list.\n2. Implementing search functionality in smart contracts.\n3. Enabling conditional logic based on the presence and position of elements.\n4. Simplifying list operations by providing a built-in search mechanism.\n\n## When to use it\n\nUse `index-of` when you need to:\n\n- Determine the position of an element in a list.\n- Check if an element exists in a list and retrieve its index.\n- Implement logic that depends on the order or position of elements.\n- Simplify list search operations without writing custom loops.\n\n## Best Practices\n\n- Ensure the list and element types are compatible.\n- Handle the `none` case when the element is not found in the list.\n- Use meaningful variable names for better readability.\n- Consider the performance implications when searching large lists.\n\n## Practical Example: Finding an Element in a List\n\nLet's implement a function that finds the index of a given element in a list of integers:\n\n```clarity\n(define-read-only (find-index (element int) (numbers (list 10 int)))\n (index-of numbers element)\n)\n\n;; Usage\n(find-index 3 (list 1 2 3 4 5)) ;; Returns (some u2)\n(find-index 6 (list 1 2 3 4 5)) ;; Returns none\n```\n\nThis example demonstrates:\n1. Using `index-of` to find the position of an element in a list.\n2. Handling both the case where the element is found and where it is not found.\n\n## Common Pitfalls\n\n1. Assuming the element will always be found, leading to unhandled `none` cases.\n2. Using `index-of` on lists with incompatible element types.\n3. Overlooking the performance impact of searching very large lists.\n4. Not considering that `index-of` returns a 0-based index.\n\n## Related Functions\n\n- `filter`: Used to create a new list containing only elements that match a condition.\n- `map`: Applies a function to each element in a list, transforming the elements.\n- `len`: Returns the length of a list.\n\n## Conclusion\n\nThe `index-of` function is a powerful tool for locating elements within lists in Clarity smart contracts. It provides a straightforward way to search for elements and retrieve their positions, enabling more complex list operations and conditional logic. When used effectively, `index-of` simplifies list search operations and enhances the readability and maintainability of your smart contract code.\n" + }, + { + "title": "stx-transfer-memo?", + "description": "Transfer STX with a memo field in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/stx-transfer-memo", + "content": "\n## Function Signature\n\n```clarity\n(stx-transfer-memo? amount sender recipient memo)\n```\n\n- Input: `uint, principal, principal, buff`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `stx-transfer-memo?` function is crucial for:\n\n1. Transferring STX between principals with an additional memo field.\n2. Implementing logic that requires recording a memo with each transfer.\n3. Ensuring data integrity by validating the transfer operation.\n4. Simplifying the process of handling STX transfers with memos in smart contracts.\n\n## When to use it\n\nUse `stx-transfer-memo?` when you need to:\n\n- Transfer STX between principals with an additional memo field.\n- Implement logic that requires recording a memo with each transfer.\n- Validate the transfer operation to ensure data integrity.\n- Handle STX transfers with memos in your smart contract.\n\n## Best Practices\n\n- Ensure the `amount` is positive and the `sender` has sufficient balance.\n- Use meaningful variable names for better readability.\n- Combine with other STX functions for comprehensive account management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Transferring STX with a Memo\n\nLet's implement a function that transfers STX with a memo from the `tx-sender` to a recipient:\n\n```clarity\n(define-public (transfer-stx-with-memo (amount uint) (recipient principal) (memo (buff 34)))\n (stx-transfer-memo? amount tx-sender recipient memo)\n)\n\n;; Usage\n(transfer-stx-with-memo u60 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x010203) \n;; Returns (ok true) if successful\n(transfer-stx-with-memo u50 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR 0x040506) \n;; Returns (err u1) if the sender does not have enough balance\n```\n\nThis example demonstrates:\n1. Using `stx-transfer-memo?` to transfer STX with a memo.\n2. Implementing a public function to handle the STX transfer with a memo.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `stx-transfer-memo?` with a non-positive amount, causing the operation to fail.\n2. Assuming the transfer operation will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete account management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `stx-get-balance`: Queries the STX balance of a principal.\n- `stx-transfer?`: Transfers STX from one principal to another without a memo.\n- `stx-burn?`: Burns STX from a principal's account.\n\n## Conclusion\n\nThe `stx-transfer-memo?` function is a fundamental tool for transferring STX with a memo in Clarity smart contracts. It allows you to implement logic that requires recording a memo with each transfer, ensuring data integrity and simplifying STX transfer operations. When used effectively, `stx-transfer-memo?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle STX transfers with memos.\n" + }, + { + "title": "pow", + "description": "Calculate the power of a number in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/pow", + "content": "\n## Function Signature\n\n```clarity\n(pow base exponent)\n```\n\n- Input: `int, int | uint, uint`\n- Output: `int | uint`\n\n## Why it matters\n\nThe `pow` function is crucial for:\n\n1. Performing exponentiation operations.\n2. Implementing logic that depends on power calculations.\n3. Simplifying the process of raising numbers to a power.\n4. Enhancing code readability and maintainability by abstracting exponentiation.\n\n## When to use it\n\nUse `pow` when you need to:\n\n- Perform exponentiation operations.\n- Implement logic that depends on power calculations.\n- Raise numbers to a power.\n- Simplify and abstract exponentiation operations.\n\n## Best Practices\n\n- Ensure the base and exponent are correctly formatted and within acceptable ranges.\n- Use meaningful variable names for better readability.\n- Combine with other mathematical functions for comprehensive calculations.\n- Be aware of the performance implications of large exponentiation operations.\n\n## Practical Example: Calculating Token Balances in Decimal Format\n\nLet's implement a function that calculates the power of a number, specifically for converting integer representations of tokens or uStx:\n\n```clarity\n(define-constant MICRO_TOKENS (pow u10 u6)) ;; 6 decimal places\n(define-data-var userBalance uint u100) ;; Amount reprented in a clear and readable format\n\n(define-read-only (get-total-micro-balance (userAddress principal))\n (* (var-get userBalance) MICRO_TOKENS)\n)\n\n;; Usage\n(get-total-micro-balance tx-sender)\n```\n\nThis example demonstrates:\n1. Using `pow` to define a constant for micro tokens with 6 decimal places.\n2. Implementing a read-only function to calculate the total balance in decimal format.\n3. Handling balances from different versions of a token contract.\n\n## Common Pitfalls\n\n1. Using `pow` with negative exponents, which is not supported and will cause a runtime error.\n2. Assuming the result will always be within acceptable ranges, leading to overflow errors.\n3. Not handling all possible conditions, resulting in incomplete calculations.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `*`: Multiplies two or more numbers.\n- `+`: Adds two or more numbers.\n- `-`: Subtracts one number from another.\n- `/`: Divides one number by another.\n\n## Conclusion\n\nThe `pow` function is a fundamental tool for performing exponentiation in Clarity smart contracts. It allows you to raise numbers to a power, enabling robust and comprehensive mathematical operations. When used effectively, `pow` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage power calculations.\n" + }, + { + "title": "nft-mint?", + "description": "Mint a non-fungible token (NFT) in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/nft-mint", + "content": "\n## Function Signature\n\n```clarity\n(nft-mint? asset-class asset-identifier recipient)\n```\n\n- Input: `AssetName, A, principal`\n- Output: `(response bool uint)`\n\n## Why it matters\n\nThe `nft-mint?` function is crucial for:\n\n1. Creating new non-fungible tokens (NFTs).\n2. Assigning ownership of newly created NFTs.\n3. Ensuring data integrity by preventing duplicate NFT creation.\n4. Simplifying the process of minting NFTs in smart contracts.\n\n## When to use it\n\nUse `nft-mint?` when you need to:\n\n- Create a new NFT.\n- Assign ownership of a newly created NFT.\n- Prevent duplicate NFT creation.\n- Handle NFT minting operations in your smart contract.\n\n## Best Practices\n\n- Ensure the `asset-identifier` is unique and correctly formatted.\n- Use meaningful variable names for better readability.\n- Combine with other NFT functions for comprehensive NFT management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Minting an NFT\n\nLet's implement a function that mints a new NFT and assigns it to the recipient:\n\n```clarity\n(define-non-fungible-token Stackaroo (string-ascii 40))\n\n(define-public (mint-nft (id (string-ascii 40)) (recipient principal))\n (nft-mint? Stackaroo id recipient)\n)\n\n;; Usage\n(mint-nft \"Roo\" tx-sender) ;; Returns (ok true)\n(mint-nft \"Roo\" tx-sender) ;; Returns (err u1) because the asset already exists\n```\n\nThis example demonstrates:\n1. Using `nft-mint?` to create a new NFT and assign it to the recipient.\n2. Implementing a public function to handle the minting operation.\n3. Handling both the successful mint and the case where the asset already exists.\n\n## Common Pitfalls\n\n1. Using `nft-mint?` with a non-unique `asset-identifier`, causing the operation to fail.\n2. Assuming the NFT will always be minted, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete NFT management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `nft-get-owner?`: Retrieves the owner of a non-fungible token.\n- `nft-transfer?`: Transfers ownership of a non-fungible token.\n- `nft-burn?`: Burns a non-fungible token.\n\n## Conclusion\n\nThe `nft-mint?` function is a fundamental tool for creating non-fungible tokens in Clarity smart contracts. It allows you to mint new NFTs, assign ownership, and ensure data integrity by preventing duplicate NFT creation. When used effectively, `nft-mint?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage NFT minting operations.\n" + }, + { + "title": "bit-not", + "description": "Use the bit-not function for bitwise complement operations in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/bit-not", + "content": "\n## Function Signature\n\n```clarity\n(bit-not i1)\n```\n\n- Input: An integer (`int` or `uint`)\n- Output: An integer of the same type as the input (`int` or `uint`)\n\n## Why it matters\n\nThe `bit-not` function is crucial for:\n\n1. Performing bitwise complement operations in smart contracts.\n2. Implementing certain logical operations and algorithms.\n3. Manipulating binary data at the bit level.\n4. Creating bitmasks for various purposes.\n\n## When to use it\n\nUse the `bit-not` function when you need to:\n\n- Invert all bits in an integer value.\n- Create a bitmask for bitwise operations.\n- Implement certain cryptographic or hashing algorithms.\n- Perform low-level data manipulations.\n\n## Best Practices\n\n- Be aware of the differences between signed (`int`) and unsigned (`uint`) integers when using `bit-not`.\n- Remember that `bit-not` on a `uint` will result in a large positive number due to two's complement representation.\n- Use `bit-not` in combination with other bitwise operations (`bit-and`, `bit-or`, `bit-xor`) for complex bit manipulations.\n- Consider the readability of your code when using bitwise operations extensively.\n\n## Practical Example: Simple Flag System\n\nLet's implement a simple flag system using `bit-not` and other bitwise operations:\n\n```clarity\n(define-constant FLAG_A u1) ;; 0001\n(define-constant FLAG_B u2) ;; 0010\n(define-constant FLAG_C u4) ;; 0100\n(define-constant FLAG_D u8) ;; 1000\n\n(define-data-var userFlags uint u0)\n\n(define-public (toggle-flag (flag uint))\n (ok (var-set userFlags (bit-xor (var-get userFlags) flag)))\n)\n\n(define-public (clear-all-flags-except (flag uint))\n (ok (var-set userFlags (bit-and (var-get userFlags) flag)))\n)\n\n(define-public (set-all-flags-except (flag uint))\n (ok (var-set userFlags (bit-and (bit-not (var-get userFlags)) flag)))\n)\n\n(define-read-only (has-flag (flag uint))\n (is-eq flag (bit-and (var-get userFlags) flag))\n)\n```\n\nThis example demonstrates:\n1. Using `bit-not` in combination with `bit-and` to set all flags except a specific one.\n2. Implementing a flag system using bitwise operations for efficient storage and manipulation.\n3. Combining `bit-not` with other bitwise operations for complex flag manipulations.\n\n## Common Pitfalls\n\n1. Forgetting that `bit-not` on a `uint` results in a large positive number, not a negative number.\n2. Overlooking the sign bit when using `bit-not` with signed integers.\n3. Not considering the full range of bits when applying `bit-not` to smaller integer values.\n\n## Related Functions\n\n- `bit-and`: Used for bitwise AND operations.\n- `bit-or`: Used for bitwise OR operations.\n- `bit-xor`: Used for bitwise XOR operations.\n- `bit-shift-left`: Used for left-shifting bits.\n- `bit-shift-right`: Used for right-shifting bits.\n\n## Conclusion\n\nThe `bit-not` function is a powerful tool for bitwise operations in Clarity smart contracts. When used in combination with other bitwise functions, this function enables efficient implementation of flags, bitmasks, and low-level data manipulations. However, you should be mindful of the differences between signed and unsigned integers and the potential for unexpected results when not used carefully.\n" + }, + { + "title": "hash160", + "description": "Compute the RIPEMD160(SHA256(x)) hash in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/hash160", + "content": "\n## Function Signature\n\n```clarity\n(hash160 value)\n```\n\n- Input: `buff|uint|int`\n- Output: `(buff 20)`\n\n## Why it matters\n\nThe `hash160` function is crucial for:\n\n1. Creating compact, unique identifiers for data or addresses.\n2. Implementing cryptographic operations commonly used in blockchain systems.\n3. Generating Bitcoin-style addresses from public keys.\n4. Providing a way to create short, collision-resistant hashes.\n\n## When to use it\n\nUse `hash160` when you need to:\n\n- Generate a compact hash of data, especially for address creation.\n- Implement Bitcoin-style address generation within Clarity contracts.\n- Create short, unique identifiers for data structures.\n- Perform cryptographic operations that require RIPEMD160(SHA256(x)).\n\n## Best Practices\n\n- Use `hash160` when you need a shorter hash than SHA256 but still want strong collision resistance.\n- Be aware that `hash160` is not reversible; it's a one-way function.\n- When hashing sensitive data, consider using additional security measures like salting.\n- Remember that for integers, the hash is computed over their little-endian representation.\n\n## Practical Example: Simple Address Generation\n\nLet's implement a function that generates a simple hash-based identifier:\n\n```clarity\n(define-read-only (generate-identifier (input (buff 32)))\n (hash160 input)\n)\n\n;; Usage\n(generate-identifier 0x000000000000000000000000000000000000000000000000000000000000000a)\n;; Returns 0x3bf3d2e8f7a4d7c5f9e6d0d5c6b0f5c7d8e9f0a1\n```\n\nThis example demonstrates:\n1. Using `hash160` to create a compact identifier from input data.\n2. The function takes a 32-byte buffer and returns a 20-byte hash.\n\n## Common Pitfalls\n\n1. Assuming `hash160` output is the same length as `sha256` output (it's shorter at 20 bytes).\n2. Using `hash160` where a longer hash might be more appropriate for security reasons.\n3. Forgetting that integer inputs are hashed in their little-endian representation.\n4. Not considering that `hash160` is computationally more expensive than a single `sha256`.\n\n## Related Functions\n\n- `sha256`: Computes the SHA256 hash of the input.\n- `ripemd160`: Computes the RIPEMD160 hash of the input (not directly available in Clarity, but `hash160` combines SHA256 and RIPEMD160).\n- `keccak256`: Another cryptographic hash function available in Clarity.\n\n## Conclusion\n\nThe `hash160` function is a powerful tool for creating compact, unique identifiers in Clarity smart contracts. It combines the security of SHA256 with the compactness of RIPEMD160, making it particularly useful for address generation and creating short but collision-resistant hashes. When used appropriately, `hash160` can enhance the efficiency and security of your smart contract operations, especially in scenarios where space efficiency is a concern.\n" + }, + { + "title": "merge", + "description": "Merge tuples in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/merge", + "content": "\n## Function Signature\n\n```clarity\n(merge tuple1 tuple2)\n```\n\n- Input: `tuple, tuple`\n- Output: `tuple`\n\n## Why it matters\n\nThe `merge` function is crucial for:\n\n1. Combining fields from two tuples into a single tuple.\n2. Simplifying the process of updating and managing data structures.\n3. Ensuring data integrity by creating new tuples without mutating the original ones.\n4. Enhancing code readability and maintainability by abstracting tuple merging operations.\n\n## When to use it\n\nUse `merge` when you need to:\n\n- Combine fields from two tuples into a single tuple.\n- Update and manage data structures in a clean and efficient manner.\n- Ensure data integrity by creating new tuples without mutating the original ones.\n- Simplify and abstract tuple merging operations.\n\n## Best Practices\n\n- Ensure the tuples being merged have compatible fields.\n- Use meaningful variable names for better readability.\n- Combine with other tuple and map functions for comprehensive data management.\n- Be aware of the performance implications of frequent tuple merging in large data structures.\n\n## Practical Example: Merging User Data\n\nLet's implement a function that merges additional data into a user's existing data:\n\n```clarity\n(define-map Users { id: int } { name: (string-ascii 12), address: (optional principal) })\n\n(define-public (update-user-address (user-id int) (new-address principal))\n (let\n (\n (user (unwrap-panic (map-get? Users { id: user-id })))\n (updated-user (merge user { address: (some new-address) }))\n )\n (map-set Users { id: user-id } updated-user)\n )\n)\n\n;; Usage\n(map-insert Users { id: 1337 } { name: \"john\", address: none }) ;; Returns true\n(update-user-address 1337 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns true\n(map-get? Users { id: 1337 }) ;; Returns (some (tuple (name \"john\") (address (some SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF))))\n```\n\nThis example demonstrates:\n1. Using `merge` to combine a user's existing data with new address data.\n2. Implementing a public function to update the user's address.\n3. Handling both the retrieval and updating of user data in a clean and efficient manner.\n\n## Common Pitfalls\n\n1. Using `merge` with tuples that have incompatible fields, causing runtime errors.\n2. Assuming the tuples will always have the expected fields, leading to unhandled cases.\n3. Not handling all possible conditions, resulting in incomplete data management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `map-set`: Sets the value associated with a key in a map.\n- `map-get?`: Retrieves an entry from a map.\n- `map-insert`: Inserts a value into a map if the key does not already exist.\n\n## Conclusion\n\nThe `merge` function is a fundamental tool for combining tuples in Clarity smart contracts. It allows you to manage and update data structures efficiently, ensuring data integrity and enhancing code readability. When used effectively, `merge` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage tuple merging operations.\n" + }, + { + "title": "ft-get-balance", + "description": "Retrieve the balance of a fungible token for a principal in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/ft-get-balance", + "content": "\n## Function Signature\n\n```clarity\n(ft-get-balance token-name principal)\n```\n\n- Input: \n - `token-name`: The name of the fungible token\n - `principal`: The principal whose balance to check\n- Output: `uint`\n\n## Why it matters\n\nThe `ft-get-balance` function is crucial for:\n\n1. Querying the current balance of a fungible token for any principal.\n2. Implementing balance checks before transfers or other token operations.\n3. Providing transparency and visibility into token holdings.\n4. Enabling other contracts or off-chain applications to verify token balances.\n\n## When to use it\n\nUse `ft-get-balance` when you need to:\n\n- Check a user's token balance before performing operations.\n- Implement balance-dependent logic in your contract.\n- Provide balance information to users or other contracts.\n- Verify sufficient funds for token transfers or burns.\n\n## Best Practices\n\n- Use `ft-get-balance` before attempting transfers to ensure sufficient balance.\n- Consider caching balance results if queried frequently to optimize gas usage.\n- Be aware that balances can change between checks and actual token operations.\n- Use in combination with other ft-* functions for comprehensive token management.\n\n## Practical Example: Balance Check Before Transfer\n\nLet's implement a function that checks balance before transferring tokens:\n\n```clarity\n(define-fungible-token cBtc)\n\n(define-public (transfer (amount uint) (recipient principal))\n (let\n (\n (senderBalance (ft-get-balance cBtc tx-sender))\n )\n (if (>= senderBalance amount)\n (ft-transfer? cBtc amount tx-sender recipient)\n (err u1)\n )\n )\n)\n\n;; Usage\n(ft-mint? cBtc u100 tx-sender)\n(transfer u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true)\n(ft-get-balance cBtc tx-sender) ;; Returns u50\n```\n\nThis example demonstrates:\n1. Using `ft-get-balance` to check the sender's balance before attempting a transfer.\n2. Implementing a conditional transfer based on the balance check.\n3. Combining `ft-get-balance` with other ft-* functions for token management.\n\n## Common Pitfalls\n\n1. Assuming balances remain constant between checking and performing operations.\n2. Not handling the case where a principal might not have any balance (returns 0).\n3. Overusing `ft-get-balance` in loops, which can be inefficient for gas consumption.\n\n## Related Functions\n\n- `ft-transfer?`: Used to transfer tokens between principals.\n- `ft-mint?`: Used to create new tokens, increasing the balance of a principal.\n- `ft-burn?`: Used to destroy tokens, decreasing the balance of a principal.\n- `ft-get-supply`: Used to get the current total supply of tokens.\n\n## Conclusion\n\nThe `ft-get-balance` function is a fundamental tool for managing fungible tokens in Clarity smart contracts. It provides a straightforward way to query token balances, enabling you to implement robust token-based systems with proper balance checks and validations. When used effectively in combination with other token functions, this function ensures the integrity and accuracy of token operations within your smart contracts.\n" + }, + { + "title": "greater than or equal", + "description": "Use the greater than or equal function for comparisons in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/greater-than-or-equal", + "content": "\nThe greater than or equal function (`>=`) in Clarity compares two values and returns true if the first value is greater than or equal to the second. It's a fundamental comparison operation used in many smart contract conditions and logic flows.\n\n## Function Signature\n\n```clarity\n(>= v1 v2)\n```\n\n- Input: Two values of the same type (int, uint, string-ascii, string-utf8, or buff)\n- Output: A boolean (true or false)\n\n## Why it matters\n\nThe greater than or equal function is crucial for:\n\n1. Implementing conditional logic in smart contracts.\n2. Comparing numerical values for financial operations.\n3. Ordering and sorting data.\n4. Implementing minimum thresholds or limits in contract logic.\n5. Checking for equality alongside greater than comparisons.\n\n## When to use it\n\nUse the greater than or equal function when you need to:\n\n- Compare two numerical values to determine if one is larger or equal.\n- Implement minimum thresholds for certain operations, including the threshold value itself.\n- Create conditional logic based on numerical comparisons, including equality.\n- Sort or order data based on numerical or lexicographical order, including equal values.\n\n## Best Practices\n\n- Ensure that both inputs are of the same type to avoid runtime errors.\n- Be aware of the differences in comparison between signed (int) and unsigned (uint) integers.\n- When comparing strings or buffers, understand that the comparison is lexicographical.\n- Consider edge cases, especially when dealing with the limits of integer ranges.\n- Use `>=` instead of `>` when you want to include equality in your comparison.\n\n## Practical Example: Token Unlock Schedule\n\nLet's implement a simple token unlock schedule that uses the greater than or equal function to manage token releases:\n\n```clarity\n;; Define constants\n(define-constant UNLOCK_AMOUNT u1000000) ;; 1 million tokens per unlock\n(define-constant UNLOCK_INTERVAL u17280) ;; Approximately 30 days in blocks\n(define-constant TOTAL_UNLOCKS u10) ;; 10 total unlocks\n\n;; Define data variables\n(define-data-var startBlock uint u0)\n(define-data-var unlocksClaimed uint u0)\n\n;; Function to start the unlock schedule\n(define-public (start-unlock-schedule)\n (begin\n (asserts! (is-eq (var-get startBlock) u0) (err u1))\n (var-set startBlock block-height)\n (ok true)\n )\n)\n\n;; Function to calculate claimable tokens\n(define-read-only (get-claimable-tokens)\n (let\n (\n (elapsedBlocks (- block-height (var-get startBlock)))\n (unlocksDue (/ elapsedBlocks UNLOCK_INTERVAL))\n )\n (if (>= unlocksDue TOTAL_UNLOCKS)\n (* UNLOCK_AMOUNT (- TOTAL_UNLOCKS (var-get unlocksClaimed)))\n (* UNLOCK_AMOUNT (- unlocksDue (var-get unlocksClaimed)))\n )\n )\n)\n\n;; Function to claim tokens\n(define-public (claim-tokens)\n (let\n (\n (claimableAmount (get-claimable-tokens))\n )\n (asserts! (> claimableAmount u0) (err u2))\n (var-set unlocksClaimed (+ (var-get unlocksClaimed) (/ claimableAmount UNLOCK_AMOUNT)))\n ;; Here you would typically transfer tokens\n ;; For simplicity, we're just returning the claimed amount\n (ok claimableAmount)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `>=` to check if the number of unlocks due is greater than or equal to the total number of unlocks.\n2. Combining the greater than or equal check with other contract logic for a token unlock system.\n3. Implementing a minimum threshold (the unlock interval) that includes the exact unlock time.\n\n## Common Pitfalls\n\n1. Comparing values of different types, which will result in a runtime error.\n2. Confusing `>=` with `>` when setting thresholds, potentially excluding valid values.\n3. Overlooking the inclusive nature of `>=` in boundary conditions.\n\n## Related Functions\n\n- `>`: Used for strict greater than comparisons.\n- `<`: Used for less than comparisons.\n- `<=`: Used for less than or equal to comparisons.\n\n## Conclusion\n\nThe greater than or equal function is a fundamental tool for implementing comparison logic in Clarity smart contracts. By understanding its behavior with different types and potential edge cases, you can create robust conditional logic and enforce important thresholds in your contracts, including scenarios where equality is a valid condition.\n" + }, + { + "title": "as-contract", + "description": "Use the as-contract function to execute expressions as the contract principal in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/as-contract", + "content": "\n## Function Signature\n\n```clarity\n(as-contract expr)\n```\n\n- Input: An expression `expr`\n- Output: The result of `expr`\n\n## Why it matters\n\nThe `as-contract` function is crucial for:\n\n1. Executing operations with the contract's authority.\n2. Allowing the contract to send assets or perform privileged actions.\n3. Implementing contract-owned resources or funds.\n4. Enabling more complex contract interactions and architectures.\n\n## When to use it\n\nUse the `as-contract` function when you need to:\n\n- Perform actions that require the contract's principal.\n- Send assets (like STX or tokens) from the contract's balance.\n- Execute privileged operations that should only be done by the contract itself.\n- Implement contract-owned resources or escrow-like functionality.\n\n## Best Practices\n\n- Use `as-contract` sparingly and only when necessary to minimize potential security risks.\n- Ensure that the logic leading to `as-contract` calls is properly secured and access-controlled.\n- Be aware that `as-contract` changes the `tx-sender` context for the duration of the expression.\n- Combine `as-contract` with other security measures like `contract-caller` checks for robust security.\n\n## Practical Example: Contract-Managed Treasury\n\nLet's implement a simple treasury system where the contract can distribute funds:\n\n```clarity\n(define-constant CONTRACT_OWNER tx-sender)\n(define-data-var treasuryBalance uint u0)\n\n(define-public (deposit (amount uint))\n (begin\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n (var-set treasuryBalance (+ (var-get treasuryBalance) amount))\n (ok true)\n )\n)\n\n(define-public (withdraw (recipient principal) (amount uint))\n (begin\n (asserts! (is-eq tx-sender CONTRACT_OWNER) (err u403))\n (asserts! (<= amount (var-get treasuryBalance)) (err u401))\n (try! (as-contract (stx-transfer? amount tx-sender recipient)))\n (var-set treasuryBalance (- (var-get treasuryBalance) amount))\n (ok true)\n )\n)\n```\n\nThis example demonstrates:\n1. Using `as-contract` in the `deposit` function to receive funds as the contract.\n2. Using `as-contract` in the `withdraw` function to send funds from the contract's balance.\n3. Combining `as-contract` with access control (`is-eq tx-sender CONTRACT_OWNER`) for security.\n\n## Common Pitfalls\n\n1. Using `as-contract` unnecessarily, which can lead to unexpected behavior.\n2. Forgetting that `as-contract` changes the `tx-sender` context, potentially affecting other parts of the code.\n3. Not implementing proper access controls around `as-contract` calls, which could lead to unauthorized actions.\n\n## Related Functions\n\n- `contract-caller`: Used to get the original caller of a contract function.\n- `tx-sender`: Represents the current sender (changes within `as-contract`).\n- `stx-transfer?`: Often used with `as-contract` for token transfers.\n\n## Conclusion\n\nThe `as-contract` function is a powerful tool in Clarity that allows contracts to perform actions with their own authority. While it enables complex contract architectures and functionalities, it should be used judiciously and with proper security measures to prevent potential vulnerabilities or unintended behaviors in smart contracts.\n" + }, + { + "title": "asserts!", + "description": "Use the asserts! function for conditional assertions in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/asserts", + "content": "\n## Function Signature\n\n```clarity\n(asserts! bool-expr thrown-value)\n```\n\n- Input: \n - `bool-expr`: A boolean expression\n - `thrown-value`: The value to be returned if the assertion fails\n- Output: `bool` or `thrown-value`\n\n## Why it matters\n\nThe `asserts!` function is crucial for:\n\n1. Implementing conditional checks in smart contracts.\n2. Enforcing preconditions before executing critical operations.\n3. Providing meaningful error responses when conditions are not met.\n4. Improving contract security by validating inputs and state.\n\n## When to use it\n\nUse the `asserts!` function when you need to:\n\n- Validate conditions before proceeding with contract execution.\n- Ensure certain requirements are met before performing sensitive operations.\n- Provide clear error messages or codes when conditions are not satisfied.\n- Implement guard clauses to protect against invalid inputs or states.\n\n## Best Practices\n\n- Use `asserts!` early in functions to validate preconditions.\n- Provide meaningful error values that can be easily interpreted by users or other contracts.\n- Combine multiple conditions using `and` or `or` for complex assertions.\n- Consider using `asserts!` in combination with `unwrap!` for handling optional values.\n\n## Practical Example: Token Transfer with Balance Check\n\nLet's implement a simple token transfer function that uses `asserts!` to check the sender's balance:\n\n```clarity\n(define-map Balances principal uint)\n\n(define-public (transfer (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? Balances tx-sender)))\n )\n (asserts! (>= senderBalance amount) (err u1)) ;; Insufficient balance\n (asserts! (not (is-eq tx-sender recipient)) (err u2)) ;; Can't send to self\n \n (map-set Balances tx-sender (- senderBalance amount))\n (map-set Balances recipient (+ (default-to u0 (map-get? Balances recipient)) amount))\n (ok true)\n )\n)\n\n(map-set Balances tx-sender u1000) ;; Set the sender's balance to 1000\n\n;; Usage\n(transfer u100 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5) ;; Returns (ok true)\n(transfer u100 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM) ;; Returns (err u2) Can't send to self\n(transfer u1000 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5) ;; Returns (err u1) Insufficient balance\n```\n\nThis example demonstrates:\n1. Using `asserts!` to check if the sender has sufficient balance before transferring.\n2. Using `asserts!` to prevent sending tokens to oneself.\n3. Providing different error codes for different types of failures.\n\n## Common Pitfalls\n\n1. Forgetting to handle the error case when calling functions that use `asserts!`.\n2. Using `asserts!` excessively, which can make code harder to read and maintain.\n3. Providing vague or unhelpful error values when assertions fail.\n\n## Related Functions\n\n- `unwrap!`: Used to extract values from optionals with a fallback error.\n- `unwrap-panic`: Similar to `unwrap!` but causes a panic instead of returning an error.\n- `try!`: Used for propagating errors in a chain of operations.\n\n## Conclusion\n\nThe `asserts!` function is a powerful tool for implementing conditional checks and enforcing invariants in Clarity smart contracts. By using it effectively, you can create more robust and secure contracts that gracefully handle edge cases and provide meaningful feedback when conditions are not met.\n" + }, + { + "title": "slice?", + "description": "Extract a sub-sequence from a sequence in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/slice", + "content": "\n## Function Signature\n\n```clarity\n(slice? sequence left-position right-position)\n```\n\n- Input: `sequence_A, uint, uint`\n- Output: `(optional sequence_A)`\n\n## Why it matters\n\nThe `slice?` function is crucial for:\n\n1. Extracting sub-sequences from sequences.\n2. Implementing logic that requires partial data extraction.\n3. Ensuring data integrity by validating indices for slicing.\n4. Simplifying the process of handling sub-sequence extraction in smart contracts.\n\n## When to use it\n\nUse `slice?` when you need to:\n\n- Extract a sub-sequence from a sequence.\n- Implement logic that requires partial data extraction.\n- Validate indices for slicing to ensure data integrity.\n- Handle sub-sequence extraction operations.\n\n## Best Practices\n\n- Ensure the `left-position` and `right-position` are within the bounds of the sequence.\n- Use meaningful variable names for better readability.\n- Combine with other sequence functions for comprehensive sequence management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Extracting a Sub-sequence from a String\n\nLet's implement a function that extracts a sub-sequence from a string:\n\n```clarity\n(define-read-only (extract-substring (input (string-ascii 20)) (start uint) (end uint))\n (slice? input start end)\n)\n\n;; Usage\n(extract-substring \"blockstack\" u5 u10) ;; Returns (some \"stack\")\n(extract-substring \"blockstack\" u0 u5) ;; Returns (some \"block\")\n(extract-substring \"blockstack\" u5 u15) ;; Returns none (out of bounds)\n```\n\nThis example demonstrates:\n1. Using `slice?` to extract a sub-sequence from a string.\n2. Implementing a public function to handle the sub-sequence extraction.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `slice?` with indices that are out of bounds, causing the operation to fail.\n2. Assuming the sub-sequence will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete sequence management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `len`: Returns the length of a sequence.\n- `concat`: Concatenates two sequences.\n- `index-of?`: Returns the first index at which an item can be found in a sequence.\n\n## Conclusion\n\nThe `slice?` function is a fundamental tool for extracting sub-sequences in Clarity smart contracts. It allows you to implement logic that requires partial data extraction, ensuring data integrity and simplifying sequence handling. When used effectively, `slice?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle sub-sequence extraction operations.\n" + }, + { + "title": "nft-get-owner?", + "description": "Retrieve the owner of a non-fungible token (NFT) in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/nft-get-owner", + "content": "\n## Function Signature\n\n```clarity\n(nft-get-owner? asset-class asset-identifier)\n```\n\n- Input: `AssetName, A`\n- Output: `(optional principal)`\n\n## Why it matters\n\nThe `nft-get-owner?` function is crucial for:\n\n1. Retrieving the owner of a non-fungible token (NFT).\n2. Implementing logic that depends on the ownership of NFTs.\n3. Ensuring data integrity by verifying ownership records.\n4. Simplifying the process of accessing ownership information in smart contracts.\n\n## When to use it\n\nUse `nft-get-owner?` when you need to:\n\n- Retrieve the owner of an NFT.\n- Implement logic that depends on the ownership of NFTs.\n- Verify ownership records in your smart contract.\n- Access ownership information for NFTs.\n\n## Best Practices\n\n- Ensure the `asset-identifier` is correctly formatted and exists.\n- Use meaningful variable names for better readability.\n- Combine with other NFT functions for comprehensive NFT management.\n- Handle the `none` case to avoid runtime errors.\n\n## Practical Example: Retrieving NFT Owner\n\nLet's implement a function that retrieves the owner of an NFT:\n\n```clarity\n(define-non-fungible-token Stackaroo (string-ascii 40))\n\n(define-read-only (get-nft-owner (id (string-ascii 40)))\n (nft-get-owner? Stackaroo id)\n)\n\n;; Usage\n(nft-mint? Stackaroo \"Roo\" tx-sender) ;; Returns (ok true)\n(get-nft-owner \"Roo\") ;; Returns (some tx-sender)\n(get-nft-owner \"NonExistent\") ;; Returns none\n```\n\nThis example demonstrates:\n1. Using `nft-get-owner?` to retrieve the owner of an NFT.\n2. Implementing a read-only function to return the owner's principal.\n3. Handling both the case where the NFT exists and where it does not.\n\n## Common Pitfalls\n\n1. Using `nft-get-owner?` with an incorrect or non-existent `asset-identifier`, causing the function to return `none`.\n2. Assuming the NFT will always exist, leading to unhandled `none` cases.\n3. Not handling all possible conditions, resulting in incomplete ownership checks.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `nft-mint?`: Mints a new non-fungible token.\n- `nft-transfer?`: Transfers ownership of a non-fungible token.\n- `nft-burn?`: Burns a non-fungible token.\n\n## Conclusion\n\nThe `nft-get-owner?` function is a fundamental tool for retrieving the owner of non-fungible tokens in Clarity smart contracts. It allows you to access ownership information, verify ownership records, and implement logic based on NFT ownership. When used effectively, `nft-get-owner?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage NFT ownership.\n" + }, + { + "title": "if", + "description": "Conditional evaluation in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/if", + "content": "\n## Function Signature\n\n```clarity\n(if bool expr1 expr2)\n```\n\n- Input: \n - `bool`: A boolean expression\n - `expr1`: An expression to evaluate if `bool` is true\n - `expr2`: An expression to evaluate if `bool` is false\n- Output: The result of `expr1` if `bool` is true, otherwise the result of `expr2`\n\n## Why it matters\n\nThe `if` function is crucial for:\n\n1. Implementing conditional logic in smart contracts.\n2. Making decisions based on dynamic conditions.\n3. Controlling the flow of contract execution.\n4. Simplifying complex logic by branching based on conditions.\n\n## When to use it\n\nUse `if` when you need to:\n\n- Execute different code paths based on a condition.\n- Implement logic that depends on the state or input values.\n- Control the flow of your contract based on dynamic conditions.\n- Simplify complex decision-making processes.\n\n## Best Practices\n\n- Ensure that both `expr1` and `expr2` return the same type.\n- Use clear and meaningful boolean expressions for readability.\n- Avoid deeply nested `if` statements for better maintainability.\n- Combine with other control flow functions like `match` for more complex logic.\n\n## Practical Example: Conditional Token Transfer\n\n```clarity\n(define-map UserBalances { userId: principal } { balance: uint })\n\n(define-public (transfer-tokens (amount uint) (recipient principal))\n (let\n (\n (senderBalance (default-to u0 (map-get? UserBalances { userId: tx-sender })))\n )\n (if (>= senderBalance amount)\n (begin\n (map-set UserBalances { userId: tx-sender } { balance: (- senderBalance amount) })\n (map-set UserBalances { userId: recipient } { balance: (+ (default-to u0 (map-get? UserBalances { userId: recipient })) amount) })\n (ok true)\n )\n (err u1)\n )\n )\n)\n```\n\nThis example demonstrates:\n1. Using `if` to check if the sender has sufficient balance before transferring tokens.\n2. Executing different code paths based on the result of the balance check.\n3. Handling both the success and failure cases appropriately.\n\n## Common Pitfalls\n\n1. Forgetting that both `expr1` and `expr2` must return the same type.\n2. Using overly complex boolean expressions, making the code hard to read.\n3. Not handling all possible conditions, leading to unexpected behavior.\n4. Overusing `if` for logic that could be simplified with other control flow functions.\n\n## Related Functions\n\n- `match`: Used for pattern matching and handling multiple conditions.\n- `and`: Logical AND operator for combining boolean expressions.\n- `or`: Logical OR operator for combining boolean expressions.\n\n## Conclusion\n\nThe `if` function is a fundamental tool for implementing conditional logic in Clarity smart contracts. It allows you to control the flow of contract execution based on dynamic conditions, enabling more complex and responsive contract behavior. When used effectively, `if` simplifies decision-making processes and enhances the readability and maintainability of your smart contract code.\n" + }, + { + "title": "mod", + "description": "Calculate the remainder of integer division in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/mod", + "content": "\n## Function Signature\n\n```clarity\n(mod i1 i2)\n```\n\n- Input: `int, int | uint, uint | string-ascii, string-ascii | string-utf8, string-utf8 | buff, buff`\n- Output: `int | uint`\n\n## Why it matters\n\nThe `mod` function is crucial for:\n\n1. Calculating the remainder of integer division.\n2. Implementing logic that depends on modular arithmetic.\n3. Simplifying the process of performing operations that require remainders.\n4. Enhancing code readability and maintainability by abstracting modular operations.\n\n## When to use it\n\nUse `mod` when you need to:\n\n- Calculate the remainder of integer division.\n- Implement logic that depends on modular arithmetic.\n- Perform operations that require remainders.\n- Simplify and abstract modular operations.\n\n## Best Practices\n\n- Ensure the divisor is not zero to avoid runtime errors.\n- Use meaningful variable names for better readability.\n- Combine with other mathematical functions for comprehensive calculations.\n- Be aware of the performance implications of frequent modular operations.\n\n## Practical Example: Calculating Remainders\n\nLet's implement a function that calculates the remainder of dividing two numbers:\n\n```clarity\n(define-read-only (calculate-remainder (a int) (b int))\n (mod a b)\n)\n\n;; Usage\n(calculate-remainder 5 2) ;; Returns 1\n(calculate-remainder 7 3) ;; Returns 1\n(calculate-remainder 10 4) ;; Returns 2\n```\n\nThis example demonstrates:\n1. Using `mod` to calculate the remainder of dividing two numbers.\n2. Implementing a read-only function to return the remainder.\n3. Handling both small and large input values.\n\n## Common Pitfalls\n\n1. Using `mod` with a divisor of zero, causing a runtime error.\n2. Assuming the result will always be positive, leading to incorrect expectations.\n3. Not handling all possible conditions, resulting in incomplete calculations.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `+`: Adds two numbers.\n- `-`: Subtracts one number from another.\n- `*`: Multiplies two numbers.\n- `/`: Divides one number by another.\n\n## Conclusion\n\nThe `mod` function is a fundamental tool for calculating the remainder of integer division in Clarity smart contracts. It allows you to perform modular arithmetic, enabling robust and comprehensive mathematical operations. When used effectively, `mod` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to manage modular calculations.\n" + }, + { + "title": "stx-get-balance", + "description": "Query the STX balance of a principal in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/stx-get-balance", + "content": "\n## Function Signature\n\n```clarity\n(stx-get-balance owner)\n```\n\n- Input: `principal`\n- Output: `uint`\n\n## Why it matters\n\nThe `stx-get-balance` function is crucial for:\n\n1. Querying the STX balance of a principal.\n2. Implementing logic that requires checking account balances.\n3. Ensuring data integrity by providing accurate balance information.\n4. Simplifying the process of handling balance-related operations in smart contracts.\n\n## When to use it\n\nUse `stx-get-balance` when you need to:\n\n- Query the STX balance of a principal.\n- Implement logic that requires checking account balances.\n- Ensure accurate balance information for data integrity.\n- Handle balance-related operations in your smart contract.\n\n## Best Practices\n\n- Ensure the `principal` is correctly formatted and valid.\n- Use meaningful variable names for better readability.\n- Combine with other account functions for comprehensive account management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Querying STX Balance\n\nLet's implement a function that queries the STX balance of a given principal:\n\n```clarity\n(define-read-only (get-stx-balance (account principal))\n (stx-get-balance account)\n)\n\n;; Usage\n(get-stx-balance 'SZ2J6ZY48GV1EZ5V2V5RB9MP66SW86PYKKQ9H6DPR) \n;; Returns u0 if the account has no balance\n(get-stx-balance (as-contract tx-sender)) \n;; Returns the balance of the contract's principal\n```\n\nThis example demonstrates:\n1. Using `stx-get-balance` to query the STX balance of a principal.\n2. Implementing a public function to handle the balance query.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `stx-get-balance` with an incorrectly formatted or invalid `principal`, causing the operation to fail.\n2. Assuming the balance query will always succeed, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete account management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `stx-transfer?`: Transfers STX from one principal to another.\n- `stx-burn?`: Burns STX from a principal's account.\n- `stx-account`: Queries detailed STX account information.\n\n## Conclusion\n\nThe `stx-get-balance` function is a fundamental tool for querying the STX balance of a principal in Clarity smart contracts. It allows you to implement logic that requires checking account balances, ensuring data integrity and simplifying balance-related operations. When used effectively, `stx-get-balance` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle balance queries.\n" + }, + { + "title": "print", + "description": "Evaluate and printing expressions in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/print", + "content": "\n## Function Signature\n\n```clarity\n(print expr)\n```\n\n- Input: `A`\n- Output: `A`\n\n## Why it matters\n\nThe `print` function is crucial for:\n\n1. Debugging and logging expressions during contract development.\n2. Evaluating and returning the input expression.\n3. Enhancing code readability and maintainability by providing a way to output intermediate values.\n\n## When to use it\n\nUse `print` when you need to:\n\n- Debug and log expressions during contract development.\n- Evaluate and return an input expression.\n- Output intermediate values for better understanding of contract behavior.\n\n## Best Practices\n\n- Use `print` primarily for debugging and development purposes.\n- Ensure that the expression passed to `print` is meaningful and necessary for debugging.\n- Remove or comment out `print` statements in production code to avoid unnecessary output.\n\n## Practical Example: Printing an Expression\n\nLet's implement a function that prints the result of an addition operation:\n\n```clarity\n(define-read-only (add-and-print (a int) (b int))\n (print (+ a b))\n)\n\n;; Usage\n(add-and-print 3 4) ;; Prints 7 and returns 7\n(add-and-print 10 20) ;; Prints 30 and returns 30\n```\n\nThis example demonstrates:\n1. Using `print` to output the result of an addition operation.\n2. Implementing a public function to handle the addition and printing.\n3. Handling both small and large input values.\n\n## Common Pitfalls\n\n1. Using `print` excessively, leading to cluttered output and reduced readability.\n2. Assuming `print` is necessary for all expressions, leading to overuse.\n3. Not removing or commenting out `print` statements in production code, resulting in unnecessary output.\n\n## Related Functions\n\n- `+`: Adds two or more numbers.\n- `-`: Subtracts one number from another.\n- `*`: Multiplies two or more numbers.\n- `/`: Divides one number by another.\n\n## Conclusion\n\nThe `print` function is a fundamental tool for debugging and logging expressions in Clarity smart contracts. It allows you to evaluate and return input expressions, providing a way to output intermediate values for better understanding of contract behavior. When used effectively, `print` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to debug and log expressions.\n" + }, + { + "title": "principal-construct?", + "description": "Construct a principal in Clarity smart contracts.", + "slug": "/stacks/clarity/functions/principal-construct", + "content": "\n## Function Signature\n\n```clarity\n(principal-construct? version-byte hash-bytes [contract-name])\n```\n\n- Input: `(buff 1), (buff 20), [(string-ascii 40)]`\n- Output: `(response principal { error_code: uint, principal: (optional principal) })`\n\n## Why it matters\n\nThe `principal-construct?` function is crucial for:\n\n1. Creating standard or contract principals.\n2. Managing identities and permissions in smart contracts.\n3. Ensuring data integrity by validating principal construction.\n4. Simplifying the process of creating principals in smart contracts.\n\n## When to use it\n\nUse `principal-construct?` when you need to:\n\n- Create a standard or contract principal.\n- Manage identities and permissions in your smart contract.\n- Validate the construction of principals.\n- Handle principal creation operations.\n\n## Best Practices\n\n- Ensure the `version-byte` and `hash-bytes` are correctly formatted.\n- Use meaningful variable names for better readability.\n- Combine with other principal functions for comprehensive identity management.\n- Handle the possible error cases to ensure robust contract behavior.\n\n## Practical Example: Constructing a Principal\n\nLet's implement a function that constructs a standard principal:\n\n```clarity\n(define-public (create-standard-principal (versionByte (buff 1)) (hashBytes (buff 20)))\n (principal-construct? versionByte hashBytes)\n)\n\n;; Usage\n(create-standard-principal 0x1a 0xfa6bf38ed557fe417333710d6033e9419391a320) ;; Returns (ok 'ST3X6QWWETNBZWGBK6DRGTR1KX50S74D3425Q1TPK)\n```\n\nThis example demonstrates:\n1. Using `principal-construct?` to create a standard principal.\n2. Implementing a public function to handle the principal construction.\n3. Handling both successful and error cases.\n\n## Common Pitfalls\n\n1. Using `principal-construct?` with incorrectly formatted `versionByte` or `hashBytes`, causing the operation to fail.\n2. Assuming the principal will always be valid, leading to unhandled error cases.\n3. Not handling all possible conditions, resulting in incomplete principal management.\n4. Overlooking the need for proper error handling and validation.\n\n## Related Functions\n\n- `principal-of?`: Returns the principal derived from a public key.\n- `contract-caller`: Returns the caller of the current contract context.\n- `tx-sender`: Returns the sender of the current transaction.\n\n## Conclusion\n\nThe `principal-construct?` function is a fundamental tool for creating principals in Clarity smart contracts. It allows you to manage identities and permissions, ensuring data integrity and simplifying principal creation. When used effectively, `principal-construct?` enhances the reliability and maintainability of your smart contract code by providing a clear and concise way to handle principal construction operations.\n" + }, + { + "title": "Optional values and error handling", + "description": "Safely handling optional values and error cases in Clarity smart contracts.", + "slug": "/stacks/clarity/handling-optionals-and-errors", + "content": "\nClarity provides robust mechanisms for dealing with optional values and error cases. These features are crucial for writing secure and predictable smart contracts that can gracefully handle unexpected situations.\n\n## Why these functions matter\n\nClarity's optional value and error handling functions are designed with several important considerations in mind:\n\n1. Safety: They prevent unexpected null or undefined errors that could crash a contract.\n2. Explicitness: They force developers to consider and handle all possible outcomes.\n3. Readability: They make the code's intent clear, improving maintainability.\n4. Composability: They allow for clean function composition and chaining of operations.\n\n## Core optional and error handling functions\n\n### 1. is-some and is-none\n\n**What**: Check if an optional value contains a value (some) or is empty (none).\n\n**Why**: Essential for safely working with optional values before attempting to use them.\n\n**When**: Use when you need to check if an optional value is present before proceeding.\n\n**How**: \n```clarity\n(is-some value)\n(is-none value)\n```\n\n**Best practices**: \n- Always check optional values before unwrapping them.\n- Use in combination with unwrap functions for safe value extraction.\n\n**Example use case**: Checking if a user exists in a map before performing an operation.\n\n```clarity\n(define-map Users principal { balance: uint })\n\n(define-public (check-balance (user principal))\n (if (is-some (map-get? Users user))\n (ok \"User exists\")\n (err \"User not found\")\n )\n)\n```\n\n### 2. unwrap! and unwrap-panic\n\n**What**: Extract the value from an optional or response type.\n\n**Why**: Allows safe extraction of values, with controlled behavior on failure.\n\n**When**: Use when you're certain a value exists or when you want to halt execution if it doesn't.\n\n**How**: \n```clarity\n(unwrap! value error-expr)\n(unwrap-panic value)\n```\n\n**Best practices**: \n- Use `unwrap!` when you want to provide a custom error message or value.\n- Use `unwrap-panic` sparingly, typically only in situations where failure is truly unexpected.\n\n**Example use case**: Retrieving a user's balance, with a custom error if the user doesn't exist.\n\n```clarity\n(define-map Users principal { balance: uint })\n\n(define-public (get-balance (user principal))\n (ok (unwrap! (get balance (map-get? Users user)) (err \"User not found\")))\n)\n```\n\n### 3. try!\n\n**What**: Attempts to unwrap a response, returning early with an error if it fails.\n\n**Why**: Simplifies error handling in functions that return responses.\n\n**When**: Use when you want to propagate errors up the call stack.\n\n**How**: \n```clarity\n(try! expression)\n```\n\n**Best practices**: \n- Use to chain multiple operations that might fail.\n- Helps keep code clean by avoiding nested if-else statements.\n\n**Example use case**: Transferring tokens between users, with multiple checks.\n\n```clarity\n(define-public (transfer (from principal) (to principal) (amount uint))\n (let\n (\n (senderBalance (try! (get-balance from)))\n (recipientBalance (try! (get-balance to)))\n )\n (try! (check-sufficient-balance senderBalance amount))\n (try! (update-balance from (- senderBalance amount)))\n (try! (update-balance to (+ recipientBalance amount)))\n (ok true)\n )\n)\n```\n\n## Practical example: safe token transfer system\n\nLet's implement a simple token system that demonstrates the use of optional values and error handling:\n\n```clarity\n(define-map Balances principal uint)\n\n(define-read-only (get-balance (user principal))\n (default-to u0 (map-get? Balances user))\n)\n\n(define-public (transfer (to principal) (amount uint))\n (let\n (\n (senderBalance (get-balance tx-sender))\n (recipientBalance (get-balance to))\n )\n (if (>= senderBalance amount)\n (begin\n (try! (as-contract (stx-transfer? amount tx-sender to)))\n (map-set Balances tx-sender (- senderBalance amount))\n (map-set Balances to (+ recipientBalance amount))\n (ok true)\n )\n (err u1)\n )\n )\n)\n\n(define-public (deposit (amount uint))\n (let\n (\n (currentBalance (get-balance tx-sender))\n )\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n (ok (map-set Balances tx-sender (+ currentBalance amount)))\n )\n)\n```\n\nThis example demonstrates:\n1. Using `try!` to handle potential errors in the STX transfer operations.\n2. Proper error handling and propagation throughout the contract functions.\n\n## Conclusion\n\nProper handling of optional values and error cases is crucial for writing secure and reliable Clarity smart contracts. By leveraging Clarity's built-in functions like `is-some`, `unwrap!`, and `try!`, you can create robust contracts that gracefully handle unexpected situations and provide clear feedback when errors occur. Always consider all possible outcomes and use these tools to make your contracts more predictable and maintainable.\n" + }, + { + "title": "Time-based logic", + "description": "Implementing time-based logic with block info functions in Clarity.", + "slug": "/stacks/clarity/time-and-blocks", + "content": "\nBlock info functions in Clarity provide crucial tools for implementing time-based logic in smart contracts. These functions allow developers to create contracts that can respond to the passage of time and changing blockchain states.\n\n## Why these functions matter\n\nClarity's block info functions are designed with blockchain-specific considerations in mind:\n\n1. Determinism: These functions provide a consistent view of time across all nodes, ensuring contract behavior is predictable.\n2. Security: By relying on block information rather than system time, contracts are protected against time-based manipulations.\n3. Flexibility: Developers can create time-locked features, scheduled events, and other time-dependent logic.\n4. Blockchain Awareness: Contracts can make decisions based on the current state of the blockchain.\n\n## Core Block Info Functions\n\n### 1. block-height\n\n**What**: Returns the current block height of the Stacks blockchain.\n**Why**: Essential for creating logic based on blockchain progression.\n**When**: Use when you need to trigger actions or changes based on block height milestones.\n**How**: \n```clarity\n(block-height)\n```\n\n**Best Practices**: \n- Use for long-term time measurements (hours/days) rather than short intervals.\n- Consider potential variations in block time when planning time-sensitive operations.\n\n**Example Use Case**: Implementing a phased token release schedule.\n\n```clarity\n(define-public (claim-tokens)\n (let ((release-height u100000))\n (if (>= block-height release-height)\n (ok (release-tokens))\n (err u1))))\n```\n\n### 2. burn-block-height\n\n**What**: Returns the current block height of the underlying burn chain (Bitcoin).\n**Why**: Provides a more stable time reference, as Bitcoin has more consistent block times.\n**When**: Use for more precise time-based logic or when synchronizing with Bitcoin network events.\n**How**: \n```clarity\n(burn-block-height)\n```\n\n**Best Practices**: \n- Prefer this over `block-height` for more accurate time estimations.\n- Remember that Bitcoin block times can still vary, so allow for some flexibility.\n\n**Example Use Case**: Creating a time-locked vault that opens after a specific Bitcoin block height.\n\n```clarity\n(define-constant unlock-height u700000)\n\n(define-public (withdraw-from-vault (amount uint))\n (if (>= burn-block-height unlock-height)\n (ok (transfer-tokens amount))\n (err u2)))\n```\n\n### 3. get-block-info?\n\n**What**: Retrieves information about a specific block.\n**Why**: Allows contracts to access historical block data for complex time-based logic.\n**When**: Use when you need to verify or act on information from past blocks.\n**How**: \n```clarity\n(get-block-info? property-name block-height-int)\n```\n\n**Best Practices**: \n- Cache retrieved information when possible to save processing costs.\n- Be aware of the limit on how far back you can query block information.\n\n**Example Use Case**: Implementing a reward system based on user activity in specific time periods.\n\n```clarity\n(define-public (claim-period-reward (period uint))\n (let ((period-end-height (get-period-end-height period))\n (current-winner (get-block-info? winner-id period-end-height)))\n (if (is-eq current-winner tx-sender)\n (ok (distribute-reward tx-sender))\n (err u3))))\n```\n\n### Practical Example: Token Balance Snapshot for Voting\n\nLet's implement a simple voting system where voting power is determined by a user's token balance at a specific \"snapshot\" block height. This example combines the use of `at-block` and `get-block-info?` functions to create a time-based voting mechanism.\n\n```clarity\n;; Define a simple token balance map\n(define-map token-balances principal uint)\n\n;; Define a map to store votes\n(define-map votes principal uint)\n\n;; Set a snapshot block height\n(define-data-var snapshot-height uint u100000)\n\n;; Function to get a user's balance at the snapshot height\n(define-read-only (get-snapshot-balance (user principal))\n (match (get-block-info? id-header-hash (var-get snapshot-height))\n snapshot-block (at-block snapshot-block\n (default-to u0 (map-get? token-balances user)))\n u0))\n\n;; Function to cast a vote\n(define-public (cast-vote (amount uint))\n (let \n ((snapshot-balance (get-snapshot-balance tx-sender))\n (current-votes (default-to u0 (map-get? votes tx-sender))))\n (asserts! (<= amount snapshot-balance) (err u1)) ;; Can't vote more than snapshot balance\n (asserts! (< (+ amount current-votes) (+ snapshot-balance u1)) (err u2)) ;; Prevent overflow\n (map-set votes tx-sender (+ amount current-votes))\n (ok true)))\n\n;; Function to check total votes\n(define-read-only (get-total-votes)\n (fold + (map-values votes) u0))\n```\n\n## Conclusion\n\nBlock info functions in Clarity provide powerful tools for implementing time-based logic in smart contracts. By understanding when and how to use these functions, developers can create contracts that respond dynamically to the progression of the blockchain, enabling features like time-locks, scheduled events, and historical data analysis. Always consider the specific requirements of your application and the potential for block time variations when implementing time-based logic using these block info functions." + }, + { + "title": "Web app development", + "description": "Build your web apps on Stacks.", + "slug": "/stacks/web-app-development", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>" + }, + { + "title": "Token development", + "description": "Build your tokens on Stacks.", + "slug": "/stacks/token-development", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>" + }, + { + "title": "Blocks", + "description": "Get aggregated signer information for blocks.", + "slug": "/stacks/signer-metrics-api/blocks/index", + "content": "" + }, + { + "title": "Aggregated signer information for a block", + "description": "Get aggregated signer information for a specific block.", + "slug": "/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block", + "content": "\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/blocks/{height_or_hash}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Aggregated signer information for most recent blocks", + "description": "Get aggregated signer information for most recent blocks.", + "slug": "/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks", + "content": "\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/blocks', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Overview", + "description": "Monitor and analyze signer behavior on the Stacks network.", + "slug": "/stacks/signer-metrics-api/index", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nThe Signer Metrics API enables you to monitor signers on the Stacks network. With a familiar REST interface, you can easily fetch information about the signer network, such as lists of active signers in a particular PoX cycle and signer information for a particular block. \n\nThis API also lets you analyze and evaluate the behavior of individual signers, such as their block acceptance rate, their average block push time, and more.\n\n## Popular endpoints\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/signer-metrics-api/signers/pox-cycle-signers\"\n title=\"Get a list of signers\"\n description=\"Fetches a list of signers in a given PoX cycle.\"\n />\n <SecondaryCard\n href=\"/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block\"\n title=\"Get signer information for a block\"\n description=\"Fetches aggregated signer information for a specific block.\"\n />\n <SecondaryCard\n href=\"/stacks/signer-metrics-api/prometheus/metrics\"\n title=\"Query for Prometheus metrics\"\n description=\"Fetch behavioral data around individual signers and block proposals\"\n />\n</Cards>\n\n## Related tools\n\n- **[Stacks Blockchain API](/stacks/api)**: Fetch richer data from Hiro's Stacks Blockchain API.\n- **[Stacks Node RPC API](/stacks/rpc-api)**: Query the Stacks Node RPC API, interact with smart contracts, and broadcast transactions all via a familiar REST interface.\n- **[Token Metadata API](/stacks/token-metadata-api)**: Fetch fungible and non-fungible token data on the Stacks blockchain.\n\n<br />\n\n<Callout title=\"Need help building with the Stacks Node RPC API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#api</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n" + }, + { + "title": "Info", + "description": "Service status endpoints", + "slug": "/stacks/signer-metrics-api/info/index", + "content": "" + }, + { + "title": "API Status", + "description": "Displays the status of the API and its current workload.", + "slug": "/stacks/signer-metrics-api/info/status", + "content": "\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Prometheus Metrics", + "description": "Get Prometheus metrics for the Signer Metrics API.", + "slug": "/stacks/signer-metrics-api/prometheus/index", + "content": "" + }, + { + "title": "Prometheus Metrics", + "description": "Get Prometheus metrics for the Signer Metrics API.", + "slug": "/stacks/signer-metrics-api/prometheus/metrics", + "content": "\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/metrics', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Signers", + "description": "Get information about signers on the Stacks blockchain.", + "slug": "/stacks/signer-metrics-api/signers/index", + "content": "" + }, + { + "title": "PoX Cycle Signer", + "description": "Get stats for a specific signer in a given PoX cycle.", + "slug": "/stacks/signer-metrics-api/signers/pox-cycle-signer", + "content": "\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/cycles/{cycle_number}/signers/{signer_id}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "PoX Cycle Signers", + "description": "Get a list of signers in a given PoX cycle.", + "slug": "/stacks/signer-metrics-api/signers/pox-cycle-signers", + "content": "\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/cycles/{cycle_number}/signers', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Signer information for a block", + "description": "Get signer information for a specific block.", + "slug": "/stacks/signer-metrics-api/block-proposals/signer-information-for-a-block", + "content": "\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/block_proposals/{block_hash}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Block proposals", + "description": "Get information about block proposals.", + "slug": "/stacks/signer-metrics-api/block-proposals/index", + "content": "" + }, + { + "title": "Signer information for most recent block proposals", + "description": "Get signer information for most recent block proposals.", + "slug": "/stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals", + "content": "\n<APIPage\n document=\"./openapi/signer-metrics-api.json\"\n operations={[{ path: '/signer-metrics/v1/block_proposals', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Overview", + "description": "Discover updates to Hiro tools related to the Nakamoto upgrade.", + "slug": "/stacks/nakamoto/index", + "content": "\nNakamoto is an upcoming upgrade to Stacks that brings faster blocks and paves the way for sBTC. [Start here](https://docs.stacks.co/nakamoto-upgrade/nakamoto-upgrade-start-here) if you need an overview of how Nakamoto impacts the network. This document is about how Nakamoto impacts your applications and Hiro tooling specifically.\n\nThe good news for you is that the Nakamoto upgrade does not bring breaking changes to applications on Stacks. Your app will continue to work as expected post-upgrade, apart from you and your users experiencing the better UX of faster block times.\n\nIn terms of what you need to do to prepare for Nakamoto, just make sure you are running the latest versions of our tooling. We are shipping updates across all Hiro tools to make sure they support Nakamoto and that you can stay focused on building.\n\nBelow find a list of how Hiro tools have been updated to support Nakamoto:\n\n## Stacks Explorer: What's new\n\n### Introducing a fresh view for blocks\n\nThe Stacks Explorer now features a new way to display blocks, aligning with the Nakamoto upgrade's approach of multiple STX blocks settling into one BTC block.\n\n![Block View](./images/nakamoto-explorer.png)\n\n### Tailored viewing experience\n\nThis new view is now live on both [testnet](https://explorer.hiro.so/?chain=testnet) and [mainnet](https://explorer.hiro.so/?chain=mainnet), accessible via the network dropdown.\n\n#### Two distinctive display modes\n\n1. **Independent Display:** Focuses on STX blocks progress.\n2. **COMING SOON—Grouped by Bitcoin Block:** Shows BTC blocks flow alongside STX blocks.\n\n![Block View](./images/group-by-block.png)\n\n### Stay in the loop with live view\n\nKeep up-to-date with blocks in real-time with our new live view option.\n\n---\n\n## Stacks.js: What’s new\n\n### StackingClient\n\nInstall the latest nakamoto version with `npm install @stacks/stacking@6.13.0`.\n\nThe StackingClient in `@stacks/stacking` was updated to match the latest pox-4 contract.\n\n- Added `StackingClient.signPoxSignature()`\n- Added `Pox4SignatureTopic` enum\n- New stacking arguments for `StackingClient.stack`, `StackingClient.stackExtend`, `StackingClient.stackIncrease`, `StackingClient.stackAggregationCommit`, and `StackingClient.stackAggregationCommitIndexed`\n\n[Learn more](/stacks/nakamoto/guides/stacks-js) about the new Stacks.js updates.\n\n---\n\n## Clarinet: What’s new\n\nMake sure to install [Clarinet 2.8.0](https://github.com/hirosystems/clarinet/releases/tag/v2.8.0) or above.\n\n- Clarinet's devnet can now be used to test Nakamoto functionality.\n- The devnet now starts 2 signer nodes in Nakamoto mode.\n- Running `clarinet check --enable-clarity-wasm` now runs the current interpreter and clarity wasm side-by-side to allow comparing outputs.\n- `clarinet console --enable-clarity-wasm` now automatically runs the current interpreter and clarity wasm side-by-side and logs any difference in outputs.\n\nBy default, the Devnet won't start in epoch 3.0, [see this guide](/stacks/nakamoto/guides/clarinet) to configure it.\n\n---\n\n## Stacks Blockchain API: What’s new\n\n> **_NOTE:_**\n>\n> The `/extended/v2/*` endpoints represent the modern API that is being continually expanded to support the Nakamoto upgrade. We encourage developers to use v2 endpoints for new developments. Be aware that `/extended/v1/*` are the older set of endpoints. Though they continue to function alongside v2, they will be deprecated in the coming months.\n\n### Nakamoto endpoints\n\nThe Stacks Blockchain API has a series of new endpoints to support the upcoming Nakamoto upgrade:\n\n- Get Proof-of-Transfer details per Cycle, including Signers and Stackers, with information about stacked STX amounts, payout addresses and signer weights\n- Get a list of Stacks blocks per Bitcoin block to support the new Nakamoto mining mechanism\n- Get all transactions relevant to a STX address or contract ID, including filters for FT and NFT transfers\n- Support for the new Nakamoto `tenure_change` transaction type across all our transaction endpoints\n- Get a summary of current network mempool transaction fees, including statistics for expected confirmation priorities\n- Get the deployment status of multiple smart contracts in one call\n\nAll of these endpoints are backwards compatible with Stacks nodes running version 2.4 or earlier\n\n### Event replay optimizations\n\n- Optimize replay speed by creating a new parquet-based ingestion that optimizes for canonical chain information\n- Optimize classic TSV event replay by improving block ingestion times\n\n### New transaction type `tenure_change`\n\nAffects endpoints:\n\n- `/extended/v1/address/{principal}/transactions`\n- `/extended/v1/tx`\n- `/extended/v1/tx/{tx_id}`\n- `/extended/v1/tx/{tx_id}/raw`\n- `/extended/v1/tx/mempool`\n- `/extended/v1/tx/multiple`\n\n### New endpoints: `/extended/v2/*`\n\n- `/extended/v2/mempool/fees`\n- `/extended/v2/burn-blocks`\n- `/extended/v2/burn-blocks/{height_or_hash}`\n- `/extended/v2/burn-blocks/{height_or_hash}/blocks`\n- `/extended/v2/blocks`\n- `/extended/v2/blocks/{height_or_hash}`\n- `/extended/v2/blocks/{height_or_hash}/transactions`\n- `/extended/v2/addresses/{address}/transactions:`\n- `/extended/v2/addresses/{address}/transactions/{tx_id}/events:`\n- `/extended/v2/smart-contracts/status`\n- `/extended/v2/pox/cycles`\n- `/extended/v2/pox/cycles/{cycle_number}`\n- `/extended/v2/pox/cycles/{cycle_number}/signers`\n- `/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}`\n- `/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}/stackers`\n\n### Deprecated endpoints\n\n- `/extended/v1/block`\n- `/extended/v1/block/{hash}`\n- `/extended/v1/block/by_height/{height}`\n- `/extended/v1/block/by_burn_block_hash/{burn_block_hash}`\n- `/extended/v1/block/by_burn_block_height/{burn_block_height}`\n- `/extended/v1/address/{principal}/transactions`\n- `/extended/v1/address/{principal}/{tx_id}/with_transfers`\n- `/extended/v1/address/{principal}/transactions_with_transfers`\n- `/extended/v1/fee_rate`\n- `/extended/v1/tx/block/{block_hash}`\n- `/extended/v1/tx/block_height/{height}`\n\nView the [API reference](/stacks/api/info).\n" + }, + { + "title": "Updates for Stacks Explorer", + "description": "Discover Stacks Explorer updates related to the Nakamoto upgrade.", + "slug": "/stacks/nakamoto/guides/explorer", + "content": "\n## What's new\n\n### Introducing a fresh view for blocks\n\nThe Stacks Explorer now features a new way to display blocks, aligning with the Nakamoto upgrade's approach of multiple STX blocks settling into one BTC block.\n\n![Block View](../images/nakamoto-explorer.png)\n\n### Tailored viewing experience\n\nThis new view is now live on both [testnet](https://explorer.hiro.so/?chain=testnet) and [mainnet](https://explorer.hiro.so/?chain=mainnet), accessible via the network dropdown.\n\n#### Two distinctive display modes\n\n1. **Independent Display:** Focuses on STX blocks progress.\n2. **COMING SOON—Grouped by Bitcoin Block:** Shows BTC blocks flow alongside STX blocks.\n\n![Block View](../images/group-by-block.png)\n\n### Stay in the loop with live view\n\nKeep up-to-date with blocks in real-time with our new live view option.\n" + }, + { + "title": "Updates for Clarinet", + "description": "Discover Clarinet upgrades related to the Nakamoto release.", + "slug": "/stacks/nakamoto/guides/clarinet", + "content": "\n## Setting up a project for Nakamoto\n\nAs of [version 2.11.0](https://github.com/hirosystems/clarinet/releases/tag/v2.11.0), Clarinet runs\nin epoch 3.0 (Nakamoto) by default.\n\n- Contracts are set to be deployed in epoch 3.0 and support Clarity 3.\n- The Devnet runs the latest Stacks blockchain version by default, enabling Nakamoto and support\n Clarity 3 contracts.\n\nOnce the Devnet reaches the right block height, (Bitcoin block #108 by default), it will deploy the\n_`pox-4.clar`_ contract and run in Epoch 2.5. From there, Clarinet will send _`stack-stx`_ and\n_`stack-extend`_ requests to the new PoX contract. Eventually, you can observe the\n_`vote-for-aggregate-public-key`_ transactions that they send.\n\n**At Bitcoin block #142, the Devnet will switch the epoch 3.0.**\n\nAt the end of the _`Devnet.toml`_ file, you must make sure that the _`pox_stacking_orders`_ are properly\nset. You should have 3 stacking orders from 3 different accounts. All should start at **cycle 1**\nand take at least **2 slots**. You also need to enable the _`auto-extend`_ property. Because Nakamoto\nrelies on the Stackers to sign blocks, these settings ensure that there are engouh stacked STX for\neach cycles. Here is what it looks like by default in new projects:\n\n```toml\n# settings/Devnet.toml\n[[devnet.pox_stacking_orders]]\nstart_at_cycle = 1\nduration = 10\nauto_extend = true\nwallet = \"wallet_1\"\nslots = 2\nbtc_address = \"mr1iPkD9N3RJZZxXRk7xF9d36gffa6exNC\"\n\n[[devnet.pox_stacking_orders]]\nstart_at_cycle = 1\nduration = 10\nauto_extend = true\nwallet = \"wallet_2\"\nslots = 2\nbtc_address = \"muYdXKmX9bByAueDe6KFfHd5Ff1gdN9ErG\"\n\n[[devnet.pox_stacking_orders]]\nstart_at_cycle = 1\nduration = 10\nauto_extend = true\nwallet = \"wallet_3\"\nslots = 2\nbtc_address = \"mvZtbibDAAA3WLpY7zXXFqRa3T4XSknBX7\"\n```\n\nSet a contract to be deployed in epoch 3.0 with Clarity 3. You can create a new one with\n`$ clarinet contract new <contract-name>`). It needs to be manually update in the project manifest\n(Clarinet.toml)\n\n```toml\n# Clarinet.toml\n[contracts.nakademo]\npath = 'contracts/nakademo.clar'\nclarity_version = 3\nepoch = 3.0\n```\n\nStart Devnet with `clarinet devnet start`, you should see epoch 3.0 and fast blocks at Bitcoin\nblock 142.\n\n<Callout title=\"New Clarity keywords\">\nClarity 3 introduces two new keywords after the Nakamoto hard fork:\n\n- `tenure-height`: Returns the number of tenures passed.\n- `stacks-block-height`: Returns the current Stacks block height.\n\nNote: `block-height` is removed.\n\nFor more details on these and other Clarity keywords, see the [Clarity Keywords Reference](https://docs.stacks.co/reference/keywords).\n</Callout>" + }, + { + "title": "Updates for Stacks API", + "description": "Discover Stacks Blockchain API updates related to the Nakamoto upgrade.", + "slug": "/stacks/nakamoto/guides/stacks-api", + "content": "\n## What's new\n\n<Callout title=\"Note\" type=\"info\">\n The `/extended/v2/*` endpoints represent the modern API that is being\n continually expanded to support the Nakamoto upgrade. We encourage developers\n to use v2 endpoints for new developments. Be aware that `/extended/v1/*` are\n the older set of endpoints. Though they continue to function alongside v2, they will be deprecated in the coming months.\n</Callout>\n\n### Nakamoto endpoints\n\nThe Stacks Blockchain API has a series of new endpoints to support the upcoming Nakamoto upgrade:\n\n- Get Proof-of-Transfer details per Cycle, including Signers and Stackers, with information about stacked STX amounts, payout addresses and signer weights\n- Get a list of Stacks blocks per Bitcoin block to support the new Nakamoto mining mechanism\n- Get all transactions relevant to a STX address or contract ID, including filters for FT and NFT transfers\n- Support for the new Nakamoto `tenure_change` transaction type across all our transaction endpoints\n- Get a summary of current network mempool transaction fees, including statistics for expected confirmation priorities\n- Get the deployment status of multiple smart contracts in one call\n\nAll of these endpoints are backwards compatible with Stacks nodes running version 2.4 or earlier\n\n### Event replay optimizations\n\n- Optimize replay speed by creating a new parquet-based ingestion that optimizes for canonical chain information\n- Optimize classic TSV event replay by improving block ingestion times\n\n### New transaction type `tenure_change`\n\nThis new type affects the following endpoints:\n\n- `/extended/v1/address/{principal}/transactions`\n- `/extended/v1/tx`\n- `/extended/v1/tx/{tx_id}`\n- `/extended/v1/tx/{tx_id}/raw`\n- `/extended/v1/tx/mempool`\n- `/extended/v1/tx/multiple`\n\n### New endpoints: `/extended/v2/*`\n\nOne important difference to note between the `/extended/v1` vs the `/extended/v2` endpoints is that the /extended/v2/_ endpoints represent the current API that is being continually expanded to support the Nakamoto upgrade. We encourage developers to use v2 endpoints for new developments. Be aware that /extended/v1/_ are the older set of endpoints. Though they continue to function alongside v2, they will be deprecated in the coming months.\n\n- `/extended/v2/mempool/fees`\n- `/extended/v2/burn-blocks`\n- `/extended/v2/burn-blocks/{height_or_hash}`\n- `/extended/v2/burn-blocks/{height_or_hash}/blocks`\n- `/extended/v2/blocks`\n- `/extended/v2/blocks/{height_or_hash}`\n- `/extended/v2/blocks/{height_or_hash}/transactions`\n- `/extended/v2/addresses/{address}/transactions:`\n- `/extended/v2/addresses/{address}/transactions/{tx_id}/events:`\n- `/extended/v2/smart-contracts/status`\n- `/extended/v2/pox/cycles`\n- `/extended/v2/pox/cycles/{cycle_number}`\n- `/extended/v2/pox/cycles/{cycle_number}/signers`\n- `/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}`\n- `/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}/stackers`\n\n### Deprecated endpoints\n\n- `/extended/v1/block`\n- `/extended/v1/block/{hash}`\n- `/extended/v1/block/by_height/{height}`\n- `/extended/v1/block/by_burn_block_hash/{burn_block_hash}`\n- `/extended/v1/block/by_burn_block_height/{burn_block_height}`\n- `/extended/v1/address/{principal}/transactions`\n- `/extended/v1/address/{principal}/{tx_id}/with_transfers`\n- `/extended/v1/address/{principal}/transactions_with_transfers`\n- `/extended/v1/fee_rate`\n- `/extended/v1/tx/block/{block_hash}`\n- `/extended/v1/tx/block_height/{height}`\n\nView the [API reference](/stacks/api/info).\n" + }, + { + "title": "Updates for Stacks.js", + "description": "Discover Stacks.js changes related to the Nakamoto upgrade.", + "slug": "/stacks/nakamoto/guides/stacks-js", + "content": "\n## What's new\n\n### StackingClient\n\nInstall the latest nakamoto version with `npm install @stacks/stacking@latest`.\n\nThe StackingClient in `@stacks/stacking` was updated to match the latest `pox-4` contract.\n\n- Added `StackingClient.signPoxSignature()`\n- Added `Pox4SignatureTopic` enum\n- New stacking arguments for `StackingClient.stack`, `StackingClient.stackExtend`, `StackingClient.stackIncrease`, `StackingClient.stackAggregationCommit`, `StackingClient.stackAggregationCommitIndexed`, and `StackingClient.stackAggregationIncrease`\n\n### Nakamoto network\n\nTo test using the Nakamoto testnet, you can use the `StacksTestnet` network with a custom URL. The Nakamoto testnet is being hosted at https://api.testnet.hiro.so. Use this URL like this:\n\n```tsx\nimport { StacksTestnet } from \"@stacks/network\"\n\nconst network = new StacksTestnet({\n url: \"https://api.testnet.hiro.so\"\n})\n```\n\n#### Example snippets\n\n**`StackingClient.signPoxSignature`**\n\n```ts\nconst client = StackingClient(MY_ADDRESS, new StacksTestnet())\n```\n\n```ts\nconst signature = client.signPoxSignature({\n topic: \"stack-stx\",\n rewardCycle: await client.getPoxInfo().reward_cycle_id,\n poxAddress: MY_BTC_ADDRESS,\n period: 2,\n maxAmount: 10_000_000_000_000,\n authId: 123n,\n\n signerPrivateKey: MY_SIGNER_PRIVATE_KEY\n})\n```\n\n**New arguments for e.g. `StackingClient.stack`**\n\n```ts\nconst { txid } = await client.stack({\n amountMicroStx: 10_000_000_000_000, // this can be at most the signature `maxAmount`\n poxAddress: MY_BTC_ADDRESS,\n cycles: 2, // this needs to match signature `period`\n burnBlockHeight: CURRENT_BURN_BLOCK_HEIGHT,\n\n // NEW ARGS\n signerKey: MY_SIGNER_PUBLIC_KEY,\n signerSignature: signature,\n maxAmount: 10_000_000_000_000,\n authId: 123n,\n\n privateKey: MY_STX_PRIVATE_KEY\n})\n```\n" + }, + { + "title": "Unit testing", + "description": "Learn how to write and run unit tests for your Clarity smart contracts using the Clarinet JS SDK and Vitest.", + "slug": "/stacks/unit-testing", + "content": "\nimport { Accordions, Accordion } from 'fumadocs-ui/components/accordion';\n\nUnit testing is the process of testing individual components or functions of smart contracts to ensure they work as expected. The Clarinet JS SDK provides a testing framework that allows you to write these tests using the Vitest testing framework, helping you catch bugs and errors early in the development process.\n\nIn this guide, you will:\n\n1. [Set up a new Clarinet project with a `defi` contract](#set-up-a-new-clarinet-project).\n2. [Write a unit test covering the `deposit` function](#test-the-deposit-function).\n3. [Run tests and generate coverage reports](#run-tests-and-generate-coverage-reports).\n\n---\n\n## Set up a new Clarinet project\n\nStart by creating a new project with the Clarinet CLI. The command below will create a project structure inside of `defi` with the necessary files and folders, including the Clarinet JS SDK already set up for testing.\n\n```terminal\n$ clarinet new stx-defi\n$ cd stx-defi\n```\n\nAfter changing into your project directory, run `npm install` to install the package dependencies for testing.\n\n```terminal\n$ npm install\n```\n\nSince the smart contract code is out of scope for this guide, we are going to use a pre-existing contract. First, generate a new file using the `clarinet contract new` command in order to set up your project with the necessary configuration and test files.\n\n```terminal\n$ clarinet contract new defi\n```\n\nNow, inside your `defi.clar` file, copy and paste the following contract code:\n\n```clarity\n;; Holds the total amount of deposits in the contract, initialized to 0.\n(define-data-var total-deposits uint u0)\n\n;; Maps a user's principal address to their deposited amount.\n(define-map deposits { owner: principal } { amount: uint })\n\n;; Public function for users to deposit STX into the contract.\n;; Updates their balance and the total deposits in the contract.\n(define-public (deposit (amount uint))\n (let\n (\n ;; Fetch the current balance or default to 0 if none exists.\n (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n )\n ;; Transfer the STX from sender = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\" to recipient = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)\".\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n ;; Update the user's deposit amount in the map.\n (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })\n ;; Update the total deposits variable.\n (var-set total-deposits (+ (var-get total-deposits) amount))\n ;; Return success.\n (ok true)\n )\n)\n\n;; Read-only function to get the total balance by tx-sender\n(define-read-only (get-balance-by-sender)\n (ok (map-get? deposits { owner: tx-sender }))\n)\n```\n\nRun `clarinet check` to ensure that your smart contract is valid and ready for testing.\n\n<Callout>\nYou can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi).\n</Callout>\n\n## Test the deposit function\n\nThis `deposit` function allows users to deposit STX into the contract, updating their balance inside a `deposits` map and adding to the total deposits stored in a `total-deposits` variable. The key tests we want to cover are that the deposit is successful and that the user's balance, as well as the contract's total deposits, are updated correctly.\n\nInside of your `defi.test.ts` file, replace the boilerplate code and add the following:\n\n```typescript\nimport { describe, it, expect } from 'vitest';\nimport { Cl } from '@stacks/transactions';\n\nconst accounts = simnet.getAccounts();\nconst wallet1 = accounts.get('wallet_1')!;\n```\n\nThese imports provide the testing framework and utilities we need. We also get the `wallet_1` account, which will act as our test user.\n\nNext, define the test suite and the specific test case:\n\n```typescript\ndescribe('stx-defi', () => {\n it('allows users to deposit STX', () => {\n // Test code will go here\n });\n});\n```\n\nThis structure comes from our Vitest integration, and it organizes our tests and describes what we're testing. The `describe` block groups multiple test cases together, while the `it` block represents a single test case.\n\nNow, let's simulate a deposit. Inside of the `it` block, define the amount to deposit and call the `deposit` function:\n\n```typescript\nconst amount = 1000;\nconst deposit = simnet.callPublicFn('defi', 'deposit', [Cl.uint(amount)], wallet1);\n```\n\nThis code simulates a deposit by calling the `deposit` function, using the `callPublicFn` method from the Clarinet JS SDK, in our contract with a specified amount, just as a user would in the real world.\n\nAfter making the deposit, create an assertion to verify that the call itself was successful and returns an `ok` response type with the value `true`:\n\n```typescript\nexpect(deposit.result).toBeOk(Cl.bool(true));\n```\n\nRun `npm run test` to confirm that this test passes.\n\nLet's go over some of the code in this assertion:\n\n- `expect` is a function from Vitest that makes an assertion about the value we expect to get back from the `deposit` function.\n\nBut how do we test against Clarity types and values? This is where the `Cl` and `toBeOk` helpers come in.\n\n- `toBeOk` is a custom matcher function built into Vitest that checks if the result of the deposit call is an `Ok` response, which is a Clarity type. This is important because it confirms that the deposit transaction was processed successfully.\n- `Cl` helper is from the `@stacks/transactions` package and is used to create Clarity values in JavaScript. In this case, it's used to create a Clarity boolean with the value of `true`.\n\n<Callout>\nTo see more custom matcher examples, check out the [reference page](/stacks/clarinet-js-sdk/references/custom-matchers).\n</Callout>\n\nOnce we can confirm that the deposit was successful, write a test to verify that the contract's total deposits have been updated correctly.\n\n```typescript\nconst totalDeposits = simnet.getDataVar('defi', 'total-deposits');\nexpect(totalDeposits).toBeUint(amount);\n```\n\nRun `npm run test` again to confirm that this test also passes.\n\nThis check ensures that the contract accepted our deposit without any issues.\n\nLastly, verify that the user's balance has been updated correctly:\n\n```typescript\nconst balance = simnet.callReadOnlyFn('defi', 'get-balance-by-sender', [], wallet1);\nexpect(balance.result).toBeOk(\n Cl.some(\n Cl.tuple({\n amount: Cl.uint(amount),\n })\n )\n);\n```\n\nWe call the `get-balance-by-sender` function and check if it matches the amount we just deposited.\n\nBy following these steps, our test comprehensively verifies that the `deposit` function works as intended, updating individual balances and total deposits accurately.\n\n<Accordions>\n <Accordion title=\"Full code snippet\">\n```typescript\n import { describe, it, expect } from 'vitest';\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet1 = accounts.get('wallet_1')!;\n\n describe('stx-defi', () => {\n it('allows users to deposit STX', () => {\n const amount = 1000;\n const deposit = simnet.callPublicFn('defi', 'deposit', [Cl.uint(amount)], wallet1);\n expect(deposit.result).toBeOk(Cl.bool(true));\n\n const totalDeposits = simnet.getDataVar('defi', 'total-deposits');\n expect(totalDeposits).toBeUint(amount);\n\n const balance = simnet.callReadOnlyFn('defi', 'get-balance-by-sender', [], wallet1);\n expect(balance.result).toBeOk(\n Cl.some(\n Cl.tuple({\n amount: Cl.uint(amount),\n })\n )\n );\n });\n });\n```\n </Accordion>\n</Accordions>\n\n## Run tests and generate coverage reports\n\nTo run your tests, use:\n\n```terminal\n$ npm run test\n```\n\nTo generate a coverage report, use:\n\n```terminal\n$ npm run coverage\n```\n\nThis will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/methods\"\n title=\"SDK methods\"\n description=\"Learn about the methods available in the Clarinet JS SDK.\"\n />\n</Cards>" + }, + { + "title": "Smart contract development", + "description": "Build your smart contracts on Stacks.", + "slug": "/stacks/smart-contract-development", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>" + }, + { + "title": "@stacks/transactions", + "description": "Construct, decode transactions and work with Clarity smart contracts on the Stacks blockchain.", + "slug": "/stacks/stacks.js/v6/transactions", + "content": "\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\nThe Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a UserSession to manage user data.\n\n## Installation\n\n```package-install\n@stacks/transactions\n```\n\n{/* <Root>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`AppConfig`</h2>\n\nConfiguration data for the current app.\n\nOn browser platforms, creating an instance of this class without any arguments will use `window.location.origin` as the app domain. On non-browser platforms, you need to specify an app domain as the second argument.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"scopes\"} type={\"string[]\"}>\n\nAn array of strings representing permissions requested by the app.\n\n<span>Default: `['store_write']`</span>\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"appDomain\"} type={\"string\"}>\n\nStacks apps are uniquely identified by their app domain.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"redirectPath\"} type={\"string\"}>\n\nPath on app domain to redirect users to after authentication. The authentication response token will be postpended in a query.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"manifestPath\"} type={\"string\"}>\n\nPath relative to app domain of app's manifest file.\n\n<span>Default: `\"/manifest.json\"`</span>\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"coreNode\"} type={\"string\"}>\n\nThe URL of Stacks core node to use for this app. If this is not specified, the default core node will be used.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"authenticatorURL\"} type={\"string\"}>\n\nThe URL of a web-based authenticator to use in the event the user doesn't have Stacks installed on their machine. If this is not specified, the current default in this library will be used.\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"config\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"config\" className='tab group'>\n <Badge className='badge transition-colors'>Setting basic app permissions</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>With advanced scopes</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"config\">\n ```tsx twoslash\n // @noErrors\n // [!code word:AppConfig]\n import { AppConfig } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n const appConfig = new AppConfig(\n ['store_write'],\n appDomain\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n \n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```tsx twoslash\n // @noErrors\n // [!code word:publish_data]\n // [!code word:email]\n import { AppConfig } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n const appConfig = new AppConfig(\n ['store_write', 'publish_data', 'email'],\n appDomain\n );\n ```\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n \n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`UserSession`</h2>\n\nRepresents an instance of a signed in user for a particular app.\n\n## Functions\n\n<Property required={false} deprecated={false} name={\"isSignInPending\"} type={\"function\"}>\n\nDetermines if there is an incoming authentication response.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"handlePendingSignIn\"} type={\"function\"}>\n\nProcesses the response and provides a `userData` object containing the user's identity, BNS username and profile information.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"isUserSignedIn\"} type={\"function\"}>\n\nChecks if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"loadUserData\"} type={\"function\"}>\n\nRetrieves the user's profile data if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"encryptContent\"} type={\"function\"}>\n\nEncrypts user data for secure storage.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"decryptContent\"} type={\"function\"}>\n\nDecrypts user data for secure storage.\n\n</Property>\n\n</div>\n\n<APIExample>\n<Tabs defaultValue=\"pending\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"pending\" className='tab group'>\n <Badge className='badge transition-colors'>Handling pending auth</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"status\" className='tab group'>\n <Badge className='badge transition-colors'>Checking if user is signed in</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"user-data\" className='tab group'>\n <Badge className='badge transition-colors'>Loading data for signed in user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"sign-out\" className='tab group'>\n <Badge className='badge transition-colors'>Signing out a user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"encrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Encrypting user data</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"decrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Decrypting user data</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"pending\">\n ```tsx twoslash\n // @noErrors\n // [!code word:isSignInPending]\n // [!code word:handlePendingSignIn]\n const isPending = userSession.isSignInPending();\n\n if (isPending) {\n userSession.handlePendingSignIn().then(userData => {\n // Do something with userData\n });\n }\n ```\n </TabsContent>\n <TabsContent value='status'>\n ```tsx twoslash\n // @noErrors\n // [!code word:isUserSignedIn]\n const isSignedIn = userSession.isUserSignedIn();\n ```\n </TabsContent>\n <TabsContent value='user-data'>\n ```tsx twoslash\n // @noErrors\n // [!code word:loadUserData]\n const isSignedIn = userSession.isUserSignedIn();\n\n if (isSignedIn) {\n // Do something with the signed in user\n const userData = userSession.loadUserData();\n }\n ```\n </TabsContent>\n <TabsContent value='sign-out'>\n ```tsx twoslash\n // @noErrors\n // [!code word:signUserOut]\n userSession.signUserOut();\n ```\n </TabsContent>\n <TabsContent value='encrypt'>\n ```tsx twoslash\n // @noErrors\n // [!code word:encryptContent]\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n ```\n </TabsContent>\n <TabsContent value='decrypt'>\n ```tsx twoslash\n // @noErrors\n // [!code word:decryptContent]\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n const plainText = await userSession.decryptContent(cipherText);\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n\n<Accordion title={\"Notes\"}>\n Note that encryption here uses the user's private key associated with your app only. If you need to share this data with another app or other users, you should use the equivalent methods from `@stacks/encryption` and provide a custom private key.\n</Accordion>\n\n</Accordions>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`makeAuthRequest`</h2>\n\nThe Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a UserSession to manage user data.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"transitKey\"} type={\"string\"}>\n\nThe authentication payloads are encrypted during transit, the encryption key generated below provides this\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"redirectURI\"} type={\"string\"}>\n\nA URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"manifestUri\"} type={\"string\"}>\n\nSet the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"scopes\"} type={\"string[]\"}>\n\nAdditional permissions the app is requesting\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"auth-request\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"auth-request\" className='tab group'>\n <Badge className='badge transition-colors'>Generate an authentication request</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"auth-request\">\n ```tsx twoslash\n // @noErrors\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // ---cut---\n const authRequest = userSession.makeAuthRequest(\n // ^^^^^^^^^^^^^^^\n transitKey,\n redirectUri,\n manifestUri\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n \n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`lookupProfile`</h2>\n\nLook up a user's profile information by their BNS username.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"username\"} type={\"string\"}>\n\nThe BNS username of the user.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"network\"} type={\"'mainnet' | 'testnet' | 'devnet' | 'mocknet' | StacksNetwork\"}>\n\nDefines the network to connect to. Default is 'mainnet'.\n\n</Property>\n\n\n<Property required={false} deprecated={false} name={\"zoneFileLookupURL\"} type={\"string\"}>\n\nURL to fetch the zone file for the username. This is only needed if the zone file does not reside at the default location on the BNS network.\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"lookup\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"lookup\" className='tab group'>\n <Badge className='badge transition-colors'>Generate an authentication request</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"lookup\">\n ```tsx twoslash\n // @noErrors\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // ---cut---\n const authRequest = userSession.makeAuthRequest(\n // ^^^^^^^^^^^^^^^\n transitKey,\n redirectUri,\n manifestUri\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n \n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n \n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n</Root> */}\n\nThis library supports the creation of the following Stacks transaction types:\n\n1. STX token transfer\n2. Smart contract deploy\n3. Smart contract function call\n\n## Key Generation\n\n```typescript\nimport { createStacksPrivateKey, makeRandomPrivKey, getPublicKey } from '@stacks/transactions';\n\n// Random key\nconst privateKey = makeRandomPrivKey();\n// Get public key from private\nconst publicKey = getPublicKey(privateKey);\n\n// Private key from hex string\nconst key = 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01';\nconst privateKey = createStacksPrivateKey(key);\n```\n\n## STX Token Transfer Transaction\n\n```typescript\nimport { makeSTXTokenTransfer, broadcastTransaction, AnchorMode } from '@stacks/transactions';\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n memo: 'test memo',\n nonce: 0n, // set a nonce manually if you don't want builder to fetch from a Stacks node\n fee: 200n, // set a tx fee if you don't want the builder to estimate\n anchorMode: AnchorMode.Any,\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n\n// to see the raw serialized tx\nconst serializedTx = transaction.serialize(); // Uint8Array\nconst serializedTxHex = bytesToHex(serializedTx); // hex string\n\n// broadcasting transaction to the specified network\nconst broadcastResponse = await broadcastTransaction(transaction);\nconst txId = broadcastResponse.txid;\n```\n\n## Smart Contract Deploy Transaction\n\n```typescript\nimport { makeContractDeploy, broadcastTransaction, AnchorMode } from '@stacks/transactions';\nimport { StacksTestnet, StacksMainnet } from '@stacks/network';\nimport { readFileSync } from 'fs';\n\n// for mainnet, use `StacksMainnet()`\nconst network = new StacksTestnet();\n\nconst txOptions = {\n contractName: 'contract_name',\n codeBody: readFileSync('/path/to/contract.clar').toString(),\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network,\n anchorMode: AnchorMode.Any,\n};\n\nconst transaction = await makeContractDeploy(txOptions);\n\nconst broadcastResponse = await broadcastTransaction(transaction, network);\nconst txId = broadcastResponse.txid;\n```\n\n## Smart Contract Function Call\n\n```typescript\nimport {\n makeContractCall,\n broadcastTransaction,\n AnchorMode,\n FungibleConditionCode,\n makeStandardSTXPostCondition,\n bufferCVFromString,\n} from '@stacks/transactions';\nimport { StacksTestnet, StacksMainnet } from '@stacks/network';\n\n// for mainnet, use `StacksMainnet()`\nconst network = new StacksTestnet();\n\n// Add an optional post condition\n// See below for details on constructing post conditions\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 1000000n;\nconst postConditions = [\n makeStandardSTXPostCondition(postConditionAddress, postConditionCode, postConditionAmount),\n];\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [bufferCVFromString('foo')],\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n validateWithAbi: true,\n network,\n postConditions,\n anchorMode: AnchorMode.Any,\n};\n\nconst transaction = await makeContractCall(txOptions);\n\nconst broadcastResponse = await broadcastTransaction(transaction, network);\nconst txId = broadcastResponse.txid;\n```\n\nIn this example we construct a `contract-call` transaction with a post condition. We have set the `validateWithAbi` option to `true`, so the `makeContractCall` builder will attempt to fetch this contracts ABI from the specified Stacks network, and validate that the provided functionArgs match what is described in the ABI. This should help you avoid constructing invalid contract-call transactions. If you would prefer to provide your own ABI instead of fetching it from the network, the `validateWithABI` option also accepts [ClarityABI](https://github.com/blockstack/stacks-transactions-js/blob/master/src/contract-abi.ts#L231) objects, which can be constructed from ABI files like so:\n\n```typescript\nimport { ClarityAbi } from '@stacks/transactions';\nimport { readFileSync } from 'fs';\n\nconst abi: ClarityAbi = JSON.parse(readFileSync('abi.json').toString());\n// For sample abi json see: stacks.js/packages/transactions/tests/abi/test-abi.json\n```\n\n## Sponsoring Transactions\n\nTo generate a sponsored transaction, first create and sign the transaction as the origin. The `sponsored` property in the options object must be set to true.\n\n```typescript\nimport { bytesToHex } from '@stacks/common';\nimport { makeContractCall, BufferCV, AnchorMode, bufferCVFromString } from '@stacks/transactions';\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [bufferCVFromString('foo')],\n fee: 0,\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n validateWithAbi: true,\n sponsored: true,\n anchorMode: AnchorMode.Any,\n};\n\nconst transaction = await makeContractCall(txOptions);\nconst serializedTx = bytesToHex(transaction.serialize());\n```\n\nThe serialized transaction can now be passed to the sponsoring party which will sign the sponsor portion of the transaction and set the fee.\n\n```typescript\nimport {\n sponsorTransaction,\n BytesReader,\n deserializeTransaction,\n broadcastTransaction,\n} from '@stacks/transactions';\nimport { StacksTestnet, StacksMainnet } from '@stacks/network';\n\nconst bytesReader = new BytesReader(Buffer.from(serializedTx, 'hex'));\nconst deserializedTx = deserializeTransaction(bytesReader);\nconst sponsorKey = '770287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01';\nconst fee = 1000n;\n\nconst sponsorOptions = {\n transaction: deserializedTx,\n sponsorPrivateKey: sponsorKey,\n fee,\n sponsorNonce: 0,\n};\n\nconst sponsoredTx = await sponsorTransaction(sponsorOptions);\n\n// for mainnet, use `StacksMainnet()`\nconst network = new StacksTestnet();\n\nconst broadcastResponse = await broadcastTransaction(sponsoredTx, network);\nconst txId = broadcastResponse.txid;\n```\n\n## Supporting multi-signature transactions\n\nTo generate a multi-sig transaction, first create an unsigned transaction.\nThe `numSignatures` and `publicKeys` properties in the options object must be set:\n\n```typescript\nimport {\n makeUnsignedSTXTokenTransfer,\n createStacksPrivateKey,\n deserializeTransaction,\n pubKeyfromPrivKey,\n publicKeyToString,\n TransactionSigner,\n standardPrincipalCV,\n BytesReader,\n AnchorMode,\n} from '@stacks/transactions';\n\nconst recipient = standardPrincipalCV('SP3FGQ8...');\nconst amount = 2500000n;\nconst fee = 0n;\nconst memo = 'test memo';\n\n// private keys of the participants in the transaction\nconst privKeyStrings = ['6d430bb9...', '2a584d89...', 'd5200dee...'];\n\n// create private key objects from string array\nconst privKeys = privKeyStrings.map(createStacksPrivateKey);\n\n// corresponding public keys\nconst pubKeys = privKeyStrings.map(pubKeyfromPrivKey);\n\n// create public key string array from objects\nconst pubKeyStrings = pubKeys.map(publicKeyToString);\n\nconst transaction = await makeUnsignedSTXTokenTransfer({\n recipient,\n amount,\n fee,\n memo,\n numSignatures: 2, // number of signature required\n publicKeys: pubKeyStrings, // public key string array with >= numSignatures elements\n anchorMode: AnchorMode.Any,\n});\n\nconst serializedTx = transaction.serialize();\n```\n\nThis transaction payload can be passed along to other participants to sign. In addition to\nmeeting the numSignatures requirement, the public keys of the parties who did not sign the\ntransaction must be appended to the signature.\n\n```typescript\n// deserialize and sign transaction\nconst bytesReader = new BytesReader(serializedTx);\n// Partially signed or unsigned multi-sig tx can be deserialized to add the required signatures\nconst deserializedTx = deserializeTransaction(bytesReader);\n\nconst signer = new TransactionSigner(deserializedTx);\n\n// first signature\nsigner.signOrigin(privKeys[0]);\n\n// second signature\nsigner.signOrigin(privKeys[1]);\n\n// after meeting the numSignatures requirement, the public\n// keys of the participants who did not sign must be appended\nsigner.appendOrigin(pubKeys[2]);\n\n// the serialized multi-sig tx\nconst serializedSignedTx = deserializedTx.serialize();\n```\n\n## Calling Read-only Contract Functions\n\nRead-only contract functions can be called without generating or broadcasting a transaction. Instead it works via a direct API call to a Stacks node.\n\n```typescript\nimport { bufferCVFromString, callReadOnlyFunction } from '@stacks/transactions';\nimport { StacksTestnet } from '@stacks/network';\n\nconst contractAddress = 'ST3KC0MTNW34S1ZXD36JYKFD3JJMWA01M55DSJ4JE';\nconst contractName = 'kv-store';\nconst functionName = 'get-value';\nconst buffer = bufferCVFromString('foo');\nconst network = new StacksTestnet();\nconst senderAddress = 'ST2F4BK4GZH6YFBNHYDDGN4T1RKBA7DA1BJZPJEJJ';\n\nconst options = {\n contractAddress,\n contractName,\n functionName,\n functionArgs: [buffer],\n network,\n senderAddress,\n};\n\nconst result = await callReadOnlyFunction(options);\n```\n\n## Constructing Clarity Values\n\nBuilding transactions that call functions in deployed clarity contracts requires you to construct valid Clarity Values to pass to the function as arguments. The [Clarity type system](https://github.com/stacksgov/sips/blob/master/sip/sip-002-smart-contract-language.md#clarity-type-system) contains the following types:\n\n- `(tuple (key-name-0 key-type-0) (key-name-1 key-type-1) ...)` : a typed tuple with named fields.\n- `(list max-len entry-type)` : a list of maximum length max-len, with entries of type entry-type\n- `(response ok-type err-type)` : object used by public functions to commit their changes or abort. May be returned or used by other functions as well, however, only public functions have the commit/abort behavior.\n- `(optional some-type)` : an option type for objects that can either be (some value) or none\n- `(buff max-len)` : byte buffer or maximum length max-len.\n- `principal` : object representing a principal (whether a contract principal or standard principal).\n- `bool` : boolean value (`true` or `false`)\n- `int` : signed 128-bit integer\n- `uint`: unsigned 128-bit integer\n\nThis library contains Typescript types and classes that map to the Clarity types, in order to make it easy to construct well-typed Clarity values in Javascript. These types all extend the abstract class `ClarityValue`.\n\n```typescript\nimport {\n trueCV,\n falseCV,\n noneCV,\n someCV,\n intCV,\n uintCV,\n standardPrincipalCV,\n contractPrincipalCV,\n responseErrorCV,\n responseOkCV,\n listCV,\n tupleCV,\n bufferCV,\n} from '@stacks/transactions';\nimport { utf8ToBytes } from '@stacks/common';\n\n// construct boolean clarity values\nconst t = trueCV();\nconst f = falseCV();\n\n// construct optional clarity values\nconst nothing = noneCV();\nconst something = someCV(t);\n\n// construct a buffer clarity value from an existing byte array\nconst bytes = utf8ToBytes('foo'); // Uint8Array(3) [ 102, 111, 111 ]\nconst bufCV = bufferCV(bytes);\n\n// construct signed and unsigned integer clarity values\nconst i = intCV(-10);\nconst u = uintCV(10);\n\n// construct principal clarity values\nconst address = 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B';\nconst contractName = 'contract-name';\nconst spCV = standardPrincipalCV(address);\nconst cpCV = contractPrincipalCV(address, contractName);\n\n// construct response clarity values\nconst errCV = responseErrorCV(trueCV());\nconst okCV = responseOkCV(falseCV());\n\n// construct tuple clarity values\nconst tupCV = tupleCV({\n a: intCV(1),\n b: trueCV(),\n c: falseCV(),\n});\n\n// construct list clarity values\nconst l = listCV([trueCV(), falseCV()]);\n```\n\nIf you develop in Typescript, the type checker can help prevent you from creating wrongly-typed Clarity values. For example, the following code won't compile since in Clarity lists are homogeneous, meaning they can only contain values of a single type. It is important to include the type variable `BooleanCV` in this example, otherwise the typescript type checker won't know which type the list is of and won't enforce homogeneity.\n\n```typescript\nconst l = listCV<BooleanCV>([trueCV(), intCV(1)]);\n```\n\n## Post Conditions\n\nThree types of post conditions can be added to transactions:\n\n1. STX post condition\n2. Fungible token post condition\n3. Non-Fungible token post condition\n\nFor details see: https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-post-conditions\n\n## STX post condition\n\n```typescript\nimport {\n FungibleConditionCode,\n makeStandardSTXPostCondition,\n makeContractSTXPostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\n\nconst standardSTXPostCondition = makeStandardSTXPostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractSTXPostCondition = makeContractSTXPostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount\n);\n```\n\n## Fungible token post condition\n\n```typescript\nimport {\n FungibleConditionCode,\n createAssetInfo,\n makeStandardFungiblePostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardFungiblePostCondition = makeStandardFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst contractFungiblePostCondition = makeContractFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n```\n\n## Non-fungible token post condition\n\n> **Warning**\n> The Stacks blockchain's post-condition processor can NOT check ownership.\n> It checks whether or not a principal **will send** or **will not send** an NFT.\n> Post-conditions can NOT verify anything about the recipient of an asset.\n> If you want to verify conditions about asset recipients, you will need to use [Clarity](https://docs.stacks.co/docs/write-smart-contracts/).\n\n```typescript\nimport {\n NonFungibleConditionCode,\n createAssetInfo,\n makeStandardNonFungiblePostCondition,\n makeContractNonFungiblePostCondition,\n bufferCVFromString,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = NonFungibleConditionCode.DoesNotSend;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-asset';\nconst assetId = bufferCVFromString('test-token-asset-id');\nconst nonFungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardNonFungiblePostCondition = makeStandardNonFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractNonFungiblePostCondition = makeContractNonFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n```\n\n## Conversion of Clarity Values to JSON\n\nClarity Values represent values of Clarity contracts. If a JSON format is required the helper function `cvToJSON` can be used.\n\n```typescript\nimport { cvToJSON, hexToCV } from '@stacks/transactions';\n\ncvToJSON(hexToCV(tx.tx_result.hex));\n```" + }, + { + "title": "@stacks/network", + "description": "Network and API library for working with Stacks blockchain nodes.", + "slug": "/stacks/stacks.js/v6/network", + "content": "\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\nThe Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a UserSession to manage user data.\n\n## Installation\n\n```package-install\n@stacks/network\n```\n\n{/* <Root>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`AppConfig`</h2>\n\nConfiguration data for the current app.\n\nOn browser platforms, creating an instance of this class without any arguments will use `window.location.origin` as the app domain. On non-browser platforms, you need to specify an app domain as the second argument.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"scopes\"} type={\"string[]\"}>\n\nAn array of strings representing permissions requested by the app.\n\n<span>Default: `['store_write']`</span>\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"appDomain\"} type={\"string\"}>\n\nStacks apps are uniquely identified by their app domain.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"redirectPath\"} type={\"string\"}>\n\nPath on app domain to redirect users to after authentication. The authentication response token will be postpended in a query.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"manifestPath\"} type={\"string\"}>\n\nPath relative to app domain of app's manifest file.\n\n<span>Default: `\"/manifest.json\"`</span>\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"coreNode\"} type={\"string\"}>\n\nThe URL of Stacks core node to use for this app. If this is not specified, the default core node will be used.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"authenticatorURL\"} type={\"string\"}>\n\nThe URL of a web-based authenticator to use in the event the user doesn't have Stacks installed on their machine. If this is not specified, the current default in this library will be used.\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"config\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"config\" className='tab group'>\n <Badge className='badge transition-colors'>Setting basic app permissions</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>With advanced scopes</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"config\">\n ```tsx twoslash\n // @noErrors\n // [!code word:AppConfig]\n import { AppConfig } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n const appConfig = new AppConfig(\n ['store_write'],\n appDomain\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n\n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```tsx twoslash\n // @noErrors\n // [!code word:publish_data]\n // [!code word:email]\n import { AppConfig } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n const appConfig = new AppConfig(\n ['store_write', 'publish_data', 'email'],\n appDomain\n );\n ```\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n\n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`UserSession`</h2>\n\nRepresents an instance of a signed in user for a particular app.\n\n## Functions\n\n<Property required={false} deprecated={false} name={\"isSignInPending\"} type={\"function\"}>\n\nDetermines if there is an incoming authentication response.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"handlePendingSignIn\"} type={\"function\"}>\n\nProcesses the response and provides a `userData` object containing the user's identity, BNS username and profile information.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"isUserSignedIn\"} type={\"function\"}>\n\nChecks if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"loadUserData\"} type={\"function\"}>\n\nRetrieves the user's profile data if the user is already authenticated.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"encryptContent\"} type={\"function\"}>\n\nEncrypts user data for secure storage.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"decryptContent\"} type={\"function\"}>\n\nDecrypts user data for secure storage.\n\n</Property>\n\n</div>\n\n<APIExample>\n<Tabs defaultValue=\"pending\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"pending\" className='tab group'>\n <Badge className='badge transition-colors'>Handling pending auth</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"status\" className='tab group'>\n <Badge className='badge transition-colors'>Checking if user is signed in</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"user-data\" className='tab group'>\n <Badge className='badge transition-colors'>Loading data for signed in user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"sign-out\" className='tab group'>\n <Badge className='badge transition-colors'>Signing out a user</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"encrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Encrypting user data</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"decrypt\" className='tab group'>\n <Badge className='badge transition-colors'>Decrypting user data</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"pending\">\n ```tsx twoslash\n // @noErrors\n // [!code word:isSignInPending]\n // [!code word:handlePendingSignIn]\n const isPending = userSession.isSignInPending();\n\n if (isPending) {\n userSession.handlePendingSignIn().then(userData => {\n // Do something with userData\n });\n }\n ```\n </TabsContent>\n <TabsContent value='status'>\n ```tsx twoslash\n // @noErrors\n // [!code word:isUserSignedIn]\n const isSignedIn = userSession.isUserSignedIn();\n ```\n </TabsContent>\n <TabsContent value='user-data'>\n ```tsx twoslash\n // @noErrors\n // [!code word:loadUserData]\n const isSignedIn = userSession.isUserSignedIn();\n\n if (isSignedIn) {\n // Do something with the signed in user\n const userData = userSession.loadUserData();\n }\n ```\n </TabsContent>\n <TabsContent value='sign-out'>\n ```tsx twoslash\n // @noErrors\n // [!code word:signUserOut]\n userSession.signUserOut();\n ```\n </TabsContent>\n <TabsContent value='encrypt'>\n ```tsx twoslash\n // @noErrors\n // [!code word:encryptContent]\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n ```\n </TabsContent>\n <TabsContent value='decrypt'>\n ```tsx twoslash\n // @noErrors\n // [!code word:decryptContent]\n const message = 'My secret message';\n\n const cipherText = await userSession.encryptContent(message);\n const plainText = await userSession.decryptContent(cipherText);\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n\n<Accordion title={\"Notes\"}>\n Note that encryption here uses the user's private key associated with your app only. If you need to share this data with another app or other users, you should use the equivalent methods from `@stacks/encryption` and provide a custom private key.\n</Accordion>\n\n</Accordions>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`makeAuthRequest`</h2>\n\nThe Stacks authentication process enables secure user sign-in for web apps by generating and handling encrypted authentication requests. It involves setting up an app domain, configuring permissions, and creating a UserSession to manage user data.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"transitKey\"} type={\"string\"}>\n\nThe authentication payloads are encrypted during transit, the encryption key generated below provides this.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"redirectURI\"} type={\"string\"}>\n\nA URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"manifestUri\"} type={\"string\"}>\n\nSet the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"scopes\"} type={\"string[]\"}>\n\nAdditional permissions the app is requesting.\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"auth-request\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"auth-request\" className='tab group'>\n <Badge className='badge transition-colors'>Generate an authentication request</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"auth-request\">\n ```tsx twoslash\n // @noErrors\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // ---cut---\n const authRequest = userSession.makeAuthRequest(\n // ^^^^^^^^^^^^^^^\n transitKey,\n redirectUri,\n manifestUri\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n\n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`lookupProfile`</h2>\n\nLook up a user's profile information by their BNS username.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"username\"} type={\"string\"}>\n\nThe BNS username of the user.\n\n</Property>\n\n<Property required={false} deprecated={false} name={\"network\"} type={\"'mainnet' | 'testnet' | 'devnet' | 'mocknet' | StacksNetwork\"}>\n\nDefines the network to connect to. Default is 'mainnet'.\n\n</Property>\n\n\n<Property required={false} deprecated={false} name={\"zoneFileLookupURL\"} type={\"string\"}>\n\nURL to fetch the zone file for the username. This is only needed if the zone file does not reside at the default location on the BNS network.\n\n</Property>\n\n</div>\n\n<APIExample>\n\n<Tabs defaultValue=\"lookup\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"lookup\" className='tab group'>\n <Badge className='badge transition-colors'>Generate an authentication request</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"lookup\">\n ```tsx twoslash\n // @noErrors\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // ---cut---\n const authRequest = userSession.makeAuthRequest(\n // ^^^^^^^^^^^^^^^\n transitKey,\n redirectUri,\n manifestUri\n );\n ```\n\n <Accordions>\n\n <Accordion title={\"Full Code Sample\"}>\n ```tsx twoslash\n import {\n UserSession,\n makeAuthRequest,\n AppConfig\n } from '@stacks/auth';\n\n const appDomain = 'https://www.myapp.com';\n\n const appConfig = new AppConfig(['store_write'], appDomain);\n const userSession = new UserSession({ appConfig });\n\n // The authentication payloads are encrypted during transit, the encryption key generated below provides this\n const transitKey = userSession.generateAndStoreTransitKey();\n\n // The Stacks auth process will open a compatible Stacks authenticator or browser extension to perform the authentication. So you will need to provide a redirect URL which the authenticator or extension can redirect to with the authentication payload. This page should process the authentication payload.\n const redirectUri = 'https://www.myapp.com/auth';\n\n // Set the location of your app manifest file. This file contains information about your app that is shown to the user during authentication.\n const manifestUri = 'https://www.myapp.com/manifest.json';\n\n // Generate the authentication request payload\n const authRequest = userSession.makeAuthRequest(\n transitKey,\n redirectUri,\n manifestUri\n );\n\n ```\n </Accordion>\n\n </Accordions>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n</Root> */}\n\n\n## Usage\n\n## Create a Stacks mainnet, testnet or mocknet network\n\n```typescript\nimport { StacksMainnet, StacksTestnet, StacksMocknet } from '@stacks/network';\n\nconst network = new StacksMainnet();\n\nconst testnet = new StacksTestnet();\n\nconst mocknet = new StacksMocknet();\n```\n\n## Set a custom node URL\n\n```typescript\nconst network = new StacksMainnet({ url: 'https://www.mystacksnode.com/' });\n```\n\n## Check if network is mainnet\n\n```typescript\nconst isMainnet = network.isMainnet();\n```\n\n## Network usage in transaction building\n\n```typescript\nimport { makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst txOptions = {\n network,\n recipient: 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26',\n amount: new BigNum(12345),\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n```\n\n## Use the built-in API key middleware\n\nSome Stacks APIs make use API keys to provide less rate-limited plans.\n\n```typescript\nimport { createApiKeyMiddleware, createFetchFn, StacksMainnet } from '@stacks/network';\nimport { broadcastTransaction, getNonce, makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst myApiMiddleware = createApiKeyMiddleware('example_e8e044a3_41d8b0fe_3dd3988ef302');\nconst myFetchFn = createFetchFn(myApiMiddleware); // middlewares can be used to create a new fetch function\nconst myMainnet = new StacksMainnet({ fetchFn: myFetchFn }); // the fetchFn options can be passed to a StacksNetwork to override the default fetch function\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n memo: 'some memo',\n anchorMode: AnchorMode.Any,\n network: myMainnet, // make sure to pass in the custom network object\n};\nconst transaction = await makeSTXTokenTransfer(txOptions); // fee-estimation will use the custom fetchFn\n\nconst response = await broadcastTransaction(transaction, myMainnet); // make sure to broadcast via the custom network object\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', myMainnet);\n```\n\n## Use custom middleware\n\nMiddleware can be used to hook into network calls before sending a request or after receiving a response.\n\n```typescript\nimport { createFetchFn, RequestContext, ResponseContext, StacksTestnet } from '@stacks/network';\nimport { broadcastTransaction, getNonce, makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst preMiddleware = (ctx: RequestContext) => {\n ctx.init.headers = new Headers();\n ctx.init.headers.set('x-foo', 'bar'); // override headers and set new `x-foo` header\n};\nconst postMiddleware = (ctx: ResponseContext) => {\n console.log(await ctx.response.json()); // log response body as json\n};\n\nconst fetchFn = createFetchFn({ pre: preMiddleware, post: preMiddleware }); // a middleware can contain `pre`, `post`, or both\nconst network = new StacksTestnet({ fetchFn });\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', network);\n```\n\n## Get various API URLs\n\n```typescript\nconst txBroadcastUrl = network.getBroadcastApiUrl();\n\nconst feeEstimateUrl = network.getTransferFeeEstimateApiUrl();\n\nconst address = 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26';\nconst accountInfoUrl = network.getAccountApiUrl(address);\n\nconst contractName = 'hello_world';\nconst abiUrl = network.getAbiApiUrl(address, contractName);\n\nconst functionName = 'hello';\nconst readOnlyFunctionCallUrl = network.getReadOnlyFunctionCallApiUrl(\n address,\n contractName,\n functionName\n);\n\nconst nodeInfoUrl = network.getInfoUrl();\n\nconst blockTimeUrl = network.getBlockTimeInfoUrl();\n\nconst poxInfoUrl = network.getPoxInfoUrl();\n```\n" + }, + { + "title": "Overview", + "description": "A collection of JavaScript libraries to build web applications on Stacks.", + "slug": "/stacks/stacks.js/index", + "content": "\nimport { Globe } from 'lucide-react';\nimport { Card, SecondaryCard } from '@/components/card';\n\nStacks.js is a JavaScript/TypeScript SDK for building on the Stacks blockchain. It's a collection of various JavaScript libraries that allow you to broadcast a transaction with the Stacks blockchain, construct post-conditions, and more. Some of the most important building blocks, all in one place.\n\nStacks.js is separated into many smaller packages, which can be installed individually. Most packages are published to npm under the `@stacks` scope.\n\nFor more details, check out out our [installation guide](./stacks.js/installation).\n\n<SecondaryCard\n icon={<Globe/>}\n href=\"/stacks/connect\"\n title=\"Build a Stacks web app\"\n description=\"Integrate Stacks.js into your web apps with Stacks Connect.\"\n tag=\"Stacks Connect\"\n/>\n\n## Guides\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/stacks.js/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Create and broadcast transactions using Stacks.js builder and helper functions.\"\n />\n <SecondaryCard\n href=\"/stacks/stacks.js/guides/post-conditions\"\n title=\"Constructing post-conditions\"\n description=\"Build post-conditions into your smart contracts and safe-guard your users.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks Connect](/stacks/connect)**: Interact with the Stacks blockchain with your wallet extension.\n- **[Hiro Platform](/stacks/platform)**: A developer platform for building, deploying and scaling Bitcoin apps.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Stacks.js?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#stacks-js</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n" + }, + { + "title": "Announcing Stacks.js v7", + "description": "Discover the future of Stacks.js.", + "slug": "/stacks/stacks.js/roadmap", + "content": "\nRead about what's new in the latest version of Stacks.js.\nThis version comes with a lot of improvements and new features, but it also adds some breaking changes.\n\nWant to use these latest features? Install packages using the `latest` tag:\n\n```package-install\n@stacks/{common,network,transactions}@latest\n```\n\n### Strings\n_aka, reducing wrapper types and magic numbers_\n\n<img src=\"/string-meme.png\" className=\"max-w-[300px] mx-auto\" alt=\"String Meme\" />\n\n#### Problem\n\nMany Stacks.js representations we're not debuggable for developers.\nLogging Clarity values resulted in unintelligible `type` and `value` numbers, confusing even experienced Stacks developers.\nPrivate keys were also included unnecessary `type` properties with raw byte arrays.\n\"Magic\" numbers are all accross the codebase (as they are needed for serialization), but these shouldn't be part of the \"public\" interfaces.\n\n#### Solution\n\nWe switched to a system where most values will be represented as strings.\nThis makes them easier to inspect and diff.\n\nClarity example, [Read more](#clarity-representation)\n```ts\n// !diff -\n{ type: 1, value: 12n }\n// !diff +\n{ type: \"uint\", value: \"12\" }\n```\n\nPrivate key example, [Read more](/stacks/stacks.js/concepts/private-keys)\n```ts\nsignMessageHashRsv({\n // !diff -\n privateKey: createStacksPrivateKey(\"f5a3...2801\"), // { compressed: true, data: [245,163,...] }\n // !diff +\n privateKey: \"f5a3...2801\"\n})\n```\n\nThis breaks the signatures of many functions:\n\n- `signMessageHashRsv`, `signWithKey` now return the message signature as a `string` directly.\n- `nextSignature`, `nextVerification`, `publicKeyFromSignatureVrs`, `publicKeyFromSignatureRsv` now take in the message signature as a `string`.\n\n### Stacks Network\n\nFor a long time, Stacks.js \"network\" instances were used for \"networking\" and \"network\" definitions.\nThis caused confusion, as most users use `mainnet` or `testnet` for most of their interactions.\nThe \"networking\" (aka fetching) logic is now more clearly customizable.\n\nFrom now on \"network\" objects are static (aka constants) and don't require instantiation.\n\nThese changes should make it more obvious when functions are using network object properties vs when they are doing actual networking.\n\nIn most cases, developers shouldn't need the `@stacks/network` package anymore.\nThe `network` parameter can be used with string literals: `'mainnet'`, `'testnet'`, `'devnet'`, `'mocknet'`.\n\n```ts\nimport { StacksTestnet } from '@stacks/network';\n\nmakeSTXTokenTransfer({\n // !diff -\n network: new StacksTestnet(),\n // !diff +\n network: 'testnet'\n // ...\n});\n```\n\n\n#### Stacks Network `client`\n\nIn case a function also takes a `client` parameter, it will be doing actual networking.\nThis way you can use string literal networks with a custom node.\nYou can also still use network objects with the `client` parameter as part of the network object.\nThe `client` parameter can be any object-like structure containing a `baseUrl` and `fetch` property.\n\n- The `baseUrl` property should be a string containing the base URL of the Stacks node you want to use.\n- The `fetch` property can be any (fetch)[https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API] compatible function.\n\nThe following diffs show examples of how to migrate to the new pattern.\n\n```ts\nconst transaction = await makeSTXTokenTransfer({\n// !diff - \nnetwork: new StacksTestnet({ url: \"mynode-optional.com\", fetchFn: myFetch }),\n// !diff +\nnetwork: 'testnet', // optional, defaults to 'mainnet'\n// !diff +\nclient: { baseUrl: \"mynode-optional.com\", fetch: myFetchOptional } // optional, defaults inferred from network\n});\n```\n\nThe `client` property is also part of the network object.\nYou can still keep ONE single network object for your whole application.\n\n```ts\n// !diff -\nimport { StacksTestnet } from '@stacks/network';\n// !diff +\nimport { STACKS_TESTNET } from '@stacks/network';\n\n// !diff -\nconst network = new StacksTestnet({ url: \"https://mynode.com\", fetchFn: myFetch });\n// !diff +\nconst network = {\n // !diff +\n ...STACKS_TESTNET, // extending a static object\n // !diff +\n client: { baseUrl: \"https://mynode.com\", fetch: myFetch }\n // !diff +\n};\n```\n\n### A To B Helpers\n\nWhere possible, Stacks.js now offers function to translate between different representations and concepts.\nThe naming is consistent across the board and uses `A To B` naming.\nFor example, if we have a private key and want to get the address, we can use the `privateKeyToAddress` function.\n\n```ts\nimport { privateKeyToAddress } from \"@stacks/transactions\";\n\nconst privateKey = \"f5a3...2801\";\nconst address = privateKeyToAddress(privateKey); // SP1MXSZF4NFC8JQ1TTYGEC2WADMC7Y3GHVZYRX6RF\n```\n\n### Fetch Methods\n\nTo make it easier to discover all fetching functions, they now all start with `fetch`.\n\nThe following methods were renamed:\n\n- `estimateFee` → `fetchFeeEstimate`\n- `estimateTransfer` → `fetchFeeEstimateTransfer`\n- `estimateTransaction` → `fetchFeeEstimateTransaction`\n- `getAbi` → `fetchAbi`\n- `getNonce` → `fetchNonce`\n- `getContractMapEntry` → `fetchContractMapEntry`\n- `callReadOnlyFunction` → `fetchCallReadOnlyFunction`\n\n`broadcastTransaction` wasn't renamed to highlight the uniqueness of the method.\nNamely, the node/API it is sent to will \"broadcast\" the transaction to the mempool and is more of an irreversible action.\n\n### Clarity Representation\n\nThe `ClarityType` enum was replaced by a more readable version.\nThe previous (wire format compatible) enum is still available as `ClarityWireType`.\nThese types are considered somewhat internal and shouldn't cause breaking changes for most use-cases.\n\nThe property holding the value of the data type is now called `value` in all cases.\nPreviously, there was a mix of `value`, `list`, `buffer` etc.\nFor `bigint` values, the type of the `value` property is a now `string`, for better serialization compatibility.\n\n```ts\n{\n // !diff -\n type: 1,\n // !diff +\n type: \"uint\",\n // !diff -\n value: 12n,\n // !diff +\n value: \"12\",\n}\n```\n\n```ts\n{\n // !diff -\n type: 11,\n // !diff +\n type: \"list\",\n // !diff -\n list: [ ... ],\n // !diff +\n value: [ ... ],\n}\n```\n\n### Post-conditions\n\nThe old `PostCondition` type was renamed to `PostConditionWire`.\nA new human-readable `PostCondition` type was introduced in its place.\n\nBelow is an example of the new `PostCondition` types.\n\n```ts\n// STX post-condition\nconst stxPostCondition: StxPostCondition = {\n type: 'stx-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'gte',\n amount: '100',\n};\n\n// Fungible token post-condition\nconst ftPostCondition: FungiblePostCondition = {\n type: 'ft-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'eq',\n amount: '100',\n asset: 'SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-ft-token::my-token',\n};\n\n// Non-fungible token post-condition\nconst nftPostCondition: NonFungiblePostCondition = {\n type: 'nft-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'sent',\n asset: 'SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-nft::my-asset',\n assetId: Cl.uint(602),\n};\n```\n\n### Advanced\n\n#### serialize methods\n\nExisting methods now take or return **hex-encoded strings** _instead_ of `Uint8Array`s.\n\n> If you were already converting returned bytes to hex-strings in your code, you can now skip the conversion step — hex-strings are the new default.\n\nFor easier migrating, renaming the following methods is possible to keep the previous behavior:\n\n- `StacksTransaction.serialize` → `StacksTransaction.serializeBytes`\n- `serializeCV` → `serializeCVBytes`\n- `serializeAddress` → `serializeAddressBytes`\n- `deserializeAddress` → `deserializeAddressBytes`\n- `serializeLPList` → `serializeLPListBytes`\n- `deserializeLPList` → `deserializeLPListBytes`\n- `serializeLPString` → `serializeLPStringBytes`\n- `deserializeLPString` → `deserializeLPStringBytes`\n- `serializePayload` → `serializePayloadBytes`\n- `deserializePayload` → `deserializePayloadBytes`\n- `serializePublicKey` → `serializePublicKeyBytes`\n- `deserializePublicKey` → `deserializePublicKeyBytes`\n- `serializeStacksMessage` → `serializeStacksMessageBytes`\n- `deserializeStacksMessage` → `deserializeStacksMessageBytes`\n- `serializeMemoString` → `serializeMemoStringBytes`\n- `deserializeMemoString` → `deserializeMemoStringBytes`\n- `serializeTransactionAuthField` → `serializeTransactionAuthFieldBytes`\n- `deserializeTransactionAuthField` → `deserializeTransactionAuthFieldBytes`\n- `serializeMessageSignature` → `serializeMessageSignatureBytes`\n- `deserializeMessageSignature` → `deserializeMessageSignatureBytes`\n- `serializePostCondition` → `serializePostConditionBytes`\n- `deserializePostCondition` → `deserializePostConditionBytes`\n- `serializeStacksMessage` → `serializeStacksWireBytes`\n- `deserializeStacksMessage` → `deserializeStacksWireBytes`\n\n#### Asset Helper Methods\n\nThe following interfaces and methods were renamed:\n\n- `AssetInfo` → `Asset`\n- `StacksWireType.AssetInfo` → `StacksWireType.Asset`\n- `createAssetInfo` → `createAsset`\n- `parseAssetInfoString` → `parseAssetString`\n\n#### CLI\n\n- Removed the `authenticator` method for legacy Blockstack authentication.\n\n#### Triplesec\n\nSupport for encrypting/decrypting mnemonics with `triplesec` was removed.\nThis impacts the methods: `decrypt`, `decryptMnemonic`, and `decryptLegacy`.\nMake sure to update your code to if mnemonics are stored somewhere encrypted using the legacy method.\n\n#### WireType\n\nRenamed internals to avoid confusion between \"message\" and wire-format for serialization.\nThis is only used for advanced serialization use-cases internally and should not be needed for most users.\n\n- `StacksMessage` → `StacksWire`\n- `StacksMessageType` → `StacksWireType`\n- `serializeStacksMessage` → `serializeStacksWireBytes`\n- `deserializeStacksMessage` → `deserializeStacksWireBytes`\n\nMore types were renamed to indicate use for serialization to _wire-format_:\n\n- `MessageSignature` → `MessageSignatureWire`\n- `StacksPublicKey` → `PublicKeyWire`\n- `TransactionAuthField` → `TransactionAuthFieldWire`\n- `Asset` → `AssetWire`\n- `Address` → `AddressWire`\n- `PostCondition` → `PostConditionWire`\n- `PostConditionPrincipal` → `PostConditionPrincipalWire`\n- `STXPostCondition` → `STXPostConditionWire`\n- `FungiblePostCondition` → `FungiblePostConditionWire`\n- `NonFungiblePostCondition` → `NonFungiblePostConditionWire`\n- `LengthPrefixedString` → `LengthPrefixedStringWire`\n- `CoinbasePayload` → `CoinbasePayloadWire`\n- `PoisonPayload` → `PoisonPayloadWire`\n- `SmartContractPayload` → `SmartContractPayloadWire`\n- `TokenTransferPayload` → `TokenTransferPayloadWire`\n- `VersionedSmartContractPayload` → `VersionedSmartContractPayloadWire`\n- `NakamotoCoinbasePayload` → `NakamotoCoinbasePayloadWire`\n- `TenureChangePayload` → `TenureChangePayloadWire`\n- `StandardPrincipal` → `StandardPrincipalWire`\n- `ContractPrincipal` → `ContractPrincipalWire`\n\n#### Signed BigInt\n\nThe `intToBigInt` method no longer supports two's complement signed integers and removed the `signed` boolean parameter.\nThis likely was a misunderstood and unused feature.\n\n#### Refactorings\n\n- `AddressHashMode`: The `Serialize` prefixes were removed for brevity.\n- `makeRandomPrivKey` was renamed to `randomPrivateKey` and now returns a compressed private key.\n- `generateSecretKey` was renamed to `randomSeedPhrase`.\n\n<Callout>\n**Have an idea?** Please let us know on [Discord #stacks-js](https://stacks.chat) or open an issue on [Github](https://github.com/hirosystems/stacks.js/issues/new/choose).\n</Callout>\n" + }, + { + "title": "Broadcast transactions", + "description": "Create and broadcast transactions to the Stacks blockchain network using Stacks.js.", + "slug": "/stacks/stacks.js/examples/broadcast-transactions", + "content": "\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nThe process of broadcasting transactions is fundamental for interacting with blockchains, whether you're transferring tokens, deploying contracts, or executing contract functions.\n\nIn this guide, you will learn how to:\n\n1. [Install the necessary packages for building and broadcasting transactions](#setup-and-installation)\n2. [Build different types of transactions](#create-a-transaction)\n3. [Sign and broadcast those transactions to the Stacks blockchain](#broadcasting-the-transaction)\n4. [Process and handle the results](#handle-the-results)\n\n{/* <Callout title=\"Example Repo\">To see this guide in action, check out a full example [here](https://github.com/hiro-so/stacks-connect-example).</Callout> */}\n\n---\n\n## Setup and installation\n\nInstall the required packages to start building and broadcasting transactions.\n\n```package-install\n@stacks/network @stacks/transactions @stacks/connect\n```\n\n- **`@stacks/network`**: Used to interact with the Stacks blockchain network.\n- **`@stacks/transactions`**: Used to build the transactions.\n- **`@stacks/connect`**: Used to authenticate users and broadcast the transactions.\n\n## Create a transaction\n\nThere are three types of transactions:\n\n- STX transfer\n- Contract deployment\n- Contract execution\n\n<Tabs defaultValue=\"transfer\">\n <TabsList className='flex flex-wrap md:w-max'>\n <TabsTrigger value=\"transfer\" className='tab group'>\n <Badge variant='outline' className='badge transition-colors hover:text-neutral-90 dark:group-hover:text-white'>STX transfer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"deploy\" className='tab group'>\n <Badge variant='outline' className='badge transition-colors hover:text-neutral-90 dark:group-hover:text-white'>Contract deployment</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"execute\" className='tab group'>\n <Badge variant='outline' className='badge transition-colors hover:text-neutral-90 dark:group-hover:text-white'>Contract execution</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"transfer\">\n To transfer STX, use the `makeSTXTokenTransfer` function provided by the `@stacks/transactions` package:\n\n ```ts stx-transfer.ts -cn\n import { broadcastTransaction, makeSTXTokenTransfer } from \"@stacks/transactions\";\n\n const transaction = await makeSTXTokenTransfer({\n recipient: \"SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159\",\n amount: 12345n,\n senderKey:\n \"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601\",\n network: \"devnet\",\n });\n ```\n\n This builds a STX token transfer transaction. The `makeSTXTokenTransfer` function takes parameters like the `recipient` address, `amount` to transfer, and the sender's private key, ie `senderKey`.\n\n Several parameters are available for calling `makeSTXTokenTransfer`. To learn more, check out our [transactions reference page](/stacks/stacks.js/packages/transactions).\n\n </TabsContent>\n <TabsContent value=\"deploy\">\n To deploy a contract, use the `makeContractDeploy` function provided by the `@stacks/transactions` package:\n\n ```ts contract-deploy.ts -cn\n import { broadcastTransaction, makeContractDeploy } from '@stacks/transactions';\n\n const transaction = await makeContractDeploy({\n contractName: 'hello-world',\n codeBody: `(define-public (hello)\n (ok \"Hello, world!\"))`,\n senderKey: '753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601',\n network: \"testnet\",\n });\n ```\n\n This builds a contract deployment transaction. The `makeContractDeploy` function takes parameters like the `contractName`, `codeBody`, and the sender's private key, ie `senderKey`.\n\n Several parameters are available for calling `makeContractDeploy`. To learn more, check out our [transactions reference page](/stacks/stacks.js/packages/transactions).\n\n </TabsContent>\n <TabsContent value=\"execute\">\n To execute a contract function, use the `makeContractCall` function provided by the `@stacks/transactions` package:\n\n ```ts function-call.ts -cn\n import {\n broadcastTransaction,\n bufferCVFromString,\n Cl,\n makeContractCall,\n Pc,\n } from \"@stacks/transactions\";\n\n const postCondition = Pc.principal(\"SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE\")\n .willSendEq(1000000n)\n .ustx();\n\n const transaction = await makeContractCall({\n contractAddress: \"SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X\",\n contractName: \"contract_name\",\n functionName: \"contract_function\",\n functionArgs: [Cl.bufferFromAscii(\"foo\")],\n senderKey:\n \"b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01\",\n validateWithAbi: true,\n network: \"testnet\",\n postConditions: [postCondition],\n });\n ```\n\n This builds a contract function call transaction. The `makeContractCall` function takes parameters like the `contractAddress`, `contractName`, `functionName`, `functionArgs`, `senderKey`, `validateWithAbi`, `network`, `postConditions`, and `anchorMode`.\n\n Several parameters are available for calling `makeContractCall`. To learn more, check out our [transactions reference page](/stacks/stacks.js/packages/transactions).\n\n </TabsContent>\n</Tabs>\n\n## Broadcasting the transaction\n\nAfter building the transaction, broadcast it to the Stacks blockchain network using the `broadcastTransaction` function from the `@stacks/transactions` package.\n\n1. Pass in the transaction object you created in the previous step to the `broadcastTransaction` function.\n2. Handle the response by logging the response object.\n\n```ts -cn\nimport { broadcastTransaction } from '@stacks/transactions';\n\nconst broadcastResponse = await broadcastTransaction({ transaction });\n```\n\nThis code sends the signed transaction to the Stacks blockchain. The `broadcastTransaction` function returns a response containing the transaction ID, which can be used to track the transaction on the blockchain.\n\n## Handle the results\n\nHandle the transaction results by checking the transaction status and responding accordingly.\n\n```ts -cn\nif (broadcastResponse.success) {\n console.log('Transaction successful with ID:', broadcastResponse.txid);\n} else {\n console.error('Transaction failed with error:', broadcastResponse.error);\n}\n```\n\nThis checks if the transaction was successful and logs the `txid`.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/stacks.js/guides/post-conditions\"\n title=\"Deep dive into post-conditions\"\n description=\"Learn how to use post-conditions to secure your smart contracts.\"\n />\n <Card\n href=\"/stacks/stacks.js/packages/transactions\"\n title=\"API References\"\n description=\"Dive into the API references for Stacks.js.\"\n />\n</Cards>" + }, + { + "title": "Deep dive into post-conditions", + "description": "This guide explains how to use post-conditions to secure your smart contracts.", + "slug": "/stacks/stacks.js/examples/post-conditions", + "content": "\nimport { Badge } from '@/components/ui/badge';\n\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nPost-conditions in Stacks transactions provide an additional layer of security. They ensure that transactions execute as expected without requiring the user to know the underlying smart contract code.\n\nIn this guide, you will learn how to:\n\n1. [Construct post-conditions](#constructing-post-conditions).\n2. [Use post-conditions](#using-post-conditions).\n3. [Set the post-condition mode](#setting-the-post-condition-mode).\n4. [Usage examples](#usage-examples).\n\n---\n\n## Constructing post-conditions\n\nIn Stacks.js, post-conditions can be constructed using the Pc helpers. These are inspired by Behavior Driven Development (BDD).\n\nStart with the `Pc.principal` initializer to specify the address of the principal that will be verified in the post-condition. Then auto-complete the rest of the post-condition.\n\n## Using post-conditions\n\nPost-conditions can be added to contract calls and FT/NFT transfers to ensure assets are transferred as specified.\n\nFor instance, the following post-condition ensures that the principal initiating the transaction must send exactly 1000 uSTX, or else the transaction will abort.\n\n```ts -cn\nimport { Pc } from '@stacks/transactions';\n\nconst postCondition = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')\n .willSendEq(1000)\n .ustx();\n```\n\n<Accordions>\n <Accordion title=\"All transfer methods\">\n STX/FT\n\n `.willSendEq(amount: number)` ensures that the amount to be sent is **exactly** the specified value.\n \n `.willSendGte(amount: number)` ensures that the amount to be sent is **greater than or equal** to the specified value.\n \n `.willSendGt(amount: number)` ensures that the amount to be sent is **greater than** the specified value.\n \n `.willSendLte(amount: number)` ensures that the amount to be sent is **less than or equal** to the specified value.\n \n `.willSendLt(amount: number)` ensures that the amount to be sent is **less than** the specified value.\n\n `.ustx()` to specify uSTX as the FT asset _(ends the builder)_\n\n `.ft(contract: string, tokenName: string)` to specify a specific FT asset _(ends the builder)_\n\n ---\n \n NFT\n\n `.willSendAsset()` ensures that an asset should **be sent**.\n \n `.willNotSendAsset()` to specify an asset should **not be sent**\n </Accordion>\n</Accordions>\n\n## Setting the post-condition mode\n\nWhen creating a transaction, the mode of the transaction can be set to `Allow` or `Deny` to specify whether unspecified asset transfers are permitted.\n\n```ts -n\nimport { PostConditionMode } from '@stacks/transactions';\n\nconst tx = await makeContractCall({\n // ...\n postConditionMode: PostConditionMode.Allow,\n // OR\n postConditionMode: PostConditionMode.Deny,\n // ...\n});\n```\n\nEssentially, the `postConditionMode` is what tells the Stacks node whether to require (`Deny`) or ignore (`Allow`) the post-conditions when evaluating the transaction.\n\n## Usage examples\n\n### Amount uSTX sent\n\nConstruct a post-condition for a certain amount of uSTX to be sent.\n\n```ts -cn\nimport { Pc } from '@stacks/transactions';\n\nconst postCondition = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')\n .willSendEq(1000)\n .ustx();\n```\n\n### Amount FT sent\n\nConstruct a post-condition for a certain amount of a specific FT to be sent.\n\n```ts -cn\nimport { Pc } from '@stacks/transactions';\n\nconst postCondition = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6.token-ft')\n .willSendGte(500)\n .ft('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6.token-ft', 'token');\n```\n\n### Amount NFT sent / not sent\n\nConstruct a post-condition for sending / not-sending a specific NFT.\n\n```ts -cn\nimport { Pc } from '@stacks/transactions';\n\nconst postCondition = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')\n .willNotSendAsset()\n .nft('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6.token-nft::token', Cl.uint(12));\n```\n\n### Amount SFT sent / not sent\n\nConstruct a post-condition for sending / not-sending a specific SFT (Semi-fungible token).\n\n```ts -cn\nimport { Cl, Pc } from '@stacks/transactions';\n\nconst postConditionForNFT = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')\n.willSendAsset()\n.nft(\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.semi-fungible-token::semi-fungible-token-id\",\n Cl.tuple({ \"token-id\": Cl.uint(1), owner: Cl.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6') })\n);\n\nconst postConditionForFT = Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')\n.willSendEq(500)\n.ft(\"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.semi-fungible-token\", \"semi-fungible-token\");\n```\n\n<Callout title=\"Note\">\nThe previous builders (`makeStandardSTXPostCondition`, `makeStandardFungiblePostCondition`, etc) were removed in `v7.0.0`.\n</Callout>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/stacks.js/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to broadcast transactions with Stacks.js.\"\n />\n <Card\n href=\"/stacks/stacks.js/packages/transactions\"\n title=\"API References\"\n description=\"Dive deeper into the API references for the Stacks.js transactions package.\"\n />\n</Cards>" + }, + { + "title": "Using Stacks.js with React Native", + "description": "Learn how to use Stacks.js with React Native.", + "slug": "/stacks/stacks.js/examples/use-with-react-native", + "content": "\nimport { Badge } from '@/components/ui/badge';\n\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nUsing Stacks.js with React Native allows you to integrate Stacks blockchain functionalities into mobile applications.\n\nIn this guide, you will learn how to:\n\n1. [Set up the Expo project](#set-up-the-expo-project).\n2. [Install necessary dependencies](#install-necessary-dependencies).\n3. [Add NodeJS polyfills](#add-nodejs-polyfills).\n4. [Add global polyfills](#add-global-polyfills).\n5. [Use Stacks.js in the project](#use-stacksjs-in-the-project).\n\n{/* <Callout>To see this guide in action, check out a full example [here](https://github.com/hirosystems/stacks.js-react-native-expo-51).</Callout> */}\n\n---\n\n## Set up the Expo project\n\nStart by creating a new Expo project using `create-expo-app`.\n\n```terminal\n$ npx create-expo-app@latest\n```\n\nThis will generate a boilerplate Expo project. You can run the project with `npm start` and connect a mobile device for previewing via the shown QR code.\n\n## Install necessary dependencies\n\nInstall Stacks.js libraries along with other dependencies needed for polyfilling browser-specific and NodeJS-specific APIs.\n\n```terminal\n$ npm install @stacks/transactions @stacks/wallet-sdk\n$ npm install --save-dev buffer process react-native-get-random-values text-encoding readable-stream crypto-browserify @peculiar/webcrypto\n```\n\n## Add NodeJS polyfills\n\nModify the project's Metro configuration to include polyfills for missing NodeJS modules.\n\n```terminal\n$ npx expo customize metro.config.js\n```\n\n```js metro.config.js -cn\nconst { getDefaultConfig } = require(\"expo/metro-config\");\n\nconst config = getDefaultConfig(__dirname);\n\nconfig.resolver.extraNodeModules = {\n stream: require.resolve(\"readable-stream\"),\n crypto: require.resolve(\"crypto-browserify\"),\n};\n\nmodule.exports = config;\n```\n\n## Add global polyfills\n\nUpdate the Expo entry point to include polyfills.\n\n1. Create `polyfill.js` file\n2. Create `index.js` file\n3. Update the `package.json`\n\n```js polyfill.js -cn\nimport { Buffer } from \"buffer/\";\nimport process from \"process\";\nimport \"react-native-get-random-values\";\nimport { TextDecoder, TextEncoder } from \"text-encoding\";\n\nglobal.process = process;\nglobal.Buffer = Buffer;\nglobal.TextEncoder = TextEncoder;\nglobal.TextDecoder = TextDecoder;\n```\n\n```js index.js -cn\nimport \"./polyfill\";\nimport { Crypto } from \"@peculiar/webcrypto\";\n\nObject.assign(global.crypto, new Crypto());\n\nimport \"expo-router/entry\";\n```\n\n```json package.json\n\"main\": \"index.js\",\n```\n\n<Callout>\nEnsure that the polyfills live in their own file as specified to avoid any runtime issues.\n</Callout>\n\n## Use Stacks.js in the project\n\nEdit the `app/(tabs)/index.tsx` file to integrate Stacks.js functionalities, starting with the imports.\n\n```tsx app/(tabs)/index.tsx -cn\nimport {\n TransactionVersion,\n getAddressFromPrivateKey,\n makeSTXTokenTransfer,\n} from \"@stacks/transactions\";\nimport { Wallet, generateSecretKey, generateWallet } from \"@stacks/wallet-sdk\";\nimport { useState } from \"react\";\n```\n\nNow you can start to manage the state as follows:\n\n```tsx app/(tabs)/index.tsx -cn\nexport default function HomeScreen() {\n const [mnemonic, setMnemonic] = useState(\"...\");\n const [wallet, setWallet] = useState<Wallet | null>(null);\n const [log, setLog] = useState(\"\");\n}\n```\n\nNext, to generate a wallet and sign a transaction:\n\n```tsx app/(tabs)/index.tsx -cn\nconst generate = async () => {\n const mnemonic = generateSecretKey();\n setMnemonic(mnemonic);\n\n const wallet = await generateWallet({\n secretKey: mnemonic,\n password: \"\",\n });\n setWallet(wallet);\n\n await makeSTXTokenTransfer({\n amount: 1000,\n anchorMode: \"any\",\n recipient: \"SP3W993D3BRDYB284CY3SBFDEGTC5XEDJPDEA21CN\",\n senderKey: wallet.accounts[0].stxPrivateKey,\n fee: 10,\n network: \"mainnet\",\n nonce: 0,\n });\n setLog(\"Transaction signed successfully ☑\");\n};\n```\n\nAnd lastly, to integrate the UI:\n\n```tsx app/(tabs)/index.tsx -cn\n<ThemedView>\n <ThemedText type=\"subtitle\">Seed Phrase</ThemedText>\n <ThemedText>{mnemonic}</ThemedText>\n <Button title=\"Generate Seed Phrase\" onPress={generate} />\n {wallet && (\n <>\n <ThemedText type=\"subtitle\">Address</ThemedText>\n <ThemedText>\n {getAddressFromPrivateKey(\n wallet.accounts[0].stxPrivateKey,\n TransactionVersion.Mainnet\n )}\n </ThemedText>\n </>\n )}\n {log && <ThemedText>{log}</ThemedText>}\n</ThemedView>\n```\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/stacks.js/packages/transactions\"\n title=\"API References\"\n description=\"Dive into the API references for Stacks.js.\"\n />\n</Cards>" + }, + { + "title": "sbtc", + "description": "A JS/TS helper package for interacting with sBTC.", + "slug": "/stacks/stacks.js/packages/sbtc", + "content": "\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n\n## Installation\n\n```package-install\nsbtc\n```\n\n## Architecture\n\nThe sBTC protocol operates across multiple layers:\n\n- **Bitcoin**: The original funds are sourced from Bitcoin. A depositor sends these funds to a group of signers, which manage a (rotating) multisignature address formatted for sBTC transactions.\n\n- **sBTC API (Emily)**: This API is responsible for tracking deposits and notifying the signers about pending deposits.\n\n- **Stacks**: The network where sBTC is minted. Once the deposit is confirmed, the signers mint the corresponding amount of sBTC to the depositor's specified address on the Stacks network.\n\n## Deposit Flow\n\n- **Create Deposit (Bitcoin) Transaction**:\n - Structure a Bitcoin transaction to send funds to the group of signers.\n - Use a specialized format that includes:\n - Deposit Script: Identifies which Stacks address the sBTC will be minted to and what the maximum fee (in satoshis) the signers may take in exchange for minting.\n - Reclaim Script: Allows the sender to reclaim their funds if the transaction is not processed by the signers.\n\n- **Sign and Broadcast the Transaction**:\n - Sign the transaction with the sender's private key.\n - Broadcast the transaction to the Bitcoin network (Bitcoin Regtest for Stacks Testnet).\n\n- **Notify the sBTC API (Emily)**:\n - Inform the API about the transaction by submitting its details. This step ensures that the signers are aware of the deposit and can track it.\n\n- **Processing by Signers**: (no action required)\n - The signers retrieve and verify the deposit transaction from the Bitcoin blockchain.\n - Once verified, the signers mint the equivalent amount of sBTC on the Stacks network.\n\n- **Receive sBTC (Stacks)**: (no action required)\n - The minted sBTC is sent to the depositor's designated Stacks address, completing the deposit process.\n - sBTC is SIP-010 compatible and will show up in Stacks wallets and explorers.\n\n## Withdrawal Flow\n_Coming soon_\n\n## sBTC Package Functions\n\nThe sBTC package exports high-level functions for building addresses and transactions for deposits.\n\n### Examples\n\n \n#### buildSbtcDepositAddress\nBuild a deposit address and metadata using `buildSbtcDepositAddress` with a wallet provider using `sendTransfer`.\n\n```ts\nimport { buildSbtcDepositAddress, SbtcApiClientTestnet } from 'sbtc';\n\nconst client = new SbtcApiClientTestnet();\n\n// 1. BUILD THE DEPOSIT ADDRESS AND METADATA\nconst deposit = buildSbtcDepositAddress({\n stacksAddress: TARGET_STX_ADDRESS,\n signersPublicKey: await client.fetchSignersPublicKey(),\n\n // OPTIONAL DEFAULTS\n // maxSignerFee: 80_000, // optional: fee to pay for the deposit transaction (taken from the signers from the sats)\n // reclaimLockTime: 6_000, // optional: lock time for the reclaim script\n // network: REGTEST, // optional: which bitcoin network to use\n});\n\n// `deposit.address` is the deposit address (send funds here, aka the deposit address as an output)\n\n// 2. DEPOSIT USING YOUR FAVORITE WALLET (TYPICALLY ALSO BROADCASTED BY THE WALLET)\nconst txid = await WalletProvider.sendTransfer({\n recipient: deposit.address,\n amount: 100_000, // the amount to deposit; <=maxSignerFee is taken from this amount\n});\n\n// 3. NOTIFY THE SIGNERS\nawait client.notifySbtc({ txid, ...deposit });\n```\n\n#### buildSbtcDepositTx\nThe `buildSbtcDepositTx` function is similar to `buildSbtcDepositAddress`, but instead of returning just a deposit address, it constructs a complete Bitcoin transaction for depositing sBTC.\n\n```ts\nimport { buildSbtcDepositTx } from 'sbtc';\n\n// 1. BUILD THE DEPOSIT TRANSACTION AND METADATA\nconst deposit = buildSbtcDepositTx({\n amountSats: DEPOSIT_AMOUNT, // the amount in sats/sBTC to deposit; <=maxSignerFee is taken from this amount\n\n // same options as `buildSbtcDepositAddress`\n network,\n stacksAddress,\n signersPublicKey,\n maxSignerFee,\n reclaimLockTime,\n});\n\n// `deposit.transaction` has one output, which is the combined taproot of the deposit and reclaim scripts\n\n// 2. SIGN THE TRANSACTION\ndeposit.transaction.sign(YOUR_BTC_PRIVATE_KEY);\ndeposit.transaction.finalize();\n\n// 2. OR SIGN VIA EXTERNAL WALLET\nconst psbtBytes = deposit.transaction.toPSBT();\n\n// 3. BROADCAST THE TRANSACTION\nconst txid = await client.broadcastTx(deposit.transaction);\n\n// 4. NOTIFY THE SIGNERS\nawait client.notifySbtc(deposit);\n```\n\n\n#### sbtcDepositHelper\nCreate a fully-formed deposit transaction (assuming an address with spendable bitcoin UTXOs)\n\n<Callout>Use this helper function if you are not using a wallet provider</Callout>\n\n```ts\nimport { sbtcDepositHelper, SbtcApiClientTestnet } from 'sbtc';\n\nconst client = new SbtcApiClientTestnet();\n\n// 1. BUILD THE DEPOSIT TRANSACTION AND METADATA (GIVEN UTXOS FOR AN ADDRESS)\nconst deposit = await sbtcDepositHelper({\n stacksAddress: TARGET_STX_ADDRESS, // where to send/mint the sBTC\n amountSats: 5_000_000, // (maximum) amount of sBTC to deposit\n\n signersPublicKey: pub, // the aggregated public key of the signers\n\n feeRate: await client.fetchFeeRate('medium'),\n utxos: await client.fetchUtxos(YOUR_BTC_ADDRESS),\n\n bitcoinChangeAddress: YOUR_BTC_ADDRESS,\n});\n\n// 2. SIGN THE TRANSACTION\ndeposit.transaction.sign(YOUR_BTC_PRIVATE_KEY);\ndeposit.transaction.finalize();\n\n// 2. OR SIGN VIA EXTERNAL WALLET\nconst psbtBytes = deposit.transaction.toPSBT();\n\n// 3. BROADCAST TRANSACTION\nconst txid = await client.broadcastTx(deposit.transaction);\nconsole.log('txid', txid);\n\n// 4. NOTIFY THE SIGNERS\nconst res = await client.notifySbtc(deposit);\nconsole.log('res', res.status, res.statusMessage);\n```\n\n\n## HTTP Clients\n\nAdditionally, there are two API helpers, which make it easier to get all the data needed to create the above transactions:\n\n- **SbtcApiClientMainnet** — a client for communicating with the different pieces of the sBTC deployment\n- **SbtcApiClientTestnet** — a client for communicating with the different pieces of the sBTC deployment on Testnet\n- **SbtcApiClientDevenv** — a client for developing against a local deployment of sBTC\n\nWhile the final adjustments are still being made in the pre-release phase, this package may change default URLs and contract addresses on every minor release.\n\n| Version | Purpose | Functionality |\n| --- | --- | --- |\n| 0.1.x | Developer release (hackathon) | |\n| 0.2.x | Regtest/Testnet release | Deposit only |\n| 0.3.x | Mainnet pre-release | Deposit only |\n\n### Examples\n\n```ts\nimport { SbtcApiClientMainnet, SbtcApiClientTestnet, SbtcApiClientDevenv } from 'sbtc';\n\nconst client = new SbtcApiClientMainnet();\n// const client = new SbtcApiClientTestnet();\n// const client = new SbtcApiClientDevenv();\n\nconst pub = await client.fetchSignersPublicKey(); // fetches the aggregated public key of the signers\nconst address = await client.fetchSignersAddress(); // fetches the p2tr address of the aggregated public key of the signers\n\nconst feeRate = await client.fetchFeeRate('low'); // or 'medium', 'high'\nconst unspents = await client.fetchUtxos(BTC_ADDRESS);\nconst hex = await client.fetchTxHex(TXID);\n\nawait client.broadcastTx(DEPOSIT_BTC_TX); // broadcast a deposit BTC transaction\nawait client.notifySbtc(DEPOSIT_BTC_TX); // notify the sBTC API about the deposit (otherwise it won't be processed)\n\nconst sbtcBalance = await client.fetchSbtcBalance(STX_ADDRESS); // fetch the sBTC balance of an Stacks address\n```\n\n## API Reference\n\n### sbtcDepositHelper\n\n| Parameter | Description | Type | Default |\n| --- | --- | --- | --- |\n| signersPublicKey | Signers public key (aggregated schnorr) | string 32 byte hex | — |\n| amountSats | Bitcoin amount denominated in sats (* 10^8) | number, bigint | — |\n| stacksAddress | The deposit recipient Stacks address | string | — |\n| bitcoinChangeAddress | Bitcoin change address | string | — |\n| feeRate | Fee rate in sat/vbyte | number | — |\n| utxos | UTXOs to \"fund\" the transaction | UtxoWithTx[] | — |\n| reclaimPublicKey | Public key (schnorr, x-only) for reclaiming failed deposits | string | — |\n| reclaimLockTime | Optional reclaim lock time | number | 144 |\n| maxSignerFee | Optional maximum fee to pay to signers for the sBTC mint | number | 80_000 |\n| network | Optional Bitcoin network | BitcoinNetwork | MAINNET |\n| utxoToSpendable | Optional function to convert p2wpk and p2sh utxos to spendable inputs | Function | Best effort default implementation to make utxos spendable |\n| paymentPublicKey | Optional payment public key (currently only used for default utxoToSpendable.sh implementation) | string hex | — |\n\n### SbtcApiClient Configuration\n\n| Parameter | Description | Type |\n| --- | --- | --- |\n| sbtcContract | The multisig address of the initial sBTC contract | string |\n| sbtcApiUrl | The base URL of the sBTC API (Emily) | string |\n| btcApiUrl | The base URL of the Bitcoin mempool/electrs API | string |\n| stxApiUrl | The base URL of the Stacks API | string |\n" + }, + { + "title": "@stacks/transactions", + "description": "Construct, decode transactions and work with Clarity smart contracts on the Stacks blockchain.", + "slug": "/stacks/stacks.js/packages/transactions", + "content": "\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\n## Installation\n\n```package-install\n@stacks/transactions\n```\n\nThis library supports the creation of the following Stacks transaction types:\n\n1. STX token transfer\n2. Smart contract deploy\n3. Smart contract function call\n\n## Key Generation\n\n```typescript -n\nimport { randomPrivateKey, privateKeyToPublicKey } from '@stacks/transactions';\n\n// Random key\nconst privateKey = randomPrivateKey();\nconst publicKey = privateKeyToPublicKey(privateKey);\n\n// Private key from hex string\nconst privateKey = 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01';\n```\n\n## STX Token Transfer Transaction\n\nUse the [`makeSTXTokenTransfer`](https://stacks.js.org/functions/_stacks_transactions.makeSTXTokenTransfer) (with a sender private key), or the \"unsigned\" version [`makeUnsignedSTXTokenTransfer`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedSTXTokenTransfer) (with a sender public key, without yet signing) to create a STX token transfer transaction.\n\n```ts -n\nimport { makeSTXTokenTransfer, broadcastTransaction } from '@stacks/transactions';\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n memo: 'test memo',\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n\n// to see the raw serialized tx\nconst serializedTx = transaction.serialize(); // hex string\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Smart Contract Deploy Transaction\n\nUse the [`makeContractDeploy`](https://stacks.js.org/functions/_stacks_transactions.makeContractDeploy), or the \"unsigned\" version [`makeUnsignedContractDeploy`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedContractDeploy) to create a smart contract deploy transaction.\n\n```ts -n\nimport { makeContractDeploy, broadcastTransaction } from '@stacks/transactions';\nimport { readFileSync } from 'fs';\n\nconst clarityCode = readFileSync('/path/to/contract.clar').toString();\n\nconst txOptions = {\n contractName: 'contract_name',\n codeBody: clarityCode,\n clarityVersion: 3, // optional, defaults to latest deployed version\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeContractDeploy(txOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Smart Contract Function Call (On-chain)\n\nIf you want to call a readonly function, use [`fetchCallReadOnlyFunction`](https://stacks.js.org/functions/_stacks_transactions.fetchCallReadOnlyFunction) instead.\n\nUse the [`makeContractCall`](https://stacks.js.org/functions/_stacks_transactions.makeContractCall) or the \"unsigned\" version [`makeUnsignedContractCall`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedContractCall) to create a smart contract function call transaction.\n\n```ts -n\nimport { makeContractCall, broadcastTransaction, Cl, Pc } from '@stacks/transactions';\n\n// Add an optional post condition\nconst condition01 = Pc.principal('SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE')\n .willSendGte(1000000n)\n .ustx();\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [Cl.bufferFromUtf8('foo string')],\n postConditions: [condition01],\n\n validateWithAbi: true, // check if the arguments given are compatible with the function\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeContractCall(txOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\nIn this example we construct a `contract-call` transaction with a post condition. We have set the `validateWithAbi` option to `true`, so the `makeContractCall` builder will attempt to fetch this contracts ABI from the specified Stacks network, and validate that the provided functionArgs match what is described in the ABI. This should help you avoid constructing invalid contract-call transactions. If you would prefer to provide your own ABI instead of fetching it from the network, the `validateWithAbi` option also accepts [ClarityABI](https://stacks.js.org/interfaces/_stacks_transactions.ClarityAbi) objects.\n\n## Sponsoring Transactions\n\nTo generate a sponsored transaction, first create and sign the transaction as the origin. The `sponsored` property in the options object must be set to true.\n\n```ts -n\nimport { makeContractCall, Cl } from '@stacks/transactions';\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [Cl.bufferFromUtf8('foo string')],\n validateWithAbi: true,\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n sponsored: true,\n};\n\nconst transaction = await makeContractCall(txOptions);\nconst serializedTx = transaction.serialize();\n\n// can't broadcast sponsored transactions before they are sponsored\n```\n\nThe serialized transaction can now be passed to the sponsoring party which will sign the sponsor portion of the transaction and set the fee.\n\n```ts -n\nimport { sponsorTransaction, broadcastTransaction } from '@stacks/transactions';\n\nconst deserializedTx = deserializeTransaction(serializedTx);\nconst sponsorKey = '770287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01';\nconst fee = 1000n;\n\nconst sponsorOptions = {\n transaction: deserializedTx,\n sponsorPrivateKey: sponsorKey,\n sponsorNonce: 0,\n fee,\n};\n\nconst sponsoredTx = await sponsorTransaction(sponsorOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction: sponsoredTx, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Supporting multi-signature transactions\n\nTo generate a multi-sig transaction, first create an unsigned transaction.\nThe `numSignatures` and `publicKeys` properties in the options object must be set:\n\n```ts -n\nimport {\n makeUnsignedSTXTokenTransfer,\n createStacksPrivateKey,\n deserializeTransaction,\n pubKeyfromPrivKey,\n publicKeyToString,\n TransactionSigner,\n standardPrincipalCV,\n BytesReader,\n AnchorMode,\n} from '@stacks/transactions';\n\nconst recipient = standardPrincipalCV('SP3FGQ8...');\nconst amount = 2500000n;\nconst fee = 0n;\nconst memo = 'test memo';\n\n// private keys of the participants in the transaction\nconst privKeyStrings = ['6d430bb9...', '2a584d89...', 'd5200dee...'];\n\n// create private key objects from string array\nconst privKeys = privKeyStrings.map(createStacksPrivateKey);\n\n// corresponding public keys\nconst pubKeys = privKeyStrings.map(pubKeyfromPrivKey);\n\n// create public key string array from objects\nconst pubKeyStrings = pubKeys.map(publicKeyToString);\n\nconst transaction = await makeUnsignedSTXTokenTransfer({\n recipient,\n amount,\n fee,\n memo,\n numSignatures: 2, // number of signature required\n publicKeys: pubKeyStrings, // public key string array with >= numSignatures elements\n anchorMode: AnchorMode.Any,\n});\n\nconst serializedTx = transaction.serialize();\n```\n\nThis transaction payload can be passed along to other participants to sign. In addition to\nmeeting the numSignatures requirement, the public keys of the parties who did not sign the\ntransaction must be appended to the signature.\n\n```ts -n\n// deserialize and sign transaction\nconst bytesReader = new BytesReader(serializedTx);\n// Partially signed or unsigned multi-sig tx can be deserialized to add the required signatures\nconst deserializedTx = deserializeTransaction(bytesReader);\n\nconst signer = new TransactionSigner(deserializedTx);\n\n// first signature\nsigner.signOrigin(privKeys[0]);\n\n// second signature\nsigner.signOrigin(privKeys[1]);\n\n// after meeting the numSignatures requirement, the public\n// keys of the participants who did not sign must be appended\nsigner.appendOrigin(pubKeys[2]);\n\n// the serialized multi-sig tx\nconst serializedSignedTx = deserializedTx.serialize();\n```\n\n## Calling Read-only Contract Functions\n\nRead-only contract functions can be called without generating or broadcasting a transaction. Instead it works via a direct API call to a Stacks node.\n\n```ts -n\nimport { bufferCVFromString, callReadOnlyFunction } from '@stacks/transactions';\nimport { StacksTestnet } from '@stacks/network';\n\nconst contractAddress = 'ST3KC0MTNW34S1ZXD36JYKFD3JJMWA01M55DSJ4JE';\nconst contractName = 'kv-store';\nconst functionName = 'get-value';\nconst buffer = bufferCVFromString('foo');\nconst network = new StacksTestnet();\nconst senderAddress = 'ST2F4BK4GZH6YFBNHYDDGN4T1RKBA7DA1BJZPJEJJ';\n\nconst options = {\n contractAddress,\n contractName,\n functionName,\n functionArgs: [buffer],\n network,\n senderAddress,\n};\n\nconst result = await callReadOnlyFunction(options);\n```\n\n## Constructing Clarity Values\n\nBuilding transactions that call functions in deployed clarity contracts requires you to construct valid Clarity Values to pass to the function as arguments. The [Clarity type system](https://github.com/stacksgov/sips/blob/master/sip/sip-002-smart-contract-language.md#clarity-type-system) contains the following types:\n\n- `(tuple (key-name-0 key-type-0) (key-name-1 key-type-1) ...)` : a typed tuple with named fields.\n- `(list max-len entry-type)` : a list of maximum length max-len, with entries of type entry-type\n- `(response ok-type err-type)` : object used by public functions to commit their changes or abort. May be returned or used by other functions as well, however, only public functions have the commit/abort behavior.\n- `(optional some-type)` : an option type for objects that can either be (some value) or none\n- `(buff max-len)` : byte buffer or maximum length max-len.\n- `principal` : object representing a principal (whether a contract principal or standard principal).\n- `bool` : boolean value (`true` or `false`)\n- `int` : signed 128-bit integer\n- `uint`: unsigned 128-bit integer\n\nThis library contains Typescript types and classes that map to the Clarity types, in order to make it easy to construct well-typed Clarity values in Javascript. These types all extend the abstract class `ClarityValue`.\n\n```ts -n\nimport {\n trueCV,\n falseCV,\n noneCV,\n someCV,\n intCV,\n uintCV,\n standardPrincipalCV,\n contractPrincipalCV,\n responseErrorCV,\n responseOkCV,\n listCV,\n tupleCV,\n bufferCV,\n} from '@stacks/transactions';\nimport { utf8ToBytes } from '@stacks/common';\n\n// construct boolean clarity values\nconst t = trueCV();\nconst f = falseCV();\n\n// construct optional clarity values\nconst nothing = noneCV();\nconst something = someCV(t);\n\n// construct a buffer clarity value from an existing byte array\nconst bytes = utf8ToBytes('foo'); // Uint8Array(3) [ 102, 111, 111 ]\nconst bufCV = bufferCV(bytes);\n\n// construct signed and unsigned integer clarity values\nconst i = intCV(-10);\nconst u = uintCV(10);\n\n// construct principal clarity values\nconst address = 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B';\nconst contractName = 'contract-name';\nconst spCV = standardPrincipalCV(address);\nconst cpCV = contractPrincipalCV(address, contractName);\n\n// construct response clarity values\nconst errCV = responseErrorCV(trueCV());\nconst okCV = responseOkCV(falseCV());\n\n// construct tuple clarity values\nconst tupCV = tupleCV({\n a: intCV(1),\n b: trueCV(),\n c: falseCV(),\n});\n\n// construct list clarity values\nconst l = listCV([trueCV(), falseCV()]);\n```\n\nIf you develop in Typescript, the type checker can help prevent you from creating wrongly-typed Clarity values. For example, the following code won't compile since in Clarity lists are homogeneous, meaning they can only contain values of a single type. It is important to include the type variable `BooleanCV` in this example, otherwise the typescript type checker won't know which type the list is of and won't enforce homogeneity.\n\n```ts -n\nconst l = listCV<BooleanCV>([trueCV(), intCV(1)]);\n```\n\n## Post Conditions\n\nThree types of post conditions can be added to transactions:\n\n1. STX post condition\n2. Fungible token post condition\n3. Non-Fungible token post condition\n\nFor details see: https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-post-conditions\n\n## STX post condition\n\n```ts -n\nimport {\n FungibleConditionCode,\n makeStandardSTXPostCondition,\n makeContractSTXPostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\n\nconst standardSTXPostCondition = makeStandardSTXPostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractSTXPostCondition = makeContractSTXPostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount\n);\n```\n\n## Fungible token post condition\n\n```ts -n\nimport {\n FungibleConditionCode,\n createAssetInfo,\n makeStandardFungiblePostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardFungiblePostCondition = makeStandardFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst contractFungiblePostCondition = makeContractFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n```\n\n## Non-fungible token post condition\n\n> **Warning**\n> The Stacks blockchain's post-condition processor can NOT check ownership.\n> It checks whether or not a principal **will send** or **will not send** an NFT.\n> Post-conditions can NOT verify anything about the recipient of an asset.\n> If you want to verify conditions about asset recipients, you will need to use [Clarity](https://docs.stacks.co/docs/write-smart-contracts/).\n\n```ts -n\nimport {\n NonFungibleConditionCode,\n createAssetInfo,\n makeStandardNonFungiblePostCondition,\n makeContractNonFungiblePostCondition,\n bufferCVFromString,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = NonFungibleConditionCode.DoesNotSend;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-asset';\nconst assetId = bufferCVFromString('test-token-asset-id');\nconst nonFungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardNonFungiblePostCondition = makeStandardNonFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractNonFungiblePostCondition = makeContractNonFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n```\n\n## Conversion of Clarity Values to JSON\n\nClarity Values represent values of Clarity contracts. If a JSON format is required the helper function `cvToJSON` can be used.\n\n```ts -n\nimport { cvToJSON, hexToCV } from '@stacks/transactions';\n\ncvToJSON(hexToCV(tx.tx_result.hex));\n```\n" + }, + { + "title": "@stacks/network", + "description": "Network and API library for working with Stacks blockchain nodes.", + "slug": "/stacks/stacks.js/packages/network", + "content": "\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\nThe `@stacks/network` package contains default network configurations for Stacks.\n\n## Installation\n\n<Callout type=\"tip\">\nBefore you install: most of the time you don't need to use or even install this library directly.\nFor example, instead of `STACKS_MAINNET`, simply use the string `\"mainnet\"` as the network parameter.\n</Callout>\n\n```package-install\n@stacks/network@latest\n```\n\n## Usage\n\n## The network object\n\nA network in Stacks.js is an object defining several properties.\n\n```ts\nimport { STACKS_MAINNET, STACKS_TESTNET, STACKS_DEVNET } from '@stacks/network';\n\nconsole.log(STACKS_MAINNET);\n// {\n// chainId: 1,\n// transactionVersion: 0,\n// peerNetworkId: 385875968,\n// magicBytes: 'X2',\n// bootAddress: 'SP000000000000000000002Q6VF78',\n// addressVersion: { singleSig: 22, multiSig: 20 }\n// }\n```\n\n## Network usage in transaction building\n\n```ts\nimport { STACKS_MAINNET } from '@stacks/network';\nimport { makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst txOptions = {\n recipient: 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26',\n amount: 100,\n // ...\n network: 'mainnet', // 'mainnet', 'testnet', or 'devnet', (defaults to mainnet)\n // OR\n network: STACKS_MAINNET, // any compatible network object\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n```\n" + }, + { + "title": "@stacks/common", + "description": "Common utilities for working with Stacks.", + "slug": "/stacks/stacks.js/packages/common", + "content": "\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\nThe `@stacks/common` package contains common utilities for working with Stacks.\nThis includes fetch helpers, middleware, and various other functions.\n\n## Installation\n\n```package-install\n@stacks/common@latest\n```\n\n\n## Use the built-in API key middleware\n\nSome Stacks APIs make use API keys to provide less rate-limited plans.\n\n```typescript\nimport { createApiKeyMiddleware, createFetchFn, StacksMainnet } from '@stacks/network';\nimport { broadcastTransaction, getNonce, makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst myApiMiddleware = createApiKeyMiddleware('example_e8e044a3_41d8b0fe_3dd3988ef302');\nconst myFetchFn = createFetchFn(myApiMiddleware); // middlewares can be used to create a new fetch function\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n memo: 'some memo',\n anchorMode: AnchorMode.Any,\n client: {\n fetch: myFetchFn,\n }\n};\nconst transaction = await makeSTXTokenTransfer(txOptions); // fee-estimation will use the custom fetchFn\n\nconst response = await broadcastTransaction(transaction, myMainnet); // make sure to broadcast via the custom network object\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', myMainnet);\n```\n\n## Use custom middleware\n\nMiddleware can be used to hook into network calls before sending a request or after receiving a response.\n\n```typescript\nimport { createFetchFn, RequestContext, ResponseContext } from '@stacks/common';\n\nconst preMiddleware = (ctx: RequestContext) => {\n ctx.init.headers = new Headers();\n ctx.init.headers.set('x-foo', 'bar'); // override headers and set new `x-foo` header\n};\nconst postMiddleware = (ctx: ResponseContext) => {\n console.log(await ctx.response.json()); // log response body as json\n};\n\nconst fetchFn = createFetchFn({ pre: preMiddleware, post: preMiddleware }); // a middleware can contain `pre`, `post`, or both\nconst network = new StacksTestnet({ fetchFn });\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', network);\n```\n\n## Get various API URLs\n\n```typescript\nconst txBroadcastUrl = network.getBroadcastApiUrl();\n\nconst feeEstimateUrl = network.getTransferFeeEstimateApiUrl();\n\nconst address = 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26';\nconst accountInfoUrl = network.getAccountApiUrl(address);\n\nconst contractName = 'hello_world';\nconst abiUrl = network.getAbiApiUrl(address, contractName);\n\nconst functionName = 'hello';\nconst readOnlyFunctionCallUrl = network.getReadOnlyFunctionCallApiUrl(\n address,\n contractName,\n functionName\n);\n\nconst nodeInfoUrl = network.getInfoUrl();\n\nconst blockTimeUrl = network.getBlockTimeInfoUrl();\n\nconst poxInfoUrl = network.getPoxInfoUrl();\n```\n" + }, + { + "title": "Transactions", + "description": "Learn how to create and broadcast transactions with Stacks.js.", + "slug": "/stacks/stacks.js/concepts/transactions", + "content": "\nThe following shows how to create a simple transaction (STX transfer) using Stacks.js in different environments.\n\n## Creating a transaction\n\n### Using Stacks Connect\n\n```ts -n\nimport { openSTXTransfer } from '@stacks/connect';\n\nopenSTXTransfer({\n network: 'testnet',\n\n recipient: 'ST39MJ145BR6S8C315AG2BD61SJ16E208P1FDK3AK', // which address you are sending to\n amount: 10000, // tokens, denominated in micro-STX\n\n onFinish: response => console.log(response.txid),\n onCancel: () => console.log('User canceled'),\n});\n```\n\n### Using a private key\n\nFor full manual transaction signing, you need to provide the sender's private key.\nTreat the private key as a secret and *never* expose it to the public.\n\n```ts -n\nimport { makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst privateKey = randomPrivateKey(); // see \"Private Keys & Wallets\" page\n\nconst tx = await makeSTXTokenTransfer({\n recipient: 'ST39MJ145BR6S8C315AG2BD61SJ16E208P1FDK3AK', // which address you are sending to\n amount: 10000, // tokens, denominated in micro-STX\n senderKey: privateKey,\n network: \"testnet\",\n});\n```\n\n## Different transaction types\n\nIn Stacks.js, we can create transactions for different purposes:\n- STX token transfers\n- Smart contract calls\n- Smart contract deployments\n" + }, + { + "title": "Post-Conditions", + "description": "", + "slug": "/stacks/stacks.js/concepts/post-conditions", + "content": "\nIn Stacks, transactions can have *post-conditions*.\n\nThese offer additional security to ensure a transaction was executed as expected.\n\nMore precisely, adding post-conditions to a transaction can ensure that:\n\n- STX tokens were transferred from an address\n- FTs/NFTs were transferred from an address\n\n<Callout title=\"Info\">\nPost-conditions aren't perfect. They can't say anything about the end-state after a transaction. In other words, they can't guarantee the receipt of FTs/NFTs, since they only check for sending.\n</Callout>\n\nHere's an example of a post-condition using the `Pc` helper, where the `principal` must send 1000 uSTX, or else the transaction will abort:\n\n```ts -n\nimport { Pc } from '@stacks/transactions';\n\nconst tx = await makeContractCall({\n // ...\n postConditions: [\n Pc.principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6').willSendEq(1000).ustx(),\n ],\n});\n```\n\nIf you prefer to write the post-condition manually, you can do so using the following approach:\n\n```ts -n\nimport { StxPostCondition, FungiblePostCondition, NonFungiblePostCondition } from '@stacks/transactions';\n// STX post-condition\nconst stxPostCondition: StxPostCondition = {\n type: 'stx-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'gte', // 'eq' | 'gt' | 'gte' | 'lt' | 'lte'\n amount: '100',\n};\n\n// Fungible token post-condition\nconst ftPostCondition: FungiblePostCondition = {\n type: 'ft-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'eq', // 'eq' | 'gt' | 'gte' | 'lt' | 'lte'\n amount: '100',\n asset: 'SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-ft-token::my-token',\n};\n\n// Non-fungible token post-condition\nconst nftPostCondition: NonFungiblePostCondition = {\n type: 'nft-postcondition',\n address: 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B',\n condition: 'sent', // 'sent' | 'not-sent'\n asset: 'SP3D6PV2ACBPEKYJTCMH7HEN02KP87QSP8KTEH335.my-nft::my-asset',\n assetId: Cl.uint(602),\n};\n```\n\n## Post-condition mode\n\nIn addition to the post-condition itself, we can also specify a `mode` for the transaction to verify asset transfers.\nThe mode can be either `Allow` or `Deny`.\n\n- `Allow` means that the transaction can transfer any asset (assuming no conflicting post-conditions).\n- `Deny` means the transaction will fail if any asset transfers (not specified in the post-conditions) are attempted.\n\n<Callout>\nIn either case, all post-conditions will still be checked.\nBy default, transactions are set to `Deny` mode for additional security.\n</Callout>" + }, + { + "title": "Private Keys & Wallets", + "description": "Learn how to manage secrets with Stacks.js.", + "slug": "/stacks/stacks.js/concepts/private-keys", + "content": "\nimport { Card, SmallCard } from '@/components/card';\nimport { Play, FileSignature } from 'lucide-react';\n\n## WITHOUT direct private key access\n\nMost users interact with apps via their favorite Stacks wallet.\nDevelopers can build web apps that prompt the user for an action (e.g. sign a transaction), and then the wallet will handle the rest.\n\n<SmallCard\n icon={<Play className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/stacks/connect\"\n title=\"Build Web Apps\"\n description=\"You can build Stacks enabled web apps without direct private key access using Stacks Connect.\"\n/>\n\n## WITH private key access\n\nDevelopers can build scripts, backends, and tools intended for full control over private keys.\n\n- Using the Stacks.js CLI directly to send transactions, or perform common tasks\n- Building custom tools using Stacks.js libraries that manage private keys directly\n\n### Generating random private keys\n\nLet's start by generating a random private key.\nNote that this will return a different value each time you run the code.\n\n```ts -n\nimport { randomPrivateKey } from '@stacks/transactions';\n\nconst privateKey = randomPrivateKey();\n// 'f5a31c1268a1e37d4edaa05c7d11183c5fbfdcdc48aae36ea4d8cd5cb709932801'\n```\n\nPrivate keys are typically represented as hex strings in Stacks.js.\nFor more control you can use the `PrivateKey` type, which also accepts raw bytes as `Uint8Array` in JavaScript.\n\n### Using a wallet / seed phrase\n\nTypically, we don't want to generate random private keys, but instead use a deterministic wallet based on a seed phrase.\n\n#### Generate a random seed phrase (24 words):\n\n```ts -n\nimport { randomSeedPhrase } from '@stacks/wallet-sdk';\n\nconst phrase = randomSeedPhrase();\n// \"warrior volume sport ... figure cake since\"\n```\n\n#### Generate a wallet from a seed phrase:\n\n```ts -n\nimport { generateWallet, randomSeedPhrase } from '@stacks/wallet-sdk';\n\nconst seedPhrase = randomSeedPhrase();\n\nlet wallet = await generateWallet({\n secretKey: seedPhrase,\n password: \"secret\",\n});\n\nconsole.log(wallet.accounts[0]); // one account is generated by default\n// { \n// stxPrivateKey: '893fc4936c5350394bbe0053d2c31a4b5a44680f6dceb4be2aacaaa3c12e45ff01',\n// dataPrivateKey: '676dc36d89ba04cf1789552fc35f3a6279b4b5f13f3d49fb469b0afecea9698f',\n// appsKey: 'xprvA19evFHUzrZF3wULUSv1UVcQNRP7xJ2vn2MyAKaUHbT8SvjrrkkhANRG2bewMxHAeDSoUVUBRPiztDc8WwGtz9Ero2GXW5rk3vHHXmutb4V',\n// salt: 'cf8a5c7142d842bb38f30c5ab626f7996dd7494236edf21ba00349bb09b9558d',\n// index: 0\n// } \n```\n\n#### Generate more accounts:\n\n```ts -n\nimport { generateNewAccount, generateWallet, randomSeedPhrase } from '@stacks/wallet-sdk';\n\nconst seedPhrase = randomSeedPhrase();\n\nlet wallet = await generateWallet({\n secretKey: seedPhrase,\n password: \"secret\",\n});\n\nwallet = generateNewAccount(wallet);\nconsole.log(wallet.accounts.length); // 2\n```" + }, + { + "title": "Accounts & Addresses", + "description": "Learn how to get an address from an account.", + "slug": "/stacks/stacks.js/concepts/accounts-and-addresses", + "content": "\nStacks uses the concept of an \"account\" to represent a user's identity on the blockchain. An account is identified by a unique address. The address is derived from the account's public key, which is derived from the account's private key.\n\nA normal mainnet address starts with `SP`, and a testnet address starts with `ST`. For example:\n\nMainnet: `SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159`\n\nTestnet: `ST2F4BK4GZH6YFBNHYDDGN4T1RKBA7DA1BJZPJEJJ`\n\n## Getting an address\n\n### Using Stacks Connect\n\n```tsx -n\nimport { showConnect } from '@stacks/connect';\n\nshowConnect({\n appDetails,\n userSession,\n onFinish: () => {\n const user = userSession.loadUserData();\n const address = user.profile.stxAddress.mainnet;\n // 'SP1MXSZF4NFC8JQ1TTYGEC2WADMC7Y3GHVZYRX6RF'\n },\n});\n```\n\n### Using a seed phrase / mnemonic / private key\n\n```ts -n\nimport { randomSeedPhrase, generateWallet } from \"@stacks/wallet-sdk\";\nimport { privateKeyToAddress } from \"@stacks/transactions\";\n\nconst seed = randomSeedPhrase();\n\nconst wallet = await generateWallet({\n secretKey: seed,\n password: 'secret',\n});\n\nconst address = privateKeyToAddress(wallet.accounts[0].stxPrivateKey, 'mainnet');\n// 'SP1MXSZF4NFC8JQ1TTYGEC2WADMC7Y3GHVZYRX6RF'\n```\n\n### Using a public key\n\n```ts -n\nimport { publicKeyToAddress } from '@stacks/transactions';\n\nconst address = publicKeyToAddress(publicKey, 'mainnet');\n// 'SP1MXSZF4NFC8JQ1TTYGEC2WADMC7Y3GHVZYRX6RF'\n```\n\n{/* todo: add accounts code sections, once we have better abstractions */}\n\n{/* todo: multisig */}\n" + }, + { + "title": "Networks", + "description": "Learn how to use different networks.", + "slug": "/stacks/stacks.js/concepts/networks", + "content": "\nimport { Star } from 'lucide-react';\n\nTypically, we speak of `mainnet` and `testnet` as the networks of Stacks.\nMost wallets are configured to `mainnet` by default—this is the production environment, the actual blockchain that holds real STX tokens.\n\nAs the name suggests, `testnet` is a public network for testing.\nIt's a separate blockchain state that holds test tokens, which have no value.\n\nFor completeness we also mention `devnet`.\nThis isn't \"one\" network, but how developers refer to ephemeral local networks used for testing.\nIt is the same as `testnet`, but for local development.\n[Learn more](/stacks/clarinet/guides/run-a-local-devnet).\n\n## Setting the network\n\nMost Stacks.js functions accept a `network` parameter or an optional last argument.\n\nThe `network` type is a string, and can be one of:\n- `'mainnet'` (default)\n- `'testnet'`\n- `'devnet'`\n- `'mocknet'` (alias of `devnet`)\n\n### Examples\n\nNetwork in transaction signing:\n```ts\nconst tx = makeSTXTokenTransfer({\n // ...\n network: 'testnet',\n});\n```\n\nNetwork in address derivation:\n```ts\nconst address = privateKeyToAddress(privateKey, 'devnet');\n// ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP\n```\n\n<Callout type=\"tip\">\n For more advanced uses, you can pass an object of a network configuration.\n Read more about the network object in the [`@stacks/network`](/stacks/stacks.js/packages/network) package.\n</Callout>\n" + }, + { + "title": "Broadcasting", + "description": "Learn how to broadcast transactions to the Stacks network.", + "slug": "/stacks/stacks.js/concepts/broadcasting", + "content": "\n## Broadcasting Transactions\n\nA finalized transaction can be broadcasted to the network or serialized (to a byte representation) using Stacks.js.\n\n```ts -n\nimport { broadcastTransaction, makeSTXTokenTransfer } from \"@stacks/transactions\";\n\nconst transaction = await makeSTXTokenTransfer({\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n amount: 42000000,\n senderKey:\n \"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601\",\n network: \"devnet\",\n});\n\nconst tx = await broadcastTransaction({ transaction });\n\n```\n\n<Callout title=\"Info\">For web applications, user wallets can broadcast transactions via [@stacks/connect](/stacks/connect).</Callout>\n" + }, + { + "title": "Quickstart", + "description": "Learn how to transfer STX tokens using Stacks.js.", + "slug": "/stacks/stacks.js/quickstart", + "content": "\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\"\nimport { ChevronRight, Code, Terminal, Folder as FolderIcon } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\nimport { SmallCard } from '@/components/card';\n\nIn this quickstart guide, you will learn how to build a transaction to transfer STX tokens using Stacks.js.\n\nCheck out the [reference page](/stacks/stacks.js/packages/transactions) for `@stacks/transactions` to learn more about building different types of transactions.\n\n{/* <Callout>\n To view the full code for this quickstart, [click here](https://github.com/hiro-so/stacks.js/tree/main/examples/hello-world).\n</Callout> */}\n\n---\n\n<Steps>\n <Step>\n ## Install packages\n \n Add the `@stacks/transactions` and `@stacks/network` packages to your project using your preferred package manager.\n\n ```package-install title=\"Terminal\"\n @stacks/transactions @stacks/network\n ```\n </Step>\n <Step>\n ## Build the transaction for a STX transfer\n \n To set up a STX token transfer transaction, use the `makeSTXTokenTransfer` function.\n\n This function requires a private key (`senderKey`), a specified `network`, and the details of the transfer.\n\n ```ts stx-transfer.ts -cn\n import { makeSTXTokenTransfer } from \"@stacks/transactions\";\n import { STACKS_TESTNET } from \"@stacks/network\";\n\n const transaction = await makeSTXTokenTransfer({\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n amount: 42000000,\n senderKey:\n \"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601\",\n network: STACKS_TESTNET,\n });\n ```\n\n There are a few optional fields for a STX transfer transaction, including `memo`, `nonce`, and `fee`.\n\n <Accordions>\n <Accordion title=\"Optional fields example\">\n ```ts\n const transaction = await makeSTXTokenTransfer({\n // ...other fields ommitted\n memo: \"test memo\",\n nonce: 0n,\n fee: 200n,\n });\n ```\n </Accordion>\n </Accordions>\n\n <Callout>\n Use `memo` to add a message as part of the transaction. If you don't want the builder to fetch the `nonce` and `fee` from a Stacks node, you can manually set these fields.\n </Callout>\n </Step>\n <Step>\n ## Broadcast the transaction\n \n Once you've constructed a valid transaction, you can broadcast it to the network using the `broadcastTransaction` function.\n\n ```ts stx-transfer.ts -cn\n // !mark[/broadcastTransaction/mg]\n import { broadcastTransaction,makeSTXTokenTransfer } from \"@stacks/transactions\";\n import { STACKS_TESTNET } from \"@stacks/network\";\n\n const transaction = await makeSTXTokenTransfer({\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n amount: 42000000,\n senderKey:\n \"753b7cc01a1a2e86221266a154af739463fce51219d97e4f856cd7200c3bd2a601\",\n network: STACKS_TESTNET,\n });\n\n const broadcastResponse = await broadcastTransaction({ transaction });\n const txId = broadcastResponse.txid;\n ```\n\n Upon success, this will return a `StacksTransaction` object that contains information about the transaction, including the `txid`.\n </Step>\n</Steps>\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/authenticate-users\"\n title=\"Authenticate users\"\n description=\"Learn how to authenticate users using the Connect package in Stacks.js.\"\n />\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n <Card\n href=\"/stacks/connect/guides/sign-messages\"\n title=\"Sign messages\"\n description=\"Learn how to sign messages using Stacks.js.\"\n />\n</Cards>\n" + }, + { + "title": "Installation", + "description": "Installing Stacks.js packages.", + "slug": "/stacks/stacks.js/installation", + "content": "\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\nStacks.js is separated into many smaller packages, which can be installed individually and are published under the `@stacks` scope.\n\nThe most commonly used packages are:\n\n<Tabs defaultValue=\"connect\">\n <TabsList className='flex flex-wrap md:w-max'>\n <TabsTrigger value=\"connect\" className='tab group'>\n <Badge className='badge transition-colors group-data-[state=active]:bg-contrast group-data-[state=active]:text-background group-hover:bg-accent group-hover:text-muted-foreground'>@stacks/connect</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"common\" className='tab group'>\n <Badge className='badge transition-colors group-data-[state=active]:bg-contrast group-data-[state=active]:text-background group-hover:bg-accent group-hover:text-muted-foreground'>@stacks/common</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"network\" className='tab group'>\n <Badge className='badge transition-colors group-data-[state=active]:bg-contrast group-data-[state=active]:text-background group-hover:bg-accent group-hover:text-muted-foreground'>@stacks/network</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"transactions\" className='tab group'>\n <Badge className='badge transition-colors group-data-[state=active]:bg-contrast group-data-[state=active]:text-background group-hover:bg-accent group-hover:text-muted-foreground'>@stacks/transactions</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"client\" className='tab group'>\n <Badge className='badge transition-colors group-data-[state=active]:bg-contrast group-data-[state=active]:text-background group-hover:bg-accent group-hover:text-muted-foreground'>@stacks/blockchain-api-client</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"connect\">\n Build Stacks-ready web apps and connect to user wallets.\n\n ```package-install\n @stacks/connect\n ```\n </TabsContent>\n <TabsContent value=\"common\">\n Common utilities used by Stacks.js packages.\n\n ```package-install\n @stacks/common\n ```\n </TabsContent>\n <TabsContent value=\"network\">\n Network library for working with Stacks network objects.\n\n ```package-install\n @stacks/network\n ```\n </TabsContent>\n <TabsContent value=\"transactions\">\n Construct and decode transactions, and work with Clarity smart contracts on the Stacks blockchain.\n\n ```package-install\n @stacks/transactions\n ```\n </TabsContent>\n <TabsContent value=\"client\">\n API client library for all Stacks Blockchain API endpoints.\n\n ```package-install\n @stacks/blockchain-api-client\n ```\n </TabsContent>\n</Tabs>\n\n---\n\n<Accordions>\n <Accordion title=\"All available packages\">\n [`@stacks/connect`](/stacks/connect/packages/connect) — Build Stacks-ready web applications and connect to user wallets.\n\n `@stacks/auth` — Construct and decode authentication requests for Stacks apps.\n\n [`@stacks/transactions`](/stacks/stacks.js/packages/transactions) — Construct and decode transactions, and work with Clarity smart contracts on the Stacks blockchain.\n\n `@stacks/wallet-sdk` — A library for building wallets, managing accounts, and handling keys for the Stacks blockchain.\n\n `@stacks/storage` — Store and fetch files with Gaia, the decentralized storage system.\n\n `@stacks/profile` — Functions for manipulating user profiles.\n\n `@stacks/encryption` — Encryption functions used by Stacks.js packages.\n\n [`@stacks/network`](/stacks/stacks.js/packages/network) — A network and API library for working with Stacks blockchain nodes.\n\n `@stacks/common` — Common utilities used by Stacks.js packages.\n\n `@stacks/bns` — A library for interacting with the BNS contract.\n\n `@stacks/stacking` — A library for PoX stacking.\n\n `@stacks/cli` — A command line interface to interact with auth, storage, and Stacks transactions.\n\n `@stacks/blockchain-api-client` — API client library for all Stacks Blockchain API endpoints.\n </Accordion>\n</Accordions>\n" + }, + { + "title": "Integration testing", + "description": "Learn how to write and run integration tests for your Clarity smart contracts using the Clarinet JS SDK and Vitest.", + "slug": "/stacks/integration-testing", + "content": "\nIntegration testing is a crucial step in smart contract development that involves testing how different components of your system work together. The Clarinet JS SDK provides powerful tools for writing and running integration tests, allowing you to simulate complex scenarios and interactions between multiple contracts.\n\nBy using integration tests, you can ensure that your smart contracts function correctly as part of a larger system and catch potential issues that might not be apparent in unit tests alone.\n\nIn this guide, you will:\n\n1. [Set up a Clarinet project with a `defi` contract.](#set-up-a-clarinet-project)\n2. [Write an integration test for the smart contract.](#test-the-deposit-and-borrow-functionality)\n3. [Run tests and generate coverage reports.](#run-tests-and-generate-coverage-reports)\n\n---\n\n## Set up a Clarinet project\n\nStart by creating a new Clarinet project. This command will create a new directory named `defi` and set up a basic Clarinet project inside it.\n\n```terminal\n$ clarinet new stx-defi\n$ cd stx-defi\n```\n\nAfter changing into your project directory, run `npm install` to install the package dependencies for testing.\n\n```terminal\n$ npm install\n```\n\nWe are going to use the same `defi` contract that we used in the [unit testing guide](/stacks/clarinet-js-sdk/guides/unit-testing), but with some additional functionality - the ability to `borrow` STX from the contract. If you don't have this project set up already, follow the steps below:\n\n```terminal\n$ clarinet contract new defi\n```\n\nThen, inside your `defi.clar` file, copy and paste the following contract code:\n\n```clarity\n;; Error constants for various failure scenarios.\n(define-constant err-overborrow (err u300))\n\n;; The interest rate for loans, represented as 10% (out of a base of 100).\n(define-data-var loan-interest-rate uint u10) ;; Representing 10% interest rate\n\n\n;; Holds the total amount of deposits in the contract, initialized to 0.\n(define-data-var total-deposits uint u0)\n\n;; Maps a user's principal address to their deposited amount.\n(define-map deposits { owner: principal } { amount: uint })\n\n;; Maps a borrower's principal address to their loan details: amount and the last interaction block.\n(define-map loans principal { amount: uint, last-interaction-block: uint })\n\n;; Public function for users to deposit STX into the contract.\n;; Updates their balance and the total deposits in the contract.\n(define-public (deposit (amount uint))\n (let\n (\n ;; Fetch the current balance or default to 0 if none exists.\n (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n )\n ;; Transfer the STX from sender = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\" to recipient = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)\".\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n ;; Update the user's deposit amount in the map.\n (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })\n ;; Update the total deposits variable.\n (var-set total-deposits (+ (var-get total-deposits) amount))\n ;; Return success.\n (ok true)\n )\n)\n\n;; Public function for users to borrow STX based on their deposits.\n(define-public (borrow (amount uint))\n (let\n (\n ;; Fetch user's deposit or default to 0.\n (user-deposit (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n ;; Calculate the maximum amount the user is allowed to borrow. (which will be upto HALF of what they deposited)\n (allowed-borrow (/ user-deposit u2))\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n ;; Calculate the new loan total after borrowing additional amount.\n (new-loan (+ amount))\n )\n ;; Ensure the requested borrow amount does not exceed the allowed amount.\n (asserts! (<= new-loan allowed-borrow) err-overborrow)\n ;; Transfer the borrowed STX to the user.\n (let\n (\n (recipient tx-sender)\n )\n (try! (as-contract (stx-transfer? amount tx-sender recipient)))\n )\n ;; Update the user's loan details in the map.\n (map-set loans tx-sender { amount: new-loan, last-interaction-block: block-height })\n ;; Return success.\n (ok true)\n )\n)\n\n;; Read-only function to get the total balance by tx-sender\n(define-read-only (get-balance-by-sender)\n (ok (map-get? deposits { owner: tx-sender }))\n)\n\n;; Read-only function to get the total amount owed by the user.\n(define-read-only (get-amount-owed)\n (let\n (\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n )\n ;; Return the total amount due.\n (ok total-due)\n )\n)\n\n;; Private function to calculate the accrued interest on a loan.\n(define-private (calculate-accrued-interest (principal uint) (start-block uint))\n (let\n (\n ;; Calculate the number of blocks elapsed since the last interaction.\n (elapsed-blocks (- block-height start-block))\n ;; Calculate the interest based on the principal, rate, and elapsed time.\n (interest (/ (* principal (var-get loan-interest-rate) elapsed-blocks) u10000))\n )\n ;; Ensure the loan started in the past (not at block 0).\n (asserts! (not (is-eq start-block u0)) (ok u0))\n ;; Return the calculated interest.\n (ok interest)\n )\n)\n```\n\nRun `clarinet check` to ensure that your smart contract is valid and ready for testing.\n\n<Callout>\nYou can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi).\n</Callout>\n\n## Test the deposit and borrow functionality\n\nIn order to `borrow` STX from the contract, users must first `deposit` STX into it. Therefore, we need to write an integration test that simulates the interaction between these two functions.\n\nInside of your `defi.test.ts` file, replace the boilerplate code and add the following:\n\n```typescript\nimport { describe, it, expect } from 'vitest';\nimport { Cl } from '@stacks/transactions';\n\nconst accounts = simnet.getAccounts();\nconst wallet1 = accounts.get('wallet_1')!;\n\ndescribe('stx-defi', () => {\n it('borrows 10 and verifies the amount owed to be 10', () => {\n simnet.callPublicFn('defi', 'deposit', [Cl.uint(1000)], wallet1);\n const totalDeposits = simnet.getDataVar('defi', 'total-deposits');\n expect(totalDeposits).toBeUint(1000);\n\n simnet.callPublicFn('defi', 'borrow', [Cl.uint(10)], wallet1);\n const { result } = simnet.callReadOnlyFn('defi', 'get-amount-owed', [], wallet1);\n expect(result).toBeOk(Cl.uint(10));\n });\n});\n```\n\nIn this integration test, we're simulating a scenario where a user deposits STX into the DeFi contract and then borrows against that deposit. Let's walk through the process step by step.\n\nWe start by simulating a deposit of 1000 STX from `wallet1`. To do this, we use the `callPublicFn` method from the Clarinet JS SDK `simnet` object, which allows us to call public functions in our smart contract just as we would on the actual blockchain.\n\nAfter making the deposit, we want to verify that it was successful. We do this by checking the total deposits in the contract using `getDataVar`.\n\nThis handy method lets us peek at the value of data variables defined in your contract.\n\n<Callout>\nTo learn more about available methods for integration testing, check out the [reference page](/stacks/clarinet-js-sdk/references/methods).\n</Callout>\n\nTo ensure the deposit was recorded correctly, we use a custom matcher, `toBeUint`. This matcher is specifically designed to check if a value is a Clarity unsigned integer with the exact value we expect.\n\nWith the deposit confirmed, we simulate `wallet1` borrowing 10 STX. We do this with another call to `callPublicFn`, this time invoking the `borrow` function of our contract.\n\nAfter the borrowing operation, we want to check how much `wallet1` owes. We use `callReadOnlyFn` to call a read-only function named `get-amount-owed` in our contract.\n\nFinally, we verify the amount owed using another custom matcher, `toBeOk(Cl.uint(10))`. This matcher is particularly useful because it checks two things at once:\n\n1. That our contract returned a successful Clarity response type.\n2. That the value returned is a Clarity unsigned integer with the exact value we expect (`10`).\n\nThese custom matchers and simnet methods are powerful tools and allow you to simulate complex interactions with your smart contracts and make detailed assertions about the results.\n\n## Run tests and generate coverage reports\n\nTo run your tests, use:\n\n```terminal\n$ npm run test\n```\n\nTo generate a coverage report, use:\n\n```terminal\n$ npm run coverage\n```\n\nThis will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/methods\"\n title=\"SDK methods\"\n description=\"Learn about the methods available in the Clarinet JS SDK.\"\n />\n</Cards>\n" + }, + { + "title": "Migration guide", + "description": "Learn how to migrate your existing Clarinet projects to the Clarinet SDK.", + "slug": "/stacks/migration-guide", + "content": "\nIn this guide, you will learn how to:\n\n1. Migrate your existing Clarinet projects to the Clarinet SDK.\n2. Run your existing tests using the Clarinet SDK.\n\n<Callout title=\"Note\">\nThis guide is for projects that have been created with Clarinet v1 and do not have the v2 boilerplate code auto-generated in their projects.\n</Callout>\n\n---\n\n## Executing the migration script\n\nInside your Clarinet v1 project, run the following command to initialise NPM and Vitest. It will also create a sample test file.\n\n```terminal\n$ npx @hirosystems/clarinet-sdk@latest\n```\n\nFollow the prompts to initialise NPM and Vitest, this can take a few seconds.\n\n<Callout title=\"Info\">\nThe file `tests/counter_test.ts` that was created by `clarinet contract new counter` can be deleted.\n\nYou can also have a look at `tests/contract.test.ts`. It's a sample file showing how to use the SDK with Vitest.\nIt can safely be deleted.\n</Callout>\n\n## Unit test for <code className='text-lg'>counter</code> example\n\n```ts tests/counter.test.ts\nimport { Cl } from '@stacks/transactions';\nimport { describe, expect, it } from 'vitest';\n\nconst accounts = simnet.getAccounts();\nconst address1 = accounts.get('wallet_1')!;\n\ndescribe('test `increment` public function', () => {\n it('increments the count by the given value', () => {\n const incrementResponse = simnet.callPublicFn('counter', 'increment', [Cl.uint(1)], address1);\n console.log(Cl.prettyPrint(incrementResponse.result)); // (ok u2)\n expect(incrementResponse.result).toBeOk(Cl.uint(2));\n\n const count1 = simnet.getDataVar('counter', 'count');\n expect(count1).toBeUint(2);\n\n simnet.callPublicFn('counter', 'increment', [Cl.uint(40)], address1);\n const count2 = simnet.getDataVar('counter', 'count');\n expect(count2).toBeUint(42);\n });\n\n it('sends a print event', () => {\n const incrementResponse = simnet.callPublicFn('counter', 'increment', [Cl.uint(1)], address1);\n\n expect(incrementResponse.events).toHaveLength(1);\n const printEvent = incrementResponse.events[0];\n expect(printEvent.event).toBe('print_event');\n expect(printEvent.data.value).toBeTuple({\n object: Cl.stringAscii('count'),\n action: Cl.stringAscii('incremented'),\n value: Cl.uint(2),\n });\n });\n});\n```\n\nTo run the test, go back to your console and run the `test` command using your preferred package manager. It should display a report telling you that tests succeeded.\n\n```terminal\n$ npm test\n```\n\n<Callout title=\"Note\">\nThe `simnet` object is available globally in the tests, and is automatically initialized before each test. You can have a look at the `vitest.config.js` file at the root of you project for more details.\n</Callout>\n\nGetting back to the tests - the first test checks that the `increment` function returns the new value and saves it to the `count` variable.\nThe second test checks that an `print_event` is emitted when the `increment` function is called.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API Reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/guides/migrate-to-the-clarinet-sdk\"\n title=\"Migrating your tests to Clarinet SDK\"\n description=\"Learn how to migrate your existing Clarinet projects to the Clarinet JS SDK\"\n />\n</Cards>" + }, + { + "title": "API keys", + "description": "For developers who need API requests beyond the standard rate limits.", + "slug": "/stacks/api-keys", + "content": "\nimport ApiKeysContent from '@/content/_shared/api-keys.mdx';\n\n<ApiKeysContent components={props.components} />\n" + }, + { + "title": "Info", + "description": "Retrieves information about the Token Metadata API, including the server version.", + "slug": "/stacks/api/token-metadata/info/index", + "content": "" + }, + { + "title": "Get status", + "description": "Retrieves information about the Token Metadata API, including the server version.", + "slug": "/stacks/api/token-metadata/info/status", + "content": "\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Tokens", + "description": "Retrieves information about tokens on the Stacks blockchain.", + "slug": "/stacks/api/token-metadata/tokens/index", + "content": "\n" + }, + { + "title": "Get fungible token metadata", + "description": "Retrieves metadata for a SIP-010 fungible token.", + "slug": "/stacks/api/token-metadata/tokens/fungible-token-metadata", + "content": "\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/ft/{principal}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get semi-fungible token metadata", + "description": "Retrieves information about semi-fungible tokens.", + "slug": "/stacks/api/token-metadata/tokens/semi-fungible-token-metadata", + "content": "\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/sft/{principal}/{token_id}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get fungible tokens", + "description": "Retrieves information about fungible tokens.", + "slug": "/stacks/api/token-metadata/tokens/fungible-tokens", + "content": "\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/ft', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get non-fungible token metadata", + "description": "Retrieves metadata for a SIP-009 non-fungible token.", + "slug": "/stacks/api/token-metadata/tokens/non-fungible-token-metadata", + "content": "\n<APIPage\n document=\"./openapi/token-metadata-api.json\"\n operations={[{ path: '/metadata/v1/nft/{principal}/{token_id}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Pagination", + "description": "Learn how to paginate through lists.", + "slug": "/stacks/api/pagination", + "content": "\nTo make API responses more compact, lists returned by the API are paginated. For lists, the response body includes:\n\n- `limit`: The number of list items return per response\n- `offset`: The number of elements to skip (starting from 0)\n- `total`: The number of all available list items\n- `results`: The array of list items (length of array equals the set limit)\n\nHere is a sample response:\n\n```json\n{\n \"limit\": 10,\n \"offset\": 0,\n \"total\": 101922,\n \"results\": [\n {\n \"tx_id\": \"0x924e0a688664851f5f96b437fabaec19b7542cfcaaf92a97eae43384cacd83d0\",\n \"nonce\": 308,\n \"fee_rate\": \"0\",\n \"sender_address\": \"ST39F7SA0AKH7RB363W3NE2DTHD3P32ZHNX2KE7J9\",\n \"sponsored\": false,\n \"post_condition_mode\": \"deny\",\n \"post_conditions\": [],\n \"anchor_mode\": \"on_chain_only\",\n \"block_hash\": \"0x17ceb3da5f36aab351d6b14f5aa77f85bb6b800b954b2f24c564579f80116d99\",\n \"parent_block_hash\": \"0xe0d1e8d216a77526ae2ce40294fc77038798a179a6532bb8980d3c2183f58de6\",\n \"block_height\": 14461,\n \"burn_block_time\": 1622875042,\n \"burn_block_time_iso\": \"2021-06-05T06:37:22.000Z\",\n \"canonical\": true,\n \"tx_index\": 0,\n \"tx_status\": \"success\",\n \"tx_result\": {},\n \"microblock_hash\": \"\",\n \"microblock_sequence\": 2147483647,\n \"microblock_canonical\": true,\n \"event_count\": 0,\n \"events\": [],\n \"tx_type\": \"coinbase\",\n \"coinbase_payload\": {}\n },\n {}\n ]\n}\n```\n\nUsing the `limit` and `offset` properties, you can paginate through the entire list by increasing the offset by the limit until you reach the total.\n" + }, + { + "title": "APIs", + "description": "The following guides cover ways to use Hiro tools to build apps on Stacks.", + "slug": "/stacks/api/index", + "content": "\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n" + }, + { + "title": "Authentication", + "description": "Authenticate with the Stacks Blockchain API.", + "slug": "/stacks/api/authentication", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nThe Stacks Blockchain API expands the intentionally minimal RPC endpoints available in Stacks nodes and indexes, cleans, and enriches on-chain data to put everything you need at your fingertips. Who knew getting reliable blockchain data could be this easy?\n\n## Popular endpoints\n\n<Callout title=\"RPC endpoints\" type=\"info\">\nIf you're looking for direct access to the Stacks node, including the ability to broadcast transactions and interact with smart contracts, check out our [Stacks Node RPC](/stacks/rpc-api) documentation.\n</Callout>\n\n<Callout title=\"Need help building with the Stacks Blockchain API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#api</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n" + }, + { + "title": "Nonce handling", + "description": "Learn how to handle nonces on Stacks.", + "slug": "/stacks/api/nonce-handling", + "content": "\nIn order to prevent \"stuck\" transactions, you must track the next available nonce for principals issuing transactions. The\nStacks Blockchain API provides an endpoint to make nonce handling simpler when using the following command:\n\n```terminal\n$ curl 'https://api.testnet.hiro.so/extended/v1/address/<principal>/nonces'\n```\n\n```json\n{\n \"last_executed_tx_nonce\": 5893,\n \"last_mempool_tx_nonce\": null,\n \"possible_next_nonce\": 5894,\n \"detected_missing_nonces\": []\n}\n```\n\nThe `possible_next_nonce` property is the nonce suggested for a given principal's next transaction. It is derived as the next integer to the largest nonce found in blocks and mempool. It does not take into account missing nonces.\n\nThe `detected_missing_nonces` property finds any non-contiguous nonces after inspecting transactions from blocks and the mempool. For example, for a given principal, if the latest transaction included in a block has a nonce of 5, and the's only one transaction in the mempool with nonce 7, then it indicates that something likely went wrong with transaction with nonce 6 (either it was not created or broadcasted correctly by a client, or it was dropped for whatever reason). This is a strong indication that the mempool transaction with nonce 7 will never be mined since the previous nonce is missing.\n\nClients that continue to broadcast transactions with the `possible_next_nonce` property of 8, then 9, then 10, will likely result in all of their pending/mempool transactions never going through. For all transactions go through, clients should first use any missing nonces before using the suggested `possible_next_nonce`.\n" + }, + { + "title": "Architecture", + "description": "Understand the architecture of the Stacks Blockchain API.", + "slug": "/stacks/api/architecture", + "content": "\nimport { ImageZoom } from 'fumadocs-ui/components/image-zoom';\n\n<ImageZoom\n width=\"750\"\n height=\"450\"\n alt=\"stacks-api-architecture\"\n src='/images/api/architecture.svg'\n className=\"mt-0 mb-6 first-line:rounded-xl bg-background\"\n priority\n/>\n\n## RPC Endpoints\n\nThe `stacks-node` has its own minimal set of http endpoints referred to as `RPC endpoints`.\n\n- The `stacks-blockchain-api` allows clients to access RPC endpoints by proxying requests to a load-balanced pool of `stacks-nodes`.\n- For more details on RPC endpoints, see: [RPC Endpoints Documentation](https://github.com/blockstack/stacks-blockchain/blob/master/docs/rpc-endpoints.md)\n- Common RPC endpoints include:\n - `POST /v2/transactions` - Broadcast a transaction\n - `GET /v2/pox` - Retrieve current Proof of Transfer (PoX) relevant information\n - `POST /v2/contracts/call-read/<contract>/<function>` - Evaluate and return the result of calling a Clarity function\n - `POST /v2/fees/transaction` - Evaluate a given transaction and provide transaction fee estimation data\n - `GET /v2/accounts/<address>` - Fetch the current nonce required for creating transactions\n\n## Additional Endpoints\n\nThe Stacks Blockchain API implements additional endpoints that provide data unavailable directly from Stacks nodes due to various constraints.\n\n- The `stacks-node` may not persist certain data or may not serve it efficiently to many clients. For instance, while it can return the current STX balance of an account, it cannot provide a history of account transactions.\n- The API implements the Rosetta specification by Coinbase, an open standard designed to simplify blockchain deployment and interaction. More information can be found at [Rosetta API](https://www.rosetta-api.org/).\n- The API includes support for the Blockchain Naming System (BNS) endpoints. Details are available at [BNS Documentation](https://docs.stacks.co/clarity/example-contracts/bns).\n- For Express.js routes, see the directory `/src/api/routes`.\n\nThe API creates an \"event observer\" http server which listens for events from a stacks-node \"event emitter\".\n\nEvents are HTTP POST requests containing:\n - Blocks\n - Transactions\n\nByproducts of executed transactions such as:\n - Asset transfers\n - Smart-contract log data\n - Execution cost data\n\nThe API processes and stores these events as relational data in PostgreSQL. For the \"event observer\" code, see `/src/event-stream`.\n\n## OpenAPI and JSON Schema\n\nAll http endpoints and responses are defined in OpenAPI and JSON Schema.\n\n- See `/docs/openapi.yaml`\n- These are used to auto-generate the docs at https://hirosystems.github.io/stacks-blockchain-api/\n- JSON Schemas are converted into TypeScript interfaces, which are used internally by the db controller module to transform SQL query results into the correct object shapes.\n- OpenAPI and JSON Schemas are also used to generate a standalone `@stacks/blockchain-api-client`.\n\n## Development Setup\n\nThe easiest/quickest way to develop in this repo is using the VS Code debugger. It uses docker-compose to set up a stacks-node and Postgres instance.\n\nAlternatively, you can run `npm run dev:integrated` which does the same thing but without a debugger.\n" + }, + { + "title": "Get block", + "description": "Retrieves a single block.", + "slug": "/stacks/api/stacks-blockchain/blocks/get-block", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/blocks/{height_or_hash}', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get recent blocks", + "description": "Retrieves a list of recently mined blocks.", + "slug": "/stacks/api/stacks-blockchain/blocks/recent-blocks", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/block/', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get block by hash", + "description": "Retrieves block details of a specific block for a given chain height.", + "slug": "/stacks/api/stacks-blockchain/blocks/block-by-hash", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/block/{hash}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Blocks", + "description": "Handle the retrieval and management of block data using various identifiers.", + "slug": "/stacks/api/stacks-blockchain/blocks/index", + "content": "" + }, + { + "title": "Get blocks by burn block", + "description": "Retrieves a list of blocks confirmed by a specific burn block.", + "slug": "/stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/burn-blocks/{height_or_hash}/blocks', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get block by burnchain block height", + "description": "Retrieves block details of a specific block for a given burnchain block height.", + "slug": "/stacks/api/stacks-blockchain/blocks/block-by-burn-block-height", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/block/by_burn_block_height/{burn_block_height}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get average block times", + "description": "Retrieves average block times.", + "slug": "/stacks/api/stacks-blockchain/blocks/average-times", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/blocks/average-times', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get blocks", + "description": "Retrieves a list of recently mined blocks.", + "slug": "/stacks/api/stacks-blockchain/blocks/get-blocks", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/blocks/', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get block by burnchain block hash", + "description": "Retrieves block details of a specific block for a given burnchain block hash.", + "slug": "/stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/block/by_burn_block_hash/{burn_block_hash}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get block by height", + "description": "Retrieves block details of a specific block for a given chain height.", + "slug": "/stacks/api/stacks-blockchain/blocks/block-by-height", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/block/by_height/{height}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get all names", + "description": "Retrieves a list of all names known to the node.", + "slug": "/stacks/api/stacks-blockchain/names/names", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/names/', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get name subdomains", + "description": "Retrieves the list of subdomains for a specific name.", + "slug": "/stacks/api/stacks-blockchain/names/name-subdomains", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/names/{name}/subdomains', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get name zone file", + "description": "Retrieves the zone file for a specific name.", + "slug": "/stacks/api/stacks-blockchain/names/name-zonefile", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/names/{name}/zonefile', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Names", + "description": "Manages and retrieve information on blockchain namespaces, names, and related details.", + "slug": "/stacks/api/stacks-blockchain/names/index", + "content": "" + }, + { + "title": "Get names owned by address", + "description": "Retrieves the list of names owned by a specific address.", + "slug": "/stacks/api/stacks-blockchain/names/owned-by-address", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/addresses/{blockchain}/{address}', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get namespace names", + "description": "Retrieves a list of names within a given namespace.", + "slug": "/stacks/api/stacks-blockchain/names/namespace-names", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/namespaces/{tld}/names', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get all namespaces", + "description": "Retrieves a list of all namespaces known to the node.", + "slug": "/stacks/api/stacks-blockchain/names/namespaces", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/namespaces/', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get name details", + "description": "Retrieves details of a given name including the address, status and last transaction ID.", + "slug": "/stacks/api/stacks-blockchain/names/name-details", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/names/{name}', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get historical zone file", + "description": "Retrieves the historical zone file for a specific name.", + "slug": "/stacks/api/stacks-blockchain/names/historical-zonefile", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/v1/names/{name}/zonefile/{zoneFileHash}', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get fee rate", + "description": "Retrieves an estimated fee rate for transactions.", + "slug": "/stacks/api/stacks-blockchain/fees/fee-rate", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/fee_rate/', method: 'post' }]}\n hasHead={false}\n/>" + }, + { + "title": "Fees", + "description": "Provide estimates, rates, and approximate calculations for transaction costs.", + "slug": "/stacks/api/stacks-blockchain/fees/index", + "content": "" + }, + { + "title": "Get recent burnchain reward recipients", + "description": "Retrieves a list of recent burnchain (e.g. Bitcoin) reward recipients with the associated amounts and block info.", + "slug": "/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/burnchain/rewards', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Stacking rewards", + "description": "Provides information on recent rewards, recipients, and total earned amounts.", + "slug": "/stacks/api/stacks-blockchain/stacking-rewards/index", + "content": "" + }, + { + "title": "Get recent burnchain reward for the given recipient", + "description": "Retrieves a list of recent burnchain (e.g. Bitcoin) rewards for the given recipient with the associated amounts and block info.", + "slug": "/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/burnchain/rewards/{address}', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get recent reward slot holders", + "description": "Retrieves a list of the Bitcoin addresses that would validly receive Proof-of-Transfer commitments.", + "slug": "/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/burnchain/reward_slot_holders', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get recent reward slot holder entries", + "description": "Retrieves a list of the Bitcoin addresses that would validly receive Proof-of-Transfer commitments for a given reward slot holder recipient address.", + "slug": "/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/burnchain/reward_slot_holders/{address}', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get total burnchain rewards for the given recipient", + "description": "Retrieves the total burnchain (e.g. Bitcoin) rewards for a given recipient address.", + "slug": "/stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/burnchain/rewards/{address}/total', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get PoX cycles", + "description": "Retrieves a list of PoX cycles.", + "slug": "/stacks/api/stacks-blockchain/proof-of-transfer/cycles", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/pox/cycles', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Proof of Transfer", + "description": "Retrieve information on PoX cycles, signers, and stackers.", + "slug": "/stacks/api/stacks-blockchain/proof-of-transfer/index", + "content": "\n" + }, + { + "title": "Get signer in PoX cycle", + "description": "Retrieves details for a signer in a PoX cycle.", + "slug": "/stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get PoX cycle", + "description": "Retrieves details for a PoX cycle.", + "slug": "/stacks/api/stacks-blockchain/proof-of-transfer/cycle", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/pox/cycles/{cycle_number}', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get signers in PoX cycle", + "description": "Retrieves a list of signers in a PoX cycle.", + "slug": "/stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/pox/cycles/{cycle_number}/signers', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get stackers for signer in PoX cycle", + "description": "Retrieves a list of stackers for a signer in a PoX cycle.", + "slug": "/stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/pox/cycles/{cycle_number}/signers/{signer_key}/stackers', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Search by ID", + "description": "Search blocks, transactions, contracts, or accounts by hash/ID.", + "slug": "/stacks/api/stacks-blockchain/search/search-by-id", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/search/{id}', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Search", + "description": "Search for a principal by ID.", + "slug": "/stacks/api/stacks-blockchain/search/index", + "content": "\n" + }, + { + "title": "Get total and unlocked STX supply", + "description": "Retrieves the total and unlocked STX supply.", + "slug": "/stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/stx_supply/', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get a given network's target block time", + "description": "Retrieves the target block time for a given network.", + "slug": "/stacks/api/stacks-blockchain/info/network-given-block-time", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/info/network_block_time/{network}', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get circulating STX supply in plain text format", + "description": "Retrieves the circulating STX supply as plain text.", + "slug": "/stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/stx_supply/circulating/plain', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get the network target block time", + "description": "Retrieves the target block times for mainnet and testnet.", + "slug": "/stacks/api/stacks-blockchain/info/network-block-time", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/info/network_block_times', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Info", + "description": "Retrieves information about the Core API and the Stacks network.", + "slug": "/stacks/api/stacks-blockchain/info/index", + "content": "" + }, + { + "title": "Get total STX supply in plain text format", + "description": "Retrieves the total STX supply as plain text.", + "slug": "/stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/stx_supply/total/plain', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get API status", + "description": "Retrieves the running status of the Stacks Blockchain API.", + "slug": "/stacks/api/stacks-blockchain/info/status", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get total and unlocked STX supply (legacy)", + "description": "Retrieves the total and unlocked STX supply in legacy format 1.0 API.", + "slug": "/stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/stx_supply/legacy_format', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get address transactions", + "description": "Retrieves transactions sent or received by a STX address or smart contract ID.", + "slug": "/stacks/api/stacks-blockchain/transactions/address-transactions", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/addresses/{address}/transactions', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get events for an address transaction", + "description": "Retrieves events for a specific transaction.", + "slug": "/stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/addresses/{address}/transactions/{tx_id}/events', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get transaction events", + "description": "Retrieves events for a specific transaction.", + "slug": "/stacks/api/stacks-blockchain/transactions/transaction-events", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/events', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get statistics for mempool transactions", + "description": "Retrieves statistics for transactions in the mempool, such as counts, ages, and fees.", + "slug": "/stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/mempool/stats', method: 'get' }]}\n hasHead={false}\n/>\n\n" + }, + { + "title": "Transactions", + "description": "Manage, retrieve, and broadcast transaction data on the blockchain.", + "slug": "/stacks/api/stacks-blockchain/transactions/index", + "content": "" + }, + { + "title": "Get transactions for address", + "description": "Retrieves transactions for a specific address.", + "slug": "/stacks/api/stacks-blockchain/transactions/transactions-for-address", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{address}/mempool', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get dropped mempool transactions", + "description": "Retrieves all recently-broadcast transactions that have been dropped from the mempool.", + "slug": "/stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/mempool/dropped', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get transaction", + "description": "Retrieves details for a specific transaction.", + "slug": "/stacks/api/stacks-blockchain/transactions/get-transaction", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/{tx_id}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get details for transactions", + "description": "Retrieves details for a list of transactions.", + "slug": "/stacks/api/stacks-blockchain/transactions/details-for-transactions", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/multiple', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get recent transactions", + "description": "Retrieves all recently mined transactions.", + "slug": "/stacks/api/stacks-blockchain/transactions/recent-transactions", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get mempool transactions", + "description": "Retrieves all transactions that have been recently broadcast to the mempool. These are pending transactions awaiting confirmation.", + "slug": "/stacks/api/stacks-blockchain/transactions/mempool-transactions", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/mempool', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get transactions by block", + "description": "Retrieves transactions confirmed in a single block.", + "slug": "/stacks/api/stacks-blockchain/transactions/transactions-by-block", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/blocks/{height_or_hash}/transactions', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get raw transaction", + "description": "Retrieves a hex encoded serialized transaction for a given ID.", + "slug": "/stacks/api/stacks-blockchain/transactions/get-raw-transaction", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tx/{tx_id}/raw', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get stacking pool members", + "description": "Retrieves the list of stacking pool members for a given delegator principal.", + "slug": "/stacks/api/stacks-blockchain/stacking-pool/members", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/pox4/{pool_principal}/delegations/', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Stacking pool", + "description": "Retrieve the list of stacking pool members for a given delegator principal.", + "slug": "/stacks/api/stacks-blockchain/stacking-pool/index", + "content": "" + }, + { + "title": "Faucets", + "description": "Distribute testnet tokens to specified addresses.", + "slug": "/stacks/api/stacks-blockchain/faucets/index", + "content": "" + }, + { + "title": "STX Testnet tokens", + "description": "Delivers testnet STX tokens to a specified address.", + "slug": "/stacks/api/stacks-blockchain/faucets/stx", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/faucets/stx', method: 'post' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get account transactions with transfers", + "description": "Retrieves transactions for a specific account including STX transfers for each transaction.", + "slug": "/stacks/api/stacks-blockchain/accounts/transactions-with-transfers", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/transactions_with_transfers', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get user balances", + "description": "Retrieves account balance information, including STX, fungible, and non-fungible tokens.", + "slug": "/stacks/api/stacks-blockchain/accounts/balances", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/balances', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get account transactions", + "description": "Retrieves transactions for a specific account.", + "slug": "/stacks/api/stacks-blockchain/accounts/transactions", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/transactions', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get nft events", + "description": "Retrieves a list of all nft events associated with an account or a contract identifier.", + "slug": "/stacks/api/stacks-blockchain/accounts/nft-events", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/nft_events', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get account assets", + "description": "Retrieves a list of all asset events associated with an account or a contract identifier.", + "slug": "/stacks/api/stacks-blockchain/accounts/assets", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/assets', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get account transaction with transfers", + "description": "Retrieves transaction details for a specific transaction including STX transfers for each transaction.", + "slug": "/stacks/api/stacks-blockchain/accounts/transaction-with-transfers", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/{tx_id}/with_transfers', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get the latest nonce", + "description": "Retrieves the latest nonce values used by an account by inspecting the mempool and anchored transactions.", + "slug": "/stacks/api/stacks-blockchain/accounts/latest-nonce", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/nonces', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get account STX balance", + "description": "Retrieves the STX token balance for a specified address or contract identifier.", + "slug": "/stacks/api/stacks-blockchain/accounts/stx-balances", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/stx', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get inbound STX transfers", + "description": "Retrieves a list of STX transfers with memos to the given principal.", + "slug": "/stacks/api/stacks-blockchain/accounts/inbound-stx-transfers", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/address/{principal}/stx_inbound', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get contract events", + "description": "Retrieves a list of events that have been triggered by a given smart contract.", + "slug": "/stacks/api/stacks-blockchain/smart-contracts/events", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/contract/{contract_id}/events', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get contracts by trait", + "description": "Retrieves a list of contracts based on the following traits listed in JSON format - functions, variables, maps, fungible tokens and non-fungible tokens.", + "slug": "/stacks/api/stacks-blockchain/smart-contracts/by-trait", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/contract/by_trait', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Smart contracts", + "description": "Provide information and facilitate interactions with smart contracts.", + "slug": "/stacks/api/stacks-blockchain/smart-contracts/index", + "content": "" + }, + { + "title": "Get contract info", + "description": "Retrieves details for a specific smart contract.", + "slug": "/stacks/api/stacks-blockchain/smart-contracts/info", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/contract/{contract_id}', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get contracts status", + "description": "Retrieves the deployment status of multiple smart contracts.", + "slug": "/stacks/api/stacks-blockchain/smart-contracts/status", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/smart-contracts/status', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Mempool", + "description": "Retrieve information around transaction fees and priorities in the mempool.", + "slug": "/stacks/api/stacks-blockchain/mempool/index", + "content": "" + }, + { + "title": "Get transaction fee priorities", + "description": "Retrieves estimated fee priorities (in micro-STX) for all transactions that are currently in the mempool. Also returns priorities separated by transaction type.", + "slug": "/stacks/api/stacks-blockchain/mempool/transaction-fee-priorities", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/mempool/fees', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get burn block", + "description": "Retrieves a single burn block.", + "slug": "/stacks/api/stacks-blockchain/burn-blocks/get-burn-block", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/burn-blocks/{height_or_hash}', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Burn blocks", + "description": "Retrieve information about specific burned blocks.", + "slug": "/stacks/api/stacks-blockchain/burn-blocks/index", + "content": "" + }, + { + "title": "Get burn blocks", + "description": "Retrieves a list of recent burn blocks.", + "slug": "/stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v2/burn-blocks/', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Tokens", + "description": "Read-only endpoints to obtain token details.", + "slug": "/stacks/api/stacks-blockchain/tokens/index", + "content": "" + }, + { + "title": "Get fungible token holders", + "description": "Retrieves the list of fungible token holders for a given token ID.", + "slug": "/stacks/api/stacks-blockchain/tokens/holders", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tokens/ft/{token}/holders', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Non-fungible tokens", + "description": "Read-only endpoints to obtain non-fungible token details.", + "slug": "/stacks/api/stacks-blockchain/non-fungible-tokens/index", + "content": "" + }, + { + "title": "Get non-fungible token holdings", + "description": "Retrieves a list of non-fungible tokens owned by the given principal (STX address or smart contract ID).", + "slug": "/stacks/api/stacks-blockchain/non-fungible-tokens/holdings", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tokens/nft/holdings', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get non-fungible token mints", + "description": "Retrieves a list of non-fungible token mints for a given asset identifier.", + "slug": "/stacks/api/stacks-blockchain/non-fungible-tokens/mints", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tokens/nft/mints', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Get non-fungible token history", + "description": "Retrieves the history of a non-fungible token.", + "slug": "/stacks/api/stacks-blockchain/non-fungible-tokens/history", + "content": "\n<APIPage\n document=\"./openapi/stacks-blockchain-api.json\"\n operations={[{ path: '/extended/v1/tokens/nft/history', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Getting started", + "description": "Get started with Hiro APIs.", + "slug": "/stacks/api/getting-started", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nThe Stacks Blockchain API expands the intentionally minimal RPC endpoints available in Stacks nodes and indexes, cleans, and enriches on-chain data to put everything you need at your fingertips. Who knew getting reliable blockchain data could be this easy?\n\n## Popular endpoints\n\n<Callout title=\"RPC endpoints\" type=\"info\">\nIf you're looking for direct access to the Stacks node, including the ability to broadcast transactions and interact with smart contracts, check out our [Stacks Node RPC](/stacks/rpc-api) documentation.\n</Callout>\n\n<Callout title=\"Need help building with the Stacks Blockchain API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#api</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n" + }, + { + "title": "Requesting proofs", + "description": "Understand proof requests from API endpoints.", + "slug": "/stacks/api/requesting-proofs", + "content": "\nSeveral endpoints will request the [MARF Merkel Proof](https://github.com/stacksgov/sips/blob/main/sips/sip-004/sip-004-materialized-view.md#marf-merkle-proofs) by default.\n\nProvided with the proof, a client can verify the value, cumulative energy spent, and the number of confirmation for the response value provided by the API.\n\nRequesting the proof requires more resources (computation time, response time, and response body size). To avoid the additional resources, in case verification is not required, API endpoints allow setting the request parameter: `proof=0`. The returned response object will not have any proof fields.\n" + }, + { + "title": "Developer environment setup", + "description": "Set up your development environment for Stacks.", + "slug": "/stacks/setup", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>" + }, + { + "title": "Testing environments", + "description": "Setup and configure testing environments for your Clarity smart contracts.", + "slug": "/stacks/testing-environments", + "content": "\nIntegration testing is a crucial step in smart contract development that involves testing how different components of your system work together. The Clarinet JS SDK provides powerful tools for writing and running integration tests, allowing you to simulate complex scenarios and interactions between multiple contracts.\n\nBy using integration tests, you can ensure that your smart contracts function correctly as part of a larger system and catch potential issues that might not be apparent in unit tests alone.\n\nIn this guide, you will:\n\n1. [Set up a Clarinet project with a `defi` contract.](#set-up-a-clarinet-project)\n2. [Write an integration test for the smart contract.](#test-the-deposit-and-borrow-functionality)\n3. [Run tests and generate coverage reports.](#run-tests-and-generate-coverage-reports)\n\n---\n\n## Set up a Clarinet project\n\nStart by creating a new Clarinet project. This command will create a new directory named `defi` and set up a basic Clarinet project inside it.\n\n```terminal\n$ clarinet new stx-defi\n$ cd stx-defi\n```\n\nAfter changing into your project directory, run `npm install` to install the package dependencies for testing.\n\n```terminal\n$ npm install\n```\n\nWe are going to use the same `defi` contract that we used in the [unit testing guide](/stacks/clarinet-js-sdk/guides/unit-testing), but with some additional functionality - the ability to `borrow` STX from the contract. If you don't have this project set up already, follow the steps below:\n\n```terminal\n$ clarinet contract new defi\n```\n\nThen, inside your `defi.clar` file, copy and paste the following contract code:\n\n```clarity\n;; Error constants for various failure scenarios.\n(define-constant err-overborrow (err u300))\n\n;; The interest rate for loans, represented as 10% (out of a base of 100).\n(define-data-var loan-interest-rate uint u10) ;; Representing 10% interest rate\n\n\n;; Holds the total amount of deposits in the contract, initialized to 0.\n(define-data-var total-deposits uint u0)\n\n;; Maps a user's principal address to their deposited amount.\n(define-map deposits { owner: principal } { amount: uint })\n\n;; Maps a borrower's principal address to their loan details: amount and the last interaction block.\n(define-map loans principal { amount: uint, last-interaction-block: uint })\n\n;; Public function for users to deposit STX into the contract.\n;; Updates their balance and the total deposits in the contract.\n(define-public (deposit (amount uint))\n (let\n (\n ;; Fetch the current balance or default to 0 if none exists.\n (current-balance (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n )\n ;; Transfer the STX from sender = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\" to recipient = \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.defi (ie: contract identifier on the chain!)\".\n (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))\n ;; Update the user's deposit amount in the map.\n (map-set deposits { owner: tx-sender } { amount: (+ current-balance amount) })\n ;; Update the total deposits variable.\n (var-set total-deposits (+ (var-get total-deposits) amount))\n ;; Return success.\n (ok true)\n )\n)\n\n;; Public function for users to borrow STX based on their deposits.\n(define-public (borrow (amount uint))\n (let\n (\n ;; Fetch user's deposit or default to 0.\n (user-deposit (default-to u0 (get amount (map-get? deposits { owner: tx-sender }))))\n ;; Calculate the maximum amount the user is allowed to borrow. (which will be upto HALF of what they deposited)\n (allowed-borrow (/ user-deposit u2))\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n ;; Calculate the new loan total after borrowing additional amount.\n (new-loan (+ amount))\n )\n ;; Ensure the requested borrow amount does not exceed the allowed amount.\n (asserts! (<= new-loan allowed-borrow) err-overborrow)\n ;; Transfer the borrowed STX to the user.\n (let\n (\n (recipient tx-sender)\n )\n (try! (as-contract (stx-transfer? amount tx-sender recipient)))\n )\n ;; Update the user's loan details in the map.\n (map-set loans tx-sender { amount: new-loan, last-interaction-block: block-height })\n ;; Return success.\n (ok true)\n )\n)\n\n;; Read-only function to get the total balance by tx-sender\n(define-read-only (get-balance-by-sender)\n (ok (map-get? deposits { owner: tx-sender }))\n)\n\n;; Read-only function to get the total amount owed by the user.\n(define-read-only (get-amount-owed)\n (let\n (\n ;; Fetch current loan details or default to initial values.\n (current-loan-details (default-to { amount: u0, last-interaction-block: u0 } (map-get? loans tx-sender )))\n ;; Calculate accrued interest on the current loan.\n (accrued-interest (calculate-accrued-interest (get amount current-loan-details) (get last-interaction-block current-loan-details)))\n ;; Calculate the total amount due including interest.\n (total-due (+ (get amount current-loan-details) (unwrap-panic accrued-interest)))\n )\n ;; Return the total amount due.\n (ok total-due)\n )\n)\n\n;; Private function to calculate the accrued interest on a loan.\n(define-private (calculate-accrued-interest (principal uint) (start-block uint))\n (let\n (\n ;; Calculate the number of blocks elapsed since the last interaction.\n (elapsed-blocks (- block-height start-block))\n ;; Calculate the interest based on the principal, rate, and elapsed time.\n (interest (/ (* principal (var-get loan-interest-rate) elapsed-blocks) u10000))\n )\n ;; Ensure the loan started in the past (not at block 0).\n (asserts! (not (is-eq start-block u0)) (ok u0))\n ;; Return the calculated interest.\n (ok interest)\n )\n)\n```\n\nRun `clarinet check` to ensure that your smart contract is valid and ready for testing.\n\n<Callout>\nYou can find the full code for this project in [this repo](https://github.com/hirosystems/clarity-examples/tree/main/examples/stx-defi).\n</Callout>\n\n## Test the deposit and borrow functionality\n\nIn order to `borrow` STX from the contract, users must first `deposit` STX into it. Therefore, we need to write an integration test that simulates the interaction between these two functions.\n\nInside of your `defi.test.ts` file, replace the boilerplate code and add the following:\n\n```typescript\nimport { describe, it, expect } from 'vitest';\nimport { Cl } from '@stacks/transactions';\n\nconst accounts = simnet.getAccounts();\nconst wallet1 = accounts.get('wallet_1')!;\n\ndescribe('stx-defi', () => {\n it('borrows 10 and verifies the amount owed to be 10', () => {\n simnet.callPublicFn('defi', 'deposit', [Cl.uint(1000)], wallet1);\n const totalDeposits = simnet.getDataVar('defi', 'total-deposits');\n expect(totalDeposits).toBeUint(1000);\n\n simnet.callPublicFn('defi', 'borrow', [Cl.uint(10)], wallet1);\n const { result } = simnet.callReadOnlyFn('defi', 'get-amount-owed', [], wallet1);\n expect(result).toBeOk(Cl.uint(10));\n });\n});\n```\n\nIn this integration test, we're simulating a scenario where a user deposits STX into the DeFi contract and then borrows against that deposit. Let's walk through the process step by step.\n\nWe start by simulating a deposit of 1000 STX from `wallet1`. To do this, we use the `callPublicFn` method from the Clarinet JS SDK `simnet` object, which allows us to call public functions in our smart contract just as we would on the actual blockchain.\n\nAfter making the deposit, we want to verify that it was successful. We do this by checking the total deposits in the contract using `getDataVar`.\n\nThis handy method lets us peek at the value of data variables defined in your contract.\n\n<Callout>\nTo learn more about available methods for integration testing, check out the [reference page](/stacks/clarinet-js-sdk/references/methods).\n</Callout>\n\nTo ensure the deposit was recorded correctly, we use a custom matcher, `toBeUint`. This matcher is specifically designed to check if a value is a Clarity unsigned integer with the exact value we expect.\n\nWith the deposit confirmed, we simulate `wallet1` borrowing 10 STX. We do this with another call to `callPublicFn`, this time invoking the `borrow` function of our contract.\n\nAfter the borrowing operation, we want to check how much `wallet1` owes. We use `callReadOnlyFn` to call a read-only function named `get-amount-owed` in our contract.\n\nFinally, we verify the amount owed using another custom matcher, `toBeOk(Cl.uint(10))`. This matcher is particularly useful because it checks two things at once:\n\n1. That our contract returned a successful Clarity response type.\n2. That the value returned is a Clarity unsigned integer with the exact value we expect (`10`).\n\nThese custom matchers and simnet methods are powerful tools and allow you to simulate complex interactions with your smart contracts and make detailed assertions about the results.\n\n## Run tests and generate coverage reports\n\nTo run your tests, use:\n\n```terminal\n$ npm run test\n```\n\nTo generate a coverage report, use:\n\n```terminal\n$ npm run coverage\n```\n\nThis will run your tests and produce a detailed coverage report, helping you identify any untested parts of your contract.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet-js-sdk/references/simnet\"\n title=\"API reference\"\n description=\"Dive deeper into the properties and methods available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/custom-matchers\"\n title=\"Custom matchers\"\n description=\"Learn about the custom matchers that are available in the Clarinet JS SDK.\"\n />\n <Card\n href=\"/stacks/clarinet-js-sdk/references/methods\"\n title=\"SDK methods\"\n description=\"Learn about the methods available in the Clarinet JS SDK.\"\n />\n</Cards>\n" + }, + { + "title": "Blockchain development", + "description": "Build your blockchain on Stacks.", + "slug": "/stacks/blockchain-development", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nLFG!\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in a local environment on Stacks.\n- **[Stacks.js](/stacks/stacks.js)**: Don’t reinvent the wheel and build faster with a JS library that handles basic blockchain functionality.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n\n<br />\n\n<Callout title=\"Need help building with Clarinet JS SDK?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#clarinet</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>" + }, + { + "title": "Overview", + "description": "A JavaScript library for authenticating users as well as signing transactions and messages.", + "slug": "/stacks/connect/index", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nStacks Connect is a JavaScript library that can authenticate the identity of your users and prompt them to sign transactions and messages. In other words, Stacks Connect handles some of the most basic functions you need in a web app, including enabling users to log in to your app as well as broadcasting in-app transactions to the Stacks network.\n\n## Installation\n\n```package-install\n@stacks/connect\n```\n\n## Guides\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/connect/guides/authenticate-users\"\n title=\"Authenticate users\"\n description=\"Connect to user wallets and authenticate their on-chain identity.\"\n />\n <SecondaryCard\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Enable users to interact with smart contracts through your app.\"\n />\n <SecondaryCard\n href=\"/stacks/connect/guides/sign-messages\"\n title=\"Sign messages\"\n description=\"Prompt users to sign and verify messages.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Clarinet](/stacks/clarinet)**: Build your app in the go-to development environment on Stacks.\n- **[Stacks Blockchain API](/stacks/api)**: Fetch data and broadcast transactions with the Stacks Blockchain API.\n- **[Stacks.js](/stacks/stacks.js)**: A collection of JavaScript libraries to build web applications on Stacks.\n\n<br />\n\n<Callout title=\"Need help building with Stacks Connect?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#stacks-js</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>" + }, + { + "title": "Wallet Support", + "description": "Compatibility information for different wallet providers", + "slug": "/stacks/connect/support", + "content": "\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow\n} from \"@/components/ui/table\";\n\nThis page provides detailed information about which methods and events are supported by different wallet providers in the Stacks ecosystem.\n\n## Method Compatibility\n\n<Table>\n <TableHeader>\n <TableRow>\n <TableHead>Method</TableHead>\n <TableHead>Leather</TableHead>\n <TableHead>Xverse-like</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow>\n <TableCell><code>getAddresses</code></TableCell>\n <TableCell>🟡 No support for experimental purposes</TableCell>\n <TableCell>🟡 Use <code>wallet_connect</code> instead</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>sendTransfer</code></TableCell>\n <TableCell>🟡 Expects <code>amount</code> as string</TableCell>\n <TableCell>🟡 Expects <code>amount</code> as number</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>signPsbt</code></TableCell>\n <TableCell>🟡 Uses signing index array only</TableCell>\n <TableCell>🟡 Uses <code>signInputs</code> record instead of array</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_getAddresses</code></TableCell>\n <TableCell>🟢</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_getAccounts</code></TableCell>\n <TableCell>🔴</TableCell>\n <TableCell>🟢</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_getNetworks</code></TableCell>\n <TableCell>🔴</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_transferStx</code></TableCell>\n <TableCell>🟢</TableCell>\n <TableCell>🟢</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_transferSip10Ft</code></TableCell>\n <TableCell>🟢</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_transferSip9Nft</code></TableCell>\n <TableCell>🟢</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_callContract</code></TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only, no support for <code>postConditions</code></TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_deployContract</code></TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only, no support for <code>postConditions</code></TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_signTransaction</code></TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_signMessage</code></TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_signStructuredMessage</code></TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n <TableCell>🟡 Hex-encoded Clarity values only</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_updateProfile</code></TableCell>\n <TableCell>🔴</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n </TableBody>\n</Table>\n\n## Event Compatibility\n\n<Table>\n <TableHeader>\n <TableRow>\n <TableHead>Event</TableHead>\n <TableHead>Leather</TableHead>\n <TableHead>Xverse</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow>\n <TableCell><code>stx_accountChange</code></TableCell>\n <TableCell>🔴</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n <TableRow>\n <TableCell><code>stx_networkChange</code></TableCell>\n <TableCell>🔴</TableCell>\n <TableCell>🔴</TableCell>\n </TableRow>\n </TableBody>\n</Table>\n\n**Legend**\n\n- 🔴 No support (yet)\n- 🟡 Partial support\n- 🟢 Supported\n\n## Compatibility Layer\n\nThe `request` method in `@stacks/connect` adds a layer of auto-compatibility for different wallet providers. This helps unify the interface where wallet providers may implement methods and results differently.\n\n| Method | Status | Notes |\n| --------------------------- | ------ | ---------------------------------------------------------------------------------------------------- |\n| `getAddresses` | 🔵 | Maps to `wallet_connect` for Xverse-like wallets |\n| `sendTransfer` | 🔵 | Converts `amount` to number for Xverse, string for Leather |\n| `signPsbt` | 🟡 | Transforms PSBT format for Leather (base64 to hex) with lossy restructure of `signInputs` |\n| `stx_getAddresses` | 🔵 | Maps to `wallet_connect` for Xverse-like wallets |\n| `stx_callContract` | 🔵 | Transforms Clarity values to hex-encoded format for compatibility |\n| `stx_deployContract` | 🔵 | Transforms Clarity values to hex-encoded format for compatibility |\n| `stx_signTransaction` | 🔵 | Transforms Clarity values to hex-encoded format for compatibility |\n| `stx_signMessage` | 🔵 | Transforms Clarity values to hex-encoded format for compatibility |\n| `stx_signStructuredMessage` | 🔵 | Transforms Clarity values to hex-encoded format for compatibility |\n\n- 🟢 No overrides needed for any wallet\n- 🔵 Has compatibility overrides that maintain functionality\n- 🟡 Has breaking overrides that may lose some information\n" + }, + { + "title": "Authenticate users", + "description": "Connect to user wallets and authenticate your users using @stacks/connect.", + "slug": "/stacks/connect/examples/authenticate-users", + "content": "\nimport { ConnectWalletButton } from '@/components/code/connect-wallet-button';\nimport { ContentBackground } from '@/components/ui/icon';\n\nAuthentication is a fundamental part of many web applications, ensuring that users are who they claim to be and that their data is secure. With the Stacks blockchain, user authentication involves connecting to users' wallets and managing their sessions securely.\n\nThe `@stacks/connect` package provides the tools needed to integrate this functionality seamlessly into your web app.\n\nIn this guide, you will learn how to:\n\n1. [Install the `@stacks/connect` package](#install-the-stacksconnect-package).\n2. [Connect to a user's wallet](#connect-to-a-users-wallet).\n3. [Manage authentication state](#manage-authentication-state).\n4. [Access user data](#access-user-data).\n\n{/* <Callout>To see this guide in action, check out a full example [here](https://github.com/hiro-so/stacks-connect-example).</Callout> */}\n\n---\n\n## Install the @stacks/connect package\n\n```package-install\n@stacks/connect\n```\n\n## Connect to a user's wallet\n\nAfter installing the `@stacks/connect` package, you can use the `connect` function to initiate a wallet connection. This will trigger a popup that allows users to select and connect their wallet.\n\n```ts\nimport { connect } from '@stacks/connect';\n\nasync function authenticate() {\n const response = await connect();\n // response contains the user's addresses\n}\n```\n\n<div className=\"not-prose relative overflow-hidden\">\n <div className=\"relative bg-card rounded-lg border border-border/50 overflow-auto p-8 h-auto\">\n <div className=\"absolute inset-x-0 bottom-0\">\n <ContentBackground />\n </div>\n <div className=\"grid place-items-center h-full\">\n <ConnectWalletButton />\n </div>\n </div>\n</div>\n\nThe `connect` function stores the user's addresses in local storage by default, making it easy to persist the user's session across page reloads and browser sessions.\n\n<Callout>You can customize the connection behavior by passing options to the `connect` function, such as forcing wallet selection or specifying default providers. See the [advanced usage](/stacks/connect/packages/connect#advanced-usage) section for more details.</Callout>\n\n## Manage authentication state\n\nYou can manage the user's authentication state using the following functions:\n\n```ts\nimport { connect, disconnect, isConnected } from '@stacks/connect';\n\n// Check if user is connected\nconst authenticated = isConnected();\n\n// Connect to wallet\nawait connect();\n\n// Disconnect user\ndisconnect(); // clears local storage and selected wallet\n```\n\n## Access user data\n\nOnce connected, you can access the user's data using the `getLocalStorage` function or make specific requests using the `request` method:\n\n```ts\nimport { getLocalStorage, request } from '@stacks/connect';\n\n// Get stored user data\nconst userData = getLocalStorage();\n// {\n// \"addresses\": {\n// \"stx\": [\n// { \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\" },\n// ],\n// \"btc\": [\n// { \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\" },\n// ]\n// }\n// }\n\n// Get detailed account information\nconst accounts = await request('stx_getAccounts');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cd...\",\n// \"gaiaHubUrl\": \"https://hub.hiro.so\",\n// \"gaiaAppKey\": \"0488ade4040658015580000000dc81e3a5...\"\n// }\n// ]\n// }\n```\n\n<Callout title=\"Note\">For a list of all available methods, see the [reference](/stacks/connect/packages/connect) page.</Callout>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n <Card\n href=\"/stacks/stacks.js/guides/post-conditions\"\n title=\"Deep dive into post-conditions\"\n description=\"Learn how to build post-conditions to secure your smart contracts.\"\n />\n</Cards>" + }, + { + "title": "Broadcast transactions", + "description": "Prompt users to sign transactions and broadcast them to the Stacks blockchain.", + "slug": "/stacks/connect/examples/broadcast-transactions", + "content": "\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nThe process of broadcasting transactions is fundamental for interacting with blockchains, whether you're transferring tokens, deploying contracts, or executing contract functions.\n\nIn this guide, you will learn how to:\n\n1. [Install the necessary packages](#setup-and-installation)\n2. [Connect to a user's wallet](#connect-to-a-users-wallet)\n3. [Sign and broadcast transactions](#sign-and-broadcast-transactions)\n4. [Handle transaction results](#handle-transaction-results)\n\n---\n\n## Setup and installation\n\nInstall the required packages to start building and broadcasting transactions:\n\n```package-install\n@stacks/connect @stacks/transactions\n```\n\n## Connect to a user's wallet\n\nBefore signing transactions, users need to connect their wallet to your application. Use the `connect` function to initiate a wallet connection:\n\n```ts\nimport { connect, isConnected } from '@stacks/connect';\n\nasync function connectWallet() {\n if (!isConnected()) {\n const response = await connect();\n console.log('Connected with addresses:', response);\n }\n}\n```\n\n<Callout>\n For more details on wallet connection, see the [authentication guide](/stacks/connect/guides/authenticate-users).\n</Callout>\n\n## Sign and broadcast transactions\n\nThere are three types of transactions you can create: STX transfers, contract deployments, and contract calls.\n\n<Tabs defaultValue=\"transfer\">\n <TabsList className='flex flex-wrap md:w-max'>\n <TabsTrigger value=\"transfer\" className='tab group'>\n <Badge className='badge transition-colors'>STX transfer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"deploy\" className='tab group'>\n <Badge className='badge transition-colors'>Contract deployment</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"execute\" className='tab group'>\n <Badge className='badge transition-colors'>Contract execution</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"transfer\">\n To transfer STX tokens, use the `request` method with `stx_transferStx`:\n\n ```ts\n import { request } from '@stacks/connect';\n\n async function transferStx() {\n const response = await request('stx_transferStx', {\n recipient: 'ST2EB9WEQNR9P0K28D2DC352TM75YG3K0GT7V13CV',\n amount: '100', // in micro-STX (1 STX = 1,000,000 micro-STX)\n memo: 'Reimbursement', // optional\n });\n \n console.log('Transaction ID:', response.txId);\n }\n ```\n </TabsContent>\n <TabsContent value=\"deploy\">\n To deploy a smart contract, use the `request` method with `stx_deployContract`:\n\n ```ts\n import { request } from '@stacks/connect';\n\n async function deployContract() {\n const codeBody = '(define-public (say-hi) (ok \"hello world\"))';\n \n const response = await request('stx_deployContract', {\n name: 'my-contract',\n code: codeBody,\n clarityVersion: 3, // optional, defaults to latest version\n });\n \n console.log('Transaction ID:', response.txId);\n }\n ```\n\n <Callout>Contracts will deploy to the Stacks address of the connected wallet.</Callout>\n </TabsContent>\n <TabsContent value=\"execute\">\n To call a contract function, use the `request` method with 'stx_callContract'. Here's an example using a simple contract:\n\n ```clarity\n (define-public (say-hi)\n (print \"hi\")\n (ok u0)\n )\n ```\n\n Here's how to call this function:\n\n ```ts\n import { request } from '@stacks/connect';\n import { Cl } from '@stacks/transactions';\n\n async function callContract() {\n const response = await request('stx_callContract', {\n contractAddress: 'ST22T6ZS7HVWEMZHHFK77H4GTNDTWNPQAX8WZAKHJ',\n contractName: 'my-contract',\n functionName: 'say-hi',\n functionArgs: [], // array of Clarity values\n });\n \n console.log('Transaction ID:', response.txId);\n }\n ```\n\n For functions that take arguments, you can use the `Cl` namespace to construct Clarity values:\n\n ```ts\n const functionArgs = [\n Cl.uint(123),\n Cl.stringAscii(\"hello\"),\n Cl.standardPrincipalCV(\"ST1X..\"),\n ];\n ```\n </TabsContent>\n</Tabs>\n\n## Handle transaction results\n\nWhen a transaction is signed and broadcast, the `request` method returns a response object containing information about the transaction:\n\n```ts\ninterface TransactionResponse {\n txId: string; // The transaction ID\n txRaw: string; // The raw transaction hex\n}\n```\n\nYou can use the transaction ID to create a link to view the transaction in the explorer:\n\n```ts\nasync function handleTransaction() {\n const response = await request('stx_transferStx', {\n recipient: 'ST2EB9WEQNR9P0K28D2DC352TM75YG3K0GT7V13CV',\n amount: '100',\n });\n \n const explorerUrl = `https://explorer.stacks.co/txid/${response.txId}`;\n console.log('View transaction in explorer:', explorerUrl);\n}\n```\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/sign-messages\"\n title=\"Sign messages\"\n description=\"Learn how to sign messages using Stacks.js.\"\n />\n <Card\n href=\"/stacks/stacks.js/guides/post-conditions\"\n title=\"Deep dive into post-conditions\"\n description=\"Learn how to use post-conditions to secure your smart contracts.\"\n />\n</Cards>\n" + }, + { + "title": "Sign messages", + "description": "Prompt users to sign a message to prove they control an address or authorize an in-app action.", + "slug": "/stacks/connect/examples/sign-messages", + "content": "\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nWith Stacks Connect, users can sign a cryptographic message to prove ownership of a particular address. This is helpful for a wide range of use cases. For example, you can use message signing to create token-gated features (a user signs a message to prove they control an address holding the corresponding token requirements) or to prove the user agreed to your terms of service.\n\nIn this guide, you will learn how to:\n\n1. [Set up and install necessary packages](#setup-and-installation).\n2. [Connect to a user's wallet](#connect-to-a-users-wallet).\n3. [Sign messages](#sign-messages).\n4. [Verify signatures](#verify-signatures).\n\n---\n\n## Setup and installation\n\nUsing your preferred package manager, install the following packages:\n\n```package-install\n@stacks/connect @stacks/encryption\n```\n\n## Connect to a user's wallet\n\nBefore signing messages, users need to connect their wallet to your application. Use the `connect` function to initiate a wallet connection:\n\n```ts\nimport { connect, isConnected } from '@stacks/connect';\n\nasync function connectWallet() {\n if (!isConnected()) {\n const response = await connect();\n console.log('Connected with addresses:', response);\n }\n}\n```\n\n<Callout>\n For more details on wallet connection, see the [authentication guide](/stacks/connect/guides/authenticate-users).\n</Callout>\n\n## Sign messages\n\nTo request a message signature, use the `request` method with `stx_signMessage`:\n\n```ts\nimport { request } from '@stacks/connect';\n\nasync function signMessage() {\n const message = 'Hello World';\n \n const response = await request('stx_signMessage', {\n message,\n });\n \n console.log('Signature:', response.signature);\n console.log('Public key:', response.publicKey);\n}\n```\n\nFor structured messages, you can use `stx_signStructuredMessage`:\n\n```ts\nimport { request } from '@stacks/connect';\nimport { Cl } from '@stacks/transactions';\n\nasync function signStructuredMessage() {\n const message = Cl.tuple({\n structured: Cl.stringAscii('message'),\n num: Cl.uint(3)\n });\n \n const domain = Cl.tuple({\n name: Cl.stringAscii('My App'),\n version: Cl.stringAscii('1.0.0'),\n 'chain-id': Cl.uint(1)\n });\n\n const response = await request('stx_signStructuredMessage', {\n message,\n domain\n });\n \n console.log('Signature:', response.signature);\n console.log('Public key:', response.publicKey);\n}\n```\n\n## Verify signatures\n\nTo verify a signature, use the `verifyMessageSignatureRsv` function from the `@stacks/encryption` package:\n\n```ts\nimport { verifyMessageSignatureRsv } from '@stacks/encryption';\n\nasync function verifySignature() {\n const message = 'Hello World';\n \n const response = await request('stx_signMessage', {\n message\n });\n \n const { signature, publicKey } = response;\n \n const verified = verifyMessageSignatureRsv({\n message,\n signature,\n publicKey\n });\n \n if (verified) {\n console.log('Signature verified!');\n }\n}\n```\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n <Card\n href=\"/stacks/stacks.js/guides/post-conditions\"\n title=\"Deep dive into post-conditions\"\n description=\"Learn how to use post-conditions to secure your smart contracts.\"\n />\n</Cards>\n" + }, + { + "title": "Migration Guide", + "description": "How to migrate from v7.x.x to v8.x.x of @stacks/connect", + "slug": "/stacks/connect/examples/migration", + "content": "\nimport { Steps, Step } from 'fumadocs-ui/components/steps'\n\n\nFor a while now, the Stacks community has been working on a new standard for wallet-to-dapp communication.\nStacks Connect and related projects now use standards like [WBIPs](https://wbips.netlify.app/) and [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) to allow wallets to communicate with dapps in a more simplified and flexible way.\n\n<Callout title=\"Migration Status\">\nPlease be patient during this latest migration.\nThere has been a long-running effort together with wallets to modernize and move forward the Stacks web ecosystem.\nIt is now culminating in [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) and the new `request` method in Stacks Connect `8.x.x`.\nBear with us during this migration.\nWallets are still working through some bugs, details, and improvements.\n\n_Feel free to continue using Stacks Connect `7.x.x` while things stabilize._\nThe `7.x.x` version may still be more well supported by some wallets.\n\nFor the legacy version of `@stacks/connect` using JWT tokens, you can use:\n\n```sh\nnpm install @stacks/connect@7.10.1\n```\n\n</Callout>\n\n## Deprecations\n\nThe following classes, methods, and types are deprecated in favor of the new `request` RPC methods:\n\n- `show...` and `open...` methods\n- `authenticate` method\n- `UserSession` class and related functionality\n- `AppConfig` class\n- `SessionOptions` interface\n- `SessionData` interface\n- `UserData` interface\n- `SessionDataStore` class\n- `InstanceDataStore` class\n- `LocalStorageStore` class\n\n<Callout title=\"Backwards Compatibility\">\nTo make migrating easier, the familiar `UserSession` & `AppConfig` class still exists and is semi-backwards compatible for the `8.x.x` release.\nIt will \"cache\" the user's address in local storage and allow access to it via the `loadUserData` method (as previously done).\n</Callout>\n\n## Migration Steps\n\nTo update from `<=7.x.x` to latest/`8.x.x`, follow these steps:\n\n<Steps>\n <Step title=\"Update your @stacks/connect version\">\n ```sh\n npm install @stacks/connect@latest\n ```\n </Step>\n\n <Step title=\"Replace Legacy Methods with request\">\n Switch from `showXyz`, `openXyz`, `doXyz` methods to the `request` method:\n\n - `request` follows the pattern `request(method: string, params: object)`, see [Usage](#usage) for more details\n - `request` is an async function, so replace the `onFinish` and `onCancel` callbacks with `.then().catch()` or `try & await`\n\n Examples:\n - `showConnect()`, `authenticate()` → `connect()`\n - `useConnect().doContractCall({})` → `request(\"stx_callContract\", {})`\n - `openContractDeploy()` → `request(\"stx_deployContract\", {})`\n </Step>\n\n <Step title=\"Use Connect Instead of ShowConnect/Authenticate\">\n Switch from `showConnect` or `authenticate` to `connect()` methods:\n\n - `connect()` is an alias for `request({forceWalletSelect: true}, 'getAddresses')`\n - `connect()` by default caches the user's address in local storage\n </Step>\n\n <Step title=\"Update Authentication State Management\">\n - Switch from `UserSession.isSignedIn()` to `isConnected()`\n - Switch from `UserSession.signUserOut()` to `disconnect()`\n </Step>\n\n <Step title=\"Remove Legacy Code\">\n - Remove code referencing deprecated methods (`AppConfig`, `UserSession`, etc.)\n - Remove the `@stacks/connect-react` package\n - You may need to manually reload a component to see local storage updates\n - No custom hooks are needed to use Stacks Connect anymore\n - We are working on a new `@stacks/react` package that will make usage even easier in the future (e.g., tracking transaction status, reloading components when a connection is established, updating the page when the network changes, and more)\n </Step>\n</Steps>\n\n## Address Access\n\nPreviously, the `UserSession` class was used to access the user's addresses and data, which abstracted away the underlying implementation details.\nNow, the `request` method is used to directly interact with the wallet, giving developers more explicit control and clarity over what's happening under the hood.\nThis manual approach makes the wallet interaction more transparent and customizable.\nDevelopers can manually manage the currently connected user's address in e.g. local storage, jotai, etc. or use the `connect()`/`request()` method to cache the address in local storage.\n\n<Callout title=\"Security Note\">\nFor security reasons, the `8.x.x` release only returns the current network's address (where previously both mainnet and testnet addresses were returned).\n</Callout>\n" + }, + { + "title": "@stacks/connect", + "description": "Connect is a JavaScript library for building web applications connected to Stacks.", + "slug": "/stacks/connect/packages/connect", + "content": "\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\nStacks Connect enables you to authenticate your users and connect your app to their wallet. This reference contains more detailed information on how you can authenticate users, sign and broadcast transactions on their behalf, and enable users to sign messages.\n\n<Callout title=\"Migration Note\">\nPlease be patient during the migration to version 8.x.x. There has been a long-running effort together with wallets to modernize the Stacks web ecosystem, culminating in [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) and the new `request` method in Stacks Connect 8.x.x. For the legacy version of `@stacks/connect` using JWT tokens, please use version 7.10.1. See the [Migration Guide](/docs/stacks/connect/guides/migration) for more details.\n</Callout>\n\n### Installation\n\n```package-install\n@stacks/connect\n```\n\n### Connect to a wallet\n\nInitiate a wallet connection and request addresses:\n\n```typescript\nimport { connect } from '@stacks/connect';\n\nconst response = await connect(); // stores users address in local storage by default\n```\n\nGet the local storage data (stored by a connect call):\n\n```typescript\nimport { getLocalStorage } from '@stacks/connect';\n\nconst data = getLocalStorage();\n// {\n// \"addresses\": {\n// \"stx\": [\n// { \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\" },\n// ],\n// \"btc\": [\n// { \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\" },\n// ]\n// }\n```\n\nManaging the connection state:\n\n```typescript\nimport { connect, disconnect, isConnected } from '@stacks/connect';\n\nisConnected(); // false\nawait connect(); // similar to the `getAddresses` method\nisConnected(); // true\ndisconnect(); // clears local storage and selected wallet\nisConnected(); // false\n```\n\n### Use request to trigger wallet interactions\n\n```typescript\nimport { request } from '@stacks/connect';\n\n// CONNECT\nconst response = await request({ forceWalletSelect: true }, 'getAddresses');\n```\n\n### Available methods\n\n- [getAddresses](#getaddresses)\n- [sendTransfer](#sendtransfer)\n- [signPsbt](#signpsbt)\n- [stx_getAddresses](#stx_getaddresses)\n- [stx_getAccounts](#stx_getaccounts)\n- [stx_transferStx](#stx_transferstx)\n- [stx_callContract](#stx_callcontract)\n- [stx_deployContract](#stx_deploycontract)\n- [stx_signMessage](#stx_signmessage)\n- [stx_signStructuredMessage](#stx_signstructuredmessage)\n\n#### getAddresses\n\n```typescript\nconst response = await request('getAddresses');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\",\n// \"publicKey\": \"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69\",\n// },\n// {\n// \"address\": \"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr\",\n// \"publicKey\": \"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114\",\n// },\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\",\n// }\n// ]\n// }\n```\n\n#### sendTransfer\n\n```typescript\nconst response = await request('sendTransfer', {\n recipients: [\n {\n address: 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4', // recipient address\n amount: '1000', // amount in sats\n },\n // You can specify multiple recipients\n {\n address: 'bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh',\n amount: '2000',\n },\n ],\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### signPsbt\n\n```typescript\nconst response = await request('signPsbt', {\n psbt: 'cHNidP...', // base64 encoded PSBT string\n signInputs: [{ index: 0, address }], // indices of inputs to sign (optional)\n broadcast: false, // whether to broadcast the transaction after signing (optional)\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID (if broadcast is true)\n// \"psbt\": \"cHNidP...\" // The signed PSBT in base64 format\n// }\n```\n\n#### stx_getAddresses\n\n```typescript\nconst response = await request('stx_getAddresses');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\",\n// \"publicKey\": \"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69\",\n// },\n// {\n// \"address\": \"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr\",\n// \"publicKey\": \"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114\",\n// },\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\",\n// }\n// ]\n// }\n```\n\n#### stx_getAccounts\n\n```typescript\nconst response = await request('stx_getAccounts');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cd...\",\n// \"gaiaHubUrl\": \"https://hub.hiro.so\",\n// \"gaiaAppKey\": \"0488ade4040658015580000000dc81e3a5...\"\n// }\n// ]\n// }\n```\n\n#### stx_transferStx\n\n```typescript\nconst response = await request('stx_transferStx', {\n amount: '1000', // amount in micro-STX (1 STX = 1,000,000 micro-STX)\n recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN', // recipient address\n network: 'mainnet', // optional, defaults to mainnet\n memo: 'Optional memo', // optional memo field\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_callContract\n\n```typescript\nconst response = await request('stx_callContract', {\n contract: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN.counters', // contract in format: address.contract-name\n functionName: 'count', // name of the function to call\n functionArgs: [Cl.int(3)], // array of Clarity values as arguments\n network: 'mainnet', // optional, defaults to mainnet\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_deployContract\n\n```typescript\nconst response = await request('stx_deployContract', {\n name: 'counters', // name of the contract\n clarityCode: `(define-map counters principal int)\n\n(define-public (count (change int))\n (ok (map-set counters tx-sender (+ (get-count tx-sender) change)))\n)\n\n(define-read-only (get-count (who principal))\n (default-to 0 (map-get? counters who))\n)`, // Clarity code as string\n clarityVersion: '2', // optional, defaults to latest version\n network: 'mainnet', // optional, defaults to mainnet\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_signMessage\n\n```typescript\nconst response = await request('stx_signMessage', {\n message: 'Hello, World!', // message to sign\n});\n// {\n// \"signature\": \"0x1234...\", // The signature of the message\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\" // The public key that signed the message\n// }\n```\n\n#### stx_signStructuredMessage\n\n```typescript\nconst clarityMessage = Cl.parse('{ structured: \"message\", num: u3 }');\nconst clarityDomain = Cl.tuple({\n domain: Cl.stringAscii('example.com'),\n version: Cl.stringAscii('1.0.0'),\n 'chain-id': Cl.uint(1),\n});\n\nconst response = await request('stx_signStructuredMessage', {\n message: clarityMessage, // Clarity value representing the structured message\n domain: clarityDomain, // domain object for SIP-018 style signing\n});\n// {\n// \"signature\": \"0x1234...\", // The signature of the structured message\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\" // The public key that signed the message\n// }\n```\n\n### Error Handling\n\nThe `request` method returns a Promise, allowing you to handle errors using standard Promise-based error handling patterns. You can use either `try/catch` with `async/await` or the `.catch()` method with Promise chains.\n\n#### Using try/catch with async/await\n\n```typescript\nimport { request } from '@stacks/connect';\n\ntry {\n const response = await request('stx_transferStx', {\n amount: '1000',\n recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN',\n });\n // SUCCESS\n console.log('Transaction successful:', response.txid);\n} catch (error) {\n // ERROR\n console.error('Wallet returned an error:', error);\n}\n```\n\n### Compatibility\n\nThe `request` method by default adds a layer of auto-compatibility for different wallet providers. This is meant to unify the interface where wallet providers may not implement methods and results the same way.\n\n<Callout title=\"Wallet Support\">\nFor a complete list of wallet compatibility and support status, see the [Wallet Support](/docs/stacks/connect/support) page.\n</Callout>\n\n### Advanced Usage\n\n#### request\n\nThe `request` method is called with an optional options object as the first parameter:\n\n```typescript\nimport { request } from '@stacks/connect';\n\n// WITH options\nconst response = await request(\n {\n provider?: StacksProvider; // Custom provider to use for the request\n\n forceWalletSelect?: boolean; // Force user to select a wallet (default: false)\n persistWalletSelect?: boolean; // Persist selected wallet (default: true)\n enableOverrides?: boolean; // Enable provider compatibility (default: true)\n enableLocalStorage?: boolean; // Store address in local storage (default: true)\n\n defaultProviders?: WbipProvider[]; // Default wallets to display in modal\n approvedProviderIds?: string[]; // List of approved provider IDs to show in modal\n },\n 'method',\n params\n);\n\n// WITHOUT options\nconst response = await request('method', params);\n```\n\n<Callout title=\"Provider Compatibility\">\nThe `enableOverrides` option enables automatic compatibility fixes for different wallet providers. For example, it handles converting numeric types between string and number formats as needed by different wallets, and remaps certain method names to match wallet-specific implementations. This ensures consistent behavior across different wallet providers without requiring manual adjustments.\n</Callout>\n\n<Callout title=\"Approved Providers\">\nThe `approvedProviderIds` option allows you to filter which wallet providers are shown in the connect modal. This is useful when you want to limit the available wallet options to specific providers. For example, you might only want to support Leather wallet:\n\n```typescript\nconnect({ approvedProviderIds: ['LeatherProvider'] });\n```\n\nOr multiple specific wallets:\n\n```typescript\nconnect({ approvedProviderIds: ['LeatherProvider', 'xverse'] });\n```\n</Callout>\n\n#### requestRaw\n\nThe `requestRaw` method provides direct access to wallet providers without the additional features of `request`:\n\n```typescript\nimport { requestRaw } from '@stacks/connect';\n\nconst response = await requestRaw(provider, 'method', params);\n```\n\n<Callout title=\"Raw Request\">\n`requestRaw` bypasses the UI wallet selector, automatic provider compatibility fixes, and other features that come with `request`. Use this when you need more manual control over the wallet interaction process.\n</Callout>\n" + }, + { + "title": "Quickstart", + "description": "Learn how to transfer STX tokens via a web wallet using Stacks Connect.", + "slug": "/stacks/connect/quickstart", + "content": "\nimport { ChevronRight, Code, Terminal, Folder as FolderIcon } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\n\nIn this quickstart guide, you will learn how to set up your project, authenticate users with a web wallet, and initiate a STX token transfer.\n\nFor a deeper dive into the authentication process, check out the [authenticate users](/stacks/connect/guides/authenticate-users) guide.\n\n---\n\n<Steps>\n <Step>\n ## Install package dependencies\n \n Add the necessary packages to your project using your preferred package manager.\n\n ```package-install\n @stacks/connect\n ```\n </Step>\n <Step>\n ## Connect to a wallet\n \n The `connect` function stores the user's address in local storage by default, making it easy to persist the user's session across page reloads and browser sessions.\n\n ```ts connect.ts\n import { connect } from '@stacks/connect';\n\n const response = await connect();\n ```\n\n To access the user's addresses, you can use the `getLocalStorage` function.\n\n ```ts storage.ts\n import { getLocalStorage } from '@stacks/connect';\n\n const data = getLocalStorage();\n ```\n\n You can manage the connection's state using the following:\n\n ```ts connect.ts\n import { connect, disconnect, isConnected } from '@stacks/connect';\n\n isConnected(); // false\n await connect(); // similar to the `getAddresses` method\n isConnected(); // true\n disconnect(); // clears local storage and selected wallet\n isConnected(); // false\n ```\n </Step>\n <Step>\n ## Use `request` to trigger a transfer\n \n The process of connecting to a wallet gives the web app information about the wallet account, which enables interactions with the Stacks blockchain, like calling smart contracts.\n\n Using the `request` function, you can trigger wallet interactions using the `stx_transferStx` method.\n\n ```tsx connect.tsx\n const response = await request('stx_transferStx', {\n amount: '1000', // amount in micro-STX (1 STX = 1,000,000 micro-STX)\n recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN', // recipient address\n network: 'mainnet', // optional, defaults to mainnet\n memo: 'Optional memo', // optional memo field\n });\n ```\n </Step>\n</Steps>\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/authenticate-users\"\n title=\"Authenticate users\"\n description=\"Learn how to authenticate users using the Connect package in Stacks.js.\"\n />\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n <Card\n href=\"/stacks/connect/guides/sign-messages\"\n title=\"Sign messages\"\n description=\"Learn how to sign messages using Stacks.js.\"\n />\n</Cards>\n" + }, + { + "title": "Simnet", + "description": "The Simnet class is the main entry point for the Clarinet JS SDK. It provides properties and methods for interacting with the Clarinet network.", + "slug": "/stacks/reference/clarinet-js-sdk/simnet", + "content": "\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/components/ui/accordion\"\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n# `initSimnet`\n\nThe `initSimnet` function initializes a simulated network. It will often be the first function you call when using the SDK.\n\n## Parameters\n\nThe `manifestPath` is the path to the `Clarinet.toml` manifest file.\n\n <Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='transition-colors'>Creating a new instance of simnet</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"custom\" className='tab group'>\n <Badge className='badge transition-colors'>With a custom config path</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet();\n ```\n </TabsContent>\n <TabsContent value=\"custom\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet('./config/Clarinet.toml');\n ```\n </TabsContent>\n </Tabs>\n\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"schema\">\n <AccordionTrigger>Schema</AccordionTrigger>\n <AccordionContent>\n ```ts\n initSimnet(manifestPath?: string): Promise<Simnet>\n ```\n </AccordionContent>\n </AccordionItem>\n </Accordion>" + }, + { + "title": "Properties", + "description": "The Clarinet JS SDK provides properties that can be used to interact with simnet.", + "slug": "/stacks/reference/clarinet-js-sdk/properties", + "content": "\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `blockHeight`\n\nReturns the current block height of simnet.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the current block height</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentBlockHeight = simnet.blockHeight;\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n <Accordion title=\"Response\">\n ```ts\n 1\n ```\n </Accordion>\n</Accordions>\n\n\n# `deployer`\n\nReturns the default deployer address as defined in the project file.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the deployer address</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"set-deployer\" className='tab group'>\n <Badge className='badge transition-colors'>Setting the deployer to a new address</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentDeployerAddress = simnet.deployer;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"set-deployer\">\n ```ts\n simnet.deployer = 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5';\n const newDeployer = simnet.deployer\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `currentEpoch`\n\nReturns the current epoch of simnet.\n\nThis represents the Stacks blockchain's progress through discrete time periods, cycles, or upgrades.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the current epoch of simnet</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const epoch = simnet.currentEpoch;\n ```\n </TabsContent>\n</Tabs>\n\n<Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2.5\n ```\n </Accordion>\n</Accordions>\n\n" + }, + { + "title": "Custom Matchers", + "description": "A set of Vitest matchers that can be used to make assertions on Clarity values with the Clarinet JS SDK.", + "slug": "/stacks/reference/clarinet-js-sdk/custom-matchers", + "content": "\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `toHaveClarityType`\n\nCheck that a value has the right Clarity type, without checking its value.\n\n## Parameters\n\n\nThe Clarity type that the expected value should have.\n\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ok response</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toHaveClarityType(ClarityType.ResponseOk);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toHaveClarityType(expectedType: ClarityType)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeOk`\n\nCheck that a response is `(ok <ok-type>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ok response with a specific value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeOk(Cl.uint(1));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeOk(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeErr`\n\nCheck that a response is `(err <error-type>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an err response with a specific value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callPublicFn(\n 'counter',\n 'add',\n [Cl.uint(19)],\n simnet.deployer\n );\n\n expect(result).toBeErr(Cl.uint(500));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-constant TOO_BIG u10)\n (define-data-var count uint u0)\n\n (define-public (add (amount uint))\n (begin\n (let ((new-count (+ (var-get count) amount)))\n (if (<= new-count TOO_BIG)\n (begin\n (var-set count new-count)\n (ok (var-get count))\n )\n (err u500)\n )\n )\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeErr(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n# `toBeSome`\n\nCheck that a response is `(some <value>)` and has the expected value. Any Clarity value can be passed.\n\n## Parameters\n\n\nThe `ClarityValue` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an optional value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant',\n [Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5')],\n simnet.deployer\n );\n\n expect(result).toBeSome(Cl.bool(true));\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n (map-set ParticipantStatus 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeSome(expected: ClarityValue)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeNone`\n\nCheck that a response is `(none)`.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a none value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant',\n [Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5')],\n simnet.deployer\n );\n\n expect(result).toBeNone();\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeNone()\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeBool`\n\nAsserts the value of Clarity boolean (`true` or `false`).\n\n## Parameters\n\n\nThe `boolean` that the expected value should have.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a boolean value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'has-contributed',\n [Cl.standardPrincipal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM')],\n simnet.deployer\n );\n\n expect(result).toBeBool(true);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (has-contributed (who principal))\n (is-some (get contributionAmount (map-get? ParticipantStatus who)))\n )\n\n (map-set ParticipantStatus tx-sender { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBool(expected: boolean)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `toBeInt`\n\nAsserts the value of a Clarity integer.\n\n## Parameters\n\n\nThe `integer` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an integer value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeInt(1); // or `1n`\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count int 0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) 1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeInt(expected: number | bigint)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeUint`\n\nAsserts the value of a Clarity unsigned integer.\n\n## Parameters\n\n\nThe `unsigned integer` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an unsigned integer value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'counter',\n 'increment',\n [],\n simnet.deployer\n );\n\n expect(result).toBeUint(1); // or `1n`\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeUint(expected: number | bigint)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeAscii`\n\nAsserts the value of a Clarity string-ascii.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a string-ascii value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'hello-world',\n 'say-hi',\n [],\n simnet.deployer\n );\n\n expect(result).toBeAscii('Hello World');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity hello-world.clar\n (define-read-only (say-hi)\n \"Hello World\"\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeAscii(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeUtf8`\n\nAsserts the value of a Clarity string-utf8.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a string-utf8 value</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'hello-world',\n 'say-hi',\n [],\n simnet.deployer\n );\n\n expect(result).toBeUtf8('Hello World');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity hello-world.clar\n (define-read-only (say-hi)\n u\"Hello World\"\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeUtf8(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBePrincipal`\n\nAsserts the value of a Clarity principal.\n\nThe principal can be a standard or a contract principal.\n\n## Parameters\n\n\nThe `string` that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a standard principal</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a contract principal</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const deployer = simnet.deployer;\n\n expect(Cl.standardPrincipal(deployer)).toBePrincipal(deployer);\n ```\n\n <Accordions>\n <Accordion title=\"Schema\">\n ```ts\n toBePrincipal(expected: string) \n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n const contract = `${simnet.deployer}.hello-world`;\n\n expect(Cl.contractPrincipal(contract)).toBePrincipal(contract);\n ```\n\n <Accordions>\n <Accordion title=\"Schema\">\n ```ts\n toBePrincipal(expected: string)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeBuff`\n\nAsserts the value of a Clarity buffer. It takes an ArrayBuffer as an input.\n\nFor building a buffer, `@stacks/transactions` provides some helper functions:\n\n- `bufferFromAscii`\n- `bufferFromUtf8`\n- `bufferFromHex`\n\n## Parameters\n\n\nThe `Uint8Array` buffer that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a Uint8Array buffer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"ascii\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for an ASCII string buffer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"hex\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a hex string buffer</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-byte-array',\n [],\n simnet.deployer\n );\n\n const buffer = Uint8Array.from([1, 2, 3, 4]);\n expect(result).toBeBuff(buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant BUFFER 0x01020304)\n\n (define-read-only (get-byte-array)\n BUFFER\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"ascii\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-btc-buffer',\n [],\n simnet.deployer\n );\n\n const btc = Cl.bufferFromAscii('btc'); // or Cl.bufferFromUtf8('btc')\n\n expect(result).toBeBuff(btc.buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant ASCII_BTC 0x627463)\n\n (define-read-only (get-btc-buffer)\n ASCII_BTC\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"hex\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n \"helpers\",\n \"get-tx-hash\",\n [],\n simnet.deployer\n );\n\n const tx = Cl.bufferFromHex(\n \"73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e\"\n );\n\n expect(result).toBeBuff(tx.buffer);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-constant TX_HASH 0x73e951acd451060f13bdab7bd947136efd80511309a295e876a682ab8a423a7e)\n\n (define-read-only (get-tx-hash)\n TX_HASH\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeBuff(expected: Uint8Array)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeList`\n\nAsserts the value of a Clarity list containing an array of Clarity values.\n\n## Parameters\n\n\nThe `Uint8Array` buffer that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a list of Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const { result } = simnet.callReadOnlyFn(\n 'helpers',\n 'get-addresses',\n [],\n simnet.deployer\n );\n\n expect(result).toBeList(\n [\n Cl.standardPrincipal('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM'),\n Cl.standardPrincipal('ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'),\n Cl.standardPrincipal('ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG')\n ]\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity helpers.clar\n (define-read-only (get-addresses)\n (list\n 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n 'ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeList(expected: ClarityValue[])\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `toBeTuple`\n\nAsserts the value of a Clarity tuple.\n\n## Parameters\n\n\nThe `object` of Clarity values that the expected value should have.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Checking for a tuple</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n \n const { result } = simnet.callReadOnlyFn(\n 'pool',\n 'get-participant-data',\n [Cl.standardPrincipal(simnet.deployer)],\n simnet.deployer\n );\n\n expect(result).toBeTuple({\n enrollmentBlock: Cl.some(Cl.uint(1)),\n contributionAmount: Cl.some(Cl.uint(19000000)),\n });\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-participant-data (who principal))\n {\n enrollmentBlock: (get enrollmentBlock (map-get? ParticipantStatus who)),\n contributionAmount: (get contributionAmount (map-get? ParticipantStatus who))\n }\n )\n\n (map-set ParticipantStatus tx-sender { enrollmentBlock: u1, contributionAmount: u19000000 })\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n toBeTuple(expected: Record<string, ClarityValue>)\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n" + }, + { + "title": "Methods", + "description": "The Clarinet JS SDK provides several methods that can be used to interact with simnet.", + "slug": "/stacks/reference/clarinet-js-sdk/methods", + "content": "\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n\n\n# `getAccounts`\n\nRetrieve a list of all Stacks addresses configured within the project, including wallets, deployers, and faucets.\n\n\n\n\n<Tabs defaultValue=\"get-accounts\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"get-accounts\" className='tab group'>\n <Badge className='badge transition-colors'>Getting your accounts</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-account\" className='tab group'>\n <Badge className='badge transition-colors'>Selecting a specific account</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"get-accounts\">\n ```ts\n const accounts = simnet.getAccounts();\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(10) {\n \"wallet_7\": \"ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ\",\n \"wallet_1\": \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n \"wallet_3\": \"ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC\",\n \"wallet_5\": \"ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB\",\n \"wallet_8\": \"ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP\",\n \"wallet_4\": \"ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND\",\n \"deployer\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n \"wallet_6\": \"ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0\",\n \"wallet_2\": \"ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\",\n \"faucet\": \"STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6\",\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAccounts(): Map<string, string>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"get-account\">\n ```ts\n const accounts = simnet.getAccounts();\n\n const wallet = accounts.get('wallet_1')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAccounts(): Map<string, string>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getAssetsMap`\n\nRetrieve a list of asset balances associated with Stacks addresses, including fungible and non-fungible tokens.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting STX account balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-ft-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Getting ft balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-nft-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Getting nft balances</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"get-deployer-balance\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for an account</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const assets = simnet.getAssetsMap();\n\n const stxBalances = assets.get('STX')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(10) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 100000000000000n,\n \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\": 100000000000000n,\n \"ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG\": 100000000000000n,\n \"ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC\": 100000000000000n,\n \"ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND\": 100000000000000n,\n \"ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB\": 100000000000000n,\n \"ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0\": 100000000000000n,\n \"ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP\": 100000000000000n,\n \"ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ\": 100000000000000n,\n \"STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6\": 100000000000000n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-ft-balance\">\n ```ts\n const contractName = 'token';\n const sourceCode = `\n (define-fungible-token sbtc)\n (ft-mint? sbtc u19 tx-sender)\n `;\n\n simnet.deployContract(\n contractName,\n sourceCode,\n null,\n simnet.deployer\n );\n\n const assets = simnet.getAssetsMap();\n\n const tokenBalance = assets.get('.token.sbtc')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(1) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 19n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-nft-balance\">\n ```ts\n const contractName = 'nft';\n const sourceCode = `\n (define-non-fungible-token ticket uint)\n (nft-mint? ticket u42 tx-sender)\n `;\n\n simnet.deployContract(\n contractName,\n sourceCode,\n null,\n simnet.deployer\n );\n\n const assets = simnet.getAssetsMap();\n\n const nftBalance = assets.get('.nft.ticket')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n Map(1) {\n \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\": 1n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"get-deployer-balance\">\n ```ts\n const assets = simnet.getAssetsMap();\n const stxBalances = assets.get('STX')!;\n\n const deployerBalance = stxBalances.get('ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM')!;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 100000000000000n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getAssetsMap(): Map<string, Map<string, bigint>>\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `getDataVar`\n\nGet the value of a `data-var` defined in a contract.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `counter`</span>\n\nThe name of the `data-var` for the contract.\n\n<span>Example: `count`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the value of a data variable</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const currentCount = simnet.getDataVar('counter', 'count');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n (define-data-var contractOwner principal tx-sender)\n \n (var-set count (+ (var-get count) u1))\n (var-set contractOwner 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 1,\n value: 1n\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getDataVar(contract: string, dataVar: string): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const contractOwner = simnet.getDataVar(\"counter\", \"contractOwner\");\n\n const response = cvToValue(contractOwner);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n (define-data-var contractOwner principal tx-sender)\n \n (var-set count (+ (var-get count) u1))\n (var-set contractOwner 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getDataVar(contract: string, dataVar: string): ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getMapEntry`\n\nGet the value of a map entry by its key. Note that this method will always return an optional value `some` or `none`, just like Clarity `map-get?`.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the map within the contract.\n\n<span>Example: `Participants`</span>\n\nThe key to access the value in the map.\n\n<span>Example: `Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the value of an entry</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const hasParticipated = simnet.getMapEntry(\n \"pool\",\n \"Participants\",\n Cl.standardPrincipal(wallet)\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 10,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getMapEntry(\n contract: string,\n mapName: string,\n mapKey: ClarityValue\n ): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const hasParticipated = simnet.getMapEntry(\n \"pool\",\n \"Participants\",\n Cl.standardPrincipal(wallet)\n );\n\n const response = cvToValue(hasParticipated);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n\n (map-set Participants 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 true)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getMapEntry(\n contract: string,\n mapName: string,\n mapKey: ClarityValue\n ): ClarityValue\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n# `callReadOnlyFn`\n\nCall read-only functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue`. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the read-only function within the contract.\n\n<span>Example: `get-participant`</span>\n\nThe arguments to pass to the read-only function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Making a function call</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"with-no-arguments\" className='tab group'>\n <Badge className='badge transition-colors'>With no arguments</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"deployer\" className='tab group'>\n <Badge className='badge transition-colors'>With an explicit contract address</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const getContributionAmount = simnet.callReadOnlyFn(\n 'pool',\n 'get-contribution-amount',\n [Cl.standardPrincipal(wallet)],\n wallet\n ); \n \n const response = getContributionAmount.result\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 1,\n value: 420000000n,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"with-no-arguments\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('wallet_1')!;\n\n const isActive = simnet.callReadOnlyFn(\n 'pool',\n 'is-active',\n [],\n wallet\n );\n \n const response = isActive.result\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 10,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"deployer\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const contractAddress = `${wallet}.pool`;\n\n const getParticipant = simnet.callReadOnlyFn(\n contractAddress,\n 'get-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = getParticipant.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 9,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const getContributionAmount = simnet.callReadOnlyFn(\n 'pool',\n 'get-contribution-amount',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = cvToValue(getContributionAmount.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (get-contribution-amount (who principal))\n (default-to u0 (get contributionAmount (get-participant who)))\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n 42000000n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callReadOnlyFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n \n </TabsContent>\n</Tabs>\n\n\n# `callPublicFn`\n\nCall public functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue` and the events fired during the function execution. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the public function within the contract.\n\n<span>Example: `register-participant`</span>\n\nThe arguments to pass to the public function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Broadcasting your transaction</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"events\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract events</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n\n const response = registerParticipant.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 7,\n value: {\n type: 3,\n },\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n \n const response = cvToValue(registerParticipant.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"events\">\n ```ts\n import { Cl, cvToValue, type ClarityValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n\n const registerParticipant = simnet.callPublicFn(\n 'pool',\n 'register-participant',\n [Cl.standardPrincipal(wallet)],\n wallet\n );\n \n const eventValues = registerParticipant.events.map((event) =>\n cvToValue(event.data.value as ClarityValue)\n );\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n at: {\n type: \"uint\",\n value: \"2\",\n },\n message: {\n type: \"(string-ascii 10)\",\n value: \"Registered\",\n },\n who: {\n type: \"principal\",\n value: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n callPublicFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `callPrivateFn`\n\nCall private functions exposed by a contract.\n\nThis method returns an object with the result of the function call as a `ClarityValue` and the events, if any, fired during the function execution. It takes function arguments in the form of Clarity values, which are available in the package [`@stacks/transactions`](/stacks/stacks.js/packages/transactions).\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe contract identifier of the contract.\n\n<span>Example: `pool`</span>\n\nThe name of the private function within the contract.\n\n<span>Example: `reward-participant-points`</span>\n\nThe arguments to pass to the private function. If no arguments are needed, pass an empty array.\n\n<span>Example: `[Cl.standardPrincipal(\n 'ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5'\n)]`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Broadcasting your transaction</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const address1 = accounts.get(\"wallet_1\")!\n\n const rewardParticipantPoints = simnet.callPrivateFn(\n \"pool\",\n \"reward-participant-points\",\n [Cl.standardPrincipal(address1)],\n wallet\n );\n\n const response = rewardParticipantPoints.result;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n (define-map ParticipantPoints principal int)\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (reward-participant-points who)\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (define-private (reward-participant-points (who principal))\n (map-insert ParticipantPoints who 100)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n (map-set ParticipantPoints tx-sender 1000)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: 3,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n\n callPrivateFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get('deployer')!;\n const address1 = accounts.get(\"wallet_1\")!\n\n const rewardParticipantPoints = simnet.callPrivateFn(\n \"pool\",\n \"reward-participant-points\",\n [Cl.standardPrincipal(address1)],\n wallet\n );\n\n const response = cvToValue(registerParticipant.result);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n (define-map ParticipantPoints principal int)\n\n (define-public (register-participant (who principal))\n (begin\n (map-set Participants who true)\n (map-set ParticipantStatus who { enrollmentBlock: block-height, contributionAmount: u0 })\n (reward-participant-points who)\n (print { message: \"Registered\", who: who, at: block-height })\n (ok true)\n )\n )\n\n (define-private (reward-participant-points (who principal))\n (map-insert ParticipantPoints who 100)\n )\n\n (map-set Participants tx-sender true)\n (map-set ParticipantStatus tx-sender { enrollmentBlock: block-height, contributionAmount: u42000000 })\n (map-set ParticipantPoints tx-sender 1000)\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n\n callPrivateFn(\n contract: string,\n method: string,\n args: ClarityValue[],\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n \n</Tabs>\n\n\n\n# `transferSTX`\n\nTransfer STX from one address to another. The amount transferred is in `uSTX`.\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe amount of `uSTX` to transfer.\n\n<span>Example: `1000000` equals 1 STX</span>\n\nThe Stacks address of the recipient.\n\n<span>Example: `ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Transferring STX</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"clarity-value\" className='tab group'>\n <Badge className='badge transition-colors'>Converting Clarity values</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"events\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract events</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n result: {\n type: 7,\n value: {\n type: 3,\n },\n },\n events: [\n {\n event: \"stx_transfer_event\",\n data: [\n {\n amount: \"42000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n ],\n }\n ],\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"clarity-value\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n \n const response = cvToValue(transfer.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"events\">\n ```ts\n const accounts = simnet.getAccounts();\n const recipient = accounts.get('wallet_1')!;\n\n const transfer = simnet.transferSTX(\n 42000000, // 42 STX\n recipient,\n simnet.deployer\n );\n\n const events = transfer.events.map((event) => event);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n event: \"stx_transfer_event\",\n data: {\n amount: \"42000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n transferSTX(\n amount: number | bigint,\n recipient: string,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `deployContract`\n\nDeploy a contract to simnet.\n\nThis method will simulate a block being mined and increase the block height by one.\n\n## Parameters\n\nThe name of the contract to be deployed.\n\n<span>Example: `hello-world`</span>\n\nThe Clarity source code (or content) of the contract.\n\n<span>Example: `(define-read-only (say-hi) (ok \"Hello World\"))`</span>\n\nAn object to specify options, such as the Clarity version.\n\n<span>Example: `{ clarityVersion: 2 }` | `null`</span>\n\nThe Stacks address of the sender.\n\n<span>Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Deploying your contract</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Specifying a Clarity version</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"interact\" className='tab group'>\n <Badge className='badge transition-colors'>Interacting with your contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n const contract = simnet.deployContract(\n 'hello-world',\n sourceCode,\n null,\n simnet.deployer\n );\n\n const response = cvToValue(contract.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n true\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n const contract = simnet.deployContract(\n 'hello-world',\n sourceCode,\n { clarityVersion: 2 },\n simnet.deployer\n );\n\n const response = cvToValue(contract.result);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n true\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n <TabsContent value=\"interact\">\n ```ts\n import { cvToValue } from '@stacks/transactions';\n\n const sourceCode = '(define-read-only (say-hi) (ok \"Hello World\"))';\n\n simnet.deployContract(\n 'hello-world',\n sourceCode,\n null,\n simnet.deployer\n );\n\n const sayHi = simnet.callReadOnlyFn(\"hello-world\", \"say-hi\", [], simnet.deployer);\n\n const response = sayHi.result\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"(string-ascii 11)\",\n value: \"Hello World\",\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n deployContract(\n name: string,\n content: string,\n options: DeployContractOptions | null,\n sender: string\n ): ParsedTransactionResult\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineBlock`\n\nThe `callPublicFn`, `transferSTX`, and `deployContract` methods all mine one block with only one transaction. It can also be useful to mine a block with multiple transactions.\n\nThis is what `mineBlock` is for.\n\nThis method takes an array of transaction objects. The transactions can be built with the `tx` helper exported by the SDK.\n\nThe `tx` helper has three methods:\n- `callPublicFn`\n- `transferSTX`\n- `deployContract`\n\nThese methods have the same interface as simnet methods but instead of performing a transaction, they will build a transaction object that can be passed to the `mineBlock` function.\n\nIn epochs from 3.0 on, the stacks chaintip is advanced separately from the burn chaintip. This means `mineBlock` will only affect the stacks chaintip. If you'd like to also mine burn blocks, use the `mineEmptyBurnBlock` function.\n\n## Parameters\n\nAn array of transactions to be included in the block.\n\n<span>Example: `[tx.transferSTX(100, recipient, sender), ...]`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining multiple transactions in a single block</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { tx } from '@hirosystems/clarinet-sdk';\n import { Cl, cvToValue } from '@stacks/transactions';\n\n const accounts = simnet.getAccounts();\n const wallet = accounts.get(\"wallet_1\")!;\n\n const block = simnet.mineBlock([\n tx.callPublicFn(\"counter\", \"increment\", [], simnet.deployer),\n tx.callPublicFn(\"counter\", \"add\", [Cl.uint(10)], simnet.deployer),\n tx.transferSTX(19000000, wallet, simnet.deployer),\n ]);\n\n block.forEach((transaction) => {\n console.log(cvToValue(transaction.result));\n if (transaction.events.length > 0) console.log(transaction.events);\n });\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity counter.clar\n (define-data-var count uint u0)\n\n (define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count))\n )\n )\n\n (define-public (add (amount uint))\n (begin\n (var-set count (+ (var-get count) amount))\n (ok (var-get count))\n )\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"uint\",\n value: \"1\",\n }\n {\n type: \"uint\",\n value: \"11\",\n }\n {\n type: \"bool\",\n value: true,\n }\n [\n {\n event: \"stx_transfer_event\",\n data: {\n amount: \"19000000\",\n memo: \"\",\n recipient: \"ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5\",\n sender: \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\",\n },\n }\n ]\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n type ParsedTransactionResult = {\n result: ClarityValue;\n events: ClarityEvent[];\n }\n \n mineBlock(txs: Tx[]): ParsedTransactionResult[]\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineEmptyBlock`\n\nMine one empty block and increase the block height by one.\n\nReturns the new block height.\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining an empty block</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n simnet.mineEmptyBlock();\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlock(): number\n ```\n </Accordion>\n </Accordions>\n\n </TabsContent>\n</Tabs>\n\n\n\n# `mineEmptyBlocks`\n\nMine multiple empty blocks to reach a certain block height.\n\nReturns the new block height.\n\n## Parameters\n\nThe number of empty blocks to mine. This parameter is optional.\n\n<span>Example: `5`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Mining multiple empty blocks</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"options\" className='tab group'>\n <Badge className='badge transition-colors'>Mining an empty block without a count</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n simnet.mineEmptyBlocks(5);\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 6\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlocks(count?: number): number\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"options\">\n ```ts\n simnet.mineEmptyBlocks();\n\n const response = simnet.blockHeight;\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n 2\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n mineEmptyBlocks(count?: number): number\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `runSnippet`\n\nExecute arbitrary Clarity code directly, which allows you to test and interact with smart contract functions without deploying them.\n\n## Parameters\n\nThe Clarity code snippet to be executed.\n\n<span>Example: `(define-read-only (get-balance) (ok stx-balance))`</span>\n\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Executing arbitrary Clarity code</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"transfer\" className='tab group'>\n <Badge className='badge transition-colors'>Running a snippet for a STX transfer</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { Cl } from '@stacks/transactions';\n\n const codeSnippet = simnet.runSnippet(\n '(stx-account tx-sender)'\n );\n\n const response = Cl.prettyPrint(codeSnippet, 2);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n locked: u0,\n unlock-height: u0,\n unlocked: u100000000000000\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n runSnippet(snippet: string): string | ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"transfer\">\n ```ts\n import { cvToValue } from \"@stacks/transactions\";\n\n const accounts = simnet.getAccounts();\n const recipient = accounts.get(\"wallet_1\")!;\n\n const codeSnippet = simnet.runSnippet(\n `(stx-transfer? u19000000 tx-sender '${recipient})`\n );\n\n const response = cvToValue(codeSnippet);\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n type: \"bool\",\n value: true,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n runSnippet(snippet: string): string | ClarityValue\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `getContractsInterfaces`\n\nReturns the interfaces of the project contracts as a Map of Contracts, with the keys being the contract addresses.\n\nThese interfaces contain information such as the available `functions`, `data-vars`, `maps`, `NFTs`, and `FTs` defined in the contract.\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting a specific contract interface</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"filter\" className='tab group'>\n <Badge className='badge transition-colors'>Filtering for contract functions</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractInterfaces = simnet.getContractsInterfaces();\n\n const response = contractInterfaces.get(`${simnet.deployer}.pool`);\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n {\n functions: [\n {\n name: \"get-participant\",\n access: \"read_only\",\n args: [\n [Object ...]\n ],\n outputs: [Object ...],\n }, {\n name: \"is-active\",\n access: \"read_only\",\n args: [],\n outputs: [Object ...],\n }\n ],\n variables: [],\n maps: [\n {\n name: \"ParticipantStatus\",\n key: \"principal\",\n value: [Object ...],\n }, {\n name: \"Participants\",\n key: \"principal\",\n value: \"bool\",\n }\n ],\n fungible_tokens: [],\n non_fungible_tokens: [],\n epoch: \"Epoch25\",\n clarity_version: \"Clarity2\",\n }\n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractsInterfaces(): Map<string, ContractInterface>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n <TabsContent value=\"filter\">\n ```ts\n const poolContract = contractInterfaces.get(`${simnet.deployer}.pool`);\n\n const response = poolContract?.functions;\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```ts\n [\n {\n name: \"get-participant\",\n access: \"read_only\",\n args: [\n [Object ...]\n ],\n outputs: [Object ...],\n }, {\n name: \"is-active\",\n access: \"read_only\",\n args: [],\n outputs: [Object ...],\n }\n ]\n\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractsInterfaces(): Map<string, ContractInterface>\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n\n# `getContractSource`\n\nGet the source code of a contract as a string.\n\n## Parameters\n\nThe identifier of the contract for which the source code is requested.\n\n<span>Example: `pool`</span>\n\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the source code of a contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractSource = simnet.getContractSource('pool');\n ```\n\n <Accordions>\n <Accordion title=\"Source code\">\n ```clarity pool.clar\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Response\">\n ```clarity\n (define-map Participants principal bool)\n (define-map ParticipantStatus principal { enrollmentBlock: uint, contributionAmount: uint })\n\n (define-read-only (get-participant (who principal))\n (map-get? ParticipantStatus who)\n )\n\n (define-read-only (is-active)\n (map-get? Participants tx-sender)\n )\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractSource(contract: string): string | undefined\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n\n# `getContractAST`\n\nGet the full AST (Abstract Syntax Tree) of a Clarity contract.\n\nThis method throws an error if it fails to get the AST or to encode it.\n\n## Parameters\n\nThe identifier of the contract for which the AST (Abstract Syntax Tree) is requested.\n\n<span>Example: `pool`</span>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Getting the source code of a contract</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n const contractAST = simnet.getContractAST('pool');\n ```\n\n <Accordions>\n <Accordion title=\"Response\">\n ```ts\n {\n contract_identifier: {\n issuer: [ 26, [\n 109, 120, 222, 123, 6, 37, 223, 191, 193, 108, 58, 138, 87, 53, 246, 220,\n 61, 195, 242, 206\n ] ],\n name: \"pool\",\n },\n pre_expressions: [],\n expressions: [\n {\n expr: [Object ...],\n id: 1,\n span: [Object ...],\n pre_comments: [],\n end_line_comment: undefined,\n post_comments: [],\n },\n ...\n ],\n top_level_expression_sorting: [ 0, 1, 2, 3 ],\n referenced_traits: Map {},\n implemented_traits: [],\n wasm_module: undefined,\n }\n ```\n </Accordion>\n <Accordion title=\"Schema\">\n ```ts\n getContractAST(contractId: string): ContractAST\n ```\n </Accordion>\n </Accordions>\n </TabsContent>\n</Tabs>\n\n" + }, + { + "title": "@hirosystems/clarinet-sdk", + "description": "The main entry point for the Clarinet JS SDK. It provides properties and methods for interacting with the Clarinet network.", + "slug": "/stacks/reference/clarinet-js-sdk/clarinet-sdk", + "content": "\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/components/ui/accordion\"\nimport { Badge } from '@/components/ui/badge';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\n\n# `initSimnet`\n\nThe `initSimnet` function initializes a simulated network. It will often be the first function you call when using the SDK.\n\n## Parameters\n\nThe `manifestPath` is the path to the `Clarinet.toml` manifest file.\n\n <Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='transition-colors'>Creating a new instance of simnet</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"custom\" className='tab group'>\n <Badge className='badge transition-colors'>With a custom config path</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet();\n ```\n </TabsContent>\n <TabsContent value=\"custom\">\n ```ts\n import { initSimnet } from '@hirosystems/clarinet-sdk';\n\n const simnet = await initSimnet('./config/Clarinet.toml');\n ```\n </TabsContent>\n </Tabs>\n\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"schema\">\n <AccordionTrigger>Schema</AccordionTrigger>\n <AccordionContent>\n ```ts\n initSimnet(manifestPath?: string): Promise<Simnet>\n ```\n </AccordionContent>\n </AccordionItem>\n </Accordion>" + }, + { + "title": "SDKs & Libraries", + "description": "The following guides cover ways to use Hiro tools to build apps on Stacks.", + "slug": "/stacks/reference/index", + "content": "\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/quickstart\"\n title=\"Create your first smart contract\"\n description=\"Build a simple counter contract using Clarinet.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Blockchain />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write unit tests for your smart contracts\"\n description=\"Learn how run unit tests with Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/stacks.js/quickstart\"\n title=\"Make a contract call with Stacks.js\"\n description=\"Learn how to integrate smart contracts into your app.\"\n tag='Stacks.js'\n />\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n" + }, + { + "title": "Clarinet CLI", + "description": "The Clarinet CLI is a command-line tool for interacting with the Clarinet network.", + "slug": "/stacks/reference/cli/clarinet", + "content": "" + }, + { + "title": "Stacks.js CLI", + "description": "The Stacks.js CLI is a command-line tool for creating new Stacks.js projects.", + "slug": "/stacks/reference/cli/stacks-js", + "content": "\n\n```package-install\ncreate stacks\n```" + }, + { + "title": "@stacks/blockchain-api-client", + "description": "Interact with the Stacks blockchain using a JavaScript client library.", + "slug": "/stacks/reference/stacks-blockchain-api/client", + "content": "\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```\n\n### Using WebSockets\n\n```ts\nimport { connectWebSocketClient } from '@stacks/blockchain-api-client';\nconst client = await connectWebSocketClient('ws://api.hiro.so/');\nconst sub = await client.subscribeAddressTransactions(contractCall.txId, event => {\n console.log(event);\n});\n\nawait sub.unsubscribe();\n```\n" + }, + { + "title": "@stacks/connect", + "description": "Connect is a JavaScript library for building web applications connected to Stacks.", + "slug": "/stacks/reference/stacks.js/connect", + "content": "\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\nStacks Connect enables you to authenticate your users and connect your app to their wallet. This reference contains more detailed information on how you can authenticate users, sign and broadcast transactions on their behalf, and enable users to sign messages.\n\n<Callout title=\"Migration Note\">\nPlease be patient during the migration to version 8.x.x. There has been a long-running effort together with wallets to modernize the Stacks web ecosystem, culminating in [SIP-030](https://github.com/janniks/sips/blob/main/sips/sip-030/sip-030-wallet-interface.md) and the new `request` method in Stacks Connect 8.x.x. For the legacy version of `@stacks/connect` using JWT tokens, please use version 7.10.1. See the [Migration Guide](/docs/stacks/connect/guides/migration) for more details.\n</Callout>\n\n### Installation\n\n```package-install\n@stacks/connect\n```\n\n### Connect to a wallet\n\nInitiate a wallet connection and request addresses:\n\n```typescript\nimport { connect } from '@stacks/connect';\n\nconst response = await connect(); // stores users address in local storage by default\n```\n\nGet the local storage data (stored by a connect call):\n\n```typescript\nimport { getLocalStorage } from '@stacks/connect';\n\nconst data = getLocalStorage();\n// {\n// \"addresses\": {\n// \"stx\": [\n// { \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\" },\n// ],\n// \"btc\": [\n// { \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\" },\n// ]\n// }\n```\n\nManaging the connection state:\n\n```typescript\nimport { connect, disconnect, isConnected } from '@stacks/connect';\n\nisConnected(); // false\nawait connect(); // similar to the `getAddresses` method\nisConnected(); // true\ndisconnect(); // clears local storage and selected wallet\nisConnected(); // false\n```\n\n### Use request to trigger wallet interactions\n\n```typescript\nimport { request } from '@stacks/connect';\n\n// CONNECT\nconst response = await request({ forceWalletSelect: true }, 'getAddresses');\n```\n\n### Available methods\n\n- [getAddresses](#getaddresses)\n- [sendTransfer](#sendtransfer)\n- [signPsbt](#signpsbt)\n- [stx_getAddresses](#stx_getaddresses)\n- [stx_getAccounts](#stx_getaccounts)\n- [stx_transferStx](#stx_transferstx)\n- [stx_callContract](#stx_callcontract)\n- [stx_deployContract](#stx_deploycontract)\n- [stx_signMessage](#stx_signmessage)\n- [stx_signStructuredMessage](#stx_signstructuredmessage)\n\n#### getAddresses\n\n```typescript\nconst response = await request('getAddresses');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\",\n// \"publicKey\": \"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69\",\n// },\n// {\n// \"address\": \"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr\",\n// \"publicKey\": \"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114\",\n// },\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\",\n// }\n// ]\n// }\n```\n\n#### sendTransfer\n\n```typescript\nconst response = await request('sendTransfer', {\n recipients: [\n {\n address: 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4', // recipient address\n amount: '1000', // amount in sats\n },\n // You can specify multiple recipients\n {\n address: 'bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh',\n amount: '2000',\n },\n ],\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### signPsbt\n\n```typescript\nconst response = await request('signPsbt', {\n psbt: 'cHNidP...', // base64 encoded PSBT string\n signInputs: [{ index: 0, address }], // indices of inputs to sign (optional)\n broadcast: false, // whether to broadcast the transaction after signing (optional)\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID (if broadcast is true)\n// \"psbt\": \"cHNidP...\" // The signed PSBT in base64 format\n// }\n```\n\n#### stx_getAddresses\n\n```typescript\nconst response = await request('stx_getAddresses');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"bc1pp3ha248m0mnaevhp0txfxj5xaxmy03h0j7zuj2upg34mt7s7e32q7mdfae\",\n// \"publicKey\": \"062bd2c825300d74f4f9feb6b2fec2590beac02b8938f0fc042a34254581ee69\",\n// },\n// {\n// \"address\": \"bc1qtmqe7hg4etkq4t384nzg0mrmwf2sam9fjsz0mr\",\n// \"publicKey\": \"025b65a0ec0e00699794847f2af1b5d8a53db02a2f48e09417598bef09cfea1114\",\n// },\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\",\n// }\n// ]\n// }\n```\n\n#### stx_getAccounts\n\n```typescript\nconst response = await request('stx_getAccounts');\n// {\n// \"addresses\": [\n// {\n// \"address\": \"SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN\",\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cd...\",\n// \"gaiaHubUrl\": \"https://hub.hiro.so\",\n// \"gaiaAppKey\": \"0488ade4040658015580000000dc81e3a5...\"\n// }\n// ]\n// }\n```\n\n#### stx_transferStx\n\n```typescript\nconst response = await request('stx_transferStx', {\n amount: '1000', // amount in micro-STX (1 STX = 1,000,000 micro-STX)\n recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN', // recipient address\n network: 'mainnet', // optional, defaults to mainnet\n memo: 'Optional memo', // optional memo field\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_callContract\n\n```typescript\nconst response = await request('stx_callContract', {\n contract: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN.counters', // contract in format: address.contract-name\n functionName: 'count', // name of the function to call\n functionArgs: [Cl.int(3)], // array of Clarity values as arguments\n network: 'mainnet', // optional, defaults to mainnet\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_deployContract\n\n```typescript\nconst response = await request('stx_deployContract', {\n name: 'counters', // name of the contract\n clarityCode: `(define-map counters principal int)\n\n(define-public (count (change int))\n (ok (map-set counters tx-sender (+ (get-count tx-sender) change)))\n)\n\n(define-read-only (get-count (who principal))\n (default-to 0 (map-get? counters who))\n)`, // Clarity code as string\n clarityVersion: '2', // optional, defaults to latest version\n network: 'mainnet', // optional, defaults to mainnet\n});\n// {\n// \"txid\": \"0x1234...\", // The transaction ID\n// }\n```\n\n#### stx_signMessage\n\n```typescript\nconst response = await request('stx_signMessage', {\n message: 'Hello, World!', // message to sign\n});\n// {\n// \"signature\": \"0x1234...\", // The signature of the message\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\" // The public key that signed the message\n// }\n```\n\n#### stx_signStructuredMessage\n\n```typescript\nconst clarityMessage = Cl.parse('{ structured: \"message\", num: u3 }');\nconst clarityDomain = Cl.tuple({\n domain: Cl.stringAscii('example.com'),\n version: Cl.stringAscii('1.0.0'),\n 'chain-id': Cl.uint(1),\n});\n\nconst response = await request('stx_signStructuredMessage', {\n message: clarityMessage, // Clarity value representing the structured message\n domain: clarityDomain, // domain object for SIP-018 style signing\n});\n// {\n// \"signature\": \"0x1234...\", // The signature of the structured message\n// \"publicKey\": \"02d3331cbb9f72fe635e6f87c2cf1a13cdea520f08c0cc68584a96e8ac19d8d304\" // The public key that signed the message\n// }\n```\n\n### Error Handling\n\nThe `request` method returns a Promise, allowing you to handle errors using standard Promise-based error handling patterns. You can use either `try/catch` with `async/await` or the `.catch()` method with Promise chains.\n\n#### Using try/catch with async/await\n\n```typescript\nimport { request } from '@stacks/connect';\n\ntry {\n const response = await request('stx_transferStx', {\n amount: '1000',\n recipient: 'SP2MF04VAGYHGAZWGTEDW5VYCPDWWSY08Z1QFNDSN',\n });\n // SUCCESS\n console.log('Transaction successful:', response.txid);\n} catch (error) {\n // ERROR\n console.error('Wallet returned an error:', error);\n}\n```\n\n### Compatibility\n\nThe `request` method by default adds a layer of auto-compatibility for different wallet providers. This is meant to unify the interface where wallet providers may not implement methods and results the same way.\n\n<Callout title=\"Wallet Support\">\nFor a complete list of wallet compatibility and support status, see the [Wallet Support](/docs/stacks/connect/support) page.\n</Callout>\n\n### Advanced Usage\n\n#### request\n\nThe `request` method is called with an optional options object as the first parameter:\n\n```typescript\nimport { request } from '@stacks/connect';\n\n// WITH options\nconst response = await request(\n {\n provider?: StacksProvider; // Custom provider to use for the request\n\n forceWalletSelect?: boolean; // Force user to select a wallet (default: false)\n persistWalletSelect?: boolean; // Persist selected wallet (default: true)\n enableOverrides?: boolean; // Enable provider compatibility (default: true)\n enableLocalStorage?: boolean; // Store address in local storage (default: true)\n\n defaultProviders?: WbipProvider[]; // Default wallets to display in modal\n approvedProviderIds?: string[]; // List of approved provider IDs to show in modal\n },\n 'method',\n params\n);\n\n// WITHOUT options\nconst response = await request('method', params);\n```\n\n<Callout title=\"Provider Compatibility\">\nThe `enableOverrides` option enables automatic compatibility fixes for different wallet providers. For example, it handles converting numeric types between string and number formats as needed by different wallets, and remaps certain method names to match wallet-specific implementations. This ensures consistent behavior across different wallet providers without requiring manual adjustments.\n</Callout>\n\n<Callout title=\"Approved Providers\">\nThe `approvedProviderIds` option allows you to filter which wallet providers are shown in the connect modal. This is useful when you want to limit the available wallet options to specific providers. For example, you might only want to support Leather wallet:\n\n```typescript\nconnect({ approvedProviderIds: ['LeatherProvider'] });\n```\n\nOr multiple specific wallets:\n\n```typescript\nconnect({ approvedProviderIds: ['LeatherProvider', 'xverse'] });\n```\n</Callout>\n\n#### requestRaw\n\nThe `requestRaw` method provides direct access to wallet providers without the additional features of `request`:\n\n```typescript\nimport { requestRaw } from '@stacks/connect';\n\nconst response = await requestRaw(provider, 'method', params);\n```\n\n<Callout title=\"Raw Request\">\n`requestRaw` bypasses the UI wallet selector, automatic provider compatibility fixes, and other features that come with `request`. Use this when you need more manual control over the wallet interaction process.\n</Callout>\n" + }, + { + "title": "sbtc", + "description": "A JS/TS helper package for interacting with sBTC.", + "slug": "/stacks/reference/stacks.js/sbtc", + "content": "\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n\n## Installation\n\n```package-install\nsbtc\n```\n\n## Architecture\n\nThe sBTC protocol operates across multiple layers:\n\n- **Bitcoin**: The original funds are sourced from Bitcoin. A depositor sends these funds to a group of signers, which manage a (rotating) multisignature address formatted for sBTC transactions.\n\n- **sBTC API (Emily)**: This API is responsible for tracking deposits and notifying the signers about pending deposits.\n\n- **Stacks**: The network where sBTC is minted. Once the deposit is confirmed, the signers mint the corresponding amount of sBTC to the depositor's specified address on the Stacks network.\n\n## Deposit Flow\n\n- **Create Deposit (Bitcoin) Transaction**:\n - Structure a Bitcoin transaction to send funds to the group of signers.\n - Use a specialized format that includes:\n - Deposit Script: Identifies which Stacks address the sBTC will be minted to and what the maximum fee (in satoshis) the signers may take in exchange for minting.\n - Reclaim Script: Allows the sender to reclaim their funds if the transaction is not processed by the signers.\n\n- **Sign and Broadcast the Transaction**:\n - Sign the transaction with the sender's private key.\n - Broadcast the transaction to the Bitcoin network (Bitcoin Regtest for Stacks Testnet).\n\n- **Notify the sBTC API (Emily)**:\n - Inform the API about the transaction by submitting its details. This step ensures that the signers are aware of the deposit and can track it.\n\n- **Processing by Signers**: (no action required)\n - The signers retrieve and verify the deposit transaction from the Bitcoin blockchain.\n - Once verified, the signers mint the equivalent amount of sBTC on the Stacks network.\n\n- **Receive sBTC (Stacks)**: (no action required)\n - The minted sBTC is sent to the depositor's designated Stacks address, completing the deposit process.\n - sBTC is SIP-010 compatible and will show up in Stacks wallets and explorers.\n\n## Withdrawal Flow\n_Coming soon_\n\n## sBTC Package Functions\n\nThe sBTC package exports high-level functions for building addresses and transactions for deposits.\n\n### Examples\n\n \n#### buildSbtcDepositAddress\nBuild a deposit address and metadata using `buildSbtcDepositAddress` with a wallet provider using `sendTransfer`.\n\n```ts\nimport { buildSbtcDepositAddress, SbtcApiClientTestnet } from 'sbtc';\n\nconst client = new SbtcApiClientTestnet();\n\n// 1. BUILD THE DEPOSIT ADDRESS AND METADATA\nconst deposit = buildSbtcDepositAddress({\n stacksAddress: TARGET_STX_ADDRESS,\n signersPublicKey: await client.fetchSignersPublicKey(),\n\n // OPTIONAL DEFAULTS\n // maxSignerFee: 80_000, // optional: fee to pay for the deposit transaction (taken from the signers from the sats)\n // reclaimLockTime: 6_000, // optional: lock time for the reclaim script\n // network: REGTEST, // optional: which bitcoin network to use\n});\n\n// `deposit.address` is the deposit address (send funds here, aka the deposit address as an output)\n\n// 2. DEPOSIT USING YOUR FAVORITE WALLET (TYPICALLY ALSO BROADCASTED BY THE WALLET)\nconst txid = await WalletProvider.sendTransfer({\n recipient: deposit.address,\n amount: 100_000, // the amount to deposit; <=maxSignerFee is taken from this amount\n});\n\n// 3. NOTIFY THE SIGNERS\nawait client.notifySbtc({ txid, ...deposit });\n```\n\n#### buildSbtcDepositTx\nThe `buildSbtcDepositTx` function is similar to `buildSbtcDepositAddress`, but instead of returning just a deposit address, it constructs a complete Bitcoin transaction for depositing sBTC.\n\n```ts\nimport { buildSbtcDepositTx } from 'sbtc';\n\n// 1. BUILD THE DEPOSIT TRANSACTION AND METADATA\nconst deposit = buildSbtcDepositTx({\n amountSats: DEPOSIT_AMOUNT, // the amount in sats/sBTC to deposit; <=maxSignerFee is taken from this amount\n\n // same options as `buildSbtcDepositAddress`\n network,\n stacksAddress,\n signersPublicKey,\n maxSignerFee,\n reclaimLockTime,\n});\n\n// `deposit.transaction` has one output, which is the combined taproot of the deposit and reclaim scripts\n\n// 2. SIGN THE TRANSACTION\ndeposit.transaction.sign(YOUR_BTC_PRIVATE_KEY);\ndeposit.transaction.finalize();\n\n// 2. OR SIGN VIA EXTERNAL WALLET\nconst psbtBytes = deposit.transaction.toPSBT();\n\n// 3. BROADCAST THE TRANSACTION\nconst txid = await client.broadcastTx(deposit.transaction);\n\n// 4. NOTIFY THE SIGNERS\nawait client.notifySbtc(deposit);\n```\n\n\n#### sbtcDepositHelper\nCreate a fully-formed deposit transaction (assuming an address with spendable bitcoin UTXOs)\n\n<Callout>Use this helper function if you are not using a wallet provider</Callout>\n\n```ts\nimport { sbtcDepositHelper, SbtcApiClientTestnet } from 'sbtc';\n\nconst client = new SbtcApiClientTestnet();\n\n// 1. BUILD THE DEPOSIT TRANSACTION AND METADATA (GIVEN UTXOS FOR AN ADDRESS)\nconst deposit = await sbtcDepositHelper({\n stacksAddress: TARGET_STX_ADDRESS, // where to send/mint the sBTC\n amountSats: 5_000_000, // (maximum) amount of sBTC to deposit\n\n signersPublicKey: pub, // the aggregated public key of the signers\n\n feeRate: await client.fetchFeeRate('medium'),\n utxos: await client.fetchUtxos(YOUR_BTC_ADDRESS),\n\n bitcoinChangeAddress: YOUR_BTC_ADDRESS,\n});\n\n// 2. SIGN THE TRANSACTION\ndeposit.transaction.sign(YOUR_BTC_PRIVATE_KEY);\ndeposit.transaction.finalize();\n\n// 2. OR SIGN VIA EXTERNAL WALLET\nconst psbtBytes = deposit.transaction.toPSBT();\n\n// 3. BROADCAST TRANSACTION\nconst txid = await client.broadcastTx(deposit.transaction);\nconsole.log('txid', txid);\n\n// 4. NOTIFY THE SIGNERS\nconst res = await client.notifySbtc(deposit);\nconsole.log('res', res.status, res.statusMessage);\n```\n\n\n## HTTP Clients\n\nAdditionally, there are two API helpers, which make it easier to get all the data needed to create the above transactions:\n\n- **SbtcApiClientMainnet** — a client for communicating with the different pieces of the sBTC deployment\n- **SbtcApiClientTestnet** — a client for communicating with the different pieces of the sBTC deployment on Testnet\n- **SbtcApiClientDevenv** — a client for developing against a local deployment of sBTC\n\nWhile the final adjustments are still being made in the pre-release phase, this package may change default URLs and contract addresses on every minor release.\n\n| Version | Purpose | Functionality |\n| --- | --- | --- |\n| 0.1.x | Developer release (hackathon) | |\n| 0.2.x | Regtest/Testnet release | Deposit only |\n| 0.3.x | Mainnet pre-release | Deposit only |\n\n### Examples\n\n```ts\nimport { SbtcApiClientMainnet, SbtcApiClientTestnet, SbtcApiClientDevenv } from 'sbtc';\n\nconst client = new SbtcApiClientMainnet();\n// const client = new SbtcApiClientTestnet();\n// const client = new SbtcApiClientDevenv();\n\nconst pub = await client.fetchSignersPublicKey(); // fetches the aggregated public key of the signers\nconst address = await client.fetchSignersAddress(); // fetches the p2tr address of the aggregated public key of the signers\n\nconst feeRate = await client.fetchFeeRate('low'); // or 'medium', 'high'\nconst unspents = await client.fetchUtxos(BTC_ADDRESS);\nconst hex = await client.fetchTxHex(TXID);\n\nawait client.broadcastTx(DEPOSIT_BTC_TX); // broadcast a deposit BTC transaction\nawait client.notifySbtc(DEPOSIT_BTC_TX); // notify the sBTC API about the deposit (otherwise it won't be processed)\n\nconst sbtcBalance = await client.fetchSbtcBalance(STX_ADDRESS); // fetch the sBTC balance of an Stacks address\n```\n\n## API Reference\n\n### sbtcDepositHelper\n\n| Parameter | Description | Type | Default |\n| --- | --- | --- | --- |\n| signersPublicKey | Signers public key (aggregated schnorr) | string 32 byte hex | — |\n| amountSats | Bitcoin amount denominated in sats (* 10^8) | number, bigint | — |\n| stacksAddress | The deposit recipient Stacks address | string | — |\n| bitcoinChangeAddress | Bitcoin change address | string | — |\n| feeRate | Fee rate in sat/vbyte | number | — |\n| utxos | UTXOs to \"fund\" the transaction | UtxoWithTx[] | — |\n| reclaimPublicKey | Public key (schnorr, x-only) for reclaiming failed deposits | string | — |\n| reclaimLockTime | Optional reclaim lock time | number | 144 |\n| maxSignerFee | Optional maximum fee to pay to signers for the sBTC mint | number | 80_000 |\n| network | Optional Bitcoin network | BitcoinNetwork | MAINNET |\n| utxoToSpendable | Optional function to convert p2wpk and p2sh utxos to spendable inputs | Function | Best effort default implementation to make utxos spendable |\n| paymentPublicKey | Optional payment public key (currently only used for default utxoToSpendable.sh implementation) | string hex | — |\n\n### SbtcApiClient Configuration\n\n| Parameter | Description | Type |\n| --- | --- | --- |\n| sbtcContract | The multisig address of the initial sBTC contract | string |\n| sbtcApiUrl | The base URL of the sBTC API (Emily) | string |\n| btcApiUrl | The base URL of the Bitcoin mempool/electrs API | string |\n| stxApiUrl | The base URL of the Stacks API | string |\n" + }, + { + "title": "@stacks/transactions", + "description": "Construct, decode transactions and work with Clarity smart contracts on the Stacks blockchain.", + "slug": "/stacks/reference/stacks.js/transactions", + "content": "\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\n## Installation\n\n```package-install\n@stacks/transactions\n```\n\nThis library supports the creation of the following Stacks transaction types:\n\n1. STX token transfer\n2. Smart contract deploy\n3. Smart contract function call\n\n## Key Generation\n\n```typescript -n\nimport { randomPrivateKey, privateKeyToPublicKey } from '@stacks/transactions';\n\n// Random key\nconst privateKey = randomPrivateKey();\nconst publicKey = privateKeyToPublicKey(privateKey);\n\n// Private key from hex string\nconst privateKey = 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01';\n```\n\n## STX Token Transfer Transaction\n\nUse the [`makeSTXTokenTransfer`](https://stacks.js.org/functions/_stacks_transactions.makeSTXTokenTransfer) (with a sender private key), or the \"unsigned\" version [`makeUnsignedSTXTokenTransfer`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedSTXTokenTransfer) (with a sender public key, without yet signing) to create a STX token transfer transaction.\n\n```ts -n\nimport { makeSTXTokenTransfer, broadcastTransaction } from '@stacks/transactions';\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n memo: 'test memo',\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n\n// to see the raw serialized tx\nconst serializedTx = transaction.serialize(); // hex string\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Smart Contract Deploy Transaction\n\nUse the [`makeContractDeploy`](https://stacks.js.org/functions/_stacks_transactions.makeContractDeploy), or the \"unsigned\" version [`makeUnsignedContractDeploy`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedContractDeploy) to create a smart contract deploy transaction.\n\n```ts -n\nimport { makeContractDeploy, broadcastTransaction } from '@stacks/transactions';\nimport { readFileSync } from 'fs';\n\nconst clarityCode = readFileSync('/path/to/contract.clar').toString();\n\nconst txOptions = {\n contractName: 'contract_name',\n codeBody: clarityCode,\n clarityVersion: 3, // optional, defaults to latest deployed version\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeContractDeploy(txOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Smart Contract Function Call (On-chain)\n\nIf you want to call a readonly function, use [`fetchCallReadOnlyFunction`](https://stacks.js.org/functions/_stacks_transactions.fetchCallReadOnlyFunction) instead.\n\nUse the [`makeContractCall`](https://stacks.js.org/functions/_stacks_transactions.makeContractCall) or the \"unsigned\" version [`makeUnsignedContractCall`](https://stacks.js.org/functions/_stacks_transactions.makeUnsignedContractCall) to create a smart contract function call transaction.\n\n```ts -n\nimport { makeContractCall, broadcastTransaction, Cl, Pc } from '@stacks/transactions';\n\n// Add an optional post condition\nconst condition01 = Pc.principal('SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE')\n .willSendGte(1000000n)\n .ustx();\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [Cl.bufferFromUtf8('foo string')],\n postConditions: [condition01],\n\n validateWithAbi: true, // check if the arguments given are compatible with the function\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n};\n\nconst transaction = await makeContractCall(txOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction, network: 'testnet' });\nconsole.log(response.txid);\n```\n\nIn this example we construct a `contract-call` transaction with a post condition. We have set the `validateWithAbi` option to `true`, so the `makeContractCall` builder will attempt to fetch this contracts ABI from the specified Stacks network, and validate that the provided functionArgs match what is described in the ABI. This should help you avoid constructing invalid contract-call transactions. If you would prefer to provide your own ABI instead of fetching it from the network, the `validateWithAbi` option also accepts [ClarityABI](https://stacks.js.org/interfaces/_stacks_transactions.ClarityAbi) objects.\n\n## Sponsoring Transactions\n\nTo generate a sponsored transaction, first create and sign the transaction as the origin. The `sponsored` property in the options object must be set to true.\n\n```ts -n\nimport { makeContractCall, Cl } from '@stacks/transactions';\n\nconst txOptions = {\n contractAddress: 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X',\n contractName: 'contract_name',\n functionName: 'contract_function',\n functionArgs: [Cl.bufferFromUtf8('foo string')],\n validateWithAbi: true,\n\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n network: 'testnet', // for mainnet, use 'mainnet'\n sponsored: true,\n};\n\nconst transaction = await makeContractCall(txOptions);\nconst serializedTx = transaction.serialize();\n\n// can't broadcast sponsored transactions before they are sponsored\n```\n\nThe serialized transaction can now be passed to the sponsoring party which will sign the sponsor portion of the transaction and set the fee.\n\n```ts -n\nimport { sponsorTransaction, broadcastTransaction } from '@stacks/transactions';\n\nconst deserializedTx = deserializeTransaction(serializedTx);\nconst sponsorKey = '770287b9471081c8acd37d57190c7a70f0da2633311cc120853537362d32e67c01';\nconst fee = 1000n;\n\nconst sponsorOptions = {\n transaction: deserializedTx,\n sponsorPrivateKey: sponsorKey,\n sponsorNonce: 0,\n fee,\n};\n\nconst sponsoredTx = await sponsorTransaction(sponsorOptions);\n\n// broadcast to the network\nconst response = await broadcastTransaction({ transaction: sponsoredTx, network: 'testnet' });\nconsole.log(response.txid);\n```\n\n## Supporting multi-signature transactions\n\nTo generate a multi-sig transaction, first create an unsigned transaction.\nThe `numSignatures` and `publicKeys` properties in the options object must be set:\n\n```ts -n\nimport {\n makeUnsignedSTXTokenTransfer,\n createStacksPrivateKey,\n deserializeTransaction,\n pubKeyfromPrivKey,\n publicKeyToString,\n TransactionSigner,\n standardPrincipalCV,\n BytesReader,\n AnchorMode,\n} from '@stacks/transactions';\n\nconst recipient = standardPrincipalCV('SP3FGQ8...');\nconst amount = 2500000n;\nconst fee = 0n;\nconst memo = 'test memo';\n\n// private keys of the participants in the transaction\nconst privKeyStrings = ['6d430bb9...', '2a584d89...', 'd5200dee...'];\n\n// create private key objects from string array\nconst privKeys = privKeyStrings.map(createStacksPrivateKey);\n\n// corresponding public keys\nconst pubKeys = privKeyStrings.map(pubKeyfromPrivKey);\n\n// create public key string array from objects\nconst pubKeyStrings = pubKeys.map(publicKeyToString);\n\nconst transaction = await makeUnsignedSTXTokenTransfer({\n recipient,\n amount,\n fee,\n memo,\n numSignatures: 2, // number of signature required\n publicKeys: pubKeyStrings, // public key string array with >= numSignatures elements\n anchorMode: AnchorMode.Any,\n});\n\nconst serializedTx = transaction.serialize();\n```\n\nThis transaction payload can be passed along to other participants to sign. In addition to\nmeeting the numSignatures requirement, the public keys of the parties who did not sign the\ntransaction must be appended to the signature.\n\n```ts -n\n// deserialize and sign transaction\nconst bytesReader = new BytesReader(serializedTx);\n// Partially signed or unsigned multi-sig tx can be deserialized to add the required signatures\nconst deserializedTx = deserializeTransaction(bytesReader);\n\nconst signer = new TransactionSigner(deserializedTx);\n\n// first signature\nsigner.signOrigin(privKeys[0]);\n\n// second signature\nsigner.signOrigin(privKeys[1]);\n\n// after meeting the numSignatures requirement, the public\n// keys of the participants who did not sign must be appended\nsigner.appendOrigin(pubKeys[2]);\n\n// the serialized multi-sig tx\nconst serializedSignedTx = deserializedTx.serialize();\n```\n\n## Calling Read-only Contract Functions\n\nRead-only contract functions can be called without generating or broadcasting a transaction. Instead it works via a direct API call to a Stacks node.\n\n```ts -n\nimport { bufferCVFromString, callReadOnlyFunction } from '@stacks/transactions';\nimport { StacksTestnet } from '@stacks/network';\n\nconst contractAddress = 'ST3KC0MTNW34S1ZXD36JYKFD3JJMWA01M55DSJ4JE';\nconst contractName = 'kv-store';\nconst functionName = 'get-value';\nconst buffer = bufferCVFromString('foo');\nconst network = new StacksTestnet();\nconst senderAddress = 'ST2F4BK4GZH6YFBNHYDDGN4T1RKBA7DA1BJZPJEJJ';\n\nconst options = {\n contractAddress,\n contractName,\n functionName,\n functionArgs: [buffer],\n network,\n senderAddress,\n};\n\nconst result = await callReadOnlyFunction(options);\n```\n\n## Constructing Clarity Values\n\nBuilding transactions that call functions in deployed clarity contracts requires you to construct valid Clarity Values to pass to the function as arguments. The [Clarity type system](https://github.com/stacksgov/sips/blob/master/sip/sip-002-smart-contract-language.md#clarity-type-system) contains the following types:\n\n- `(tuple (key-name-0 key-type-0) (key-name-1 key-type-1) ...)` : a typed tuple with named fields.\n- `(list max-len entry-type)` : a list of maximum length max-len, with entries of type entry-type\n- `(response ok-type err-type)` : object used by public functions to commit their changes or abort. May be returned or used by other functions as well, however, only public functions have the commit/abort behavior.\n- `(optional some-type)` : an option type for objects that can either be (some value) or none\n- `(buff max-len)` : byte buffer or maximum length max-len.\n- `principal` : object representing a principal (whether a contract principal or standard principal).\n- `bool` : boolean value (`true` or `false`)\n- `int` : signed 128-bit integer\n- `uint`: unsigned 128-bit integer\n\nThis library contains Typescript types and classes that map to the Clarity types, in order to make it easy to construct well-typed Clarity values in Javascript. These types all extend the abstract class `ClarityValue`.\n\n```ts -n\nimport {\n trueCV,\n falseCV,\n noneCV,\n someCV,\n intCV,\n uintCV,\n standardPrincipalCV,\n contractPrincipalCV,\n responseErrorCV,\n responseOkCV,\n listCV,\n tupleCV,\n bufferCV,\n} from '@stacks/transactions';\nimport { utf8ToBytes } from '@stacks/common';\n\n// construct boolean clarity values\nconst t = trueCV();\nconst f = falseCV();\n\n// construct optional clarity values\nconst nothing = noneCV();\nconst something = someCV(t);\n\n// construct a buffer clarity value from an existing byte array\nconst bytes = utf8ToBytes('foo'); // Uint8Array(3) [ 102, 111, 111 ]\nconst bufCV = bufferCV(bytes);\n\n// construct signed and unsigned integer clarity values\nconst i = intCV(-10);\nconst u = uintCV(10);\n\n// construct principal clarity values\nconst address = 'SP2JXKMSH007NPYAQHKJPQMAQYAD90NQGTVJVQ02B';\nconst contractName = 'contract-name';\nconst spCV = standardPrincipalCV(address);\nconst cpCV = contractPrincipalCV(address, contractName);\n\n// construct response clarity values\nconst errCV = responseErrorCV(trueCV());\nconst okCV = responseOkCV(falseCV());\n\n// construct tuple clarity values\nconst tupCV = tupleCV({\n a: intCV(1),\n b: trueCV(),\n c: falseCV(),\n});\n\n// construct list clarity values\nconst l = listCV([trueCV(), falseCV()]);\n```\n\nIf you develop in Typescript, the type checker can help prevent you from creating wrongly-typed Clarity values. For example, the following code won't compile since in Clarity lists are homogeneous, meaning they can only contain values of a single type. It is important to include the type variable `BooleanCV` in this example, otherwise the typescript type checker won't know which type the list is of and won't enforce homogeneity.\n\n```ts -n\nconst l = listCV<BooleanCV>([trueCV(), intCV(1)]);\n```\n\n## Post Conditions\n\nThree types of post conditions can be added to transactions:\n\n1. STX post condition\n2. Fungible token post condition\n3. Non-Fungible token post condition\n\nFor details see: https://github.com/stacksgov/sips/blob/main/sips/sip-005/sip-005-blocks-and-transactions.md#transaction-post-conditions\n\n## STX post condition\n\n```ts -n\nimport {\n FungibleConditionCode,\n makeStandardSTXPostCondition,\n makeContractSTXPostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\n\nconst standardSTXPostCondition = makeStandardSTXPostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractSTXPostCondition = makeContractSTXPostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount\n);\n```\n\n## Fungible token post condition\n\n```ts -n\nimport {\n FungibleConditionCode,\n createAssetInfo,\n makeStandardFungiblePostCondition,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = FungibleConditionCode.GreaterEqual;\nconst postConditionAmount = 12345n;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardFungiblePostCondition = makeStandardFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-token';\nconst fungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst contractFungiblePostCondition = makeContractFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n postConditionAmount,\n fungibleAssetInfo\n);\n```\n\n## Non-fungible token post condition\n\n> **Warning**\n> The Stacks blockchain's post-condition processor can NOT check ownership.\n> It checks whether or not a principal **will send** or **will not send** an NFT.\n> Post-conditions can NOT verify anything about the recipient of an asset.\n> If you want to verify conditions about asset recipients, you will need to use [Clarity](https://docs.stacks.co/docs/write-smart-contracts/).\n\n```ts -n\nimport {\n NonFungibleConditionCode,\n createAssetInfo,\n makeStandardNonFungiblePostCondition,\n makeContractNonFungiblePostCondition,\n bufferCVFromString,\n} from '@stacks/transactions';\n\n// With a standard principal\nconst postConditionAddress = 'SP2ZD731ANQZT6J4K3F5N8A40ZXWXC1XFXHVVQFKE';\nconst postConditionCode = NonFungibleConditionCode.DoesNotSend;\nconst assetAddress = 'SP62M8MEFH32WGSB7XSF9WJZD7TQB48VQB5ANWSJ';\nconst assetContractName = 'test-asset-contract';\nconst assetName = 'test-asset';\nconst assetId = bufferCVFromString('test-token-asset-id');\nconst nonFungibleAssetInfo = createAssetInfo(assetAddress, assetContractName, assetName);\n\nconst standardNonFungiblePostCondition = makeStandardNonFungiblePostCondition(\n postConditionAddress,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n\n// With a contract principal\nconst contractAddress = 'SPBMRFRPPGCDE3F384WCJPK8PQJGZ8K9QKK7F59X';\nconst contractName = 'test-contract';\n\nconst contractNonFungiblePostCondition = makeContractNonFungiblePostCondition(\n contractAddress,\n contractName,\n postConditionCode,\n nonFungibleAssetInfo,\n assetId\n);\n```\n\n## Conversion of Clarity Values to JSON\n\nClarity Values represent values of Clarity contracts. If a JSON format is required the helper function `cvToJSON` can be used.\n\n```ts -n\nimport { cvToJSON, hexToCV } from '@stacks/transactions';\n\ncvToJSON(hexToCV(tx.tx_result.hex));\n```\n" + }, + { + "title": "@stacks/network", + "description": "Network and API library for working with Stacks blockchain nodes.", + "slug": "/stacks/reference/stacks.js/network", + "content": "\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\nThe `@stacks/network` package contains default network configurations for Stacks.\n\n## Installation\n\n<Callout type=\"tip\">\nBefore you install: most of the time you don't need to use or even install this library directly.\nFor example, instead of `STACKS_MAINNET`, simply use the string `\"mainnet\"` as the network parameter.\n</Callout>\n\n```package-install\n@stacks/network@latest\n```\n\n## Usage\n\n## The network object\n\nA network in Stacks.js is an object defining several properties.\n\n```ts\nimport { STACKS_MAINNET, STACKS_TESTNET, STACKS_DEVNET } from '@stacks/network';\n\nconsole.log(STACKS_MAINNET);\n// {\n// chainId: 1,\n// transactionVersion: 0,\n// peerNetworkId: 385875968,\n// magicBytes: 'X2',\n// bootAddress: 'SP000000000000000000002Q6VF78',\n// addressVersion: { singleSig: 22, multiSig: 20 }\n// }\n```\n\n## Network usage in transaction building\n\n```ts\nimport { STACKS_MAINNET } from '@stacks/network';\nimport { makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst txOptions = {\n recipient: 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26',\n amount: 100,\n // ...\n network: 'mainnet', // 'mainnet', 'testnet', or 'devnet', (defaults to mainnet)\n // OR\n network: STACKS_MAINNET, // any compatible network object\n};\n\nconst transaction = await makeSTXTokenTransfer(txOptions);\n```\n" + }, + { + "title": "@stacks/common", + "description": "Common utilities for working with Stacks.", + "slug": "/stacks/reference/stacks.js/common", + "content": "\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\nimport { Callout } from \"@/components/callout\";\n\n<Callout type=\"info\">\nThis reference refers to the `7.x.x` release of Stacks.js—it's the recommended version to use, but not needed for the Stacks Nakamoto release.\nRead the [migration guide](https://github.com/hirosystems/stacks.js/blob/main/.github/MIGRATION.md#stacksjs-5xx--7xx) to learn how to update to the latest version.\n</Callout>\n\nThe `@stacks/common` package contains common utilities for working with Stacks.\nThis includes fetch helpers, middleware, and various other functions.\n\n## Installation\n\n```package-install\n@stacks/common@latest\n```\n\n\n## Use the built-in API key middleware\n\nSome Stacks APIs make use API keys to provide less rate-limited plans.\n\n```typescript\nimport { createApiKeyMiddleware, createFetchFn, StacksMainnet } from '@stacks/network';\nimport { broadcastTransaction, getNonce, makeSTXTokenTransfer } from '@stacks/transactions';\n\nconst myApiMiddleware = createApiKeyMiddleware('example_e8e044a3_41d8b0fe_3dd3988ef302');\nconst myFetchFn = createFetchFn(myApiMiddleware); // middlewares can be used to create a new fetch function\n\nconst txOptions = {\n recipient: 'SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159',\n amount: 12345n,\n senderKey: 'b244296d5907de9864c0b0d51f98a13c52890be0404e83f273144cd5b9960eed01',\n memo: 'some memo',\n anchorMode: AnchorMode.Any,\n client: {\n fetch: myFetchFn,\n }\n};\nconst transaction = await makeSTXTokenTransfer(txOptions); // fee-estimation will use the custom fetchFn\n\nconst response = await broadcastTransaction(transaction, myMainnet); // make sure to broadcast via the custom network object\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', myMainnet);\n```\n\n## Use custom middleware\n\nMiddleware can be used to hook into network calls before sending a request or after receiving a response.\n\n```typescript\nimport { createFetchFn, RequestContext, ResponseContext } from '@stacks/common';\n\nconst preMiddleware = (ctx: RequestContext) => {\n ctx.init.headers = new Headers();\n ctx.init.headers.set('x-foo', 'bar'); // override headers and set new `x-foo` header\n};\nconst postMiddleware = (ctx: ResponseContext) => {\n console.log(await ctx.response.json()); // log response body as json\n};\n\nconst fetchFn = createFetchFn({ pre: preMiddleware, post: preMiddleware }); // a middleware can contain `pre`, `post`, or both\nconst network = new StacksTestnet({ fetchFn });\n\n// stacks.js functions, which take a StacksNetwork object will use the custom fetchFn\nconst nonce = await getNonce('SP3FGQ8Z7JY9BWYZ5WM53E0M9NK7WHJF0691NZ159', network);\n```\n\n## Get various API URLs\n\n```typescript\nconst txBroadcastUrl = network.getBroadcastApiUrl();\n\nconst feeEstimateUrl = network.getTransferFeeEstimateApiUrl();\n\nconst address = 'SP2BS6HD7TN34V8Z5BNF8Q2AW3K8K2DPV4264CF26';\nconst accountInfoUrl = network.getAccountApiUrl(address);\n\nconst contractName = 'hello_world';\nconst abiUrl = network.getAbiApiUrl(address, contractName);\n\nconst functionName = 'hello';\nconst readOnlyFunctionCallUrl = network.getReadOnlyFunctionCallApiUrl(\n address,\n contractName,\n functionName\n);\n\nconst nodeInfoUrl = network.getInfoUrl();\n\nconst blockTimeUrl = network.getBlockTimeInfoUrl();\n\nconst poxInfoUrl = network.getPoxInfoUrl();\n```\n" + }, + { + "title": "Bitcoin Scopes", + "description": "Reference guide for available scopes for Bitcoin.", + "slug": "/stacks/chainhook/references/scopes/bitcoin", + "content": "\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\nimport { InlineCode } from '@/components/inline-code';\n\nBitcoin scopes are parameters you use to define the `if this` specification logic of your Chainhook on the Bitcoin blockchain. In other words, scopes specify what on-chain events you are looking to monitor and track. For more information on Chainhook design, please view [predicate design](/stacks/chainhook/concepts/predicate-design).\n\n<Root>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`txid`</h2>\n\nThe `txid` scope allows you to query transactions based on their transaction ID. This is particularly useful for tracking specific transactions or auditing transaction histories.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"equals\"} type={\"string\"}>\n\nThe `equals` property is a 32 byte hex encoded type used to specify the exact transaction ID to match.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By transaction ID</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"txid\",\n \"equals\": \"0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`outputs`</h2>\n\nThe `outputs` scope allows you to query blocks based on the payload returned by the specified operation.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"operation\"} type={\"object\"}>\n \nThe `operation` property is used to identify the Bitcoin operation that will trigger Chainhook as it observes Bitcoin transactions. The available operations are `op_return`, `p2pkh`, `p2sh`,`p2wpkh` and `p2wsh`.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"op_return\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"op_return\" className='tab group'>\n <Badge className='badge transition-colors'>Using op_return</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"p2kph\" className='tab group'>\n <Badge className='badge transition-colors'>Using p2pkh</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"p2sh\" className='tab group'>\n <Badge className='badge transition-colors'>Using p2sh</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"p2wpkh\" className='tab group'>\n <Badge className='badge transition-colors'>Using p2wpkh</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"p2wsh\" className='tab group'>\n <Badge className='badge transition-colors'>Using p2wsh</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"descriptor\" className='tab group'>\n <Badge className='badge transition-colors'>Using descriptor</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"op_return\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"op_return\": {\n \"equals\": \"0xbtc21000042stx016\"\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"equals\" type=\"string/32-byte encoded hex\">\n The `equals` property specifies the exact characters of the string or 32 byte encoded hex to match.\n </Property>\n <Property required={true} deprecated={false} name=\"starts_with\" type=\"string/32-byte encoded hex\">\n The `starts_with` property specifies the starting characters of the string or 32 byte encoded hex to match.\n </Property>\n <Property required={true} deprecated={false} name=\"ends_with\" type=\"string/32-byte encoded hex\">\n The `ends_with` property specifies the ending characters of the string or 32 byte encoded hex to match.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n The `op_return` operation allows for `equals`, `starts_with` and `ends_with` for matching against the desired input. \n </Callout>\n </TabsContent>\n <TabsContent value=\"p2kph\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2kph\": {\n \"equals\": \"0xbtc21000042stx016\"\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"equals\" type=\"string/32-byte encoded hex\">\n The `equals` property specifies the exact characters of the string or 32 byte encoded hex to match.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n `p2pkh`(Pay-to-Public-Key-Hash) is a Bitcoin transaction output script type that allows users to send funds to a recipient's hashed public key, providing security and privacy by concealing the actual public key.\n </Callout>\n </TabsContent>\n <TabsContent value=\"p2sh\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2sh\": {\n \"equals\": \"0xbtc21000042stx016\"\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"equals\" type=\"string/32-byte encoded hex\">\n The `equals` property specifies the exact characters of the string or 32 byte encoded hex to match.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n `p2sh`(Pay-to-Script-Hash) is a Bitcoin transaction output script type that enables users to send funds to a script instead of a public key, allowing for more complex transaction conditions and multi-signature addresses.\n </Callout>\n </TabsContent>\n <TabsContent value=\"p2wpkh\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2wpkh\": {\n \"equals\": \"0xbtc21000042stx016\"\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"equals\" type=\"string\">\n The `equals` property specifies the exact characters of the string to match.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n `p2wpkh`(Pay-to-Witness-Public-Key-Hash) is a Bitcoin transaction output script type used in Segregated Witness (SegWit) that allows for more efficient and secure transactions by separating the witness data from the transaction data and storing it in a separate block. \n </Callout>\n </TabsContent>\n <TabsContent value=\"p2wsh\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2wsh\": {\n \"equals\": \"0xbtc21000042stx016\"\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"equals\" type=\"string\">\n The `equals` property specifies the exact characters of the string to match.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n `p2wsh` (Pay-to-Witness-Script-Hash) is a Bitcoin transaction output script type used in Segregated Witness (SegWit) that enables users to send funds to a hashed script, allowing for more complex transaction conditions and greater scalability by separating the script from the transaction data.\n </Callout>\n </TabsContent>\n <TabsContent value=\"descriptor\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"outputs\",\n \"descriptor\": {\n \"expression\": \"wpkh(tprv8ZgxMBicQKsPePxn6j3TjvB2MBzQkuhGgc6oRh2WZancZQgxktcnjZJ44XdsRiw3jNkbVTK9JW6KFHvnRKgAMtSyuBevMJprSkZ4PTfmTgV/84'/1'/0'/0/*)\",\n \"range\": [0, 3]\n }\n }\n }\n ```\n <Accordions>\n <Accordion title=\"Parameters\">\n <Property required={true} deprecated={false} name=\"expression\" type=\"string\">\n The `expression` property specifies the exact characters of the string to match.\n </Property>\n <Property required={true} deprecated={false} name=\"range\" type=\"integer[]\">\n The `range` property specifies and array of integers representing the desired indexes.\n </Property>\n </Accordion>\n </Accordions>\n <Callout type=\"info\" title=\"Note\">\n <Accordions>\n <Accordion title=\"Wallet descriptors\">\n Wallet descriptors provide a compact and semi-standardized method for describing how scripts and addresses within a wallet are generated. Chainhook users that want to track addresses derived from an extended pubkey or a multisig-wallet can now rely on this feature instead of defining one predicate per address.\n For example, let's say we wanted to track the first 3 addresses generated by the following descriptor:\n\n ```\n wpkh(tprv8ZgxMBicQKsPePxn6j3TjvB2MBzQkuhGgc6oRh2WZancZQgxktcnjZJ44XdsRiw3jNkbVTK9JW6KFHvnRKgAMtSyuBevMJprSkZ4PTfmTgV/84'/1'/0'/0/*)\n ```\n\n This descriptor reads: describe a P2WPKH output with the specified extended public key, and it produces these BIP84 addresses:\n\n ```\n bcrt1qzy2rdyvu8c57qd8exyyp0mw7dk5drsu9ewzdsu\n bcrt1qsfsjnagr29m8h3a3vdand2s85cg4cefkcwk2fy\n bcrt1qauewfytqe5mtr0xwp786r6fl39kmum2lr65kmj\n ```\n </Accordion>\n </Accordions>\n </Callout>\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`stacks_protocol`</h2>\n\nThe `stacks_protocol` scope allows you query Bitcoin transactions related to the Stacks Proof of Transfer (PoT) [concensus mechanism](https://www.hiro.so/blog/securing-web3-apps-through-bitcoin-an-overview-of-stacks-consensus-mechanism).\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"operation\"} type={\"string\"}>\n\nThe `operation` property is used to identify the Stacks operation that will trigger Chainhook as it observes Bitcoin transactions. The available operations are `block_committed`, `leader_registered`, `inscription_feed`, `stx_transferred` and `stx_locked`.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"block_committed\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"block_committed\" className='tab group'>\n <Badge className='badge transition-colors'>Using block_committed</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"leader_registered\" className='tab group'>\n <Badge className='badge transition-colors'>Using leader_registered</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"inscription_feed\" className='tab group'>\n <Badge className='badge transition-colors'>Using inscription_feed</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"stx_transferred\" className='tab group'>\n <Badge className='badge transition-colors'>Using stx_transferred</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"stx_locked\" className='tab group'>\n <Badge className='badge transition-colors'>Using stx_locked</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"block_committed\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"stacks_protocol\",\n \"operation\": \"block_committed\"\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"leader_registered\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"stacks_protocol\",\n \"operation\": \"leader_registered\"\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"inscription_feed\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"stacks_protocol\",\n \"operation\": \"inscription_feed\"\n }\n }\n ```\n\n <Callout type=\"info\" title=\"Note\">\n `inscription_feed` observes the reveal and transfer of an Ordinal inscription.\n </Callout>\n </TabsContent>\n <TabsContent value=\"stx_transferred\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"stacks_protocol\",\n \"operation\": \"stx_transferred\"\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"stx_locked\">\n\n ```json\n {\n \"if_this\": {\n \"scope\": \"stacks_protocol\",\n \"operation\": \"stx_locked\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n</Root>" + }, + { + "title": "Stacks Scopes", + "description": "Reference guide for available scopes for Stacks.", + "slug": "/stacks/chainhook/references/scopes/stacks", + "content": "\nimport { Root, API, APIExample } from 'fumadocs-openapi/ui';\nimport { Property } from 'fumadocs-openapi/ui'\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { Badge } from '@/components/ui/badge';\n\nimport { InlineCode } from '@/components/inline-code';\n\nStacks scopes are parameters you use to define the `if this` specification logic of your Chainhook on the Stacks blockchain. In other words, scopes specify what on-chain events you are looking to monitor and track. For more information on Chainhook design, please view [predicate design](/stacks/chainhook/concepts/predicate-design).\n\n<Root>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`txid`</h2>\n\nThe `txid` scope allows you to query transactions based on their transaction ID. This is particularly useful for tracking specific transactions or auditing transaction histories.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"equals\"} type={\"string\"}>\n\nThe `equals` property is a 32 bytes hex encoded type used to specify the exact transaction ID to match.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By transaction ID</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"txid\",\n \"equals\": \"0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`block_height`</h2>\n\nThe `block_height` scope allows you to query blocks based on their height. This is useful for identifying specific blocks or ranges of blocks in the blockchain.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"equals\"} type={\"integer\"}>\n\nThe `equals` property specifies the exact height of the block to match.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"higher_than\"} type={\"integer\"}>\n\nThe `higher_than` property specifies that the block height should be greater than the provided value.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"lower_than\"} type={\"integer\"}>\n\nThe `lower_than` property specifies that the block height should be less than the provided value.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"between\"} type={\"array of integers\"}>\n\nThe `between` property specifies a range of block heights to match, inclusive of the provided start and end values.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By block height</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"higher_than\" className='tab group'>\n <Badge className='badge transition-colors'>Using higher_than</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"lower_than\" className='tab group'>\n <Badge className='badge transition-colors'>Using lower_than</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"between\" className='tab group'>\n <Badge className='badge transition-colors'>Between two block heights</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"block_height\",\n \"equals\": 141200\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"higher_than\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"block_height\",\n \"higher_than\": 10000\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"lower_than\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"block_height\",\n \"lower_than\": 10000\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"between\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"block_height\",\n \"between\": [0, 10000]\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`ft_transfer`</h2>\n\nThe `ft_transfer` scope allows you to query transactions based on fungible token transfers. This is useful for tracking specific token movements or auditing token transfer histories.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"asset_identifier\"} type={\"string\"}>\n\nThe `asset_identifier` property specifies the fully qualified asset identifier to observe.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"actions\"} type={\"string[]\"}>\n\nThe `actions` property specifies the types of token actions to observe, such as `mint`, `transfer`, or `burn`.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By a single action</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"all\" className='tab group'>\n <Badge className='badge transition-colors0'>Passing all ft actions</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"ft_transfer\",\n \"asset_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.cbtc-token::cbtc\",\n \"actions\": [\"transfer\"]\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"all\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"ft_transfer\",\n \"asset_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.cbtc-token::cbtc\",\n \"actions\": [\"mint\", \"transfer\", \"burn\"]\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`nft_transfer`</h2>\n\nThe `nft_transfer` scope allows you to query transactions based on non-fungible token transfers. This is useful for tracking specific NFT movements or auditing NFT transfer histories.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"asset_identifier\"} type={\"string\"}>\n\nThe `asset_identifier` property specifies the fully qualified asset identifier to observe.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"actions\"} type={\"array of strings\"}>\n\nThe `actions` property specifies the types of NFT actions to observe, such as `mint`, `transfer`, or `burn`.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By non-fungible token mint</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"all\" className='tab group'>\n <Badge className='badge transition-colors'>Passing all nft actions</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"nft_transfer\",\n \"asset_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09::monkeys\",\n \"actions\": [\"mint\"]\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"all\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"nft_transfer\",\n \"asset_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09::monkeys\",\n \"actions\": [\"mint\", \"transfer\", \"burn\"]\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`stx_transfer`</h2>\n\nThe `stx_transfer` scope allows you to query transactions involving STX token movements. This is crucial for monitoring STX transfers, including minting, burning, and locking actions.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"actions\"} type={\"array of strings\"}>\n\nThe `actions` property specifies the types of STX token actions to observe, such as `mint`, `transfer`, `burn`, and `lock`.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By STX token transfer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"all\" className='tab group'>\n <Badge className='badge transition-colors'>Passing all actions</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"stx_transfer\",\n \"actions\": [\"transfer\"]\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"all\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"stx_transfer\",\n \"actions\": [\"mint\", \"transfer\", \"burn\", \"lock\"]\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`print_event`</h2>\n\nThe `print_event` scope allows you to query transactions based on specific print events emitted during contract execution. This is useful for monitoring specific events for auditing or tracking purposes.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"contract_identifier\"} type={\"string\"}>\n\nThe `contract_identifier` property specifies the fully qualified contract identifier to observe.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"contains\"} type={\"string\"}>\n\nThe `contains` property is used for matching an event containing the specified string.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"matches_regex\"} type={\"string\"}>\n\nThe `matches_regex` property is used for matching an event that regex matches with the specified string.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Using contains</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"matches_regex\" className='tab group'>\n <Badge className='badge transition-colors'>Using matches_regex</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09\",\n \"contains\": \"monkey\"\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"matches_regex\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09\",\n \"matches_regex\": \"(?:^|\\\\W)monkey(?:$|\\\\W)\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`contract_call`</h2>\n\nThe `contract_call` scope allows you to query transactions that involve direct calls to specific methods within a smart contract. This is particularly useful for tracking interactions with critical contract functions.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"contract_identifier\"} type={\"string\"}>\n\nThe `contract_identifier` property specifies the fully qualified contract identifier to observe.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"method\"} type={\"string\"}>\n\nThe `method` property specifies the specific method within the contract to observe.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>Scoping by contract method call</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"SP000000000000000000002Q6VF78.pox\",\n \"method\": \"stack-stx\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n<API className='my-20'>\n\n<div className='flex-1'>\n\n<h2 className='mt-0'>`contract_deployment`</h2>\n\nThe `contract_deployment` scope allows you to query transactions involving the deployment of smart contracts. This is crucial for monitoring new contract deployments and ensuring compliance with expected deployments.\n\n## Parameters\n\n<Property required={true} deprecated={false} name={\"deployer\"} type={\"string\"}>\n\nThe `deployer` property specifies the STX address of the deployer to observe.\n\n</Property>\n\n<Property required={true} deprecated={false} name={\"implement_trait\"} type={\"string\"}>\n\nThe `implement_trait` property specifies the contract trait to observe.\n\n</Property>\n\n</div>\n\n<APIExample className='w-full'>\n\n<Tabs defaultValue=\"default\">\n <TabsList className='flex flex-wrap'>\n <TabsTrigger value=\"default\" className='tab group'>\n <Badge className='badge transition-colors'>By deployer</Badge>\n </TabsTrigger>\n <TabsTrigger value=\"trait\" className='tab group'>\n <Badge className='badge transition-colors'>By contract trait</Badge>\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"default\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"contract_deployment\",\n \"deployer\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM\"\n }\n }\n ```\n </TabsContent>\n <TabsContent value=\"trait\">\n ```json\n {\n \"if_this\": {\n \"scope\": \"contract_deployment\",\n \"implement_trait\": \"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sip09-protocol\"\n }\n }\n ```\n </TabsContent>\n</Tabs>\n\n</APIExample>\n\n</API>\n\n</Root>\n" + }, + { + "title": "Overview", + "description": "Chainhook enables you to target events on the Bitcoin and Stacks blockchain important to your use case in order to trigger actions based on those events.", + "slug": "/stacks/chainhook/index", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nChainhook is a reorg-aware indexer that serves reliable blockchain data—you don’t have to waste time reindexing your database every time there's a fork. Chainhook also lets you index only the data you need, which means you can build lighter databases, get faster query results, and deliver a better experience to your users.\n\nTo get started, check out our [installation guide](/stacks/chainhook/installation).\n\n## Create event streams\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/chainhook/guides/chainhook-as-a-service\"\n title=\"Create a Bitcoin chainhook\"\n description=\"Build a chainhook that indexes events on the Bitcoin blockchain.\"\n />\n <SecondaryCard\n href=\"/stacks/chainhook/guides/chainhook-as-a-service-with-stacks-node\"\n title=\"Create a Stacks chainhook\"\n description=\"Build a chainhook that indexes events on the Stacks blockchain.\"\n />\n <SecondaryCard\n href=\"/stacks/chainhook/guides/register-chainhooks-on-devnet\"\n title=\"Test your chainhooks\"\n description=\"Test and debug your chainhooks in a local environment.\"\n />\n</Cards>\n\n## Setting up Chainhook predicates\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/chainhook/concepts/bitcoin-predicates\"\n title=\"Bitcoin predicates\"\n description=\"A list of "if this, then that" logic for Bitcoin chainhooks.\"\n />\n <SecondaryCard\n href=\"/stacks/chainhook/concepts/stacks-predicates\"\n title=\"Stacks predicates\"\n description=\"A list of "if this, then that" logic for Bitcoin chainhooks.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Bitcoin Indexer](/bitcoin/indexer)**: Simplify your testing with the Clarinet JS SDK.\n- **[Hiro Platform](/stacks/platform)**: A developer platform for building, deploying and scaling Bitcoin apps.\n\n<br />\n\n<Callout title=\"Need help building with Chainhook?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#chainhook</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>" + }, + { + "title": "Run Chainhook as a service with a Stacks node", + "description": "Learn how to run Chainhook as a service with a Stacks node to evaluate Stacks blocks against your predicates.", + "slug": "/stacks/chainhook/examples/chainhook-as-a-service-with-stacks-node", + "content": "\nYou can run Chainhook as a service to evaluate Stacks blocks against your predicates. You can also dynamically register new predicates by enabling the predicates registration API.\n\nIn this guide, you will learn how to:\n\n1. [Configure your Stacks node to work with Chainhook](#configure-your-stacks-node).\n2. [Configure Chainhook](#configure-chainhook).\n3. [Create a predicate to evaluate your events](#create-a-predicate).\n4. [Initiate a Chainhook service to watch for matching transactions](#initiate-chainhook-as-a-service).\n5. [Dynamically register your predicates with Chainhook](#dynamically-register-predicates).\n\n{/* <Callout>Check out a full example [here](https://github.com/hiro-so/stacks-connect-example).</Callout> */}\n\n---\n\n## Configure Your Stacks Node\n\nIf you followed along with the previous guide on syncing a Stacks node, you should generate a `Stacks.toml` file within your Stacks node repository. Below is a sample `Stacks.toml` file:\n\n```toml title=\"Stacks.toml\"\n[node]\nworking_dir = \"/stacks-blockchain\"\nrpc_bind = \"0.0.0.0:20443\" # Make a note of this port to use in the `Chainhook.toml`\np2p_bind = \"0.0.0.0:20444\"\nbootstrap_node = \"02da7a464ac770ae8337a343670778b93410f2f3fef6bea98dd1c3e9224459d36b@seed-0.mainnet.stacks.co:20444,02afeae522aab5f8c99a00ddf75fbcb4a641e052dd48836408d9cf437344b63516@seed-1.mainnet.stacks.co:20444,03652212ea76be0ed4cd83a25c06e57819993029a7b9999f7d63c36340b34a4e62@seed-2.mainnet.stacks.co:20444\"\n\n[burnchain]\nchain = \"bitcoin\"\nmode = \"mainnet\"\npeer_host = \"localhost\"\nusername = \"bitcoind_username\" # Must match the rpcuser in the bitcoin.conf\npassword = \"bitcoind_password\" # Must match the rpcpassword in the bitcoin.conf\nrpc_port = 8332 # Must match the rpcport in the bitcoin.conf\npeer_port = 8333\n\n[[events_observer]]\nendpoint = \"localhost:20455\"\nretry_count = 255\nevents_keys = [\"*\"]\n```\n<Callout title=\"Note\">\nEnsure that the `username`, `password`, and `rpc_port` values in the `Stacks.toml` file match the values in the `bitcoin.conf` file. Also, note the `rpc_bind` port to use in the `Chainhook.toml` configuration in the next section.\n</Callout>\n\n## Configure Chainhook\n\nIn this section, you will configure Chainhook to communicate with the network. Run the following command in your terminal to generate the `Chainhook.toml` file:\n\n```terminal\n$ chainhook config generate --mainnet\n```\n\nSeveral network parameters in the generated Chainhook.toml configuration file need to match those in the bitcoin.conf file created earlier in the Setting up a Bitcoin Node section. Update the following parameters accordingly:\n\n1. Update `bitcoind_rpc_username` with the username set for `rpcuser` in `bitcoin.conf`.\n2. Update `bitcoind_rpc_password` with the password set for `rpcpassword` in `bitcoin.conf`.\n3. Update `bitcoind_rpc_url` with the same host and port used for `rpcport` in `bitcoin.conf`.\n4. Ensure `stacks_node_rpc_url` matches the `rpc_bind` in the `Stacks.toml` file.\n\nThe generated `Chainhook.toml` file should look like this:\n\n```toml title=\"Chainhook.toml\"\n[storage]\nworking_dir = \"cache\"\n\n# The http API allows you to register / deregister predicates dynamically.\n# This is disabled by default.\n\n# [http_api]\n# http_port = 20456\n# database_uri = \"redis://localhost:6379/\"\n\n[network]\nmode = \"mainnet\"\nbitcoind_rpc_url = \"http://localhost:8332\"\nbitcoind_rpc_username = \"devnet\"\nbitcoind_rpc_password = \"devnet\"\n# Bitcoin block events can be received by Chainhook\n# either through a Bitcoin node's ZeroMQ interface,\n# or through the Stacks node. The Stacks node is\n# used by default:\nstacks_node_rpc_url = \"http://localhost:20443\"\nstacks_events_ingestion_port = 20455\n# but zmq can be used instead:\n# bitcoind_zmq_url = \"tcp://0.0.0.0:18543\"\n\n[limits]\nmax_number_of_bitcoin_predicates = 100\nmax_number_of_concurrent_bitcoin_scans = 100\nmax_number_of_stacks_predicates = 10\nmax_number_of_concurrent_stacks_scans = 10\nmax_number_of_processing_threads = 16\nmax_number_of_networking_threads = 16\nmax_caching_memory_size_mb = 32000\n\n[[event_source]]\ntsv_file_url = \"https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest\"\n```\n\nEnsure the following configurations are matched to allow Chainhook to communicate with both Stacks and Bitcoin:\n\n| bitcoin.conf | Stacks.toml | Chainhook.toml |\n|--------------------|-------------|-----------------------------|\n| rpcuser | username | bitcoind_rpc_username |\n| rpcpassword | password | bitcoind_rpc_password |\n| rpcport | rpc_port | bitcoind_rpc_url |\n| zmqpubhashblock | | bitcoind_zmq_url |\n| | rpc_bind | stacks_node_rpc_url |\n| | endpoint | stacks_events_ingestion_port |\n\n<Callout title=\"Note\">\nThe `bitcoind_zmq_url` is optional when running Chainhook as a service using Stacks because Stacks will pull the blocks from Stacks and the Bitcoin chain.\n</Callout>\n\n## Create a predicate\n\nNow that the Stacks and Chainhook configurations are done, you can scan your blocks by defining your predicates.\n\n### Appending events to a file\n\nThe following command will generate a sample JSON file `print-event.json`.\n\n```terminal\n$ chainhook predicates new print-event.json --stacks\n```\n\nOnce the boilerplate predicate code has been generated, update the `print-event.json` file with the following content:\n\n```json title=\"print-event.json\"\n{\n \"chain\": \"stacks\",\n \"uuid\": \"6ad27176-2b83-4381-b51c-50baede11e3f\",\n \"name\": \"Hello world\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"start_block\": 34239,\n \"end_block\": 50000,\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"ST1SVA0SST0EDT4MFYGWGP6GNSXMMQJDVP1G8QTTC.arkadiko-freddie-v1-1\",\n \"contains\": \"vault\"\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"arkadiko.txt\"\n }\n }\n },\n \"mainnet\": {\n \"start_block\": 34239,\n \"end_block\": 50000,\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1\",\n \"contains\": \"vault\"\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"arkadiko.txt\"\n }\n }\n }\n }\n}\n```\n\nNow, use the following command to scan the blocks based on the predicates defined in the `print-event.json` file:\n\n```terminal\n$ chainhook predicates scan print-event.json --mainnet\n```\n\nThe output of the above command will be a file `arkadiko.txt` generated based on the predicate definition.\n\n### Sending events to an API endpoint\n\n```terminal\n$ chainhook predicates new print-event-post.json --stacks\n```\n\nThis will generate a sample JSON file `print-event-post.json`. Update the generated `print-event-post.json` file with the following content:\n\n```json title=\"print-event-post.json\"\n{\n \"chain\": \"stacks\",\n \"uuid\": \"e5fa09b2-ec3e-4b6a-9a4a-0ebb454f6e19\",\n \"name\": \"Hello world\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"ST1SVA0SST0EDT4MFYGWGP6GNSXMMQJDVP1G8QTTC.arkadiko-freddie-v1-1\",\n \"contains\": \"vault\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://localhost:3000/events\",\n \"authorization_header\": \"Bearer cn389ncoiwuencr\"\n }\n },\n \"start_block\": 10200,\n \"expire_after_occurrence\": 5\n },\n \"mainnet\": {\n \"if_this\": {\n \"scope\": \"print_event\",\n \"contract_identifier\": \"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1\",\n \"contains\": \"vault\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://localhost:3000/events\",\n \"authorization_header\": \"Bearer cn389ncoiwuencr\"\n }\n },\n \"start_block\": 10200,\n \"expire_after_occurrence\": 5\n }\n }\n}\n```\n\n<Callout>\nThe `start_block` is a required field to use the `http_post` then_that predicate.\n</Callout>\n\nNow, use the following command to scan the blocks based on the predicates defined in the `print-event-post.json` file:\n\n```terminal\n$ chainhook predicates scan print-event-post.json --mainnet\n```\n\nThe above command posts events to the URL `http://localhost:3000/events` mentioned in the `Chainhook.toml` file.\n\n## Initiate Chainhook as a service\n\n```terminal\n$ chainhook service start --predicate-path=print-event.json --config-path=Chainhook.toml\n```\n\nThis command registers the predicate and starts the Chainhook service.\n\n## Dynamically register predicates\n\nYou can also dynamically register new predicates with your Chainhook service.\n\n<Callout title=\"Requirements\" type=\"warn\"> This section requires that you have Redis running locally. To install, refer to the [Redis documentation](https://redis.io/docs/getting-started/).</Callout>\n\nFirst, ensure that the following lines in the `Chainhook.toml` file are uncommented to enable the predicate registration server:\n\n```toml title=\"Chainhook.toml\"\n[http_api]\nhttp_port = 20456\ndatabase_uri = \"redis://localhost:6379/\"\n```\n\n```terminal\n$ chainhook service start --predicate-path=print-event.json --config-path=Chainhook.toml\n```\n\nStart the Chainhook service with the following command:\n\n```terminal\n$ chainhook service start --config-path=Chainhook.toml\n```\n\nTo dynamically register a new predicate, send a POST request to the running predicate registration server at `localhost:20456/v1/chainhooks`.\n\nUse the following `curl` command template as an example:\n\n```terminal\n$ curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -d @predicate.json \\\n http://localhost:20456/v1/chainhooks\n\n{\"result\":\"<uuid>\",\"status\":200}\n```\n\n<Callout title=\"Note\">You can also run the Chainhook service by passing multiple predicates: `chainhook service start --predicate-path=predicate_1.json --predicate-path=predicate_2.json --config-path=Chainhook.toml` </Callout>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/register-chainhooks-on-devnet\"\n title=\"Register Chainhooks on devnet\"\n description=\"Learn how to register Chainhooks on devnet.\"\n />\n <Card\n href=\"/stacks/chainhook/references/scopes/stacks\"\n title=\"Stacks scopes\"\n description=\"Learn how to use scopes to scan for specific Stacks blockchain events.\"\n />\n</Cards>" + }, + { + "title": "Register Chainhooks on devnet", + "description": "Learn how to register chainhooks on devnet.", + "slug": "/stacks/chainhook/examples/register-chainhooks-on-devnet", + "content": "\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\n\nFollow these steps to register your Chainhooks on devnet using Clarinet:\n\n<Callout title=\"Requirements\" type=\"warn\">\n This feature requires Clarinet version 2.1.0 or higher. To upgrade or install, refer to our [installation](/stacks/clarinet/installation) page for Clarinet.\n</Callout>\n\n## Create your Chainhook predicates\n\nFirst, within your Clarinet project, you'll need to create your Chainhook predicate files.\n\nThese should be situated in the root of your project directory. The files can either be separate or stored within a specific folder, e.g., `/chainhooks` in your project root directory:\n\n<Files className='pointer-events-none'>\n <Folder name=\"contracts\" defaultOpen>\n <File name=\"counter.clar\" />\n </Folder>\n <Folder name=\"chainhooks\" defaultOpen className='bg-[hsl(var(--highlight))]'>\n <File name=\"increment.json\" />\n <File name=\"decrement.json\" />\n </Folder>\n <Folder name=\"settings\" />\n <Folder name=\"tests\" defaultOpen>\n <File name=\"counter.test.ts\" />\n </Folder>\n <File name=\".gitignore\" />\n <File name=\"Clarinet.toml\" />\n <File name=\"package.json\" />\n <File name=\"tsconfig.json\" />\n <File name=\"vitest.config.js\" />\n</Files>\n\nFor examples on how to define your predicates, refer to the [scopes](/stacks/chainhook/references/scopes/stacks) reference page.\n\n## Start devnet\n\nTo start devnet, run the _`clarinet devnet start`_ command from the root of your project directory. Running this command will begin a local Chainhook service in the background that automatically registers your Chainhook files within the project directory against the network.\n\n## Confirm registration\n\nOnce your devnet starts, the Chainhook service initiates the registration process. You'll know that the registration of your Chainhooks was successful by checking the confirmation message in your terminal:\n\n```terminal\n$ clarinet devnet start\n# ...\nINFO Feb 5 15:20:07.233382 2 chainhooks registered\n```\n\nIf you do not see this message at the top of your _`clarinet devnet start`_ logs, verify that you are using `clarinet` version 2.1.0 or higher.\n\n## Working with chainhooks\n\nWith these steps completed, your chainhooks are ready to trigger whenever local contract actions occur. You can monitor your network activity locally, through the _`clarinet devnet start` terminal, to confirm chainhooks execution as you further develop and test your smart contracts. When an action occurs, you should see something like this:\n\n```terminal\n$ clarinet devnet start\n# ...\nINFO Feb 5 15:21:07.233382 1 hooks triggered\n```\n\nAt this point, you can verify the payload for that action depending on whether you are expecting an _json`http_post`_ or _json`file_append`_ result from your _json`then_that`_ configuration.\n" + }, + { + "title": "Run Chainhook as a service", + "description": "Learn how to run Chainhook as a service to evaluate your \"if this, then that\" predicates against the Bitcoin and Stacks blockchains.", + "slug": "/stacks/chainhook/examples/chainhook-as-a-service", + "content": "\nIn order to build out a more robust and secure web app, you can run Chainhook as a service to stream your events continously to a server you designate.\n\nIn this guide, you will learn how to:\n\n1. [Configure an existing Bitcoin node to work with Chainhook](#configure-an-existing-bitcoin-node-to-work-with-chainhook).\n2. [Generate a Chainhook predicate to target specific transactions](#generate-a-chainhook-predicate-to-target-specific-transactions).\n3. [Scan the Bitcoin blockchain for transactions that match your predicate](#scan-the-bitcoin-blockchain-for-transactions-that-match-your-predicate).\n4. [Initiate a Chainhook service to watch for matching transactions](#initiate-a-chainhook-service-to-watch-for-matching-transactions).\n5. [Dynamically register your predicate with Chainhook](#dynamically-register-your-predicate-with-chainhook).\n\n---\n\n## Configure Chainhook\n\nIn this section, you will configure Chainhook to match the network configurations with the bitcoin config file. First, [install the latest version of Chainhook](/stacks/chainhook/installation).\n\nNext, you will generate a `Chainhook.toml` file to connect Chainhook with your bitcoind node. Navigate to the directory where you want to generate the `Chainhook.toml` file and use the following command in your terminal:\n\n```terminal\n$ chainhook config generate --mainnet\n```\n\nSeveral network parameters in the generated `Chainhook.toml` configuration file need to match those in the `bitcoin.conf` file created earlier in the [setting up a Bitcoin node](/guides/sync-a-bitcoin-node) section. Update the following parameters accordingly:\n\n1. Update `bitcoind_rpc_username` with the username set for `rpcuser` in `bitcoin.conf`.\n2. Update `bitcoind_rpc_password` with the password set for `rpcpassword` in `bitcoin.conf`.\n3. Update `bitcoind_rpc_url` with the same host and port used for `rpcport` in `bitcoin.conf`.\n\nAdditionally, if you want to receive events from the configured Bitcoin node, substitute `stacks_node_rpc_url` with `bitcoind_zmq_url`, as follows:\n\n```toml\n[storage]\nworking_dir = \"cache\"\n\n# The http API allows you to register / deregister predicates dynamically.\n# This is disabled by default.\n\n# [http_api]\n# http_port = 20456\n# database_uri = \"redis://localhost:6379/\"\n\n[network]\nmode = \"mainnet\"\nbitcoind_rpc_url = \"http://localhost:8332\"\nbitcoind_rpc_username = \"devnet\"\nbitcoind_rpc_password = \"devnet\"\n# Bitcoin block events can be received by Chainhook\n# either through a Bitcoin node's ZeroMQ interface,\n# or through the Stacks node. The Stacks node is\n# used by default:\n# stacks_node_rpc_url = \"http://localhost:20443\"\n# but zmq can be used instead:\nbitcoind_zmq_url = \"tcp://0.0.0.0:18543\"\n\n[limits]\nmax_number_of_bitcoin_predicates = 100\nmax_number_of_concurrent_bitcoin_scans = 100\nmax_number_of_stacks_predicates = 10\nmax_number_of_concurrent_stacks_scans = 10\nmax_number_of_processing_threads = 16\nmax_number_of_networking_threads = 16\nmax_caching_memory_size_mb = 32000\n\n[[event_source]]\ntsv_file_url = \"https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest\"\n```\n\nHere is a table of the relevant parameters this guide changes in our configuration files.\n\n| bitcoin.conf | Chainhook.toml |\n| :--------------- | :--------------------- |\n| rpcuser | bitcoind_rpc_username |\n| rpcpassword | bitcoind_rpc_password |\n| rpcport | bitcoind_rpc_url |\n| zmqpubhashblock | bitcoind_zmq_url |\n\n## Scan the blockchain based on predicates\n\nNow that your `bitcoind` and Chainhook configurations are complete, you can define the Chainhook [Bitcoin predicate scope](/stacks/chainhook/references/scopes/bitcoin) you would like to scan for.\n\nThese predicates are where you specify the `if_this / then_that` pattern to trigger Chainhook to deliver a result (either a file appendation or an HTTP POST request).\n\n## Appending events to a file\n\nTo generate a sample JSON file with predicates, execute the following command in your terminal:\n\n```terminal\n$ chainhook predicates new stacking-pool.json --bitcoin\n```\n\nReplace the contents of the `stacking-pool.json` file with the following:\n\n```json\n{\n \"chain\": \"bitcoin\",\n \"uuid\": \"1\",\n \"name\": \"Stacking Pool\",\n \"version\": 1,\n \"networks\": {\n \"mainnet\": {\n \"start_block\": 801500,\n \"end_block\": 802000,\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2wpkh\": {\n \"equals\": \"bc1qs0kkdpsrzh3ngqgth7mkavlwlzr7lms2zv3wxe\"\n }\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"bitcoin-transactions.txt\"\n }\n }\n }\n }\n}\n```\n\nThis example demonstrates scanning a portion of the Bitcoin blockchain to capture specific outputs from a Bitcoin address associated with a Stacking pool, in this case [Friedgar Pool](https://pool.friedger.de/). Notice the `then_that` predicate specifying a `file_append`.\n\n<Callout title=\"Note\">\nYou can get blockchain height and current block by referring to the [Stacks Explorer](https://explorer.hiro.so/blocks?chain=mainnet).\n</Callout>\n\nNow, use the following command to scan the blocks based on the predicates defined in the `stacking-pool.json` file.\n\n```terminal\n$ chainhook predicates scan stacking-pool.json --config-path=./Chainhook.toml\n```\n\nThe output of the above command will be a text file `bitcoin-transactions.txt` generated based on the predicate definition.\n\n## Sending events to an API endpoint\n\nNow you will generate another sample predicate, but this time you will send the payload to an API endpoint:\n\n```terminal\n$ chainhook predicates new stacking-pool-api.json --bitcoin\n```\n\nReplace the contents of the `stacking-pool-api.json` file with the following:\n\n```json\n{\n \"chain\": \"bitcoin\",\n \"uuid\": \"2\",\n \"name\": \"Stacking Pool (API)\",\n \"version\": 1,\n \"networks\": {\n \"mainnet\": {\n \"start_block\": 801500,\n \"if_this\": {\n \"scope\": \"outputs\",\n \"p2wpkh\": {\n \"equals\": \"bc1qs0kkdpsrzh3ngqgth7mkavlwlzr7lms2zv3wxe\"\n }\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://localhost:3000/events\",\n \"authorization_header\": \"12345\"\n }\n }\n }\n }\n}\n```\n\n<Callout title=\"Note\">\nThe `start_block` is a required field when using the `http_post` `then_that` predicate.\n</Callout>\n\nOnce you are finished setting up your endpoint, use the following command to scan the blocks based on the predicates defined in the `stacking-pool-api.json` file.\n\n```terminal\n$ chainhook predicates scan stacking-pool-api.json --config-path=./Chainhook.toml\n```\n\nThe above command posts events to the URL `http://localhost:3000/events`, mentioned in the JSON file.\n\n## Initiate Chainhook service\n\nIn the examples above, your Chainhook scanned historical blockchain data against predicates and delivered results. In this next section, you will learn how to set up a Chainhook that acts as an ongoing observer and event-streaming service.\n\nYou can start a Chainhook service with an existing predicate. You can also dynamically register new predicates by making an API call to your chainhook. In both of these instances, your predicates will be delivering their results to a server set up to receive results.\n\nInitiate the chainhook service by passing the predicate path to the command as shown below:\n\n```terminal\n$ chainhook service start --predicate-path=stacking-pool-api.json --config-path=Chainhook.toml\n```\n\nThe above command registers the predicate based on the predicate definition in the `stacking-pool-api.json` file.\n\n## Dynamically register predicates\n\nYou can also dynamically register new predicates with your Chainhook service. This means you can start a long-running process that exposes HTTP endpoints to register, deregister, and report on new predicates.\n\n<Callout title=\"Requirements\" type=\"warn\">\nThis section requires that you have Redis running locally. To install, refer to the [Redis documentation](https://redis.io/docs/getting-started/).\n</Callout>\n\nFirst, ensure that the following lines of code are uncommented in the `Chainhook.toml` file to enable the predicate registration server:\n\n```toml\n[http_api]\nhttp_port = 20456\ndatabase_uri = \"redis://localhost:6379/\"\n```\n\nIf you have an instance of Redis running locally, you can now start the Chainhook service by running the following command:\n\n```terminal\n$ chainhook service start --config-path=Chainhook.toml\n```\n\nTo dynamically register a new predicate, send a POST request to the running predicate registration server at `localhost:20456/v1/chainhooks`.\n\nUse the following `curl` command template as an example:\n\n```terminal\n$ curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -d @predicate.json \\\n http://localhost:20456/v1/chainhooks\n\n{\"result\":\"<uuid>\",\"status\":200}\n```\n\n<Callout title=\"Note\">\nYou can also run chainhook service by passing multiple predicates, ie `chainhook service start --predicate-path=predicate_1.json --predicate-path=predicate_2.json --config-path=Chainhook.toml`\n</Callout>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/register-chainhooks-on-devnet\"\n title=\"Register Chainhooks on devnet\"\n description=\"Learn how to register Chainhooks on devnet.\"\n />\n <Card\n href=\"/stacks/chainhook/references/scopes/bitcoin\"\n title=\"Bitcoin scopes\"\n description=\"Learn how to use scopes to scan for specific Bitcoin blockchain events.\"\n />\n</Cards>" + }, + { + "title": "Observing contract calls with Chainhook", + "description": "Learn how to use Chainhook to observe a function call for a voting contract.", + "slug": "/stacks/chainhook/examples/observing-contract-calls", + "content": "\nimport { Step, Steps } from \"fumadocs-ui/components/steps\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\nThe _json`contract_call`_ predicate scope is designed to target direct function calls within a smart contract. When triggered, Chainhook will return a payload with transaction data detailing the on-chain events contained in these functions.\n\nIn this guide, you will learn how to:\n\n1. [Build a predicate to target the `cast-vote` function](#creating-the-predicate).\n2. [Scan the Stacks blockchain using your predicate](#running-the-predicate).\n3. [Use a Clarity function to return specific contract data](#return-contract-data-with-the-clarity-function).\n4. [Find data related to the contract call within the Chainhook payload](#chainhook-payload).\n\n<Callout type=\"warn\" title=\"Requirements\">\n To follow this guide, make sure you have installed Chainhook [directly](/stacks/chainhook/installation).\n</Callout>\n\n<Steps>\n<Step>\n\n## Create the predicate\n\nThe `predicate` is your main interface for querying the Chainhook data indexer. Chainhook uses this predicate to select the appropriate blockchain, network, and scope for monitoring transactions.\n\nFor the Stacks blockchain, run the following command to generate a `predicate` template:\n\n```terminal\n$ chainhook predicates new contract-call-chainhook.json --stacks\n```\n\n<Callout title=\"Note\">\n Alternatively, [Hiro Platform](https://platform.hiro.so/) has an excellent UI to help you to create a `predicate` using a form builder or upload a json file containing your `predicate`.\n</Callout>\n\nThere are 3 main components to your `predicate` that you need to address:\n\n1. Targeting the appropriate blockchain and network\n2. Defining the scope and targeting the function you want to observe\n3. Defining the payload destination\n\nTo begin, you need to configure the `predicate` to target the voting contract:\n\n- Specify `testnet` in the network object.\n- Set the `start_block` property to <TooltipProvider inline><Tooltip><TooltipTrigger asChild><span className='cursor-default border-dotted border-b border-primary'>21443</span></TooltipTrigger><TooltipContent>This value represents the block height that our voting contract was deployed at.</TooltipContent></Tooltip></TooltipProvider>.\n\n```json contract-call-chainhook.json\n{\n \"chain\": \"stacks\",\n \"uuid\": \"1\",\n \"name\": \"Contract-Call-Chainhook\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"start_block\": 21443,\n \"decode_clarity_values\": true,\n \"expire_after_occurrence\": 1,\n // ...\n }\n }\n}\n```\n\nNext, define the scope of the `predicate` within the `if_this` specification.\n\nThe `contract_call` scope allows Chainhook to observe blockchain data when the specified function is directly called from its contract.\n\n```json contract-call-chainhook.json\n{\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n }\n}\n```\n\n<Callout type=\"warn\" title=\"Warning\">\n The function defined in the `method` property of your `predicate` must be directly called in order for Chainhook to observe events. Calling the function from another contract or from within a different function on the same contract will not generate a `payload`. Below is an example of a `cast-vote` function that would not trigger an event.\n ```clarity\n (define-public (call-cast-vote)\n (cast-vote)\n )\n ```\n</Callout>\n\nFinally, define how Chainhook delivers the payload when it is triggered by your `predicate` using the `then_that` specification. \n\nUsing `file_append`, specify the path where Chainhook will post the payload data.\n\n```json contract-call-chainhook.json\n{\n \"then_that\": {\n \"file_append\": {\n \"path\": \"/tmp/events.json\"\n }\n }\n}\n```\n\n<Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"full-predicate\">\n <AccordionTrigger>Full predicate file</AccordionTrigger>\n <AccordionContent>\n ```json\n {\n \"chain\": \"stacks\",\n \"uuid\": \"1\",\n \"name\": \"Contract-Call-Chainhook\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"start_block\": 21443,\n \"decode_clarity_values\": true,\n \"expire_after_occurrence\": 1,\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"/tmp/events.json\"\n }\n }\n }\n }\n }\n ```\n </AccordionContent>\n </AccordionItem>\n</Accordion>\n\n<Callout title=\"Note\">\n\n For more details on optional configurations, other predicate elements and scopes, check out the [Predicate Design](/stacks/chainhook/concepts/predicate-design) and [Stacks scopes](/stacks/chainhook/references/scopes/stacks) pages.\n\n</Callout>\n\n</Step>\n<Step>\n\n## Scan the predicate\n\nWith your `predicate` set up, you can now scan for blocks that match the `contract_call` scope and analyze the returned payload.\n\nChainhook will track events where this function is directly invoked and deliver detailed transaction data at the block level, based on your configuration.\n\nTo scan the Stacks blockchain using your predicate, run the following command, replacing `/path/to/contract-call-chainhook.json` with the actual path to your `contract-call-chainhook.json` file:\n\n```terminal\n$ chainhook predicates scan /path/to/contract-call-chainhook.json --testnet\n```\n\n<Callout title=\"Note\">\n If you are using Platform, creating your Chainhook will automatically begin the scan for you.\n</Callout>\n\n</Step>\n<Step>\n\n## Return contract data with the Clarity function\n\nThe _clarity`cast-vote`_ function records a vote by storing the address that calls it. It also logs relevant data using the _clarity`print`_ function, which can be useful for when you want to track additional on-chain events that are not part of the built-in Clarity functions.\n\nWhen you examine the `payload`, this is the data you will look for.\n\n```clarity simple-vote-v0.clar\n(define-public (cast-vote)\n (begin\n ;; Check if the voter has already voted.\n (asserts! (is-none (map-get? UserVotes tx-sender)) (err ERR_ALREADY_VOTED))\n\n ;; Update the map that the vote has been cast. Print vote related data.\n (map-set UserVotes tx-sender { hasVoted: true })\n (var-set VoteCount (+ (var-get VoteCount) u1))\n (print\n {\n notification: \"cast-vote\",\n payload: {\n status: \"Has voted set to true\",\n voter: tx-sender,\n totalVotes: (get-total-votes)\n }\n }\n )\n (ok \"Vote cast successfully\")\n )\n)\n```\n\n<Callout title=\"Note\">\n This contract has been deployed to the Stacks [testnet network](https://explorer.hiro.so/txid/0x312a3c559af0f75381a9eb4540912c310d74682ed3036207ec890ad8cd1aebe6?chain=testnet) under the name `STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0`.\n</Callout>\n\n</Step>\n<Step>\n\n## Dive deeper into the Chainhook payload\n\nWhen triggered by your predicate, the `payload` returned by Chainhook is a standarized, block level observation in json format.\n\nWithin the `apply` arrays element, the `block_identifer` object gives us the `index` for the observed block height.\n\n```json contract-call-payload.json\n\"block_identifier\": {\n \"hash\": \"0x4d88015a6df9ec4f6df875941d87337ce64f8d51608563f80b6e27adeb327e4d\",\n \"index\": 21544\n}\n```\n\n<Callout type=\"warn\" title=\"Warning\">\n The hash returned in the `block_identifer` object is not that block hash you\n would see in [Stacks Explorer](https://explorer.hiro.so/?chain=testnet), but\n `index_block_hash` returned from the Stacks API's [get\n block](/stacks/api/blocks/get-block) endpoint. You can use the `apply` array's\n metadata object to get the `stacks_block_hash`.\n</Callout>\n\nWe can retrieve the `stacks_block_hash` by navigating to the `apply` arrays object `metadata` element. This hash will match the block hash display in the Stacks Explorer.\n\n```json contract-call-payload.json\n\"apply\": [\n {\n \"metadata\": {\n \"stacks_block_hash\": \"0x4ad36f77ff76042f3b7355006556375970b0f99d1232b14a3b4a2eadda4a806a\"\n }\n }\n]\n```\n\nThere is also a `timestamp` value returned in the `apply` array. This UNIX time stamp represents the initiation of the Stacks block.\n\n```json contract-call-payload.json\n\"timestamp\": 1722208524\n```\n\n<Callout type=\"warn\" title=\"Warning\">\n The timestamp returned in this object is not the finalized block time you\n would see in the [Stacks Explorer](https://explorer.hiro.so/?chain=testnet), but\n `block_time` returned from the Stacks API's [get\n block](/stacks/api/blocks/get-block) endpoint.\n</Callout>\n\n### Transaction object\n\nBecause Chainhook is triggered on the block level, we will receive a single response that contains data specific to each `transaction` that matches your predicate's `contract_call` scope.\n\nTo find this data, we start with the `apply` array element of the `payload` object. The single object that makes up the `apply` array contains a child element, the `transactions` array. Every `transaction` will be represents by a single object within this array. This `transaction` object contains its own children elements which can be seen in the example below.\n\n```json\n{\n \"apply\": [\n {\n \"transactions\": [\n {\n \"transaction_identifier\": { ... },\n \"metdata\": { ... },\n \"operations\": [],\n }\n ],\n }\n ],\n \"rollback\": [ ... ],\n \"chainhook\": { ... }\n}\n```\n\nOnce the `transaction` object is returned, we can begin examining the important data elements this object contains. The first element, `transaction_identifier`, includes a hash value that uniquely identifies your transaction.\n\n```json contract-call-payload.json\n\"transaction_identifier\": {\n \"hash\": \"0x98195af8f888d2f9ca3462c41c1691e7798ea6d9e5e3afe42955c0921f981f2c\"\n}\n```\n\nNext, focus on the `metadata` object within your `contract_call` data. It's crucial to determine the success state of your transaction. Chainhook captures and reports on transactions regardless of their outcome.\n\nUtilize the `success` object to assess transaction success and extract the `sender` of the transaction and the `result` returned by the contract.\n\n```json contract-call-payload.json\n\"metadata\": {\n \"success\": true,\n \"sender\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV\",\n \"result\": \"(ok \\\"Vote cast successfully\\\")\"\n}\n```\n\nMoving forward, examine the `kind` object and its components within your `contract_call`. The data object contains crucial information:\n\n- `contract_identifier` specifies the contract your function resides in\n- `method` identifies the function called\n- `args` lists the arguments passed when invoking this function\n\nIn this case, the `cast-vote` function accepts no arguments, resulting in an empty `args` array.\n\n```json contract-call-payload.json\n{\n \"metadata\":\n \"kind\": {\n \"data\": {\n \"args\": [],\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n }\n }\n}\n```\n\nIn the `metadata` object's `receipt`, the `events` array holds the key data for your `contract_call`.\n\nSince the `cast-vote` function uses a `print` statement, the events array will contain `topic` and `value` keys representing the data output.\n\n```json contract-call-payload.json\n{\n \"metadata\":\n \"receipt\": {\n \"contract_calls_stack\": [],\n \"events\": [\n {\n \"data\": {\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"topic\": \"print\",\n \"value\": {\n \"notification\": \"cast-vote\",\n \"payload\": {\n \"status\": \"Has voted set to true\",\n \"totalVotes\": 1,\n \"voter\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV\"\n }\n }\n },\n \"position\": {\n \"index\": 0\n },\n \"type\": \"SmartContractEvent\"\n }\n ],\n \"mutated_assets_radius\": [],\n \"mutated_contracts_radius\": [\n \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\"\n ]\n }\n}\n```\n\n<Callout type=\"info\">\n You can view the full [contract-call-payload.json](/contract-call-payload.json) here.\n</Callout>\n\n</Step>\n</Steps>\n\n---\n\nNow that you've located the relevant data in the payload, you can start to extract the relevant information into your API.\n\nThe following is an example of how you might store your information in a database table:\n\n| Block Height | Timestamp | Transaction Identifier | Success | Sender | Result | Args | Contract Identifier | Function | Value |\n| ------------ | ---------- | ------------------------------------------------------------------ | ------- | ---------------------------------------- | ----------------------------- | ---- | ------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 21544 | 1722208524 | 0x98195af8f888d2f9ca3462c41c1691e7798ea6d9e5e3afe42955c0921f981f2c | True | STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV | (ok \"Vote cast successfully\") | [] | STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0 | cast-vote | \\{\"notification\": \"cast-vote\", \"payload\": \\{\"status\": \"Has voted set to true\", \"totalVotes\": 1, \"voter\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV\"\\}\\} |\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/platform/guides/create-chainhooks\"\n title=\"Create a Chainhook\"\n description=\"Learn how to create a Chainhook using the Hiro Platform.\"\n />\n <Card\n href=\"/stacks/chainhook/references/scopes/stacks\"\n title=\"Stacks scopes\"\n description=\"Learn how to use additional scopes to scan for specific Stacks blockchain events.\"\n />\n</Cards>\n" + }, + { + "title": "Quickstart", + "description": "Learn how to scan the Stacks blockchain for STX transactions.", + "slug": "/stacks/chainhook/quickstart", + "content": "\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\"\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\n\nIn this quickstart guide, you will set up `Chainhook` to generate and scan predicates on the Stacks blockchain. You will learn how to generate predicates and run basic commands using the CLI to scan and inspect blockchain events.\n\nCheck out the [run Chainhook as a service](/stacks/chainhook/guides/chainhook-as-a-service) for a more advanced use case.\n\n<Steps>\n <Step>\n ## Generate a predicate file\n \n To generate a predicate file, use the `predicates new` command. This command generates a template that you can use to help set up your own predicate.\n\n ```terminal\n $ chainhook predicates new stx-transfer.json --stacks \n ```\n\n <Callout title=\"Note\">\n The `--stacks` flag is required and allows you to specify the network to scan. Other options include `--bitcoin`.\n </Callout>\n </Step>\n <Step>\n ## Track the latest stx_event for a given address\n \n The generated file contains helpful boilerplate configuration, but you still need to make some edits to tell it to track specific Stacks-related transactions.\n\n To do this, update your `if_this` construct in your `stx-transfer.json` file.\n\n ```json title=\"stx-transfer.json\"\n {\n \"if_this\": {\n \"scope\": \"stx_event\",\n \"actions\": [\"transfer\"]\n }\n }\n ```\n\n <Accordions>\n <Accordion title=\"Full code example\">\n ```json\n {\n \"chain\": \"stacks\",\n \"uuid\": \"87ac9bff-1052-4d02-9c79-3768a6f08a09\",\n \"name\": \"STX Transfer\",\n \"version\": 1,\n \"networks\": {\n \"mainnet\": {\n \"start_block\": 154670,\n \"if_this\": {\n \"scope\": \"stx_event\",\n \"contract_identifier\": \"SPM113AY78VCMJJ0SDFJ4XJXFHHQ6R9KB3710X7D\",\n \"actions\": [\"transfer\"]\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"stx-transfers.txt\"\n }\n }\n }\n }\n }\n ```\n </Accordion>\n </Accordions>\n \n <Callout title=\"Note\">\n Other available `actions` include `mint`, `burn`, and `lock`. For more information on these actions, check out the [predicates](/stacks/chainhook/concepts/stacks-predicates) section.\n </Callout>\n </Step>\n <Step>\n ## Scanning for events\n \n With your updated predicate file, you can now use the `predicate scan` command to scan for `stx_event` transactions.\n\n ```terminal\n $ chainhook predicates scan /path/to/stx-transfer.json --mainnet\n ```\n\n <Callout title=\"Note\">\n When running `scan` for the first time, a chainstate archive will be downloaded. The subsequent scans will use the cached chainstate if already present, speeding up iterations and the overall feedback loop. For more information on the Hiro Archive, click [here](/stacks/archive).\n </Callout>\n </Step>\n</Steps>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/chainhook-as-a-service\"\n title=\"Run Chainhook as a service\"\n description=\"Learn how to run Chainhook as a service.\"\n />\n <Card\n href=\"/bitcoin/indexer\"\n title=\"Run the Bitcoin Indexer\"\n description=\"Learn how to run the Bitcoin Indexer.\"\n />\n <Card\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Learn how to sync a Stacks node for running a local devnet.\"\n />\n</Cards>" + }, + { + "title": "Predicate design", + "description": "Predicates are the building blocks of Chainhook.", + "slug": "/stacks/chainhook/predicate-design", + "content": "\nThe core design of Chainhook revolves around the concept of predicates. Each individual chainhook has a customizable predicate that specifies what Bitcoin or Stacks blockchain data you are scanning for.\n\n<Callout type=\"warn\" title=\"Requirements\">\n Commands outlined here will require that you have [installed Chainhook directly](/stacks/chainhook/installation) first.\n</Callout>\n\n## Predicate design\nBelow is the general strucure of the `predicate` JSON with its primary elements. These elements and their values are required. \n\n- Chainhook will evaluate the predicate against the specfied blockchain specified in `chain`.\n- The `uuid` will be returned in the Chainhook payload, providing a record of the predicate that triggers it.\n- Identify your predicate for your app using `name` and `version`.\n\n```json\n {\n \"chain\": \"stacks\",\n \"uuid\": \"1\",\n \"name\": \"STX_Transfer_Predicate\",\n \"version\": 1,\n \"networks\": {\n // Other configurations\n }\n }\n ```\n\n<Callout type=\"info\" title=\"Note\">\n You can use the following command to verify your predicate:\n ```\n chainhook predicate check your-predicate-file.json --mainnet\n ```\n</Callout>\n\n## Networks\n\nThe `networks` element contains an object who's key determines the blockchain network you want Chainhook to scan. \n- This object's value will contain the `if_this` and then `then_that` specifications.\n- Multple networks can be specified in the `networks` element.\n\n```json\n \"networks\": {\n \"mainnet\": {\n // if_this and then_that specifications\n // Other configurations\n },\n \"testnet\": {\n // if_this and then_that specifications\n // Other configurations\n },\n }\n```\n\n<Callout type=\"info\" title=\"Note\">\n For additional information, check out the [Bitcoin scopes](/stacks/chainhook/references/scopes/bitcoin) and [Stacks scopes](/stacks/chainhook/references/scopes/stacks) references pages.\n</Callout>\n\n## if_this specification\n\nThe `predicate` identifies what data you want Chainhook to scan for using the `scope` define within the `if_this` specification. Additional arguments specific to the `scope` will also be passed here.\n\n```json\n {\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n }\n }\n```\n\n## then_that specification\n\nChainhook delivers the payload when it is triggered by your `predicate` using the `then_that` specification. There are 2 options available:\n\n1. `file_append`\n2. `http_post`\n\nWhen choosing to use file_append, specify the path where Chainhook will post the payload data.\n\n```json \n{\n \"then_that\": {\n \"file_append\": { \n \"path\": \"/tmp/events.json\"\n }\n }\n}\n```\n\nWhen using `http_post`, specify the endpoint's `url` and `authorization_header`.\n\n```json\n{\n \"then_that\": {\n \"http_post\": {\n \"url\": \"https://webhook.site/abc123456-789e-0fgh-1ijk-23lmno456789\",\n \"authorization_header\": \"12345\"\n }\n }\n}\n```\n\n<Callout title=\"Note\">\n Chainhook requires `https` to post to your endpoint. You can use a service like [LocalTunnel](https://github.com/localtunnel/localtunnel) to test locally or a site like [WebhookSite](https://webhook.site).\n</Callout>\n\n## Blockchain specific configurations\n\n<Tabs defaultValue=\"bitcoin\">\n <TabsList>\n <TabsTrigger value=\"bitcoin\">Bitcoin predicate</TabsTrigger>\n <TabsTrigger value=\"stacks\">Stacks predicate</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"bitcoin\">\n ```json\n {\n \"chain\": \"bitcoin\",\n \"uuid\": \"1\",\n \"name\": \"Wrap BTC\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"if_this\": {\n \"scope\": \"ordinals_protocol\",\n \"operation\": \"inscription_feed\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://localhost:3000/api/v1/ordinals\",\n \"authorization_header\": \"Bearer cn389ncoiwuencr\"\n }\n },\n \"start_block\": 10200\n // Additional configurations\n },\n \"mainnet\": {\n \"if_this\": {\n \"scope\": \"ordinals_protocol\",\n \"operation\": \"inscription_feed\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://my-protocol.xyz/api/v1/ordinals\",\n \"authorization_header\": \"Bearer cn389ncoiwuencr\"\n }\n },\n \"start_block\": 90232\n // Additional configurations\n }\n }\n }\n ```\n\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"start-block\">\n <AccordionTrigger>Ignore blocks before start block</AccordionTrigger>\n <AccordionContent>\n ```json\n \"start_block\": 101\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"end-block\">\n <AccordionTrigger>Ignore blocks after end block</AccordionTrigger>\n <AccordionContent>\n ```json\n \"end_block\": 201\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"expire\">\n <AccordionTrigger>Stop after number of occurrences</AccordionTrigger>\n <AccordionContent>\n ```json\n \"expire_after_occurrence\": 1\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"proofs\">\n <AccordionTrigger>Exclude proofs from payload</AccordionTrigger>\n <AccordionContent>\n ```json\n \"include_proof\": false\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"inputs\">\n <AccordionTrigger>Exclude transaction inputs from payload</AccordionTrigger>\n <AccordionContent>\n ```json\n \"include_inputs\": false\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"outputs\">\n <AccordionTrigger>Exclude transaction outputs from payload</AccordionTrigger>\n <AccordionContent>\n ```json\n \"include_outputs\": false\n ```\n </AccordionContent>\n </AccordionItem>\n <AccordionItem value=\"witness\">\n <AccordionTrigger>Exclude transaction witnesses from payload</AccordionTrigger>\n <AccordionContent>\n ```json\n \"include_witness\": false\n ```\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n <Callout type=\"info\" title=\"Note\">\n The following command allows you to generate a predicate template for the Bitcoin blockchain.\n ```\n chainhook predicates new your-bitcoin-predicate.json --bitcoin\n ```\n </Callout>\n\n </TabsContent>\n\n <TabsContent value=\"stacks\">\n ```json\n {\n \"chain\": \"stacks\",\n \"uuid\": \"1\",\n \"name\": \"Contract-Call-Chainhook\",\n \"version\": 1,\n \"networks\": {\n \"testnet\": {\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n },\n \"then_that\": {\n \"file_append\": {\n \"path\": \"/tmp/events.json\"\n }\n },\n \"start_block\": 21443\n // Additional configurations\n },\n \"mainnet\": {\n \"if_this\": {\n \"scope\": \"contract_call\",\n \"contract_identifier\": \"STJ81C2WPQHFB6XTG518JKPABWM639R2X37VFKJV.simple-vote-v0\",\n \"method\": \"cast-vote\"\n },\n \"then_that\": {\n \"http_post\": {\n \"url\": \"http://my-protocol.xyz/api/v1/ordinals\",\n \"authorization_header\": \"Bearer cn389ncoiwuencr\"\n }\n },\n \"start_block\": 142221\n // Additional configurations\n }\n }\n }\n ```\n\n <Accordion type=\"single\" collapsible className=\"w-full\">\n <AccordionItem value=\"item-1\">\n <AccordionTrigger>Additional Stacks predicate configurations</AccordionTrigger>\n <AccordionContent>\n <p>These additional configurations can be used to improve the performance of Chainhook by preventing a full scan of the blockchain:</p>\n\n <p>Ignore any block before the given block:</p>\n\n ```json\n \"start_block\": 101\n ```\n\n <p>Ignore any block after the given block:</p>\n \n ```json\n \"end_block\": 201\n ```\n\n <p>Stop evaluating chainhook after a given number of occurrences found:</p>\n\n ```json\n \"expire_after_occurrence\": 1\n ```\n\n <p>Include decoded Clarity values in the payload:</p>\n\n ```json\n \"decode_clarity_values\": true\n ```\n\n <p>Include the contract ABI for transactions that deploy contracts:</p>\n\n ```json\n \"include_contract_abi\": true\n ```\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n <Callout type=\"info\" title=\"Note\">\n The following command allows you to generate a predicate template for the Stacks blockchain.\n ```\n chainhook predicates new your-stacks-predicate.json --stacks\n ```\n </Callout>\n\n </TabsContent>\n</Tabs>\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/observing-contract-calls\"\n title=\"Observing contract calls\"\n description=\"Learn use a predicate to observe Stacks contracts calls with Chainhook.\"\n />\n <Card\n href=\"/stacks/platform/guides/create-chainhooks\"\n title=\"Create a chainhook\"\n description=\"Learn how to create a chainhook using the Hiro Platform.\"\n />\n <Card\n href=\"/stacks/chainhook/references/scopes/stacks\"\n title=\"Stacks scopes\"\n description=\"Learn how to use additional scopes to scan for specific Stacks blockchain events.\"\n />\n <Card\n href=\"/stacks/chainhook/references/scopes/bitcoin\"\n title=\"Bitcoin scopes\"\n description=\"Learn how to use additional scopes to scan for specific Bitcoin blockchain events.\"\n />\n</Cards>\n\n" + }, + { + "title": "Installation", + "description": "Chainhook is a CLI tool that allows you to create event streams for your Stacks and Bitcoin nodes.", + "slug": "/stacks/chainhook/installation", + "content": "\n<Tabs defaultValue=\"macos\">\n <TabsList>\n <TabsTrigger value=\"macos\">macOS</TabsTrigger>\n <TabsTrigger value=\"linux\">Linux</TabsTrigger>\n <TabsTrigger value=\"windows\">Windows</TabsTrigger>\n <TabsTrigger value=\"cargo\">Using Cargo</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"macos\">\n ```terminal\n $ brew install chainhook\n ```\n </TabsContent>\n\n <TabsContent value=\"linux\">\n ```terminal\n $ sudo snap install chainhook\n ```\n </TabsContent>\n\n <TabsContent value=\"windows\">\n ```terminal\n $ winget install HiroSystems.Chainhook\n ```\n </TabsContent>\n\n <TabsContent value=\"cargo\">\n Clone the [Chainhook Repo](https://github.com/hirosystems/chainhook):\n\n ```terminal\n $ git clone https://github.com/hirosystems/chainhook.git\n ```\n\n Navigate to the root directory and run `cargo chainhook-install`:\n\n ```terminal\n $ cd chainhook && cargo chainhook-install\n ```\n </TabsContent>\n</Tabs>" + }, + { + "title": "Quickstarts", + "description": "The following guides cover ways to use Hiro tools to build apps on Stacks.", + "slug": "/stacks/quickstarts/index", + "content": "\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/quickstart\"\n title=\"Create your first smart contract\"\n description=\"Build a simple counter contract using Clarinet.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Blockchain />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write unit tests for your smart contracts\"\n description=\"Learn how run unit tests with Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/stacks.js/quickstart\"\n title=\"Make a contract call with Stacks.js\"\n description=\"Learn how to integrate smart contracts into your app.\"\n tag='Stacks.js'\n />\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n" + }, + { + "title": "Event streaming", + "description": "Stream events.", + "slug": "/stacks/quickstarts/event-streaming", + "content": "\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```" + }, + { + "title": "Wallet integration", + "description": "Integrate with a wallet.", + "slug": "/stacks/quickstarts/wallet-integration", + "content": "\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```" + }, + { + "title": "App templates", + "description": "Build your app with a template.", + "slug": "/stacks/quickstarts/app-templates", + "content": "\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```" + }, + { + "title": "NFT minting", + "description": "Mint an NFT.", + "slug": "/stacks/quickstarts/nft-minting", + "content": "\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```" + }, + { + "title": "Contract templates", + "description": "Build your contract with a template.", + "slug": "/stacks/quickstarts/contract-templates", + "content": "\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```" + }, + { + "title": "Token transfers", + "description": "Transfer tokens.", + "slug": "/stacks/quickstarts/token-transfers", + "content": "\nimport { Accordion, Accordions } from \"fumadocs-ui/components/accordion\";\nimport { Blocks, Braces, CircleUserRound } from 'lucide-react';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nThe `@stacks/blockchain-api-client` library provides a robust interface for interacting with the Stacks Blockchain API by offering type-safe methods to access REST and WebSocket endpoints.\n\nThe client includes automatically generated HTTP API methods, comprehensive Schemas for Clarity smart contract values, and a WebSocket client for real-time data streaming.\n\n```ts\nimport { AccountsApi } from '@stacks/blockchain-api-client';\n\nconst accounts = new AccountsApi(apiConfig);\n\nawait accounts.getAccountTransactions({\n principal: 'ST000000000000000000002AMW42H',\n});\n```" + }, + { + "title": "Blocks", + "description": "Get block proposal information.", + "slug": "/stacks/rpc-api/blocks/index", + "content": "" + }, + { + "title": "Validate proposed block", + "description": "Validate a proposed Stacks block.", + "slug": "/stacks/rpc-api/blocks/block-proposal", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/block_proposal', method: 'post' }]}\n hasHead={false}\n/>" + }, + { + "title": "Proof of Transfer", + "description": "Retrieves Proof-of-Transfer (PoX) information.", + "slug": "/stacks/rpc-api/pox/index", + "content": "" + }, + { + "title": "Get stacker and signer set information", + "description": "Retrieves stacker and signer set information for a given cycle.", + "slug": "/stacks/rpc-api/pox/stacker-set", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/stacker_set/{cycle_number}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get Proof-of-Transfer details", + "description": "Retrieves Proof-of-Transfer (PoX) information.", + "slug": "/stacks/rpc-api/pox/pox-details", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/pox', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get namespace price", + "description": "Retrieves the price of a namespace.", + "slug": "/stacks/rpc-api/names/namespace-price", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/prices/namespaces/{tld}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Names", + "description": "Manages and retrieve information on blockchain namespaces, names, and related details.", + "slug": "/stacks/rpc-api/names/index", + "content": "" + }, + { + "title": "Get name price", + "description": "Retrieves the price of a name.", + "slug": "/stacks/rpc-api/names/name-price", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/prices/names/{name}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get approximate fees for the given transaction", + "description": "Get an estimated fee for the supplied transaction.", + "slug": "/stacks/rpc-api/fees/estimate", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/fees/transaction', method: 'post' }]}\n hasHead={false}\n/>" + }, + { + "title": "Fees", + "description": "Provide estimates, rates, and approximate calculations for transaction costs.", + "slug": "/stacks/rpc-api/fees/index", + "content": "" + }, + { + "title": "Get transfer fee estimate", + "description": "Retrieves an estimated fee rate for STX transfer transactions.", + "slug": "/stacks/rpc-api/fees/transfer-estimate", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/fees/transfer', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Overview", + "description": "Query the Stacks Node RPC API, interact with smart contracts, and broadcast transactions all via a familiar REST interface.", + "slug": "/stacks/rpc-api/index", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nThe Stacks Node RPC API allows you to query the Stacks blockchain and interact with smart contracts. Note: this is not a Hiro-maintained service. This RPC API is generated by every Stacks node and allows you to self-host your own node and API. This is a minimalist configuration. For a richer data set and an API that is easier to use, try [Hiro's Stacks Blockchain API](/stacks/api).\n\n## Popular endpoints\n\n<Cards>\n <SecondaryCard\n href=\"/stacks/rpc-api/transactions/broadcast-transaction\"\n title=\"Broadcast transaction\"\n description=\"Broadcast a transaction to the Stacks network.\"\n />\n <SecondaryCard\n href=\"/stacks/rpc-api/smart-contracts/read-only\"\n title=\"Call smart contracts\"\n description=\"Call a read-only public function on a smart contract.\"\n />\n <SecondaryCard\n href=\"/stacks/rpc-api/pox/pox-details\"\n title=\"Retrieve PoX protocol details\"\n description=\"Get Proof of Transfer (PoX) details, including cycles and stacking thresholds.\"\n />\n \n</Cards>\n\n## Related tools\n\n- **[Stacks Blockchain API](/stacks/api)**: Fetch richer data from Hiro's Stacks Blockchain API.\n- **[Token Metadata API](/stacks/token-metadata-api)**: Fetch fungible and non-fungible token data on the Stacks blockchain.\n- **[Stacks Explorer](https://explorer.hiro.so)**: Verify activity on the Stacks blockchain with an easy-to-use front end.\n\n<br />\n\n<Callout title=\"Need help building with the Stacks Node RPC API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#api</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n\n\n" + }, + { + "title": "Info", + "description": "Retrieves information about the Core API and the Stacks network.", + "slug": "/stacks/rpc-api/info/index", + "content": "" + }, + { + "title": "Get core API info", + "description": "Retrieves information about the Core API, including the server version.", + "slug": "/stacks/rpc-api/info/core-api", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/info', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Broadcast transaction", + "description": "Broadcasts raw transactions on the network.", + "slug": "/stacks/rpc-api/transactions/broadcast-transaction", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/transactions', method: 'post' }]}\n hasHead={false}\n/>" + }, + { + "title": "Transactions", + "description": "Manage, retrieve, and broadcast transaction data on the blockchain.", + "slug": "/stacks/rpc-api/transactions/index", + "content": "" + }, + { + "title": "Accounts", + "description": "Get account information.", + "slug": "/stacks/rpc-api/accounts/index", + "content": "" + }, + { + "title": "Get account info", + "description": "Retrieves the account data for a given account or contract identifier.", + "slug": "/stacks/rpc-api/accounts/info", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/accounts/{principal}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "v3", + "description": "Version 3 of the RPC API.", + "slug": "/stacks/rpc-api/v3/index", + "content": "" + }, + { + "title": "Get Nakamoto tenure metadata", + "description": "Fetch metadata about the ongoing Nakamoto tenure.", + "slug": "/stacks/rpc-api/v3/tenure-metadata", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v3/tenures/info', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get Nakamoto block", + "description": "Fetch a Nakamoto block by its index block hash.", + "slug": "/stacks/rpc-api/v3/nakamoto-block", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v3/blocks/{block_id}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get Nakamoto tenure blocks", + "description": "Fetch a sequence of Nakamoto blocks in a tenure.", + "slug": "/stacks/rpc-api/v3/tenure-blocks", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v3/tenures/{block_id}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get contract interface", + "description": "Retrieves a list of functions, variables, maps, fungible tokens and non-fungible tokens for a given smart contract.", + "slug": "/stacks/rpc-api/smart-contracts/interface", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/contracts/interface/{contract_address}/{contract_name}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get trait implementation details", + "description": "Determine whether or not a specified trait is implemented (either explicitly or implicitly) within a given contract.", + "slug": "/stacks/rpc-api/smart-contracts/traits", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/traits/{contract_address}/{contract_name}/{trait_contract_address}/{trait_contract_name}/{trait_name}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Smart contracts", + "description": "Provide information and facilitate interactions with smart contracts.", + "slug": "/stacks/rpc-api/smart-contracts/index", + "content": "" + }, + { + "title": "Get contract map entry", + "description": "Retrieves a specific entry from a contract data map.", + "slug": "/stacks/rpc-api/smart-contracts/map-entry", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/map_entry/{contract_address}/{contract_name}/{map_name}', method: 'post' }]}\n hasHead={false}\n/>" + }, + { + "title": "Call read-only function", + "description": "Calls a read-only public function on a given smart contract.", + "slug": "/stacks/rpc-api/smart-contracts/read-only", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/contracts/call-read/{contract_address}/{contract_name}/{function_name}', method: 'post' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get contract source", + "description": "Retrieves the Clarity source code of a given contract, along with the block height it was published in, and the MARF proof for the data.", + "slug": "/stacks/rpc-api/smart-contracts/source", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/contracts/source/{contract_address}/{contract_name}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get constant value", + "description": "Get the value of a constant inside a contract.", + "slug": "/stacks/rpc-api/smart-contracts/constants", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/constant_val/{contract_address}/{contract_name}/{constant_name}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Burn operations", + "description": "Get burn operations of type `op_type` successfully read at `burn_height`.", + "slug": "/stacks/rpc-api/burn-ops/index", + "content": "" + }, + { + "title": "Get burn operations", + "description": "Get all burn operations of type `op_type` successfully read at `burn_height`.", + "slug": "/stacks/rpc-api/burn-ops/get-burn-operations", + "content": "\n<APIPage\n document=\"./openapi/stacks-node-rpc-api.json\"\n operations={[{ path: '/v2/burn_ops/{burn_height}/{op_type}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Contributors guide", + "description": "Learn how to contribute to Hiro's documentation and content.", + "slug": "/bitcoin/contributors-guide", + "content": "\nimport ContributorsGuideContent from '@/content/_shared/contributors-guide.mdx';\n\n<ContributorsGuideContent components={props.components} />\n" + }, + { + "title": "Get started", + "description": "The following guides cover ways to use Hiro tools to build with Ordinals, BRC-20, and Runes.", + "slug": "/bitcoin/get-started", + "content": "\nimport { SecondaryCard, SmallCard } from '@/components/card';\nimport { API, Container, Chainhook, BitcoinIcon } from '@/components/ui/icon';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n className=\"group\"\n icon={<API className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/bitcoin/ordinals/api\"\n title=\"Integrate ordinals data into your app\"\n description=\"Use the Ordinals API to get reliable data for Ordinals and BRC-20 tokens.\"\n tag='Ordinals API'\n />\n <SecondaryCard\n className=\"group\"\n icon={<Chainhook className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/bitcoin/indexer\"\n title=\"Stream custom blockchain events\"\n description=\"Use the Bitcoin Indexer to filter and stream for contract deployments.\"\n tag='Bitcoin Indexer'\n />\n <SecondaryCard\n className=\"group\"\n icon={<API className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/bitcoin/runes/api\"\n title=\"Get Runes data\"\n description=\"Use Runes API to get reliable data for Runes.\"\n tag='Runes API'\n />\n</Cards>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n" + }, + { + "title": "Rate limiting", + "description": "Understand the rate limits for Hiro APIs and the STX Faucet.", + "slug": "/bitcoin/rate-limiting", + "content": "\nimport RateLimitingContent from '@/content/_shared/rate-limiting.mdx';\n\n<RateLimitingContent components={props.components} />\n" + }, + { + "title": "Overview", + "description": "Runehook enables you to build Rune event streams, so you can create accurate, lightweight databases that gracefully handle Bitcoin forks and reorgs.", + "slug": "/bitcoin/runes/runehook/index", + "content": "\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\n\nRunehook is a reorg-aware indexer that automatically handles chain forks, so you don’t need to waste time or resources reindexing your database yourself.\n\nWith a familiar event-driven framework, you can customize what Rune data you index in order to create lightweight databases for faster query responses and a better user experience.\n\n### Create event streams\n\n\n### Related tools\n\n- **[Runes API](/bitcoin/runes/api)**: Skip the infrastructure setup and get the runes data you need from our Runes API, which is powered by Runehook.\n- **[Ordinals Explorer](/ordinals/explorer)**: Explore Ordinals inscriptions and BRC-20 tokens rapidly in our Ordinals Explorer.\n\n---\n\n_Need help building with Runehook?_ Reach out to us on the `#chainhook` channel on Discord under **Hiro Developer Tools** section. We also host a weekly office hours on Discord every Monday at 11am ET.\n" + }, + { + "title": "Quickstart", + "description": "Learn how to scan the Bitcoin blockchain for Runes activity.", + "slug": "/bitcoin/runes/runehook/quickstart", + "content": "\nimport { ChevronRight, Code, Terminal } from 'lucide-react';\nimport { File, Folder, Files } from 'fumadocs-ui/components/files';\nimport { Step } from 'fumadocs-ui/components/steps';\nimport { SmallCard } from '@/components/card';\n\nIn this quickstart guide, you will set up `runehook` to explore and index Rune activity on the Bitcoin blockchain. You will learn how to install, configure, and run basic commands to scan and stream Rune inscriptions and transfers.\n\n{/* Check out the [Runehook as a service](/bitcoin/runehook/guides/runehook-as-a-service) for a more advanced use case. */}\n\n---\n\n### Prerequisites\n\nBefore starting, ensure you have `runehook` installed. If you haven't already, check out the [installation](/bitcoin/runehook/installation) guide.\n\n---\n\n### Next steps\n\n<Cards className='sm:grid-cols-1'>\n <SmallCard\n icon={<Code />}\n href=\"/bitcoin/runes/api\"\n title=\"Integrate runes data into your app\"\n description=\"Use the Runes API to get reliable data for Runes and BRC-20 tokens.\"\n tag='Runes API'\n />\n</Cards>\n" + }, + { + "title": "Installation", + "description": "Runehook was developed to be environment-agnostic. Below are the different ways to install and build the Bitcoin Indexer on your machine.", + "slug": "/bitcoin/runes/runehook/installation", + "content": "Clone the [Runehook repository](https://github.com/hirosystems/runehook) to your local machine and install via `cargo`.\n\n```terminal\n$ git clone https://github.com/hirosystems/runehook.git\n$ cd runehook\n$ cargo runehook-install\n```" + }, + { + "title": "Overview", + "description": "Explore and verify ordinals and BRC-20 data on Bitcoin.", + "slug": "/bitcoin/runes/explorer/index", + "content": "\nimport Link from \"next/link\";\nimport { Button } from \"@/components/ui/button\"\n\nThe Ordinals Explorer lets you explore and verify Bitcoin Ordinals and BRC-20 token data. You can also use a variety of filters to discover inscriptions. We maintain and support the [Ordinals Explorer](https://ordinals.hiro.so) as a service for the community, but you can also run your own instance of the explorer if you so choose.\n\n<div className=\"flex gap-4\">\n <Button className=\"bg-orange-500 hover:bg-orange-600\">\n <a href=\"https://ordinals.hiro.so\" target=\"_blank\" className=\"no-underline\">\n View Ordinals Explorer\n </a>\n </Button>\n <Button variant=\"outline\">\n <Link\n href=\"/bitcoin/explorer/guides/build-explorer\"\n className=\"no-underline\"\n >\n Set up your own explorer\n </Link>\n </Button>\n</div>\n\n### Related tools\n\n- **[Ordinals API](/bitcoin/ordinals/api)**: Looking for on-chain data without the front end? Leverage the Ordinals API.\n- **[Stacks Explorer](https://explorer.hiro.so)**: Looking for a front end to verify activity on the Stacks blockchain? Try the Stacks Explorer.\n\n---\n\nNeed help building with the Ordinals Explorer? Reach out to us on the `#ordinals` channel on Discord under the [Hiro Developer Tools section](https://stacks.chat/). There’s also a [weekly office hours](https://events.stacks.co/event/HD16484710) on Discord every Thursday at 11am ET.\n" + }, + { + "title": "Build Ordinals Explorer", + "description": "", + "slug": "/bitcoin/runes/explorer/guides/build-explorer", + "content": "\nAfter installing and configuring your environment, you can run the Ordinals Explorer locally if you wish by running the followning `npm` command:\n\n`npm run dev`\n\n## Building for production\n\nYou may also build a production version of the Ordinals Explorer. To do that, simply run the following command:\n\n`npm run build`\n\n<Callout>\n Running `npm run build` also run the default next.js build task.\n</Callout>\n" + }, + { + "title": "Overview", + "description": "The Runes API provides you with fast, reliable data for Bitcoin Runes via an easy-to-use REST interface.", + "slug": "/bitcoin/runes/api/index", + "content": "\nThe Runes API is a service that helps you with the complete ingestion of Bitcoin Runes data. Using our endpoints, you can retrieve metadata for a particular rune, trading activity, all runes held by a particular address, and more.\n\nThe Runes API uses REST endpoints and cached responses in order to optimize performance and reduce unnecessary requests. Reliable, consistent runes data, one request away.\n\n## Popular endpoints\n\n<Cards>\n <Card\n href=\"/bitcoin/runes/api/etchings/get-etchings\"\n title=\"Fetch Runes\"\n description=\"Retrieves a list of etchings.\"\n />\n <Card\n href=\"/bitcoin/runes/api/balances/holders\"\n title=\"Showcase user portfolios\"\n description=\"Retrieves a list of Rune holders.\"\n />\n <Card\n href=\"/bitcoin/runes/api/activities/activity\"\n title=\"Track your favorite Runes\"\n description=\"Retrieves all activity for a Rune.\"\n />\n</Cards>\n\n### Related tools\n\n{/* - **[Runehook](/bitcoin/runes/runeshook)**: Want to run your own infra? [Set up your own Runehook](/bitcoin/runes/runeshook/guides/runehook-as-a-service), the indexer that powers the Rune API. */}\n- **[Ordinals API](/bitcoin/ordinals/api)**: Looking for on-chain ordinals data without the front end? Leverage the Ordinals API.\n- **[Ordinals Explorer](https://ordinals.hiro.so/)**: The Ordinals API powers Hiro’s Ordinals Explorer, which lets you rapidly discover inscriptions and verify on-chain activity.\n\n---\n\nNeed help building with Runes API? Reach out to us on the `#ordinals` channel on Discord. Or join us at our weekly office hours on Discord every Monday at 11am ET.\n" + }, + { + "title": "Status", + "description": "Retrieves information about the Rune API status.", + "slug": "/bitcoin/runes/api/info/index", + "content": "" + }, + { + "title": "Get API Status", + "description": "Retrieves the status of the API.", + "slug": "/bitcoin/runes/api/info/status", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get address balances", + "description": "Retrieves a paginated list of address balances.", + "slug": "/bitcoin/runes/api/balances/address", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/addresses/{address}/balances', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Balances", + "description": "Retrieves information about Rune balances.", + "slug": "/bitcoin/runes/api/balances/index", + "content": "" + }, + { + "title": "Get holder balance", + "description": "Retrieves holder balance for a specific Rune.", + "slug": "/bitcoin/runes/api/balances/holder-balance", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/holders/{address}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get rune holders", + "description": "Retrieves a paginated list of holders for a Rune.", + "slug": "/bitcoin/runes/api/balances/holders", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/holders', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Activities", + "description": "Retrieves information about Rune activities.", + "slug": "/bitcoin/runes/api/activities/index", + "content": "" + }, + { + "title": "Get activity for a transaction", + "description": "Retrieves a paginated list of rune activity for a transaction.", + "slug": "/bitcoin/runes/api/activities/for-transaction", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/transactions/{tx_id}/activity', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get activity for an address", + "description": "Retrieves all Rune activity for a Bitcoin address.", + "slug": "/bitcoin/runes/api/activities/for-address", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/activity/{address}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get activity for a block", + "description": "Retrieves a paginated list of rune activity for a block.", + "slug": "/bitcoin/runes/api/activities/for-block", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/blocks/{block}/activity', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get all activity", + "description": "Retrieves all activity for a Rune.", + "slug": "/bitcoin/runes/api/activities/activity", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/activity', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Usage", + "description": "Create your first project in less than 2 minutes", + "slug": "/bitcoin/runes/api/usage", + "content": "\nThe Usage section should focus on practical, hands-on instructions for getting started with the API. This includes:\nAuthentication: How to authenticate with the API (e.g., API keys, OAuth tokens).\nMaking Requests: Basic examples of making requests to the API, including request format, essential headers, and parameters.\nHandling Responses: Information on response structure, understanding status codes, and error handling.\nRate Limits: If applicable, explain any rate limits and best practices for avoiding them.\nThe goal of the \"Usage\" section is to equip developers with the knowledge to make successful API calls and handle responses effectively.\n" + }, + { + "title": "Etchings", + "description": "Retrieves information about Rune etchings.", + "slug": "/bitcoin/runes/api/etchings/index", + "content": "" + }, + { + "title": "Get etchings", + "description": "Retrieves a paginated list of rune etchings.", + "slug": "/bitcoin/runes/api/etchings/get-etchings", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get etching", + "description": "Retrieves information for a Rune etching.", + "slug": "/bitcoin/runes/api/etchings/get-etching", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Overview", + "description": "Explore and verify ordinals and BRC-20 data on Bitcoin.", + "slug": "/bitcoin/ordinals/explorer/index", + "content": "\nimport Link from \"next/link\";\nimport { Button } from \"@/components/ui/button\"\n\nThe Ordinals Explorer lets you explore and verify Bitcoin Ordinals and BRC-20 token data. You can also use a variety of filters to discover inscriptions. We maintain and support the [Ordinals Explorer](https://ordinals.hiro.so) as a service for the community, but you can also run your own instance of the explorer if you so choose.\n\n<div className=\"flex gap-4\">\n <Button className=\"bg-orange-500 hover:bg-orange-600\">\n <a href=\"https://ordinals.hiro.so\" target=\"_blank\" className=\"no-underline\">\n View Ordinals Explorer\n </a>\n </Button>\n <Button variant=\"outline\">\n <Link\n href=\"/bitcoin/explorer/guides/build-explorer\"\n className=\"no-underline\"\n >\n Set up your own explorer\n </Link>\n </Button>\n</div>\n\n## Related tools\n\n- **[Ordinals API](/bitcoin/ordinals/api)**: Looking for on-chain data without the front end? Leverage the Ordinals API.\n- **[Stacks Explorer](https://explorer.hiro.so)**: Looking for a front end to verify activity on the Stacks blockchain? Try the Stacks Explorer.\n\n---\n\nNeed help building with the Ordinals Explorer? Reach out to us on the `#ordinals` channel on Discord under the [Hiro Developer Tools section](https://stacks.chat/). There’s also a [weekly office hours](https://events.stacks.co/event/HD16484710) on Discord every Thursday at 11am ET.\n" + }, + { + "title": "Build Ordinals Explorer", + "description": "", + "slug": "/bitcoin/ordinals/explorer/guides/build-explorer", + "content": "\nAfter installing and configuring your environment, you can run the Ordinals Explorer locally if you wish by running the followning `npm` command:\n\n`npm run dev`\n\n## Building for production\n\nYou may also build a production version of the Ordinals Explorer. To do that, simply run the following command:\n\n`npm run build`\n\n<Callout title=\"Note\" type=\"info\">\n Running `npm run build` also run the default next.js build task.\n</Callout>\n" + }, + { + "title": "Statistics", + "description": "Retrieves stats on the number of inscriptions per block.", + "slug": "/bitcoin/ordinals/api/statistics/index", + "content": "" + }, + { + "title": "Get inscription count per block", + "description": "Retrieves statistics on the number of inscriptions revealed per block.", + "slug": "/bitcoin/ordinals/api/statistics/get-stats-inscription-count", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/stats/inscriptions', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get BRC-20 token holders", + "description": "Retrieves a list of holders and their balances for a particular BRC-20 token.", + "slug": "/bitcoin/ordinals/api/brc20/get-brc20-token-holders", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens/{ticker}/holders', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "BRC-20", + "description": "Retrieves information about BRC-20 tokens.", + "slug": "/bitcoin/ordinals/api/brc20/index", + "content": "" + }, + { + "title": "Get BRC-20 balances", + "description": "Retrieves BRC-20 token balances for a Bitcoin address.", + "slug": "/bitcoin/ordinals/api/brc20/get-brc20-balances", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/balances/{address}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get BRC-20 token details", + "description": "Retrieves information for a BRC-20 token, including supply and holders.", + "slug": "/bitcoin/ordinals/api/brc20/get-brc20-token-details", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens/{ticker}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get BRC-20 tokens", + "description": "Retrieves information for BRC-20 tokens.", + "slug": "/bitcoin/ordinals/api/brc20/get-brc20-tokens", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get BRC-20 activity", + "description": "Retrieves BRC-20 activity filtered by ticker, address, operation, or block height.", + "slug": "/bitcoin/ordinals/api/brc20/get-brc20-activity", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/activity', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Inscriptions", + "description": "Retrieves information about Ordinals inscriptions.", + "slug": "/bitcoin/ordinals/api/inscriptions/index", + "content": "" + }, + { + "title": "Get inscription transfers", + "description": "Retrieves all transfers for a single inscription.", + "slug": "/bitcoin/ordinals/api/inscriptions/get-inscription-transfers", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}/transfers', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get inscriptions", + "description": "Retrieves a list of inscriptions with options to filter and sort results.", + "slug": "/bitcoin/ordinals/api/inscriptions/get-inscriptions", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get inscription content", + "description": "Retrieves the content of a single inscription.", + "slug": "/bitcoin/ordinals/api/inscriptions/get-inscription-content", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}/content', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get transfers per block", + "description": "Retrieves a list of inscription transfers that ocurred at a specific Bitcoin block.", + "slug": "/bitcoin/ordinals/api/inscriptions/get-transfers-per-block", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/transfers', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get inscription", + "description": "Retrieves a single inscription.", + "slug": "/bitcoin/ordinals/api/inscriptions/get-inscription", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Overview", + "description": "The Ordinals API provides you with fast, reliable data for Bitcoin ordinals and BRC-20 tokens via an easy-to-use REST interface.", + "slug": "/bitcoin/ordinals/api/index", + "content": "\nimport { SecondaryCard } from '@/components/card';\n\nThe Ordinals API is a service that helps you with the complete ingestion of ordinals inscription data. Using our endpoints, you can retrieve metadata for a particular inscription, trading activity, all inscriptions held by a particular address, and more.\n\nThe Ordinals API uses REST endpoints and cached responses in order to optimize performance and reduce unnecessary requests. Start integrating ordinals and BRC-20 tokens into your app with one of the most reliable APIs on the market today.\n\n## Popular endpoints\n\n<Cards>\n <SecondaryCard\n href=\"/bitcoin/ordinals/api/inscriptions/get-inscription-content\"\n title=\"Fetch Ordinals content\"\n description=\"Retrieve all metadata related to individual inscriptions.\"\n />\n <SecondaryCard\n href=\"/bitcoin/ordinals/api/brc20/get-brc20-tokens\"\n title=\"Integrate BRC-20 tokens\"\n description=\"Retrieve all metadata related to BRC-20 tokens.\"\n />\n <SecondaryCard\n href=\"/bitcoin/ordinals/api/inscriptions/get-inscriptions\"\n title=\"Showcase user portfolios\"\n description=\"Get all inscriptions held by particular addresses.\"\n />\n <SecondaryCard\n href=\"/bitcoin/ordinals/api/satoshis/get-satoshi\"\n title=\"Retrieve data for a specific satoshi\"\n description=\"Get all inscription data related to a particular satoshi.\"\n />\n <SecondaryCard\n href=\"/bitcoin/ordinals/api/inscriptions/get-transfers-per-block\"\n title=\"Graph marketplace activity\"\n description=\"Pull all transfers from a specific block.\"\n />\n</Cards>\n\n## Related tools\n\n- **[Bitcoin Indexer](/bitcoin/indexer)**: Want to run your own infra? [Set up your own Bitcoin Indexer](/bitcoin/indexer), the indexer that powers the Ordinals API.\n- **[Ordinals Explorer](https://ordinals.hiro.so/)**: The Ordinals API powers Hiro’s Ordinals Explorer, which lets you rapidly discover inscriptions and verify on-chain activity.\n\n<br />\n\n<Callout title=\"Need help building with the Ordinals API?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#ordinals</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n" + }, + { + "title": "Status", + "description": "Retrieves information about the Ordinals API status, including the server version.", + "slug": "/bitcoin/ordinals/api/info/index", + "content": "" + }, + { + "title": "Get API status", + "description": "Retrieves the running status of the Ordinals API.", + "slug": "/bitcoin/ordinals/api/info/status", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Usage", + "description": "Create your first project in less than 2 minutes", + "slug": "/bitcoin/ordinals/api/usage", + "content": "\nThe Usage section should focus on practical, hands-on instructions for getting started with the API. This includes:\nAuthentication: How to authenticate with the API (e.g., API keys, OAuth tokens).\nMaking Requests: Basic examples of making requests to the API, including request format, essential headers, and parameters.\nHandling Responses: Information on response structure, understanding status codes, and error handling.\nRate Limits: If applicable, explain any rate limits and best practices for avoiding them.\nThe goal of the \"Usage\" section is to equip developers with the knowledge to make successful API calls and handle responses effectively.\n" + }, + { + "title": "Satoshis", + "description": "Retrieves ordinal information for satoshis.", + "slug": "/bitcoin/ordinals/api/satoshis/index", + "content": "" + }, + { + "title": "Get satoshi ordinal", + "description": "Retrieves ordinal information for a single satoshi.", + "slug": "/bitcoin/ordinals/api/satoshis/get-satoshi", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/sats/{ordinal}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get satoshi inscriptions", + "description": "Retrieves all inscriptions associated with a single satoshi.", + "slug": "/bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/sats/{ordinal}/inscriptions', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Home", + "description": "", + "slug": "/bitcoin/index", + "content": "\nimport { Card, SmallCard } from '@/components/card';\nimport { ImageZoom } from 'fumadocs-ui/components/image-zoom';\nimport { PageFooter } from '@/components/footer';\nimport { Database, Play } from 'lucide-react';\nimport { API, Backend, Chainhook, Newspaper, Ordinals, QuestionIcon, BugIcon, Pulse } from '@/components/ui/icon';\nimport heroImage from '@/public/bitcoin-hero.svg';\n\n<div className='flex flex-col space-y-10'>\n\n<div className='flex space-x-6 items-end'>\n <ImageZoom\n alt=\"banner\"\n src={heroImage}\n className=\"mt-0 mb-6 first-line:rounded-xl bg-background\"\n priority\n />\n\n <div className='flex flex-col [&_h2]:mt-0 [&_h2]:mb-2 [&_p]:mb-6'>\n\n ## Build with Bitcoin\n\n Find all the guides and resources you need to build on Ordinals and Runes.\n\n </div>\n</div>\n\n<Cards>\n <Card\n className='group space-y-1'\n icon={<Play className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/bitcoin/get-started\"\n title=\"Get Started\"\n description=\"Get started with our end-to-end tutorials and quickstart guides across all Hiro's ordinals tools.\"\n />\n <Card\n className='group space-y-1'\n icon={<API className='transition-colors duration-500 ease-in-out group-hover:text-primary' />}\n href=\"/bitcoin/ordinals/api\"\n title=\"Ordinals API Reference\"\n description=\"Explore API endpoints for interacting with Ordinals and meta-protocols.\"\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"explore-bitcoin\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#explore-bitcoin\" className=\"not-prose group text-sm uppercase\">Explore Bitcoin</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Ordinals />}\n href=\"/bitcoin/indexer\"\n title=\"Bitcoin Indexer\"\n description=\"Use the Bitcoin Indexer to index and query Bitcoin blockchain data.\"\n />\n <SmallCard\n icon={<API />}\n href=\"/bitcoin/ordinals/api\"\n title=\"Ordinals API\"\n description=\"Fetch on-chain data for Ordinals and meta-protocols with our hosted API.\"\n />\n <SmallCard\n icon={<Play />}\n href=\"https://ordinals.hiro.so/\"\n title=\"Ordinals Explorer\"\n description=\"View on-chain data for Ordinals and meta-protocols with our explorer.\"\n />\n <SmallCard\n icon={<API />}\n href=\"/bitcoin/runes/api\"\n title=\"Runes API\"\n description=\"Interact with the Runes protocol from your backend via our hosted API.\"\n />\n</Cards>\n\n</div>\n\n</div>\n\n<PageFooter />" + }, + { + "title": "API keys", + "description": "For developers who need API requests beyond the standard rate limits.", + "slug": "/bitcoin/api-keys", + "content": "\nimport ApiKeysContent from '@/content/_shared/api-keys.mdx';\n\n<ApiKeysContent components={props.components} />\n" + }, + { + "title": "Status", + "description": "Retrieves information about the Rune API status.", + "slug": "/bitcoin/api/runes/info/index", + "content": "" + }, + { + "title": "Get API Status", + "description": "Retrieves the status of the API.", + "slug": "/bitcoin/api/runes/info/status", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get address balances", + "description": "Retrieves a paginated list of address balances.", + "slug": "/bitcoin/api/runes/balances/address", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/addresses/{address}/balances', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Balances", + "description": "Retrieves information about Rune balances.", + "slug": "/bitcoin/api/runes/balances/index", + "content": "" + }, + { + "title": "Get holder balance", + "description": "Retrieves holder balance for a specific Rune.", + "slug": "/bitcoin/api/runes/balances/holder-balance", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/holders/{address}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get rune holders", + "description": "Retrieves a paginated list of holders for a Rune.", + "slug": "/bitcoin/api/runes/balances/holders", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/holders', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Activities", + "description": "Retrieves information about Rune activities.", + "slug": "/bitcoin/api/runes/activities/index", + "content": "" + }, + { + "title": "Get activity for a transaction", + "description": "Retrieves a paginated list of rune activity for a transaction.", + "slug": "/bitcoin/api/runes/activities/for-transaction", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/transactions/{tx_id}/activity', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get activity for an address", + "description": "Retrieves all Rune activity for a Bitcoin address.", + "slug": "/bitcoin/api/runes/activities/for-address", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/activity/{address}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get activity for a block", + "description": "Retrieves a paginated list of rune activity for a block.", + "slug": "/bitcoin/api/runes/activities/for-block", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/blocks/{block}/activity', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get all activity", + "description": "Retrieves all activity for a Rune.", + "slug": "/bitcoin/api/runes/activities/activity", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}/activity', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Etchings", + "description": "Retrieves information about Rune etchings.", + "slug": "/bitcoin/api/runes/etchings/index", + "content": "" + }, + { + "title": "Get etchings", + "description": "Retrieves a paginated list of rune etchings.", + "slug": "/bitcoin/api/runes/etchings/get-etchings", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get etching", + "description": "Retrieves information for a Rune etching.", + "slug": "/bitcoin/api/runes/etchings/get-etching", + "content": "\n<APIPage\n document=\"./openapi/runes-api.json\"\n operations={[{ path: '/runes/v1/etchings/{etching}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Statistics", + "description": "Retrieves stats on the number of inscriptions per block.", + "slug": "/bitcoin/api/ordinals/statistics/index", + "content": "" + }, + { + "title": "Get inscription count per block", + "description": "Retrieves statistics on the number of inscriptions revealed per block.", + "slug": "/bitcoin/api/ordinals/statistics/get-stats-inscription-count", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/stats/inscriptions', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get BRC-20 token holders", + "description": "Retrieves a list of holders and their balances for a particular BRC-20 token.", + "slug": "/bitcoin/api/ordinals/brc20/get-brc20-token-holders", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens/{ticker}/holders', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "BRC-20", + "description": "Retrieves information about BRC-20 tokens.", + "slug": "/bitcoin/api/ordinals/brc20/index", + "content": "" + }, + { + "title": "Get BRC-20 balances", + "description": "Retrieves BRC-20 token balances for a Bitcoin address.", + "slug": "/bitcoin/api/ordinals/brc20/get-brc20-balances", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/balances/{address}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get BRC-20 token details", + "description": "Retrieves information for a BRC-20 token, including supply and holders.", + "slug": "/bitcoin/api/ordinals/brc20/get-brc20-token-details", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens/{ticker}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get BRC-20 tokens", + "description": "Retrieves information for BRC-20 tokens.", + "slug": "/bitcoin/api/ordinals/brc20/get-brc20-tokens", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/tokens', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get BRC-20 activity", + "description": "Retrieves BRC-20 activity filtered by ticker, address, operation, or block height.", + "slug": "/bitcoin/api/ordinals/brc20/get-brc20-activity", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/brc-20/activity', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "Inscriptions", + "description": "Retrieves information about Ordinals inscriptions.", + "slug": "/bitcoin/api/ordinals/inscriptions/index", + "content": "" + }, + { + "title": "Get inscription transfers", + "description": "Retrieves all transfers for a single inscription.", + "slug": "/bitcoin/api/ordinals/inscriptions/get-inscription-transfers", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}/transfers', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get inscriptions", + "description": "Retrieves a list of inscriptions with options to filter and sort results.", + "slug": "/bitcoin/api/ordinals/inscriptions/get-inscriptions", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get inscription content", + "description": "Retrieves the content of a single inscription.", + "slug": "/bitcoin/api/ordinals/inscriptions/get-inscription-content", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}/content', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get transfers per block", + "description": "Retrieves a list of inscription transfers that ocurred at a specific Bitcoin block.", + "slug": "/bitcoin/api/ordinals/inscriptions/get-transfers-per-block", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/transfers', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get inscription", + "description": "Retrieves a single inscription.", + "slug": "/bitcoin/api/ordinals/inscriptions/get-inscription", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/inscriptions/{id}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Status", + "description": "Retrieves information about the Ordinals API status, including the server version.", + "slug": "/bitcoin/api/ordinals/info/index", + "content": "" + }, + { + "title": "Get API status", + "description": "Retrieves the running status of the Ordinals API.", + "slug": "/bitcoin/api/ordinals/info/status", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Satoshis", + "description": "Retrieves ordinal information for satoshis.", + "slug": "/bitcoin/api/ordinals/satoshis/index", + "content": "" + }, + { + "title": "Get satoshi ordinal", + "description": "Retrieves ordinal information for a single satoshi.", + "slug": "/bitcoin/api/ordinals/satoshis/get-satoshi", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/sats/{ordinal}', method: 'get' }]}\n hasHead={false}\n/>" + }, + { + "title": "Get satoshi inscriptions", + "description": "Retrieves all inscriptions associated with a single satoshi.", + "slug": "/bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions", + "content": "\n<APIPage\n document=\"./openapi/ordinals-api.json\"\n operations={[{ path: '/ordinals/v1/sats/{ordinal}/inscriptions', method: 'get' }]}\n hasHead={false}\n/>\n" + }, + { + "title": "APIs", + "description": "The following guides cover ways to use Hiro tools to build apps on Stacks.", + "slug": "/bitcoin/api/index", + "content": "\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n" + }, + { + "title": "Overview", + "description": "The Bitcoin Indexer enables you to build ordinals event streams, so you can create accurate, lightweight databases that gracefully handle Bitcoin forks and reorgs.", + "slug": "/bitcoin/indexer/index", + "content": "\nimport { SecondaryCard } from '@/components/card';\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\n\nThe Bitcoin Indexer is a reorg-aware indexer that automatically handles chain forks, so you don't need to waste time or resources reindexing your database yourself.\n\nYou can customize what ordinals data you index in order to create lightweight databases for faster query responses and a better user experience.\n\n## Installation\n\n```terminal\n$ git clone https://github.com/hirosystems/bitcoin-indexer.git\n$ cd bitcoin-indexer\n$ cargo bitcoin-indexer-install\n```\n\nAlternatively, you can use Docker images from [Docker Hub](https://hub.docker.com/r/hirosystems/bitcoin-indexer).\n\n## Get started\n\n<Cards>\n <SecondaryCard\n href=\"/bitcoin/indexer/quickstart\"\n title=\"Quickstart\"\n description=\"Learn how to scan for Bitcoin activity using the Bitcoin Indexer.\"\n />\n</Cards>\n\n## System Requirements\n\nBefore running the indexer, ensure your system meets these requirements:\n\n- **CPU**: Multi-core support for parallel processing\n- **Memory**: Minimum 16GB RAM\n- **Storage**: SSD or NVMe recommended\n- **OS**: Support for 4096+ open file descriptors\n- **Postgres**: Version 17+ recommended\n\n## Related tools\n\n- **[Ordinals API](/bitcoin/ordinals/api)**: Skip the infrastructure setup and get the ordinals data you need from our Ordinals API, which is powered by the Bitcoin Indexer.\n- **[Ordinals Explorer](https://ordinals.hiro.so/)**: Explore ordinals inscriptions and BRC-20 tokens rapidly in our Ordinals Explorer.\n\n<br />\n\n<Callout title=\"Need help building with the Bitcoin Indexer?\" type=\"help\">\nReach out to us on the <span className=\"font-bold\">#indexer</span> channel on [Discord](https://stacks.chat/) under the Hiro Developer Tools section. There's also a [weekly office hours](https://www.addevent.com/event/kI22007085) call every Wednesday at 1pm ET.\n</Callout>\n" + }, + { + "title": "TBD", + "description": "TBD", + "slug": "/bitcoin/indexer/guides/run-indexer", + "content": "\n" + }, + { + "title": "Quickstart", + "description": "Learn how to scan the Bitcoin blockchain for Ordinals activity.", + "slug": "/bitcoin/indexer/quickstart", + "content": "\nimport { Steps, Step } from 'fumadocs-ui/components/steps';\n\nIn this quickstart guide, you will set up the Bitcoin Indexer to index Ordinals or Runes activity on the Bitcoin blockchain.\n\n<Steps>\n <Step title=\"Install Bitcoin Indexer\">\n Clone the repository and install the indexer:\n ```terminal\n $ git clone https://github.com/hirosystems/bitcoin-indexer.git\n $ cd bitcoin-indexer\n $ cargo bitcoin-indexer-install\n ```\n </Step>\n\n <Step title=\"Configure the Indexer\">\n Generate a new configuration file:\n ```terminal\n $ bitcoin-indexer config new\n ```\n \n Configure your Postgres database in the generated TOML file:\n ```toml\n [ordinals.db]\n database = \"metaprotocols\"\n host = \"localhost\"\n port = 5432\n username = \"postgres\"\n password = \"postgres\"\n ```\n </Step>\n\n <Step title=\"Start the Indexer\">\n Run the following command to start indexing Ordinals activity:\n ```terminal\n $ bitcoin-indexer ordinals service start --config-path <path>\n ```\n \n For Runes indexing, use:\n ```terminal\n $ bitcoin-indexer runes service start --config-path <path>\n ```\n </Step>\n</Steps>\n\n<Callout type=\"info\">\n A fully synced Bitcoin node is required for indexing to start.\n</Callout>\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/ordinals/explorer\"\n title=\"Ordinals Explorer\"\n description=\"Explore the Ordinals Explorer to view inscriptions and transfers.\"\n />\n <Card\n href=\"/bitcoin/ordinals/api\"\n title=\"Ordinals API\"\n description=\"Learn how to interact with Ordinals data using our API.\"\n />\n <Card\n href=\"/bitcoin/runes/api\" \n title=\"Runes API\"\n description=\"Explore our Runes blockchain API documentation.\"\n />\n</Cards>" + }, + { + "title": "Quickstarts", + "description": "The following guides cover ways to use Hiro tools to build apps on Stacks.", + "slug": "/bitcoin/quickstarts/index", + "content": "\nimport { Database, Ticket } from 'lucide-react';\nimport { Blockchain, BitcoinIcon, Clarinet, Container, DAO, Js, Plant, Shapes, StacksIcon } from '@/components/ui/icon';\nimport { SecondaryCard, SmallCard } from '@/components/card';\n\n<div className='flex flex-col space-y-10'>\n\n<Cards>\n <SecondaryCard\n icon={<Clarinet />}\n href=\"/stacks/clarinet/quickstart\"\n title=\"Create your first smart contract\"\n description=\"Build a simple counter contract using Clarinet.\"\n tag='Clarinet'\n />\n <SecondaryCard\n icon={<Blockchain />}\n href=\"/stacks/clarinet-js-sdk/quickstart\"\n title=\"Write unit tests for your smart contracts\"\n description=\"Learn how run unit tests with Clarinet JS SDK.\"\n tag='Clarinet JS SDK'\n />\n <SecondaryCard\n icon={<Js />}\n href=\"/stacks/stacks.js/quickstart\"\n title=\"Make a contract call with Stacks.js\"\n description=\"Learn how to integrate smart contracts into your app.\"\n tag='Stacks.js'\n />\n <SecondaryCard\n icon={<Database />}\n href=\"/stacks/chainhook/quickstart\"\n title=\"Stream custom blockchain events\"\n description=\"Use Chainhook to filter & stream for contract deployments.\"\n tag='Chainhook'\n />\n</Cards>\n\n<div className='flex flex-col'>\n\n<h4 id=\"learn-by-example\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#learn-by-example\" className=\"not-prose group text-sm uppercase\">Learn by example</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<Shapes />}\n href=\"/guides/build-an-nft-marketplace\"\n title=\"Build an NFT Marketplace\"\n description=\"Learn how to create and deploy your own NFT marketplace.\"\n />\n {/* <SmallCard\n icon={<DAO />}\n href=\"/stacks/clarinet\"\n title=\"Launch a Decentralized Autonomous Organization (DAO)\"\n description=\"Discover the steps to creating your own DAO.\"\n /> */}\n <SmallCard\n icon={<Ticket />}\n href=\"/guides/no-loss-lottery\"\n title=\"Create a no-loss lottery pool\"\n description=\"Build a no-loss lottery pool that leverages stacking yield.\"\n />\n <SmallCard\n icon={<Plant />}\n href=\"/guides/build-a-decentralized-kickstarter\"\n title=\"Build a decentralized Kickstarter\"\n description=\"Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.\"\n />\n</Cards>\n\n</div>\n\n<div className='flex flex-col'>\n\n<h4 id=\"installation-guides\" className=\"text-[#595650] dark:text-[#8c877d] scroll-m-20\">\n <a href=\"#installation-guides\" className=\"not-prose group text-sm uppercase\">Installation guides</a>\n</h4>\n\n---\n\n<Cards>\n <SmallCard\n icon={<BitcoinIcon />}\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Set up and run a Bitcoin node to run tools like Chainhook as a service.\"\n />\n <SmallCard\n icon={<StacksIcon />}\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Set up and run a Stacks node to use tools like Chainhook or spin up your own API.\"\n />\n <SmallCard\n icon={<Container />}\n href=\"/guides/installing-docker\"\n title=\"Install and run Docker on your machine\"\n description=\"Essential for running a local development with Clarinet\"\n />\n</Cards>\n\n</div>\n\n<Callout type=\"tip\">\nFor more, check out our [guides](/guides) section.\n</Callout>\n\n</div>\n" + }, + { + "title": "Contributors guide", + "description": "Learn how to contribute to Hiro's documentation and content.", + "slug": "/guides/contributors-guide", + "content": "\nimport ContributorsGuideContent from '@/content/_shared/contributors-guide.mdx';\n\n<ContributorsGuideContent components={props.components} />\n" + }, + { + "title": "Rate limiting", + "description": "Understand the rate limits for Hiro APIs and the STX Faucet.", + "slug": "/guides/rate-limiting", + "content": "\nimport RateLimitingContent from '@/content/_shared/rate-limiting.mdx';\n\n<RateLimitingContent components={props.components} />\n" + }, + { + "title": "Home", + "description": "", + "slug": "/guides/index", + "content": "\nimport Link from \"fumadocs-core/link\";\nimport { ImageZoom } from 'fumadocs-ui/components/image-zoom';\nimport { SecondaryCard } from \"@/components/card\"\nimport guidesImage from '@/public/guides.svg';\nimport data from '@/lib/all-guides.json';\n\n<div className='flex flex-col space-y-10'>\n <div className='flex space-x-6 items-end'>\n <ImageZoom\n alt=\"banner\"\n src={guidesImage}\n className=\"mt-0 mb-6 first-line:rounded-xl bg-background\"\n priority\n />\n </div>\n\n <Cards>\n {data.guides.map(guide => {\n return (\n <SecondaryCard\n key={guide.title}\n href={guide.href}\n title={guide.title}\n description={guide.description}\n />\n )\n })}\n </Cards>\n</div>" + }, + { + "title": "How to sync a Stacks node", + "description": "Learn how to sync a Stacks node for running a local devnet or mainnet.", + "slug": "/guides/sync-a-stacks-node", + "content": "\nimport { Code, Terminal } from 'lucide-react';\nimport { SmallCard } from '@/components/card';\nimport { InlineCode } from '@/components/inline-code';\n\nRunning a Stacks node is crucial for developers aiming to interact directly with the Stacks blockchain. It allows for the verification of transactions, ensures decentralized operations, and enhances blockchain security.\n\nIn this guide, you will learn how to:\n\n1. [Clone the Stacks blockchain Docker repository](#clone-the-stacks-blockchain-docker-repository).\n2. [Start the service](#start-the-service).\n3. [Monitor the node's synchronization process](#monitor-the-nodes-synchronization-process).\n\n---\n\n## Clone the Stacks blockchain Docker repository\n\nClone the Stacks blockchain Docker repository from GitHub:\n\n```terminal\n$ git clone https://github.com/blockstack/stacks-blockchain-docker.git\n$ cd stacks-blockchain-docker\n```\n\n## Start the service\n\nInside of the `stacks-blockchain-docker` directory, run the following command to start the Stacks node:\n\n```terminal\n$ ./manage.sh -n <network> -a start\n```\n\nThe `<network>` placeholder used below can be replaced with one of:\n\n- `mainnet`\n- `testnet`\n- `mocknet`\n\n## Monitor the node's synchronization process\n\nTo follow the logs for the Stacks node, run the following command:\n\n```terminal\n$ ./manage.sh -n <network> -a logs\n```\n\nFor networks other than `mocknet`, downloading the initial headers can take several minutes. Until the headers are downloaded, the `/v2/info` endpoints won't return any data.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/chainhook-as-a-service\"\n title=\"Run Chainhook as a service\"\n description=\"Learn how to use Chainhook to build your own custom API.\"\n />\n <Card\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Learn how to sync a Bitcoin node for running Chainhook as a service.\"\n />\n</Cards>\n" + }, + { + "title": "How to install Docker", + "description": "Install Docker to run a local devnet.", + "slug": "/guides/installing-docker", + "content": "\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\n<Tabs id=\"docker\" items={['macOS', 'Windows']}>\n <Tab value=\"macOS\">\n 1. Go to the [Docker Desktop for Mac](https://www.docker.com/products/docker-desktop/) page.\n 2. Download the .dmg file.\n 3. Open the downloaded .dmg file.\n 4. Drag the Docker icon to the Applications folder.\n 5. Open Docker from the Applications folder.\n 6. Grant the necessary permissions if prompted.\n 7. Docker Desktop icon will appear in the menu bar indicating that Docker is running.\n \n To verify installation, run `docker --version` in your terminal. You should see the Docker version information.\n </Tab>\n \n <Tab value=\"Windows\">\n 1. Go to the [Docker Desktop for Windows](https://www.docker.com/products/docker-desktop/) page.\n 2. Download the executable.\n 3. Run the downloaded executable.\n 4. Follow the installation wizard steps (you may need to restart your computer).\n 5. Ensure the WSL 2 (Windows Subsystem for Linux) backend is checked during installation, if applicable.\n 6. Open Docker Desktop from the Start menu.\n 7. Grant the necessary permissions if prompted.\n 8. Docker icon will appear in the system tray indicating Docker is running.\n\n To verify installation, run `docker --version` in your terminal. You should see the Docker version information.\n \n <Callout title=\"Windows installation\">\n You might need to install additional Windows components like Hyper-V or WSL 2.\n </Callout>\n </Tab>\n</Tabs>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/guides/sync-a-bitcoin-node\"\n title=\"Sync a Bitcoin node\"\n description=\"Learn how to sync a Bitcoin node for running Chainhook as a service.\"\n />\n <Card\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Learn how to sync a Stacks node for running a local devnet.\"\n />\n</Cards>" + }, + { + "title": "Build a decentralized Kickstarter", + "description": "Learn how to create a crowdfunding app, enabling creators to fund their projects without a third party.", + "slug": "/guides/build-a-decentralized-kickstarter", + "content": "\nimport { Code, Terminal } from 'lucide-react';\nimport { SmallCard } from '@/components/card';\n\nIn this guide, you will learn how to create an NFT marketplace that allows users to list NFTs for sale. Users can specify the following details for their listings:\n- The NFT token to sell.\n- Listing expiry in block height.\n- The payment asset, either STX or a SIP010 fungible token.\n- The NFT price in the chosen payment asset.\n- An optional intended taker. If set, only that principal will be able to fulfil the listing.\n\nThis marketplace leverages the following Clarity traits:\n- `nft-trait` for handling NFTs.\n- `ft-trait` for handling fungible tokens.\n\nOver the course of this guide, you will learn how to:\n1. Define and handle errors.\n2. Create and manage NFT listings.\n3. Whitelist asset contracts.\n4. Fulfil NFT purchases.\n\n---\n\n## Define and handle errors\n\nFirst, define constants for various errors that may occur during listing, cancelling, or fulfilling NFT transactions. This helps in maintaining clean and readable code.\n\n```clarity\n;; Define listing errors\n(define-constant ERR_EXPIRY_IN_PAST (err u1000))\n(define-constant ERR_PRICE_ZERO (err u1001))\n\n;; Define cancelling and fulfilling errors\n(define-constant ERR_UNKNOWN_LISTING (err u2000))\n(define-constant ERR_UNAUTHORISED (err u2001))\n(define-constant ERR_LISTING_EXPIRED (err u2002))\n(define-constant ERR_NFT_ASSET_MISMATCH (err u2003))\n(define-constant ERR_PAYMENT_ASSET_MISMATCH (err u2004))\n(define-constant ERR_MAKER_TAKER_EQUAL (err u2005))\n(define-constant ERR_UNINTENDED_TAKER (err u2006))\n(define-constant ERR_ASSET_CONTRACT_NOT_WHITELISTED (err u2007))\n(define-constant ERR_PAYMENT_CONTRACT_NOT_WHITELISTED (err u2008))\n```\n\n## Create and manage NFT listings\n\n### Define data structures\n\nCreate a map data structure for the asset listings and a data variable for unique IDs.\n\n```clarity\n;; Define a map data structure for the asset listings\n(define-map listings\n uint\n {\n maker: principal,\n taker: (optional principal),\n token-id: uint,\n nft-asset-contract: principal,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n }\n)\n\n;; Used for unique IDs for each listing\n(define-data-var listing-nonce uint u0)\n```\n\n### List an asset\n\nCreate a public function to list an asset along with its contract. This function verifies the contract, checks expiry and price, and transfers the NFT ownership to the marketplace.\n\n```clarity\n(define-public (list-asset\n (nft-asset-contract <nft-trait>)\n (nft-asset {\n taker: (optional principal),\n token-id: uint,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n })\n)\n (let ((listing-id (var-get listing-nonce)))\n ;; Verify that the contract of this asset is whitelisted\n (asserts! (is-whitelisted (contract-of nft-asset-contract)) ERR_ASSET_CONTRACT_NOT_WHITELISTED)\n ;; Verify that the asset is not expired\n (asserts! (> (get expiry nft-asset) block-height) ERR_EXPIRY_IN_PAST)\n ;; Verify that the asset price is greater than zero\n (asserts! (> (get price nft-asset) u0) ERR_PRICE_ZERO)\n ;; Verify that the contract of the payment is whitelisted\n (asserts! (match (get payment-asset-contract nft-asset)\n payment-asset\n (is-whitelisted payment-asset)\n true\n ) ERR_PAYMENT_CONTRACT_NOT_WHITELISTED)\n ;; Transfer the NFT ownership to this contract's principal\n (try! (transfer-nft\n nft-asset-contract\n (get token-id nft-asset)\n tx-sender\n (as-contract tx-sender)\n ))\n ;; List the NFT in the listings map\n (map-set listings listing-id (merge\n { maker: tx-sender, nft-asset-contract: (contract-of nft-asset-contract) }\n nft-asset\n ))\n ;; Increment the nonce to use for the next unique listing ID\n (var-set listing-nonce (+ listing-id u1))\n ;; Return the created listing ID\n (ok listing-id)\n )\n)\n```\n\n### Retrieve an asset\n\nCreate a read-only function to retrieve an asset, or listing, by its ID.\n\n```clarity\n(define-read-only (get-listing (listing-id uint))\n (map-get? listings listing-id)\n)\n```\n\n### Cancel a listing\n\nCreate a public function to cancel a listing. Only the NFT's creator can cancel the listing, and it must use the same asset contract that the NFT uses.\n\n```clarity\n(define-public (cancel-listing (listing-id uint) (nft-asset-contract <nft-trait>))\n (let (\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n (maker (get maker listing))\n )\n ;; Verify that the caller of the function is the creator of the NFT to be cancelled\n (asserts! (is-eq maker tx-sender) ERR_UNAUTHORISED)\n ;; Verify that the asset contract to use is the same one that the NFT uses\n (asserts! (is-eq\n (get nft-asset-contract listing)\n (contract-of nft-asset-contract)\n ) ERR_NFT_ASSET_MISMATCH)\n ;; Delete the listing\n (map-delete listings listing-id)\n ;; Transfer the NFT from this contract's principal back to the creator's principal\n (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender maker))\n )\n)\n```\n\n## Whitelist asset contracts\n\n### Whitelist contracts\n\nThe marketplace requires any contracts used for assets or payments to be whitelisted by the contract owner. Create a map to store whitelisted asset contracts and a function to check if a contract is whitelisted.\n\n```clarity\n(define-map whitelisted-asset-contracts principal bool)\n\n(define-read-only (is-whitelisted (asset-contract principal))\n (default-to false (map-get? whitelisted-asset-contracts asset-contract))\n)\n```\n\n### Set whitelisted contracts\n\nOnly the contract owner can whitelist an asset contract. Create a public function to set whitelisted asset contracts.\n\n```clarity\n(define-public (set-whitelisted (asset-contract principal) (whitelisted bool))\n (begin\n (asserts! (is-eq contract-owner tx-sender) ERR_UNAUTHORISED)\n (ok (map-set whitelisted-asset-contracts asset-contract whitelisted))\n )\n)\n```\n\n## Fulfill NFT purchases\n\n### Fulfill listing with STX\n\nCreate a public function to purchase a listing using STX as payment.\n\n```clarity\n(define-public (fulfil-listing-stx (listing-id uint) (nft-asset-contract <nft-trait>))\n (let (\n ;; Verify the given listing ID exists\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n ;; Set the NFT's taker to the purchaser (caller of the function)\n (taker tx-sender)\n )\n ;; Validate that the purchase can be fulfilled\n (try! (assert-can-fulfil (contract-of nft-asset-contract) none listing))\n ;; Transfer the NFT to the purchaser (caller of the function)\n (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))\n ;; Transfer the STX payment from the purchaser to the creator of the NFT\n (try! (stx-transfer? (get price listing) taker (get maker listing)))\n ;; Remove the NFT from the marketplace listings\n (map-delete listings listing-id)\n ;; Return the listing ID that was just purchased\n (ok listing-id)\n )\n)\n```\n\n### Fulfill listing with SIP-010\n\nCreate a public function to purchase a listing using another fungible token that follows the SIP-010 standard as payment.\n\n```clarity\n(define-public (fulfil-listing-ft\n (listing-id uint)\n (nft-asset-contract <nft-trait>)\n (payment-asset-contract <ft-trait>)\n)\n (let (\n ;; Verify the given listing ID exists\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n ;; Set the NFT's taker to the purchaser (caller of the function)\n (taker tx-sender)\n )\n ;; Validate that the purchase can be fulfilled\n (try! (assert-can-fulfil\n (contract-of nft-asset-contract)\n (some (contract-of payment-asset-contract))\n listing\n ))\n ;; Transfer the NFT to the purchaser (caller of the function)\n (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))\n ;; Transfer the tokens as payment from the purchaser to the creator of the NFT\n (try! (transfer-ft payment-asset-contract (get price listing) taker (get maker listing)))\n ;; Remove the NFT from the marketplace listings\n (map-delete listings listing-id)\n ;; Return the listing ID that was just purchased\n (ok listing-id)\n )\n)\n```\n\n### Validate purchase can be fulfilled\n\nCreate a private function to validate that a purchase can be fulfilled. This function checks the listing's expiry, the NFT's contract, and the payment's contract.\n\n```clarity\n(define-private (assert-can-fulfil\n (nft-asset-contract principal)\n (payment-asset-contract (optional principal))\n (listing {\n maker: principal,\n taker: (optional principal),\n token-id: uint,\n nft-asset-contract: principal,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n })\n)\n (begin\n ;; Verify that the buyer is not the same as the NFT creator\n (asserts! (not (is-eq (get maker listing) tx-sender)) ERR_MAKER_TAKER_EQUAL)\n ;; Verify the buyer has been set in the listing metadata as its `taker`\n (asserts!\n (match (get taker listing) intended-taker (is-eq intended-taker tx-sender) true)\n ERR_UNINTENDED_TAKER\n )\n ;; Verify the listing for purchase is not expired\n (asserts! (< block-height (get expiry listing)) ERR_LISTING_EXPIRED)\n ;; Verify the asset contract used to purchase the NFT is the same as the one set on the NFT\n (asserts! (is-eq (get nft-asset-contract listing) nft-asset-contract) ERR_NFT_ASSET_MISMATCH)\n ;; Verify the payment contract used to purchase the NFT is the same as the one set on the NFT\n (asserts!\n (is-eq (get payment-asset-contract listing) payment-asset-contract)\n ERR_PAYMENT_ASSET_MISMATCH\n )\n (ok true)\n )\n)\n```\n\nBy following this guide, you have created a basic NFT marketplace that allows users to list, buy, and sell NFTs using either STX or fungible tokens. This implementation includes essential functionalities such as whitelisting contracts, validating transactions, and handling errors.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/authenticate-users\"\n title=\"Authenticate users\"\n description=\"Learn how to authenticate users using the Connect package in Stacks.js.\"\n />\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n</Cards>" + }, + { + "title": "API keys", + "description": "For developers who need API requests beyond the standard rate limits.", + "slug": "/guides/api-keys", + "content": "\nimport ApiKeysContent from '@/content/_shared/api-keys.mdx';\n\n<ApiKeysContent components={props.components} />\n" + }, + { + "title": "Build an NFT marketplace", + "description": "Learn how to create an NFT marketplace that allows users to list NFTs for sale and purchase them using Clarity.", + "slug": "/guides/build-an-nft-marketplace", + "content": "\nimport { Code, Terminal } from 'lucide-react';\nimport { SmallCard } from '@/components/card';\n\nIn this guide, you will learn how to create an NFT marketplace that allows users to list NFTs for sale. Users can specify the following details for their listings:\n- The NFT token to sell.\n- Listing expiry in block height.\n- The payment asset, either STX or a SIP010 fungible token.\n- The NFT price in the chosen payment asset.\n- An optional intended taker. If set, only that principal will be able to fulfil the listing.\n\nThis marketplace leverages the following Clarity traits:\n- `nft-trait` for handling NFTs.\n- `ft-trait` for handling fungible tokens.\n\nOver the course of this guide, you will learn how to:\n1. Define and handle errors.\n2. Create and manage NFT listings.\n3. Whitelist asset contracts.\n4. Fulfil NFT purchases.\n\n---\n\n## Define and handle errors\n\nFirst, define constants for various errors that may occur during listing, cancelling, or fulfilling NFT transactions. This helps in maintaining clean and readable code.\n\n```clarity\n;; Define listing errors\n(define-constant ERR_EXPIRY_IN_PAST (err u1000))\n(define-constant ERR_PRICE_ZERO (err u1001))\n\n;; Define cancelling and fulfilling errors\n(define-constant ERR_UNKNOWN_LISTING (err u2000))\n(define-constant ERR_UNAUTHORISED (err u2001))\n(define-constant ERR_LISTING_EXPIRED (err u2002))\n(define-constant ERR_NFT_ASSET_MISMATCH (err u2003))\n(define-constant ERR_PAYMENT_ASSET_MISMATCH (err u2004))\n(define-constant ERR_MAKER_TAKER_EQUAL (err u2005))\n(define-constant ERR_UNINTENDED_TAKER (err u2006))\n(define-constant ERR_ASSET_CONTRACT_NOT_WHITELISTED (err u2007))\n(define-constant ERR_PAYMENT_CONTRACT_NOT_WHITELISTED (err u2008))\n```\n\n## Create and manage NFT listings\n\n### Define data structures\n\nCreate a map data structure for the asset listings and a data variable for unique IDs.\n\n```clarity\n;; Define a map data structure for the asset listings\n(define-map listings\n uint\n {\n maker: principal,\n taker: (optional principal),\n token-id: uint,\n nft-asset-contract: principal,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n }\n)\n\n;; Used for unique IDs for each listing\n(define-data-var listing-nonce uint u0)\n```\n\n### List an asset\n\nCreate a public function to list an asset along with its contract. This function verifies the contract, checks expiry and price, and transfers the NFT ownership to the marketplace.\n\n```clarity\n(define-public (list-asset\n (nft-asset-contract <nft-trait>)\n (nft-asset {\n taker: (optional principal),\n token-id: uint,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n })\n)\n (let ((listing-id (var-get listing-nonce)))\n ;; Verify that the contract of this asset is whitelisted\n (asserts! (is-whitelisted (contract-of nft-asset-contract)) ERR_ASSET_CONTRACT_NOT_WHITELISTED)\n ;; Verify that the asset is not expired\n (asserts! (> (get expiry nft-asset) block-height) ERR_EXPIRY_IN_PAST)\n ;; Verify that the asset price is greater than zero\n (asserts! (> (get price nft-asset) u0) ERR_PRICE_ZERO)\n ;; Verify that the contract of the payment is whitelisted\n (asserts! (match (get payment-asset-contract nft-asset)\n payment-asset\n (is-whitelisted payment-asset)\n true\n ) ERR_PAYMENT_CONTRACT_NOT_WHITELISTED)\n ;; Transfer the NFT ownership to this contract's principal\n (try! (transfer-nft\n nft-asset-contract\n (get token-id nft-asset)\n tx-sender\n (as-contract tx-sender)\n ))\n ;; List the NFT in the listings map\n (map-set listings listing-id (merge\n { maker: tx-sender, nft-asset-contract: (contract-of nft-asset-contract) }\n nft-asset\n ))\n ;; Increment the nonce to use for the next unique listing ID\n (var-set listing-nonce (+ listing-id u1))\n ;; Return the created listing ID\n (ok listing-id)\n )\n)\n```\n\n### Retrieve an asset\n\nCreate a read-only function to retrieve an asset, or listing, by its ID.\n\n```clarity\n(define-read-only (get-listing (listing-id uint))\n (map-get? listings listing-id)\n)\n```\n\n### Cancel a listing\n\nCreate a public function to cancel a listing. Only the NFT's creator can cancel the listing, and it must use the same asset contract that the NFT uses.\n\n```clarity\n(define-public (cancel-listing (listing-id uint) (nft-asset-contract <nft-trait>))\n (let (\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n (maker (get maker listing))\n )\n ;; Verify that the caller of the function is the creator of the NFT to be cancelled\n (asserts! (is-eq maker tx-sender) ERR_UNAUTHORISED)\n ;; Verify that the asset contract to use is the same one that the NFT uses\n (asserts! (is-eq\n (get nft-asset-contract listing)\n (contract-of nft-asset-contract)\n ) ERR_NFT_ASSET_MISMATCH)\n ;; Delete the listing\n (map-delete listings listing-id)\n ;; Transfer the NFT from this contract's principal back to the creator's principal\n (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender maker))\n )\n)\n```\n\n## Whitelist asset contracts\n\n### Whitelist contracts\n\nThe marketplace requires any contracts used for assets or payments to be whitelisted by the contract owner. Create a map to store whitelisted asset contracts and a function to check if a contract is whitelisted.\n\n```clarity\n(define-map whitelisted-asset-contracts principal bool)\n\n(define-read-only (is-whitelisted (asset-contract principal))\n (default-to false (map-get? whitelisted-asset-contracts asset-contract))\n)\n```\n\n### Set whitelisted contracts\n\nOnly the contract owner can whitelist an asset contract. Create a public function to set whitelisted asset contracts.\n\n```clarity\n(define-public (set-whitelisted (asset-contract principal) (whitelisted bool))\n (begin\n (asserts! (is-eq contract-owner tx-sender) ERR_UNAUTHORISED)\n (ok (map-set whitelisted-asset-contracts asset-contract whitelisted))\n )\n)\n```\n\n## Fulfill NFT purchases\n\n### Fulfill listing with STX\n\nCreate a public function to purchase a listing using STX as payment.\n\n```clarity\n(define-public (fulfil-listing-stx (listing-id uint) (nft-asset-contract <nft-trait>))\n (let (\n ;; Verify the given listing ID exists\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n ;; Set the NFT's taker to the purchaser (caller of the function)\n (taker tx-sender)\n )\n ;; Validate that the purchase can be fulfilled\n (try! (assert-can-fulfil (contract-of nft-asset-contract) none listing))\n ;; Transfer the NFT to the purchaser (caller of the function)\n (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))\n ;; Transfer the STX payment from the purchaser to the creator of the NFT\n (try! (stx-transfer? (get price listing) taker (get maker listing)))\n ;; Remove the NFT from the marketplace listings\n (map-delete listings listing-id)\n ;; Return the listing ID that was just purchased\n (ok listing-id)\n )\n)\n```\n\n### Fulfill listing with SIP-010\n\nCreate a public function to purchase a listing using another fungible token that follows the SIP-010 standard as payment.\n\n```clarity\n(define-public (fulfil-listing-ft\n (listing-id uint)\n (nft-asset-contract <nft-trait>)\n (payment-asset-contract <ft-trait>)\n)\n (let (\n ;; Verify the given listing ID exists\n (listing (unwrap! (map-get? listings listing-id) ERR_UNKNOWN_LISTING))\n ;; Set the NFT's taker to the purchaser (caller of the function)\n (taker tx-sender)\n )\n ;; Validate that the purchase can be fulfilled\n (try! (assert-can-fulfil\n (contract-of nft-asset-contract)\n (some (contract-of payment-asset-contract))\n listing\n ))\n ;; Transfer the NFT to the purchaser (caller of the function)\n (try! (as-contract (transfer-nft nft-asset-contract (get token-id listing) tx-sender taker)))\n ;; Transfer the tokens as payment from the purchaser to the creator of the NFT\n (try! (transfer-ft payment-asset-contract (get price listing) taker (get maker listing)))\n ;; Remove the NFT from the marketplace listings\n (map-delete listings listing-id)\n ;; Return the listing ID that was just purchased\n (ok listing-id)\n )\n)\n```\n\n### Validate purchase can be fulfilled\n\nCreate a private function to validate that a purchase can be fulfilled. This function checks the listing's expiry, the NFT's contract, and the payment's contract.\n\n```clarity\n(define-private (assert-can-fulfil\n (nft-asset-contract principal)\n (payment-asset-contract (optional principal))\n (listing {\n maker: principal,\n taker: (optional principal),\n token-id: uint,\n nft-asset-contract: principal,\n expiry: uint,\n price: uint,\n payment-asset-contract: (optional principal)\n })\n)\n (begin\n ;; Verify that the buyer is not the same as the NFT creator\n (asserts! (not (is-eq (get maker listing) tx-sender)) ERR_MAKER_TAKER_EQUAL)\n ;; Verify the buyer has been set in the listing metadata as its `taker`\n (asserts!\n (match (get taker listing) intended-taker (is-eq intended-taker tx-sender) true)\n ERR_UNINTENDED_TAKER\n )\n ;; Verify the listing for purchase is not expired\n (asserts! (< block-height (get expiry listing)) ERR_LISTING_EXPIRED)\n ;; Verify the asset contract used to purchase the NFT is the same as the one set on the NFT\n (asserts! (is-eq (get nft-asset-contract listing) nft-asset-contract) ERR_NFT_ASSET_MISMATCH)\n ;; Verify the payment contract used to purchase the NFT is the same as the one set on the NFT\n (asserts!\n (is-eq (get payment-asset-contract listing) payment-asset-contract)\n ERR_PAYMENT_ASSET_MISMATCH\n )\n (ok true)\n )\n)\n```\n\nBy following this guide, you have created a basic NFT marketplace that allows users to list, buy, and sell NFTs using either STX or fungible tokens. This implementation includes essential functionalities such as whitelisting contracts, validating transactions, and handling errors.\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/connect/guides/authenticate-users\"\n title=\"Authenticate users\"\n description=\"Learn how to authenticate users using the Connect package in Stacks.js.\"\n />\n <Card\n href=\"/stacks/connect/guides/broadcast-transactions\"\n title=\"Broadcast transactions\"\n description=\"Learn how to sign and broadcast transactions.\"\n />\n</Cards>" + }, + { + "title": "Using Clarity values", + "description": "Learn how to use Clarity values in your Clarity smart contracts.", + "slug": "/guides/using-clarity-values", + "content": "\nSome endpoints, like the [read-only function contract call](https://docs.hiro.so/api#operation/call_read_only_function), require input to a serialized [Clarity value](https://docs.stacks.co/docs/clarity/). Other endpoints return serialized values that need to be deserialized.\n\nThe example shown below illustrates Clarity value usage in combination with the API.\n\nThe `@stacks/transactions` library supports typed contract calls and makes [response value utilization much simpler](https://docs.stacks.co/docs/clarity/).\n\n```ts\nimport {\n Configuration,\n SmartContractsApiInterface,\n SmartContractsApi,\n ReadOnlyFunctionSuccessResponse,\n} from '@stacks/blockchain-api-client';\nimport { uintCV, UIntCV, cvToHex, hexToCV, ClarityType } from '@stacks/transactions';\n\n(async () => {\n const apiConfig: Configuration = new Configuration({\n fetchApi: fetch,\n // for mainnet, replace `testnet` with `mainnet`\n basePath: 'https://api.testnet.hiro.so', // defaults to http://localhost:3999\n });\n\n const contractsApi: SmartContractsApiInterface = new SmartContractsApi(apiConfig);\n\n const principal: string = 'ST000000000000000000002AMW42H';\n\n // use most recent from: https://api.<mainnet/testnet>.hiro.so/v2/pox\n const rewardCycle: UIntCV = uintCV(22);\n\n // call a read-only function\n const fnCall: ReadOnlyFunctionSuccessResponse = await contractsApi.callReadOnlyFunction({\n contractAddress: principal,\n contractName: 'pox',\n functionName: 'is-pox-active',\n readOnlyFunctionArgs: {\n sender: principal,\n arguments: [cvToHex(rewardCycle)],\n },\n });\n\n console.log({\n status: fnCall.okay,\n result: fnCall.result,\n representation: hexToCV(fnCall.result).type === ClarityType.BoolTrue,\n });\n})().catch(console.error);\n```" + }, + { + "title": "How to sync a Bitcoin node", + "description": "Learn how to sync a Bitcoin node for building Bitcoin applications.", + "slug": "/guides/sync-a-bitcoin-node", + "content": "\nimport { InlineCode } from '@/components/inline-code';\nimport { Accordion, Accordions } from 'fumadocs-ui/components/accordion';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nSyncing a Bitcoin node is often one of the first steps a developer takes when building a Bitcoin application. It's a great introduction to the Bitcoin developer ecosystem, and if you're relying on on-chain data, there's no safer way to get that data than doing it yourself.\n\nIn this guide, you will learn how to:\n\n1. Download Bitcoin Core daemon on your machine\n2. Configure `bitcoind`\n3. Start syncing your node\n4. Properly shutdown and restart your node\n\n<Callout title=\"Requirements\" type=\"warn\">\nTo get started, we first need to download `bitcoind`. In our example, we'll be using version 25.0. You can select a software version compatible with your device [from this list](https://bitcoincore.org/bin/bitcoin-core-25.0). \n</Callout>\n\n---\n\n## Configure <InlineCode>bitcoind</InlineCode>\n\nOnce your download is complete, make note of your path to the `bitcoind` executable.\n\n<Callout title=\"Note\">\nWhen you sync your node, we'll be running the program at `/bitcoin-25.0/bin/bitcoin`, which is where the `bitcoind` executable is located.\n</Callout>\n\nNext up is a couple configuration steps.\n\n1. Select or create a directory to store your Bitcoin data.\n2. Update the `bitcoin.conf` file to include the path to your Bitcoin data directory.\n\nThe Bitcoin chainstate is pretty large, and you need a place to store it. In this example, we are going to set up a directory called `bitcoin-data` on an external hard drive that we have mounted at `/Volumes/SSD`.\n\n<Callout title=\"Note\">\n This folder, `bitcoin-data`, can be named whatever you like, and can exist locally or in an external hard drive.\n \n The most important thing is that it should exist in a place that has enough storage to hold all the Bitcoin data we will be receiving once it starts to sync.\n</Callout>\n\nNow navigate to your `bitcoin.conf` file, which is located in your `/path/to/bitcoin` directory and update the `datadir` field with your directory. \n\nIn this example, it would look like this:\n\n```bash bitcoin.conf\ndatadir=/Volumes/SSD/bitcoin-data/\n```\n\n<Accordions>\n<Accordion title=\"Example bitcoin.conf\">\nYou can override the default configuration with the following, including the path to where you will be storing all of the Bitcoin data once it starts syncing:\n\n```bash\ndatadir=/your-path-to/bitcoin-data/\nserver=1\nrpcuser=devnet\nrpcpassword=devnet\nrpcport=8332\nrpcallowip=0.0.0.0/0\nrpcallowip=::/0\ntxindex=1\nlisten=1\ndiscover=0\ndns=0\ndnsseed=0\nlistenonion=0\nrpcserialversion=1\ndisablewallet=0\nfallbackfee=0.00001\nrpcthreads=8\nblocksonly=1\ndbcache=4096\n\n# Start zeromq\nzmqpubhashblock=tcp://0.0.0.0:18543\n```\n</Accordion>\n</Accordions>\n\nIf you plan to use your node to receive transactions, you will need to make note of the `username` and `password` fields for your node.\n\n<Callout title=\"Note\">\nIn the example `bitcoin.conf` above, `devnet` is listed as the default `username` and `password`.\n</Callout>\n\n## Run the node\n\nWith a finished `bitcoin.conf` file, it's time to start up your node.\n\nThis takes the form of `path/to/bitcoind -conf=path/to/bitcoin.conf`, which in this example looks like:\n\n```terminal\n$ /Volumes/SSD/bitcoin-25.0/bin/bitcoind -conf=/Volumes/SSD/bitcoin-25.0/bitcoin.conf\n```\n\nAfter running this command, you will see `zmq_url` entries in your console's stdout, displaying ZeroMQ logs from your Bitcoin node. Congrats! You're now syncing!\n\n<Callout title=\"Note\">\nIt might take anywhere from a few hours to a few days to run and fully sync, depending on if it's your first time syncing a node.\n</Callout>\n\n## Proper shutdown and restart procedure\n\n1. Shutting down your node\n2. Restarting your node\n\nTo shut down your node safely, use the `bitcoin-cli` executable, located inside of the `bin` directory, and run the `stop` command:\n\n```terminal\n$ /path/to/bitcoin-cli \\\n --conf=/path/to/bitcoin.conf \\\n --rpcuser={{your-rpc-username}} \\\n --rpcpassword={{your-rpc-password}} stop\n```\n\nTo start your node back up, all you need to do is refer to the previous steps from above by running `path/to/bitcoind -conf=path/to/bitcoin.conf`.\n\n<Callout title=\"How to eject an external hard drive\">\n <Tabs items={[\"macOS\",\"Windows\"]}>\n <Tab value={\"macOS\"}>\n 1. Go to the Finder, then the sidebar, and select the disk you want to eject under “Devices”. Click on the eject icon next to the name.\n 2. Wait for a confirmation message saying it's safe to eject the device before you unplug the drive.\n </Tab>\n\n <Tab value={\"Windows\"}>\n 1. Open File Explorer, select the drive from the list under “This PC” (PC > Devices and Drives), and click the “Eject” button.\n 2. Wait for a confirmation message saying it's safe to eject the device before you unplug the drive.\n </Tab>\n </Tabs>\n</Callout>\n\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/chainhook/guides/chainhook-as-a-service\"\n title=\"Run Chainhook as a service\"\n description=\"Learn how to use Chainhook to build your own custom API.\"\n />\n <Card\n href=\"/guides/sync-a-stacks-node\"\n title=\"Sync a Stacks node\"\n description=\"Learn how to sync a Stacks node for running a local devnet.\"\n />\n</Cards>\n" + }, + { + "title": "Build a no-loss lottery pool", + "description": "Learn how to create a no-loss lottery pool that leverages stacking yield.", + "slug": "/guides/no-loss-lottery", + "content": "\nimport { Code, Terminal } from 'lucide-react';\n\nA no-loss lottery contract offers a unique way for participants to stack their assets and potentially earn a larger reward without the risk of losing their initial deposit.\n\nThis contract ensures that participants can stack their assets in a yield-generating pool, receive an NFT ticket, and have a chance to win additional rewards while retaining their original investment.\n\nIn this guide, you will learn how to:\n\n1. Define constants and data variables\n2. Create and manage participants and tickets\n3. Implement the lottery functionality\n4. Handle the selection of winners\n5. Claim and distribute rewards\n\n<Callout title=\"Note\">\nThis example uses the CityCoins protocol for the stacking yield mechanism, but leveraging a Stacking pool using Proof of Transfer (PoX4) can also be used.\n</Callout>\n\n---\n\n## Define constants and data variables\n\nFirst, define some constants and data variables to manage the state of your contract. Constants are used for fixed values, and data variables store the state that can change during the contract execution.\n\n```clarity\n(define-constant OWNER tx-sender)\n(define-constant ERR_UNAUTHORIZED (err u101000))\n\n(define-data-var lotteryPool uint u0)\n(define-data-var totalYield uint u0)\n(define-data-var ticketCounter uint u0)\n```\n\nThe `OWNER` constant defines the contract owner with administrative privileges, while `ERR_UNAUTHORIZED` handles unauthorized access attempts.\n\nKey data variables include `lotteryPool` for tracking stacked assets, `totalYield` for accumulated earnings, and `ticketCounter` for managing issued tickets.\n\n## Create and manage participants and tickets\n\nNext, define an NFT to represent a ticket and a map to store participant information.\n\n```clarity\n(define-map Participants\n { participant: principal }\n { ticketId: uint, amount: uint, cycle: uint, ticketExpirationAtCycle: uint, isWinner: bool }\n)\n\n(define-map Tickets\n { ticketId: uint }\n { owner: principal }\n)\n\n(define-non-fungible-token LotteryTicket uint)\n```\n\nThe `Participants` map links participants to their ticket details, while the `Tickets` map associates tickets with their owners.\n\nThe `LotteryTicket` defines an NFT for the lottery tickets, crucial for managing entries.\n\n## Implement the lottery functionality\n\nNow, it's time to implement the core function of the contract, where participants can enter the lottery by depositing their assets.\n\n```clarity\n(define-public (roll-the-dice (cityName (string-ascii 10)) (amount uint) (lockPeriod (optional uint)))\n (let\n (\n (ticketId (+ (var-get ticketCounter) u1))\n (actualLockPeriod (default-to u1 lockPeriod))\n (rewardCycle (+ (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd007-citycoin-stacking get-current-reward-cycle) u1))\n )\n\n (begin\n (try! (contract-call? 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2 transfer amount tx-sender (as-contract tx-sender) none))\n (try! (nft-mint? LotteryTicket ticketId tx-sender))\n (map-insert Participants { participant: tx-sender } { ticketId: ticketId, amount: amount, cycle: rewardCycle, ticketExpirationAtCycle: (+ rewardCycle actualLockPeriod), isWinner: false })\n (map-set Tickets { ticketId: ticketId } { owner: tx-sender })\n (var-set lotteryPool (+ (var-get lotteryPool) amount))\n (var-set ticketCounter (+ (var-get ticketCounter) u1))\n (ok ticketId)\n )\n )\n)\n```\n\nThe `roll-the-dice` function enables participants to join the lottery by depositing assets, specifying the city (`cityName`), the deposit amount (`amount`), and the lock period (`lockPeriod`).\n\nThis function is crucial for managing lottery entries and ensuring assets are properly locked for the specified duration.\n\nWhen a participant calls this function, the following steps occur:\n\n1. **Generate ticket and determine lock period**: A new ticket ID is generated, and the lock period is set (defaulting to 1 if not specified).\n2. **Transfer assets and mint NFT ticket**: The specified amount of assets is transferred from the participant to the contract, and an NFT representing the lottery ticket is minted and assigned to the participant.\n3. **Update participant and ticket data**: The participant's information, including ticket ID, amount, cycle, and expiration, is stored, and the ticket's ownership information is updated.\n4. **Update lottery pool and return ticket ID**: The total amount in the lottery pool is updated, the ticket counter is incremented, and the function returns the newly generated ticket ID to the participant.\n\nThis streamlined process ensures that each participant's entry is properly recorded and their assets are securely managed within the lottery system.\n\n## Handling the selection of winners\n\nNow, implement the function to select a winner randomly from the participants.\n\n```clarity\n(define-private (select-winner)\n (match (contract-call? 'SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.citycoin-vrf-v2 get-save-rnd (- block-height u1)) randomTicketNumber\n (let\n (\n (ticketCount (var-get ticketCounter))\n (winningTicketId (mod randomTicketNumber ticketCount))\n (winner (unwrap! (get-ticket winningTicketId) (err u404)))\n (owner (get owner winner))\n (participant (unwrap! (get-participant owner) (err u404)))\n )\n (map-set Participants { participant: owner }\n { ticketId: winningTicketId, amount: (get amount participant), cycle: (get cycle participant), ticketExpirationAtCycle: (get ticketExpirationAtCycle participant), isWinner: true })\n (ok owner)\n )\n selectionError (err selectionError)\n )\n)\n```\nThe `select-winner` function randomly selects a winner using a number from the VRF contract (`get-save-rnd`) and updates their status with `unwrap!`. This ensures a fair and transparent winner selection process.\n\nWhen this function is called, the following steps occur:\n\n1. **Fetch random number**: A random number is obtained from the VRF contract by calling `get-save-rnd` with the previous block height.\n2. **Determine winning ticket**: The winning ticket ID is calculated by taking the modulus of the random number with the total number of tickets (`ticketCounter`).\n3. **Retrieve winner information**: The winner's ticket and participant information are retrieved using the calculated ticket ID.\n4. **Update winner status**: The participant's status is updated to indicate they are a winner by setting `isWinner` to `true` in the `Participants` map.\n\nThis process ensures that the winner is selected fairly and their status is accurately updated in the system.\n\n## Claim and distribute rewards\n\nLastly, implement the function to claim and distribute rewards to the winners.\n\n```clarity\n(define-public (claim-rewards (cityName (string-ascii 10)) (cycle uint))\n (let\n (\n (cityId (unwrap-panic (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd004-city-registry get-city-id cityName)))\n (cycleAmount (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stacking get-balance-stx))\n )\n (if (is-eq cityName \"mia\")\n (try! (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd011-stacking-payouts send-stacking-reward-mia cycle cycleAmount))\n (try! (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd011-stacking-payouts send-stacking-reward-nyc cycle cycleAmount))\n )\n (as-contract (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd007-citycoin-stacking claim-stacking-reward cityName cycle))\n )\n)\n\n(define-public (distribute-rewards)\n (select-winner)\n)\n```\n\nThe `claim-rewards` function enables participants to claim their staking rewards, while the `distribute-rewards` function calls `select-winner` to randomly select and reward winners, ensuring a fair distribution process.\n\nWhen the `claim-rewards` function is called, the following steps occur:\n\n1. **Retrieve city ID and balance**: The city ID is retrieved using the `get-city-id` function, and the balance for the specified cycle is obtained from the treasury contract.\n2. **Send stacking rewards**: Depending on the city (`mia` or `nyc`), the appropriate stacking reward function is called to send the rewards for the specified cycle.\n3. **Claim stacking reward**: The contract claims the stacking reward for the specified city and cycle.\n\nWhen the `distribute-rewards` function is called, it performs the following step:\n\n1. **Select winner**: The `select-winner` function is called to randomly select a winner from the participants and update their status.\n\nThis process ensures that participants can claim their rewards and that winners are selected and rewarded fairly.\n\n## Testing the contract\n\nTo test the contracts, use the following steps inside of `clarinet console`:\n\n```terminal\n$ ::advance_chain_tip 700000\n$ ::set_tx_sender\n$ (contract-call? 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.no-loss-lottery-pool roll-the-dice \"mia\" u500 none)\n$ ::advance_chain_tip 2000\n$ (contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stacking deposit-stx u5000000000)\n$ (contract-call? 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.no-loss-lottery-pool claim \"mia\" u17)\n```\n\nTo bootstrap the CityCoins contracts, follow these steps:\n\n```clarity\n(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd004-city-registry get-or-create-city-id \"mia\")\n(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd004-city-registry get-or-create-city-id \"nyc\")\n(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stacking set-allowed 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2 true)\n(contract-call? 'SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-nyc-stacking set-allowed 'SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.newyorkcitycoin-token-v2 true)\n```\n---\n\n## Next steps\n\n<Cards>\n <Card\n href=\"/stacks/clarinet/guides/create-a-new-project\"\n title=\"Create a new project\"\n description=\"Learn how to create a new Clarinet project.\"\n />\n <Card\n href=\"/stacks/clarinet/guides/deploy-a-contract\"\n title=\"Deploy a contract\"\n description=\"Learn how to deploy a contract to a Clarinet network.\"\n />\n</Cards>\n" + }, + { + "title": "DocsKit", + "description": "DocsKit usage", + "slug": "/guides/docskit", + "content": "\n## Features\n\nDocsKit features:\n\n- adds [flags](#flags) and [annotations](#annotations) to codeblocks\n- includes a special syntax for [inline code](#inline-code)\n- adds three components that can be used in MDX: [_`<CodeTabs />`_](#codetabs), [_`<WithNotes />`_](#withnotes), and [_`<TerminalPicker />`_](#terminal-picker)\n- adds a [language switcher](#language-switcher) (which is another usage of _`<CodeTabs />`_)\n- codeblocks with language [`terminal`](#terminal) or [`package-install`](#package-install) are rendered with a different component\n\n## Flags\n\n````txt flags-example.md\n# !mark[/-wn/]\n```js index.js -wn\n```\n````\n\n- `-n` add line numbers\n- `-c` add copy button\n- `-w` word wrap\n- `-a` animate (for tabs)\n\n## Annotations\n\n````txt annotations-example.md\n```js\nconst x = 1;\n# !mark[/!mark/]\n// !mark(1:2)\nconst y = 2;\nconst z = 3;\n```\n````\n\n- `!mark` - highlight a line, a range of lines, or a regex\n- `!diff` - highlight added or removed lines\n- `!collapse` - collapse a range of lines\n- `!fold` - fold a regex pattern inline\n- `!link` - add a link\n- `!tooltip` - add a tooltip\n- `!callout` - add a callout\n\nLearn more about using annotations from Code Hike docs:\n\n- [Annotation comments](https://codehike.org/docs/concepts/annotations#annotation-comments)\n- [Using regular expressions](https://codehike.org/docs/concepts/annotations#using-regular-expressions-instead-of-ranges)\n\n## Mark\n\nYou can use it for one line (`!mark`), a range of lines (`!mark(1:3)`), a range of columns (`!mark[5:10]`), or a regex pattern (`!mark[/pattern/]`).\n\nYou can provide any valid CSS color, for example: `!mark(1:3) red` or `!mark(1:3) hsl(var(--hiro))`.\n\n```clarity\n;; !mark[/Counters/mg]\n(define-map Counters principal uint)\n\n;; !mark(1:3)\n(define-public (count-up)\n (ok (map-set Counters tx-sender (+ (get-count tx-sender) u1)))\n)\n\n;; !mark hsl(var(--hiro))\n(define-read-only (get-count (who principal))\n (default-to u0 (map-get? Counters who))\n)\n```\n\n## Diff\n\n```js\nfunction lorem(ipsum, dolor = 1) {\n const sit = 10;\n // !diff -\n dolor = ipsum - sit;\n // !diff +\n dolor = sit - amet(dolor);\n return sit ? consectetur(ipsum) : [];\n}\n```\n\n## Collapse\n\n```jsonc sample-alert-payload.json -cwn\n{\n \"nonce\": 5,\n \"fee_rate\": \"250\",\n \"sponsored\": false,\n \"post_condition_mode\": \"deny\",\n // !collapse(1:9) collapsed\n \"post_conditions\": [\n {\n \"type\": \"stx\",\n \"condition_code\": \"sent_equal_to\",\n \"amount\": \"3000000\",\n \"principal\": {\n \"type_id\": \"principal_standard\",\n },\n },\n ],\n \"anchor_mode\": \"any\",\n \"tx_status\": \"pending\",\n \"receipt_time\": 1726104636,\n \"tx_type\": \"contract_call\",\n // !collapse(1:11) collapsed\n \"contract_call\": {\n \"function_name\": \"donate\",\n \"function_signature\": \"(define-public (donate (amount uint)))\",\n \"function_args\": [\n {\n \"hex\": \"0x01000000000000000000000000002dc6c0\",\n \"repr\": \"u3000000\",\n \"name\": \"amount\",\n \"type\": \"uint\",\n },\n ],\n },\n}\n```\n\n## Fold\n\n```jsx\n// !fold[/className=\"(.*?)\"/gm]\nfunction Foo() {\n return (\n <div className=\"bg-red-200 opacity-50\">\n <span className=\"block\">hey</span>\n </div>\n );\n}\n```\n\n## Link\n\n```js\n// !link[/foo/mg] https://example.com\n// !link[/bar/mg] https://example.com\nimport { foo, bar } from \"baz\";\n\nconst x = foo(10);\nconst y = bar(x);\n```\n\n## CodeTabs\n\n````txt tabs-example.md\n# !mark[/!!/mg]\n<CodeTabs flags=\"ac\">\n\n```ts !! index.ts\n\n```\n\n```css !! styles.css\n\n```\n</CodeTabs>\n````\n\nNote: the codeblocks inside the _`<CodeTabs />`_ component should have the `!!` decoration and a title.\n\nYou can pass flags to the _`<CodeTabs />`_ component to apply them to all codeblocks inside it. The `a` flag will animate the transition between tabs.\n\nExample:\n\n<CodeTabs flags=\"ac\">\n\n```clarity !! one.clar\n;; !mark[/increment/mg]\n(define-data-var count uint u0)\n\n(define-public (increment)\n (begin\n (var-set count (+ (var-get count) u1))\n (ok (var-get count)) ;; !mark\n )\n)\n```\n\n```solidity !! two.sol\n// !mark[/add/mg]\nuint256 constant TOO_BIG = 10;\nuint256 count = 0;\n\nfunction add(uint256 amount) public returns (uint256) {\n uint256 newCount = count + amount;\n if (newCount <= TOO_BIG) {\n count = newCount;\n return count;\n }\n revert(\"Amount too large\"); // !mark\n}\n```\n\n</CodeTabs>\n\n### Language switcher\n\nTo switch between languages, use the _`<CodeTabs />`_ component with the `storage` prop. The `storage` prop is used to store the selected language in the local storage and sync all the _`<CodeTabs storage=\"some-id\" />`_ using the same `storage` key.\n\n<CodeTabs flags=\"ac\" storage=\"ts\">\n\n```ts !! TypeScript\n(async () => {\n const apiConfig: Configuration = new Configuration({\n fetchApi: fetch,\n // for mainnet, replace `testnet` with `mainnet`\n basePath: \"https://api.testnet.hiro.so\",\n });\n})().catch(console.error);\n```\n\n```js !! JavaScript\n(async () => {\n const apiConfig = new Configuration({\n fetchApi: fetch,\n // for mainnet, replace `testnet` with `mainnet`\n basePath: \"https://api.testnet.hiro.so\",\n });\n})().catch(console.error);\n```\n\n</CodeTabs>\n\n## WithNotes\n\nFor `!callout` and `!tooltip` annotations, you can use the _`<WithNotes />`_ to define the content you want to show.\n\n### Callouts\n\n<WithNotes>\n\n```js index.js\n// !callout[/ipsum/] description\nimport lorem from \"ipsum\";\n\n// !callout[/sit/] inspect\nconst sit = lorem({ a: 1, b: 2 });\n```\n\n```js !inspect\nsit = [\n { name: \"a\", value: 1 },\n { name: \"b\", value: 2 },\n];\n```\n\n## !description\n\nThe default export of the `ipsum` package is a function that **returns an array**.\n\nKind of like _`Object.entries(x)`_ but different.\n\n</WithNotes>\n\n### Tooltips\n\n<WithNotes>\n\n```js demo.js\n// !tooltip[/lorem/] install\nimport { read, write } from \"lorem\";\n\n// !tooltip[/data.json/] data\nvar data = read(\"data.json\");\n\n// !tooltip[/test-123/] apikey\nwrite({ x: 1 }, { apiKey: \"test-123\" });\n```\n\nWe can also use tooltips [here](tooltip \"install\") in [prose](tooltip \"data\") text.\n\n```json !data data.json\n{\n \"lorem\": \"ipsum dolor sit amet\",\n \"foo\": [4, 8, 15, 16]\n}\n```\n\n## !install\n\nThis is a **fake library**. You can install it with:\n\n```terminal\n$ npm install lorem\n```\n\nIt lets you read and write data.\n\n## !apikey\n\nThis is a public sample test mode [API key](https://example.com). Don’t submit any personally information using this key.\n\nReplace this with your secret key found on the [API Keys page](https://example.com) in the dashboard.\n\n</WithNotes>\n\n## Inline code\n\nTo use inline codeyou need to use a special syntax: ``_`code`_``.\n\nThis syntax also allows you to specify the language for inline code ``_clarity`(contract-call? .counter count-up)`_`` renders: _clarity`(contract-call? .counter count-up)`_\n\n## Terminal\n\nTo use the terminal component, set the language of a codeblock to `terminal`, and start each command with `$`.\n\n```terminal\n$ tar -xf clarinet-linux-x64.tar.gz\n$ chmod +x ./clarinet\n$ mv ./clarinet /usr/local/bin\n```\n\nThe lines that don't start with `$` are rendered as collapsed output. The output can use ANSI colors and styles.\n\n```terminal\n$ npx create-next-app@latest\ncreate-next-app@14.2.13\n\u001b[32m✔\u001b[0m \u001b[1mWhat is your project?\u001b[0m \u001b[90m…\u001b[0m my-app\n$ npm run dev\n```\n\n### Terminal Picker\n\n<TerminalPicker>\n\n```terminal !! macOS\n$ brew install clarinet\n```\n\n```terminal !! Windows\n$ winget install clarinet\n```\n\n```terminal !! Cargo\n$ sudo apt install build-essential pkg-config libssl-dev\n```\n\n</TerminalPicker>\n\n### Package Install\n\nYou can use `package-install` as a language to get a picker for JS package managers.\n\n```package-install\n@stacks/connect\n```\n\n### Opting out of the terminal component\n\nTo use features from the normal codeblock component, you can still use languages like `sh` or `bash` or even `txt`.\n\n```sh Terminal -w\n# !tooltip[/v0.27.0/] You can change the v0.27.0 version that is available on the releases page.\n$ wget -nv download/v0.27.0/clarinet-linux-x64-glibc.tar.gz -O clarinet-linux-x64.tar.gz\n```\n" + } +] \ No newline at end of file diff --git a/scripts/build-search-index.ts b/scripts/build-search-index.ts new file mode 100644 index 000000000..63f8275fb --- /dev/null +++ b/scripts/build-search-index.ts @@ -0,0 +1,135 @@ +import { Orama, create, insertMultiple, save } from "@orama/orama"; +import fs from "fs"; +import path from "path"; +import matter from "gray-matter"; +import { cwd } from "node:process"; + +// --- Configuration --- +const docsDir = path.join(cwd(), "content/docs"); // Your MDX content directory +const outputPath = path.join(cwd(), "public/orama.json"); // Output for Orama index + +// --- Orama Schema Definition --- +// Define the fields you want to index and search. +// 'id' is recommended for uniqueness. +// Use 'string' for searchable text fields. +const searchSchema = { + id: "string", // Unique identifier (we'll use the slug) + title: "string", + description: "string", + content: "string", // The raw markdown body + url: "string", // The slug/path for linking +} as const; // Use 'as const' for stricter typing + +// --- Data Extraction Function (Similar to your previous script) --- +interface DocData { + id: string; + title: string; + description: string; + content: string; + url: string; +} + +function getAllDocsData(dir: string): DocData[] { + const entries = fs.readdirSync(dir, { withFileTypes: true }); + let docs: DocData[] = []; + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + docs = docs.concat(getAllDocsData(fullPath)); + } else if (entry.name.endsWith(".mdx")) { + try { + const fileContent = fs.readFileSync(fullPath, "utf8"); + const { data, content } = matter(fileContent); // Extract frontmatter and content + + // Generate slug relative to docsDir + const slug = + fullPath + .replace(docsDir, "") + .replace(/\\/g, "/") // Normalize slashes + .replace(/\.mdx$/, "") // Remove extension + .replace(/\/index$/, "") || // Remove trailing /index + "/"; // Handle root index file + + const url = `/docs${slug}`; // Construct URL path (adjust base path if needed) + + docs.push({ + id: url, // Use URL as the unique ID + title: data.title || path.basename(entry.name, ".mdx"), // Fallback title + description: data.description || "", + content: content || "", // Ensure content is always a string + url: url, + }); + } catch (error) { + console.warn(`⚠️ Failed to process file: ${fullPath}`, error); + } + } + } + return docs; +} + +// --- Main Indexing Function --- +async function buildOramaIndex() { + console.log("🚀 Starting Orama index build..."); + + // 1. Extract data from MDX files + console.log(`🔍 Reading documents from: ${docsDir}`); + const allDocsData = getAllDocsData(docsDir); // Get all potential docs + if (allDocsData.length === 0) { + console.warn("⚠️ No documents found. Exiting."); + return; + } + console.log(`📄 Found ${allDocsData.length} documents initially.`); + + // --- ADD FILTERING LOGIC --- + const uniqueDocsDataMap = new Map<string, DocData>(); + for (const doc of allDocsData) { + if (!uniqueDocsDataMap.has(doc.id)) { + // If ID is not seen yet, add it to the map + uniqueDocsDataMap.set(doc.id, doc); + } else { + // If ID exists, log a warning (optional but helpful) + console.warn( + ` ⚠️ Duplicate ID detected: "${doc.id}". Skipping subsequent entry.` + ); + // You could add logic here to decide which version to keep, + // but keeping the first encountered is usually simplest. + } + } + // Convert the map values back to an array of unique documents + const uniqueDocsData = Array.from(uniqueDocsDataMap.values()); + console.log(`✔️ Filtered down to ${uniqueDocsData.length} unique documents.`); + // --- END FILTERING LOGIC --- + + // 2. Create Orama instance with the defined schema using 'create' + console.log("🛠️ Creating Orama database instance..."); + const db = await create({ + schema: searchSchema, + }); + + // 3. Populate the Orama database with the UNIQUE data + console.log("✍️ Populating Orama database with unique documents..."); + try { + // Use the filtered array here + await insertMultiple(db, uniqueDocsData, 500); + console.log("✅ Database populated successfully."); + } catch (error) { + console.error("❌ Error populating Orama database:", error); + process.exit(1); + } + + // 4. Save the database state manually + console.log(`💾 Saving index to: ${outputPath}`); + try { + const dbState = await save(db); // Get the serializable state from Orama + // Manually write the state to a JSON file + fs.writeFileSync(outputPath, JSON.stringify(dbState)); + console.log("🎉 Orama index built successfully!"); + } catch (error) { + console.error("❌ Error saving Orama index manually:", error); + process.exit(1); + } +} + +// --- Run the build --- +buildOramaIndex(); diff --git a/scripts/fetch-recipes.mts b/scripts/fetch-recipes.mts index 4330aedc0..c7e7b0f14 100644 --- a/scripts/fetch-recipes.mts +++ b/scripts/fetch-recipes.mts @@ -31,13 +31,11 @@ async function getGitHubFileList() { async function fetchUrl(url: string): Promise<string> { return new Promise((resolve, reject) => { const handleResponse = (res: any) => { - // Handle redirects (status codes 301, 302, 307, 308) if ( res.statusCode >= 300 && res.statusCode < 400 && res.headers.location ) { - console.log(`Following redirect to: ${res.headers.location}`); https .get( res.headers.location, @@ -81,31 +79,24 @@ async function fetchUrl(url: string): Promise<string> { async function main() { try { - console.log("Creating cache directory..."); await fs.mkdir(DEST_FOLDER, { recursive: true }); - console.log(`Fetching file list from ${REPO_OWNER}/${REPO_NAME}...`); const fileList = await getGitHubFileList(); if (!Array.isArray(fileList)) { throw new Error("GitHub API did not return an array of files"); } - console.log(`Found ${fileList.length} total files`); const mdxFiles = fileList.filter((f) => f.name.endsWith(".mdx")); - console.log(`Found ${mdxFiles.length} MDX files`); for (const file of mdxFiles) { - console.log(`Fetching ${file.name}...`); const fileContent = await fetchUrl(file.download_url); const filename = path.join(DEST_FOLDER, file.name); await fs.writeFile(filename, fileContent, "utf8"); - console.log(`Successfully saved: ${file.name}`); } console.log("All recipe code blocks fetched successfully."); } catch (error) { - console.error("Error fetching code blocks:"); console.error(error); process.exit(1); } diff --git a/source.config.ts b/source.config.ts new file mode 100644 index 000000000..04cbd83f8 --- /dev/null +++ b/source.config.ts @@ -0,0 +1,33 @@ +import { + defineConfig, + defineDocs, + frontmatterSchema, +} from "fumadocs-mdx/config"; +import { remarkCodeHike, recmaCodeHike, CodeHikeConfig } from "codehike/mdx"; +import { z } from "zod"; + +export const docs = defineDocs({ + dir: "content/docs", + docs: { + schema: frontmatterSchema.extend({ + llm: z.boolean().optional(), + }), + }, + meta: { + // options for `meta` collection + }, +}); + +const chConfig: CodeHikeConfig = { + components: { + code: "DocsKitCode", + inlineCode: "DocsKitInlineCode", + }, +}; + +export default defineConfig({ + mdxOptions: { + remarkPlugins: (v) => [[remarkCodeHike, chConfig], ...v], + recmaPlugins: [[recmaCodeHike, chConfig]], + }, +}); diff --git a/tsconfig.json b/tsconfig.json index 47d1cd9d3..4fd260f7f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,12 +10,13 @@ "noEmit": true, "esModuleInterop": true, "module": "esnext", - "moduleResolution": "node", + "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", "incremental": true, "paths": { + "@/.source": ["./.source/index.ts"], "@/*": ["./*"] }, "plugins": [ From 3baca884b387ccdb0d96db8883ae08cbe0c1a0f3 Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 11:55:28 -0500 Subject: [PATCH 09/21] add shared content --- content/_shared/api-keys.mdx | 37 +++++++++++++++ content/_shared/contributors-guide.mdx | 62 ++++++++++++++++++++++++++ content/_shared/rate-limiting.mdx | 30 +++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 content/_shared/api-keys.mdx create mode 100644 content/_shared/contributors-guide.mdx create mode 100644 content/_shared/rate-limiting.mdx diff --git a/content/_shared/api-keys.mdx b/content/_shared/api-keys.mdx new file mode 100644 index 000000000..3a9e285d3 --- /dev/null +++ b/content/_shared/api-keys.mdx @@ -0,0 +1,37 @@ +Developers have open access to Hiro's APIs without the use of an API key, but are subject to [Hiro's rate limit policy](./rate-limiting). For developers who need access beyond these rate limits, we provide API keys. + +<Callout title='Where can I get an API key?'> +If you're interested in obtaining an API key, you can generate one for free in the [Hiro Platform](https://platform.hiro.so) by creating an account. + +If your app needs more than 500 RPM, please [contact us](mailto:platform@hiro.so). +</Callout> + +## Usage with cURL + +The API key is passed in the `header` of your HTTP API request with `x-api-key`. + +```terminal +$ curl https://api.hiro.so/... -H 'x-api-key: <your-api-key>' +``` + +## Usage with Node + +This snippet shows how to perform a `fetch` request with your API key by including it in the request headers. + +```ts fetch.ts +async function makeApiRequest(apiKey: string) { + const url = `https://api.hiro.so/<your-api-endpoint>`; + const response = await fetch(url, { + headers: { + "x-api-key": apiKey + } + }); + return response.json(); +} +``` + +<Callout title="Caution" type="warn"> +The API key is passed in the header of your HTTP API request and is used only for private use, like in server-side applications. + +If you use the API key in your client-side application, attackers can capture it using the client tools (E.g., browser console) and abuse your API key. +</Callout> diff --git a/content/_shared/contributors-guide.mdx b/content/_shared/contributors-guide.mdx new file mode 100644 index 000000000..48d9139fa --- /dev/null +++ b/content/_shared/contributors-guide.mdx @@ -0,0 +1,62 @@ +import { Steps, Step } from 'fumadocs-ui/components/steps'; + +<Callout title="Install the GitHub CLI"> +Some examples use the `gh` CLI package for creating issues and forking. To install that package, [click here](https://github.com/cli/cli). +</Callout> + +## Issues + +If you find content that is obsolete, technically inaccurate, or unclear, start by creating an issue. + +This is a great way to give specific feedback and ensure the technical content is up-to-date and technically accurate. + +```terminal +$ gh issue create +``` + +<Callout> +For creating an issue via the web, go [here](https://github.com/hirosystems/docs/issues/new). +</Callout> + +## Pull requests + +<Steps> + <Step> + To suggest more comprehensive changes or make updates yourself, feel free to make documentation changes by forking the repo and then submitting a pull request. + + Fork the repo and clone it. + + ```terminal + $ gh repo fork hirosystems/docs + ``` + + <Callout> + For forking via the web, go [here](https://github.com/hirosystems/docs/fork). + </Callout> + </Step> + <Step> + Create a new branch and make your changes. + + ```terminal + $ git checkout -b my-branch + ``` + </Step> + <Step> + Commit your changes with a message with a brief summary message: + + ```terminal + $ git commit -m "commit message" + ``` + </Step> + <Step> + Push up your branch: + + ```terminal + $ git push origin my-branch + ``` + </Step> +</Steps> + +<Callout title="Pull Request Guidelines"> +PR titles should be descriptive enough for reviewers to understand *what* is being changed and have a description that explains *why* the change is being made. +</Callout> diff --git a/content/_shared/rate-limiting.mdx b/content/_shared/rate-limiting.mdx new file mode 100644 index 000000000..6fd825cf1 --- /dev/null +++ b/content/_shared/rate-limiting.mdx @@ -0,0 +1,30 @@ +## API rate limits + +The following rate-limits (in requests per minute, or RPM) are applicable for all Hiro APIs as of [November 2023](https://www.hiro.so/blog/updated-rate-limits-for-hiro-apis): + +| API key | Rate Limit | +|:--------|:----------------------------------| +| No | 50 requests per minute (RPM) per client IP, for unauthenticated traffic | +| Yes | 500 requests per minute (RPM), regardless of origin IP, with an authenticated API key | + +These rate-limits apply to the entirety of API traffic, regardless of whether it's from one or all of these APIs: +- [Stacks Blockchain API](/stacks/api) +- [Token Metadata API](/stacks/token-metadata-api) +- [Ordinals API](/bitcoin/ordinals/api) +- [Runes API](/bitcoin/runes/api) + +These new rate limits help us ensure fair usage of Hiro APIs and provide the best possible service as our community of developers and applications grow. + +<Callout title='Need an API key?'> +You can create one for free in the [Hiro Platform](https://platform.hiro.so) by creating an account. +</Callout> + +## STX Faucet rate limits + +Note: this faucet is for Stacks testnet and provides testnet STX, which has no monetary value. + + +| Type | Rate Limit | +|:-----------------------------|:-----------------------------| +| Stacking requests | 1 request per 2 days | +| Regular STX requests | 1 request per minute (RPM) | From 067be5fb18746f4e90ffdf838004c4920e9114f8 Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 11:55:36 -0500 Subject: [PATCH 10/21] add types --- types/index.ts | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++ types/nav.ts | 16 +++++++++++ 2 files changed, 93 insertions(+) create mode 100644 types/index.ts create mode 100644 types/nav.ts diff --git a/types/index.ts b/types/index.ts new file mode 100644 index 000000000..68ff437a2 --- /dev/null +++ b/types/index.ts @@ -0,0 +1,77 @@ +export interface HeadingProps extends React.HTMLAttributes<HTMLHeadingElement> { + children: React.ReactNode; + id?: string; + className?: string; +} + +export type RecipeType = "typescript" | "bash" | "clarity"; + +export type RecipeCategory = + | "stacks-js" + | "clarity" + | "bitcoin" + | "chainhook" + | "api" + | "clarinet"; + +export const CategorySubTags = { + "stacks-js": [ + "web", + "authentication", + "transactions", + "signing", + "smart-contracts", + "utils", + ] as const, + + clarity: [] as const, + + bitcoin: ["transactions", "signing"] as const, + + chainhook: [] as const, + + api: [ + "token-metadata", + "signer-metrics", + "rpc", + "platform", + "ordinals", + "runes", + ] as const, + + clarinet: ["testing", "deployment"] as const, +} as const; + +export type SubTagsForCategory = { + [K in RecipeCategory]: (typeof CategorySubTags)[K][number]; +}; + +export type RecipeSubTag = SubTagsForCategory[RecipeCategory]; + +// Base metadata from front matter +export interface RecipeMetadata { + id: string; + title: string; + description: string; + date: string; + categories: RecipeCategory[]; + tags: SubTagsForCategory[RecipeCategory][]; + dependencies?: Record<string, string>; + external_url?: string; +} + +// Code blocks extracted from markdown content +export interface RecipeFile { + name: string; + path: string; + type: RecipeType; + content: string; + snippet?: string; + preview?: any; +} + +// Complete recipe with content and extracted files +export interface Recipe extends RecipeMetadata { + content: string; // The full markdown content + files: RecipeFile[]; // Extracted code blocks +} diff --git a/types/nav.ts b/types/nav.ts new file mode 100644 index 000000000..047950ada --- /dev/null +++ b/types/nav.ts @@ -0,0 +1,16 @@ +export interface NavItem { + title: string; + href?: string; + disabled?: boolean; + external?: boolean; + label?: string; + description?: string; +} + +export interface NavItemWithChildren extends NavItem { + items: NavItem[]; +} + +export interface MainNavItem extends NavItem {} + +export interface SidebarNavItem extends NavItemWithChildren {} From 7b06264ae5abe15c8e979bf451cedd9119179f63 Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 11:55:45 -0500 Subject: [PATCH 11/21] add fonts --- fonts/Aeonik-Bold.woff | Bin 0 -> 49764 bytes fonts/Aeonik-Bold.woff2 | Bin 0 -> 45340 bytes fonts/AeonikFono-Regular.woff | Bin 0 -> 38724 bytes fonts/AeonikFono-Regular.woff2 | Bin 0 -> 36260 bytes fonts/AeonikMono-Regular.woff | Bin 0 -> 33308 bytes fonts/AeonikMono-Regular.woff2 | Bin 0 -> 31600 bytes fonts/Inter-Medium.woff2 | Bin 0 -> 111380 bytes fonts/Inter-Regular.woff2 | Bin 0 -> 108488 bytes fonts/Inter-SemiBold.woff2 | Bin 0 -> 111588 bytes fonts/index.ts | 74 +++++++++++++++++++++++++++++++++ 10 files changed, 74 insertions(+) create mode 100644 fonts/Aeonik-Bold.woff create mode 100644 fonts/Aeonik-Bold.woff2 create mode 100644 fonts/AeonikFono-Regular.woff create mode 100644 fonts/AeonikFono-Regular.woff2 create mode 100644 fonts/AeonikMono-Regular.woff create mode 100644 fonts/AeonikMono-Regular.woff2 create mode 100644 fonts/Inter-Medium.woff2 create mode 100644 fonts/Inter-Regular.woff2 create mode 100644 fonts/Inter-SemiBold.woff2 create mode 100644 fonts/index.ts diff --git a/fonts/Aeonik-Bold.woff b/fonts/Aeonik-Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..bb2013b68ca061d0133c006566bcc54bb3f91adc GIT binary patch literal 49764 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≫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 G_<sQY&<)4{ literal 0 HcmV?d00001 diff --git a/fonts/Aeonik-Bold.woff2 b/fonts/Aeonik-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..650c0d1a2fdbf25067a0413b252dd816dcf73a79 GIT binary patch literal 45340 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 Q@vSO^1^nO5#D=c`0JYF3g8%>k literal 0 HcmV?d00001 diff --git a/fonts/AeonikFono-Regular.woff b/fonts/AeonikFono-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..d61b0a2e10d5ad816fba41aec6dd51f065cdb4c9 GIT binary patch literal 38724 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 Te*_sPbie=r00001000009&tqA literal 0 HcmV?d00001 diff --git a/fonts/AeonikFono-Regular.woff2 b/fonts/AeonikFono-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3c27b1537c7fc6aa0820d2d60faccd6ebe2ef021 GIT binary patch literal 36260 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 literal 0 HcmV?d00001 diff --git a/fonts/AeonikMono-Regular.woff b/fonts/AeonikMono-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..3930fb4fe8e3e35dd511a99468ff03220f29ea33 GIT binary patch literal 33308 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 ggwniG@#VQ>CB?a; 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ˁWtY?ubDFDp~I=tk9Q1$($3Nwvwx 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 F006$+$`Jqn literal 0 HcmV?d00001 diff --git a/fonts/AeonikMono-Regular.woff2 b/fonts/AeonikMono-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c72742841da25f2dbc27a6f005024262cc6939ba GIT binary patch literal 31600 zcmV(~K+nH-Pew9NR8&s@0DEu%3IG5A0K{|v0DB_<0RTY&00000000000000000000 z0000Df}|Q8n_3270IWO#HUcCAi8cfV1&??KARE2IXCfWL`&x(sy6H9~IM3-c&1zUR zvT{41lxX2`W+NKdH~<9`r_KKV|NrEqB4d>XZQ8N10icR^{vUM-VLd&|T%nd&`oM~< zl-=%uAVtt&b0l^g5KcS_(UaBJ!h~dg`<FeOy}iGBNj&O|bXR-hiGpI?Ud&tY9n~Z* z`kBwZU1>94q(+pF%}geVNt)VznD3drA@Q3?3{x9*r|#69IzQ=Xy|r%VyL<QV9_W4% zR|_VD@Z*ROlX2oG%<)Du7urqU7xz0^acY>wr?-JMxO<Ks)K?;`pF@~2qaJW`s*(6z zgTym7o4Fx~Oc=S)lE`e|+$MhKhV3w6d$%$}W(m}@n3AT+sz#Z#j|u;b>`_O}u*GP$ zGBQ!&V_9uC^VI+3Z{%7wTlj<Sx~Ec?X>m8N@5L(rgP7pNZ`k<)+lIYpbkqw^Kx_Lq zvv*`$xSZ99O}5b(5sms2vkLhCAAA1yW3GKv&{q_rv5H_8jKyS)zjezmHvk5BJ^SQk z7%P%k880#f2@+ZCAjr^4su8O8uFfl^bRasyS)J^TrB1hXc8?leLv^cbbw<bk=W3H4 zEX`i5ZNtYsl;G`nUbp@)3%T*l|3){nY~u}qZMwZj-G;4|*bpxkEckY9B`S7GQz2kz zkyR`Wk)DLCh!8Q0yIAJnNp|nqU$u0hGOsZ6snuUd2eJyu>EgW`nCFG~5c9y>Zcl7K z>W0w#!$TOlk&^oZ63k8i|4FBX761QpU@O`;XIDB%xE5^iMkY9-1>0$@D6Nr=No(CW zh*C|J#SF%SkP*eL=l;o?NqFFY9R7Wq8-Tn@MxMTq=O%ms$!bbLegoHR**JXR0+Cm^ z%32pd0GtC~vX(7V*%LC^AQRv^)z^+O_|9c%S?=!j;hD;`ZLLHDGFAplJ^@oQ|KFVb zX4zyo(?9m)$>hwvD=JhBm57!IgrMF!)_M?)8Nq{C5YZLUJ3T|o)WmdOTuY-4ILX~Z z(_SB#+`EBd^?GDy)SQ|BJilg@+M<5V{@eR^w%+`autmj*I3c3MfrujB?ZjlD+he2! zS}mc|#3qmsF|<;c1}PwgSX9rWZ>3S4^I&YHO9%oXDu##K(<Ue|IM6mXI5|OKC*KB~ zMHW#tq18P+Iy*a|K%sX8TrJh%TDv1dGxVZNzq|Kmd-vS#UH@HLT6?ARmC#8@6BM(+ z1Te!iRvHR~0ThPd{9mf+bq3f%a9v2(EosH>^x>9L+UbZt04dIZTV|*&0Hw7EaSJFp zPXOhOK*^h08$n9D0$0uxBsou%o5*#O(j=c!`l<9=o^MG`Io)zSmVPvpc<O=99xxyn z&{_dEtXpQm)QTDCe7?2R?%aP9qE)S<DNW1596Qn1=Z^w&a~Gn`rUVIZ8^Q~qEuaKc zb#x^HRas#w$yYgD9;)Rx{gZNYSG85|BJ0ieKyJd+4j}|#qeMuY4(=RZNRn|LqTvCJ ztiuN%;e_WQ27p0L8|~D`r!2tbv?fkt!-lNY?GqEUiMG%WZxAI@(@JSwLvU%h5dj_| zm!>&G%$GWh%{q3l(DVGrl~JfT?HQ<G&VQBG9FVZn!2StJ$@LDwqR9RoZ=XgeOrvvQ z`L)4NB52zm3_|oh!;ioHn6>W#&*V4x)p*8ZZ%^Kw``4A|iEp>yUEaJ$^S7Yfo_k6e z_21b5X8#)OaKH^8xtR(psl2M9BuLXhOYL>l+dw0%+3J8(uDIcz2c9|Wirb!f<FkVO zA7U@A;vFtx)Yu8~Oq8@WMHX918RfUN9jU9Xv17G$s-CVl+;n$)-0ME|dysVf7vrh{ zn%AcGbsL*ev|`=hWSR05t5_#8KDQP!Tnul+F(N}4MWbQ#j3qywEFz_#q^XZ2XXfM= zlTuIv!!S&NOe2vWi~~ZOH(Y*ttqrl`LqsP`mKsAum~apyLk$270S%Xgn!95$X?PG! zi3THGl8S~b*l<dr3iVp`7&d2BNK!%F$kJEq*bQatE+SJ)l&jrB>KsL@N2QlE^qD$} zN^3Nm+&FXl<xP7}T%O)LJOf)RB$R0}#DWumMIl6jJT<z&2vMNNO^6&dP*^lvG6t8( zxFn?&yUz8?YnriUPfUqwO*#!2w=5tor>bLYWh5N^!<_VBfKd1^yaDgQSI`Z5!*G}Y zlVCnX!#dao32*{(p#<un3+@7*XEQo`nN+og*~7Th%+i%=H=i_PfikrsQ;Vy*ZSL-M z?r`}PR^N2)Q4?n@y3ERJZ8&_=X=a{h;iXnwW9XR4vljl>U*6NNCC1&GYdcfdF6>NQ z+_y7z^}^27rCU2wmt&|n#_a~23U5mg#?kgZxRP-f-0w99ogLm!>Pk~ZobGzbTzANM z@2Rt{t3cl8A^VNE-*AF`IqXahXHV>}92RdK4MC6kcaKkInr+EmqR0H;I6WEn=}ggM zVd^5=p}MUzCTH>@bI}kT94;05!ew1JfR-jg$v2}iH<j8^bkVItPcg!+z~j3i=<^X_ zIaH5J35v=dZ2z8b+r3_D4)=|FB@XvG%Om&Xk?UVQ28A&`dP2oS>AAD@EH9&1UVI{e z)54lE0`dHtyFKh+*ztQGJi4=f8Km=clFMU#Spth3;sH~Yz)}af&%h4o0q!V@2pqyK zz7#&K`h90xuTrnriQ*$UT$~N+EfJ&>^nf6_g6>n)S5Yqs!%5(w_kAmF>g{?68ZcHY z4roqIe~5#S=E)zxJMjy;#h-#Aas>9|qCRQdsB108!fhFDh~03IbU-!~i0IUeR_Zej zY0nNx8eAr<+mR=PS-7V42u_rc7GnmAR4w6#OO{M%mM5#SGTVeB^4B+HwoFm}HqpRr zDWm*Tt^9TD^*jXiSIc60rY-dq|LUzh$ime30tgTY1S}}Vbd)$)l{Z#UYsg0aQRXz) zift$VsFK&WG;Y+BrdgqgDa7mLb~5?;4TU;KBd;VNm#2YZPK@N5_Gqikg34*%8nYF2 z#gw3+3%Z(p#wtGpr$MG!@whiDDXL1krkP$=Fvk!nRT<1BEq$8FiWCBwbg`|q_3X%H z^#T%Xr?stZGz4cAO6`N91R~i_H10b?P<sUlhbkjv>_&=^>aN$ojli`Q6nVY@^y#7l zaM(kz4>&)<{F37)ZPc^2MlSb}y|688zy+aDjMxahZ<rM0cN1}lBM2HG$H%+TqLTQ_ zu2S@^YtXbjm4LmSskeF7A@|tlyJN8K7nMqZU7PM9SZ-}|=+zJlm|_G30u1UV1qc2> zo`X^r{;4-cd(F}uKg{t^VMcowA<y7ri8vp^J_WJCa7Dn!5n}?L^ZaXR6f*)u&<Q{( zGDpCmPvHT6GC)`gk0&Ac-d&iwkbT6?C|v-kS~o0Pp9Ck#H8m<DP%v=UPiI-hRiY4c zpMq=24dl9|%w5~a5nqsu{}+fs5i)9Z5-}y%fVNecJ~~=H0(C4Yf0~*SGqrJ6r%_Zi zJdMfYlVeJ8A&6pUW{*(n@{+xry@puWDI`aKRtcEayQ2hh5SbHrA8|!Yd4^3}ODO<D znr*D1cvr#G?4;6I_81AbpqVWF1XUHN%A~Z&pD;UE%j^?hT<%)%R({utf>CUE&Ydb< z8G}L`R@cJw^q$BWn|4eLR-9@%chj;ll*ORVG8a%-RK`bjc1r{S4hhPC47Q>t$<IC3 zIH=B?Q$Lg`E<H56?me}il^~QhVFhY!U7!P~i!DS`S!_pJH1sF2eD=&aYJ_0?8AN-Q zzsLcpoVsfLq3g<%Chg3LkDBAJS8v}Ig80p)$=$3)vr1vFGrL5LW;0?T4S8cQp^nkp zFBh13T4&he*96hNV&P?_&Qs98z4P1aw%@*>RHatjuIg%SwkN%xuI8KXqL#dj9oo~q z*_Y+q)LRKU!L7cKOTGNtb5+-H7q0K#-|}VOxBZiuL?y#CntS%_J)|k~aOCn3!f472 zSlq0`C3Q_x<~%cIN#q{g{!c|qUof#?+q*i+a#yGslAKdi)ANmfmFqRSL$5~P)co3! z6K8I`efaeGTca~e8#{-`He+dS10(~}X9J0VPM9oHsPU1c3kHox{IUWz=(@6Phgx;% zlTuJKsA<89U13RO8g=M5V!@7tih+fl@AX&TL*1?ZRsFl#UmdAVQs=-zSPo$j1Fymw z*aX{Qhx*BF+WAr4uclLfzfsTi82dl1trlxmt2#L=D_PT;WrdI#N1MrHO~!QeSr$l` zuyy$Dh7nkBoIPh@KNijA?+8bB+Rergg|i-F^70$N!D{$A$gmzB%Q(g_AH&vRYEg3U z4mj62t_;~(7)vu0<0>Pbr0r$5Ob{EUTgeQA=mMLw$@1k-e*gwpNiGyv>59T=5X6j! z$fuJuae3I23&qZ%$u83d07q&%_`79g^WzS)fnz?Moo4gN?w(rUhg}}u;f1#VXJgw4 zmSj)p+VHT37(5n%ERNx|STxD14O(^T^=T1f4?$draF1fQ@uklmu4`+z0@58URZr)| z^X=`lj}cX&7vGx`!TZo_&-e{2(`xi|TQlVH^mKJPU^~_oA(%GJDkVj3nR<oP(k<q8 zx5g}&Yf|J1mJ~N6AFH^N`B1dl+S_Zhcs$l*ktkUsgqpACIF(MA3~qO-L7_-Zm&;A* zZIE>60WU@<6M40l^yb`wjrH)X4^}D?H5cJNtm)M7c$+O(b{ja9>Yb78L7XwGkI}|c zGW>s?r+Y94XV#gaOqk-^Vw$eNc`YSt4fk3&sfP5##I*DzO<JSjG7Mv_y4kN9_jKeE zkaxAi=w;I8tupQDKiS{}iBTthH0nFtaSI639>tJ1!RrcKZhWnVje_jCc(GdAl$&zP zU~mwbVpm{*P!U=Va#%;3TRL1Vc^U3wSi8RkzE*mJ^uwv*eAm>}OJ@V6nzWot@RJ)A zRo98a!=64{OJ4F#kj1j^5w}HgX2+j>!S_tyzKv!@hP*f`BY3<1;>?e?qKanQA|BdT zf3ff$WCWwdN80k*I^yyncQ4?K>^BQ;)s{fOVJbc?tt>7g=B6nmKpWsLXC2+J3UC|K zl45R*Lc+hJt@>q9O;eOe*+SEun=ey5-9BQ_<K>0Tht0Z{t}b2nrj*PaDbx;r(`>L2 zInim07YkK!>gKHncNrBtAU79-Z4$fiKc*6YgyWVe%dE+%=_(~bsz=XSV{FAXNgbv) z=iA#pwFRog&Zx%Ei-^ezbGaG;g5;7u+DiIlR~1JnK(16r<XMI5?pe{^qnPYIBl)^M zBPJfO5-#dbI$-?D#CiMwCWA3KFN@(YhfDFs8fMM?6+Wi9>ZdGZ$C?fEk?T^4WQ)9T z6Cr1;N~Kt1LW?ZrS;FfICAv^*VzbNeXaSeTjgNjT*Ll=;_HCYnhZ*Z1X!|1x$wOex z>uuAXLv)k^tY>iYl`(@++@D?9WoZO6Y+7?~jLtpKd(7}Y<nH6&m2;}k4yZ2k0uMop zFa}v>iee_cM<Q*rDmLt#ViM7NRB@aG-SPn{bDa@`Gv%LN(W+3dIo!~#wQ`9GCd!P+ z0<~5=pqBeNVcEnIKPuR1CY?<ck)DpArm2dkex0EvF7iW3%4#Vvv6CO0DX&R{$)%hG z!h}DZ9H%%SFoB_HW33$yn)K<VV3#MI^@yEkNOKqst~I}mSXFw43Tk1bIg|rGU&#J< z(fO@5GJb6(JxKE`&&i%G4$Te>jEfIB!hy}>!15w}4d}suQiEu8!KpAARyygiWFxR! zt|HJ9wAv(nI{ot2XII?nc)4s^z!+&*Soce1XO0+~Z^ER#71yp1%jXCM>g>j&mq550 zy!D*I;YqMWojA)`QHXD5i;WWSO6<n<Tw-}~WQWj2XgYOz$dPj-_8S|0>onYy{zln^ z`0uP;X19pLO_R)WR<z2L#DMN}`}<)U@90sO7^3iw=L!?);=%`3aVB0Bb<OG5VdAAF zxa4)4PX4_|LGXN=j7ch;`aG`MGxvD+sEvR!pb}^!CP;@Td*<h7AH3imo?r*Nvj-+t z_V0wm^tcofTrFkpB1L*jR^bEE95s5WoC}sN*dO94Hh&Y^?}?Dm!)6#aoMy)QP?}Ve zlMAgPV@EaaCC>Y0SZi84_*S|I)CK5Vw7{z{q5!l4Ewy-Lpl7XL;TmhTkqrLWO0J1! z?}*{&GGQ0T`(b2{$pJDa#!d-!(y)$xP3s3GzfZsKNta)YLxp=5skIv^ThFy$*qdWH z`hiM1*e+(H08$svD_r0jr$xy_z&?q@0XSo`N}=RkIPIu5>zg2k2%+KdCm_yU|KL zF8UJg=rmJet?aL*o|b!6>KmN3uE>jav&fX8(2KLJ=Z|!@m}qZCb{s;V|KObC0-@ej z%U7fGrGR6%>wIpVJok-F-r+^FwvFIr#)T)pXACFzU8k=W#xR<@o&aP(Q_6@hl(3s5 zo#(;8&%b9T5{+M2>1jX-GgIhl3tCf@<&Oi3M4zK_(95Yu{T@j^!Tp{{u+=FApQl*6 zITsEn7QnUoMH@{NCp0lStQrtjX*FV+;@VX4478a>dah7ty86A9FpVCb?(9)a;34k8 z(1g!bEj+m(w!;(T$6qm)^l4#J&Lu-?!^@Vb&6L@Z0ozRSo|8we9tf+5`ke_Xxg2Fc zerKDn&RM-}oshG1#-^ANVPC(YRYn-)8SJBKcf<lrBNLT!n|uRr^VO>GKB9^zx`myo zJ`26G7N~MySQL>NH@igZNgJnb21+RC4ad$6ROAOY-*C2&0@dA9(0dTqf4KYVnN~70 z6wr_%D1syK-5oMQEQg$k*vXx_u+3MgDd~!(r5@vTqEFpy8nbMAtM{YkijKGFbL&Ok zp?GJ5N`_+9ND0j<g`Ik($&1qdee{j5D7zbr-4q4i(&mqL*3unud4BwoL(E!@)ka%Z zI_n$0Pct4#1bpmTAdW1D86jIzb!xFD#9OYnpfg2)<y&-LNG5DEIx<Ojubq3uyJyw_ ztb`bmM7;`CK~Fa=<i8G=K%g}<GF4(C*tYLhXr=**T##~&xJiuHH^gXvKa${#*l#5W z95~i!p!!Zsb&?(YA_F~rjGAGxRCV}XBhd`w31)GJjcI?}Z*lTqEIHmnY+j4|RSvGT zP~sJo4y}zxCpT@Ipw&)t8m`C$qwLBP(#PdKklWpYvnhwF5t&4v`oO?&NKP2Zk}U6% zQI7vzYTSo|isFMDHzE9FfT$kvb;g_@&7en#3b|cxSrJbREOnjqyo#uk6&V)-wse^! zl}wQdY56pw$wXl?F^^%2l=$T;+X$P4sq5y+wAdDt=Zvuf&5ni4Whe9FUCC1R2n$ah zC|-7CO6ZQg$!ht2=9*+ZS|>dA4Q%|)WMRwkSF(eDCN4%6veo}gU6%;Ejx3V;`b+Rj z_`m2M4%q)Vxc-mdBL|+2k)t@G^*D}_6B*Je9M|c`2`+HbACX?hDRSk5)8tOhXx__o z{5k#*J;hmn!uSBitURMOI7eROe7(X&^!obz`U&}ndcq6})$j!_udk>#^36e+DFK6P z%>p+zt1wHaw=ugq7AvW}!5!+X%%MTl4J||6)p?hC;NAdV>P3C1KlP)bG$5cX9@5-{ zJfeY$^U(;JACIZ2wn>-<PkW#MatToIfOuMz7N^B%i2=d1G_9n1Ihst%A5b}<CaoF} zPQz%V6iuTvhQ<;@oJ|;zN}Jde+K8r6ophQ~<6i542DBbz>@|ctxI!L*41hv&@W~+b zq&?6Z&S+y;pb3`41H!;j7;)Ydp%4yk&<zu4vo}a2`UL5Ke&7HH=!pL46wvt~2DC>I z*sItRz0ejLu?7pU0^N1mD@Y5pgB9(AHni^`Ezz0|po3%w(!l}4_J-2o4=|CAqhslK zx}6rGa}u3OCkIR$u#nEAv*|24ht8*S0~XLlbPHXfjl~b}FI`Dj(^Y7N(fw<%6szdk z2O4?6rhsj9FWm|kSc~;ohCp-&@<TqQJA*8yyU`5u5FxuK;2_<nzv%w-ANn^vO8*;h zj2@5<4Y<r%PH_Bj5_V8BouYs2>40+qH@LuOdoke30e5*C+&tiy-FpxGke+=6KJk&C z|NN4Ew{MKXNDK}#7DF)}BQP4nf{ej9`r9%F5s6Nee*r1$>|z5=x4hhQn)^bRvD!6m zwhn?1f$t2AX*VUlEE@XF+{%sn(Gpw}A<M~y{5)H7Q<uyPzNlPgw4Nz{lY5Y?+WQ-4 z528~e;8a}6p8h)~bp}`d2n#Z&n5X#kq*?sdM#<(@Y2L>jT>O$ZJo2J8+%1bXow;i1 zzW1@4Jwn-jc>BKX=d@ql{!sgz_7&})8voPqkztWxzoEp?-Qk}dzUVNp!<Y`sI;3@Q zbg1dj-LZ4WJ{`w(T-<SI$IOn!9m_lZ`Rv$d<DP9rFE#cwPBumxw;7X-UIa8@FPx4$ zFdd80i4yC7uG4d0KR4{Tz0chVZ5R4VXjJI<&=sLuLr;cY4IRACjjyJz8DP#$)!Z?s zESz<<7OYVlVOO(n_M^RE|8!W+qjTiUyIl9zz2n(<Pu`FB%MbDw{QH4pFbFQeO)wcO zgzLg#I1#>zEFu-HqC_+k)ki%*hC5h*OR#_zctRQTxQQom81EC6YV<>==^=ff4PYt_ zoIG&x<DWd9H}J+FZP3s`8=g4+M9vfKgL?G_j~F~-aPX4_ga4pk^VG4YN{8I__Vga- z9q_cn`>OXJc2_-<`b-OyFcn%%L{;pFE8-vVnK8WMKHuOOUY2??pDf9(jLT_xT>dTZ z$z=s7KNYJ#^*WWObLlPZrf>TH7_#QG5?R%3Q+6r)p|j>JJg4;kRGo9b^EGF16vvyB z$SL6raN4;3+(d36_Z0UscZ~ZdFT`W<{CG-U3U3o{53i2b%sa=s#=FP6!DIg4_||+D z--oZ@uji-oi};QFll&X}Tl^0GgDD2Nenv+|Cr4>ARo1SQP5j31y-u?}vv1z<smbPF zVg0jOZ{o#GRh_GDd+KSYpKq<IUG;WsJVO5)Iua{36B?dAV}(|se^1X4Ev}?T$t$jC z8+I)3c&7@b!oP)geD?WT`_}l*`auootwgDQA4O|K_x+>%#{&iiv<18gd^2!o;HdaT zakO|&+$etRpMAzJAxUf`Oo@*qR1zggm28mINjfBh5|2a%h_fUGr2$g8G)k(L9+O^? z&Px9Za5qGj6Zml8hk<7UL;<M*WdXMWS^_Kq?trO4SK!sahq6E2!bLTKpDiA^I3dUt z^y`vwOY(xJmkwBZJ!Em|bNLma6U&~+2lNk6@IWA-1TEMC4J`1`0|W+O7$qLMn8P~u zagIJTFo7w|;1rTLgrmf9#4qs&877ZpgZw)p%ITr(Q2)@x(8|!0p`)Qqs`fDpRB5W+ zs!r9Msx4%8m@F(mtTAjL?4Qu(;kn@l!iT~)m0b7tuoLkm@t*iUBj$w%a|PUDu9mCk z_Hq}(JHvZLYQ$OI2=Dudhmn7e{5aCackqY!%aQGo52OAPMMk|8bw-daxFawKR-zE4 ze`W1CZENjMvUZN5z<B##K0hyiWhtti+cM?Oa9G^GAgLrzj-Pek8<vq@3+vB!Hr$UH zHM>~nUF$91H?`<K+|De9m^QV|xO=@BC3NRHn%P+o)4*A-;^L$X%{e}2LbYj>YF)Q_ z_tLQWvCY#<bk}lp|F&J$-%MxJiR<Ui5pg)c7&N`Ts4(@^Sx4H$p|Prj7>H`S5M@Wm zvE7G~l41_cn^$}WpiMQ4j+tZ(n-hjaL?}-){bCi{wbPU^2G3D3M2YO9757XCQ%rLY z1Q*3>YWMW3y4)$+*U_v5F<eBA#AMoOY}{@9k8(wxKE7a*JT*fG=L{6ESc*VmV`nLS z6+nsHFg>}-q5MVbGjn%Btw0MA&nPf#Yv`UG+xP5^-M+$v5kU&uB3Xu)@60%AAgpG< z=nLrWNiH(pspsRFJ`L#NNdxWdZdWmCGuY5|?Ql-M^JPXvZ%O-*%uYcMlo&4?v&a2- zLM(aJB=Pdw5C$dIKJ35Xn{LB}G$brRX_!wz1r5P?RP#1Cz)(}q(|rqQHWonqcnI>= z2g|<<=U1RNBv^RF=Av4dubmGe29IFamcuB5)^>xR0)q{V1r2;}^S3pa&*L?rXwL^+ zw&i^tM#ll>e?c;TSDhzuf~Lh#EF;?U+=82Nl;X)t;)J8<rte{`Q}ozD1@+wj6qM;G z=xg4}E9#j7z`}9im9Qp!ldDw8<`k&ATDZ5tVd}BgKpsC3kCA*_lc2`17^KQE*H{SS zQ$aI6nev{u7zE|9#m4haUa~QlK?AGBpaP!zM5PKGW(NL2yG=1$FCF+DGx1IgKAdJ| zZHibwFyEL4^C=H_qNXz?lzE7A|0fnCF}MlNsu*~$=MiKQhP(@GFAZy*U8)%GTfiIJ z=pa-?iz|bnmK9aIVoW&~k2Ww6s2%PNVgBtOAfCJD*vW8=o~Jvp+7^~mrHXvN0`0`o zTI2SVm-Sg90`u*<ym>R5`h@lTzC=ym5i_sWl<|wsGGARbIcy}D^6&3!xo>#$ap#ID ze5S9X|G1vt9=~Z@I4(KdQ&+2QaO*_w-<R6i5IzA}$|m%US}Yxf1Rn3#%#wh&jDRX8 zUinefG+>Ad$e#2nh$1pR2gBN0(Yq<Ao`U&a&07?E4#dvFv6OPY8xG`!baNF@&;>AN zmh1Ojif6rf)4_N^JoL}y-v)L$3h|+enKIIS#F6@u7^CtoPazB?WWtwkj0Mc>0jcSN z##kH6Qk$m_h6XEe4Iz9@v?94!Ly?CU!dsOhZb>&<#Oo^OrD?I4e~EmPCM8NaIN&CU zUSkG~0OR#KZcSxll2EnJSfQ_y3GMv}m#t%g(UVEc??e;9SmfbXClaQLOznRUiOF*T zr*jPP$Tg|O9b~M>6MPL|KF{g;B0~Fm9DM87MZzrO`Lxu>6qY2!COk%+Xf*JunBO(m zS8jfpM%y(&YebKhfMSDQ*ml<F4idXhYnJ5jYJX_)Lh)6$OR$rIsywmV{V6!*MJLFk zo5_TLEVQgm5mC`DJv^hSFd3?ehsW^I%37360rY(wZ>eI7b*vz0QpfA1A;d_vWNMrK z)Lv^=II}Ium+wp(`>LtG6hv9zij`qDSVi@pSzdM!R4G}?@bdXL9}yK1mW;)3Tx7|3 zJOx805Ji1abr$ypfUeuQ<`^;)+(h!%i17yn^MbCYsJ<!u1ju!ffZ}|7Hr!>4JZ^*~ zLsA*y$Eyf0p7u8#NixzBLzV%0M+@K+1=Go)(TvRK#*9pIfUgr?+)4=tiIX1!5f`Zh z%t~?f0Z^xS7s>;_EZMEbc<bK<tcqAnTTL+jR>XASLC)87%=A1}7DQX>(wR-;!Y0is zQ0G9bjLXvD^`HHkAyuUFdsUW@oRz(QK`$V`4&k$EO-RbhIxwf-wd=duAJg_l;b50a za|ogHAz|*ii@P@%Vkw_W67Opu#kV098}K>Srax+&T2yLo-Mm0ViciX8WWvTbIfR>E zy77`dEr!ps8RXfNet%m;C3d*R@s+H#qm@QZwZC?w;-a{${RlHx5+*JNyvSS)zA4a& zpau%&+cmF4Qky}%<v4@$Mx_+00q|k^*gwM!x5&7s8kvg%yXbAgC4=yIZ?}VFED@DO z_fFATBR)-ab@}Y3`Qqb5w5xH)Hw$j;4#CO3gv(Ga3VqBo*cLH48OMkRDu<yFGN{En zoE^_{wt_r>rL1NZHwr_VM`$yNc>yYpTm~|JfU%ayI%p3Bq~)5qFdOPYo;C(T9Jv@j zPUzw#r)mjFZ?EbYl@@C+8`<Y|!a5$S1R3E~9uL^klj6w9gj3I2_1E$SM@?9{`Ru#> zrS1)y8c-Wc%|G*lRx~^g-aCjH=}q#Icifrg%f@$(di5#pp4w!SPShM7euYb{buN7f zy#kkx0XEtdV?PK+;hhHI6WxrbMKG5d)NzmB$t4*qMo&{JcvXb054u&p;cOXAxh4q~ zUb9Ketqo#T1EU*)CDIX6+JQqESub<^e|OT>DQQc><yKE98q{SZ|8kzu5ZEAhx=<BI zt;cfM?UUN5kyF4PC#-rO(8)!2VU_&TYY7!<nr$gqxG#f`Rt!wn5c+OHH54;mCE&?Q z*6-LdGW+jqqL#!~D%NNT_B*bN$${#5%2UoVAyq;h^>R8L(0Gd=vsPTUsfAT*2-z`n z_*83~p%QiUJ(fY->tj@^aM&w{O-(A8H+<xgmO&|*B{95}v$seL1P_=Nf2JEl==V5N z#is-LnQZuCjq4~={`<ZfxnLOg?J$FvDOHf&fL<;gpk0LCL=^1qw=<tSY!RG@Yy?Xm zKXgvgd$cKVejfBC2NaQ-rh(W?+1V9P(*jKqKR(Qa9uoK#vVN}FNv$GK^_E;Vdh0h? z<FWY@ZK4u*i&sfby%6p>su6LI*kV6FIUhk8M~MqnVB;h0-I)#h<VP<l@W$NP>M~oG z--sByeeo%H@Az6TRDS?i`Gd%FZ^4_qllapfqt9sdJ=TlXagw#HdCH@ea}EfIcS#~y z)Wlx|#+;SXss5FF!C@e;sPm^MD*07}PxGdu*}!o*C2hNv;;FwQ6l#3esU$2?#uE?z z3cpeKfM%1C6cac|SZK}%j4`(jd5nf$vQR^L8zh|8lC<vuO5%m*C@62&P?;H?hG<Ks zA@6c!H{65C_48KE{znKI_Can!YgDeoZm9ql-b0-`Mk=DD4e|pq4MSNhDfbsCxF3<l z=)idj8VRcA7hVYlPrEg{1Q4@~!}Hwrd^UqVaaP}@8j@#K4MlZX^s6&Gjk7$R5$c`_ zy<5yOV#wW2h;mpMs-w1WH$EwOaEtr|9qgf_L?yLSE{IgmqeUtgd#V!pM3v%AAFy-C z5KkG?-bw;e7_D*{PDS&0%9Cyub|=**UOgoJ+IH`z6BbBCuL0z{@o_YRUO{?;xPU3v zA*XrZesFhYElNJpUMH+dcG5+yu0?x>Gc;3AJpR7BpwI|};aiFS{2fap#DiB=gdUF- za+-&Q=wOMX9-;GXG^)2#x)GygH8M1{$H)>&qwBGuH*iFjxc%EnN-B_0<~Zby&`iD6 zMZl7zDjK9j_e1g=gj3x?VAtj|^*O(zi#5*ONYu)+qs#$xy$^hfaor1ebWL)jPsBRv zBXqr+Npd)!x*A9dIeh>NAdNz=kiS8aZ?MHx%H&UxeQ;|!&^L5EyvSx%luR6DvRuHQ zEF)G|B8v3r=Qj?dcQUw7WrIEpRT~Q3O9h~dnaV44gI|L=HWFeSUK9fhbj45+GFVzP zU*KFyfMZbO==+IcU7sWaFA3~XQ<It5#U`Q_@q(K55_5*R;VhH8HP7ZJO55t80s>>N z1%7)Bk~&`1B{UzLOt@$NmRAFj0re#mQmyY}_aI(Rz}#iz5L2%LV@)0VAz|4cU({ji z%K31ic>t9G#fUh&ohAt6qx3_FO;Jco%T&?2^leU)sqMhw-a-@PuBnSpqV093<bD1R zSFE|8sFBe?3aMAR>!21dCIzZzE4brw_3cTuQffnRBX0dKa8P6T*($IT`ko-{l6^M2 zc^W-l(OSUiiIS9ej2}k*6P%A_9|YQMaVB8bn(kbhHPgXF#jtXx@=_XsS@<q_m*9>s z^rqZq(7PdDZXSqpj*13!W!lH|GyV|Pr@A7A`^-uGOx@l&H|h6sU1ZMrd1YbqfhL|< zUODT$=~lDO9mTVqxjDtNEECM(vV(t%`%kaUJNGg#8gqgccKZ01({sYP1HZ+K6Sj=# zPZ;J?^+70TIF>}mAHuj_e?O-?&Yb>%6SJw?d6SICyEu)f@A8_=4`pZ(3``T#ZAnJ~ zgtjUc$=wpue$qP@Ol=(+CebHIBi<3&wpl!&<LUeJ4x4aMA5?AYg+;ECm@cI?p;5EH zVg=TGTz~Dxv92<P!i~pHSAfW_++wp)tp69kId+ikz*O$Y&T^)Jw76Qb!_ompMQ)IL zh?(-Qk@MgGu+QkHOp+lxj-+u-%j}U{{@6#KgDR=P(tyq9M)VCO5u~Tl+Z_1&_jgh1 zaS}R&$m|0^S-H7tL?(cJ0jNL)0IiX1V?}+Pu(14klq+qBq}>$W2{udI_{U7T&+^ub zV+aG(29o1t=-Bd^Mi1)-3>d8{sLyZrY9sS^8|tB_>;YS!)5N+4BC0fK^4^~CLgfQT zLH-LRyqWhhri?K>nBhT~nbHh<v6<ep+93Ah6N>_0Kd@8pK3hd_S&!x&7y8>}6x!dM z!)OOI(*bqShq^KJ^{`PmirOD^2h^x~+TCxq>nRomR34FDxK_AOB3+;yQhWJ6?Xuc# z2Jz3+^~=ImwRdm<t#!5`>*xZUkSnnjd(cX^3RELfpAc(h5v{Bf%>zx!rCKZ0GEu1& zv2DZM_KiVZ{Vwi!*>=wVlwCu7q|NtkET9YIg4^V)`ktll)Z^2Y3vigaz@)YgY*tGN zpFHSR#nWIpYemhGJX`V=o9X7MOeY%zgsezEccjj%wJR1Qm$mmPt@TXPJh<LGJmIit zJoPFZcGYALnL5XGGV{do^z;*RCnuz&D&fXJ;^ib3nLY8KX95`t=x0}X{pKXv;@D`G zNTs#5+0!p@VgZ%Js>Z9xEs@6Q=cBQJxjmqyuc2w@7D{-gybx7WG9zVmiTG|LCaPQW zou*yYA~QG0I^fl+ay^CFzjC=eP<1Bou6P}(yfu2cfFj<Q=&8?S;K!in!CjfSMjzc! zM(>EgarJG^e8(0&VbxZdqo8(gqi3svTX)h7pq$}ed#*U2A%!TrtDuEIceh6gV+9Ij zm)x+Bwa#f}B*xqh7;so{0bYS)q(TyNY1vBWpC-NgW&0_#gK(tzDpsK|5d6}CLy8Cs z)*lIXMUJ@_h3*mHD1pklEKQete$0J@IU4ugMQAajQg`Qx+aeIRL?CW4BVjY6J+&o( zE73|R{m4fD2?q~M0E#C&q!Y0dj!HZp!9pg^`0;)kc9L*%1UHBeHltm~%?Ny#JG*D% z5YIX`^QOU{{1OrCJtjfVTg>QX+RUi;Y!yV_vF?F1uOeKm93U=n?;N;YLwuQrJj<12 z>pehvE=x<r6h&IuP>yS_;l;Ux#;0q_2<4;{1w7KD7zE59RJgTK64+QwLrg>Y<qCS4 zISQFj*Q$_mz}OVijqd@HW)LpanC{j=CCjWVG%E|Wc$NmaP=y|GV6=;U85*b3TO&DS znt0TFicd5v1GSTmYT(zJ42f3|@YZ6M_I?*Z$uh?mnl~)e9(0!Wl1#{$UkLRXfH55J zmO}FEbph}GGk`$`A;FLVpHx162Fw_gC6m5O#?!dtZl_Rzpw@D~^3h!qSbma9(RhW0 z1qvX{1rSf=j?WLzP~cWeDRNIFDXCg~rp87k>H0MAO0L)P9|&0HDo_|?uEg?_RgPY> z;$9VOx<ISx5H3pt+mf4?2YQE>MweDOPygz))&jcB^DJj%n!IOTT5LGhDUq>qIk$?? zt(4LgE=}6vJw7oNSXYjR%Ps3%O(}ww0A5sO?r9;?FZcMVl#-Nip{dkkg|g#Y-PAfC zmTPlidv~2FZ_sOkb5T{~>Zl5Zs}VgFf{E%~Qfr^vT)9Uck=F94I<6wmPbU%$EvT+n zA$&_uo&LU{*ZDFm1-If8IQIz1va{LRFl)62-2y_e$jtqEfUrm#Po^8vc+harko~iV z0IoEn5|5sEtf)+pR!S@7BICMSrxbY#eP{a-W;pn7m~MnL3=Vtoz&)Ctgt>ro64Fr_ z<2Wh9p%b*WUd#k|AKrEsnK#O;B05UzNdj+JX@1^C<&08&5E{4KqU0@So4NerD)Aje zm)*&d5}HJn>>+Z;fXmEk$C9AWLU`P<Yk>aDHP908LuvWg6mTj8K(5yS2>6J~8-G?} z(ej-HV@~x?<xJ{{y1{Nk=9_5O#0*N`0Ibvw5Z0PIZ|L9enU~)#9N_vrJN4Y5@IFUv zvo3_CRBr*h^ms<Q!*S2T)yH}iPQqEn<FX6P0^0Z#8SbWFRGj9A%pIW=m`})e#0tzt zEYplI@ZJBrH0PNAPO*YesQ~&Upr^QFy8m`D&|BQyea0$J6US`C#@^63qpBDdxA>l# zKPwBy|6FIftpa}AH#eneP}<Fmlx${X-elbU+_L7d=gMy!XtgR*yDyKI9OD>bq0-=a z#4<g__`Vvkz^d~61#3Q9MeF>Zi*wfA;?HK;lkSAW!=_$-mnd>bG~;)j@JYmpQ(Gq< z7{BkOLBkv|DbYzwU;1EV$^bT6pFio;m_vhKN}V{eIVwz=GGejhGIh@z%zzs!@XrJn zHpertpvKh6f1cj_xwQ3LU-HkUn*I{Xz{)O9m<*%gB-4jChBJ!kRHF8jZM4g0V;%m{ zP;m1{#^q&OyfzA(=yp(q=~uqgqpgP|D@^~9$&6DOkIi<eiI_;J!gf<H(&U^wIbZ?_ zqs!J)?H@_(Yx1W}0er$$pN->kPbO}p9acJUXCL988V|P#;*W~e(|-Wa=iqXlH|=Y7 zd<;n-GW&>QKBXEJvHToI=>`oti@o@GCBI5=Z6@C1a%JhEQ_*@qe{+4t8a|MunZV`M z*nz(piUtiq(gbcKH(O5LL8)zDWmn<<7<+aISDyi#>JOb<%Ro@Wx#O)nsF2#yTEez( z?rH<{xb6iiXYT|PlhxGHx~A`kmlY2bO-7q`ZQ8%}WoG{W-9||ZI(SZ`WU<rESDEps zsnotv+}_R=qt*-aQ*PQ#8`Zp&l>D9N+f7!ZmPIBU=e*VXhHt%TvmT!iygieiDki(X za-nria<kMVH7Ske@oX0WR+?{vXpE>3wq;T@r4xkrj~kj4y3L&8R8DHv3gt}Qn=O1N z=0`+Hs&J}V+~ys5-XyJq+x~=o48Q`C&FTIidGLXPzgM}410~PemYxJR<*c{*gU~f- z#ZB>P`fkdf%$3hfUymREUh?Bj|HS#jT;^&O*!YM~v~|u-T0OM8MrHZEP1fh4L9j+a z+?5KJaO-=T-AUH24NR-of_VlS$0#WQgmfpnQ?FtjKa5D$0zGvHAltvwknsDIu2dCA zPrXN{{dZJ|aF^8w_oOzAdSC|O#i9N>tAy$YKPu6A25k42j=1$R{Vj?i)*=$d6QAO? zb&Z~CBddu2GTtM6{A<KrBDc^)RCgeP*m>4?PsD$Z2{cAJNW*Ms9mjl*kXm}nzf|gG z`~#zX17T@k_=q34%UUJQxfq|MQZH^x$wHYYlm2^B5=HJ@LDT?BB7)n56L_bfX1hC& zwKYGq1+qGrZ_&7cdz<}}qloY!BoHkWo;~!WNSA@>C0-u+mRo2m59}!i5e3VoaT6>; z^AK=L#II4qimWhkKrTw%-}ONm@cO<dO=|<_qi-s8Ff$t7Y(o&1^7ZTzRb*CMgunNc zqmsvv2e~Oq@s%703#4lZ4ljY(&qXl$JaK)EiQ4Z+awA?2eLm$V=hXO#y#)JCUA>;| zkJa(X2>c2qN_ti4y6D*}q2p3qz?3Fayh-0nlWlYfv@nIFama^+`RfQ>y}<;bf-_)i zaoP5g>jsGsU;8c*`UX9*3;9Ze0};`@M6?G4l_M#OjOG;ux57&jGF5*sK-Xf1shTDF z{vPUYaOVwrEnI%fMLj>6Sp+n1J(knt-j+lb_ddew8n>o3uTYS<rXXl5Qqc0f4|r9( zB(Xu@sTxubZTQtJX8fso=~77Y-<b}v{j)^AC%GcogB~6$M$!Z1vHs_uGt8dFDCU1W zu%5Eq+}nE43rV(kj)}H3lhM*%KjV=1zqO|V9+loTLYg(x!Ngm$Tu(9?b<6<3YZc`) zPh9^H?tiMqd=iJsnZRK~n5jBL64eyUVf$&7@G4#16k!*^(3oDy&<JyFw>P)M6ZQwb zVNv&+`RmTZoKdFRopT7#zAF#@`m#9747iHx#5>mWZJh*O8w{=fV8~0#n${G6D%6Re zlkX^GM3nHx{ZTOZyOm7&jKNsYuV{^p5U%K?x8YOs8|UPHKV41OKt2iJ2P}tok=x*` zCi-Y4{IQZjDJ9iaHs2v&d%~B)R!NgXGeG{9mmCos@1-xZCwp~_y6-saoHD^B`X2R+ zr|3DA|2@VW_Mz1&i$F!nM|0jwhXZKz(XS7UhT@sFRvSHwYXjd;HF3gxrk$Oc_Tr?P zFA-S0TFO^Jv_}54R1bLgF%o}N=7?wGL*m+qrY0B8P#{O*QgsE~c_XO@m0%axs?Oh3 zG?X@5-$)kNr!lO)W+D#7tJic_aHa>3l4I){wFh$cE$Dn<hN@|36dwTgFF<yXK%^^@ zZF%~*1uWJt2M_nGybU`7V&QMJ?kiySo#<QRM8<%1Z8h^;>`l<7JT3j7gFhKT)>*df zrT*8p19=Z@*foARkcf;^AAc*jcls)rqzJB>-nbOH4{|jpNN0+kFV755T<uGYiq!DD zax%Cf4i>OApL(7EdjqV*gbhI)dYC}TfL~J!TGQ$_k%2zf5YSs2V0193z5g#zyu0wr z@MPt_?=$WO#<I!mnQR|&7o_A?bv-|?^@=@a!I}6-8eR+LVo7&zn{u2-gbuwlcGimc z_tq(^YZY)V_JPZJshv}`5qhQD(3+tzIl|Io3hR3yV8~B!J`4w2C2EAJQ&X~r;Ho@a z&0(-0wrU|)euppUdA2VrZb*T?Nz%q@Dw26i=J#T$dy^(Ul#3uc7R=^0P~pc~`PvGV zLOB3FP91x1LpaYhkB{2fJSs;POh7NUFm@INi)lKHTO2~q9>RS7FWb4J{YiJ=x2ScL zxa!`(H@Np(QWT8DvlS~@vnv5qrD_cFV|u%n?+k*ql_P2*UPqYf+XPren7)~q;IfRk zWe`SStf<g6fR$y^IyTOlL3k!te$thel8Rg-qoU>vc=Ri^?`GmXJ(BC2R70r>9S{Zk z8}F$%R*HOVfp8)qs4A@1)s0!~UAx)7(I1GG`7Ti9AdBfB8Ef5e0Ok#m@wsh(kKPrL zO$x7BJS1b=5Z&O(o%kN@7WI)&x$8d24o1b>D$;mNG%;TbrBp1UH3ap6N_G{}YLqM; zl(OYCDO*a0_&Z~*YpYF9fz$wb)W4TPU;i!oQdzE}<6?q!`c&Pc-YWl;o-6jC6$;N- zJsgJI86+j{f+|EOxYNJb2&+x%(^mjH$l3S2=4XLA8PtfZcQZ;W{HnQTMIBA6c`YyJ z`}-ONfm%medK*uA54fe5=vv#;f+V}+?AMI<PI{$f1-x3?WjyIw>~Fim3(kOS2w?Ut z&o$K_qNcq=$HIF2t9Qap&_%{)03R*|)<jl*AW)8=U|*^+&W9eFC|x%ofVhB)TXh40 zonpJ&_A<po-}QVx><6bFuscF?9&SaOMv-VKJZWjKhkG!Qt!m8f1R}>VRLpw2>~<pr zRyo7YzBwaE7H|oaDaWpxTRS<~rn$Bqj(f{IK0+P@MeB;Jq*br42H3A>Hdt(i)?V0| zz=}`^Ljl%tFctEn6U>^|A$dq|Ho&0=LET1-d)l^}r4@JXEUp+eYVq0UhL;B1wB>oM zR`krzpXl*=)5U>-a&Z&{msQU3Op}CdYS=QAwBqTA5fg33k&g2j!)f7lSRLHX7&yj= z?Z6-{bPOZXd|=oy#BTha;N5Ze@z772s75&T0#Atq>s40=dYbBe+;an0i7ca<)C-sv zU#hE>=f+RmrED$GVt%+V@-BtCWD1%xNm)~nrUp!ivcv=J4Ed9``qo|OcIH*3QZZx} zH#k6Qi91xU#b|6p&!~^=G8(C-wj&yWqPeEL@-YtR;#Q_JSU8F;LvMZd19rQhsH3YO z%*QW2Ixqt8VJ;T)9`d_p3+=O#<IzRSPbx>}bci#Qmxd5Fmj2o|`~?Ack&~_2Y~D1+ zt^uuzD`{@D+0#`NGw%d1?ipK%|BNE)9$!88*!xT4-Wa*ad;JqQSz*%TWZ1%PvKa;; zapvFP`VcJ`LX0Zhh<AWJmg6VQ)03d^H_CJaLghHZeJL6T%J2mWzj7mlANt5@GrS?6 zXY)HgsI<LX=z$5RjfP$-;}F4e;BB)Hp6WDO5>^l=g+HS_foB`t4s!b;W%y%e>yb~j zU7Q<*{v#O@9r)q!6-&*#$(o1pvtK?1hafP3rNIJe(QUR0YYCg^j-z>*hLR>Mq>Z>+ z!-n;a`@n<RC2keBWPu<o4Ssa-YS}g7lZMJGEd;=J7(s71lXs%NQSLDG?tHs}Q9%~W zWfJGkOMW{w0?zAN72fjvWRpE+$->RsWfeEB7x<4Jwe-x(!>KLZhix<z$pRk|4a_@c zqR?HiLK-W+<H3YpeQFP)Ry0~JJ4HHmegJWbbSbJi$})>|gu)do`D=>3P%U8{Rj1L` zq@|?8zXM%AqKHQ;5&WP0cPf4wncMFRps*oG(<c?qV&L%H(1mxs#3PT}BLiRQ%ZP1L z;S{ZJYX)Nbvf`P)0&#~m;80cm#V@|dk6L&tLhz>V%DxrLv(rv<BWR@msI$Jpe*1Ps z@NECHG0(>v^E#=ZHZ+9$rt7i;B;-!M*&bVLtABBB_bZ-En(NK&qi!1u+(hNYc3||+ zZdX)R-}Oz(FR#ua7(AXfV!gv7)mKm&O~G_t>b>syo>9T|JVWpIyY9Vr@p@C!rS9*( z-6QHHlfju^md6=&H}iusidu@86#uKQfW8cUdMU`$cwxvJ81|QM5i&-gv%e*0e$^^} z9~0IYGm1FoREO8Zu}+Jmma1t&!Fvha+OSEinANc>!nH&;Sm&Hf2Kfwx#D{RfNn?zR zV_*jy6CZ%V&^$?3w@L}npWa88<$7&P7bBCOZOrHI9XU_>{GJaYX?<A%6p;z*O1~t0 z(6<oE{NP7W=er=ZUbg?4t$wXU2f3)8In<A&%T=KRsH>j$XJ2tMZ}%+hW|e}AO->_* z9+1P_RQ82CrsG$-;h&KyvUoXPn&oxiU)RpQz=rh<i{n4$!pcIX69)RvrCNX<vK)gK zXfeyYvvt<;8HkpNWq_l{mvt8w9~S373NJqH`X{!wY&KnRg?apCxHIba<S#4tSzkP@ zfo_H_pw6{|#M-hMRsTkA$Jd@`V2Q9`*!t-vmr7XFcDW?DA25*ps*YE;nFE_xxi~q1 zBbo;mvuhg$q<N8`OTWL%V@gQnIjrc_F^d5P#HVbbQNF!-Jsil2Ijbr=aN6612F&N$ z%!6%POW7Q{^R3>7Gyu8o-~RPhoNS9Ns{6<m6Y)a?P`l&eN?)o~dK-#Ai$A?%(RWYE zZ0XGV)59dk%R#<!veKgSaL$@@5>@IPA>7VoIdXl-%CHy6UOLuH7@wr?Er%;vGn0ly zUwM+i;+H<_YsAZFb2IP(DAz-`RDJ-vKLSm=@j6w&Ex$4_-`_=-=~5z8m&BK+05&qP zG`XJc<}UUr5(0bm=CJOabc$+=_~P||G}i@{51HQ7;Ec<3gO<8z#76QC3m}fKOfhzC z+DWU7qddnSkEuS-%*4>bO9X&f{vM>7X8~DG?2=Sri%7OYK(7LO4gmVn$B%z(0%--$ z75B(uqBsW&K@@n-Cl-7F!X%<OdWDUh5X^MdTEvf=k0>Hm3hs{}h?Tu`H>3%I`EUm2 zvKk+(qBi#dKs&$0BANv!MfaZf-*Qf{B<}d>y0a25znhGK5L%64@MAJ^AlaHd5<CdB zA)plW1ie5Wkmt~w>k(2ISlDh1WGV>TYXDzv{(O!=fKuUZYZZ`!z-sOwFw@1Q592gA zM`XMg_|b3S1gzO=!muYPL;ku5UF|7=M1761R0ri#x8FvbFR^YnmN;z#|GIb^)j~ej ztot0!0QvNerQ1-V?yb&u$9eyy3#b@g!i$fkk%ZraJ*y@rBdp_S8fjri++v4?en^Jl z5XUI&kC8xL!;6+dIeTdvZ)B4h7NKv~fy%>Ppl_HJedMB1<LZ@%4J7J5#XoX1kmUfn z=bPn&KDJ&cjUQCgo0fhMyGV*^EFqP?r?!hR$`6NK7VW8YmdDWGnh$_7JgkpDFyVyK z3z0G}ND6?WI_h~ST~|J^nfGVmyF>M$Usv1B0X?Pp;dB2TEFz5#Vvcmvs2k+8_4j>E zJan<xg2}~07#nI+uH~0>HslI|qBJUD5?FaIHu3$wv6y($!`a>g&6%yHLEhDlMxbXl zcek-@pMO6Y{LX9Uqi?}h%Tr_IAXLE@yw-Pcn;$Gd9(|zwck{Whu`7e$m=)4D=RM-| z*g^iO5yw7p9MiBZMq-;s99RF!SKF9`<5}>+86U=xL@kB6pM0`B_uZ+>W8a-p7}9Lh ze!&gs_|vLAVE9?I-?60T+w=7v9Vi3fe~yj8=_1d5SoRwVq}qpY;~?@BAj&QD<g1jc zMu`4F%06T%o=(rZGZyN+6ccxi5J&xqyq&fb{TKYStAvS05QrzRG(z+4nSGx0*1HsW zKC5mfl=_5~2(PG=JNqyHdxdcgoO5QyRE5uZ19y9Rvgwe}VzZ*LxwD*wb;Cwk!REwl zP^ysyoC9F>{hpK!TF6^r0%MM%Y0M4yGJQ+|k<CK3&?1LEHV15`^rf)l9AH-U?@8HA z3*A>h0Hz-_a07N#BMK8?%j2>l(heScXxj~0;n1m;u}WlxWong*Q>ZT7x1EG}d9)N_ zU#qI97`HAhhglAa+rX=45!sR&jw`Mx-dhA>mbWZG>}^yO7U7&{R1dv?P5$zi%F8>4 zYbMuJ*FenMV~-KS{mR-J;_vM2@EWkM&fGqR`=Pw%YOT%K=JC-x<=VT%(76p>Qs_;d z8do_%$Wp$LSY|$v)^UTVt#XHg5A-6tN5op<Wq^a~^$S~}{f8X<s!K>oMakYGe_Gi5 z5n^w%yr>8l+L6?^0}S7p9k&)&q%Pe5ht1frVD%YVv=g@`C0hxy2>P4+l4!WACe~i9 zdlOsk1*59w9?^To^rMJX5gL^2iA@^dVjE>~S{%8StDIO=CFv*LvNDKCBMxkY2hBxQ zUMyEtpeGJ6Q^~ZiWW^U6J?xv|D2hMFwd)}5C(IP{jOuXzMU!GuX*YGiv=2KB6gmnq zMd70LXBjnC)CDsY6n=_U<v=4dNXJ?X4g&d@uVD~?UV8_EVHfJBunUt<dW8)FY}7gi z0w#p4qBpe=X+Qu%>vb6E>;@-&%Pt_NAeimieOd3U2FJX{K}>chuA{vPv^(6fJS$n@ z=+0MP4G&N~_I_1<RRR38sH&ut2%wphM*{<N{`_c;Y)5(YZ6}p)tG}Eg9Az@i2ST4_ zS?peWdaPk`{q+V|RbQpm62nO;F|}Y%O}l*x_kFpxyawz!TwY&8jGfrL<RjjA(*<=t z)mCY%YC+YZs)icE`@<9I7teXIeg%Tc%A<)P#pMN8^5G}N*Gfu=<?Ts5=Rr(qLQ**K zLDg!l7<`^zSx`hQO-?)m7+Qh!<(-POzw6i3U2A|l2*eD^51ao46XrpijEhi9Bn?m| za6O}zb9Fy*liWW&8r1MI^@;aA++V@b+<wljK>bp~oeg@{-r13gM}Xgop;~V8$!k#w zZ|V-m8w!ZSVkelLnIwR1=~H}yinP;zkM|KSWiXk{WdNgBJnJY=I%ebbIy5P>_29Lv zysgtH&5mi)(2=dgqfU{Iiog;Tt<8-Vq@^f;sD3pi$5B&%{myOh>6MDhmx<T1;!czU z?TWQtM*2h1wBb*RBj`pg+n-dCt~RE6P<<h}8fi!ziLQ-`n%K9hDg7+IQ}rCJOIBw& zFZwV&?kxR5RN$TZpuD7+DrqM1E(5BuiQn@cC9!=Dfb6!`#EsmgUFba=CyXN62?lBi zi<)RGk;cwlp!5Wm;Yw3f8Em>N*^5(EFzSoQTwfGb$><I{Q*M{m)D4qXnCnFe#qk`r z>a#5ZGO^JH4QS~0Focn*cZJ9^FEsX6L(!1jh%Sg}?Zsf0I3d2kW1cL{Xp(cLhP=ww ztpC%o)ijH)JMXqy#uQaAuDNB(a&ww9enH+STncmMvgcIx;A3I07fe^}|FsaFA#tK5 z9ktLK`Q2ar-O}3QZcx0(dbflLyQQn^v{McaSTaA$Zv#Iqwo{Ry5HKhf<CXF3$pCD` zU3<>*R^Mxj%Eoz#^-s<@@l0@yeBcxmXWozDoqVe=!>l>b?Q$F*?K4_E`XuIBgQcv4 zQ{s$L-YmGO&x0JPTPf45j*eFHjw|7d(>shF!f~Q)5QsC<!*L1}c-AKW)9rP^Pp=`6 zrQ&5xLMo5?2VU+NG-u7OM~T&IpYdQ?q@i97k~sEe^vK#;{<(wi@`9%&&HFeDcFij; zrZmSD&SXT%#h{sYY$DA+H!iIIj??C-{cs(BJVeyJGt3&??o>qDCdPF3pplD%9v!)I zXlpZP_*Veo<JFscXsEWyDA85qh&g6v%o)L?2--Cg%<w+?4~Z>Ww6rj`+P|{Lz1MQ3 zJ)&iLGjfNgw?wv!4%vkp^nm<1jr8i<r__I6RKpyR)n{IwIiD6;4O*0&dp~gW_hh}& zrLV3ssyfo4=w7r{Dm+UJewq%%)u8fC$2*IOFj2}`AnF!Jo4i-x6lL@m`;mYKp)*)~ zHGlJQnI4Lcii6#r1%d;n=x^Q3y>99ozP<;-YUhbdr>tXj;Fn8{mzys8c5E+tZ!xht zK^<KPv;^-@MY!DYy~B_*IbDWRtv;BjVZ-T=b}G_Ua|$Tz#H?vd<_t}C;MWwe!VV8M zDTO|QM2CKjFac_a^>`Ju6to!?{^Te2<?QkAzK4rhD=%iK<(vr3__eD?yaR3eq{v&a zOu6<!=;Q*=DJ$M&!-_wuZ;MUC_3x17*BkDUPR7H_n|nX+Tk?=F64wa^6J5}|zO4(p z*?{#6$Fn}`PWV7SeEOkL3s!F3slI&kR`vW5BNv=}!M0|Y-FzI&e9x4{3i`&BdZ$_M zAkL{Q(O?2^k>}A`I>S2HSdy8MTa*r8W@$ZyIOFlqzFsKmeZb$LA}g6oN1wjISqjMp z<f@kC;w-Bk-7?GTQBxJ>N3V~f^<qBVBsGaykMQ*dQ2G(kAIy1b4Bf7+x_)zR)rb*u zPro>(cHwPXsmDr5*Z9QQ?uqnBA|fTy2nJS}a!DX%qqf-(_~3&sB&3wnDXgeM3fE;o zx<HXw0o5l;AlW(5E8XTI&*>&&B}8Skh?P}H$;rPqicE-TLOq*IxYU}h)3GYAsq^dg z6SXz9W!ob7ekR4a7F0ejU{jB%eW(Ndw`Nx#<2I{aqTIeg!kn%Jmks+308xR7di#KR zn5eKnxdfX<oqfasQaJ6mMksIo-S^`Nw(?r`1`1M~WJ?+9X7XQSq8x!3p2WQmuVClP z#&&ete+WwHegoh~Z-_rNiAeJNgzrm39{VR4`vQ0*oWXKW5$P@wQu<88{a>reAK5>< zw*|d`I9y5(X*c4Hv#?Q#W2LB@;j~yLJAMHmPu1=2kOdR0;I+i1vrwwwU&|J6_<yx$ zSaO^Q;E7+^Q)~b75LX+*Evv2#rh`V@0e7m{jr8X4(%ymJ``(;2(#+^P-|=QjfNfI4 zfw>F#G<2CC)%Pv^`it)zvHuhgZ{x*)p{5?sOe4I&qz&yuxnrL8>?UhFtOzK`_pdY^ zbl3F{5{|dC)a{_Yenq~YAM=o0P|xLr2?|o>&~IzS%FWrP^$GdhC?dR0V3Y&@Gm|S! zNSx4z`mfx*S6O}UZsmfZ!~9P@Yt#BcQraYYhdzWfuf7woL0~ds<LZp|G5DUuvPjh0 z&wc$>X~>jsz*S`r(k;EhhOhdH=)Z+ZY<$AZ2KRly&TLztf7LQDZv+5u?p2>A=7b4e z_MSg;YY!Nwd`@FizA(GPR~&!5!8&9a7v}jdKLK(Gw8=j5=&P%Ozil~!=tT=PkN4gh z0%o`tr1znZGG@E@+y|cHR(k=DK@j9O%S?8VpVU;;*50eUdyjzU{fZGv=)O5QeciL^ zoa~j~V3z{oP4CsSX;8>tQwztj`^_-m^pDmeWk-2gDe+!KQDrd@QeM4u%gWpjzJ49V zpw{1sCmwykVid`8pB!Fy-^5%^ijsY>2fjro3ig==<KIpn7SUI-bA%;p(<m~N?H4=u zZo%Kt1p&{M{QjSjTwJ)`((D;F^&r)XM!>i9ur1KdycU8mkRwO9`xqj<`4J$>1zIm- z7H=XwfLCEVGzd6GZ5~CDhAGGPni7|5$<H19j-#-mX;hCt9ETRsL=KhL^Ox?NX?7HG zj)r0w8i$|=x0wd!C)xuvp$<gLQsy=`*}vb~_o%wc(j?3LcVvOV&gimRy))k*{J&lK zc9}U+N$AgYtF6Ap4z4@nF56B{14~_Tyt1SQ@?bRv<<g=k*$1BNR06Jq4L6B3aCb;c z;K)!^%d}DY;0j&lRG6stoQcn_osN0!hcSwUf^_f4%}fq5YLO44!)#VEf1lGzrpe<r z{To+?t)5%;azmBG$NX?Sa`4{Btl$qEj1OX<f@~Krm{N_rk7V!Yf<FM*bI|ztJY<>n z9)x#$s0tYxA0Ta$Nm!P5<H$lZ5L@07!+pkcC?aH&+GK805mCh3)U3_SIatFX=8V6A zT!CN(+sPJ)-)|LrklwsFRF)@AJaj3`HZ(P3a9G4s%lcGWg7z=x{p=`N2m1x<@cv^@ z&(8TCiOYsj88{LEmkH>gtaEuu{eS%2m_B_8OJpLv;+X6kO4>0dV<ggzwHqcFm9ti! zX6LhsygR`V`8q}cSH@8>7&oUt+6l_%&ng0EeFvQ?Ss=@(QLvQHdWRy9fj}Nzd}GQR z5PQ6$51NCe>8x)dGJzuBfyi`<e4qZM_C=UK1p|Ab!N<pDEmL9fa;Em-N{Wmoo|y78 zL}oa{4jM0yGZMrj^ex4+<V_==<HjEiGlh+TbN3P^a^Wj8vmrhWp69YtFFaV9196Al zjsh@YO%a7-<(Gu^LclXW!Y(kJ2Mf>Eqhhl_xH2$+)MF+G{jS*e3hWIta_VU$=JP*~ zd;#eC^*r=5ic5#M=?LGb6<!Uie+l9+Wcm2Ck$GD&0)JlyaSZVRBZuBkGu!z3HCC&; z5k9KV!Pedj{O<G1kIQh_3_?+mBfz@ri`g?l44$|6mIQU1VLha1x1*_qLl4om4^#2z zM!>}3D()Uptj_~U{o?y`QJ6nY0lo|801A;gdO(97+YA;62VKJkFH?fyeF+UBQ-EI@ z>eB8u%5KkRV0f_+pXoBary1hcufgjMrU1YCo|Y1#rj+Nb&UCRI@RCA`Of6k;_mq;# zTh1pTk`B?LnIKvYrk0lCq;Kof`M>d(kO3c*K3<2G-l;*vnDdtqB4lb&wawC3a37>* zQy@tU`J{!`rOsf8AL^;^9ZH-LXPriDbX=q;oV|p19ZAFQIS_AlAoUYOX9e)e4G!{R zC|~lgAx{qEF0ml1jem&?uDJVfw3h9ay=98^l(PRLWq<z%99cFDQ_F<>k>MdF^{Qnp zFLcI!)YNh`z3Y}cxc)&QE{H(Nj0k0Zg0e6{SrqYrrz1S#pn(g<=6v-_7u8qQJQTo< zHB|0GVz4zw47X+?K71zPgHw?hY(>Ml?AB1+VRat2SWmE7V}q^YOCp1A*$Hd)V@cIg zuJna8^q#71Yqbb{#;nxpU#;`c$T5jyvNdvgJnabB(+KcqQtXREn#|7kc~FC>INErg zDH_8MEGO*qD91hOK>$1ohYlJ1S2Kw3Gb{V*m0#^A|7y0P6wlo1POUU^wPgYXghj^X z2WdUB#j$_?DB50d>c%%&nT(UfR<q2@Hj0N0OH^ImzI9@>+M<eUuV&6(Zb43iZ6vL8 zi9#@*NxVpyow%3q%+yFx>{FS&P`}jDL|~su6sq#Zb7uD_Is~>w?EN=jQ_*QkkXd=g ztURMVP?T0*do6~r<BQ!0wTRs!DnuVRfC;a4b*Xq~4K>2PydKIWtdMp}teCnF6a=qR z1+fgjC;_ToI&v&?tb$R5Xh;MrNQ5XzglGs9Am&3flqpT@Q-kS|`-N&I$vi|uuK+my z7XX;iWs}vnM&c*WtjW!;?vgP0c=?ySV$K@zW8wmhtv>@EY$E(Yaj2{^E6-|dRY27f zcG(Y6i5)gO@lMe>*1%3HU0n5NiYLZpJ?A^7B0`mU-Zby2$5L+9D+Gz#DddV=z|VVZ zpO!v}6DJC<H<kXxNriXO&4&%PR-f6Y-(oPp4o%ez1+395otSuK*SAK6OR~aRPO??u zme%j6P5F5fI@|#cTfj(u#p0Y6NF;|beQoD^!@?Ko@vfwlsPi6=Vf|Do#4*1z_m_3t zGQ4F~!Y(d+P3OmMO*Cy1RPm*(lvpbbPB6do)$j`pgt#RVh)`Hj$5nF9-m`Oy!b;Dl zo;_y5GeeKex)F}{+&OVKK@c0II4cz_UuzBdhog7=;*=00i<jh*#M$S<&sWY>=f`eI zH1UHidX39sl-ekPyVcrGH<!Slc8w6XQl&p3iW%y}+N^pJ;^Q&wznyGZAfhkCncNG~ z_*;m6p5wZ+$WoE@9PlCX=-ncOiBC3w;Xa7<Jj{bR6koyRm}@YOcs15qa_yu<<Z2Fy zqL3zv+Zaa`{)95j;61&-{3?7stk2V?3iaYDaut+3Fm+Wib<`3S51@5}ci%{<&i;B> z-=~aGh6}B(g7beJjFCVd8Ogw#ekR^<2g!YDVrVn9LF|lh9E*j<KbG-$NSMGrxC%eM zDm*IZXnoODmD#SoFz`f-cp^6NqF`%;7uPPn1Un*hhcg1<R-A&BI0YTcGYQ?(^RzOz zQQUm7k~<Ggz8&W_w#Q9fBH*uJ@(o`{R}_Ij;%}GcGTyZz=wyW;S-}u(4?SngzLRG9 zBrSLBxiHu7HH-w}WLMtZsVha2H`c(8b<sWHoT;lmWCSCdX0+HoUt_<R(X+erdryzc zF8=U0IAgn7qU4~_h)wF*&9pThu=lt)XZ50wKfmL}VyNA$!%{4FgK_>-3K%iUaXmv3 z9$q~2s3^KIgu{-EU>Gx2wS>DxFp@hU>>p%q==J6md%_V20ATj~yWsWn(2ZkHdipT+ zxa+Hu91GxTJ|g06CGIW)L9C!x724)xh-w@W$;sLTDbauWl!0DduJL+kmI2KvALLA# zp1xCdZH<QP*EsETcdcsZ=SNxE0(-Aj29k{N>^6m?u02oB^rS=bD{Rtb*7`T}PzDWI zRHIK)(VcH_J188$O_68jt+*(p(V)Aif`vc%HlN@{F&EPkfA_cwx16K8{hKKrV@t$Y zi^+;er)BPYw#Wb3IL;g}c^Eml&`Cba`K%YaV~m{7(2LDR4AijUIsqhDNMIx6@z|?y z9)_&gK0`jE{^hhXpyf1&F$`V8R3@&&GQ+hV>#hRt+^(v=d#!23umJ%l_kjs>ia6A~ z-Z_WT*00g@99lto{dqrXi_B5P(lEM`If>wra@NF*X%P`LJa}FBo=wD$9yo*%<^x+? zz~X14BxG8&^IEoj3)=E;CEMEFEoy&YrR*1%BnOz1H(d#yz=+uNaD*^_jo9TaffHwQ z`!}20y7TeuoTLPjV$+FdZ*6azM%nG|6AN4AA1`eGR7nvdl7>^|aRi+0ib?;4%J7ZQ zufmolGxdRqdFs!PMWymg%kdP``tj*g*(qA3zkg|B+N9NnC7z<SnZ?P4@JL~1Z4yT$ zx13Rg(J=cBQ+2hLTDY-JSLEQ}r(r?!VuzQYO#kG~gi|bJ;g2SgKS$>q*#*{=8u_uK zC8{(CvT<W+6-PZ9fZ8$YGS6#~@bNRYWWI;HnM#uq(;)p!qx92e#79jE@8ZkQ5yidH zsdy|?gW5#$7^6lO`s5HU5T8Kj>9I)8a={<V@KJVH&1}teA!!0MDnmL!ACXD)p5EoF zuMNI*jzp&rKJo==lFTwp>!`=)SQd2kd?83794$Mvi%dmf=Q!>?E}}&+6(_heK0?c} z5g$#aI1i4iGTn5Z+@;fziCh~;BpyN@p^RoVvJa;%Hk-j$U{10H`!+`*1U3BKJXwHl z9l>)FM($Jk=n$^KZcu2O?-w%*p&rW-(KI>gq9m(xq)AI|CGpXa;|l9|9Z|(Dbn(}X z@mREOwF&pQ(q!M2q@lNWJa8o$<tAN4AJOMTgLIH?hgzl|hVxGxvRub_3{%65Y1mIa z@ySp4jra^so)&|YtPpN_86}r|ri~V?UYa{y?m7FZdn6s3eEtbsRAN+f<dNpj=yR@< zW<h@noYMw8F)@&CKp4f>ji-;$>r5fXqrcEg!N$soqY1UfEX~}$hGJ>Q(?{J-F6&9u zCT6)Q@&o^bfG9`_g^+U7EtfctIBk^A@JXD`oCqz!6i|-s)S!HX+BA-A9Kbg*+Sf3h zW;f+=riRJ%Xnqa=F%dBWk0ld1rWN6?Sl5YgtAZYb5jzp^E_`QV(qbJ$(*U`N1k<=K z_If0StvpMEVb1!2WGF)gHmmkD*Xl}|@+~iSjY(A~fGZan2sz6&K^Bmqa#`9Ii~;AK zkh{X9Y8=K_R(p8!52;*Cqx>jUNybxQW`e_00HDx`&cF;on%AuWXZZ++B|ET_@cTGX z7(#H5iMmzk_oiMC00T_HM+PXoi&I+S=6z)BJF8r;@x(_I>&zs^Q(~GU&|OCNsHGLc ztyx~cGl~zFQ8<m4X^B5VvO(6;i&B0Zccs&e>vf1XjmS22IKW9b8xlP;1bWKoZnd~1 zRU`z=V5Y#4@<Y7Fnf!1+MKn<wW5|3v_FA1n?~pH8XLz3CDVsyQEK1G@ggk6wR6Pu9 z_4azyv}ZzYV(8g87e7$k2>zLz7iv?32<|pfk19^|_-}hLF%TzD;UBGn$=wcxlqC_8 zq<2X8lQteTF|5jx_0vEmWs89VL1H&r;xa$(zEQ6wU+(j7M*lMqjnDl3B4UQZ(fk>y zq5z)>9Gn}%=Y&Y7hn}?+vQ1qcWPoPFci1TN2b7xd!c(}b2Tt&HFSGBMdZI}t(k}Iw zo0zs-)zpf?v{7EtKxwR1z=LS8cH%5$-f3`@OH}t&YmZfuM7icJN)C>a|K`Cb$V(_A zjk@lWPYv$Whq==|Toebh8P8Tu`hPA}?hw=nca2h!D&v3Z0@vtL2i)(#`bjHmbOYD8 z4FWaVjNr`o1mBX{&)L-B7~_74E2uiL4)wJTs}jj0v@)9$ioI^kWi(12)^#S=>vu=+ z0_vq{fGzl@()P|$mYoKBA%qQ{Ub_(!kFa3}C;-r5%K)I<F*_!|Dg9<X0PMo-3TJv# zU+C&29!=X1YeURZ_P?W+_5RMa_XhQSy+oCn0+^800cYK-)$&5|<^Ko&C+0>%gT{hj z(D{$HcZver4E7=kw!fnmdN6cpmw#fc^JhwC0s{;!@}c1eC^PJ`_O1yOb1j!gee#)O zM+-aY2DgjRC|@Z;p|99YoToZEHh~+27{1ZjOQ&EIDHuBL0v*fOIS$v46QWce;#3~( zj47%vRN91oG}Y$*reYX%9G(8H$eA9^OdiNMlu|?52I7Nv<;JX8YmQBd!oE1RZR5LK zO0q$Tmd7a(($u3k?yyPrmrY{U0n*8p#^5TwQ8a|ifPH1Ct*thm#<JNx@d~J=lJfC> zC|xHUh8+F4z^cjDu*kw*SduIBYoJ<~90MT>0*HNhr^i;`vGM($(~z=hNsli{jDnbu z;k#X~M=!m<#-IutJoP7|4XPyZ;tf(H2R70l0&Nxai7kIJ-=^|N(PkC9+A7lhJ)X@? zxF)ZKUNW3dAms(UMku;ilh1&jDAT2%-K&bt2RXf&CckuM!51AqsnlOS^pzDX*cD!y zc{QGKBstO@!-ESiO9`{>QGPBmg{fO4#KnZ$4UJb?j5C4=X&<Y2+AcSX_K@we%|BpT zJ&7latg>oa!j}}}OIUw}pf44U|I+N0JgIm0--$1fOKqXLuU>ee<%<{orw8)4v!bRc zr%P_Gh-5>|b|(|bsJ(^WPe<dnbG>_Yrbj#b6P)|WFZ()fW^%CzYcn{S^f6L~M#gvl z&A-Xg=AdEO1w}gb8@44PsoFHY*6h1XC|tB&SdvWHDn&e1>Q1C<)M>nR=lZcr*B*}V z+V||}HVZT2pJYiHVUnT`ga`#%>~z3U@X087yTC9sBdhJYRWfMNj)1sQ)f%<wvMea3 zpk;mfXR|JM`fAs``H81r;bu;EzDr&Al*<|=nOMTI=_<7wX3G;1TPU+s<(l<F5+zTQ zqez81aTx_ARSms2b9h@cUSXAWH=2E(5#uH;y!0w-tv7J{korUnpUh{+eMrJ^P>{^K z&pt8#dEP7uv4djC4sZB`3Otxtu?_n$=nBlF6GZ(=B>k8fV!C2Rg+EOU5j5bZ%HA^o zj?hm#A07*n0fv%3WZ@2A%hT8R;A7v6-g=GdkGySKcYY1@NI7Y3{J51TXuW7H^RC)_ zprF>&VXvX3G`kKkjVHWa_4;e|O+*)4(U$CcErk#?IEl{+s`7J)$!p`Ifu{Rn)m57I z^w*r|tO`Fs4nt*~$B>14fO=%D<-Q{tR9F*BZI<^TCJS$cE$`>>vu)y^ej5zSAQ{77 z_y>m<?8f2gt$a=a^M{^mWt$)q7EWV>)y{hdduW(-*6W9Yq_e?YYhDH#$$?`SlD7hb z3y%VLy-SkL$WxBLHYIBEF^H29KBw4j!z7sYI8p}OU^zA}EcT7LeCJG&*CeI?cRRr_ z4uY0y0x>MhBW6tpeykM^A3`GUGfnq(ZP~+E1Vs0uHeJfu-U!J#CfAf^7r?K6WkMXM zH_M%Ls<10R8jbaia^G`SjaZzj7N)6lUW$`D1l$@G)&A$v^Vh9(^T-pEPPhzX*opCv zOkCMEUsSLD@NEdpgAfh1!8T0S9d$516lo2e8p1nve2}}Bf5Kt81>eMGyc!p&P&aj6 z0IOLG?v5vvdeUnbhtF_=mEu_V!MOS0U7a3K&+!5)F?remX0!VN2at31VOD}O5~#f> z+~;e^!?N}3l`*HMruBLTE=M38sFBM6-hu-AGY52WxVwhHK7yjv{^~ezK$PpZVuHc~ zm&qQQd0rUe-9K*%W=7;*DB*L)`LQ%K!A8N3o5Wp3Se;T_O_|!h+ZPrK+t@n9C20jW zBbvNc7(8Xl^5~asOqHaUX7<cZy?i!IonDe#0KfQx3C7QKh@@@|jPiiEuiTazF-!3~ z<SxVmF^4sRA5=)Ln5x`@d@rdRiemKHbRP=v)pmnCMQ&TADW%zI8X)qcP6dQ;B|#uz zq#8S^Z*|!WIT}r7R#rYBeTcQm<7ih4?aPr@g|U$HL@-)iXvR?Xt{0`W;Kusud)ZEa zv9RAutxa-aJ1%8KZpmt#*!;}Ur-p{jz$`?lQ>fId#R!E}{4Xo<ukco&c2^6odwsUq zu~|(fqrTDM(C4M4X5}g&^;A}qB;z`#NqS4%#5!##OsR)|njKwlhoLNDuk28@$?3A0 zhlgz`N|ib_E{&WxT-@;=*4mMk|HA=G9hh_Mp265l6s$hu|8bBsTx?9SmjOaX_RH#4 zm(!;2>au01l*w5VxB`=THjtlxems^<KFSzgo+amFm)$m?(q%Y@FSZ(osq_GefCk$a zQs`kPpyIEu7wOA^meFRSufC|Nu7+&CU<5|`@Q+ulc(L!Y)R0RT51QLL()X`@zu?NQ z3*h6=D{kB%PX0E$mgGeN>gPG&onGjmnVh_2#)5>Is@(p5=$@IMyJ4n<dhNS~rW)Lb zp*e%eWg87jGJ_O|yX`6}@P5+gfMMS<;=M7_*k{4~9gFIZ)P&26oZ#$HiQ&teA*HLz zz@(j&5UWxPsuhq0wb$A+R}A#xQz@KRu$}V<W4*L)EOqjd$@CNCE{+qO>dV}Y8}&|C zx?Yi#o}pA3Gi(rr96Uoh4z}@DI$<!loVRMIl!kOW)LbaGRbV@F$S<s9?1-P+q22&u zXZ<FmXh?`Bd276t5`Z}lZ3P3ZeD4$`ucJkz#aUHyxsA*cBFm;ycl<PbHM^ni0n=i= z*3ui}6Z-wsyG>jipv0XxkriM+<qnlP9A`3|klwBOTE*0&Zz9~}<Ch}F>kV$vtlr`4 zTB}k5Zl0CZ_@$p9vu}e3DB5Rm(AUn>A9os}VUIC=&10u4p_aF(d9SasjXLcah1r{q zzWS|=fac$9@e_eg-UOLKI--}^QPi5KLbRD&*8PKUm}kHGbH`*{L<VNII^?t|ibDee z@SmK<zmrU3nK70NG#lZk^Nf}DA=`BFv-~5kc)q?^lTdBj$Jr**Hv#3mm;;^Ms7thE z)%I<GocQe|^8GgjuWlvAQ+&|VCq^j#4x;(VXDs0|@c_wNaSgf1Fbz=n1h)vP2Dy%m zvfH35w?s~9!W*Z-dYejNn+|BIJZXZenK91{{$647HPdT)t3X8ZURVP-pjD0cAKaSB zFdJ<n+3mRLolgr2ZuX^^naScK&lP4W{?SD*+e@<n$=!M^c}W@Rmr`QJ+SpC$_~PK8 z*OLslq{t|nbHB58Cg&~=OTX>cu-OHGjrbfwkpL+LY&x&3^`zKU@f#BfDptRTN`<;| zPWRc5unJV_QN$mCX*7(OlqF0D=i}bcg?g59eIfzNrz;igDX@?$I1csMsI+N?QQ!vP z)5^-0Sg>kXdC!X&poJ2_UsGpM?vmJvOUY-$u$Y7_i#`8X>JTVaw9wnVTSzbAj$_Sa z2R*kkmvTZcgIPdTR#4Vs87!Ws2?AVSf))u#ehm<tJe4b{`g$Uhc52~NddDN;mRS&f z@Juhtq$~Lk%Pde`Hi#$MDhdWgc$aD&<VO!+%3gRX;R>JL^85}Z?;(%~D&WehRdN-V zT!r>8Q&)FiNpzJ>z5FjoCFld@1Ppox96%Dy*(iL3SIJWol5vuZ!)i_loPJnkxhhu? zRlhwKf?AapAHw&J7|CF_8mZQvR#t#+LBE`l?xjr&3Kf7jGP@{~1_Cc~-X=K}XeC%* zZ-+&QF*WYxY_tM231+J{N`!v2aO@|LSgD2Th~!}@zYVY3h+zxA8^X$2v7a=MbX;3g z#M=@wt=q;igm6#R6Vk*_e<ut_VT7J6fLv4@#6Lcl-f<PyVlBh6X@Z>6-Ne?@W4Bt5 z7Msev@;D@OEfl29g_GMc&p=GAJEVzBG!cR;O?74t_GgkS3(qcwO5Gt(D|DPgE~Zw? z|2tsqq>BcGE)<H~IJzw{J&<M2{*mO?c^DbmWVn&y!4S7fAw?$bdO^tK$;$`7Y$F52 z*zJ>Ue@yF@)vvTrR{BU}_MuMEhf<_dr-%Sf5^DFB#`d1weR1nNmibFO3tz(KME<~v z6Yf`Of4jVb6jnl66;u@=R+4nJHPA#$?R3_IA0wvY&Pe`#d1eg%=|49zoxEAW4re?B z$j7FLlFF&5nn-byRaZwtO|{Zq7d>Zx_W=}pT=3*0mp}y+RZ6f*LPd#}qK3LMG}BrK zUG=(t*9H!_;>A~P`4v=5Y2{TGCR&12HPzEdb8U3gO>gz3EI8tZH$Qop3MsCP5LJYW zktj_q^)-eJs2I^w7`Kq9GaoFBPzfhm{n!4}hr9>xfhVRvVtxAfmH!eW&*ueT!9U@} z4|;vRMCLOb6EGA0{K}arGPO@6UiQcSI~;jF8^LzGjUD{nO<T`te3I}DenCo3>b3>V z^Em@DU`HWezHN<0?o)$Cw4$58wQbug<BSjR%;b*s_%HGob-ag$zo9Ssks+#&$4HFF zWXvS<)CnGeSdL&sl9yFqk63KPcDzk?s1pP9*o!25g&)X1b&^L4{)2R!BU$QX4+n}- zi8^vco#N4sYq*0)ik$fBSdTwrO&(D3SMqmtoaz5D07EgFOi;(0ros;ku$Zh=eN3T< z#;aJ%Z_db)W-#OME_UG~<ufG}-{2=C<IwR<Eh?aZ#5*pyVXwonW#EVt&TUOFFjsr+ z4^?r&)$F+7j$PJ8EENeJ7B(250puwJPYVI&KtZ23M)0!ent)j2H@@>fg}3n)AMh3n z{A+@bF^`A1jVXSX;A{MY5%l9K-%Ic_E~5*l(axVF_#3S_ih5}HT0($v02OG1(HP2) z6v&l07=6(l9r><=+==bc5{*%h&miPUtb=qUBASmU<V}o3RfI&BW{CsAVxQgDH$_WU zOJi+y)z?sCZMD}?=iPM26DM7C(?c(P^wYMc;v`<-qQr=kdw#n>zV6;Ey$fsv<$HGS zJ+lS^Cl^T3m=>l5sg0UxI+!=Lo;!zjen=r$7fGKS%!uh`x|MFHJLztkN%zse=s)y7 znne%N!-1oD2Mt#R#!3Avk5l6;3lmHU5i4qB^=&W!{Wr<Vh~Ye#Z#X&g&eP1+VyriZ z7%QWk#gZl%b8SkVZh7)TUB&1jVHi0ZNjez_nQu8>W~BCk{3J1QvXl+>2XjEMXflIx zl0c2#ic3~IDz2oRl~&fScDJX!l~++^b=B8U<KSvlJGEB_byO#HRu^?uH+5H!nGQYr zY-cz7F~*$39Op!gP{LcD5&SNsJ#$eCqJfH|({HmZ!^DaZVu!NC-Wbjq#DPhEAdWK^ z7X;!ov#BJAv(Zl_5SMm|piz^QNZiDPC`x%KomSL6h;J5Ig^!moS)s-HA=ImX=#JIf zcmoagcS8*~(r6Ri?3sW5NBQt4gixX-N>@jQ=GyA4r?D2=>Y%G$%FZY2cu5LoNPa=s zP*z(*S!X?EqfL}8wo<m+LD^+DCDUHYet%K^@x{Hw)7?0~G49Qge0!P}G$(y|QtWMB z*qZhiNbkOuMeSKAlBxdI#hrO9kyWCtu)9c<$(;@DOM1&>#qwXWV@{>NN>#NQu0YY| z`r_e#O7mrON~2cSvQbaAAp<H8E1`0{+eAJZPWT{L=uV|`n?6fUf8AzRStNhfS?`1^ zk26_z76hR*g3NYh!2?AlC_6~;m^+Rp(mRq5lNUVQ9OO!OJ*Liq#vq%5mkPy#8DGqs zatMMKid8ztcLM2I5s_Kda+A+fyp%ASAOt5&R#|I<&9>QTkA40o2t^RAR1<9GS%!0~ zy3+Azz6efI)RXVE8;v#BQ;JAXOdyCXC8V(6iZ{L#p&ZrdSpGDpT^+oM%pWe7FP6%c zYOUUAw$^2Gg&~*IBPfOwB;}7s)|$5Khui(}e7z~=3@WN+{Tqn`N1FA>ql`Kl!N1(M zksKvzv}~ehn_c#+;tUluM^HRgn6SKt_r|0g7VX>t)_C@b3kNCBB29$~2z9nP8b;dz z3?~8R_{&9Oe%u{=$>N$5&+@Y9C-4q<10-AX!DIjy(1C(ogEf+Y^s5F=Phzp=1y-7q zf{iO>R1zs!O&L|FM;l<M-6e+i!&gQ3S04RO_0KJ*w7)+C|KooFEVvK?K^BV8hAALq zpbFDa4lU3Qr{OBxfIc)w!VB`K;4WSwfUM+BUgT0pl9r@Vh<?hAW`jmeTDIf=zV}8- zf=;2G;(`+;$^7{Lz2J&TSt=7HMJ<i0v_C)4a+zgm`n`aS?Ed1NNjuNMh!-RN8xf)C zm#i?Ifz8u%(kt%DCd@yRATdpfn6N~CNS;{>3Qepq@9*^wAIPbGhCah1a>}2<(aRm@ z1<1k3{`KB{+dr><<;xS0$Q{2N-@NaL%+bKKLj<W5m$*mZFAh5<c%*OoR^B4K)fRTQ zJ^KIMcGPyE>$(P(7O4U+_oy8C$f6e4n-#(>bg_^9TN`9IS{#FaAdf~5aMo4Xvq8tN z0y-77bn5Dnd++d$!;{c!w-JC&ZY%v_u9GwIR}-gp{&}jO83+t%-=Xq4JzPgSyhFdv z>07O@?j}^QOa0@dlKb6{e$}xfZEItH3?`Eo%p^><l;74twP9(UtgBO9Y(q_3Rdb}O zxBvgA)G}3V{TF*UdB@9KSogE8rdPe_bs1ffXyGEoixMY6iu!7*qpr4EXr;AueGSsj z0K*In3^mhM+wE}Je8M)TTyWQAw><E~S;w7n+HKd}bjuNMeDv0PUwugMB@jDt5J&Oh zdoL1Wr#5SK+hahMREMNFEZG6o9aY0I4V+WU3H6-O(0R3;)W}5{E@<Mi#x7~*s-~{! z;J$Y5YUzgd?rGzi=I-d|fzBR!q>IP8d8(@?x_hRF=X!dfw^w?3sgKu&_^iKo2K!{V zA4d9Rv_D4qZH&Lhi^lnHtbc_16V9YCCI*<-gxL+5R)@Kbnbm+fjabmslIE6Lo?vCr zibRS2Hz9;65n6kzr(F0#r?4o-{3r{fEsN`5nyT90f%es2N7+5<aZh^Me9ya3_b4L_ zob_n48Fj>wMxI6A%kIx2<~N^-<~#oh<~-gwa~XGhF0N?+9)AHK9e^v~3MgR076S-E z+5;Q12nt-69*5rvWHS^(a|4BurBGxGSqw!%F-TufTp`^+3FHe<5@`)eA%j6_q!lRh z3#B(G3o1c^fXbi>q&QF&RD-kup$hp8gdsnGaO4*dfpi3sKaeF51(HL~_9>tya0hCE z4B!tMfeZwVkv^aaG6*z94WJn^8Jh3WbkO2`6SM?vef_Q-7~r?-4AdnI3_|*Y!AMUq z1Q`H^UeSZ&1lka+sH;C$f^39U$WB;|Y=Sk&E?A570_%_!upUhX8<3T-5y=m1LT15c zRDmsM3fPLQf^BF$upL<gJGPJ<uoHG6H^6R%RtK5La@dP>2K&(ZU_Wvl{Dqjn-`8b! zK$$?EfPaxk;6LOk_+LJx6UY(`4hRPaMS?@(!C_J0NXG@Rj|6Z`3OKGlII-6RC&4LD z2b@;gf-`#ya2A{ct-yID9bC{CTr>z=(hpoV09-K)T&;oNTF5uxx}o5PnQ(KT3b(** zFdgnFi{WmKfO{bV+_w!LSOpJlfJgp@$2P+g`{1en;F*KqxwGKKJPuxhSHA7nxDDRS z>)<VTSFV1KBjCgP27El9yak`V2Vd^599}+vZ@cmxC||%2#0mKM4Y31$f#22kd+>)n z;sa!t?;z)f1k|-Y17iH#MRuz$Y9In)z*@utu@Gx#Prd;pLF_wOix5C6#IbW|kpoDB zIKyFx3nW8a;Q+)9szco2D8vJ5Ks@0X#0wfgygTRo5I`-6FPwn*K|P57b<X%_0vbYc z!Ffn-s13;jCn0&E5hNd6gamdn4u?VK!XYQ<Gznz^T!z@7F{A)of)s>ikV0@3QW%;- ziag~CD$*0s0aC1UKU4<L4pIW{LP|nQNGZ4hDGlu*W$Lb(Wq~%3a&Qe249y|s;SMAO zIzlSI14za1&>2z*r1Eavr3%mmQZ?vO4d@054Z4H@T_NG{1QG$=A(8M55(PaV(eNA+ z13e+J@B$JCy&>`N3X%Z5Ac^o2k_>$yDexMS3PT`i@EMX0{UO!i9i#>fhSY>lkXkSt zsSV#Cbzme?7k)tM!DysD{DL%qQAk7h3CVylNF(?SX$<3$CNnt|{tApknn5<CIgCYG zz#mA<&SZ&KNs9~&I+LVar5GS>_b?G@H!E^A=**Kgm2{VNL1%V|uB3|`2=*`y=~C=L zy540jiCQUcAl>gWiv+IB&d9FdE_2AD%Iu0n4eqjlB&-xqkiL6Zg7lmHkaEFYmXdG5 zU6zxUl{qhRGPui1(zsFrL5A#M1u}FeAIQvkD+wGxBIFPJj|RX5G*=hod;n9>JOi<U z9$g$;)ZAQO)ZW}!q-}04>TGT;8f<Pa>Td3o8Zc%f@4?uBd;sGg<Rcha$R}`%KsFFK z2a5=tN4z0$0p=69h<HHY5-cQe8S#R^&#;WZF9XR9W_ITI_5`y4%tDYEm_-a^3TDZ; z6l5A^*+8aZR*Wk_)?!v6U18QC?O@giCzuUjHiFE->;`!Vb8ttx!yL#pm=lku5q^<5 zgE@=bhdGD2iezH0VXh<pW1a%phItm*gLxU*f_WR+fq4hnjd>s0j`<K-k79%T&}0PJ zkktsPJ&?x;s(Z8{$TI{r8aD-bjiBilHBHW-X<l+BO#{hUG&Q*}o7Zzd3zBnbT7aBK z(|qK7n&u}L&@_k(nT+>>mVr&tT(DVDAK2VcKiE7`f7rZ`uh?><0k8$4-msNGePK&P z0b6tAC$`o|Hnuj%A8bbk@|i-*$16aqq0lz8DhlmHBT#4;8jV7kO(V&@G>sv%Xc|Qx zplK|5lBQL-@P~0WGz^7H4>S&iH;y-f#-oTgnusF415HAa;W<_sv?Alk@nO6bnMh6# zo2|$Ua%Q;eMOJ`TMhPog5hd)<awuVshM<H48jKQ-XeE?zLd&CsbHKT@0{QUCL`ufS z8{23={VIw2`N@C!ef0dt8P5TCzv5rdF`f^n@oNAE3V^_u(Of%EKrOF>@Nyne``cNl zM!p&dmad6*=A!jfm8!PBPP$-C^hCiLsG_JO-mmUxF+$YWIMs~R7?nap9SLhLQDap^ z3sFxq+!?CLBPx2|8S3!W*m-@h=_%bl?<Qm>VUO3Hq#l`t);Tjo`aK8VD*~)uR0ATb z(4w}Ita&5a=Yf8WL`fZ)y7(1@C@z+U=-%-@^)a+nUsiJ>8(XiU=N0XrtY!q$7vF`g z44Ow)TWwvetfMbA*FLS<ND{Azgsuo}i*RkbpzY$e3)?Ob!fYkqe6=N?RWcRdG>{R? z4I4^v)!-V@3}63TUoCCzRptzfAu5VyzI^rlc;$U%B{mc1tHFjD@zgX<mSLBdv2mU# zSlKe3xw`V&%5SPsH8-#~m86s^@(JZY0qH{c3E^S2J8n2?vs*5@U~c82dp<gBpL5<i z=#T?yGzSwxNIlvz9j<^%5(N3Cx)SxR$iTPK*EdyNEo5V#g*@q23oEID;>szZygUlB zsUg8mvgs|<Sb$9cAG1C{6nB~zkXt&NiL9^ESTGf_s+jH}QAwZKrjr<zv=*a+(xR07 z4#{xqe6_LwGVS1AFMDE*D?XV3)Swxl(05-{15`Tw-vq&#N?oSd6U_|rNn#efwPjX< z4PbV7*~A=h<6q{86Q`InzOI<#aJjY{xp~PzERI0e;ED-;lFt-38P5!=N-eWcSf-hk z)_rGo6x0ajKwd3kj`(OJbEdeSHFufnMu^^@Lm>7HiBJVo60b%WN%S$Z5Nxqltnp6> zv7@zauNFLGFbBe|`if)xI|*~5s<nbS6KWmW%Y}dW-v7(Ao8hawO1-Gpv)yiQ^(^cN ztN*TjZ~tFyn+McH!X{1qTCx)!_x(M#*Iiz1V1$w@oTBO5dAl$_zr65~JuKv@&Ot|J zCyF$az1%v<$${#^-50`$oDRBpqA$DB&Xhu(jj!A{=HTM7(#$~aUc5!)Kni=ES;lsZ z#*G7+`Yw$Lb&THHRwcr^Vq}~@NO=qwN(AjG(S5DxS+)B;##<k(rb@dS?iV3A9?o3L zhX`%7L_<T3EMqO%!K`sNu_ay0u%dyH1Y@pn>WkKW);w$B^4R%h3z~-PPkBCgrIE1{ zMViTXX*COGn&GNd7*97z??7F&TU>X&XJsvA_L0U=Xa?+x*0;nVHk;pOQB1SG(L2`P zJ1guqd4~;-k$nSFB~PfLHiq`eY)R1Uw53#~_RTqGX5TzcWaYiVd9r;AxE^b=UM>ce z2h+y5OS@P+GT14XCL4E2oi(k!!KIm|K@7<)zjDKalf3a+rq*SQb)l5KFzFZRI<jZF zQKP5rNLYnLDdTP)nyDP`ce&!arCEaute4#?o6wn}3G)8?wl<!&_V>Ok00000&(Su6 literal 0 HcmV?d00001 diff --git a/fonts/Inter-Medium.woff2 b/fonts/Inter-Medium.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0fd2ee7370b34dd5628eac3653b541ce0508f154 GIT binary patch literal 111380 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:n&Y3J(F%MgS0j4AsOlPp;kC;bT%#hdlcJf?URo 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 literal 0 HcmV?d00001 diff --git a/fonts/Inter-Regular.woff2 b/fonts/Inter-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b8699af29b021cbbbdf82e18f5c4a2271d19b616 GIT binary patch literal 108488 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 IKiJU!1B3_vwEzGB literal 0 HcmV?d00001 diff --git a/fonts/Inter-SemiBold.woff2 b/fonts/Inter-SemiBold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..95c48b184ea96eeeba1eb03904abf1c587f848b6 GIT binary patch literal 111588 zcmV)gK%~ESPew8T0RR910kh-)4FCWD1pG7r0keky1ONa400000000000000000000 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 literal 0 HcmV?d00001 diff --git a/fonts/index.ts b/fonts/index.ts new file mode 100644 index 000000000..1ecbba45b --- /dev/null +++ b/fonts/index.ts @@ -0,0 +1,74 @@ +import localFont from "next/font/local"; + +export const aeonik = localFont({ + src: [ + { + path: "./Aeonik-Bold.woff2", + weight: "bold", + style: "normal", + }, + { + path: "./Aeonik-Bold.woff", + weight: "bold", + style: "normal", + }, + ], + display: "optional", + variable: "--font-aeonik", +}); + +export const aeonikFono = localFont({ + src: [ + { + path: "./AeonikFono-Regular.woff2", + weight: "normal", + style: "normal", + }, + { + path: "./AeonikFono-Regular.woff", + weight: "normal", + style: "normal", + }, + ], + display: "optional", + variable: "--font-fono", +}); + +export const aeonikMono = localFont({ + src: [ + { + path: "./AeonikMono-Regular.woff2", + weight: "normal", + style: "normal", + }, + { + path: "./AeonikMono-Regular.woff", + weight: "normal", + style: "normal", + }, + ], + display: "swap", + variable: "--font-mono", +}); + +export const inter = localFont({ + src: [ + { + path: "./Inter-Regular.woff2", + weight: "normal", + style: "normal", + }, + { + path: "./Inter-Medium.woff2", + weight: "500", + style: "normal", + }, + { + path: "./Inter-SemiBold.woff2", + weight: "600", + style: "normal", + }, + ], + display: "swap", + variable: "--font-inter", +}); From 734968df7ffc04804935a07419555ec48f8b7b92 Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 11:56:01 -0500 Subject: [PATCH 12/21] add script for link checking --- lint.ts | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 lint.ts diff --git a/lint.ts b/lint.ts new file mode 100644 index 000000000..965e750a2 --- /dev/null +++ b/lint.ts @@ -0,0 +1,52 @@ +import { + printErrors, + readFiles, + scanURLs, + validateFiles, +} from "next-validate-link"; +import { getSlugs, parseFilePath } from "fumadocs-core/source"; +import { getTableOfContents } from "fumadocs-core/server"; +import path from "node:path"; + +async function checkLinks() { + // we read them all at once to avoid repeated file read + const docsFiles = await readFiles("content/docs/**/*.{md,mdx}"); + + // other collections too! + // const blogFiles = await readFiles("content/blog/**/*.{md,mdx}"); + + const scanned = await scanURLs({ + populate: { + // "(home)/blog/[slug]": blogFiles.map((file) => { + // const info = parseFilePath(path.relative("content/blog", file.path)); + + // return { + // value: getSlugs(info)[0], + // hashes: getTableOfContents(file.content).map((item) => + // item.url.slice(1) + // ), + // }; + // }), + "(docs)/[...slug]": docsFiles.map((file) => { + const info = parseFilePath(path.relative("content/docs", file.path)); + + return { + value: getSlugs(info), + hashes: getTableOfContents(file.content).map((item) => + item.url.slice(1) + ), + }; + }), + }, + }); + + printErrors( + await validateFiles([...docsFiles], { + scanned, + whitelist: (url) => url.startsWith("#!") || url === "tooltip", + }), + true + ); +} + +void checkLinks(); From fde94f9ea488f27540803b3429169df9243e3e72 Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 11:56:16 -0500 Subject: [PATCH 13/21] add new client page --- page.client.tsx | 254 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 page.client.tsx diff --git a/page.client.tsx b/page.client.tsx new file mode 100644 index 000000000..691600d03 --- /dev/null +++ b/page.client.tsx @@ -0,0 +1,254 @@ +"use client"; + +import { + Fragment, + type HTMLAttributes, + useEffect, + useMemo, + useRef, + useState, +} from "react"; +import { ChevronLeft, ChevronRight } from "lucide-react"; +import Link from "next/link"; +import { cva } from "class-variance-authority"; +import { cn } from "./lib/utils"; +import { useI18n } from "fumadocs-ui/provider"; +import { useTreeContext, useTreePath } from "fumadocs-ui/provider"; +import { useSidebar } from "fumadocs-ui/provider"; +import type { PageTree } from "fumadocs-core/server"; +import { usePathname } from "next/navigation"; +import { useNav } from "./components/layout/nav"; +import { + type BreadcrumbOptions, + getBreadcrumbItemsFromPath, +} from "fumadocs-core/breadcrumb"; +import { usePageStyles } from "fumadocs-ui/provider"; +import { isActive } from "./lib/is-active"; +import { TocPopover } from "./components/layout/toc"; +import { useEffectEvent } from "fumadocs-core/utils/use-effect-event"; + +export function TocPopoverHeader(props: HTMLAttributes<HTMLDivElement>) { + const ref = useRef<HTMLElement>(null); + const [open, setOpen] = useState(false); + const sidebar = useSidebar(); + const { tocNav } = usePageStyles(); + const { isTransparent } = useNav(); + + const onClick = useEffectEvent((e: Event) => { + if (!open) return; + + if (ref.current && !ref.current.contains(e.target as HTMLElement)) + setOpen(false); + }); + + useEffect(() => { + window.addEventListener("click", onClick); + + return () => { + window.removeEventListener("click", onClick); + }; + }, [onClick]); + + return ( + <div + className={cn("sticky overflow-visible z-10", tocNav, props.className)} + style={{ + top: "calc(var(--fd-banner-height) + var(--fd-nav-height))", + }} + > + <TocPopover open={open} onOpenChange={setOpen} asChild> + <header + ref={ref} + id="nd-tocnav" + {...props} + className={cn( + "border-b border-fd-foreground/10 backdrop-blur-md transition-colors", + (!isTransparent || open) && "bg-fd-background/80", + open && "shadow-lg", + sidebar.open && "max-md:hidden" + )} + > + {props.children} + </header> + </TocPopover> + </div> + ); +} + +export function PageBody(props: HTMLAttributes<HTMLDivElement>) { + const { page } = usePageStyles(); + + return ( + <div + id="nd-page" + {...props} + className={cn("flex w-full min-w-0 flex-col", page, props.className)} + > + {props.children} + </div> + ); +} + +export function PageArticle(props: HTMLAttributes<HTMLElement>) { + const { article } = usePageStyles(); + + return ( + <article + {...props} + className={cn( + "flex w-full flex-1 flex-col gap-2 px-4 pt-8 md:px-6 md:pt-12 xl:px-12 xl:mx-auto", + article, + props.className + )} + > + {props.children} + </article> + ); +} + +export function LastUpdate(props: { date: Date }) { + const { text } = useI18n(); + const [date, setDate] = useState(""); + + useEffect(() => { + // to the timezone of client + setDate(props.date.toLocaleDateString()); + }, [props.date]); + + return ( + <p className="text-sm text-fd-muted-foreground"> + {text.lastUpdate} {date} + </p> + ); +} + +export interface FooterProps { + /** + * Items including information for the next and previous page + */ + items?: { + previous?: { name: string; url: string }; + next?: { name: string; url: string }; + }; +} + +const itemVariants = cva( + "flex w-full flex-col gap-2 rounded-lg border p-4 text-sm transition-colors hover:bg-fd-accent/80 hover:text-fd-accent-foreground" +); + +const itemLabel = cva( + "inline-flex items-center gap-0.5 text-fd-muted-foreground" +); + +function scanNavigationList(tree: PageTree.Node[]) { + const list: PageTree.Item[] = []; + + tree.forEach((node) => { + if (node.type === "folder") { + if (node.index) { + list.push(node.index); + } + + list.push(...scanNavigationList(node.children)); + return; + } + + if (node.type === "page" && !node.external) { + list.push(node); + } + }); + + return list; +} + +const listCache = new WeakMap<PageTree.Root, PageTree.Item[]>(); + +export function Footer({ items }: FooterProps) { + const { root } = useTreeContext(); + const { text } = useI18n(); + const pathname = usePathname(); + + const { previous, next } = useMemo(() => { + if (items) return items; + + const cached = listCache.get(root); + const list = cached ?? scanNavigationList(root.children); + listCache.set(root, list); + + const idx = list.findIndex((item) => isActive(item.url, pathname, false)); + + if (idx === -1) return {}; + return { + previous: list[idx - 1], + next: list[idx + 1], + }; + }, [items, pathname, root]); + + return ( + <div className="grid grid-cols-2 gap-4 pb-6"> + {previous ? ( + <Link href={previous.url} className={cn(itemVariants())}> + <div className={cn(itemLabel())}> + <ChevronLeft className="-ms-1 size-4 shrink-0 rtl:rotate-180" /> + <p>{text.previousPage}</p> + </div> + <p className="font-medium md:text-[15px]">{previous.name}</p> + </Link> + ) : null} + {next ? ( + <Link + href={next.url} + className={cn(itemVariants({ className: "col-start-2 text-end" }))} + > + <div className={cn(itemLabel({ className: "flex-row-reverse" }))}> + <ChevronRight className="-me-1 size-4 shrink-0 rtl:rotate-180" /> + <p>{text.nextPage}</p> + </div> + <p className="font-medium md:text-[15px]">{next.name}</p> + </Link> + ) : null} + </div> + ); +} + +export type BreadcrumbProps = BreadcrumbOptions; + +export function Breadcrumb(options: BreadcrumbProps) { + const path = useTreePath(); + const { root } = useTreeContext(); + const items = useMemo(() => { + return getBreadcrumbItemsFromPath(root, path, { + includePage: options.includePage ?? false, + ...options, + }); + }, [options, path, root]); + + if (items.length === 0) return null; + + return ( + <div className="flex flex-row items-center gap-1.5 text-[15px] text-fd-muted-foreground"> + {items.map((item, i) => { + const className = cn( + "truncate", + i === items.length - 1 && "text-muted-foreground font-medium" + ); + + return ( + <Fragment key={i}> + {i !== 0 && <span className="text-fd-foreground/30">/</span>} + {item.url ? ( + <Link + href={item.url} + className={cn(className, "transition-opacity hover:opacity-80")} + > + {item.name} + </Link> + ) : ( + <span className={className}>{item.name}</span> + )} + </Fragment> + ); + })} + </div> + ); +} From e0e28c2d68bad7e05caea0e1cb5115c49097e807 Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 11:56:42 -0500 Subject: [PATCH 14/21] add readme --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..fd5a196f3 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Hiro Docs From 71b837f1de155611e69f79f8c0333583b9c48100 Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 12:09:32 -0500 Subject: [PATCH 15/21] remove unnecessary logs --- components/search-dialog.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/components/search-dialog.tsx b/components/search-dialog.tsx index 2062a868b..477a6ec49 100644 --- a/components/search-dialog.tsx +++ b/components/search-dialog.tsx @@ -331,8 +331,6 @@ export default function SearchDialog() { type: "static", }); - console.log({ search, currentQuery }); - // State to track if we are "waiting" for results after setting search // Since the hook doesn't provide explicit loading state const [isWaitingForResults, setIsWaitingForResults] = React.useState(false); From 3ebb7559391ef28a55b4c9806926823c826767fe Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 12:26:50 -0500 Subject: [PATCH 16/21] ignore .source --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b1f63bec0..ef33eb08b 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ openapi .cache .cursorrules .next +.source/ tmp \ No newline at end of file From 6dae6a89841f192d0b245b6c094ed9fc3e5412bc Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 12:27:10 -0500 Subject: [PATCH 17/21] stop tracking .source folder --- .source/index.ts | 522 -------------------------------------- .source/source.config.mjs | 35 --- 2 files changed, 557 deletions(-) delete mode 100644 .source/index.ts delete mode 100644 .source/source.config.mjs diff --git a/.source/index.ts b/.source/index.ts deleted file mode 100644 index 2c4b37160..000000000 --- a/.source/index.ts +++ /dev/null @@ -1,522 +0,0 @@ -// @ts-nocheck -- skip type checking -import * as docs_517 from "../content/docs/stacks/token-metadata-api/client/tokens/index.mdx?collection=docs&hash=1744048693706" -import * as docs_516 from "../content/docs/stacks/token-metadata-api/client/tokens/get-ft-metadata.mdx?collection=docs&hash=1744048693706" -import * as docs_515 from "../content/docs/stacks/chainhook/references/scopes/stacks.mdx?collection=docs&hash=1744048693706" -import * as docs_514 from "../content/docs/stacks/chainhook/references/scopes/bitcoin.mdx?collection=docs&hash=1744048693706" -import * as docs_513 from "../content/docs/stacks/api/token-metadata/tokens/semi-fungible-token-metadata.mdx?collection=docs&hash=1744048693706" -import * as docs_512 from "../content/docs/stacks/api/token-metadata/tokens/non-fungible-token-metadata.mdx?collection=docs&hash=1744048693706" -import * as docs_511 from "../content/docs/stacks/api/token-metadata/tokens/index.mdx?collection=docs&hash=1744048693706" -import * as docs_510 from "../content/docs/stacks/api/token-metadata/tokens/fungible-tokens.mdx?collection=docs&hash=1744048693706" -import * as docs_509 from "../content/docs/stacks/api/token-metadata/tokens/fungible-token-metadata.mdx?collection=docs&hash=1744048693706" -import * as docs_508 from "../content/docs/stacks/api/token-metadata/info/status.mdx?collection=docs&hash=1744048693706" -import * as docs_507 from "../content/docs/stacks/api/token-metadata/info/index.mdx?collection=docs&hash=1744048693706" -import * as docs_506 from "../content/docs/stacks/api/stacks-blockchain/transactions/transactions-for-address.mdx?collection=docs&hash=1744048693706" -import * as docs_505 from "../content/docs/stacks/api/stacks-blockchain/transactions/transactions-by-block.mdx?collection=docs&hash=1744048693706" -import * as docs_504 from "../content/docs/stacks/api/stacks-blockchain/transactions/transaction-events.mdx?collection=docs&hash=1744048693706" -import * as docs_503 from "../content/docs/stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions.mdx?collection=docs&hash=1744048693706" -import * as docs_502 from "../content/docs/stacks/api/stacks-blockchain/transactions/recent-transactions.mdx?collection=docs&hash=1744048693706" -import * as docs_501 from "../content/docs/stacks/api/stacks-blockchain/transactions/mempool-transactions.mdx?collection=docs&hash=1744048693706" -import * as docs_500 from "../content/docs/stacks/api/stacks-blockchain/transactions/index.mdx?collection=docs&hash=1744048693706" -import * as docs_499 from "../content/docs/stacks/api/stacks-blockchain/transactions/get-transaction.mdx?collection=docs&hash=1744048693706" -import * as docs_498 from "../content/docs/stacks/api/stacks-blockchain/transactions/get-raw-transaction.mdx?collection=docs&hash=1744048693706" -import * as docs_497 from "../content/docs/stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction.mdx?collection=docs&hash=1744048693706" -import * as docs_496 from "../content/docs/stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions.mdx?collection=docs&hash=1744048693706" -import * as docs_495 from "../content/docs/stacks/api/stacks-blockchain/transactions/details-for-transactions.mdx?collection=docs&hash=1744048693706" -import * as docs_494 from "../content/docs/stacks/api/stacks-blockchain/transactions/address-transactions.mdx?collection=docs&hash=1744048693706" -import * as docs_493 from "../content/docs/stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient.mdx?collection=docs&hash=1744048693706" -import * as docs_492 from "../content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders.mdx?collection=docs&hash=1744048693706" -import * as docs_491 from "../content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries.mdx?collection=docs&hash=1744048693706" -import * as docs_490 from "../content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients.mdx?collection=docs&hash=1744048693706" -import * as docs_489 from "../content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient.mdx?collection=docs&hash=1744048693706" -import * as docs_488 from "../content/docs/stacks/api/stacks-blockchain/stacking-rewards/index.mdx?collection=docs&hash=1744048693706" -import * as docs_487 from "../content/docs/stacks/api/stacks-blockchain/tokens/index.mdx?collection=docs&hash=1744048693706" -import * as docs_486 from "../content/docs/stacks/api/stacks-blockchain/tokens/holders.mdx?collection=docs&hash=1744048693706" -import * as docs_485 from "../content/docs/stacks/api/stacks-blockchain/stacking-pool/members.mdx?collection=docs&hash=1744048693706" -import * as docs_484 from "../content/docs/stacks/api/stacks-blockchain/stacking-pool/index.mdx?collection=docs&hash=1744048693706" -import * as docs_483 from "../content/docs/stacks/api/stacks-blockchain/smart-contracts/status.mdx?collection=docs&hash=1744048693706" -import * as docs_482 from "../content/docs/stacks/api/stacks-blockchain/smart-contracts/info.mdx?collection=docs&hash=1744048693706" -import * as docs_481 from "../content/docs/stacks/api/stacks-blockchain/smart-contracts/index.mdx?collection=docs&hash=1744048693706" -import * as docs_480 from "../content/docs/stacks/api/stacks-blockchain/smart-contracts/events.mdx?collection=docs&hash=1744048693706" -import * as docs_479 from "../content/docs/stacks/api/stacks-blockchain/smart-contracts/by-trait.mdx?collection=docs&hash=1744048693706" -import * as docs_478 from "../content/docs/stacks/api/stacks-blockchain/search/search-by-id.mdx?collection=docs&hash=1744048693706" -import * as docs_477 from "../content/docs/stacks/api/stacks-blockchain/search/index.mdx?collection=docs&hash=1744048693706" -import * as docs_476 from "../content/docs/stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle.mdx?collection=docs&hash=1744048693706" -import * as docs_475 from "../content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle.mdx?collection=docs&hash=1744048693706" -import * as docs_474 from "../content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle.mdx?collection=docs&hash=1744048693706" -import * as docs_473 from "../content/docs/stacks/api/stacks-blockchain/proof-of-transfer/index.mdx?collection=docs&hash=1744048693706" -import * as docs_472 from "../content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycles.mdx?collection=docs&hash=1744048693706" -import * as docs_471 from "../content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycle.mdx?collection=docs&hash=1744048693706" -import * as docs_470 from "../content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/mints.mdx?collection=docs&hash=1744048693706" -import * as docs_469 from "../content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/index.mdx?collection=docs&hash=1744048693706" -import * as docs_468 from "../content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/holdings.mdx?collection=docs&hash=1744048693706" -import * as docs_467 from "../content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/history.mdx?collection=docs&hash=1744048693706" -import * as docs_466 from "../content/docs/stacks/api/stacks-blockchain/names/owned-by-address.mdx?collection=docs&hash=1744048693706" -import * as docs_465 from "../content/docs/stacks/api/stacks-blockchain/names/namespaces.mdx?collection=docs&hash=1744048693706" -import * as docs_464 from "../content/docs/stacks/api/stacks-blockchain/names/namespace-names.mdx?collection=docs&hash=1744048693706" -import * as docs_463 from "../content/docs/stacks/api/stacks-blockchain/names/names.mdx?collection=docs&hash=1744048693706" -import * as docs_462 from "../content/docs/stacks/api/stacks-blockchain/names/name-zonefile.mdx?collection=docs&hash=1744048693706" -import * as docs_461 from "../content/docs/stacks/api/stacks-blockchain/names/name-subdomains.mdx?collection=docs&hash=1744048693706" -import * as docs_460 from "../content/docs/stacks/api/stacks-blockchain/names/name-details.mdx?collection=docs&hash=1744048693706" -import * as docs_459 from "../content/docs/stacks/api/stacks-blockchain/names/index.mdx?collection=docs&hash=1744048693706" -import * as docs_458 from "../content/docs/stacks/api/stacks-blockchain/names/historical-zonefile.mdx?collection=docs&hash=1744048693706" -import * as docs_457 from "../content/docs/stacks/api/stacks-blockchain/mempool/transaction-fee-priorities.mdx?collection=docs&hash=1744048693706" -import * as docs_456 from "../content/docs/stacks/api/stacks-blockchain/mempool/index.mdx?collection=docs&hash=1744048693706" -import * as docs_455 from "../content/docs/stacks/api/stacks-blockchain/fees/index.mdx?collection=docs&hash=1744048693706" -import * as docs_454 from "../content/docs/stacks/api/stacks-blockchain/fees/fee-rate.mdx?collection=docs&hash=1744048693706" -import * as docs_453 from "../content/docs/stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text.mdx?collection=docs&hash=1744048693706" -import * as docs_452 from "../content/docs/stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply.mdx?collection=docs&hash=1744048693706" -import * as docs_451 from "../content/docs/stacks/api/stacks-blockchain/info/status.mdx?collection=docs&hash=1744048693706" -import * as docs_450 from "../content/docs/stacks/api/stacks-blockchain/info/network-given-block-time.mdx?collection=docs&hash=1744048693706" -import * as docs_449 from "../content/docs/stacks/api/stacks-blockchain/info/network-block-time.mdx?collection=docs&hash=1744048693706" -import * as docs_448 from "../content/docs/stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply.mdx?collection=docs&hash=1744048693706" -import * as docs_447 from "../content/docs/stacks/api/stacks-blockchain/info/index.mdx?collection=docs&hash=1744048693706" -import * as docs_446 from "../content/docs/stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text.mdx?collection=docs&hash=1744048693706" -import * as docs_445 from "../content/docs/stacks/api/stacks-blockchain/faucets/stx.mdx?collection=docs&hash=1744048693706" -import * as docs_444 from "../content/docs/stacks/api/stacks-blockchain/faucets/index.mdx?collection=docs&hash=1744048693706" -import * as docs_443 from "../content/docs/stacks/api/stacks-blockchain/burn-blocks/index.mdx?collection=docs&hash=1744048693706" -import * as docs_442 from "../content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks.mdx?collection=docs&hash=1744048693706" -import * as docs_441 from "../content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-block.mdx?collection=docs&hash=1744048693706" -import * as docs_440 from "../content/docs/stacks/api/stacks-blockchain/blocks/recent-blocks.mdx?collection=docs&hash=1744048693706" -import * as docs_439 from "../content/docs/stacks/api/stacks-blockchain/blocks/index.mdx?collection=docs&hash=1744048693706" -import * as docs_438 from "../content/docs/stacks/api/stacks-blockchain/blocks/get-blocks.mdx?collection=docs&hash=1744048693706" -import * as docs_437 from "../content/docs/stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block.mdx?collection=docs&hash=1744048693706" -import * as docs_436 from "../content/docs/stacks/api/stacks-blockchain/blocks/get-block.mdx?collection=docs&hash=1744048693706" -import * as docs_435 from "../content/docs/stacks/api/stacks-blockchain/blocks/block-by-height.mdx?collection=docs&hash=1744048693706" -import * as docs_434 from "../content/docs/stacks/api/stacks-blockchain/blocks/block-by-hash.mdx?collection=docs&hash=1744048693706" -import * as docs_433 from "../content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-height.mdx?collection=docs&hash=1744048693706" -import * as docs_432 from "../content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash.mdx?collection=docs&hash=1744048693706" -import * as docs_431 from "../content/docs/stacks/api/stacks-blockchain/blocks/average-times.mdx?collection=docs&hash=1744048693706" -import * as docs_430 from "../content/docs/stacks/api/stacks-blockchain/accounts/transactions.mdx?collection=docs&hash=1744048693706" -import * as docs_429 from "../content/docs/stacks/api/stacks-blockchain/accounts/transactions-with-transfers.mdx?collection=docs&hash=1744048693706" -import * as docs_428 from "../content/docs/stacks/api/stacks-blockchain/accounts/transaction-with-transfers.mdx?collection=docs&hash=1744048693706" -import * as docs_427 from "../content/docs/stacks/api/stacks-blockchain/accounts/stx-balances.mdx?collection=docs&hash=1744048693706" -import * as docs_426 from "../content/docs/stacks/api/stacks-blockchain/accounts/nft-events.mdx?collection=docs&hash=1744048693706" -import * as docs_425 from "../content/docs/stacks/api/stacks-blockchain/accounts/latest-nonce.mdx?collection=docs&hash=1744048693706" -import * as docs_424 from "../content/docs/stacks/api/stacks-blockchain/accounts/inbound-stx-transfers.mdx?collection=docs&hash=1744048693706" -import * as docs_423 from "../content/docs/stacks/api/stacks-blockchain/accounts/balances.mdx?collection=docs&hash=1744048693706" -import * as docs_422 from "../content/docs/stacks/api/stacks-blockchain/accounts/assets.mdx?collection=docs&hash=1744048693706" -import * as docs_421 from "../content/docs/bitcoin/runes/explorer/guides/build-explorer.mdx?collection=docs&hash=1744048693706" -import * as docs_420 from "../content/docs/bitcoin/runes/api/info/status.mdx?collection=docs&hash=1744048693706" -import * as docs_419 from "../content/docs/bitcoin/runes/api/info/index.mdx?collection=docs&hash=1744048693706" -import * as docs_418 from "../content/docs/bitcoin/runes/api/etchings/index.mdx?collection=docs&hash=1744048693706" -import * as docs_417 from "../content/docs/bitcoin/runes/api/etchings/get-etchings.mdx?collection=docs&hash=1744048693706" -import * as docs_416 from "../content/docs/bitcoin/runes/api/etchings/get-etching.mdx?collection=docs&hash=1744048693706" -import * as docs_415 from "../content/docs/bitcoin/runes/api/balances/index.mdx?collection=docs&hash=1744048693706" -import * as docs_414 from "../content/docs/bitcoin/runes/api/balances/holders.mdx?collection=docs&hash=1744048693706" -import * as docs_413 from "../content/docs/bitcoin/runes/api/balances/holder-balance.mdx?collection=docs&hash=1744048693706" -import * as docs_412 from "../content/docs/bitcoin/runes/api/balances/address.mdx?collection=docs&hash=1744048693706" -import * as docs_411 from "../content/docs/bitcoin/runes/api/activities/index.mdx?collection=docs&hash=1744048693706" -import * as docs_410 from "../content/docs/bitcoin/runes/api/activities/for-transaction.mdx?collection=docs&hash=1744048693706" -import * as docs_409 from "../content/docs/bitcoin/runes/api/activities/for-block.mdx?collection=docs&hash=1744048693706" -import * as docs_408 from "../content/docs/bitcoin/runes/api/activities/for-address.mdx?collection=docs&hash=1744048693706" -import * as docs_407 from "../content/docs/bitcoin/runes/api/activities/activity.mdx?collection=docs&hash=1744048693706" -import * as docs_406 from "../content/docs/bitcoin/ordinals/api/statistics/index.mdx?collection=docs&hash=1744048693706" -import * as docs_405 from "../content/docs/bitcoin/ordinals/api/statistics/get-stats-inscription-count.mdx?collection=docs&hash=1744048693706" -import * as docs_404 from "../content/docs/bitcoin/ordinals/api/satoshis/index.mdx?collection=docs&hash=1744048693706" -import * as docs_403 from "../content/docs/bitcoin/ordinals/api/satoshis/get-satoshi.mdx?collection=docs&hash=1744048693706" -import * as docs_402 from "../content/docs/bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions.mdx?collection=docs&hash=1744048693706" -import * as docs_401 from "../content/docs/bitcoin/ordinals/api/inscriptions/index.mdx?collection=docs&hash=1744048693706" -import * as docs_400 from "../content/docs/bitcoin/ordinals/api/inscriptions/get-transfers-per-block.mdx?collection=docs&hash=1744048693706" -import * as docs_399 from "../content/docs/bitcoin/ordinals/api/inscriptions/get-inscriptions.mdx?collection=docs&hash=1744048693706" -import * as docs_398 from "../content/docs/bitcoin/ordinals/api/inscriptions/get-inscription.mdx?collection=docs&hash=1744048693706" -import * as docs_397 from "../content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-transfers.mdx?collection=docs&hash=1744048693706" -import * as docs_396 from "../content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-content.mdx?collection=docs&hash=1744048693706" -import * as docs_395 from "../content/docs/bitcoin/ordinals/api/info/status.mdx?collection=docs&hash=1744048693706" -import * as docs_394 from "../content/docs/bitcoin/ordinals/api/info/index.mdx?collection=docs&hash=1744048693706" -import * as docs_393 from "../content/docs/bitcoin/ordinals/api/brc20/index.mdx?collection=docs&hash=1744048693706" -import * as docs_392 from "../content/docs/bitcoin/ordinals/api/brc20/get-brc20-tokens.mdx?collection=docs&hash=1744048693706" -import * as docs_391 from "../content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-holders.mdx?collection=docs&hash=1744048693706" -import * as docs_390 from "../content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-details.mdx?collection=docs&hash=1744048693706" -import * as docs_389 from "../content/docs/bitcoin/ordinals/api/brc20/get-brc20-balances.mdx?collection=docs&hash=1744048693706" -import * as docs_388 from "../content/docs/bitcoin/ordinals/api/brc20/get-brc20-activity.mdx?collection=docs&hash=1744048693706" -import * as docs_387 from "../content/docs/bitcoin/ordinals/explorer/guides/build-explorer.mdx?collection=docs&hash=1744048693706" -import * as docs_386 from "../content/docs/bitcoin/api/runes/info/status.mdx?collection=docs&hash=1744048693706" -import * as docs_385 from "../content/docs/bitcoin/api/runes/info/index.mdx?collection=docs&hash=1744048693706" -import * as docs_384 from "../content/docs/bitcoin/api/runes/etchings/index.mdx?collection=docs&hash=1744048693706" -import * as docs_383 from "../content/docs/bitcoin/api/runes/etchings/get-etchings.mdx?collection=docs&hash=1744048693706" -import * as docs_382 from "../content/docs/bitcoin/api/runes/etchings/get-etching.mdx?collection=docs&hash=1744048693706" -import * as docs_381 from "../content/docs/bitcoin/api/runes/balances/index.mdx?collection=docs&hash=1744048693706" -import * as docs_380 from "../content/docs/bitcoin/api/runes/balances/holders.mdx?collection=docs&hash=1744048693706" -import * as docs_379 from "../content/docs/bitcoin/api/runes/balances/holder-balance.mdx?collection=docs&hash=1744048693706" -import * as docs_378 from "../content/docs/bitcoin/api/runes/balances/address.mdx?collection=docs&hash=1744048693706" -import * as docs_377 from "../content/docs/bitcoin/api/ordinals/satoshis/index.mdx?collection=docs&hash=1744048693706" -import * as docs_376 from "../content/docs/bitcoin/api/ordinals/satoshis/get-satoshi.mdx?collection=docs&hash=1744048693706" -import * as docs_375 from "../content/docs/bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions.mdx?collection=docs&hash=1744048693706" -import * as docs_374 from "../content/docs/bitcoin/api/ordinals/info/status.mdx?collection=docs&hash=1744048693706" -import * as docs_373 from "../content/docs/bitcoin/api/ordinals/info/index.mdx?collection=docs&hash=1744048693706" -import * as docs_372 from "../content/docs/bitcoin/api/runes/activities/index.mdx?collection=docs&hash=1744048693706" -import * as docs_371 from "../content/docs/bitcoin/api/runes/activities/for-transaction.mdx?collection=docs&hash=1744048693706" -import * as docs_370 from "../content/docs/bitcoin/api/runes/activities/for-block.mdx?collection=docs&hash=1744048693706" -import * as docs_369 from "../content/docs/bitcoin/api/runes/activities/for-address.mdx?collection=docs&hash=1744048693706" -import * as docs_368 from "../content/docs/bitcoin/api/runes/activities/activity.mdx?collection=docs&hash=1744048693706" -import * as docs_367 from "../content/docs/bitcoin/api/ordinals/statistics/index.mdx?collection=docs&hash=1744048693706" -import * as docs_366 from "../content/docs/bitcoin/api/ordinals/statistics/get-stats-inscription-count.mdx?collection=docs&hash=1744048693706" -import * as docs_365 from "../content/docs/bitcoin/api/ordinals/inscriptions/index.mdx?collection=docs&hash=1744048693706" -import * as docs_364 from "../content/docs/bitcoin/api/ordinals/inscriptions/get-transfers-per-block.mdx?collection=docs&hash=1744048693706" -import * as docs_363 from "../content/docs/bitcoin/api/ordinals/inscriptions/get-inscriptions.mdx?collection=docs&hash=1744048693706" -import * as docs_362 from "../content/docs/bitcoin/api/ordinals/inscriptions/get-inscription.mdx?collection=docs&hash=1744048693706" -import * as docs_361 from "../content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-transfers.mdx?collection=docs&hash=1744048693706" -import * as docs_360 from "../content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-content.mdx?collection=docs&hash=1744048693706" -import * as docs_359 from "../content/docs/bitcoin/api/ordinals/brc20/index.mdx?collection=docs&hash=1744048693706" -import * as docs_358 from "../content/docs/bitcoin/api/ordinals/brc20/get-brc20-tokens.mdx?collection=docs&hash=1744048693706" -import * as docs_357 from "../content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-holders.mdx?collection=docs&hash=1744048693706" -import * as docs_356 from "../content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-details.mdx?collection=docs&hash=1744048693706" -import * as docs_355 from "../content/docs/bitcoin/api/ordinals/brc20/get-brc20-balances.mdx?collection=docs&hash=1744048693706" -import * as docs_354 from "../content/docs/bitcoin/api/ordinals/brc20/get-brc20-activity.mdx?collection=docs&hash=1744048693706" -import * as docs_353 from "../content/docs/stacks/token-metadata-api/tokens/semi-fungible-token-metadata.mdx?collection=docs&hash=1744048693706" -import * as docs_352 from "../content/docs/stacks/token-metadata-api/tokens/non-fungible-token-metadata.mdx?collection=docs&hash=1744048693706" -import * as docs_351 from "../content/docs/stacks/token-metadata-api/tokens/index.mdx?collection=docs&hash=1744048693706" -import * as docs_350 from "../content/docs/stacks/token-metadata-api/tokens/fungible-tokens.mdx?collection=docs&hash=1744048693706" -import * as docs_349 from "../content/docs/stacks/token-metadata-api/tokens/fungible-token-metadata.mdx?collection=docs&hash=1744048693706" -import * as docs_348 from "../content/docs/stacks/token-metadata-api/info/status.mdx?collection=docs&hash=1744048693706" -import * as docs_347 from "../content/docs/stacks/token-metadata-api/info/index.mdx?collection=docs&hash=1744048693706" -import * as docs_346 from "../content/docs/stacks/token-metadata-api/client/quickstart.mdx?collection=docs&hash=1744048693706" -import * as docs_345 from "../content/docs/stacks/token-metadata-api/client/index.mdx?collection=docs&hash=1744048693706" -import * as docs_344 from "../content/docs/stacks/stacks.js/v6/transactions.mdx?collection=docs&hash=1744048693706" -import * as docs_343 from "../content/docs/stacks/stacks.js/v6/network.mdx?collection=docs&hash=1744048693706" -import * as docs_342 from "../content/docs/stacks/stacks.js/packages/transactions.mdx?collection=docs&hash=1744048693706" -import * as docs_341 from "../content/docs/stacks/stacks.js/packages/sbtc.mdx?collection=docs&hash=1744048693706" -import * as docs_340 from "../content/docs/stacks/stacks.js/packages/network.mdx?collection=docs&hash=1744048693706" -import * as docs_339 from "../content/docs/stacks/stacks.js/packages/common.mdx?collection=docs&hash=1744048693706" -import * as docs_338 from "../content/docs/stacks/stacks.js/examples/use-with-react-native.mdx?collection=docs&hash=1744048693706" -import * as docs_337 from "../content/docs/stacks/stacks.js/examples/post-conditions.mdx?collection=docs&hash=1744048693706" -import * as docs_336 from "../content/docs/stacks/stacks.js/examples/broadcast-transactions.mdx?collection=docs&hash=1744048693706" -import * as docs_335 from "../content/docs/stacks/stacks.js/concepts/transactions.mdx?collection=docs&hash=1744048693706" -import * as docs_334 from "../content/docs/stacks/stacks.js/concepts/private-keys.mdx?collection=docs&hash=1744048693706" -import * as docs_333 from "../content/docs/stacks/stacks.js/concepts/post-conditions.mdx?collection=docs&hash=1744048693706" -import * as docs_332 from "../content/docs/stacks/stacks.js/concepts/networks.mdx?collection=docs&hash=1744048693706" -import * as docs_331 from "../content/docs/stacks/stacks.js/concepts/broadcasting.mdx?collection=docs&hash=1744048693706" -import * as docs_330 from "../content/docs/stacks/stacks.js/concepts/accounts-and-addresses.mdx?collection=docs&hash=1744048693706" -import * as docs_329 from "../content/docs/stacks/rpc-api/v3/tenure-metadata.mdx?collection=docs&hash=1744048693706" -import * as docs_328 from "../content/docs/stacks/rpc-api/v3/tenure-blocks.mdx?collection=docs&hash=1744048693706" -import * as docs_327 from "../content/docs/stacks/rpc-api/v3/nakamoto-block.mdx?collection=docs&hash=1744048693706" -import * as docs_326 from "../content/docs/stacks/rpc-api/v3/index.mdx?collection=docs&hash=1744048693706" -import * as docs_325 from "../content/docs/stacks/rpc-api/transactions/index.mdx?collection=docs&hash=1744048693706" -import * as docs_324 from "../content/docs/stacks/rpc-api/transactions/broadcast-transaction.mdx?collection=docs&hash=1744048693706" -import * as docs_323 from "../content/docs/stacks/rpc-api/smart-contracts/traits.mdx?collection=docs&hash=1744048693706" -import * as docs_322 from "../content/docs/stacks/rpc-api/smart-contracts/source.mdx?collection=docs&hash=1744048693706" -import * as docs_321 from "../content/docs/stacks/rpc-api/smart-contracts/read-only.mdx?collection=docs&hash=1744048693706" -import * as docs_320 from "../content/docs/stacks/rpc-api/smart-contracts/map-entry.mdx?collection=docs&hash=1744048693706" -import * as docs_319 from "../content/docs/stacks/rpc-api/smart-contracts/interface.mdx?collection=docs&hash=1744048693706" -import * as docs_318 from "../content/docs/stacks/rpc-api/smart-contracts/index.mdx?collection=docs&hash=1744048693706" -import * as docs_317 from "../content/docs/stacks/rpc-api/smart-contracts/constants.mdx?collection=docs&hash=1744048693706" -import * as docs_316 from "../content/docs/stacks/rpc-api/pox/stacker-set.mdx?collection=docs&hash=1744048693706" -import * as docs_315 from "../content/docs/stacks/rpc-api/pox/pox-details.mdx?collection=docs&hash=1744048693706" -import * as docs_314 from "../content/docs/stacks/rpc-api/pox/index.mdx?collection=docs&hash=1744048693706" -import * as docs_313 from "../content/docs/stacks/rpc-api/names/namespace-price.mdx?collection=docs&hash=1744048693706" -import * as docs_312 from "../content/docs/stacks/rpc-api/names/name-price.mdx?collection=docs&hash=1744048693706" -import * as docs_311 from "../content/docs/stacks/rpc-api/names/index.mdx?collection=docs&hash=1744048693706" -import * as docs_310 from "../content/docs/stacks/rpc-api/info/index.mdx?collection=docs&hash=1744048693706" -import * as docs_309 from "../content/docs/stacks/rpc-api/info/core-api.mdx?collection=docs&hash=1744048693706" -import * as docs_308 from "../content/docs/stacks/rpc-api/fees/transfer-estimate.mdx?collection=docs&hash=1744048693706" -import * as docs_307 from "../content/docs/stacks/rpc-api/fees/index.mdx?collection=docs&hash=1744048693706" -import * as docs_306 from "../content/docs/stacks/rpc-api/fees/estimate.mdx?collection=docs&hash=1744048693706" -import * as docs_305 from "../content/docs/stacks/rpc-api/burn-ops/index.mdx?collection=docs&hash=1744048693706" -import * as docs_304 from "../content/docs/stacks/rpc-api/burn-ops/get-burn-operations.mdx?collection=docs&hash=1744048693706" -import * as docs_303 from "../content/docs/stacks/rpc-api/blocks/index.mdx?collection=docs&hash=1744048693706" -import * as docs_302 from "../content/docs/stacks/rpc-api/blocks/block-proposal.mdx?collection=docs&hash=1744048693706" -import * as docs_301 from "../content/docs/stacks/rpc-api/accounts/info.mdx?collection=docs&hash=1744048693706" -import * as docs_300 from "../content/docs/stacks/rpc-api/accounts/index.mdx?collection=docs&hash=1744048693706" -import * as docs_299 from "../content/docs/stacks/signer-metrics-api/signers/pox-cycle-signers.mdx?collection=docs&hash=1744048693706" -import * as docs_298 from "../content/docs/stacks/signer-metrics-api/signers/pox-cycle-signer.mdx?collection=docs&hash=1744048693706" -import * as docs_297 from "../content/docs/stacks/signer-metrics-api/signers/index.mdx?collection=docs&hash=1744048693706" -import * as docs_296 from "../content/docs/stacks/signer-metrics-api/prometheus/metrics.mdx?collection=docs&hash=1744048693706" -import * as docs_295 from "../content/docs/stacks/signer-metrics-api/prometheus/index.mdx?collection=docs&hash=1744048693706" -import * as docs_294 from "../content/docs/stacks/signer-metrics-api/info/status.mdx?collection=docs&hash=1744048693706" -import * as docs_293 from "../content/docs/stacks/signer-metrics-api/info/index.mdx?collection=docs&hash=1744048693706" -import * as docs_292 from "../content/docs/stacks/signer-metrics-api/blocks/index.mdx?collection=docs&hash=1744048693706" -import * as docs_291 from "../content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks.mdx?collection=docs&hash=1744048693706" -import * as docs_290 from "../content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block.mdx?collection=docs&hash=1744048693706" -import * as docs_289 from "../content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals.mdx?collection=docs&hash=1744048693706" -import * as docs_288 from "../content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-a-block.mdx?collection=docs&hash=1744048693706" -import * as docs_287 from "../content/docs/stacks/signer-metrics-api/block-proposals/index.mdx?collection=docs&hash=1744048693706" -import * as docs_286 from "../content/docs/stacks/reference/stacks.js/transactions.mdx?collection=docs&hash=1744048693706" -import * as docs_285 from "../content/docs/stacks/reference/stacks.js/sbtc.mdx?collection=docs&hash=1744048693706" -import * as docs_284 from "../content/docs/stacks/reference/stacks.js/network.mdx?collection=docs&hash=1744048693706" -import * as docs_283 from "../content/docs/stacks/reference/stacks.js/connect.mdx?collection=docs&hash=1744048693706" -import * as docs_282 from "../content/docs/stacks/reference/stacks.js/common.mdx?collection=docs&hash=1744048693706" -import * as docs_281 from "../content/docs/stacks/reference/stacks-blockchain-api/client.mdx?collection=docs&hash=1744048693706" -import * as docs_280 from "../content/docs/stacks/reference/cli/stacks-js.mdx?collection=docs&hash=1744048693706" -import * as docs_279 from "../content/docs/stacks/reference/cli/clarinet.mdx?collection=docs&hash=1744048693706" -import * as docs_278 from "../content/docs/stacks/reference/clarinet-js-sdk/simnet.mdx?collection=docs&hash=1744048693706" -import * as docs_277 from "../content/docs/stacks/reference/clarinet-js-sdk/properties.mdx?collection=docs&hash=1744048693706" -import * as docs_276 from "../content/docs/stacks/reference/clarinet-js-sdk/methods.mdx?collection=docs&hash=1744048693706" -import * as docs_275 from "../content/docs/stacks/reference/clarinet-js-sdk/custom-matchers.mdx?collection=docs&hash=1744048693706" -import * as docs_274 from "../content/docs/stacks/reference/clarinet-js-sdk/clarinet-sdk.mdx?collection=docs&hash=1744048693706" -import * as docs_273 from "../content/docs/stacks/platform-api/devnet/stop.mdx?collection=docs&hash=1744048693706" -import * as docs_272 from "../content/docs/stacks/platform-api/devnet/start.mdx?collection=docs&hash=1744048693706" -import * as docs_271 from "../content/docs/stacks/platform-api/devnet/stacks-blockchain-api.mdx?collection=docs&hash=1744048693706" -import * as docs_270 from "../content/docs/stacks/platform-api/devnet/index.mdx?collection=docs&hash=1744048693706" -import * as docs_269 from "../content/docs/stacks/platform-api/devnet/bitcoin-node.mdx?collection=docs&hash=1744048693706" -import * as docs_268 from "../content/docs/stacks/platform-api/chainhooks/update.mdx?collection=docs&hash=1744048693706" -import * as docs_267 from "../content/docs/stacks/platform-api/chainhooks/status.mdx?collection=docs&hash=1744048693706" -import * as docs_266 from "../content/docs/stacks/platform-api/chainhooks/list.mdx?collection=docs&hash=1744048693706" -import * as docs_265 from "../content/docs/stacks/platform-api/chainhooks/index.mdx?collection=docs&hash=1744048693706" -import * as docs_264 from "../content/docs/stacks/platform-api/chainhooks/get.mdx?collection=docs&hash=1744048693706" -import * as docs_263 from "../content/docs/stacks/platform-api/chainhooks/delete.mdx?collection=docs&hash=1744048693706" -import * as docs_262 from "../content/docs/stacks/platform-api/chainhooks/create.mdx?collection=docs&hash=1744048693706" -import * as docs_261 from "../content/docs/stacks/platform/examples/faucet.mdx?collection=docs&hash=1744048693706" -import * as docs_260 from "../content/docs/stacks/platform/examples/devnet.mdx?collection=docs&hash=1744048693706" -import * as docs_259 from "../content/docs/stacks/platform/examples/deploy-contracts.mdx?collection=docs&hash=1744048693706" -import * as docs_258 from "../content/docs/stacks/platform/examples/create-project.mdx?collection=docs&hash=1744048693706" -import * as docs_257 from "../content/docs/stacks/platform/examples/create-chainhooks.mdx?collection=docs&hash=1744048693706" -import * as docs_256 from "../content/docs/stacks/platform/examples/contract-monitoring.mdx?collection=docs&hash=1744048693706" -import * as docs_255 from "../content/docs/stacks/platform/examples/archive-project.mdx?collection=docs&hash=1744048693706" -import * as docs_254 from "../content/docs/stacks/nakamoto/guides/stacks-js.mdx?collection=docs&hash=1744048693706" -import * as docs_253 from "../content/docs/stacks/nakamoto/guides/stacks-api.mdx?collection=docs&hash=1744048693706" -import * as docs_252 from "../content/docs/stacks/nakamoto/guides/explorer.mdx?collection=docs&hash=1744048693706" -import * as docs_251 from "../content/docs/stacks/nakamoto/guides/clarinet.mdx?collection=docs&hash=1744048693706" -import * as docs_250 from "../content/docs/stacks/hacks/archive/build-a-friend-tech-clone.mdx?collection=docs&hash=1744048693706" -import * as docs_249 from "../content/docs/stacks/hacks/archive/build-a-decentralized-grants-program.mdx?collection=docs&hash=1744048693706" -import * as docs_248 from "../content/docs/stacks/hacks/archive/build-a-custom-api.mdx?collection=docs&hash=1744048693706" -import * as docs_247 from "../content/docs/stacks/hacks/archive/ai.mdx?collection=docs&hash=1744048693706" -import * as docs_246 from "../content/docs/stacks/explorer/guides/build-explorer.mdx?collection=docs&hash=1744048693706" -import * as docs_245 from "../content/docs/stacks/clarity/functions/xor.mdx?collection=docs&hash=1744048693706" -import * as docs_244 from "../content/docs/stacks/clarity/functions/var-set.mdx?collection=docs&hash=1744048693706" -import * as docs_243 from "../content/docs/stacks/clarity/functions/var-get.mdx?collection=docs&hash=1744048693706" -import * as docs_242 from "../content/docs/stacks/clarity/functions/use-trait.mdx?collection=docs&hash=1744048693706" -import * as docs_241 from "../content/docs/stacks/clarity/functions/unwrap.mdx?collection=docs&hash=1744048693706" -import * as docs_240 from "../content/docs/stacks/clarity/functions/unwrap-panic.mdx?collection=docs&hash=1744048693706" -import * as docs_239 from "../content/docs/stacks/clarity/functions/unwrap-err.mdx?collection=docs&hash=1744048693706" -import * as docs_238 from "../content/docs/stacks/clarity/functions/unwrap-err-panic.mdx?collection=docs&hash=1744048693706" -import * as docs_237 from "../content/docs/stacks/clarity/functions/tuple.mdx?collection=docs&hash=1744048693706" -import * as docs_236 from "../content/docs/stacks/clarity/functions/try.mdx?collection=docs&hash=1744048693706" -import * as docs_235 from "../content/docs/stacks/clarity/functions/to-uint.mdx?collection=docs&hash=1744048693706" -import * as docs_234 from "../content/docs/stacks/clarity/functions/to-int.mdx?collection=docs&hash=1744048693706" -import * as docs_233 from "../content/docs/stacks/clarity/functions/to-consensus-buff.mdx?collection=docs&hash=1744048693706" -import * as docs_232 from "../content/docs/stacks/clarity/functions/subtract.mdx?collection=docs&hash=1744048693706" -import * as docs_231 from "../content/docs/stacks/clarity/functions/stx-transfer.mdx?collection=docs&hash=1744048693706" -import * as docs_230 from "../content/docs/stacks/clarity/functions/stx-transfer-memo.mdx?collection=docs&hash=1744048693706" -import * as docs_229 from "../content/docs/stacks/clarity/functions/stx-get-balance.mdx?collection=docs&hash=1744048693706" -import * as docs_228 from "../content/docs/stacks/clarity/functions/stx-burn.mdx?collection=docs&hash=1744048693706" -import * as docs_227 from "../content/docs/stacks/clarity/functions/stx-account.mdx?collection=docs&hash=1744048693706" -import * as docs_226 from "../content/docs/stacks/clarity/functions/string-to-uint.mdx?collection=docs&hash=1744048693706" -import * as docs_225 from "../content/docs/stacks/clarity/functions/string-to-int.mdx?collection=docs&hash=1744048693706" -import * as docs_224 from "../content/docs/stacks/clarity/functions/sqrti.mdx?collection=docs&hash=1744048693706" -import * as docs_223 from "../content/docs/stacks/clarity/functions/some.mdx?collection=docs&hash=1744048693706" -import * as docs_222 from "../content/docs/stacks/clarity/functions/slice.mdx?collection=docs&hash=1744048693706" -import * as docs_221 from "../content/docs/stacks/clarity/functions/sha512.mdx?collection=docs&hash=1744048693706" -import * as docs_220 from "../content/docs/stacks/clarity/functions/sha512-256.mdx?collection=docs&hash=1744048693706" -import * as docs_219 from "../content/docs/stacks/clarity/functions/sha256.mdx?collection=docs&hash=1744048693706" -import * as docs_218 from "../content/docs/stacks/clarity/functions/secp256k1-verify.mdx?collection=docs&hash=1744048693706" -import * as docs_217 from "../content/docs/stacks/clarity/functions/secp256k1-recover.mdx?collection=docs&hash=1744048693706" -import * as docs_216 from "../content/docs/stacks/clarity/functions/replace-at.mdx?collection=docs&hash=1744048693706" -import * as docs_215 from "../content/docs/stacks/clarity/functions/print.mdx?collection=docs&hash=1744048693706" -import * as docs_214 from "../content/docs/stacks/clarity/functions/principal-of.mdx?collection=docs&hash=1744048693706" -import * as docs_213 from "../content/docs/stacks/clarity/functions/principal-destruct.mdx?collection=docs&hash=1744048693706" -import * as docs_212 from "../content/docs/stacks/clarity/functions/principal-construct.mdx?collection=docs&hash=1744048693706" -import * as docs_211 from "../content/docs/stacks/clarity/functions/pow.mdx?collection=docs&hash=1744048693706" -import * as docs_210 from "../content/docs/stacks/clarity/functions/or.mdx?collection=docs&hash=1744048693706" -import * as docs_209 from "../content/docs/stacks/clarity/functions/ok.mdx?collection=docs&hash=1744048693706" -import * as docs_208 from "../content/docs/stacks/clarity/functions/not.mdx?collection=docs&hash=1744048693706" -import * as docs_207 from "../content/docs/stacks/clarity/functions/nft-transfer.mdx?collection=docs&hash=1744048693706" -import * as docs_206 from "../content/docs/stacks/clarity/functions/nft-mint.mdx?collection=docs&hash=1744048693706" -import * as docs_205 from "../content/docs/stacks/clarity/functions/nft-get-owner.mdx?collection=docs&hash=1744048693706" -import * as docs_204 from "../content/docs/stacks/clarity/functions/nft-burn.mdx?collection=docs&hash=1744048693706" -import * as docs_203 from "../content/docs/stacks/clarity/functions/multiply.mdx?collection=docs&hash=1744048693706" -import * as docs_202 from "../content/docs/stacks/clarity/functions/mod.mdx?collection=docs&hash=1744048693706" -import * as docs_201 from "../content/docs/stacks/clarity/functions/merge.mdx?collection=docs&hash=1744048693706" -import * as docs_200 from "../content/docs/stacks/clarity/functions/match.mdx?collection=docs&hash=1744048693706" -import * as docs_199 from "../content/docs/stacks/clarity/functions/map.mdx?collection=docs&hash=1744048693706" -import * as docs_198 from "../content/docs/stacks/clarity/functions/map-set.mdx?collection=docs&hash=1744048693706" -import * as docs_197 from "../content/docs/stacks/clarity/functions/map-insert.mdx?collection=docs&hash=1744048693706" -import * as docs_196 from "../content/docs/stacks/clarity/functions/map-get.mdx?collection=docs&hash=1744048693706" -import * as docs_195 from "../content/docs/stacks/clarity/functions/map-delete.mdx?collection=docs&hash=1744048693706" -import * as docs_194 from "../content/docs/stacks/clarity/functions/log2.mdx?collection=docs&hash=1744048693706" -import * as docs_193 from "../content/docs/stacks/clarity/functions/list.mdx?collection=docs&hash=1744048693706" -import * as docs_192 from "../content/docs/stacks/clarity/functions/let.mdx?collection=docs&hash=1744048693706" -import * as docs_191 from "../content/docs/stacks/clarity/functions/less-than.mdx?collection=docs&hash=1744048693706" -import * as docs_190 from "../content/docs/stacks/clarity/functions/less-than-or-equal.mdx?collection=docs&hash=1744048693706" -import * as docs_189 from "../content/docs/stacks/clarity/functions/len.mdx?collection=docs&hash=1744048693706" -import * as docs_188 from "../content/docs/stacks/clarity/functions/keccak256.mdx?collection=docs&hash=1744048693706" -import * as docs_187 from "../content/docs/stacks/clarity/functions/is-standard.mdx?collection=docs&hash=1744048693706" -import * as docs_186 from "../content/docs/stacks/clarity/functions/is-some.mdx?collection=docs&hash=1744048693706" -import * as docs_185 from "../content/docs/stacks/clarity/functions/is-ok.mdx?collection=docs&hash=1744048693706" -import * as docs_184 from "../content/docs/stacks/clarity/functions/is-none.mdx?collection=docs&hash=1744048693706" -import * as docs_183 from "../content/docs/stacks/clarity/functions/is-err.mdx?collection=docs&hash=1744048693706" -import * as docs_182 from "../content/docs/stacks/clarity/functions/is-eq.mdx?collection=docs&hash=1744048693706" -import * as docs_181 from "../content/docs/stacks/clarity/functions/int-to-utf8.mdx?collection=docs&hash=1744048693706" -import * as docs_180 from "../content/docs/stacks/clarity/functions/int-to-ascii.mdx?collection=docs&hash=1744048693706" -import * as docs_179 from "../content/docs/stacks/clarity/functions/index-of.mdx?collection=docs&hash=1744048693706" -import * as docs_178 from "../content/docs/stacks/clarity/functions/impl-trait.mdx?collection=docs&hash=1744048693706" -import * as docs_177 from "../content/docs/stacks/clarity/functions/if.mdx?collection=docs&hash=1744048693706" -import * as docs_176 from "../content/docs/stacks/clarity/functions/hash160.mdx?collection=docs&hash=1744048693706" -import * as docs_175 from "../content/docs/stacks/clarity/functions/greater-than.mdx?collection=docs&hash=1744048693706" -import * as docs_174 from "../content/docs/stacks/clarity/functions/greater-than-or-equal.mdx?collection=docs&hash=1744048693706" -import * as docs_173 from "../content/docs/stacks/clarity/functions/get.mdx?collection=docs&hash=1744048693706" -import * as docs_172 from "../content/docs/stacks/clarity/functions/get-tenure-info.mdx?collection=docs&hash=1744048693706" -import * as docs_171 from "../content/docs/stacks/clarity/functions/get-stacks-block-info.mdx?collection=docs&hash=1744048693706" -import * as docs_170 from "../content/docs/stacks/clarity/functions/get-burn-block-info.mdx?collection=docs&hash=1744048693706" -import * as docs_169 from "../content/docs/stacks/clarity/functions/get-block-info.mdx?collection=docs&hash=1744048693706" -import * as docs_168 from "../content/docs/stacks/clarity/functions/ft-transfer.mdx?collection=docs&hash=1744048693706" -import * as docs_167 from "../content/docs/stacks/clarity/functions/ft-mint.mdx?collection=docs&hash=1744048693706" -import * as docs_166 from "../content/docs/stacks/clarity/functions/ft-get-supply.mdx?collection=docs&hash=1744048693706" -import * as docs_165 from "../content/docs/stacks/clarity/functions/ft-get-balance.mdx?collection=docs&hash=1744048693706" -import * as docs_164 from "../content/docs/stacks/clarity/functions/ft-burn.mdx?collection=docs&hash=1744048693706" -import * as docs_163 from "../content/docs/stacks/clarity/functions/from-consensus-buff.mdx?collection=docs&hash=1744048693706" -import * as docs_162 from "../content/docs/stacks/clarity/functions/fold.mdx?collection=docs&hash=1744048693706" -import * as docs_161 from "../content/docs/stacks/clarity/functions/filter.mdx?collection=docs&hash=1744048693706" -import * as docs_160 from "../content/docs/stacks/clarity/functions/err.mdx?collection=docs&hash=1744048693706" -import * as docs_159 from "../content/docs/stacks/clarity/functions/element-at.mdx?collection=docs&hash=1744048693706" -import * as docs_158 from "../content/docs/stacks/clarity/functions/divide.mdx?collection=docs&hash=1744048693706" -import * as docs_157 from "../content/docs/stacks/clarity/functions/define-trait.mdx?collection=docs&hash=1744048693706" -import * as docs_156 from "../content/docs/stacks/clarity/functions/define-read-only.mdx?collection=docs&hash=1744048693706" -import * as docs_155 from "../content/docs/stacks/clarity/functions/define-public.mdx?collection=docs&hash=1744048693706" -import * as docs_154 from "../content/docs/stacks/clarity/functions/define-private.mdx?collection=docs&hash=1744048693706" -import * as docs_153 from "../content/docs/stacks/clarity/functions/define-non-fungible-token.mdx?collection=docs&hash=1744048693706" -import * as docs_152 from "../content/docs/stacks/clarity/functions/define-map.mdx?collection=docs&hash=1744048693706" -import * as docs_151 from "../content/docs/stacks/clarity/functions/define-fungible-token.mdx?collection=docs&hash=1744048693706" -import * as docs_150 from "../content/docs/stacks/clarity/functions/define-data-var.mdx?collection=docs&hash=1744048693706" -import * as docs_149 from "../content/docs/stacks/clarity/functions/define-constant.mdx?collection=docs&hash=1744048693706" -import * as docs_148 from "../content/docs/stacks/clarity/functions/default-to.mdx?collection=docs&hash=1744048693706" -import * as docs_147 from "../content/docs/stacks/clarity/functions/contract-of.mdx?collection=docs&hash=1744048693706" -import * as docs_146 from "../content/docs/stacks/clarity/functions/contract-call.mdx?collection=docs&hash=1744048693706" -import * as docs_145 from "../content/docs/stacks/clarity/functions/concat.mdx?collection=docs&hash=1744048693706" -import * as docs_144 from "../content/docs/stacks/clarity/functions/buff-to-uint-le.mdx?collection=docs&hash=1744048693706" -import * as docs_143 from "../content/docs/stacks/clarity/functions/buff-to-uint-be.mdx?collection=docs&hash=1744048693706" -import * as docs_142 from "../content/docs/stacks/clarity/functions/buff-to-int-le.mdx?collection=docs&hash=1744048693706" -import * as docs_141 from "../content/docs/stacks/clarity/functions/buff-to-int-be.mdx?collection=docs&hash=1744048693706" -import * as docs_140 from "../content/docs/stacks/clarity/functions/bit-xor.mdx?collection=docs&hash=1744048693706" -import * as docs_139 from "../content/docs/stacks/clarity/functions/bit-shift-right.mdx?collection=docs&hash=1744048693706" -import * as docs_138 from "../content/docs/stacks/clarity/functions/bit-shift-left.mdx?collection=docs&hash=1744048693706" -import * as docs_137 from "../content/docs/stacks/clarity/functions/bit-or.mdx?collection=docs&hash=1744048693706" -import * as docs_136 from "../content/docs/stacks/clarity/functions/bit-not.mdx?collection=docs&hash=1744048693706" -import * as docs_135 from "../content/docs/stacks/clarity/functions/bit-and.mdx?collection=docs&hash=1744048693706" -import * as docs_134 from "../content/docs/stacks/clarity/functions/begin.mdx?collection=docs&hash=1744048693706" -import * as docs_133 from "../content/docs/stacks/clarity/functions/at-block.mdx?collection=docs&hash=1744048693706" -import * as docs_132 from "../content/docs/stacks/clarity/functions/asserts.mdx?collection=docs&hash=1744048693706" -import * as docs_131 from "../content/docs/stacks/clarity/functions/as-max-len.mdx?collection=docs&hash=1744048693706" -import * as docs_130 from "../content/docs/stacks/clarity/functions/as-contract.mdx?collection=docs&hash=1744048693706" -import * as docs_129 from "../content/docs/stacks/clarity/functions/append.mdx?collection=docs&hash=1744048693706" -import * as docs_128 from "../content/docs/stacks/clarity/functions/and.mdx?collection=docs&hash=1744048693706" -import * as docs_127 from "../content/docs/stacks/clarity/functions/add.mdx?collection=docs&hash=1744048693706" -import * as docs_126 from "../content/docs/stacks/connect/packages/connect.mdx?collection=docs&hash=1744048693706" -import * as docs_125 from "../content/docs/stacks/connect/examples/sign-messages.mdx?collection=docs&hash=1744048693706" -import * as docs_124 from "../content/docs/stacks/connect/examples/migration.mdx?collection=docs&hash=1744048693706" -import * as docs_123 from "../content/docs/stacks/connect/examples/broadcast-transactions.mdx?collection=docs&hash=1744048693706" -import * as docs_122 from "../content/docs/stacks/connect/examples/authenticate-users.mdx?collection=docs&hash=1744048693706" -import * as docs_121 from "../content/docs/stacks/clarinet-js-sdk/references/simnet.mdx?collection=docs&hash=1744048693706" -import * as docs_120 from "../content/docs/stacks/clarinet-js-sdk/references/properties.mdx?collection=docs&hash=1744048693706" -import * as docs_119 from "../content/docs/stacks/clarinet-js-sdk/references/methods.mdx?collection=docs&hash=1744048693706" -import * as docs_118 from "../content/docs/stacks/clarinet-js-sdk/references/custom-matchers.mdx?collection=docs&hash=1744048693706" -import * as docs_117 from "../content/docs/stacks/clarinet/examples/working-with-sbtc.mdx?collection=docs&hash=1744048693706" -import * as docs_116 from "../content/docs/stacks/clarinet/examples/validate-a-contract.mdx?collection=docs&hash=1744048693706" -import * as docs_115 from "../content/docs/stacks/clarinet/examples/start-a-development-console.mdx?collection=docs&hash=1744048693706" -import * as docs_114 from "../content/docs/stacks/clarinet/examples/run-a-local-devnet.mdx?collection=docs&hash=1744048693706" -import * as docs_113 from "../content/docs/stacks/clarinet/examples/estimate-costs.mdx?collection=docs&hash=1744048693706" -import * as docs_112 from "../content/docs/stacks/clarinet/examples/deploy-a-contract.mdx?collection=docs&hash=1744048693706" -import * as docs_111 from "../content/docs/stacks/clarinet/examples/debug-a-contract.mdx?collection=docs&hash=1744048693706" -import * as docs_110 from "../content/docs/stacks/clarinet/examples/create-deployment-plans.mdx?collection=docs&hash=1744048693706" -import * as docs_109 from "../content/docs/stacks/clarinet/examples/create-a-new-project.mdx?collection=docs&hash=1744048693706" -import * as docs_108 from "../content/docs/stacks/clarinet/examples/add-a-contract.mdx?collection=docs&hash=1744048693706" -import * as docs_107 from "../content/docs/stacks/chainhook/examples/register-chainhooks-on-devnet.mdx?collection=docs&hash=1744048693706" -import * as docs_106 from "../content/docs/stacks/chainhook/examples/observing-contract-calls.mdx?collection=docs&hash=1744048693706" -import * as docs_105 from "../content/docs/stacks/chainhook/examples/chainhook-as-a-service.mdx?collection=docs&hash=1744048693706" -import * as docs_104 from "../content/docs/stacks/chainhook/examples/chainhook-as-a-service-with-stacks-node.mdx?collection=docs&hash=1744048693706" -import * as docs_103 from "../content/docs/stacks/archive/guides/verify-archive-data.mdx?collection=docs&hash=1744048693706" -import * as docs_102 from "../content/docs/stacks/archive/guides/token-metadata-api.mdx?collection=docs&hash=1744048693706" -import * as docs_101 from "../content/docs/stacks/archive/guides/stacks-blockchain.mdx?collection=docs&hash=1744048693706" -import * as docs_100 from "../content/docs/stacks/archive/guides/stacks-api.mdx?collection=docs&hash=1744048693706" -import * as docs_99 from "../content/docs/bitcoin/runes/runehook/quickstart.mdx?collection=docs&hash=1744048693706" -import * as docs_98 from "../content/docs/bitcoin/runes/runehook/installation.mdx?collection=docs&hash=1744048693706" -import * as docs_97 from "../content/docs/bitcoin/runes/runehook/index.mdx?collection=docs&hash=1744048693706" -import * as docs_96 from "../content/docs/bitcoin/runes/explorer/index.mdx?collection=docs&hash=1744048693706" -import * as docs_95 from "../content/docs/bitcoin/runes/api/usage.mdx?collection=docs&hash=1744048693706" -import * as docs_94 from "../content/docs/bitcoin/runes/api/index.mdx?collection=docs&hash=1744048693706" -import * as docs_93 from "../content/docs/bitcoin/ordinals/api/usage.mdx?collection=docs&hash=1744048693706" -import * as docs_92 from "../content/docs/bitcoin/ordinals/api/index.mdx?collection=docs&hash=1744048693706" -import * as docs_91 from "../content/docs/bitcoin/ordinals/explorer/index.mdx?collection=docs&hash=1744048693706" -import * as docs_90 from "../content/docs/bitcoin/indexer/guides/run-indexer.mdx?collection=docs&hash=1744048693706" -import * as docs_89 from "../content/docs/stacks/token-metadata-api/usage.mdx?collection=docs&hash=1744048693706" -import * as docs_88 from "../content/docs/stacks/token-metadata-api/index.mdx?collection=docs&hash=1744048693706" -import * as docs_87 from "../content/docs/stacks/token-metadata-api/architecture.mdx?collection=docs&hash=1744048693706" -import * as docs_86 from "../content/docs/stacks/stacks.js/roadmap.mdx?collection=docs&hash=1744048693706" -import * as docs_85 from "../content/docs/stacks/stacks.js/quickstart.mdx?collection=docs&hash=1744048693706" -import * as docs_84 from "../content/docs/stacks/stacks.js/installation.mdx?collection=docs&hash=1744048693706" -import * as docs_83 from "../content/docs/stacks/stacks.js/index.mdx?collection=docs&hash=1744048693706" -import * as docs_82 from "../content/docs/stacks/rpc-api/index.mdx?collection=docs&hash=1744048693706" -import * as docs_81 from "../content/docs/stacks/signer-metrics-api/index.mdx?collection=docs&hash=1744048693706" -import * as docs_80 from "../content/docs/stacks/reference/index.mdx?collection=docs&hash=1744048693706" -import * as docs_79 from "../content/docs/stacks/quickstarts/wallet-integration.mdx?collection=docs&hash=1744048693706" -import * as docs_78 from "../content/docs/stacks/quickstarts/token-transfers.mdx?collection=docs&hash=1744048693706" -import * as docs_77 from "../content/docs/stacks/quickstarts/nft-minting.mdx?collection=docs&hash=1744048693706" -import * as docs_76 from "../content/docs/stacks/quickstarts/index.mdx?collection=docs&hash=1744048693706" -import * as docs_75 from "../content/docs/stacks/quickstarts/event-streaming.mdx?collection=docs&hash=1744048693706" -import * as docs_74 from "../content/docs/stacks/quickstarts/contract-templates.mdx?collection=docs&hash=1744048693706" -import * as docs_73 from "../content/docs/stacks/quickstarts/app-templates.mdx?collection=docs&hash=1744048693706" -import * as docs_72 from "../content/docs/stacks/platform-api/index.mdx?collection=docs&hash=1744048693706" -import * as docs_71 from "../content/docs/stacks/platform/quickstart.mdx?collection=docs&hash=1744048693706" -import * as docs_70 from "../content/docs/stacks/platform/index.mdx?collection=docs&hash=1744048693706" -import * as docs_69 from "../content/docs/stacks/nakamoto/index.mdx?collection=docs&hash=1744048693706" -import * as docs_68 from "../content/docs/stacks/hacks/recipes.mdx?collection=docs&hash=1744048693706" -import * as docs_67 from "../content/docs/stacks/hacks/index.mdx?collection=docs&hash=1744048693706" -import * as docs_66 from "../content/docs/stacks/explorer/index.mdx?collection=docs&hash=1744048693706" -import * as docs_65 from "../content/docs/stacks/connect/support.mdx?collection=docs&hash=1744048693706" -import * as docs_64 from "../content/docs/stacks/connect/quickstart.mdx?collection=docs&hash=1744048693706" -import * as docs_63 from "../content/docs/stacks/connect/index.mdx?collection=docs&hash=1744048693706" -import * as docs_62 from "../content/docs/stacks/clarity/time-and-blocks.mdx?collection=docs&hash=1744048693706" -import * as docs_61 from "../content/docs/stacks/clarity/optimizations.mdx?collection=docs&hash=1744048693706" -import * as docs_60 from "../content/docs/stacks/clarity/index.mdx?collection=docs&hash=1744048693706" -import * as docs_59 from "../content/docs/stacks/clarity/handling-optionals-and-errors.mdx?collection=docs&hash=1744048693706" -import * as docs_58 from "../content/docs/stacks/clarity/cryptographic-functions.mdx?collection=docs&hash=1744048693706" -import * as docs_57 from "../content/docs/stacks/clarity/bit-manipulation.mdx?collection=docs&hash=1744048693706" -import * as docs_56 from "../content/docs/stacks/clarity/basic-arithmetic.mdx?collection=docs&hash=1744048693706" -import * as docs_55 from "../content/docs/stacks/clarity/access-control.mdx?collection=docs&hash=1744048693706" -import * as docs_54 from "../content/docs/stacks/clarinet-js-sdk/quickstart.mdx?collection=docs&hash=1744048693706" -import * as docs_53 from "../content/docs/stacks/clarinet-js-sdk/installation.mdx?collection=docs&hash=1744048693706" -import * as docs_52 from "../content/docs/stacks/clarinet-js-sdk/index.mdx?collection=docs&hash=1744048693706" -import * as docs_51 from "../content/docs/stacks/clarinet/quickstart.mdx?collection=docs&hash=1744048693706" -import * as docs_50 from "../content/docs/stacks/clarinet/index.mdx?collection=docs&hash=1744048693706" -import * as docs_49 from "../content/docs/stacks/clarinet/concepts.mdx?collection=docs&hash=1744048693706" -import * as docs_48 from "../content/docs/stacks/chainhook/quickstart.mdx?collection=docs&hash=1744048693706" -import * as docs_47 from "../content/docs/stacks/chainhook/predicate-design.mdx?collection=docs&hash=1744048693706" -import * as docs_46 from "../content/docs/stacks/chainhook/installation.mdx?collection=docs&hash=1744048693706" -import * as docs_45 from "../content/docs/stacks/chainhook/index.mdx?collection=docs&hash=1744048693706" -import * as docs_44 from "../content/docs/stacks/archive/index.mdx?collection=docs&hash=1744048693706" -import * as docs_43 from "../content/docs/stacks/api/requesting-proofs.mdx?collection=docs&hash=1744048693706" -import * as docs_42 from "../content/docs/stacks/api/pagination.mdx?collection=docs&hash=1744048693706" -import * as docs_41 from "../content/docs/stacks/api/nonce-handling.mdx?collection=docs&hash=1744048693706" -import * as docs_40 from "../content/docs/stacks/api/index.mdx?collection=docs&hash=1744048693706" -import * as docs_39 from "../content/docs/stacks/api/getting-started.mdx?collection=docs&hash=1744048693706" -import * as docs_38 from "../content/docs/stacks/api/authentication.mdx?collection=docs&hash=1744048693706" -import * as docs_37 from "../content/docs/stacks/api/architecture.mdx?collection=docs&hash=1744048693706" -import * as docs_36 from "../content/docs/bitcoin/quickstarts/index.mdx?collection=docs&hash=1744048693706" -import * as docs_35 from "../content/docs/bitcoin/indexer/quickstart.mdx?collection=docs&hash=1744048693706" -import * as docs_34 from "../content/docs/bitcoin/indexer/index.mdx?collection=docs&hash=1744048693706" -import * as docs_33 from "../content/docs/bitcoin/api/index.mdx?collection=docs&hash=1744048693706" -import * as docs_32 from "../content/docs/guides/using-clarity-values.mdx?collection=docs&hash=1744048693706" -import * as docs_31 from "../content/docs/guides/sync-a-stacks-node.mdx?collection=docs&hash=1744048693706" -import * as docs_30 from "../content/docs/guides/sync-a-bitcoin-node.mdx?collection=docs&hash=1744048693706" -import * as docs_29 from "../content/docs/guides/rate-limiting.mdx?collection=docs&hash=1744048693706" -import * as docs_28 from "../content/docs/guides/no-loss-lottery.mdx?collection=docs&hash=1744048693706" -import * as docs_27 from "../content/docs/guides/installing-docker.mdx?collection=docs&hash=1744048693706" -import * as docs_26 from "../content/docs/guides/index.mdx?collection=docs&hash=1744048693706" -import * as docs_25 from "../content/docs/guides/docskit.mdx?collection=docs&hash=1744048693706" -import * as docs_24 from "../content/docs/guides/contributors-guide.mdx?collection=docs&hash=1744048693706" -import * as docs_23 from "../content/docs/guides/build-an-nft-marketplace.mdx?collection=docs&hash=1744048693706" -import * as docs_22 from "../content/docs/guides/build-a-decentralized-kickstarter.mdx?collection=docs&hash=1744048693706" -import * as docs_21 from "../content/docs/guides/api-keys.mdx?collection=docs&hash=1744048693706" -import * as docs_20 from "../content/docs/stacks/web-app-development.mdx?collection=docs&hash=1744048693706" -import * as docs_19 from "../content/docs/stacks/unit-testing.mdx?collection=docs&hash=1744048693706" -import * as docs_18 from "../content/docs/stacks/token-development.mdx?collection=docs&hash=1744048693706" -import * as docs_17 from "../content/docs/stacks/testing-environments.mdx?collection=docs&hash=1744048693706" -import * as docs_16 from "../content/docs/stacks/testing-best-practices.mdx?collection=docs&hash=1744048693706" -import * as docs_15 from "../content/docs/stacks/smart-contract-development.mdx?collection=docs&hash=1744048693706" -import * as docs_14 from "../content/docs/stacks/setup.mdx?collection=docs&hash=1744048693706" -import * as docs_13 from "../content/docs/stacks/reference.mdx?collection=docs&hash=1744048693706" -import * as docs_12 from "../content/docs/stacks/rate-limiting.mdx?collection=docs&hash=1744048693706" -import * as docs_11 from "../content/docs/stacks/migration-guide.mdx?collection=docs&hash=1744048693706" -import * as docs_10 from "../content/docs/stacks/integration-testing.mdx?collection=docs&hash=1744048693706" -import * as docs_9 from "../content/docs/stacks/index.mdx?collection=docs&hash=1744048693706" -import * as docs_8 from "../content/docs/stacks/get-started.mdx?collection=docs&hash=1744048693706" -import * as docs_7 from "../content/docs/stacks/contributors-guide.mdx?collection=docs&hash=1744048693706" -import * as docs_6 from "../content/docs/stacks/blockchain-development.mdx?collection=docs&hash=1744048693706" -import * as docs_5 from "../content/docs/stacks/api-keys.mdx?collection=docs&hash=1744048693706" -import * as docs_4 from "../content/docs/bitcoin/rate-limiting.mdx?collection=docs&hash=1744048693706" -import * as docs_3 from "../content/docs/bitcoin/index.mdx?collection=docs&hash=1744048693706" -import * as docs_2 from "../content/docs/bitcoin/get-started.mdx?collection=docs&hash=1744048693706" -import * as docs_1 from "../content/docs/bitcoin/contributors-guide.mdx?collection=docs&hash=1744048693706" -import * as docs_0 from "../content/docs/bitcoin/api-keys.mdx?collection=docs&hash=1744048693706" -import { _runtime } from "fumadocs-mdx" -import * as _source from "../source.config" -export const docs = _runtime.docs<typeof _source.docs>([{ info: {"path":"bitcoin/api-keys.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api-keys.mdx"}, data: docs_0 }, { info: {"path":"bitcoin/contributors-guide.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/contributors-guide.mdx"}, data: docs_1 }, { info: {"path":"bitcoin/get-started.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/get-started.mdx"}, data: docs_2 }, { info: {"path":"bitcoin/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/index.mdx"}, data: docs_3 }, { info: {"path":"bitcoin/rate-limiting.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/rate-limiting.mdx"}, data: docs_4 }, { info: {"path":"stacks/api-keys.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api-keys.mdx"}, data: docs_5 }, { info: {"path":"stacks/blockchain-development.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/blockchain-development.mdx"}, data: docs_6 }, { info: {"path":"stacks/contributors-guide.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/contributors-guide.mdx"}, data: docs_7 }, { info: {"path":"stacks/get-started.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/get-started.mdx"}, data: docs_8 }, { info: {"path":"stacks/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/index.mdx"}, data: docs_9 }, { info: {"path":"stacks/integration-testing.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/integration-testing.mdx"}, data: docs_10 }, { info: {"path":"stacks/migration-guide.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/migration-guide.mdx"}, data: docs_11 }, { info: {"path":"stacks/rate-limiting.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rate-limiting.mdx"}, data: docs_12 }, { info: {"path":"stacks/reference.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference.mdx"}, data: docs_13 }, { info: {"path":"stacks/setup.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/setup.mdx"}, data: docs_14 }, { info: {"path":"stacks/smart-contract-development.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/smart-contract-development.mdx"}, data: docs_15 }, { info: {"path":"stacks/testing-best-practices.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/testing-best-practices.mdx"}, data: docs_16 }, { info: {"path":"stacks/testing-environments.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/testing-environments.mdx"}, data: docs_17 }, { info: {"path":"stacks/token-development.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-development.mdx"}, data: docs_18 }, { info: {"path":"stacks/unit-testing.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/unit-testing.mdx"}, data: docs_19 }, { info: {"path":"stacks/web-app-development.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/web-app-development.mdx"}, data: docs_20 }, { info: {"path":"guides/api-keys.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/api-keys.mdx"}, data: docs_21 }, { info: {"path":"guides/build-a-decentralized-kickstarter.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/build-a-decentralized-kickstarter.mdx"}, data: docs_22 }, { info: {"path":"guides/build-an-nft-marketplace.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/build-an-nft-marketplace.mdx"}, data: docs_23 }, { info: {"path":"guides/contributors-guide.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/contributors-guide.mdx"}, data: docs_24 }, { info: {"path":"guides/docskit.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/docskit.mdx"}, data: docs_25 }, { info: {"path":"guides/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/index.mdx"}, data: docs_26 }, { info: {"path":"guides/installing-docker.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/installing-docker.mdx"}, data: docs_27 }, { info: {"path":"guides/no-loss-lottery.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/no-loss-lottery.mdx"}, data: docs_28 }, { info: {"path":"guides/rate-limiting.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/rate-limiting.mdx"}, data: docs_29 }, { info: {"path":"guides/sync-a-bitcoin-node.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/sync-a-bitcoin-node.mdx"}, data: docs_30 }, { info: {"path":"guides/sync-a-stacks-node.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/sync-a-stacks-node.mdx"}, data: docs_31 }, { info: {"path":"guides/using-clarity-values.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/using-clarity-values.mdx"}, data: docs_32 }, { info: {"path":"bitcoin/api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/index.mdx"}, data: docs_33 }, { info: {"path":"bitcoin/indexer/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/indexer/index.mdx"}, data: docs_34 }, { info: {"path":"bitcoin/indexer/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/indexer/quickstart.mdx"}, data: docs_35 }, { info: {"path":"bitcoin/quickstarts/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/quickstarts/index.mdx"}, data: docs_36 }, { info: {"path":"stacks/api/architecture.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/architecture.mdx"}, data: docs_37 }, { info: {"path":"stacks/api/authentication.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/authentication.mdx"}, data: docs_38 }, { info: {"path":"stacks/api/getting-started.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/getting-started.mdx"}, data: docs_39 }, { info: {"path":"stacks/api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/index.mdx"}, data: docs_40 }, { info: {"path":"stacks/api/nonce-handling.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/nonce-handling.mdx"}, data: docs_41 }, { info: {"path":"stacks/api/pagination.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/pagination.mdx"}, data: docs_42 }, { info: {"path":"stacks/api/requesting-proofs.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/requesting-proofs.mdx"}, data: docs_43 }, { info: {"path":"stacks/archive/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/archive/index.mdx"}, data: docs_44 }, { info: {"path":"stacks/chainhook/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/index.mdx"}, data: docs_45 }, { info: {"path":"stacks/chainhook/installation.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/installation.mdx"}, data: docs_46 }, { info: {"path":"stacks/chainhook/predicate-design.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/predicate-design.mdx"}, data: docs_47 }, { info: {"path":"stacks/chainhook/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/quickstart.mdx"}, data: docs_48 }, { info: {"path":"stacks/clarinet/concepts.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/concepts.mdx"}, data: docs_49 }, { info: {"path":"stacks/clarinet/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/index.mdx"}, data: docs_50 }, { info: {"path":"stacks/clarinet/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/quickstart.mdx"}, data: docs_51 }, { info: {"path":"stacks/clarinet-js-sdk/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/index.mdx"}, data: docs_52 }, { info: {"path":"stacks/clarinet-js-sdk/installation.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/installation.mdx"}, data: docs_53 }, { info: {"path":"stacks/clarinet-js-sdk/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/quickstart.mdx"}, data: docs_54 }, { info: {"path":"stacks/clarity/access-control.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/access-control.mdx"}, data: docs_55 }, { info: {"path":"stacks/clarity/basic-arithmetic.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/basic-arithmetic.mdx"}, data: docs_56 }, { info: {"path":"stacks/clarity/bit-manipulation.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/bit-manipulation.mdx"}, data: docs_57 }, { info: {"path":"stacks/clarity/cryptographic-functions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/cryptographic-functions.mdx"}, data: docs_58 }, { info: {"path":"stacks/clarity/handling-optionals-and-errors.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/handling-optionals-and-errors.mdx"}, data: docs_59 }, { info: {"path":"stacks/clarity/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/index.mdx"}, data: docs_60 }, { info: {"path":"stacks/clarity/optimizations.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/optimizations.mdx"}, data: docs_61 }, { info: {"path":"stacks/clarity/time-and-blocks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/time-and-blocks.mdx"}, data: docs_62 }, { info: {"path":"stacks/connect/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/index.mdx"}, data: docs_63 }, { info: {"path":"stacks/connect/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/quickstart.mdx"}, data: docs_64 }, { info: {"path":"stacks/connect/support.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/support.mdx"}, data: docs_65 }, { info: {"path":"stacks/explorer/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/explorer/index.mdx"}, data: docs_66 }, { info: {"path":"stacks/hacks/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/hacks/index.mdx"}, data: docs_67 }, { info: {"path":"stacks/hacks/recipes.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/hacks/recipes.mdx"}, data: docs_68 }, { info: {"path":"stacks/nakamoto/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/nakamoto/index.mdx"}, data: docs_69 }, { info: {"path":"stacks/platform/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/index.mdx"}, data: docs_70 }, { info: {"path":"stacks/platform/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/quickstart.mdx"}, data: docs_71 }, { info: {"path":"stacks/platform-api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/index.mdx"}, data: docs_72 }, { info: {"path":"stacks/quickstarts/app-templates.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/app-templates.mdx"}, data: docs_73 }, { info: {"path":"stacks/quickstarts/contract-templates.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/contract-templates.mdx"}, data: docs_74 }, { info: {"path":"stacks/quickstarts/event-streaming.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/event-streaming.mdx"}, data: docs_75 }, { info: {"path":"stacks/quickstarts/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/index.mdx"}, data: docs_76 }, { info: {"path":"stacks/quickstarts/nft-minting.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/nft-minting.mdx"}, data: docs_77 }, { info: {"path":"stacks/quickstarts/token-transfers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/token-transfers.mdx"}, data: docs_78 }, { info: {"path":"stacks/quickstarts/wallet-integration.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/wallet-integration.mdx"}, data: docs_79 }, { info: {"path":"stacks/reference/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/index.mdx"}, data: docs_80 }, { info: {"path":"stacks/signer-metrics-api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/index.mdx"}, data: docs_81 }, { info: {"path":"stacks/rpc-api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/index.mdx"}, data: docs_82 }, { info: {"path":"stacks/stacks.js/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/index.mdx"}, data: docs_83 }, { info: {"path":"stacks/stacks.js/installation.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/installation.mdx"}, data: docs_84 }, { info: {"path":"stacks/stacks.js/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/quickstart.mdx"}, data: docs_85 }, { info: {"path":"stacks/stacks.js/roadmap.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/roadmap.mdx"}, data: docs_86 }, { info: {"path":"stacks/token-metadata-api/architecture.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/architecture.mdx"}, data: docs_87 }, { info: {"path":"stacks/token-metadata-api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/index.mdx"}, data: docs_88 }, { info: {"path":"stacks/token-metadata-api/usage.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/usage.mdx"}, data: docs_89 }, { info: {"path":"bitcoin/indexer/guides/run-indexer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/indexer/guides/run-indexer.mdx"}, data: docs_90 }, { info: {"path":"bitcoin/ordinals/explorer/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/explorer/index.mdx"}, data: docs_91 }, { info: {"path":"bitcoin/ordinals/api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/index.mdx"}, data: docs_92 }, { info: {"path":"bitcoin/ordinals/api/usage.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/usage.mdx"}, data: docs_93 }, { info: {"path":"bitcoin/runes/api/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/index.mdx"}, data: docs_94 }, { info: {"path":"bitcoin/runes/api/usage.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/usage.mdx"}, data: docs_95 }, { info: {"path":"bitcoin/runes/explorer/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/explorer/index.mdx"}, data: docs_96 }, { info: {"path":"bitcoin/runes/runehook/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/runehook/index.mdx"}, data: docs_97 }, { info: {"path":"bitcoin/runes/runehook/installation.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/runehook/installation.mdx"}, data: docs_98 }, { info: {"path":"bitcoin/runes/runehook/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/runehook/quickstart.mdx"}, data: docs_99 }, { info: {"path":"stacks/archive/guides/stacks-api.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/archive/guides/stacks-api.mdx"}, data: docs_100 }, { info: {"path":"stacks/archive/guides/stacks-blockchain.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/archive/guides/stacks-blockchain.mdx"}, data: docs_101 }, { info: {"path":"stacks/archive/guides/token-metadata-api.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/archive/guides/token-metadata-api.mdx"}, data: docs_102 }, { info: {"path":"stacks/archive/guides/verify-archive-data.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/archive/guides/verify-archive-data.mdx"}, data: docs_103 }, { info: {"path":"stacks/chainhook/examples/chainhook-as-a-service-with-stacks-node.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/examples/chainhook-as-a-service-with-stacks-node.mdx"}, data: docs_104 }, { info: {"path":"stacks/chainhook/examples/chainhook-as-a-service.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/examples/chainhook-as-a-service.mdx"}, data: docs_105 }, { info: {"path":"stacks/chainhook/examples/observing-contract-calls.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/examples/observing-contract-calls.mdx"}, data: docs_106 }, { info: {"path":"stacks/chainhook/examples/register-chainhooks-on-devnet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/examples/register-chainhooks-on-devnet.mdx"}, data: docs_107 }, { info: {"path":"stacks/clarinet/examples/add-a-contract.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/add-a-contract.mdx"}, data: docs_108 }, { info: {"path":"stacks/clarinet/examples/create-a-new-project.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/create-a-new-project.mdx"}, data: docs_109 }, { info: {"path":"stacks/clarinet/examples/create-deployment-plans.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/create-deployment-plans.mdx"}, data: docs_110 }, { info: {"path":"stacks/clarinet/examples/debug-a-contract.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/debug-a-contract.mdx"}, data: docs_111 }, { info: {"path":"stacks/clarinet/examples/deploy-a-contract.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/deploy-a-contract.mdx"}, data: docs_112 }, { info: {"path":"stacks/clarinet/examples/estimate-costs.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/estimate-costs.mdx"}, data: docs_113 }, { info: {"path":"stacks/clarinet/examples/run-a-local-devnet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/run-a-local-devnet.mdx"}, data: docs_114 }, { info: {"path":"stacks/clarinet/examples/start-a-development-console.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/start-a-development-console.mdx"}, data: docs_115 }, { info: {"path":"stacks/clarinet/examples/validate-a-contract.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/validate-a-contract.mdx"}, data: docs_116 }, { info: {"path":"stacks/clarinet/examples/working-with-sbtc.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/examples/working-with-sbtc.mdx"}, data: docs_117 }, { info: {"path":"stacks/clarinet-js-sdk/references/custom-matchers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/references/custom-matchers.mdx"}, data: docs_118 }, { info: {"path":"stacks/clarinet-js-sdk/references/methods.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/references/methods.mdx"}, data: docs_119 }, { info: {"path":"stacks/clarinet-js-sdk/references/properties.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/references/properties.mdx"}, data: docs_120 }, { info: {"path":"stacks/clarinet-js-sdk/references/simnet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/references/simnet.mdx"}, data: docs_121 }, { info: {"path":"stacks/connect/examples/authenticate-users.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/examples/authenticate-users.mdx"}, data: docs_122 }, { info: {"path":"stacks/connect/examples/broadcast-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/examples/broadcast-transactions.mdx"}, data: docs_123 }, { info: {"path":"stacks/connect/examples/migration.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/examples/migration.mdx"}, data: docs_124 }, { info: {"path":"stacks/connect/examples/sign-messages.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/examples/sign-messages.mdx"}, data: docs_125 }, { info: {"path":"stacks/connect/packages/connect.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/packages/connect.mdx"}, data: docs_126 }, { info: {"path":"stacks/clarity/functions/add.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/add.mdx"}, data: docs_127 }, { info: {"path":"stacks/clarity/functions/and.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/and.mdx"}, data: docs_128 }, { info: {"path":"stacks/clarity/functions/append.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/append.mdx"}, data: docs_129 }, { info: {"path":"stacks/clarity/functions/as-contract.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/as-contract.mdx"}, data: docs_130 }, { info: {"path":"stacks/clarity/functions/as-max-len.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/as-max-len.mdx"}, data: docs_131 }, { info: {"path":"stacks/clarity/functions/asserts.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/asserts.mdx"}, data: docs_132 }, { info: {"path":"stacks/clarity/functions/at-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/at-block.mdx"}, data: docs_133 }, { info: {"path":"stacks/clarity/functions/begin.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/begin.mdx"}, data: docs_134 }, { info: {"path":"stacks/clarity/functions/bit-and.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/bit-and.mdx"}, data: docs_135 }, { info: {"path":"stacks/clarity/functions/bit-not.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/bit-not.mdx"}, data: docs_136 }, { info: {"path":"stacks/clarity/functions/bit-or.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/bit-or.mdx"}, data: docs_137 }, { info: {"path":"stacks/clarity/functions/bit-shift-left.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/bit-shift-left.mdx"}, data: docs_138 }, { info: {"path":"stacks/clarity/functions/bit-shift-right.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/bit-shift-right.mdx"}, data: docs_139 }, { info: {"path":"stacks/clarity/functions/bit-xor.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/bit-xor.mdx"}, data: docs_140 }, { info: {"path":"stacks/clarity/functions/buff-to-int-be.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/buff-to-int-be.mdx"}, data: docs_141 }, { info: {"path":"stacks/clarity/functions/buff-to-int-le.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/buff-to-int-le.mdx"}, data: docs_142 }, { info: {"path":"stacks/clarity/functions/buff-to-uint-be.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/buff-to-uint-be.mdx"}, data: docs_143 }, { info: {"path":"stacks/clarity/functions/buff-to-uint-le.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/buff-to-uint-le.mdx"}, data: docs_144 }, { info: {"path":"stacks/clarity/functions/concat.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/concat.mdx"}, data: docs_145 }, { info: {"path":"stacks/clarity/functions/contract-call.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/contract-call.mdx"}, data: docs_146 }, { info: {"path":"stacks/clarity/functions/contract-of.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/contract-of.mdx"}, data: docs_147 }, { info: {"path":"stacks/clarity/functions/default-to.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/default-to.mdx"}, data: docs_148 }, { info: {"path":"stacks/clarity/functions/define-constant.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-constant.mdx"}, data: docs_149 }, { info: {"path":"stacks/clarity/functions/define-data-var.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-data-var.mdx"}, data: docs_150 }, { info: {"path":"stacks/clarity/functions/define-fungible-token.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-fungible-token.mdx"}, data: docs_151 }, { info: {"path":"stacks/clarity/functions/define-map.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-map.mdx"}, data: docs_152 }, { info: {"path":"stacks/clarity/functions/define-non-fungible-token.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-non-fungible-token.mdx"}, data: docs_153 }, { info: {"path":"stacks/clarity/functions/define-private.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-private.mdx"}, data: docs_154 }, { info: {"path":"stacks/clarity/functions/define-public.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-public.mdx"}, data: docs_155 }, { info: {"path":"stacks/clarity/functions/define-read-only.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-read-only.mdx"}, data: docs_156 }, { info: {"path":"stacks/clarity/functions/define-trait.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/define-trait.mdx"}, data: docs_157 }, { info: {"path":"stacks/clarity/functions/divide.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/divide.mdx"}, data: docs_158 }, { info: {"path":"stacks/clarity/functions/element-at.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/element-at.mdx"}, data: docs_159 }, { info: {"path":"stacks/clarity/functions/err.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/err.mdx"}, data: docs_160 }, { info: {"path":"stacks/clarity/functions/filter.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/filter.mdx"}, data: docs_161 }, { info: {"path":"stacks/clarity/functions/fold.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/fold.mdx"}, data: docs_162 }, { info: {"path":"stacks/clarity/functions/from-consensus-buff.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/from-consensus-buff.mdx"}, data: docs_163 }, { info: {"path":"stacks/clarity/functions/ft-burn.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/ft-burn.mdx"}, data: docs_164 }, { info: {"path":"stacks/clarity/functions/ft-get-balance.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/ft-get-balance.mdx"}, data: docs_165 }, { info: {"path":"stacks/clarity/functions/ft-get-supply.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/ft-get-supply.mdx"}, data: docs_166 }, { info: {"path":"stacks/clarity/functions/ft-mint.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/ft-mint.mdx"}, data: docs_167 }, { info: {"path":"stacks/clarity/functions/ft-transfer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/ft-transfer.mdx"}, data: docs_168 }, { info: {"path":"stacks/clarity/functions/get-block-info.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/get-block-info.mdx"}, data: docs_169 }, { info: {"path":"stacks/clarity/functions/get-burn-block-info.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/get-burn-block-info.mdx"}, data: docs_170 }, { info: {"path":"stacks/clarity/functions/get-stacks-block-info.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/get-stacks-block-info.mdx"}, data: docs_171 }, { info: {"path":"stacks/clarity/functions/get-tenure-info.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/get-tenure-info.mdx"}, data: docs_172 }, { info: {"path":"stacks/clarity/functions/get.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/get.mdx"}, data: docs_173 }, { info: {"path":"stacks/clarity/functions/greater-than-or-equal.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/greater-than-or-equal.mdx"}, data: docs_174 }, { info: {"path":"stacks/clarity/functions/greater-than.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/greater-than.mdx"}, data: docs_175 }, { info: {"path":"stacks/clarity/functions/hash160.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/hash160.mdx"}, data: docs_176 }, { info: {"path":"stacks/clarity/functions/if.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/if.mdx"}, data: docs_177 }, { info: {"path":"stacks/clarity/functions/impl-trait.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/impl-trait.mdx"}, data: docs_178 }, { info: {"path":"stacks/clarity/functions/index-of.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/index-of.mdx"}, data: docs_179 }, { info: {"path":"stacks/clarity/functions/int-to-ascii.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/int-to-ascii.mdx"}, data: docs_180 }, { info: {"path":"stacks/clarity/functions/int-to-utf8.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/int-to-utf8.mdx"}, data: docs_181 }, { info: {"path":"stacks/clarity/functions/is-eq.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/is-eq.mdx"}, data: docs_182 }, { info: {"path":"stacks/clarity/functions/is-err.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/is-err.mdx"}, data: docs_183 }, { info: {"path":"stacks/clarity/functions/is-none.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/is-none.mdx"}, data: docs_184 }, { info: {"path":"stacks/clarity/functions/is-ok.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/is-ok.mdx"}, data: docs_185 }, { info: {"path":"stacks/clarity/functions/is-some.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/is-some.mdx"}, data: docs_186 }, { info: {"path":"stacks/clarity/functions/is-standard.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/is-standard.mdx"}, data: docs_187 }, { info: {"path":"stacks/clarity/functions/keccak256.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/keccak256.mdx"}, data: docs_188 }, { info: {"path":"stacks/clarity/functions/len.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/len.mdx"}, data: docs_189 }, { info: {"path":"stacks/clarity/functions/less-than-or-equal.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/less-than-or-equal.mdx"}, data: docs_190 }, { info: {"path":"stacks/clarity/functions/less-than.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/less-than.mdx"}, data: docs_191 }, { info: {"path":"stacks/clarity/functions/let.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/let.mdx"}, data: docs_192 }, { info: {"path":"stacks/clarity/functions/list.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/list.mdx"}, data: docs_193 }, { info: {"path":"stacks/clarity/functions/log2.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/log2.mdx"}, data: docs_194 }, { info: {"path":"stacks/clarity/functions/map-delete.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/map-delete.mdx"}, data: docs_195 }, { info: {"path":"stacks/clarity/functions/map-get.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/map-get.mdx"}, data: docs_196 }, { info: {"path":"stacks/clarity/functions/map-insert.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/map-insert.mdx"}, data: docs_197 }, { info: {"path":"stacks/clarity/functions/map-set.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/map-set.mdx"}, data: docs_198 }, { info: {"path":"stacks/clarity/functions/map.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/map.mdx"}, data: docs_199 }, { info: {"path":"stacks/clarity/functions/match.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/match.mdx"}, data: docs_200 }, { info: {"path":"stacks/clarity/functions/merge.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/merge.mdx"}, data: docs_201 }, { info: {"path":"stacks/clarity/functions/mod.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/mod.mdx"}, data: docs_202 }, { info: {"path":"stacks/clarity/functions/multiply.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/multiply.mdx"}, data: docs_203 }, { info: {"path":"stacks/clarity/functions/nft-burn.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/nft-burn.mdx"}, data: docs_204 }, { info: {"path":"stacks/clarity/functions/nft-get-owner.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/nft-get-owner.mdx"}, data: docs_205 }, { info: {"path":"stacks/clarity/functions/nft-mint.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/nft-mint.mdx"}, data: docs_206 }, { info: {"path":"stacks/clarity/functions/nft-transfer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/nft-transfer.mdx"}, data: docs_207 }, { info: {"path":"stacks/clarity/functions/not.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/not.mdx"}, data: docs_208 }, { info: {"path":"stacks/clarity/functions/ok.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/ok.mdx"}, data: docs_209 }, { info: {"path":"stacks/clarity/functions/or.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/or.mdx"}, data: docs_210 }, { info: {"path":"stacks/clarity/functions/pow.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/pow.mdx"}, data: docs_211 }, { info: {"path":"stacks/clarity/functions/principal-construct.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/principal-construct.mdx"}, data: docs_212 }, { info: {"path":"stacks/clarity/functions/principal-destruct.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/principal-destruct.mdx"}, data: docs_213 }, { info: {"path":"stacks/clarity/functions/principal-of.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/principal-of.mdx"}, data: docs_214 }, { info: {"path":"stacks/clarity/functions/print.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/print.mdx"}, data: docs_215 }, { info: {"path":"stacks/clarity/functions/replace-at.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/replace-at.mdx"}, data: docs_216 }, { info: {"path":"stacks/clarity/functions/secp256k1-recover.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/secp256k1-recover.mdx"}, data: docs_217 }, { info: {"path":"stacks/clarity/functions/secp256k1-verify.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/secp256k1-verify.mdx"}, data: docs_218 }, { info: {"path":"stacks/clarity/functions/sha256.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/sha256.mdx"}, data: docs_219 }, { info: {"path":"stacks/clarity/functions/sha512-256.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/sha512-256.mdx"}, data: docs_220 }, { info: {"path":"stacks/clarity/functions/sha512.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/sha512.mdx"}, data: docs_221 }, { info: {"path":"stacks/clarity/functions/slice.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/slice.mdx"}, data: docs_222 }, { info: {"path":"stacks/clarity/functions/some.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/some.mdx"}, data: docs_223 }, { info: {"path":"stacks/clarity/functions/sqrti.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/sqrti.mdx"}, data: docs_224 }, { info: {"path":"stacks/clarity/functions/string-to-int.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/string-to-int.mdx"}, data: docs_225 }, { info: {"path":"stacks/clarity/functions/string-to-uint.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/string-to-uint.mdx"}, data: docs_226 }, { info: {"path":"stacks/clarity/functions/stx-account.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/stx-account.mdx"}, data: docs_227 }, { info: {"path":"stacks/clarity/functions/stx-burn.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/stx-burn.mdx"}, data: docs_228 }, { info: {"path":"stacks/clarity/functions/stx-get-balance.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/stx-get-balance.mdx"}, data: docs_229 }, { info: {"path":"stacks/clarity/functions/stx-transfer-memo.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/stx-transfer-memo.mdx"}, data: docs_230 }, { info: {"path":"stacks/clarity/functions/stx-transfer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/stx-transfer.mdx"}, data: docs_231 }, { info: {"path":"stacks/clarity/functions/subtract.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/subtract.mdx"}, data: docs_232 }, { info: {"path":"stacks/clarity/functions/to-consensus-buff.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/to-consensus-buff.mdx"}, data: docs_233 }, { info: {"path":"stacks/clarity/functions/to-int.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/to-int.mdx"}, data: docs_234 }, { info: {"path":"stacks/clarity/functions/to-uint.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/to-uint.mdx"}, data: docs_235 }, { info: {"path":"stacks/clarity/functions/try.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/try.mdx"}, data: docs_236 }, { info: {"path":"stacks/clarity/functions/tuple.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/tuple.mdx"}, data: docs_237 }, { info: {"path":"stacks/clarity/functions/unwrap-err-panic.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/unwrap-err-panic.mdx"}, data: docs_238 }, { info: {"path":"stacks/clarity/functions/unwrap-err.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/unwrap-err.mdx"}, data: docs_239 }, { info: {"path":"stacks/clarity/functions/unwrap-panic.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/unwrap-panic.mdx"}, data: docs_240 }, { info: {"path":"stacks/clarity/functions/unwrap.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/unwrap.mdx"}, data: docs_241 }, { info: {"path":"stacks/clarity/functions/use-trait.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/use-trait.mdx"}, data: docs_242 }, { info: {"path":"stacks/clarity/functions/var-get.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/var-get.mdx"}, data: docs_243 }, { info: {"path":"stacks/clarity/functions/var-set.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/var-set.mdx"}, data: docs_244 }, { info: {"path":"stacks/clarity/functions/xor.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/functions/xor.mdx"}, data: docs_245 }, { info: {"path":"stacks/explorer/guides/build-explorer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/explorer/guides/build-explorer.mdx"}, data: docs_246 }, { info: {"path":"stacks/hacks/archive/ai.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/hacks/archive/ai.mdx"}, data: docs_247 }, { info: {"path":"stacks/hacks/archive/build-a-custom-api.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/hacks/archive/build-a-custom-api.mdx"}, data: docs_248 }, { info: {"path":"stacks/hacks/archive/build-a-decentralized-grants-program.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/hacks/archive/build-a-decentralized-grants-program.mdx"}, data: docs_249 }, { info: {"path":"stacks/hacks/archive/build-a-friend-tech-clone.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/hacks/archive/build-a-friend-tech-clone.mdx"}, data: docs_250 }, { info: {"path":"stacks/nakamoto/guides/clarinet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/nakamoto/guides/clarinet.mdx"}, data: docs_251 }, { info: {"path":"stacks/nakamoto/guides/explorer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/nakamoto/guides/explorer.mdx"}, data: docs_252 }, { info: {"path":"stacks/nakamoto/guides/stacks-api.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/nakamoto/guides/stacks-api.mdx"}, data: docs_253 }, { info: {"path":"stacks/nakamoto/guides/stacks-js.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/nakamoto/guides/stacks-js.mdx"}, data: docs_254 }, { info: {"path":"stacks/platform/examples/archive-project.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/examples/archive-project.mdx"}, data: docs_255 }, { info: {"path":"stacks/platform/examples/contract-monitoring.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/examples/contract-monitoring.mdx"}, data: docs_256 }, { info: {"path":"stacks/platform/examples/create-chainhooks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/examples/create-chainhooks.mdx"}, data: docs_257 }, { info: {"path":"stacks/platform/examples/create-project.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/examples/create-project.mdx"}, data: docs_258 }, { info: {"path":"stacks/platform/examples/deploy-contracts.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/examples/deploy-contracts.mdx"}, data: docs_259 }, { info: {"path":"stacks/platform/examples/devnet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/examples/devnet.mdx"}, data: docs_260 }, { info: {"path":"stacks/platform/examples/faucet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/examples/faucet.mdx"}, data: docs_261 }, { info: {"path":"stacks/platform-api/chainhooks/create.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/create.mdx"}, data: docs_262 }, { info: {"path":"stacks/platform-api/chainhooks/delete.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/delete.mdx"}, data: docs_263 }, { info: {"path":"stacks/platform-api/chainhooks/get.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/get.mdx"}, data: docs_264 }, { info: {"path":"stacks/platform-api/chainhooks/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/index.mdx"}, data: docs_265 }, { info: {"path":"stacks/platform-api/chainhooks/list.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/list.mdx"}, data: docs_266 }, { info: {"path":"stacks/platform-api/chainhooks/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/status.mdx"}, data: docs_267 }, { info: {"path":"stacks/platform-api/chainhooks/update.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/update.mdx"}, data: docs_268 }, { info: {"path":"stacks/platform-api/devnet/bitcoin-node.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/devnet/bitcoin-node.mdx"}, data: docs_269 }, { info: {"path":"stacks/platform-api/devnet/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/devnet/index.mdx"}, data: docs_270 }, { info: {"path":"stacks/platform-api/devnet/stacks-blockchain-api.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/devnet/stacks-blockchain-api.mdx"}, data: docs_271 }, { info: {"path":"stacks/platform-api/devnet/start.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/devnet/start.mdx"}, data: docs_272 }, { info: {"path":"stacks/platform-api/devnet/stop.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/devnet/stop.mdx"}, data: docs_273 }, { info: {"path":"stacks/reference/clarinet-js-sdk/clarinet-sdk.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/clarinet-js-sdk/clarinet-sdk.mdx"}, data: docs_274 }, { info: {"path":"stacks/reference/clarinet-js-sdk/custom-matchers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/clarinet-js-sdk/custom-matchers.mdx"}, data: docs_275 }, { info: {"path":"stacks/reference/clarinet-js-sdk/methods.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/clarinet-js-sdk/methods.mdx"}, data: docs_276 }, { info: {"path":"stacks/reference/clarinet-js-sdk/properties.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/clarinet-js-sdk/properties.mdx"}, data: docs_277 }, { info: {"path":"stacks/reference/clarinet-js-sdk/simnet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/clarinet-js-sdk/simnet.mdx"}, data: docs_278 }, { info: {"path":"stacks/reference/cli/clarinet.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/cli/clarinet.mdx"}, data: docs_279 }, { info: {"path":"stacks/reference/cli/stacks-js.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/cli/stacks-js.mdx"}, data: docs_280 }, { info: {"path":"stacks/reference/stacks-blockchain-api/client.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/stacks-blockchain-api/client.mdx"}, data: docs_281 }, { info: {"path":"stacks/reference/stacks.js/common.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/stacks.js/common.mdx"}, data: docs_282 }, { info: {"path":"stacks/reference/stacks.js/connect.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/stacks.js/connect.mdx"}, data: docs_283 }, { info: {"path":"stacks/reference/stacks.js/network.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/stacks.js/network.mdx"}, data: docs_284 }, { info: {"path":"stacks/reference/stacks.js/sbtc.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/stacks.js/sbtc.mdx"}, data: docs_285 }, { info: {"path":"stacks/reference/stacks.js/transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/stacks.js/transactions.mdx"}, data: docs_286 }, { info: {"path":"stacks/signer-metrics-api/block-proposals/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/block-proposals/index.mdx"}, data: docs_287 }, { info: {"path":"stacks/signer-metrics-api/block-proposals/signer-information-for-a-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-a-block.mdx"}, data: docs_288 }, { info: {"path":"stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/block-proposals/signer-information-for-most-recent-block-proposals.mdx"}, data: docs_289 }, { info: {"path":"stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-a-block.mdx"}, data: docs_290 }, { info: {"path":"stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/blocks/aggregated-signer-information-for-most-recent-blocks.mdx"}, data: docs_291 }, { info: {"path":"stacks/signer-metrics-api/blocks/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/blocks/index.mdx"}, data: docs_292 }, { info: {"path":"stacks/signer-metrics-api/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/info/index.mdx"}, data: docs_293 }, { info: {"path":"stacks/signer-metrics-api/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/info/status.mdx"}, data: docs_294 }, { info: {"path":"stacks/signer-metrics-api/prometheus/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/prometheus/index.mdx"}, data: docs_295 }, { info: {"path":"stacks/signer-metrics-api/prometheus/metrics.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/prometheus/metrics.mdx"}, data: docs_296 }, { info: {"path":"stacks/signer-metrics-api/signers/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/signers/index.mdx"}, data: docs_297 }, { info: {"path":"stacks/signer-metrics-api/signers/pox-cycle-signer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/signers/pox-cycle-signer.mdx"}, data: docs_298 }, { info: {"path":"stacks/signer-metrics-api/signers/pox-cycle-signers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/signers/pox-cycle-signers.mdx"}, data: docs_299 }, { info: {"path":"stacks/rpc-api/accounts/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/accounts/index.mdx"}, data: docs_300 }, { info: {"path":"stacks/rpc-api/accounts/info.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/accounts/info.mdx"}, data: docs_301 }, { info: {"path":"stacks/rpc-api/blocks/block-proposal.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/blocks/block-proposal.mdx"}, data: docs_302 }, { info: {"path":"stacks/rpc-api/blocks/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/blocks/index.mdx"}, data: docs_303 }, { info: {"path":"stacks/rpc-api/burn-ops/get-burn-operations.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/burn-ops/get-burn-operations.mdx"}, data: docs_304 }, { info: {"path":"stacks/rpc-api/burn-ops/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/burn-ops/index.mdx"}, data: docs_305 }, { info: {"path":"stacks/rpc-api/fees/estimate.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/fees/estimate.mdx"}, data: docs_306 }, { info: {"path":"stacks/rpc-api/fees/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/fees/index.mdx"}, data: docs_307 }, { info: {"path":"stacks/rpc-api/fees/transfer-estimate.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/fees/transfer-estimate.mdx"}, data: docs_308 }, { info: {"path":"stacks/rpc-api/info/core-api.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/info/core-api.mdx"}, data: docs_309 }, { info: {"path":"stacks/rpc-api/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/info/index.mdx"}, data: docs_310 }, { info: {"path":"stacks/rpc-api/names/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/names/index.mdx"}, data: docs_311 }, { info: {"path":"stacks/rpc-api/names/name-price.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/names/name-price.mdx"}, data: docs_312 }, { info: {"path":"stacks/rpc-api/names/namespace-price.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/names/namespace-price.mdx"}, data: docs_313 }, { info: {"path":"stacks/rpc-api/pox/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/pox/index.mdx"}, data: docs_314 }, { info: {"path":"stacks/rpc-api/pox/pox-details.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/pox/pox-details.mdx"}, data: docs_315 }, { info: {"path":"stacks/rpc-api/pox/stacker-set.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/pox/stacker-set.mdx"}, data: docs_316 }, { info: {"path":"stacks/rpc-api/smart-contracts/constants.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/constants.mdx"}, data: docs_317 }, { info: {"path":"stacks/rpc-api/smart-contracts/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/index.mdx"}, data: docs_318 }, { info: {"path":"stacks/rpc-api/smart-contracts/interface.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/interface.mdx"}, data: docs_319 }, { info: {"path":"stacks/rpc-api/smart-contracts/map-entry.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/map-entry.mdx"}, data: docs_320 }, { info: {"path":"stacks/rpc-api/smart-contracts/read-only.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/read-only.mdx"}, data: docs_321 }, { info: {"path":"stacks/rpc-api/smart-contracts/source.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/source.mdx"}, data: docs_322 }, { info: {"path":"stacks/rpc-api/smart-contracts/traits.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/traits.mdx"}, data: docs_323 }, { info: {"path":"stacks/rpc-api/transactions/broadcast-transaction.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/transactions/broadcast-transaction.mdx"}, data: docs_324 }, { info: {"path":"stacks/rpc-api/transactions/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/transactions/index.mdx"}, data: docs_325 }, { info: {"path":"stacks/rpc-api/v3/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/v3/index.mdx"}, data: docs_326 }, { info: {"path":"stacks/rpc-api/v3/nakamoto-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/v3/nakamoto-block.mdx"}, data: docs_327 }, { info: {"path":"stacks/rpc-api/v3/tenure-blocks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/v3/tenure-blocks.mdx"}, data: docs_328 }, { info: {"path":"stacks/rpc-api/v3/tenure-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/v3/tenure-metadata.mdx"}, data: docs_329 }, { info: {"path":"stacks/stacks.js/concepts/accounts-and-addresses.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/concepts/accounts-and-addresses.mdx"}, data: docs_330 }, { info: {"path":"stacks/stacks.js/concepts/broadcasting.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/concepts/broadcasting.mdx"}, data: docs_331 }, { info: {"path":"stacks/stacks.js/concepts/networks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/concepts/networks.mdx"}, data: docs_332 }, { info: {"path":"stacks/stacks.js/concepts/post-conditions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/concepts/post-conditions.mdx"}, data: docs_333 }, { info: {"path":"stacks/stacks.js/concepts/private-keys.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/concepts/private-keys.mdx"}, data: docs_334 }, { info: {"path":"stacks/stacks.js/concepts/transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/concepts/transactions.mdx"}, data: docs_335 }, { info: {"path":"stacks/stacks.js/examples/broadcast-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/examples/broadcast-transactions.mdx"}, data: docs_336 }, { info: {"path":"stacks/stacks.js/examples/post-conditions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/examples/post-conditions.mdx"}, data: docs_337 }, { info: {"path":"stacks/stacks.js/examples/use-with-react-native.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/examples/use-with-react-native.mdx"}, data: docs_338 }, { info: {"path":"stacks/stacks.js/packages/common.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/packages/common.mdx"}, data: docs_339 }, { info: {"path":"stacks/stacks.js/packages/network.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/packages/network.mdx"}, data: docs_340 }, { info: {"path":"stacks/stacks.js/packages/sbtc.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/packages/sbtc.mdx"}, data: docs_341 }, { info: {"path":"stacks/stacks.js/packages/transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/packages/transactions.mdx"}, data: docs_342 }, { info: {"path":"stacks/stacks.js/v6/network.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/v6/network.mdx"}, data: docs_343 }, { info: {"path":"stacks/stacks.js/v6/transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/v6/transactions.mdx"}, data: docs_344 }, { info: {"path":"stacks/token-metadata-api/client/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/client/index.mdx"}, data: docs_345 }, { info: {"path":"stacks/token-metadata-api/client/quickstart.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/client/quickstart.mdx"}, data: docs_346 }, { info: {"path":"stacks/token-metadata-api/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/info/index.mdx"}, data: docs_347 }, { info: {"path":"stacks/token-metadata-api/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/info/status.mdx"}, data: docs_348 }, { info: {"path":"stacks/token-metadata-api/tokens/fungible-token-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/tokens/fungible-token-metadata.mdx"}, data: docs_349 }, { info: {"path":"stacks/token-metadata-api/tokens/fungible-tokens.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/tokens/fungible-tokens.mdx"}, data: docs_350 }, { info: {"path":"stacks/token-metadata-api/tokens/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/tokens/index.mdx"}, data: docs_351 }, { info: {"path":"stacks/token-metadata-api/tokens/non-fungible-token-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/tokens/non-fungible-token-metadata.mdx"}, data: docs_352 }, { info: {"path":"stacks/token-metadata-api/tokens/semi-fungible-token-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/tokens/semi-fungible-token-metadata.mdx"}, data: docs_353 }, { info: {"path":"bitcoin/api/ordinals/brc20/get-brc20-activity.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/brc20/get-brc20-activity.mdx"}, data: docs_354 }, { info: {"path":"bitcoin/api/ordinals/brc20/get-brc20-balances.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/brc20/get-brc20-balances.mdx"}, data: docs_355 }, { info: {"path":"bitcoin/api/ordinals/brc20/get-brc20-token-details.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-details.mdx"}, data: docs_356 }, { info: {"path":"bitcoin/api/ordinals/brc20/get-brc20-token-holders.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/brc20/get-brc20-token-holders.mdx"}, data: docs_357 }, { info: {"path":"bitcoin/api/ordinals/brc20/get-brc20-tokens.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/brc20/get-brc20-tokens.mdx"}, data: docs_358 }, { info: {"path":"bitcoin/api/ordinals/brc20/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/brc20/index.mdx"}, data: docs_359 }, { info: {"path":"bitcoin/api/ordinals/inscriptions/get-inscription-content.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-content.mdx"}, data: docs_360 }, { info: {"path":"bitcoin/api/ordinals/inscriptions/get-inscription-transfers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/inscriptions/get-inscription-transfers.mdx"}, data: docs_361 }, { info: {"path":"bitcoin/api/ordinals/inscriptions/get-inscription.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/inscriptions/get-inscription.mdx"}, data: docs_362 }, { info: {"path":"bitcoin/api/ordinals/inscriptions/get-inscriptions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/inscriptions/get-inscriptions.mdx"}, data: docs_363 }, { info: {"path":"bitcoin/api/ordinals/inscriptions/get-transfers-per-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/inscriptions/get-transfers-per-block.mdx"}, data: docs_364 }, { info: {"path":"bitcoin/api/ordinals/inscriptions/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/inscriptions/index.mdx"}, data: docs_365 }, { info: {"path":"bitcoin/api/ordinals/statistics/get-stats-inscription-count.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/statistics/get-stats-inscription-count.mdx"}, data: docs_366 }, { info: {"path":"bitcoin/api/ordinals/statistics/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/statistics/index.mdx"}, data: docs_367 }, { info: {"path":"bitcoin/api/runes/activities/activity.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/activities/activity.mdx"}, data: docs_368 }, { info: {"path":"bitcoin/api/runes/activities/for-address.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/activities/for-address.mdx"}, data: docs_369 }, { info: {"path":"bitcoin/api/runes/activities/for-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/activities/for-block.mdx"}, data: docs_370 }, { info: {"path":"bitcoin/api/runes/activities/for-transaction.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/activities/for-transaction.mdx"}, data: docs_371 }, { info: {"path":"bitcoin/api/runes/activities/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/activities/index.mdx"}, data: docs_372 }, { info: {"path":"bitcoin/api/ordinals/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/info/index.mdx"}, data: docs_373 }, { info: {"path":"bitcoin/api/ordinals/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/info/status.mdx"}, data: docs_374 }, { info: {"path":"bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/satoshis/get-satoshi-inscriptions.mdx"}, data: docs_375 }, { info: {"path":"bitcoin/api/ordinals/satoshis/get-satoshi.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/satoshis/get-satoshi.mdx"}, data: docs_376 }, { info: {"path":"bitcoin/api/ordinals/satoshis/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/satoshis/index.mdx"}, data: docs_377 }, { info: {"path":"bitcoin/api/runes/balances/address.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/balances/address.mdx"}, data: docs_378 }, { info: {"path":"bitcoin/api/runes/balances/holder-balance.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/balances/holder-balance.mdx"}, data: docs_379 }, { info: {"path":"bitcoin/api/runes/balances/holders.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/balances/holders.mdx"}, data: docs_380 }, { info: {"path":"bitcoin/api/runes/balances/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/balances/index.mdx"}, data: docs_381 }, { info: {"path":"bitcoin/api/runes/etchings/get-etching.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/etchings/get-etching.mdx"}, data: docs_382 }, { info: {"path":"bitcoin/api/runes/etchings/get-etchings.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/etchings/get-etchings.mdx"}, data: docs_383 }, { info: {"path":"bitcoin/api/runes/etchings/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/etchings/index.mdx"}, data: docs_384 }, { info: {"path":"bitcoin/api/runes/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/info/index.mdx"}, data: docs_385 }, { info: {"path":"bitcoin/api/runes/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/info/status.mdx"}, data: docs_386 }, { info: {"path":"bitcoin/ordinals/explorer/guides/build-explorer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/explorer/guides/build-explorer.mdx"}, data: docs_387 }, { info: {"path":"bitcoin/ordinals/api/brc20/get-brc20-activity.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/brc20/get-brc20-activity.mdx"}, data: docs_388 }, { info: {"path":"bitcoin/ordinals/api/brc20/get-brc20-balances.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/brc20/get-brc20-balances.mdx"}, data: docs_389 }, { info: {"path":"bitcoin/ordinals/api/brc20/get-brc20-token-details.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-details.mdx"}, data: docs_390 }, { info: {"path":"bitcoin/ordinals/api/brc20/get-brc20-token-holders.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/brc20/get-brc20-token-holders.mdx"}, data: docs_391 }, { info: {"path":"bitcoin/ordinals/api/brc20/get-brc20-tokens.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/brc20/get-brc20-tokens.mdx"}, data: docs_392 }, { info: {"path":"bitcoin/ordinals/api/brc20/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/brc20/index.mdx"}, data: docs_393 }, { info: {"path":"bitcoin/ordinals/api/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/info/index.mdx"}, data: docs_394 }, { info: {"path":"bitcoin/ordinals/api/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/info/status.mdx"}, data: docs_395 }, { info: {"path":"bitcoin/ordinals/api/inscriptions/get-inscription-content.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-content.mdx"}, data: docs_396 }, { info: {"path":"bitcoin/ordinals/api/inscriptions/get-inscription-transfers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription-transfers.mdx"}, data: docs_397 }, { info: {"path":"bitcoin/ordinals/api/inscriptions/get-inscription.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/inscriptions/get-inscription.mdx"}, data: docs_398 }, { info: {"path":"bitcoin/ordinals/api/inscriptions/get-inscriptions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/inscriptions/get-inscriptions.mdx"}, data: docs_399 }, { info: {"path":"bitcoin/ordinals/api/inscriptions/get-transfers-per-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/inscriptions/get-transfers-per-block.mdx"}, data: docs_400 }, { info: {"path":"bitcoin/ordinals/api/inscriptions/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/inscriptions/index.mdx"}, data: docs_401 }, { info: {"path":"bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/satoshis/get-satoshi-inscriptions.mdx"}, data: docs_402 }, { info: {"path":"bitcoin/ordinals/api/satoshis/get-satoshi.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/satoshis/get-satoshi.mdx"}, data: docs_403 }, { info: {"path":"bitcoin/ordinals/api/satoshis/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/satoshis/index.mdx"}, data: docs_404 }, { info: {"path":"bitcoin/ordinals/api/statistics/get-stats-inscription-count.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/statistics/get-stats-inscription-count.mdx"}, data: docs_405 }, { info: {"path":"bitcoin/ordinals/api/statistics/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/statistics/index.mdx"}, data: docs_406 }, { info: {"path":"bitcoin/runes/api/activities/activity.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/activities/activity.mdx"}, data: docs_407 }, { info: {"path":"bitcoin/runes/api/activities/for-address.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/activities/for-address.mdx"}, data: docs_408 }, { info: {"path":"bitcoin/runes/api/activities/for-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/activities/for-block.mdx"}, data: docs_409 }, { info: {"path":"bitcoin/runes/api/activities/for-transaction.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/activities/for-transaction.mdx"}, data: docs_410 }, { info: {"path":"bitcoin/runes/api/activities/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/activities/index.mdx"}, data: docs_411 }, { info: {"path":"bitcoin/runes/api/balances/address.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/balances/address.mdx"}, data: docs_412 }, { info: {"path":"bitcoin/runes/api/balances/holder-balance.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/balances/holder-balance.mdx"}, data: docs_413 }, { info: {"path":"bitcoin/runes/api/balances/holders.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/balances/holders.mdx"}, data: docs_414 }, { info: {"path":"bitcoin/runes/api/balances/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/balances/index.mdx"}, data: docs_415 }, { info: {"path":"bitcoin/runes/api/etchings/get-etching.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/etchings/get-etching.mdx"}, data: docs_416 }, { info: {"path":"bitcoin/runes/api/etchings/get-etchings.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/etchings/get-etchings.mdx"}, data: docs_417 }, { info: {"path":"bitcoin/runes/api/etchings/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/etchings/index.mdx"}, data: docs_418 }, { info: {"path":"bitcoin/runes/api/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/info/index.mdx"}, data: docs_419 }, { info: {"path":"bitcoin/runes/api/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/info/status.mdx"}, data: docs_420 }, { info: {"path":"bitcoin/runes/explorer/guides/build-explorer.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/explorer/guides/build-explorer.mdx"}, data: docs_421 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/assets.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/assets.mdx"}, data: docs_422 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/balances.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/balances.mdx"}, data: docs_423 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/inbound-stx-transfers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/inbound-stx-transfers.mdx"}, data: docs_424 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/latest-nonce.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/latest-nonce.mdx"}, data: docs_425 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/nft-events.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/nft-events.mdx"}, data: docs_426 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/stx-balances.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/stx-balances.mdx"}, data: docs_427 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/transaction-with-transfers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/transaction-with-transfers.mdx"}, data: docs_428 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/transactions-with-transfers.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/transactions-with-transfers.mdx"}, data: docs_429 }, { info: {"path":"stacks/api/stacks-blockchain/accounts/transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/transactions.mdx"}, data: docs_430 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/average-times.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/average-times.mdx"}, data: docs_431 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-hash.mdx"}, data: docs_432 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/block-by-burn-block-height.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/block-by-burn-block-height.mdx"}, data: docs_433 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/block-by-hash.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/block-by-hash.mdx"}, data: docs_434 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/block-by-height.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/block-by-height.mdx"}, data: docs_435 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/get-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/get-block.mdx"}, data: docs_436 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/get-blocks-by-burn-block.mdx"}, data: docs_437 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/get-blocks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/get-blocks.mdx"}, data: docs_438 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/index.mdx"}, data: docs_439 }, { info: {"path":"stacks/api/stacks-blockchain/blocks/recent-blocks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/recent-blocks.mdx"}, data: docs_440 }, { info: {"path":"stacks/api/stacks-blockchain/burn-blocks/get-burn-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-block.mdx"}, data: docs_441 }, { info: {"path":"stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/burn-blocks/get-burn-blocks.mdx"}, data: docs_442 }, { info: {"path":"stacks/api/stacks-blockchain/burn-blocks/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/burn-blocks/index.mdx"}, data: docs_443 }, { info: {"path":"stacks/api/stacks-blockchain/faucets/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/faucets/index.mdx"}, data: docs_444 }, { info: {"path":"stacks/api/stacks-blockchain/faucets/stx.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/faucets/stx.mdx"}, data: docs_445 }, { info: {"path":"stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/circulating-stx-supply-in-plain-text.mdx"}, data: docs_446 }, { info: {"path":"stacks/api/stacks-blockchain/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/index.mdx"}, data: docs_447 }, { info: {"path":"stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/legacy-total-and-unlocked-stx-supply.mdx"}, data: docs_448 }, { info: {"path":"stacks/api/stacks-blockchain/info/network-block-time.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/network-block-time.mdx"}, data: docs_449 }, { info: {"path":"stacks/api/stacks-blockchain/info/network-given-block-time.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/network-given-block-time.mdx"}, data: docs_450 }, { info: {"path":"stacks/api/stacks-blockchain/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/status.mdx"}, data: docs_451 }, { info: {"path":"stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/total-and-unlocked-stx-supply.mdx"}, data: docs_452 }, { info: {"path":"stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/total-stx-supply-in-plain-text.mdx"}, data: docs_453 }, { info: {"path":"stacks/api/stacks-blockchain/fees/fee-rate.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/fees/fee-rate.mdx"}, data: docs_454 }, { info: {"path":"stacks/api/stacks-blockchain/fees/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/fees/index.mdx"}, data: docs_455 }, { info: {"path":"stacks/api/stacks-blockchain/mempool/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/mempool/index.mdx"}, data: docs_456 }, { info: {"path":"stacks/api/stacks-blockchain/mempool/transaction-fee-priorities.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/mempool/transaction-fee-priorities.mdx"}, data: docs_457 }, { info: {"path":"stacks/api/stacks-blockchain/names/historical-zonefile.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/historical-zonefile.mdx"}, data: docs_458 }, { info: {"path":"stacks/api/stacks-blockchain/names/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/index.mdx"}, data: docs_459 }, { info: {"path":"stacks/api/stacks-blockchain/names/name-details.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/name-details.mdx"}, data: docs_460 }, { info: {"path":"stacks/api/stacks-blockchain/names/name-subdomains.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/name-subdomains.mdx"}, data: docs_461 }, { info: {"path":"stacks/api/stacks-blockchain/names/name-zonefile.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/name-zonefile.mdx"}, data: docs_462 }, { info: {"path":"stacks/api/stacks-blockchain/names/names.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/names.mdx"}, data: docs_463 }, { info: {"path":"stacks/api/stacks-blockchain/names/namespace-names.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/namespace-names.mdx"}, data: docs_464 }, { info: {"path":"stacks/api/stacks-blockchain/names/namespaces.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/namespaces.mdx"}, data: docs_465 }, { info: {"path":"stacks/api/stacks-blockchain/names/owned-by-address.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/owned-by-address.mdx"}, data: docs_466 }, { info: {"path":"stacks/api/stacks-blockchain/non-fungible-tokens/history.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/history.mdx"}, data: docs_467 }, { info: {"path":"stacks/api/stacks-blockchain/non-fungible-tokens/holdings.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/holdings.mdx"}, data: docs_468 }, { info: {"path":"stacks/api/stacks-blockchain/non-fungible-tokens/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/index.mdx"}, data: docs_469 }, { info: {"path":"stacks/api/stacks-blockchain/non-fungible-tokens/mints.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/mints.mdx"}, data: docs_470 }, { info: {"path":"stacks/api/stacks-blockchain/proof-of-transfer/cycle.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycle.mdx"}, data: docs_471 }, { info: {"path":"stacks/api/stacks-blockchain/proof-of-transfer/cycles.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/cycles.mdx"}, data: docs_472 }, { info: {"path":"stacks/api/stacks-blockchain/proof-of-transfer/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/index.mdx"}, data: docs_473 }, { info: {"path":"stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signer-in-cycle.mdx"}, data: docs_474 }, { info: {"path":"stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/signers-in-cycle.mdx"}, data: docs_475 }, { info: {"path":"stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/stackers-for-signer-in-cycle.mdx"}, data: docs_476 }, { info: {"path":"stacks/api/stacks-blockchain/search/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/search/index.mdx"}, data: docs_477 }, { info: {"path":"stacks/api/stacks-blockchain/search/search-by-id.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/search/search-by-id.mdx"}, data: docs_478 }, { info: {"path":"stacks/api/stacks-blockchain/smart-contracts/by-trait.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/smart-contracts/by-trait.mdx"}, data: docs_479 }, { info: {"path":"stacks/api/stacks-blockchain/smart-contracts/events.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/smart-contracts/events.mdx"}, data: docs_480 }, { info: {"path":"stacks/api/stacks-blockchain/smart-contracts/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/smart-contracts/index.mdx"}, data: docs_481 }, { info: {"path":"stacks/api/stacks-blockchain/smart-contracts/info.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/smart-contracts/info.mdx"}, data: docs_482 }, { info: {"path":"stacks/api/stacks-blockchain/smart-contracts/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/smart-contracts/status.mdx"}, data: docs_483 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-pool/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-pool/index.mdx"}, data: docs_484 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-pool/members.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-pool/members.mdx"}, data: docs_485 }, { info: {"path":"stacks/api/stacks-blockchain/tokens/holders.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/tokens/holders.mdx"}, data: docs_486 }, { info: {"path":"stacks/api/stacks-blockchain/tokens/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/tokens/index.mdx"}, data: docs_487 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-rewards/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-rewards/index.mdx"}, data: docs_488 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipient.mdx"}, data: docs_489 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-burnchain-reward-recipients.mdx"}, data: docs_490 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holder-entries.mdx"}, data: docs_491 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-rewards/recent-reward-slot-holders.mdx"}, data: docs_492 }, { info: {"path":"stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-rewards/total-burnchain-rewards-for-recipient.mdx"}, data: docs_493 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/address-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/address-transactions.mdx"}, data: docs_494 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/details-for-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/details-for-transactions.mdx"}, data: docs_495 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/dropped-mempool-transactions.mdx"}, data: docs_496 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/events-for-an-address-transaction.mdx"}, data: docs_497 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/get-raw-transaction.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/get-raw-transaction.mdx"}, data: docs_498 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/get-transaction.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/get-transaction.mdx"}, data: docs_499 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/index.mdx"}, data: docs_500 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/mempool-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/mempool-transactions.mdx"}, data: docs_501 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/recent-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/recent-transactions.mdx"}, data: docs_502 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/statistics-for-mempool-transactions.mdx"}, data: docs_503 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/transaction-events.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/transaction-events.mdx"}, data: docs_504 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/transactions-by-block.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/transactions-by-block.mdx"}, data: docs_505 }, { info: {"path":"stacks/api/stacks-blockchain/transactions/transactions-for-address.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/transactions-for-address.mdx"}, data: docs_506 }, { info: {"path":"stacks/api/token-metadata/info/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/info/index.mdx"}, data: docs_507 }, { info: {"path":"stacks/api/token-metadata/info/status.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/info/status.mdx"}, data: docs_508 }, { info: {"path":"stacks/api/token-metadata/tokens/fungible-token-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/tokens/fungible-token-metadata.mdx"}, data: docs_509 }, { info: {"path":"stacks/api/token-metadata/tokens/fungible-tokens.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/tokens/fungible-tokens.mdx"}, data: docs_510 }, { info: {"path":"stacks/api/token-metadata/tokens/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/tokens/index.mdx"}, data: docs_511 }, { info: {"path":"stacks/api/token-metadata/tokens/non-fungible-token-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/tokens/non-fungible-token-metadata.mdx"}, data: docs_512 }, { info: {"path":"stacks/api/token-metadata/tokens/semi-fungible-token-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/tokens/semi-fungible-token-metadata.mdx"}, data: docs_513 }, { info: {"path":"stacks/chainhook/references/scopes/bitcoin.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/references/scopes/bitcoin.mdx"}, data: docs_514 }, { info: {"path":"stacks/chainhook/references/scopes/stacks.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/references/scopes/stacks.mdx"}, data: docs_515 }, { info: {"path":"stacks/token-metadata-api/client/tokens/get-ft-metadata.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/client/tokens/get-ft-metadata.mdx"}, data: docs_516 }, { info: {"path":"stacks/token-metadata-api/client/tokens/index.mdx","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/client/tokens/index.mdx"}, data: docs_517 }], [{ info: {"path":"bitcoin/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/meta.json"}, data: {"title":"bitcoin","pages":["index","quickstarts","api","---Get started---","indexer/index"],"root":true} }, { info: {"path":"stacks/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/meta.json"}, data: {"title":"stacks","pages":["index","quickstarts","api","reference","clarity","---Get started---","get-started","setup","---Build with Hiro---","smart-contract-development","web-app-development","blockchain-development","token-development","---Testing---","unit-testing","integration-testing","testing-environments","testing-best-practices","migration-guide","---Explore by tool---","clarinet","chainhook","platform","stacks.js","connect"],"root":true} }, { info: {"path":"guides/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/guides/meta.json"}, data: {"title":"guides","pages":["index","-------","build-an-nft-marketplace","build-a-decentralized-kickstarter","using-clarity-values","no-loss-lottery","---Other---","installing-docker","sync-a-bitcoin-node","sync-a-stacks-node","------","api-keys","rate-limiting","contributors-guide"],"root":true} }, { info: {"path":"bitcoin/api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/meta.json"}, data: {"title":"APIs","pages":["---Ordinals API---","...ordinals","---Runes API---","...runes"],"root":true} }, { info: {"path":"bitcoin/indexer/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/indexer/meta.json"}, data: {"title":"Bitcoin Indexer","pages":["---Bitcoin Indexer---","index","installation","quickstart"],"root":true} }, { info: {"path":"bitcoin/quickstarts/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/quickstarts/meta.json"}, data: {"title":"Quickstarts","pages":["---Get started---","../get-started"],"root":true} }, { info: {"path":"stacks/api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/meta.json"}, data: {"title":"APIs","pages":["---Stacks Blockchain API---","...stacks-blockchain","---Token Metadata API---","...token-metadata"],"root":true} }, { info: {"path":"stacks/archive/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/archive/meta.json"}, data: {"title":"Hiro Archive","pages":["---Hiro Archive---","index","---Guides---","guides/verify-archive-data","guides/stacks-blockchain","guides/stacks-api","guides/token-metadata-api"],"root":true} }, { info: {"path":"stacks/clarinet/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet/meta.json"}, data: {"title":"Clarinet","pages":["index","quickstart","concepts","...examples"]} }, { info: {"path":"stacks/chainhook/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/chainhook/meta.json"}, data: {"title":"Chainhook","pages":["index","installation","quickstart","predicate-design","...examples"]} }, { info: {"path":"stacks/clarinet-js-sdk/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarinet-js-sdk/meta.json"}, data: {"title":"Clarinet JS SDK","pages":["---Clarinet JS SDK---","index","installation","quickstart","---Guides---","guides/unit-testing","guides/integration-testing","guides/migrate-to-the-clarinet-sdk","---Reference---","references/simnet","references/properties","references/methods","references/custom-matchers"],"root":true} }, { info: {"path":"stacks/connect/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/connect/meta.json"}, data: {"title":"Stacks Connect","pages":["index","quickstart","...examples","support"]} }, { info: {"path":"stacks/clarity/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/clarity/meta.json"}, data: {"title":"Clarity","pages":["index","---Guides---","basic-arithmetic","access-control","handling-optionals-and-errors","---Functions---","...functions"],"root":true} }, { info: {"path":"stacks/explorer/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/explorer/meta.json"}, data: {"title":"Explorer","pages":["---Stacks Explorer---","index"],"root":true} }, { info: {"path":"stacks/hacks/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/hacks/meta.json"}, data: {"title":"Hiro Hacks","pages":["---Hiro Hacks---","index","---Hacks---","recipes","---Archive---","archive/ai","archive/build-a-friend-tech-clone","archive/build-a-decentralized-grants-program","archive/build-a-custom-api"],"root":true} }, { info: {"path":"stacks/platform/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform/meta.json"}, data: {"title":"Hiro Platform","pages":["index","quickstart","...examples"]} }, { info: {"path":"stacks/nakamoto/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/nakamoto/meta.json"}, data: {"title":"Nakamoto support","pages":["---Nakamoto---","index","---Nakamoto Updates By Product---","guides/clarinet","guides/explorer","guides/stacks-js","guides/stacks-api"],"root":true} }, { info: {"path":"stacks/platform-api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/meta.json"}, data: {"title":"Platform API","pages":["---Platform API---","index","---API Reference---","chainhooks","devnet"],"root":true} }, { info: {"path":"stacks/quickstarts/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/quickstarts/meta.json"}, data: {"title":"Quickstarts","pages":["---Starter templates---","app-templates","contract-templates","---Examples---","wallet-integration","nft-minting","token-transfers","event-streaming"],"root":true} }, { info: {"path":"stacks/reference/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/reference/meta.json"}, data: {"title":"SDKs & Libraries","pages":["---Stacks Blockchain API---","stacks-blockchain-api/client","---Stacks.js---","stacks/js/common","stacks.js/connect","stacks.js/network","stacks.js/transactions","stacks.js/sbtc","---Clarinet JS SDK---","clarinet-js-sdk/clarinet-sdk","---CLI tools---","cli/clarinet","cli/stacks-js"],"root":true} }, { info: {"path":"stacks/rpc-api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/meta.json"}, data: {"title":"Stacks Node RPC","pages":["---Stacks Node RPC---","index","---API Reference---","accounts","transactions","blocks","pox","fees","burn-ops","smart-contracts","names","v3","info"],"root":true} }, { info: {"path":"stacks/signer-metrics-api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/meta.json"}, data: {"title":"Signer Metrics API","pages":["---Signer Metrics API---","index","---API Reference---","info","signers","blocks","block-proposals","prometheus"],"root":true} }, { info: {"path":"stacks/stacks.js/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/meta.json"}, data: {"title":"Stacks.js","pages":["index","installation","quickstart","roadmap","...concepts","...examples"]} }, { info: {"path":"stacks/token-metadata-api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/meta.json"}, data: {"title":"Token Metadata API","pages":["---Token Metadata API---","index","usage","architecture","---API Reference---","info","tokens"],"root":true} }, { info: {"path":"bitcoin/ordinals/api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/meta.json"}, data: {"title":"Ordinals API","pages":["---Ordinals API---","index","---API Reference---","inscriptions","satoshis","statistics","brc20","info"],"root":true} }, { info: {"path":"bitcoin/ordinals/explorer/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/explorer/meta.json"}, data: {"title":"Explorer","pages":["---Ordinals Explorer---","index"],"root":true} }, { info: {"path":"bitcoin/runes/api/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/meta.json"}, data: {"title":"Runes API","pages":["---Runes API---","index","---API Reference---","etchings","activities","balances","info"],"root":true} }, { info: {"path":"bitcoin/runes/explorer/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/explorer/meta.json"}, data: {"title":"Explorer","pages":["---Ordinals Explorer---","index"],"root":true} }, { info: {"path":"bitcoin/runes/runehook/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/runehook/meta.json"}, data: {"title":"Runehook","pages":["---Runehook---","index","installation","quickstart","---Guides---"],"root":true} }, { info: {"path":"stacks/platform-api/chainhooks/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/chainhooks/meta.json"}, data: {"title":"Chainhooks","pages":["list","get","status","create","update","delete"],"defaultOpen":false} }, { info: {"path":"stacks/platform-api/devnet/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/platform-api/devnet/meta.json"}, data: {"title":"Devnet","pages":["start","stop","stacks-blockchain-api","bitcoin-node"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/accounts/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/accounts/meta.json"}, data: {"title":"Accounts","pages":["info"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/blocks/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/blocks/meta.json"}, data: {"title":"Blocks","pages":["block-proposal"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/burn-ops/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/burn-ops/meta.json"}, data: {"title":"Burn operations","pages":["get-burn-operations"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/fees/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/fees/meta.json"}, data: {"title":"Fees","pages":["estimate","transfer-estimate"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/info/meta.json"}, data: {"title":"Info","pages":["core-api"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/names/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/names/meta.json"}, data: {"title":"Names","pages":["namespace-price","name-price"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/pox/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/pox/meta.json"}, data: {"title":"Proof of Transfer","pages":["pox-details","stacker-set"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/smart-contracts/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/smart-contracts/meta.json"}, data: {"title":"Smart Contracts","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/transactions/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/transactions/meta.json"}, data: {"title":"Transactions","pages":["broadcast-transaction"],"defaultOpen":false} }, { info: {"path":"stacks/rpc-api/v3/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/rpc-api/v3/meta.json"}, data: {"title":"v3","pages":["nakamoto-block","tenure-metadata","tenure-blocks"],"defaultOpen":false} }, { info: {"path":"stacks/signer-metrics-api/block-proposals/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/block-proposals/meta.json"}, data: {"title":"Block proposals","pages":["..."]} }, { info: {"path":"stacks/signer-metrics-api/blocks/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/blocks/meta.json"}, data: {"title":"Blocks","pages":["..."]} }, { info: {"path":"stacks/signer-metrics-api/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/info/meta.json"}, data: {"title":"Info","pages":["..."]} }, { info: {"path":"stacks/signer-metrics-api/prometheus/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/prometheus/meta.json"}, data: {"title":"Prometheus Metrics","pages":["..."]} }, { info: {"path":"stacks/signer-metrics-api/signers/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/signer-metrics-api/signers/meta.json"}, data: {"title":"Signers","pages":["..."]} }, { info: {"path":"stacks/stacks.js/packages/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/packages/meta.json"}, data: {"title":"Packages","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/stacks.js/v6/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/stacks.js/v6/meta.json"}, data: {"title":"Packages","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/token-metadata-api/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/info/meta.json"}, data: {"title":"Info","pages":["status"],"defaultOpen":false} }, { info: {"path":"stacks/token-metadata-api/tokens/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/tokens/meta.json"}, data: {"title":"Tokens","pages":["fungible-tokens","fungible-token-metadata","non-fungible-token-metadata","semi-fungible-token-metadata"],"defaultOpen":false} }, { info: {"path":"bitcoin/api/ordinals/brc20/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/brc20/meta.json"}, data: {"title":"BRC-20","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/ordinals/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/info/meta.json"}, data: {"title":"Status","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/ordinals/inscriptions/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/inscriptions/meta.json"}, data: {"title":"Inscriptions","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/ordinals/statistics/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/statistics/meta.json"}, data: {"title":"Statistics","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/ordinals/satoshis/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/ordinals/satoshis/meta.json"}, data: {"title":"Satoshis","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/runes/activities/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/activities/meta.json"}, data: {"title":"Activities","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/runes/balances/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/balances/meta.json"}, data: {"title":"Balances","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/runes/etchings/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/etchings/meta.json"}, data: {"title":"Etchings","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/api/runes/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/api/runes/info/meta.json"}, data: {"title":"Status","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/ordinals/api/brc20/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/brc20/meta.json"}, data: {"title":"BRC-20","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/ordinals/api/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/info/meta.json"}, data: {"title":"Status","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/ordinals/api/satoshis/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/satoshis/meta.json"}, data: {"title":"Satoshis","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/ordinals/api/inscriptions/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/inscriptions/meta.json"}, data: {"title":"Inscriptions","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/ordinals/api/statistics/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/ordinals/api/statistics/meta.json"}, data: {"title":"Statistics","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/runes/api/balances/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/balances/meta.json"}, data: {"title":"Balances","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/runes/api/activities/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/activities/meta.json"}, data: {"title":"Activities","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/runes/api/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/info/meta.json"}, data: {"title":"Status","pages":["..."],"defaultOpen":false} }, { info: {"path":"bitcoin/runes/api/etchings/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/bitcoin/runes/api/etchings/meta.json"}, data: {"title":"Etchings","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/accounts/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/accounts/meta.json"}, data: {"title":"Accounts","pages":["info","assets","balances","stx-balances","inbound-stx-transfers","transactions","transactions-with-transfers","transaction-with-transfers","nft-events","latest-nonce"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/burn-blocks/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/burn-blocks/meta.json"}, data: {"title":"Burn Blocks","pages":["get-burn-blocks","get-burn-block"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/blocks/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/blocks/meta.json"}, data: {"title":"Blocks","pages":["get-block","get-blocks","get-blocks-by-burn-block","average-times","recent-blocks","block-by-hash","block-by-height","block-by-burn-block-hash","block-by-burn-block-height"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/faucets/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/faucets/meta.json"}, data: {"title":"Faucets","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/fees/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/fees/meta.json"}, data: {"title":"Fees","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/info/meta.json"}, data: {"title":"Info","pages":["status","core-api","network-block-time","network-given-block-time","total-and-unlocked-stx-supply","legacy-total-and-unlocked-stx-supply","total-stx-supply-in-plain-text","circulating-stx-supply-in-plain-text","pox-details"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/mempool/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/mempool/meta.json"}, data: {"title":"Mempool","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/names/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/names/meta.json"}, data: {"title":"Names","pages":["namespaces","names","namespace-names","namespace-price","name-price","name-details","name-subdomains","name-zonefile","historical-zonefile","owned-by-address"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/non-fungible-tokens/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/non-fungible-tokens/meta.json"}, data: {"title":"Non-fungible tokens","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/proof-of-transfer/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/proof-of-transfer/meta.json"}, data: {"title":"Proof of Transfer","pages":["cycles","cycle","signers-in-cycle","signer-in-cycle","stackers-for-signer-in-cycle"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/search/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/search/meta.json"}, data: {"title":"Search","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/stacking-pool/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-pool/meta.json"}, data: {"title":"Stacking Pool","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/smart-contracts/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/smart-contracts/meta.json"}, data: {"title":"Smart Contracts","pages":["status","info","source","by-trait","interface","map-entry","read-only","events"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/stacking-rewards/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/stacking-rewards/meta.json"}, data: {"title":"Stacking Rewards","pages":["recent-reward-slot-holders","recent-reward-slot-holder-entries","recent-burnchain-reward-recipients","recent-burnchain-reward-recipient","total-burnchain-rewards-for-recipient"],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/tokens/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/tokens/meta.json"}, data: {"title":"Tokens","pages":["..."],"defaultOpen":false} }, { info: {"path":"stacks/api/stacks-blockchain/transactions/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/stacks-blockchain/transactions/meta.json"}, data: {"title":"Transactions","pages":["recent-transactions","get-transaction","get-raw-transaction","address-transactions","transactions-by-block","events-for-an-address-transaction","transaction-events","transaction-fee-priorities","mempool-transactions","dropped-mempool-transactions","statistics-for-mempool-transactions","details-for-transactions","broadcast-transaction"],"defaultOpen":false} }, { info: {"path":"stacks/api/token-metadata/info/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/info/meta.json"}, data: {"title":"Info","pages":["status"],"defaultOpen":false} }, { info: {"path":"stacks/api/token-metadata/tokens/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/api/token-metadata/tokens/meta.json"}, data: {"title":"Tokens","pages":["fungible-tokens","fungible-token-metadata","non-fungible-token-metadata","semi-fungible-token-metadata"],"defaultOpen":false} }, { info: {"path":"stacks/token-metadata-api/client/tokens/meta.json","absolutePath":"/Users/ryanwaits/Code/hiro/docs/content/docs/stacks/token-metadata-api/client/tokens/meta.json"}, data: {"title":"Tokens","pages":["..."],"root":false,"defaultOpen":false} }]) \ No newline at end of file diff --git a/.source/source.config.mjs b/.source/source.config.mjs deleted file mode 100644 index b97cb980c..000000000 --- a/.source/source.config.mjs +++ /dev/null @@ -1,35 +0,0 @@ -// source.config.ts -import { - defineConfig, - defineDocs, - frontmatterSchema -} from "fumadocs-mdx/config"; -import { remarkCodeHike, recmaCodeHike } from "codehike/mdx"; -import { z } from "zod"; -var docs = defineDocs({ - dir: "content/docs", - docs: { - schema: frontmatterSchema.extend({ - llm: z.boolean().optional() - }) - }, - meta: { - // options for `meta` collection - } -}); -var chConfig = { - components: { - code: "DocsKitCode", - inlineCode: "DocsKitInlineCode" - } -}; -var source_config_default = defineConfig({ - mdxOptions: { - remarkPlugins: (v) => [[remarkCodeHike, chConfig], ...v], - recmaPlugins: [[recmaCodeHike, chConfig]] - } -}); -export { - source_config_default as default, - docs -}; From 53cea218684589787e4b62e10d27f27edfd87b99 Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 12:27:21 -0500 Subject: [PATCH 18/21] add eslint --- bun.lock | 388 +++++++++++++++++++++++++++++++++++++++++++++++++-- package.json | 2 + 2 files changed, 376 insertions(+), 14 deletions(-) diff --git a/bun.lock b/bun.lock index 13c2e5b87..9aee99af2 100644 --- a/bun.lock +++ b/bun.lock @@ -56,6 +56,8 @@ "@types/node": "22.13.10", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", + "eslint": "^9.25.1", + "eslint-config-next": "^15.3.1", "postcss": "^8.5.3", "tailwindcss": "^4.0.12", "typescript": "^5.8.2", @@ -79,8 +81,12 @@ "@code-hike/lighter": ["@code-hike/lighter@1.0.1", "", { "dependencies": { "ansi-sequence-parser": "1.1.1" } }, "sha512-mccvcsk5UTScRrE02oBz1/qzckyhD8YE3VQlQv++2bSVVZgNuCUX8MpokSCi5OmfRAAxbj6kmNiqq1Um8eXPrw=="], + "@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], + "@emnapi/runtime": ["@emnapi/runtime@1.4.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag=="], "@esbuild/android-arm": ["@esbuild/android-arm@0.25.2", "", { "os": "android", "cpu": "arm" }, "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA=="], @@ -131,6 +137,24 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.2", "", { "os": "win32", "cpu": "x64" }, "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA=="], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.6.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/config-array": ["@eslint/config-array@0.20.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.2.1", "", {}, "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw=="], + + "@eslint/core": ["@eslint/core@0.13.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + + "@eslint/js": ["@eslint/js@9.25.1", "", {}, "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.8", "", { "dependencies": { "@eslint/core": "^0.13.0", "levn": "^0.4.1" } }, "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA=="], + "@floating-ui/core": ["@floating-ui/core@1.6.9", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw=="], "@floating-ui/dom": ["@floating-ui/dom@1.6.13", "", { "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.9" } }, "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w=="], @@ -149,6 +173,14 @@ "@hirosystems/clarinet-sdk-wasm-browser": ["@hirosystems/clarinet-sdk-wasm-browser@2.15.1", "", {}, "sha512-64C/PC2CW98DkaOCpH2gtLpzaEcOWOWxrev98AyuMqKiBM/oi6DJIHgVqzR0ilN+XmHpt2H9NrG4UVQJpWR1Hw=="], + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.2", "", {}, "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ=="], + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.1.0" }, "os": "darwin", "cpu": "arm64" }, "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A=="], "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.1", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.1.0" }, "os": "darwin", "cpu": "x64" }, "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q=="], @@ -195,8 +227,12 @@ "@msgpack/msgpack": ["@msgpack/msgpack@2.8.0", "", {}, "sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.9", "", { "dependencies": { "@emnapi/core": "^1.4.0", "@emnapi/runtime": "^1.4.0", "@tybys/wasm-util": "^0.9.0" } }, "sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg=="], + "@next/env": ["@next/env@15.3.1", "", {}, "sha512-cwK27QdzrMblHSn9DZRV+DQscHXRuJv6MydlJRpFSqJWZrTYMLzKDeyueJNN9MGd8NNiUKzDQADAf+dMLXX7YQ=="], + "@next/eslint-plugin-next": ["@next/eslint-plugin-next@15.3.1", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-oEs4dsfM6iyER3jTzMm4kDSbrQJq8wZw5fmT6fg2V3SMo+kgG+cShzLfEV20senZzv8VF+puNLheiGPlBGsv2A=="], + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.3.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-hjDw4f4/nla+6wysBL07z52Gs55Gttp5Bsk5/8AncQLJoisvTBP0pRIBK/B16/KqQyH+uN4Ww8KkcAqJODYH3w=="], "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.3.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-q+aw+cJ2ooVYdCEqZVk+T4Ni10jF6Fo5DfpEV51OupMaV5XL6pf3GCzrk6kSSZBsMKZtVC1Zm/xaNBFpA6bJ2g=="], @@ -223,6 +259,8 @@ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="], + "@orama/orama": ["@orama/orama@3.1.6", "", {}, "sha512-qtSrqCqRU93SjEBedz987tvWao1YQSELjBhGkHYGVP7Dg0lBWP6d+uZEIt5gxTAYio/YWWlhivmRABvRfPLmnQ=="], "@orama/plugin-data-persistence": ["@orama/plugin-data-persistence@3.1.6", "", { "dependencies": { "@msgpack/msgpack": "^2.7.2", "@orama/orama": "3.1.6", "dpack": "^0.6.22" } }, "sha512-6he5bwPZUzC7D7WSaLg3kdIRjk/DsedpnJQDPuiDBL+TYBD9heBVZx19C9aypys7vojFj+3t0brHhccoM0vReA=="], @@ -315,6 +353,10 @@ "@radix-ui/rect": ["@radix-ui/rect@1.1.0", "", {}, "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg=="], + "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], + + "@rushstack/eslint-patch": ["@rushstack/eslint-patch@1.11.0", "", {}, "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ=="], + "@scalar/openapi-parser": ["@scalar/openapi-parser@0.10.14", "", { "dependencies": { "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "jsonpointer": "^5.0.1", "leven": "^4.0.0", "yaml": "^2.4.5" } }, "sha512-VXr979NMx6wZ+kpFKor2eyCJZOjyMwcBRc6c4Gc92ZMOC7ZNYqjwbw+Ubh2ELJyP5cWAjOFSrNwtylema0pw5w=="], "@scure/base": ["@scure/base@1.2.4", "", {}, "sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ=="], @@ -395,6 +437,8 @@ "@ts-morph/common": ["@ts-morph/common@0.26.1", "", { "dependencies": { "fast-glob": "^3.3.2", "minimatch": "^9.0.4", "path-browserify": "^1.0.1" } }, "sha512-Sn28TGl/4cFpcM+jwsH1wLncYq3FtN/BIpem+HOygfBWPT5pAeS5dB4VFVzV8FbnOKHpDLZmvAl4AjPEev5idA=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + "@types/bn.js": ["@types/bn.js@5.1.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w=="], "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], @@ -407,6 +451,8 @@ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], @@ -425,13 +471,63 @@ "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.31.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.31.1", "@typescript-eslint/type-utils": "8.31.1", "@typescript-eslint/utils": "8.31.1", "@typescript-eslint/visitor-keys": "8.31.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.31.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.31.1", "@typescript-eslint/types": "8.31.1", "@typescript-eslint/typescript-estree": "8.31.1", "@typescript-eslint/visitor-keys": "8.31.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.31.1", "", { "dependencies": { "@typescript-eslint/types": "8.31.1", "@typescript-eslint/visitor-keys": "8.31.1" } }, "sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.31.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.31.1", "@typescript-eslint/utils": "8.31.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.31.1", "", {}, "sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.31.1", "", { "dependencies": { "@typescript-eslint/types": "8.31.1", "@typescript-eslint/visitor-keys": "8.31.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.31.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.31.1", "@typescript-eslint/types": "8.31.1", "@typescript-eslint/typescript-estree": "8.31.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.31.1", "", { "dependencies": { "@typescript-eslint/types": "8.31.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw=="], + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.7.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg=="], + + "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.7.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ=="], + + "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.7.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg=="], + + "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2", "", { "os": "linux", "cpu": "arm" }, "sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw=="], + + "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.7.2", "", { "os": "linux", "cpu": "arm" }, "sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA=="], + + "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.7.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA=="], + + "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.7.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA=="], + + "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.7.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg=="], + + "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.7.2", "", { "os": "linux", "cpu": "none" }, "sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q=="], + + "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.7.2", "", { "os": "linux", "cpu": "none" }, "sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ=="], + + "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.7.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA=="], + + "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.7.2", "", { "os": "linux", "cpu": "x64" }, "sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg=="], + + "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.7.2", "", { "os": "linux", "cpu": "x64" }, "sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw=="], + + "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.7.2", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.9" }, "cpu": "none" }, "sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g=="], + + "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.7.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg=="], + + "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.7.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg=="], + + "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.7.2", "", { "os": "win32", "cpu": "x64" }, "sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA=="], + "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="], @@ -439,18 +535,34 @@ "ansi-sequence-parser": ["ansi-sequence-parser@1.1.1", "", {}, "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg=="], - "ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "aria-hidden": ["aria-hidden@1.2.4", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A=="], + "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], + "array-includes": ["array-includes@3.1.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ=="], + + "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="], + + "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], + + "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], + + "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], + "array.prototype.reduce": ["array.prototype.reduce@1.0.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-array-method-boxes-properly": "^1.0.0", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "is-string": "^1.1.1" } }, "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw=="], + "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="], + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], + "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="], + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], "async": ["async@2.6.4", "", { "dependencies": { "lodash": "^4.17.14" } }, "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA=="], @@ -459,6 +571,10 @@ "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + "axe-core": ["axe-core@4.10.3", "", {}, "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg=="], + + "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], @@ -469,7 +585,7 @@ "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], - "brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], @@ -485,11 +601,13 @@ "call-me-maybe": ["call-me-maybe@1.0.2", "", {}, "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001712", "", {}, "sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig=="], "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], - "chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], @@ -531,6 +649,8 @@ "compute-scroll-into-view": ["compute-scroll-into-view@3.1.1", "", {}, "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw=="], + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], @@ -549,6 +669,8 @@ "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + "damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="], + "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], @@ -561,6 +683,8 @@ "decode-named-character-reference": ["decode-named-character-reference@1.1.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w=="], + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], @@ -575,6 +699,8 @@ "diff": ["diff@5.2.0", "", {}, "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A=="], + "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], + "dom-serializer": ["dom-serializer@0.2.2", "", { "dependencies": { "domelementtype": "^2.0.1", "entities": "^2.0.0" } }, "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g=="], "domelementtype": ["domelementtype@1.3.1", "", {}, "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="], @@ -591,6 +717,8 @@ "embla-carousel-reactive-utils": ["embla-carousel-reactive-utils@8.6.0", "", { "peerDependencies": { "embla-carousel": "8.6.0" } }, "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A=="], + "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="], "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], @@ -605,10 +733,14 @@ "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + "es-iterator-helpers": ["es-iterator-helpers@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.4", "safe-array-concat": "^1.1.3" } }, "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w=="], + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], + "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], @@ -617,10 +749,40 @@ "esbuild": ["esbuild@0.25.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.2", "@esbuild/android-arm": "0.25.2", "@esbuild/android-arm64": "0.25.2", "@esbuild/android-x64": "0.25.2", "@esbuild/darwin-arm64": "0.25.2", "@esbuild/darwin-x64": "0.25.2", "@esbuild/freebsd-arm64": "0.25.2", "@esbuild/freebsd-x64": "0.25.2", "@esbuild/linux-arm": "0.25.2", "@esbuild/linux-arm64": "0.25.2", "@esbuild/linux-ia32": "0.25.2", "@esbuild/linux-loong64": "0.25.2", "@esbuild/linux-mips64el": "0.25.2", "@esbuild/linux-ppc64": "0.25.2", "@esbuild/linux-riscv64": "0.25.2", "@esbuild/linux-s390x": "0.25.2", "@esbuild/linux-x64": "0.25.2", "@esbuild/netbsd-arm64": "0.25.2", "@esbuild/netbsd-x64": "0.25.2", "@esbuild/openbsd-arm64": "0.25.2", "@esbuild/openbsd-x64": "0.25.2", "@esbuild/sunos-x64": "0.25.2", "@esbuild/win32-arm64": "0.25.2", "@esbuild/win32-ia32": "0.25.2", "@esbuild/win32-x64": "0.25.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ=="], - "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.25.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.13.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.25.1", "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ=="], + + "eslint-config-next": ["eslint-config-next@15.3.1", "", { "dependencies": { "@next/eslint-plugin-next": "15.3.1", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^5.0.0" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-GnmyVd9TE/Ihe3RrvcafFhXErErtr2jS0JDeCSp3vWvy86AXwHsRBt0E3MqP/m8ACS1ivcsi5uaqjbhsG18qKw=="], + + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], + + "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.10.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^2.0.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.13", "unrs-resolver": "^1.6.2" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ=="], + + "eslint-module-utils": ["eslint-module-utils@2.12.0", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg=="], + + "eslint-plugin-import": ["eslint-plugin-import@2.31.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.0", "hasown": "^2.0.2", "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.0", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A=="], + + "eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="], + + "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="], + + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], + + "eslint-scope": ["eslint-scope@8.3.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], + + "espree": ["espree@10.3.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" } }, "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], @@ -637,6 +799,8 @@ "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + "execa": ["execa@9.5.2", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.3", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.0", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.0.0" } }, "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q=="], "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], @@ -647,16 +811,30 @@ "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + "fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="], "fast-xml-parser": ["fast-xml-parser@4.5.3", "", { "dependencies": { "strnum": "^1.1.1" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig=="], "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + "fdir": ["fdir@6.4.4", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg=="], + "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="], + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], "foreach": ["foreach@2.0.6", "", {}, "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg=="], @@ -687,9 +865,13 @@ "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], + "get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="], + "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], - "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], @@ -697,11 +879,13 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + "gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="], "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - "has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], @@ -727,8 +911,14 @@ "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="], + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "image-size": ["image-size@2.0.2", "", { "bin": { "image-size": "bin/image-size.js" } }, "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + "inline-style-parser": ["inline-style-parser@0.2.4", "", {}, "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q=="], "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], @@ -747,8 +937,12 @@ "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], + "is-bun-module": ["is-bun-module@2.0.0", "", { "dependencies": { "semver": "^7.7.1" } }, "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ=="], + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], @@ -801,22 +995,42 @@ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], + "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + "json-pointer": ["json-pointer@0.6.2", "", { "dependencies": { "foreach": "^2.0.4" } }, "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw=="], - "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "jsonpointer": ["jsonpointer@5.0.1", "", {}, "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ=="], "jsontokens": ["jsontokens@4.0.1", "", { "dependencies": { "@noble/hashes": "^1.1.2", "@noble/secp256k1": "^1.6.3", "base64-js": "^1.5.1" } }, "sha512-+MO415LEN6M+3FGsRz4wU20g7N2JA+2j9d9+pGaNJHviG4L8N0qzavGyENw6fJqsq9CcrHOIL6iWX5yeTZ86+Q=="], + "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], + "language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="], + + "language-tags": ["language-tags@1.0.9", "", { "dependencies": { "language-subtag-registry": "^0.3.20" } }, "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA=="], + "leven": ["leven@4.0.0", "", {}, "sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw=="], + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + "lightningcss": ["lightningcss@1.29.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.29.2", "lightningcss-darwin-x64": "1.29.2", "lightningcss-freebsd-x64": "1.29.2", "lightningcss-linux-arm-gnueabihf": "1.29.2", "lightningcss-linux-arm64-gnu": "1.29.2", "lightningcss-linux-arm64-musl": "1.29.2", "lightningcss-linux-x64-gnu": "1.29.2", "lightningcss-linux-x64-musl": "1.29.2", "lightningcss-win32-arm64-msvc": "1.29.2", "lightningcss-win32-x64-msvc": "1.29.2" } }, "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA=="], "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.29.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA=="], @@ -839,6 +1053,8 @@ "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.29.2", "", { "os": "win32", "cpu": "x64" }, "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA=="], + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], "lodash.clonedeep": ["lodash.clonedeep@4.5.0", "", {}, "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="], @@ -847,6 +1063,8 @@ "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + "lucide-react": ["lucide-react@0.482.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-XM8PzHzSrg8ATmmO+fzf+JyYlVVdQnJjuyLDj2p4V2zEtcKeBNAqAoJIGFv1x2HSBa7kT8gpYUxwdQ0g7nypfw=="], "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], @@ -963,7 +1181,7 @@ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], - "minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], @@ -973,6 +1191,10 @@ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "napi-postinstall": ["napi-postinstall@0.2.3", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-Mi7JISo/4Ij2tDZ2xBE2WH+/KvVlkhA6juEjpEeRAVPNCpN3nxJo/5FhDNKgBcdmcmhaH6JjgST4xY/23ZYK0w=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], "next": ["next@15.3.1", "", { "dependencies": { "@next/env": "15.3.1", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.1", "@next/swc-darwin-x64": "15.3.1", "@next/swc-linux-arm64-gnu": "15.3.1", "@next/swc-linux-arm64-musl": "15.3.1", "@next/swc-linux-x64-gnu": "15.3.1", "@next/swc-linux-x64-musl": "15.3.1", "@next/swc-win32-arm64-msvc": "15.3.1", "@next/swc-win32-x64-msvc": "15.3.1", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-8+dDV0xNLOgHlyBxP1GwHGVaNXsmp+2NhZEYrXr24GWLHtt27YrBPbPuHvzlhi7kZNYjeJNR93IF5zfFu5UL0g=="], @@ -987,14 +1209,22 @@ "nth-check": ["nth-check@1.0.2", "", { "dependencies": { "boolbase": "~1.0.0" } }, "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg=="], + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="], + + "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], + "object.getownpropertydescriptors": ["object.getownpropertydescriptors@2.1.8", "", { "dependencies": { "array.prototype.reduce": "^1.0.6", "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0", "gopd": "^1.0.1", "safe-array-concat": "^1.1.2" } }, "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A=="], + "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], + "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], "oniguruma-parser": ["oniguruma-parser@0.5.4", "", {}, "sha512-yNxcQ8sKvURiTwP0mV6bLQCYE7NKfKRRWunhbZnXgxSmB1OXa1lHrN3o4DZd+0Si0kU5blidK7BcROO8qv5TZA=="], @@ -1005,21 +1235,33 @@ "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], @@ -1027,12 +1269,18 @@ "postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], "pretty-ms": ["pretty-ms@9.2.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg=="], + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + "property-information": ["property-information@7.0.0", "", {}, "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg=="], + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + "q": ["q@1.5.1", "", {}, "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw=="], "quansync": ["quansync@0.2.10", "", {}, "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A=="], @@ -1045,6 +1293,8 @@ "react-hook-form": ["react-hook-form@7.55.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-XRnjsH3GVMQz1moZTW53MxfoWN7aDpUg/GpVNc4A3eXRVNdGXfbzJ4vM4aLQ8g6XCUh1nIbx70aaNCl7kxnjog=="], + "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + "react-medium-image-zoom": ["react-medium-image-zoom@5.2.14", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-nfTVYcAUnBzXQpPDcZL+cG/e6UceYUIG+zDcnemL7jtAqbJjVVkA85RgneGtJeni12dTyiRPZVM6Szkmwd/o8w=="], "react-remove-scroll": ["react-remove-scroll@2.6.3", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ=="], @@ -1089,6 +1339,12 @@ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], @@ -1109,7 +1365,7 @@ "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="], - "semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], @@ -1151,8 +1407,16 @@ "stable": ["stable@0.1.8", "", {}, "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="], + "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="], + "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], + "string.prototype.includes": ["string.prototype.includes@2.0.1", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3" } }, "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg=="], + + "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="], + + "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="], + "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], @@ -1161,10 +1425,14 @@ "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="], "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strnum": ["strnum@1.1.2", "", {}, "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA=="], "style-to-js": ["style-to-js@1.1.16", "", { "dependencies": { "style-to-object": "1.0.8" } }, "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw=="], @@ -1173,7 +1441,9 @@ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], - "supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "svgo": ["svgo@1.3.2", "", { "dependencies": { "chalk": "^2.4.1", "coa": "^2.0.2", "css-select": "^2.0.0", "css-select-base-adapter": "^0.1.1", "css-tree": "1.0.0-alpha.37", "csso": "^4.0.2", "js-yaml": "^3.13.1", "mkdirp": "~0.5.1", "object.values": "^1.1.0", "sax": "~1.2.4", "stable": "^0.1.8", "unquote": "~1.1.1", "util.promisify": "~1.0.0" }, "bin": { "svgo": "./bin/svgo" } }, "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw=="], @@ -1185,6 +1455,8 @@ "timeago.js": ["timeago.js@4.0.2", "", {}, "sha512-a7wPxPdVlQL7lqvitHGGRsofhdwtkoSXPGATFuSOA2i1ZNQEPLrGnj68vOp2sOJTCFAQVXPeNMX/GctBaO9L2w=="], + "tinyglobby": ["tinyglobby@0.2.13", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw=="], + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], @@ -1193,10 +1465,16 @@ "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + "ts-morph": ["ts-morph@25.0.1", "", { "dependencies": { "@ts-morph/common": "~0.26.0", "code-block-writer": "^13.0.3" } }, "sha512-QJEiTdnz1YjrB3JFhd626gX4rKHDLSjSVMvGGG4v7ONc3RBwa0Eei98G9AT9uNFDMtV54JyuXsFeC+OH0n6bXQ=="], + "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], @@ -1229,6 +1507,10 @@ "unquote": ["unquote@1.1.1", "", {}, "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg=="], + "unrs-resolver": ["unrs-resolver@1.7.2", "", { "dependencies": { "napi-postinstall": "^0.2.2" }, "optionalDependencies": { "@unrs/resolver-binding-darwin-arm64": "1.7.2", "@unrs/resolver-binding-darwin-x64": "1.7.2", "@unrs/resolver-binding-freebsd-x64": "1.7.2", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.2", "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.2", "@unrs/resolver-binding-linux-arm64-gnu": "1.7.2", "@unrs/resolver-binding-linux-arm64-musl": "1.7.2", "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.2", "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.2", "@unrs/resolver-binding-linux-riscv64-musl": "1.7.2", "@unrs/resolver-binding-linux-s390x-gnu": "1.7.2", "@unrs/resolver-binding-linux-x64-gnu": "1.7.2", "@unrs/resolver-binding-linux-x64-musl": "1.7.2", "@unrs/resolver-binding-wasm32-wasi": "1.7.2", "@unrs/resolver-binding-win32-arm64-msvc": "1.7.2", "@unrs/resolver-binding-win32-ia32-msvc": "1.7.2", "@unrs/resolver-binding-win32-x64-msvc": "1.7.2" } }, "sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], @@ -1257,10 +1539,14 @@ "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + "xml-js": ["xml-js@1.6.11", "", { "dependencies": { "sax": "^1.2.4" }, "bin": { "xml-js": "./bin/cli.js" } }, "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g=="], "yaml": ["yaml@2.7.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ=="], + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + "yoctocolors": ["yoctocolors@2.1.1", "", {}, "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ=="], "zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], @@ -1269,8 +1555,18 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + "@apidevtools/swagger-parser/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + "@fumari/json-schema-to-typescript/@apidevtools/json-schema-ref-parser": ["@apidevtools/json-schema-ref-parser@11.9.3", "", { "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.0" } }, "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ=="], + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + + "@next/eslint-plugin-next/fast-glob": ["fast-glob@3.3.1", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="], + + "@scalar/openapi-parser/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "@shikijs/rehype/@shikijs/types": ["@shikijs/types@3.3.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-KPCGnHG6k06QG/2pnYGbFtFvpVJmC3uIpXrAiPrawETifujPBv0Se2oUxm5qYgjCvGJS9InKvjytOdN+bGuX+Q=="], "@shikijs/rehype/shiki": ["shiki@3.3.0", "", { "dependencies": { "@shikijs/core": "3.3.0", "@shikijs/engine-javascript": "3.3.0", "@shikijs/engine-oniguruma": "3.3.0", "@shikijs/langs": "3.3.0", "@shikijs/themes": "3.3.0", "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-j0Z1tG5vlOFGW8JVj0Cpuatzvshes7VJy5ncDmmMaYcmnGW0Js1N81TOW98ivTFNZfKRn9uwEg/aIm638o368g=="], @@ -1293,7 +1589,17 @@ "@stacks/transactions-v6/@stacks/network": ["@stacks/network@6.17.0", "", { "dependencies": { "@stacks/common": "^6.16.0", "cross-fetch": "^3.1.5" } }, "sha512-numHbfKjwco/rbkGPOEz8+FcJ2nBnS/tdJ8R422Q70h3SiA9eqk9RjSzB8p4JP8yW1SZvW+eihADHfMpBuZyfw=="], - "ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + "@ts-morph/common/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@typescript-eslint/typescript-estree/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + + "ajv-draft-04/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "coa/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], "css-tree/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -1301,6 +1607,16 @@ "dom-serializer/domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-react/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "fumadocs-core/shiki": ["shiki@3.3.0", "", { "dependencies": { "@shikijs/core": "3.3.0", "@shikijs/engine-javascript": "3.3.0", "@shikijs/engine-oniguruma": "3.3.0", "@shikijs/langs": "3.3.0", "@shikijs/themes": "3.3.0", "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-j0Z1tG5vlOFGW8JVj0Cpuatzvshes7VJy5ncDmmMaYcmnGW0Js1N81TOW98ivTFNZfKRn9uwEg/aIm638o368g=="], "fumadocs-openapi/fumadocs-core": ["fumadocs-core@15.2.5", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.6.1", "@orama/orama": "^3.1.4", "@shikijs/rehype": "^3.2.1", "@shikijs/transformers": "^3.2.1", "github-slugger": "^2.0.0", "hast-util-to-estree": "^3.1.3", "hast-util-to-jsx-runtime": "^2.3.6", "image-size": "^2.0.2", "negotiator": "^1.0.0", "react-remove-scroll": "^2.6.3", "remark": "^15.0.0", "remark-gfm": "^4.0.1", "scroll-into-view-if-needed": "^3.1.0", "shiki": "^3.2.1", "unist-util-visit": "^5.0.0" }, "peerDependencies": { "@oramacloud/client": "1.x.x || 2.x.x", "algoliasearch": "4.24.0", "next": "14.x.x || 15.x.x", "react": "18.x.x || 19.x.x", "react-dom": "18.x.x || 19.x.x" }, "optionalPeers": ["@oramacloud/client", "algoliasearch", "next", "react", "react-dom"] }, "sha512-vSeyFdbuUCx8H27wrnv6bm7Z5ZGjI7L3mkjSZfbS4oh3qWHWs+L+qEX2lSGmL2IMRIXXrUZGSwe0xohz5uAwAg=="], @@ -1313,18 +1629,32 @@ "gray-matter/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + "is-bun-module/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + "sharp/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + + "svgo/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + "svgo/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], "svgo/sax": ["sax@1.2.4", "", {}, "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="], + "@apidevtools/swagger-parser/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "@next/eslint-plugin-next/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "@scalar/openapi-parser/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "@shikijs/rehype/shiki/@shikijs/core": ["@shikijs/core@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-CovkFL2WVaHk6PCrwv6ctlmD4SS1qtIfN8yEyDXDYWh4ONvomdM9MaFw20qHuqJOcb8/xrkqoWQRJ//X10phOQ=="], "@shikijs/rehype/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.2.0" } }, "sha512-XlhnFGv0glq7pfsoN0KyBCz9FJU678LZdQ2LqlIdAj6JKsg5xpYKay3DkazXWExp3DTJJK9rMOuGzU2911pg7Q=="], @@ -1341,7 +1671,19 @@ "@stacks/transactions/@stacks/common/@types/node": ["@types/node@18.19.86", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ=="], - "ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + "@ts-morph/common/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "ajv-draft-04/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "coa/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "coa/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "coa/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], "csso/css-tree/mdn-data": ["mdn-data@2.0.14", "", {}, "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="], @@ -1367,6 +1709,12 @@ "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + "svgo/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "svgo/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "svgo/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + "svgo/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], "@shikijs/rehype/shiki/@shikijs/engine-javascript/oniguruma-to-es": ["oniguruma-to-es@4.3.1", "", { "dependencies": { "oniguruma-parser": "^0.12.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-VtX1kepWO+7HG7IWV5v72JhiqofK7XsiHmtgnvurnNOTdIvE5mrdWYtsOrQyrXCv1L2Ckm08hywp+MFO7rC4Ug=="], @@ -1377,10 +1725,22 @@ "@stacks/transactions/@stacks/common/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + "coa/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "coa/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + "fumadocs-core/shiki/@shikijs/engine-javascript/oniguruma-to-es": ["oniguruma-to-es@4.3.1", "", { "dependencies": { "oniguruma-parser": "^0.12.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-VtX1kepWO+7HG7IWV5v72JhiqofK7XsiHmtgnvurnNOTdIvE5mrdWYtsOrQyrXCv1L2Ckm08hywp+MFO7rC4Ug=="], + "svgo/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "svgo/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + "@shikijs/rehype/shiki/@shikijs/engine-javascript/oniguruma-to-es/oniguruma-parser": ["oniguruma-parser@0.12.0", "", {}, "sha512-fD9o5ebCmEAA9dLysajdQvuKzLL7cj+w7DQjuO3Cb6IwafENfx6iL+RGkmyW82pVRsvgzixsWinHvgxTMJvdIA=="], + "coa/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + "fumadocs-core/shiki/@shikijs/engine-javascript/oniguruma-to-es/oniguruma-parser": ["oniguruma-parser@0.12.0", "", {}, "sha512-fD9o5ebCmEAA9dLysajdQvuKzLL7cj+w7DQjuO3Cb6IwafENfx6iL+RGkmyW82pVRsvgzixsWinHvgxTMJvdIA=="], + + "svgo/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], } } diff --git a/package.json b/package.json index d2042c650..a0f7d4928 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,8 @@ "@types/node": "22.13.10", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", + "eslint": "^9.25.1", + "eslint-config-next": "^15.3.1", "postcss": "^8.5.3", "tailwindcss": "^4.0.12", "typescript": "^5.8.2" From c6fd1f40e0139325fa9cca313a534fd4a29b1dda Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 13:37:47 -0500 Subject: [PATCH 19/21] update lint rules --- .eslintrc.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.eslintrc.json b/.eslintrc.json index ed21dd815..86fed8bef 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,6 +1,11 @@ { "extends": ["next/core-web-vitals", "next/typescript"], "rules": { - "@typescript-eslint/no-explicit-any": "off" + "@typescript-eslint/no-explicit-any": "off", + "react-hooks/rules-of-hooks": "off", + "@next/next/no-img-element": "off", + "@typescript-eslint/no-empty-object-type": "off", + "@typescript-eslint/no-unused-vars": "off", + "react-hooks/exhaustive-deps": "off" } } \ No newline at end of file From 200a7aba89dee67b6a99f5907dab4b0623d74517 Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 13:38:31 -0500 Subject: [PATCH 20/21] use turbopack and add overrides --- bun.lock | 69 +++++++++++++------------------------------------ next.config.mjs | 6 ++--- package.json | 11 +++++--- 3 files changed, 29 insertions(+), 57 deletions(-) diff --git a/bun.lock b/bun.lock index 9aee99af2..b56c070cd 100644 --- a/bun.lock +++ b/bun.lock @@ -45,7 +45,7 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "seti-icons": "^0.0.4", - "shiki": "^3.2.1", + "shiki": "3.3.0", "tailwind-merge": "^3.0.2", "timeago.js": "^4.0.2", "vaul": "^1.1.2", @@ -64,6 +64,11 @@ }, }, }, + "overrides": { + "@shikijs/core": "3.3.0", + "@shikijs/engine-javascript": "3.3.0", + "shiki": "3.3.0", + }, "packages": { "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], @@ -363,21 +368,21 @@ "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], - "@shikijs/core": ["@shikijs/core@3.2.1", "", { "dependencies": { "@shikijs/types": "3.2.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-FhsdxMWYu/C11sFisEp7FMGBtX/OSSbnXZDMBhGuUDBNTdsoZlMSgQv5f90rwvzWAdWIW6VobD+G3IrazxA6dQ=="], + "@shikijs/core": ["@shikijs/core@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-CovkFL2WVaHk6PCrwv6ctlmD4SS1qtIfN8yEyDXDYWh4ONvomdM9MaFw20qHuqJOcb8/xrkqoWQRJ//X10phOQ=="], - "@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.2.1", "", { "dependencies": { "@shikijs/types": "3.2.1", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.1.0" } }, "sha512-eMdcUzN3FMQYxOmRf2rmU8frikzoSHbQDFH2hIuXsrMO+IBOCI9BeeRkCiBkcLDHeRKbOCtYMJK3D6U32ooU9Q=="], + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.2.0" } }, "sha512-XlhnFGv0glq7pfsoN0KyBCz9FJU678LZdQ2LqlIdAj6JKsg5xpYKay3DkazXWExp3DTJJK9rMOuGzU2911pg7Q=="], - "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.2.1", "", { "dependencies": { "@shikijs/types": "3.2.1", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-wZZAkayEn6qu2+YjenEoFqj0OyQI64EWsNR6/71d1EkG4sxEOFooowKivsWPpaWNBu3sxAG+zPz5kzBL/SsreQ=="], + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-l0vIw+GxeNU7uGnsu6B+Crpeqf+WTQ2Va71cHb5ZYWEVEPdfYwY5kXwYqRJwHrxz9WH+pjSpXQz+TJgAsrkA5A=="], - "@shikijs/langs": ["@shikijs/langs@3.2.1", "", { "dependencies": { "@shikijs/types": "3.2.1" } }, "sha512-If0iDHYRSGbihiA8+7uRsgb1er1Yj11pwpX1c6HLYnizDsKAw5iaT3JXj5ZpaimXSWky/IhxTm7C6nkiYVym+A=="], + "@shikijs/langs": ["@shikijs/langs@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0" } }, "sha512-zt6Kf/7XpBQKSI9eqku+arLkAcDQ3NHJO6zFjiChI8w0Oz6Jjjay7pToottjQGjSDCFk++R85643WbyINcuL+g=="], "@shikijs/rehype": ["@shikijs/rehype@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@types/hast": "^3.0.4", "hast-util-to-string": "^3.0.1", "shiki": "3.3.0", "unified": "^11.0.5", "unist-util-visit": "^5.0.0" } }, "sha512-m9clrxedJHyKDwYoAkIUJ7thWGSZwZbA0PeGDST7NHCTGeS227BFn8Hoq2olAtxXo14k5T1JcUCDgyaRZfI4Hw=="], - "@shikijs/themes": ["@shikijs/themes@3.2.1", "", { "dependencies": { "@shikijs/types": "3.2.1" } }, "sha512-k5DKJUT8IldBvAm8WcrDT5+7GA7se6lLksR+2E3SvyqGTyFMzU2F9Gb7rmD+t+Pga1MKrYFxDIeyWjMZWM6uBQ=="], + "@shikijs/themes": ["@shikijs/themes@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0" } }, "sha512-tXeCvLXBnqq34B0YZUEaAD1lD4lmN6TOHAhnHacj4Owh7Ptb/rf5XCDeROZt2rEOk5yuka3OOW2zLqClV7/SOg=="], "@shikijs/transformers": ["@shikijs/transformers@3.3.0", "", { "dependencies": { "@shikijs/core": "3.3.0", "@shikijs/types": "3.3.0" } }, "sha512-PIknEyxfkT7i7at/78ynVmuZEv4+7IcS37f6abxMjQ0pVIPEya8n+KNl7XtfbhNL+U9ElR3UzfSzuD5l5Iu+nw=="], - "@shikijs/types": ["@shikijs/types@3.2.1", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-/NTWAk4KE2M8uac0RhOsIhYQf4pdU0OywQuYDGIGAJ6Mjunxl2cGiuLkvu4HLCMn+OTTLRWkjZITp+aYJv60yA=="], + "@shikijs/types": ["@shikijs/types@3.3.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-KPCGnHG6k06QG/2pnYGbFtFvpVJmC3uIpXrAiPrawETifujPBv0Se2oUxm5qYgjCvGJS9InKvjytOdN+bGuX+Q=="], "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], @@ -719,8 +724,6 @@ "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="], - "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], "entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], @@ -1227,9 +1230,9 @@ "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], - "oniguruma-parser": ["oniguruma-parser@0.5.4", "", {}, "sha512-yNxcQ8sKvURiTwP0mV6bLQCYE7NKfKRRWunhbZnXgxSmB1OXa1lHrN3o4DZd+0Si0kU5blidK7BcROO8qv5TZA=="], + "oniguruma-parser": ["oniguruma-parser@0.12.0", "", {}, "sha512-fD9o5ebCmEAA9dLysajdQvuKzLL7cj+w7DQjuO3Cb6IwafENfx6iL+RGkmyW82pVRsvgzixsWinHvgxTMJvdIA=="], - "oniguruma-to-es": ["oniguruma-to-es@4.1.0", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "oniguruma-parser": "^0.5.4", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-SNwG909cSLo4vPyyPbU/VJkEc9WOXqu2ycBlfd1UCXLqk1IijcQktSBb2yRQ2UFPsDhpkaf+C1dtT3PkLK/yWA=="], + "oniguruma-to-es": ["oniguruma-to-es@4.3.1", "", { "dependencies": { "oniguruma-parser": "^0.12.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-VtX1kepWO+7HG7IWV5v72JhiqofK7XsiHmtgnvurnNOTdIvE5mrdWYtsOrQyrXCv1L2Ckm08hywp+MFO7rC4Ug=="], "openapi-sampler": ["openapi-sampler@1.6.1", "", { "dependencies": { "@types/json-schema": "^7.0.7", "fast-xml-parser": "^4.5.0", "json-pointer": "0.6.2" } }, "sha512-s1cIatOqrrhSj2tmJ4abFYZQK6l5v+V4toO5q1Pa0DyN8mtyqy2I+Qrj5W9vOELEtybIMQs/TBZGVO/DtTFK8w=="], @@ -1381,7 +1384,7 @@ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "shiki": ["shiki@3.2.1", "", { "dependencies": { "@shikijs/core": "3.2.1", "@shikijs/engine-javascript": "3.2.1", "@shikijs/engine-oniguruma": "3.2.1", "@shikijs/langs": "3.2.1", "@shikijs/themes": "3.2.1", "@shikijs/types": "3.2.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-VML/2o1/KGYkEf/stJJ+s9Ypn7jUKQPomGLGYso4JJFMFxVDyPNsjsI3MB3KLjlMOeH44gyaPdXC6rik2WXvUQ=="], + "shiki": ["shiki@3.3.0", "", { "dependencies": { "@shikijs/core": "3.3.0", "@shikijs/engine-javascript": "3.3.0", "@shikijs/engine-oniguruma": "3.3.0", "@shikijs/langs": "3.3.0", "@shikijs/themes": "3.3.0", "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-j0Z1tG5vlOFGW8JVj0Cpuatzvshes7VJy5ncDmmMaYcmnGW0Js1N81TOW98ivTFNZfKRn9uwEg/aIm638o368g=="], "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], @@ -1567,14 +1570,6 @@ "@scalar/openapi-parser/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "@shikijs/rehype/@shikijs/types": ["@shikijs/types@3.3.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-KPCGnHG6k06QG/2pnYGbFtFvpVJmC3uIpXrAiPrawETifujPBv0Se2oUxm5qYgjCvGJS9InKvjytOdN+bGuX+Q=="], - - "@shikijs/rehype/shiki": ["shiki@3.3.0", "", { "dependencies": { "@shikijs/core": "3.3.0", "@shikijs/engine-javascript": "3.3.0", "@shikijs/engine-oniguruma": "3.3.0", "@shikijs/langs": "3.3.0", "@shikijs/themes": "3.3.0", "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-j0Z1tG5vlOFGW8JVj0Cpuatzvshes7VJy5ncDmmMaYcmnGW0Js1N81TOW98ivTFNZfKRn9uwEg/aIm638o368g=="], - - "@shikijs/transformers/@shikijs/core": ["@shikijs/core@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-CovkFL2WVaHk6PCrwv6ctlmD4SS1qtIfN8yEyDXDYWh4ONvomdM9MaFw20qHuqJOcb8/xrkqoWQRJ//X10phOQ=="], - - "@shikijs/transformers/@shikijs/types": ["@shikijs/types@3.3.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-KPCGnHG6k06QG/2pnYGbFtFvpVJmC3uIpXrAiPrawETifujPBv0Se2oUxm5qYgjCvGJS9InKvjytOdN+bGuX+Q=="], - "@stacks/connect/@stacks/transactions": ["@stacks/transactions@7.0.5", "", { "dependencies": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", "@stacks/common": "^7.0.2", "@stacks/network": "^7.0.2", "c32check": "^2.0.0", "lodash.clonedeep": "^4.5.0" } }, "sha512-mHsv7lUbZ5w4MKJ3NAirtdClIXLNKMqWIqT2rLjbIHzlYBqvZaELJSYD+km6E7Cm9G3yUYszorhruQmSTgilbg=="], "@stacks/network-v6/@stacks/common": ["@stacks/common@6.16.0", "", { "dependencies": { "@types/bn.js": "^5.1.0", "@types/node": "^18.0.4" } }, "sha512-PnzvhrdGRMVZvxTulitlYafSK4l02gPCBBoI9QEoTqgSnv62oaOXhYAUUkTMFKxdHW1seVEwZsrahuXiZPIAwg=="], @@ -1617,8 +1612,6 @@ "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - "fumadocs-core/shiki": ["shiki@3.3.0", "", { "dependencies": { "@shikijs/core": "3.3.0", "@shikijs/engine-javascript": "3.3.0", "@shikijs/engine-oniguruma": "3.3.0", "@shikijs/langs": "3.3.0", "@shikijs/themes": "3.3.0", "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-j0Z1tG5vlOFGW8JVj0Cpuatzvshes7VJy5ncDmmMaYcmnGW0Js1N81TOW98ivTFNZfKRn9uwEg/aIm638o368g=="], - "fumadocs-openapi/fumadocs-core": ["fumadocs-core@15.2.5", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.6.1", "@orama/orama": "^3.1.4", "@shikijs/rehype": "^3.2.1", "@shikijs/transformers": "^3.2.1", "github-slugger": "^2.0.0", "hast-util-to-estree": "^3.1.3", "hast-util-to-jsx-runtime": "^2.3.6", "image-size": "^2.0.2", "negotiator": "^1.0.0", "react-remove-scroll": "^2.6.3", "remark": "^15.0.0", "remark-gfm": "^4.0.1", "scroll-into-view-if-needed": "^3.1.0", "shiki": "^3.2.1", "unist-util-visit": "^5.0.0" }, "peerDependencies": { "@oramacloud/client": "1.x.x || 2.x.x", "algoliasearch": "4.24.0", "next": "14.x.x || 15.x.x", "react": "18.x.x || 19.x.x", "react-dom": "18.x.x || 19.x.x" }, "optionalPeers": ["@oramacloud/client", "algoliasearch", "next", "react", "react-dom"] }, "sha512-vSeyFdbuUCx8H27wrnv6bm7Z5ZGjI7L3mkjSZfbS4oh3qWHWs+L+qEX2lSGmL2IMRIXXrUZGSwe0xohz5uAwAg=="], "fumadocs-openapi/fumadocs-ui": ["fumadocs-ui@15.2.5", "", { "dependencies": { "@radix-ui/react-accordion": "^1.2.3", "@radix-ui/react-collapsible": "^1.1.3", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-direction": "^1.1.0", "@radix-ui/react-navigation-menu": "^1.2.5", "@radix-ui/react-popover": "^1.1.6", "@radix-ui/react-scroll-area": "^1.2.3", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-tabs": "^1.1.3", "class-variance-authority": "^0.7.1", "fumadocs-core": "15.2.5", "lodash.merge": "^4.6.2", "lucide-react": "^0.487.0", "next-themes": "^0.4.6", "postcss-selector-parser": "^7.1.0", "react-medium-image-zoom": "^5.2.14", "tailwind-merge": "^3.1.0" }, "peerDependencies": { "next": "14.x.x || 15.x.x", "react": "18.x.x || 19.x.x", "react-dom": "18.x.x || 19.x.x", "tailwindcss": "^3.4.14 || ^4.0.0" }, "optionalPeers": ["tailwindcss"] }, "sha512-obzCoLYVXAPTFBqyRz/a81D8q+SPgNCNvOB79Jqgyp4B47gtjaDdObrayKHYYfdiJGjlyfp98wCAVpQiTJI1gQ=="], @@ -1655,16 +1648,6 @@ "@scalar/openapi-parser/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "@shikijs/rehype/shiki/@shikijs/core": ["@shikijs/core@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-CovkFL2WVaHk6PCrwv6ctlmD4SS1qtIfN8yEyDXDYWh4ONvomdM9MaFw20qHuqJOcb8/xrkqoWQRJ//X10phOQ=="], - - "@shikijs/rehype/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.2.0" } }, "sha512-XlhnFGv0glq7pfsoN0KyBCz9FJU678LZdQ2LqlIdAj6JKsg5xpYKay3DkazXWExp3DTJJK9rMOuGzU2911pg7Q=="], - - "@shikijs/rehype/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-l0vIw+GxeNU7uGnsu6B+Crpeqf+WTQ2Va71cHb5ZYWEVEPdfYwY5kXwYqRJwHrxz9WH+pjSpXQz+TJgAsrkA5A=="], - - "@shikijs/rehype/shiki/@shikijs/langs": ["@shikijs/langs@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0" } }, "sha512-zt6Kf/7XpBQKSI9eqku+arLkAcDQ3NHJO6zFjiChI8w0Oz6Jjjay7pToottjQGjSDCFk++R85643WbyINcuL+g=="], - - "@shikijs/rehype/shiki/@shikijs/themes": ["@shikijs/themes@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0" } }, "sha512-tXeCvLXBnqq34B0YZUEaAD1lD4lmN6TOHAhnHacj4Owh7Ptb/rf5XCDeROZt2rEOk5yuka3OOW2zLqClV7/SOg=="], - "@stacks/network-v6/@stacks/common/@types/node": ["@types/node@18.19.86", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ=="], "@stacks/transactions-v6/@stacks/common/@types/node": ["@types/node@18.19.86", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ=="], @@ -1689,18 +1672,6 @@ "csso/css-tree/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "fumadocs-core/shiki/@shikijs/core": ["@shikijs/core@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-CovkFL2WVaHk6PCrwv6ctlmD4SS1qtIfN8yEyDXDYWh4ONvomdM9MaFw20qHuqJOcb8/xrkqoWQRJ//X10phOQ=="], - - "fumadocs-core/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.2.0" } }, "sha512-XlhnFGv0glq7pfsoN0KyBCz9FJU678LZdQ2LqlIdAj6JKsg5xpYKay3DkazXWExp3DTJJK9rMOuGzU2911pg7Q=="], - - "fumadocs-core/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-l0vIw+GxeNU7uGnsu6B+Crpeqf+WTQ2Va71cHb5ZYWEVEPdfYwY5kXwYqRJwHrxz9WH+pjSpXQz+TJgAsrkA5A=="], - - "fumadocs-core/shiki/@shikijs/langs": ["@shikijs/langs@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0" } }, "sha512-zt6Kf/7XpBQKSI9eqku+arLkAcDQ3NHJO6zFjiChI8w0Oz6Jjjay7pToottjQGjSDCFk++R85643WbyINcuL+g=="], - - "fumadocs-core/shiki/@shikijs/themes": ["@shikijs/themes@3.3.0", "", { "dependencies": { "@shikijs/types": "3.3.0" } }, "sha512-tXeCvLXBnqq34B0YZUEaAD1lD4lmN6TOHAhnHacj4Owh7Ptb/rf5XCDeROZt2rEOk5yuka3OOW2zLqClV7/SOg=="], - - "fumadocs-core/shiki/@shikijs/types": ["@shikijs/types@3.3.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-KPCGnHG6k06QG/2pnYGbFtFvpVJmC3uIpXrAiPrawETifujPBv0Se2oUxm5qYgjCvGJS9InKvjytOdN+bGuX+Q=="], - "fumadocs-openapi/fumadocs-core/@orama/orama": ["@orama/orama@3.1.4", "", {}, "sha512-7tTuIdkzgRscJ7sGHVsoK9GtXSpwbfrj3WYnuSu/SepXHhshYiQaOeXc/aeLh4MfgIre6tEs/caIop8wrhMi3g=="], "fumadocs-openapi/fumadocs-core/@shikijs/rehype": ["@shikijs/rehype@3.2.1", "", { "dependencies": { "@shikijs/types": "3.2.1", "@types/hast": "^3.0.4", "hast-util-to-string": "^3.0.1", "shiki": "3.2.1", "unified": "^11.0.5", "unist-util-visit": "^5.0.0" } }, "sha512-wj4TXI1PQ3TNPyXudUzKfdFIMneTxFym3HKKfWRzbOSAS8P4mECR+ttdUPhYU1dxrXrsatWxTJezOcEjiA0z8g=="], @@ -1717,8 +1688,6 @@ "svgo/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - "@shikijs/rehype/shiki/@shikijs/engine-javascript/oniguruma-to-es": ["oniguruma-to-es@4.3.1", "", { "dependencies": { "oniguruma-parser": "^0.12.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-VtX1kepWO+7HG7IWV5v72JhiqofK7XsiHmtgnvurnNOTdIvE5mrdWYtsOrQyrXCv1L2Ckm08hywp+MFO7rC4Ug=="], - "@stacks/network-v6/@stacks/common/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], "@stacks/transactions-v6/@stacks/common/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], @@ -1729,18 +1698,16 @@ "coa/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - "fumadocs-core/shiki/@shikijs/engine-javascript/oniguruma-to-es": ["oniguruma-to-es@4.3.1", "", { "dependencies": { "oniguruma-parser": "^0.12.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-VtX1kepWO+7HG7IWV5v72JhiqofK7XsiHmtgnvurnNOTdIvE5mrdWYtsOrQyrXCv1L2Ckm08hywp+MFO7rC4Ug=="], + "fumadocs-openapi/fumadocs-core/@shikijs/rehype/@shikijs/types": ["@shikijs/types@3.2.1", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-/NTWAk4KE2M8uac0RhOsIhYQf4pdU0OywQuYDGIGAJ6Mjunxl2cGiuLkvu4HLCMn+OTTLRWkjZITp+aYJv60yA=="], + + "fumadocs-openapi/fumadocs-core/@shikijs/transformers/@shikijs/types": ["@shikijs/types@3.2.1", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-/NTWAk4KE2M8uac0RhOsIhYQf4pdU0OywQuYDGIGAJ6Mjunxl2cGiuLkvu4HLCMn+OTTLRWkjZITp+aYJv60yA=="], "svgo/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], "svgo/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - "@shikijs/rehype/shiki/@shikijs/engine-javascript/oniguruma-to-es/oniguruma-parser": ["oniguruma-parser@0.12.0", "", {}, "sha512-fD9o5ebCmEAA9dLysajdQvuKzLL7cj+w7DQjuO3Cb6IwafENfx6iL+RGkmyW82pVRsvgzixsWinHvgxTMJvdIA=="], - "coa/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], - "fumadocs-core/shiki/@shikijs/engine-javascript/oniguruma-to-es/oniguruma-parser": ["oniguruma-parser@0.12.0", "", {}, "sha512-fD9o5ebCmEAA9dLysajdQvuKzLL7cj+w7DQjuO3Cb6IwafENfx6iL+RGkmyW82pVRsvgzixsWinHvgxTMJvdIA=="], - "svgo/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], } } diff --git a/next.config.mjs b/next.config.mjs index 07577c10c..ce7e0ce4b 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -5,9 +5,9 @@ const withMDX = createMDX(); /** @type {import('next').NextConfig} */ const config = { reactStrictMode: true, - webpack: (config) => { - config.optimization.minimize = false; - return config; + // Remove Webpack customization – not supported in Turbopack + turbopack: { + // Add any Turbopack-specific options here (currently optional) }, }; diff --git a/package.json b/package.json index a0f7d4928..4c011efa2 100644 --- a/package.json +++ b/package.json @@ -3,13 +3,18 @@ "version": "0.0.0", "private": true, "scripts": { - "dev": "next dev", - "build": "next build", + "dev": "next dev --turbopack", + "build": "next build --turbopack", "start": "next start", "postinstall": "fumadocs-mdx", "lint": "bun run ./lint.ts", "build:recipes": "bun run ./scripts/fetch-recipes.mts" }, + "overrides": { + "@shikijs/core": "3.3.0", + "@shikijs/engine-javascript": "3.3.0", + "shiki": "3.3.0" + }, "dependencies": { "@apidevtools/swagger-parser": "^10.1.1", "@fumadocs/cli": "^0.0.8", @@ -52,7 +57,7 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "seti-icons": "^0.0.4", - "shiki": "^3.2.1", + "shiki": "3.3.0", "tailwind-merge": "^3.0.2", "timeago.js": "^4.0.2", "vaul": "^1.1.2" From 8d4eb3bce048d943053b7cea4c7dbf9195417ae2 Mon Sep 17 00:00:00 2001 From: Ryan Waits <ryan.waits@gmail.com> Date: Wed, 30 Apr 2025 13:38:51 -0500 Subject: [PATCH 21/21] cleanup unused vars --- app/(docs)/[...slug]/page.tsx | 5 - app/(home)/page.tsx | 1 - app/api/llms/[[...section]]/route.ts | 4 +- app/cookbook/[id]/page.tsx | 3 +- app/cookbook/components/cookbook-ui.tsx | 2 +- app/cookbook/components/snippet-result.tsx | 142 ++++++++--------- app/layout.config.tsx | 1 - components/bento-grid.tsx | 2 +- components/callout.tsx | 2 +- components/card copy.tsx | 169 --------------------- components/code/connect-wallet-button.tsx | 2 +- components/docs/custom-sidebar.tsx | 15 +- components/docs/sidebar.tsx | 1 + components/docskit/terminal.tsx | 2 +- components/scrollycoding.tsx | 4 +- lib/loader.ts | 2 +- 16 files changed, 84 insertions(+), 273 deletions(-) delete mode 100644 components/card copy.tsx diff --git a/app/(docs)/[...slug]/page.tsx b/app/(docs)/[...slug]/page.tsx index f4918e50d..de695b655 100644 --- a/app/(docs)/[...slug]/page.tsx +++ b/app/(docs)/[...slug]/page.tsx @@ -35,16 +35,11 @@ export default async function Page(props: { const fileContent = await fs.readFile(page.data._file.absolutePath, "utf-8"); const { content: rawMarkdownContent } = matter(fileContent); - // Filter out import statements const LLMContent = rawMarkdownContent .split("\n") .filter((line) => !line.trim().startsWith("import")) .join("\n"); - // Construct the absolute page URL - const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || "https://docs.hiro.so"; // Default or from env - const pagePath = params.slug?.join("/") || ""; - const MDX = page.data.body; return ( diff --git a/app/(home)/page.tsx b/app/(home)/page.tsx index 0e1ca3542..d5a5d90b5 100644 --- a/app/(home)/page.tsx +++ b/app/(home)/page.tsx @@ -2,7 +2,6 @@ import Link from "fumadocs-core/link"; import { StacksCardIcon, BitcoinCardIcon } from "@/components/ui/icon"; import { Card } from "@/components/ui/card"; import { Card as LinkCard } from "@/app/(home)/components/card"; -import { Badge } from "@/components/ui/badge"; export default function HomePage() { return ( diff --git a/app/api/llms/[[...section]]/route.ts b/app/api/llms/[[...section]]/route.ts index 414ed2b90..c0145a426 100644 --- a/app/api/llms/[[...section]]/route.ts +++ b/app/api/llms/[[...section]]/route.ts @@ -46,15 +46,13 @@ export async function GET( const sectionPath = path.join(DOCS_CONTENT_PATH, ...sectionSegments); try { - // Check if the directory exists try { await fs.access(sectionPath); } catch (e) { - // Directory doesn't exist, return 404 + console.error(e); return new Response("Not Found", { status: 404 }); } - // Find MDX files directly within the target directory (not recursive) const files = await fg(`${sectionPath}/*.mdx`, { cwd: process.cwd(), absolute: true, diff --git a/app/cookbook/[id]/page.tsx b/app/cookbook/[id]/page.tsx index 2e40b08fe..8cfe29184 100644 --- a/app/cookbook/[id]/page.tsx +++ b/app/cookbook/[id]/page.tsx @@ -1,13 +1,12 @@ import React, { JSX } from "react"; import { Code } from "@/components/docskit/code"; -import { loadRecipe, loadRecipes } from "@/lib/loader"; +import { loadRecipes } from "@/lib/loader"; import { Badge } from "@/components/ui/badge"; import { HoverProvider } from "@/context/hover"; import { docskit } from "@/components/docskit/components"; import { HoverLink } from "@/components/docskit/annotations/hover"; import { Terminal } from "@/components/docskit/terminal"; import { InlineCode } from "@/components/docskit/inline-code"; -import { WithNotes } from "@/components/docskit/notes"; import { SnippetResult } from "../components/snippet-result"; import Link from "next/link"; import { RecipeCarousel } from "@/components/recipe-carousel"; diff --git a/app/cookbook/components/cookbook-ui.tsx b/app/cookbook/components/cookbook-ui.tsx index ee3c3cb1e..1110a64e9 100644 --- a/app/cookbook/components/cookbook-ui.tsx +++ b/app/cookbook/components/cookbook-ui.tsx @@ -299,7 +299,7 @@ function CookbookContent({ initialRecipes, recipeCards }: CookbookProps) { {view === "list" ? ( <Table> <TableBody> - {filteredRecipeCards.map(({ recipe, card }, index) => { + {filteredRecipeCards.map(({ recipe }, index) => { const isLastItem = index === filteredRecipeCards.length - 1; return ( diff --git a/app/cookbook/components/snippet-result.tsx b/app/cookbook/components/snippet-result.tsx index c0a75d6b4..574b26bf8 100644 --- a/app/cookbook/components/snippet-result.tsx +++ b/app/cookbook/components/snippet-result.tsx @@ -2,11 +2,11 @@ import React from "react"; import Link from "next/link"; -import { Play, Terminal } from "lucide-react"; -import { Button, buttonVariants } from "@/components/ui/button"; +import { buttonVariants } from "@/components/ui/button"; import { ArrowUpRight } from "lucide-react"; -import { Code } from "@/components/docskit/code"; -import { initSimnet, type Simnet } from "@hirosystems/clarinet-sdk-browser"; +// import { Code } from "@/components/docskit/code"; +import type { Simnet } from "@hirosystems/clarinet-sdk-browser"; +// import { initSimnet } from "@hirosystems/clarinet-sdk-browser"; import { Cl } from "@stacks/transactions"; // import { loadSandpackClient } from "@codesandbox/sandpack-client"; // import type { SandboxSetup } from "@codesandbox/sandpack-client"; @@ -62,71 +62,71 @@ export function SnippetResult({ } }, [isConsoleOpen]); - async function runCode() { - if (type === "clarity") { - if (isConsoleOpen) { - setIsConsoleOpen(false); - return; - } - setIsLoading(true); - setResult(null); + // async function runCode() { + // if (type === "clarity") { + // if (isConsoleOpen) { + // setIsConsoleOpen(false); + // return; + // } + // setIsLoading(true); + // setResult(null); - try { - const simnet = await initSimnet(); - await simnet.initEmptySession(false); - simnet.deployer = "ST000000000000000000002AMW42H"; - const deployer = simnet.deployer; - // console.log("deployer", deployer); - simnet.setEpoch("3.0"); + // try { + // const simnet = await initSimnet(); + // await simnet.initEmptySession(false); + // simnet.deployer = "ST000000000000000000002AMW42H"; + // const deployer = simnet.deployer; + // // console.log("deployer", deployer); + // simnet.setEpoch("3.0"); - // Store the initialized simnet instance - setSimnetInstance(simnet); - // Store the initial code in history - setCodeHistory(code); + // // Store the initialized simnet instance + // setSimnetInstance(simnet); + // // Store the initial code in history + // setCodeHistory(code); - const contract = simnet.deployContract( - recipe.files[0].name.split(".")[0], - code, - { clarityVersion: 3 }, - deployer - ); - const result = contract.result; - const prettyResult = Cl.prettyPrint(result, 2); - // console.log("before :", simnet.execute("stacks-block-height")); - // simnet.executeCommand("::advance_chain_tip 2"); - // console.log("after: ", simnet.execute("stacks-block-height")); + // const contract = simnet.deployContract( + // recipe.files[0].name.split(".")[0], + // code, + // { clarityVersion: 3 }, + // deployer + // ); + // const result = contract.result; + // const prettyResult = Cl.prettyPrint(result, 2); + // // console.log("before :", simnet.execute("stacks-block-height")); + // // simnet.executeCommand("::advance_chain_tip 2"); + // // console.log("after: ", simnet.execute("stacks-block-height")); - // Add a 1-second delay before updating the result - // await new Promise((resolve) => setTimeout(resolve, 1000)); + // // Add a 1-second delay before updating the result + // // await new Promise((resolve) => setTimeout(resolve, 1000)); - setResult(prettyResult); - setIsConsoleOpen(true); - } catch (error) { - console.error("Error running code snippet:", error); - setResult("An error occurred while running the code snippet."); - } finally { - setIsLoading(false); - } - } else { - const content = { - files: { - "/package.json": { - code: JSON.stringify({ - main: "index.js", - dependencies: dependencies || {}, - }), - }, - "/index.js": { - code: code, // This is the content from your recipe file - }, - }, - environment: "vanilla", - }; + // setResult(prettyResult); + // setIsConsoleOpen(true); + // } catch (error) { + // console.error("Error running code snippet:", error); + // setResult("An error occurred while running the code snippet."); + // } finally { + // setIsLoading(false); + // } + // } else { + // const content = { + // files: { + // "/package.json": { + // code: JSON.stringify({ + // main: "index.js", + // dependencies: dependencies || {}, + // }), + // }, + // "/index.js": { + // code: code, // This is the content from your recipe file + // }, + // }, + // environment: "vanilla", + // }; - // const client = await loadSandpackClient(iframeRef.current!, content); - // console.log(client); - } - } + // // const client = await loadSandpackClient(iframeRef.current!, content); + // // console.log(client); + // } + // } // Add this function to handle keyboard events const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => { @@ -199,14 +199,14 @@ export function SnippetResult({ } } - const getButtonText = () => { - if (type === "clarity") { - if (isLoading) return "Loading..."; - if (isConsoleOpen) return "Close terminal"; - return "Open in terminal"; - } - return "Run code snippet"; - }; + // const getButtonText = () => { + // if (type === "clarity") { + // if (isLoading) return "Loading..."; + // if (isConsoleOpen) return "Close terminal"; + // return "Open in terminal"; + // } + // return "Run code snippet"; + // }; return ( <div className="space-y-4"> diff --git a/app/layout.config.tsx b/app/layout.config.tsx index 2723a161d..8842d9208 100644 --- a/app/layout.config.tsx +++ b/app/layout.config.tsx @@ -1,5 +1,4 @@ import type { BaseLayoutProps } from "fumadocs-ui/layouts/shared"; -import { TopNav } from "@/components/top-nav"; /** * Shared layout configurations * diff --git a/components/bento-grid.tsx b/components/bento-grid.tsx index aba419af1..177ebdf5c 100644 --- a/components/bento-grid.tsx +++ b/components/bento-grid.tsx @@ -1,4 +1,4 @@ -import { Button, buttonVariants } from "@/components/ui/button"; +import { buttonVariants } from "@/components/ui/button"; import { cn } from "@/lib/utils"; import { ArrowRightIcon } from "@radix-ui/react-icons"; import { ReactNode } from "react"; diff --git a/components/callout.tsx b/components/callout.tsx index 2b5199576..12b66bd58 100644 --- a/components/callout.tsx +++ b/components/callout.tsx @@ -1,4 +1,4 @@ -import { AlertOctagon, AlertTriangle, Info, Star } from "lucide-react"; +import { AlertTriangle, Info, Star } from "lucide-react"; import { HiroSVG } from "@/components/ui/icon"; import { forwardRef, type HTMLAttributes, type ReactNode } from "react"; import { cn } from "@/lib/utils"; diff --git a/components/card copy.tsx b/components/card copy.tsx deleted file mode 100644 index ef561a8e3..000000000 --- a/components/card copy.tsx +++ /dev/null @@ -1,169 +0,0 @@ -import Link, { type LinkProps } from "fumadocs-core/link"; -import type { HTMLAttributes, ReactNode } from "react"; -import { cn } from "@/lib/utils"; - -import { Badge } from "@/components/ui/badge"; - -export function Cards( - props: HTMLAttributes<HTMLDivElement> -): React.ReactElement { - return ( - <div - {...props} - className={cn("grid grid-cols-1 gap-4 sm:grid-cols-2", props.className)} - > - {props.children} - </div> - ); -} - -export type CardProps = { - icon?: ReactNode; - title: string; - description: string; - innerClassName?: string; -} & Omit<LinkProps, "title">; - -export function Card({ - icon, - title, - description, - ...props -}: CardProps): React.ReactElement { - return ( - <Link - {...props} - className={cn( - "not-prose relative block rounded-lg p-[1px] transition-all duration-300", - "bg-gradient-to-r from-border from-0% to-border to-100%", // Default single-color gradient (acts as border) - "hover:from-border hover:from-25% hover:to-gradient hover:to-100%", // Hover gradient - "hover:shadow-[0_6px_17px_rgba(181,172,161,0.3)] dark:hover:shadow-[0_6px_21px_rgba(0,0.0,0.8)]", - props.className - )} - > - <div - className={cn( - "space-y-3 group relative z-10 bg-card p-5 rounded-[7px] hover:bg-accent", - props.innerClassName - )} - > - {icon ? ( - <div className="w-fit rounded-md border group-hover:bg-border p-2 text-muted-foreground [&_svg]:size-4"> - {icon} - </div> - ) : null} - <div className="space-y-1"> - <h3 className="text-lg">{title}</h3> - <p className="text-muted-foreground">{description}</p> - </div> - </div> - </Link> - ); -} - -export type FeatureCardProps = { - title: string; - description: string; - image?: string; -} & Omit<LinkProps, "title">; - -export function FeatureCard({ - title, - description, - image, - ...props -}: FeatureCardProps): React.ReactElement { - return ( - <Link - {...props} - className={cn( - "not-prose flex flex-col justify-center rounded-lg border bg-background text-md transition-colors hover:bg-accent/80 pr-0 pl-12 py-0", - props.className - )} - > - <div className="flex justify-between"> - <img src={image} alt="arrow-right" /> - </div> - <h3 className="mb-1 font-medium">{title}</h3> - <p className="text-muted-foreground">{description}</p> - </Link> - ); -} - -export type SecondaryCardProps = { - icon?: ReactNode; - title: string; - description: string; - tag: string; -} & Omit<LinkProps, "title">; - -export function SecondaryCard({ - icon, - title, - description, - tag, - ...props -}: SecondaryCardProps): React.ReactElement { - return ( - <Link - {...props} - className={cn( - "not-prose block rounded-lg border bg-card p-4 text-md transition-colors hover:bg-accent/80", - props.className - )} - > - {icon ? ( - <div className="group w-full flex justify-between"> - <div className="mb-2 w-fit rounded-md border bg-card p-2 text-muted-foreground [&_svg]:size-4"> - {icon} - </div> - <Badge - variant="outline" - className="uppercase rounded-md transition-colors h-fit text-card-foreground bg-accent border border-border shadow-md" - > - {tag} - </Badge> - </div> - ) : null} - <h3 className="mb-1 font-medium">{title}</h3> - <p className="text-muted-foreground">{description}</p> - </Link> - ); -} - -export type SmallCardProps = { - icon: ReactNode; - title: string; - description: string; -} & Omit<LinkProps, "title">; - -export function SmallCard({ - icon, - title, - description, - ...props -}: CardProps): React.ReactElement { - return ( - <Link - {...props} - className={cn( - "not-prose block transition-colors space-y-3", - props.className - )} - > - <div className="group flex space-x-4 px-3 py-4 rounded-lg hover:bg-accent"> - {icon && ( - <div className="h-fit w-fit rounded-md border bg-card group-hover:bg-background group-hover:text-primary transition-colors duration-500 ease-in-out p-2 text-muted-foreground [&_svg]:size-4"> - {icon} - </div> - )} - <div className="flex flex-col w-full"> - <h3 className="mb-1 font-inter font-medium text-md text-[#141312] dark:text-[#f6f5f3]"> - {title} - </h3> - <p className="text-sm text-muted-foreground">{description}</p> - </div> - </div> - </Link> - ); -} diff --git a/components/code/connect-wallet-button.tsx b/components/code/connect-wallet-button.tsx index 5826ed9a4..d5273d5d6 100644 --- a/components/code/connect-wallet-button.tsx +++ b/components/code/connect-wallet-button.tsx @@ -1,7 +1,7 @@ "use client"; import React from "react"; -import { isConnected, connect, disconnect } from "@stacks/connect"; +import { connect, disconnect } from "@stacks/connect"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; diff --git a/components/docs/custom-sidebar.tsx b/components/docs/custom-sidebar.tsx index 148cb092b..c80ef6802 100644 --- a/components/docs/custom-sidebar.tsx +++ b/components/docs/custom-sidebar.tsx @@ -5,26 +5,17 @@ import { usePathname } from "next/navigation"; import { cn } from "@/lib/utils"; import { SidebarPageTree, - SidebarSeparator, SidebarItem, SidebarFolder, SidebarFolderTrigger, - SidebarFolderLink, SidebarFolderContent, } from "./sidebar"; import { isActive } from "@/lib/is-active"; import type { SidebarComponents } from "./shared"; import { useTreeContext } from "fumadocs-ui/provider"; -import type { PageTree } from "fumadocs-core/server"; import Link from "next/link"; -import { - API, - BitcoinIcon, - Clarity, - Hiro, - StacksIcon, -} from "@/components/ui/icon"; -import { ChevronDown, ChevronRight, ChevronUp, Code, Play } from "lucide-react"; +import { API, BitcoinIcon, Clarity, StacksIcon } from "@/components/ui/icon"; +import { Code, Play } from "lucide-react"; // URLs for both sections to filter out duplicates const STACKS_NAV_URLS = [ @@ -195,8 +186,6 @@ export function EnhancedSidebarPageTree(props: { }: { components?: Partial<SidebarComponents>; }) { - const { root } = useTreeContext(); - // Create custom components object with our filtering logic const filteredComponents: Partial<SidebarComponents> = { // Custom Item component that filters duplicates diff --git a/components/docs/sidebar.tsx b/components/docs/sidebar.tsx index e0cfadd7c..93fe9168e 100644 --- a/components/docs/sidebar.tsx +++ b/components/docs/sidebar.tsx @@ -315,6 +315,7 @@ export function SidebarFolderLink(props: LinkProps) { const { open, setOpen } = useFolderContext(); const { prefetch, level } = useInternalContext(); + console.log({ open }); const pathname = usePathname(); const active = props.href !== undefined && isActive(props.href, pathname, false); diff --git a/components/docskit/terminal.tsx b/components/docskit/terminal.tsx index c83191a63..4fc0bed3d 100644 --- a/components/docskit/terminal.tsx +++ b/components/docskit/terminal.tsx @@ -73,7 +73,7 @@ function extractAnnotations(code: string) { toLineNumber: index + 1, }); } else { - let last = annotations[annotations.length - 1]; + const last = annotations[annotations.length - 1]; if (last.name === "command" && last.query.endsWith("\\")) { last.query = last.query + "\n" + line; last.toLineNumber = index + 1; diff --git a/components/scrollycoding.tsx b/components/scrollycoding.tsx index 16f6da12b..20bd05030 100644 --- a/components/scrollycoding.tsx +++ b/components/scrollycoding.tsx @@ -33,8 +33,8 @@ export function Scrollycoding(props: unknown) { <div className="w-1/2"> <div className="top-16 sticky overflow-auto"> <Selection - from={steps.map((step) => ( - <DocsKitCode codeblock={step.code} /> + from={steps.map((step, index) => ( + <DocsKitCode key={index} codeblock={step.code} /> ))} /> </div> diff --git a/lib/loader.ts b/lib/loader.ts index 1ca649521..5453d497c 100644 --- a/lib/loader.ts +++ b/lib/loader.ts @@ -31,7 +31,7 @@ export async function loadRecipes(): Promise<Recipe[]> { files = await fs.readdir(recipesDir); } catch { console.warn( - "No recipes found in .cache/recipes. Did you run scripts/fetch-recipes.mjs?" + "No recipes found in .cache/recipes. Did you run scripts/fetch-recipes.mts?" ); return []; }